summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlendoit <blendoit@gmail.com>2020-08-01 15:24:03 -0700
committerBlendoit <blendoit@gmail.com>2020-08-01 15:24:03 -0700
commite47650852b8aa4da6d0b0cea3b5421955795cc64 (patch)
tree2535f7cc4fa4b5c25bbd46f9523da5944b76e201
parent374ae3de24187512adddf01a56e5eb52c79db65f (diff)
Definitely /not/ including elpa/, that would be chaos.
-rw-r--r--.gitignore3
-rw-r--r--elpa/all-the-icons-20200730.1545/all-the-icons-autoloads.el75
-rw-r--r--elpa/all-the-icons-20200730.1545/all-the-icons-faces.el230
-rw-r--r--elpa/all-the-icons-20200730.1545/all-the-icons-pkg.el13
-rw-r--r--elpa/all-the-icons-20200730.1545/all-the-icons.el1074
-rw-r--r--elpa/all-the-icons-20200730.1545/data/data-alltheicons.el70
-rw-r--r--elpa/all-the-icons-20200730.1545/data/data-faicons.el641
-rw-r--r--elpa/all-the-icons-20200730.1545/data/data-fileicons.el489
-rw-r--r--elpa/all-the-icons-20200730.1545/data/data-material.el935
-rw-r--r--elpa/all-the-icons-20200730.1545/data/data-octicons.el165
-rw-r--r--elpa/all-the-icons-20200730.1545/data/data-weathericons.el594
-rw-r--r--elpa/archives/gnu/archive-contents2491
-rw-r--r--elpa/archives/gnu/archive-contents.signed1
-rw-r--r--elpa/archives/melpa/archive-contents4649
-rw-r--r--elpa/archives/org/archive-contents2
-rw-r--r--elpa/async-20200113.1745/async-autoloads.el174
-rw-r--r--elpa/async-20200113.1745/async-bytecomp.el210
-rw-r--r--elpa/async-20200113.1745/async-pkg.el8
-rw-r--r--elpa/async-20200113.1745/async.el408
-rw-r--r--elpa/async-20200113.1745/dired-async.el408
-rw-r--r--elpa/async-20200113.1745/smtpmail-async.el73
-rw-r--r--elpa/bind-key-20191110.416/bind-key-autoloads.el84
-rw-r--r--elpa/bind-key-20191110.416/bind-key-pkg.el2
-rw-r--r--elpa/bind-key-20191110.416/bind-key.el456
-rw-r--r--elpa/counsel-20200706.1447/counsel-autoloads.el642
-rw-r--r--elpa/counsel-20200706.1447/counsel-pkg.el2
-rw-r--r--elpa/counsel-20200706.1447/counsel.el6850
-rw-r--r--elpa/csv-mode-1.12.signed1
-rw-r--r--elpa/csv-mode-1.12/ChangeLog251
-rw-r--r--elpa/csv-mode-1.12/csv-mode-autoloads.el81
-rw-r--r--elpa/csv-mode-1.12/csv-mode-pkg.el2
-rw-r--r--elpa/csv-mode-1.12/csv-mode-tests.el102
-rw-r--r--elpa/csv-mode-1.12/csv-mode.el1737
-rw-r--r--elpa/dash-20200524.1947/dash-autoloads.el26
-rw-r--r--elpa/dash-20200524.1947/dash-pkg.el9
-rw-r--r--elpa/dash-20200524.1947/dash.el3072
-rw-r--r--elpa/dash-20200524.1947/dash.info3410
-rw-r--r--elpa/dash-20200524.1947/dir18
-rw-r--r--elpa/dashboard-20200306.1344/banners/1.txt8
-rw-r--r--elpa/dashboard-20200306.1344/banners/2.txt6
-rw-r--r--elpa/dashboard-20200306.1344/banners/3.txt8
-rw-r--r--elpa/dashboard-20200306.1344/banners/emacs.pngbin43759 -> 0 bytes
-rw-r--r--elpa/dashboard-20200306.1344/banners/logo.pngbin32305 -> 0 bytes
-rw-r--r--elpa/dashboard-20200306.1344/dashboard-autoloads.el41
-rw-r--r--elpa/dashboard-20200306.1344/dashboard-pkg.el13
-rw-r--r--elpa/dashboard-20200306.1344/dashboard-widgets.el729
-rw-r--r--elpa/dashboard-20200306.1344/dashboard.el258
-rw-r--r--elpa/dumb-jump-20200730.1839/dumb-jump-autoloads.el88
-rw-r--r--elpa/dumb-jump-20200730.1839/dumb-jump-pkg.el2
-rw-r--r--elpa/dumb-jump-20200730.1839/dumb-jump.el3076
-rw-r--r--elpa/epl-20180205.2049/epl-autoloads.el22
-rw-r--r--elpa/epl-20180205.2049/epl-pkg.el2
-rw-r--r--elpa/epl-20180205.2049/epl.el712
-rw-r--r--elpa/evil-20200718.842/dir18
-rw-r--r--elpa/evil-20200718.842/evil-autoloads.el128
-rw-r--r--elpa/evil-20200718.842/evil-command-window.el189
-rw-r--r--elpa/evil-20200718.842/evil-commands.el4555
-rw-r--r--elpa/evil-20200718.842/evil-common.el3952
-rw-r--r--elpa/evil-20200718.842/evil-core.el1392
-rw-r--r--elpa/evil-20200718.842/evil-development.el50
-rw-r--r--elpa/evil-20200718.842/evil-digraphs.el1729
-rw-r--r--elpa/evil-20200718.842/evil-ex.el1178
-rw-r--r--elpa/evil-20200718.842/evil-integration.el533
-rw-r--r--elpa/evil-20200718.842/evil-jumps.el314
-rw-r--r--elpa/evil-20200718.842/evil-keybindings.el124
-rw-r--r--elpa/evil-20200718.842/evil-macros.el814
-rw-r--r--elpa/evil-20200718.842/evil-maps.el579
-rw-r--r--elpa/evil-20200718.842/evil-pkg.el9
-rw-r--r--elpa/evil-20200718.842/evil-repeat.el639
-rw-r--r--elpa/evil-20200718.842/evil-search.el1314
-rw-r--r--elpa/evil-20200718.842/evil-states.el924
-rw-r--r--elpa/evil-20200718.842/evil-types.el454
-rw-r--r--elpa/evil-20200718.842/evil-vars.el1980
-rw-r--r--elpa/evil-20200718.842/evil.el151
-rw-r--r--elpa/evil-20200718.842/evil.info2168
-rw-r--r--elpa/flycheck-20200610.1809/flycheck-autoloads.el306
-rw-r--r--elpa/flycheck-20200610.1809/flycheck-buttercup.el157
-rw-r--r--elpa/flycheck-20200610.1809/flycheck-ert.el507
-rw-r--r--elpa/flycheck-20200610.1809/flycheck-pkg.el16
-rw-r--r--elpa/flycheck-20200610.1809/flycheck.el12332
-rw-r--r--elpa/git-commit-20200701.2112/git-commit-autoloads.el53
-rw-r--r--elpa/git-commit-20200701.2112/git-commit-pkg.el2
-rw-r--r--elpa/git-commit-20200701.2112/git-commit.el1018
-rw-r--r--elpa/gnupg/pubring.kbxbin2413 -> 0 bytes
-rw-r--r--elpa/gnupg/pubring.kbx~bin1206 -> 0 bytes
-rw-r--r--elpa/gnupg/trustdb.gpgbin1200 -> 0 bytes
-rw-r--r--elpa/gnuplot-20200322.53/gnuplot-autoloads.el115
-rw-r--r--elpa/gnuplot-20200322.53/gnuplot-context.el2216
-rw-r--r--elpa/gnuplot-20200322.53/gnuplot-gui.el1733
-rw-r--r--elpa/gnuplot-20200322.53/gnuplot-pkg.el14
-rw-r--r--elpa/gnuplot-20200322.53/gnuplot.el3265
-rw-r--r--elpa/goto-chg-20200603.1911/goto-chg-autoloads.el55
-rw-r--r--elpa/goto-chg-20200603.1911/goto-chg-pkg.el2
-rw-r--r--elpa/goto-chg-20200603.1911/goto-chg.el378
-rw-r--r--elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-autoloads.el38
-rw-r--r--elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-pkg.el2
-rw-r--r--elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar.el330
-rw-r--r--elpa/ivy-20200624.1140/colir.el124
-rw-r--r--elpa/ivy-20200624.1140/dir18
-rw-r--r--elpa/ivy-20200624.1140/elpa.el6
-rw-r--r--elpa/ivy-20200624.1140/ivy-autoloads.el172
-rw-r--r--elpa/ivy-20200624.1140/ivy-faces.el138
-rw-r--r--elpa/ivy-20200624.1140/ivy-help.org138
-rw-r--r--elpa/ivy-20200624.1140/ivy-overlay.el155
-rw-r--r--elpa/ivy-20200624.1140/ivy-pkg.el12
-rw-r--r--elpa/ivy-20200624.1140/ivy.el5255
-rw-r--r--elpa/ivy-20200624.1140/ivy.info1966
-rw-r--r--elpa/json-mode-20190123.422/json-mode-autoloads.el65
-rw-r--r--elpa/json-mode-20190123.422/json-mode-pkg.el2
-rw-r--r--elpa/json-mode-20190123.422/json-mode.el224
-rw-r--r--elpa/json-reformat-20160212.853/json-reformat-autoloads.el31
-rw-r--r--elpa/json-reformat-20160212.853/json-reformat-pkg.el2
-rw-r--r--elpa/json-reformat-20160212.853/json-reformat.el222
-rw-r--r--elpa/json-snatcher-20150512.347/json-snatcher-autoloads.el27
-rw-r--r--elpa/json-snatcher-20150512.347/json-snatcher-pkg.el2
-rw-r--r--elpa/json-snatcher-20150512.347/json-snatcher.el352
-rw-r--r--elpa/ledger-mode-20200530.1710/dir18
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-check.el143
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-commodities.el161
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-complete.el362
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-context.el210
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-exec.el125
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-flymake.el142
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-fontify.el58
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-fonts.el684
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-init.el98
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-mode-autoloads.el193
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-mode-pkg.el6
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-mode.el334
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-mode.info1526
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-navigate.el199
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-occur.el169
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-post.el183
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-reconcile.el640
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-regex.el413
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-report.el672
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-schedule.el331
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-sort.el117
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-state.el259
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-test.el137
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-texi.el179
-rw-r--r--elpa/ledger-mode-20200530.1710/ledger-xact.el227
-rw-r--r--elpa/linum-relative-20180124.1047/linum-relative-autoloads.el60
-rw-r--r--elpa/linum-relative-20180124.1047/linum-relative-pkg.el2
-rw-r--r--elpa/linum-relative-20180124.1047/linum-relative.el286
-rw-r--r--elpa/magit-20200728.45/AUTHORS.md347
-rw-r--r--elpa/magit-20200728.45/LICENSE676
-rw-r--r--elpa/magit-20200728.45/dir18
-rw-r--r--elpa/magit-20200728.45/git-rebase.el804
-rw-r--r--elpa/magit-20200728.45/magit-apply.el739
-rw-r--r--elpa/magit-20200728.45/magit-autoloads.el2532
-rw-r--r--elpa/magit-20200728.45/magit-autorevert.el269
-rw-r--r--elpa/magit-20200728.45/magit-bisect.el239
-rw-r--r--elpa/magit-20200728.45/magit-blame.el944
-rw-r--r--elpa/magit-20200728.45/magit-bookmark.el203
-rw-r--r--elpa/magit-20200728.45/magit-branch.el893
-rw-r--r--elpa/magit-20200728.45/magit-clone.el273
-rw-r--r--elpa/magit-20200728.45/magit-commit.el612
-rw-r--r--elpa/magit-20200728.45/magit-core.el128
-rw-r--r--elpa/magit-20200728.45/magit-diff.el3287
-rw-r--r--elpa/magit-20200728.45/magit-ediff.el509
-rw-r--r--elpa/magit-20200728.45/magit-extras.el698
-rw-r--r--elpa/magit-20200728.45/magit-fetch.el186
-rw-r--r--elpa/magit-20200728.45/magit-files.el551
-rw-r--r--elpa/magit-20200728.45/magit-git.el2335
-rw-r--r--elpa/magit-20200728.45/magit-gitignore.el197
-rw-r--r--elpa/magit-20200728.45/magit-imenu.el245
-rw-r--r--elpa/magit-20200728.45/magit-log.el1785
-rw-r--r--elpa/magit-20200728.45/magit-margin.el241
-rw-r--r--elpa/magit-20200728.45/magit-merge.el307
-rw-r--r--elpa/magit-20200728.45/magit-mode.el1431
-rw-r--r--elpa/magit-20200728.45/magit-notes.el200
-rw-r--r--elpa/magit-20200728.45/magit-obsolete.el109
-rw-r--r--elpa/magit-20200728.45/magit-patch.el331
-rw-r--r--elpa/magit-20200728.45/magit-pkg.el12
-rw-r--r--elpa/magit-20200728.45/magit-process.el1156
-rw-r--r--elpa/magit-20200728.45/magit-pull.el164
-rw-r--r--elpa/magit-20200728.45/magit-push.el331
-rw-r--r--elpa/magit-20200728.45/magit-reflog.el213
-rw-r--r--elpa/magit-20200728.45/magit-refs.el758
-rw-r--r--elpa/magit-20200728.45/magit-remote.el348
-rw-r--r--elpa/magit-20200728.45/magit-repos.el338
-rw-r--r--elpa/magit-20200728.45/magit-reset.el135
-rw-r--r--elpa/magit-20200728.45/magit-section.el1733
-rw-r--r--elpa/magit-20200728.45/magit-sequence.el1042
-rw-r--r--elpa/magit-20200728.45/magit-stash.el546
-rw-r--r--elpa/magit-20200728.45/magit-status.el846
-rw-r--r--elpa/magit-20200728.45/magit-submodule.el664
-rw-r--r--elpa/magit-20200728.45/magit-subtree.el182
-rw-r--r--elpa/magit-20200728.45/magit-tag.el213
-rw-r--r--elpa/magit-20200728.45/magit-transient.el202
-rw-r--r--elpa/magit-20200728.45/magit-utils.el1214
-rw-r--r--elpa/magit-20200728.45/magit-wip.el456
-rw-r--r--elpa/magit-20200728.45/magit-worktree.el184
-rw-r--r--elpa/magit-20200728.45/magit.el610
-rw-r--r--elpa/magit-20200728.45/magit.info193
-rw-r--r--elpa/magit-20200728.45/magit.info-17817
-rw-r--r--elpa/magit-20200728.45/magit.info-23526
-rw-r--r--elpa/memoize-20200103.2036/memoize-autoloads.el22
-rw-r--r--elpa/memoize-20200103.2036/memoize-pkg.el2
-rw-r--r--elpa/memoize-20200103.2036/memoize.el190
-rw-r--r--elpa/mixed-pitch-20200511.2052/mixed-pitch-autoloads.el31
-rw-r--r--elpa/mixed-pitch-20200511.2052/mixed-pitch-pkg.el2
-rw-r--r--elpa/mixed-pitch-20200511.2052/mixed-pitch.el182
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f002.xpm104
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f013.xpm100
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f016.xpm59
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f021.xpm106
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f023.xpm72
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f03c.xpm59
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f044.xpm110
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f046.xpm100
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f047.xpm76
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f059.xpm109
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f05a.xpm93
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f066.xpm76
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f071.xpm87
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f073.xpm74
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f092.xpm93
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f09c.xpm60
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f0c7.xpm61
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f0f6.xpm66
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f11c.xpm68
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f128.xpm71
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f179.xpm94
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f17a.xpm72
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f17c.xpm140
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f188.xpm96
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f18e.xpm128
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ad.xpm67
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f1c6.xpm86
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f1d2.xpm108
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f1de.xpm71
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ec.xpm103
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f21b.xpm98
-rw-r--r--elpa/mode-icons-20190627.2121/icons/FontAwesome-f27b.xpm123
-rw-r--r--elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-ea12.xpm80
-rw-r--r--elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabd.xpm141
-rw-r--r--elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabf.xpm94
-rw-r--r--elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.pngbin749 -> 0 bytes
-rw-r--r--elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.xpm94
-rw-r--r--elpa/mode-icons-20190627.2121/icons/R.xpm140
-rw-r--r--elpa/mode-icons-20190627.2121/icons/autohotkey.xpm173
-rw-r--r--elpa/mode-icons-20190627.2121/icons/bash.xpm59
-rw-r--r--elpa/mode-icons-20190627.2121/icons/bibtex.xpm26
-rw-r--r--elpa/mode-icons-20190627.2121/icons/c.xpm76
-rw-r--r--elpa/mode-icons-20190627.2121/icons/cl.xpm276
-rw-r--r--elpa/mode-icons-20190627.2121/icons/cmd.xpm46
-rw-r--r--elpa/mode-icons-20190627.2121/icons/coffee.xpm80
-rw-r--r--elpa/mode-icons-20190627.2121/icons/compile.xpm115
-rw-r--r--elpa/mode-icons-20190627.2121/icons/cpp.xpm106
-rw-r--r--elpa/mode-icons-20190627.2121/icons/csharp.xpm197
-rw-r--r--elpa/mode-icons-20190627.2121/icons/css.xpm91
-rw-r--r--elpa/mode-icons-20190627.2121/icons/cygwin.xpm22
-rw-r--r--elpa/mode-icons-20190627.2121/icons/dart.xpm67
-rw-r--r--elpa/mode-icons-20190627.2121/icons/dim.xpm67
-rw-r--r--elpa/mode-icons-20190627.2121/icons/docker.xpm97
-rw-r--r--elpa/mode-icons-20190627.2121/icons/e-palm_tree.xpm83
-rw-r--r--elpa/mode-icons-20190627.2121/icons/elixir.xpm126
-rw-r--r--elpa/mode-icons-20190627.2121/icons/emacs.xpm189
-rw-r--r--elpa/mode-icons-20190627.2121/icons/emmet.xpm140
-rw-r--r--elpa/mode-icons-20190627.2121/icons/emoji.pngbin1492 -> 0 bytes
-rw-r--r--elpa/mode-icons-20190627.2121/icons/emoji.xpm251
-rw-r--r--elpa/mode-icons-20190627.2121/icons/erlang.xpm25
-rw-r--r--elpa/mode-icons-20190627.2121/icons/ext-png.xpm70
-rw-r--r--elpa/mode-icons-20190627.2121/icons/ext-tex.xpm77
-rw-r--r--elpa/mode-icons-20190627.2121/icons/ext-xpm.xpm76
-rw-r--r--elpa/mode-icons-20190627.2121/icons/flutter.xpm79
-rw-r--r--elpa/mode-icons-20190627.2121/icons/flycheck.xpm228
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f107.xpm97
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f10a.xpm157
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f10c.xpm107
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f10d.xpm123
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f115.xpm87
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f116.xpm97
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f126.xpm115
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f12b.xpm125
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f148.xpm124
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f15b.xpm96
-rw-r--r--elpa/mode-icons-20190627.2121/icons/font-mfizz-f166.xpm130
-rw-r--r--elpa/mode-icons-20190627.2121/icons/github-octicons-f0c9.xpm64
-rw-r--r--elpa/mode-icons-20190627.2121/icons/go.xpm113
-rw-r--r--elpa/mode-icons-20190627.2121/icons/golden.xpm103
-rw-r--r--elpa/mode-icons-20190627.2121/icons/haml.xpm96
-rw-r--r--elpa/mode-icons-20190627.2121/icons/helm.xpm21
-rw-r--r--elpa/mode-icons-20190627.2121/icons/hs.xpm119
-rw-r--r--elpa/mode-icons-20190627.2121/icons/html.xpm117
-rw-r--r--elpa/mode-icons-20190627.2121/icons/icy.xpm107
-rw-r--r--elpa/mode-icons-20190627.2121/icons/infruby.xpm243
-rw-r--r--elpa/mode-icons-20190627.2121/icons/ivy.xpm21
-rw-r--r--elpa/mode-icons-20190627.2121/icons/js.xpm67
-rw-r--r--elpa/mode-icons-20190627.2121/icons/msys.xpm146
-rw-r--r--elpa/mode-icons-20190627.2121/icons/octave.xpm98
-rw-r--r--elpa/mode-icons-20190627.2121/icons/org.xpm170
-rw-r--r--elpa/mode-icons-20190627.2121/icons/php.xpm334
-rw-r--r--elpa/mode-icons-20190627.2121/icons/powershell.xpm197
-rw-r--r--elpa/mode-icons-20190627.2121/icons/python.xpm173
-rw-r--r--elpa/mode-icons-20190627.2121/icons/rails.xpm200
-rw-r--r--elpa/mode-icons-20190627.2121/icons/rainbow.xpm162
-rw-r--r--elpa/mode-icons-20190627.2121/icons/react.xpm26
-rw-r--r--elpa/mode-icons-20190627.2121/icons/ruby.xpm231
-rw-r--r--elpa/mode-icons-20190627.2121/icons/rust.xpm63
-rw-r--r--elpa/mode-icons-20190627.2121/icons/sas.xpm106
-rw-r--r--elpa/mode-icons-20190627.2121/icons/sass.xpm107
-rw-r--r--elpa/mode-icons-20190627.2121/icons/scheme.xpm22
-rw-r--r--elpa/mode-icons-20190627.2121/icons/slim.xpm163
-rw-r--r--elpa/mode-icons-20190627.2121/icons/smartparens.xpm29
-rw-r--r--elpa/mode-icons-20190627.2121/icons/spacemacs.pngbin935 -> 0 bytes
-rw-r--r--elpa/mode-icons-20190627.2121/icons/spacemacs.xpm180
-rw-r--r--elpa/mode-icons-20190627.2121/icons/svg.xpm71
-rw-r--r--elpa/mode-icons-20190627.2121/icons/term.xpm79
-rw-r--r--elpa/mode-icons-20190627.2121/icons/xml.xpm91
-rw-r--r--elpa/mode-icons-20190627.2121/icons/yaml.xpm257
-rw-r--r--elpa/mode-icons-20190627.2121/icons/yas.xpm68
-rw-r--r--elpa/mode-icons-20190627.2121/mode-icons-autoloads.el41
-rw-r--r--elpa/mode-icons-20190627.2121/mode-icons-pkg.el13
-rw-r--r--elpa/mode-icons-20190627.2121/mode-icons.el1883
-rw-r--r--elpa/org-bullets-20200317.1740/org-bullets-autoloads.el27
-rw-r--r--elpa/org-bullets-20200317.1740/org-bullets-pkg.el2
-rw-r--r--elpa/org-bullets-20200317.1740/org-bullets.el138
-rw-r--r--elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el62
-rw-r--r--elpa/page-break-lines-20200305.244/page-break-lines-pkg.el2
-rw-r--r--elpa/page-break-lines-20200305.244/page-break-lines.el182
-rw-r--r--elpa/pdf-tools-20200512.1524/README381
-rwxr-xr-xelpa/pdf-tools-20200512.1524/epdfinfobin1082680 -> 0 bytes
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-annot.el1790
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-cache.el456
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-dev.el85
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-history.el170
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-info.el1744
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-isearch.el831
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-links.el376
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-loader.el80
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-misc.el287
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-occur.el827
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-outline.el598
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-sync.el781
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-tools-autoloads.el430
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-tools-pkg.el13
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-tools.el525
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-util.el1346
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-view.el1676
-rw-r--r--elpa/pdf-tools-20200512.1524/pdf-virtual.el1038
-rw-r--r--elpa/pkg-info-20150517.1143/pkg-info-autoloads.el127
-rw-r--r--elpa/pkg-info-20150517.1143/pkg-info-pkg.el2
-rw-r--r--elpa/pkg-info-20150517.1143/pkg-info.el332
-rw-r--r--elpa/popup-20200610.317/popup-autoloads.el22
-rw-r--r--elpa/popup-20200610.317/popup-pkg.el2
-rw-r--r--elpa/popup-20200610.317/popup.el1435
-rw-r--r--elpa/powerline-20200105.2053/powerline-autoloads.el101
-rw-r--r--elpa/powerline-20200105.2053/powerline-pkg.el12
-rw-r--r--elpa/powerline-20200105.2053/powerline-separators.el635
-rw-r--r--elpa/powerline-20200105.2053/powerline-themes.el294
-rw-r--r--elpa/powerline-20200105.2053/powerline.el617
-rw-r--r--elpa/projectile-20200710.947/projectile-autoloads.el635
-rw-r--r--elpa/projectile-20200710.947/projectile-pkg.el2
-rw-r--r--elpa/projectile-20200710.947/projectile.el4875
-rw-r--r--elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-autoloads.el38
-rw-r--r--elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-pkg.el2
-rw-r--r--elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters.el305
-rw-r--r--elpa/rainbow-mode-1.0.5.signed1
-rw-r--r--elpa/rainbow-mode-1.0.5/rainbow-mode-autoloads.el28
-rw-r--r--elpa/rainbow-mode-1.0.5/rainbow-mode-pkg.el2
-rw-r--r--elpa/rainbow-mode-1.0.5/rainbow-mode.el1379
-rw-r--r--elpa/s-20180406.808/s-autoloads.el22
-rw-r--r--elpa/s-20180406.808/s-pkg.el2
-rw-r--r--elpa/s-20180406.808/s.el748
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-autoloads.el330
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-c.el52
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-clojure.el56
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-config.el134
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-crystal.el261
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-elixir.el135
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-ess.el227
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-haskell.el113
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-html.el173
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-javascript.el55
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-latex.el192
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-lua.el90
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-markdown.el88
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-ml.el76
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-org.el72
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-pkg.el7
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-python.el92
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-racket.el56
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-rst.el62
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-ruby.el411
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-rust.el142
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-scala.el80
-rw-r--r--elpa/smartparens-20200324.2147/smartparens-text.el65
-rw-r--r--elpa/smartparens-20200324.2147/smartparens.el9628
-rw-r--r--elpa/swiper-20200503.1102/swiper-autoloads.el64
-rw-r--r--elpa/swiper-20200503.1102/swiper-pkg.el2
-rw-r--r--elpa/swiper-20200503.1102/swiper.el1719
-rw-r--r--elpa/tabbar-20180726.1735/down.pngbin186 -> 0 bytes
-rw-r--r--elpa/tabbar-20180726.1735/tabbar-autoloads.el185
-rw-r--r--elpa/tabbar-20180726.1735/tabbar-pkg.el9
-rw-r--r--elpa/tabbar-20180726.1735/tabbar.el1978
-rw-r--r--elpa/tabbar-20180726.1735/up.pngbin175 -> 0 bytes
-rw-r--r--elpa/tabbar-ruler-20160802.307/dir19
-rw-r--r--elpa/tabbar-ruler-20160802.307/tabbar-ruler-autoloads.el52
-rw-r--r--elpa/tabbar-ruler-20160802.307/tabbar-ruler-pkg.el15
-rw-r--r--elpa/tabbar-ruler-20160802.307/tabbar-ruler.el2150
-rw-r--r--elpa/tabbar-ruler-20160802.307/tabbar-ruler.info244
-rw-r--r--elpa/tabbar-ruler-readme.txt59
-rw-r--r--elpa/tablist-20200427.2205/tablist-autoloads.el48
-rw-r--r--elpa/tablist-20200427.2205/tablist-filter.el464
-rw-r--r--elpa/tablist-20200427.2205/tablist-pkg.el11
-rw-r--r--elpa/tablist-20200427.2205/tablist.el1945
-rw-r--r--elpa/transient-20200719.955/dir18
-rw-r--r--elpa/transient-20200719.955/transient-autoloads.el80
-rw-r--r--elpa/transient-20200719.955/transient-pkg.el12
-rw-r--r--elpa/transient-20200719.955/transient.el3417
-rw-r--r--elpa/transient-20200719.955/transient.info2442
-rw-r--r--elpa/undo-tree-0.7.4.signed1
-rw-r--r--elpa/undo-tree-0.7.4/undo-tree-autoloads.el64
-rw-r--r--elpa/undo-tree-0.7.4/undo-tree-pkg.el2
-rw-r--r--elpa/undo-tree-0.7.4/undo-tree.el4751
-rw-r--r--elpa/use-package-20200721.2156/dir18
-rw-r--r--elpa/use-package-20200721.2156/use-package-autoloads.el232
-rw-r--r--elpa/use-package-20200721.2156/use-package-bind-key.el172
-rw-r--r--elpa/use-package-20200721.2156/use-package-core.el1599
-rw-r--r--elpa/use-package-20200721.2156/use-package-delight.el91
-rw-r--r--elpa/use-package-20200721.2156/use-package-diminish.el80
-rw-r--r--elpa/use-package-20200721.2156/use-package-ensure.el214
-rw-r--r--elpa/use-package-20200721.2156/use-package-jump.el79
-rw-r--r--elpa/use-package-20200721.2156/use-package-lint.el84
-rw-r--r--elpa/use-package-20200721.2156/use-package-pkg.el13
-rw-r--r--elpa/use-package-20200721.2156/use-package.el54
-rw-r--r--elpa/use-package-20200721.2156/use-package.info1048
-rw-r--r--elpa/which-key-20200721.1927/which-key-autoloads.el202
-rw-r--r--elpa/which-key-20200721.1927/which-key-pkg.el2
-rw-r--r--elpa/which-key-20200721.1927/which-key.el2773
-rw-r--r--elpa/with-editor-20200720.2014/dir18
-rw-r--r--elpa/with-editor-20200720.2014/with-editor-autoloads.el99
-rw-r--r--elpa/with-editor-20200720.2014/with-editor-pkg.el13
-rw-r--r--elpa/with-editor-20200720.2014/with-editor.el916
-rw-r--r--elpa/with-editor-20200720.2014/with-editor.info413
438 files changed, 1 insertions, 220794 deletions
diff --git a/.gitignore b/.gitignore
index 8ed65e0..130276f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,8 +8,7 @@
*.lof
# These directories are populated on config execution.
-# elpa/**
-elpa/pdf-tools-*/build/**
+elpa/**
url/**
auto-save-list/**
transient/**
diff --git a/elpa/all-the-icons-20200730.1545/all-the-icons-autoloads.el b/elpa/all-the-icons-20200730.1545/all-the-icons-autoloads.el
deleted file mode 100644
index 121bfa6..0000000
--- a/elpa/all-the-icons-20200730.1545/all-the-icons-autoloads.el
+++ /dev/null
@@ -1,75 +0,0 @@
-;;; all-the-icons-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "all-the-icons" "all-the-icons.el" (0 0 0 0))
-;;; Generated autoloads from all-the-icons.el
-
-(autoload 'all-the-icons-icon-for-dir "all-the-icons" "\
-Get the formatted icon for DIR.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions.
-
-Note: You want chevron, please use `all-the-icons-icon-for-dir-with-chevron'.
-
-\(fn DIR &rest ARG-OVERRIDES)" nil nil)
-
-(autoload 'all-the-icons-icon-for-file "all-the-icons" "\
-Get the formatted icon for FILE.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions.
-
-\(fn FILE &rest ARG-OVERRIDES)" nil nil)
-
-(autoload 'all-the-icons-icon-for-mode "all-the-icons" "\
-Get the formatted icon for MODE.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions.
-
-\(fn MODE &rest ARG-OVERRIDES)" nil nil)
-
-(autoload 'all-the-icons-icon-for-url "all-the-icons" "\
-Get the formatted icon for URL.
-If an icon for URL isn't found in `all-the-icons-url-alist', a globe is used.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions.
-
-\(fn URL &rest ARG-OVERRIDES)" nil nil)
-
-(autoload 'all-the-icons-install-fonts "all-the-icons" "\
-Helper function to download and install the latests fonts based on OS.
-When PFX is non-nil, ignore the prompt and just install
-
-\(fn &optional PFX)" t nil)
-
-(autoload 'all-the-icons-insert "all-the-icons" "\
-Interactive icon insertion function.
-When Prefix ARG is non-nil, insert the propertized icon.
-When FAMILY is non-nil, limit the candidates to the icon set matching it.
-
-\(fn &optional ARG FAMILY)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "all-the-icons" '("all-the-icons-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("all-the-icons-faces.el" "all-the-icons-pkg.el")
-;;;;;; (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; all-the-icons-autoloads.el ends here
diff --git a/elpa/all-the-icons-20200730.1545/all-the-icons-faces.el b/elpa/all-the-icons-20200730.1545/all-the-icons-faces.el
deleted file mode 100644
index 4408e97..0000000
--- a/elpa/all-the-icons-20200730.1545/all-the-icons-faces.el
+++ /dev/null
@@ -1,230 +0,0 @@
-;;; all-the-icons-faces.el --- A module of faces for all-the-icons
-
-;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com>
-
-;; Author: Dominic Charlesworth <dgc336@gmail.com>
-;; Version: 1.0.0
-;; Package-Requires: ((emacs "24.3"))
-;; URL: https://github.com/domtronn/all-the-icons.el
-;; Keywords: convenient, lisp
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file contains all of the faces used by the package for
-;; colouring icons
-
-;;; Code:
-
-(defgroup all-the-icons-faces nil
- "Manage how All The Icons icons are coloured and themed."
- :prefix "all-the-icons-"
- :group 'tools
- :group 'all-the-icons)
-
-
-;; red
-(defface all-the-icons-red
- '((((background dark)) :foreground "#AC4142")
- (((background light)) :foreground "#AC4142"))
- "Face for red icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lred
- '((((background dark)) :foreground "#EB595A")
- (((background light)) :foreground "#EB595A"))
- "Face for lred icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dred
- '((((background dark)) :foreground "#843031")
- (((background light)) :foreground "#843031"))
- "Face for dred icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-red-alt
- '((((background dark)) :foreground "#ce5643")
- (((background light)) :foreground "#843031"))
- "Face for dred icons"
- :group 'all-the-icons-faces)
-
-;; green
-(defface all-the-icons-green
- '((((background dark)) :foreground "#90A959")
- (((background light)) :foreground "#90A959"))
- "Face for green icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lgreen
- '((((background dark)) :foreground "#C6E87A")
- (((background light)) :foreground "#3D6837"))
- "Face for lgreen icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dgreen
- '((((background dark)) :foreground "#6D8143")
- (((background light)) :foreground "#6D8143"))
- "Face for dgreen icons"
- :group 'all-the-icons-faces)
-
-;; yellow
-(defface all-the-icons-yellow
- '((((background dark)) :foreground "#FFD446")
- (((background light)) :foreground "#FFCC0E"))
- "Face for yellow icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lyellow
- '((((background dark)) :foreground "#FFC16D")
- (((background light)) :foreground "#FF9300"))
- "Face for lyellow icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dyellow
- '((((background dark)) :foreground "#B48D56")
- (((background light)) :foreground "#B48D56"))
- "Face for dyellow icons"
- :group 'all-the-icons-faces)
-
-;; blue
-(defface all-the-icons-blue
- '((((background dark)) :foreground "#6A9FB5")
- (((background light)) :foreground "#6A9FB5"))
- "Face for blue icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-blue-alt
- '((((background dark)) :foreground "#2188b6")
- (((background light)) :foreground "#2188b6"))
- "Face for blue icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lblue
- '((((background dark)) :foreground "#8FD7F4")
- (((background light)) :foreground "#677174"))
- "Face for lblue icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dblue
- '((((background dark)) :foreground "#446674")
- (((background light)) :foreground "#446674"))
- "Face for dblue icons"
- :group 'all-the-icons-faces)
-
-;; maroon
-(defface all-the-icons-maroon
- '((((background dark)) :foreground "#8F5536")
- (((background light)) :foreground "#8F5536"))
- "Face for maroon icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lmaroon
- '((((background dark)) :foreground "#CE7A4E")
- (((background light)) :foreground "#CE7A4E"))
- "Face for lmaroon icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dmaroon
- '((((background dark)) :foreground "#72584B")
- (((background light)) :foreground "#72584B"))
- "Face for dmaroon icons"
- :group 'all-the-icons-faces)
-
-;; purple
-(defface all-the-icons-purple
- '((((background dark)) :foreground "#AA759F")
- (((background light)) :foreground "#68295B"))
- "Face for purple icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-purple-alt
- '((((background dark)) :foreground "#5D54E1")
- (((background light)) :foreground "#5D54E1"))
- "Face for purple icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lpurple
- '((((background dark)) :foreground "#E69DD6")
- (((background light)) :foreground "#E69DD6"))
- "Face for lpurple icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dpurple
- '((((background dark)) :foreground "#694863")
- (((background light)) :foreground "#694863"))
- "Face for dpurple icons"
- :group 'all-the-icons-faces)
-
-;; orange
-(defface all-the-icons-orange
- '((((background dark)) :foreground "#D4843E")
- (((background light)) :foreground "#D4843E"))
- "Face for orange icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lorange
- '((((background dark)) :foreground "#FFA500")
- (((background light)) :foreground "#FFA500"))
- "Face for lorange icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dorange
- '((((background dark)) :foreground "#915B2D")
- (((background light)) :foreground "#915B2D"))
- "Face for dorange icons"
- :group 'all-the-icons-faces)
-
-;; cyan
-(defface all-the-icons-cyan
- '((((background dark)) :foreground "#75B5AA")
- (((background light)) :foreground "#75B5AA"))
- "Face for cyan icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-cyan-alt
- '((((background dark)) :foreground "#61dafb")
- (((background light)) :foreground "#0595bd"))
- "Face for cyan icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lcyan
- '((((background dark)) :foreground "#A5FDEC")
- (((background light)) :foreground "#2C7D6E"))
- "Face for lcyan icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dcyan
- '((((background dark)) :foreground "#48746D")
- (((background light)) :foreground "#48746D"))
- "Face for dcyan icons"
- :group 'all-the-icons-faces)
-
-;; pink
-(defface all-the-icons-pink
- '((((background dark)) :foreground "#F2B4B8")
- (((background light)) :foreground "#FC505B"))
- "Face for pink icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lpink
- '((((background dark)) :foreground "#FFBDC1")
- (((background light)) :foreground "#FF505B"))
- "Face for lpink icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dpink
- '((((background dark)) :foreground "#B18286")
- (((background light)) :foreground "#7E5D5F"))
- "Face for dpink icons"
- :group 'all-the-icons-faces)
-
-;; silver
-(defface all-the-icons-silver
- '((((background dark)) :foreground "#716E68")
- (((background light)) :foreground "#716E68"))
- "Face for silver icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-lsilver
- '((((background dark)) :foreground "#B9B6AA")
- (((background light)) :foreground "#7F7869"))
- "Face for lsilver icons"
- :group 'all-the-icons-faces)
-(defface all-the-icons-dsilver
- '((((background dark)) :foreground "#838484")
- (((background light)) :foreground "#838484"))
- "Face for dsilver icons"
- :group 'all-the-icons-faces)
-
-
-(provide 'all-the-icons-faces)
-;;; all-the-icons-faces.el ends here
diff --git a/elpa/all-the-icons-20200730.1545/all-the-icons-pkg.el b/elpa/all-the-icons-20200730.1545/all-the-icons-pkg.el
deleted file mode 100644
index 85c16d3..0000000
--- a/elpa/all-the-icons-20200730.1545/all-the-icons-pkg.el
+++ /dev/null
@@ -1,13 +0,0 @@
-(define-package "all-the-icons" "20200730.1545" "A library for inserting Developer icons"
- '((emacs "24.3")
- (memoize "1.0.1"))
- :commit "8c0228053dd6693d926970d89270094be52b0f75" :keywords
- '("convenient" "lisp")
- :authors
- '(("Dominic Charlesworth" . "dgc336@gmail.com"))
- :maintainer
- '("Dominic Charlesworth" . "dgc336@gmail.com")
- :url "https://github.com/domtronn/all-the-icons.el")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/all-the-icons-20200730.1545/all-the-icons.el b/elpa/all-the-icons-20200730.1545/all-the-icons.el
deleted file mode 100644
index e99b658..0000000
--- a/elpa/all-the-icons-20200730.1545/all-the-icons.el
+++ /dev/null
@@ -1,1074 +0,0 @@
-;;; all-the-icons.el --- A library for inserting Developer icons
-
-;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com>
-
-;; Author: Dominic Charlesworth <dgc336@gmail.com>
-;; Version: 4.0.0
-;; Package-Requires: ((emacs "24.3") (memoize "1.0.1"))
-;; URL: https://github.com/domtronn/all-the-icons.el
-;; Keywords: convenient, lisp
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package is a utility for using and formatting various Icon
-;; fonts within Emacs. Icon Fonts allow you to propertize and format
-;; icons the same way you would normal text. This enables things such
-;; as better scaling of and anti aliasing of the icons.
-
-;; This package was inspired by
-
-;; - `mode-icons' for Emacs, found at https://github.com/ryuslash/mode-icons
-;; - `file-icons' for Atom, found at https://atom.io/packages/file-icons
-
-;; Currently, this package provides an interface to the following Icon Fonts
-
-;; - Atom File Icons, found at https://atom.io/packages/file-icons
-;; - FontAwesome Icons, found at http://fontawesome.io/
-;; - GitHub Octicons, found at http://octicons.github.com
-;; - Material Design Icons, found at http://google.github.io/material-design-icons/
-;; - Weather Icons, found at https://erikflowers.github.io/weather-icons/
-;; - AllTheIcons, a custom Icon Font maintained as part of this package
-
-;; Requests for new icons will be accepted and added to the AllTheIcons Icon Font
-
-;;; Usage:
-
-;; The simplest usage for this package is to use the following functions;
-
-;; `all-the-icons-icon-for-buffer'
-;; `all-the-icons-icon-for-dir'
-;; `all-the-icons-icon-for-file'
-;; `all-the-icons-icon-for-mode'
-;; `all-the-icons-icon-for-url'
-
-;; Which can be used to get a formatted icon for the current buffer, a
-;; file name, a major mode, or an URL respectively. e.g.
-
-;; (insert (all-the-icons-icon-for-file "foo.js"))
-
-;; Inserts a JavaScript icon formatted like this
-
-;; #("some-icon" 0 1 (display (raise -0.24)
-;; face (:family "dev-icons" :height 1.08 :foreground "#FFD446")))
-
-;; You can also insert icons directly using the individual icon family
-;; functions
-
-;; `all-the-icons-alltheicon' // Custom font with fewest icons
-;; `all-the-icons-devicon' // Developer Icons
-;; `all-the-icons-faicon' // Font Awesome Icons
-;; `all-the-icons-fileicon' // File Icons from the Atom File Icons package
-;; `all-the-icons-octicon' // GitHub Octicons
-;; `all-the-icons-material' // Material Design Icons
-;; `all-the-icons-wicon' // Weather Icons
-
-;; You can call these functions with the icon name you want to insert, e.g.
-
-;; (all-the-icons-octicon "file-binary") // GitHub Octicon for Binary File
-;; (all-the-icons-faicon "cogs") // FontAwesome icon for cogs
-;; (all-the-icons-wicon "tornado") // Weather Icon for tornado
-
-;; A list of all the icon names for the different font families can be
-;; found in the data directory, or by inspecting the alist variables.
-;; All the alist variables are prefixed with `all-the-icons-data/'
-
-;;; Code:
-(require 'memoize)
-(require 'cl-lib)
-
-(require 'data-alltheicons "./data/data-alltheicons.el")
-(require 'data-faicons "./data/data-faicons.el")
-(require 'data-fileicons "./data/data-fileicons.el")
-(require 'data-octicons "./data/data-octicons.el")
-(require 'data-weathericons "./data/data-weathericons.el")
-(require 'data-material "./data/data-material.el")
-
-(require 'all-the-icons-faces)
-
-;;; Custom Variables
-(defgroup all-the-icons nil
- "Manage how All The Icons formats icons."
- :prefix "all-the-icons-"
- :group 'appearance
- :group 'convenience)
-
-(defcustom all-the-icons-color-icons t
- "Whether or not to include a foreground colour when formatting the icon."
- :group 'all-the-icons
- :type 'boolean)
-
-(defcustom all-the-icons-scale-factor 1.2
- "The base Scale Factor for the `height' face property of an icon."
- :group 'all-the-icons
- :type 'number)
-
-(defcustom all-the-icons-default-adjust -0.2
- "The default adjustment to be made to the `raise' display property of an icon."
- :group 'all-the-icons
- :type 'number)
-
-(defvar all-the-icons-font-families '() "List of defined icon font families.")
-(defvar all-the-icons-font-names '() "List of defined font file names this package was built with.")
-
-(defvar all-the-icons-icon-alist
- '(
- ;; Meta
- ("\\.tags" all-the-icons-octicon "tag" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue)
- ("^TAGS$" all-the-icons-octicon "tag" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue)
- ("\\.log" all-the-icons-octicon "bug" :height 1.0 :v-adjust 0.0 :face all-the-icons-maroon)
-
- ;;
- ("\\.key$" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-lblue)
- ("\\.pem$" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-orange)
- ("\\.p12$" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-dorange)
- ("\\.crt$" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-lblue)
- ("\\.pub$" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-blue)
- ("\\.gpg$" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-lblue)
-
- ("^TODO$" all-the-icons-octicon "checklist" :v-adjust 0.0 :face all-the-icons-lyellow)
- ("^LICENSE$" all-the-icons-octicon "book" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue)
- ("^readme" all-the-icons-octicon "book" :height 1.0 :v-adjust 0.0 :face all-the-icons-lcyan)
-
- ("\\.fish" all-the-icons-alltheicon "terminal" :face all-the-icons-lpink)
- ("\\.zsh" all-the-icons-alltheicon "terminal" :face all-the-icons-lcyan)
- ("\\.sh" all-the-icons-alltheicon "terminal" :face all-the-icons-purple)
-
- ;; Config
- ("\\.node" all-the-icons-alltheicon "nodejs" :height 1.0 :face all-the-icons-green)
- ("\\.babelrc$" all-the-icons-fileicon "babel" :face all-the-icons-yellow)
- ("\\.bashrc$" all-the-icons-alltheicon "script" :height 0.9 :face all-the-icons-dpink)
- ("\\.bowerrc$" all-the-icons-alltheicon "bower" :height 1.0 :v-adjust 0.0 :face all-the-icons-silver)
- ("^bower.json$" all-the-icons-alltheicon "bower" :height 1.0 :v-adjust 0.0 :face all-the-icons-lorange)
- ("\\.ini$" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.eslintignore" all-the-icons-fileicon "eslint" :height 0.9 :face all-the-icons-purple)
- ("\\.eslint" all-the-icons-fileicon "eslint" :height 0.9 :face all-the-icons-lpurple)
- ("\\.git" all-the-icons-alltheicon "git" :height 1.0 :face all-the-icons-lred)
- ("nginx" all-the-icons-fileicon "nginx" :height 0.9 :face all-the-icons-dgreen)
- ("apache" all-the-icons-alltheicon "apache" :height 0.9 :face all-the-icons-dgreen)
- ("^Makefile$" all-the-icons-fileicon "gnu" :face all-the-icons-dorange)
- ("\\.mk$" all-the-icons-fileicon "gnu" :face all-the-icons-dorange)
-
- ("\\.dockerignore$" all-the-icons-fileicon "dockerfile" :height 1.2 :face all-the-icons-dblue)
- ("^\\.?Dockerfile" all-the-icons-fileicon "dockerfile" :face all-the-icons-blue)
- ("^Brewfile$" all-the-icons-faicon "beer" :face all-the-icons-lsilver)
- ("\\.npmignore" all-the-icons-fileicon "npm" :face all-the-icons-dred)
- ("^package.json$" all-the-icons-fileicon "npm" :face all-the-icons-red)
- ("^package.lock.json$" all-the-icons-fileicon "npm" :face all-the-icons-dred)
- ("^yarn\\.lock" all-the-icons-fileicon "yarn" :face all-the-icons-blue-alt)
-
- ("\\.xml$" all-the-icons-faicon "file-code-o" :height 0.95 :face all-the-icons-lorange)
-
- ;; ;; AWS
- ("^stack.*.json$" all-the-icons-alltheicon "aws" :face all-the-icons-orange)
-
-
- ("^serverless\\.yml$" all-the-icons-faicon "bolt" :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.[jc]son$" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.ya?ml$" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-dyellow)
-
- ("\\.pkg$" all-the-icons-octicon "package" :v-adjust 0.0 :face all-the-icons-dsilver)
- ("\\.rpm$" all-the-icons-octicon "package" :v-adjust 0.0 :face all-the-icons-dsilver)
-
- ("\\.elc$" all-the-icons-octicon "file-binary" :v-adjust 0.0 :face all-the-icons-dsilver)
-
- ("\\.gz$" all-the-icons-octicon "file-binary" :v-adjust 0.0 :face all-the-icons-lmaroon)
- ("\\.zip$" all-the-icons-octicon "file-zip" :v-adjust 0.0 :face all-the-icons-lmaroon)
- ("\\.7z$" all-the-icons-octicon "file-zip" :v-adjust 0.0 :face all-the-icons-lmaroon)
-
- ("\\.dat$" all-the-icons-faicon "bar-chart" :face all-the-icons-cyan :height 0.9)
- ;; lock files
- ("~$" all-the-icons-octicon "lock" :v-adjust 0.0 :face all-the-icons-maroon)
-
- ("\\.dmg$" all-the-icons-octicon "tools" :v-adjust 0.0 :face all-the-icons-lsilver)
- ("\\.dll$" all-the-icons-faicon "cogs" :face all-the-icons-silver)
- ("\\.DS_STORE$" all-the-icons-faicon "cogs" :face all-the-icons-silver)
-
- ;; Source Codes
- ("\\.scpt$" all-the-icons-fileicon "apple" :face all-the-icons-pink)
- ("\\.aup$" all-the-icons-fileicon "audacity" :face all-the-icons-yellow)
-
- ("\\.elm" all-the-icons-fileicon "elm" :face all-the-icons-blue)
-
- ("\\.erl$" all-the-icons-alltheicon "erlang" :face all-the-icons-red :v-adjust -0.1 :height 0.9)
- ("\\.hrl$" all-the-icons-alltheicon "erlang" :face all-the-icons-dred :v-adjust -0.1 :height 0.9)
-
- ("\\.eex$" all-the-icons-alltheicon "elixir" :face all-the-icons-lorange :v-adjust -0.1 :height 0.9)
- ("\\.leex$" all-the-icons-alltheicon "elixir" :face all-the-icons-lorange :v-adjust -0.1 :height 0.9)
- ("\\.ex$" all-the-icons-alltheicon "elixir" :face all-the-icons-lpurple :v-adjust -0.1 :height 0.9)
- ("\\.exs$" all-the-icons-alltheicon "elixir" :face all-the-icons-lred :v-adjust -0.1 :height 0.9)
- ("^mix.lock$" all-the-icons-alltheicon "elixir" :face all-the-icons-lyellow :v-adjust -0.1 :height 0.9)
-
- ("\\.java$" all-the-icons-alltheicon "java" :height 1.0 :face all-the-icons-purple)
-
- ("\\.go$" all-the-icons-alltheicon "go" :height 1.0 :face all-the-icons-blue)
-
- ("\\.mp3$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.wav$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.m4a$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.ogg$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.flac$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.opus$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.au$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
- ("\\.aif[fc]?$" all-the-icons-faicon "volume-up" :face all-the-icons-dred)
-
- ("\\.jl$" all-the-icons-fileicon "julia" :v-adjust 0.0 :face all-the-icons-purple)
- ("\\.matlab$" all-the-icons-fileicon "matlab" :face all-the-icons-orange)
-
- ("\\.nix$" all-the-icons-fileicon "nix" :face all-the-icons-blue)
-
- ("\\.p[ml]$" all-the-icons-alltheicon "perl" :face all-the-icons-lorange)
- ("\\.pl6$" all-the-icons-fileicon "perl6" :face all-the-icons-cyan)
- ("\\.pm6$" all-the-icons-fileicon "perl6" :face all-the-icons-pink)
- ("\\.pod$" all-the-icons-alltheicon "perldocs" :height 1.2 :face all-the-icons-lgreen)
-
- ("\\.php$" all-the-icons-fileicon "php" :face all-the-icons-lsilver)
- ("\\.pony$" all-the-icons-fileicon "pony" :face all-the-icons-maroon)
- ("\\.ps1$" all-the-icons-fileicon "powershell" :face all-the-icons-blue)
- ("\\.prol?o?g?$" all-the-icons-alltheicon "prolog" :height 1.1 :face all-the-icons-lmaroon)
- ("\\.py$" all-the-icons-alltheicon "python" :height 1.0 :face all-the-icons-dblue)
-
- ("\\.rkt$" all-the-icons-fileicon "racket" :height 1.2 :face all-the-icons-red)
- ("^Gemfile\\(\\.lock\\)?$" all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red)
- ("\\.gem$" all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red)
- ("_?test\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-red)
- ("_?test_helper\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-dred)
- ("_?spec\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-red)
- ("_?spec_helper\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-dred)
- ("\\.rb$" all-the-icons-octicon "ruby" :v-adjust 0.0 :face all-the-icons-lred)
- ("\\.rs$" all-the-icons-alltheicon "rust" :height 1.2 :face all-the-icons-maroon)
- ("\\.rlib$" all-the-icons-alltheicon "rust" :height 1.2 :face all-the-icons-dmaroon)
- ("\\.r[ds]?x?$" all-the-icons-fileicon "R" :face all-the-icons-lblue)
-
- ("\\.sbt$" all-the-icons-fileicon "sbt" :face all-the-icons-red)
- ("\\.scala$" all-the-icons-alltheicon "scala" :face all-the-icons-red)
- ("\\.scm$" all-the-icons-fileicon "scheme" :height 1.2 :face all-the-icons-red)
- ("\\.swift$" all-the-icons-alltheicon "swift" :height 1.0 :v-adjust -0.1 :face all-the-icons-green)
-
- ("-?spec\\.ts$" all-the-icons-fileicon "test-typescript" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue)
- ("-?test\\.ts$" all-the-icons-fileicon "test-typescript" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue)
- ("-?spec\\.js$" all-the-icons-fileicon "test-js" :height 1.0 :v-adjust 0.0 :face all-the-icons-lpurple)
- ("-?test\\.js$" all-the-icons-fileicon "test-js" :height 1.0 :v-adjust 0.0 :face all-the-icons-lpurple)
- ("-?spec\\.jsx$" all-the-icons-fileicon "test-react" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue-alt)
- ("-?test\\.jsx$" all-the-icons-fileicon "test-react" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue-alt)
-
- ("-?spec\\." all-the-icons-fileicon "test-generic" :height 1.0 :v-adjust 0.0 :face all-the-icons-dgreen)
- ("-?test\\." all-the-icons-fileicon "test-generic" :height 1.0 :v-adjust 0.0 :face all-the-icons-dgreen)
-
- ("\\.tf\\(vars\\|state\\)?$" all-the-icons-fileicon "terraform" :height 1.0 :face all-the-icons-purple-alt)
-
- ;; Verilog(-AMS) and SystemVerilog(-AMS)
- ("\\.v$" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
- ("\\.vams$" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
- ("\\.sv$" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
- ("\\.sva$" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
- ("\\.svh$" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
- ("\\.svams$" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
-
- ;; VHDL(-AMS)
- ("\\.vhd$" all-the-icons-fileicon "vhdl" :face all-the-icons-blue)
- ("\\.vhdl$" all-the-icons-fileicon "vhdl" :face all-the-icons-blue)
- ("\\.vhms$" all-the-icons-fileicon "vhdl" :face all-the-icons-blue)
-
- ;; Cabal
- ("\\.cabal$" all-the-icons-fileicon "cabal" :face all-the-icons-lblue)
-
- ;; Kotlin
- ("\\.kt$" all-the-icons-fileicon "kotlin" :face all-the-icons-orange)
- ("\\.kts$" all-the-icons-fileicon "kotlin" :face all-the-icons-orange)
-
- ;; Nimrod
- ("\\.nim$" all-the-icons-fileicon "nimrod" :face all-the-icons-yellow)
- ("\\.nims$" all-the-icons-fileicon "nimrod" :face all-the-icons-yellow)
-
- ;; SQL
- ("\\.sql$" all-the-icons-octicon "database" :face all-the-icons-silver)
-
- ;; Styles
- ("\\.styles$" all-the-icons-material "style" :face all-the-icons-red)
-
- ;; Lua
- ("\\.lua$" all-the-icons-fileicon "lua" :face all-the-icons-dblue)
-
- ;; ASCII doc
- ("\\.adoc$" all-the-icons-fileicon "asciidoc" :face all-the-icons-lblue)
- ("\\.asciidoc$" all-the-icons-fileicon "asciidoc" :face all-the-icons-lblue)
-
- ;; Puppet
- ("\\.pp$" all-the-icons-fileicon "puppet" :face all-the-icons-yellow)
-
- ;; Jinja
- ("\\.j2$" all-the-icons-fileicon "jinja" :face all-the-icons-silver)
- ("\\.jinja2$" all-the-icons-fileicon "jinja" :face all-the-icons-silver)
-
- ;; Docker
- ("\\.dockerfile$" all-the-icons-fileicon "dockerfile" :face all-the-icons-cyan)
-
- ;; Vagrant
- ("\\.vagrantfile$" all-the-icons-fileicon "vagrant" :face all-the-icons-blue)
-
- ;; There seems to be a a bug with this font icon which does not
- ;; let you propertise it without it reverting to being a lower
- ;; case phi
- ("\\.c$" all-the-icons-alltheicon "c-line" :face all-the-icons-blue)
- ("\\.h$" all-the-icons-alltheicon "c-line" :face all-the-icons-purple)
- ("\\.m$" all-the-icons-fileicon "apple" :v-adjust 0.0 :height 1.0)
- ("\\.mm$" all-the-icons-fileicon "apple" :v-adjust 0.0 :height 1.0)
-
- ("\\.c\\(c\\|pp\\|xx\\)$" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-blue)
- ("\\.h\\(h\\|pp\\|xx\\)$" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-purple)
-
- ("\\.csx?$" all-the-icons-alltheicon "csharp-line" :face all-the-icons-dblue)
-
- ("\\.cljc?$" all-the-icons-alltheicon "clojure-line" :height 1.0 :face all-the-icons-blue :v-adjust 0.0)
- ("\\.cljs$" all-the-icons-fileicon "cljs" :height 1.0 :face all-the-icons-dblue :v-adjust 0.0)
-
- ("\\.coffee$" all-the-icons-alltheicon "coffeescript" :height 1.0 :face all-the-icons-maroon)
- ("\\.iced$" all-the-icons-alltheicon "coffeescript" :height 1.0 :face all-the-icons-lmaroon)
-
- ("\\.dart$" all-the-icons-fileicon "dart" :height 1.0 :face all-the-icons-blue :v-adjust 0.0)
-
- ;; Git
- ("^MERGE_" all-the-icons-octicon "git-merge" :v-adjust 0.0 :face all-the-icons-red)
- ("^COMMIT_EDITMSG" all-the-icons-octicon "git-commit" :v-adjust 0.0 :face all-the-icons-red)
-
- ;; Lisps
- ("\\.cl$" all-the-icons-fileicon "clisp" :face all-the-icons-lorange)
- ("\\.l\\(isp\\)?$" all-the-icons-fileicon "lisp" :face all-the-icons-orange)
- ("\\.el$" all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.2 :face all-the-icons-purple)
-
- ;; Stylesheeting
- ("\\.css$" all-the-icons-alltheicon "css3" :face all-the-icons-yellow)
- ("\\.scss$" all-the-icons-alltheicon "sass" :face all-the-icons-pink)
- ("\\.sass$" all-the-icons-alltheicon "sass" :face all-the-icons-dpink)
- ("\\.less$" all-the-icons-alltheicon "less" :height 0.8 :face all-the-icons-dyellow)
- ("\\.postcss$" all-the-icons-fileicon "postcss" :face all-the-icons-dred)
- ("\\.sss$" all-the-icons-fileicon "postcss" :face all-the-icons-dred)
- ("\\.styl$" all-the-icons-alltheicon "stylus" :face all-the-icons-lgreen)
- ("stylelint" all-the-icons-fileicon "stylelint" :face all-the-icons-lyellow)
- ("\\.csv$" all-the-icons-octicon "graph" :v-adjust 0.0 :face all-the-icons-dblue)
-
- ("\\.hs$" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
- ("\\.chs$" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
- ("\\.lhs$" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
- ("\\.hsc$" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
-
- ;; Web modes
- ("\\.inky-haml$" all-the-icons-fileicon "haml" :face all-the-icons-lyellow)
- ("\\.haml$" all-the-icons-fileicon "haml" :face all-the-icons-lyellow)
- ("\\.html?$" all-the-icons-alltheicon "html5" :face all-the-icons-orange)
- ("\\.inky-erb?$" all-the-icons-alltheicon "html5" :face all-the-icons-lred)
- ("\\.erb$" all-the-icons-alltheicon "html5" :face all-the-icons-lred)
- ("\\.hbs$" all-the-icons-fileicon "moustache" :face all-the-icons-green)
- ("\\.inky-slim$" all-the-icons-octicon "dashboard" :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.slim$" all-the-icons-octicon "dashboard" :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.jade$" all-the-icons-fileicon "jade" :face all-the-icons-red)
- ("\\.pug$" all-the-icons-fileicon "pug-alt" :face all-the-icons-red)
-
- ;; JavaScript
- ("^gulpfile" all-the-icons-alltheicon "gulp" :height 1.0 :face all-the-icons-lred)
- ("^gruntfile" all-the-icons-alltheicon "grunt" :height 1.0 :v-adjust -0.1 :face all-the-icons-lyellow)
- ("^webpack" all-the-icons-fileicon "webpack" :face all-the-icons-lblue)
-
- ("\\.d3\\.?js" all-the-icons-alltheicon "d3" :height 0.8 :face all-the-icons-lgreen)
-
- ("\\.re$" all-the-icons-fileicon "reason" :height 1.0 :face all-the-icons-red-alt)
- ("\\.rei$" all-the-icons-fileicon "reason" :height 1.0 :face all-the-icons-dred)
- ("\\.ml$" all-the-icons-fileicon "ocaml" :height 1.0 :face all-the-icons-lpink)
- ("\\.mli$" all-the-icons-fileicon "ocaml" :height 1.0 :face all-the-icons-dpink)
-
- ("\\.react" all-the-icons-alltheicon "react" :height 1.1 :face all-the-icons-lblue)
- ("\\.d\\.ts$" all-the-icons-fileicon "typescript" :height 1.0 :v-adjust -0.1 :face all-the-icons-cyan-alt)
- ("\\.ts$" all-the-icons-fileicon "typescript" :height 1.0 :v-adjust -0.1 :face all-the-icons-blue-alt)
- ("\\.js$" all-the-icons-alltheicon "javascript" :height 1.0 :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.es[0-9]$" all-the-icons-alltheicon "javascript" :height 1.0 :v-adjust 0.0 :face all-the-icons-yellow)
- ("\\.jsx$" all-the-icons-fileicon "jsx-2" :height 1.0 :v-adjust -0.1 :face all-the-icons-cyan-alt)
- ("\\.njs$" all-the-icons-alltheicon "nodejs" :height 1.2 :face all-the-icons-lgreen)
- ("\\.vue$" all-the-icons-fileicon "vue" :face all-the-icons-lgreen)
-
- ;; F#
- ("\\.fs[ix]?$" all-the-icons-fileicon "fsharp" :face all-the-icons-blue-alt)
-
- ;; File Types
- ("\\.ico$" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-blue)
- ("\\.png$" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-orange)
- ("\\.gif$" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-green)
- ("\\.jpe?g$" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-dblue)
- ("\\.svg$" all-the-icons-alltheicon "svg" :height 0.9 :face all-the-icons-lgreen)
-
- ;; Video
- ("\\.mov" all-the-icons-faicon "film" :face all-the-icons-blue)
- ("\\.mp4" all-the-icons-faicon "film" :face all-the-icons-blue)
- ("\\.ogv" all-the-icons-faicon "film" :face all-the-icons-dblue)
- ("\\.mkv" all-the-icons-faicon "film" :face all-the-icons-blue)
- ("\\.webm" all-the-icons-faicon "film" :face all-the-icons-blue)
-
- ;; Fonts
- ("\\.ttf$" all-the-icons-fileicon "font" :v-adjust 0.0 :face all-the-icons-dcyan)
- ("\\.woff2?$" all-the-icons-fileicon "font" :v-adjust 0.0 :face all-the-icons-cyan)
-
- ;; Doc
- ("\\.pdf" all-the-icons-octicon "file-pdf" :v-adjust 0.0 :face all-the-icons-dred)
- ("\\.te?xt" all-the-icons-octicon "file-text" :v-adjust 0.0 :face all-the-icons-cyan)
- ("\\.doc[xm]?$" all-the-icons-fileicon "word" :face all-the-icons-blue)
- ("\\.texi?$" all-the-icons-fileicon "tex" :face all-the-icons-lred)
- ("\\.md$" all-the-icons-octicon "markdown" :v-adjust 0.0 :face all-the-icons-lblue)
- ("\\.bib$" all-the-icons-fileicon "bib" :face all-the-icons-maroon)
- ("\\.org$" all-the-icons-fileicon "org" :face all-the-icons-lgreen)
-
- ("\\.pp[st]$" all-the-icons-fileicon "powerpoint" :face all-the-icons-orange)
- ("\\.pp[st]x$" all-the-icons-fileicon "powerpoint" :face all-the-icons-red)
- ("\\.knt$" all-the-icons-fileicon "powerpoint" :face all-the-icons-cyan)
-
- ("bookmark" all-the-icons-octicon "bookmark" :height 1.1 :v-adjust 0.0 :face all-the-icons-lpink)
- ("\\.cache$" all-the-icons-octicon "database" :height 1.0 :v-adjust 0.0 :face all-the-icons-green)
-
- ("^\\*scratch\\*$" all-the-icons-faicon "sticky-note" :face all-the-icons-lyellow)
- ("^\\*scratch.*" all-the-icons-faicon "sticky-note" :face all-the-icons-yellow)
- ("^\\*new-tab\\*$" all-the-icons-material "star" :face all-the-icons-cyan)
-
- ("^\\." all-the-icons-octicon "gear" :v-adjust 0.0)
- (".?" all-the-icons-faicon "file-o" :v-adjust 0.0 :face all-the-icons-dsilver)))
-
-(defvar all-the-icons-dir-icon-alist
- '(
- ("trash" all-the-icons-faicon "trash-o" :height 1.2 :v-adjust -0.1)
- ("dropbox" all-the-icons-faicon "dropbox" :height 1.0 :v-adjust -0.1)
- ("google[ _-]drive" all-the-icons-alltheicon "google-drive" :height 1.0 :v-adjust -0.1)
- ("^atom$" all-the-icons-alltheicon "atom" :height 1.2 :v-adjust -0.1)
- ("documents" all-the-icons-faicon "book" :height 1.0 :v-adjust -0.1)
- ("download" all-the-icons-faicon "cloud-download" :height 0.9 :v-adjust -0.1)
- ("desktop" all-the-icons-octicon "device-desktop" :height 1.0 :v-adjust -0.1)
- ("pictures" all-the-icons-faicon "picture-o" :height 0.9 :v-adjust -0.2)
- ("photos" all-the-icons-faicon "camera-retro" :height 1.0 :v-adjust -0.1)
- ("music" all-the-icons-faicon "music" :height 1.0 :v-adjust -0.1)
- ("movies" all-the-icons-faicon "film" :height 0.9 :v-adjust -0.1)
- ("code" all-the-icons-octicon "code" :height 1.1 :v-adjust -0.1)
- ("workspace" all-the-icons-octicon "code" :height 1.1 :v-adjust -0.1)
- ("test" all-the-icons-fileicon "test-dir" :height 0.9)
- ("\\.git" all-the-icons-alltheicon "git" :height 1.0)
- (".?" all-the-icons-octicon "file-directory" :height 1.0 :v-adjust -0.1)
- ))
-
-(defvar all-the-icons-weather-icon-alist
- '(
- ("tornado" all-the-icons-wicon "tornado")
- ("hurricane" all-the-icons-wicon "hurricane")
- ("thunderstorms" all-the-icons-wicon "thunderstorm")
- ("sunny" all-the-icons-wicon "day-sunny")
- ("rain.*snow" all-the-icons-wicon "rain-mix")
- ("rain.*hail" all-the-icons-wicon "rain-mix")
- ("sleet" all-the-icons-wicon "sleet")
- ("hail" all-the-icons-wicon "hail")
- ("drizzle" all-the-icons-wicon "sprinkle")
- ("rain" all-the-icons-wicon "showers" :height 1.1 :v-adjust 0.0)
- ("showers" all-the-icons-wicon "showers")
- ("blowing.*snow" all-the-icons-wicon "snow-wind")
- ("snow" all-the-icons-wicon "snow")
- ("dust" all-the-icons-wicon "dust")
- ("fog" all-the-icons-wicon "fog")
- ("haze" all-the-icons-wicon "day-haze")
- ("smoky" all-the-icons-wicon "smoke")
- ("blustery" all-the-icons-wicon "cloudy-windy")
- ("windy" all-the-icons-wicon "cloudy-gusts")
- ("cold" all-the-icons-wicon "snowflake-cold")
- ("partly.*cloudy.*night" all-the-icons-wicon "night-alt-partly-cloudy")
- ("partly.*cloudy" all-the-icons-wicon "day-cloudy-high")
- ("cloudy.*night" all-the-icons-wicon "night-alt-cloudy")
- ("cxloudy.*day" all-the-icons-wicon "day-cloudy")
- ("cloudy" all-the-icons-wicon "cloudy")
- ("clear.*night" all-the-icons-wicon "night-clear")
- ("fair.*night" all-the-icons-wicon "stars")
- ("fair.*day" all-the-icons-wicon "horizon")
- ("hot" all-the-icons-wicon "hot")
- ("not.*available" all-the-icons-wicon "na")
- ))
-
-(defvar all-the-icons-mode-icon-alist
- '(
- (emacs-lisp-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.2 :face all-the-icons-purple)
- (erc-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0)
- (inferior-emacs-lisp-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.2 :face all-the-icons-lblue)
- (dired-mode all-the-icons-octicon "file-directory" :v-adjust 0.0)
- (lisp-interaction-mode all-the-icons-fileicon "lisp" :v-adjust -0.1 :face all-the-icons-orange)
- (sly-mrepl-mode all-the-icons-fileicon "clisp" :v-adjust -0.1 :face all-the-icons-orange)
- (slime-repl-mode all-the-icons-fileicon "clisp" :v-adjust -0.1 :face all-the-icons-orange)
- (org-mode all-the-icons-fileicon "org" :v-adjust 0.0 :face all-the-icons-lgreen)
- (typescript-mode all-the-icons-fileicon "typescript" :v-adjust -0.1 :face all-the-icons-blue-alt)
- (js-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow)
- (js-jsx-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow)
- (js2-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow)
- (js3-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow)
- (rjsx-mode all-the-icons-fileicon "jsx-2" :v-adjust -0.1 :face all-the-icons-cyan-alt)
- (term-mode all-the-icons-octicon "terminal" :v-adjust 0.2)
- (vterm-mode all-the-icons-octicon "terminal" :v-adjust 0.2)
- (eshell-mode all-the-icons-octicon "terminal" :v-adjust 0.0 :face all-the-icons-purple)
- (magit-refs-mode all-the-icons-octicon "git-branch" :v-adjust 0.0 :face all-the-icons-red)
- (magit-process-mode all-the-icons-octicon "mark-github" :v-adjust 0.0)
- (magit-diff-mode all-the-icons-octicon "git-compare" :v-adjust 0.0 :face all-the-icons-lblue)
- (ediff-mode all-the-icons-octicon "git-compare" :v-adjust 0.0 :Face all-the-icons-red)
- (comint-mode all-the-icons-faicon "terminal" :v-adjust 0.0 :face all-the-icons-lblue)
- (eww-mode all-the-icons-faicon "firefox" :v-adjust -0.1 :face all-the-icons-red)
- (org-agenda-mode all-the-icons-octicon "checklist" :v-adjust 0.0 :face all-the-icons-lgreen)
- (cfw:calendar-mode all-the-icons-octicon "calendar" :v-adjust 0.0)
- (ibuffer-mode all-the-icons-faicon "files-o" :v-adjust 0.0 :face all-the-icons-dsilver)
- (messages-buffer-mode all-the-icons-faicon "stack-overflow" :v-adjust -0.1)
- (help-mode all-the-icons-faicon "info" :v-adjust -0.1 :face all-the-icons-purple)
- (benchmark-init/tree-mode all-the-icons-octicon "dashboard" :v-adjust 0.0)
- (jenkins-mode all-the-icons-fileicon "jenkins" :face all-the-icons-blue)
- (magit-popup-mode all-the-icons-alltheicon "git" :face all-the-icons-red)
- (magit-status-mode all-the-icons-alltheicon "git" :face all-the-icons-lred)
- (magit-log-mode all-the-icons-alltheicon "git" :face all-the-icons-green)
- (mu4e-compose-mode all-the-icons-octicon "pencil" :v-adjust 0.0)
- (mu4e-headers-mode all-the-icons-octicon "mail" :v-adjust 0.0)
- (mu4e-main-mode all-the-icons-octicon "mail" :v-adjust 0.0)
- (mu4e-view-mode all-the-icons-octicon "mail-read" :v-adjust 0.0)
- (paradox-menu-mode all-the-icons-faicon "archive" :height 1.0 :v-adjust 0.0 :face all-the-icons-silver)
- (Custom-mode all-the-icons-octicon "settings")
-
- ;; Special matcher for Web Mode based on the `web-mode-content-type' of the current buffer
- (web-mode all-the-icons--web-mode-icon)
-
- (fundamental-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.2 :face all-the-icons-dsilver)
- (special-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.2 :face all-the-icons-yellow)
- (text-mode all-the-icons-octicon "file-text" :v-adjust 0.0 :face all-the-icons-cyan)
- (enh-ruby-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-lred)
- (ruby-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-lred)
- (inf-ruby-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red)
- (projectile-rails-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red)
- (rspec-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red)
- (rake-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red)
- (sh-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple)
- (shell-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple)
- (fish-mode all-the-icons-alltheicon "terminal" :face all-the-icons-lpink)
- (nginx-mode all-the-icons-fileicon "nginx" :height 0.9 :face all-the-icons-dgreen)
- (apache-mode all-the-icons-alltheicon "apache" :height 0.9 :face all-the-icons-dgreen)
- (makefile-mode all-the-icons-fileicon "gnu" :face all-the-icons-dorange)
- (dockerfile-mode all-the-icons-fileicon "dockerfile" :face all-the-icons-blue)
- (docker-compose-mode all-the-icons-fileicon "dockerfile" :face all-the-icons-lblue)
- (nxml-mode all-the-icons-faicon "file-code-o" :height 0.95 :face all-the-icons-lorange)
- (json-mode all-the-icons-octicon "settings" :face all-the-icons-yellow)
- (yaml-mode all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-dyellow)
- (elisp-byte-code-mode all-the-icons-octicon "file-binary" :v-adjust 0.0 :face all-the-icons-dsilver)
- (archive-mode all-the-icons-octicon "file-zip" :v-adjust 0.0 :face all-the-icons-lmaroon)
- (elm-mode all-the-icons-fileicon "elm" :face all-the-icons-blue)
- (erlang-mode all-the-icons-alltheicon "erlang" :face all-the-icons-red :v-adjust -0.1 :height 0.9)
- (elixir-mode all-the-icons-alltheicon "elixir" :face all-the-icons-lorange :v-adjust -0.1 :height 0.9)
- (java-mode all-the-icons-alltheicon "java" :height 1.0 :face all-the-icons-purple)
- (go-mode all-the-icons-alltheicon "go" :height 1.0 :face all-the-icons-blue)
- (matlab-mode all-the-icons-fileicon "matlab" :face all-the-icons-orange)
- (perl-mode all-the-icons-alltheicon "perl" :face all-the-icons-lorange)
- (cperl-mode all-the-icons-alltheicon "perl" :face all-the-icons-lorange)
- (php-mode all-the-icons-fileicon "php" :face all-the-icons-lsilver)
- (prolog-mode all-the-icons-alltheicon "prolog" :height 1.1 :face all-the-icons-lmaroon)
- (python-mode all-the-icons-alltheicon "python" :height 1.0 :face all-the-icons-dblue)
- (inferior-python-mode all-the-icons-alltheicon "python" :height 1.0 :face all-the-icons-dblue)
- (racket-mode all-the-icons-fileicon "racket" :height 1.2 :face all-the-icons-red)
- (rust-mode all-the-icons-alltheicon "rust" :height 1.2 :face all-the-icons-maroon)
- (scala-mode all-the-icons-alltheicon "scala" :face all-the-icons-red)
- (scheme-mode all-the-icons-fileicon "scheme" :height 1.2 :face all-the-icons-red)
- (swift-mode all-the-icons-alltheicon "swift" :height 1.0 :v-adjust -0.1 :face all-the-icons-green)
- (c-mode all-the-icons-alltheicon "c-line" :face all-the-icons-blue)
- (c++-mode all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-blue)
- (csharp-mode all-the-icons-alltheicon "csharp-line" :face all-the-icons-dblue)
- (clojure-mode all-the-icons-alltheicon "clojure-line" :height 1.0 :face all-the-icons-blue)
- (cider-repl-mode all-the-icons-alltheicon "clojure-line" :height 1.0 :face all-the-icons-dblue)
- (clojurescript-mode all-the-icons-fileicon "cljs" :height 1.0 :face all-the-icons-dblue)
- (coffee-mode all-the-icons-alltheicon "coffeescript" :height 1.0 :face all-the-icons-maroon)
- (lisp-mode all-the-icons-fileicon "lisp" :face all-the-icons-orange)
- (css-mode all-the-icons-alltheicon "css3" :face all-the-icons-yellow)
- (scss-mode all-the-icons-alltheicon "sass" :face all-the-icons-pink)
- (sass-mode all-the-icons-alltheicon "sass" :face all-the-icons-dpink)
- (less-css-mode all-the-icons-alltheicon "less" :height 0.8 :face all-the-icons-dyellow)
- (stylus-mode all-the-icons-alltheicon "stylus" :face all-the-icons-lgreen)
- (csv-mode all-the-icons-octicon "graph" :v-adjust 0.0 :face all-the-icons-dblue)
- (haskell-mode all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
- (haskell-c2hs-mode all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
- (literate-haskell-mode all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red)
- (haml-mode all-the-icons-fileicon "haml" :face all-the-icons-lyellow)
- (html-mode all-the-icons-alltheicon "html5" :face all-the-icons-orange)
- (rhtml-mode all-the-icons-alltheicon "html5" :face all-the-icons-lred)
- (mustache-mode all-the-icons-fileicon "moustache" :face all-the-icons-green)
- (slim-mode all-the-icons-octicon "dashboard" :v-adjust 0.0 :face all-the-icons-yellow)
- (jade-mode all-the-icons-fileicon "jade" :face all-the-icons-red)
- (pug-mode all-the-icons-fileicon "pug" :face all-the-icons-red)
- (react-mode all-the-icons-alltheicon "react" :height 1.1 :face all-the-icons-lblue)
- (image-mode all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-blue)
- (texinfo-mode all-the-icons-fileicon "tex" :face all-the-icons-lred)
- (markdown-mode all-the-icons-octicon "markdown" :v-adjust 0.0 :face all-the-icons-lblue)
- (bibtex-mode all-the-icons-fileicon "bib" :face all-the-icons-maroon)
- (org-mode all-the-icons-fileicon "org" :face all-the-icons-lgreen)
- (compilation-mode all-the-icons-faicon "cogs" :v-adjust 0.0 :height 1.0)
- (objc-mode all-the-icons-faicon "apple" :v-adjust 0.0 :height 1.0)
- (tuareg-mode all-the-icons-fileicon "ocaml" :v-adjust 0.0 :height 1.0)
- (purescript-mode all-the-icons-fileicon "purescript" :v-adjust 0.0 :height 1.0)
- (verilog-mode all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red)
- (vhdl-mode all-the-icons-fileicon "vhdl" :face all-the-icons-blue)
- (haskell-cabal-mode all-the-icons-fileicon "cabal" :face all-the-icons-lblue)
- (kotlin-mode all-the-icons-fileicon "kotlin" :face all-the-icons-orange)
- (nim-mode all-the-icons-fileicon "nimrod" :face all-the-icons-yellow)
- (sql-mode all-the-icons-octicon "database" :face all-the-icons-silver)
- (lua-mode all-the-icons-fileicon "lua" :face all-the-icons-dblue)
- (adoc-mode all-the-icons-fileicon "asciidoc" :face all-the-icons-lblue)
- (puppet-mode all-the-icons-fileicon "puppet" :face all-the-icons-yellow)
- (jinja2-mode all-the-icons-fileicon "jinja" :face all-the-icons-silver)
- (powershell-mode all-the-icons-fileicon "powershell" :face all-the-icons-blue)
- (tex-mode all-the-icons-fileicon "tex" :face all-the-icons-lred)
- (latex-mode all-the-icons-fileicon "tex" :face all-the-icons-lred)
- (dart-mode all-the-icons-fileicon "dart" :height 1.0 :face all-the-icons-blue)
- (fsharp-mode all-the-icons-fileicon "fsharp" :height 1.0 :face all-the-icons-blue)
- ))
-
-(defvar all-the-icons-url-alist
- '(
- ;; Social media and communities
- ("^\\(https?://\\)?\\(www\\.\\)?del\\.icio\\.us" all-the-icons-faicon "delicious")
- ("^\\(https?://\\)?\\(www\\.\\)?behance\\.net" all-the-icons-faicon "behance")
- ("^\\(https?://\\)?\\(www\\.\\)?dribbble\\.com" all-the-icons-faicon "dribbble")
- ("^\\(https?://\\)?\\(www\\.\\)?facebook\\.com" all-the-icons-faicon "facebook-official")
- ("^\\(https?://\\)?\\(www\\.\\)?glide\\.me" all-the-icons-faicon "glide-g")
- ("^\\(https?://\\)?\\(www\\.\\)?plus\\.google\\.com" all-the-icons-faicon "google-plus")
- ("linkedin\\.com" all-the-icons-faicon "linkedin")
- ("^\\(https?://\\)?\\(www\\.\\)?ok\\.ru" all-the-icons-faicon "odnoklassniki")
- ("^\\(https?://\\)?\\(www\\.\\)?reddit\\.com" all-the-icons-faicon "reddit-alien")
- ("^\\(https?://\\)?\\(www\\.\\)?slack\\.com" all-the-icons-faicon "slack")
- ("^\\(https?://\\)?\\(www\\.\\)?snapchat\\.com" all-the-icons-faicon "snapchat-ghost")
- ("^\\(https?://\\)?\\(www\\.\\)?weibo\\.com" all-the-icons-faicon "weibo")
- ("^\\(https?://\\)?\\(www\\.\\)?twitter\\.com" all-the-icons-faicon "twitter")
- ;; Blogging
- ("joomla\\.org" all-the-icons-faicon "joomla")
- ("^\\(https?://\\)?\\(www\\.\\)?medium\\.com" all-the-icons-faicon "medium")
- ("tumblr\\.com" all-the-icons-faicon "tumblr")
- ("^wordpress\\.com" all-the-icons-faicon "wordpress")
- ;; Programming
- ("^\\(https?://\\)?\\(www\\.\\)?bitbucket\\.org" all-the-icons-octicon "bitbucket")
- ("^\\(https?://\\)?\\(www\\.\\)?codepen\\.io" all-the-icons-faicon "codepen")
- ("^\\(https?://\\)?\\(www\\.\\)?codiepie\\.com" all-the-icons-faicon "codiepie")
- ("^\\(https?://\\)?\\(www\\.\\)?gist\\.github\\.com" all-the-icons-octicon "gist")
- ("^\\(https?://\\)?\\(www\\.\\)?github\\.com" all-the-icons-octicon "mark-github")
- ("^\\(https?://\\)?\\(www\\.\\)?gitlab\\.com" all-the-icons-faicon "gitlab")
- ("^\\(https?://\\)?\\(www\\.\\)?news\\.ycombinator\\.com" all-the-icons-faicon "hacker-news")
- ("^\\(https?://\\)?\\(www\\.\\)?jsfiddle\\.net" all-the-icons-faicon "jsfiddle")
- ("^\\(https?://\\)?\\(www\\.\\)?maxcdn\\.com" all-the-icons-faicon "maxcdn")
- ("^\\(https?://\\)?\\(www\\.\\)?stackoverflow\\.com" all-the-icons-faicon "stack-overflow")
- ;; Video
- ("^\\(https?://\\)?\\(www\\.\\)?twitch\\.tv" all-the-icons-faicon "twitch")
- ("^\\(https?://\\)?\\(www\\.\\)?vimeo\\.com" all-the-icons-faicon "vimeo")
- ("^\\(https?://\\)?\\(www\\.\\)?youtube\\.com" all-the-icons-faicon "youtube")
- ("^\\(https?://\\)?\\(www\\.\\)?youtu\\.be" all-the-icons-faicon "youtube")
- ("^\\(https?://\\)?\\(www\\.\\)?vine\\.co" all-the-icons-faicon "vine")
- ;; Sound
- ("^\\(https?://\\)?\\(www\\.\\)?last\\.fm" all-the-icons-faicon "lastfm")
- ("^\\(https?://\\)?\\(www\\.\\)?mixcloud\\.com" all-the-icons-faicon "mixcloud")
- ("^\\(https?://\\)?\\(www\\.\\)?soundcloud\\.com" all-the-icons-faicon "soundcloud")
- ("spotify\\.com" all-the-icons-faicon "spotify")
- ;; Shopping
- ("^\\(https?://\\)?\\(www\\.\\)?amazon\\." all-the-icons-faicon "amazon")
- ("^\\(https?://\\)?\\(www\\.\\)?opencart\\.com" all-the-icons-faicon "opencart")
- ("^\\(https?://\\)?\\(www\\.\\)?paypal\\.com" all-the-icons-faicon "paypal")
- ("^\\(https?://\\)?\\(www\\.\\)?shirtsinbulk\\.com" all-the-icons-faicon "shitsinbulk")
- ;; Images
- ("^\\(https?://\\)?\\(www\\.\\)?500px\\.com" all-the-icons-faicon "500px")
- ("^\\(https?://\\)?\\(www\\.\\)?deviantart\\.com" all-the-icons-faicon "deviantart")
- ("^\\(https?://\\)?\\(www\\.\\)?flickr\\.com" all-the-icons-faicon "flickr")
- ("^\\(https?://\\)?\\(www\\.\\)?instagram\\.com" all-the-icons-faicon "instagram")
- ("^\\(https?://\\)?\\(www\\.\\)?pinterest\\." all-the-icons-faicon "pinterest")
- ;; Information and books
- ("^\\(https?://\\)?\\(www\\.\\)?digg\\.com" all-the-icons-faicon "digg")
- ("^\\(https?://\\)?\\(www\\.\\)?foursquare\\.com" all-the-icons-faicon "foursquare")
- ("^\\(https?://\\)?\\(www\\.\\)?getpocket\\.com" all-the-icons-faicon "get-pocket")
- ("^\\(https?://\\)?\\(www\\.\\)?scribd\\.com" all-the-icons-faicon "scribd")
- ("^\\(https?://\\)?\\(www\\.\\)?slideshare\\.net" all-the-icons-faicon "slideshare")
- ("stackexchange\\.com" all-the-icons-faicon "stack-exchange")
- ("^\\(https?://\\)?\\(www\\.\\)?stumbleupon\\.com" all-the-icons-faicon "stumbleupon")
- ("^\\(https?://\\)?\\(www\\.\\)?tripadvisor\\." all-the-icons-faicon "tripadvisor")
- ("^\\(https?://\\)?\\(www\\.\\)?yelp\\." all-the-icons-faicon "yelp")
-
- ("wikipedia\\.org" all-the-icons-faicon "wikipedia-w")
- ;; Various companies and tools
- ("^\\(https?://\\)?\\(www\\.\\)?angel\\.co" all-the-icons-faicon "angellist")
- ("^\\(https?://\\)?\\(www\\.\\)?apple\\.com" all-the-icons-faicon "apple")
- ("^\\(https?://\\)?\\(www\\.\\)?buysellads\\.com" all-the-icons-faicon "buysellads")
- ("^\\(https?://\\)?\\(www\\.\\)?connectdevelop\\.com" all-the-icons-faicon "connectdevelop")
- ("^\\(https?://\\)?\\(www\\.\\)?dashcube\\.com" all-the-icons-faicon "dashcube")
- ("^\\(https?://\\)?\\(www\\.\\)?dropbox\\.com" all-the-icons-faicon "dropbox")
- ("^\\(https?://\\)?\\(www\\.\\)?enviragallery\\.com" all-the-icons-faicon "envira")
- ("^\\(https?://\\)?\\(www\\.\\)?fortawesome\\.com" all-the-icons-faicon "fort-awesome")
- ("^\\(https?://\\)?\\(www\\.\\)?forumbee\\.com" all-the-icons-faicon "forumbee")
- ("^\\(https?://\\)?\\(www\\.\\)?gratipay\\.com" all-the-icons-faicon "gratipay")
- ("^\\(https?://\\)?\\(www\\.\\)?modx\\.com" all-the-icons-faicon "modx")
- ("^\\(https?://\\)?\\(www\\.\\)?pagelines\\.com" all-the-icons-faicon "pagelines")
- ("^\\(https?://\\)?\\(www\\.\\)?producthunt\\.com" all-the-icons-faicon "product-hunt")
- ("sellsy\\.com" all-the-icons-faicon "sellsy")
- ("^\\(https?://\\)?\\(www\\.\\)?simplybuilt\\.com" all-the-icons-faicon "simplybuilt")
- ("^\\(https?://\\)?\\(www\\.\\)?skyatlas\\.com" all-the-icons-faicon "skyatlas")
- ("^\\(https?://\\)?\\(www\\.\\)?skype\\.com" all-the-icons-faicon "skype")
- ("steampowered\\.com" all-the-icons-faicon "steam")
- ("^\\(https?://\\)?\\(www\\.\\)?themeisle\\.com" all-the-icons-faicon "themeisle")
- ("^\\(https?://\\)?\\(www\\.\\)?trello\\.com" all-the-icons-faicon "trello")
- ("^\\(https?://\\)?\\(www\\.\\)?whatsapp\\.com" all-the-icons-faicon "whatsapp")
- ("^\\(https?://\\)?\\(www\\.\\)?ycombinator\\.com" all-the-icons-faicon "y-combinator")
- ("yahoo\\.com" all-the-icons-faicon "yahoo")
- ("^\\(https?://\\)?\\(www\\.\\)?yoast\\.com" all-the-icons-faicon "yoast")
- ;; Catch all
- ("android" all-the-icons-faicon "android")
- ("creativecommons" all-the-icons-faicon "creative-commons")
- ("forums?" all-the-icons-octicon "comment-discussion")
- ("\\.pdf$" all-the-icons-octicon "file-pdf" :v-adjust 0.0 :face all-the-icons-dred)
- ("google" all-the-icons-faicon "google")
- ("\\.rss" all-the-icons-faicon "rss")
- ))
-
-;; ====================
-;; Functions Start
-;; ====================
-
-(defun all-the-icons-auto-mode-match? (&optional file)
- "Whether or not FILE's `major-mode' match against its `auto-mode-alist'."
- (let* ((file (or file (buffer-file-name) (buffer-name)))
- (auto-mode (all-the-icons-match-to-alist file auto-mode-alist)))
- (eq major-mode auto-mode)))
-
-(defun all-the-icons-match-to-alist (file alist)
- "Match FILE against an entry in ALIST using `string-match'."
- (cdr (cl-find-if (lambda (it) (string-match (car it) file)) alist)))
-
-(defun all-the-icons-dir-is-submodule (dir)
- "Checker whether or not DIR is a git submodule."
- (let* ((gitmodule-dir (locate-dominating-file dir ".gitmodules"))
- (modules-file (expand-file-name (format "%s.gitmodules" gitmodule-dir)))
- (module-search (format "submodule \".*?%s\"" (file-name-base dir))))
-
- (when (and gitmodule-dir (file-exists-p (format "%s/.git" dir)))
- (with-temp-buffer
- (insert-file-contents modules-file)
- (search-forward-regexp module-search (point-max) t)))))
-
-;; Icon functions
-(defun all-the-icons-icon-for-dir-with-chevron (dir &optional chevron padding)
- "Format an icon for DIR with CHEVRON similar to tree based directories.
-
-If PADDING is provided, it will prepend and separate the chevron
-and directory with PADDING.
-
-Produces different symbols by inspecting DIR to distinguish
-symlinks and git repositories which do not depend on the
-directory contents"
- (let ((icon (all-the-icons-icon-for-dir dir))
- (chevron (if chevron (all-the-icons-octicon (format "chevron-%s" chevron) :height 0.8 :v-adjust -0.1) ""))
- (padding (or padding "\t")))
- (format "%s%s%s%s%s" padding chevron padding icon padding)))
-
-(defun all-the-icons-icon-for-buffer ()
- "Get the formatted icon for the current buffer.
-
-This function prioritises the use of the buffers file extension to
-discern the icon when its `major-mode' matches its auto mode,
-otherwise it will use the buffers `major-mode' to decide its
-icon."
- (all-the-icons--icon-info-for-buffer))
-
-(defun all-the-icons-icon-family-for-buffer ()
- "Get the icon font family for the current buffer."
- (all-the-icons--icon-info-for-buffer "family"))
-
-(defun all-the-icons--web-mode-icon (&rest arg-overrides) "Get icon for a `web-mode' buffer with ARG-OVERRIDES." (all-the-icons--web-mode nil arg-overrides))
-(defun all-the-icons--web-mode-icon-family () "Get icon family for a `web-mode' buffer." (all-the-icons--web-mode t))
-(defun all-the-icons--web-mode (&optional family arg-overrides)
- "Return icon or FAMILY for `web-mode' based on `web-mode-content-type'.
-Providing ARG-OVERRIDES will modify the creation of the icon."
- (let ((non-nil-args (cl-reduce (lambda (acc it) (if it (append acc (list it)) acc)) arg-overrides :initial-value '())))
- (cond
- ((equal web-mode-content-type "jsx")
- (if family (all-the-icons-fileicon-family) (apply 'all-the-icons-fileicon (append '("jsx-2") non-nil-args))))
- ((equal web-mode-content-type "javascript")
- (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("javascript") non-nil-args))))
- ((equal web-mode-content-type "json")
- (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("less") non-nil-args))))
- ((equal web-mode-content-type "xml")
- (if family (all-the-icons-faicon-family) (apply 'all-the-icons-faicon (append '("file-code-o") non-nil-args))))
- ((equal web-mode-content-type "css")
- (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("css3") non-nil-args))))
- (t
- (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("html5") non-nil-args)))))))
-
-;; Icon Functions
-
-;;;###autoload
-(defun all-the-icons-icon-for-dir (dir &rest arg-overrides)
- "Get the formatted icon for DIR.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions.
-
-Note: You want chevron, please use `all-the-icons-icon-for-dir-with-chevron'."
- (let* ((dirname (file-name-base (directory-file-name dir)))
- (path (expand-file-name dir))
- (icon (all-the-icons-match-to-alist dirname all-the-icons-dir-icon-alist))
- (args (cdr icon)))
- (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args))))
- (cond
- ((file-symlink-p path)
- (apply #'all-the-icons-octicon "file-symlink-directory" (cdr args)))
- ((all-the-icons-dir-is-submodule path)
- (apply #'all-the-icons-octicon "file-submodule" (cdr args)))
- ((file-exists-p (format "%s/.git" path))
- (apply #'all-the-icons-octicon "repo" (cdr args)))
- (t (apply (car icon) args)))))
-
-;;;###autoload
-(defun all-the-icons-icon-for-file (file &rest arg-overrides)
- "Get the formatted icon for FILE.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions."
- (let* ((icon (all-the-icons-match-to-alist file all-the-icons-icon-alist))
- (args (cdr icon)))
- (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args))))
- (apply (car icon) args)))
-
-;;;###autoload
-(defun all-the-icons-icon-for-mode (mode &rest arg-overrides)
- "Get the formatted icon for MODE.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions."
- (let* ((icon (cdr (or (assoc mode all-the-icons-mode-icon-alist)
- (assoc (get mode 'derived-mode-parent) all-the-icons-mode-icon-alist))))
- (args (cdr icon)))
- (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args))))
- (if icon (apply (car icon) args) mode)))
-
-;;;###autoload
-(defun all-the-icons-icon-for-url (url &rest arg-overrides)
- "Get the formatted icon for URL.
-If an icon for URL isn't found in `all-the-icons-url-alist', a globe is used.
-ARG-OVERRIDES should be a plist containining `:height',
-`:v-adjust' or `:face' properties like in the normal icon
-inserting functions."
- (let* ((icon (all-the-icons-match-to-alist url all-the-icons-url-alist))
- (args (cdr icon)))
- (unless icon
- (setq icon '(all-the-icons-faicon "globe"))
- (setq args (cdr icon)))
- (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args))))
- (apply (car icon) args)))
-
-(memoize 'all-the-icons-icon-for-dir)
-(memoize 'all-the-icons-icon-for-file)
-(memoize 'all-the-icons-icon-for-mode)
-(memoize 'all-the-icons-icon-for-url)
-
-;; Family Face Functions
-(defun all-the-icons-icon-family-for-file (file)
- "Get the icons font family for FILE."
- (let ((icon (all-the-icons-match-to-alist file all-the-icons-icon-alist)))
- (funcall (intern (format "%s-family" (car icon))))))
-
-(defun all-the-icons-icon-family-for-mode (mode)
- "Get the icons font family for MODE."
- (let ((icon (cdr (assoc mode all-the-icons-mode-icon-alist))))
- (if icon (funcall (intern (format "%s-family" (car icon)))) nil)))
-
-(defun all-the-icons-icon-family (icon)
- "Get a propertized ICON family programmatically."
- (plist-get (get-text-property 0 'face icon) :family))
-
-(memoize 'all-the-icons-icon-family-for-file)
-(memoize 'all-the-icons-icon-family-for-mode)
-(memoize 'all-the-icons-icon-family)
-
-(defun all-the-icons--icon-info-for-buffer (&optional f)
- "Get icon info for the current buffer.
-
-When F is provided, the info function is calculated with the format
-`all-the-icons-icon-%s-for-file' or `all-the-icons-icon-%s-for-mode'."
- (let* ((base-f (concat "all-the-icons-icon" (when f (format "-%s" f))))
- (file-f (intern (concat base-f "-for-file")))
- (mode-f (intern (concat base-f "-for-mode"))))
- (if (and (buffer-file-name)
- (all-the-icons-auto-mode-match?))
- (funcall file-f (file-name-nondirectory (buffer-file-name)))
- (funcall mode-f major-mode))))
-
-;; Weather icons
-(defun all-the-icons-icon-for-weather (weather)
- "Get an icon for a WEATHER status."
- (let ((icon (all-the-icons-match-to-alist weather all-the-icons-weather-icon-alist)))
- (if icon (apply (car icon) (cdr icon)) weather)))
-
-;; Definitions
-
-(eval-and-compile
- (defun all-the-icons--function-name (name)
- "Get the symbol for an icon function name for icon set NAME."
- (intern (concat "all-the-icons-" (downcase (symbol-name name)))))
-
- (defun all-the-icons--family-name (name)
- "Get the symbol for an icon family function for icon set NAME."
- (intern (concat "all-the-icons-" (downcase (symbol-name name)) "-family")))
-
- (defun all-the-icons--data-name (name)
- "Get the symbol for an icon family function for icon set NAME."
- (intern (concat "all-the-icons-" (downcase (symbol-name name)) "-data")))
-
- (defun all-the-icons--insert-function-name (name)
- "Get the symbol for an icon insert function for icon set NAME."
- (intern (concat "all-the-icons-insert-" (downcase (symbol-name name))))))
-
-;; Icon insertion functions
-
-(defun all-the-icons--read-candidates ()
- "Helper to build a list of candidates for all families."
- (cl-reduce 'append (mapcar (lambda (it) (all-the-icons--read-candidates-for-family it t)) all-the-icons-font-families)))
-
-(defun all-the-icons--read-candidates-for-family (family &optional show-family)
- "Helper to build read candidates for FAMILY.
-If SHOW-FAMILY is non-nil, displays the icons family in the candidate string."
- (let ((data (funcall (all-the-icons--data-name family)))
- (icon-f (all-the-icons--function-name family)))
- (mapcar
- (lambda (it)
- (let* ((icon-name (car it))
- (icon-name-head (substring icon-name 0 1))
- (icon-name-tail (substring icon-name 1))
-
- (icon-display (propertize icon-name-head 'display (format "%s\t%s" (funcall icon-f icon-name) icon-name-head)))
- (icon-family (if show-family (format "\t[%s]" family) ""))
-
- (candidate-name (format "%s%s%s" icon-display icon-name-tail icon-family))
- (candidate-icon (funcall (all-the-icons--function-name family) icon-name)))
-
- (cons candidate-name candidate-icon)))
- data)))
-
-;;;###autoload
-(defun all-the-icons-install-fonts (&optional pfx)
- "Helper function to download and install the latests fonts based on OS.
-When PFX is non-nil, ignore the prompt and just install"
- (interactive "P")
- (when (or pfx (yes-or-no-p "This will download and install fonts, are you sure you want to do this?"))
- (let* ((url-format "https://raw.githubusercontent.com/domtronn/all-the-icons.el/master/fonts/%s")
- (font-dest (cl-case window-system
- (x (concat (or (getenv "XDG_DATA_HOME") ;; Default Linux install directories
- (concat (getenv "HOME") "/.local/share"))
- "/fonts/"))
- (mac (concat (getenv "HOME") "/Library/Fonts/" ))
- (ns (concat (getenv "HOME") "/Library/Fonts/" )))) ;; Default MacOS install directory
- (known-dest? (stringp font-dest))
- (font-dest (or font-dest (read-directory-name "Font installation directory: " "~/"))))
-
- (unless (file-directory-p font-dest) (mkdir font-dest t))
-
- (mapc (lambda (font)
- (url-copy-file (format url-format font) (expand-file-name font font-dest) t))
- all-the-icons-font-names)
- (when known-dest?
- (message "Fonts downloaded, updating font cache... <fc-cache -f -v> ")
- (shell-command-to-string (format "fc-cache -f -v")))
- (message "%s Successfully %s `all-the-icons' fonts to `%s'!"
- (all-the-icons-wicon "stars" :v-adjust 0.0)
- (if known-dest? "installed" "downloaded")
- font-dest))))
-
-;;;###autoload
-(defun all-the-icons-insert (&optional arg family)
- "Interactive icon insertion function.
-When Prefix ARG is non-nil, insert the propertized icon.
-When FAMILY is non-nil, limit the candidates to the icon set matching it."
- (interactive "P")
- (let* ((standard-output (current-buffer))
- (candidates (if family
- (all-the-icons--read-candidates-for-family family)
- (all-the-icons--read-candidates)))
- (prompt (if family
- (format "%s Icon: " (funcall (all-the-icons--family-name family)))
- "Icon : "))
-
- (selection (completing-read prompt candidates nil t))
- (result (cdr (assoc selection candidates))))
-
- (if arg (prin1 result) (insert result))))
-
-;; Debug Helpers
-
-(defun all-the-icons-insert-icons-for (family &optional height duration)
- "Insert all of the available icons associated with FAMILY.
-If a HEIGHT is provided it will render the icons at this height.
-This is useful both to see the icons more clearly and to test
-different height rendering. If DURATION is provided, it will
-pause for DURATION seconds between printing each character."
- (let* ((data-f (all-the-icons--data-name family))
- (insert-f (all-the-icons--function-name family))
-
- (height (or height 2.0))
- (data (funcall data-f)))
- (mapc
- (lambda (it)
- (insert (format "%s - %s\n" (funcall insert-f (car it) :height height) (car it)))
- (when duration (sit-for duration 0)))
- data)))
-
-(defmacro all-the-icons-define-icon (name alist family &optional font-name)
- "Macro to generate functions for inserting icons for icon set NAME.
-
-NAME defines is the name of the iconset and will produce a
-function of the for `all-the-icons-NAME'.
-
-ALIST is the alist containing maps between icon names and the
-UniCode for the character. All of these can be found in the data
-directory of this package.
-
-FAMILY is the font family to use for the icons.
-FONT-NAME is the name of the .ttf file providing the font, defaults to FAMILY."
- `(progn
- (add-to-list 'all-the-icons-font-families (quote ,name))
- (add-to-list 'all-the-icons-font-names (quote ,(downcase (format "%s.ttf" (or font-name family)))))
-
- (defun ,(all-the-icons--family-name name) () ,family)
- (defun ,(all-the-icons--data-name name) () ,alist)
- (defun ,(all-the-icons--function-name name) (icon-name &rest args)
- (let ((icon (cdr (assoc icon-name ,alist)))
- (other-face (when all-the-icons-color-icons (plist-get args :face)))
- (height (* all-the-icons-scale-factor (or (plist-get args :height) 1.0)))
- (v-adjust (* all-the-icons-scale-factor (or (plist-get args :v-adjust) all-the-icons-default-adjust)))
- (family ,family))
- (unless icon
- (error (format "Unable to find icon with name `%s' in icon set `%s'" icon-name (quote ,name))))
- (let ((face (if other-face
- `(:family ,family :height ,height :inherit ,other-face)
- `(:family ,family :height ,height))))
- (propertize icon
- 'face face ;so that this works without `font-lock-mode' enabled
- 'font-lock-face face ;so that `font-lock-mode' leaves this alone
- 'display `(raise ,v-adjust)
- 'rear-nonsticky t))))
- (defun ,(all-the-icons--insert-function-name name) (&optional arg)
- ,(format "Insert a %s icon at point." family)
- (interactive "P")
- (all-the-icons-insert arg (quote ,name)))))
-
-(define-obsolete-function-alias 'define-icon 'all-the-icons-define-icon)
-
-(all-the-icons-define-icon alltheicon all-the-icons-data/alltheicons-alist "all-the-icons")
-(all-the-icons-define-icon fileicon all-the-icons-data/file-icon-alist "file-icons")
-(all-the-icons-define-icon faicon all-the-icons-data/fa-icon-alist "FontAwesome")
-(all-the-icons-define-icon octicon all-the-icons-data/octicons-alist "github-octicons" "octicons")
-(all-the-icons-define-icon wicon all-the-icons-data/weather-icons-alist "Weather Icons" "weathericons")
-(all-the-icons-define-icon material all-the-icons-data/material-icons-alist "Material Icons" "material-design-icons")
-
-(provide 'all-the-icons)
-
-;;; all-the-icons.el ends here
diff --git a/elpa/all-the-icons-20200730.1545/data/data-alltheicons.el b/elpa/all-the-icons-20200730.1545/data/data-alltheicons.el
deleted file mode 100644
index 3322500..0000000
--- a/elpa/all-the-icons-20200730.1545/data/data-alltheicons.el
+++ /dev/null
@@ -1,70 +0,0 @@
-(defvar all-the-icons-data/alltheicons-alist
- '(
-
- ( "apache" . "\xe909" )
- ( "atom" . "\xe917" )
- ( "aws" . "\xe90c" )
- ( "bower" . "\xe918" )
- ( "c" . "\xe915" )
- ( "c-line" . "\xe90f" )
- ( "clojure" . "\xe919" )
- ( "clojure-line" . "\xe91a" )
- ( "coffeescript" . "\xe914" )
- ( "cplusplus" . "\xe913" )
- ( "cplusplus-line" . "\xe910" )
- ( "csharp" . "\xe911" )
- ( "csharp-line" . "\xe912" )
- ( "css3" . "\xe91b" )
- ( "css3-alt" . "\xe91c" )
- ( "d3" . "\xe90e" )
- ( "dlang" . "\xe935" )
- ( "elixir" . "\xe936" )
- ( "erlang" . "\xe934" )
- ( "git" . "\xe907" )
- ( "go" . "\xe91d" )
- ( "google-drive" . "\xe91e" )
- ( "grunt" . "\xe90d" )
- ( "grunt-line" . "\xe91f" )
- ( "gulp" . "\xe920" )
- ( "haskell" . "\xe921" )
- ( "html5" . "\xe932" )
- ( "jasmine" . "\xe904" )
- ( "java" . "\xe922" )
- ( "javascript" . "\xe906" )
- ( "javascript-badge" . "\xe923" )
- ( "javascript-shield" . "\xe924" )
- ( "less" . "\xe90b" )
- ( "nginx" . "\xe933" )
- ( "nodejs" . "\xe925" )
- ( "perl" . "\xe905" )
- ( "perldocs" . "\xe926" )
- ( "postgresql" . "\xe938" )
- ( "prolog" . "\xe927" )
- ( "python" . "\xe928" )
- ( "react" . "\xe929" )
- ( "ruby" . "\xe92a" )
- ( "ruby-alt" . "\xe92b" )
- ( "rust" . "\xe92c" )
- ( "sass" . "\xe92d" )
- ( "scala" . "\xe908" )
- ( "script" . "\xe90a" )
- ( "spring" . "\xe937" )
- ( "stylus" . "\xe92e" )
- ( "svg" . "\xe903" )
- ( "swift" . "\xe92f" )
- ( "terminal" . "\xe930" )
- ( "terminal-alt" . "\xe931" )
- ( "battery-charging" . "\xe939" )
-
- ( "arrow-left" . "\xe93a" )
- ( "arrow-right" . "\xe93b" )
- ( "cup-left" . "\xe93c" )
- ( "cup-right" . "\xe93d" )
- ( "slant-left" . "\xe93e" )
- ( "slant-right" . "\xe93f" )
- ( "wave-left" . "\xe940" )
- ( "wave-right" . "\xe941" )
-
- ))
-
-(provide 'data-alltheicons)
diff --git a/elpa/all-the-icons-20200730.1545/data/data-faicons.el b/elpa/all-the-icons-20200730.1545/data/data-faicons.el
deleted file mode 100644
index 6ab0480..0000000
--- a/elpa/all-the-icons-20200730.1545/data/data-faicons.el
+++ /dev/null
@@ -1,641 +0,0 @@
-(defvar all-the-icons-data/fa-icon-alist
- '(
-
- ("500px" . "\xf26e")
- ("adjust" . "\xf042")
- ("adn" . "\xf170")
- ("align-center" . "\xf037")
- ("align-justify" . "\xf039")
- ("align-left" . "\xf036")
- ("align-right" . "\xf038")
- ("amazon" . "\xf270")
- ("ambulance" . "\xf0f9")
- ("american-sign-language-interpreting" . "\xf2a3")
- ("anchor" . "\xf13d")
- ("android" . "\xf17b")
- ("angellist" . "\xf209")
- ("angle-double-down" . "\xf103")
- ("angle-double-left" . "\xf100")
- ("angle-double-right" . "\xf101")
- ("angle-double-up" . "\xf102")
- ("angle-down" . "\xf107")
- ("angle-left" . "\xf104")
- ("angle-right" . "\xf105")
- ("angle-up" . "\xf106")
- ("apple" . "\xf179")
- ("archive" . "\xf187")
- ("area-chart" . "\xf1fe")
- ("arrow-circle-down" . "\xf0ab")
- ("arrow-circle-left" . "\xf0a8")
- ("arrow-circle-o-down" . "\xf01a")
- ("arrow-circle-o-left" . "\xf190")
- ("arrow-circle-o-right" . "\xf18e")
- ("arrow-circle-o-up" . "\xf01b")
- ("arrow-circle-right" . "\xf0a9")
- ("arrow-circle-up" . "\xf0aa")
- ("arrow-down" . "\xf063")
- ("arrow-left" . "\xf060")
- ("arrow-right" . "\xf061")
- ("arrow-up" . "\xf062")
- ("arrows" . "\xf047")
- ("arrows-alt" . "\xf0b2")
- ("arrows-h" . "\xf07e")
- ("arrows-v" . "\xf07d")
- ("assistive-listening-systems" . "\xf2a2")
- ("asterisk" . "\xf069")
- ("at" . "\xf1fa")
- ("audio-description" . "\xf29e")
- ("backward" . "\xf04a")
- ("balance-scale" . "\xf24e")
- ("ban" . "\xf05e")
- ("bar-chart" . "\xf080")
- ("barcode" . "\xf02a")
- ("bars" . "\xf0c9")
- ("battery-empty" . "\xf244")
- ("battery-full" . "\xf240")
- ("battery-half" . "\xf242")
- ("battery-quarter" . "\xf243")
- ("battery-three-quarters" . "\xf241")
- ("bed" . "\xf236")
- ("beer" . "\xf0fc")
- ("behance" . "\xf1b4")
- ("behance-square" . "\xf1b5")
- ("bell" . "\xf0f3")
- ("bell-o" . "\xf0a2")
- ("bell-slash" . "\xf1f6")
- ("bell-slash-o" . "\xf1f7")
- ("bicycle" . "\xf206")
- ("binoculars" . "\xf1e5")
- ("birthday-cake" . "\xf1fd")
- ("bitbucket" . "\xf171")
- ("bitbucket-square" . "\xf172")
- ("black-tie" . "\xf27e")
- ("blind" . "\xf29d")
- ("bluetooth" . "\xf293")
- ("bluetooth-b" . "\xf294")
- ("bold" . "\xf032")
- ("bolt" . "\xf0e7")
- ("bomb" . "\xf1e2")
- ("book" . "\xf02d")
- ("bookmark" . "\xf02e")
- ("bookmark-o" . "\xf097")
- ("braille" . "\xf2a1")
- ("briefcase" . "\xf0b1")
- ("btc" . "\xf15a")
- ("bug" . "\xf188")
- ("building" . "\xf1ad")
- ("building-o" . "\xf0f7")
- ("bullhorn" . "\xf0a1")
- ("bullseye" . "\xf140")
- ("bus" . "\xf207")
- ("buysellads" . "\xf20d")
- ("calculator" . "\xf1ec")
- ("calendar" . "\xf073")
- ("calendar-check-o" . "\xf274")
- ("calendar-minus-o" . "\xf272")
- ("calendar-o" . "\xf133")
- ("calendar-plus-o" . "\xf271")
- ("calendar-times-o" . "\xf273")
- ("camera" . "\xf030")
- ("camera-retro" . "\xf083")
- ("car" . "\xf1b9")
- ("caret-down" . "\xf0d7")
- ("caret-left" . "\xf0d9")
- ("caret-right" . "\xf0da")
- ("caret-square-o-down" . "\xf150")
- ("caret-square-o-left" . "\xf191")
- ("caret-square-o-right" . "\xf152")
- ("caret-square-o-up" . "\xf151")
- ("caret-up" . "\xf0d8")
- ("cart-arrow-down" . "\xf218")
- ("cart-plus" . "\xf217")
- ("cc" . "\xf20a")
- ("cc-amex" . "\xf1f3")
- ("cc-diners-club" . "\xf24c")
- ("cc-discover" . "\xf1f2")
- ("cc-jcb" . "\xf24b")
- ("cc-mastercard" . "\xf1f1")
- ("cc-paypal" . "\xf1f4")
- ("cc-stripe" . "\xf1f5")
- ("cc-visa" . "\xf1f0")
- ("certificate" . "\xf0a3")
- ("chain-broken" . "\xf127")
- ("check" . "\xf00c")
- ("check-circle" . "\xf058")
- ("check-circle-o" . "\xf05d")
- ("check-square" . "\xf14a")
- ("check-square-o" . "\xf046")
- ("chevron-circle-down" . "\xf13a")
- ("chevron-circle-left" . "\xf137")
- ("chevron-circle-right" . "\xf138")
- ("chevron-circle-up" . "\xf139")
- ("chevron-down" . "\xf078")
- ("chevron-left" . "\xf053")
- ("chevron-right" . "\xf054")
- ("chevron-up" . "\xf077")
- ("child" . "\xf1ae")
- ("chrome" . "\xf268")
- ("circle" . "\xf111")
- ("circle-o" . "\xf10c")
- ("circle-o-notch" . "\xf1ce")
- ("circle-thin" . "\xf1db")
- ("clipboard" . "\xf0ea")
- ("clock-o" . "\xf017")
- ("clone" . "\xf24d")
- ("cloud" . "\xf0c2")
- ("cloud-download" . "\xf0ed")
- ("cloud-upload" . "\xf0ee")
- ("code" . "\xf121")
- ("code-fork" . "\xf126")
- ("codepen" . "\xf1cb")
- ("codiepie" . "\xf284")
- ("coffee" . "\xf0f4")
- ("cog" . "\xf013")
- ("cogs" . "\xf085")
- ("columns" . "\xf0db")
- ("comment" . "\xf075")
- ("comment-o" . "\xf0e5")
- ("commenting" . "\xf27a")
- ("commenting-o" . "\xf27b")
- ("comments" . "\xf086")
- ("comments-o" . "\xf0e6")
- ("compass" . "\xf14e")
- ("compress" . "\xf066")
- ("connectdevelop" . "\xf20e")
- ("contao" . "\xf26d")
- ("copyright" . "\xf1f9")
- ("creative-commons" . "\xf25e")
- ("credit-card" . "\xf09d")
- ("credit-card-alt" . "\xf283")
- ("crop" . "\xf125")
- ("crosshairs" . "\xf05b")
- ("css3" . "\xf13c")
- ("cube" . "\xf1b2")
- ("cubes" . "\xf1b3")
- ("cutlery" . "\xf0f5")
- ("dashcube" . "\xf210")
- ("database" . "\xf1c0")
- ("deaf" . "\xf2a4")
- ("delicious" . "\xf1a5")
- ("desktop" . "\xf108")
- ("deviantart" . "\xf1bd")
- ("diamond" . "\xf219")
- ("digg" . "\xf1a6")
- ("dot-circle-o" . "\xf192")
- ("download" . "\xf019")
- ("dribbble" . "\xf17d")
- ("dropbox" . "\xf16b")
- ("drupal" . "\xf1a9")
- ("edge" . "\xf282")
- ("eject" . "\xf052")
- ("ellipsis-h" . "\xf141")
- ("ellipsis-v" . "\xf142")
- ("empire" . "\xf1d1")
- ("envelope" . "\xf0e0")
- ("envelope-o" . "\xf003")
- ("envelope-square" . "\xf199")
- ("envira" . "\xf299")
- ("eraser" . "\xf12d")
- ("eur" . "\xf153")
- ("exchange" . "\xf0ec")
- ("exclamation" . "\xf12a")
- ("exclamation-circle" . "\xf06a")
- ("exclamation-triangle" . "\xf071")
- ("expand" . "\xf065")
- ("expeditedssl" . "\xf23e")
- ("external-link" . "\xf08e")
- ("external-link-square" . "\xf14c")
- ("eye" . "\xf06e")
- ("eye-slash" . "\xf070")
- ("eyedropper" . "\xf1fb")
- ("facebook" . "\xf09a")
- ("facebook-official" . "\xf230")
- ("facebook-square" . "\xf082")
- ("fast-backward" . "\xf049")
- ("fast-forward" . "\xf050")
- ("fax" . "\xf1ac")
- ("female" . "\xf182")
- ("fighter-jet" . "\xf0fb")
- ("file" . "\xf15b")
- ("file-archive-o" . "\xf1c6")
- ("file-audio-o" . "\xf1c7")
- ("file-code-o" . "\xf1c9")
- ("file-excel-o" . "\xf1c3")
- ("file-image-o" . "\xf1c5")
- ("file-o" . "\xf016")
- ("file-pdf-o" . "\xf1c1")
- ("file-powerpoint-o" . "\xf1c4")
- ("file-text" . "\xf15c")
- ("file-text-o" . "\xf0f6")
- ("file-video-o" . "\xf1c8")
- ("file-word-o" . "\xf1c2")
- ("files-o" . "\xf0c5")
- ("film" . "\xf008")
- ("filter" . "\xf0b0")
- ("fire" . "\xf06d")
- ("fire-extinguisher" . "\xf134")
- ("firefox" . "\xf269")
- ("first-order" . "\xf2b0")
- ("flag" . "\xf024")
- ("flag-checkered" . "\xf11e")
- ("flag-o" . "\xf11d")
- ("flask" . "\xf0c3")
- ("flickr" . "\xf16e")
- ("floppy-o" . "\xf0c7")
- ("folder" . "\xf07b")
- ("folder-o" . "\xf114")
- ("folder-open" . "\xf07c")
- ("folder-open-o" . "\xf115")
- ("font" . "\xf031")
- ("font-awesome" . "\xf2b4")
- ("fonticons" . "\xf280")
- ("fort-awesome" . "\xf286")
- ("forumbee" . "\xf211")
- ("forward" . "\xf04e")
- ("foursquare" . "\xf180")
- ("frown-o" . "\xf119")
- ("futbol-o" . "\xf1e3")
- ("gamepad" . "\xf11b")
- ("gavel" . "\xf0e3")
- ("gbp" . "\xf154")
- ("genderless" . "\xf22d")
- ("get-pocket" . "\xf265")
- ("gg" . "\xf260")
- ("gg-circle" . "\xf261")
- ("gift" . "\xf06b")
- ("git" . "\xf1d3")
- ("git-square" . "\xf1d2")
- ("github" . "\xf09b")
- ("github-alt" . "\xf113")
- ("github-square" . "\xf092")
- ("gitlab" . "\xf296")
- ("glass" . "\xf000")
- ("glide" . "\xf2a5")
- ("glide-g" . "\xf2a6")
- ("globe" . "\xf0ac")
- ("google" . "\xf1a0")
- ("google-plus" . "\xf0d5")
- ("google-plus-official" . "\xf2b3")
- ("google-plus-square" . "\xf0d4")
- ("google-wallet" . "\xf1ee")
- ("graduation-cap" . "\xf19d")
- ("gratipay" . "\xf184")
- ("h-square" . "\xf0fd")
- ("hacker-news" . "\xf1d4")
- ("hand-lizard-o" . "\xf258")
- ("hand-o-down" . "\xf0a7")
- ("hand-o-left" . "\xf0a5")
- ("hand-o-right" . "\xf0a4")
- ("hand-o-up" . "\xf0a6")
- ("hand-paper-o" . "\xf256")
- ("hand-peace-o" . "\xf25b")
- ("hand-pointer-o" . "\xf25a")
- ("hand-rock-o" . "\xf255")
- ("hand-scissors-o" . "\xf257")
- ("hand-spock-o" . "\xf259")
- ("hashtag" . "\xf292")
- ("hdd-o" . "\xf0a0")
- ("header" . "\xf1dc")
- ("headphones" . "\xf025")
- ("heart" . "\xf004")
- ("heart-o" . "\xf08a")
- ("heartbeat" . "\xf21e")
- ("history" . "\xf1da")
- ("home" . "\xf015")
- ("hospital-o" . "\xf0f8")
- ("hourglass" . "\xf254")
- ("hourglass-end" . "\xf253")
- ("hourglass-half" . "\xf252")
- ("hourglass-o" . "\xf250")
- ("hourglass-start" . "\xf251")
- ("houzz" . "\xf27c")
- ("html5" . "\xf13b")
- ("i-cursor" . "\xf246")
- ("ils" . "\xf20b")
- ("inbox" . "\xf01c")
- ("indent" . "\xf03c")
- ("industry" . "\xf275")
- ("info" . "\xf129")
- ("info-circle" . "\xf05a")
- ("inr" . "\xf156")
- ("instagram" . "\xf16d")
- ("internet-explorer" . "\xf26b")
- ("ioxhost" . "\xf208")
- ("italic" . "\xf033")
- ("joomla" . "\xf1aa")
- ("jpy" . "\xf157")
- ("jsfiddle" . "\xf1cc")
- ("key" . "\xf084")
- ("keyboard-o" . "\xf11c")
- ("krw" . "\xf159")
- ("language" . "\xf1ab")
- ("laptop" . "\xf109")
- ("lastfm" . "\xf202")
- ("lastfm-square" . "\xf203")
- ("leaf" . "\xf06c")
- ("leanpub" . "\xf212")
- ("lemon-o" . "\xf094")
- ("level-down" . "\xf149")
- ("level-up" . "\xf148")
- ("life-ring" . "\xf1cd")
- ("lightbulb-o" . "\xf0eb")
- ("line-chart" . "\xf201")
- ("link" . "\xf0c1")
- ("linkedin" . "\xf0e1")
- ("linkedin-square" . "\xf08c")
- ("linux" . "\xf17c")
- ("list" . "\xf03a")
- ("list-alt" . "\xf022")
- ("list-ol" . "\xf0cb")
- ("list-ul" . "\xf0ca")
- ("location-arrow" . "\xf124")
- ("lock" . "\xf023")
- ("long-arrow-down" . "\xf175")
- ("long-arrow-left" . "\xf177")
- ("long-arrow-right" . "\xf178")
- ("long-arrow-up" . "\xf176")
- ("low-vision" . "\xf2a8")
- ("magic" . "\xf0d0")
- ("magnet" . "\xf076")
- ("male" . "\xf183")
- ("map" . "\xf279")
- ("map-marker" . "\xf041")
- ("map-o" . "\xf278")
- ("map-pin" . "\xf276")
- ("map-signs" . "\xf277")
- ("mars" . "\xf222")
- ("mars-double" . "\xf227")
- ("mars-stroke" . "\xf229")
- ("mars-stroke-h" . "\xf22b")
- ("mars-stroke-v" . "\xf22a")
- ("maxcdn" . "\xf136")
- ("meanpath" . "\xf20c")
- ("medium" . "\xf23a")
- ("medkit" . "\xf0fa")
- ("meh-o" . "\xf11a")
- ("mercury" . "\xf223")
- ("microphone" . "\xf130")
- ("microphone-slash" . "\xf131")
- ("minus" . "\xf068")
- ("minus-circle" . "\xf056")
- ("minus-square" . "\xf146")
- ("minus-square-o" . "\xf147")
- ("mixcloud" . "\xf289")
- ("mobile" . "\xf10b")
- ("modx" . "\xf285")
- ("money" . "\xf0d6")
- ("moon-o" . "\xf186")
- ("motorcycle" . "\xf21c")
- ("mouse-pointer" . "\xf245")
- ("music" . "\xf001")
- ("neuter" . "\xf22c")
- ("newspaper-o" . "\xf1ea")
- ("object-group" . "\xf247")
- ("object-ungroup" . "\xf248")
- ("odnoklassniki" . "\xf263")
- ("odnoklassniki-square" . "\xf264")
- ("opencart" . "\xf23d")
- ("openid" . "\xf19b")
- ("opera" . "\xf26a")
- ("optin-monster" . "\xf23c")
- ("outdent" . "\xf03b")
- ("pagelines" . "\xf18c")
- ("paint-brush" . "\xf1fc")
- ("paper-plane" . "\xf1d8")
- ("paper-plane-o" . "\xf1d9")
- ("paperclip" . "\xf0c6")
- ("paragraph" . "\xf1dd")
- ("pause" . "\xf04c")
- ("pause-circle" . "\xf28b")
- ("pause-circle-o" . "\xf28c")
- ("paw" . "\xf1b0")
- ("paypal" . "\xf1ed")
- ("pencil" . "\xf040")
- ("pencil-square" . "\xf14b")
- ("pencil-square-o" . "\xf044")
- ("percent" . "\xf295")
- ("phone" . "\xf095")
- ("phone-square" . "\xf098")
- ("picture-o" . "\xf03e")
- ("pie-chart" . "\xf200")
- ("pied-piper" . "\xf2ae")
- ("pied-piper-alt" . "\xf1a8")
- ("pied-piper-pp" . "\xf1a7")
- ("pinterest" . "\xf0d2")
- ("pinterest-p" . "\xf231")
- ("pinterest-square" . "\xf0d3")
- ("plane" . "\xf072")
- ("play" . "\xf04b")
- ("play-circle" . "\xf144")
- ("play-circle-o" . "\xf01d")
- ("plug" . "\xf1e6")
- ("plus" . "\xf067")
- ("plus-circle" . "\xf055")
- ("plus-square" . "\xf0fe")
- ("plus-square-o" . "\xf196")
- ("power-off" . "\xf011")
- ("print" . "\xf02f")
- ("product-hunt" . "\xf288")
- ("puzzle-piece" . "\xf12e")
- ("qq" . "\xf1d6")
- ("qrcode" . "\xf029")
- ("question" . "\xf128")
- ("question-circle" . "\xf059")
- ("question-circle-o" . "\xf29c")
- ("quote-left" . "\xf10d")
- ("quote-right" . "\xf10e")
- ("random" . "\xf074")
- ("rebel" . "\xf1d0")
- ("recycle" . "\xf1b8")
- ("reddit" . "\xf1a1")
- ("reddit-alien" . "\xf281")
- ("reddit-square" . "\xf1a2")
- ("refresh" . "\xf021")
- ("registered" . "\xf25d")
- ("renren" . "\xf18b")
- ("repeat" . "\xf01e")
- ("reply" . "\xf112")
- ("reply-all" . "\xf122")
- ("retweet" . "\xf079")
- ("road" . "\xf018")
- ("rocket" . "\xf135")
- ("rss" . "\xf09e")
- ("rss-square" . "\xf143")
- ("rub" . "\xf158")
- ("safari" . "\xf267")
- ("scissors" . "\xf0c4")
- ("scribd" . "\xf28a")
- ("search" . "\xf002")
- ("search-minus" . "\xf010")
- ("search-plus" . "\xf00e")
- ("sellsy" . "\xf213")
- ("server" . "\xf233")
- ("share" . "\xf064")
- ("share-alt" . "\xf1e0")
- ("share-alt-square" . "\xf1e1")
- ("share-square" . "\xf14d")
- ("share-square-o" . "\xf045")
- ("shield" . "\xf132")
- ("ship" . "\xf21a")
- ("shirtsinbulk" . "\xf214")
- ("shopping-bag" . "\xf290")
- ("shopping-basket" . "\xf291")
- ("shopping-cart" . "\xf07a")
- ("sign-in" . "\xf090")
- ("sign-language" . "\xf2a7")
- ("sign-out" . "\xf08b")
- ("signal" . "\xf012")
- ("simplybuilt" . "\xf215")
- ("sitemap" . "\xf0e8")
- ("skyatlas" . "\xf216")
- ("skype" . "\xf17e")
- ("slack" . "\xf198")
- ("sliders" . "\xf1de")
- ("slideshare" . "\xf1e7")
- ("smile-o" . "\xf118")
- ("snapchat" . "\xf2ab")
- ("snapchat-ghost" . "\xf2ac")
- ("snapchat-square" . "\xf2ad")
- ("sort" . "\xf0dc")
- ("sort-alpha-asc" . "\xf15d")
- ("sort-alpha-desc" . "\xf15e")
- ("sort-amount-asc" . "\xf160")
- ("sort-amount-desc" . "\xf161")
- ("sort-asc" . "\xf0de")
- ("sort-desc" . "\xf0dd")
- ("sort-numeric-asc" . "\xf162")
- ("sort-numeric-desc" . "\xf163")
- ("soundcloud" . "\xf1be")
- ("space-shuttle" . "\xf197")
- ("spinner" . "\xf110")
- ("spoon" . "\xf1b1")
- ("spotify" . "\xf1bc")
- ("square" . "\xf0c8")
- ("square-o" . "\xf096")
- ("stack-exchange" . "\xf18d")
- ("stack-overflow" . "\xf16c")
- ("star" . "\xf005")
- ("star-half" . "\xf089")
- ("star-half-o" . "\xf123")
- ("star-o" . "\xf006")
- ("steam" . "\xf1b6")
- ("steam-square" . "\xf1b7")
- ("step-backward" . "\xf048")
- ("step-forward" . "\xf051")
- ("stethoscope" . "\xf0f1")
- ("sticky-note" . "\xf249")
- ("sticky-note-o" . "\xf24a")
- ("stop" . "\xf04d")
- ("stop-circle" . "\xf28d")
- ("stop-circle-o" . "\xf28e")
- ("street-view" . "\xf21d")
- ("strikethrough" . "\xf0cc")
- ("stumbleupon" . "\xf1a4")
- ("stumbleupon-circle" . "\xf1a3")
- ("subscript" . "\xf12c")
- ("subway" . "\xf239")
- ("suitcase" . "\xf0f2")
- ("sun-o" . "\xf185")
- ("superscript" . "\xf12b")
- ("table" . "\xf0ce")
- ("tablet" . "\xf10a")
- ("tachometer" . "\xf0e4")
- ("tag" . "\xf02b")
- ("tags" . "\xf02c")
- ("tasks" . "\xf0ae")
- ("taxi" . "\xf1ba")
- ("television" . "\xf26c")
- ("tencent-weibo" . "\xf1d5")
- ("terminal" . "\xf120")
- ("text-height" . "\xf034")
- ("text-width" . "\xf035")
- ("th" . "\xf00a")
- ("th-large" . "\xf009")
- ("th-list" . "\xf00b")
- ("themeisle" . "\xf2b2")
- ("thumb-tack" . "\xf08d")
- ("thumbs-down" . "\xf165")
- ("thumbs-o-down" . "\xf088")
- ("thumbs-o-up" . "\xf087")
- ("thumbs-up" . "\xf164")
- ("ticket" . "\xf145")
- ("times" . "\xf00d")
- ("times-circle" . "\xf057")
- ("times-circle-o" . "\xf05c")
- ("tint" . "\xf043")
- ("toggle-off" . "\xf204")
- ("toggle-on" . "\xf205")
- ("trademark" . "\xf25c")
- ("train" . "\xf238")
- ("transgender" . "\xf224")
- ("transgender-alt" . "\xf225")
- ("trash" . "\xf1f8")
- ("trash-o" . "\xf014")
- ("tree" . "\xf1bb")
- ("trello" . "\xf181")
- ("tripadvisor" . "\xf262")
- ("trophy" . "\xf091")
- ("truck" . "\xf0d1")
- ("try" . "\xf195")
- ("tty" . "\xf1e4")
- ("tumblr" . "\xf173")
- ("tumblr-square" . "\xf174")
- ("twitch" . "\xf1e8")
- ("twitter" . "\xf099")
- ("twitter-square" . "\xf081")
- ("umbrella" . "\xf0e9")
- ("underline" . "\xf0cd")
- ("undo" . "\xf0e2")
- ("universal-access" . "\xf29a")
- ("university" . "\xf19c")
- ("unlock" . "\xf09c")
- ("unlock-alt" . "\xf13e")
- ("upload" . "\xf093")
- ("usb" . "\xf287")
- ("usd" . "\xf155")
- ("user" . "\xf007")
- ("user-md" . "\xf0f0")
- ("user-plus" . "\xf234")
- ("user-secret" . "\xf21b")
- ("user-times" . "\xf235")
- ("users" . "\xf0c0")
- ("venus" . "\xf221")
- ("venus-double" . "\xf226")
- ("venus-mars" . "\xf228")
- ("viacoin" . "\xf237")
- ("viadeo" . "\xf2a9")
- ("viadeo-square" . "\xf2aa")
- ("video-camera" . "\xf03d")
- ("vimeo" . "\xf27d")
- ("vimeo-square" . "\xf194")
- ("vine" . "\xf1ca")
- ("vk" . "\xf189")
- ("volume-control-phone" . "\xf2a0")
- ("volume-down" . "\xf027")
- ("volume-off" . "\xf026")
- ("volume-up" . "\xf028")
- ("weibo" . "\xf18a")
- ("weixin" . "\xf1d7")
- ("whatsapp" . "\xf232")
- ("wheelchair" . "\xf193")
- ("wheelchair-alt" . "\xf29b")
- ("wifi" . "\xf1eb")
- ("wikipedia-w" . "\xf266")
- ("windows" . "\xf17a")
- ("wordpress" . "\xf19a")
- ("wpbeginner" . "\xf297")
- ("wpforms" . "\xf298")
- ("wrench" . "\xf0ad")
- ("xing" . "\xf168")
- ("xing-square" . "\xf169")
- ("y-combinator" . "\xf23b")
- ("yahoo" . "\xf19e")
- ("yelp" . "\xf1e9")
- ("yoast" . "\xf2b1")
- ("youtube" . "\xf167")
- ("youtube-play" . "\xf16a")
- ("youtube-square" . "\xf166")
-
- ))
-
-(provide 'data-faicons)
diff --git a/elpa/all-the-icons-20200730.1545/data/data-fileicons.el b/elpa/all-the-icons-20200730.1545/data/data-fileicons.el
deleted file mode 100644
index 35108af..0000000
--- a/elpa/all-the-icons-20200730.1545/data/data-fileicons.el
+++ /dev/null
@@ -1,489 +0,0 @@
-(defvar all-the-icons-data/file-icon-alist
- '(
-
- ( "1c" . "\xa5ea" )
- ( "1c-alt" . "\xea28" )
- ( "MJML" . "\xea6f" )
- ( "R" . "\xe905" )
- ( "abap" . "\xe92b" )
- ( "abif" . "\xea4e" )
- ( "access" . "\xe9ea" )
- ( "actionscript" . "\xe92e" )
- ( "ada" . "\xe90b" )
- ( "ae" . "\xe9f3" )
- ( "ai" . "\xe6b4" )
- ( "akka" . "\xea0e" )
- ( "alex" . "\x29cb" )
- ( "alloy" . "\xe935" )
- ( "alpine-linux" . "\xe9ff" )
- ( "ampl" . "\xe94e" )
- ( "amx" . "\xe99b" )
- ( "angelscript" . "\xea5b" )
- ( "ansible" . "\x24b6" )
- ( "ansible-alt" . "\x61" )
- ( "ant" . "\xe93e" )
- ( "antlr" . "\xe92c" )
- ( "antwar" . "\x2591" )
- ( "api-blueprint" . "\xe92d" )
- ( "apl" . "\x234b" )
- ( "apl-old" . "\xe909" )
- ( "apple" . "\xe925" )
- ( "appveyor" . "\xe923" )
- ( "arc" . "\xe92f" )
- ( "arch-linux" . "\x41" )
- ( "arduino" . "\xe930" )
- ( "arttext" . "\x24d0" )
- ( "asciidoc" . "\xe918" )
- ( "ats" . "\xe934" )
- ( "audacity" . "\xe9f9" )
- ( "augeas" . "\xe931" )
- ( "aurelia" . "\xea48" )
- ( "auto-hotkey" . "\xe932" )
- ( "autoit" . "\xe933" )
- ( "babel" . "\xe91f" )
- ( "bazel" . "\xea5a" )
- ( "bem" . "\xea59" )
- ( "bib" . "\xe601" )
- ( "bintray" . "\xea6e" )
- ( "bithound" . "\xea2a" )
- ( "blender" . "\xe9fa" )
- ( "bluespec" . "\xe93c" )
- ( "boo" . "\xe939" )
- ( "brain" . "\xe93a" )
- ( "brakeman" . "\xe9d6" )
- ( "bro" . "\xe93b" )
- ( "broccoli" . "\xe922" )
- ( "brotli" . "\xea6c" )
- ( "browserslist" . "\xea80" )
- ( "brunch" . "\xea47" )
- ( "buck" . "\xea46" )
- ( "build-boot" . "\xf103" )
- ( "bundler" . "\xea45" )
- ( "byond" . "\xe962" )
- ( "cabal" . "\xe9c2" )
- ( "caddy" . "\xea58" )
- ( "cake" . "\xe9e3" )
- ( "cakefile" . "\xe924" )
- ( "cakephp" . "\xea43" )
- ( "cakephp-old" . "\xe9d3" )
- ( "cc" . "\xe9d5" )
- ( "ceylon" . "\xe94f" )
- ( "chai" . "\x63" )
- ( "chapel" . "\xe950" )
- ( "chartjs" . "\xea0b" )
- ( "chef" . "\xea42" )
- ( "chuck" . "\xe943" )
- ( "circle-ci" . "\xea12" )
- ( "cirru" . "\xe951" )
- ( "ckeditor" . "\xea0c" )
- ( "clarion" . "\xe952" )
- ( "clean" . "\xe95b" )
- ( "click" . "\xe95c" )
- ( "clips" . "\xe940" )
- ( "clj" . "\xf105" )
- ( "cljs" . "\xf104" )
- ( "closure-template" . "\xea82" )
- ( "cmake" . "\xe93f" )
- ( "cobol" . "\xea44" )
- ( "codecov" . "\x2602" )
- ( "codekit" . "\xea41" )
- ( "codemirror" . "\xea0d" )
- ( "codeship" . "\xea6a" )
- ( "cold-fusion" . "\xe929" )
- ( "clisp" . "\xe972" )
- ( "composer" . "\xe683" )
- ( "config" . "\xf07c" )
- ( "coq" . "\xe95f" )
- ( "cordova" . "\xea11" )
- ( "cp" . "\xe942" )
- ( "cpan" . "\xea87" )
- ( "creole" . "\xe95e" )
- ( "crystal" . "\xe902" )
- ( "cs-script" . "\xe9e2" )
- ( "csound" . "\xe9f0" )
- ( "cucumber" . "\xf02b" )
- ( "cython" . "\xe963" )
- ( "d3" . "\xea10" )
- ( "darcs" . "\xe964" )
- ( "dart" . "\xe698" )
- ( "dashboard" . "\xf07d" )
- ( "dbase" . "\xe9f1" )
- ( "default" . "\x1f5cc" )
- ( "delphi" . "\xea40" )
- ( "devicetree" . "\xea57" )
- ( "diff" . "\xe960" )
- ( "dockerfile" . "\xf106" )
- ( "doclets" . "\xea3f" )
- ( "doge" . "\xe946" )
- ( "dom" . "\xea71" )
- ( "donejs" . "\x1f3c1" )
- ( "doxygen" . "\xe928" )
- ( "dragula" . "\x1f44c" )
- ( "drone" . "\xea3d" )
- ( "dyalog" . "\xe90c" )
- ( "dylib" . "\xea15" )
- ( "e" . "\x45" )
- ( "eagle" . "\xe965" )
- ( "easybuild" . "\xea85" )
- ( "ec" . "\xe9c9" )
- ( "ecere" . "\xe966" )
- ( "edge" . "\xea78" )
- ( "editorconfig" . "\xea1b" )
- ( "eiffel" . "\xe967" )
- ( "ejs" . "\xea4b" )
- ( "electron" . "\xea27" )
- ( "elm" . "\xf102" )
- ( "emacs" . "\xe926" )
- ( "elisp" . "\xe926" )
- ( "ember" . "\xe61b" )
- ( "emberscript" . "\xe968" )
- ( "eq" . "\xea0a" )
- ( "esdoc" . "\xea5c" )
- ( "eslint" . "\xea0f" )
- ( "eslint-old" . "\xe90e" )
- ( "excel" . "\xe9ee" )
- ( "fabfile" . "\xe94b" )
- ( "factor" . "\xe96a" )
- ( "fancy" . "\xe96b" )
- ( "fantom" . "\xe96f" )
- ( "fbx" . "\xe9fc" )
- ( "ffmpeg" . "\xea22" )
- ( "finder" . "\xe9e9" )
- ( "firebase" . "\xea7f" )
- ( "flow" . "\xe921" )
- ( "flux" . "\xe969" )
- ( "font" . "\xe90f" )
- ( "fontforge" . "\xfb00" )
- ( "fortran" . "\xe90a" )
- ( "franca" . "\xea56" )
- ( "freemarker" . "\xe970" )
- ( "frege" . "\xe96e" )
- ( "fsharp" . "\xe6a7" )
- ( "fuel-ux" . "\xea09" )
- ( "gams" . "\xe973" )
- ( "gap" . "\xe971" )
- ( "gdb" . "\xea08" )
- ( "genshi" . "\xe976" )
- ( "gentoo" . "\xe96d" )
- ( "gf" . "\xe978" )
- ( "gitlab" . "\xea3c" )
- ( "glade" . "\xe938" )
- ( "glyphs" . "\x47" )
- ( "gn" . "\xea25" )
- ( "gnu" . "\xe679" )
- ( "go" . "\xe624" )
- ( "godot" . "\xe974" )
- ( "golo" . "\xe979" )
- ( "gosu" . "\xe97a" )
- ( "gradle" . "\xe903" )
- ( "graphql" . "\xe97c" )
- ( "graphviz" . "\xe97d" )
- ( "groovy" . "\xe904" )
- ( "grunt" . "\xe611" )
- ( "gulp" . "\xe610" )
- ( "hack" . "\xe9ce" )
- ( "haml" . "\xf15b" )
- ( "harbour" . "\xe97b" )
- ( "hashicorp" . "\xe97e" )
- ( "haxe" . "\xe907" )
- ( "haxedevelop" . "\xea3b" )
- ( "hg" . "\x263f" )
- ( "hoplon" . "\xea4d" )
- ( "hy" . "\xe97f" )
- ( "icu" . "\xea23" )
- ( "id" . "\xe9f4" )
- ( "idl" . "\xe947" )
- ( "idris" . "\xe983" )
- ( "igorpro" . "\xe980" )
- ( "image" . "\xf012" )
- ( "inform7" . "\xe984" )
- ( "inno" . "\xe985" )
- ( "io" . "\xe981" )
- ( "ioke" . "\xe982" )
- ( "ionic-project" . "\xf14b" )
- ( "isabelle" . "\xe945" )
- ( "j" . "\xe937" )
- ( "jade" . "\xe90d" )
- ( "jake" . "\xe948" )
- ( "jasmine" . "\xea3a" )
- ( "jenkins" . "\xe667" )
- ( "jest" . "\xea39" )
- ( "jinja" . "\xe944" )
- ( "jison" . "\xea55" )
- ( "jolie" . "\xea75" )
- ( "jsonld" . "\xe958" )
- ( "jsx" . "\xf100" )
- ( "jsx-2" . "\xf101" )
- ( "jsx2-alt" . "\xe9e6" )
- ( "julia" . "\x26ec" )
- ( "junos" . "\xea81" )
- ( "jupyter" . "\xe987" )
- ( "karma" . "\xe9cd" )
- ( "keynote" . "\xe9e5" )
- ( "khronos" . "\xe9f8" )
- ( "kicad" . "\xea4c" )
- ( "kitchenci" . "\xea38" )
- ( "kivy" . "\xe901" )
- ( "knockout" . "\x4b" )
- ( "kotlin" . "\xe989" )
- ( "krl" . "\xe988" )
- ( "labview" . "\xe98a" )
- ( "lasso" . "\xe98c" )
- ( "leaflet" . "\xea07" )
- ( "lean" . "\x4c" )
- ( "lerna" . "\xea37" )
- ( "lfe" . "\xe94c" )
- ( "libuv" . "\xea21" )
- ( "lightwave" . "\xe9fb" )
- ( "lime" . "\xea36" )
- ( "lisp" . "\xe908" )
- ( "livescript" . "\xe914" )
- ( "llvm" . "\xe91d" )
- ( "logtalk" . "\xe98d" )
- ( "lookml" . "\xe98e" )
- ( "lsl" . "\xe98b" )
- ( "lua" . "\xe91b" )
- ( "mako" . "\xe98f" )
- ( "man-page" . "\xe936" )
- ( "mapbox" . "\xe941" )
- ( "markdownlint" . "\xf0c9" )
- ( "marko" . "\xe920" )
- ( "mathematica" . "\xe990" )
- ( "mathjax" . "\xea06" )
- ( "matlab" . "\xe991" )
- ( "max" . "\xe993" )
- ( "maxscript" . "\xe900" )
- ( "maya" . "\xe9f6" )
- ( "mediawiki" . "\xe954" )
- ( "mercury" . "\xe994" )
- ( "meson" . "\xea54" )
- ( "metal" . "\x4d" )
- ( "meteor" . "\xe6a5" )
- ( "microsoft-infopath" . "\xea35" )
- ( "minecraft" . "\xe9dc" )
- ( "minizinc" . "\xea53" )
- ( "mirah" . "\xe995" )
- ( "miranda" . "\xea52" )
- ( "mocha" . "\x26fe" )
- ( "modula-2" . "\xe996" )
- ( "moment" . "\x1f558" )
- ( "moment-tz" . "\x1f30d" )
- ( "monkey" . "\xe997" )
- ( "moustache" . "\xe60f" )
- ( "mruby" . "\xea18" )
- ( "mupad" . "\xe9ca" )
- ( "nano" . "\xea76" )
- ( "nanoc" . "\xea51" )
- ( "nant" . "\xe9e1" )
- ( "nasm" . "\xea72" )
- ( "neko" . "\xea05" )
- ( "netlogo" . "\xe99c" )
- ( "new-relic" . "\xe9d7" )
- ( "nginx" . "\xf146b" )
- ( "nib" . "\x2712" )
- ( "nimrod" . "\xe998" )
- ( "nit" . "\xe999" )
- ( "nix" . "\xe99a" )
- ( "nmap" . "\xe94d" )
- ( "nodemon" . "\xea26" )
- ( "normalize" . "\xea04" )
- ( "npm" . "\xe91c" )
- ( "npm-old" . "\xf17b" )
- ( "nsis" . "\xea1e" )
- ( "nsis-old" . "\xe992" )
- ( "nuclide" . "\xea34" )
- ( "nuget" . "\xe9d9" )
- ( "numpy" . "\xe99d" )
- ( "nunjucks" . "\xe953" )
- ( "nvidia" . "\xe95d" )
- ( "nxc" . "\xea6b" )
- ( "obj" . "\xe9e8" )
- ( "objective-j" . "\xe99e" )
- ( "ocaml" . "\xe91a" )
- ( "octave" . "\xea33" )
- ( "onenote" . "\xe9eb" )
- ( "ooc" . "\xe9cb" )
- ( "opa" . "\x2601" )
- ( "opencl" . "\xe99f" )
- ( "opengl" . "\xea7a" )
- ( "openoffice" . "\xe9e4" )
- ( "openscad" . "\xe911" )
- ( "org" . "\xe917" )
- ( "owl" . "\xe957" )
- ( "ox" . "\xe9a1" )
- ( "oxygene" . "\xe9bf" )
- ( "oz" . "\xe9be" )
- ( "p4" . "\xea50" )
- ( "pan" . "\xe9bd" )
- ( "papyrus" . "\xe9bc" )
- ( "parrot" . "\xe9bb" )
- ( "pascal" . "\xe92a" )
- ( "patch" . "\xe961" )
- ( "pawn" . "\x265f" )
- ( "pb" . "\xea14" )
- ( "pegjs" . "\xea74" )
- ( "perl6" . "\xe96c" )
- ( "phalcon" . "\xe94a" )
- ( "phoenix" . "\xea5f" )
- ( "php" . "\xf147" )
- ( "phpunit" . "\xea32" )
- ( "pickle" . "\xe9c4" )
- ( "pike" . "\xe9b9" )
- ( "platformio" . "\xea2c" )
- ( "pm2" . "\x2630" )
- ( "pod" . "\xea84" )
- ( "pogo" . "\xe9b8" )
- ( "pointwise" . "\xe977" )
- ( "polymer" . "\xea2b" )
- ( "pony" . "\xe9b7" )
- ( "postcss" . "\xe910" )
- ( "postscript" . "\xe955" )
- ( "povray" . "\x50" )
- ( "powerpoint" . "\xe9ec" )
- ( "powershell" . "\xe9da" )
- ( "precision" . "\x2295" )
- ( "premiere" . "\xe9f5" )
- ( "processing" . "\xe9a0" )
- ( "progress" . "\xe9c0" )
- ( "propeller" . "\xe9b5" )
- ( "proselint" . "\xea6d" )
- ( "protractor" . "\xe9de" )
- ( "ps" . "\xe6b8" )
- ( "pug" . "\xea13" )
- ( "pug-alt" . "\xe9d0" )
- ( "puppet" . "\xf0c3" )
- ( "purebasic" . "\x1b5" )
- ( "purescript" . "\xe9b2" )
- ( "racket" . "\xe9b1" )
- ( "raml" . "\xe913" )
- ( "rascal" . "\xea24" )
- ( "rdoc" . "\xe9b0" )
- ( "realbasic" . "\xe9af" )
- ( "reason" . "\xea1d" )
- ( "rebol" . "\xe9ae" )
- ( "red" . "\xe9ad" )
- ( "redux" . "\xea30" )
- ( "regex" . "\x2a" )
- ( "rexx" . "\xea16" )
- ( "rhino" . "\xea4a" )
- ( "ring" . "\x1f48d" )
- ( "riot" . "\xe919" )
- ( "robot" . "\xe9ac" )
- ( "rollup" . "\xea20" )
- ( "rollup-old" . "\xe9fd" )
- ( "rot" . "\x1f764" )
- ( "rspec" . "\xea31" )
- ( "rst" . "\xe9cc" )
- ( "sage" . "\xe9ab" )
- ( "saltstack" . "\xe915" )
- ( "sas" . "\xe95a" )
- ( "sbt" . "\xe9d2" )
- ( "sc" . "\xe9a2" )
- ( "scheme" . "\x3bb" )
- ( "scilab" . "\xe9a9" )
- ( "scrutinizer" . "\xe9d4" )
- ( "self" . "\xe9a8" )
- ( "sequelize" . "\xea2f" )
- ( "sf" . "\xe9db" )
- ( "shen" . "\xe9a7" )
- ( "shipit" . "\x26f5" )
- ( "shippable" . "\xea2d" )
- ( "shopify" . "\xe9cf" )
- ( "shuriken" . "\x272b" )
- ( "silverstripe" . "\xe800" )
- ( "sinatra" . "\xea03" )
- ( "sketch" . "\xe927" )
- ( "sketchup-layout" . "\xea7c" )
- ( "sketchup-make" . "\xea7e" )
- ( "sketchup-stylebuilder" . "\xea7d" )
- ( "slash" . "\xe9a6" )
- ( "snyk" . "\xea1c" )
- ( "solidity" . "\xea86" )
- ( "sparql" . "\xe959" )
- ( "spray" . "\xea02" )
- ( "sqf" . "\xe9a5" )
- ( "sqlite" . "\xe9dd" )
- ( "squarespace" . "\xea5e" )
- ( "stan" . "\xe9a4" )
- ( "stata" . "\xe9a3" )
- ( "storyist" . "\xe9ef" )
- ( "strings" . "\xe9e0" )
- ( "stylelint" . "\xe93d" )
- ( "stylus" . "\x73" )
- ( "stylus-full" . "\xe9f7" )
- ( "stylus-orb" . "\x53" )
- ( "sublime" . "\xe986" )
- ( "sv" . "\xe9c3" )
- ( "svn" . "\xea17" )
- ( "swagger" . "\xea29" )
- ( "tag" . "\xf015" )
- ( "tcl" . "\xe956" )
- ( "telegram" . "\x2708" )
- ( "terminal" . "\xf0c8" )
- ( "tern" . "\x1f54a" )
- ( "terraform" . "\xe916" )
- ( "test-coffeescript" . "\xea62" )
- ( "test-dir" . "\xea60" )
- ( "test-generic" . "\xea63" )
- ( "test-js" . "\xea64" )
- ( "test-perl" . "\xea65" )
- ( "test-python" . "\xea66" )
- ( "test-react" . "\xea67" )
- ( "test-ruby" . "\xea68" )
- ( "test-typescript" . "\xea69" )
- ( "tex" . "\xe600" )
- ( "textile" . "\x74" )
- ( "textmate" . "\x2122" )
- ( "thor" . "\xe9d8" )
- ( "tinymce" . "\xea01" )
- ( "tsx" . "\xe9d1" )
- ( "tsx-alt" . "\xe9e7" )
- ( "tt" . "\x54" )
- ( "turing" . "\xe9b6" )
- ( "twig" . "\x2e19" )
- ( "twine" . "\xea5d" )
- ( "txl" . "\xe9c1" )
- ( "typedoc" . "\xe9fe" )
- ( "typescript" . "\xe912" )
- ( "typescript-alt" . "\x2a6" )
- ( "typings" . "\xe9df" )
- ( "uno" . "\xe9b3" )
- ( "unreal" . "\x75" )
- ( "urweb" . "\xe9ba" )
- ( "v8" . "\xea1f" )
- ( "vagrant" . "\x56" )
- ( "vcl" . "\xe9b4" )
- ( "verilog" . "\xe949" )
- ( "vertex-shader" . "\xea79" )
- ( "vhdl" . "\xe9aa" )
- ( "video" . "\xf057" )
- ( "virtualbox" . "\xea3e" )
- ( "virtualbox-alt" . "\xea2e" )
- ( "visio" . "\xea83" )
- ( "vmware" . "\xea49" )
- ( "vue" . "\xe906" )
- ( "wasm" . "\xea70" )
- ( "watchman" . "\xea4f" )
- ( "webgl" . "\xea7b" )
- ( "webpack" . "\xea61" )
- ( "webpack-old" . "\xe91e" )
- ( "wercker" . "\xea19" )
- ( "word" . "\xe9ed" )
- ( "x10" . "\x2169" )
- ( "xamarin" . "\xea77" )
- ( "xmos" . "\x58" )
- ( "xpages" . "\xe9c5" )
- ( "xtend" . "\xe9c6" )
- ( "yarn" . "\xea1a" )
- ( "yasm" . "\xea73" )
- ( "yin-yang" . "\x262f" )
- ( "yoyo" . "\xe975" )
- ( "yui" . "\xea00" )
- ( "zbrush" . "\xe9f2" )
- ( "zephir" . "\xe9c7" )
- ( "zimpl" . "\xe9c8" )
-
- )
- )
-
-(provide 'data-fileicons)
diff --git a/elpa/all-the-icons-20200730.1545/data/data-material.el b/elpa/all-the-icons-20200730.1545/data/data-material.el
deleted file mode 100644
index bafcfe7..0000000
--- a/elpa/all-the-icons-20200730.1545/data/data-material.el
+++ /dev/null
@@ -1,935 +0,0 @@
-(defvar all-the-icons-data/material-icons-alist
- '(("3d_rotation" . "\xe84d")
- ("ac_unit" . "\xeb3b")
- ("access_alarm" . "\xe190")
- ("access_alarms" . "\xe191")
- ("access_time" . "\xe192")
- ("accessibility" . "\xe84e")
- ("accessible" . "\xe914")
- ("account_balance" . "\xe84f")
- ("account_balance_wallet" . "\xe850")
- ("account_box" . "\xe851")
- ("account_circle" . "\xe853")
- ("adb" . "\xe60e")
- ("add" . "\xe145")
- ("add_a_photo" . "\xe439")
- ("add_alarm" . "\xe193")
- ("add_alert" . "\xe003")
- ("add_box" . "\xe146")
- ("add_circle" . "\xe147")
- ("add_circle_outline" . "\xe148")
- ("add_location" . "\xe567")
- ("add_shopping_cart" . "\xe854")
- ("add_to_photos" . "\xe39d")
- ("add_to_queue" . "\xe05c")
- ("adjust" . "\xe39e")
- ("airline_seat_flat" . "\xe630")
- ("airline_seat_flat_angled" . "\xe631")
- ("airline_seat_individual_suite" . "\xe632")
- ("airline_seat_legroom_extra" . "\xe633")
- ("airline_seat_legroom_normal" . "\xe634")
- ("airline_seat_legroom_reduced" . "\xe635")
- ("airline_seat_recline_extra" . "\xe636")
- ("airline_seat_recline_normal" . "\xe637")
- ("airplanemode_active" . "\xe195")
- ("airplanemode_inactive" . "\xe194")
- ("airplay" . "\xe055")
- ("airport_shuttle" . "\xeb3c")
- ("alarm" . "\xe855")
- ("alarm_add" . "\xe856")
- ("alarm_off" . "\xe857")
- ("alarm_on" . "\xe858")
- ("album" . "\xe019")
- ("all_inclusive" . "\xeb3d")
- ("all_out" . "\xe90b")
- ("android" . "\xe859")
- ("announcement" . "\xe85a")
- ("apps" . "\xe5c3")
- ("archive" . "\xe149")
- ("arrow_back" . "\xe5c4")
- ("arrow_downward" . "\xe5db")
- ("arrow_drop_down" . "\xe5c5")
- ("arrow_drop_down_circle" . "\xe5c6")
- ("arrow_drop_up" . "\xe5c7")
- ("arrow_forward" . "\xe5c8")
- ("arrow_upward" . "\xe5d8")
- ("art_track" . "\xe060")
- ("aspect_ratio" . "\xe85b")
- ("assessment" . "\xe85c")
- ("assignment" . "\xe85d")
- ("assignment_ind" . "\xe85e")
- ("assignment_late" . "\xe85f")
- ("assignment_return" . "\xe860")
- ("assignment_returned" . "\xe861")
- ("assignment_turned_in" . "\xe862")
- ("assistant" . "\xe39f")
- ("assistant_photo" . "\xe3a0")
- ("attach_file" . "\xe226")
- ("attach_money" . "\xe227")
- ("attachment" . "\xe2bc")
- ("audiotrack" . "\xe3a1")
- ("autorenew" . "\xe863")
- ("av_timer" . "\xe01b")
- ("backspace" . "\xe14a")
- ("backup" . "\xe864")
- ("battery_alert" . "\xe19c")
- ("battery_charging_full" . "\xe1a3")
- ("battery_full" . "\xe1a4")
- ("battery_std" . "\xe1a5")
- ("battery_unknown" . "\xe1a6")
- ("beach_access" . "\xeb3e")
- ("beenhere" . "\xe52d")
- ("block" . "\xe14b")
- ("bluetooth" . "\xe1a7")
- ("bluetooth_audio" . "\xe60f")
- ("bluetooth_connected" . "\xe1a8")
- ("bluetooth_disabled" . "\xe1a9")
- ("bluetooth_searching" . "\xe1aa")
- ("blur_circular" . "\xe3a2")
- ("blur_linear" . "\xe3a3")
- ("blur_off" . "\xe3a4")
- ("blur_on" . "\xe3a5")
- ("book" . "\xe865")
- ("bookmark" . "\xe866")
- ("bookmark_border" . "\xe867")
- ("border_all" . "\xe228")
- ("border_bottom" . "\xe229")
- ("border_clear" . "\xe22a")
- ("border_color" . "\xe22b")
- ("border_horizontal" . "\xe22c")
- ("border_inner" . "\xe22d")
- ("border_left" . "\xe22e")
- ("border_outer" . "\xe22f")
- ("border_right" . "\xe230")
- ("border_style" . "\xe231")
- ("border_top" . "\xe232")
- ("border_vertical" . "\xe233")
- ("branding_watermark" . "\xe06b")
- ("brightness_1" . "\xe3a6")
- ("brightness_2" . "\xe3a7")
- ("brightness_3" . "\xe3a8")
- ("brightness_4" . "\xe3a9")
- ("brightness_5" . "\xe3aa")
- ("brightness_6" . "\xe3ab")
- ("brightness_7" . "\xe3ac")
- ("brightness_auto" . "\xe1ab")
- ("brightness_high" . "\xe1ac")
- ("brightness_low" . "\xe1ad")
- ("brightness_medium" . "\xe1ae")
- ("broken_image" . "\xe3ad")
- ("brush" . "\xe3ae")
- ("bubble_chart" . "\xe6dd")
- ("bug_report" . "\xe868")
- ("build" . "\xe869")
- ("burst_mode" . "\xe43c")
- ("business" . "\xe0af")
- ("business_center" . "\xeb3f")
- ("cached" . "\xe86a")
- ("cake" . "\xe7e9")
- ("call" . "\xe0b0")
- ("call_end" . "\xe0b1")
- ("call_made" . "\xe0b2")
- ("call_merge" . "\xe0b3")
- ("call_missed" . "\xe0b4")
- ("call_missed_outgoing" . "\xe0e4")
- ("call_received" . "\xe0b5")
- ("call_split" . "\xe0b6")
- ("call_to_action" . "\xe06c")
- ("camera" . "\xe3af")
- ("camera_alt" . "\xe3b0")
- ("camera_enhance" . "\xe8fc")
- ("camera_front" . "\xe3b1")
- ("camera_rear" . "\xe3b2")
- ("camera_roll" . "\xe3b3")
- ("cancel" . "\xe5c9")
- ("card_giftcard" . "\xe8f6")
- ("card_membership" . "\xe8f7")
- ("card_travel" . "\xe8f8")
- ("casino" . "\xeb40")
- ("cast" . "\xe307")
- ("cast_connected" . "\xe308")
- ("center_focus_strong" . "\xe3b4")
- ("center_focus_weak" . "\xe3b5")
- ("change_history" . "\xe86b")
- ("chat" . "\xe0b7")
- ("chat_bubble" . "\xe0ca")
- ("chat_bubble_outline" . "\xe0cb")
- ("check" . "\xe5ca")
- ("check_box" . "\xe834")
- ("check_box_outline_blank" . "\xe835")
- ("check_circle" . "\xe86c")
- ("chevron_left" . "\xe5cb")
- ("chevron_right" . "\xe5cc")
- ("child_care" . "\xeb41")
- ("child_friendly" . "\xeb42")
- ("chrome_reader_mode" . "\xe86d")
- ("class" . "\xe86e")
- ("clear" . "\xe14c")
- ("clear_all" . "\xe0b8")
- ("close" . "\xe5cd")
- ("closed_caption" . "\xe01c")
- ("cloud" . "\xe2bd")
- ("cloud_circle" . "\xe2be")
- ("cloud_done" . "\xe2bf")
- ("cloud_download" . "\xe2c0")
- ("cloud_off" . "\xe2c1")
- ("cloud_queue" . "\xe2c2")
- ("cloud_upload" . "\xe2c3")
- ("code" . "\xe86f")
- ("collections" . "\xe3b6")
- ("collections_bookmark" . "\xe431")
- ("color_lens" . "\xe3b7")
- ("colorize" . "\xe3b8")
- ("comment" . "\xe0b9")
- ("compare" . "\xe3b9")
- ("compare_arrows" . "\xe915")
- ("computer" . "\xe30a")
- ("confirmation_number" . "\xe638")
- ("contact_mail" . "\xe0d0")
- ("contact_phone" . "\xe0cf")
- ("contacts" . "\xe0ba")
- ("content_copy" . "\xe14d")
- ("content_cut" . "\xe14e")
- ("content_paste" . "\xe14f")
- ("control_point" . "\xe3ba")
- ("control_point_duplicate" . "\xe3bb")
- ("copyright" . "\xe90c")
- ("create" . "\xe150")
- ("create_new_folder" . "\xe2cc")
- ("credit_card" . "\xe870")
- ("crop" . "\xe3be")
- ("crop_16_9" . "\xe3bc")
- ("crop_3_2" . "\xe3bd")
- ("crop_5_4" . "\xe3bf")
- ("crop_7_5" . "\xe3c0")
- ("crop_din" . "\xe3c1")
- ("crop_free" . "\xe3c2")
- ("crop_landscape" . "\xe3c3")
- ("crop_original" . "\xe3c4")
- ("crop_portrait" . "\xe3c5")
- ("crop_rotate" . "\xe437")
- ("crop_square" . "\xe3c6")
- ("dashboard" . "\xe871")
- ("data_usage" . "\xe1af")
- ("date_range" . "\xe916")
- ("dehaze" . "\xe3c7")
- ("delete" . "\xe872")
- ("delete_forever" . "\xe92b")
- ("delete_sweep" . "\xe16c")
- ("description" . "\xe873")
- ("desktop_mac" . "\xe30b")
- ("desktop_windows" . "\xe30c")
- ("details" . "\xe3c8")
- ("developer_board" . "\xe30d")
- ("developer_mode" . "\xe1b0")
- ("device_hub" . "\xe335")
- ("devices" . "\xe1b1")
- ("devices_other" . "\xe337")
- ("dialer_sip" . "\xe0bb")
- ("dialpad" . "\xe0bc")
- ("directions" . "\xe52e")
- ("directions_bike" . "\xe52f")
- ("directions_boat" . "\xe532")
- ("directions_bus" . "\xe530")
- ("directions_car" . "\xe531")
- ("directions_railway" . "\xe534")
- ("directions_run" . "\xe566")
- ("directions_subway" . "\xe533")
- ("directions_transit" . "\xe535")
- ("directions_walk" . "\xe536")
- ("disc_full" . "\xe610")
- ("dns" . "\xe875")
- ("do_not_disturb" . "\xe612")
- ("do_not_disturb_alt" . "\xe611")
- ("do_not_disturb_off" . "\xe643")
- ("do_not_disturb_on" . "\xe644")
- ("dock" . "\xe30e")
- ("domain" . "\xe7ee")
- ("done" . "\xe876")
- ("done_all" . "\xe877")
- ("donut_large" . "\xe917")
- ("donut_small" . "\xe918")
- ("drafts" . "\xe151")
- ("drag_handle" . "\xe25d")
- ("drive_eta" . "\xe613")
- ("dvr" . "\xe1b2")
- ("edit" . "\xe3c9")
- ("edit_location" . "\xe568")
- ("eject" . "\xe8fb")
- ("email" . "\xe0be")
- ("enhanced_encryption" . "\xe63f")
- ("equalizer" . "\xe01d")
- ("error" . "\xe000")
- ("error_outline" . "\xe001")
- ("euro_symbol" . "\xe926")
- ("ev_station" . "\xe56d")
- ("event" . "\xe878")
- ("event_available" . "\xe614")
- ("event_busy" . "\xe615")
- ("event_note" . "\xe616")
- ("event_seat" . "\xe903")
- ("exit_to_app" . "\xe879")
- ("expand_less" . "\xe5ce")
- ("expand_more" . "\xe5cf")
- ("explicit" . "\xe01e")
- ("explore" . "\xe87a")
- ("exposure" . "\xe3ca")
- ("exposure_neg_1" . "\xe3cb")
- ("exposure_neg_2" . "\xe3cc")
- ("exposure_plus_1" . "\xe3cd")
- ("exposure_plus_2" . "\xe3ce")
- ("exposure_zero" . "\xe3cf")
- ("extension" . "\xe87b")
- ("face" . "\xe87c")
- ("fast_forward" . "\xe01f")
- ("fast_rewind" . "\xe020")
- ("favorite" . "\xe87d")
- ("favorite_border" . "\xe87e")
- ("featured_play_list" . "\xe06d")
- ("featured_video" . "\xe06e")
- ("feedback" . "\xe87f")
- ("fiber_dvr" . "\xe05d")
- ("fiber_manual_record" . "\xe061")
- ("fiber_new" . "\xe05e")
- ("fiber_pin" . "\xe06a")
- ("fiber_smart_record" . "\xe062")
- ("file_download" . "\xe2c4")
- ("file_upload" . "\xe2c6")
- ("filter" . "\xe3d3")
- ("filter_1" . "\xe3d0")
- ("filter_2" . "\xe3d1")
- ("filter_3" . "\xe3d2")
- ("filter_4" . "\xe3d4")
- ("filter_5" . "\xe3d5")
- ("filter_6" . "\xe3d6")
- ("filter_7" . "\xe3d7")
- ("filter_8" . "\xe3d8")
- ("filter_9" . "\xe3d9")
- ("filter_9_plus" . "\xe3da")
- ("filter_b_and_w" . "\xe3db")
- ("filter_center_focus" . "\xe3dc")
- ("filter_drama" . "\xe3dd")
- ("filter_frames" . "\xe3de")
- ("filter_hdr" . "\xe3df")
- ("filter_list" . "\xe152")
- ("filter_none" . "\xe3e0")
- ("filter_tilt_shift" . "\xe3e2")
- ("filter_vintage" . "\xe3e3")
- ("find_in_page" . "\xe880")
- ("find_replace" . "\xe881")
- ("fingerprint" . "\xe90d")
- ("first_page" . "\xe5dc")
- ("fitness_center" . "\xeb43")
- ("flag" . "\xe153")
- ("flare" . "\xe3e4")
- ("flash_auto" . "\xe3e5")
- ("flash_off" . "\xe3e6")
- ("flash_on" . "\xe3e7")
- ("flight" . "\xe539")
- ("flight_land" . "\xe904")
- ("flight_takeoff" . "\xe905")
- ("flip" . "\xe3e8")
- ("flip_to_back" . "\xe882")
- ("flip_to_front" . "\xe883")
- ("folder" . "\xe2c7")
- ("folder_open" . "\xe2c8")
- ("folder_shared" . "\xe2c9")
- ("folder_special" . "\xe617")
- ("font_download" . "\xe167")
- ("format_align_center" . "\xe234")
- ("format_align_justify" . "\xe235")
- ("format_align_left" . "\xe236")
- ("format_align_right" . "\xe237")
- ("format_bold" . "\xe238")
- ("format_clear" . "\xe239")
- ("format_color_fill" . "\xe23a")
- ("format_color_reset" . "\xe23b")
- ("format_color_text" . "\xe23c")
- ("format_indent_decrease" . "\xe23d")
- ("format_indent_increase" . "\xe23e")
- ("format_italic" . "\xe23f")
- ("format_line_spacing" . "\xe240")
- ("format_list_bulleted" . "\xe241")
- ("format_list_numbered" . "\xe242")
- ("format_paint" . "\xe243")
- ("format_quote" . "\xe244")
- ("format_shapes" . "\xe25e")
- ("format_size" . "\xe245")
- ("format_strikethrough" . "\xe246")
- ("format_textdirection_l_to_r" . "\xe247")
- ("format_textdirection_r_to_l" . "\xe248")
- ("format_underlined" . "\xe249")
- ("forum" . "\xe0bf")
- ("forward" . "\xe154")
- ("forward_10" . "\xe056")
- ("forward_30" . "\xe057")
- ("forward_5" . "\xe058")
- ("free_breakfast" . "\xeb44")
- ("fullscreen" . "\xe5d0")
- ("fullscreen_exit" . "\xe5d1")
- ("functions" . "\xe24a")
- ("g_translate" . "\xe927")
- ("gamepad" . "\xe30f")
- ("games" . "\xe021")
- ("gavel" . "\xe90e")
- ("gesture" . "\xe155")
- ("get_app" . "\xe884")
- ("gif" . "\xe908")
- ("golf_course" . "\xeb45")
- ("gps_fixed" . "\xe1b3")
- ("gps_not_fixed" . "\xe1b4")
- ("gps_off" . "\xe1b5")
- ("grade" . "\xe885")
- ("gradient" . "\xe3e9")
- ("grain" . "\xe3ea")
- ("graphic_eq" . "\xe1b8")
- ("grid_off" . "\xe3eb")
- ("grid_on" . "\xe3ec")
- ("group" . "\xe7ef")
- ("group_add" . "\xe7f0")
- ("group_work" . "\xe886")
- ("hd" . "\xe052")
- ("hdr_off" . "\xe3ed")
- ("hdr_on" . "\xe3ee")
- ("hdr_strong" . "\xe3f1")
- ("hdr_weak" . "\xe3f2")
- ("headset" . "\xe310")
- ("headset_mic" . "\xe311")
- ("healing" . "\xe3f3")
- ("hearing" . "\xe023")
- ("help" . "\xe887")
- ("help_outline" . "\xe8fd")
- ("high_quality" . "\xe024")
- ("highlight" . "\xe25f")
- ("highlight_off" . "\xe888")
- ("history" . "\xe889")
- ("home" . "\xe88a")
- ("hot_tub" . "\xeb46")
- ("hotel" . "\xe53a")
- ("hourglass_empty" . "\xe88b")
- ("hourglass_full" . "\xe88c")
- ("http" . "\xe902")
- ("https" . "\xe88d")
- ("image" . "\xe3f4")
- ("image_aspect_ratio" . "\xe3f5")
- ("import_contacts" . "\xe0e0")
- ("import_export" . "\xe0c3")
- ("important_devices" . "\xe912")
- ("inbox" . "\xe156")
- ("indeterminate_check_box" . "\xe909")
- ("info" . "\xe88e")
- ("info_outline" . "\xe88f")
- ("input" . "\xe890")
- ("insert_chart" . "\xe24b")
- ("insert_comment" . "\xe24c")
- ("insert_drive_file" . "\xe24d")
- ("insert_emoticon" . "\xe24e")
- ("insert_invitation" . "\xe24f")
- ("insert_link" . "\xe250")
- ("insert_photo" . "\xe251")
- ("invert_colors" . "\xe891")
- ("invert_colors_off" . "\xe0c4")
- ("iso" . "\xe3f6")
- ("keyboard" . "\xe312")
- ("keyboard_arrow_down" . "\xe313")
- ("keyboard_arrow_left" . "\xe314")
- ("keyboard_arrow_right" . "\xe315")
- ("keyboard_arrow_up" . "\xe316")
- ("keyboard_backspace" . "\xe317")
- ("keyboard_capslock" . "\xe318")
- ("keyboard_hide" . "\xe31a")
- ("keyboard_return" . "\xe31b")
- ("keyboard_tab" . "\xe31c")
- ("keyboard_voice" . "\xe31d")
- ("kitchen" . "\xeb47")
- ("label" . "\xe892")
- ("label_outline" . "\xe893")
- ("landscape" . "\xe3f7")
- ("language" . "\xe894")
- ("laptop" . "\xe31e")
- ("laptop_chromebook" . "\xe31f")
- ("laptop_mac" . "\xe320")
- ("laptop_windows" . "\xe321")
- ("last_page" . "\xe5dd")
- ("launch" . "\xe895")
- ("layers" . "\xe53b")
- ("layers_clear" . "\xe53c")
- ("leak_add" . "\xe3f8")
- ("leak_remove" . "\xe3f9")
- ("lens" . "\xe3fa")
- ("library_add" . "\xe02e")
- ("library_books" . "\xe02f")
- ("library_music" . "\xe030")
- ("lightbulb_outline" . "\xe90f")
- ("line_style" . "\xe919")
- ("line_weight" . "\xe91a")
- ("linear_scale" . "\xe260")
- ("link" . "\xe157")
- ("linked_camera" . "\xe438")
- ("list" . "\xe896")
- ("live_help" . "\xe0c6")
- ("live_tv" . "\xe639")
- ("local_activity" . "\xe53f")
- ("local_airport" . "\xe53d")
- ("local_atm" . "\xe53e")
- ("local_bar" . "\xe540")
- ("local_cafe" . "\xe541")
- ("local_car_wash" . "\xe542")
- ("local_convenience_store" . "\xe543")
- ("local_dining" . "\xe556")
- ("local_drink" . "\xe544")
- ("local_florist" . "\xe545")
- ("local_gas_station" . "\xe546")
- ("local_grocery_store" . "\xe547")
- ("local_hospital" . "\xe548")
- ("local_hotel" . "\xe549")
- ("local_laundry_service" . "\xe54a")
- ("local_library" . "\xe54b")
- ("local_mall" . "\xe54c")
- ("local_movies" . "\xe54d")
- ("local_offer" . "\xe54e")
- ("local_parking" . "\xe54f")
- ("local_pharmacy" . "\xe550")
- ("local_phone" . "\xe551")
- ("local_pizza" . "\xe552")
- ("local_play" . "\xe553")
- ("local_post_office" . "\xe554")
- ("local_printshop" . "\xe555")
- ("local_see" . "\xe557")
- ("local_shipping" . "\xe558")
- ("local_taxi" . "\xe559")
- ("location_city" . "\xe7f1")
- ("location_disabled" . "\xe1b6")
- ("location_off" . "\xe0c7")
- ("location_on" . "\xe0c8")
- ("location_searching" . "\xe1b7")
- ("lock" . "\xe897")
- ("lock_open" . "\xe898")
- ("lock_outline" . "\xe899")
- ("looks" . "\xe3fc")
- ("looks_3" . "\xe3fb")
- ("looks_4" . "\xe3fd")
- ("looks_5" . "\xe3fe")
- ("looks_6" . "\xe3ff")
- ("looks_one" . "\xe400")
- ("looks_two" . "\xe401")
- ("loop" . "\xe028")
- ("loupe" . "\xe402")
- ("low_priority" . "\xe16d")
- ("loyalty" . "\xe89a")
- ("mail" . "\xe158")
- ("mail_outline" . "\xe0e1")
- ("map" . "\xe55b")
- ("markunread" . "\xe159")
- ("markunread_mailbox" . "\xe89b")
- ("memory" . "\xe322")
- ("menu" . "\xe5d2")
- ("merge_type" . "\xe252")
- ("message" . "\xe0c9")
- ("mic" . "\xe029")
- ("mic_none" . "\xe02a")
- ("mic_off" . "\xe02b")
- ("mms" . "\xe618")
- ("mode_comment" . "\xe253")
- ("mode_edit" . "\xe254")
- ("monetization_on" . "\xe263")
- ("money_off" . "\xe25c")
- ("monochrome_photos" . "\xe403")
- ("mood" . "\xe7f2")
- ("mood_bad" . "\xe7f3")
- ("more" . "\xe619")
- ("more_horiz" . "\xe5d3")
- ("more_vert" . "\xe5d4")
- ("motorcycle" . "\xe91b")
- ("mouse" . "\xe323")
- ("move_to_inbox" . "\xe168")
- ("movie" . "\xe02c")
- ("movie_creation" . "\xe404")
- ("movie_filter" . "\xe43a")
- ("multiline_chart" . "\xe6df")
- ("music_note" . "\xe405")
- ("music_video" . "\xe063")
- ("my_location" . "\xe55c")
- ("nature" . "\xe406")
- ("nature_people" . "\xe407")
- ("navigate_before" . "\xe408")
- ("navigate_next" . "\xe409")
- ("navigation" . "\xe55d")
- ("near_me" . "\xe569")
- ("network_cell" . "\xe1b9")
- ("network_check" . "\xe640")
- ("network_locked" . "\xe61a")
- ("network_wifi" . "\xe1ba")
- ("new_releases" . "\xe031")
- ("next_week" . "\xe16a")
- ("nfc" . "\xe1bb")
- ("no_encryption" . "\xe641")
- ("no_sim" . "\xe0cc")
- ("not_interested" . "\xe033")
- ("note" . "\xe06f")
- ("note_add" . "\xe89c")
- ("notifications" . "\xe7f4")
- ("notifications_active" . "\xe7f7")
- ("notifications_none" . "\xe7f5")
- ("notifications_off" . "\xe7f6")
- ("notifications_paused" . "\xe7f8")
- ("offline_pin" . "\xe90a")
- ("ondemand_video" . "\xe63a")
- ("opacity" . "\xe91c")
- ("open_in_browser" . "\xe89d")
- ("open_in_new" . "\xe89e")
- ("open_with" . "\xe89f")
- ("pages" . "\xe7f9")
- ("pageview" . "\xe8a0")
- ("palette" . "\xe40a")
- ("pan_tool" . "\xe925")
- ("panorama" . "\xe40b")
- ("panorama_fish_eye" . "\xe40c")
- ("panorama_horizontal" . "\xe40d")
- ("panorama_vertical" . "\xe40e")
- ("panorama_wide_angle" . "\xe40f")
- ("party_mode" . "\xe7fa")
- ("pause" . "\xe034")
- ("pause_circle_filled" . "\xe035")
- ("pause_circle_outline" . "\xe036")
- ("payment" . "\xe8a1")
- ("people" . "\xe7fb")
- ("people_outline" . "\xe7fc")
- ("perm_camera_mic" . "\xe8a2")
- ("perm_contact_calendar" . "\xe8a3")
- ("perm_data_setting" . "\xe8a4")
- ("perm_device_information" . "\xe8a5")
- ("perm_identity" . "\xe8a6")
- ("perm_media" . "\xe8a7")
- ("perm_phone_msg" . "\xe8a8")
- ("perm_scan_wifi" . "\xe8a9")
- ("person" . "\xe7fd")
- ("person_add" . "\xe7fe")
- ("person_outline" . "\xe7ff")
- ("person_pin" . "\xe55a")
- ("person_pin_circle" . "\xe56a")
- ("personal_video" . "\xe63b")
- ("pets" . "\xe91d")
- ("phone" . "\xe0cd")
- ("phone_android" . "\xe324")
- ("phone_bluetooth_speaker" . "\xe61b")
- ("phone_forwarded" . "\xe61c")
- ("phone_in_talk" . "\xe61d")
- ("phone_iphone" . "\xe325")
- ("phone_locked" . "\xe61e")
- ("phone_missed" . "\xe61f")
- ("phone_paused" . "\xe620")
- ("phonelink" . "\xe326")
- ("phonelink_erase" . "\xe0db")
- ("phonelink_lock" . "\xe0dc")
- ("phonelink_off" . "\xe327")
- ("phonelink_ring" . "\xe0dd")
- ("phonelink_setup" . "\xe0de")
- ("photo" . "\xe410")
- ("photo_album" . "\xe411")
- ("photo_camera" . "\xe412")
- ("photo_filter" . "\xe43b")
- ("photo_library" . "\xe413")
- ("photo_size_select_actual" . "\xe432")
- ("photo_size_select_large" . "\xe433")
- ("photo_size_select_small" . "\xe434")
- ("picture_as_pdf" . "\xe415")
- ("picture_in_picture" . "\xe8aa")
- ("picture_in_picture_alt" . "\xe911")
- ("pie_chart" . "\xe6c4")
- ("pie_chart_outlined" . "\xe6c5")
- ("pin_drop" . "\xe55e")
- ("place" . "\xe55f")
- ("play_arrow" . "\xe037")
- ("play_circle_filled" . "\xe038")
- ("play_circle_outline" . "\xe039")
- ("play_for_work" . "\xe906")
- ("playlist_add" . "\xe03b")
- ("playlist_add_check" . "\xe065")
- ("playlist_play" . "\xe05f")
- ("plus_one" . "\xe800")
- ("poll" . "\xe801")
- ("polymer" . "\xe8ab")
- ("pool" . "\xeb48")
- ("portable_wifi_off" . "\xe0ce")
- ("portrait" . "\xe416")
- ("power" . "\xe63c")
- ("power_input" . "\xe336")
- ("power_settings_new" . "\xe8ac")
- ("pregnant_woman" . "\xe91e")
- ("present_to_all" . "\xe0df")
- ("print" . "\xe8ad")
- ("priority_high" . "\xe645")
- ("public" . "\xe80b")
- ("publish" . "\xe255")
- ("query_builder" . "\xe8ae")
- ("question_answer" . "\xe8af")
- ("queue" . "\xe03c")
- ("queue_music" . "\xe03d")
- ("queue_play_next" . "\xe066")
- ("radio" . "\xe03e")
- ("radio_button_checked" . "\xe837")
- ("radio_button_unchecked" . "\xe836")
- ("rate_review" . "\xe560")
- ("receipt" . "\xe8b0")
- ("recent_actors" . "\xe03f")
- ("record_voice_over" . "\xe91f")
- ("redeem" . "\xe8b1")
- ("redo" . "\xe15a")
- ("refresh" . "\xe5d5")
- ("remove" . "\xe15b")
- ("remove_circle" . "\xe15c")
- ("remove_circle_outline" . "\xe15d")
- ("remove_from_queue" . "\xe067")
- ("remove_red_eye" . "\xe417")
- ("remove_shopping_cart" . "\xe928")
- ("reorder" . "\xe8fe")
- ("repeat" . "\xe040")
- ("repeat_one" . "\xe041")
- ("replay" . "\xe042")
- ("replay_10" . "\xe059")
- ("replay_30" . "\xe05a")
- ("replay_5" . "\xe05b")
- ("reply" . "\xe15e")
- ("reply_all" . "\xe15f")
- ("report" . "\xe160")
- ("report_problem" . "\xe8b2")
- ("restaurant" . "\xe56c")
- ("restaurant_menu" . "\xe561")
- ("restore" . "\xe8b3")
- ("restore_page" . "\xe929")
- ("ring_volume" . "\xe0d1")
- ("room" . "\xe8b4")
- ("room_service" . "\xeb49")
- ("rotate_90_degrees_ccw" . "\xe418")
- ("rotate_left" . "\xe419")
- ("rotate_right" . "\xe41a")
- ("rounded_corner" . "\xe920")
- ("router" . "\xe328")
- ("rowing" . "\xe921")
- ("rss_feed" . "\xe0e5")
- ("rv_hookup" . "\xe642")
- ("satellite" . "\xe562")
- ("save" . "\xe161")
- ("scanner" . "\xe329")
- ("schedule" . "\xe8b5")
- ("school" . "\xe80c")
- ("screen_lock_landscape" . "\xe1be")
- ("screen_lock_portrait" . "\xe1bf")
- ("screen_lock_rotation" . "\xe1c0")
- ("screen_rotation" . "\xe1c1")
- ("screen_share" . "\xe0e2")
- ("sd_card" . "\xe623")
- ("sd_storage" . "\xe1c2")
- ("search" . "\xe8b6")
- ("security" . "\xe32a")
- ("select_all" . "\xe162")
- ("send" . "\xe163")
- ("sentiment_dissatisfied" . "\xe811")
- ("sentiment_neutral" . "\xe812")
- ("sentiment_satisfied" . "\xe813")
- ("sentiment_very_dissatisfied" . "\xe814")
- ("sentiment_very_satisfied" . "\xe815")
- ("settings" . "\xe8b8")
- ("settings_applications" . "\xe8b9")
- ("settings_backup_restore" . "\xe8ba")
- ("settings_bluetooth" . "\xe8bb")
- ("settings_brightness" . "\xe8bd")
- ("settings_cell" . "\xe8bc")
- ("settings_ethernet" . "\xe8be")
- ("settings_input_antenna" . "\xe8bf")
- ("settings_input_component" . "\xe8c0")
- ("settings_input_composite" . "\xe8c1")
- ("settings_input_hdmi" . "\xe8c2")
- ("settings_input_svideo" . "\xe8c3")
- ("settings_overscan" . "\xe8c4")
- ("settings_phone" . "\xe8c5")
- ("settings_power" . "\xe8c6")
- ("settings_remote" . "\xe8c7")
- ("settings_system_daydream" . "\xe1c3")
- ("settings_voice" . "\xe8c8")
- ("share" . "\xe80d")
- ("shop" . "\xe8c9")
- ("shop_two" . "\xe8ca")
- ("shopping_basket" . "\xe8cb")
- ("shopping_cart" . "\xe8cc")
- ("short_text" . "\xe261")
- ("show_chart" . "\xe6e1")
- ("shuffle" . "\xe043")
- ("signal_cellular_4_bar" . "\xe1c8")
- ("signal_cellular_connected_no_internet_4_bar" . "\xe1cd")
- ("signal_cellular_no_sim" . "\xe1ce")
- ("signal_cellular_null" . "\xe1cf")
- ("signal_cellular_off" . "\xe1d0")
- ("signal_wifi_4_bar" . "\xe1d8")
- ("signal_wifi_4_bar_lock" . "\xe1d9")
- ("signal_wifi_off" . "\xe1da")
- ("sim_card" . "\xe32b")
- ("sim_card_alert" . "\xe624")
- ("skip_next" . "\xe044")
- ("skip_previous" . "\xe045")
- ("slideshow" . "\xe41b")
- ("slow_motion_video" . "\xe068")
- ("smartphone" . "\xe32c")
- ("smoke_free" . "\xeb4a")
- ("smoking_rooms" . "\xeb4b")
- ("sms" . "\xe625")
- ("sms_failed" . "\xe626")
- ("snooze" . "\xe046")
- ("sort" . "\xe164")
- ("sort_by_alpha" . "\xe053")
- ("spa" . "\xeb4c")
- ("space_bar" . "\xe256")
- ("speaker" . "\xe32d")
- ("speaker_group" . "\xe32e")
- ("speaker_notes" . "\xe8cd")
- ("speaker_notes_off" . "\xe92a")
- ("speaker_phone" . "\xe0d2")
- ("spellcheck" . "\xe8ce")
- ("star" . "\xe838")
- ("star_border" . "\xe83a")
- ("star_half" . "\xe839")
- ("stars" . "\xe8d0")
- ("stay_current_landscape" . "\xe0d3")
- ("stay_current_portrait" . "\xe0d4")
- ("stay_primary_landscape" . "\xe0d5")
- ("stay_primary_portrait" . "\xe0d6")
- ("stop" . "\xe047")
- ("stop_screen_share" . "\xe0e3")
- ("storage" . "\xe1db")
- ("store" . "\xe8d1")
- ("store_mall_directory" . "\xe563")
- ("straighten" . "\xe41c")
- ("streetview" . "\xe56e")
- ("strikethrough_s" . "\xe257")
- ("style" . "\xe41d")
- ("subdirectory_arrow_left" . "\xe5d9")
- ("subdirectory_arrow_right" . "\xe5da")
- ("subject" . "\xe8d2")
- ("subscriptions" . "\xe064")
- ("subtitles" . "\xe048")
- ("subway" . "\xe56f")
- ("supervisor_account" . "\xe8d3")
- ("surround_sound" . "\xe049")
- ("swap_calls" . "\xe0d7")
- ("swap_horiz" . "\xe8d4")
- ("swap_vert" . "\xe8d5")
- ("swap_vertical_circle" . "\xe8d6")
- ("switch_camera" . "\xe41e")
- ("switch_video" . "\xe41f")
- ("sync" . "\xe627")
- ("sync_disabled" . "\xe628")
- ("sync_problem" . "\xe629")
- ("system_update" . "\xe62a")
- ("system_update_alt" . "\xe8d7")
- ("tab" . "\xe8d8")
- ("tab_unselected" . "\xe8d9")
- ("tablet" . "\xe32f")
- ("tablet_android" . "\xe330")
- ("tablet_mac" . "\xe331")
- ("tag_faces" . "\xe420")
- ("tap_and_play" . "\xe62b")
- ("terrain" . "\xe564")
- ("text_fields" . "\xe262")
- ("text_format" . "\xe165")
- ("textsms" . "\xe0d8")
- ("texture" . "\xe421")
- ("theaters" . "\xe8da")
- ("thumb_down" . "\xe8db")
- ("thumb_up" . "\xe8dc")
- ("thumbs_up_down" . "\xe8dd")
- ("time_to_leave" . "\xe62c")
- ("timelapse" . "\xe422")
- ("timeline" . "\xe922")
- ("timer" . "\xe425")
- ("timer_10" . "\xe423")
- ("timer_3" . "\xe424")
- ("timer_off" . "\xe426")
- ("title" . "\xe264")
- ("toc" . "\xe8de")
- ("today" . "\xe8df")
- ("toll" . "\xe8e0")
- ("tonality" . "\xe427")
- ("touch_app" . "\xe913")
- ("toys" . "\xe332")
- ("track_changes" . "\xe8e1")
- ("traffic" . "\xe565")
- ("train" . "\xe570")
- ("tram" . "\xe571")
- ("transfer_within_a_station" . "\xe572")
- ("transform" . "\xe428")
- ("translate" . "\xe8e2")
- ("trending_down" . "\xe8e3")
- ("trending_flat" . "\xe8e4")
- ("trending_up" . "\xe8e5")
- ("tune" . "\xe429")
- ("turned_in" . "\xe8e6")
- ("turned_in_not" . "\xe8e7")
- ("tv" . "\xe333")
- ("unarchive" . "\xe169")
- ("undo" . "\xe166")
- ("unfold_less" . "\xe5d6")
- ("unfold_more" . "\xe5d7")
- ("update" . "\xe923")
- ("usb" . "\xe1e0")
- ("verified_user" . "\xe8e8")
- ("vertical_align_bottom" . "\xe258")
- ("vertical_align_center" . "\xe259")
- ("vertical_align_top" . "\xe25a")
- ("vibration" . "\xe62d")
- ("video_call" . "\xe070")
- ("video_label" . "\xe071")
- ("video_library" . "\xe04a")
- ("videocam" . "\xe04b")
- ("videocam_off" . "\xe04c")
- ("videogame_asset" . "\xe338")
- ("view_agenda" . "\xe8e9")
- ("view_array" . "\xe8ea")
- ("view_carousel" . "\xe8eb")
- ("view_column" . "\xe8ec")
- ("view_comfy" . "\xe42a")
- ("view_compact" . "\xe42b")
- ("view_day" . "\xe8ed")
- ("view_headline" . "\xe8ee")
- ("view_list" . "\xe8ef")
- ("view_module" . "\xe8f0")
- ("view_quilt" . "\xe8f1")
- ("view_stream" . "\xe8f2")
- ("view_week" . "\xe8f3")
- ("vignette" . "\xe435")
- ("visibility" . "\xe8f4")
- ("visibility_off" . "\xe8f5")
- ("voice_chat" . "\xe62e")
- ("voicemail" . "\xe0d9")
- ("volume_down" . "\xe04d")
- ("volume_mute" . "\xe04e")
- ("volume_off" . "\xe04f")
- ("volume_up" . "\xe050")
- ("vpn_key" . "\xe0da")
- ("vpn_lock" . "\xe62f")
- ("wallpaper" . "\xe1bc")
- ("warning" . "\xe002")
- ("watch" . "\xe334")
- ("watch_later" . "\xe924")
- ("wb_auto" . "\xe42c")
- ("wb_cloudy" . "\xe42d")
- ("wb_incandescent" . "\xe42e")
- ("wb_iridescent" . "\xe436")
- ("wb_sunny" . "\xe430")
- ("wc" . "\xe63d")
- ("web" . "\xe051")
- ("web_asset" . "\xe069")
- ("weekend" . "\xe16b")
- ("whatshot" . "\xe80e")
- ("widgets" . "\xe1bd")
- ("wifi" . "\xe63e")
- ("wifi_lock" . "\xe1e1")
- ("wifi_tethering" . "\xe1e2")
- ("work" . "\xe8f9")
- ("wrap_text" . "\xe25b")
- ("youtube_searched_for" . "\xe8fa")
- ("zoom_in" . "\xe8ff")
- ("zoom_out" . "\xe900")
- ("zoom_out_map" . "\xe56b")))
-
- (provide 'data-material)
diff --git a/elpa/all-the-icons-20200730.1545/data/data-octicons.el b/elpa/all-the-icons-20200730.1545/data/data-octicons.el
deleted file mode 100644
index 432251e..0000000
--- a/elpa/all-the-icons-20200730.1545/data/data-octicons.el
+++ /dev/null
@@ -1,165 +0,0 @@
-(defvar all-the-icons-data/octicons-alist
- '(
-
- ("alert" . "\xf02d")
- ("arrow-down" . "\xf03f")
- ("arrow-left" . "\xf040")
- ("arrow-right" . "\xf03e")
- ("arrow-small-down" . "\xf0a0")
- ("arrow-small-left" . "\xf0a1")
- ("arrow-small-right" . "\xf071")
- ("arrow-small-up" . "\xf09f")
- ("arrow-up" . "\xf03d")
- ("book" . "\xf007")
- ("bookmark" . "\xf07b")
- ("briefcase" . "\xf0d3")
- ("broadcast" . "\xf048")
- ("browser" . "\xf0c5")
- ("bug" . "\xf091")
- ("calendar" . "\xf068")
- ("check" . "\xf03a")
- ("checklist" . "\xf076")
- ("chevron-down" . "\xf0a3")
- ("chevron-left" . "\xf0a4")
- ("chevron-right" . "\xf078")
- ("chevron-up" . "\xf0a2")
- ("circle-slash" . "\xf084")
- ("circuit-board" . "\xf0d6")
- ("clippy" . "\xf035")
- ("clock" . "\xf046")
- ("cloud-download" . "\xf00b")
- ("cloud-upload" . "\xf00c")
- ("code" . "\xf05f")
- ("comment" . "\xf02b")
- ("comment-discussion" . "\xf04f")
- ("credit-card" . "\xf045")
- ("dash" . "\xf0ca")
- ("dashboard" . "\xf07d")
- ("database" . "\xf096")
- ("device-camera" . "\xf056")
- ("device-camera-video" . "\xf057")
- ("device-desktop" . "\xf27c")
- ("device-mobile" . "\xf038")
- ("diff" . "\xf04d")
- ("diff-added" . "\xf06b")
- ("diff-ignored" . "\xf099")
- ("diff-modified" . "\xf06d")
- ("diff-removed" . "\xf06c")
- ("diff-renamed" . "\xf06e")
- ("ellipsis" . "\xf09a")
- ("eye" . "\xf04e")
- ("file-binary" . "\xf094")
- ("file-code" . "\xf010")
- ("file-directory" . "\xf016")
- ("file-media" . "\xf012")
- ("file-pdf" . "\xf014")
- ("file-submodule" . "\xf017")
- ("file-symlink-directory" . "\xf0b1")
- ("file-symlink-file" . "\xf0b0")
- ("file-text" . "\xf011")
- ("file-zip" . "\xf013")
- ("flame" . "\xf0d2")
- ("fold" . "\xf0cc")
- ("gear" . "\xf02f")
- ("gift" . "\xf042")
- ("gist" . "\xf00e")
- ("gist-secret" . "\xf08c")
- ("git-branch" . "\xf020")
- ("git-commit" . "\xf01f")
- ("git-compare" . "\xf0ac")
- ("git-merge" . "\xf023")
- ("git-pull-request" . "\xf009")
- ("globe" . "\xf0b6")
- ("graph" . "\xf043")
- ("beaker" . "\xf0dd")
- ("heart" . "\x2665")
- ("history" . "\xf07e")
- ("home" . "\xf08d")
- ("horizontal-rule" . "\xf070")
- ("hourglass" . "\xf09e")
- ("hubot" . "\xf09d")
- ("inbox" . "\xf0cf")
- ("info" . "\xf059")
- ("issue-closed" . "\xf028")
- ("issue-opened" . "\xf026")
- ("issue-reopened" . "\xf027")
- ("jersey" . "\xf019")
- ("key" . "\xf049")
- ("keyboard" . "\xf00d")
- ("law" . "\xf0d8")
- ("light-bulb" . "\xf000")
- ("link" . "\xf05c")
- ("link-external" . "\xf07f")
- ("list-ordered" . "\xf062")
- ("list-unordered" . "\xf061")
- ("location" . "\xf060")
- ("lock" . "\xf06a")
- ("logo-github" . "\xf092")
- ("mail" . "\xf03b")
- ("mail-read" . "\xf03c")
- ("mail-reply" . "\xf051")
- ("mark-github" . "\xf00a")
- ("markdown" . "\xf0c9")
- ("megaphone" . "\xf077")
- ("mention" . "\xf0be")
- ("milestone" . "\xf075")
- ("mirror" . "\xf024")
- ("mortar-board" . "\xf0d7")
- ("mute" . "\xf080")
- ("no-newline" . "\xf09c")
- ("octoface" . "\xf008")
- ("organization" . "\xf037")
- ("package" . "\xf0c4")
- ("paintcan" . "\xf0d1")
- ("pencil" . "\xf058")
- ("person" . "\xf018")
- ("pin" . "\xf041")
- ("plug" . "\xf0d4")
- ("plus" . "\xf05d")
- ("primitive-dot" . "\xf052")
- ("primitive-square" . "\xf053")
- ("pulse" . "\xf085")
- ("puzzle" . "\xf0c0")
- ("question" . "\xf02c")
- ("quote" . "\xf063")
- ("radio-tower" . "\xf030")
- ("repo" . "\xf001")
- ("repo-clone" . "\xf04c")
- ("repo-force-push" . "\xf04a")
- ("repo-forked" . "\xf002")
- ("repo-pull" . "\xf006")
- ("repo-push" . "\xf005")
- ("rocket" . "\xf033")
- ("rss" . "\xf034")
- ("ruby" . "\xf047")
- ("search" . "\xf02e")
- ("server" . "\xf097")
- ("settings" . "\xf07c")
- ("sign-in" . "\xf036")
- ("sign-out" . "\xf032")
- ("squirrel" . "\xf0b2")
- ("star" . "\xf02a")
- ("steps" . "\xf0c7")
- ("stop" . "\xf08f")
- ("sync" . "\xf087")
- ("tag" . "\xf015")
- ("telescope" . "\xf088")
- ("terminal" . "\xf0c8")
- ("three-bars" . "\xf05e")
- ("thumbsdown" . "\xf0db")
- ("thumbsup" . "\xf0da")
- ("tools" . "\xf031")
- ("trashcan" . "\xf0d0")
- ("triangle-down" . "\xf05b")
- ("triangle-left" . "\xf044")
- ("triangle-right" . "\xf05a")
- ("triangle-up" . "\xf0aa")
- ("unfold" . "\xf039")
- ("unmute" . "\xf0ba")
- ("versions" . "\xf064")
- ("x" . "\xf081")
- ("zap" . "\x26A1")
-
- ))
-
-(provide 'data-octicons)
diff --git a/elpa/all-the-icons-20200730.1545/data/data-weathericons.el b/elpa/all-the-icons-20200730.1545/data/data-weathericons.el
deleted file mode 100644
index 676581c..0000000
--- a/elpa/all-the-icons-20200730.1545/data/data-weathericons.el
+++ /dev/null
@@ -1,594 +0,0 @@
-(defvar all-the-icons-data/weather-icons-alist
- '(
-
- ("alien" . "\xf075")
- ("barometer" . "\xf079")
- ("celsius" . "\xf03c")
- ("cloud" . "\xf041")
- ("cloud-down" . "\xf03d")
- ("cloud-refresh" . "\xf03e")
- ("cloud-up" . "\xf040")
- ("cloudy" . "\xf013")
- ("cloudy-gusts" . "\xf011")
- ("cloudy-windy" . "\xf012")
- ("day-cloudy" . "\xf002")
- ("day-cloudy-gusts" . "\xf000")
- ("day-cloudy-high" . "\xf07d")
- ("day-cloudy-windy" . "\xf001")
- ("day-fog" . "\xf003")
- ("day-hail" . "\xf004")
- ("day-haze" . "\xf0b6")
- ("day-light-wind" . "\xf0c4")
- ("day-lightning" . "\xf005")
- ("day-rain" . "\xf008")
- ("day-rain-mix" . "\xf006")
- ("day-rain-wind" . "\xf007")
- ("day-showers" . "\xf009")
- ("day-sleet" . "\xf0b2")
- ("day-sleet-storm" . "\xf068")
- ("day-snow" . "\xf00a")
- ("day-snow-thunderstorm" . "\xf06b")
- ("day-snow-wind" . "\xf065")
- ("day-sprinkle" . "\xf00b")
- ("day-storm-showers" . "\xf00e")
- ("day-sunny" . "\xf00d")
- ("day-sunny-overcast" . "\xf00c")
- ("day-thunderstorm" . "\xf010")
- ("day-windy" . "\xf085")
- ("degrees" . "\xf042")
- ("direction-down" . "\xf044")
- ("direction-down-left" . "\xf043")
- ("direction-down-right" . "\xf088")
- ("direction-left" . "\xf048")
- ("direction-right" . "\xf04d")
- ("direction-up" . "\xf058")
- ("direction-up-left" . "\xf087")
- ("direction-up-right" . "\xf057")
- ("dust" . "\xf063")
- ("earthquake" . "\xf0c6")
- ("fahrenheit" . "\xf045")
- ("fire" . "\xf0c7")
- ("flood" . "\xf07c")
- ("fog" . "\xf014")
- ("forecast-io-clear-day" . "\xf00d")
- ("forecast-io-clear-night" . "\xf02e")
- ("forecast-io-cloudy" . "\xf013")
- ("forecast-io-fog" . "\xf014")
- ("forecast-io-hail" . "\xf015")
- ("forecast-io-partly-cloudy-day" . "\xf002")
- ("forecast-io-partly-cloudy-night" . "\xf031")
- ("forecast-io-rain" . "\xf019")
- ("forecast-io-sleet" . "\xf0b5")
- ("forecast-io-snow" . "\xf01b")
- ("forecast-io-thunderstorm" . "\xf01e")
- ("forecast-io-tornado" . "\xf056")
- ("forecast-io-wind" . "\xf050")
- ("gale-warning" . "\xf0cd")
- ("hail" . "\xf015")
- ("horizon" . "\xf047")
- ("horizon-alt" . "\xf046")
- ("hot" . "\xf072")
- ("humidity" . "\xf07a")
- ("hurricane" . "\xf073")
- ("hurricane-warning" . "\xf0cf")
- ("lightning" . "\xf016")
- ("lunar-eclipse" . "\xf070")
- ("meteor" . "\xf071")
- ("moon-0" . "\xf095")
- ("moon-1" . "\xf096")
- ("moon-10" . "\xf09f")
- ("moon-11" . "\xf0a0")
- ("moon-12" . "\xf0a1")
- ("moon-13" . "\xf0a2")
- ("moon-14" . "\xf0a3")
- ("moon-15" . "\xf0a4")
- ("moon-16" . "\xf0a5")
- ("moon-17" . "\xf0a6")
- ("moon-18" . "\xf0a7")
- ("moon-19" . "\xf0a8")
- ("moon-2" . "\xf097")
- ("moon-20" . "\xf0a9")
- ("moon-21" . "\xf0aa")
- ("moon-22" . "\xf0ab")
- ("moon-23" . "\xf0ac")
- ("moon-24" . "\xf0ad")
- ("moon-25" . "\xf0ae")
- ("moon-26" . "\xf0af")
- ("moon-27" . "\xf0b0")
- ("moon-3" . "\xf098")
- ("moon-4" . "\xf099")
- ("moon-5" . "\xf09a")
- ("moon-6" . "\xf09b")
- ("moon-7" . "\xf09c")
- ("moon-8" . "\xf09d")
- ("moon-9" . "\xf09e")
- ("moon-alt-first-quarter" . "\xf0d6")
- ("moon-alt-full" . "\xf0dd")
- ("moon-alt-new" . "\xf0eb")
- ("moon-alt-third-quarter" . "\xf0e4")
- ("moon-alt-waning-crescent-1" . "\xf0e5")
- ("moon-alt-waning-crescent-2" . "\xf0e6")
- ("moon-alt-waning-crescent-3" . "\xf0e7")
- ("moon-alt-waning-crescent-4" . "\xf0e8")
- ("moon-alt-waning-crescent-5" . "\xf0e9")
- ("moon-alt-waning-crescent-6" . "\xf0ea")
- ("moon-alt-waning-gibbous-1" . "\xf0de")
- ("moon-alt-waning-gibbous-2" . "\xf0df")
- ("moon-alt-waning-gibbous-3" . "\xf0e0")
- ("moon-alt-waning-gibbous-4" . "\xf0e1")
- ("moon-alt-waning-gibbous-5" . "\xf0e2")
- ("moon-alt-waning-gibbous-6" . "\xf0e3")
- ("moon-alt-waxing-crescent-1" . "\xf0d0")
- ("moon-alt-waxing-crescent-2" . "\xf0d1")
- ("moon-alt-waxing-crescent-3" . "\xf0d2")
- ("moon-alt-waxing-crescent-4" . "\xf0d3")
- ("moon-alt-waxing-crescent-5" . "\xf0d4")
- ("moon-alt-waxing-crescent-6" . "\xf0d5")
- ("moon-alt-waxing-gibbous-1" . "\xf0d7")
- ("moon-alt-waxing-gibbous-2" . "\xf0d8")
- ("moon-alt-waxing-gibbous-3" . "\xf0d9")
- ("moon-alt-waxing-gibbous-4" . "\xf0da")
- ("moon-alt-waxing-gibbous-5" . "\xf0db")
- ("moon-alt-waxing-gibbous-6" . "\xf0dc")
- ("moon-first-quarter" . "\xf09c")
- ("moon-full" . "\xf0a3")
- ("moon-new" . "\xf095")
- ("moon-third-quarter" . "\xf0aa")
- ("moon-waning-crescent-1" . "\xf0ab")
- ("moon-waning-crescent-2" . "\xf0ac")
- ("moon-waning-crescent-3" . "\xf0ad")
- ("moon-waning-crescent-4" . "\xf0ae")
- ("moon-waning-crescent-5" . "\xf0af")
- ("moon-waning-crescent-6" . "\xf0b0")
- ("moon-waning-gibbous-1" . "\xf0a4")
- ("moon-waning-gibbous-2" . "\xf0a5")
- ("moon-waning-gibbous-3" . "\xf0a6")
- ("moon-waning-gibbous-4" . "\xf0a7")
- ("moon-waning-gibbous-5" . "\xf0a8")
- ("moon-waning-gibbous-6" . "\xf0a9")
- ("moon-waxing-crescent-1" . "\xf096")
- ("moon-waxing-crescent-2" . "\xf097")
- ("moon-waxing-crescent-3" . "\xf098")
- ("moon-waxing-crescent-4" . "\xf099")
- ("moon-waxing-crescent-5" . "\xf09a")
- ("moon-waxing-crescent-6" . "\xf09b")
- ("moon-waxing-gibbous-1" . "\xf09d")
- ("moon-waxing-gibbous-2" . "\xf09e")
- ("moon-waxing-gibbous-3" . "\xf09f")
- ("moon-waxing-gibbous-4" . "\xf0a0")
- ("moon-waxing-gibbous-5" . "\xf0a1")
- ("moon-waxing-gibbous-6" . "\xf0a2")
- ("moonrise" . "\xf0c9")
- ("moonset" . "\xf0ca")
- ("na" . "\xf07b")
- ("night-alt-cloudy" . "\xf086")
- ("night-alt-cloudy-gusts" . "\xf022")
- ("night-alt-cloudy-high" . "\xf07e")
- ("night-alt-cloudy-windy" . "\xf023")
- ("night-alt-hail" . "\xf024")
- ("night-alt-lightning" . "\xf025")
- ("night-alt-partly-cloudy" . "\xf081")
- ("night-alt-rain" . "\xf028")
- ("night-alt-rain-mix" . "\xf026")
- ("night-alt-rain-wind" . "\xf027")
- ("night-alt-showers" . "\xf029")
- ("night-alt-sleet" . "\xf0b4")
- ("night-alt-sleet-storm" . "\xf06a")
- ("night-alt-snow" . "\xf02a")
- ("night-alt-snow-thunderstorm" . "\xf06d")
- ("night-alt-snow-wind" . "\xf067")
- ("night-alt-sprinkle" . "\xf02b")
- ("night-alt-storm-showers" . "\xf02c")
- ("night-alt-thunderstorm" . "\xf02d")
- ("night-clear" . "\xf02e")
- ("night-cloudy" . "\xf031")
- ("night-cloudy-gusts" . "\xf02f")
- ("night-cloudy-high" . "\xf080")
- ("night-cloudy-windy" . "\xf030")
- ("night-fog" . "\xf04a")
- ("night-hail" . "\xf032")
- ("night-lightning" . "\xf033")
- ("night-partly-cloudy" . "\xf083")
- ("night-rain" . "\xf036")
- ("night-rain-mix" . "\xf034")
- ("night-rain-wind" . "\xf035")
- ("night-showers" . "\xf037")
- ("night-sleet" . "\xf0b3")
- ("night-sleet-storm" . "\xf069")
- ("night-snow" . "\xf038")
- ("night-snow-thunderstorm" . "\xf06c")
- ("night-snow-wind" . "\xf066")
- ("night-sprinkle" . "\xf039")
- ("night-storm-showers" . "\xf03a")
- ("night-thunderstorm" . "\xf03b")
- ("owm-200" . "\xf01e")
- ("owm-201" . "\xf01e")
- ("owm-202" . "\xf01e")
- ("owm-210" . "\xf016")
- ("owm-211" . "\xf016")
- ("owm-212" . "\xf016")
- ("owm-221" . "\xf016")
- ("owm-230" . "\xf01e")
- ("owm-231" . "\xf01e")
- ("owm-232" . "\xf01e")
- ("owm-300" . "\xf01c")
- ("owm-301" . "\xf01c")
- ("owm-302" . "\xf019")
- ("owm-310" . "\xf017")
- ("owm-311" . "\xf019")
- ("owm-312" . "\xf019")
- ("owm-313" . "\xf01a")
- ("owm-314" . "\xf019")
- ("owm-321" . "\xf01c")
- ("owm-500" . "\xf01c")
- ("owm-501" . "\xf019")
- ("owm-502" . "\xf019")
- ("owm-503" . "\xf019")
- ("owm-504" . "\xf019")
- ("owm-511" . "\xf017")
- ("owm-520" . "\xf01a")
- ("owm-521" . "\xf01a")
- ("owm-522" . "\xf01a")
- ("owm-531" . "\xf01d")
- ("owm-600" . "\xf01b")
- ("owm-601" . "\xf01b")
- ("owm-602" . "\xf0b5")
- ("owm-611" . "\xf017")
- ("owm-612" . "\xf017")
- ("owm-615" . "\xf017")
- ("owm-616" . "\xf017")
- ("owm-620" . "\xf017")
- ("owm-621" . "\xf01b")
- ("owm-622" . "\xf01b")
- ("owm-701" . "\xf01a")
- ("owm-711" . "\xf062")
- ("owm-721" . "\xf0b6")
- ("owm-731" . "\xf063")
- ("owm-741" . "\xf014")
- ("owm-761" . "\xf063")
- ("owm-762" . "\xf063")
- ("owm-771" . "\xf011")
- ("owm-781" . "\xf056")
- ("owm-800" . "\xf00d")
- ("owm-801" . "\xf011")
- ("owm-802" . "\xf011")
- ("owm-803" . "\xf012")
- ("owm-804" . "\xf013")
- ("owm-900" . "\xf056")
- ("owm-901" . "\xf01d")
- ("owm-902" . "\xf073")
- ("owm-903" . "\xf076")
- ("owm-904" . "\xf072")
- ("owm-905" . "\xf021")
- ("owm-906" . "\xf015")
- ("owm-957" . "\xf050")
- ("owm-day-200" . "\xf010")
- ("owm-day-201" . "\xf010")
- ("owm-day-202" . "\xf010")
- ("owm-day-210" . "\xf005")
- ("owm-day-211" . "\xf005")
- ("owm-day-212" . "\xf005")
- ("owm-day-221" . "\xf005")
- ("owm-day-230" . "\xf010")
- ("owm-day-231" . "\xf010")
- ("owm-day-232" . "\xf010")
- ("owm-day-300" . "\xf00b")
- ("owm-day-301" . "\xf00b")
- ("owm-day-302" . "\xf008")
- ("owm-day-310" . "\xf008")
- ("owm-day-311" . "\xf008")
- ("owm-day-312" . "\xf008")
- ("owm-day-313" . "\xf008")
- ("owm-day-314" . "\xf008")
- ("owm-day-321" . "\xf00b")
- ("owm-day-500" . "\xf00b")
- ("owm-day-501" . "\xf008")
- ("owm-day-502" . "\xf008")
- ("owm-day-503" . "\xf008")
- ("owm-day-504" . "\xf008")
- ("owm-day-511" . "\xf006")
- ("owm-day-520" . "\xf009")
- ("owm-day-521" . "\xf009")
- ("owm-day-522" . "\xf009")
- ("owm-day-531" . "\xf00e")
- ("owm-day-600" . "\xf00a")
- ("owm-day-601" . "\xf0b2")
- ("owm-day-602" . "\xf00a")
- ("owm-day-611" . "\xf006")
- ("owm-day-612" . "\xf006")
- ("owm-day-615" . "\xf006")
- ("owm-day-616" . "\xf006")
- ("owm-day-620" . "\xf006")
- ("owm-day-621" . "\xf00a")
- ("owm-day-622" . "\xf00a")
- ("owm-day-701" . "\xf009")
- ("owm-day-711" . "\xf062")
- ("owm-day-721" . "\xf0b6")
- ("owm-day-731" . "\xf063")
- ("owm-day-741" . "\xf003")
- ("owm-day-761" . "\xf063")
- ("owm-day-762" . "\xf063")
- ("owm-day-781" . "\xf056")
- ("owm-day-800" . "\xf00d")
- ("owm-day-801" . "\xf000")
- ("owm-day-802" . "\xf000")
- ("owm-day-803" . "\xf000")
- ("owm-day-804" . "\xf00c")
- ("owm-day-900" . "\xf056")
- ("owm-day-902" . "\xf073")
- ("owm-day-903" . "\xf076")
- ("owm-day-904" . "\xf072")
- ("owm-day-906" . "\xf004")
- ("owm-day-957" . "\xf050")
- ("owm-night-200" . "\xf02d")
- ("owm-night-201" . "\xf02d")
- ("owm-night-202" . "\xf02d")
- ("owm-night-210" . "\xf025")
- ("owm-night-211" . "\xf025")
- ("owm-night-212" . "\xf025")
- ("owm-night-221" . "\xf025")
- ("owm-night-230" . "\xf02d")
- ("owm-night-231" . "\xf02d")
- ("owm-night-232" . "\xf02d")
- ("owm-night-300" . "\xf02b")
- ("owm-night-301" . "\xf02b")
- ("owm-night-302" . "\xf028")
- ("owm-night-310" . "\xf028")
- ("owm-night-311" . "\xf028")
- ("owm-night-312" . "\xf028")
- ("owm-night-313" . "\xf028")
- ("owm-night-314" . "\xf028")
- ("owm-night-321" . "\xf02b")
- ("owm-night-500" . "\xf02b")
- ("owm-night-501" . "\xf028")
- ("owm-night-502" . "\xf028")
- ("owm-night-503" . "\xf028")
- ("owm-night-504" . "\xf028")
- ("owm-night-511" . "\xf026")
- ("owm-night-520" . "\xf029")
- ("owm-night-521" . "\xf029")
- ("owm-night-522" . "\xf029")
- ("owm-night-531" . "\xf02c")
- ("owm-night-600" . "\xf02a")
- ("owm-night-601" . "\xf0b4")
- ("owm-night-602" . "\xf02a")
- ("owm-night-611" . "\xf026")
- ("owm-night-612" . "\xf026")
- ("owm-night-615" . "\xf026")
- ("owm-night-616" . "\xf026")
- ("owm-night-620" . "\xf026")
- ("owm-night-621" . "\xf02a")
- ("owm-night-622" . "\xf02a")
- ("owm-night-701" . "\xf029")
- ("owm-night-711" . "\xf062")
- ("owm-night-721" . "\xf0b6")
- ("owm-night-731" . "\xf063")
- ("owm-night-741" . "\xf04a")
- ("owm-night-761" . "\xf063")
- ("owm-night-762" . "\xf063")
- ("owm-night-781" . "\xf056")
- ("owm-night-800" . "\xf02e")
- ("owm-night-801" . "\xf022")
- ("owm-night-802" . "\xf022")
- ("owm-night-803" . "\xf022")
- ("owm-night-804" . "\xf086")
- ("owm-night-900" . "\xf056")
- ("owm-night-902" . "\xf073")
- ("owm-night-903" . "\xf076")
- ("owm-night-904" . "\xf072")
- ("owm-night-906" . "\xf024")
- ("owm-night-957" . "\xf050")
- ("rain" . "\xf019")
- ("rain-mix" . "\xf017")
- ("rain-wind" . "\xf018")
- ("raindrop" . "\xf078")
- ("raindrops" . "\xf04e")
- ("refresh" . "\xf04c")
- ("refresh-alt" . "\xf04b")
- ("sandstorm" . "\xf082")
- ("showers" . "\xf01a")
- ("sleet" . "\xf0b5")
- ("small-craft-advisory" . "\xf0cc")
- ("smog" . "\xf074")
- ("smoke" . "\xf062")
- ("snow" . "\xf01b")
- ("snow" . "\xf01b")
- ("snow-wind" . "\xf064")
- ("snowflake-cold" . "\xf076")
- ("solar-eclipse" . "\xf06e")
- ("sprinkle" . "\xf01c")
- ("stars" . "\xf077")
- ("storm-showers" . "\xf01d")
- ("storm-showers" . "\xf01d")
- ("storm-warning" . "\xf0ce")
- ("strong-wind" . "\xf050")
- ("sunrise" . "\xf051")
- ("sunset" . "\xf052")
- ("thermometer" . "\xf055")
- ("thermometer-exterior" . "\xf053")
- ("thermometer-internal" . "\xf054")
- ("thunderstorm" . "\xf01e")
- ("thunderstorm" . "\xf01e")
- ("time-1" . "\xf08a")
- ("time-10" . "\xf093")
- ("time-11" . "\xf094")
- ("time-12" . "\xf089")
- ("time-2" . "\xf08b")
- ("time-3" . "\xf08c")
- ("time-4" . "\xf08d")
- ("time-5" . "\xf08e")
- ("time-6" . "\xf08f")
- ("time-7" . "\xf090")
- ("time-8" . "\xf091")
- ("time-9" . "\xf092")
- ("tornado" . "\xf056")
- ("train" . "\xf0cb")
- ("tsunami" . "\xf0c5")
- ("umbrella" . "\xf084")
- ("volcano" . "\xf0c8")
- ("wind-beaufort-0" . "\xf0b7")
- ("wind-beaufort-1" . "\xf0b8")
- ("wind-beaufort-10" . "\xf0c1")
- ("wind-beaufort-11" . "\xf0c2")
- ("wind-beaufort-12" . "\xf0c3")
- ("wind-beaufort-2" . "\xf0b9")
- ("wind-beaufort-3" . "\xf0ba")
- ("wind-beaufort-4" . "\xf0bb")
- ("wind-beaufort-5" . "\xf0bc")
- ("wind-beaufort-6" . "\xf0bd")
- ("wind-beaufort-7" . "\xf0be")
- ("wind-beaufort-8" . "\xf0bf")
- ("wind-beaufort-9" . "\xf0c0")
- ("wind-direction" . "\xf0b1")
- ("windy" . "\xf021")
- ("wmo4680-00" . "\xf055")
- ("wmo4680-01" . "\xf013")
- ("wmo4680-02" . "\xf055")
- ("wmo4680-03" . "\xf013")
- ("wmo4680-04" . "\xf014")
- ("wmo4680-05" . "\xf014")
- ("wmo4680-10" . "\xf014")
- ("wmo4680-11" . "\xf014")
- ("wmo4680-12" . "\xf016")
- ("wmo4680-18" . "\xf050")
- ("wmo4680-20" . "\xf014")
- ("wmo4680-21" . "\xf017")
- ("wmo4680-22" . "\xf017")
- ("wmo4680-23" . "\xf019")
- ("wmo4680-24" . "\xf01b")
- ("wmo4680-25" . "\xf015")
- ("wmo4680-26" . "\xf01e")
- ("wmo4680-27" . "\xf063")
- ("wmo4680-28" . "\xf063")
- ("wmo4680-29" . "\xf063")
- ("wmo4680-30" . "\xf014")
- ("wmo4680-31" . "\xf014")
- ("wmo4680-32" . "\xf014")
- ("wmo4680-33" . "\xf014")
- ("wmo4680-34" . "\xf014")
- ("wmo4680-35" . "\xf014")
- ("wmo4680-40" . "\xf017")
- ("wmo4680-41" . "\xf01c")
- ("wmo4680-42" . "\xf019")
- ("wmo4680-43" . "\xf01c")
- ("wmo4680-44" . "\xf019")
- ("wmo4680-45" . "\xf015")
- ("wmo4680-46" . "\xf015")
- ("wmo4680-47" . "\xf01b")
- ("wmo4680-48" . "\xf01b")
- ("wmo4680-50" . "\xf01c")
- ("wmo4680-51" . "\xf01c")
- ("wmo4680-52" . "\xf019")
- ("wmo4680-53" . "\xf019")
- ("wmo4680-54" . "\xf076")
- ("wmo4680-55" . "\xf076")
- ("wmo4680-56" . "\xf076")
- ("wmo4680-57" . "\xf01c")
- ("wmo4680-58" . "\xf019")
- ("wmo4680-60" . "\xf01c")
- ("wmo4680-61" . "\xf01c")
- ("wmo4680-62" . "\xf019")
- ("wmo4680-63" . "\xf019")
- ("wmo4680-64" . "\xf015")
- ("wmo4680-65" . "\xf015")
- ("wmo4680-66" . "\xf015")
- ("wmo4680-67" . "\xf017")
- ("wmo4680-68" . "\xf017")
- ("wmo4680-70" . "\xf01b")
- ("wmo4680-71" . "\xf01b")
- ("wmo4680-72" . "\xf01b")
- ("wmo4680-73" . "\xf01b")
- ("wmo4680-74" . "\xf076")
- ("wmo4680-75" . "\xf076")
- ("wmo4680-76" . "\xf076")
- ("wmo4680-77" . "\xf01b")
- ("wmo4680-78" . "\xf076")
- ("wmo4680-80" . "\xf019")
- ("wmo4680-81" . "\xf01c")
- ("wmo4680-82" . "\xf019")
- ("wmo4680-83" . "\xf019")
- ("wmo4680-84" . "\xf01d")
- ("wmo4680-85" . "\xf017")
- ("wmo4680-86" . "\xf017")
- ("wmo4680-87" . "\xf017")
- ("wmo4680-89" . "\xf015")
- ("wmo4680-90" . "\xf016")
- ("wmo4680-91" . "\xf01d")
- ("wmo4680-92" . "\xf01e")
- ("wmo4680-93" . "\xf01e")
- ("wmo4680-94" . "\xf016")
- ("wmo4680-95" . "\xf01e")
- ("wmo4680-96" . "\xf01e")
- ("wmo4680-99" . "\xf056")
- ("wu-chanceflurries" . "\xf064")
- ("wu-chancerain" . "\xf019")
- ("wu-chancesleat" . "\xf0b5")
- ("wu-chancesnow" . "\xf01b")
- ("wu-chancetstorms" . "\xf01e")
- ("wu-clear" . "\xf00d")
- ("wu-cloudy" . "\xf002")
- ("wu-flurries" . "\xf064")
- ("wu-hazy" . "\xf0b6")
- ("wu-mostlycloudy" . "\xf002")
- ("wu-mostlysunny" . "\xf00d")
- ("wu-partlycloudy" . "\xf002")
- ("wu-partlysunny" . "\xf00d")
- ("wu-rain" . "\xf01a")
- ("wu-sleat" . "\xf0b5")
- ("wu-snow" . "\xf01b")
- ("wu-sunny" . "\xf00d")
- ("wu-tstorms" . "\xf01e")
- ("wu-unknown" . "\xf00d")
- ("yahoo-0" . "\xf056")
- ("yahoo-1" . "\xf00e")
- ("yahoo-10" . "\xf015")
- ("yahoo-11" . "\xf01a")
- ("yahoo-12" . "\xf01a")
- ("yahoo-13" . "\xf01b")
- ("yahoo-14" . "\xf00a")
- ("yahoo-15" . "\xf064")
- ("yahoo-16" . "\xf01b")
- ("yahoo-17" . "\xf015")
- ("yahoo-18" . "\xf017")
- ("yahoo-19" . "\xf063")
- ("yahoo-2" . "\xf073")
- ("yahoo-20" . "\xf014")
- ("yahoo-21" . "\xf021")
- ("yahoo-22" . "\xf062")
- ("yahoo-23" . "\xf050")
- ("yahoo-24" . "\xf050")
- ("yahoo-25" . "\xf076")
- ("yahoo-26" . "\xf013")
- ("yahoo-27" . "\xf031")
- ("yahoo-28" . "\xf002")
- ("yahoo-29" . "\xf031")
- ("yahoo-3" . "\xf01e")
- ("yahoo-30" . "\xf002")
- ("yahoo-31" . "\xf02e")
- ("yahoo-32" . "\xf00d")
- ("yahoo-3200" . "\xf077")
- ("yahoo-33" . "\xf083")
- ("yahoo-34" . "\xf00c")
- ("yahoo-35" . "\xf017")
- ("yahoo-36" . "\xf072")
- ("yahoo-37" . "\xf00e")
- ("yahoo-38" . "\xf00e")
- ("yahoo-39" . "\xf00e")
- ("yahoo-4" . "\xf01e")
- ("yahoo-40" . "\xf01a")
- ("yahoo-41" . "\xf064")
- ("yahoo-42" . "\xf01b")
- ("yahoo-43" . "\xf064")
- ("yahoo-44" . "\xf00c")
- ("yahoo-45" . "\xf00e")
- ("yahoo-46" . "\xf01b")
- ("yahoo-47" . "\xf00e")
- ("yahoo-5" . "\xf017")
- ("yahoo-6" . "\xf017")
- ("yahoo-7" . "\xf017")
- ("yahoo-8" . "\xf015")
- ("yahoo-9" . "\xf01a")
-
- ))
-
-(provide 'data-weathericons)
diff --git a/elpa/archives/gnu/archive-contents b/elpa/archives/gnu/archive-contents
deleted file mode 100644
index fd00b6a..0000000
--- a/elpa/archives/gnu/archive-contents
+++ /dev/null
@@ -1,2491 +0,0 @@
-(1
- (ace-window .
- [(0 9 0)
- ((avy
- (0 2 0)))
- "Quickly switch windows." single
- ((:keywords "window" "location")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:url . "https://github.com/abo-abo/ace-window"))])
- (ack .
- [(1 10)
- nil "interface to ack-like tools" tar
- ((:url . "https://github.com/leoliu/ack-el")
- (:maintainer "João Távora" . "joaotavora@gmail.com")
- (:authors
- ("Leo Liu" . "sdl.web@gmail.com"))
- (:keywords "tools" "processes" "convenience"))])
- (ada-mode .
- [(7 1 3)
- ((uniquify-files
- (1 0 1))
- (wisi
- (3 1 2))
- (emacs
- (25 0)))
- "major-mode for editing Ada sources" tar
- ((:url . "http://www.nongnu.org/ada-mode/")
- (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
- (:authors
- ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
- (:keywords "languages" "ada"))])
- (ada-ref-man .
- [(2020 1)
- nil "Ada Reference Manual 2012" tar
- ((:url . "http://stephe-leake.org/ada/arm.html")
- (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org")
- (:authors
- ("Stephen Leake" . "stephen_leake@member.fsf.org"))
- (:keywords "languages" "ada"))])
- (adaptive-wrap .
- [(0 7)
- nil "Smart line-wrapping with wrap-prefix" single
- ((:url . "http://elpa.gnu.org/packages/adaptive-wrap.html")
- (:authors
- ("Stephen Berman" . "stephen.berman@gmx.net")
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stephen Berman" . "stephen.berman@gmx.net"))])
- (adjust-parens .
- [(3 1)
- nil "Indent and dedent Lisp code, automatically adjust close parens" tar
- ((:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com")
- (:authors
- ("Barry O'Reilly" . "gundaetiapo@gmail.com"))
- (:url . "http://elpa.gnu.org/packages/adjust-parens.html"))])
- (advice-patch .
- [(0 1)
- ((emacs
- (24 4)))
- "Use patches to advise the inside of functions" single
- ((:url . "http://elpa.gnu.org/packages/advice-patch.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (aggressive-indent .
- [(1 8 3)
- ((emacs
- (24 1))
- (cl-lib
- (0 5)))
- "Minor mode to aggressively keep your code always indented" single
- ((:keywords "indent" "lisp" "maint" "tools")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/aggressive-indent-mode"))])
- (ahungry-theme .
- [(1 10 0)
- ((emacs
- (24)))
- "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." tar
- ((:url . "https://github.com/ahungry/color-theme-ahungry")
- (:maintainer "Matthew Carter" . "m@ahungry.com")
- (:authors
- ("Matthew Carter" . "m@ahungry.com"))
- (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme"))])
- (all .
- [(1 0)
- nil "Edit all lines matching a given regexp" single
- ((:url . "http://elpa.gnu.org/packages/all.html")
- (:keywords "matching")
- (:authors
- ("Per Abrahamsen" . "abraham@dina.kvl.dk"))
- (:maintainer "Per Abrahamsen" . "abraham@dina.kvl.dk"))])
- (ampc .
- [(0 2)
- nil "Asynchronous Music Player Controller" single
- ((:url . "http://elpa.gnu.org/packages/ampc.html")
- (:keywords "ampc" "mpc" "mpd")
- (:authors
- ("Christopher Schmidt" . "christopher@ch.ristopher.com"))
- (:maintainer nil . "emacs-devel@gnu.org"))])
- (arbitools .
- [(0 977)
- ((cl-lib
- (0 5)))
- "Package for chess tournaments administration" single
- ((:url . "http://elpa.gnu.org/packages/arbitools.html")
- (:authors
- ("David Gonzalez Gandara" . "dggandara@member.fsf.org"))
- (:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org"))])
- (ascii-art-to-unicode .
- [(1 12)
- nil "a small artist adjunct" single
- ((:keywords "ascii" "unicode" "box-drawing")
- (:authors
- ("Thien-Thi Nguyen" . "ttn@gnu.org"))
- (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org")
- (:url . "http://www.gnuvola.org/software/aa2u/"))])
- (async .
- [(1 9 3)
- ((cl-lib
- (0 5))
- (nadvice
- (0 3)))
- "Asynchronous processing in Emacs" tar
- ((:url . "https://github.com/jwiegley/emacs-async")
- (:maintainer "John Wiegley" . "jwiegley@gmail.com")
- (:authors
- ("John Wiegley" . "jwiegley@gmail.com"))
- (:keywords "async"))])
- (auctex .
- [(12 2 4)
- ((emacs
- (24 1))
- (cl-lib
- (0 5)))
- "Integrated environment for *TeX*" tar
- ((:url . "http://www.gnu.org/software/auctex/")
- (:maintainer nil . "auctex-devel@gnu.org")
- (:keywords "tex" "latex" "texinfo" "context" "doctex" "preview-latex"))])
- (aumix-mode .
- [(7)
- nil "run the aumix program in a buffer" single
- ((:keywords "multimedia" "mixer" "aumix")
- (:authors
- ("Kevin Ryde" . "user42_kevin@yahoo.com.au"))
- (:maintainer "Kevin Ryde" . "user42_kevin@yahoo.com.au")
- (:url . "http://user42.tuxfamily.org/aumix-mode/index.html"))])
- (auto-correct .
- [(1 1 4)
- nil "Remembers and automatically fixes past corrections" single
- ((:url . "http://elpa.gnu.org/packages/auto-correct.html")
- (:keywords "editing")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:maintainer "Ian Dunn" . "dunni@gnu.org"))])
- (auto-overlays .
- [(0 10 9)
- nil "Automatic regexp-delimited overlays" tar
- ((:url . "http://www.dr-qubit.org/emacs.php")
- (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
- (:authors
- ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
- (:keywords "extensions"))])
- (avy .
- [(0 5 0)
- ((emacs
- (24 1))
- (cl-lib
- (0 5)))
- "Jump to arbitrary positions in visible text and select text quickly." tar
- ((:url . "https://github.com/abo-abo/avy")
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:keywords "point" "location"))])
- (bbdb .
- [(3 2)
- ((emacs
- (24)))
- "core of BBDB" tar
- ((:maintainer "Roland Winkler" . "winkler@gnu.org")
- (:url . "http://elpa.gnu.org/packages/bbdb.html"))])
- (beacon .
- [(1 3 3)
- ((seq
- (2 14)))
- "Highlight the cursor whenever the window scrolls" single
- ((:keywords "convenience")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/beacon"))])
- (bluetooth .
- [(0 1 2)
- ((emacs
- (25 1))
- (dash
- (2 12 0)))
- "A Major mode for Bluetooth devices" single
- ((:keywords "hardware")
- (:authors
- ("Raffael Stocker" . "r.stocker@mnet-mail.de"))
- (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de")
- (:url . "https://gitlab.com/rstocker/emacs-bluetooth"))])
- (bnf-mode .
- [(0 4 4)
- ((cl-lib
- (0 5))
- (emacs
- (24 3)))
- "Major mode for editing BNF grammars." tar
- ((:url . "https://github.com/sergeyklay/bnf-mode")
- (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch")
- (:authors
- ("Serghei Iakovlev" . "egrep@protonmail.ch"))
- (:keywords "languages"))])
- (brief .
- [(5 87)
- nil "Brief Editor Emulator (Brief Mode)" tar
- ((:maintainer "Luke Lee" . "luke.yx.lee@gmail.com")
- (:authors
- ("Luke Lee" . "luke.yx.lee@gmail.com"))
- (:keywords "brief" "emulations" "crisp")
- (:url . "http://elpa.gnu.org/packages/brief.html"))])
- (buffer-expose .
- [(0 4 3)
- ((emacs
- (25))
- (cl-lib
- (0 5)))
- "Visual buffer switching using a window grid" single
- ((:keywords "convenience")
- (:authors
- ("Clemens Radermacher" . "clemera@posteo.net"))
- (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
- (:url . "https://github.com/clemera/buffer-expose"))])
- (bug-hunter .
- [(1 3 1)
- ((seq
- (1 3))
- (cl-lib
- (0 5)))
- "Hunt down errors by bisecting elisp files" single
- ((:keywords "lisp")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/elisp-bug-hunter"))])
- (caps-lock .
- [(1 0)
- nil "Caps-lock as a minor mode" single
- ((:url . "http://elpa.gnu.org/packages/caps-lock.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (captain .
- [(1 0 3)
- nil "CAPiTalization is Automatic IN emacs" single
- ((:url . "http://elpa.gnu.org/packages/captain.html")
- (:keywords "editing")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:maintainer "Ian Dunn" . "dunni@gnu.org"))])
- (chess .
- [(2 0 4)
- ((cl-lib
- (0 5)))
- "Play chess in GNU Emacs" tar
- ((:maintainer "Mario Lang" . "mlang@delysid.org")
- (:authors
- ("John Wiegley" . "johnw@gnu.org"))
- (:keywords "games")
- (:url . "http://elpa.gnu.org/packages/chess.html"))])
- (cl-generic .
- [(0 3)
- nil "Forward cl-generic compatibility for Emacs<25" single
- ((:url . "http://elpa.gnu.org/packages/cl-generic.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (cl-lib .
- [(0 6 1)
- nil "Forward cl-lib compatibility library for Emacs<24.3" single
- ((:url . "http://elpa.gnu.org/packages/cl-lib.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (cl-print .
- [(1 0)
- ((emacs
- (25)))
- "CL-style generic printing" single
- ((:url . "http://elpa.gnu.org/packages/cl-print.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (clipboard-collector .
- [(0 2)
- ((emacs
- (25)))
- "Collect clipboard entries according to regex rules" single
- ((:keywords "convenience")
- (:authors
- ("Clemens Radermacher" . "clemera@posteo.net"))
- (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
- (:url . "https://github.com/clemera/clipboard-collector"))])
- (cobol-mode .
- [(1 0 0)
- ((cl-lib
- (0 5)))
- "Mode for editing COBOL code" single
- ((:url . "http://elpa.gnu.org/packages/cobol-mode.html")
- (:keywords "languages")
- (:authors
- ("Edward Hart" . "edward.dan.hart@gmail.com"))
- (:maintainer "Edward Hart" . "edward.dan.hart@gmail.com"))])
- (coffee-mode .
- [(0 4 1 1)
- nil "Major mode for CoffeeScript files" single
- ((:keywords "coffeescript" "major" "mode")
- (:authors
- ("Chris Wanstrath" . "chris@ozmm.org"))
- (:maintainer "Chris Wanstrath" . "chris@ozmm.org")
- (:url . "http://github.com/defunkt/coffee-mode"))])
- (compact-docstrings .
- [(0 1)
- nil "Shrink blank lines in docstrings and doc comments" single
- ((:keywords "convenience" "faces" "lisp" "maint" "c")
- (:authors
- ("Clément Pit-Claudel" . "clement.pitclaudel@live.com"))
- (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com")
- (:url . "https://github.com/cpitclaudel/compact-docstrings"))])
- (company .
- [(0 9 13)
- ((emacs
- (24 3)))
- "Modular text completion framework" tar
- ((:url . "http://company-mode.github.io/")
- (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru")
- (:authors
- ("Nikolaj Schumacher"))
- (:keywords "abbrev" "convenience" "matching"))])
- (company-ebdb .
- [(1 1)
- ((company
- (0 9 4))
- (ebdb
- (0 2)))
- "company-mode completion backend for EBDB in message-mode" single
- ((:url . "http://elpa.gnu.org/packages/company-ebdb.html")
- (:authors
- ("Jan Tatarik" . "jan.tatarik@gmail.com"))
- (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))])
- (company-math .
- [(1 3)
- ((company
- (0 8 0))
- (math-symbol-lists
- (1 2)))
- "Completion backends for unicode math symbols and latex tags" tar
- ((:url . "https://github.com/vspinu/company-math")
- (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com")
- (:authors
- ("Vitalie Spinu" . "spinuvit@gmail.com"))
- (:keywords "unicode" "symbols" "completion"))])
- (company-statistics .
- [(0 2 3)
- ((emacs
- (24 3))
- (company
- (0 8 5)))
- "Sort candidates using completion history" tar
- ((:url . "https://github.com/company-mode/company-statistics")
- (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com")
- (:authors
- ("Ingo Lohmar" . "i.lohmar@gmail.com"))
- (:keywords "abbrev" "convenience" "matching"))])
- (context-coloring .
- [(8 1 0)
- ((emacs
- (24 3)))
- "Highlight by scope" tar
- ((:url . "https://github.com/jacksonrayhamilton/context-coloring")
- (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")
- (:authors
- ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com"))
- (:keywords "convenience" "faces" "tools"))])
- (counsel .
- [(0 13 1)
- ((emacs
- (24 5))
- (swiper
- (0 13 1)))
- "Various completion functions using Ivy" single
- ((:keywords "convenience" "matching" "tools")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:url . "https://github.com/abo-abo/swiper"))])
- (crisp .
- [(1 3 6)
- nil "CRiSP/Brief Emacs emulator" single
- ((:url . "http://elpa.gnu.org/packages/crisp.html")
- (:keywords "emulations" "brief" "crisp")
- (:authors
- ("Gary D. Foster" . "Gary.Foster@Corp.Sun.COM"))
- (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com"))])
- (csv-mode .
- [(1 12)
- ((emacs
- (24 1))
- (cl-lib
- (0 5)))
- "Major mode for editing comma/char separated values" tar
- ((:maintainer nil . "emacs-devel@gnu.org")
- (:authors
- ("\"Francis J. Wright\"" . "F.J.Wright@qmul.ac.uk"))
- (:keywords "convenience")
- (:url . "http://elpa.gnu.org/packages/csv-mode.html"))])
- (cycle-quotes .
- [(0 1)
- nil "Cycle between quote styles" tar
- ((:maintainer "Simen Heggestøyl" . "simenheg@gmail.com")
- (:authors
- ("Simen Heggestøyl" . "simenheg@gmail.com"))
- (:keywords "convenience")
- (:url . "http://elpa.gnu.org/packages/cycle-quotes.html"))])
- (darkroom .
- [(0 3)
- ((cl-lib
- (0 5)))
- "Remove visual distractions and focus on writing" single
- ((:url . "http://elpa.gnu.org/packages/darkroom.html")
- (:keywords "convenience" "emulations")
- (:authors
- ("João Távora" . "joaotavora@gmail.com"))
- (:maintainer "João Távora" . "joaotavora@gmail.com"))])
- (dash .
- [(2 12 0)
- nil "A modern list library for Emacs" tar
- ((:maintainer "Magnar Sveen" . "magnars@gmail.com")
- (:authors
- ("Magnar Sveen" . "magnars@gmail.com"))
- (:keywords "lists")
- (:url . "http://elpa.gnu.org/packages/dash.html"))])
- (dbus-codegen .
- [(0 1)
- ((cl-lib
- (0 5)))
- "Lisp code generation for D-Bus." single
- ((:url . "http://elpa.gnu.org/packages/dbus-codegen.html")
- (:keywords "comm" "dbus" "convenience")
- (:authors
- ("Daiki Ueno" . "ueno@gnu.org"))
- (:maintainer nil . "emacs-devel@gnu.org"))])
- (debbugs .
- [(0 25)
- ((emacs
- (25 1))
- (soap-client
- (3 1 5)))
- "SOAP library to access debbugs servers" tar
- ((:maintainer "Michael Albinus" . "michael.albinus@gmx.de")
- (:authors
- ("Michael Albinus" . "michael.albinus@gmx.de"))
- (:keywords "comm" "hypermedia")
- (:url . "http://elpa.gnu.org/packages/debbugs.html"))])
- (delight .
- [(1 7)
- ((cl-lib
- (0 5))
- (nadvice
- (0 3)))
- "A dimmer switch for your lighter text" single
- ((:keywords "convenience")
- (:authors
- ("Phil Sainty" . "psainty@orcon.net.nz"))
- (:maintainer "Phil Sainty" . "psainty@orcon.net.nz")
- (:url . "https://savannah.nongnu.org/projects/delight"))])
- (dict-tree .
- [(0 14)
- ((trie
- (0 3))
- (tNFA
- (0 1 1))
- (heap
- (0 3)))
- "Dictionary data structure" single
- ((:keywords "extensions" "matching" "data structures trie" "tree" "dictionary" "completion" "regexp")
- (:authors
- ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
- (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
- (:url . "http://www.dr-qubit.org/emacs.php"))])
- (diff-hl .
- [(1 8 7)
- ((cl-lib
- (0 2))
- (emacs
- (24 3)))
- "Highlight uncommitted changes using VC" tar
- ((:url . "https://github.com/dgutov/diff-hl")
- (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru")
- (:authors
- ("Dmitry Gutov" . "dgutov@yandex.ru"))
- (:keywords "vc" "diff"))])
- (diffview .
- [(1 0)
- nil "View diffs in side-by-side format" single
- ((:keywords "convenience" "diff")
- (:authors
- ("Mitchel Humpherys" . "mitch.special@gmail.com"))
- (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com")
- (:url . "https://github.com/mgalgs/diffview-mode"))])
- (dired-du .
- [(0 5 2)
- ((emacs
- (24 4))
- (cl-lib
- (0 5)))
- "Dired with recursive directory sizes" tar
- ((:maintainer "Tino Calancha" . "tino.calancha@gmail.com")
- (:authors
- ("Tino Calancha" . "tino.calancha@gmail.com"))
- (:keywords "files" "unix" "convenience")
- (:url . "http://elpa.gnu.org/packages/dired-du.html"))])
- (dired-git-info .
- [(0 3 1)
- ((emacs
- (25)))
- "Show git info in dired" single
- ((:keywords "dired" "files")
- (:authors
- ("Clemens Radermacher" . "clemera@posteo.net"))
- (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
- (:url . "https://github.com/clemera/dired-git-info"))])
- (disk-usage .
- [(1 3 3)
- ((emacs
- (26 1)))
- "Sort and browse disk usage listings" single
- ((:keywords "files" "convenience" "tools")
- (:authors
- ("Pierre Neidhardt" . "mail@ambrevar.xyz"))
- (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz")
- (:url . "https://gitlab.com/Ambrevar/emacs-disk-usage"))])
- (dismal .
- [(1 5)
- ((cl-lib
- (0)))
- "Dis Mode Ain't Lotus: Spreadsheet program Emacs" tar
- ((:maintainer "UnMaintainer" . "emacs-devel@gnu.org")
- (:authors
- (nil . "David Fox, fox@cs.nyu.edu")
- (nil . "Frank E. Ritter, ritter@cs.cmu.edu"))
- (:url . "http://elpa.gnu.org/packages/dismal.html"))])
- (djvu .
- [(1 1)
- nil "Edit and view Djvu files via djvused" single
- ((:url . "http://elpa.gnu.org/packages/djvu.html")
- (:keywords "files" "wp")
- (:authors
- ("Roland Winkler" . "winkler@gnu.org"))
- (:maintainer "Roland Winkler" . "winkler@gnu.org"))])
- (docbook .
- [(0 1)
- nil "Info-like viewer for DocBook" single
- ((:url . "http://elpa.gnu.org/packages/docbook.html")
- (:keywords "docs" "help")
- (:authors
- ("Chong Yidong" . "cyd@gnu.org"))
- (:maintainer "Chong Yidong" . "cyd@gnu.org"))])
- (dts-mode .
- [(0 1 0)
- nil "Major mode for Device Tree source files" single
- ((:url . "http://elpa.gnu.org/packages/dts-mode.html")
- (:keywords "languages")
- (:authors
- ("Ben Gamari" . "ben@smart-cactus.org"))
- (:maintainer "Ben Gamari" . "ben@smart-cactus.org"))])
- (easy-kill .
- [(0 9 3)
- ((emacs
- (24))
- (cl-lib
- (0 5)))
- "kill & mark things easily" tar
- ((:url . "https://github.com/leoliu/easy-kill")
- (:maintainer "Leo Liu" . "sdl.web@gmail.com")
- (:authors
- ("Leo Liu" . "sdl.web@gmail.com"))
- (:keywords "killing" "convenience"))])
- (ebdb .
- [(0 6 18)
- ((emacs
- (25 1))
- (cl-lib
- (0 5))
- (seq
- (2 15)))
- "Contact management package" tar
- ((:url . "https://github.com/girzel/ebdb")
- (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
- (:authors
- ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
- (:keywords "convenience" "mail"))])
- (ebdb-gnorb .
- [(1 0 2)
- ((gnorb
- (1 1 0))
- (ebdb
- (0 2)))
- "Utilities for connecting EBDB to Gnorb" single
- ((:url . "http://elpa.gnu.org/packages/ebdb-gnorb.html")
- (:authors
- ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
- (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))])
- (ebdb-i18n-chn .
- [(1 3)
- ((pyim
- (1 6 0))
- (ebdb
- (0 6 17)))
- "China-specific internationalization support for EBDB" single
- ((:url . "http://elpa.gnu.org/packages/ebdb-i18n-chn.html")
- (:authors
- ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
- (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))])
- (ediprolog .
- [(1 2)
- nil "Emacs Does Interactive Prolog" single
- ((:keywords "languages" "processes")
- (:authors
- ("Markus Triska" . "triska@metalevel.at"))
- (:maintainer "Markus Triska" . "triska@metalevel.at")
- (:url . "https://www.metalevel.at/ediprolog/"))])
- (eev .
- [(20200224)
- ((emacs
- (24 1)))
- "Support for e-scripts (eepitch blocks, elisp hyperlinks, etc)" tar
- ((:url . "http://angg.twu.net/#eev")
- (:maintainer "Eduardo Ochs" . "eduardoochs@gmail.com")
- (:authors
- ("Eduardo Ochs" . "eduardoochs@gmail.com"))
- (:keywords "lisp" "e-scripts"))])
- (eglot .
- [(1 6)
- ((emacs
- (26 1))
- (jsonrpc
- (1 0 7))
- (flymake
- (1 0 5)))
- "Client for Language Server Protocol (LSP) servers" tar
- ((:url . "https://github.com/joaotavora/eglot")
- (:maintainer "João Távora" . "joaotavora@gmail.com")
- (:authors
- ("João Távora" . "joaotavora@gmail.com"))
- (:keywords "convenience" "languages"))])
- (el-search .
- [(1 12 6 1)
- ((emacs
- (25))
- (stream
- (2 2 4))
- (cl-print
- (1 0)))
- "Expression based interactive search for Emacs Lisp" tar
- ((:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de")
- (:authors
- ("Michael Heerdegen" . "michael_heerdegen@web.de"))
- (:keywords "lisp")
- (:url . "http://elpa.gnu.org/packages/el-search.html"))])
- (eldoc .
- [(1 8 0)
- ((emacs
- (26 3)))
- "Show function arglist or variable docstring in echo area" single
- ((:url . "http://elpa.gnu.org/packages/eldoc.html")
- (:keywords "extensions")
- (:authors
- ("Noah Friedman" . "friedman@splode.com"))
- (:maintainer "Noah Friedman" . "friedman@splode.com"))])
- (eldoc-eval .
- [(0 1)
- nil "Enable eldoc support when minibuffer is in use." single
- ((:url . "http://elpa.gnu.org/packages/eldoc-eval.html")
- (:authors
- ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))
- (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))])
- (electric-spacing .
- [(5 0)
- nil "Insert operators with surrounding spaces smartly" single
- ((:url . "http://elpa.gnu.org/packages/electric-spacing.html")
- (:authors
- ("William Xu" . "william.xwl@gmail.com"))
- (:maintainer "William Xu" . "william.xwl@gmail.com"))])
- (elisp-benchmarks .
- [(1 6)
- nil "elisp benchmarks collection" tar
- ((:maintainer "Andrea Corallo" . "akrl@sdf.org")
- (:authors
- ("Andrea Corallo" . "akrl@sdf.org"))
- (:keywords "languages" "lisp")
- (:url . "http://elpa.gnu.org/packages/elisp-benchmarks.html"))])
- (emms .
- [(5 42)
- ((cl-lib
- (0 5)))
- "The Emacs Multimedia System" tar
- ((:url . "https://www.gnu.org/software/emms/")
- (:maintainer "Yoni Rabkin" . "yrk@gnu.org")
- (:authors
- ("Jorgen Schäfer" . "forcer@forcix.cx"))
- (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia"))])
- (enwc .
- [(2 0)
- ((emacs
- (25 1)))
- "The Emacs Network Client" tar
- ((:url . "https://savannah.nongnu.org/p/enwc")
- (:maintainer "Ian Dunn" . "dunni@gnu.org")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:keywords "external" "network" "wicd" "manager" "nm"))])
- (epoch-view .
- [(0 0 1)
- nil "Minor mode to visualize epoch timestamps" single
- ((:url . "http://elpa.gnu.org/packages/epoch-view.html")
- (:keywords "data" "timestamp" "epoch" "unix")
- (:authors
- ("Ted Zlatanov" . "tzz@lifelogs.com"))
- (:maintainer "Ted Zlatanov" . "tzz@lifelogs.com"))])
- (ergoemacs-mode .
- [(5 16 10 12)
- ((emacs
- (24 1))
- (undo-tree
- (0 6 5))
- (cl-lib
- (0 5)))
- "Emacs mode based on common modern interface and ergonomics." tar
- ((:url . "https://github.com/ergoemacs/ergoemacs-mode")
- (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com")
- (:authors
- ("Xah Lee" . "xah@xahlee.org")
- ("David Capello" . "davidcapello@gmail.com")
- ("Matthew L. Fidler" . "matthew.fidler@gmail.com"))
- (:keywords "convenience"))])
- (excorporate .
- [(0 8 3)
- ((emacs
- (24 1))
- (fsm
- (0 2 1))
- (soap-client
- (3 1 5))
- (url-http-ntlm
- (2 0 4))
- (nadvice
- (0 3)))
- "Exchange Web Services (EWS) integration" tar
- ((:url . "https://www.fitzsim.org/blog/")
- (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
- (:authors
- ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))
- (:keywords "calendar"))])
- (expand-region .
- [(0 11 0)
- nil "Increase selected region by semantic units." tar
- ((:url . "https://github.com/magnars/expand-region.el")
- (:maintainer "Magnar Sveen" . "magnars@gmail.com")
- (:authors
- ("Magnar Sveen" . "magnars@gmail.com"))
- (:keywords "marking" "region"))])
- (exwm .
- [(0 24)
- ((xelb
- (0 18)))
- "Emacs X Window Manager" tar
- ((:url . "https://github.com/ch11ng/exwm")
- (:maintainer "Chris Feng" . "chris.w.feng@gmail.com")
- (:authors
- ("Chris Feng" . "chris.w.feng@gmail.com"))
- (:keywords "unix"))])
- (f90-interface-browser .
- [(1 1)
- nil "Parse and browse f90 interfaces" single
- ((:authors
- ("Lawrence Mitchell" . "wence@gmx.li"))
- (:maintainer "Lawrence Mitchell" . "wence@gmx.li")
- (:url . "http://github.com/wence-/f90-iface/"))])
- (filladapt .
- [(2 12 2)
- ((emacs
- (24 4)))
- "Adaptive fill" single
- ((:url . "http://elpa.gnu.org/packages/filladapt.html")
- (:authors
- ("Kyle E. Jones" . "kyle_jones@wonderworks.com"))
- (:maintainer nil . "emacs-devel@gnu.org"))])
- (flylisp .
- [(0 2)
- ((emacs
- (24 1))
- (cl-lib
- (0 4)))
- "Color unbalanced parentheses and parentheses inconsistent with indentation" single
- ((:url . "http://elpa.gnu.org/packages/flylisp.html")
- (:authors
- ("Barry O'Reilly" . "gundaetiapo@gmail.com"))
- (:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com"))])
- (flymake .
- [(1 0 9)
- ((emacs
- (26 1))
- (eldoc
- (1 1 0)))
- "A universal on-the-fly syntax checker" single
- ((:url . "http://elpa.gnu.org/packages/flymake.html")
- (:keywords "c" "languages" "tools")
- (:authors
- ("Pavel Kobyakov" . "pk_at_work@yahoo.com"))
- (:maintainer "João Távora" . "joaotavora@gmail.com"))])
- (fountain-mode .
- [(2 7 3)
- ((emacs
- (24 5)))
- "Major mode for screenwriting in Fountain markup" single
- ((:keywords "wp" "text")
- (:authors
- ("Paul W. Rankin" . "pwr@sdf.org"))
- (:maintainer "Paul W. Rankin" . "pwr@sdf.org")
- (:url . "https://fountain-mode.org"))])
- (frame-tabs .
- [(1 1)
- nil "show buffer tabs in side window" single
- ((:url . "http://elpa.gnu.org/packages/frame-tabs.html")
- (:keywords "frames" "tabs")
- (:authors
- ("Martin Rudalics" . "rudalics@gmx.at"))
- (:maintainer "Martin Rudalics" . "rudalics@gmx.at"))])
- (frog-menu .
- [(0 2 11)
- ((emacs
- (26))
- (avy
- (0 4))
- (posframe
- (0 4)))
- "Quickly pick items from ad hoc menus" single
- ((:keywords "convenience")
- (:authors
- ("Clemens Radermacher" . "clemera@posteo.net"))
- (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
- (:url . "https://github.com/clemera/frog-menu"))])
- (fsm .
- [(0 2 1)
- ((emacs
- (24 1))
- (cl-lib
- (0 5)))
- "state machine library" single
- ((:url . "http://elpa.gnu.org/packages/fsm.html")
- (:keywords "extensions")
- (:authors
- ("Magnus Henoch" . "magnus.henoch@gmail.com"))
- (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))])
- (ggtags .
- [(0 8 13)
- ((emacs
- (24))
- (cl-lib
- (0 5)))
- "emacs frontend to GNU Global source code tagging system" single
- ((:keywords "tools" "convenience")
- (:authors
- ("Leo Liu" . "sdl.web@gmail.com"))
- (:maintainer "Leo Liu" . "sdl.web@gmail.com")
- (:url . "https://github.com/leoliu/ggtags"))])
- (gited .
- [(0 6 0)
- ((emacs
- (24 4))
- (cl-lib
- (0 5)))
- "Operate on Git branches like dired" tar
- ((:maintainer "Tino Calancha" . "tino.calancha@gmail.com")
- (:authors
- ("Tino Calancha" . "tino.calancha@gmail.com"))
- (:keywords "git" "vc" "convenience")
- (:url . "http://elpa.gnu.org/packages/gited.html"))])
- (gle-mode .
- [(1 1)
- ((cl-lib
- (0 5)))
- "Major mode to edit Graphics Layout Engine files" single
- ((:url . "http://elpa.gnu.org/packages/gle-mode.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (gnome-c-style .
- [(0 1)
- nil "minor mode for editing GNOME-style C source code" tar
- ((:maintainer "Daiki Ueno" . "ueno@gnu.org")
- (:authors
- ("Daiki Ueno" . "ueno@gnu.org"))
- (:keywords "gnome" "c" "coding style")
- (:url . "http://elpa.gnu.org/packages/gnome-c-style.html"))])
- (gnorb .
- [(1 6 7)
- ((cl-lib
- (0 5)))
- "Glue code between Gnus, Org, and BBDB" tar
- ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
- (:authors
- ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
- (:keywords "mail" "org" "gnus" "bbdb" "todo" "task")
- (:url . "http://elpa.gnu.org/packages/gnorb.html"))])
- (gnu-elpa .
- [(1 1)
- nil "Advertize GNU ELPA packages" tar
- ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:url . "http://elpa.gnu.org/packages/gnu-elpa.html"))])
- (gnu-elpa-keyring-update .
- [(2019 3)
- nil "Update Emacs's GPG keyring for GNU ELPA" tar
- ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:keywords "maint" "tools")
- (:url . "http://elpa.gnu.org/packages/gnu-elpa-keyring-update.html"))])
- (gnugo .
- [(3 1 0)
- ((ascii-art-to-unicode
- (1 5))
- (xpm
- (1 0 1))
- (cl-lib
- (0 5)))
- "play GNU Go in a buffer" tar
- ((:url . "http://www.gnuvola.org/software/gnugo/")
- (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org")
- (:authors
- ("Thien-Thi Nguyen" . "ttn@gnu.org"))
- (:keywords "games" "processes"))])
- (gnus-mock .
- [(0 4 5)
- nil "Mock Gnus installation for testing" tar
- ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
- (:authors
- ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
- (:url . "http://elpa.gnu.org/packages/gnus-mock.html"))])
- (gpastel .
- [(0 5 0)
- ((emacs
- (25 1)))
- "Integrates GPaste with the kill-ring" single
- ((:keywords "tools")
- (:authors
- ("Damien Cassou" . "damien@cassou.me"))
- (:maintainer "Damien Cassou" . "damien@cassou.me")
- (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))])
- (greader .
- [(0 1)
- ((emacs
- (25)))
- "gnamù reader, a reader with espeak tts" tar
- ((:maintainer "Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")
- (:authors
- ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com"))
- (:keywords "tools" "accessibility")
- (:url . "http://elpa.gnu.org/packages/greader.html"))])
- (guess-language .
- [(0 0 1)
- ((cl-lib
- (0 5))
- (emacs
- (24))
- (nadvice
- (0 1)))
- "Robust automatic language detection" single
- ((:authors
- ("Titus von der Malsburg" . "malsburg@posteo.de"))
- (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de")
- (:url . "https://github.com/tmalsburg/guess-language.el"))])
- (heap .
- [(0 5)
- nil "Heap (a.k.a. priority queue) data structure" single
- ((:keywords "extensions" "data structures" "heap" "priority queue")
- (:authors
- ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
- (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
- (:url . "http://www.dr-qubit.org/emacs.php"))])
- (highlight-escape-sequences .
- [(0 4)
- nil "Highlight escape sequences" single
- ((:keywords "convenience")
- (:authors
- ("Dmitry Gutov" . "dgutov@yandex.ru")
- ("Pavel Matcula" . "dev.plvlml@gmail.com"))
- (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru")
- (:url . "https://github.com/dgutov/highlight-escape-sequences"))])
- (hook-helpers .
- [(1 1 1)
- ((emacs
- (25 1)))
- "Anonymous, modifiable hook functions" tar
- ((:url . "https://savannah.nongnu.org/projects/hook-helpers-el/")
- (:maintainer "Ian Dunn" . "dunni@gnu.org")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:keywords "development" "hooks"))])
- (html5-schema .
- [(0 1)
- nil "Add HTML5 schemas for use by nXML" tar
- ((:url . "https://github.com/validator/validator")
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:keywords "html" "xml"))])
- (hydra .
- [(0 14 0)
- ((cl-lib
- (0 5)))
- "Make bindings that stick around." tar
- ((:url . "https://github.com/abo-abo/hydra")
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:keywords "bindings"))])
- (hyperbole .
- [(7 1 2)
- ((emacs
- (24 4)))
- "GNU Hyperbole: The Everyday Hypertextual Information Manager" tar
- ((:url . "http://www.gnu.org/software/hyperbole")
- (:maintainer "Bob Weiner <rsw@gnu.org>, Mats Lidell" . "matsl@gnu.org")
- (:authors
- ("Bob Weiner"))
- (:keywords "comm" "convenience" "files" "frames" "hypermedia" "languages" "mail" "matching" "mouse" "multimedia" "outlines" "tools" "wp"))])
- (ioccur .
- [(2 4)
- ((emacs
- (24))
- (cl-lib
- (0 5)))
- "Incremental occur" single
- ((:authors
- ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))
- (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com")
- (:url . "https://github.com/thierryvolpiatto/ioccur"))])
- (iterators .
- [(0 1 1)
- ((emacs
- (25)))
- "Functions for working with iterators" single
- ((:url . "http://elpa.gnu.org/packages/iterators.html")
- (:keywords "extensions" "elisp")
- (:authors
- ("Michael Heerdegen" . "michael_heerdegen@web.de"))
- (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))])
- (ivy .
- [(0 13 1)
- ((emacs
- (24 5)))
- "Incremental Vertical completYon" tar
- ((:url . "https://github.com/abo-abo/swiper")
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:keywords "matching"))])
- (ivy-explorer .
- [(0 3 2)
- ((emacs
- (25))
- (ivy
- (0 10 0)))
- "Dynamic file browsing grid using ivy" single
- ((:keywords "convenience" "files" "matching")
- (:authors
- ("Clemens Radermacher" . "clemera@posteo.net"))
- (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
- (:url . "https://github.com/clemera/ivy-explorer"))])
- (javaimp .
- [(0 7 1)
- nil "Add and reorder Java import statements in Maven/Gradle projects" tar
- ((:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm")
- (:authors
- ("Filipp Gunbin" . "fgunbin@fastmail.fm"))
- (:keywords "java" "maven" "gradle" "programming")
- (:url . "http://elpa.gnu.org/packages/javaimp.html"))])
- (jgraph-mode .
- [(1 1)
- ((cl-lib
- (0 5)))
- "Major mode for Jgraph files" single
- ((:url . "http://elpa.gnu.org/packages/jgraph-mode.html")
- (:keywords "tex" "wp")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (js2-mode .
- [(20190219)
- ((emacs
- (24 1))
- (cl-lib
- (0 5)))
- "Improved JavaScript editing mode" tar
- ((:url . "https://github.com/mooz/js2-mode/")
- (:maintainer "Steve Yegge" . "steve.yegge@gmail.com")
- (:authors
- ("Steve Yegge" . "steve.yegge@gmail.com")
- ("mooz" . "stillpedant@gmail.com")
- ("Dmitry Gutov" . "dgutov@yandex.ru"))
- (:keywords "languages" "javascript"))])
- (json-mode .
- [(0 1)
- ((emacs
- (25 1)))
- "Major mode for editing JSON files" single
- ((:url . "http://elpa.gnu.org/packages/json-mode.html")
- (:keywords "data")
- (:authors
- ("Simen Heggestøyl" . "simenheg@gmail.com"))
- (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com"))])
- (jsonrpc .
- [(1 0 12)
- ((emacs
- (25 2)))
- "JSON-RPC library" single
- ((:url . "http://elpa.gnu.org/packages/jsonrpc.html")
- (:keywords "processes" "languages" "extensions")
- (:authors
- ("João Távora" . "joaotavora@gmail.com"))
- (:maintainer "João Távora" . "joaotavora@gmail.com"))])
- (jumpc .
- [(3 0)
- nil "jump to previous insertion points" single
- ((:url . "http://elpa.gnu.org/packages/jumpc.html")
- (:authors
- ("Ivan Kanis" . "ivan@kanis.fr"))
- (:maintainer "Ivan Kanis" . "ivan@kanis.fr"))])
- (kmb .
- [(0 1)
- ((emacs
- (24 1)))
- "Kill buffers matching a regexp w/o confirmation" single
- ((:url . "http://elpa.gnu.org/packages/kmb.html")
- (:keywords "lisp" "convenience")
- (:authors
- ("Tino Calancha" . "tino.calancha@gmail.com"))
- (:maintainer "Tino Calancha"))])
- (landmark .
- [(1 0)
- nil "Neural-network robot that learns landmarks" single
- ((:url . "http://elpa.gnu.org/packages/landmark.html")
- (:keywords "games" "neural network" "adaptive search" "chemotaxis")
- (:authors
- ("Terrence Brannon" . "metaperl@gmail.com"))
- (:maintainer nil . "emacs-devel@gnu.org"))])
- (leaf .
- [(4 2 5)
- ((emacs
- (24 4)))
- "Simplify your init.el configuration, extended use-package" tar
- ((:url . "https://github.com/conao3/leaf.el")
- (:maintainer "Naoya Yamashita" . "conao3@gmail.com")
- (:authors
- ("Naoya Yamashita" . "conao3@gmail.com"))
- (:keywords "lisp" "settings"))])
- (let-alist .
- [(1 0 6)
- ((emacs
- (24 1)))
- "Easily let-bind values of an assoc-list by their names" single
- ((:url . "http://elpa.gnu.org/packages/let-alist.html")
- (:keywords "extensions" "lisp")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))])
- (lex .
- [(1 1)
- nil "Lexical analyser construction" tar
- ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:url . "http://elpa.gnu.org/packages/lex.html"))])
- (lmc .
- [(1 4)
- ((emacs
- (24))
- (cl-lib
- (0 5)))
- "Little Man Computer in Elisp" single
- ((:url . "http://elpa.gnu.org/packages/lmc.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (load-dir .
- [(0 0 5)
- ((cl-lib
- (0 5)))
- "Load all Emacs Lisp files in a given directory" single
- ((:url . "http://elpa.gnu.org/packages/load-dir.html")
- (:keywords "lisp" "files" "convenience")
- (:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com"))])
- (load-relative .
- [(1 3 1)
- nil "Relative file load (within a multi-file Emacs package)" single
- ((:keywords "internal")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org"))
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:url . "http://github.com/rocky/emacs-load-relative"))])
- (loc-changes .
- [(1 2)
- nil "keep track of positions even after buffer changes" single
- ((:authors
- ("Rocky Bernstein" . "rocky@gnu.org"))
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:url . "http://github.com/rocky/emacs-loc-changes"))])
- (loccur .
- [(1 2 4)
- ((emacs
- (24 3)))
- "Perform an occur-like folding in current buffer" single
- ((:keywords "matching")
- (:authors
- ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))
- (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
- (:url . "https://github.com/fourier/loccur"))])
- (map .
- [(2 1)
- ((emacs
- (25)))
- "Map manipulation functions" single
- ((:url . "http://elpa.gnu.org/packages/map.html")
- (:keywords "convenience" "map" "hash-table" "alist" "array")
- (:authors
- ("Nicolas Petton" . "nicolas@petton.fr"))
- (:maintainer nil . "emacs-devel@gnu.org"))])
- (markchars .
- [(0 2 1)
- nil "Mark chars fitting certain characteristics" single
- ((:url . "http://elpa.gnu.org/packages/markchars.html")
- (:authors
- ("Lennart Borgman" . "lennart.borgman@gmail.com"))
- (:maintainer "Lennart Borgman" . "lennart.borgman@gmail.com"))])
- (math-symbol-lists .
- [(1 2 1)
- nil "Lists of Unicode math symbols and latex commands" single
- ((:keywords "unicode" "symbols" "mathematics")
- (:authors
- ("Vitalie Spinu" . "spinuvit@gmail.com"))
- (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com")
- (:url . "https://github.com/vspinu/math-symbol-lists"))])
- (memory-usage .
- [(0 2)
- nil "Analyze the memory usage of Emacs in various ways" single
- ((:url . "http://elpa.gnu.org/packages/memory-usage.html")
- (:keywords "maint")
- (:authors
- ("Stefan Monnier" . "monnier@cs.yale.edu"))
- (:maintainer "Stefan Monnier" . "monnier@cs.yale.edu"))])
- (metar .
- [(0 3)
- ((cl-lib
- (0 5)))
- "Retrieve and decode METAR weather information" single
- ((:url . "http://elpa.gnu.org/packages/metar.html")
- (:keywords "comm")
- (:authors
- ("Mario Lang" . "mlang@delysid.org"))
- (:maintainer "Mario Lang" . "mlang@delysid.org"))])
- (midi-kbd .
- [(0 2)
- ((emacs
- (25)))
- "Create keyboard events from Midi input" single
- ((:url . "http://elpa.gnu.org/packages/midi-kbd.html")
- (:keywords "convenience" "hardware" "multimedia")
- (:authors
- ("David Kastrup" . "dak@gnu.org"))
- (:maintainer "David Kastrup" . "dak@gnu.org"))])
- (mines .
- [(1 6)
- ((emacs
- (24 4))
- (cl-lib
- (0 5)))
- "Minesweeper game" tar
- ((:url . "https://github.com/calancha/Minesweeper")
- (:maintainer "Tino Calancha" . "tino.calancha@gmail.com")
- (:authors
- ("Tino Calancha" . "tino.calancha@gmail.com"))
- (:keywords "games"))])
- (minibuffer-line .
- [(0 1)
- nil "Display status info in the minibuffer window" single
- ((:url . "http://elpa.gnu.org/packages/minibuffer-line.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (minimap .
- [(1 3)
- nil "Sidebar showing a \"mini-map\" of a buffer" single
- ((:url . "http://elpa.gnu.org/packages/minimap.html")
- (:authors
- ("David Engster" . "deng@randomsample.de"))
- (:maintainer "David Engster" . "deng@randomsample.de"))])
- (mmm-mode .
- [(0 5 8)
- ((cl-lib
- (0 2)))
- "Allow Multiple Major Modes in a buffer" tar
- ((:url . "https://github.com/purcell/mmm-mode")
- (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru")
- (:authors
- ("Michael Abraham Shulman" . "viritrilbia@gmail.com"))
- (:keywords "convenience" "faces" "languages" "tools"))])
- (modus-operandi-theme .
- [(0 11 0)
- ((emacs
- (26 1)))
- "Accessible light theme (WCAG AAA)" single
- ((:keywords "faces" "theme" "accessibility")
- (:authors
- ("Protesilaos Stavrou" . "info@protesilaos.com"))
- (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
- (:url . "https://gitlab.com/protesilaos/modus-themes"))])
- (modus-vivendi-theme .
- [(0 11 0)
- ((emacs
- (26 1)))
- "Accessible dark theme (WCAG AAA)" single
- ((:keywords "faces" "theme" "accessibility")
- (:authors
- ("Protesilaos Stavrou" . "info@protesilaos.com"))
- (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
- (:url . "https://gitlab.com/protesilaos/modus-themes"))])
- (multishell .
- [(1 1 5)
- ((cl-lib
- (0 5)))
- "Easily use multiple shell buffers, local and remote" tar
- ((:url . "https://github.com/kenmanheimer/EmacsMultishell")
- (:maintainer "Ken Manheimer" . "ken.manheimer@gmail.com")
- (:authors
- ("Ken Manheimer" . "ken.manheimer@gmail.com"))
- (:keywords "processes"))])
- (muse .
- [(3 20 2)
- nil "Authoring and publishing tool for Emacs" tar
- ((:url . "http://mwolson.org/projects/EmacsMuse.html")
- (:maintainer "Michael Olson" . "mwolson@gnu.org")
- (:authors
- ("John Wiegley" . "johnw@gnu.org"))
- (:keywords "hypermedia"))])
- (myers .
- [(0 1)
- ((emacs
- (25)))
- "Random-access singly-linked lists" single
- ((:url . "http://elpa.gnu.org/packages/myers.html")
- (:keywords "list" "containers")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (nadvice .
- [(0 3)
- nil "Forward compatibility for Emacs-24.4's nadvice" single
- ((:url . "http://elpa.gnu.org/packages/nadvice.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (nameless .
- [(1 0 2)
- ((emacs
- (24 4)))
- "Hide package namespace in your emacs-lisp code" single
- ((:keywords "convenience" "lisp")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/nameless"))])
- (names .
- [(20151201 0)
- ((emacs
- (24 1))
- (cl-lib
- (0 5))
- (nadvice
- (0 3)))
- "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." tar
- ((:url . "https://github.com/Malabarba/names")
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:keywords "extensions" "lisp"))])
- (nhexl-mode .
- [(1 5)
- ((emacs
- (24 4))
- (cl-lib
- (0 5)))
- "Minor mode to edit files via hex-dump format" single
- ((:url . "http://elpa.gnu.org/packages/nhexl-mode.html")
- (:keywords "data")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (nlinum .
- [(1 9)
- nil "Show line numbers in the margin" single
- ((:url . "http://elpa.gnu.org/packages/nlinum.html")
- (:keywords "convenience")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (notes-mode .
- [(1 30)
- nil "Indexing system for on-line note-taking" tar
- ((:maintainer nil . "<johnh@isi.edu>.")
- (:authors
- (nil . "<johnh@isi.edu>."))
- (:url . "http://elpa.gnu.org/packages/notes-mode.html"))])
- (ntlm .
- [(2 1 0)
- nil "NTLM (NT LanManager) authentication support" single
- ((:url . "http://elpa.gnu.org/packages/ntlm.html")
- (:keywords "ntlm" "sasl" "comm")
- (:authors
- ("Taro Kawagishi" . "tarok@transpulse.org"))
- (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))])
- (num3-mode .
- [(1 3)
- nil "highlight groups of digits in long numbers" single
- ((:url . "http://elpa.gnu.org/packages/num3-mode.html")
- (:keywords "faces" "minor-mode")
- (:authors
- ("Felix Lee <felix8a@gmail.com>, Michal Nazarewicz" . "mina86@mina86.com"))
- (:maintainer "Michal Nazarewicz" . "mina86@mina86.com"))])
- (oauth2 .
- [(0 13)
- nil "OAuth 2.0 Authorization Protocol" single
- ((:url . "http://elpa.gnu.org/packages/oauth2.html")
- (:keywords "comm")
- (:authors
- ("Julien Danjou" . "julien@danjou.info"))
- (:maintainer "Julien Danjou" . "julien@danjou.info"))])
- (objed .
- [(0 8 3)
- ((emacs
- (25))
- (cl-lib
- (0 5)))
- "Navigate and edit text objects." tar
- ((:url . "https://github.com/clemera/objed")
- (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
- (:authors
- ("Clemens Radermacher" . "clemera@posteo.net"))
- (:keywords "convenience"))])
- (olivetti .
- [(1 7 1)
- ((emacs
- (24 5)))
- "Minor mode for a nice writing environment" single
- ((:url . "http://elpa.gnu.org/packages/olivetti.html")
- (:keywords "wp" "text")
- (:authors
- ("Paul W. Rankin" . "pwr@sdf.org"))
- (:maintainer "Paul W. Rankin" . "pwr@sdf.org"))])
- (omn-mode .
- [(1 2)
- nil "Support for OWL Manchester Notation" single
- ((:url . "http://elpa.gnu.org/packages/omn-mode.html")
- (:authors
- ("Phillip Lord" . "phillip.lord@newcastle.ac.uk"))
- (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))])
- (on-screen .
- [(1 3 3)
- ((cl-lib
- (0)))
- "guide your eyes while scrolling" single
- ((:keywords "convenience")
- (:authors
- ("Michael Heerdegen" . "michael_heerdegen@web.de"))
- (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de")
- (:url . "https://github.com/michael-heerdegen/on-screen.el"))])
- (org .
- [(9 3 6)
- nil "Outline-based notes management and organizer" tar
- ((:url . "https://orgmode.org")
- (:maintainer "Bastien Guerry" . "bzg@gnu.org")
- (:authors
- ("Carsten Dominik <carsten at orgmode dot org>"))
- (:keywords "outlines" "hypermedia" "calendar" "wp"))])
- (org-edna .
- [(1 1 1)
- ((emacs
- (25 1))
- (seq
- (2 19))
- (org
- (9 0 5)))
- "Extensible Dependencies 'N' Actions" tar
- ((:url . "https://savannah.nongnu.org/projects/org-edna-el/")
- (:maintainer "Ian Dunn" . "dunni@gnu.org")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:keywords "convenience" "text" "org"))])
- (orgalist .
- [(1 12)
- ((emacs
- (24 4)))
- "Manage Org-like lists in non-Org buffers" single
- ((:url . "http://elpa.gnu.org/packages/orgalist.html")
- (:keywords "convenience")
- (:authors
- ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr"))
- (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr"))])
- (osc .
- [(0 2)
- nil "Open Sound Control protocol library" single
- ((:url . "http://elpa.gnu.org/packages/osc.html")
- (:keywords "comm" "processes" "multimedia")
- (:authors
- ("Mario Lang" . "mlang@blind.guru"))
- (:maintainer "Mario Lang" . "mlang@blind.guru"))])
- (other-frame-window .
- [(1 0 6)
- ((emacs
- (24 4)))
- "Minor mode to enable global prefix keys for other frame/window buffer placement" single
- ((:url . "http://elpa.gnu.org/packages/other-frame-window.html")
- (:keywords "frame" "window")
- (:authors
- ("Stephen Leake" . "stephen_leake@member.fsf.org"))
- (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org"))])
- (pabbrev .
- [(4 2 1)
- nil "Predictive abbreviation expansion" single
- ((:url . "http://elpa.gnu.org/packages/pabbrev.html")
- (:authors
- ("Phillip Lord" . "phillip.lord@newcastle.ac.uk"))
- (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))])
- (paced .
- [(1 1 3)
- ((emacs
- (25 1))
- (async
- (1 9 1)))
- "Predictive Abbreviation Completion and Expansion using Dictionaries" tar
- ((:url . "https://savannah.nongnu.org/projects/paced-el/")
- (:maintainer "Ian Dunn" . "dunni@gnu.org")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:keywords "convenience" "completion"))])
- (parsec .
- [(0 1 3)
- ((emacs
- (24))
- (cl-lib
- (0 5)))
- "Parser combinator library" tar
- ((:url . "https://github.com/cute-jumper/parsec.el")
- (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com")
- (:authors
- ("Junpeng Qiu" . "qjpchmail@gmail.com"))
- (:keywords "extensions"))])
- (path-iterator .
- [(1 0)
- ((emacs
- (25 0)))
- "An iterator for traversing a directory path." tar
- ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
- (:authors
- ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
- (:url . "http://elpa.gnu.org/packages/path-iterator.html"))])
- (peg .
- [(1 0)
- ((emacs
- (25)))
- "Parsing Expression Grammars in Emacs Lisp" tar
- ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
- (:authors
- ("Helmut Eller" . "eller.helmut@gmail.com"))
- (:url . "http://elpa.gnu.org/packages/peg.html"))])
- (persist .
- [(0 4)
- nil "Persist Variables between Emacs Sessions" tar
- ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk")
- (:authors
- ("Phillip Lord" . "phillip.lord@russet.org.uk"))
- (:url . "http://elpa.gnu.org/packages/persist.html"))])
- (phps-mode .
- [(0 3 52)
- ((emacs
- (26)))
- "Major mode for PHP with Semantic integration" tar
- ((:url . "https://github.com/cjohansson/emacs-phps-mode")
- (:maintainer "Christian Johansson" . "christian@cvj.se")
- (:authors
- ("Christian Johansson" . "christian@cvj.se"))
- (:keywords "tools" "convenience"))])
- (pinentry .
- [(0 1)
- nil "GnuPG Pinentry server implementation" single
- ((:url . "http://elpa.gnu.org/packages/pinentry.html")
- (:keywords "gnupg")
- (:authors
- ("Daiki Ueno" . "ueno@gnu.org"))
- (:maintainer "Daiki Ueno" . "ueno@gnu.org"))])
- (poker .
- [(0 2)
- nil "Texas hold 'em poker" single
- ((:url . "http://elpa.gnu.org/packages/poker.html")
- (:keywords "games")
- (:authors
- ("Mario Lang" . "mlang@delysid.org"))
- (:maintainer "Mario Lang" . "mlang@delysid.org"))])
- (posframe .
- [(0 7 0)
- ((emacs
- (26)))
- "Pop a posframe (just a frame) at point" single
- ((:keywords "convenience" "tooltip")
- (:authors
- ("Feng Shu" . "tumashu@163.com"))
- (:maintainer "Feng Shu" . "tumashu@163.com")
- (:url . "https://github.com/tumashu/posframe"))])
- (project .
- [(0 5 0)
- ((emacs
- (26 3)))
- "Operations on the current project" single
- ((:url . "http://elpa.gnu.org/packages/project.html"))])
- (psgml .
- [(1 3 4)
- nil "SGML-editing mode with parsing support" tar
- ((:maintainer "Lennart Staflin" . "lstaflin@gmail.com")
- (:authors
- ("Lennart Staflin" . "lenst@lysator.liu.se")
- ("James Clark" . "jjc@clark.com"))
- (:keywords "languages")
- (:url . "http://elpa.gnu.org/packages/psgml.html"))])
- (pspp-mode .
- [(1 1)
- nil "Major mode for editing PSPP files" single
- ((:url . "http://elpa.gnu.org/packages/pspp-mode.html")
- (:keywords "pspp" "major-mode")
- (:authors
- ("Scott Andrew Borton" . "scott@pp.htv.fi"))
- (:maintainer "John Darrington" . "john@darrington.wattle.id.au"))])
- (python .
- [(0 26 1)
- ((emacs
- (24 1))
- (cl-lib
- (1 0)))
- "Python's flying circus support for Emacs" single
- ((:keywords "languages")
- (:authors
- ("Fabián E. Gallina" . "fgallina@gnu.org"))
- (:maintainer nil . "emacs-devel@gnu.org")
- (:url . "https://github.com/fgallina/python.el"))])
- (quarter-plane .
- [(0 1)
- nil "Minor mode for quarter-plane style editing" single
- ((:url . "http://elpa.gnu.org/packages/quarter-plane.html")
- (:keywords "convenience" "wp")
- (:authors
- ("Peter J. Weisberg"))
- (:maintainer "Peter J. Weisberg"))])
- (queue .
- [(0 2)
- nil "Queue data structure" single
- ((:keywords "extensions" "data structures" "queue")
- (:authors
- ("Inge Wallin" . "inge@lysator.liu.se")
- ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
- (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
- (:url . "http://www.dr-qubit.org/emacs.php"))])
- (rainbow-mode .
- [(1 0 5)
- nil "Colorize color names in buffers" single
- ((:url . "http://elpa.gnu.org/packages/rainbow-mode.html")
- (:keywords "faces")
- (:authors
- ("Julien Danjou" . "julien@danjou.info"))
- (:maintainer "Julien Danjou" . "julien@danjou.info"))])
- (rbit .
- [(0 1)
- nil "Red-black persistent interval trees" single
- ((:url . "http://elpa.gnu.org/packages/rbit.html")
- (:keywords "data structures" "binary tree" "intervals")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (rcirc-color .
- [(0 4 1)
- ((emacs
- (24 4)))
- "color nicks" single
- ((:url . "http://elpa.gnu.org/packages/rcirc-color.html")
- (:keywords "comm")
- (:authors
- ("Alex Schroeder" . "alex@gnu.org"))
- (:maintainer "Alex Schroeder" . "alex@gnu.org"))])
- (rcirc-menu .
- [(1 1)
- nil "A menu of all your rcirc connections" single
- ((:url . "http://elpa.gnu.org/packages/rcirc-menu.html")
- (:keywords "comm")
- (:authors
- ("Alex Schroeder" . "alex@gnu.org"))
- (:maintainer "Alex Schroeder" . "alex@gnu.org"))])
- (realgud .
- [(1 5 1)
- ((load-relative
- (1 3 1))
- (loc-changes
- (1 2))
- (test-simple
- (1 3 0))
- (emacs
- (25)))
- "A modular front-end for interacting with external debuggers" tar
- ((:url . "http://github.com/realgud/realgud/")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org"))
- (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb"))])
- (realgud-ipdb .
- [(1 0 0)
- ((realgud
- (1 5 0))
- (load-relative
- (1 3 1))
- (emacs
- (25)))
- "Realgud front-end to ipdb" tar
- ((:url . "http://github.com/rocky/realgud-ipdb")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org")))])
- (realgud-jdb .
- [(1 0 0)
- ((realgud
- (1 4 5))
- (load-relative
- (1 2))
- (cl-lib
- (0 5))
- (emacs
- (25)))
- "Realgud front-end to Java's jdb debugger\"" tar
- ((:url . "http://github.com/realgud/realgud-jdb")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org")))])
- (realgud-lldb .
- [(1 0 2)
- ((load-relative
- (1 3 1))
- (realgud
- (1 5 0))
- (emacs
- (25)))
- "Realgud front-end to lldb" tar
- ((:url . "http://github.com/realgud/realgud-lldb")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org")))])
- (realgud-node-debug .
- [(1 0 0)
- ((realgud
- (1 4 5))
- (load-relative
- (1 2))
- (cl-lib
- (0 5))
- (emacs
- (25)))
- "Realgud front-end to older \"node debug\"" tar
- ((:url . "http://github.com/realgud/realgud-node-debug")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org")))])
- (realgud-node-inspect .
- [(1 0 0)
- ((realgud
- (1 4 5))
- (load-relative
- (1 2))
- (cl-lib
- (0 5))
- (emacs
- (24)))
- "Realgud front-end to newer \"node inspect\"" tar
- ((:url . "http://github.com/realgud/realgud-node-inspect")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org")))])
- (realgud-trepan-ni .
- [(1 0 1)
- ((load-relative
- (1 2))
- (realgud
- (1 5 0))
- (cl-lib
- (0 5))
- (emacs
- (25)))
- "Realgud front-end to trepan-ni" tar
- ((:url . "http://github.com/realgud/realgud-trepan-ni")
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org")))])
- (register-list .
- [(0 1)
- nil "Interactively list/edit registers" single
- ((:url . "http://elpa.gnu.org/packages/register-list.html")
- (:keywords "register")
- (:authors
- ("Bastien Guerry" . "bzg@gnu.org"))
- (:maintainer "Bastien Guerry" . "bzg@gnu.org"))])
- (relint .
- [(1 18)
- ((xr
- (1 19))
- (emacs
- (26 1)))
- "Elisp regexp mistake finder" tar
- ((:url . "https://github.com/mattiase/relint")
- (:maintainer "Mattias Engdegård" . "mattiase@acm.org")
- (:authors
- ("Mattias Engdegård" . "mattiase@acm.org"))
- (:keywords "lisp" "regexps"))])
- (rich-minority .
- [(1 0 1)
- ((cl-lib
- (0 5)))
- "Clean-up and Beautify the list of minor-modes." single
- ((:keywords "mode-line" "faces")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/rich-minority"))])
- (rnc-mode .
- [(0 2)
- nil "Emacs mode to edit Relax-NG Compact files" single
- ((:url . "http://elpa.gnu.org/packages/rnc-mode.html")
- (:keywords "xml" "relaxng")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (rudel .
- [(0 3 1)
- ((emacs
- (24))
- (cl-lib
- (0 5))
- (cl-generic
- (0 3))
- (cl-print
- (1 0)))
- "A collaborative editing framework for Emacs" tar
- ((:url . "http://rudel.sourceforge.net/")
- (:maintainer "Jan Moringen" . "scymtym@users.sourceforge.net")
- (:authors
- ("Jan Moringen" . "scymtym@users.sourceforge.net"))
- (:keywords "rudel" "collaboration"))])
- (scanner .
- [(0 1)
- ((emacs
- (25 1))
- (dash
- (2 12 0)))
- "Scan documents and images" tar
- ((:url . "https://gitlab.com/rstocker/scanner.git")
- (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de")
- (:authors
- ("Raffael Stocker" . "r.stocker@mnet-mail.de"))
- (:keywords "hardware" "multimedia"))])
- (scroll-restore .
- [(1 0)
- nil "restore original position after scrolling" single
- ((:url . "http://elpa.gnu.org/packages/scroll-restore.html")
- (:keywords "scrolling")
- (:authors
- ("Martin Rudalics" . "rudalics@gmx.at"))
- (:maintainer "Martin Rudalics" . "rudalics@gmx.at"))])
- (sed-mode .
- [(1 0)
- nil "Major mode to edit sed scripts" single
- ((:url . "http://elpa.gnu.org/packages/sed-mode.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (seq .
- [(2 20)
- nil "Sequence manipulation functions" tar
- ((:maintainer nil . "emacs-devel@gnu.org")
- (:authors
- ("Nicolas Petton" . "nicolas@petton.fr"))
- (:keywords "sequences")
- (:url . "http://elpa.gnu.org/packages/seq.html"))])
- (shelisp .
- [(0 9 1)
- nil "execute elisp in shell" single
- ((:url . "http://elpa.gnu.org/packages/shelisp.html")
- (:keywords "terminals" "lisp" "processes")
- (:authors
- ("Michael R. Mauger" . "michael@mauger.com"))
- (:maintainer "Michael R. Mauger" . "michael@mauger.com"))])
- (shen-mode .
- [(0 1)
- nil "A major mode for editing shen source code" tar
- ((:maintainer "Eric Schulte" . "schulte.eric@gmail.com")
- (:authors
- ("Eric Schulte" . "schulte.eric@gmail.com"))
- (:keywords "languages" "shen")
- (:url . "http://elpa.gnu.org/packages/shen-mode.html"))])
- (sisu-mode .
- [(7 1 8)
- nil "Major mode for SiSU markup text" single
- ((:keywords "text" "syntax" "processes" "tools")
- (:authors
- ("Ralph Amissah & Ambrose Kofi Laing"))
- (:maintainer "Ralph Amissah" . "ralph.amissah@gmail.com")
- (:url . "http://www.sisudoc.org/"))])
- (sm-c-mode .
- [(1 0)
- nil "C major mode based on SMIE" single
- ((:url . "http://elpa.gnu.org/packages/sm-c-mode.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (smalltalk-mode .
- [(3 2 92)
- nil "Major mode for the GNU Smalltalk programming language" tar
- ((:maintainer "Derek Zhou" . "derek@3qin.us")
- (:authors
- ("Steve Byrne"))
- (:url . "http://elpa.gnu.org/packages/smalltalk-mode.html"))])
- (smart-yank .
- [(0 1 1)
- ((emacs
- (24)))
- "A different approach of yank pointer handling" single
- ((:url . "http://elpa.gnu.org/packages/smart-yank.html")
- (:keywords "convenience")
- (:authors
- ("Michael Heerdegen" . "michael_heerdegen@web.de"))
- (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))])
- (sml-mode .
- [(6 10)
- ((emacs
- (24 3))
- (cl-lib
- (0 5)))
- "Major mode for editing (Standard) ML" single
- ((:url . "http://elpa.gnu.org/packages/sml-mode.html")
- (:keywords "sml")
- (:authors
- ("Lars Bo Nielsen")
- (" Olin Shivers")
- (" Fritz Knabe (?)")
- (" Steven Gilmore (?)")
- (" Matthew Morley" . "mjm@scs.leeds.ac.uk")
- (" Matthias Blume" . "blume@cs.princeton.edu")
- (" (Stefan Monnier)" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (soap-client .
- [(3 1 5)
- ((cl-lib
- (0 6 1)))
- "Access SOAP web services" tar
- ((:url . "https://github.com/alex-hhh/emacs-soap-client")
- (:maintainer "Alexandru Harsanyi" . "AlexHarsanyi@gmail.com")
- (:authors
- ("Alexandru Harsanyi" . "AlexHarsanyi@gmail.com"))
- (:keywords "soap" "web-services" "comm" "hypermedia"))])
- (sokoban .
- [(1 4 8)
- ((emacs
- (23 1))
- (cl-lib
- (0 5)))
- "Implementation of Sokoban for Emacs." tar
- ((:maintainer "Dieter Deyke" . "dieter.deyke@gmail.com")
- (:authors
- ("Glynn Clements" . "glynn.clements@xemacs.org"))
- (:keywords "games")
- (:url . "http://elpa.gnu.org/packages/sokoban.html"))])
- (sotlisp .
- [(1 6 2)
- ((emacs
- (24 1)))
- "Write lisp at the speed of thought." single
- ((:keywords "convenience" "lisp")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/speed-of-thought-lisp"))])
- (spinner .
- [(1 7 3)
- nil "Add spinners and progress-bars to the mode-line for ongoing operations" single
- ((:keywords "processes" "mode-line")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
- (:url . "https://github.com/Malabarba/spinner.el"))])
- (sql-indent .
- [(1 5)
- ((cl-lib
- (0 5)))
- "Support for indenting code in SQL files." tar
- ((:url . "https://github.com/alex-hhh/emacs-sql-indent")
- (:maintainer "Alex Harsanyi" . "AlexHarsanyi@gmail.com")
- (:authors
- ("Alex Harsanyi" . "AlexHarsanyi@gmail.com"))
- (:keywords "languages" "sql"))])
- (ssh-deploy .
- [(3 1 11)
- ((emacs
- (25)))
- "Deployment via Tramp, global or per directory." tar
- ((:url . "https://github.com/cjohansson/emacs-ssh-deploy")
- (:maintainer "Christian Johansson" . "christian@cvj.se")
- (:authors
- ("Christian Johansson" . "christian@cvj.se"))
- (:keywords "tools" "convenience"))])
- (stream .
- [(2 2 5)
- ((emacs
- (25)))
- "Implementation of streams" tar
- ((:maintainer nil . "nicolas@petton.fr")
- (:authors
- ("Nicolas Petton" . "nicolas@petton.fr"))
- (:keywords "stream" "laziness" "sequences")
- (:url . "http://elpa.gnu.org/packages/stream.html"))])
- (svg .
- [(1 0)
- ((emacs
- (25)))
- "SVG image creation functions" single
- ((:url . "http://elpa.gnu.org/packages/svg.html")
- (:keywords "image")
- (:authors
- ("Lars Magne Ingebrigtsen" . "larsi@gnus.org")
- ("Felix E. Klee" . "felix.klee@inka.de"))
- (:maintainer "Lars Magne Ingebrigtsen" . "larsi@gnus.org"))])
- (svg-clock .
- [(1 1)
- ((svg
- (1 0))
- (emacs
- (27 0)))
- "Analog clock using Scalable Vector Graphics" single
- ((:url . "http://elpa.gnu.org/packages/svg-clock.html")
- (:keywords "demo" "svg" "clock")
- (:authors
- ("Ulf Jasper" . "ulf.jasper@web.de"))
- (:maintainer "Ulf Jasper" . "ulf.jasper@web.de"))])
- (swiper .
- [(0 13 1)
- ((emacs
- (24 5))
- (ivy
- (0 13 1)))
- "Isearch with an overview. Oh, man!" single
- ((:keywords "matching")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:url . "https://github.com/abo-abo/swiper"))])
- (system-packages .
- [(1 0 11)
- ((emacs
- (24 3)))
- "functions to manage system packages" tar
- ((:url . "https://gitlab.com/jabranham/system-packages")
- (:maintainer "J. Alexander Branham" . "alex.branham@gmail.com")
- (:authors
- ("J. Alexander Branham" . "alex.branham@gmail.com")))])
- (tNFA .
- [(0 1 1)
- ((queue
- (0 1)))
- "Tagged non-deterministic finite-state automata" single
- ((:keywords "extensions" "matching" "data structures tnfa" "nfa" "dfa" "finite state automata" "automata" "regexp")
- (:authors
- ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
- (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
- (:url . "http://www.dr-qubit.org/emacs.php"))])
- (temp-buffer-browse .
- [(1 5)
- ((emacs
- (24)))
- "temp buffer browse mode" single
- ((:url . "http://elpa.gnu.org/packages/temp-buffer-browse.html")
- (:keywords "convenience")
- (:authors
- ("Leo Liu" . "sdl.web@gmail.com"))
- (:maintainer "Leo Liu" . "sdl.web@gmail.com"))])
- (test-simple .
- [(1 3 0)
- ((cl-lib
- (0)))
- "Simple Unit Test Framework for Emacs Lisp" single
- ((:keywords "unit-test")
- (:authors
- ("Rocky Bernstein" . "rocky@gnu.org"))
- (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
- (:url . "http://github.com/rocky/emacs-test-simple"))])
- (timerfunctions .
- [(1 4 2)
- ((cl-lib
- (0 5))
- (emacs
- (24)))
- "Enhanced versions of some timer.el functions" single
- ((:url . "http://elpa.gnu.org/packages/timerfunctions.html")
- (:authors
- ("Dave Goel" . "deego3@gmail.com"))
- (:maintainer "Dave Goel" . "deego3@gmail.com"))])
- (tiny .
- [(0 2 1)
- nil "Quickly generate linear ranges in Emacs" tar
- ((:url . "https://github.com/abo-abo/tiny")
- (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
- (:authors
- ("Oleh Krehel" . "ohwoeowho@gmail.com"))
- (:keywords "convenience"))])
- (tramp .
- [(2 4 4 1)
- ((emacs
- (24 4)))
- "Transparent Remote Access, Multiple Protocol" tar
- ((:url . "https://savannah.gnu.org/projects/tramp")
- (:maintainer "Michael Albinus" . "michael.albinus@gmx.de")
- (:authors
- ("Kai Großjohann" . "kai.grossjohann@gmx.net")
- ("Michael Albinus" . "michael.albinus@gmx.de"))
- (:keywords "comm" "processes"))])
- (tramp-theme .
- [(0 2)
- ((emacs
- (24 1)))
- "Custom theme for remote buffers" single
- ((:url . "http://elpa.gnu.org/packages/tramp-theme.html")
- (:keywords "convenience" "faces")
- (:authors
- ("Michael Albinus" . "michael.albinus@gmx.de"))
- (:maintainer "Michael Albinus" . "michael.albinus@gmx.de"))])
- (transcribe .
- [(1 5 2)
- nil "Package for audio transcriptions" single
- ((:url . "http://elpa.gnu.org/packages/transcribe.html")
- (:authors
- ("David Gonzalez Gandara" . "dggandara@member.fsf.org"))
- (:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org"))])
- (trie .
- [(0 4)
- ((tNFA
- (0 1 1))
- (heap
- (0 3)))
- "Trie data structure" single
- ((:keywords "extensions" "matching" "data structures trie" "ternary search tree" "tree" "completion" "regexp")
- (:authors
- ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
- (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
- (:url . "http://www.dr-qubit.org/emacs.php"))])
- (undo-tree .
- [(0 7 4)
- nil "Treat undo history as a tree" single
- ((:keywords "convenience" "files" "undo" "redo" "history" "tree")
- (:authors
- ("Toby Cubitt" . "toby-undo-tree@dr-qubit.org"))
- (:maintainer "Toby Cubitt" . "toby-undo-tree@dr-qubit.org")
- (:url . "http://www.dr-qubit.org/emacs.php"))])
- (uni-confusables .
- [(0 1)
- nil "Unicode confusables table" tar
- ((:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com")
- (:url . "http://elpa.gnu.org/packages/uni-confusables.html"))])
- (uniquify-files .
- [(1 0 3)
- ((emacs
- (25 0)))
- "Completion style for files, minimizing directories" tar
- ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
- (:authors
- ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
- (:keywords "completion" "table" "uniquify")
- (:url . "http://elpa.gnu.org/packages/uniquify-files.html"))])
- (url-http-ntlm .
- [(2 0 4)
- ((cl-lib
- (0 5))
- (ntlm
- (2 1 0)))
- "NTLM authentication for the url library" single
- ((:keywords "comm" "data" "processes" "hypermedia")
- (:authors
- ("Tom Schutzer-Weissmann" . "tom.weissmann@gmail.com"))
- (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
- (:url . "https://code.google.com/p/url-http-ntlm/"))])
- (validate .
- [(1 0 4)
- ((emacs
- (24 1))
- (cl-lib
- (0 5))
- (seq
- (2 16)))
- "Schema validation for Emacs-lisp" single
- ((:url . "http://elpa.gnu.org/packages/validate.html")
- (:keywords "lisp")
- (:authors
- ("Artur Malabarba" . "emacs@endlessparentheses.com"))
- (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))])
- (vcard .
- [(0 1)
- ((emacs
- (27 1)))
- "Package for handling vCard files" tar
- ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
- (:authors
- ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
- (:url . "http://elpa.gnu.org/packages/vcard.html"))])
- (vcl-mode .
- [(1 1)
- nil "Major mode for Varnish Configuration Language" single
- ((:url . "http://elpa.gnu.org/packages/vcl-mode.html")
- (:keywords "varnish" "vcl")
- (:authors
- ("Sergey Poznyakoff" . "gray@gnu.org.ua"))
- (:maintainer "Sergey Poznyakoff" . "gray@gnu.org.ua"))])
- (vdiff .
- [(0 2 3)
- ((emacs
- (24 4))
- (hydra
- (0 13 0)))
- "A diff tool similar to vimdiff" single
- ((:keywords "diff")
- (:authors
- ("Justin Burkett" . "justin@burkett.cc"))
- (:maintainer "Justin Burkett" . "justin@burkett.cc")
- (:url . "https://github.com/justbur/emacs-vdiff"))])
- (verilog-mode .
- [(2020 6 27 14326051)
- nil "major mode for editing verilog source in Emacs" single
- ((:keywords "languages")
- (:authors
- ("Michael McNamara" . "mac@verilog.com")
- ("Wilson Snyder" . "wsnyder@wsnyder.org"))
- (:maintainer "Michael McNamara" . "mac@verilog.com")
- (:url . "https://www.veripool.org"))])
- (vigenere .
- [(1 0)
- ((emacs
- (25 1)))
- "Run a vigenere cipher on a block of text ;" single
- ((:keywords "data" "vigenere" "cipher")
- (:authors
- ("Ian Dunn" . "dunni@gnu.org"))
- (:maintainer "Ian Dunn" . "dunni@gnu.org")
- (:url . "https://elpa.gnu.org/packages/vigenere.html"))])
- (visual-filename-abbrev .
- [(1 0)
- ((emacs
- (26 1)))
- "Visually abbreviate filenames" single
- ((:url . "http://elpa.gnu.org/packages/visual-filename-abbrev.html")
- (:keywords "tools")
- (:authors
- ("Tassilo Horn" . "tsdh@gnu.org"))
- (:maintainer "Tassilo Horn" . "tsdh@gnu.org"))])
- (visual-fill .
- [(0 1)
- nil "Auto-refill paragraphs without modifying the buffer" single
- ((:url . "http://elpa.gnu.org/packages/visual-fill.html")
- (:authors
- ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
- (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))])
- (vlf .
- [(1 7 1)
- nil "View Large Files" tar
- ((:url . "https://github.com/m00natic/vlfi")
- (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com")
- (:keywords "large files" "utilities"))])
- (wcheck-mode .
- [(2019 6 17)
- nil "General interface for text checkers" single
- ((:keywords "text" "spell" "check" "languages" "ispell")
- (:authors
- ("Teemu Likonen" . "tlikonen@iki.fi"))
- (:maintainer "Teemu Likonen" . "tlikonen@iki.fi")
- (:url . "https://github.com/tlikonen/wcheck-mode"))])
- (wconf .
- [(0 2 1)
- ((emacs
- (24 4)))
- "Minimal window layout manager" single
- ((:keywords "windows" "frames" "layout")
- (:authors
- ("Ingo Lohmar" . "i.lohmar@gmail.com"))
- (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com")
- (:url . "https://github.com/ilohmar/wconf"))])
- (web-server .
- [(0 1 2)
- ((emacs
- (24 3)))
- "Emacs Web Server" tar
- ((:url . "https://github.com/eschulte/emacs-web-server")
- (:maintainer "Eric Schulte" . "schulte.eric@gmail.com")
- (:authors
- ("Eric Schulte" . "schulte.eric@gmail.com"))
- (:keywords "http" "server" "network"))])
- (webfeeder .
- [(1 0 0)
- ((emacs
- (25 1)))
- "Build RSS and Atom webfeeds from HTML files" tar
- ((:url . "https://gitlab.com/Ambrevar/emacs-webfeeder")
- (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz")
- (:authors
- ("Pierre Neidhardt" . "mail@ambrevar.xyz"))
- (:keywords "news" "hypermedia" "blog" "feed" "rss" "atom"))])
- (websocket .
- [(1 12)
- ((cl-lib
- (0 5)))
- "Emacs WebSocket client and server" tar
- ((:maintainer "Andrew Hyatt" . "ahyatt@gmail.com")
- (:authors
- ("Andrew Hyatt" . "ahyatt@gmail.com"))
- (:keywords "communication" "websocket" "server")
- (:url . "http://elpa.gnu.org/packages/websocket.html"))])
- (which-key .
- [(3 3 0)
- ((emacs
- (24 4)))
- "Display available keybindings in popup" tar
- ((:url . "https://github.com/justbur/emacs-which-key")
- (:maintainer "Justin Burkett" . "justin@burkett.cc")
- (:authors
- ("Justin Burkett" . "justin@burkett.cc")))])
- (windower .
- [(0 0 1)
- ((emacs
- (25)))
- "Helper functions for window manipulation." single
- ((:keywords "convenience" "tools")
- (:authors
- ("Pierre Neidhardt" . "mail@ambrevar.xyz"))
- (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz")
- (:url . "https://gitlab.com/ambrevar/windower"))])
- (windresize .
- [(0 1)
- nil "Resize windows interactively" single
- ((:url . "http://elpa.gnu.org/packages/windresize.html")
- (:keywords "window")
- (:authors
- ("Bastien" . "bzg@gnu.org"))
- (:maintainer "Bastien" . "bzg@gnu.org"))])
- (wisi .
- [(3 1 3)
- ((emacs
- (25 0))
- (seq
- (2 20)))
- "Utilities for implementing an indentation/navigation engine using a generalized LALR parser" tar
- ((:url . "http://stephe-leake.org/ada/wisitoken.html")
- (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
- (:authors
- ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
- (:keywords "parser" "indentation" "navigation"))])
- (wisitoken-grammar-mode .
- [(1 2 0)
- ((wisi
- (3 1 1))
- (emacs
- (25 0))
- (mmm-mode
- (0 5 7)))
- "Major mode for editing WisiToken grammar files" tar
- ((:url . "http://www.nongnu.org/ada-mode/")
- (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
- (:authors
- ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
- (:keywords "languages"))])
- (wpuzzle .
- [(1 1)
- nil "find as many word in a given time" single
- ((:url . "http://elpa.gnu.org/packages/wpuzzle.html")
- (:authors
- ("Ivan Kanis" . "ivan@kanis.fr"))
- (:maintainer "Ivan Kanis" . "ivan@kanis.fr"))])
- (xclip .
- [(1 10)
- nil "Copy&paste GUI clipboard from text terminal" single
- ((:url . "http://elpa.gnu.org/packages/xclip.html")
- (:keywords "convenience" "tools")
- (:authors
- ("Leo Liu" . "sdl.web@gmail.com"))
- (:maintainer "Leo Liu" . "sdl.web@gmail.com"))])
- (xelb .
- [(0 18)
- ((emacs
- (24 4))
- (cl-generic
- (0 2)))
- "X protocol Emacs Lisp Binding" tar
- ((:url . "https://github.com/ch11ng/xelb")
- (:maintainer "Chris Feng" . "chris.w.feng@gmail.com")
- (:authors
- ("Chris Feng" . "chris.w.feng@gmail.com"))
- (:keywords "unix"))])
- (xpm .
- [(1 0 4)
- nil "edit XPM images" tar
- ((:url . "http://www.gnuvola.org/software/xpm/")
- (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org")
- (:authors
- ("Thien-Thi Nguyen" . "ttn@gnu.org"))
- (:keywords "multimedia" "xpm"))])
- (xr .
- [(1 19)
- ((emacs
- (26 1)))
- "Convert string regexp to rx notation" tar
- ((:url . "https://github.com/mattiase/xr")
- (:maintainer "Mattias Engdegård" . "mattiase@acm.org")
- (:authors
- ("Mattias Engdegård" . "mattiase@acm.org"))
- (:keywords "lisp" "regexps"))])
- (xref .
- [(1 0 1)
- ((emacs
- (26 3))
- (project
- (0 1 1)))
- "Cross-referencing commands" single
- ((:url . "http://elpa.gnu.org/packages/xref.html"))])
- (yasnippet .
- [(0 14 0)
- ((cl-lib
- (0 5)))
- "Yet another snippet extension for Emacs" tar
- ((:url . "http://github.com/joaotavora/yasnippet")
- (:maintainer "Noam Postavsky" . "npostavs@gmail.com")
- (:keywords "convenience" "emulation"))])
- (yasnippet-classic-snippets .
- [(1 0 2)
- ((yasnippet
- (0 9 1)))
- "\"Classic\" yasnippet snippets" tar
- ((:maintainer "Noam Postavsky" . "npostavs@gmail.com")
- (:keywords "snippets")
- (:url . "http://elpa.gnu.org/packages/yasnippet-classic-snippets.html"))])
- (zones .
- [(2019 7 13)
- nil "Zones of text - like multiple regions" single
- ((:keywords "narrow" "restriction" "widen" "region" "zone")
- (:authors
- ("Drew Adams"))
- (:maintainer "Drew Adams" . "drew.adams@oracle.com")
- (:url . "https://elpa.gnu.org/packages/zones.html"))])
- (ztree .
- [(1 0 5)
- ((cl-lib
- (0)))
- "Text mode directory tree" tar
- ((:url . "https://github.com/fourier/ztree")
- (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
- (:authors
- ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))
- (:keywords "files" "tools"))]))
diff --git a/elpa/archives/gnu/archive-contents.signed b/elpa/archives/gnu/archive-contents.signed
deleted file mode 100644
index 00edbe2..0000000
--- a/elpa/archives/gnu/archive-contents.signed
+++ /dev/null
@@ -1 +0,0 @@
-Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2020-07-31T14:05:02-0700 using RSA \ No newline at end of file
diff --git a/elpa/archives/melpa/archive-contents b/elpa/archives/melpa/archive-contents
deleted file mode 100644
index 6c97aac..0000000
--- a/elpa/archives/melpa/archive-contents
+++ /dev/null
@@ -1,4649 +0,0 @@
-(1
- (0blayout . [(20190703 527) nil "Layout grouping with ease" single ((:commit . "fd9a8f353dbd45b4628b5f84b8d8c2525ebf571d") (:keywords "convenience" "window-management") (:authors ("Elis \"etu\" Axelsson")) (:maintainer "Elis \"etu\" Axelsson") (:url . "https://github.com/etu/0blayout"))])
- (0x0 . [(20200521 1352) ((emacs (24 1))) "Upload to 0x0.st" single ((:commit . "16581d94a1e32677091f3721506a48177cc49e68") (:keywords "comm") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/nullpointer-emacs"))])
- (0xc . [(20190219 117) ((emacs (24 4)) (s (1 11 0))) "Base conversion made easy" single ((:commit . "167e93ce863381a58988655927042514d984ad49") (:keywords "base" "conversion") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:url . "http://github.com/AdamNiederer/0xc"))])
- (2048-game . [(20200417 259) nil "play 2048 in Emacs" single ((:commit . "aad4a590ea91f9a3256233b9b345e9159c6993f2") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com") (:url . "https://hg.sr.ht/~zck/game-2048"))])
- (4clojure . [(20200123 2008) ((request (0 2 0))) "Open and evaluate 4clojure.com questions." single ((:commit . "557eecb5da50fedd92840021c8b08d87dfdc782b") (:keywords "languages" "data") (:authors ("Joshua Hoff")) (:maintainer "Sasha Kovar" . "sasha-git@arcocene.org") (:url . "https://github.com/abend/4clojure.el"))])
- (@ . [(20181225 1438) ((emacs (24 3))) "multiple-inheritance prototype-based objects DSL" tar ((:commit . "0a6189f8be42dbbc5d9358cbd447d471236135a2") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/at-el"))])
- (a . [(20180907 953) ((emacs (25))) "Associative data structure functions" single ((:commit . "18966975db7110d0aac726be95b593e2fc3d44ed") (:keywords "lisp") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:url . "https://github.com/plexus/a.el"))])
- (aa-edit-mode . [(20170119 320) ((emacs (24 3)) (navi2ch (2 0 0))) "Major mode for editing AA(S_JIS Art) and .mlt file" single ((:commit . "1dd801225b7ad3c23ad09698f5e77f0df7012a65") (:keywords "wp" "text" "shiftjis" "mlt" "yaruo") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))])
- (abc-mode . [(20171020 1019) nil "Major mode for editing abc music files" single ((:commit . "15691b32431b50f9106cb9fa50ee7244957a8ac8") (:keywords "local" "docs") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu"))])
- (abgaben . [(20171119 646) ((pdf-tools (0 80)) (f (0 19 0)) (s (1 11 0))) "review and correct assignments received by mail" single ((:commit . "20d14830f07d66e2a04bcad1498a4a6fbf4b4451") (:keywords "mail" "outlines" "convenience") (:authors ("Arne Köhn" . "arne@chark.eu")) (:maintainer "Arne Köhn" . "arne@chark.eu") (:url . "http://arne.chark.eu/"))])
- (abl-mode . [(20190403 904) nil "Python TDD minor mode" single ((:commit . "44b7d946bc3a693f5a931c4a62c0a67d42e8d4dc") (:authors ("Ulas Tuerkmen <ulas.tuerkmen at gmail dot com>")) (:maintainer "Ulas Tuerkmen <ulas.tuerkmen at gmail dot com>") (:url . "http://github.com/afroisalreadyinu/abl-mode"))])
- (abs-mode . [(20200220 1701) ((emacs (25)) (erlang (0)) (maude-mode (0)) (flymake (0 3))) "Major mode for the modeling language Abs" single ((:commit . "2db38537e9c481c38477997467bc98ee00607d7a") (:keywords "languages") (:authors ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at") (:url . "https://github.com/abstools/abs-mode"))])
- (abyss-theme . [(20170808 1345) ((emacs (24))) "A dark theme with contrasting colours." single ((:commit . "18791c6e8d9cc2b4815c9f08627a2e94fc0eeb14") (:keywords "theme" "dark" "contrasting colours") (:authors ("Matt Russell" . "matt@mgrbyte.co.uk")) (:maintainer "Matt Russell" . "matt@mgrbyte.co.uk") (:url . "https://github.com/mgrbyte/emacs-abyss-theme"))])
- (ac-alchemist . [(20150908 656) ((auto-complete (1 5 0)) (alchemist (1 5 0)) (cl-lib (0 5))) "auto-complete source for alchemist" single ((:commit . "b1891c3d41aed83f61d78a609ea97be5cc2758d9") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-alchemist"))])
- (ac-c-headers . [(20151021 834) ((auto-complete (1 3 1))) "auto-complete source for C headers" single ((:commit . "de13a1d35b311e6601556d8ef163de102057deea") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (ac-capf . [(20151101 217) ((auto-complete (1 4)) (cl-lib (0 5))) "auto-complete source with completion-at-point" single ((:commit . "17571dba0a8f98111f2ab758e9bea285b263781b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-capf"))])
- (ac-cider . [(20161006 719) ((cider (0 8 0)) (auto-complete (1 4)) (cl-lib (0 3))) "Clojure auto-complete sources using CIDER" single ((:commit . "fa13e067dd9c8c76151c7d140a2803da1d109b84") (:keywords "languages" "clojure" "nrepl" "cider" "compliment") (:authors ("Alex Yakushev" . "alex@bytopia.org") ("Steve Purcell" . "steve@sanityinc.com") ("Sam Aaron" . "samaaron@gmail.com")) (:maintainer "Alex Yakushev" . "alex@bytopia.org") (:url . "https://github.com/clojure-emacs/ac-cider"))])
- (ac-clang . [(20180710 546) ((emacs (24)) (cl-lib (0 5)) (auto-complete (1 4 0)) (pos-tip (0 4 6)) (yasnippet (0 8 0))) "Auto Completion source by libclang for GNU Emacs" tar ((:commit . "3294b968eb1a8317049190940193f9da47c085ef") (:keywords "completion" "convenience" "intellisense") (:authors ("yaruopooner [https://github.com/yaruopooner]")) (:maintainer "yaruopooner [https://github.com/yaruopooner]") (:url . "https://github.com/yaruopooner/ac-clang"))])
- (ac-dcd . [(20190902 1124) ((auto-complete (1 3 1)) (flycheck-dmd-dub (0 7))) "Auto Completion source for dcd for GNU Emacs" single ((:commit . "d378d33c7bedc6c108eda7f674bd0aa1d8664857") (:keywords "languages") (:authors (nil . "<atila.neves@gmail.com>")) (:maintainer nil . "<atila.neves@gmail.com>") (:url . "http://github.com/atilaneves/ac-dcd"))])
- (ac-emacs-eclim . [(20180911 1121) ((eclim (0 3)) (auto-complete (1 5))) "auto-complete source for eclim" single ((:commit . "222ddd48fcf0ee01592dec77c58e0cf3f2ea1100"))])
- (ac-emmet . [(20131015 1558) ((emmet-mode (1 0 2)) (auto-complete (1 4))) "auto-complete sources for emmet-mode's snippets" single ((:commit . "88f24876ee3b759978d4614a758280b5d512d543") (:keywords "completion" "convenience" "emmet") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/ac-emmet"))])
- (ac-emoji . [(20150823 711) ((auto-complete (1 5 0)) (cl-lib (0 5))) "auto-complete source of Emoji" tar ((:commit . "40a639764eb654f1b4bb705c817b66032a26ff2b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-emoji"))])
- (ac-etags . [(20161001 1507) ((auto-complete (1 4))) "etags/ctags completion source for auto-complete" single ((:commit . "7983e631c226fe0fa53af3b2d56bf4eca3d785ce") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-etags"))])
- (ac-geiser . [(20200318 824) ((geiser (0 5)) (auto-complete (1 4))) "Auto-complete backend for geiser" tar ((:commit . "93818c936ee7e2f1ba1b315578bde363a7d43d05"))])
- (ac-haskell-process . [(20150423 1402) ((auto-complete (1 4)) (haskell-mode (13))) "Haskell auto-complete source which uses the current haskell process" single ((:commit . "0362d4323511107ec70e7165cb612f3ab01b712f") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (ac-helm . [(20160319 233) ((helm (1 6 3)) (auto-complete (1 4 0)) (popup (0 5 0)) (cl-lib (0 5))) "Helm interface for auto-complete" single ((:commit . "baf2b1e04bcffa835084389c0fab415f26efbf32") (:keywords "completion" "convenience" "helm") (:authors ("rubikitch" . "rubikitch@ruby-lang.org") ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))])
- (ac-html . [(20151005 731) ((auto-complete (1 4)) (s (1 9)) (f (0 17)) (dash (2 10))) "auto complete source for html tags and attributes" tar ((:commit . "668154cba123c321d1b07c2dc8b26d14092253b8") (:keywords "html" "auto-complete" "slim" "haml" "jade") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:url . "https://github.com/cheunghy/ac-html"))])
- (ac-html-angular . [(20151225 719) ((web-completion-data (0 1))) "auto complete angular15 data for `ac-html' and `company-web'" tar ((:commit . "6bafe09afe03112ca4183d58461c1a6f6c2b3c67") (:keywords "html" "auto-complete" "angular") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:url . "https://github.com/osv/ac-html-bootstrap"))])
- (ac-html-bootstrap . [(20160302 1701) ((web-completion-data (0 1))) "auto complete bootstrap3/fontawesome classes for `ac-html' and `company-web'" tar ((:commit . "481e6e441cd566554ce71cd8cb28c9e7ebb1c24b") (:keywords "html" "auto-complete" "bootstrap" "cssx") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:url . "https://github.com/osv/ac-html-bootstrap"))])
- (ac-html-csswatcher . [(20151208 2113) ((web-completion-data (0 1))) "css/less class/id completion with `ac-html' or `company-web'" single ((:commit . "b0f3e7e1a3fe49e88b6eb6432377232fc715f221") (:keywords "html" "css" "less" "auto-complete") (:authors ("Olexandr Sydorchuck " . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuck " . "olexandr.syd@gmail.com") (:url . "https://github.com/osv/ac-html-csswatcher"))])
- (ac-inf-ruby . [(20131115 1150) ((inf-ruby (2 3 2)) (auto-complete (1 4))) "Enable auto-complete in inf-ruby sessions" single ((:commit . "ee53fc9c61950da9a96df3ff5ef186f9a9faf151") (:keywords "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (ac-ispell . [(20151101 226) ((auto-complete (1 4)) (cl-lib (0 5))) "ispell completion source for auto-complete" single ((:commit . "22bace7387e9012002a6a444922f75f9913077b0") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-ispell"))])
- (ac-js2 . [(20190101 933) ((js2-mode (20090723)) (skewer-mode (1 4))) "Auto-complete source for Js2-mode, with navigation" tar ((:commit . "2b56d09a16c1a0ce514cc1b85d64cb1be4502723") (:authors ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainer "Scott Barnett" . "scott.n.barnett@gmail.com") (:url . "https://github.com/ScottyB/ac-js2"))])
- (ac-math . [(20141116 2127) ((auto-complete (1 4)) (math-symbol-lists (1 0))) "Auto-complete sources for input of mathematical symbols and latex tags" single ((:commit . "c012a8f620a48cb18db7d78995035d65eae28f11") (:keywords "latex" "auto-complete" "unicode" "symbols") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/vitoshka/ac-math"))])
- (ac-mozc . [(20150227 1619) ((cl-lib (0 5)) (auto-complete (1 4)) (mozc (0))) "auto-complete sources for Japanese input using Mozc" single ((:commit . "4c6c8be4701010d9362184437c0f783e0335c631") (:authors ("igjit" . "igjit1@gmail.com")) (:maintainer "igjit" . "igjit1@gmail.com") (:url . "https://github.com/igjit/ac-mozc"))])
- (ac-octave . [(20180406 334) ((auto-complete (1 4 0))) "An auto-complete source for Octave" single ((:commit . "fe0f931f2024f43de3c4fff4b1ace672413adeae") (:keywords "octave" "auto-complete" "completion") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "https://github.com/coldnew/ac-octave"))])
- (ac-php . [(20190424 222) ((ac-php-core (2 0)) (auto-complete (1 4 0)) (yasnippet (0 8 0))) "Auto Completion source for PHP." single ((:commit . "8db6d911f2e19bbef5fe915e42c4e12f283bfd41") (:keywords "completion" "convenience" "intellisense") (:authors ("jim" . "xcwenn@qq.com")) (:maintainer "jim") (:url . "https://github.com/xcwen/ac-php"))])
- (ac-php-core . [(20200516 52) ((dash (1)) (php-mode (1)) (s (1)) (f (0 17 0)) (popup (0 5 0)) (xcscope (1 0))) "The core library of the ac-php." tar ((:commit . "8db6d911f2e19bbef5fe915e42c4e12f283bfd41") (:keywords "completion" "convenience" "intellisense") (:authors ("jim" . "xcwenn@qq.com") ("Serghei Iakovlev" . "sadhooklay@gmail.com")) (:maintainer "jim") (:url . "https://github.com/xcwen/ac-php"))])
- (ac-racer . [(20170114 809) ((emacs (24 3)) (auto-complete (1 5 0)) (racer (0 0 2))) "auto-complete source of racer" single ((:commit . "4408c2d652dec0432e20c05e001db8222d778c6b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-racer"))])
- (ac-rtags . [(20191222 920) ((auto-complete (1 4 0)) (rtags (2 10))) "auto-complete back-end for RTags" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))])
- (ac-skk . [(20141230 119) ((auto-complete (1 3 1)) (ddskk (16 0 50)) (tinysegmenter (0)) (cl-lib (0 5))) "auto-complete-mode source for DDSKK a.k.a Japanese input method" single ((:commit . "d25a265930430d080329789fb253d786c01dfa24") (:keywords "convenience" "auto-complete") (:authors ("lugecy <https://twitter.com/lugecy>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/ac-skk.el"))])
- (ac-slime . [(20171027 2100) ((auto-complete (1 4)) (slime (2 9)) (cl-lib (0 5))) "An auto-complete source using slime completions" single ((:commit . "6c80cb602ddad46486288f94ad7546396c6e4b1a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/ac-slime"))])
- (ac-sly . [(20170728 1027) ((sly (1 0 0 -3)) (auto-complete (1 4)) (cl-lib (0 5))) "An auto-complete source using sly completions" single ((:commit . "bf69c687c4ecf1994349d20c182e9b567399912e") (:authors ("Damian T. Dobroczy\\'nski" . "qoocku@gmail.com")) (:maintainer "Damian T. Dobroczy\\'nski" . "qoocku@gmail.com") (:url . "https://github.com/qoocku/ac-sly"))])
- (academic-phrases . [(20180723 1021) ((dash (2 12 0)) (s (1 12 0)) (ht (2 0)) (emacs (24))) "Bypass that mental block when writing your papers." single ((:commit . "25d9cf67feac6359cb213f061735e2679c84187f") (:keywords "academic" "convenience" "papers" "writing" "wp") (:authors ("Nasser Alshammari" . "designernasser@gmail.com")) (:maintainer "Nasser Alshammari" . "designernasser@gmail.com") (:url . "https://github.com/nashamri/academic-phrases"))])
- (ace-flyspell . [(20170309 509) ((avy (0 4 0))) "Jump to and correct spelling errors using `ace-jump-mode' and flyspell" single ((:commit . "538d4f8508d305262ba0228dfe7c819fb65b53c9") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/ace-flyspell"))])
- (ace-isearch . [(20200420 518) ((emacs (24))) "A seamless bridge between isearch, ace-jump-mode, avy, helm-swoop and swiper" single ((:commit . "58e4f1ad5cbbd2f86d161881d3f3ded3a3db984c") (:authors ("Akira Tamamori")) (:maintainer "Akira Tamamori") (:url . "https://github.com/tam17aki/ace-isearch"))])
- (ace-jump-buffer . [(20171031 1550) ((avy (0 4 0)) (dash (2 4 0))) "fast buffer switching extension to `avy'" single ((:commit . "0d335064230caf3efdd5a732e8fbd67e3948ed6a") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/ace-jump-buffer"))])
- (ace-jump-helm-line . [(20160918 1836) ((avy (0 4 0)) (helm (1 6 3))) "Ace-jump to a candidate in helm window" single ((:commit . "1483055255df3f8ae349f7520f05b1e43ea3ed37") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/ace-jump-helm-line"))])
- (ace-jump-mode . [(20140616 815) nil "a quick cursor location minor mode for emacs" single ((:commit . "8351e2df4fbbeb2a4003f2fb39f46d33803f3dac") (:keywords "motion" "location" "cursor") (:authors ("winterTTr" . "winterTTr@gmail.com")) (:maintainer "winterTTr" . "winterTTr@gmail.com") (:url . "https://github.com/winterTTr/ace-jump-mode/"))])
- (ace-jump-zap . [(20170717 1849) ((ace-jump-mode (1 0)) (dash (2 10 0))) "Character zapping, `ace-jump-mode` style" single ((:commit . "52b5d4c6c73bd0fc833a0dcb4e803a5287d8cae8") (:keywords "convenience" "tools" "extensions") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/ace-jump-zap"))])
- (ace-link . [(20200518 957) ((avy (0 4 0))) "Quickly follow links" single ((:commit . "298f02f7dd117f9ec01f6aa2a2ddfecae0efb7f4") (:keywords "convenience" "links" "avy") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/ace-link"))])
- (ace-mc . [(20190206 749) ((ace-jump-mode (1 0)) (multiple-cursors (1 0)) (dash (2 10 0))) "Add multiple cursors quickly using ace jump" single ((:commit . "6877880efd99e177e4e9116a364576def3da391b") (:keywords "motion" "location" "cursor") (:authors ("Josh Moller-Mara" . "jmm@cns.nyu.edu")) (:maintainer "Josh Moller-Mara" . "jmm@cns.nyu.edu") (:url . "https://github.com/mm--/ace-mc"))])
- (ace-pinyin . [(20190917 318) ((avy (0 2 0)) (pinyinlib (0 1 0))) "Jump to Chinese characters using avy or ace-jump-mode" single ((:commit . "8b2e9335b02486730ea4ceee790130cc5328f9ea") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/ace-pinyin"))])
- (ace-popup-menu . [(20190713 1337) ((emacs (24 3)) (avy-menu (0 1))) "Replace GUI popup menu with something more efficient" single ((:commit . "390f0711d2a42675980d8b531fd5dc396b85f24b") (:keywords "convenience" "popup" "menu") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/ace-popup-menu"))])
- (ace-window . [(20200606 1259) ((avy (0 5 0))) "Quickly switch windows." single ((:commit . "c7cb315c14e36fded5ac4096e158497ae974bec9") (:keywords "window" "location") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/ace-window"))])
- (achievements . [(20150531 1317) ((keyfreq (0 0 3))) "Achievements for emacs usage." tar ((:commit . "c8275ee492d56255999d58f2988129ab29145182"))])
- (ack-menu . [(20150504 2022) ((mag-menu (0 1 0))) "A menu-based front-end for ack" single ((:commit . "f77be93a4697926ecf3195a355eb69580f695f4d") (:keywords "tools" "matching" "convenience") (:authors ("Steven Thomas") ("Nikolaj Schumacher")) (:maintainer "Steven Thomas") (:url . "https://github.com/chumpage/ack-menu"))])
- (acme-theme . [(20200724 1833) nil "A color theme based on Acme & Sam from Plan 9" single ((:commit . "e416ec678be72eb1aed3de3d88a8a9e3ee7315ca") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/acme-emacs-theme"))])
- (actionscript-mode . [(20180527 1701) nil "A simple mode for editing Actionscript 3 files" single ((:commit . "65abd58e198458a8e46748c5962c41d80d60c4ea") (:keywords "language" "modes") (:authors ("Austin Haas")) (:maintainer "Austin Haas"))])
- (activity-watch-mode . [(20200416 637) ((emacs (25)) (request (0)) (json (0)) (cl-lib (0))) "Automatic time tracking extension." single ((:commit . "9d591c5ec9a2b2c7b55a754dd37c7434b2ef9fdc") (:keywords "calendar" "comm") (:authors ("Gabor Torok <gabor@20y.hu>, Alan Hamlett" . "alan@wakatime.com")) (:maintainer "Paul d'Hubert" . "paul.dhubert@ya.ru") (:url . "https://github.com/pauldub/activity-watch-mode"))])
- (adafruit-wisdom . [(20200217 306) ((emacs (25 1)) (request (0 3 1))) "Get/display adafruit.com quotes" single ((:commit . "86bb7249bd4b0c8ebaf749f69f00c8faeff11063") (:keywords "games") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/gonewest818/adafruit-wisdom.el"))])
- (add-hooks . [(20171217 123) nil "Functions for setting multiple hooks" single ((:commit . "1845137703461fc44bd77cf24014ba58f19c369d") (:keywords "lisp") (:authors ("Nick McCurdy" . "nick@nickmccurdy.com")) (:maintainer "Nick McCurdy" . "nick@nickmccurdy.com") (:url . "https://github.com/nickmccurdy/add-hooks"))])
- (add-node-modules-path . [(20180710 2342) nil "Add node_modules to your exec-path" single ((:commit . "f31e69ccb681f882aebb806ce6e9478e3ac39708") (:keywords "javascript" "node" "node_modules" "eslint") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp") (:url . "https://github.com/codesuki/add-node-modules-path"))])
- (addressbook-bookmark . [(20190612 1638) ((emacs (24))) "An address book based on Standard Emacs bookmarks." single ((:commit . "d8e502fc2f3d3ab1508ce9e50ebf8a9addc6e5b3") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/addressbook-bookmark"))])
- (adoc-mode . [(20160314 2130) ((markup-faces (1 0 0))) "a major-mode for editing AsciiDoc files in Emacs" single ((:commit . "745884359a1b8826ede2c4cfd2f0b5478953ac40") (:keywords "wp" "asciidoc") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainer "Florian Kaufmann" . "sensorflo@gmail.com") (:url . "https://github.com/sensorflo/adoc-mode/wiki"))])
- (aes . [(20171029 623) nil "Implementation of AES" single ((:commit . "b7d5da89c3443292e4f0b1c9d254d459933cf5af") (:keywords "data" "tools") (:authors ("Markus Sauermann" . "emacs-aes@sauermann-consulting.de")) (:maintainer "Markus Sauermann" . "emacs-aes@sauermann-consulting.de") (:url . "https://github.com/Sauermann/emacs-aes"))])
- (afternoon-theme . [(20140104 1859) ((emacs (24 1))) "Dark color theme with a deep blue background" single ((:commit . "89b1d778a1f8b385775c122f2bd1c62f0fbf931a") (:keywords "themes") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:url . "http://github.com/osener/emacs-afternoon-theme"))])
- (ag . [(20190726 9) ((dash (2 8 0)) (s (1 9 0)) (cl-lib (0 5))) "A front-end for ag ('the silver searcher'), the C ack replacement." single ((:commit . "bd81d68466e44301505629454dfc689b6c17d94b") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (aggressive-fill-paragraph . [(20180910 816) ((dash (2 10 0))) "A mode to automatically keep paragraphs filled" single ((:commit . "2d65d925318006e2f6fa261ad192fbc2d212877b") (:keywords "fill-paragraph" "automatic" "comments") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/aggressive-fill-paragraph-mode"))])
- (aggressive-indent . [(20200512 1207) ((emacs (24 1)) (cl-lib (0 5))) "Minor mode to aggressively keep your code always indented" single ((:commit . "12a64b4e5c1a1e124baa74336738b6ae1972607f") (:keywords "indent" "lisp" "maint" "tools") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/aggressive-indent-mode"))])
- (agtags . [(20200730 116) ((emacs (25))) "A frontend to GNU Global" tar ((:commit . "d80c6f61dee74040c07b7010d48cab1df13a3abf") (:keywords "tools" "convenience") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com") (:url . "https://github.com/vietor/agtags"))])
- (ah . [(20191212 652) ((emacs (25 1))) "Additional hooks" single ((:commit . "3ca848bcf1fc4c18b4a5329d1439c5effb7dcb97") (:keywords "convenience") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:url . "https://github.com/takaxp/ah"))])
- (ahg . [(20200304 741) nil "Alberto's Emacs interface for Mercurial (Hg)" single ((:commit . "0ece48646ef7a8c813005934cc13f984b9998707") (:authors ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainer "Alberto Griggio" . "agriggio@users.sourceforge.net") (:url . "https://bitbucket.org/agriggio/ahg"))])
- (ahk-mode . [(20200412 1832) ((emacs (24 3))) "Major mode for editing AHK (AutoHotkey and AutoHotkey_L)" single ((:commit . "729007b5f22a49f5187ff47fca18c0d674e73047") (:keywords "ahk" "autohotkey" "hotkey" "keyboard shortcut" "automation") (:authors ("Rich Alesi")) (:maintainer "Rich Alesi") (:url . "https://github.com/ralesi/ahk-mode"))])
- (ahungry-theme . [(20180131 328) ((emacs (24))) "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." single ((:commit . "a038d91ec593d1f1b19ca66a0576d59bbc24c523") (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/color-theme-ahungry"))])
- (aio . [(20200610 1904) ((emacs (26 1))) "async/await for Emacs Lisp" tar ((:commit . "da93523e235529fa97d6f251319d9e1d6fc24a41") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacs-aio"))])
- (airline-themes . [(20200511 1543) ((powerline (2 3))) "vim-airline themes for emacs powerline" tar ((:commit . "a6a3bd55baee29bd372869c835aded0f7d5e5f76") (:keywords "evil" "mode-line" "powerline" "airline" "themes") (:authors ("Anthony DiGirolamo" . "anthony.digirolamo@gmail.com")) (:maintainer "Anthony DiGirolamo" . "anthony.digirolamo@gmail.com") (:url . "http://github.com/AnthonyDiGirolamo/airline-themes"))])
- (airplay . [(20130212 1226) ((request (20130110 2144)) (simple-httpd (1 4 1)) (deferred (0 3 1))) "Airplay bindings to Emacs" tar ((:commit . "bd690aafcae3a887946e1bba8327597932d964ad") (:keywords "appletv" "airplay") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:url . "https://github.com/gongo/airplay-el"))])
- (alan-mode . [(20200723 1405) ((flycheck (32)) (emacs (25 1)) (s (1 12))) "Major mode for editing Alan files" single ((:commit . "fc1fc0312b3e7f868f95b917a66719afb96f0c9a") (:keywords "alan" "languages") (:authors ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainer "Paul van Dam" . "pvandam@kjerner.com") (:url . "https://github.com/Kjerner/AlanForEmacs"))])
- (alarm-clock . [(20191204 716) ((emacs (24 4)) (f (0 17 0))) "Alarm Clock" tar ((:commit . "644f331071f8b09a898fae490541908b5054d2e6") (:keywords "calendar" "tools" "convenience") (:authors ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainer "Steve Lemuel" . "wlemuel@hotmail.com") (:url . "https://github.com/wlemuel/alarm-clock"))])
- (alchemist . [(20180312 1304) ((elixir-mode (2 2 5)) (dash (2 11 0)) (emacs (24 4)) (company (0 8 0)) (pkg-info (0 4)) (s (1 11 0))) "Elixir tooling integration into Emacs" tar ((:commit . "6f99367511ae209f8fe2c990779764bbb4ccb6ed") (:keywords "languages" "elixir" "elixirc" "mix" "hex" "alchemist") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:url . "http://www.github.com/tonini/alchemist.el"))])
- (alda-mode . [(20180608 605) ((emacs (24 0))) "An Alda major mode" single ((:commit . "1692b9003d2c3de403251ec452c6ce43ec819c84") (:keywords "alda" "highlight") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:url . "http://gitlab.com/jgkamat/alda-mode"))])
- (alect-themes . [(20190506 1440) ((emacs (24 0))) "Configurable light, dark and black themes for Emacs 24 or later" tar ((:commit . "da7305075d292cc1909bf26dc5634bc3cc8d2603") (:keywords "color" "theme") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/alect-themes"))])
- (alert . [(20200303 2118) ((gntp (0 1)) (log4e (0 3 0)) (cl-lib (0 5))) "Growl-style notification system for Emacs" single ((:commit . "7046393272686c7a1a9b3e7f7b1d825d2e5250a6") (:keywords "notification" "emacs" "message") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:url . "https://github.com/jwiegley/alert"))])
- (alert-termux . [(20181119 951) ((emacs (24 4))) "alert.el notifications on Termux" single ((:commit . "47c414285c2f5971f3be52aaf0a4066ea6989238") (:keywords "terminals") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:url . "https://github.com/gergelypolonkai/alert-termux"))])
- (align-cljlet . [(20160112 2101) ((clojure-mode (1 11 5))) "Space align various Clojure forms" single ((:commit . "602d72a7ad52788a0265e3c6da519464a98166b8") (:url . "https://github.com/gstamp/align-cljlet"))])
- (all-ext . [(20200315 1443) ((emacs (24 4)) (all (1 0))) "M-x all with helm-swoop/anything/multiple-cursors/line-number" single ((:commit . "c865c62506af2c9edc7705a7c24dc8b70d5d4de2") (:keywords "matching" "all" "search" "replace" "anything" "helm" "helm-swoop" "occur") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "https://github.com/rubikitch/all-ext"))])
- (all-the-icons . [(20200730 1545) ((emacs (24 3)) (memoize (1 0 1))) "A library for inserting Developer icons" tar ((:commit . "8c0228053dd6693d926970d89270094be52b0f75") (:keywords "convenient" "lisp") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:url . "https://github.com/domtronn/all-the-icons.el"))])
- (all-the-icons-dired . [(20200403 1018) ((emacs (24 4)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" single ((:commit . "fc2dfa1e9eb8bf1c402a675e7089638d702a27a5") (:keywords "files" "icons" "dired") (:authors ("jtbm37")) (:maintainer "jtbm37") (:url . "https://github.com/jtbm37/all-the-icons-dired"))])
- (all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" single ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:keywords "mail" "tools") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))])
- (all-the-icons-ibuffer . [(20200612 1642) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "16f784d1e3f78afe6be60653f120768243d06d9e") (:keywords "convenience" "icons" "ibuffer") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))])
- (all-the-icons-ivy . [(20190508 1803) ((emacs (24 4)) (all-the-icons (2 4 0)) (ivy (0 8 0))) "Shows icons while using ivy and counsel" single ((:commit . "a70cbfa1effe36efc946a823a580cec686d5e88d") (:keywords "faces") (:authors ("asok")) (:maintainer "asok"))])
- (all-the-icons-ivy-rich . [(20200704 1638) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "a87cd16933920e67da54323c26aa668d8987e329") (:keywords "convenience" "icons" "ivy") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))])
- (almost-mono-themes . [(20200211 2126) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "2f5935a1a9d042751c7135cac79875886edb2556") (:keywords "faces") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:url . "https://github.com/cryon/almost-mono-themes"))])
- (alsamixer . [(20191002 1133) nil "Functions to call out to amixer." single ((:commit . "1bdb99e433acd38685f05408562746cfbf2bc820") (:keywords "convenience") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:url . "https://github.com/remvee/alsamixer-el"))])
- (alt-codes . [(20200723 1037) ((emacs (24 4))) "Insert alt codes using meta key" single ((:commit . "b36c2b2bccc628da1579016381d5c3195c9e12b2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/alt-codes"))])
- (amd-mode . [(20180111 1402) ((emacs (25)) (projectile (20161008 47)) (s (1 9 0)) (f (0 16 2)) (seq (2 16)) (makey (0 3)) (js2-mode (20140114)) (js2-refactor (0 6 1))) "Minor mode for handling JavaScript AMD module requirements." single ((:commit . "01fd19e0d635ccaf8e812364d8720733f2e84126") (:keywords "javascript" "amd" "projectile") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (ameba . [(20200103 1454) ((emacs (24 4))) "An interface to Crystal Ameba linter" single ((:commit . "0c4925ae0e998818326adcb47ed27ddf9761c7dc") (:keywords "convenience") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:url . "https://github.com/crystal-ameba/ameba.el"))])
- (ammonite-term-repl . [(20200416 559) ((emacs (24 3)) (s (1 12 0)) (scala-mode (0 23))) "Scala Ammonite REPL in term mode." single ((:commit . "b552fe21977e005c1c460bf6607557e67241a6b6") (:keywords "processes" "ammnite" "term" "scala") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:url . "https://github.com/zwild/ammonite-term-repl"))])
- (ample-regexps . [(20200508 1021) nil "ample regular expressions for Emacs" tar ((:commit . "153969ce547afe410b8986f01c9ed4087c9cd20b") (:keywords "regexps" "extensions" "tools") (:authors ("immerrr" . "immerrr@gmail.com")) (:maintainer "immerrr" . "immerrr@gmail.com"))])
- (ample-theme . [(20180207 1745) nil "Calm Dark Theme for Emacs" tar ((:commit . "f5a163626e04abda2d3c168f703c3f330f302a7c") (:keywords "theme" "dark") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:url . "https://github.com/jordonbiondo/ample-theme"))])
- (ample-zen-theme . [(20150119 2154) nil "AmpleZen Theme for Emacs 24" single ((:commit . "b277bb7abd4b6624e8d59f02474b79af50a007bd") (:keywords "theme" "dark" "emacs 24") (:authors ("Michael Wall")) (:maintainer "Michael Wall") (:url . "https://github.com/mjwall/ample-zen"))])
- (amread-mode . [(20200623 1544) ((emacs (24 3)) (cl-lib (0 6 1))) "A minor mode helper user speed-reading" single ((:commit . "7b1ed6c8aea409e2dce4a3b59f304d716a8efab7") (:keywords "wp") (:url . "https://github.com/stardiviner/amread-mode"))])
- (amx . [(20200701 2108) ((emacs (24 4)) (s (0))) "Alternative M-x with extra features." single ((:commit . "ccfc92c600df681df5e8b5fecec328c462ceb71e") (:keywords "convenience" "usability") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:url . "http://github.com/DarwinAwardWinner/amx/"))])
- (anaconda-mode . [(20200728 103) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 6 0)) (s (1 9)) (f (0 16 2))) "Code navigation, documentation lookup and completion for Python" single ((:commit . "bfe30866dcf3d07e6a727f97b6f1fda84d2f4a79") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/anaconda-mode"))])
- (anakondo . [(20200503 123) ((emacs (26 3)) (projectile (2 1 0)) (clojure-mode (5 11 0))) "Adds clj-kondo based Clojure[Script] editing facilities" single ((:commit . "ba6b56c18f2b0ae035b448813b27114d19fb821c") (:keywords "clojure" "clojurescript" "cljc" "clj-kondo" "completion" "languages" "tools") (:authors ("Didier A." . "didibus@users.noreply.github.com")) (:maintainer "Didier A." . "didibus@users.noreply.github.com") (:url . "https://github.com/didibus/anakondo"))])
- (anaphora . [(20180618 2200) nil "anaphoric macros providing implicit temp variables" single ((:commit . "3b2da3f759b244975852e79721c4a2dbad3905cf") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/anaphora"))])
- (android-env . [(20200722 1403) ((emacs (24 3))) "Helper functions for working in android" single ((:commit . "5c6a6d9449f300eec4f374a5410edc1cbab02e40") (:keywords "android" "gradle" "java" "tools" "convenience") (:authors ("Fernando Jascovich")) (:maintainer "Fernando Jascovich") (:url . "https://github.com/fernando-jascovich/android-env.el"))])
- (android-mode . [(20190903 811) nil "Minor mode for Android application development" single ((:commit . "d5332e339a1f5e30559a53feffb8442ca79265d6") (:keywords "tools" "processes") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:url . "https://github.com/remvee/android-mode"))])
- (angry-police-captain . [(20120829 1252) nil "Show quote from http://theangrypolicecaptain.com in the minibuffer" single ((:commit . "d11931c5cb63368dcc4a48797962428cca6d3e9d") (:keywords "games" "web" "fun") (:authors ("Rolando Pereira" . "rolando_pereira@sapo.pt")) (:maintainer "Rolando Pereira" . "rolando_pereira@sapo.pt"))])
- (angular-mode . [(20200510 1729) nil "Major mode for Angular.js" tar ((:commit . "b24020768217f16b1b86aa236e9729b3d40e17b3") (:keywords "languages" "javascript") (:authors ("Rudolf Olah")) (:maintainer "Rudolf Olah") (:url . "https://github.com/rudolfolah/angularjs-mode"))])
- (angular-snippets . [(20140514 523) ((s (1 4 0)) (dash (1 2 0))) "Yasnippets for AngularJS" tar ((:commit . "af5ae0a4a8603b040446c28afcf6ca01a8b4bd7b"))])
- (anki-connect . [(20191123 1858) ((emacs (24 3))) "AnkiConnect API" single ((:commit . "1324f0c248aa2c6e73d6cf93fad6119d699f7dae") (:keywords "lisp" "anki") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/anki-connect.el"))])
- (anki-editor . [(20190922 1223) ((emacs (25)) (request (0 3 0)) (dash (2 12 0))) "Minor mode for making Anki cards with Org" tar ((:commit . "546774a453ef4617b1bcb0d1626e415c67cc88df") (:authors ("Lei Tan")) (:maintainer "Lei Tan") (:url . "https://github.com/louietan/anki-editor"))])
- (anki-mode . [(20200703 736) ((emacs (24 4)) (dash (2 12 0)) (markdown-mode (2 2)) (s (1 11 0)) (request (0 3 0))) "A major mode for creating anki cards" single ((:commit . "3918e4f7b2f14e485cc3acc927abe6563695963f") (:keywords "tools") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/anki-mode"))])
- (anki-vocabulary . [(20200103 325) ((emacs (24 4)) (s (1 0)) (youdao-dictionary (0 4)) (anki-connect (1 0)) (s (1 10))) "Help you to create vocabulary cards in Anki" single ((:commit . "863fe0219577f996ab126f1b7902db3c2cc59b2b") (:keywords "lisp" "anki" "translator" "chinese") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/anki-vocabulary.el"))])
- (annalist . [(20190929 207) ((emacs (24 4)) (cl-lib (0 5))) "Record and display information such as keybindings" tar ((:commit . "134fa3f0fb91a636a1c005c483516d4b64905a6d") (:keywords "convenience" "tools" "keybindings" "org") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:url . "https://github.com/noctuid/annalist.el"))])
- (annotate . [(20200730 1341) nil "annotate files without changing them" single ((:commit . "d4b555d2374f60edd56d196df535523da422a005") (:authors ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "https://github.com/bastibe/annotate.el"))])
- (annotate-depth . [(20160520 2040) nil "Annotate buffer if indentation depth is beyond threshold." single ((:commit . "fcb24fa36287250e40d195590c4ca4a8a696277b") (:keywords "convenience") (:authors ("Morten Slot Kristensen <msk AT nullpointer DOT dk>")) (:maintainer "Morten Slot Kristensen <msk AT nullpointer DOT dk>") (:url . "https://github.com/netromdk/annotate-depth"))])
- (annoying-arrows-mode . [(20161024 646) ((cl-lib (0 5))) "Ring the bell if using arrows too much" single ((:commit . "3c42e9807d7696da2da2a21b63beebf9cdb3f5dc") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (ansi . [(20200611 944) ((emacs (24 1)) (cl-lib (0 6)) (s (1 6 1)) (dash (1 5 0))) "Turn string into ansi strings" single ((:commit . "a41d5cc719297515d85bb5256980cd1204a71b88") (:keywords "terminals" "color" "ansi") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/ansi"))])
- (ansible . [(20200704 1354) ((s (1 9 0)) (f (0 16 2))) "Ansible minor mode" tar ((:commit . "b5ef59406604bc5027f4d816d90e633feef0149c") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "http://101000lab.org"))])
- (ansible-doc . [(20160924 824) ((emacs (24 3))) "Ansible documentation Minor Mode" single ((:commit . "86083a7bb2ed0468ca64e52076b06441a2f8e9e0") (:keywords "tools" "help") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn") (:url . "https://github.com/lunaryorn/ansible-doc.el"))])
- (ansible-vault . [(20200305 2240) ((emacs (24 3)) (seq (2 20))) "Minor mode for editing ansible vault files" single ((:commit . "c4fe4b0af2ac7f9d32acee234716ab31fa824cef") (:keywords "ansible" "ansible-vault" "tools") (:maintainer "Zachary Elliott" . "contact@zell.io") (:url . "http://github.com/zellio/ansible-vault-mode"))])
- (ant . [(20160211 1543) nil "helpers for compiling with ant" single ((:commit . "510b5a3f57ee4b2855422d88d359a28922c1ab70") (:keywords "compilation" "ant" "java"))])
- (anti-zenburn-theme . [(20180712 1838) nil "Low-contrast Zenburn-inverted theme" single ((:commit . "dbafbaa86be67c1d409873f57a5c0bbe1e7ca158") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:url . "https://github.com/m00natic/anti-zenburn-theme"))])
- (anx-api . [(20140208 1514) nil "Interact with the AppNexus API from Emacs." single ((:commit . "b2411ebc966ac32c3ffc61bc22bf183834df0fa0") (:keywords "convenience" "json" "rest" "api" "appnexus") (:authors ("Rich Loveland")) (:maintainer "Rich Loveland"))])
- (anybar . [(20160816 1421) nil "Control AnyBar from Emacs" single ((:commit . "7a0743e0d31bcb36ab1bb2e351f3e7139c422ac5") (:keywords "anybar") (:authors ("Christopher Shea" . "cmshea@gmail.com")) (:maintainer "Christopher Shea" . "cmshea@gmail.com"))])
- (anyins . [(20131229 1041) nil "Insert content at multiple places from shell command or kill-ring" single ((:commit . "83844c17ac9b5b6c7655ee556b75689e4c8ea663") (:keywords "insert" "rectangular") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:url . "http://github.com/antham/anyins"))])
- (anzu . [(20200514 1801) ((emacs (24 3))) "Show number of matches in mode-line while searching" single ((:commit . "7b8688c84d6032300d0c415182c7c1ad6cb7f819") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/anzu"))])
- (aozora-view . [(20140310 1317) nil "Aozora Bunko text Emacs viewer." tar ((:commit . "b0390616d19e45f15f9a2f5d5688274831e721fd") (:keywords "text") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/aozora-view"))])
- (apache-mode . [(20190711 1111) nil "Major mode for editing Apache httpd configuration files" single ((:commit . "a66dc1f246cd4ce0960773989bc43188f0394948") (:keywords "languages" "faces") (:authors ("Karl Chen" . "quarl@nospam.quarl.org")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/apache-mode"))])
- (apdl-mode . [(20200501 1904) ((emacs (25 1))) "Major mode for the APDL programming language." tar ((:commit . "ee5f546f6659b9ca3c6895a1959087531b4a016a") (:url . "https://github.com/dieter-wilhelm/apdl-mode") (:maintainer "H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")) (:keywords "APDL" "Ansys" "languages" "FEA" "convenience" "tools"))])
- (apel . [(20190407 1056) nil "APEL (A Portable Emacs Library) provides support for portable Emacs Lisp programs" tar ((:commit . "d146ddbf8818e81d3577d5eee7825d377bec0c73"))])
- (apib-mode . [(20200101 1017) ((markdown-mode (2 1))) "Major mode for API Blueprint files" single ((:commit . "c6dd05201f6eb9295736d8668a79a7510d11159e") (:keywords "tools" "api-blueprint") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz") (:url . "http://github.com/w-vi/apib-mode"))])
- (apiwrap . [(20180602 2231) ((emacs (25))) "api-wrapping macros" single ((:commit . "a4fb21d96027369307b22439a4a6c765ee272f44") (:keywords "tools" "maint" "convenience") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:url . "https://github.com/vermiculus/apiwrap.el"))])
- (apples-mode . [(20110121 418) nil "Major mode for editing and executing AppleScript code" tar ((:commit . "83a9ab0d6ba82496e2f7df386909b1a55701fccb") (:keywords "applescript" "languages") (:authors ("tequilasunset" . "tequilasunset.mac@gmail.com")) (:maintainer "tequilasunset" . "tequilasunset.mac@gmail.com"))])
- (applescript-mode . [(20090321 632) nil "major mode for editing AppleScript source" single ((:commit . "8f888cd80af1e0902b5609143facd3051bc94892") (:keywords "languages" "tools") (:authors ("sakito" . "sakito@users.sourceforge.jp")) (:maintainer "sakito" . "sakito@users.sourceforge.jp"))])
- (aproject . [(20190730 152) nil "Basic project framework for Emacs" tar ((:commit . "b534e2a62738ad59a8a3cddd386466c145dad3b2") (:keywords "environment" "project") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com") (:url . "https://github.com/vietor/aproject"))])
- (apropospriate-theme . [(20191220 2017) nil "A colorful, low-contrast, light & dark theme set for Emacs with a fun name." tar ((:commit . "543341f0836b24e001375c530c4706e9345ec1e3") (:keywords "color" "theme") (:url . "https://github.com/waymondo/apropospriate-theme"))])
- (apt-sources-list . [(20180527 1241) ((emacs (24 4))) "Mode for editing APT source.list files" single ((:commit . "5289443ceff230dfc8a2c1c6b524c90560eb08a5") (:authors ("Dr. Rafael Sepúlveda" . "drs@gnulinux.org.mx")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:url . "https://git.korewanetadesu.com/apt-sources-list.git"))])
- (aqi . [(20200215 1334) ((emacs (25 1)) (request (0 3)) (let-alist (0 0))) "Air quality data from the World Air Quality Index" single ((:commit . "5fe8b035b2b6bc165728444bb8e9792d14b7409d") (:keywords "air quality" "aqi" "pollution" "weather" "data") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:url . "https://github.com/zzkt/aqi"))])
- (arc-dark-theme . [(20190314 1632) ((emacs (24))) "Arc dark theme" single ((:commit . "ee17dcca35dd0304145efc468b3f25af6907a59d") (:keywords "faces" "theme") (:authors ("Christopher Fraser" . "cfraz89@gmail.com")) (:maintainer "Christopher Fraser" . "cfraz89@gmail.com") (:url . "https://github.com/cfraz89/arc-dark-theme"))])
- (arch-packer . [(20170730 1321) ((emacs (25 1)) (s (1 11 0)) (async (1 9 2)) (dash (2 12 0))) "Arch Linux package management frontend" single ((:commit . "940e96f7d357c6570b675a0f942181c787f1bfd7") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeitmacher/arch-packer"))])
- (archive-region . [(20200316 1425) ((emacs (24 4))) "Move region to archive file instead of killing" single ((:commit . "53cd2d96ea7c33f320353982b36854f25c900c2e") (:keywords "languages") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/archive-region.el"))])
- (archive-rpm . [(20180706 1232) ((emacs (24 4))) "RPM and CPIO support for archive-mode" tar ((:commit . "59f83caebbd2f92fd634f6968e6d17b50ffa3dc7"))])
- (arduino-cli-mode . [(20200615 919) ((emacs (25 1))) "Arduino-CLI command wrapper" single ((:commit . "73317fff4d58a20ff75c83053ad314eea7d22611") (:keywords "extensions" "processes" "arduino") (:authors ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:url . "https://github.com/motform/arduino-cli-mode"))])
- (arduino-mode . [(20180509 36) ((emacs (25)) (cl-lib (0 5)) (spinner (1 7 3))) "Major mode for editing Arduino code." tar ((:commit . "23ae47c9f28f559e70b790b471f20310e163a39b") (:keywords "languages" "arduino") (:maintainer "stardiviner" . "numbchild@gmail.com") (:url . "https://github.com/stardiviner/arduino-mode"))])
- (aria2 . [(20190816 25) ((emacs (24 4))) "Control aria2c commandline tool from Emacs" single ((:commit . "32e08d5a8ad2f305578e0f783e087c1d312238c7") (:keywords "download" "bittorrent" "aria2") (:authors ("Łukasz Gruner" . "lukasz@gruner.lu")) (:maintainer "Łukasz Gruner" . "lukasz@gruner.lu") (:url . "https://bitbucket.org/ukaszg/aria2-mode"))])
- (ariadne . [(20131117 1711) ((bert (0 1))) "Ariadne plugin for Emacs" single ((:commit . "6fe401c7f996bcbc2f685e7971324c6f5e5eaf15") (:keywords "comm" "convenience" "processes") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com"))])
- (arjen-grey-theme . [(20170522 2047) nil "A soothing dark grey theme" single ((:commit . "4cd0be72b65d42390e2105cfdaa408a1ead8d8d1") (:keywords "faces") (:authors ("Arjen Wiersma" . "arjen@wiersma.org")) (:maintainer "Arjen Wiersma" . "arjen@wiersma.org") (:url . "https://github.com/credmp/arjen-grey"))])
- (artbollocks-mode . [(20170524 422) nil "Improve your writing (especially about art)" single ((:commit . "33a41ca4f8206f57e5498a526d3b0ea18d08bb93") (:authors ("Rob Myers <rob@robmyers.org>, Sacha Chua" . "sacha@sachachua.com")) (:maintainer "Rob Myers <rob@robmyers.org>, Sacha Chua" . "sacha@sachachua.com") (:url . "https://github.com/sachac/artbollocks-mode"))])
- (arview . [(20160419 2109) nil "extract and view archives in the temporary directory" single ((:commit . "5437b4221b64b238c273a651d4792c577dba6d45") (:keywords "files") (:authors ("Andrey Fainer" . "fandrey@gmx.com")) (:maintainer "Andrey Fainer" . "fandrey@gmx.com") (:url . "https://github.com/afainer/arview"))])
- (ascii-table . [(20200329 1744) ((emacs (24 3)) (cl-lib (0 5))) "Interactive ASCII table" single ((:commit . "572b62c8305b8c26082a17e15bc2f53066ddcb5a") (:keywords "help" "tools") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-ascii-table"))])
- (asilea . [(20150105 1525) ((emacs (24)) (cl-lib (0 5))) "Find best compiler options using simulated annealing" single ((:commit . "2aab1cc63b64ef08d12e84fd7ba5c94065f6039f") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/asilea"))])
- (asn1-mode . [(20170729 226) ((emacs (24 3)) (s (1 10 0))) "ASN.1/GDMO mode for GNU Emacs" single ((:commit . "d5d4a8259daf708411699bcea85d322f18beb972") (:keywords "languages" "processes" "tools") (:authors ("Taichi Kawabata <kawabata.taichi_at_gmail.com>")) (:maintainer "Taichi Kawabata <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/asn1-mode/"))])
- (assess . [(20200211 1817) ((emacs (24 4)) (m-buffer (0 15))) "Test support functions" tar ((:commit . "5bac045b273623772b6a2d820997d50f7ab4e466") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))])
- (astyle . [(20200328 616) ((emacs (24 4)) (reformatter (0 3))) "Astyle formatter functions" single ((:commit . "04ff2941f08c4b731fe6a18ee1697436d1ca1cc0") (:keywords "astyle" "c" "c++" "cpp" "reformatter") (:authors ("Petter Storvik")) (:maintainer "Petter Storvik") (:url . "https://github.com/storvik/emacs-astyle"))])
- (asx . [(20191024 1100) ((emacs (26 1))) "Ask StackExchange/StackOverflow" single ((:commit . "ec4bf74de602b97df1f306d51acf4cda45184aac") (:keywords "convenience") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:url . "https://github.com/ragone/asx"))])
- (async . [(20200113 1745) ((emacs (24 3))) "Asynchronous processing in Emacs" tar ((:commit . "86aef2c38e7d35e8509b7feeee3e989d825eba91") (:keywords "async") (:url . "https://github.com/jwiegley/emacs-async"))])
- (async-await . [(20200117 828) ((emacs (25 1)) (promise (1 1)) (iter2 (0 9 10))) "Async/Await" single ((:commit . "deef2bb343463f5196545f1dd8c2a32d0cb3b146") (:keywords "async" "await" "convenience") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:url . "https://github.com/chuntaro/emacs-async-await"))])
- (atcoder-tools . [(20200109 1236) ((emacs (26)) (f (0 20)) (s (1 12))) "An atcoder-tools client" single ((:commit . "cfe61ed18ea9b3b1bfb6f9e7d80a47599680cd1f") (:keywords "extensions" "tools") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:url . "https://github.com/sei40kr/atcoder-tools"))])
- (atom-dark-theme . [(20181022 1602) nil "An Emacs port of the Atom Dark theme from Atom.io." single ((:commit . "5c8610d0b45a536b8f7f9777297c86362685a357") (:keywords "themes" "atom" "dark") (:authors (nil . "Jeremy Whitlock <jwhitlock@apache.org")) (:maintainer nil . "Jeremy Whitlock <jwhitlock@apache.org") (:url . "https://github.com/whitlockjc/atom-dark-theme-emacs"))])
- (atom-one-dark-theme . [(20190705 554) nil "Atom One Dark color theme" single ((:commit . "623fc08252e30174401750a09168279571288c7f") (:authors ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainer "Jonathan Chu" . "me@jonathanchu.is") (:url . "https://github.com/jonathanchu/atom-one-dark-theme"))])
- (atomic-chrome . [(20180617 724) ((emacs (24 3)) (let-alist (1 0 4)) (websocket (1 4))) "Edit Chrome text area with Emacs using Atomic Chrome" single ((:commit . "a505f638866f9e7b913784be0dc84f338e9ad449") (:keywords "chrome" "edit" "textarea") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:url . "https://github.com/alpha22jp/atomic-chrome"))])
- (attrap . [(20200114 1928) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (s (1 11 0))) "ATtempt To Repair At Point" single ((:commit . "4cf3e4a16255997e7c3c39682a72866a0a37dd4b") (:keywords "programming" "tools") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:url . "https://github.com/jyp/attrap"))])
- (auctex-cluttex . [(20200531 402) ((emacs (24 4)) (auctex (12 2))) "ClutTeX support for AUCTeX" single ((:commit . "7e36dcb88c0021e48e7a095257e63e2913f75789") (:keywords "tex") (:authors ("Masahiro Nakamura" . "tsuucat@icloud.com")) (:maintainer "Masahiro Nakamura" . "tsuucat@icloud.com") (:url . "https://github.com/tsuu32/auctex-cluttex"))])
- (auctex-latexmk . [(20170618 1636) ((auctex (11 87))) "Add LatexMk support to AUCTeX" single ((:commit . "4d353522650d7685acbf1d38f7dbc504f734bd84") (:keywords "tex") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/auctex-latexmk/"))])
- (auctex-lua . [(20151121 1610) ((auctex (11 86)) (lua-mode (20130419))) "Lua editing support for AUCTeX" single ((:commit . "799cd8ac10c96991bb63d9aa60528ae5d8c786b5") (:keywords "latex" "lua") (:authors ("Sean Allred" . "seallred@smcm.edu")) (:maintainer "Sean Allred" . "seallred@smcm.edu") (:url . "http://github.com/vermiculus/auctex-lua"))])
- (audio-notes-mode . [(20170611 2159) nil "Play audio notes synced from somewhere else." single ((:commit . "fa38350829c7e97257efc746a010471d33748a68") (:keywords "hypermedia" "convenience") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/audio-notes-mode"))])
- (aurel . [(20170114 937) ((emacs (24 3)) (bui (1 1 0)) (dash (2 11 0))) "Search, get info, vote for and download AUR packages" single ((:commit . "fc7ad208f43f8525f84a18941c9b55f956df8961") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/aurel"))])
- (aurora-config-mode . [(20180216 2302) nil "Major mode for Apache Aurora configuration files" single ((:commit . "8273ec7937a21b469b9dbb6c11714255b890f410") (:keywords "languages" "configuration") (:authors ("Berk D. Demir" . "bdd@mindcast.org")) (:maintainer "Berk D. Demir" . "bdd@mindcast.org") (:url . "https://github.com/bdd/aurora-config.el"))])
- (auth-source-pass . [(20191126 1242) ((emacs (26 1))) "Integrate auth-source with password-store" single ((:commit . "ff4940c647786914b3cbef69103d96a4ea334111") (:authors ("Damien Cassou" . "damien@cassou.me") ("Nicolas Petton" . "nicolas@petton.fr") ("Keith Amidon" . "camalot@picnicpark.org")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/auth-password-store"))])
- (auth-source-xoauth2 . [(20200509 2304) ((emacs (26 1))) "Integrate auth-source with XOAUTH2" single ((:commit . "0daccb02762fbb9dcbd794a05ffc14b221c57647") (:authors ("Cesar Crusius" . "ccrusius@google.com")) (:maintainer "Cesar Crusius" . "ccrusius@google.com") (:url . "https://github.com/ccrusius/auth-source-xoauth2"))])
- (auto-async-byte-compile . [(20160916 454) nil "Automatically byte-compile when saved" single ((:commit . "8681e74ddb8481789c5dbb3cafabb327db4c4484") (:keywords "lisp" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/auto-async-byte-compile.el"))])
- (auto-auto-indent . [(20131106 1903) ((es-lib (0 1)) (cl-lib (1 0))) "Indents code as you type" single ((:commit . "0139378577f936d34b20276af6f022fb457af490") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/auto-auto-indent"))])
- (auto-compile . [(20191020 1040) ((emacs (25 1)) (packed (3 0 0))) "automatically compile Emacs Lisp libraries" single ((:commit . "3e92c5b1a94b0cf43f2d624180a1cb01df92afd8") (:keywords "compile" "convenience" "lisp") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/auto-compile"))])
- (auto-complete . [(20170125 245) ((popup (0 5 0)) (cl-lib (0 5))) "Auto Completion for GNU Emacs" tar ((:commit . "c0836fa0662095071e3c40237db611063e3c3ceb"))])
- (auto-complete-auctex . [(20140223 1758) ((yasnippet (0 6 1)) (auto-complete (1 4))) "auto-completion for auctex" single ((:commit . "855633f668bcc4b9408396742a7cb84e0c4a2f77") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))])
- (auto-complete-c-headers . [(20150912 323) ((auto-complete (1 4))) "An auto-complete source for C/C++ header files" single ((:commit . "52fef720c6f274ad8de52bef39a343421006c511") (:keywords "c") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com"))])
- (auto-complete-chunk . [(20140225 946) ((auto-complete (1 4))) "Auto-completion for dot.separated.words." single ((:commit . "a9aa77ffb84a1037984a7ce4dda25074272f13fe") (:authors ("ARAKAKI, Takafumi")) (:maintainer "ARAKAKI, Takafumi") (:url . "https://github.com/tkf/auto-complete-chunk"))])
- (auto-complete-clang . [(20140409 752) ((auto-complete (1 3 1))) "Auto Completion source for clang for GNU Emacs" single ((:commit . "a195db1d0593b4fb97efe50885e12aa6764d998c") (:keywords "completion" "convenience") (:authors ("Brian Jiang" . "brianjcj@gmail.com")) (:maintainer "Brian Jiang" . "brianjcj@gmail.com") (:url . "https://github.com/brianjcj/auto-complete-clang"))])
- (auto-complete-clang-async . [(20130526 1514) nil "Auto Completion source for clang for GNU Emacs" single ((:commit . "5d9c5cabbb6b31e0ac3637631c0c8b25184aa8b4") (:keywords "completion" "convenience"))])
- (auto-complete-distel . [(20180827 1344) ((auto-complete (1 4)) (distel-completion-lib (1 0 0))) "Erlang/distel completion backend for auto-complete-mode" single ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:keywords "erlang" "distel" "auto-complete") (:authors ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:url . "github.com/sebastiw/distel-completion"))])
- (auto-complete-exuberant-ctags . [(20140320 724) ((auto-complete (1 4 0))) "Exuberant ctags auto-complete.el source" single ((:commit . "ff6121ff8b71beb5aa606d28fd389c484ed49765") (:keywords "anto-complete" "exuberant ctags") (:authors ("Kenichirou Oyama" . "k1lowxb@gmail.com")) (:maintainer "Kenichirou Oyama" . "k1lowxb@gmail.com") (:url . "http://code.101000lab.org"))])
- (auto-complete-nxml . [(20140221 458) ((auto-complete (1 4))) "do completion by auto-complete.el on nXML-mode" single ((:commit . "ac7b09a23e45f9bd02affb31847263de4180163a") (:keywords "completion" "html" "xml") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/auto-complete-nxml"))])
- (auto-complete-pcmp . [(20140227 651) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 1))) "Provide auto-complete sources using pcomplete results" single ((:commit . "2595d3dab1ef3549271ca922f212928e9d830eec") (:keywords "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/auto-complete-pcmp"))])
- (auto-complete-rst . [(20140225 944) ((auto-complete (1 4))) "Auto-complete extension for ReST and Sphinx" tar ((:commit . "4803ce41a96224e6fa54e6741a5b5f40ebed7351") (:authors ("ARAKAKI, Takafumi")) (:maintainer "ARAKAKI, Takafumi") (:url . "https://github.com/tkf/auto-complete-rst"))])
- (auto-complete-sage . [(20160514 751) ((auto-complete (1 5 1)) (sage-shell-mode (0 1 0))) "An auto-complete source for sage-shell-mode." single ((:commit . "51b8e3905196d266e1f8aa47881189833151b398") (:keywords "sage" "math" "auto-complete") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:url . "https://github.com/stakemori/auto-complete-sage"))])
- (auto-dictionary . [(20150410 1610) nil "automatic dictionary switcher for flyspell" single ((:commit . "b364e08009fe0062cf0927d8a0582fad5a12b8e7") (:keywords "wp") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/auto-dictionary/"))])
- (auto-dim-other-buffers . [(20200704 122) nil "Makes windows without focus less prominent" single ((:commit . "82626612bd1c4c5f36d110f6bff3f93c33b4149e") (:authors ("Michal Nazarewicz" . "mina86@mina86.com")) (:maintainer "Michal Nazarewicz" . "mina86@mina86.com") (:url . "https://github.com/mina86/auto-dim-other-buffers.el"))])
- (auto-highlight-symbol . [(20130313 943) nil "Automatic highlighting current symbol minor mode" single ((:commit . "26573de912d760e04321b350897aea70958cee8b") (:keywords "highlight" "face" "match" "convenience") (:authors ("Mitsuo Saito" . "arch320@NOSPAM.gmail.com")) (:maintainer "Mitsuo Saito" . "arch320@NOSPAM.gmail.com") (:url . "http://github.com/gennad/auto-highlight-symbol/raw/master/auto-highlight-symbol.el"))])
- (auto-indent-mode . [(20191112 1418) nil "Auto indent Minor mode" tar ((:commit . "ebb1ee5ca24f3040c34b9455502a0e94f19903d0") (:keywords "auto" "indentation") (:authors ("Matthew L. Fidler, Le Wang & Others")) (:maintainer "Matthew L. Fidler") (:url . "https://github.com/mlf176f2/auto-indent-mode.el/"))])
- (auto-minor-mode . [(20180527 1123) ((emacs (24 4))) "Enable minor modes by file name and contents" single ((:commit . "17cfa1b54800fdef2975c0c0531dad34846a5065") (:keywords "convenience") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:url . "https://github.com/joewreschnig/auto-minor-mode"))])
- (auto-org-md . [(20180213 2343) ((emacs (24 4))) "export a markdown file automatically when you save an org-file" single ((:commit . "9318338bdb7fe8bd698d88f3af89b2d6413efdd2") (:keywords "org" "markdown") (:authors ("jamcha" . "jamcha.aa@gmail.com")) (:maintainer "jamcha" . "jamcha.aa@gmail.com") (:url . "https://github.com/jamcha-aa/auto-org-md"))])
- (auto-package-update . [(20200421 309) ((emacs (24 4)) (dash (2 1 0))) "Automatically update Emacs packages." single ((:commit . "cf7f7486ed699f2ed7cc8af950740aece0de6124") (:keywords "package" "update") (:authors ("Renan Ranelli")) (:maintainer "Renan Ranelli") (:url . "http://github.com/rranelli/auto-package-update.el"))])
- (auto-pause . [(20160426 1216) ((emacs (24 4))) "Run processes which will be paused when Emacs is idle" single ((:commit . "a4d778de774ca3895542cb559a953e0d98657338") (:keywords "convenience" "menu") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/auto-pause"))])
- (auto-read-only . [(20200726 1356) ((cl-lib (0 5))) "Automatically make the buffer to read-only" single ((:commit . "a6c493c5279d484c00ce7fe75dfd2e60101b97db") (:keywords "files" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/auto-read-only.el"))])
- (auto-rename-tag . [(20200717 814) ((emacs (24 4))) "Automatically rename paired HTML/XML tag" single ((:commit . "7227c93e58a2c1837aa35ca35b6325c6f734d0f9") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/auto-rename-tag"))])
- (auto-save-buffers-enhanced . [(20161109 710) nil "Automatically save buffers in a decent way" single ((:commit . "461e8c816c1b7c650be5f209078b381fe55da8c6") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com"))])
- (auto-shell-command . [(20180817 1502) ((deferred (20130312)) (popwin (20130329))) "Run the shell command asynchronously that you specified when you save the file." single ((:commit . "a8f9213e3c773b5687b81881240e6e648f2f56ba") (:keywords "shell" "save" "async" "deferred" "auto") (:authors ("ongaeshi")) (:maintainer "ongaeshi"))])
- (auto-sudoedit . [(20200427 635) ((emacs (24 4)) (f (0 19 0))) "Auto sudo edit by tramp" single ((:commit . "0ad8247fdd0f1d747cd1ff73adb6b5efcecc7f3b") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/auto-sudoedit"))])
- (auto-virtualenv . [(20200729 2204) ((cl-lib (0 5)) (pyvenv (1 9)) (s (1 10 0))) "Auto activate python virtualenvs" single ((:commit . "214604ebd3366078d03814a344c3249268d1f15a") (:keywords "python" "virtualenv" "tools") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:url . "http://github.com/marcwebbie/auto-virtualenv"))])
- (auto-virtualenvwrapper . [(20200510 1006) ((cl-lib (0 6)) (s (1 10 0)) (virtualenvwrapper (0))) "Lightweight auto activate python virtualenvs" single ((:commit . "30fb54aa3c99f3c614ea9a92669d634df30c9439") (:keywords "python" "virtualenv" "tools") (:authors ("Marcwebbie" . "marcwebbie@gmail.com") ("Robert Zaremba" . "robert-zaremba@scale-it.pl")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com"))])
- (auto-yasnippet . [(20191015 942) ((yasnippet (0 13 0))) "Quickly create disposable yasnippets" single ((:commit . "db9e0dd4335b2202cd5dac95bbbc87a1032d9bbe") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/auto-yasnippet"))])
- (autobookmarks . [(20190919 841) ((dash (2 10 0)) (cl-lib (0 5))) "Save recently visited files and buffers" single ((:commit . "224b24950d3ae57cd16d7417c07fda337fe0ea09") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (autobuild . [(20200713 227) ((cl-lib (0 3)) (emacs (26 1))) "Define and execute build rules and compilation pipelines" single ((:commit . "6c10b13c285cc4180dc64c1f89ead264e6786f53") (:keywords "compile" "build" "pipeline" "autobuild" "extensions" "processes" "tools") (:authors ("Ernesto Alfonso")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:url . "https://github.com/erjoalgo/autobuild"))])
- (autocrypt . [(20200505 1717) ((emacs (25 1))) "Autocrypt implementation" tar ((:commit . "d77140654405cabd007621606aca9beb512dff7a") (:keywords "comm") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/autocrypt"))])
- (autodisass-java-bytecode . [(20151005 1612) nil "Automatically disassemble Java bytecode" tar ((:commit . "3d61dbe266133c950b39e880f78d142751c7dc4c"))])
- (autodisass-llvm-bitcode . [(20150411 125) nil "Automatically disassemble LLVM bitcode" tar ((:commit . "d2579e3a1427af2dc947c343e49eb3434078bf04"))])
- (autopair . [(20160304 1237) ((cl-lib (0 3))) "Automagically pair braces and quotes like TextMate" single ((:commit . "2b6d72bccb0ebba6e7e711528872b898b0c65b0a") (:keywords "convenience" "emulations") (:authors ("Joao Tavora <joaotavora [at] gmail.com>")) (:maintainer "Joao Tavora <joaotavora [at] gmail.com>") (:url . "https://github.com/capitaomorte/autopair"))])
- (autotest . [(20190331 2230) nil "ZenTest's autotest integration with emacs." single ((:commit . "fc9ec563430e3beaefc00b26da179f4b4ca9855b") (:keywords "testing" "ruby" "convenience") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:url . "https://github.com/zenspider/elisp/blob/master/autotest.el"))])
- (autotetris-mode . [(20141114 1646) ((cl-lib (0 5))) "automatically play tetris" single ((:commit . "0c3a746dcc304a67d2a6e7ad4ef93f512486343a") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/autotetris-mode"))])
- (autothemer . [(20180920 923) ((dash (2 10 0)) (emacs (24)) (cl-lib (0 5))) "Conveniently define themes." single ((:commit . "69488c71dfc182cf2e7be2d745037f230ade678e") (:authors ("Sebastian Sturm")) (:maintainer "Sebastian Sturm") (:url . "https://github.com/sebastiansturm/autothemer"))])
- (autumn-light-theme . [(20150515 1447) nil "A light color theme with muted, autumnal colors." single ((:commit . "1e3b2a43a3001e4a97a5ff073ba3f0d2ea3888f9") (:keywords "color" "theme") (:authors ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainer "Adam Alpern" . "adam.alpern@gmail.com") (:url . "http://github.com/aalpern/emacs-color-theme-autumn-light"))])
- (avandu . [(20170101 1903) nil "Gateway to Tiny Tiny RSS" tar ((:commit . "f44588d8e747fa880411cb4542cc39962252b90a") (:keywords "net") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))])
- (avk-emacs-themes . [(20191220 625) nil "Collection of avk themes" tar ((:commit . "e97ec20d07cc9093661f51853375063bcdc91993") (:url . "https://github.com/avkoval/avk-emacs-themes"))])
- (avy . [(20200624 1148) ((emacs (24 1)) (cl-lib (0 5))) "Jump to arbitrary positions in visible text and select text quickly." single ((:commit . "bbf1e7339eba06784dfe86643bb0fbddf5bb0342") (:keywords "point" "location") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/avy"))])
- (avy-flycheck . [(20160720 1500) ((emacs (24 1)) (flycheck (0 14)) (seq (1 11)) (avy (0 4 0))) "Jump to and fix syntax errors using `flycheck' with `avy' interface" single ((:commit . "5522f3bbbed1801d9278ed696ec0cbba38352985") (:keywords "tools" "convenience" "avy" "flycheck") (:authors ("Xu Ma" . "magicdirac@gmail.com")) (:maintainer "Xu Ma" . "magicdirac@gmail.com") (:url . "https://github.com/magicdirac/avy-flycheck"))])
- (avy-menu . [(20190713 1348) ((emacs (24 3)) (avy (0 3 0))) "Library providing avy-powered popup menu" single ((:commit . "970204989bcd4a4f8223c2fe980a08dc58441045") (:keywords "popup" "menu") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/avy-menu"))])
- (avy-migemo . [(20180716 1455) ((emacs (24 4)) (avy (0 4 0)) (migemo (1 9))) "avy with migemo" tar ((:commit . "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7") (:keywords "avy" "migemo") (:authors ("momomo5717")) (:maintainer "momomo5717") (:url . "https://github.com/momomo5717/avy-migemo"))])
- (avy-zap . [(20190801 329) ((avy (0 2 0))) "Zap to char using `avy'" single ((:commit . "7c8d1f40e43d03e2f6c1696bfa547526528ce8cb") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/avy-zap"))])
- (aws-ec2 . [(20161007 1914) ((emacs (24 4)) (dash (2 12 1)) (tblui (0 1 0))) "Manage AWS EC2 instances" single ((:commit . "5601d4f268fc34b86a02ca90cde7d3771619a368") (:authors ("Yuki Inoue <inouetakahiroki _at_ gmail.com>")) (:maintainer "Yuki Inoue <inouetakahiroki _at_ gmail.com>") (:url . "https://github.com/Yuki-Inoue/aws.el"))])
- (aws-snippets . [(20191203 1553) ((yasnippet (0 8 0))) "Yasnippets for AWS" tar ((:commit . "557d19a0bc486e0fddb597b2be5087769d9bd47e") (:keywords "snippets"))])
- (awscli-capf . [(20190930 1517) ((emacs (26))) "Completion at point function for the AWS CLI" single ((:commit . "1a75f88f53a2969fe821c31e6857861d0a0c0a5e") (:keywords "tools" "convenience" "abbrev") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:url . "https://github.com/sebasmonia/awscli-capf.git"))])
- (axiom-environment . [(20200411 1031) ((emacs (24 2))) "An environment for using Axiom/OpenAxiom/FriCAS" tar ((:commit . "25932da0dc40c6877463cbf019b14ab05a6b0164") (:keywords "axiom" "openaxiom" "fricas") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org"))])
- (ayu-theme . [(20200521 1157) ((emacs (24 1))) "Ayu theme" tar ((:commit . "ed98a9f41d9f0e08458ee71cc1038f66c50e1979") (:keywords "lisp" "theme" "emacs") (:authors ("Tran Anh Vu")) (:maintainer "Tran Anh Vu") (:url . "https://github.com/vutran1710/Ayu-Theme-Emacs"))])
- (babel . [(20181201 919) nil "interface to web translation services such as Babelfish" single ((:commit . "c25dedb5c7f2465b122102f02cd9845668818c20") (:keywords "translation" "web") (:authors ("Juergen Hoetzel" . "juergen@hoetzel.info") ("Eric Marsden" . "emarsden@laas.fr")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info") (:url . "http://github.com/juergenhoetzel/babel"))])
- (babel-repl . [(20160504 2201) ((emacs (24))) "Run babel REPL" single ((:commit . "e619c16e349a1ee7bd0ee0d7f3650d33bff73fc3") (:keywords "babel" "javascript" "es6") (:authors ("Hung Phan")) (:maintainer "Hung Phan") (:url . "https://github.com/hung-phan/babel-repl/"))])
- (back-button . [(20150804 2004) ((nav-flash (1 0 0)) (smartrep (0 0 3)) (ucs-utils (0 7 2)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Visual navigation through mark rings" single ((:commit . "98d92984a740acd1547bd7ed05cca0affdb21c3e") (:keywords "convenience" "navigation" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/back-button"))])
- (backlight . [(20190905 519) ((emacs (24 3))) "backlight brightness adjustment on GNU/Linux" single ((:commit . "3e5b971b4ee89299240a89614db92d2c4034e954") (:keywords "hardware") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:url . "https://github.com/mschuldt/backlight.el"))])
- (backline . [(20200104 1851) ((emacs (25 1)) (outline-minor-faces (0 1 2))) "Preserve appearance of outline headings" single ((:commit . "dc541a6daf82ab73774904ae9ccecd13e3c2af48") (:keywords "outlines") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/backline"))])
- (backup-each-save . [(20180227 557) nil "backup each savepoint of a file" single ((:commit . "3c414b9d6b278911c95c5b8b71819e6af6f8a02a") (:authors ("Benjamin Rutt" . "brutt@bloomington.in.us")) (:maintainer "Conor Nash" . "conor@nashcobusinessservicesllc.com"))])
- (backup-walker . [(20130720 1516) nil "quickly traverse all backups of a file" single ((:commit . "934a4128c122972ac32bb9952addf279a60a94da") (:keywords "backup") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/backup-walker"))])
- (backward-forward . [(20161229 550) ((emacs (24 5))) "navigation backwards and forwards across marks" single ((:commit . "58489957a62a0da25dfb5df902624d2548d800b4") (:keywords "navigation" "convenience" "backward" "forward") (:authors ("Currell Berry" . "currellberry@gmail.com")) (:maintainer "Currell Berry" . "currellberry@gmail.com") (:url . "https://gitlab.com/vancan1ty/emacs-backward-forward/tree/master"))])
- (badger-theme . [(20140717 232) nil "A dark theme for Emacs 24." single ((:commit . "493d672d5a5478976da7d5ca752008cc7837c57f") (:authors ("Cody Canning" . "cocanning11@gmail.com")) (:maintainer "Cody Canning" . "cocanning11@gmail.com") (:url . "https://github.com/ccann/badger-theme"))])
- (badwolf-theme . [(20161004 715) ((emacs (24))) "Bad Wolf color theme" single ((:commit . "ea01a3d9358e968f75e3ed15dec6a2a96ce3d9a1") (:keywords "themes") (:authors ("bkruczyk" . "bartlomiej.kruczyk@gmail.com")) (:maintainer "bkruczyk" . "bartlomiej.kruczyk@gmail.com") (:url . "https://github.com/bkruczyk/badwolf-emacs"))])
- (baidu-translate . [(20190817 1318) nil "A plugin using baidu-translate-api" single ((:commit . "b04a74d09ff5e3fbefd1b39b2abe79a9e272321a") (:keywords "docs") (:authors (nil . "<LiShizhen gsu4017@gmail.com>")) (:maintainer nil . "<LiShizhen gsu4017@gmail.com>") (:url . "https://github.com/liShiZhensPi/baidu-translate"))])
- (balanced-windows . [(20190903 1120) ((emacs (25))) "Keep windows balanced" single ((:commit . "1da5354ad8a9235d13928e2ee0863f3642ccdd13") (:keywords "convenience") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-balanced-windows"))])
- (bang . [(20200510 1107) ((emacs (24 1))) "A sam-like shell-command" single ((:commit . "f80c7c394b57057499db6409f386ade9ac32f763") (:keywords "unix" "processes" "convenience") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/bang"))])
- (banner-comment . [(20190606 1809) ((emacs (24 4))) "For producing banner comments." single ((:commit . "35d3315683d3f97605207691b77e9f447af18fe2") (:keywords "convenience") (:authors ("James Ferguson" . "james@faff.org")) (:maintainer "James Ferguson" . "james@faff.org") (:url . "https://github.com/WJCFerguson/banner-comment"))])
- (bap-mode . [(20200128 1354) nil "Major-mode for BAP's IR" single ((:commit . "8969679f60db0aa918d35f40d959c0a9c723b111") (:keywords "languages") (:authors ("Thomas Barabosch <http://github/tbarabosch>")) (:maintainer "Thomas Barabosch" . "thomas.barabosch@fkie.fraunhofer.de") (:url . "https://github.com/fkie-cad/bap-mode"))])
- (bar-cursor . [(20180227 45) nil "package used to switch block cursor to a bar" single ((:commit . "20cb59bedc3532a712fe7feeff3660ebd72a8107") (:keywords "files") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com") (:url . "https://github.com/ajsquared/bar-cursor"))])
- (bart-mode . [(20190601 1004) ((emacs (24 3))) "Real time BART departures info." single ((:commit . "f70b6c42452e47c0c6b3ebd4c90e555a9bedeec7") (:keywords "convenience" "transit") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:url . "https://github.com/mschuldt/bart-mode"))])
- (base16-theme . [(20200414 2048) nil "Collection of themes built on combinations of 16 base colors" tar ((:commit . "d68512c0856f57a19cd49d1034199836352c15a0") (:url . "https://github.com/belak/base16-emacs"))])
- (bash-completion . [(20200731 1553) ((emacs (24 3))) "BASH completion for the shell buffer" single ((:commit . "3dbbd1beffdff7e390ca9292724886a4358a280d") (:keywords "shell" "bash" "bash-completion") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainer "Stephane Zermatten" . "szermatt@gmail.com") (:url . "http://github.com/szermatt/emacs-bash-completion"))])
- (basic-c-compile . [(20170302 1112) ((cl-lib (0 5)) (f (0 19 0))) "Quickly create a Makefile, compile and run C." single ((:commit . "0129786aeee50d7bb0020d9fc2b7508875d403e8") (:keywords "c" "makefile" "compilation" "convenience") (:authors ("Nick Spain" . "nicholas.spain96@gmail.com")) (:maintainer "Nick Spain" . "nicholas.spain96@gmail.com") (:url . "https://github.com/nick96/basic-c-compile"))])
- (basic-ide . [(20200429 1104) ((emacs (25)) (basic-mode (0 4 2)) (company (0 9 12)) (flycheck (0 22)) (dash (2 12 0)) (f (0 17 0))) "BASIC IDE c64" single ((:commit . "0f75c944239960445f1e9c8a0b5f7a5b4d37ff89") (:keywords "languages" "basic") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:url . "https://gitlab.com/sasanidas/emacs-c64-basic-ide"))])
- (basic-mode . [(20180919 1752) ((seq (2 20)) (emacs (24 3))) "major mode for editing BASIC code" single ((:commit . "812f078240f9de09491701853569335ba6d9b5ff") (:keywords "basic" "languages") (:authors ("Johan Dykstrom")) (:maintainer "Johan Dykstrom") (:url . "https://github.com/dykstrom/basic-mode"))])
- (basic-theme . [(20160817 827) ((emacs (24))) "Minimalistic light color theme" single ((:commit . "e2a855bd39f4b78296228d4b790f9123156f7d7e") (:keywords "theme" "basic" "minimal" "colors") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:url . "http://github.com/fgeller/basic-theme.el"))])
- (bats-mode . [(20160514 615) nil "Emacs mode for editing and running Bats tests" single ((:commit . "d519f7c89f5ae17dfc33400596df4564b478315f") (:keywords "bats" "tests") (:authors ("Doug MacEachern")) (:maintainer "Doug MacEachern") (:url . "https://github.com/dougm/bats-mode"))])
- (battle-haxe . [(20200222 56) ((emacs (25)) (company (0 9 9)) (helm (3 0)) (async (1 9 3)) (cl-lib (0 5)) (dash (2 12 0)) (dash-functional (1 2 0)) (s (1 10 0)) (f (0 19 0))) "A Haxe development system, with code completion and more" single ((:commit . "64d20c9ea3fd503fdefafda122e7095c192e72a3") (:keywords "programming" "languages" "completion") (:authors ("Alon Tzarafi " . "alontzarafi@gmail.com")) (:maintainer "Alon Tzarafi " . "alontzarafi@gmail.com") (:url . "https://github.com/AlonTzarafi/battle-haxe"))])
- (bazel-mode . [(20200627 1625) ((emacs (26 1))) "Emacs major mode for editing Bazel BUILD and WORKSPACE files" tar ((:commit . "2cf143b616df3de4b199538341d674c58386719e") (:keywords "build tools" "languages") (:url . "https://github.com/bazelbuild/emacs-bazel-mode"))])
- (bbcode-mode . [(20190304 2122) ((emacs (24)) (cl-lib (0 5))) "Major mode for phpBB posts (BBCode markup)" single ((:commit . "e16619c80ea21154b4a4ccc2e13d0077e97c9caf") (:keywords "bbcode" "languages") (:authors ("Eric James Michael Ritz" . "lobbyjones@gmail.com")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-bbcode-mode"))])
- (bbdb- . [(20140221 2354) ((bbdb (20140123 1541)) (log4e (0 2 0)) (yaxception (0 1))) "provide interface for more easily search/choice than BBDB." single ((:commit . "2839e84c894de2513af41053e80a277a1b483d22") (:keywords "bbdb" "news" "mail") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/bbdb-"))])
- (bbdb . [(20200102 403) nil "The Insidious Big Brother Database for GNU Emacs" tar ((:commit . "45529e315ba861f9df2914f9b88d2f7b991d5595"))])
- (bbdb-csv-import . [(20180122 49) ((pcsv (1 3 3)) (dash (2 5 0)) (bbdb (20140412 1949))) "import csv to bbdb version 3+" single ((:commit . "dbc2e0fe9e8ae65e494011044d905ae79b3cee3e") (:keywords "csv" "util" "bbdb") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:url . "https://gitlab.com/iankelling/bbdb-csv-import"))])
- (bbdb-ext . [(20151220 2013) ((bbdb (2 36))) "Extra commands for BBDB" single ((:commit . "fee97b1b3faa83edaea00fbc5ad3cbca5e791a55") (:keywords "extensions") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/bbdb-ext"))])
- (bbdb-vcard . [(20190410 2054) ((bbdb (3 0))) "vCard import/export for BBDB" tar ((:commit . "853cbcd882be137a5488c70328c25f5982aca657") (:keywords "data" "calendar" "mail" "news") (:authors ("Bert Burgemeister" . "trebbu@googlemail.com") ("Toke Høiland-Jørgensen") ("Kevin Brubeck Unhammer") ("Steve Purcell") ("Vincent Geddes" . "vincent.geddes@gmail.com")) (:maintainer "Bert Burgemeister" . "trebbu@googlemail.com") (:url . "http://github.com/vgeddes/bbdb-vcard"))])
- (bbdb2erc . [(20190822 907) ((bbdb (3 0))) "make bbdb show if pal is online with ERC, click i to chat" single ((:commit . "40b89e961762af3e7ade3a1844a9fbcd4084ac65") (:keywords "irc" "contacts" "chat" "client" "internet") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))])
- (bbyac . [(20180206 1441) ((browse-kill-ring (1 3)) (cl-lib (0 5))) "Type a little Bit, and Bang! You Are Completed." tar ((:commit . "9f0de9cad13801891ffb590dc09f51ff9a7cb225") (:keywords "abbrev") (:authors ("Bao Haojun" . "baohaojun@gmail.com")) (:maintainer "Bao Haojun" . "baohaojun@gmail.com") (:url . "https://github.com/baohaojun/bbyac"))])
- (beacon . [(20190104 1931) ((seq (2 14))) "Highlight the cursor whenever the window scrolls" single ((:commit . "bde78180c678b233c94321394f46a81dc6dce1da") (:keywords "convenience") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/beacon"))])
- (beeminder . [(20200610 2311) ((org (7))) "Emacs interface for Beeminder" tar ((:commit . "8f86ae34ebd17324d98146a2b3a532d56dd1cdd0") (:keywords "beeminder") (:authors ("Phil Newton" . "phil@sodaware.net")) (:maintainer "Phil Newton" . "phil@sodaware.net") (:url . "http://www.philnewton.net/code/beeminder-el/"))])
- (beginend . [(20200526 2005) ((emacs (25 3))) "Redefine M-< and M-> for some modes" single ((:commit . "f6590a4d12894adfe5905266b4d2660002f444dc") (:url . "https://github.com/DamienCassou/beginend"))])
- (belarus-holidays . [(20190102 1343) nil "Belarus holidays whith transfers" single ((:commit . "35a18273e19edc3b4c761030ffbd11116483b83e") (:authors ("Yauhen Makei" . "yauhen.makei@gmail.com")) (:maintainer "Yauhen Makei" . "yauhen.makei@gmail.com") (:url . "http://bitbucket.org/EugeneMakei/belarus-holidays.el"))])
- (benchmark-init . [(20150905 938) nil "Benchmarks Emacs require and load calls" tar ((:commit . "7a0f263282bbc86b01b662636306f22813082647") (:keywords "benchmark") (:authors ("Steve Purcell")) (:maintainer "David Holm" . "dholmster@gmail.com"))])
- (benchstat . [(20171014 312) nil "proper benchmarking made simple" single ((:commit . "a5b67cf7972ca2bbc9f5bc6a0f521ab02b76d4f0") (:keywords "lisp") (:authors ("Iskander Sharipov" . "quasilyte@gmail.com")) (:maintainer "Iskander Sharipov" . "quasilyte@gmail.com") (:url . "https://github.com/Quasilyte/benchstat.el"))])
- (bencoding . [(20200331 1102) ((emacs (25 1))) "Bencoding decoding and encoding" single ((:commit . "f0af19511831f3ade590879e7d1636387682a8e7") (:keywords "tools") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/bencoding.el"))])
- (bento . [(20191024 2123) ((flycheck (0 22)) (emacs (25 1)) (f (0 20))) "Flycheck integration for the Bento code checker" single ((:commit . "31546a03475fc2b3ffd3159fe1beda55f7762224") (:authors ("Ash Zahlen" . "ash@returntocorp.com")) (:maintainer "Ash Zahlen" . "ash@returntocorp.com") (:url . "https://github.com/returntocorp/bento-emacs"))])
- (berrys-theme . [(20191201 1609) ((emacs (24 1))) "A light, clean and elegant theme" single ((:commit . "888a14206b2fb3dc45b5273aeb05075f3e0b5f60") (:authors ("Slava Buzin" . "v8v.buzin@gmail.com")) (:maintainer "Slava Buzin" . "v8v.buzin@gmail.com") (:url . "https://github.com/vbuzin/berrys-theme"))])
- (bert . [(20131117 1014) nil "BERT serialization library for Emacs" single ((:commit . "a3eec6980a725aa4abd2019e4c00246450260490") (:keywords "comm" "data") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com"))])
- (better-defaults . [(20200717 2012) ((emacs (25 1))) "Fixing weird quirks and poor defaults" single ((:commit . "293237a22a4f24171dd9910d6517a0eccf526fdf") (:keywords "convenience") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:url . "https://github.com/technomancy/better-defaults"))])
- (better-jumper . [(20200103 1413) ((emacs (25 1))) "configurable jump list" single ((:commit . "6d240032ca213ccb3347e25f26c29b6822bf03a7") (:keywords "convenience" "jump" "history" "evil") (:authors ("Bryan Gilbert <http://github/gilbertw1>")) (:maintainer "Bryan Gilbert" . "bryan@bryan.sh") (:url . "https://github.com/gilbertw1/better-jumper"))])
- (better-shell . [(20191025 1737) ((emacs (24 4))) "Better shell management" single ((:commit . "70c787b981caeef8c5f8012b170eb7b9f167cd13") (:keywords "convenience") (:authors ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:url . "https://github.com/killdash9/better-shell"))])
- (bf-mode . [(20130403 1442) nil "Browse file persistently on dired" single ((:commit . "7cc4d09aed64d9db6be95646f5f5067de68f8895") (:keywords "convenience") (:authors ("isojin")) (:maintainer "myuhe <yuhei.maeda_at_gmail.com>") (:url . "https://github.com/emacs-jp/bf-mode"))])
- (bfbuilder . [(20150924 1650) ((cl-lib (0 3))) "A brainfuck development environment with interactive debugger" single ((:commit . "49560bdef131fa5672dab660e0c62376dbdcd906") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (bibclean-format . [(20190302 2017) ((emacs (24 3)) (reformatter (0 3))) "Reformat BibTeX and Scribe using bibclean" single ((:commit . "b4003950a925d1c659bc359ab5e88e4441775d77") (:keywords "languages") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:url . "https://github.com/peterwvj/bibclean-format"))])
- (biblio . [(20200416 1407) ((emacs (24 3)) (biblio-core (0 2))) "Browse and import bibliographic references from CrossRef, arXiv, DBLP, HAL, Dissemin, and doi.org" tar ((:commit . "eb9baf1d2bf6a073d24ccb717025baa693e98f3e"))])
- (biblio-bibsonomy . [(20190105 1200) ((emacs (24 4)) (biblio-core (0 2))) "Lookup bibliographic entries from Bibsonomy" single ((:commit . "778cc944db3c6dababe2e7fec5877fba42e8c00d") (:keywords "bib" "tex" "bibsonomy") (:authors ("Andreas Jansson and contributors")) (:maintainer "Andreas Jansson and contributors") (:url . "http://github.com/andreasjansson/biblio-bibsonomy/"))])
- (biblio-core . [(20200416 307) ((emacs (24 3)) (let-alist (1 0 4)) (seq (1 11)) (dash (2 12 1))) "A framework for looking up and displaying bibliographic entries" single ((:commit . "eb9baf1d2bf6a073d24ccb717025baa693e98f3e") (:keywords "bib" "tex" "convenience" "hypermedia") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:url . "https://github.com/cpitclaudel/biblio.el"))])
- (bibliothek . [(20190124 1828) ((emacs (24 4)) (pdf-tools (0 70)) (a (0 1 0 -3 4))) "Managing a digital library of PDFs" single ((:commit . "61a14d1a8c17930caca5c5daf893cedc9c23c5f3") (:keywords "tools") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:url . "https://dev.gkayaalp.com/elisp/index.html#bibliothek-el"))])
- (bibretrieve . [(20191124 1855) ((auctex (11 87)) (emacs (24 3))) "Retrieve BibTeX entries from the internet" tar ((:commit . "81dc8e0db3629cc180eafb2bc34b60dcd8980316") (:keywords "bibtex" "bibliography" "mathscinet" "arxiv" "zbmath") (:authors ("Antonio Sartori")) (:maintainer "Pavel Zorin-Kranich" . "pzorin@uni-bonn.de") (:url . "https://github.com/pzorin/bibretrieve"))])
- (bibslurp . [(20151202 2346) ((s (1 6 0)) (dash (1 5 0))) "retrieve BibTeX entries from NASA ADS" single ((:commit . "0116bbb04840d20a6b087e6d9c921bb1c2489a8f") (:keywords "bibliography" "nasa ads") (:url . "https://github.com/mkmcc/bibslurp"))])
- (bibtex-completion . [(20200513 852) ((parsebib (1 0)) (s (1 9 0)) (dash (2 6 0)) (f (0 16 2)) (cl-lib (0 5)) (biblio (0 2)) (emacs (26 1))) "A BibTeX backend for completion frameworks" single ((:commit . "8a0dd9841316793aacddea744d6b8ca4a7857a35") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))])
- (bibtex-utils . [(20190703 2117) nil "Provides utilities for extending BibTeX mode" single ((:commit . "26a8f0909b6adbf545a2b5e57ce7f779bf7a65af") (:keywords "bibtex") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca") (:url . "https://github.com/plantarum/bibtex-utils"))])
- (bicycle . [(20200723 2222) ((emacs (25 1))) "cycle outline and code visibility" single ((:commit . "799969a66192b27c6464fc2e0025f4089d70493b") (:keywords "outlines") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/bicycle"))])
- (bifocal . [(20200325 539) ((emacs (24 4))) "Split-screen scrolling for comint-mode buffers" single ((:commit . "de8d09b08b0b30714c4f9b98c97e9577d47b9be6") (:keywords "frames" "processes") (:url . "https://github.com/riscy/bifocal-mode"))])
- (binclock . [(20170802 1116) ((cl-lib (0 5))) "Display the current time using a binary clock." single ((:commit . "87042230d7f3fe3e9a77fae0dbab7d8f7e7794ad") (:keywords "games" "time" "display") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/binclock.el"))])
- (bind-chord . [(20171204 2010) ((bind-key (1 0)) (key-chord (0 6))) "key-chord binding helper for use-package-chords" single ((:commit . "7d925367ef0857d513d62eab4cb57b7436b9ffe9") (:keywords "convenience" "tools" "extensions") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/use-package-chords"))])
- (bind-key . [(20191110 416) nil "A simple way to manage personal keybindings" single ((:commit . "7d925367ef0857d513d62eab4cb57b7436b9ffe9") (:keywords "keys" "keybinding" "config" "dotemacs") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:url . "https://github.com/jwiegley/use-package"))])
- (bind-map . [(20161207 1511) ((emacs (24 3))) "Bind personal keymaps in multiple locations" single ((:commit . "bf4181e3a41463684adfffc6c5c305b30480e30f") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-bind-map"))])
- (bing-dict . [(20200216 110) nil "Minimalists' English-Chinese Bing dictionary" tar ((:commit . "1d581aaa9622b34f8fb83af5579fa252aa24cfef") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/bing-dict.el"))])
- (birds-of-paradise-plus-theme . [(20130419 2129) nil "A brown/orange light-on-dark theme for Emacs 24 (deftheme)." single ((:commit . "bb9f9d4ef7f7872a388ec4eee1253069adcadb6f") (:keywords "themes") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:url . "https://github.com/jimeh/birds-of-paradise-plus-theme.el"))])
- (bison-mode . [(20200226 47) nil "Major mode for editing bison, yacc and lex files." single ((:commit . "675df47193accaf30ca44e142523b2b3bb122979") (:keywords "bison-mode" "yacc-mode") (:authors ("Eric Beuscher" . "beuscher@eecs.tulane.edu")) (:maintainer "Eric Beuscher" . "beuscher@eecs.tulane.edu"))])
- (bitbake . [(20190107 1155) ((emacs (24 1)) (dash (2 6 0)) (mmm-mode (0 5 4)) (s (1 10 0))) "Running bitbake from emacs" single ((:commit . "4896ff48712a6be37009605ba697a7104462e2fd") (:keywords "convenience") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:url . "https://github.com/canatella/bitbake-el"))])
- (bitbucket . [(20170405 446) ((emacs (24)) (request (0 1 0)) (s (1 9 0))) "Bitbucket API wrapper" tar ((:commit . "5e663da1bd38a14c1ecf4d66a79d4321ac833bcf") (:keywords "bitbucket") (:authors ("2017 Tjaart van der Walt" . "tjaart@tjaart.co.za")) (:maintainer "2017 Tjaart van der Walt" . "tjaart@tjaart.co.za") (:url . "http://github.com/tjaartvdwalt/bitbucket.el/"))])
- (bitlbee . [(20151203 0) nil "Help get Bitlbee (http://www.bitlbee.org) up and running." single ((:commit . "3a92a4119e0c007df2c7dcf1b1c3a5f23ee40e05"))])
- (blackboard-bold-mode . [(20160813 206) ((cl-lib (0 5))) "Easily insert Unicode mathematical double-struck characters" single ((:commit . "5299cb064ba71baa3e331b8560bf8dd38cbbc4ed") (:keywords "unicode" "double struck" "blackboard bold" "math" "mathematical") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainer nil . "<gcr@wisdomandwonder.com>") (:url . "https://github.com/grettke/blackboard-bold-mode"))])
- (blackboard-theme . [(20161216 656) ((emacs (24))) "TextMate Blackboard Theme" single ((:commit . "7a0d79410feb728ff5cce75c140fadc19a3f9a6d") (:authors ("Dong Zheng")) (:maintainer "Dong Zheng") (:url . "https://github.com/don9z/blackboard-theme"))])
- (blacken . [(20200626 2018) ((emacs (25 2))) "Reformat python buffers using the \"black\" formatter" single ((:commit . "784da60033fe3743336d1da0f33239f1bf514266") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/blacken"))])
- (blackout . [(20200404 1550) ((emacs (26))) "Better mode lighter overriding" single ((:commit . "d99ab1aad84e4bd2bd4a499877764c213cce50ff") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/blackout"))])
- (blgrep . [(20150401 1416) ((clmemo (20140321 715))) "Block grep" tar ((:commit . "605beda210610a5829750a987f5fcebea97af546") (:keywords "tools" "convenience") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com"))])
- (blimp . [(20180903 2240) ((emacs (25)) (eimp (1 4 0))) "Bustling Image Manipulation Package" single ((:commit . "39562f02acc1113595cb253a85bb3b9da743ddd2") (:keywords "multimedia" "unix") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/blimp"))])
- (bliss-theme . [(20170808 1307) ((emacs (24 0))) "an Emacs 24 theme based on Bliss (tmTheme)" single ((:commit . "c3cf6d8a666ab26909b7da158f9e94df71a5fbbf") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (blitzmax-mode . [(20200415 1529) ((emacs (24 1))) "A major mode for editing BlitzMax source code" single ((:commit . "5f67bb3c8e4baf1f6881cc998f9f031641a7b08a") (:keywords "languages" "blitzmax") (:authors ("Phil Newton")) (:maintainer "Phil Newton") (:url . "https://www.sodaware.net/dev/tools/blitzmax-mode/"))])
- (bln-mode . [(20181121 918) nil "binary line navigation minor mode for cursor movement in long lines" single ((:commit . "a601b0bf975dd1432f6552ab6afe3f4f71133b4a") (:keywords "motion" "location" "cursor" "convenience") (:authors ("Maarten Grachten")) (:maintainer "Maarten Grachten") (:url . "https://github.com/mgrachten/bln-mode"))])
- (blockdiag-mode . [(20160427 524) ((emacs (24 3))) "Major mode for editing blockdiag files" single ((:commit . "f3b21ba433d60327cebd103ae4492200750e24a9") (:authors ("xcezx" . "main.xcezx@gmail.com")) (:maintainer "xcezx" . "main.xcezx@gmail.com") (:url . "https://github.com/xcezx/xdiag-mode"))])
- (blog-admin . [(20170923 1409) ((ctable (0 1 1)) (s (1 10 0)) (f (0 17 3)) (names (20151201 0)) (cl-lib (0 5))) "Blog admin for emacs with hexo/org-page supported" tar ((:commit . "b5f2e1dad7d68ec903619f7280bb0bcb7e398a1e") (:keywords "tools" "blog" "org" "hexo" "org-page") (:authors (nil . "code.falling@gmail.com")) (:maintainer nil . "code.falling@gmail.com"))])
- (blog-minimal . [(20181021 849) ((ht (1 5)) (simple-httpd (1 4 6)) (mustache (0 22)) (s (1 11 0)) (org (9 0 3))) "a simple static site generator based on org mode" tar ((:commit . "356c878322258159021eecdd15757e11cf02e335") (:keywords "tools") (:authors ("Thank Fly" . "thiefuniverses@gmail.com")) (:maintainer "Thank Fly" . "thiefuniverses@gmail.com") (:url . "https://github.com/thiefuniverse/blog-minimal"))])
- (bm . [(20190807 1217) nil "Visible bookmarks in buffer." tar ((:commit . "8129428182e1b8a647d16fceb2d08cc0a2a5f3c7") (:keywords "bookmark" "highlight" "faces" "persistent") (:authors ("Jo Odland <jo.odland(at)gmail.com>")) (:maintainer "Jo Odland <jo.odland(at)gmail.com>") (:url . "https://github.com/joodland/bm"))])
- (bmx-mode . [(20180929 1132) ((emacs (25 1)) (cl-lib (0 5)) (company (0 9 4)) (dash (2 13 0)) (s (1 12 0))) "Batch Mode eXtras" single ((:commit . "536b332edc3b98cc97588c937c7368803ba5961c") (:keywords "c" "convenience" "tools") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:url . "http://github.com/josteink/bmx-mode"))])
- (bnf-mode . [(20200323 1348) ((cl-lib (0 5)) (emacs (24 3))) "Major mode for editing BNF grammars." tar ((:commit . "d88eef69ae66ea1ffa21a65317afe84c9ddb0814") (:keywords "languages") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:url . "https://github.com/sergeyklay/bnf-mode"))])
- (bnfc . [(20160605 1927) ((emacs (24 3))) "Define context-free grammars for the BNFC tool" single ((:commit . "1b58df1dd0cb9b81900632fb2843a03b94f56fdb") (:keywords "languages" "tools") (:authors ("Jacob Mitchell" . "jmitchell@member.fsf.org")) (:maintainer "Jacob Mitchell" . "jmitchell@member.fsf.org") (:url . "https://github.com/jmitchell/bnfc-mode"))])
- (bog . [(20200720 244) ((cl-lib (0 5))) "Extensions for research notes in Org mode" single ((:commit . "14241d308d15410bfaafcf607a8a4a7ff3d7254c") (:keywords "bib" "outlines") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:url . "https://github.com/kyleam/bog"))])
- (bolt-mode . [(20180310 810) ((emacs (24 3))) "Editing support for Bolt language" single ((:commit . "85a5a752bfbebb4aed884326c25db64c000e9934") (:keywords "languages") (:authors ("Mikhail Pontus" . "mpontus@gmail.com")) (:maintainer "Mikhail Pontus" . "mpontus@gmail.com") (:url . "https://github.com/mpontus/bolt-mode"))])
- (bongo . [(20190722 1644) ((cl-lib (0 5)) (emacs (24 1))) "play music with Emacs" tar ((:commit . "9afbf269d33cd3196962423a2c261824611cffe4"))])
- (bonjourmadame . [(20170919 1134) nil "Say \"Hello ma'am!\"" single ((:commit . "d3df185fce78aefa689fded8e56a654f0fde4ac0"))])
- (boogie-friends . [(20190909 1432) ((cl-lib (0 5)) (dash (2 10 0)) (flycheck (0 23)) (yasnippet (0 9 0 1)) (company (0 8 12))) "A collection of programming modes for Boogie, Dafny, and Z3 (SMTLIB v2)." tar ((:commit . "45ee305eba1cce63f89e49daef9eaeaa90e34265"))])
- (bool-flip . [(20161215 1539) ((emacs (24 3))) "flip the boolean under the point" single ((:commit . "f58a9a7b9ab875bcfbd57c8262697ae404eb4485") (:keywords "boolean" "convenience" "usability") (:authors ("Michael Brandt" . "michaelbrandt5@gmail.com")) (:maintainer "Michael Brandt" . "michaelbrandt5@gmail.com") (:url . "http://github.com/michaeljb/bool-flip/"))])
- (boon . [(20200514 1227) ((emacs (25 1)) (expand-region (0 10 0)) (dash (2 12 0)) (multiple-cursors (1 3 0))) "Ergonomic Command Mode for Emacs." tar ((:commit . "57271ed2ddca96c77b83b282019852d1cffffd26"))])
- (borg . [(20200707 1807) ((emacs (26)) (epkg (3 2 2)) (magit (2 90 1))) "assimilate Emacs packages as Git submodules" tar ((:commit . "84ea68560f9e0605ee37518c137ed121f35dcec3") (:keywords "tools") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/borg"))])
- (borland-blue-theme . [(20160117 1321) ((emacs (24 1))) "Blue/yellow theme based on old DOS Borland/Turbo C IDE" single ((:commit . "db74eefebbc89d3c62575f8f50b319e87b4a3470") (:keywords "themes") (:authors ("Alexey Veretennikov <alexey dot veretennikov at gmail dot com>")) (:maintainer "Alexey Veretennikov <alexey dot veretennikov at gmail dot com>") (:url . "http://github.com/fourier/borland-blue-theme"))])
- (boron-theme . [(20170808 1308) ((emacs (24 0))) "an Emacs 24 theme based on Boron (tmTheme)" single ((:commit . "87ae1a765e07429fec25d2f29b004f84b52d2e0a") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (boxquote . [(20200727 1203) ((cl-lib (0 5))) "Quote text with a semi-box." single ((:commit . "bdc6c84b9274b228dbc383a14abf9694157e869c") (:keywords "quoting") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/boxquote.el"))])
- (bpe . [(20141228 2205) ((emacs (24 1))) "Blog from Org mode to Blogger" single ((:commit . "7b5b25f83506e6c9f4075d3803fa32404943a189") (:keywords "blogger" "blog") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/bpe"))])
- (bpftrace-mode . [(20190608 2201) ((emacs (24 0))) "Major mode for editing bpftrace script files" single ((:commit . "587b39ea7a1d786df5c04796d51bf2a5a4eda0d7") (:keywords "highlight" "c") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:url . "http://gitlab.com/jgkamat/bpftrace-mode"))])
- (bpr . [(20180220 1844) ((emacs (24))) "Background Process Runner" tar ((:commit . "7f3c787ed80ac0e83447192ac5450dfa7110ade1") (:keywords "background" "async" "process" "management") (:authors ("Ilya Babanov" . "ilya-babanov@ya.ru")) (:maintainer "Ilya Babanov" . "ilya-babanov@ya.ru") (:url . "https://github.com/ilya-babanov/emacs-bpr"))])
- (bracketed-paste . [(20160407 2348) ((emacs (24 3))) "bracketed paste mode support within emacs -nw" single ((:commit . "843ce3bbb63d560face889e13a57a2f7543957d5") (:keywords "terminals") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net"))])
- (brainfuck-mode . [(20150113 842) ((langdoc (20130601 1450))) "Brainfuck mode for Emacs" single ((:commit . "36e69552bb3b97a4f888d362c59845651bd0d492") (:keywords "brainfuck" "langdoc") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/brainfuck-mode/"))])
- (brazilian-holidays . [(20191211 330) ((emacs (26))) "Brazilian holidays" single ((:commit . "13a480f03eb3729e6f203ce77dfd4de5e1203a3d") (:keywords "calendar" "holidays" "brazilian") (:authors ("Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com")) (:maintainer "Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com") (:url . "https://github.com/jadler/brazilian-holidays"))])
- (brf . [(20200626 1515) ((fringe-helper (0 1 1)) (emacs (24))) "Add functionality from the editor Brief" tar ((:commit . "5dc3fd8709c1513ef12ca9aa76f937f0a30a59d3") (:keywords "brief" "crisp" "emulations") (:authors ("Mike Woolley" . "mike@bulsara.com")) (:maintainer "Mike Woolley" . "mike@bulsara.com") (:url . "https://bitbucket.org/MikeWoolley/brf-mode"))])
- (brightscript-mode . [(20200321 2126) ((emacs (26 3))) "Major mode for editing Brightscript files" single ((:commit . "3b34032bdde6a37b4566c45ce93cb38da21d4965") (:keywords "languages") (:authors ("Daniel Mircea" . "daniel@viseztrance.com")) (:maintainer nil . "daniel@viseztrance.com") (:url . "https://github.com/viseztrance/brightscript-mode"))])
- (broadcast . [(20151205 212) ((emacs (24 4))) "Links buffers together for simultaneous editing." single ((:commit . "f6f9cd2e0e3f8c31d6b8e7446c27eb0e50b25f16") (:keywords "convenience" "frames" "link" "cursors") (:authors ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:url . "https://github.com/killdash9/broadcast.el"))])
- (browse-at-remote . [(20200308 639) ((f (0 17 2)) (s (1 9 0)) (cl-lib (0 5))) "Open github/gitlab/bitbucket/stash/gist/phab/sourcehut page from Emacs" single ((:commit . "6aecae4b5d202e582425fc8aa2c9c2b6a4779f25") (:keywords "github" "gitlab" "bitbucket" "gist" "stash" "phabricator" "sourcehut" "pagure") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com"))])
- (browse-kill-ring . [(20200210 921) nil "interactively insert items from kill-ring" single ((:commit . "1ef72cc6accd94cd7032c02b1b2c78ae7f1d1965") (:keywords "convenience") (:authors ("Colin Walters" . "walters@verbum.org")) (:maintainer "browse-kill-ring" . "browse-kill-ring@tonotdo.com") (:url . "https://github.com/browse-kill-ring/browse-kill-ring"))])
- (browse-url-dwim . [(20140731 1922) ((string-utils (0 3 2))) "Context-sensitive external browse URL or Internet search" single ((:commit . "3d611dbb167c286109ac53995ad68286d87aafb9") (:keywords "hypermedia") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/browse-url-dwim"))])
- (brutal-theme . [(20200415 602) ((emacs (24 1))) "Brutalist theme" single ((:commit . "ee63563b7cb07aeec342722ae684426cb0465a98") (:authors ("Topi Kettunen" . "topi@kettunen.io")) (:maintainer "Topi Kettunen" . "topi@kettunen.io") (:url . "https://github.com/topikettunen/brutal"))])
- (brutalist-theme . [(20181023 1222) nil "Brutalist theme" tar ((:commit . "6568844b83dc916a5d6aa69960cbc85ded5f7d73") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://git.madhouse-project.org/algernon/brutalist-theme.el"))])
- (bshell . [(20190617 238) ((emacs (25)) (buffer-manage (0 5))) "manage and track multiple inferior shells" single ((:commit . "5cdffa393ec3f923736bc6459bc958829a321327") (:keywords "interactive" "shell" "management") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/bshell"))])
- (btc-ticker . [(20151113 1459) ((json (1 2)) (request (0 2 0))) "Shows latest bitcoin price" single ((:commit . "845235b545f070d0812cd1654cbaa4997565824f") (:keywords "news") (:authors ("Jorge Niedbalski R." . "jnr@metaklass.org")) (:maintainer "Jorge Niedbalski R." . "jnr@metaklass.org"))])
- (bts . [(20151109 1333) ((widget-mvc (0 0 2)) (log4e (0 3 0)) (yaxception (0 3 3)) (dash (2 9 0)) (s (1 9 0)) (pos-tip (0 4 5))) "A unified UI for various bug tracking systems" single ((:commit . "df42d58a36447697f93b56e69f5e700b2baef1f9") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-bts"))])
- (bts-github . [(20170401 1249) ((bts (0 0 1)) (gh (0 8 2))) "A plugin of bts.el for GitHub" single ((:commit . "ef2cf9202dc2128e5efdb613bfde9276a8cd95ad") (:keywords "convenience" "git" "github") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-bts-github"))])
- (bubbleberry-theme . [(20141017 944) ((emacs (24 1))) "A theme based on LightTable for Emacs24" single ((:commit . "22e9adf4586414024e4592972022ec297321b320") (:authors ("Jason Milkins" . "jasonm23@gmail.com") ("Gaurav Giri github.com/grvgr")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-bubbleberry-theme"))])
- (buckwalter . [(20191119 1950) nil "Write arabic using Buckwalter transliteration" single ((:commit . "1ef6f210f38c0686bc5b445b9704190f168f30ea") (:keywords "arabic" "transliteration" "i18n") (:authors ("Joe HAKIM RAHME" . "joehakimrahme@gmail.com")) (:maintainer "Joe HAKIM RAHME" . "joehakimrahme@gmail.com") (:url . "https://github.com/joehakimrahme/buckwalter-arabic"))])
- (buffer-buttons . [(20150106 1439) nil "Define, save, and load code-safe buttons in files for emacs" single ((:commit . "2feb8494fa7863b98256bc85da670d74a3a8a975") (:authors ("Ryan Pavlik" . "rpavlik@gmail.com")) (:maintainer "Ryan Pavlik" . "rpavlik@gmail.com") (:url . "https://github.com/rpav/buffer-buttons"))])
- (buffer-flip . [(20180307 2251) nil "Cycle through buffers like Alt-Tab in Windows" single ((:commit . "e093360e05164c78255866c1ac8f966aa38ba514") (:keywords "convenience") (:authors ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:url . "https://github.com/killdash9/buffer-flip.el"))])
- (buffer-manage . [(20191015 1730) ((emacs (26)) (choice-program (0 5)) (dash (2 13 0))) "manage buffers" tar ((:commit . "4fd0e6f9f3da31bc805be2000adf2c91088dd39b") (:keywords "interactive" "buffer" "management") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/buffer-manage"))])
- (buffer-move . [(20160615 1803) nil "easily swap buffers" single ((:commit . "cb517ecf8409b5fdcda472d7190c6021f0c49751") (:keywords "lisp" "convenience") (:url . "https://github.com/lukhas/buffer-move"))])
- (buffer-sets . [(20170718 340) ((cl-lib (0 5))) "Sets of Buffers for Buffer Management" single ((:commit . "4a4ccb0d6916c3e9fba737bb7b48e8aac921954e") (:keywords "buffer-management") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:url . "http://github.com/swflint/buffer-sets"))])
- (buffer-utils . [(20140512 1400) nil "Buffer-manipulation utility functions" single ((:commit . "685b13457e3a2085b7584e41365d2aa0779a1b6f") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/buffer-utils"))])
- (buffer-watcher . [(20170913 839) ((f (0 16 2)) (cl-lib (0 5))) "Easily run shell scripts per filetype/directory when a buffer is saved" single ((:commit . "b32c67c8a5d724257d759f4c903d0dedc32246ef") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))])
- (buffer-wrap . [(20200724 906) ((emacs (24 4))) "Wrap the beginning and the end of buffer" single ((:commit . "c24eb1f251baecfb0bbfa750904e6b15cc977a6c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/buffer-wrap"))])
- (bufler . [(20200409 1253) ((emacs (26 3)) (dash (2 17)) (dash-functional (2 17)) (f (0 17)) (pretty-hydra (0 2 2)) (magit-section (0 1))) "Group buffers into workspaces with programmable rules" tar ((:commit . "b2b260e4f9e8ba76bb8b4d71344c7b75e05ac44f") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/bufler.el"))])
- (bufshow . [(20130726 1838) ((emacs (24 1))) "A simple presentation tool for Emacs." single ((:commit . "d60a554e7239e6f7520d9c3436d5ecdbc9cf6957") (:authors ("Peter Jones" . "pjones@pmade.com")) (:maintainer "Peter Jones" . "pjones@pmade.com") (:url . "https://github.com/pjones/bufshow"))])
- (bug-reference-github . [(20200206 2158) nil "Set `bug-reference-url-format' in Github repos" tar ((:commit . "c9512a010f19633e69f1d4b1597eff7048b21112") (:keywords "programming" "tools") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:url . "https://github.com/arnested/bug-reference-github"))])
- (bui . [(20200426 2219) ((emacs (24 3)) (dash (2 11 0))) "Buffer interface library" tar ((:commit . "28a9b0a36cb69b931cf32db7546ad5c6589752cf") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/bui.el"))])
- (build-farm . [(20181218 2002) ((emacs (24 4)) (bui (1 2 1)) (magit-popup (2 1 0))) "Interface for Nix and Guix build farms (Hydra and Cuirass)" tar ((:commit . "5c268a3c235ace0d79ef1ec82c440120317e06f5") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://gitlab.com/alezost-emacs/build-farm"))])
- (build-helper . [(20161009 1755) ((projectile (0 9 0))) "Utilities to help build code" single ((:commit . "7a6fe71125a26ed1c492dab77cc688a7fe1d68ac") (:keywords "convenience") (:authors ("Afonso Bordado" . "afonsobordado@az8.co")) (:maintainer "Afonso Bordado" . "afonsobordado@az8.co") (:url . "http://github.com/afonso360/build-helper"))])
- (build-status . [(20190807 1231) ((cl-lib (0 5))) "Mode line build status indicator" single ((:commit . "1a1d2473aa62f2fdda47d8bfeb9fe352d2579b48") (:keywords "mode-line" "ci" "circleci" "travis-ci") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:url . "http://github.com/sshaw/build-status"))])
- (bundler . [(20200129 1338) ((inf-ruby (2 1)) (cl-lib (0 5))) "Interact with Bundler from Emacs" single ((:commit . "43efb6be4ed118b06d787ce7fbcffd68a31732a7") (:keywords "bundler" "ruby") (:authors ("Tobias Svensson" . "tob@tobiassvensson.co.uk")) (:maintainer "Tobias Svensson" . "tob@tobiassvensson.co.uk") (:url . "http://github.com/endofunky/bundler.el"))])
- (bury-successful-compilation . [(20181106 403) nil "Bury the *compilation* buffer after successful compilation" single ((:commit . "674644c844184605a1bb4f9487a60f7a780a6fe7") (:keywords "compilation") (:authors ("Eric Crosson" . "esc@ericcrosson.com")) (:maintainer "Eric Crosson" . "esc@ericcrosson.com"))])
- (buster-mode . [(20140928 1213) nil "Minor mode to speed up development when writing tests with Buster.js" single ((:commit . "de6958ef8369400922618b8d1e99abfa91b97ac5") (:keywords "buster" "testing" "javascript"))])
- (buster-snippets . [(20151125 1010) ((yasnippet (0 8 0))) "Yasnippets for the Buster javascript testing framework" tar ((:commit . "bb8769dae132659858e74d52f3f4e8790399423a") (:keywords "snippets") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (busybee-theme . [(20170719 928) nil "port of vim's mustang theme" single ((:commit . "66b2315b030582d0ebee605cf455d386d8c30fcd") (:authors ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/busybee-theme"))])
- (butler . [(20150812 8) ((deferred (0 3 2)) (json (1 2)) (emacs (24))) "Emacs client for Jenkins" tar ((:commit . "8ceb35737107572455cca9a61ff46b3ff78f1016"))])
- (buttercup . [(20200730 1925) nil "Behavior-Driven Emacs Lisp Testing" tar ((:commit . "995a4f18f23b7e1eaf1626e6774f500868b15d8f"))])
- (buttercup-junit . [(20190802 2258) ((emacs (24 3)) (buttercup (1 15))) "JUnit reporting for Buttercup" single ((:commit . "3ae4f84813c9e04e03a6e703990ca998b62b6deb") (:keywords "tools" "test" "unittest" "buttercup" "ci") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:url . "https://bitbucket.org/olanilsson/buttercup-junit"))])
- (button-lock . [(20200309 1323) nil "Clickable text defined by regular expression" single ((:commit . "9afe0f4d05910b0cccc94cb6d4d880119f3b0528") (:keywords "mouse" "button" "hypermedia" "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/button-lock"))])
- (buttons . [(20190319 41) ((cl-lib (0 3))) "Define and visualize hierarchies of keymaps" single ((:commit . "a14d0c21cc30d33b57481f535f2a838d65b2032f") (:keywords "keymap" "template" "snippet") (:authors ("Ernesto Alfonso")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:url . "http://github.com/erjoalgo/emacs-buttons"))])
- (c-c-combo . [(20151224 255) nil "Make stuff happen when you reach a target wpm" tar ((:commit . "a261a833499a7fdc29610863b3aafc74818770ba") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "https://www.github.com/CestDiego/c-c-combo.el"))])
- (c-eldoc . [(20181109 439) nil "helpful description of the arguments to C functions" single ((:commit . "e35c0e40f71c25804919f6c01fd27e95c2e2adb7") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/c-eldoc"))])
- (c0-mode . [(20151110 1852) nil "Major mode for editing C0 files" tar ((:commit . "c214093c36864d6208fcb9e6a72413ed17ed5d60") (:keywords "c0" "languages") (:authors ("Jakob Max Uecker")) (:maintainer "Jakob Max Uecker") (:url . "http://c0.typesafety.net/"))])
- (cabledolphin . [(20160204 938) ((emacs (24 4)) (seq (1 0))) "capture Emacs network traffic" single ((:commit . "fffc192cafa61558e924323d6da8166fe5f2a6f9") (:keywords "comm") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com"))])
- (cache . [(20111019 2300) nil "implementation of a hash table whose key-value pairs expire" single ((:commit . "7499586b6c8224df9f5c5bc4dec96b008258d580") (:authors ("Nathaniel Flath")) (:maintainer "Nathaniel Flath"))])
- (cacoo . [(20120319 2359) ((concurrent (0 3 1))) "Minor mode for Cacoo : http://cacoo.com" tar ((:commit . "c9fa04fbe97639b24698709530361c2bb5f3273c"))])
- (caddyfile-mode . [(20181204 858) ((emacs (25)) (loop (1 3))) "Major mode for Caddy configuration files" single ((:commit . "976ad0664c3f44bfa11cb9b8787ddfb094d0a666") (:keywords "languages") (:authors ("Thomas Jost" . "schnouki@schnouki.net")) (:maintainer "Thomas Jost" . "schnouki@schnouki.net") (:url . "https://github.com/Schnouki/caddyfile-mode/"))])
- (cake-inflector . [(20140415 858) ((s (1 9 0))) "Lazy porting CakePHP infrector.php to el" single ((:commit . "a1d338ec4840b1b1bc14f7f9298c07e2c1d2d8fc") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "https://github.com/k1LoW/emacs-cake-inflector"))])
- (cakecrumbs . [(20180929 139) ((emacs (24 4))) "Show parents on header for HTML/Jade/Sass/Stylus" single ((:commit . "cf8c1df885eee004602f73c4f841301e200e5850") (:keywords "languages" "html" "jade" "pug" "sass" "scss" "stylus") (:authors ("ono hiroko <kuanyui.github.io>")) (:maintainer "ono hiroko <kuanyui.github.io>") (:url . "https://github.com/kuanyui/cakecrumbs.el"))])
- (cal-china-x . [(20190518 1057) ((cl-lib (0 5))) "Chinese localization, lunar/horoscope/zodiac info and more..." tar ((:commit . "177f60e011606126f23c8ffed69458439f1c12e0") (:authors ("William Xu" . "william.xwl@gmail.com")) (:maintainer "William Xu" . "william.xwl@gmail.com") (:url . "https://github.com/xwl/cal-china-x"))])
- (calc-at-point . [(20200406 1618) ((emacs (26)) (dash (2 12 0)) (dash-functional (1 2 0))) "Perform calculations at point or over selection" single ((:commit . "11e40c8db9493ada71964b73069c6db529016492") (:keywords "convenience") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/calc-at-point"))])
- (calendar-norway . [(20180906 1502) nil "Norwegian calendar" single ((:commit . "8d1fda8268caa74ba5e712c7675ed3c34e46e2d4") (:keywords "calendar" "norwegian" "localization") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))])
- (calfw . [(20180118 45) nil "Calendar view framework on Emacs" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:keywords "calendar") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:url . "https://github.com/kiwanami/emacs-calfw"))])
- (calfw-cal . [(20170320 1206) nil "calendar view for emacs diary" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:keywords "calendar") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>"))])
- (calfw-gcal . [(20120111 1000) nil "edit Google calendar for calfw.el." tar ((:commit . "14aab20687d6cc9e6c5ddb9e11984c4e14c3d870") (:keywords "convenience" "calendar" "calfw.el") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/calfw-gcal.el"))])
- (calfw-howm . [(20170704 4) nil "calendar view for howm" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:keywords "calendar") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>"))])
- (calfw-ical . [(20150703 819) nil "calendar view for ical format" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:keywords "calendar") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>"))])
- (calfw-org . [(20160303 258) nil "calendar view for org-agenda" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:keywords "calendar" "org") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>"))])
- (calibredb . [(20200719 1237) ((emacs (25 1)) (org (9 0)) (transient (0 1 0)) (s (1 12 0)) (dash (2 17 0))) "Yet another calibre client" tar ((:commit . "a27b71b727ebf726ed0742d968717e0e89db9786") (:keywords "tools") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:url . "https://github.com/chenyanming/calibredb.el"))])
- (call-graph . [(20200402 910) ((emacs (25)) (cl-lib (0 6 1)) (hierarchy (0 7 0)) (tree-mode (1 0 0)) (ivy (0 10 0)) (anaconda-mode (0 1 13))) "Library to generate call graph for c/c++ functions" tar ((:commit . "2f47dcb65ed8dc5393df846b4175a4872e254c05") (:keywords "programming" "convenience") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:url . "https://github.com/beacoder/call-graph"))])
- (calmer-forest-theme . [(20130926 510) nil "Darkish theme with green/orange tint" single ((:commit . "87ba7bae389084d13fe3bc34e0c923017eda6ba0") (:authors ("Artur Hefczyc, created 2003-04-18") ("David Caldwell" . "david@porkrind.org")) (:maintainer "Artur Hefczyc, created 2003-04-18") (:url . "https://github.com/caldwell/calmer-forest-theme"))])
- (camcorder . [(20190317 2138) ((emacs (24)) (names (20150000)) (cl-lib (0 5))) "Record screencasts in gif or other formats." single ((:commit . "b11ca61491a27681bb3131b72b51c105fd996bed") (:keywords "multimedia" "screencast") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/camcorder.el"))])
- (caml . [(20190413 1205) nil "OCaml code editing commands for Emacs" tar ((:commit . "38ebde12d3d529e6ef8078967997d32226e69e82") (:keywords "ocaml") (:authors ("Jacques Garrigue" . "garrigue@kurims.kyoto-u.ac.jp") ("Ian T Zimmerman" . "itz@rahul.net")) (:maintainer "Damien Doligez" . "damien.doligez@inria.fr") (:url . "https://github.com/ocaml/ocaml/"))])
- (cangjie . [(20190929 1221) ((emacs (24 4)) (s (1 12 0)) (dash (2 14 1)) (f (0 2 0))) "Retrieve cangjie code for han characters" tar ((:commit . "0a703f4d1162259d77bfb3f862d13c1b1f11a711") (:keywords "convenience" "writing") (:url . "https://github.com/kisaragi-hiu/cangjie.el"))])
- (capture . [(20130828 1644) nil "screencasting with \"avconv\" or \"ffmpeg\"" tar ((:commit . "1bb26060311da76767f70096218313fc93b0c806") (:authors ("Sergey Pashinin <sergey at pashinin dot com>")) (:maintainer "Sergey Pashinin <sergey at pashinin dot com>"))])
- (carbon-now-sh . [(20180331 1735) ((emacs (24 4)) (dash (2 12 0))) "https://carbon.now.sh integration." single ((:commit . "71dee6bc4f2a2cb02b9b7b5e643c4c92b880e6a4") (:keywords "convenience") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:url . "https://github.com/veelenga/carbon-now-sh.el"))])
- (cargo . [(20191224 47) ((emacs (24 3)) (rust-mode (0 2 0)) (markdown-mode (2 4))) "Emacs Minor Mode for Cargo, Rust's Package Manager." tar ((:commit . "dc9ff35c2861d524ac4d65020c5320eec71acacf") (:keywords "tools") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com"))])
- (caroline-theme . [(20160318 520) ((emacs (24))) "A trip down to New Orleans..." single ((:commit . "222fd483db304509f9e422dc82883d808e023ceb") (:authors ("Jack Killilea" . "jaaacckz1@gmail.com")) (:maintainer "Jack Killilea" . "jaaacckz1@gmail.com") (:url . "https://github.com/xjackk/carolines-theme"))])
- (caseformat . [(20160115 1615) ((emacs (24)) (cl-lib (0 5)) (dash (2 12 1)) (s (1 10 0))) "Format based letter case converter" single ((:commit . "75ddb9c64eeb78b46d9e1db99bef8d0fb1e46b99") (:keywords "convenience") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/caseformat"))])
- (cask . [(20191004 1155) ((s (1 8 0)) (dash (2 2 0)) (f (0 16 0)) (epl (0 5)) (shut-up (0 1 0)) (cl-lib (0 3)) (package-build (1 2)) (ansi (0 4 1))) "Cask: Project management for Emacs package development" tar ((:commit . "55cb0926a8be3699b75886e9e7bbccc2f7e1042e") (:keywords "speed" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/cask/cask"))])
- (cask-mode . [(20160410 1449) ((emacs (24 3))) "major mode for editing Cask files" single ((:commit . "7c6719d3bb4fe552958634bd5a11abc56681f3a7") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (cask-package-toolset . [(20170921 2256) ((emacs (24)) (cl-lib (0 3)) (s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Toolsettize your package" tar ((:commit . "2c74cd827e88c7f8360581a841e45f0b794510e7") (:keywords "convenience" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:url . "http://github.com/AdrieanKhisbe/cask-package-toolset.el"))])
- (caskxy . [(20140513 1539) ((log4e (0 2 0)) (yaxception (0 1))) "Control Cask in Emacs" single ((:commit . "dc18dcab7ed526070ab76de071c9c5272e6ac40e") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/caskxy"))])
- (catmacs . [(20170826 1157) ((emacs (24))) "Simple CAT interface for Yaesu Transceivers." single ((:commit . "65d3e0563abe6ff9577202cf2278074d4130fbdd") (:keywords "comm" "hardware") (:authors ("Frank Singleton" . "b17flyboy@gmail.com")) (:maintainer "Frank Singleton" . "b17flyboy@gmail.com") (:url . "https://bitbucket.org/pymaximus/catmacs"))])
- (cbm . [(20171116 1240) ((cl-lib (0 5))) "Switch to similar buffers." single ((:commit . "5b41c936ba9f6d170309a85ffebc9939c1050b31") (:keywords "buffers") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:url . "http://github.com/akermu/cbm.el"))])
- (cc-cedict . [(20200705 443) ((emacs (26 1))) "Interface to CC-CEDICT (a Chinese-English dictionary)" single ((:commit . "6bb9481e48b889503626b4e3cb7cfec8d14cbf4b") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/cc-cedict.el"))])
- (ccc . [(20200314 1557) nil "buffer local cursor color control library" single ((:commit . "814e5008f0b8ba8132fd171f5177c3a2f2cc9bab") (:keywords "cursor") (:authors ("Masatake YAMATO" . "masata-y@is.aist-nara.ac.jp")) (:maintainer "SKK Development Team" . "skk@ring.gr.jp") (:url . "https://github.com/skk-dev/ddskk/blob/master/READMEs/README.ccc.org"))])
- (ccls . [(20200710 1810) ((emacs (25 1)) (lsp-mode (6 3 1)) (dash (2 14 1))) "ccls client for lsp-mode" tar ((:commit . "b8e2f4d9b5bed5b5e8b387ac8e43eff723120b80") (:keywords "languages" "lsp" "c++") (:authors ("Tobias Pisani, Fangrui Song")) (:maintainer "Tobias Pisani, Fangrui Song") (:url . "https://github.com/MaskRay/emacs-ccls"))])
- (cd-compile . [(20141108 1957) nil "run compile in a specific directory" single ((:commit . "10284ccae86afda4a37b09ba90acd1e2efedec9f") (:authors ("Jamie Nicol" . "jamie@thenicols.net")) (:maintainer "Jamie Nicol" . "jamie@thenicols.net"))])
- (cdb . [(20200314 1557) nil "constant database (cdb) reader for Emacs Lisp" single ((:commit . "814e5008f0b8ba8132fd171f5177c3a2f2cc9bab") (:keywords "cdb") (:authors ("Yusuke Shinyama <yusuke at cs . nyu . edu>")) (:maintainer "SKK Development Team" . "skk@ring.gr.jp"))])
- (cdlatex . [(20200506 739) nil "Fast input methods for LaTeX environments and math" single ((:commit . "480387b39f6ddd9cd2a9511ecee064ad8e1dd324") (:keywords "tex") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com"))])
- (cdnjs . [(20161031 1522) ((dash (2 13 0)) (deferred (0 4)) (f (0 17 2)) (pkg-info (0 5))) "A front end for http://cdnjs.com" single ((:commit . "ce19880d3ec3d81e6c665d0b1dfea99cc7a3f908") (:keywords "tools") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/cdnjs.el"))])
- (cedit . [(20141231 1614) nil "paredit-like commands for c-like languages" single ((:commit . "0878d851b6307c162bfbddd2bb02789e5e27bc2c") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (celery . [(20170225 924) ((emacs (24)) (dash-functional (2 11 0)) (s (1 9 0)) (deferred (0 3 2))) "a minor mode to draw stats from celery and more?" single ((:commit . "51197d74f5eaa8ae09144af7663a2f4277f07d16") (:keywords "celery" "convenience") (:authors ("ardumont" . "eniotna.t@gmail.com")) (:maintainer "ardumont" . "eniotna.t@gmail.com") (:url . "https://github.com/ardumont/emacs-celery"))])
- (celestial-mode-line . [(20180518 822) ((emacs (24))) "Show lunar phase and sunrise/-set time in modeline" single ((:commit . "3f5794aca99b977f1592cf1ab4516ae7922196a1") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:url . "https://github.com/ecraven/celestial-mode-line"))])
- (centaur-tabs . [(20200722 27) ((emacs (24 4)) (powerline (2 4)) (cl-lib (0 5))) "Aesthetic, modern looking customizable tabs plugin" tar ((:commit . "9114ef423e820eee3f9c6cb29e112fc22aee84dd") (:authors ("Emmanuel Bustos" . "ema2159@gmail.com")) (:maintainer "Emmanuel Bustos" . "ema2159@gmail.com") (:url . "https://github.com/ema2159/centaur-tabs"))])
- (centered-cursor-mode . [(20200507 1529) nil "cursor stays vertically centered" single ((:commit . "f376bdb882047347345d5f0e3ec3fcef63ee93ba") (:keywords "convenience") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de") (:url . "https://github.com/andre-r/centered-cursor-mode.el"))])
- (centered-window . [(20200426 1053) ((emacs (24 4))) "Center the text when there's only one window" single ((:commit . "f50859941ab5c7cbeaee410f2d38716252b552ac") (:keywords "faces" "windows") (:authors ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainer "Anler Hernández Peral" . "inbox+emacs@anler.me") (:url . "https://github.com/anler/centered-window-mode"))])
- (centimacro . [(20140306 1427) nil "Assign multiple macros as global key bindings" single ((:commit . "1b97a9b558ed9c49d5da1bfbf29b2506575c2742") (:keywords "macros") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/centimacro"))])
- (cerbere . [(20181113 1641) ((pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:commit . "c667c165d9c1657f13d2d46f09ba21b61f9402cc") (:keywords "python" "go" "php" "phpunit" "elisp" "ert" "tests" "tdd") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/cerbere"))])
- (ceylon-mode . [(20180606 1324) ((emacs (25))) "Major mode for editing Ceylon source code" single ((:commit . "948515672bc596dc118e8e3ede3ede5ec6a3c95a") (:keywords "languages" "ceylon") (:authors ("Lucas Werkmeister" . "mail@lucaswerkmeister.de")) (:maintainer "Lucas Werkmeister" . "mail@lucaswerkmeister.de") (:url . "https://github.com/lucaswerkmeister/ceylon-mode"))])
- (cfengine-code-style . [(20171115 2108) nil "C code style for CFEngine project." single ((:commit . "fc7188b8097a7bc2140e70772393cb20b5e4de41") (:authors ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainer "Mikhail Gusarov" . "mikhail.gusarov@cfengine.com") (:url . "https://github.com/cfengine/core"))])
- (cff . [(20160118 2018) ((cl-lib (0 5)) (emacs (24))) "Search of the C/C++ file header by the source and vice versa" single ((:commit . "b6ab2a28e64ef06f281ec74cfe3114e450644dfa") (:keywords "find-file") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:url . "https://github.com/fourier/cff"))])
- (cfml-mode . [(20190617 1130) ((emacs (25))) "Emacs mode for editing CFML files" single ((:commit . "b06d7cee2af0ed5d55a94f0db80fc1f429a1829a") (:authors ("Andrew Myers" . "am2605@gmail.com")) (:maintainer "Andrew Myers" . "am2605@gmail.com") (:url . "https://github.com/am2605/cfml-mode"))])
- (cframe . [(20190616 1946) ((emacs (25)) (buffer-manage (0 9)) (dash (2 13 0))) "customize a frame and fast switch size and positions" single ((:commit . "38026cbd004231c5525bea31723ced39311bb408") (:keywords "frame" "customize") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/cframe"))])
- (cfrs . [(20191125 2007) ((emacs (25 2)) (dash (2 11 0)) (s (1 10 0)) (posframe (0 4 3))) "Child-frame based read-string" single ((:commit . "fc5effdc25a926eada4936e5506dcccdf3902137") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/cfrs"))])
- (cg . [(20200305 1845) ((emacs (24 3))) "major mode for editing Constraint Grammar files" single ((:commit . "b0e4cca3d8a28054b3af2f592b528903c7e7c111") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "https://visl.sdu.dk/constraint_grammar.html"))])
- (challenger-deep-theme . [(20191114 1339) ((emacs (24))) "challenger-deep Theme" single ((:commit . "b8427b5c87948a183e2dd2b8920a54fbaae2738b") (:authors ("MaxSt")) (:maintainer "MaxSt") (:url . "https://github.com/challenger-deep-theme/emacs"))])
- (change-inner . [(20150707 1544) ((expand-region (0 7))) "Change contents based on semantic units" single ((:commit . "52c543a4b9808c0d15b565fcdf646c9779de33e8") (:keywords "convenience" "extensions") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (chapel-mode . [(20160504 808) nil "a CC Mode for Chapel derived from derived-mode-ex.el" single ((:commit . "6e095edd7639f5f0a81e14d6412410b49466697e") (:keywords "chapel" "languages" "oop") (:authors ("Steven T Balensiefer")) (:maintainer "Russel Winder" . "russel@winder.org.uk"))])
- (char-menu . [(20190713 1343) ((emacs (24 3)) (avy-menu (0 1))) "Create your own menu for fast insertion of arbitrary symbols" single ((:commit . "a1ccf5ed786af6e2441037964668d817b9c7362f") (:keywords "convenience" "editing") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/char-menu"))])
- (charmap . [(20200616 1418) nil "Unicode table for Emacs" single ((:commit . "feac50b87d2a596c5e5b7b82b79ddd65b6dedd8c") (:keywords "unicode" "character" "ucs") (:authors ("Anan Mikami" . "lateau@gmail.com")) (:maintainer "Anan Mikami" . "lateau@gmail.com") (:url . "https://github.com/lateau/charmap"))])
- (chatwork . [(20170511 442) nil "ChatWork client for Emacs" single ((:commit . "fea231d479f06bf40dbfcf45de143eecc9ed744c") (:keywords "web") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:url . "https://github.com/ataka/chatwork"))])
- (cheat-sh . [(20200226 1021) ((emacs (25 1))) "Interact with cheat.sh" single ((:commit . "52293c366044e44c8f6b648a312433345e4718ad") (:keywords "docs" "help") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/cheat-sh.el"))])
- (cheatsheet . [(20170126 2150) ((emacs (24)) (cl-lib (0 5))) "create your own cheatsheet" single ((:commit . "e4f8e0110167ea16a17a74517d1f10cb7ff805b8") (:keywords "convenience" "usability") (:authors ("Shirin Nikita" . "shirin.nikita@gmail.com")) (:maintainer "Shirin Nikita" . "shirin.nikita@gmail.com") (:url . "http://github.com/darksmile/cheatsheet/"))])
- (checkbox . [(20141117 58) ((emacs (24)) (cl-lib (0 5))) "Quick manipulation of textual checkboxes" single ((:commit . "335afa4404adf72973195a580458927004664d98") (:keywords "convenience") (:authors ("Cameron Desautels" . "camdez@gmail.com")) (:maintainer "Cameron Desautels" . "camdez@gmail.com") (:url . "http://github.com/camdez/checkbox.el"))])
- (chee . [(20171123 2233) ((dash (2 12 1)) (s (1 10 0)) (f (0 18 2))) "Interface to chee using dired and image-dired" tar ((:commit . "669ff9ee429f24c3c2d03b83d9cb9aec5f86bb8b") (:url . "https://github.com/eikek/chee/tree/release/0.3.0/emacs"))])
- (cheerilee . [(20160313 1835) ((xelb (0 1))) "Toolkit library" tar ((:commit . "41bd81b5b0bb657241ceda5be6af5e07254d7376") (:keywords "tools"))])
- (chef-mode . [(20180628 1453) nil "minor mode for editing an opscode chef repository" single ((:commit . "048d691cb63981ae235763d4a6ced4af5c729924") (:keywords "chef" "knife") (:authors ("Maciej Pasternacki" . "maciej@pasternacki.net")) (:maintainer "Maciej Pasternacki" . "maciej@pasternacki.net"))])
- (cherry-blossom-theme . [(20150622 342) ((emacs (24 0))) "a soothing color theme for Emacs24." single ((:commit . "eea7653e00f35973857ee23b27bc2fae5e753e50") (:authors ("Ben Yelsey" . "byelsey1@gmail.com")) (:maintainer "Ben Yelsey" . "byelsey1@gmail.com") (:url . "https://github.com/inlinestyle/emacs-cherry-blossom-theme"))])
- (chicken-scheme . [(20141116 1939) nil "Scheme-mode extensions for Chicken Scheme" single ((:commit . "19b0b08b5592063e852cae094b394c7d1f923639") (:authors ("Daniel Leslie" . "dan@ironoxide.ca")) (:maintainer "Daniel Leslie" . "dan@ironoxide.ca") (:url . "http://github.com/dleslie/chicken-scheme"))])
- (chinese-conv . [(20170807 2128) ((cl-lib (0 5))) "Conversion between Chinese Characters with opencc or cconv" single ((:commit . "b56815bbb163d642e97fa73093b5a7e87cc32574") (:authors ("gucong" . "gucong43216@gmail.com")) (:maintainer "gucong" . "gucong43216@gmail.com") (:url . "https://github.com/gucong/emacs-chinese-conv"))])
- (chinese-number . [(20161008 509) nil "Convert numbers between Arabic and Chinese formats" single ((:commit . "7311c2a0c5eea5f016a90d733dfe75144c302fb2") (:authors (nil . "zhcosin<zhcosin@163.com>")) (:maintainer nil . "zhcosin<zhcosin@163.com>") (:url . "https://github.com/zhcosin/chinese-number"))])
- (chinese-wbim . [(20190727 854) nil "Enable Wubi Input Method in Emacs." tar ((:commit . "5d496364b0b6bbaaf0f9b37e5a6d260d4994f260"))])
- (chinese-word-at-point . [(20170811 941) ((cl-lib (0 5))) "Add `chinese-word' thing to `thing-at-point'" single ((:commit . "8223d7439e005555b86995a005b225ae042f0538") (:keywords "convenience" "chinese") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/chinese-word-at-point.el"))])
- (chinese-yasdcv . [(20171015 144) ((cl-lib (0 5)) (pyim (1 6 0))) "Yet another StarDict frontend" tar ((:commit . "5ab830daf1273d5a5cddcb94b56a9737f12d996f") (:keywords "convenience" "chinese" "dictionary") (:authors ("Feng Shu" . "tumashu@gmail.com")) (:maintainer "Feng Shu" . "tumashu@gmail.com") (:url . "https://github.com/tumashu/chinese-yasdcv"))])
- (chocolate-theme . [(20191021 1346) ((emacs (24 1)) (autothemer (0 2))) "A dark chocolaty theme" single ((:commit . "1c6cd8d2fdc939bd4d26117d61e57c11cfe26512") (:url . "http://github.com/SavchenkoValeriy/emacs-chocolate-theme"))])
- (choice-program . [(20190817 2153) ((emacs (26))) "parameter based program" tar ((:commit . "583242445e7890a12bb674b43244bf27c84d91f6") (:keywords "exec" "execution" "parameter" "option") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/choice-program"))])
- (chronometer . [(20190304 1528) ((emacs (24))) "a [not so] simple chronometer" single ((:commit . "8457b296ef87be339cbe47730b922757d60bdcd5") (:keywords "tools" "convenience") (:authors ("Marcelo Toledo" . "marcelo@marcelotoledo.com")) (:maintainer "Marcelo Toledo" . "marcelo@marcelotoledo.com") (:url . "https://github.com/marcelotoledo/chronometer"))])
- (chronometrist . [(20200723 2218) ((emacs (25 1)) (dash (2 16 0)) (seq (2 20)) (s (1 12 0)) (ts (0 2)) (anaphora (1 0 4))) "A time tracker with a nice interface" tar ((:commit . "875400f61cd4c1fff1536b2bbc68f8e35d278cd0") (:keywords "calendar") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr") (:url . "https://framagit.org/contrapunctus/chronometrist"))])
- (chronometrist-goal . [(20200706 1306) ((emacs (25 1)) (alert (1 2)) (chronometrist (0 5 0))) "Adds support for time goals to Chronometrist" single ((:commit . "a9c4410f25f875c55b9237ef6544e82f4a805af6") (:keywords "calendar") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr") (:url . "https://github.com/contrapunctus-1/chronometrist"))])
- (chronos . [(20150602 1529) nil "multiple simultaneous countdown / countup timers" tar ((:commit . "b360d9dae57aa553cf2a14ffa0756a51ad71de09") (:keywords "calendar") (:authors ("David Knight" . "dxknight@opmbx.org")) (:maintainer "David Knight" . "dxknight@opmbx.org") (:url . "http://github.com/dxknight/chronos"))])
- (chruby . [(20180114 1652) ((cl-lib (0 5))) "Emacs integration for chruby" single ((:commit . "42bc6d521f832eca8e2ba210f30d03ad5529788f") (:keywords "languages") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:url . "https://github.com/plexus/chruby.el"))])
- (chyla-theme . [(20180302 1658) nil "chyla.org - green color theme." single ((:commit . "ae5e7ecace2ab474151eb0ac5ef07fba2dc32f8a") (:authors ("Adam Chyła" . "adam@chyla.org")) (:maintainer "Adam Chyła" . "adam@chyla.org") (:url . "https://github.com/chyla/ChylaThemeForEmacs"))])
- (cider . [(20200731 839) ((emacs (25)) (clojure-mode (5 11)) (parseedn (0 1)) (pkg-info (0 4)) (queue (0 2)) (spinner (1 7)) (seq (2 16)) (sesman (0 3 2))) "Clojure Interactive Development Environment that Rocks" tar ((:commit . "19a899acb03c55ee19d3cadaf6e3165bdb8ff12d") (:keywords "languages" "clojure" "cider") (:authors ("Tim King" . "kingtim@gmail.com") ("Phil Hagelberg" . "technomancy@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Artur Malabarba" . "bruce.connor.am@gmail.com") ("Hugo Duncan" . "hugo@hugoduncan.org") ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://www.github.com/clojure-emacs/cider"))])
- (cider-decompile . [(20151122 537) ((cider (0 3 0)) (javap-mode (9))) "decompilation extension for cider" single ((:commit . "5d87035f3c3c14025e8f01c0c53d0ce2c8f56651") (:keywords "languages" "clojure" "cider") (:authors ("Dmitry Bushenko")) (:maintainer "Dmitry Bushenko") (:url . "http://www.github.com/clojure-emacs/cider-decompile"))])
- (cider-eval-sexp-fu . [(20190311 2152) ((emacs (24)) (eval-sexp-fu (0 5 0))) "Briefly highlights an evaluated sexp." single ((:commit . "7fd229f1441356866aedba611fd0cf4e89b50921") (:keywords "languages" "clojure" "cider") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))])
- (cider-hydra . [(20190816 1121) ((cider (0 22 0)) (hydra (0 13 0))) "Hydras for CIDER." single ((:commit . "c3b8a15d72dddfbc390ab6a454bd7e4c765a2c95") (:keywords "convenience" "tools") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:url . "https://github.com/clojure-emacs/cider-hydra"))])
- (ciel . [(20180914 815) ((emacs (24))) "A command that is clone of \"ci\" in vim." single ((:commit . "429773a3c551691a463ecfddd634b8bae2f48503") (:keywords "convinience") (:authors ("Takuma Matsushita" . "cs14095@gmail.com")) (:maintainer "Takuma Matsushita" . "cs14095@gmail.com") (:url . "https://github.com/cs14095/ciel.el"))])
- (cil-mode . [(20160622 1430) nil "Common Intermediate Language mode" single ((:commit . "a78a88ca9a66a82f069329a96e34b67478ae2d9b") (:keywords "languages") (:authors ("Friedrich von Never" . "friedrich@fornever.me")) (:maintainer "Friedrich von Never" . "friedrich@fornever.me") (:url . "https://github.com/ForNeVeR/cil-mode"))])
- (cinspect . [(20150716 233) ((emacs (24)) (cl-lib (0 5)) (deferred (0 3 1)) (python-environment (0 0 2))) "Use cinspect to look at the CPython source of builtins and other C objects!" single ((:commit . "4e199a90f89b335cccda1518aa0963e0a1d4fbab") (:keywords "python") (:authors ("Ben Yelsey" . "ben.yelsey@gmail.com")) (:maintainer "Ben Yelsey" . "ben.yelsey@gmail.com") (:url . "https://github.com/inlinestyle/cinspect-mode"))])
- (circadian . [(20181024 1256) ((emacs (24 4))) "Theme-switching based on daytime" single ((:commit . "414127acad8e2e0092ca60918e6a7cb89da6e28a") (:keywords "themes") (:authors ("Guido Schmidt")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:url . "https://github.com/GuidoSchmidt/circadian"))])
- (circe . [(20200522 1955) ((cl-lib (0 5))) "Client for IRC in Emacs" tar ((:commit . "323a7e5245df4e9eb5c7af053a4c100af68134e7") (:url . "https://github.com/jorgenschaefer/circe"))])
- (circe-notifications . [(20180102 2318) ((emacs (24 4)) (circe (2 3)) (alert (1 2))) "Add desktop notifications to Circe." single ((:commit . "291149ac12877bbd062da993479d3533a26862b0") (:authors ("Ruben Maher" . "r@rkm.id.au")) (:maintainer "Ruben Maher" . "r@rkm.id.au") (:url . "https://github.com/eqyiel/circe-notifications"))])
- (citeproc . [(20200705 1155) ((emacs (25)) (dash (2 13 0)) (s (1 12 0)) (f (0 18 0)) (queue (0 2)) (string-inflection (1 0)) (org (9))) "A CSL 1.0.1 Citation Processor" tar ((:commit . "0ad1f975a095156d02dd7f9adc0fecbc57b1e751") (:keywords "bib") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:url . "https://github.com/andras-simonyi/citeproc-el"))])
- (citeproc-org . [(20200615 947) ((emacs (25 1)) (dash (2 12 0)) (org (9)) (f (0 18 0)) (citeproc (0 1)) (org-ref (1 1 1))) "Render org-mode references in CSL styles" tar ((:commit . "342f6531b08f5d789a1ae222f9707f636b1f5e2f") (:keywords "org-ref" "org-mode" "cite" "bib") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:url . "https://github.com/andras-simonyi/citeproc-org"))])
- (cl-format . [(20160413 45) nil "CL format routine." tar ((:commit . "4380cb8009c47cc6d9098b383082b93b1aefa460"))])
- (cl-lib-highlight . [(20200210 1951) ((cl-lib (0 3))) "full cl-lib font-lock highlighting" single ((:commit . "72afc4dd0107c357543244d09903767f49651c5c") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/cl-lib-highlight"))])
- (cl-libify . [(20181130 230) ((emacs (25))) "Update elisp code to use cl-lib instead of cl" single ((:commit . "f215866d7d7c52e84220cd541f40608a5b85abf0") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/cl-libify"))])
- (clang-capf . [(20200526 1546) ((emacs (24 4))) "Completion-at-point backend for c/c++ using clang" single ((:commit . "aed576cc665321bd784a96fbee848bbfa61c6704") (:keywords "c" "abbrev" "convenience") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/clang-capf"))])
- (clang-format+ . [(20190824 2216) ((emacs (25 1)) (clang-format (20180406 1514))) "Minor mode for automatic clang-format application" single ((:commit . "ddd4bfe1a13c2fd494ce339a320a51124c1d2f68") (:keywords "c" "c++" "clang-format") (:url . "https://github.com/SavchenkoValeriy/emacs-clang-format-plus"))])
- (clang-format . [(20191121 1708) ((cl-lib (0 3))) "Format code using clang-format" single ((:commit . "2d6a4526a2518b7c0059a8a0dfee156e90a49369") (:keywords "tools" "c"))])
- (clean-aindent-mode . [(20171017 2043) nil "Simple indent and unindent, trims indent white-space" single ((:commit . "a97bcae8f43a9ff64e95473e4ef0d8bafe829211") (:keywords "indentation" "whitespace" "backspace") (:authors ("peter marinov" . "efravia@gmail.com")) (:maintainer "peter marinov" . "efravia@gmail.com") (:url . "https://github.com/pmarinov/clean-aindent-mode"))])
- (clean-buffers . [(20160529 2259) ((cl-lib (0 5))) "clean useless buffers" single ((:commit . "1be6c54e3095761b6b64bf749faae3dfce94e72a") (:keywords "convenience" "usability" "buffers") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (clear-text . [(20160406 2043) nil "Make you use clear text" tar ((:commit . "b50669b6077d6948f72cb3c649281d206e0c2f2b") (:keywords "convenience") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/clear-text.el"))])
- (clevercss . [(20131229 155) nil "A major mode for editing CleverCSS files" single ((:commit . "b8a3c0dd674367c62b1a1ffec84d88fe0c0219bc") (:keywords "languages" "css") (:authors ("Joe Schafer" . "joesmoe10@gmail.com")) (:maintainer "Joe Schafer" . "joesmoe10@gmail.com"))])
- (click-mode . [(20180611 44) ((emacs (24))) "Major mode for the Click Modular Router Project" single ((:commit . "b94ea8cce89cf0e753b2ab915202d49ffc470fb6") (:keywords "click" "router") (:authors ("Brian Malehorn" . "bmalehorn@gmail.com")) (:maintainer "Brian Malehorn" . "bmalehorn@gmail.com") (:url . "https://github.com/bmalehorn/click-mode"))])
- (clipetty . [(20200327 2241) ((emacs (25 1))) "Send every kill from a TTY frame to the system clipboard" single ((:commit . "01b39044b9b65fa4ea7d3166f8b1ffab6f740362") (:keywords "terminals" "convenience") (:authors ("Mike Hamrick" . "mikeh@muppetlabs.com")) (:maintainer "Mike Hamrick" . "mikeh@muppetlabs.com") (:url . "https://github.com/spudlyo/clipetty"))])
- (cliphist . [(20190920 149) ((emacs (24 3)) (ivy (0 9 0))) "Read data from clipboard managers at Linux and Mac" tar ((:commit . "3105e5c4b4d2d0338edb6effd9329426854b80b1") (:keywords "clipboard" "manager" "history") (:authors ("Chen Bin <chenin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/cliphist"))])
- (clipmon . [(20180129 1054) nil "Clipboard monitor - watch system clipboard, add changes to kill ring/autoinsert" tar ((:commit . "95dc56c7ed84a654ec90f4740eb6df1050de8cf1") (:keywords "convenience") (:authors ("Brian Burns" . "bburns.km@gmail.com")) (:maintainer "Brian Burns" . "bburns.km@gmail.com") (:url . "https://github.com/bburns/clipmon"))])
- (clippy . [(20161028 1954) ((pos-tip (1 0))) "Show tooltip with function documentation at point" single ((:commit . "e77f6b63e54d74e243be98accad474e38f7e2a86") (:keywords "docs") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/clippy.el"))])
- (clips-mode . [(20170909 823) nil "Major mode for editing CLIPS code and REPL" tar ((:commit . "dd38e2822640a38f7d8bfec4f69d8dd24be27074"))])
- (clj-refactor . [(20200405 1419) ((emacs (25 1)) (seq (2 19)) (yasnippet (0 6 1)) (paredit (24)) (multiple-cursors (1 2 2)) (clojure-mode (5 9)) (cider (0 24 0)) (parseedn (0 1)) (inflections (2 3)) (hydra (0 13 2))) "A collection of commands for refactoring Clojure code" tar ((:commit . "97095682580bbc5bfebcbc5349f03f5bd7121c96") (:keywords "convenience" "clojure" "cider") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Lars Andersen" . "expez@expez.com") ("Benedek Fazekas" . "benedek.fazekas@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (cljr-helm . [(20160913 828) ((clj-refactor (0 13 0)) (helm-core (1 7 7)) (cl-lib (0 5))) "Wraps clojure refactor commands with helm" single ((:commit . "f2fc7b698a56e4a44d5dfbc6a55d77a93c0fa9a4") (:keywords "helm" "clojure" "refactor") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk") (:url . "https://github.com/philjackson/cljr-helm"))])
- (cljr-ivy . [(20200602 1607) ((clj-refactor (2 5 0)) (ivy (0 13 0)) (emacs (24 3)) (cl-lib (0 6 1))) "Access clojure refactor with ivy completion" single ((:commit . "921ba65d0db7cda4edcd690c708946125b874a70") (:keywords "convenience" "matching") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com") (:url . "https://github.com/wandersoncferreira/cljr-ivy"))])
- (cljsbuild-mode . [(20160402 1700) nil "A minor mode for the ClojureScript 'lein cljsbuild' command" single ((:commit . "fa2315660cb3ce944b5e16c679dcf5afd6a97f4c") (:keywords "clojure" "clojurescript" "leiningen" "compilation") (:url . "http://github.com/kototama/cljsbuild-mode"))])
- (clmemo . [(20160326 1623) nil "Change Log MEMO" tar ((:commit . "846a81b984d71edf8278a4d9f9b886e44d5b8365") (:keywords "convenience") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:url . "https://github.com/ataka/clmemo"))])
- (cloc . [(20170728 1824) ((cl-lib (0 5))) "count lines of code over emacs buffers" single ((:commit . "f30f0472e465cc8d433d2473e9d3b8dfe2c94491") (:keywords "cloc" "count" "source" "code" "lines") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com") (:url . "https://github.com/cosmicexplorer/cloc-emacs"))])
- (clocker . [(20190214 1833) ((projectile (0 11 0)) (dash (2 10)) (spaceline (2 0 1))) "Note taker and clock-in enforcer" single ((:commit . "c4d76968a49287ce3bac0832bb5d5d076054c96f") (:keywords "org") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))])
- (clojars . [(20180825 1951) ((request-deferred (0 2 0))) "clojars.org search interface" single ((:commit . "696c5b056e45067512a7d6dcce2515f3c639f61b") (:keywords "docs" "help" "tools") (:authors ("Joshua Miller" . "josh@joshmiller.io")) (:maintainer "Joshua Miller" . "josh@joshmiller.io") (:url . "https://github.com/joshuamiller/clojars.el"))])
- (clojure-essential-ref . [(20200619 1653) ((emacs (24)) (cider (0 24 0))) "Cider-doc to \"Clojure, The Essential Reference\"" single ((:commit . "e05d61b96f6469a93f52015b7ad5deadf616139e") (:url . "https://github.com/p3r7/clojure-essential-ref"))])
- (clojure-essential-ref-nov . [(20200719 608) ((emacs (24)) (dash (2 16 0)) (nov (0 3 1)) (clojure-essential-ref (0 1 0))) "Cider-doc to \"Clojure, The Essential Reference\" (EPUB)" single ((:commit . "e05d61b96f6469a93f52015b7ad5deadf616139e") (:url . "https://github.com/p3r7/clojure-essential-ref"))])
- (clojure-mode . [(20200419 559) ((emacs (25 1))) "Major mode for Clojure code" single ((:commit . "da9f1ec717dac1194404b4a4562dba6bd9a4ee3a") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "http://github.com/clojure-emacs/clojure-mode"))])
- (clojure-mode-extra-font-locking . [(20200320 823) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" single ((:commit . "da9f1ec717dac1194404b4a4562dba6bd9a4ee3a") (:keywords "languages" "lisp") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://github.com/clojure-emacs/clojure-mode"))])
- (clojure-quick-repls . [(20150814 736) ((cider (0 8 1)) (dash (2 9 0))) "Quickly create Clojure and ClojureScript repls for a project." single ((:commit . "730311dd3ac4e0aceb0204f818b422017873467f") (:keywords "languages" "clojure" "cider" "clojurescript") (:url . "https://github.com/symfrog/clojure-quick-repls"))])
- (clojure-snippets . [(20180314 1308) ((yasnippet (0 10 0))) "Yasnippets for clojure" tar ((:commit . "6068dca90467a0f4ebc2cd39338a173d6f5ddc04"))])
- (clomacs . [(20200722 2355) ((emacs (24 3)) (cider (0 22 1)) (s (1 12 0)) (simple-httpd (1 4 6))) "Simplifies Emacs Lisp interaction with Clojure." single ((:commit . "b48537c75d01209ae78264a667ea3d366b634fec") (:keywords "clojure" "interaction") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:url . "https://github.com/clojure-emacs/clomacs"))])
- (closql . [(20200704 2124) ((emacs (25 1)) (emacsql-sqlite (3 0 0))) "store EIEIO objects using EmacSQL" single ((:commit . "c864c1fadfea4a05fff29cb60891b7a32ac88c78") (:keywords "extensions") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/closql"))])
- (closure-lint-mode . [(20101118 2124) nil "minor mode for the Closure Linter" single ((:commit . "bc3d2fd5c35580bf1b8af43b12484c95a343b4b5") (:keywords "tools" "closure" "javascript" "lint" "flymake") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:url . "https://github.com/r0man/closure-lint-mode"))])
- (cloud-theme . [(20200221 2201) ((emacs (24))) "A light colored theme" single ((:commit . "bdac53baf1c38f83a16091db515047f7d42dac14") (:keywords "color" "theme") (:authors ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainer "Valerii Lysenko" . "vallyscode@gmail.com") (:url . "https://github.com/vallyscode/cloud-theme"))])
- (cloud-to-butt-erc . [(20130627 2308) nil "Replace 'the cloud' with 'my butt'" single ((:commit . "6710c03d1bc91736435cbfe845924940cae34e5c") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/cloud-to-butt-erc"))])
- (clues-theme . [(20161213 1127) ((emacs (24 0))) "an Emacs 24 theme which may well be fully awesome..." single ((:commit . "abd61f2b7f3e98de58ca26e6d1230e70c6406cc7") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/emacsfodder/emacs-clues-theme"))])
- (cm-mode . [(20170203 2107) ((cl-lib (0 5))) "Minor mode for CriticMarkup" single ((:commit . "276d49c859822265070ae5dfbb403fd7d8d06436") (:keywords "text" "markdown") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))])
- (cmake-font-lock . [(20200103 1702) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" single ((:commit . "9e0fcd1ee2cf316f661f2d652368b12f83a4ec9c") (:keywords "faces" "languages") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/cmake-font-lock"))])
- (cmake-ide . [(20200515 951) ((emacs (24 4)) (cl-lib (0 5)) (seq (1 11)) (levenshtein (0)) (s (1 11 0))) "Calls CMake to find out include paths and other compiler flags" single ((:commit . "a8f9e83848b513f810170988679a9ef455025975") (:keywords "languages") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:url . "http://github.com/atilaneves/cmake-ide"))])
- (cmake-mode . [(20190710 1319) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "383090bf591e82d5488bd3454ca4c40ceaf575df"))])
- (cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" single ((:commit . "a7cf9e4c01c4683e14b6942cc5cc5e8cddc98721") (:keywords "c" "cmake" "languages" "tools") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail") (:url . "http://github.com/alamaison/emacs-cmake-project"))])
- (cmd-to-echo . [(20161203 2133) ((emacs (24 4)) (s (1 11 0)) (shell-split-string (20151224 208))) "Show the output of long-running commands in the echo area" single ((:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))])
- (cmm-mode . [(20150225 746) nil "Major mode for C-- source code" single ((:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee"))])
- (cnfonts . [(20200531 1323) ((emacs (24))) "A simple Chinese fonts config tool" tar ((:commit . "db68a86bcf1540a5bee086d5d19d2dddfb594f9a") (:keywords "convenience" "chinese" "font") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/cnfonts"))])
- (cobalt . [(20180304 1155) ((emacs (24))) "Easily use the Cobalt.rs static site generator" single ((:commit . "634ace275697e188746ca22a30ff94380ec756be") (:keywords "convenience") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com") (:url . "https://github.com/cobalt-org/cobalt.el"))])
- (cobra-mode . [(20140116 2116) nil "Major mode for .NET-based Cobra language" single ((:commit . "acd6e53f6286af5176471d01f25257e5ddb6dd01") (:keywords "languages") (:authors ("Taylor \"Nekroze\" Lawson")) (:maintainer "Taylor \"Nekroze\" Lawson") (:url . "http://github.com/Nekroze/cobra-mode"))])
- (codcut . [(20190915 1009) nil "Share pieces of code to Codcut" single ((:commit . "7ca7db69e8c38ec45eb572ad16ab2b56086f2131") (:keywords "comm" "tools" "codcut" "share") (:authors ("Diego Pasquali" . "hello@dgopsq.space")) (:maintainer "Diego Pasquali" . "hello@dgopsq.space") (:url . "https://github.com/codcut/codcut-emacs"))])
- (code-archive . [(20190612 308) ((emacs (24 3))) "git supported code archive and reference for org-mode" single ((:commit . "1ad9af6679d0294c3056eab9cad673f29c562721") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:url . "https://github.com/mschuldt/code-archive"))])
- (code-library . [(20160426 1218) ((gist (1 3 1))) "use org-mode to collect code snippets" single ((:commit . "32d59c5c845d6dbdda18f9bd1c03a58d55417fc5") (:keywords "lisp" "code") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (code-stats . [(20200216 2020) ((emacs (25)) (request (0 3 0))) "Code::Stats plugin" single ((:commit . "0d5be395d4233ea533e6eddf50af725c51304205") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/code-stats-emacs"))])
- (codebug . [(20140929 2137) nil "Interact with codebug" single ((:commit . "ac0e4331ba94ccb5203fa492570e1ca6b90c3d52") (:authors ("Shane Dowling")) (:maintainer "Shane Dowling") (:url . "http://www.shanedowling.com/"))])
- (codesearch . [(20181006 1431) ((log4e (0 3 1))) "Core support for managing codesearch tools" tar ((:commit . "f6eb96f034a925444412cfa03e45e0ccbbafe3f2") (:keywords "tools" "development" "search") (:authors ("Austin Bingham" . "austin.bingham@gmail.com") ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-codesearch"))])
- (codic . [(20150926 1127) ((emacs (24)) (cl-lib (0 5))) "Search Codic (codic.jp) naming dictionaries" tar ((:commit . "52bbb6997ef4ab9fb7fea43bbfff7f04671aa557") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-codic"))])
- (coffee-fof . [(20131012 1230) ((coffee-mode (0 4 1))) "A coffee-mode configuration for `ff-find-other-file'." single ((:commit . "211529594bc074721c6cbc4edb73a63cc05f89ac") (:keywords "coffee-mode") (:authors ("Yasuyki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyki Oka" . "yasuyk@gmail.com") (:url . "http://github.com/yasuyk/coffee-fof"))])
- (coffee-mode . [(20200315 1133) ((emacs (24 3))) "Major mode for CoffeeScript code" single ((:commit . "35a41c7d8233eac0b267d9593e67fb8b6235e134") (:keywords "coffeescript" "major" "mode") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org") (:url . "http://github.com/defunkt/coffee-mode"))])
- (coin-ticker . [(20170611 727) ((request (0 3 0)) (emacs (25))) "Show a cryptocurrency price ticker" single ((:commit . "9efab90fe4e6f29464af14e0d8fd1e20c0147b80") (:keywords "news") (:authors ("Evan Klitzke" . "evan@eklitzke.org")) (:maintainer "Evan Klitzke" . "evan@eklitzke.org") (:url . "https://github.com/eklitzke/coin-ticker-mode"))])
- (colemak-evil . [(20200326 2359) ((evil (20170323 1140))) "Colemak-friendly keybindings for Evil." single ((:commit . "981bdcb1a48c6d9139493abe7e25fabe126e43c3") (:authors ("Patrick Brinich-Langlois" . "pbrinichlanglois@gmail.com")) (:maintainer "Patrick Brinich-Langlois" . "pbrinichlanglois@gmail.com") (:url . "https://github.com/patbl/colemak-evil"))])
- (colonoscopy-theme . [(20170808 1309) ((emacs (24 0))) "an Emacs 24 theme based on Colonoscopy (tmTheme)" single ((:commit . "64bbb322b13dae91ce9f1e3581f836f94f800ead") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (color-identifiers-mode . [(20200705 2145) ((dash (2 5 0)) (emacs (24))) "Color identifiers based on their names" single ((:commit . "b399121b380a01054dd9cb3f4de310ad6c005156") (:keywords "faces" "languages") (:authors ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainer "Ankur Dave" . "ankurdave@gmail.com") (:url . "https://github.com/ankurdave/color-identifiers-mode"))])
- (color-moccur . [(20141223 35) nil "multi-buffer occur (grep) mode" single ((:commit . "4f1c59ffd1ccc2ab1a171cd6b721e8cb9e002fb7") (:keywords "convenience") (:url . "http://www.bookshelf.jp/elc/color-moccur.el"))])
- (color-theme . [(20190220 1115) nil "An OBSOLETE color-theme implementation" tar ((:commit . "3a2f6b615f5e2401e30d93a3e0adc210bbb4b7aa") (:keywords "faces") (:authors ("Jonadab the Unsightly One" . "jonadab@bright.net")) (:maintainer "Xavier Maillard" . "zedek@gnu.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki.pl?ColorTheme"))])
- (color-theme-approximate . [(20140228 436) nil "Makes Emacs theme works on terminal transparently" single ((:commit . "f54301ca39bc5d2ffb000f233f8114184a3e7d71") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com"))])
- (color-theme-buffer-local . [(20170126 601) ((color-theme (0))) "Install color-themes by buffer." single ((:commit . "e606dec66f16a06140b9aad625a4fd52bca4f936") (:keywords "faces") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com") (:url . "http://github.com/vic/color-theme-buffer-local"))])
- (color-theme-modern . [(20200729 921) ((emacs (24))) "Reimplement colortheme with Emacs 24 theme framework." tar ((:commit . "a996eca37f4df726eec95406deb76b538320771a") (:url . "https://github.com/emacs-jp/replace-colorthemes/"))])
- (color-theme-sanityinc-solarized . [(20200304 2156) ((emacs (24 1)) (cl-lib (0 6))) "A version of Ethan Schoonover's Solarized themes" tar ((:commit . "c688337aaae9f47128a841479e4191858ac147f6") (:keywords "faces" "themes") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "http://github.com/purcell/color-theme-sanityinc-solarized"))])
- (color-theme-sanityinc-tomorrow . [(20200522 227) nil "A version of Chris Kempson's \"tomorrow\" themes" tar ((:commit . "364ca25dc7f8e7980b09589381520e7dd905bc5e") (:keywords "faces" "themes") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "http://github.com/purcell/color-theme-sanityinc-tomorrow"))])
- (color-theme-x . [(20180227 46) ((cl-lib (0 5))) "convert color themes to X11 resource settings" single ((:commit . "6c2264aa6c5d9a72caeae67ebaa4472090e70350") (:keywords "convenience" "faces" "frames") (:authors ("Matthew Kennedy" . "mkennedy@killr.ath.cx")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com") (:url . "https://github.com/ajsquared/color-theme-x"))])
- (colorless-themes . [(20200724 1406) ((emacs (24 1))) "A macro to generate mostly colorless themes" single ((:commit . "5df88f835527bb7c86fd18515af6fc18d661e386") (:keywords "faces themes" "faces") (:authors ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainer "Thomas Letan" . "contact@thomasletan.fr") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))])
- (colormaps . [(20171008 2224) ((emacs (25))) "Hex colormaps" single ((:commit . "19fbb64a6288d505b9cf45c9b5a3eed0bfb135e2") (:keywords "tools") (:authors ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainer "Abhinav Tushar" . "lepisma@fastmail.com") (:url . "https://github.com/lepisma/colormaps.el"))])
- (column-enforce-mode . [(20200605 1933) nil "Highlight text that extends beyond a column" single ((:commit . "14a7622f2268890e33536ccd29510024d51ee96f") (:authors ("Jordon Biondo")) (:maintainer "Jordon Biondo") (:url . "www.github.com/jordonbiondo/column-enforce-mode"))])
- (com-css-sort . [(20200717 338) ((emacs (25 1)) (s (1 12 0))) "Common way of sorting the CSS attributes" single ((:commit . "e12f77ad3a17a0d599ca802497086cd9155d451b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/com-css-sort"))])
- (comb . [(20200411 1040) ((emacs (25 1))) "Interactive code auditing and grep tool" tar ((:commit . "59e025c3afb867706b869ac4bf2623665eb99821") (:keywords "matching") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com") (:url . "https://github.com/cyrus-and/comb"))])
- (comby . [(20200629 140) ((emacs (25 1))) "Emacs comby integration" single ((:commit . "928b8b8959a2556aba5526f2a25801341eb59dc3") (:keywords "languages") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:url . "https://github.com/s-kostyaev/comby.el"))])
- (comint-hyperlink . [(20191104 2224) ((emacs (24 3))) "Create hyperlinks in comint for SGR URL control sequences" single ((:commit . "a7878825788ff6b9d6b8a5adf0214a028bad895e") (:keywords "comint" "shell" "processes" "hypermedia" "terminals") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:url . "https://github.com/matthewbauer/comint-hyperlink"))])
- (comint-intercept . [(20200106 454) ((emacs (24 3))) "Intercept input in comint-mode" single ((:commit . "3c9a6125e450435b79ab5e6466f830e57c5e0a30") (:keywords "processes" "terminals") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:url . "https://github.com/hying-caritas/comint-intercept"))])
- (command-log-mode . [(20160413 447) nil "log keyboard commands to buffer" single ((:commit . "af600e6b4129c8115f464af576505ea8e789db27") (:keywords "help") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org") (:url . "https://github.com/lewang/command-log-mode"))])
- (command-queue . [(20160328 1725) ((emacs (24 3))) "shell command queue" single ((:commit . "f327c6f852592229a755ec6de0c62c6aeafd6659") (:authors ("Yuki INOUE <inouetakahiroki at gmail.com>")) (:maintainer "Yuki INOUE <inouetakahiroki at gmail.com>") (:url . "https://github.com/Yuki-Inoue/command-queue"))])
- (commander . [(20140120 1852) ((s (1 6 0)) (dash (2 0 0)) (cl-lib (0 3)) (f (0 6 1))) "Emacs command line parser" single ((:commit . "c93985dc318fe89e5a29abc21d19fb41e2fd14d2") (:keywords "cli" "argv") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/commander.el"))])
- (comment-dwim-2 . [(20190105 1653) nil "An all-in-one comment command to rule them all" single ((:commit . "3dfdd58495c46a37708344a57c5c52beca6b2c1c") (:keywords "convenience") (:authors ("Rémy Ferré" . "dev@remyferre.net")) (:maintainer "Rémy Ferré" . "dev@remyferre.net") (:url . "https://github.com/remyferre/comment-dwim-2"))])
- (comment-or-uncomment-sexp . [(20190225 1122) ((emacs (24))) "Command for commenting the sexp under point." single ((:commit . "bec730d3fc1e6c17ff1339eb134af16c034a4d95") (:keywords "convenience") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com") (:url . "https://github.com/Malabarba/comment-or-uncomment-sexp"))])
- (comment-tags . [(20170910 1735) ((emacs (24 5))) "Highlight & navigate comment tags like 'TODO'." single ((:commit . "7d914097f0a03484af71e621db533737fc692f58") (:keywords "convenience" "comments" "tags") (:authors ("Vincent Dumas" . "vincekd@gmail.com")) (:maintainer "Vincent Dumas" . "vincekd@gmail.com") (:url . "https://github.com/vincekd/comment-tags"))])
- (commentary-theme . [(20181213 1045) ((emacs (24))) "A minimal theme with contrasting comments" single ((:commit . "dede0f8ecb72156fa6ae81198ea570ead02997ff") (:url . "https://github.com/pzel/commentary-theme"))])
- (commenter . [(20160219 1627) ((emacs (24 4)) (let-alist (1 0 4))) "multiline-comment support package" single ((:commit . "6d1885419434ba779270c6fda0e30d390bb074bd") (:keywords "comment") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/commenter"))])
- (commify . [(20161106 2334) ((s (1 9 0))) "Toggle grouping commas in numbers" single ((:commit . "78732c2fa6c1a10288b7436d7c561ec9ebdd41be") (:keywords "convenience" "editing" "numbers" "grouping" "commas") (:authors ("Daniel E. Doherty" . "ded-commify@ddoherty.net")) (:maintainer "Daniel E. Doherty" . "ded-commify@ddoherty.net") (:url . "https://github.com/ddoherty03/commify"))])
- (common-lisp-snippets . [(20180226 1523) ((yasnippet (0 8 0))) "Yasnippets for Common Lisp" tar ((:commit . "c82ebf18f4ad49f390dd96ffcc59f8683c1a868b") (:keywords "snippets") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/common-lisp-snippets"))])
- (company . [(20200725 2348) ((emacs (24 3))) "Modular text completion framework" tar ((:commit . "656ad10670512e135a0a5881f127bb7a789ef8ca") (:keywords "abbrev" "convenience" "matching") (:authors ("Nikolaj Schumacher")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:url . "http://company-mode.github.io/"))])
- (company-anaconda . [(20200404 1859) ((company (0 8 0)) (anaconda-mode (0 1 1)) (cl-lib (0 5 0)) (dash (2 6 0)) (s (1 9))) "Anaconda backend for company-mode" single ((:commit . "da1566db41a68809ef7f91ebf2de28118067c89b") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/anaconda-mode"))])
- (company-ansible . [(20200306 1441) ((emacs (24 4)) (company (0 8 12))) "A company back-end for ansible" tar ((:commit . "79dd421b161efa49fbdffad57fa40edb41f484a3") (:keywords "ansible") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:url . "https://github.com/krzysztof-magosa/company-ansible"))])
- (company-arduino . [(20160306 1739) ((emacs (24 1)) (company (0 8 0)) (irony (0 1 0)) (cl-lib (0 5)) (company-irony (0 1 0)) (company-c-headers (20140930)) (arduino-mode (1 0))) "company-mode for Arduino" single ((:commit . "d7e369702b8eee63e6dfdeba645ce28b6dc66fb1") (:keywords "convenience" "development" "company") (:authors ("Yuta Yamada" . "sleepboy.zzz@gmail.com")) (:maintainer "Yuta Yamada" . "sleepboy.zzz@gmail.com") (:url . "https://github.com/yuutayamada/company-arduino"))])
- (company-auctex . [(20200529 1835) ((yasnippet (0 8 0)) (company (0 8 0)) (auctex (11 87))) "Company-mode auto-completion for AUCTeX" single ((:commit . "9400a2ec7459dde8cbf1a5d50dfee4e300ed7e18") (:authors ("Christopher Monsanto <chris@monsan.to>, Alexey Romanov" . "alexey.v.romanov@gmail.com")) (:maintainer "Christopher Monsanto <chris@monsan.to>, Alexey Romanov" . "alexey.v.romanov@gmail.com") (:url . "https://github.com/alexeyr/company-auctex/"))])
- (company-axiom . [(20191027 1928) ((emacs (24)) (company (0 9)) (axiom-environment (20171021))) "A company-mode backend for the axiom-environment system" single ((:commit . "25932da0dc40c6877463cbf019b14ab05a6b0164") (:keywords "axiom" "openaxiom" "fricas" "axiom-environment") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org"))])
- (company-bibtex . [(20171105 644) ((company (0 9 0)) (cl-lib (0 5)) (parsebib (1 0))) "Company completion for bibtex keys" single ((:commit . "da67faf3a6faba8e7f1b222dedfc5521b02c7655") (:keywords "company-mode" "bibtex") (:authors ("GB Gardner" . "gbgar@users.noreply.github.com")) (:maintainer "GB Gardner" . "gbgar@users.noreply.github.com") (:url . "https://github.com/gbgar/company-bibtex"))])
- (company-box . [(20200511 401) ((emacs (26 0 91)) (dash (2 13)) (dash-functional (1 2 0)) (company (0 9 6))) "Company front-end with icons" tar ((:commit . "452f083f6c11793a3723224bce42898a2bedc0e1") (:keywords "company" "completion" "front-end" "convenience") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:url . "https://github.com/sebastiencs/company-box"))])
- (company-c-headers . [(20190825 1631) ((emacs (24 1)) (company (0 8))) "Company mode backend for C/C++ header files" single ((:commit . "5e676ab0c2f287c868b1e3931afd4c78895910cd") (:keywords "development" "company") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net"))])
- (company-cabal . [(20170917 1317) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24))) "company-mode cabal backend" tar ((:commit . "62112a7259e24bd6c08885629a185afe512b7d3d") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-cabal"))])
- (company-coq . [(20200729 401) ((cl-lib (0 5)) (dash (2 12 1)) (yasnippet (0 11 0)) (company (0 8 12)) (company-math (1 1))) "A collection of extensions for Proof General's Coq mode" tar ((:commit . "b096cb528de1e0bb31cc1059d0bd698b98a6cc6a") (:url . "https://github.com/cpitclaudel/company-coq") (:keywords "convenience" "languages") (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")))])
- (company-ctags . [(20200603 438) ((emacs (24 4)) (company (0 9 0))) "Fastest company-mode completion backend for ctags" single ((:commit . "ba4d2577fbbe5ad7bb978838e3e3177f8a56e8f8") (:keywords "convenience") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "https://github.com/redguardtoo/company-ctags"))])
- (company-dcd . [(20190116 256) ((company (0 9)) (flycheck-dmd-dub (0 7)) (yasnippet (0 8)) (popwin (0 7)) (cl-lib (0 5)) (ivy (20160804 326))) "Company backend for Dlang using DCD." single ((:commit . "11e90949e546fcff1b1cd40887ad7b6701aa1653") (:keywords "languages") (:authors ("tsukimizake <shomasd_at_gmail.com>")) (:maintainer "tsukimizake <shomasd_at_gmail.com>") (:url . "http://github.com/tsukimizake/company-dcd"))])
- (company-dict . [(20190302 5) ((emacs (24 4)) (company (0 8 12)) (parent-mode (2 3))) "A backend that emulates ac-source-dictionary" single ((:commit . "cd7b8394f6014c57897f65d335d6b2bd65dab1f4") (:keywords "company" "dictionary" "ac-source-dictionary") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-company-dict"))])
- (company-distel . [(20180827 1344) ((distel-completion-lib (1 0 0))) "Erlang/distel completion backend for company-mode" single ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:keywords "erlang" "distel" "company") (:authors ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:url . "github.com/sebastiw/distel-completion"))])
- (company-emacs-eclim . [(20180911 1121) ((eclim (0 3)) (company (0 7)) (cl-lib (0 5))) "Eclim company backend" single ((:commit . "222ddd48fcf0ee01592dec77c58e0cf3f2ea1100"))])
- (company-emoji . [(20200612 1902) ((cl-lib (0 5)) (company (0 8 0))) "company-mode backend for emoji" tar ((:commit . "5f2d10623c1e9f547d852cb13c7a391afbda09fb") (:keywords "emoji" "company") (:authors ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainer "Alex Dunn" . "dunn.alex@gmail.com") (:url . "https://github.com/dunn/company-emoji.git"))])
- (company-erlang . [(20170123 538) ((emacs (24 4)) (ivy-erlang-complete (0 1)) (company (0 9 2))) "company backend based on ivy-erlang-complete" single ((:commit . "bc0524a16f17b66c7397690e4ca0e004f09ea6c5") (:keywords "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))])
- (company-flow . [(20180225 2159) ((company (0 8 0)) (dash (2 13 0))) "Flow backend for company-mode" single ((:commit . "76ef585c70d2a3206c2eadf24ba61e59124c3a16") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/company-flow"))])
- (company-flx . [(20180103 518) ((emacs (24)) (company (0 8 12)) (flx (0 5))) "flx based fuzzy matching for company" single ((:commit . "16ca0d2f84e8e768bf2db8c5cfe421230a00bded") (:keywords "convenience" "company" "fuzzy" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/PythonNut/company-flx"))])
- (company-fuzzy . [(20200712 49) ((emacs (24 4)) (company (0 8 12)) (s (1 12 0))) "Fuzzy matching for `company-mode'" single ((:commit . "af017d00f4576fddee1d386f41c9ccebd7038d9a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/company-fuzzy"))])
- (company-ghc . [(20170918 833) ((cl-lib (0 5)) (company (0 8 0)) (ghc (5 4 0 0)) (emacs (24))) "company-mode ghc-mod backend" single ((:commit . "8b264b5c3c0e42c0d0c4e9315559896c9b0edfdc") (:keywords "haskell" "completion") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-ghc"))])
- (company-ghci . [(20190707 311) ((company (0 8 11)) (haskell-mode (13))) "company backend which uses the current ghci process." single ((:commit . "a1d25652583ab4666c5a78cac18cd8039776b50d") (:authors ("Hector Orellana" . "hofm92@gmail.com")) (:maintainer "Hector Orellana" . "hofm92@gmail.com"))])
- (company-glsl . [(20171015 1749) ((company (0 9 4)) (glsl-mode (2 0)) (emacs (24 4))) "Support glsl in company-mode" single ((:commit . "a262c12c3bcd0807718c4edcaf2b054e30ef0e26") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:url . "https://github.com/guidoschmidt/company-glsl"))])
- (company-go . [(20190203 19) ((company (0 8 0)) (go-mode (1 0 0))) "company-mode backend for Go (using gocode)" single ((:commit . "4acdcbdea79de6b3dee1c637eca5cbea0fdbe37c") (:keywords "languages") (:authors ("nsf" . "no.smile.face@gmail.com")) (:maintainer "nsf" . "no.smile.face@gmail.com"))])
- (company-inf-ruby . [(20140805 2054) ((company (0 6 10)) (inf-ruby (2 2 7)) (emacs (24 1))) "company-mode completion back-end for inf-ruby" single ((:commit . "fe3e4863bc971fbb81edad447efad5795ead1b17") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:url . "https://github.com/company-mode/company-inf-ruby"))])
- (company-irony . [(20190124 2346) ((emacs (24 1)) (company (0 8 0)) (irony (1 1 0)) (cl-lib (0 5))) "company-mode completion back-end for irony-mode" single ((:commit . "b44711dfce445610c1ffaec4951c6ff3882b216a") (:keywords "convenience") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:url . "https://github.com/Sarcasm/company-irony/"))])
- (company-irony-c-headers . [(20151018 909) ((cl-lib (0 5)) (company (0 9 0)) (irony (0 2 0))) "Company mode backend for C/C++ header files with Irony" single ((:commit . "72c386aeb079fb261d9ec02e39211272f76bbd97") (:keywords "c" "company") (:authors ("Yutian Li" . "hotpxless@gmail.com")) (:maintainer "Yutian Li" . "hotpxless@gmail.com") (:url . "https://github.com/hotpxl/company-irony-c-headers"))])
- (company-jedi . [(20200324 25) ((emacs (24)) (cl-lib (0 5)) (company (0 8 11)) (jedi-core (0 2 7))) "Company-mode completion back-end for Python JEDI" single ((:commit . "5232fbc1fdbfc81b1dd883afb720338c3e39556b") (:authors ("Boy" . "boyw165@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/company-jedi"))])
- (company-lean . [(20171102 1454) ((emacs (24 3)) (dash (2 12 0)) (dash-functional (1 2 0)) (s (1 10 0)) (f (0 19 0)) (company (0 9 3)) (lean-mode (3 3 0))) "A company backend for lean-mode" single ((:commit . "6b4377686128d5c2fb55d8fe61b92a9991d40fbd") (:keywords "languages") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:url . "https://github.com/leanprover/lean-mode"))])
- (company-ledger . [(20200726 1825) ((emacs (24 3)) (company (0 8 0))) "Fuzzy auto-completion for Ledger & friends" single ((:commit . "9fe9e3b809d6d2bc13c601953f696f43b09ea296") (:keywords "abbrev" "matching" "auto-complete" "beancount" "ledger" "company") (:authors ("Debanjum Singh Solanky <debanjum AT gmail DOT com>")) (:maintainer "Debanjum Singh Solanky <debanjum AT gmail DOT com>") (:url . "https://github.com/debanjum/company-ledger"))])
- (company-lsp . [(20190612 1553) ((emacs (25 1)) (lsp-mode (6 0)) (company (0 9 0)) (s (1 2 0)) (dash (2 11 0))) "Company completion backend for lsp-mode." single ((:commit . "f921ffa0cdc542c21dc3dd85f2c93df4288e83bd") (:url . "https://github.com/tigersoldier/company-lsp"))])
- (company-lua . [(20171108 2306) ((company (0 8 12)) (s (1 10 0)) (f (0 17 0)) (lua-mode (20151025))) "Company backend for Lua" tar ((:commit . "29f6819de4d691e5fd0b62893a9f4fbc1c6fcb52") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))])
- (company-manually . [(20200709 913) ((emacs (24 3)) (company (0 9 0)) (ivy (0 13 0))) "A company backend that lets you manually build candidates" single ((:commit . "b922318da821fc3cf1d3155f21d543ea8470c881") (:keywords "convenience" "company-mode" "manually build candidates") (:authors ("Yanghao Xie")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:url . "https://github.com/yanghaoxie/company-manually"))])
- (company-math . [(20200131 2337) ((company (0 8 0)) (math-symbol-lists (1 3))) "Completion backends for unicode math symbols and latex tags" single ((:commit . "a796053590012e6a15c8b527b521ffc15d137bd0") (:keywords "unicode" "symbols" "completion") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:url . "https://github.com/vspinu/company-math"))])
- (company-nand2tetris . [(20171201 1813) ((nand2tetris (1 1 0)) (company (0 5)) (cl-lib (0 5 0))) "Company backend for nand2tetris major mode" single ((:commit . "33acee34d24b1c6a87db833b7d23449cf858f64f") (:keywords "nand2tetris" "hdl" "company") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "http://www.github.com/CestDiego/nand2tetris.el/"))])
- (company-native-complete . [(20200315 2144) ((emacs (25 1)) (company (0 9 0)) (native-complete (0 1 0))) "Company completion using native-complete" single ((:commit . "0f290514564d3733b35e4b48d70446c1a6eb4b41") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete"))])
- (company-nginx . [(20180604 2) ((emacs (24))) "company-mode keywords support for nginx-mode" single ((:commit . "3074a5d322562f36867ef67bffeb25f1c0d8aca9") (:keywords "company" "nginx") (:url . "https://github.com/stardiviner/company-nginx"))])
- (company-ngram . [(20170129 1913) ((cl-lib (0 5)) (company (0 8 0))) "N-gram based completion" tar ((:commit . "09a68b802e64799e95f205b438d469bbd78cd2e6") (:authors ("kshramt")) (:maintainer "kshramt") (:url . "https://github.com/kshramt/company-ngram"))])
- (company-nixos-options . [(20160215 857) ((company (0 8 0)) (nixos-options (0 0 1)) (cl-lib (0 5 0))) "Company Backend for nixos-options" single ((:commit . "977b9a505ffc8b33b70ec7742f90e469b3168297") (:keywords "unix") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))])
- (company-org-roam . [(20200711 355) ((emacs (26 1)) (company (0 9 0)) (dash (2 13)) (org-roam (1 0 0))) "Company backend for Org-roam" single ((:commit . "5d7ccd944519ae1d03f5e17ddfe33dcd8a0cc71e") (:keywords "org-mode" "roam" "convenience") (:authors ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Jethro Kuan" . "jethrokuan95@gmail.com") (:url . "https://github.com/jethrokuan/company-org-roam"))])
- (company-php . [(20190424 222) ((cl-lib (0 5)) (ac-php-core (2 0)) (company (0 9))) "A company back-end for PHP." single ((:commit . "8db6d911f2e19bbef5fe915e42c4e12f283bfd41") (:keywords "completion" "convenience" "intellisense") (:authors ("jim" . "xcwenn@qq.com")) (:maintainer "jim") (:url . "https://github.com/xcwen/ac-php"))])
- (company-phpactor . [(20200121 1218) ((emacs (24 3)) (company (0 9 6)) (phpactor (0 1 0))) "company-mode backend for Phpactor" single ((:commit . "62d2372ea55c0c5fb4e77076988472ebb5d85f24") (:keywords "tools" "php") (:authors ("Martin Tang" . "martin.tang365@gmail.com") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainer "Martin Tang" . "martin.tang365@gmail.com") (:url . "https://github.com/emacs-php/phpactor.el"))])
- (company-plisp . [(20200531 1927) ((emacs (25)) (s (1 2 0)) (company (0 8 12)) (dash (2 12 0)) (cl-lib (0 5))) "Company mode backend for PicoLisp language" tar ((:commit . "fc0b56d2a711340ca3e63119bfe692bb3e8620fb") (:keywords "company" "plisp" "convenience" "auto-completion") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:url . "https://gitlab.com/sasanidas/company-plisp"))])
- (company-plsense . [(20180118 58) ((company (0 9 3)) (cl-lib (0 5 0)) (dash (2 12 0)) (s (1 12)) (emacs (24))) "Company backend for Perl" single ((:commit . "b48e3181e08ec597269621d621aa06636f02d883") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/company-plsense"))])
- (company-pollen . [(20160812 1510) ((company (0 9 0)) (pollen-mode (1 0))) "company-mode completion backend for pollen" single ((:commit . "d0a33591498013886c2c4676e204cd684954e82a") (:keywords "languages" "pollen" "pollenpub" "company") (:authors ("Junsong Li <ljs.darkfish AT GMAIL>")) (:maintainer "Junsong Li") (:url . "https://github.com/lijunsong/pollen-mode"))])
- (company-posframe . [(20200609 514) ((emacs (26 0)) (company (0 9 0)) (posframe (0 1 0))) "Use a posframe as company candidate menu" single ((:commit . "3e183c3814e77b5f7c07f5b3749af02eac466434") (:keywords "abbrev" "convenience" "matching") (:authors ("Clément Pit-Claudel, Feng Shu, Lars Andersen" . "expez@expez.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/company-posframe"))])
- (company-prescient . [(20200716 1414) ((emacs (25 1)) (prescient (5 0)) (company (0 9 6))) "prescient.el + Company" single ((:commit . "b11d79b10df12c58edc3487371c2c47dfb9b50e6") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/prescient.el"))])
- (company-qml . [(20170428 1708) ((qml-mode (0 1)) (company (0 8 12))) "Company backend for QML files" tar ((:commit . "4af4f32a7ad86d86bb9293fb0b675aec513b5736") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (company-quickhelp . [(20200714 1611) ((emacs (24 3)) (company (0 8 9)) (pos-tip (0 4 6))) "Popup documentation for completion candidates" single ((:commit . "5a86731de461142db3b7ca26b4681756edb4b773") (:keywords "company" "popup" "documentation" "quickhelp") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:url . "https://www.github.com/expez/company-quickhelp"))])
- (company-quickhelp-terminal . [(20200627 908) ((emacs (24 4)) (company-quickhelp (2 2 0)) (popup (0 5 3))) "Terminal support for `company-quickhelp'" single ((:commit . "e18b4cf309e2bbc63995ebc3c1230c8c865dd00e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/company-quickhelp-terminal"))])
- (company-racer . [(20171205 310) ((emacs (24 4)) (cl-lib (0 5)) (company (0 8 0)) (deferred (0 3 1))) "Company integration for racer" single ((:commit . "a00381c9d416f375f783fcb6ae8d40669ce1f567") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/company-racer"))])
- (company-reftex . [(20181222 906) ((emacs (25 1)) (s (1 12)) (company (0 8))) "Company backend based on RefTeX." single ((:commit . "275ef708f08d3bf0eb30632148e5c6184eeaacdb") (:keywords "bib" "tex" "company" "latex" "reftex" "references" "labels" "citations") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:url . "https://github.com/TheBB/company-reftex"))])
- (company-restclient . [(20190426 1312) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24)) (know-your-http-well (0 2 0)) (restclient (0 0 0))) "company-mode completion back-end for restclient-mode" single ((:commit . "e5a3ec54edb44776738c13e13e34c85b3085277b") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-restclient"))])
- (company-rtags . [(20191222 920) ((emacs (24 3)) (company (0 8 1)) (rtags (2 10))) "RTags back-end for company" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))])
- (company-shell . [(20170518 541) ((emacs (24 4)) (company (0 8 12)) (dash (2 12 0)) (cl-lib (0 5))) "Company mode backend for shell functions" single ((:commit . "52f3bf26b74adc30a275f5f4290a1fc72a6876ff") (:keywords "company" "shell" "auto-completion") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/company-shell"))])
- (company-solidity . [(20181117 1518) ((company (0 9 0)) (cl-lib (0 5 0)) (solidity-mode (0 1 9))) "Company-mode back-end for solidity-mode" single ((:commit . "d166a86b83907e0cfd64c191e9dfce4b44a9843e") (:keywords "solidity" "completion" "company") (:authors ("Samuel Smolkin" . "sam@future-precedent.org")) (:maintainer "Samuel Smolkin" . "sam@future-precedent.org") (:url . "https://github.com/ethereum/emacs-solidity"))])
- (company-sourcekit . [(20170126 1153) ((emacs (24 3)) (company (0 8 12)) (dash (2 12 1)) (dash-functional (1 2 0)) (sourcekit (0 2 0))) "company-mode completion backend for SourceKit" single ((:commit . "abf9bc5a0102eb666d3aa6d6bf22f6efcc852781") (:keywords "abbrev") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:url . "https://github.com/nathankot/company-sourcekit"))])
- (company-stan . [(20200221 2025) ((emacs (24 3)) (company (0 9 10)) (stan-mode (10 1 0))) "A company-mode completion backend for stan" single ((:commit . "e891a0fcb3a7ab7d9cedbe3deda560134636897e") (:keywords "languages") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:url . "https://github.com/stan-dev/stan-mode/tree/master/company-stan"))])
- (company-statistics . [(20170210 1933) ((emacs (24 3)) (company (0 8 5))) "Sort candidates using completion history" single ((:commit . "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c") (:keywords "abbrev" "convenience" "matching") (:authors ("Ingo Lohmar" . "i.lohmar@gmail.com")) (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") (:url . "https://github.com/company-mode/company-statistics"))])
- (company-suggest . [(20180527 1631) ((company (0 9 0)) (emacs (25 1))) "Company-mode back-end for search engine suggests" single ((:commit . "e1fa663b48639c76d91d1f5ac3b23215aa3dabc3") (:keywords "completion" "convenience") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:url . "https://github.com/juergenhoetzel/company-suggest"))])
- (company-tabnine . [(20200327 2137) ((emacs (25)) (company (0 9 3)) (cl-lib (0 5)) (dash (2 16 0)) (s (1 12 0)) (unicode-escape (1 1))) "A company-mode backend for TabNine" single ((:commit . "e986a4ad0d0e0174b08f1fb94c4f804a98a344e4") (:keywords "convenience") (:authors ("Tommy Xiang" . "tommyx058@gmail.com")) (:maintainer "Tommy Xiang" . "tommyx058@gmail.com") (:url . "https://github.com/TommyX12/company-tabnine/"))])
- (company-terraform . [(20190607 1037) ((emacs (24 4)) (company (0 8 12)) (terraform-mode (0 6))) "A company backend for terraform" tar ((:commit . "2d11a21fee2f298e48968e479ddcaeda4d736e12") (:keywords "abbrev" "convenience" "terraform" "company") (:authors ("Rafał Cieślak" . "rafalcieslak256@gmail.com")) (:maintainer "Rafał Cieślak" . "rafalcieslak256@gmail.com") (:url . "https://github.com/rafalcieslak/emacs-company-terraform"))])
- (company-try-hard . [(20200417 1603) ((emacs (24 3)) (company (0 8 0)) (dash (2 0))) "get all completions from company backends" single ((:commit . "2b41136b5ed6e02032d99bcdb0599ecf00394fa5") (:keywords "matching") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/company-try-hard"))])
- (company-web . [(20180402 1155) ((company (0 8 0)) (dash (2 8 0)) (cl-lib (0 5 0)) (web-completion-data (0 1 0))) "Company version of ac-html, complete for web,html,emmet,jade,slim modes" tar ((:commit . "f0cc9187c9c34f72ad71f5649a69c74f996bae9a") (:keywords "html" "company") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:url . "https://github.com/osv/company-web"))])
- (company-ycm . [(20140904 1817) ((ycm (0 1))) "company-ycm" single ((:commit . "4da8a14abcd0f4fa3235042ade2e12b5068c0601") (:keywords "abbrev") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net"))])
- (company-ycmd . [(20180520 1053) ((ycmd (1 3)) (company (0 9 3)) (deferred (0 5 1)) (s (1 11 0)) (dash (2 13 0)) (let-alist (1 0 5)) (f (0 19 0))) "company-mode backend for ycmd" single ((:commit . "bc81b992f79100c98f56b7b83caf64cb8ea60477") (:url . "https://github.com/abingham/emacs-ycmd"))])
- (compdef . [(20200304 611) ((emacs (24 4))) "A local completion definer" single ((:commit . "30fb5846ed851efee641ce8c5d8879ad36cd7ac6") (:keywords "convenience") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/compdef"))])
- (competitive-programming-snippets . [(20200501 1205) ((emacs (26)) (yasnippet (0 8 0))) "Competitive Programming snippets for Yasnippet" tar ((:commit . "22bbf4c5edcc895b67b9f22599f284655ca48858") (:keywords "tools") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:url . "https://github.com/sei40kr/competitive-programming-snippets"))])
- (completions-frame . [(20200507 1703) ((emacs (26 1))) "Show completions in child frame" single ((:commit . "192a70060d2a8710ca75aa2336a10c21a4d30eed") (:keywords "frames") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:url . "https://github.com/muffinmad/emacs-completions-frame"))])
- (composable . [(20200604 1156) ((emacs (24 4))) "composable editing" tar ((:commit . "f6262e6d7380ce9d4eacd7127fe0d968325f347d") (:keywords "lisp") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io"))])
- (composer . [(20200616 1717) ((emacs (24 3)) (s (1 9 0)) (f (0 17)) (seq (1 9)) (php-runtime (0 1 0))) "Interface to PHP Composer" single ((:commit . "7c7f89df226cac69664d7eca5e913b544dc475c5") (:keywords "tools" "php" "dependency" "manager") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/composer.el"))])
- (comware-router-mode . [(20200106 2011) ((dash (2 16 0)) (emacs (24 3))) "Major mode for editing Comware configuration files" single ((:commit . "e6e2d9ca71a7a46c0e4ebeb30e4994c2a8b5fe0d") (:keywords "convenience" "faces") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:url . "https://github.com/daviderestivo/comware-router-mode"))])
- (concurrent . [(20161229 330) ((emacs (24 3)) (deferred (0 5 0))) "Concurrent utility functions for emacs lisp" single ((:commit . "2239671d94b38d92e9b28d4e12fd79814cfb9c16") (:keywords "deferred" "async" "concurrent") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:url . "https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown"))])
- (conda . [(20200525 208) ((emacs (24 4)) (pythonic (0 1 0)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2))) "Work with your conda environments" single ((:commit . "9d0213020ff170b17e11b35cad40ac9a8bf30f4c") (:keywords "python" "environment" "conda") (:authors ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainer "Rami Chowdhury" . "rami.chowdhury@gmail.com") (:url . "http://github.com/necaris/conda.el"))])
- (config-general-mode . [(20171024 1840) nil "Config::General config file mode" single ((:commit . "b4a8e6ba0bb027a77e4a0f701409f3e57bb2e4c0") (:keywords "files") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:url . "https://github.com/tlinden/config-general-mode"))])
- (config-parser . [(20160426 1219) ((emacs (24 4))) "a library for parsing config file" single ((:commit . "85d559e7889d8f5b98b8794b79426ae25ec3caa5") (:keywords "convenience" "config") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/el-config-parser"))])
- (confluence . [(20151021 128) ((xml-rpc (1 6 4))) "Emacs mode for interacting with confluence wikis" tar ((:commit . "4518d270a07760644c4204985c83d234ece4738b") (:keywords "confluence" "wiki" "xmlrpc") (:authors ("James Ahlborn")) (:maintainer "James Ahlborn") (:url . "http://code.google.com/p/confluence-el/"))])
- (conkeror-minor-mode . [(20150114 1604) nil "Mode for editing conkeror javascript files." single ((:commit . "476e81c27b056e21c192391fe674a2bf875466b0") (:keywords "programming" "tools") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com>")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com>") (:url . "http://github.com/Bruce-Connor/conkeror-minor-mode"))])
- (conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:keywords "extensions") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:url . "https://github.com/odanoburu/conllu-mode"))])
- (connection . [(20191111 446) nil "TCP-based client connection" single ((:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:keywords "network") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net"))])
- (constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme." tar ((:commit . "23543a09729569b566175abe1efbe774048d3fa8") (:keywords "themes") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:url . "https://github.com/jannis/emacs-constant-theme"))])
- (contextual . [(20180726 800) ((emacs (24)) (dash (2 12 1)) (cl-lib (0 5))) "Contextual profile management system" single ((:commit . "e3c0de4a2e06757a0e8407c3c6e75930026191e3") (:keywords "convenience" "tools") (:authors ("Alexander Kahl" . "ak@sodosopa.io")) (:maintainer "Alexander Kahl" . "ak@sodosopa.io") (:url . "https://github.com/lshift-de/contextual"))])
- (contextual-menubar . [(20180205 709) nil "display the menubar only on a graphical display" single ((:commit . "f76f55232ac07df76ef9a334a0c527dfab97c40b") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/contextual-menubar"))])
- (contrast-color . [(20160903 1807) ((emacs (24 3)) (cl-lib (0 5))) "Pick best contrast color for you" single ((:commit . "c5fb77a211ebbef3185ada37bea7420534c33f94") (:keywords "color" "convenience") (:authors ("Yuta Yamada <cokesboy[at]gmail.com>")) (:maintainer "Yuta Yamada <cokesboy[at]gmail.com>") (:url . "https://github.com/yuutayamada/contrast-color-el"))])
- (control-mode . [(20160624 1710) nil "A \"control\" mode, similar to vim's \"normal\" mode" single ((:commit . "72d6179b60adc438aada74083b2bf4264b575de3") (:keywords "convenience" "emulations") (:authors ("Stephen Marsh" . "stephen.david.marsh@gmail.com")) (:maintainer "Stephen Marsh" . "stephen.david.marsh@gmail.com") (:url . "https://github.com/stephendavidmarsh/control-mode"))])
- (copy-as-format . [(20190523 258) ((cl-lib (0 5))) "Copy buffer locations as GitHub/Slack/JIRA etc... formatted code" single ((:commit . "a0962b670e26b723ce304b14e3397da453aef84e") (:keywords "github" "slack" "jira" "hipchat" "gitlab" "bitbucket" "org-mode" "pod" "rst" "asciidoc" "tools" "convenience") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:url . "https://github.com/sshaw/copy-as-format"))])
- (copy-file-on-save . [(20200616 518) ((emacs (24 3)) (cl-lib (0 5)) (f (0 17)) (s (1 7 0))) "Copy file on save, automatic deployment it." single ((:commit . "811c8fe638c5616b6471525421e61a4470be3b52") (:keywords "files" "comm" "deploy") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/emacs-auto-deployment"))])
- (copyit . [(20190919 1258) ((emacs (24 3)) (s (1 9 0))) "Copy it, yank anything!" single ((:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:keywords "convenience" "yank" "clipboard") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/emacs-copyit"))])
- (copyit-pandoc . [(20190919 1258) ((emacs (24 3)) (copyit (0 1 0)) (pandoc (0 0 1))) "Copy it, yank anything!" single ((:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:keywords "convenience" "yank" "clipboard") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/emacs-copyit"))])
- (coq-commenter . [(20170822 2309) ((dash (2 13 0)) (s (1 11 0)) (cl-lib (0 5))) "Coq commenting minor mode for proof" single ((:commit . "7fe9a2cc0ebdb0b1e54a24eb7971d757fb588ac3") (:keywords "comment" "coq" "proof") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:url . "http://github.com/ailrun/coq-commenter"))])
- (corral . [(20160502 701) nil "Quickly surround text with delimiters" single ((:commit . "e7ab6aa118e46b93d4933d1364bc273f57cd6911") (:authors ("Kevin Liu" . "mail@nivekuil.com")) (:maintainer "Kevin Liu" . "mail@nivekuil.com") (:url . "http://github.com/nivekuil/corral"))])
- (cort . [(20200726 325) ((emacs (24 1)) (ansi (0 4)) (cl-lib (0 6))) "Simplify extended unit test framework" single ((:commit . "28ae22db138987e09e7ce6fe735d0f161f5e3c59") (:keywords "test" "lisp") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/cort.el"))])
- (cosmo . [(20170922 744) ((emacs (24 4))) "Cosmological Calculator" single ((:commit . "dd83b09a49a2843606b28279b674b2207040b36b") (:keywords "tools") (:authors ("Francesco Montanari" . "fmnt@fmnt.info")) (:maintainer "Francesco Montanari" . "fmnt@fmnt.info") (:url . "https://gitlab.com/montanari/cosmo-el"))])
- (counsel . [(20200706 1447) ((emacs (24 5)) (swiper (0 13 0))) "Various completion functions using Ivy" single ((:commit . "c6b60d34ac37bf4d91a25f16d22e528f85e06938") (:keywords "convenience" "matching" "tools") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/swiper"))])
- (counsel-bbdb . [(20181128 1320) ((ivy (0 8 0)) (emacs (24 3))) "Quick search&input email from BBDB based on ivy" single ((:commit . "df2890deb73b09f8055243bd91942ea887d9b7a1") (:keywords "mail" "abbrev" "convenience" "matching") (:authors ("Chen Bin <chenbin.sh AT gmail>")) (:maintainer "Chen Bin <chenbin.sh AT gmail>") (:url . "https://github.com/redguard/counsel-bbdb"))])
- (counsel-codesearch . [(20180925 803) ((codesearch (1)) (counsel (0 10 0)) (emacs (24)) (ivy (0 10 0))) "Counsel interface for codesearch.el" single ((:commit . "b7989fad3e06f301c31d5e896c42b6cc549a0e0c") (:keywords "tools") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-counsel-codesearch"))])
- (counsel-css . [(20200331 632) ((emacs (24 4)) (counsel (0 7 0)) (cl-lib (0 5))) "stylesheet-selector-aware swiper" single ((:commit . "6427dfcbda0d2bbd81db03f9d6b56b06c260ac02") (:keywords "convenience" "tools" "counsel" "swiper" "selector" "css" "less" "scss") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-counsel-css"))])
- (counsel-dash . [(20200103 1411) ((emacs (24 4)) (dash-docs (1 4 0)) (counsel (0 8 0)) (cl-lib (0 5))) "Browse dash docsets using Ivy" single ((:commit . "370d5f6f14b5294d0eb717f7b2a6a8e93df1ed24") (:keywords "dash" "ivy" "counsel") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:url . "https://github.com/nathankot/counsel-dash"))])
- (counsel-etags . [(20200727 6) ((counsel (0 13 0))) "Fast and complete Ctags/Etags solution using ivy" tar ((:commit . "7bff2a28d590cf130a283386e0ba793511941261") (:keywords "tools" "convenience") (:authors ("Chen Bin <chenbin dot sh AT gmail dot com>")) (:maintainer "Chen Bin <chenbin dot sh AT gmail dot com>") (:url . "http://github.com/redguardtoo/counsel-etags"))])
- (counsel-fd . [(20200505 1344) ((counsel (0 12 0))) "counsel interface for fd" single ((:commit . "afba62f73d348cd7dfd10db039769788f5ae7ad4") (:keywords "tools") (:url . "https://github.com/CsBigDataHub/counsel-fd"))])
- (counsel-ffdata . [(20191017 1237) ((emacs (25 1)) (counsel (0 11 0)) (emacsql (3 0 0))) "Use ivy to access firefox data" single ((:commit . "88c2348c4039d9e562bd3d9a364708b01037c283") (:keywords "convenience" "tools" "matching") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:url . "https://github.com/cireu/counsel-ffdata"))])
- (counsel-gtags . [(20200101 1701) ((emacs (25 1)) (counsel (0 8 0)) (seq (1 0))) "ivy for GNU global" single ((:commit . "5d2a8c2c2d358e374a576cf8a3a67f7997a8839b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/FelipeLema/emacs-counsel-gtags"))])
- (counsel-jq . [(20191207 1334) ((swiper (0 12 0)) (ivy (0 12 0)) (emacs (24 1))) "Live preview of \"jq\" queries using counsel" single ((:commit . "b14dfc5c18d991c3b3051c3cbb244d5923b3a327") (:keywords "convenience" "data" "matching") (:authors ("Alain M. Lafon" . "alain@200ok.ch")) (:maintainer "Alain M. Lafon" . "alain@200ok.ch") (:url . "https://github.com/200ok-ch/counsel-jq"))])
- (counsel-notmuch . [(20181203 935) ((emacs (24)) (ivy (0 10 0)) (notmuch (0 21)) (s (1 12 0))) "Search emails in Notmuch asynchronously with Ivy" single ((:commit . "a4a1562935e4180c42524c51609d1283e9be0688") (:keywords "mail") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexander@gmail.com") (:url . "https://github.com/fuxialexander/counsel-notmuch"))])
- (counsel-org-capture-string . [(20180816 724) ((emacs (25 1)) (ivy (0 10))) "Counsel for org-capture-string" single ((:commit . "0fd5d72397a9268a89dd26de2a6c355f127453ac") (:keywords "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/counsel-org-capture-string"))])
- (counsel-org-clock . [(20190407 348) ((emacs (24 3)) (ivy (0 10 0)) (dash (2 0))) "Counsel commands for org-clock" single ((:commit . "ddf6b89652e4dbc0be5e8719213e7673c83959f1") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/counsel-org-clock"))])
- (counsel-osx-app . [(20160821 809) ((ivy (0 8 0)) (emacs (24 3))) "launch osx applications via ivy interface" single ((:commit . "b1c54cbc033c4939966910d85ce035503079e108") (:authors ("Boris Buliga" . "d12frosted@gmail.com")) (:maintainer "Boris Buliga" . "d12frosted@gmail.com") (:url . "https://github.com/d12frosted/counsel-osx-app"))])
- (counsel-projectile . [(20200522 1131) ((counsel (0 13 0)) (projectile (2 0 0))) "Ivy integration for Projectile" single ((:commit . "77392cbbc42e98fc137b43f1db1b111ba6e2dd75") (:keywords "project" "convenience") (:authors ("Eric Danan")) (:maintainer "Eric Danan") (:url . "https://github.com/ericdanan/counsel-projectile"))])
- (counsel-pydoc . [(20171018 2042) ((emacs (24 3)) (ivy (0 9 1))) "run pydoc with counsel" single ((:commit . "1d8ff8ca3b9d69453cde423b1887fbb490a95c9e") (:keywords "completion" "matching") (:authors (nil . "Hao Deng(denghao8888@gmail.com)")) (:maintainer nil . "Hao Deng(denghao8888@gmail.com)") (:url . "https://github.com/co-dh/pydoc_utils"))])
- (counsel-spotify . [(20200709 2226) ((emacs (25 1)) (ivy (0 13 0))) "Control Spotify search and select music with Ivy" tar ((:commit . "1ef4994f83122a26b7443e5f186b02044c911798") (:authors ("Lautaro García <https://github.com/Lautaro-Garcia>")) (:maintainer "Lautaro García <https://github.com/Lautaro-Garcia>") (:url . "https://github.com/Lautaro-Garcia/counsel-spotify"))])
- (counsel-test . [(20190819 1920) ((emacs (25 1)) (ivy (0 11 0)) (s (1 12 0))) "Browse and execute tests with ivy" tar ((:commit . "7fc4e5d0d65c53edbcb4c25917bcf7faaea36ec7") (:keywords "tools" "ivy" "counsel" "testing" "ctest" "pytest") (:url . "http://github.com/xmagpie/counsel-test"))])
- (counsel-tramp . [(20190616 122) ((emacs (24 3)) (counsel (0 10))) "Tramp ivy interface for ssh, docker, vagrant" single ((:commit . "719b38ba2242cc1c6d1d79cab106c8c8b1afa775") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-counsel-tramp"))])
- (counsel-web . [(20200313 5) ((emacs (25 1)) (counsel (0 13 0)) (request (0 3 0))) "Search the Web using Ivy" single ((:commit . "35c648b4cdd9f266ab54512a0fec2a3ca55d5bc6") (:keywords "convenience" "hypermedia") (:authors ("Matthew Sojourner Newton" . "matt@mnewton.com")) (:maintainer "Matthew Sojourner Newton" . "matt@mnewton.com") (:url . "https://github.com/mnewt/counsel-web"))])
- (counsel-world-clock . [(20190709 2211) ((ivy (0 9 0)) (s (1 12 0))) "Display world clock using Ivy." single ((:commit . "674e4c6b82a92ea765af97cc5f017b357284c7dc") (:authors ("Kuang Chen <http://github.com/kchenphy>")) (:maintainer "Kuang Chen <http://github.com/kchenphy>") (:url . "https://github.com/kchenphy/counsel-world-clock"))])
- (countdown . [(20190626 244) ((emacs (25 1)) (stream (2 2 4))) "Countdown using big LCD-like digits" single ((:commit . "139dea91fc818d65944aca5f16c9626abbdfbf04") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/countdown.el"))])
- (cov . [(20200630 1942) ((emacs (24 4)) (f (0 18 2)) (s (1 11 0)) (elquery (0))) "Show coverage stats in the fringe." single ((:commit . "8b9c7d7f4e53ab3a66cc4d9c88ac07fa57c7a5fe") (:keywords "coverage" "gcov" "c") (:authors ("Adam Niederer")) (:maintainer "Adam Niederer") (:url . "https://github.com/AdamNiederer/cov"))])
- (coverage . [(20191113 1958) ((ov (1 0)) (cl-lib (0 5))) "Code coverage line highlighting" single ((:commit . "6e3c6f2dcb759a76086adeeb1fdfe83e4f082482") (:keywords "coverage" "metrics" "simplecov" "ruby" "rspec") (:authors ("Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com")) (:maintainer "Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com") (:url . "https://github.com/trezona-lecomte/coverage"))])
- (coverlay . [(20190414 940) ((emacs (24 1)) (cl-lib (0 5))) "Test coverage overlays" single ((:commit . "0beae208d0e7d746a94385428bd61aa5cd7ea828") (:keywords "coverage" "overlay") (:authors ("Takuto Wada <takuto.wada at gmail com>")) (:maintainer "Takuto Wada <takuto.wada at gmail com>") (:url . "https://github.com/twada/coverlay.el"))])
- (cp5022x . [(20120323 2335) nil "cp50220, cp50221, cp50222 coding system" single ((:commit . "ea7327dd75e54539576916f592ae1be98179ae35") (:keywords "languages" "cp50220" "cp50221" "cp50222" "cp51932" "cp932") (:authors ("ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp")) (:maintainer "ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp"))])
- (cpanfile-mode . [(20161001 710) ((emacs (24 4))) "Major mode for cpanfiles" single ((:commit . "eda675703525198df1f76ddf250bffa40217ec5d") (:keywords "perl") (:authors ("Zak B. Elep" . "zakame@zakame.net")) (:maintainer "Zak B. Elep" . "zakame@zakame.net") (:url . "https://github.com/zakame/cpanfile-mode"))])
- (cpp-auto-include . [(20191221 2319) ((cl-lib (0 5))) "Insert and delete C++ header files automatically" single ((:commit . "08208ca7b9dc4ac940ce9ca1f79424d2f3d3d391") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/emacsorphanage/cpp-auto-include"))])
- (cpputils-cmake . [(20181006 328) nil "Easy realtime C++ syntax check and IntelliSense with CMake." single ((:commit . "64b2b05eff5398b4cd522e66efaf14553ab18ff4") (:keywords "cmake" "intellisense" "flymake" "flycheck") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "http://github.com/redguardtoo/cpputils-cmake"))])
- (cpu-sos . [(20200409 2356) ((emacs (25 1))) "S.O.S. from a CPU in distress" single ((:commit . "1594b76d4ad3a6e3c471d82da366226d156e6226") (:keywords "processes") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:url . "https://github.com/oitofelix/cpu-sos"))])
- (cql-mode . [(20190315 225) ((emacs (24))) "Major mode for editting CQLs" single ((:commit . "d400c046850d3cf404778b2c47d6be4ff84ca04b") (:keywords "cql" "cassandra") (:authors ("Yuki Inoue <inouetakahiroki at gmail.com>")) (:maintainer "Yuki Inoue <inouetakahiroki at gmail.com>") (:url . "https://github.com/Yuki-Inoue/cql-mode"))])
- (cquery . [(20190118 542) ((emacs (25 1)) (lsp-mode (3 4)) (dash (0 13))) "cquery client for lsp-mode" tar ((:commit . "555e50984ebda177421fdcdc8c76cb29235d9694") (:keywords "languages" "lsp" "c++") (:authors ("Tobias Pisani")) (:maintainer "Tobias Pisani") (:url . "https://github.com/jacobdufault/cquery"))])
- (crappy-jsp-mode . [(20140311 931) nil "A pretty crappy major-mode for jsp." single ((:commit . "6c45ab92b452411cc0fab9bcee2f456276b4fc40") (:keywords "jsp" "major" "mode"))])
- (creamsody-theme . [(20170222 1058) ((autothemer (0 2))) "Straight from the soda fountain." single ((:commit . "32fa3f4e461da92700523b1b20e7b28974c19a26") (:url . "http://github.com/emacsfodder/emacs-theme-creamsody"))])
- (creds . [(20140510 1706) ((s (1 9 0)) (dash (2 5 0))) "A parser credentials file library (not limited to credentials entries)" tar ((:commit . "b059397a7d59481f05fbb1bb9c8d3c2c69226482"))])
- (creole . [(20140924 1500) ((noflet (0 0 3)) (kv (0 0 17))) "A parser for the Creole Wiki language" single ((:commit . "7d5cffe93857f6c75ca09ac79c0e47b8d4410e53") (:keywords "lisp" "creole" "wiki") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (creole-mode . [(20130722 50) nil "a markup mode for creole" single ((:commit . "b5e79b2ec5f19fb5aacf689b5febc3e0b61515c4") (:keywords "hypermedia" "wp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "https://github.com/nicferrier/creole-mode"))])
- (cricbuzz . [(20180804 2254) ((enlive (0 0 1)) (f (0 19 0)) (dash (2 13 0)) (s (1 11 0))) "Cricket scores from cricbuzz in emacs" single ((:commit . "0b95d45991bbcd2fa58d96ce921f6a57ba42c153") (:keywords "cricket" "score") (:authors ("Abhinav Tushar" . "abhinav.tushar.vs@gmail.com")) (:maintainer "Abhinav Tushar" . "abhinav.tushar.vs@gmail.com") (:url . "https://github.com/lepisma/cricbuzz.el"))])
- (crm-custom . [(20160117 6) ((cl-lib (0 5))) "Alternate `completing-read-multiple' that uses `completing-read'" single ((:commit . "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d") (:keywords "completion" "minibuffer" "multiple elements") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:url . "https://github.com/DarwinAwardWinner/crm-custom"))])
- (crontab-mode . [(20200330 920) ((emacs (24))) "Major mode for crontab(5)" single ((:commit . "9625228cbfce29ac3b443c6eff893ff828268f7d") (:keywords "languages") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/crontab-mode"))])
- (crux . [(20200718 1858) ((seq (1 11))) "A Collection of Ridiculously Useful eXtensions" single ((:commit . "bb5a133d2a5db7181524fe679e3f99f44a98426b") (:keywords "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "https://github.com/bbatsov/crux"))])
- (cryptol-mode . [(20190531 2051) nil "Cryptol major mode for Emacs" single ((:commit . "81ebbde83f7cb75b2dfaefc09de6a1703068c769") (:keywords "cryptol" "cryptography") (:authors (nil . "Austin Seipp <aseipp [@at] pobox [dot] com>")) (:maintainer nil . "Austin Seipp <aseipp [@at] pobox [dot] com>") (:url . "http://github.com/thoughtpolice/cryptol-mode"))])
- (crystal-mode . [(20191121 1447) ((emacs (24 4))) "Major mode for editing Crystal files" single ((:commit . "2428b016243e78a0312cf6b3ba6939e7169a1405") (:keywords "languages" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))])
- (crystal-playground . [(20180830 501) ((emacs (25)) (crystal-mode (0 1 2))) "Local crystal playground for short code snippets." single ((:commit . "fb3691b1281207b459c5be50015a626f356dc40d") (:keywords "tools" "crystal") (:authors ("Jason Howell")) (:maintainer "Jason Howell") (:url . "https://github.com/jasonrobot/crystal-playground"))])
- (csgo-conf-mode . [(20161209 1619) nil "CS:GO Configuration files syntax highlighting" single ((:commit . "57e7224f87a3ccc76b5564cc95fa0ff43bb6807c") (:keywords "languages") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com") (:url . "https://github.com/wynro/emacs-csgo-conf-mode"))])
- (csharp-mode . [(20200728 1113) nil "C# mode derived mode" single ((:commit . "48851778e0f01a2b0395e054e418a1d8a1687a06") (:keywords "c#" "languages" "oop" "mode") (:authors ("Dylan R. E. Moonfire (original)")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:url . "https://github.com/josteink/csharp-mode"))])
- (csound-mode . [(20200518 1546) ((emacs (25)) (shut-up (0 3 2)) (multi (2 0 1)) (dash (2 16 0)) (highlight (0))) "A major mode for interacting and coding Csound" tar ((:commit . "b6e8167c927c400c291daaa46a8aea132834b07c") (:authors ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainer "Hlöðver Sigurðsson" . "hlolli@gmail.com") (:url . "https://github.com/hlolli/csound-mode"))])
- (csproj-mode . [(20200607 1602) ((emacs (24))) "Work with .NET project files (csproj, vbproj)" tar ((:commit . "bd5938828543a1e43a271399eb9aed3fdf6b9d88") (:keywords "languages" "tools") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:url . "https://github.com/omajid/csproj-mode"))])
- (css-autoprefixer . [(20180311 1600) ((emacs (24))) "Adds autoprefix to CSS" single ((:commit . "386a5defc8543a3b87820f1761c075c7d1d93b38") (:keywords "convenience" "usability" "css") (:authors (nil . "Kyung Mo Kweon<kkweon@gmail.com> and contributors")) (:maintainer nil . "Kyung Mo Kweon<kkweon@gmail.com> and contributors") (:url . "https://github.com/kkweon/emacs-css-autoprefixer"))])
- (css-comb . [(20160416 559) nil "Sort CSS properties in a particular order using CSS Comb" single ((:commit . "6fa45e5af8a8bd3af6c1154cde3540e32c4206ee") (:authors ("Charanjit Singh" . "ckhabra@gmail.com")) (:maintainer "Charanjit Singh" . "ckhabra@gmail.com") (:url . "https://github.com/channikhabra/css-comb.el"))])
- (css-eldoc . [(20150125 323) nil "an eldoc-mode plugin for CSS source code" tar ((:commit . "c558ac4c470742c98a37290e6b409db28183df30") (:authors ("Zeno Zeng" . "zenoes@qq.com")) (:maintainer "Zeno Zeng" . "zenoes@qq.com"))])
- (cssh . [(20150810 1709) nil "clusterssh implementation for emacs" single ((:commit . "2fe2754235225a59b63f08b130cfd4352e2e1c3f") (:keywords "clusterssh" "ssh" "cssh") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "http://tapoueh.org/emacs/cssh.html"))])
- (csv . [(20161113 1510) nil "Functions for reading and parsing CSV files." single ((:commit . "aa1dfa1263565d5fac3879c21d8ddf5f8915e411") (:keywords "extensions" "data" "csv") (:authors ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainer "Ulf Jasper" . "ulf.jasper@web.de"))])
- (ctable . [(20171006 11) nil "Table component for Emacs Lisp" single ((:commit . "b8830d1ca95abb100a81bc32011bd17d5ecba000") (:keywords "table") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:url . "https://github.com/kiwanami/emacs-ctable"))])
- (ctags-update . [(20190609 613) nil "(auto) update TAGS in parent directory using exuberant-ctags" single ((:commit . "67faf248b92388442958a069263c62a345425a1b") (:keywords "exuberant-ctags" "etags") (:authors (nil . "Joseph(纪秀峰) jixiuf@gmail.com")) (:maintainer nil . "Joseph(纪秀峰) jixiuf@gmail.com") (:url . "https://github.com/jixiuf/ctags-update"))])
- (ctl-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" single ((:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:keywords "grads" "script" "major-mode") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org"))])
- (ctrlf . [(20200716 1411) ((emacs (25 1))) "Emacs finally learns how to ctrl+F" single ((:commit . "2f0b6eca832ff5c6e3e9f41e7bd897f33c701ebe") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/ctrlf"))])
- (ctune . [(20190914 1305) ((emacs (26 1))) "Tune out CC Mode Noise Macros" tar ((:commit . "d7643461f5aa33cc04e4d808123e4ed1d85500ee") (:keywords "c" "convenience") (:authors ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com") (:url . "https://github.com/maurooaranda/ctune"))])
- (ctxmenu . [(20140303 2142) ((popup (20140205 103)) (log4e (0 2 0)) (yaxception (0 1))) "Provide a context menu like right-click." tar ((:commit . "5c2376859562b98c07c985d2b483658e4c0e888e") (:keywords "popup") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-ctxmenu"))])
- (cubicaltt . [(20171108 1402) ((emacs (24 1)) (cl-lib (0 5))) "Mode for cubical type theory" single ((:commit . "a5c6f94bfc0da84e214641e0b87aa9649ea114ea") (:keywords "languages") (:url . "https://github.com/mortberg/cubicaltt"))])
- (cubicle-mode . [(20171009 1957) nil "Major mode for the Cubicle model checker" single ((:commit . "c2fba597da83b9ddc1195f1c8710d5330db24735") (:authors ("Alain Mebsout")) (:maintainer "Alain Mebsout"))])
- (cucumber-goto-step . [(20131210 519) ((pcre2el (1 5))) "Jump to cucumber step definition" single ((:commit . "f2713ffb26ebe1b757d1f2ea80e900b55e5895aa") (:authors ("Glen Stampoultzis" . "gstamp@gmail.com")) (:maintainer "Glen Stampoultzis" . "gstamp@gmail.com") (:url . "http://orthogonal.me"))])
- (cuda-mode . [(20151214 321) nil "NVIDIA CUDA Major Mode" single ((:commit . "9ae9eacfdba3559b5456342d0d03296290df8ff5") (:keywords "c" "languages") (:authors ("Jack Morrison" . "jackmorrison1@gmail.com")) (:maintainer "Jack Morrison" . "jackmorrison1@gmail.com"))])
- (curl-to-elisp . [(20200427 219) ((emacs (25 1))) "Convert cURL command to Emacs Lisp code" single ((:commit . "25449962e758607762b3df76fc5501cfeedbbd38") (:keywords "lisp") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/curl-to-elisp"))])
- (currency-convert . [(20200611 815) ((emacs (24 4))) "Currency converter" single ((:commit . "a8bd12654c34380b87ac6ffece32f43b723b6f0f") (:keywords "comm" "convenience" "i18n") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-currency-convert"))])
- (cursor-test . [(20131207 1732) ((emacs (24))) "testing library for cursor position in emacs." single ((:commit . "e09956e048b88fd2ee8dd90b5678baed8b04d31b") (:authors ("ainame")) (:maintainer "ainame") (:url . "https://github.com/ainame/cursor-test.el"))])
- (cwl-mode . [(20171205 945) ((yaml-mode (0 0 13)) (emacs (24 4))) "A major mode for editing CWL" single ((:commit . "bdeb9c0734126f940db80bfb8b1dc735dab671c7") (:keywords "languages" "cwl" "common workflow language") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/cwl-mode"))])
- (cyberpunk-2019-theme . [(20191008 1133) ((emacs (24 1))) "A retina-scorching cyberpunk theme" single ((:commit . "7e40c37210c363b2819fd9bb98a73101d7a3c206") (:keywords "cyberpunk" "theme" "themes") (:authors ("Alex Lynham" . "alex@lynh.am")) (:maintainer "Alex Lynham" . "alex@lynh.am") (:url . "https://github.com/the-frey/cyberpunk-2019"))])
- (cyberpunk-theme . [(20200601 1632) nil "Cyberpunk Color Theme" single ((:commit . "cbd0d7193e69ff9e98262eb06aee3d27667ff5f5") (:keywords "color" "theme" "cyberpunk") (:authors ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainer "Nicholas M. Van Horn" . "nvanhorn@protonmail.com") (:url . "https://github.com/n3mo/cyberpunk-theme.el"))])
- (cycbuf . [(20131203 2037) nil "Cycle buffers, inspired by swbuff.el, swbuff-x.el, and bs.el" single ((:commit . "1079b41c3eb27d65b66d4399959bb6253f84858e") (:keywords "files" "convenience" "buffer switching") (:authors ("Martin Pohlack martinp (at) gmx.de")) (:maintainer "Martin Pohlack martinp (at) gmx.de") (:url . "https://github.com/martinp26/cycbuf"))])
- (cycle-resize . [(20160521 1557) nil "Cycle resize the current window horizontally or vertically" single ((:commit . "7d255d6fe85f12c967a0f7fcfcf18633be194c88") (:authors ("Pierre Lecocq")) (:maintainer "Pierre Lecocq") (:url . "https://github.com/pierre-lecocq/cycle-resize"))])
- (cycle-themes . [(20150403 309) ((cl-lib (0 5))) "A global minor mode to make switching themes easier" single ((:commit . "6e125d11fdbc6b78fc9f219eb2609a5e29815898") (:keywords "themes" "utility" "global minor mode") (:url . "http://github.com/toroidal-code/cycle-themes.el"))])
- (cyphejor . [(20190713 1339) ((emacs (24 4))) "Shorten major mode names using user-defined rules" single ((:commit . "763531d077d02a4a45c58332b8a8b8300c090678") (:keywords "mode-line" "major-mode") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/cyphejor"))])
- (cypher-mode . [(20151110 1142) nil "major mode for editing cypher scripts" single ((:commit . "ce8543d7877c736c574a17b49874c9dcdc7a06d6") (:keywords "cypher" "graph") (:authors ("François-Xavier Bois <fxbois AT Google Mail Service>")) (:maintainer "François-Xavier Bois") (:url . "http://github.com/fxbois/cypher-mode"))])
- (cython-mode . [(20190111 2150) nil "Major mode for editing Cython files" single ((:commit . "8970c94d0c6207133e8fdfac642b1b033b8b4184"))])
- (czech-holidays . [(20160113 1752) nil "Adds a list of Czech public holidays to Emacs calendar" single ((:commit . "d136fa09a152b3cd80db6d55c7b4ddfe07b90fbf") (:keywords "calendar") (:authors ("David Chkhikvadze" . "david.chk@outlook.com")) (:maintainer "David Chkhikvadze" . "david.chk@outlook.com"))])
- (d-mode . [(20191009 903) ((emacs (24 3))) "D Programming Language major mode for (X)Emacs" single ((:commit . "cfd1d0869d51b7548b3fb738b2f2593c76533d44") (:keywords "d" "programming" "language" "emacs" "cc-mode") (:authors ("William Baxter")) (:maintainer "Russel Winder" . "russel@winder.org.uk"))])
- (dactyl-mode . [(20140906 1725) nil "Major mode for editing Pentadactyl config files" single ((:commit . "cc55fe6b987271d9647492b8df4c812d884f661f") (:keywords "languages" "vim") (:url . "https://github.com/luxbock/dactyl-mode"))])
- (dad-joke . [(20170928 658) ((emacs (24))) "Get/display dad jokes" single ((:commit . "bee47e7b746b403228fa7d7361cb095de19ac9ba") (:keywords "games") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/dad-joke.el"))])
- (daemons . [(20200421 912) ((emacs (25 1))) "UI for managing init system daemons (services)" tar ((:commit . "a26155d04cec399ffe25b88f71cbfa4ada784569") (:keywords "unix" "convenience") (:authors ("Chris Bowdon")) (:maintainer "Chris Bowdon") (:url . "https://github.com/cbowdon/daemons.el"))])
- (dakrone-light-theme . [(20170808 2140) nil "dakrone's custom light theme" single ((:commit . "06f198dc8b4ca7421990b30a23d89c8e0b8c5de4") (:keywords "color" "themes" "faces") (:authors ("Lee Hinman <lee _AT_ writequit.org>")) (:maintainer "Lee Hinman <lee _AT_ writequit.org>") (:url . "https://github.com/dakrone/dakrone-light-theme"))])
- (dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:keywords "color" "themes") (:authors ("Lee Hinman <lee _AT_ writequit.org>")) (:maintainer "Lee Hinman <lee _AT_ writequit.org>") (:url . "https://github.com/dakrone/dakrone-theme"))])
- (danneskjold-theme . [(20200724 1525) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "5b458ce976acf948aa101a05994b68baf9b01846"))])
- (dante . [(20200416 1217) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (haskell-mode (13 14)) (s (1 11 0)) (lcr (1 0))) "Development mode for Haskell" single ((:commit . "c516bc9e8f09e0f928de9a93e82acfb382636f5c") (:keywords "haskell" "tools") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:url . "https://github.com/jyp/dante"))])
- (dap-mode . [(20200731 1910) ((emacs (26 1)) (dash (2 14 1)) (lsp-mode (6 0)) (dash-functional (1 2 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0))) "Debug Adapter Protocol mode" tar ((:commit . "efcc681fd75ea71f8831284ed954d0a790934f1a") (:keywords "languages" "debug") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:url . "https://github.com/yyoncho/dap-mode"))])
- (darcsum . [(20190316 2215) nil "a pcl-cvs like interface for managing darcs patches" single ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:keywords "completion" "convenience" "tools" "vc") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org"))])
- (darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" single ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:keywords "faces") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com") (:url . "https://gitlab.com/fommil/emacs-darcula-theme"))])
- (dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "an Emacs 24 theme based on Dark Krystal (tmTheme)" single ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (dark-mint-theme . [(20160302 642) nil "dark & minty fresh theme" single ((:commit . "95c30a26de31549cd341184ba9ab2be8fdc67eba"))])
- (dark-souls . [(20140314 1128) nil "Prepare to die" single ((:commit . "94122b1215423e58dcf18584a2bd022029d54d4b") (:keywords "games") (:authors ("Tom Jakubowski" . "tom@crystae.net")) (:maintainer "Tom Jakubowski" . "tom@crystae.net") (:url . "http://github.com/tomjakubowski/dark-souls.el"))])
- (darkburn-theme . [(20170423 1652) nil "A not-so-low contrast color theme for Emacs." single ((:commit . "0af794ff7fac19778ac8a7efb92455c6f6c2158f") (:authors ("Jonas Gorauskas" . "jgorauskas@gmail.com")) (:maintainer "Jonas Gorauskas" . "jgorauskas@gmail.com") (:url . "http://github.com/gorauskas/darkburn-theme"))])
- (darkmine-theme . [(20160406 624) nil "Yet another emacs dark color theme." single ((:commit . "7f7e82ca03bcad52911fa41fb3e204e32d6ee63e") (:authors ("Pierre Lecocq" . "pierre.lecocq@gmail.com")) (:maintainer "Pierre Lecocq" . "pierre.lecocq@gmail.com") (:url . "https://github.com/pierre-lecocq/darkmine-theme"))])
- (darkokai-theme . [(20200614 1452) nil "A darker variant on Monokai." single ((:commit . "5820aeddfc8c869ba840cc534eba776936656a66") (:url . "http://github.com/sjrmanning/darkokai"))])
- (darktooth-theme . [(20190412 142) ((autothemer (0 2))) "From the darkness... it watches" single ((:commit . "5cc7fbfb08d2f1a33b85eac92b6450407b915119") (:url . "http://github.com/emacsfodder/emacs-theme-darktooth"))])
- (dart-mode . [(20190827 2102) ((emacs (24 3))) "Major mode for editing Dart files" single ((:commit . "04fcd649f19d49390079fbf2920a10bf37f6a634") (:keywords "languages") (:authors ("Brady Trainor" . "mail@bradyt.net")) (:maintainer "Brady Trainor" . "mail@bradyt.net") (:url . "https://github.com/bradyt/dart-mode"))])
- (dart-server . [(20190817 1254) ((emacs (24 5)) (cl-lib (0 5)) (dash (2 10 0)) (flycheck (0 23)) (s (1 10))) "Minor mode for editing Dart files" single ((:commit . "aba838e8ee2f30309f366e8a91c17616549003ce") (:keywords "languages") (:authors ("Natalie Weizenbaum") ("Brady Trainor" . "mail@bradyt.com")) (:maintainer "Brady Trainor" . "mail@bradyt.com") (:url . "https://github.com/bradyt/dart-server"))])
- (dash . [(20200524 1947) nil "A modern list library for Emacs" tar ((:commit . "732d92eac56023a4fb4a5dc3d9d4e274ebf44bf9") (:keywords "lists") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (dash-alfred . [(20191024 450) ((emacs (25 1))) "Search Dash documentation via Dash-Alfred-Workflow" single ((:commit . "fcd21bd6c7eb5cd31377be970406ff3d2454bd5c") (:keywords "docs") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/dash-alfred.el"))])
- (dash-at-point . [(20180710 1356) nil "Search the word at point with Dash" single ((:commit . "4d795a23a8428c421d5107f1b005c9d8e0d1816c") (:authors ("Shinji Tanaka" . "shinji.tanaka@gmail.com")) (:maintainer "Shinji Tanaka" . "shinji.tanaka@gmail.com") (:url . "https://github.com/stanaka/dash-at-point"))])
- (dash-docs . [(20200516 1943) ((emacs (24 4)) (cl-lib (0 5)) (async (1 9 3))) "Offline documentation browser using Dash docsets." single ((:commit . "dafc8fc9f1ddb2e4e39e0b8d066c42d5d7ce8d06") (:keywords "docs") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina " . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:url . "http://github.com/areina/helm-dash"))])
- (dash-functional . [(20200617 702) ((dash (2 0 0)) (emacs (24))) "Collection of useful combinators for Emacs Lisp" single ((:commit . "732d92eac56023a4fb4a5dc3d9d4e274ebf44bf9") (:keywords "lisp" "functions" "combinators"))])
- (dashboard . [(20200306 1344) ((emacs (25 3)) (page-break-lines (0 11))) "A startup screen extracted from Spacemacs" tar ((:commit . "bf38867ae80902d58207974b4a2bba4249324599") (:keywords "startup" "screen" "tools" "dashboard") (:authors ("Rakan Al-Hneiti")) (:maintainer "Rakan Al-Hneiti") (:url . "https://github.com/emacs-dashboard/emacs-dashboard"))])
- (dashboard-hackernews . [(20190109 205) ((emacs (24)) (dashboard (1 2 5)) (request (0 3 0))) "Display Hacker News on dashboard" single ((:commit . "b71814716d8f78181b9d1990f06072460de0797e") (:authors ("Hayato KAJIYAMA" . "kaji1216@gmail.com")) (:maintainer "Hayato KAJIYAMA" . "kaji1216@gmail.com") (:url . "https://github.com/hyakt/emacs-dashboard-hackernews"))])
- (dashboard-ls . [(20200515 1430) ((emacs (24 3)) (dashboard (1 2 5)) (f (0 20 0)) (s (1 12 0))) "Display files/directories in current directory on Dashboard" single ((:commit . "8b2922abb75847787626fe241d609cff7eabf840") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/dashboard-ls"))])
- (dashboard-project-status . [(20190202 1354) ((emacs (24)) (git (0 1 1)) (dashboard (1 2 5))) "Display a git project status in a dashboard widget." single ((:commit . "7675c138e9df8fe2c626e7ba9bbb8b6717671a41") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:url . "https://github.com/functionreturnfunction/dashboard-project-status"))])
- (date-at-point . [(20150308 1243) nil "Add `date' to `thing-at-point' function" single ((:commit . "38df823d05df08ec0748a4185113fae5f99090e9") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/date-at-point.el"))])
- (date-field . [(20141129 105) ((dash (2 9 0)) (log4e (0 2 0)) (yaxception (0 3 2))) "Date widget" single ((:commit . "11c9170d1f7b343233f7716d4c0a62be024c1654") (:keywords "widgets") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-date-field"))])
- (date2name . [(20190630 933) ((emacs (24 4))) "Package to prepend ISO Timestamps to files" single ((:commit . "386dbe73678705d6107cd5c9bdeb4f7c97632360") (:keywords "files" "convenience") (:authors ("Max Beutelspacher")) (:maintainer "Max Beutelspacher") (:url . "https://github.com/DerBeutlin/date2name.el"))])
- (datetime . [(20200621 2103) ((emacs (24 4)) (extmap (1 1 1))) "Parsing, formatting and matching timestamps" tar ((:commit . "c51eeb6df180f6c7d1676d1c0af78255bb0fdf95") (:keywords "lisp" "i18n") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:url . "https://github.com/doublep/datetime"))])
- (datetime-format . [(20160612 1715) nil "Datetime functions" single ((:commit . "e6427538b547cbe02e1bd6ed4b765c73620bdae8") (:keywords "datetime" "calendar") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/emacs-datetime"))])
- (datomic-snippets . [(20180817 1045) ((s (1 4 0)) (dash (1 2 0)) (yasnippet (0 6 1))) "Yasnippets for Datomic" tar ((:commit . "4a14228840d5252e13d2bf6209670f26345bbb84"))])
- (dayone . [(20160105 1240) ((uuid (0 0 3)) (mustache (0 22)) (ht (1 5))) "Utility script for Day One" tar ((:commit . "ab628274f0806451f23bce16f62a6a11cbf91a2b") (:keywords "day one" "tools" "convenience") (:authors ("mori-dev" . "mori.dev.asdf@gmail.com")) (:maintainer "mori-dev" . "mori.dev.asdf@gmail.com") (:url . "https://github.com/mori-dev/emacs-dayone"))])
- (db . [(20140421 2111) ((kv (0 0 11))) "A database for EmacsLisp" single ((:commit . "b3a423fb8e72f9013009cbe033d654df2ce31438") (:keywords "data" "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (db-pg . [(20130131 1902) ((pg (0 12)) (db (0 0 6))) "A PostgreSQL adapter for emacs-db" single ((:commit . "7d5ab86b74b05fe003b3b434d4835f37f3f3eded") (:keywords "data" "comm" "database" "postgresql") (:authors ("Nic Ferrier" . "nic@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nic@ferrier.me.uk"))])
- (dbc . [(20200527 1040) ((emacs (24 4)) (cl-lib (0 5)) (ht (2 3))) "Control how to open buffers" single ((:commit . "8aa8982e6afbe3820f60c3defbb3c8037e04eebe") (:keywords "convenience") (:authors ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:url . "https://gitlab.com/matsievskiysv/display-buffer-control"))])
- (ddskk . [(20200403 1308) ((ccc (1 43)) (cdb (20141201 754))) "Simple Kana to Kanji conversion program." tar ((:commit . "814e5008f0b8ba8132fd171f5177c3a2f2cc9bab"))])
- (ddskk-posframe . [(20191123 1632) ((emacs (26 1)) (posframe (0 4 3)) (ddskk (16 2 50))) "Show Henkan tooltip for ddskk via posframe" single ((:commit . "8a37953b37d397ba406bc308eb908bd966d34af6") (:keywords "tooltip" "convenience" "posframe") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/ddskk-posframe.el"))])
- (deadgrep . [(20200524 124) ((emacs (25 1)) (dash (2 12 0)) (s (1 11 0)) (spinner (1 7 3))) "fast, friendly searching with ripgrep" single ((:commit . "7e50e71c6ff4e17dded43e0836dae4e5ec020fcf") (:keywords "tools") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/deadgrep"))])
- (debian-el . [(20200401 1622) nil "Emacs helpers specific to Debian users" tar ((:commit . "d7117ab18b15f449f194cd7d91ff22e55fcfa817"))])
- (debpaste . [(20160113 2347) ((xml-rpc (1 6 7))) "Interface for getting/posting/deleting pastes from paste.debian.net" single ((:commit . "6f2a400665062468ebd03a2ce1de2a73d9084958") (:keywords "paste") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "http://github.com/alezost/debpaste.el"))])
- (debug-print . [(20140126 19) ((emacs (24))) "A nice printf debugging environment by the way Gauche do" single ((:commit . "d817fd9ea2d3f8d2c1ace4d8af155684f3a99dc5") (:keywords "extensions" "lisp" "tools" "maint") (:authors ("Ken Okada" . "keno.ss57@gmail.com")) (:maintainer "Ken Okada" . "keno.ss57@gmail.com") (:url . "https://github.com/kenoss/debug-print"))])
- (decide . [(20190201 2137) nil "rolling dice and other random things" single ((:commit . "4bfcc826dd5b1c30caec455d8baa4f363159eac6") (:authors ("Pelle Nilsson" . "perni@lysator.liu.se")) (:maintainer "Pelle Nilsson" . "perni@lysator.liu.se"))])
- (decl . [(20171212 1458) ((dash (2 5 0)) (emacs (24 3)) (cl-lib (0 3))) "Library for organizing code declaratively" single ((:commit . "ff7f8a4f1225cbdf141c86172104e67a4cf58c86") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/decl.el"))])
- (dedicated . [(20151202 110) nil "A very simple minor mode for dedicated buffers" single ((:commit . "f47b504c0c56fa5ab9d1028417ca1f65a713a2f0") (:keywords "dedicated" "buffer") (:authors ("Eric Crampton" . "eric@atdesk.com")) (:maintainer "Eric Crampton" . "eric@atdesk.com"))])
- (dedukti-mode . [(20171103 1212) nil "Major mode for Dedukti files" single ((:commit . "d7c3505a1046187de3c3aeb144455078d514594e") (:keywords "languages" "dedukti") (:authors ("Raphaël Cauderlier")) (:maintainer "Raphaël Cauderlier") (:url . "https://github.com/rafoo/dedukti-mode"))])
- (default-text-scale . [(20191226 2234) ((emacs (24))) "Easily adjust the font size in all frames" single ((:commit . "bfc0987c37e93742255d3b23d86c17096fda8e7e") (:keywords "frames" "faces") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/default-text-scale"))])
- (deferred . [(20170901 1330) ((emacs (24 4))) "Simple asynchronous functions for emacs lisp" single ((:commit . "2239671d94b38d92e9b28d4e12fd79814cfb9c16") (:keywords "deferred" "async") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:url . "https://github.com/kiwanami/emacs-deferred"))])
- (define-it . [(20191230 1409) ((emacs (25 1)) (s (1 12 0)) (request (0 3 0)) (popup (0 5 3)) (pos-tip (0 4 6)) (google-translate (0 11 18)) (wiki-summary (0 1))) "Define, translate, wiki the word" single ((:commit . "4e769b94c4ec81d9c1eac9dda0e22c869a07aa7c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/define-it"))])
- (define-word . [(20200417 844) ((emacs (24 3))) "display the definition of word at point." single ((:commit . "08c71b1ff4fd07bf0c78d1fcf77efeaafc8f7443") (:keywords "dictionary" "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/define-word"))])
- (defproject . [(20151201 2219) ((emacs (24))) "Manager dir-locals and project specific variables" single ((:commit . "674d48a5e34cb4bba76faa38ee901322ec649086") (:keywords "convenience") (:authors (nil . "<kotfic@gmail.com>")) (:maintainer nil . "<kotfic@gmail.com>") (:url . "https://github.com/kotfic/defproject"))])
- (defrepeater . [(20180830 410) ((emacs (25 2)) (s (1 12 0))) "Easily make commands repeatable" single ((:commit . "9c027a2561fe141dcfb79f75fcaee36cd0386ec1") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/defrepeater.el"))])
- (deft . [(20200515 1513) nil "quickly browse, filter, and edit plain text notes" single ((:commit . "fca9ea05ef4fdac825e2ad3921baa7042f6b82c8") (:keywords "plain text" "notes" "simplenote" "notational velocity") (:authors ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainer "Jason R. Blevins" . "jrblevin@xbeta.org") (:url . "https://jblevins.org/projects/deft/"))])
- (delim-kill . [(20100517 620) nil "Kill text between delimiters." single ((:commit . "1dbe47344f2d2cbc8c54beedf0cf0bf10fd203c1") (:keywords "convenience" "languages") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com") (:url . "http://github.com/thomas11/delim-kill/tree/master"))])
- (demangle-mode . [(20200621 2344) ((cl-lib (0 1)) (emacs (24 3))) "Automatically demangle C++ symbols" single ((:commit . "697c1dbde93f164eac7ea0dc530d7e8b799272d6") (:keywords "c" "tools") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org") (:url . "https://github.com/liblit/demangle-mode"))])
- (demo-it . [(20190828 26) nil "Create demonstrations" tar ((:commit . "9cfa5c3f92a0dca7eebb1f1a2011643c9b009d26") (:keywords "demonstration" "presentation" "test") (:authors ("Howard Abrams" . "howard.abrams@gmail.com")) (:maintainer "Howard Abrams" . "howard.abrams@gmail.com"))])
- (deno-fmt . [(20200520 1838) ((emacs (24))) "Minor mode for using deno fmt on save" single ((:commit . "3b193eef576e2c14fdcf350495955e6e8546dddd") (:authors ("Russell Clarey <http://github/rclarey>")) (:maintainer "Russell Clarey <http://github/rclarey>") (:url . "https://github.com/russell/deno-emacs"))])
- (describe-number . [(20151101 55) ((yabin (1 1))) "Describe arbitrarily large number at point." single ((:commit . "40618345a37831804b29589849a785ef5aa5ac24") (:keywords "describe" "value" "help") (:authors ("Morten Slot Kristensen <msk AT nullpointer DOT dk>")) (:maintainer "Morten Slot Kristensen <msk AT nullpointer DOT dk>") (:url . "https://github.com/netromdk/describe-number"))])
- (desktop+ . [(20170107 2132) ((emacs (24 4)) (dash (2 11 0)) (f (0 17 2))) "Handle special buffers when saving & restoring sessions" single ((:commit . "88055cee526a000056201898499cebbd35e3ea76") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/desktop-plus"))])
- (desktop-environment . [(20200225 1042) ((emacs (25 1))) "Helps you control your GNU/Linux computer" single ((:commit . "dbcf3d9411d53908de09ab0d34932d19c8117144") (:authors ("Damien Cassou <damien@cassou.me>, Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Damien Cassou <damien@cassou.me>, Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))])
- (desktop-registry . [(20140119 2143) nil "Keep a central registry of desktop files" single ((:commit . "244c2e7f9f0a1050aa8a47ad0b38f4e4584682dd") (:keywords "convenience") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:url . "http://projects.ryuslash.org/desktop-registry/"))])
- (detour . [(20181122 2138) ((emacs (24 4))) "Take a quick detour and return" single ((:commit . "1ff23c236e18971ed1077840daf047cde79a45ee") (:keywords "convenience" "abbrev") (:authors ("Stefan Kamphausen <www.skamphausen.de>")) (:maintainer "Stefan Kamphausen <www.skamphausen.de>") (:url . "https://github.com/ska2342/detour/"))])
- (devdocs . [(20170731 850) nil "Launch DevDocs search" single ((:commit . "a2d51e824f0cc48a9dd611cc740bc8b86143e611") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/DevDocs.el"))])
- (dfmt . [(20170728 1023) nil "Emacs Interface to D indenting/formatting tool dfmt." single ((:commit . "21b9094e907b7ac53f5ecb4ff4539613a9d12434") (:keywords "tools" "convenience" "languages" "dlang") (:authors ("Per Nordlöw")) (:maintainer "Kirill Babikhin <qsimpleq>") (:url . "https://github.com/qsimpleq/elisp-dfmt"))])
- (dhall-mode . [(20200716 2147) ((emacs (24 4)) (reformatter (0 3))) "a major mode for dhall configuration language" single ((:commit . "484bcf8f78f1183ef45c3b04a362bb73690c6b9b") (:keywords "languages") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in") (:url . "https://github.com/psibi/dhall-mode"))])
- (dianyou . [(20191120 39) ((emacs (24 4))) "Search and analyze mails in Gnus" single ((:commit . "da7443a680bd8db75884355314e9352cd8c68d05") (:keywords "mail") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/dianyou"))])
- (diary-manager . [(20200404 1549) ((emacs (25))) "Simple personal diary" single ((:commit . "2850e8f27662eb1e8a34425b3032a361a5c989cc") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/diary-manager"))])
- (dic-lookup-w3m . [(20180526 1621) ((w3m (20120723 324)) (stem (20120826))) "look up dictionaries on the Internet" tar ((:commit . "3254ab10cbf0078c7162557dd1f68dac28459cf9") (:keywords "emacs-w3m" "w3m" "dictionary") (:authors ("mcprvmec")) (:maintainer "mcprvmec"))])
- (dictcc . [(20200421 1422) ((emacs (24 4)) (cl-lib (0 5)) (ivy (0 10 0))) "Look up translations on dict.cc" single ((:commit . "3950011197ba81f27cc82b4e6075c9100945f936") (:keywords "convenience") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com"))])
- (dictionary . [(20191111 446) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" single ((:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:keywords "interface" "dictionary") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net"))])
- (didyoumean . [(20191020 531) ((emacs (24 4))) "Did you mean to open another file?" single ((:commit . "4a6049f2de36801e0a50e93b17a375501f16cf28") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))])
- (diff-at-point . [(20200413 200) ((emacs (26 2))) "Diff navigation" single ((:commit . "5b06de513297a80cf3a2081b8ee0914e90da810b") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-at-point"))])
- (diff-hl . [(20200701 2141) ((cl-lib (0 2)) (emacs (24 3))) "Highlight uncommitted changes using VC" tar ((:commit . "2281a89a3ddc6616073da6f190dda08d23b18ba6") (:keywords "vc" "diff") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:url . "https://github.com/dgutov/diff-hl"))])
- (difflib . [(20171227 1518) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences." single ((:commit . "b08850251812d71e62fd6956081299590acdf37b") (:keywords "matching" "tools" "string") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:url . "http://github.com/dieggsy/difflib.el"))])
- (diffscuss-mode . [(20141014 2357) nil "Major mode for diffscuss files." single ((:commit . "e0aacd8b3d9f886f27222c1397f0655e849e0af7") (:keywords "tools") (:authors ("Edmund Jorgensen" . "edmund@hut8labs.com")) (:maintainer "Edmund Jorgensen" . "edmund@hut8labs.com"))])
- (diffview . [(20150929 511) nil "View diffs in side-by-side format" single ((:commit . "031b70913e755c5e55222680f80185032a7d1728") (:keywords "convenience" "diff") (:authors ("Mitchel Humpherys" . "mitch.special@gmail.com")) (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com") (:url . "https://github.com/mgalgs/diffview-mode"))])
- (digistar-mode . [(20200701 301) nil "major mode for Digistar scripts" single ((:commit . "e2f4de895f9566d78d9154f6a30934267ec58508") (:keywords "languages") (:authors ("John Foerch" . "jjfoerch@gmail.com")) (:maintainer "John Foerch" . "jjfoerch@gmail.com"))])
- (digit-groups . [(20200506 37) ((dash (2 11 0))) "Highlight place-value positions in numbers" single ((:commit . "7b81930cad19b8b7913b7eedbcb498964bfdcbdb") (:authors ("Michael D. Adams <http://michaeldadams.org>")) (:maintainer "Michael D. Adams <http://michaeldadams.org>") (:url . "https://github.com/adamsmd/digit-groups/"))])
- (digitalocean . [(20190607 726) ((request (2 5)) (emacs (24 4))) "Create and manipulate digitalocean droplets" single ((:commit . "6c32d3593286e2a62d9afab0057c829407b0d1e8") (:keywords "processes" "tools") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:url . "https://github.com/olymk2/emacs-digitalocean"))])
- (digitalocean-helm . [(20180610 746) ((emacs (24 3)) (helm (2 5)) (digitalocean (0 1))) "Create and manipulate digitalocean droplets" single ((:commit . "b125c9882eded7d73ec109d152b26625f333440b") (:keywords "processes" "tools") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:url . "https://gitlab.com/olymk2/digitalocean-api"))])
- (dim . [(20160818 949) ((emacs (24 4))) "Change mode-line names of major/minor modes" single ((:commit . "5515f2e8657ef14adcc34aa5b05383a2684328ae") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/dim.el"))])
- (dim-autoload . [(20200103 1239) nil "dim or hide autoload cookie lines" single ((:commit . "c8dc02259d6c1aa25fb58742ae8b181f83b39a13") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/dim-autoload"))])
- (diminish . [(20191127 1326) ((emacs (24 3))) "Diminished modes are minor modes with no modeline display" single ((:commit . "6ec6ebc391371418efc6c98d70b013f34af5a2ee") (:keywords "extensions" "diminish" "minor" "codeprose") (:authors ("Will Mengarini" . "seldon@eskimo.com")) (:maintainer "Martin Yrjölä" . "martin.yrjola@gmail.com") (:url . "https://github.com/myrjola/diminish.el"))])
- (diminish-buffer . [(20200712 1355) ((emacs (24 4))) "Diminish (hide) buffers from buffer-menu" single ((:commit . "2ef1e03458b9528a737814546aaee66067db649e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/diminish-buffer"))])
- (dimmer . [(20200509 1718) ((emacs (25 1))) "Visually highlight the selected buffer" single ((:commit . "4abe51533a972910f9012029a47b533878ec682e") (:keywords "faces" "editing") (:authors ("Neil Okamoto")) (:maintainer "Neil Okamoto") (:url . "https://github.com/gonewest818/dimmer.el"))])
- (dionysos . [(20160810 1056) ((libmpdee (2 1 0)) (alert (1 2)) (s (1 11 0)) (dash (2 12 1)) (pkg-info (0 5 0)) (cl-lib (0 5))) "Dionysos, a music player for Emacs" tar ((:commit . "0aac21caadabc5a7f09e18a9dcb02f3dec26588b") (:keywords "music") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/dionysos"))])
- (dircmp . [(20141204 1756) nil "Compare and sync directories." tar ((:commit . "558ee0b601c2de9d247612085aafe2926f56a09f") (:keywords "unix" "tools") (:authors ("Matt McClure -- http://matthewlmcclure.com")) (:maintainer "Matt McClure -- http://matthewlmcclure.com") (:url . "https://github.com/matthewlmcclure/dircmp-mode"))])
- (dired-atool . [(20181228 1422) ((emacs (24))) "Pack/unpack files with atool on dired." single ((:commit . "52ce4ac88fa39a0ebdf732435fd831ea9a8d0764") (:keywords "files") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/dired-atool"))])
- (dired-avfs . [(20161012 1104) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "AVFS support for dired" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))])
- (dired-collapse . [(20190515 1210) ((dash (2 10 0)) (f (0 19 0)) (dired-hacks-utils (0 0 1))) "Collapse unique nested paths in dired listing" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-dups . [(20130527 2125) nil "Find duplicate files and display them in a dired buffer" single ((:commit . "694ad128c822c59348ced16c4a0c1356d43da47a") (:keywords "unix") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/dired-dups"))])
- (dired-efap . [(20140122 1656) nil "Edit Filename At Point in a dired buffer" single ((:commit . "624757b2e54d9a13e2183118d6c113e37684b90c") (:keywords "dired" "environment" "files" "renaming") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com") (:url . "https://github.com/juan-leon/dired-efap"))])
- (dired-explorer . [(20180607 221) ((cl-lib (0 5))) "minor-mode provides Explorer like select file at dired." single ((:commit . "3ade0a31b5340271d05e9bf443f2504960f6c6dd") (:keywords "dired" "explorer") (:maintainer "jidaikobo-shibata"))])
- (dired-fdclone . [(20180403 608) nil "dired functions and settings to mimic FDclone" single ((:commit . "903d7a736d240ef7352989a4e5d0ff9129c2ee3c") (:keywords "unix" "directories" "dired") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/dired-fdclone.el"))])
- (dired-filetype-face . [(20180907 1339) nil "Set different faces for different filetypes in dired" single ((:commit . "7ade7f7e8c2d7518c65f3f0343a10c272da0f47e") (:keywords "dired" "filetype" "face") (:authors ("纪秀峰 <jixiuf at gmail dot com>")) (:maintainer "纪秀峰 <jixiuf at gmail dot com>") (:url . "https://github.com/jixiuf/dired-filetype-face"))])
- (dired-filter . [(20191105 1404) ((dash (2 10 0)) (dired-hacks-utils (0 0 1)) (f (0 17 0)) (cl-lib (0 3))) "Ibuffer-like filtering for dired" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-git . [(20200527 732) ((emacs (26 1)) (async-await (1 0)) (async (1 9 4)) (all-the-icons (2 2 0)) (ppp (1 0 0))) "Git integration for dired" single ((:commit . "2b258fa4f0811443e4dbafbc94ea6756062420f6") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/dired-git.el"))])
- (dired-hacks-utils . [(20190522 950) ((dash (2 5 0))) "Utilities and helpers for dired-hacks collection" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-hide-dotfiles . [(20170314 2039) ((emacs (25 1))) "Hide dotfiles in dired" single ((:commit . "b715f643ec805b3b8aca334595e6589320f04a49") (:keywords "files") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com") (:url . "https://github.com/mattiasb/dired-hide-dotfiles"))])
- (dired-icon . [(20170223 526) ((emacs (24 3))) "A minor mode to display a list of associated icons in dired buffers." tar ((:commit . "f60e10757a5011235b519231ad35974ff25963ed") (:keywords "dired" "files") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net") (:url . "https://gitlab.com/xuhdev/dired-icon"))])
- (dired-imenu . [(20140109 1610) nil "imenu binding for dired mode" single ((:commit . "610e21fe0988c85931d34894d3eee2442c79ab0a") (:keywords "dired" "imenu") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "https://github.com/DamienCassou/dired-imenu"))])
- (dired-k . [(20200322 2035) ((emacs (24 3))) "Highlight dired by size, date, git status" tar ((:commit . "1f90cf6ac932ad30ccfefec27ea7e514c24ab335") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/dired-k"))])
- (dired-launch . [(20200430 1625) nil "Use dired as a launcher" single ((:commit . "95a411f6d4bb5eec4ef8fdbba9f038ddf60da81f") (:keywords "dired" "launch") (:authors ("David Thompson")) (:maintainer "David Thompson") (:url . "https://github.com/thomp/dired-launch"))])
- (dired-narrow . [(20181114 1723) ((dash (2 7 0)) (dired-hacks-utils (0 0 1))) "Live-narrowing of search results for dired" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-open . [(20180922 1113) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Open files from dired using using custom actions" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-quick-sort . [(20161208 2112) ((hydra (0 13 0))) "Persistent quick sorting of dired buffers in various ways." single ((:commit . "1845f978d313f750a5b70b832457ed803c4ffbdb") (:keywords "convenience" "files") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net") (:url . "https://gitlab.com/xuhdev/dired-quick-sort#dired-quick-sort"))])
- (dired-rainbow . [(20190722 1109) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Extended file highlighting according to its type" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))])
- (dired-ranger . [(20180401 2206) ((dash (2 7 0)) (dired-hacks-utils (0 0 1))) "Implementation of useful ranger features for dired" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-recent . [(20200712 716) ((emacs (24))) "Dired visited paths history" single ((:commit . "860e70b15983ac7164648de8148a529bdcdb8833") (:keywords "files") (:authors ("Wojciech Siewierski <wojciech dot siewierski at onet dot pl>")) (:maintainer "Wojciech Siewierski <wojciech dot siewierski at onet dot pl>") (:url . "https://github.com/vifon/dired-recent.el"))])
- (dired-rifle . [(20200308 2358) nil "Call rifle(1) from dired" single ((:commit . "99e4110c80d65ca43e2b0ec078e3202995e392d7") (:keywords "files" "convenience") (:authors ("Wojciech Siewierski <wojciech dot siewierski at onet dot pl>")) (:maintainer "Wojciech Siewierski <wojciech dot siewierski at onet dot pl>") (:url . "https://github.com/vifon/dired-rifle.el"))])
- (dired-rmjunk . [(20191007 1232) nil "A home directory cleanup utility for Dired." single ((:commit . "92af5fcc2bd0bc3826f4ce238a850e9a362533a4") (:keywords "files" "matching") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:url . "https://git.sr.ht/~jakob/dired-rmjunk"))])
- (dired-rsync . [(20200308 1150) ((s (1 12 0)) (dash (2 0 0)) (emacs (24))) "Allow rsync from dired buffers" tar ((:commit . "bfd5c155be1cb6b71c83e5f41116c81b6532b6d5") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/dired-rsync"))])
- (dired-sidebar . [(20200711 2031) ((emacs (25 1)) (dired-subtree (0 0 1))) "Tree browser leveraging dired" single ((:commit . "da77919081d9a4e73c2df63542353319381e4f89") (:keywords "dired" "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/dired-sidebar"))])
- (dired-single . [(20200303 1144) nil "Reuse the current dired buffer to visit a directory" single ((:commit . "90ade369ba478fdebf61957f837c0b10cef128b1") (:keywords "dired" "reuse" "buffer") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "crocket" . "crockabiscuit@gmail.com"))])
- (dired-subtree . [(20180922 1615) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Insert subdirectories in a tree-like fashion" single ((:commit . "f49a8bbf95f70671a74a24f7f4de453b2686be46") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (dired-toggle . [(20190616 303) nil "Show dired as sidebar and will not create new buffers when changing dir" single ((:commit . "b694ba91a45d0762bd032ff1bb4109e4c62ca686") (:keywords "dired" "sidebar") (:authors ("Xu FaSheng <fasheng[AT]fasheng.info>")) (:maintainer "Xu FaSheng") (:url . "https://github.com/fasheng/dired-toggle"))])
- (dired-toggle-sudo . [(20200401 1353) nil "Browse directory with sudo privileges." single ((:commit . "13bbe52c54893f5aa3e56228450ffdd0c9e1d169") (:keywords "emacs" "dired") (:authors ("Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>")) (:maintainer "Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>"))])
- (diredfl . [(20191227 2028) ((emacs (24))) "Extra font lock rules for a more colourful dired" single ((:commit . "83567d00affce66a4e501563eddd0bd436ac48d0") (:keywords "faces") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/diredfl"))])
- (diredful . [(20160529 2017) nil "colorful file names in dired buffers" single ((:commit . "c08e163d9d6c62f7b07e94d54c96c2e364e67e0e") (:keywords "dired" "colors" "extension" "widget") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com") (:url . "https://github.com/thamer/diredful"))])
- (direnv . [(20200529 1305) ((emacs (25 1)) (dash (2 12 0))) "Support for direnv" single ((:commit . "f5484b0fc33d4e5116612626294efb362ff9ecd4") (:keywords "direnv" "environment" "processes" "unix" "tools") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-direnv"))])
- (direx . [(20170422 1327) nil "Simple Directory Explorer" tar ((:commit . "a79bfdb5980cf6ed7bfb3b41ddc471a7b6c0ede4") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))])
- (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" single ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/direx-grep"))])
- (dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" single ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))])
- (dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "dirtree integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))])
- (disable-mouse . [(20200304 2159) ((emacs (24 1))) "Disable mouse commands globally" single ((:commit . "a8318f5f21716316053cc092ab9abb43cb681fe0") (:keywords "mouse") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/disable-mouse"))])
- (disaster . [(20171016 2152) nil "Disassemble C/C++ code under cursor in Emacs" single ((:commit . "10a785facc60d89d78e0d5177985ab1af1741bb4") (:keywords "tools") (:authors ("Justine Tunney" . "jtunney@gmail.com")) (:maintainer "Justine Tunney" . "jtunney@gmail.com") (:url . "https://github.com/jart/disaster"))])
- (discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "discourse api" single ((:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:keywords "lisp" "discourse") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/discourse-api"))])
- (discover . [(20140103 2139) ((makey (0 3))) "discover more of Emacs" single ((:commit . "7b0044bbb3b3bd5d811fdfb0f5ac6ec8de1239df") (:authors ("Mickey Petersen" . "mickey@fyeah.org")) (:maintainer "Mickey Petersen" . "mickey@fyeah.org"))])
- (discover-clj-refactor . [(20150328 1459) ((clj-refactor (0 14 0)) (discover (0 3))) "Adds discover context menu for clj-refactor" single ((:commit . "3fbd5c1162739e606d7cf5d4f5d7426547d99647") (:keywords "clj-refactor" "discover" "convenience") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com"))])
- (discover-js2-refactor . [(20140129 1552) ((js2-refactor (20131221 501)) (discover (20140103 1339))) "Adds discover context menu for js2-refactor" single ((:commit . "3812abf61f39f3e73a9f3daefa6fed4f21a429ba") (:keywords "js2-refactor" "discover") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (discover-my-major . [(20180606 511) ((makey (0 2))) "Discover key bindings and their meaning for the current Emacs major mode" single ((:commit . "c592e5e67454f0d1b68669ac0c270073164b16b3") (:keywords "discover" "help" "major-mode" "keys") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://framagit.org/steckerhalter/discover-my-major"))])
- (disk . [(20171116 731) nil "simplified find-file, revert-file, save-buffer interface" single ((:commit . "283e54e3be7d08f959076240b2ab324e25632137") (:keywords "convenience") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Peter Barabas" . "peter.barabas+disk@gmail.com")) (:maintainer "Alex Schroeder" . "alex@gnu.org") (:url . "http://www.emacswiki.org/emacs/DiskKey"))])
- (dispass . [(20140202 1531) ((dash (1 0 0))) "Emacs wrapper for DisPass" single ((:commit . "b6e8f89040ebaaf0e7609b04bc27a8979f0ae861") (:keywords "processes") (:authors ("Tom Willemsen" . "tom@ryuslash.org")) (:maintainer "Tom Willemsen" . "tom@ryuslash.org") (:url . "http://projects.ryuslash.org/dispass.el/"))])
- (display-theme . [(20140115 1556) ((emacs (24))) "display current theme(s) at mode-line" single ((:commit . "b180b3be7a74ae4799a14e7e4bc2fe10e3ff7a15") (:keywords "tools") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/emacs-display-theme/"))])
- (dispwatch . [(20191130 52) ((emacs (24 1))) "Watch displays for configuration changes" single ((:commit . "93aac853215d0902e7a30a6dd2b99d796da77df4") (:keywords "frames") (:authors ("Mitchell Perilstein" . "mitchell.perilstein@gmail.com")) (:maintainer "Mitchell Perilstein" . "mitchell.perilstein@gmail.com") (:url . "https://github.com/mnp/dispwatch"))])
- (dist-file-mode . [(20180830 418) ((emacs (24)) (cl-lib (0 5)) (s (1 9 0))) "Dispatch major mode for *.dist files" single ((:commit . "e1ce8f592bc5d4d86d2f09e334728ac0d524c761") (:keywords "files" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/dist-file-mode.el"))])
- (distel-completion-lib . [(20180827 1344) nil "Completion library for Erlang/Distel" single ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:keywords "erlang" "distel" "completion") (:authors ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:url . "github.com/sebastiw/distel-completion"))])
- (distinguished-theme . [(20151216 2015) nil "A dark and elegant theme for emacs." single ((:commit . "9b1d25ac59465a5016d187ea84b7614c95a29b3b") (:authors ("Kim Silkebækken" . "kim.silkebaekken@gmail.com")) (:maintainer "Kim Silkebækken" . "kim.silkebaekken@gmail.com") (:url . "https://github.com/Lokaltog/distinguished-theme"))])
- (ditz-mode . [(20150729 940) nil "Emacs interface to Ditz issue tracking system" single ((:commit . "74b6b93b097d595a001c019e3b762abfc60f821a") (:keywords "tools") (:authors ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainer "Glenn Hutchings" . "zondo42@gmail.com"))])
- (dix . [(20200108 1057) ((cl-lib (0 5)) (emacs (24 4))) "Apertium XML editing minor mode" tar ((:commit . "391832823f3f9835d957bc0224e122b376e5d825") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "http://wiki.apertium.org/wiki/Emacs"))])
- (dix-evil . [(20170105 1423) ((dix (0 3 0)) (evil (1 0 7))) "optional evil-integration with dix.el" single ((:commit . "391832823f3f9835d957bc0224e122b376e5d825") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "http://wiki.apertium.org/wiki/Emacs"))])
- (dizzee . [(20171201 916) nil "A more pleasant way to manage your project's subprocesses in Emacs." tar ((:commit . "e3cf1c2ea5d0fc00747524b6f3c5b905d0a8c8e1"))])
- (django-commands . [(20191107 1830) ((emacs (25 1))) "Run django commands" single ((:commit . "bef7ca848d6d1721ebb22b181c50dcfbef16e434") (:keywords "tools") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:url . "https://github.com/muffinmad/emacs-django-commands"))])
- (django-manage . [(20160819 212) ((hydra (0 13 2))) "Django minor mode for commanding manage.py" single ((:commit . "876fb2cb627d465adfdc905841279784bcdd7ee8") (:keywords "languages") (:authors ("Daniel Gopar" . "gopardaniel@yahoo.com")) (:maintainer "Daniel Gopar" . "gopardaniel@yahoo.com"))])
- (django-mode . [(20170522 714) ((projectile (0)) (s (0)) (helm-make (0))) "Major mode for Django web framework." tar ((:commit . "a71b8dd984e7f724b8321246e5c353a4ae5c986e") (:keywords "languages") (:authors ("Greg V" . "floatboth@me.com")) (:maintainer "Greg V" . "floatboth@me.com"))])
- (django-snippets . [(20131229 1611) ((yasnippet (0 8 0))) "Yasnippets for django" tar ((:commit . "a71b8dd984e7f724b8321246e5c353a4ae5c986e") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/myfreeweb/django-mode"))])
- (django-theme . [(20131022 902) nil "Custom face theme for Emacs" single ((:commit . "86c8142b3eb1addd94a43aa6f1d98dab06401af0") (:authors ("Andrzej Sliwa")) (:maintainer "Andrzej Sliwa") (:url . "http://github/anrzejsliwa/django-theme"))])
- (djangonaut . [(20200503 921) ((emacs (25 2)) (magit-popup (2 6 0)) (pythonic (0 1 0)) (f (0 20 0)) (s (1 12 0))) "Minor mode to interact with Django projects" single ((:commit . "75f642114e3997308a1e7e67c3025738cecee0fe") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/djangonaut"))])
- (djinni-mode . [(20190303 139) ((emacs (24 4))) "Major-mode for editing Djinni files." single ((:commit . "6f84bc60d078725cc8b922a259ec5f4c7de83681") (:keywords "languages") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:url . "https://github.com/danielmartin/djinni-mode"))])
- (dkdo . [(20131110 1119) ((dkmisc (0 50)) (emacs (24 1))) "Do List major mode based on org-mode." tar ((:commit . "fd6bb105e8331fafb6385c5238c988c4c5bbe2da"))])
- (dkl . [(20161005 7) nil "Display keyboard layout." tar ((:commit . "6b4584f86037bda3383960c678d51f340229fb91") (:keywords "input" "keyboard" "layout") (:authors ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:url . "https://github.com/flexibeast/dkl"))])
- (dklrt . [(20131110 1341) ((dkmisc (0 50)) (ledger-mode (20130908 1357)) (emacs (24 1))) "Ledger Recurring Transactions." tar ((:commit . "5d6c99f8018335256ab934b4c1049708ae2d48ba"))])
- (dkmisc . [(20131110 1115) ((emacs (24 1))) "Miscellaneous functions required by dk* packages." tar ((:commit . "fe3d49c6f8322b6f89466361acd97585bdfe0608"))])
- (dmacro . [(20200708 2333) ((emacs (24 1)) (cl-lib (0 6))) "Repeated detection and execution of key operation" single ((:commit . "0be5a16b0612b169eb63b5377969dd87dfc7be1a") (:keywords "convenience") (:authors ("Toshiyuki Masui" . "masui@ptiecan.com") ("Makoto Owada") ("Eiji Obata") ("Nobuyuki Mine")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-jp/dmacro"))])
- (dmenu . [(20190908 44) ((cl-lib (0 5))) "simulate the dmenu command line program" single ((:commit . "e8cc9b27c79d3ecc252267c082ab8e9c82eab264") (:keywords "convenience" "usability") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (dna-mode . [(20191001 2108) nil "a major mode for editing dna sequences" tar ((:commit . "7a48393fcf0015eed2368fcb89b3091c9d029dc4") (:keywords "dna" "emacs" "editing") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Harley Gorrell" . "harley@panix.com") (:url . "http://www.mahalito.net/~harley/elisp/dna-mode.el"))])
- (docbook-snippets . [(20150714 1625) ((yasnippet (0 8 0))) "Yasnippets for DocBook" tar ((:commit . "b06297fdec039a541aaa6312cb328a11062cfab4") (:keywords "snippets" "docbook") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:url . "https://github.com/jhradilek/emacs-docbook-snippets"))])
- (docean . [(20180605 1744) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "Interact with DigitalOcean from Emacs." single ((:commit . "bbe2298fd21f7876fc2d5c52a69b931ff59df979") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/docean.el"))])
- (docker . [(20200610 715) ((dash (2 14 1)) (docker-tramp (0 1)) (emacs (24 5)) (json-mode (1 7 0)) (s (1 12 0)) (tablist (0 70)) (transient (0 2 0))) "Emacs interface to Docker" tar ((:commit . "3773112eea3fc99704b5ca50c1e9a3db2cb8e4f3") (:keywords "filename" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/docker.el"))])
- (docker-api . [(20160525 720) ((dash (2 12 1)) (request (0 2 0)) (s (1 11 0))) "Emacs interface to the Docker API" tar ((:commit . "206144346b7fa4165223349cfeb64a75d47ddd1b") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/docker-api.el"))])
- (docker-cli . [(20190524 1624) nil "Running various commands in docker containers" single ((:commit . "c4b02894466d8642ad3d49df4c4a80e023a672aa") (:keywords "processes") (:authors ("Boško Ivanišević" . "bosko.ivanisevic@gmail.com")) (:maintainer "Boško Ivanišević" . "bosko.ivanisevic@gmail.com") (:url . "https://github.com/bosko/docker-cli"))])
- (docker-compose-mode . [(20200730 1258) ((emacs (24 3)) (dash (2 12 0)) (yaml-mode (0 0 12))) "Major mode for editing docker-compose files" single ((:commit . "4c0c897fb0572e6b026b2a5ab9f2c76174be7a14") (:keywords "convenience") (:authors ("Ricardo Martins")) (:maintainer "Ricardo Martins") (:url . "https://github.com/meqif/docker-compose-mode"))])
- (docker-tramp . [(20170207 325) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for docker containers" tar ((:commit . "8e2b671eff7a81af43b76d9dfcf94ddaa8333a23") (:keywords "docker" "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/docker-tramp.el"))])
- (dockerfile-mode . [(20200106 2126) ((emacs (24)) (s (1 12))) "Major mode for editing Docker's Dockerfiles" single ((:commit . "d31f7685ebc5832d957e25070a930aa42984327d") (:url . "https://github.com/spotify/dockerfile-mode"))])
- (doct . [(20200729 1659) ((emacs (25 1))) "DOCT: Declarative Org capture templates" single ((:commit . "e46443d2a721a3f6cb566595d78baf78a80d4a8e") (:keywords "org" "convenience") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:url . "https://github.com/progfolio/doct"))])
- (dokuwiki . [(20180102 59) ((emacs (24 3)) (xml-rpc (1 6 8))) "Edit Remote DokuWiki Pages Using XML-RPC" single ((:commit . "594c4d4904dcc2796bbbd2c0845d9e7c09ccf6f7") (:keywords "convenience") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com") (:url . "http://www.github.com/accidentalrebel/emacs-dokuwiki"))])
- (dokuwiki-mode . [(20170223 1301) nil "Major mode for DokuWiki document" single ((:commit . "e4e116f6fcc373e3f5937c1a7daa5c2c9c6d3fa1") (:keywords "hypermedia" "text" "dokuwiki") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com") (:url . "https://github.com/kai2nenobu/emacs-dokuwiki-mode"))])
- (dollaro . [(20151123 1302) ((s (1 6 0))) "simple text templates" single ((:commit . "500127f0172ac7a1eec627e026b59136580a74ac") (:keywords "tools" "convenience") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))])
- (doneburn-theme . [(20181110 1857) nil "A light theme based on Bozhidar Batsov's Zenburn" single ((:commit . "da4fa915a2a659001eea04498d790cdd8cac1fce") (:keywords "faces" "themes") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:url . "http://github.com/manuel-uberti/doneburn-emacs"))])
- (doom . [(20180301 2308) ((cl-lib (0 5))) "DOM implementation and manipulation library" single ((:commit . "e59040aefc92dd9b3134eb623624307fb9e4327b") (:keywords "xml" "dom") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Henrik.Motakef" . "elisp@henrik-motakef.de") ("Katherine Whitlock" . "toroidal-code@gmail.com") ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Alex Schroeder") (:url . "http://www.github.com/kensanata/doom.el/"))])
- (doom-modeline . [(20200730 1735) ((emacs (25 1)) (all-the-icons (2 2 0)) (shrink-path (0 2 0)) (dash (2 11 0))) "A minimal and modern mode-line" tar ((:commit . "a846653ae617d0a2d1a1b29b5d83e821f3859813") (:keywords "faces" "mode-line") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:url . "https://github.com/seagle0128/doom-modeline"))])
- (doom-themes . [(20200731 517) ((emacs (25 1)) (cl-lib (0 5))) "an opinionated pack of modern color-themes" tar ((:commit . "2c71a9fe4edcdcd8844e60c6cddc5faf954dfc72") (:keywords "dark" "light" "blue" "atom" "one" "theme" "neotree" "icons" "faces" "nova") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-doom-theme"))])
- (dot-mode . [(20180312 2300) ((emacs (24 3))) "minor mode to repeat typing or commands" single ((:commit . "6ca22b73bcdae2363ee9641b822a60685df16a3e") (:keywords "convenience") (:authors ("Robert Wyrick" . "rob@wyrick.org")) (:maintainer "Robert Wyrick" . "rob@wyrick.org") (:url . "https://github.com/wyrickre/dot-mode"))])
- (dotenv-mode . [(20191027 2129) ((emacs (24 3))) "Major mode for .env files" single ((:commit . "e3701bf739bde44f6484eb7753deadaf691b73fb") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-dotenv-mode"))])
- (dotnet . [(20190415 1237) nil "Interact with dotnet CLI tool" single ((:commit . "932d776ed739d20d57dbd6ba49f61d1b450571fc") (:keywords ".net" "tools") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu") (:url . "https://github.com/julienXX/dotnet.el"))])
- (double-saber . [(20190325 1917) ((emacs (24 4))) "Narrow and delete in search buffers." single ((:commit . "b61df3561ea9bed1848cf69b6bb53f7fdf6916dc") (:keywords "double-saber" "narrow" "delete" "sort" "tools" "convenience" "matching") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com") (:url . "https://github.com/dp12/double-saber.git"))])
- (download-region . [(20180124 133) ((cl-lib (0 3))) "Simple in-buffer download manager" single ((:commit . "bbba3ecd80818d5d940d41fe89a6e2ec5dd2c53c") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (downplay-mode . [(20151125 2009) nil "focus attention on a region of the buffer" single ((:commit . "4a2c3addc73c8ca3816345c3c11c08af265baedb") (:authors ("Toby Crawley" . "toby@tcrawley.org")) (:maintainer "Toby Crawley" . "toby@tcrawley.org") (:url . "https://github.com/tobias/downplay-mode/"))])
- (dpaste . [(20160303 2112) nil "Emacs integration for dpaste.com" single ((:commit . "5ebabb466a6ae70882549855b6b2194fc32189f8") (:keywords "paste" "pastie" "pastebin" "dpaste" "python") (:authors ("Greg Newman" . "greg@gregnewman.org") ("Guilherme Gondim" . "semente@taurinus.org")) (:maintainer "Greg Newman" . "greg@gregnewman.org"))])
- (dpaste_de . [(20131015 1225) ((web (0 3 7))) "Emacs mode to paste to dpaste.de" single ((:commit . "f0c39e8864299f735642f7d9fa490689398ce39d") (:keywords "pastebin") (:authors ("Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com")) (:maintainer "Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com"))])
- (dpkg-dev-el . [(20190824 2314) ((debian-el (37))) "Emacs modes for debian packaging" tar ((:commit . "aafb047e03c642e6ae4740a7fbc0a789e0ec1291"))])
- (dr-racket-like-unicode . [(20200513 1642) ((emacs (24 1))) "DrRacket-style unicode input" single ((:commit . "70bc1caea6b277e49e1cb29e1926a7b0c83c5ebc") (:keywords "i18n" "tools") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk"))])
- (dracula-theme . [(20200527 1834) ((emacs (24 3))) "Dracula Theme" tar ((:commit . "f98f9bd54e965e8676ee15ce8b4ecbeae01341ed") (:authors ("film42")) (:maintainer "film42") (:url . "https://github.com/dracula/emacs"))])
- (draft-mode . [(20140609 1456) nil "Rough drafting for Emacs." single ((:commit . "4779fb32daf53746459da2def7e08004492d4f18") (:keywords "draft" "drafting") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st") (:url . "https://github.com/gaudecker/draft-mode"))])
- (drag-stuff . [(20161108 749) nil "Drag stuff (lines, words, region, etc...) around" tar ((:commit . "6d06d846cd37c052d79acd0f372c13006aa7e7c8"))])
- (drawille . [(20160418 1838) ((cl-lib (0 5))) "Drawille implementation in elisp" tar ((:commit . "d914845725719d8293e2f0dea3c9c7e0a1e0e62a") (:keywords "graphics") (:authors ("Josuah Demangeon" . "josuah.demangeon@gmail.com")) (:maintainer "Josuah Demangeon" . "josuah.demangeon@gmail.com") (:url . "https://github.com/sshbio/elisp-drawille"))])
- (drill-instructor-AZIK-force . [(20151123 514) ((popup (0 5))) "Support AZIK input" tar ((:commit . "008cea202dc31d7d6fb1e7d8e6334d516403b7a5"))])
- (drone . [(20161106 918) nil "Launch your drone test suite if drone.yml is present" single ((:commit . "1d4ee037ad3208847a4235426edf0c4a3e7b1899") (:keywords "drone" "tests" "ci") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:url . "https://github.com/olymk2/emacs-drone"))])
- (dropbox . [(20190918 1629) ((request (0 3 0)) (json (1 2)) (oauth (1 0 3))) "Emacs backend for dropbox" single ((:commit . "5e0c954a6b819fd3a22b463cce3825984f9ef691") (:keywords "dropbox") (:authors ("Pavel Panchekha" . "me@pavpanchekha.com")) (:maintainer "Pavel Panchekha" . "me@pavpanchekha.com"))])
- (drupal-mode . [(20200210 2222) ((php-mode (1 5 0))) "Advanced minor mode for Drupal development" tar ((:commit . "ee1a24c96a7487bb9df8dd15656be7d8330028f0") (:keywords "programming" "php" "drupal") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:url . "https://github.com/arnested/drupal-mode"))])
- (drupal-spell . [(20130520 1655) nil "Aspell extra dictionary for Drupal" tar ((:commit . "4087c28c89a884ee050961c57166e6b09085f59d") (:keywords "wp") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:url . "https://github.com/arnested/drupal-spell"))])
- (dsvn . [(20190316 2201) nil "Subversion interface" single ((:commit . "c37d2412ba92aad647bcf5aeb151e620e8069f8d") (:keywords "docs") (:authors ("David Kågedal" . "davidk@lysator.liu.se") (" Mattias Engdegård" . "mattiase@acm.org")) (:maintainer "Mattias Engdegård" . "mattiase@acm.org"))])
- (dtk . [(20200617 1611) ((emacs (24 4)) (cl-lib (0 6 1)) (dash (2 12 0)) (seq (1 9)) (s (1 9))) "access SWORD content via diatheke" single ((:commit . "8a69a2037e1e5c6c1a4247c198a59bdbbb090784") (:keywords "hypermedia") (:authors ("David Thompson")) (:maintainer "David Thompson") (:url . "https://github.com/dtk01/dtk.el"))])
- (dtrace-script-mode . [(20150214 623) nil "DTrace code editing commands for Emacs" single ((:commit . "801af1ef16075d31a19830ebb8404bbf3a322f10"))])
- (dtrt-indent . [(20200430 1023) nil "Adapt to foreign indentation offsets" tar ((:commit . "50c440c80e0d15303d8ab543bce4c56e9c2bf407") (:keywords "convenience" "files" "languages" "c") (:authors ("Julian Scheid" . "julians37@googlemail.com")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org"))])
- (dts-mode . [(20161103 1223) nil "Major mode for Devicetree source code" single ((:commit . "9ee0854446dcc6c53d2b8d2941051768dba50344") (:keywords "languages") (:authors ("Ben Gamari" . "ben@smart-cactus.org")) (:maintainer "Ben Gamari" . "ben@smart-cactus.org"))])
- (ducpel . [(20140702 1154) ((cl-lib (0 5))) "Logic game with sokoban elements" tar ((:commit . "b53b935ab95c02b82ccf38f63c89e39e99477a55") (:keywords "games") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/ducpel"))])
- (dumb-diff . [(20171211 2122) ((emacs (24 3))) "fast arbitrary diffs" single ((:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:keywords "programming" "diff") (:authors ("jack angers")) (:maintainer "jack angers"))])
- (dumb-jump . [(20200730 1839) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 40+ languages without configuration" single ((:commit . "254fe568738df22a51054a558d3d5b91c74b9e89") (:keywords "programming") (:authors ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:url . "https://github.com/jacktasia/dumb-jump"))])
- (dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" single ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:keywords "dummyparens" "auto-pair" "wrapping") (:authors ("Sergei Nosov <sergei.nosov [at] gmail.com>")) (:maintainer "Sergei Nosov <sergei.nosov [at] gmail.com>") (:url . "https://github.com/snosov1/dummyparens"))])
- (dune . [(20191016 1241) nil "Integration with the dune build system" tar ((:commit . "66cfb3a2fb5a507f8c58e0ca516bfa20ca14d544") (:url . "https://github.com/ocaml/dune"))])
- (duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" single ((:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:keywords "convenience" "command" "duplicate" "line" "selection") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:url . "https://github.com/ongaeshi/duplicate-thing"))])
- (dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" single ((:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:keywords "languages" "gut") (:authors ("The dut-mode Authors")) (:maintainer "The dut-mode Authors") (:url . "https://github.com/dut-lang/dut-mode"))])
- (dyalog-mode . [(20200708 1105) ((cl-lib (0 2)) (emacs (24 1))) "Major mode for editing Dyalog APL source code" tar ((:commit . "c675f7ac81b51f9b722570c2e6b4525128a2f006") (:keywords "languages") (:authors ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainer "Joakim Hårsman" . "joakim.harsman@gmail.com") (:url . "https://github.com/harsman/dyalog-mode.git"))])
- (dylan-mode . [(20200607 1911) nil "Major mode for the Dylan programming language. http://opendylan.org" tar ((:commit . "bdccb252dffa99a3a55dce446cc4a7ff4a8dc089") (:authors ("Robert Stockton" . "rgs@cs.cmu.edu")) (:maintainer "Chris Page" . "cpage@opendylan.org"))])
- (dynamic-fonts . [(20140731 1226) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" single ((:commit . "ab0c65accbdb59acaed5b263327e22ec019b3e82") (:keywords "faces" "frames") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/dynamic-fonts"))])
- (dynamic-ruler . [(20160602 808) nil "Displays a dynamic ruler at point." single ((:commit . "c9c0de6fe5721f06b50e01d9b4684b519c71b367") (:keywords "ruler" "tools" "convenience") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://rocher.github.io/dynamic-ruler"))])
- (dynamic-spaces . [(20171027 1851) nil "When editing, don't move text separated by spaces" single ((:commit . "97ae8480c257ba573ca3d06dbf602f9b23c41d38") (:keywords "convenience") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/dynamic-spaces"))])
- (e2ansi . [(20190517 1902) ((face-explorer (0 0 4))) "Syntax highlighting support for `less', powered by Emacs." tar ((:commit . "6e1bb4e4e27885d1786db08b091cfa13b184fb54") (:keywords "faces" "languages") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/e2ansi"))])
- (e2wm . [(20170215 36) ((window-layout (1 4))) "simple window manager for emacs" tar ((:commit . "4353d3394c77a49f8f0291c239858c8c5e877549") (:keywords "tools" "window manager") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>"))])
- (e2wm-R . [(20151230 926) ((e2wm (1 3)) (inlineR (1 0)) (ess (15 3))) "some e2wm plugin and perspective for GNU R" single ((:commit . "4350601ee1a96bf89777b3f09f1b79b88e2e6e4d") (:keywords "convenience" "e2wm") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/e2wm-R.el"))])
- (e2wm-bookmark . [(20151123 521) ((e2wm (1 2))) "Bookmark plugin for e2wm.el" single ((:commit . "bad816b6d8049984d69bcd277b7d325fb84d55eb") (:keywords "convenience") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda <yuhei.maeda_at_gmail.com>"))])
- (e2wm-direx . [(20170509 1301) ((e2wm (1 2)) (direx (0 1 -3))) "Plugin of e2wm.el for direx.el" single ((:commit . "b47f19d15436cc28233a812a1150689f61d11046") (:keywords "tools" "window manager" "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/e2wm-direx"))])
- (e2wm-pkgex4pl . [(20140525 1047) ((e2wm (1 2)) (plsense-direx (0 2 0))) "Plugin of e2wm.el for package explorer of Perl" single ((:commit . "7ea994450727190c4f3cb46cb429ba41b692ecc0") (:keywords "tools" "window manager" "perl") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/e2wm-pkgex4pl"))])
- (e2wm-svg-clock . [(20150106 1306) ((e2wm (20130225 1602)) (svg-clock (0 4))) "e2wm plugin for svg-clock" single ((:commit . "d425925e3afffcbe2ff74edc80b714e4319d4c94") (:keywords "convenience" "e2wm") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda") (:url . "https://github.com/myuhe/e2wm-svg-clock.el"))])
- (e2wm-sww . [(20140524 858) ((e2wm (1 2))) "Plugin of e2wm.el to switch plugin quickly" single ((:commit . "1063f9854bd34db5ac771cd1036cecc89834729d") (:keywords "tools" "window manager") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/e2wm-sww"))])
- (e2wm-term . [(20200322 729) ((e2wm (1 2)) (log4e (0 2 0)) (yaxception (0 3 2))) "Perspective of e2wm.el for work in terminal" single ((:commit . "74362d6271e736272df32ea807c5a22e4df54a50") (:keywords "tools" "window manager") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/e2wm-term"))])
- (eacl . [(20200612 736) ((emacs (24 4)) (ivy (0 9 1))) "Auto-complete lines by grepping project" single ((:commit . "0517e60d8d36838df1a90498f2d75ded814d75e4") (:keywords "abbrev" "convenience" "matching") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/eacl"))])
- (easy-after-load . [(20170817 1231) nil "eval-after-load for all files in a directory" single ((:commit . "29e20145da49ac9ea40463c552130777408040de") (:authors ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/easy-after-load"))])
- (easy-escape . [(20161209 1544) nil "Improve readability of escape characters in regular expressions" single ((:commit . "a6449f22cb97160ee1c90121968de89e193268df") (:keywords "convenience" "lisp" "tools") (:authors ("Clément Pit--Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit--Claudel" . "clement.pitclaudel@live.com") (:url . "https://github.com/cpitclaudel/easy-escape"))])
- (easy-hugo . [(20200427 1901) ((emacs (25 1)) (popup (0 5 3)) (request (0 3 0))) "Write blogs made with hugo by markdown or org-mode" single ((:commit . "2dfdcdbcd8eb81c3fd631372d7dceb4f432d5f1e") (:authors ("Masashi Miyaura")) (:maintainer "Masashi Miyaura") (:url . "https://github.com/masasam/emacs-easy-hugo"))])
- (easy-jekyll . [(20200506 117) ((emacs (25 1)) (request (0 3 0))) "Major mode managing jekyll blogs" single ((:commit . "d114ed4ef4470ea429d2dd291a409bc406d0dda0") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-easy-jekyll"))])
- (easy-kill . [(20181114 2330) ((emacs (24)) (cl-lib (0 5))) "kill & mark things easily" single ((:commit . "2a6309d98aa6b71df6bbbcdf15cab3187c521a6b") (:keywords "killing" "convenience") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com") (:url . "https://github.com/leoliu/easy-kill"))])
- (easy-kill-extras . [(20180920 1334) ((easy-kill (0 9 4))) "Extra functions for easy-kill." tar ((:commit . "b8ce8350cc86e0229f195082557970cd51def960") (:keywords "killing" "convenience") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/easy-kill-extras.el"))])
- (easy-repeat . [(20150516 848) ((emacs (24 4))) "Repeat easily" single ((:commit . "060f0e6801c82c40c06961dc0528a00e18947a8c") (:keywords "repeat" "convenience") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/easy-repeat.el"))])
- (ebf . [(20160211 1758) ((dash (2 11 0)) (dash-functional (1 2 0)) (cl-lib (0 5))) "brainfuck language transpiler to Emacs Lisp" tar ((:commit . "4cd9c26354d8be6571354b2954d21fba882e78a2") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/ebf"))])
- (ebib . [(20200628 2157) ((parsebib (2 3)) (emacs (25 1))) "a BibTeX database manager" tar ((:commit . "805c2e30e30f9f211f4aa443263d1c3971935295") (:keywords "text" "bibtex") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "http://joostkremers.github.io/ebib/"))])
- (ebuku . [(20200427 1143) ((emacs (25 1))) "Interface to the buku Web bookmark manager" single ((:commit . "9e1878810eaaaa55885d4cbcd6968566e4e3f7a8") (:keywords "bookmarks" "buku" "data" "web" "www") (:authors ("Alexis <flexibeast@gmail.com>, Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:url . "https://github.com/flexibeast/ebuku"))])
- (ecb . [(20170728 1921) nil "a code browser for Emacs" tar ((:commit . "1330a44cf3c171781083b0b926ab7622f64e6e81") (:keywords "browser" "code" "programming" "tools") (:authors ("Jesper Nordenberg" . "mayhem@home.se") ("Klaus Berndl" . "klaus.berndl@sdm.de") ("Kevin A. Burton" . "burton@openprivacy.org")) (:maintainer "Klaus Berndl" . "klaus.berndl@sdm.de"))])
- (eclim . [(20181108 1134) ((dash (2 11 0)) (json (1 2)) (popup (0 5 2)) (s (1 9 0)) (cl-lib (0 5)) (yasnippet (0 10 0))) "An interface to the Eclipse IDE." tar ((:commit . "222ddd48fcf0ee01592dec77c58e0cf3f2ea1100"))])
- (eclipse-theme . [(20191113 1518) nil "Theme based on Eclipse circa 2010" single ((:commit . "dcf97865512ed450f9d5137c1a05e12edb5b7f80") (:keywords "themes") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/eclipse-theme"))])
- (ecukes . [(20190822 2127) ((commander (0 6 1)) (espuds (0 2 2)) (ansi (0 3 0)) (dash (2 2 0)) (s (1 8 0)) (f (0 11 0))) "Cucumber for Emacs." tar ((:commit . "d835ce619a8f0057a133c08060af4b026e1c9359"))])
- (edbi . [(20160225 141) ((concurrent (0 3 1)) (ctable (0 1 2)) (epc (0 1 1))) "Emacs Database Interface" tar ((:commit . "6f50aaf4bde75255221f2292c7a4ad3fa9d918c0"))])
- (ede-compdb . [(20150920 2033) ((ede (1 2)) (semantic (2 2)) (cl-lib (0 4))) "Support for compilation database projects in EDE" single ((:commit . "d6d8466cd62876fc90adeff5875a1a584fd846cd") (:keywords "development" "ninja" "build" "cedet" "ede") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net"))])
- (ede-php-autoload . [(20180901 1255) nil "Simple EDE PHP Project" tar ((:commit . "8a4eeeaa93b8d87b65a107c4ebcbeb14528d9449") (:keywords "php" "project" "ede") (:authors ("Steven Rémot" . "steven.remot@gmail.com") ("original code for C++ by Eric M. Ludlam" . "eric@siege-engine.com")) (:maintainer "Steven Rémot" . "steven.remot@gmail.com") (:url . "https://github.com/emacs-php/ede-php-autoload"))])
- (ede-php-autoload-composer-installers . [(20170221 2026) ((ede-php-autoload (1 0 0)) (f (0 19 0)) (s (1 7 0))) "Composer installers support for ede-php-autoload" single ((:commit . "7840439802c7d11ee086bbf465657f3da12f9f66") (:keywords "programming" "php") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:url . "https://github.com/xendk/ede-php-autoload-composer-installers"))])
- (ede-php-autoload-drupal . [(20170316 2158) ((ede-php-autoload (1 0 0)) (f (0 19 0)) (s (1 7 0))) "Drupal support for ede-php-autoload" single ((:commit . "54a04241d94fabc4f4d16ae4dc8ba4f0c6e3b435") (:keywords "programming" "php" "drupal") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk"))])
- (edebug-x . [(20130616 625) nil "Extensions for Edebug" single ((:commit . "a2c2c42553d3bcbd5ac11898554865acbed1bc46") (:keywords "extensions") (:authors ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainer "Scott Barnett" . "scott.n.barnett@gmail.com") (:url . "https://github.com/ScottyB/edebug-x"))])
- (edit-at-point . [(20191013 1218) nil "edit(copy,cut..) current things(word,symbol..) under cursor" single ((:commit . "28c85a65c9c61f2aff50bc5e93f61cde26a5d9c0") (:authors (nil . "<e.enoson@gmail.com>")) (:maintainer nil . "<e.enoson@gmail.com>") (:url . "http://github.com/enoson/edit-at-point.el"))])
- (edit-chrome-textarea . [(20200324 1513) ((emacs (25 1)) (websocket (1 4))) "Edit Chrome Textarea" single ((:commit . "e9ef6a72bdc6b58f932c51aa161869cee11b4bc9") (:keywords "tools") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/edit-chrome-textarea.el"))])
- (edit-color-stamp . [(20130529 1733) ((es-lib (0 2)) (cl-lib (1 0))) "Edit a hex color stamp, using a QT or the internal color picker" tar ((:commit . "32dc1ca5bcf3dcf83fad5e39b55dc5b77becb3d3") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/edit-color-stamp"))])
- (edit-indirect . [(20191103 1013) ((emacs (24 3))) "Edit regions in separate buffers" single ((:commit . "935ded353b9ed3da67bc61abf245c21b58d88864") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/edit-indirect"))])
- (edit-indirect-region-latex . [(20161129 645) ((emacs (24 3)) (ht (2 2)) (edit-indirect (0 1 4))) "Edit LaTeX regions in separate buffers, e.g. for English grammar checks" single ((:commit . "05043f2c0c9838947d3ca4b51b695deb7c47612e") (:authors ("Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com")) (:maintainer "Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com") (:url . "https://github.com/niitsuma/edit-indirect-region-latex"))])
- (edit-list . [(20100930 1443) nil "edit a single list" single ((:commit . "f460d3f9e208a4e606fe6ded307f1b011916ca71") (:authors ("Michael Olson" . "mwolson@gnu.org")) (:maintainer "Michael Olson" . "mwolson@gnu.org") (:url . "http://mwolson.org/static/dist/elisp/edit-list.el"))])
- (edit-server . [(20181016 1125) nil "server that responds to edit requests from Chrome" single ((:commit . "5f6352f98f9795ea0423cb46e9b01dc54e523ab1") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs_chrome"))])
- (edit-server-htmlize . [(20130329 2248) ((edit-server (1 9))) "(de)HTMLization hooks for edit-server.el" single ((:commit . "e7f8dadfabe869c77ca241cd6fbd4c52bd908392") (:authors ("Roland McGrath" . "roland@hack.frob.com")) (:maintainer "Roland McGrath" . "roland@hack.frob.com") (:url . "https://github.com/frobtech/edit-server-htmlize"))])
- (editorconfig . [(20200730 1329) ((cl-lib (0 5)) (emacs (24))) "EditorConfig Emacs Plugin" tar ((:commit . "9bc1343ce8bd2cc84bf04b58a053b7ec700244c0") (:authors ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainer "EditorConfig Team" . "editorconfig@googlegroups.com") (:url . "https://github.com/editorconfig/editorconfig-emacs#readme"))])
- (editorconfig-charset-extras . [(20180223 457) ((editorconfig (0 6 0))) "Extra EditorConfig Charset Support" single ((:commit . "4f75e175ad15ce2038f926fe4f0e5a0c1d0cbc46") (:keywords "tools") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:url . "https://github.com/10sr/editorconfig-charset-extras-el"))])
- (editorconfig-custom-majormode . [(20180816 244) ((editorconfig (0 6 0))) "Decide major-mode and mmm-mode from EditorConfig" single ((:commit . "13ad1c83f847bedd4b3a19f9df7fd925853b19de") (:keywords "editorconfig" "util") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/editorconfig-custom-majormode-el"))])
- (editorconfig-domain-specific . [(20180505 924) ((cl-lib (0 5)) (editorconfig (0 6 0))) "Apply brace style and other \"domain-specific\" EditorConfig properties" single ((:commit . "e9824160fb2e466afa755240ee3ab7cc5657fb04") (:keywords "editorconfig" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/editorconfig-emacs-domain-specific"))])
- (editorconfig-generate . [(20190513 433) ((emacs (24))) "Generate .editorconfig" single ((:commit . "47a31f928f46d2a0188db8e2cffa5d6354a81573") (:keywords "tools") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:url . "https://github.com/10sr/editorconfig-generate-el"))])
- (edn . [(20160215 1219) ((cl-lib (0 3)) (emacs (24 1)) (peg (0 6))) "Support for reading and writing the edn data format from elisp" single ((:commit . "be9e32d1b49e35247b263b0243df7cfdc8d413ab") (:keywords "edn" "clojure") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:url . "https://www.github.com/expez/edn.el"))])
- (edts . [(20200710 1424) ((auto-complete (20170125 245)) (auto-highlight-symbol (20130313 943)) (dash (20190814 2006)) (erlang (20190404 928)) (f (20190109 906)) (popup (20160709 1429)) (s (20180406 808))) "Erlang Development Tool Suite" tar ((:commit . "eda93f89c198db6aa3590d8e812ed797c9b3e305"))])
- (edwina . [(20200113 1714) ((emacs (25))) "Dynamic window manager" tar ((:commit . "c5368716a504c93407fd8cb4ef925a8d8eb62698") (:keywords "convenience") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com") (:url . "https://github.com/ajgrf/edwina"))])
- (efire . [(20151009 2031) ((circe (1 2))) "Use campfire from Emacs" single ((:commit . "91a644662afb352475efad0b377713656f131e5c") (:keywords "convenience" "tools") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/capitaomorte/efire"))])
- (eg . [(20170830 815) ((cl-lib (0 5)) (emacs (24 3))) "Norton Guide reader" single ((:commit . "1c7f1613d2aaae728ef540305f6ba030616f86bd") (:keywords "docs") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/eg.el"))])
- (egalgo . [(20190706 1611) ((dash (2 14)) (emacs (24))) "Genetic algorithm for Emacs" single ((:commit . "e683b16ed4265ddb46efcc8cbf9503301cc39e22") (:keywords "data") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:url . "https://github.com/ROCKTAKEY/egalgo"))])
- (egg . [(20181126 500) nil "Emacs Got Git - Emacs interface to Git" tar ((:commit . "00e768a78ac3d25f457eed667d02cac568480bf9") (:keywords "git" "version control" "release management") (:authors ("Bogolisk" . "bogolisk@gmail.com")) (:maintainer "Bogolisk" . "bogolisk@gmail.com"))])
- (egg-timer . [(20200217 1650) ((emacs (25 1))) "Commonly used intervals for setting timers while working" single ((:commit . "e3542aeb80905956b94373a222a9cbac04e6497e") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/egg-timer.el"))])
- (egison-mode . [(20200107 2333) nil "Egison editing mode" tar ((:commit . "7ad49f19ca8814dc5a1dc6b214ad9346ec9e1ca3") (:authors ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainer "Satoshi Egi" . "egisatoshi@gmail.com") (:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el"))])
- (eglot . [(20200727 911) ((emacs (26 1)) (jsonrpc (1 0 9)) (flymake (1 0 9)) (project (0 3 0)) (xref (1 0 1)) (eldoc (1 5 0))) "Client for Language Server Protocol (LSP) servers" single ((:commit . "fb6b17e86eddc22b9ec81f52718fad6bcbb53668") (:keywords "convenience" "languages") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/joaotavora/eglot"))])
- (eglot-jl . [(20200726 741) ((emacs (25 1)) (eglot (1 4)) (julia-mode (0 3))) "Julia support for eglot" tar ((:commit . "84cff9d6ef1643f3eac6c9d620cc1e380a9847d9") (:keywords "convenience" "languages") (:authors ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:url . "https://github.com/non-Jedi/eglot-jl"))])
- (ego . [(20180301 104) ((emacs (24 5)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (simple-httpd (1 4 5))) "a static site generator based on org mode, forked from org-page." tar ((:commit . "719809679c1a60887735db41abae53b61f08ef59"))])
- (eide . [(20200702 2009) nil "IDE interface" tar ((:commit . "b1dfdaf06b00409250135cb1000beac60c7f659b"))])
- (eimp . [(20120826 2039) nil "Emacs Image Manipulation Package" single ((:commit . "2e7536fe6d8f7faf1bad7a8ae37faba0162c3b4f") (:keywords "files" "frames") (:authors ("Matthew P. Hodges" . "MPHodges@member.fsf.org")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (ein . [(20200712 24) ((emacs (25)) (websocket (20190620)) (anaphora (20180618)) (request (20200117)) (deferred (0 5)) (polymode (20190714)) (exec-path-from-shell (20191229)) (dash (2 13 0)) (with-editor (20200522))) "Emacs IPython Notebook" tar ((:commit . "ccbed30c991623d56a310d02c76f03d571e90e82"))])
- (ein-mumamo . [(20150302 28) ((ein (0 4))) "Multiple major mode support for Emacs IPython Notebook" single ((:commit . "028fefec499598add1a87b92ed991891f38f0c7b") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>") (": John Miller <millejoh at mac.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))])
- (eink-theme . [(20190219 858) nil "E Ink color theme" single ((:commit . "326b07523dcb076d6209cdbc7fdbb73df296dbdb") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:url . "http://github.com/maio/eink-emacs"))])
- (ejc-sql . [(20200727 925) ((emacs (26 3)) (clomacs (0 0 4)) (dash (2 16 0)) (spinner (1 7 3)) (direx (1 0 0))) "Emacs SQL client uses Clojure JDBC." tar ((:commit . "15675ca3bd71e0411956e440be8d660f28ae27d8") (:keywords "sql" "jdbc") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:url . "https://github.com/kostafey/ejc-sql"))])
- (ejson-mode . [(20190720 2138) ((emacs (25))) "Major mode for editing ejson files." single ((:commit . "9630dfac9549779711dbe89e621f516bb4b3a354") (:keywords "convenience" "languages" "tools") (:authors ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:url . "https://github.com/dantecatalfamo/ejson-mode"))])
- (el-autoyas . [(20120918 1317) nil "Automatically create Emacs-Lisp Yasnippets" tar ((:commit . "bde0251ecb504f585dfa27c205c8e312655310cc") (:keywords "emacs" "lisp" "mode" "yasnippet") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:url . "https://github.com/mlf176f2/el-autoyas.el"))])
- (el-fly-indent-mode . [(20180422 243) ((emacs (25))) "Indent Emacs Lisp on the fly" single ((:commit . "4917f486a7be7482dedfea0a7ac3d01cab4ce21c") (:keywords "lisp" "languages") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:url . "https://github.com/jiahaowork/el-fly-indent-mode.el"))])
- (el-get . [(20181006 225) nil "Manage the external elisp bits and pieces you depend upon" tar ((:commit . "3b5e48ba4a4dca5c91610e2eb607a8bbb725a6ab") (:keywords "emacs" "package" "elisp" "install" "elpa" "git" "git-svn" "bzr" "cvs" "svn" "darcs" "hg" "apt-get" "fink" "pacman" "http" "http-tar" "emacswiki") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "http://www.emacswiki.org/emacs/el-get"))])
- (el-init . [(20150728 920) ((emacs (24)) (cl-lib (0 5)) (anaphora (1 0 0))) "A loader inspired by init-loader" single ((:commit . "747acd434aa6f50a599efe5f6e96dea2dfed79d6") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/el-init"))])
- (el-init-viewer . [(20150303 828) ((emacs (24)) (cl-lib (0 5)) (ctable (0 1 2)) (dash (2 10 0)) (anaphora (1 0 0)) (el-init (0 1 4))) "Record viewer for el-init" single ((:commit . "7c0169d356d6c007317e253e5776e1e48a60d6ad") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/el-init-viewer"))])
- (el-mock . [(20170824 1954) nil "Tiny Mock and Stub framework in Emacs Lisp" single ((:commit . "5df1d3a956544f1d3ad0bcd81daf47fff33ab8cc") (:keywords "lisp" "testing" "unittest") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/el-mock.el"))])
- (el-patch . [(20200716 1428) ((emacs (25))) "Future-proof your Elisp" single ((:commit . "ff1951d776f80d2fd4a0cd9a0c930182fbb57b3c") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/el-patch"))])
- (el-spec . [(20121018 704) nil "ruby's rspec like syntax test frame work" single ((:commit . "1dbc465401d4aea5560318c4f13ff30920a0718d") (:keywords "test") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:url . "https://github.com/uk-ar/el-spec"))])
- (el-spice . [(20180128 1721) nil "Extra spice for emacs lisp programming" tar ((:commit . "4e0852ebf5d8e9cbb3eaaa6ae9c53d126b53f58c") (:keywords "languages" "extensions") (:authors ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com") (:url . "https://github.com/vedang/el-spice"))])
- (el-sprunge . [(20200312 1212) ((web-server (20140105 2246)) (htmlize (20130207 1202)) (emacs (24 3))) "Command line paste server with Emacs highlighting" tar ((:commit . "e4365ea0bdf60969817619376bdcc98003fec33d"))])
- (el-spy . [(20131226 2008) nil "Mocking framework for Emacs lisp. It also support spy, proxy." single ((:commit . "b1dead9d1877660856ada22d906ac4e54695aec7") (:keywords "test") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:url . "https://github.com/uk-ar/el-spy"))])
- (el-x . [(20140111 2201) nil "main entry point for el-x package" tar ((:commit . "e7c333d4fc31a90f4dca951efe21129164b42605") (:keywords "lisp") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))])
- (el2markdown . [(20170630 1858) nil "Convert commentary section of elisp files to markdown." single ((:commit . "368d99313683cd943c99feaffca356be60bdb636") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/el2markdown"))])
- (el2org . [(20200408 146) ((emacs (25 1))) "Convert elisp file to org file" single ((:commit . "7db77fdd73f378d4e60e34c11bbdf00677adc32c") (:keywords "convenience") (:authors ("Feng Shu " . "tumashu@163.com")) (:maintainer "Feng Shu " . "tumashu@163.com") (:url . "https://github.com/tumashu/el2org"))])
- (elbank . [(20180316 1343) ((emacs (25)) (seq (2 16))) "Personal finances reporting application" tar ((:commit . "fa9bc7dec0a8fd489e90b9f178719344cc8d315a") (:keywords "tools" "personal-finances") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))])
- (elcontext . [(20180526 1304) ((ht (2 3)) (hydra (0 14 0)) (emacs (24 3)) (f (0 20 0)) (osx-location (0 4)) (uuidgen (0 3))) "Create context specific actions" tar ((:commit . "f434ffc655e6349a4dd52285ff68a9194bcfc949") (:keywords "calendar" "convenience") (:authors ("Thomas Sojka")) (:maintainer "Thomas Sojka") (:url . "https://github.com/rollacaster/elcontext"))])
- (elcord . [(20200611 2314) ((emacs (25 1))) "Allows you to integrate Rich Presence from Discord" tar ((:commit . "01b26d1af2f33a7c7c5a1c24d8bfb6d40115a7b0") (:keywords "games") (:authors ("heatingdevice") ("Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com")) (:maintainer "heatingdevice") (:url . "https://github.com/Mstrodl/elcord"))])
- (elcouch . [(20190820 1641) ((emacs (25 1)) (json-mode (1 0 0)) (libelcouch (0 9 0)) (navigel (0 3 0))) "View and manipulate CouchDB databases" single ((:commit . "8e1b7ddec91ae863c3951776a0fcbfead8ca7a80") (:keywords "data" "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/DamienCassou/elcouch"))])
- (eldev . [(20200719 1052) ((emacs (24 4))) "Elisp Development Tool" tar ((:commit . "d4e227742495e8160d0f8aa4cb81e0e9b927bd0a") (:keywords "maint" "tools") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:url . "https://github.com/doublep/eldev"))])
- (eldoc-box . [(20200316 1956) ((emacs (26 1))) "Display documentation in childframe" single ((:commit . "c1a1b77ec0c7fff9ecf7122d10dcd16eebcd3829") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:url . "https://github.com/casouri/eldoc-box"))])
- (eldoc-cmake . [(20190419 2244) ((emacs (25 1))) "Eldoc support for CMake" single ((:commit . "4453c03b5c95ff32842f13db2fc317fb0fe2f79e") (:authors ("Kirill Ignatiev")) (:maintainer "Kirill Ignatiev") (:url . "https://github.com/ikirill/eldoc-cmake"))])
- (eldoc-eval . [(20190423 1858) nil "Enable eldoc support when minibuffer is in use." single ((:commit . "a67fe3637378dcb6c5f9e140acc8131f0d2346b3") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))])
- (eldoc-overlay . [(20200715 1214) ((emacs (24 3)) (inline-docs (1 0 1)) (quick-peek (1 0))) "Display eldoc with contextual documentation overlay." single ((:commit . "563ca285a510d1cbd5129cc3a8f8a3cdded065de") (:keywords "documentation" "eldoc" "overlay") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:url . "https://github.com/stardiviner/eldoc-overlay"))])
- (eldoc-stan . [(20200221 2025) ((emacs (25)) (stan-mode (10 1 0))) "Eldoc support for stan functions" tar ((:commit . "e891a0fcb3a7ab7d9cedbe3deda560134636897e") (:keywords "help" "tools") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:url . "https://github.com/stan-dev/stan-mode/tree/master/eldoc-stan"))])
- (electric-case . [(20150417 1112) nil "insert camelCase, snake_case words without \"Shift\"ing" single ((:commit . "bac64e772107e3dc721a9819f63b9ebdc28a81f7") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (electric-operator . [(20200410 928) ((dash (2 10 0)) (emacs (24 4))) "Automatically add spaces around operators" tar ((:commit . "f8454905a147045f25ab03da7aa6406e4f20cc64") (:keywords "electric") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/electric-operator"))])
- (electric-spacing . [(20200607 1405) nil "Insert operators with surrounding spaces smartly" tar ((:commit . "f039011edb922cdc56c1d2bd0e49bb4575c35ab3") (:authors ("William Xu" . "william.xwl@gmail.com")) (:maintainer "William Xu" . "william.xwl@gmail.com"))])
- (elein . [(20120120 1116) nil "running leiningen commands from emacs" single ((:commit . "d4c0c0491dbb7c90e953d7a16172107c37103605") (:keywords "tools" "processes") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:url . "https://github.com/remvee/elein"))])
- (elf-mode . [(20161009 748) ((emacs (24 3))) "Show symbols in binaries" single ((:commit . "cd280d683cd3341d8bb31af6db7e3b74a133e6ab") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/elf-mode"))])
- (elfeed . [(20200716 1921) ((emacs (24 3))) "an Emacs Atom/RSS feed reader" tar ((:commit . "8fb09ad75f2ff7d6f7d8b8d1ac65b9be873cc31d"))])
- (elfeed-goodies . [(20190128 1631) ((popwin (1 0 0)) (powerline (2 2)) (elfeed (2 0 0)) (cl-lib (0 5)) (noflet (0 0 10)) (ace-jump-mode (2 0))) "Elfeed goodies" tar ((:commit . "95b4ea632fbd5960927952ec8f3394eb88da4752") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/elfeed-goodies"))])
- (elfeed-org . [(20181015 1100) ((elfeed (1 1 1)) (org (8 2 7)) (dash (2 10 0)) (s (1 9 0)) (cl-lib (0 5))) "Configure elfeed with one or more org-mode files" single ((:commit . "77b6bbf222487809813de260447d31c4c59902c9") (:keywords "news") (:authors ("Remy Honig" . "remyhonig@gmail.com")) (:maintainer "Remy Honig" . "remyhonig@gmail.com") (:url . "https://github.com/remyhonig/elfeed-org"))])
- (elfeed-protocol . [(20200526 341) ((emacs (24 4)) (elfeed (2 1 1)) (cl-lib (0 5))) "Provide fever/newsblur/owncloud/ttrss protocols for elfeed" tar ((:commit . "c5a928d4217060a49444d80d2fd54282d32a12a5") (:keywords "news") (:authors ("Xu Fasheng <fasheng[AT]fasheng.info>")) (:maintainer "Xu Fasheng <fasheng[AT]fasheng.info>") (:url . "https://github.com/fasheng/elfeed-protocol"))])
- (elfeed-score . [(20200328 1855) ((emacs (24 1)) (elfeed (3 3 0)) (cl-lib (0 6 1))) "Gnus-style scoring for Elfeed" single ((:commit . "916c47b3590b2ff3c5075dcc1def4b36a4b14947") (:keywords "news") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:url . "https://github.com/sp1ff/elfeed-score"))])
- (elfeed-web . [(20191123 1738) ((simple-httpd (1 5 1)) (elfeed (3 2 0)) (emacs (24 3))) "web interface to Elfeed" tar ((:commit . "8fb09ad75f2ff7d6f7d8b8d1ac65b9be873cc31d"))])
- (elgrep . [(20191203 1227) ((emacs (26 1)) (async (1 5))) "Searching files for regular expressions" single ((:commit . "c475cee98bc607746901318ef9da463c96d5e04e") (:keywords "tools" "matching" "files" "unix") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:url . "https://github.com/TobiasZawada/elgrep"))])
- (elhome . [(20161025 2042) ((initsplit (20120630))) "A framework for a \"home\" Emacs configuration" tar ((:commit . "e789e806469af3e9705f72298683c21f6c3a516d") (:keywords "lisp") (:authors ("Dave Abrahams" . "dave@boostpro.com")) (:maintainer "Demyan Rogozhin" . "demyan.rogozhin@gmail.com") (:url . "http://github.com/demyanrogozhin/elhome"))])
- (elisp-def . [(20200528 633) ((dash (2 12 0)) (f (0 19 0)) (s (1 11 0)) (emacs (24 3))) "macro-aware go-to-definition for elisp" single ((:commit . "da1f76391ac0d277e3c5758203e0150f6bae0beb") (:keywords "lisp") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (elisp-demos . [(20200606 949) ((emacs (24 4))) "Elisp API Demos" tar ((:commit . "8c9748134f7c017ae1536dbd0b76434afb52e64d") (:keywords "lisp" "docs") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/elisp-demos"))])
- (elisp-depend . [(20190325 1114) nil "Parse depend libraries of elisp file." single ((:commit . "6679da9a6be5a845bb4804224c8394a9bc62168f"))])
- (elisp-depmap . [(20200714 1630) ((emacs (26 1)) (dash (2 17 0))) "Generate an elisp dependency map in graphviz" tar ((:commit . "98676e6ffcc4efb70cc991e659c79cb599b01bc7") (:keywords "outlines") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:url . "https://github.com/mtekman/elisp-depmap.el"))])
- (elisp-docstring-mode . [(20170304 1615) nil "Major mode for editing elisp docstrings." single ((:commit . "f512e509dd690f65133e55563ebbfd2dede5034f") (:keywords "languages") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (elisp-format . [(20160508 952) nil "Format elisp code" single ((:commit . "03cc293eb2f78ec58fc1d84279af06816a04b979") (:authors (nil . "Andy Stewart lazycat.manatee@gmail.com")) (:maintainer "Yuki Inoue inouetakahiroki _at_ gmail.com") (:url . "https://github.com/Yuki-Inoue/elisp-format"))])
- (elisp-lint . [(20200324 2217) ((emacs (24 4)) (dash (2 15 0)) (package-lint (0 11))) "Basic linting for Emacs Lisp" single ((:commit . "35a3fcc3131c243206fa914b8562cda771eab8c5") (:keywords "lisp" "maint" "tools") (:authors ("Nikolaj Schumacher <bugs * nschum de>,")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "http://github.com/gonewest818/elisp-lint/"))])
- (elisp-refs . [(20200428 1707) ((dash (2 12 0)) (loop (1 2)) (s (1 11 0))) "find callers of elisp functions or macros" single ((:commit . "0e7ea1574717108ddc2eda5e1bc883d44cd28257") (:keywords "lisp") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (elisp-sandbox . [(20131116 1842) nil "Evaluate EmacsLisp expressions in a sandbox" single ((:commit . "d894d68934ef09c42f72ac4e1173a0bedc23f139") (:keywords "lisp") (:authors ("Joel McCracken <mccracken.joel@gmail.com>, D. Goel" . "deego@gnufans.org")) (:maintainer "Joel McCracken <mccracken.joel@gmail.com>, D. Goel" . "deego@gnufans.org") (:url . "https://github.com/joelmccracken/elisp-sandbox"))])
- (elisp-slime-nav . [(20200304 2201) ((emacs (24 1)) (cl-lib (0 2))) "Make M-. and M-, work in elisp like they do in slime" single ((:commit . "9ab52362600af9f97f1590f05a295538025170b3") (:keywords "languages" "navigation" "slime" "elisp" "emacs-lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/elisp-slime-nav"))])
- (elixir-mode . [(20200723 1750) ((emacs (24)) (pkg-info (0 4))) "Major mode for editing Elixir files" tar ((:commit . "01b332495d3f44addeb236428041c4ffa0c2ca3b") (:keywords "languages" "elixir") (:url . "https://github.com/elixir-editors/emacs-elixir"))])
- (elixir-yasnippets . [(20150417 1239) ((yasnippet (0 8 0))) "Yasnippets for Elixir" tar ((:commit . "980ca7626c14ef0573bec0035ec7942796062783"))])
- (ellocate . [(20200112 1931) ((emacs (25 1)) (s (1 12 0)) (f (0 20 0))) "The locate command reimplemented in Emacs Lisp" single ((:commit . "81405082f68f0577c9f176d3d4f034a7142aba59") (:keywords "matching") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/ellocate"))])
- (elm-mode . [(20200602 500) ((f (0 17)) (s (1 7 0)) (emacs (25 1)) (dash (2 13 0)) (reformatter (0 3))) "Major mode for Elm" tar ((:commit . "363da4b47c9de1ff091a8caf95fccc34188d59a3") (:authors ("Joseph Collard")) (:maintainer "Joseph Collard") (:url . "https://github.com/jcollard/elm-mode"))])
- (elm-test-runner . [(20190105 1923) ((emacs (24 4))) "Enhanced support for running elm-test" single ((:commit . "a31d567a64d86d36e3675347abd696824a731e0c") (:authors ("Juan Edi")) (:maintainer "Juan Edi") (:url . "https://github.com/juanedi/elm-test-runner"))])
- (elm-yasnippets . [(20160401 524) ((yasnippet (0 8 0))) "Yasnippets for Elm" tar ((:commit . "45a11a0cef0c36633fb3477d3dc4167e82779ba4") (:keywords "snippets") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))])
- (elmacro . [(20191208 1057) ((s (1 11 0)) (dash (2 13 0))) "Convert keyboard macros to emacs lisp" single ((:commit . "ba4086ef241dadfc2b1ce1bcfa56e12dbb89ef58") (:keywords "macro" "elisp" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/elmacro"))])
- (elmine . [(20200520 1237) ((s (1 10 0))) "Redmine API access via elisp." single ((:commit . "c78cc8705c2dffbf649b858f02b5028225943482") (:keywords "tools") (:authors ("Arthur Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Andersen" . "leoc.git@gmail.com") (:url . "http://github.com/leoc/elmine"))])
- (elnode . [(20190702 1509) ((web (0 1 4)) (dash (1 1 0)) (noflet (0 0 7)) (s (1 5 0)) (creole (0 8 14)) (fakir (0 1 6)) (db (0 0 5)) (kv (0 0 17))) "The Emacs webserver." tar ((:commit . "29ef0f51a65a24fca7fdcdb4140d2e4556e4bb29"))])
- (elog . [(20160724 2255) ((eieio (1 3))) "logging library extended from logito" single ((:commit . "a67237d9813c7591614d95e2ef31cc5e5ed3f31b") (:keywords "lisp" "tool" "log") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (elogcat . [(20151121 41) ((s (1 9 0)) (dash (2 10 0))) "logcat interface" single ((:commit . "4f311b7a07565b0d060334bc68edb36f2bff703f") (:keywords "tools") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com"))])
- (eloud . [(20190706 1707) ((emacs (24 4))) "A lightweight, interactive screen reader" single ((:commit . "b8f4af1f652268d73281de91fb333b5984970847") (:keywords "extensions") (:authors ("Patrick Smyth" . "patricksmyth01@gmail.com")) (:maintainer "Patrick Smyth" . "patricksmyth01@gmail.com") (:url . "https://github.com/smythp/eloud"))])
- (elpa-audit . [(20141023 1331) nil "Handy functions for inspecting and comparing package archives" single ((:commit . "727da50e626977351aff2675b6540a36818bbbe6") (:keywords "maint") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/elpa-audit"))])
- (elpa-clone . [(20191006 1953) ((emacs (24 4)) (cl-lib (0))) "Clone ELPA archive" single ((:commit . "827e2723b123618aaa32642d78c447cf2979a00a") (:keywords "comm" "elpa" "clone" "mirror") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com") (:url . "https://github.com/dochang/elpa-clone"))])
- (elpa-deploy . [(20191022 718) ((emacs (24 4)) (f (0 0))) "ELPA deployment library" single ((:commit . "f5126a2da1e0e52981fad9c12028814be80328c2") (:keywords "tools") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:url . "https://github.com/oitofelix/elpa-deploy"))])
- (elpa-mirror . [(20200502 115) ((emacs (24 4))) "Create local package repository from installed packages" single ((:commit . "9b25a8a2619e1f723528e8a093d31181223d5c85") (:keywords "tools") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "http://github.com/redguardtoo/elpa-mirror"))])
- (elpher . [(20200628 2255) ((emacs (26 2))) "A friendly gopher and gemini client" tar ((:commit . "b4450244a5e23605f80b2179ce7d4dbaff56d927") (:keywords "comm" "gopher") (:authors ("Tim Vaughan" . "plugd@thelambdalab.xyz")) (:maintainer "Tim Vaughan" . "plugd@thelambdalab.xyz") (:url . "http://thelambdalab.xyz/elpher"))])
- (elpl . [(20191229 1929) ((emacs (24 4))) "Emacs Lisp REPL" single ((:commit . "48ecee2aa7b3d085a3deff809fb3ae31ae4ef9dd") (:keywords "lisp" "tool") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:url . "https://github.com/twlz0ne/elpl"))])
- (elpy . [(20200527 2021) ((company (0 9 2)) (emacs (24 4)) (highlight-indentation (0 5 0)) (pyvenv (1 3)) (yasnippet (0 8 0)) (s (1 11 0))) "Emacs Python Development Environment" tar ((:commit . "03a7517ee48204257ae3ca0aa24a370e283d8790"))])
- (elpygen . [(20171225 1736) ((emacs (25)) (yasnippet (0 8 0))) "Generate a Python function/method using a symbol under point" single ((:commit . "21929c997a05968f9eefe52b85a76ceaab3b0d81") (:keywords "python" "languages" "tools") (:authors ("Vladimir Kazanov" . "vkazanov@inbox.ru")) (:maintainer "Vladimir Kazanov" . "vkazanov@inbox.ru") (:url . "https://github.com/vkazanov/elpygen"))])
- (elquery . [(20200628 1756) ((emacs (25 1)) (s (1 11 0)) (dash (2 13 0))) "The HTML library for elisp." single ((:commit . "cba7629ad886c4e51d66f8b509aad48bdfe100cc") (:keywords "html" "hypermedia" "tools" "webscale") (:authors ("Adam Niederer")) (:maintainer "Adam Niederer") (:url . "https://github.com/AdamNiederer/elquery"))])
- (elsa . [(20200225 1440) ((trinary (1 0 0)) (emacs (25 1)) (f (0)) (dash (2 14)) (cl-lib (0 3))) "Emacs Lisp Static Analyser" tar ((:commit . "5ac373088eca10581e848ad42f5e278aedcd85c0"))])
- (elscreen . [(20181009 451) ((emacs (24))) "Emacs window session manager" tar ((:commit . "cc58337faf5ba1eae7e87f75f6ff3758675688f2") (:keywords "window" "convenience") (:authors ("Naoto Morishima" . "naoto@morishima.net")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/elscreen"))])
- (elscreen-buffer-group . [(20200109 2338) ((emacs (24 4)) (elscreen (0)) (cl-lib (0 5))) "elscreen buffer group" single ((:commit . "b48e71d4782adfeb2958f227d78c04164d26e4bd") (:keywords "buffer") (:authors ("Jeff Gran" . "jeff@jeffgran.com") ("Author: Ryan C. Thompson")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com") (:url . "https://github.com/jeffgran/elscreen-buffer-group"))])
- (elscreen-fr . [(20160920 953) ((elscreen (0)) (seq (1 11))) "Use frame title as screen tab" single ((:commit . "6dc77e1d3f17b3f76da5ccf92b715572aa55fb85") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://github.com/rocher/elscreen-fr"))])
- (elscreen-mew . [(20160504 1835) ((elscreen (20120413 807))) "ElScreen Add-On for Mew" single ((:commit . "c90a23441d836da14a1cb12788432308ba58e2b6") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/elscreen-mew"))])
- (elscreen-multi-term . [(20200417 821) ((emacs (24 4)) (elscreen (1 4 6)) (multi-term (1 3))) "Multi term for elscreen" single ((:commit . "4ea89bae0444d9d4377515929f76cb3e98140f1f") (:keywords "elscreen" "multi term") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com"))])
- (elscreen-separate-buffer-list . [(20161107 358) ((emacs (24 4)) (elscreen (1 4 6))) "Separate buffer list manager for elscreen" single ((:commit . "7652d827aa1b8c1b04303c5b4b0bda5e8f85565e") (:keywords "elscreen") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com"))])
- (elscreen-tab . [(20190203 1619) ((emacs (26)) (elscreen (20180321)) (dash (2 14 1))) "minor mode to display tabs of elscreen in a dedicated buffer" single ((:commit . "da79fb0b9ead2402662ff8e163039635aaae2413") (:keywords "tools" "extensions") (:authors ("Aki Syunsuke" . "sunny.day.dev@gmail.com")) (:maintainer "Aki Syunsuke" . "sunny.day.dev@gmail.com") (:url . "https://github.com/aki-s/elscreen-tab"))])
- (elvish-mode . [(20180809 1612) ((emacs (24 3))) "Defines a major mode for Elvish" single ((:commit . "c3a7e31564256b9755b1ab9fb40d32ad78cd1ad2") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/elvish-mode"))])
- (elwm . [(20150817 1007) ((dash (1 1 0))) "Minimalistic window manager for emacs" single ((:commit . "c33b183f006ad476c3a44dab316f580f8b369930") (:keywords "docs") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/elwm"))])
- (elx . [(20200728 819) ((emacs (25 1))) "extract information from Emacs Lisp libraries" single ((:commit . "f9f810ffcd3cce7ed15848c72ce299609ec09414") (:keywords "docs" "libraries" "packages") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/elx"))])
- (emacsc . [(20190917 1102) nil "helper for emacsc(1)" tar ((:commit . "57940b93881efabb375df18093b99800bfb5d5f7") (:keywords "tools") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/emacsc"))])
- (emacsist-view . [(20160426 1223) nil "Mode for viewing emacsist.com" single ((:commit . "f67761259ed779a9bc95c9a4e0474522990c5c6b") (:keywords "convenience" "usability") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/emacsist-view"))])
- (emacsql . [(20200714 28) ((emacs (25 1))) "high-level SQL database front-end" tar ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))])
- (emacsql-mysql . [(20171219 227) ((emacs (25 1)) (emacsql (2 0 0))) "EmacSQL back-end for MySQL" single ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))])
- (emacsql-psql . [(20171219 227) ((emacs (25 1)) (emacsql (2 0 0))) "EmacSQL back-end for PostgreSQL via psql" tar ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))])
- (emacsql-sqlite . [(20190727 1710) ((emacs (25 1)) (emacsql (2 0 0))) "EmacSQL back-end for SQLite" tar ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))])
- (emacsql-sqlite3 . [(20200718 614) ((emacs (26 1)) (emacsql (3 0 0))) "Yet another EmacSQL backend for SQLite" single ((:commit . "e920671872cd8e0ef9c3646e6f0fae331bf8a7df") (:keywords "extensions") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:url . "https://github.com/cireu/emacsql-sqlite3"))])
- (emacsshot . [(20191206 944) ((emacs (24 4))) "Snapshot a frame or window from within" tar ((:commit . "fe958b11056f3c671ebdd604d5aa574323284ca5") (:keywords "convenience") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl") (:url . "https://gitlab.com/marcowahl/emacsshot"))])
- (emamux . [(20200315 1220) ((emacs (24 3))) "Interact with tmux" single ((:commit . "6172131d78038f0b1490e24bac60534bf4ad3b30") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-emamux"))])
- (emamux-ruby-test . [(20130812 1639) ((emamux (0 1)) (projectile (0 9 1))) "Ruby test with emamux" single ((:commit . "23b73c650573b340351a919da3da416acfc2ac84") (:url . "https://github.com/syohex/emamux-ruby-test"))])
- (emaps . [(20200508 1759) ((dash (2 17 0)) (emacs (24))) "Utilities for working with keymaps" single ((:commit . "7c561f3ded2015ed3774e5784059d6601082743e") (:keywords "convenience" "keyboard" "keymap" "utility") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:url . "https://github.com/GuiltyDolphin/emaps"))])
- (ember-mode . [(20200208 1423) ((cl-lib (0 5))) "Ember navigation mode for emacs" single ((:commit . "a587c423041b2fcb065fd5b6a03b2899b764e462") (:keywords "ember" "ember.js" "emberjs") (:authors ("Aad Versteden" . "madnificent@gmail.com")) (:maintainer "Aad Versteden" . "madnificent@gmail.com"))])
- (ember-yasnippets . [(20160526 1658) ((yasnippet (0 8 0))) "Snippets for Ember.js development" tar ((:commit . "3b5bd01569646237bf1b540d097e12f9118b67f4") (:keywords "tools" "abbrev" "languages") (:authors ("Ron White" . "ronco@costite.com")) (:maintainer "Ron White" . "ronco@costite.com"))])
- (embrace . [(20171031 1833) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" single ((:commit . "dd5da196e5bcc5e6d87e1937eca0c21da4334ef2") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (emidje . [(20190209 1726) ((emacs (25)) (cider (0 17 0)) (seq (2 16)) (magit-popup (2 4 0))) "Test runner and report viewer for Midje" single ((:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:keywords "tools") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br") (:url . "https://github.com/nubank/emidje"))])
- (emlib . [(20161126 1523) ((dash (2 13 0)) (cl-lib (0 5))) "A Machine Learning library for Emacs" tar ((:commit . "dea2af00f551ea580c641d86dd69219f7d4f3685") (:keywords "data" "ai" "neural networks" "ml") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:url . "https://github.com/narendraj9/emlib.git"))])
- (emmet-mode . [(20180613 341) nil "Unofficial Emmet's support for emacs" single ((:commit . "1acb821e0142136344ccf40c1e5fb664d7db2e70") (:keywords "convenience") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com") (:url . "https://github.com/smihica/emmet-mode"))])
- (emms . [(20200716 1815) ((cl-lib (0 5))) "The Emacs Multimedia System" tar ((:commit . "36d760e2bd7e5376aff3f03456fa6445833242ad") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:url . "https://www.gnu.org/software/emms/"))])
- (emms-bilibili . [(20180103 418) ((emacs (25)) (cl-lib (0 5))) "Play Bilibili in EMMS." single ((:commit . "294bca3dfc42fe3a55fb326ab39bc0fcfc8c5090") (:keywords "emms" "bilibili") (:url . "https://github.com/stardiviner/emms-bilibili"))])
- (emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" single ((:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:keywords "multimedia" "processes") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org"))])
- (emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" single ((:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:keywords "convenience" "multimedia") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/emms-mark-ext"))])
- (emms-mode-line-cycle . [(20160221 1120) ((emacs (24)) (emms (4 0))) "Display the emms mode line as a ticker" single ((:commit . "2c2f395e484a1d345050ddd61ff5fab71a92a6bc") (:keywords "emms" "mode-line") (:authors ("momomo5717")) (:maintainer "momomo5717") (:url . "https://github.com/momomo5717/emms-mode-line-cycle"))])
- (emms-player-mpv-jp-radios . [(20180325 1117) ((emacs (24)) (cl-lib (0 5)) (emms (4 0)) (emms-player-simple-mpv (0 1 7))) "EMMS players and stream lists of Japan radio stations" tar ((:commit . "f6b37f5878c741124d5fca43c5b80af873541edd") (:keywords "emms" "mpv" "radio") (:url . "https://github.com/momomo5717/emms-player-mpv-jp-radios"))])
- (emms-player-simple-mpv . [(20180316 1549) ((emacs (24)) (cl-lib (0 5)) (emms (4 0))) "An extension of emms-player-simple.el for mpv JSON IPC" tar ((:commit . "101d120ccdee1c2c213fd2f0423c858b21649c00") (:keywords "emms" "mpv") (:authors ("momomo5717")) (:maintainer "momomo5717") (:url . "https://github.com/momomo5717/emms-player-simple-mpv"))])
- (emms-soundcloud . [(20131221 1145) ((emms (20131016)) (json (1 2))) "EMMS source for Soundcloud audio sharing platform" single ((:commit . "87e5cbf9609d1f26c24dc834fdeb78b33d453c2b") (:keywords "emms" "soundcloud") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:url . "http://github.com/osener/emms-soundcloud"))])
- (emms-state . [(20160504 805) ((emms (0))) "Display track description and playing time in the mode line" single ((:commit . "77930300222333b71eafd495cc1fee3a3585eb23") (:keywords "emms") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/emms-state.el"))])
- (emoji-cheat-sheet-plus . [(20200202 1404) ((emacs (24)) (helm (1 6 4))) "emoji-cheat-sheet for emacs" tar ((:commit . "ffcc84d7060dfa000148e7f8be4fd6701593a74f") (:keywords "emacs" "emoji") (:authors ("Sylvain Benner (based on the work of Shingo Fukuyama)")) (:maintainer "Sylvain Benner (based on the work of Shingo Fukuyama)") (:url . "https://github.com/syl20bnr/emacs-emoji-cheat-sheet-plus"))])
- (emoji-display . [(20140117 1013) nil "emoji displaying module" single ((:commit . "bb4217f6400151a9cfa6d4524b8427f01feb5193") (:keywords "emoji") (:authors ("Kazuhiro Ito" . "kzhr@d1.dion.ne.jp")) (:maintainer "Kazuhiro Ito" . "kzhr@d1.dion.ne.jp") (:url . "https://github.com/ikazuhiro/emoji-display"))])
- (emoji-fontset . [(20160726 1924) nil "Set font face for Emoji." single ((:commit . "8f159e8073b9b57a07a54b549df687424eeb98ee") (:keywords "emoji" "font" "config") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))])
- (emoji-github . [(20200323 233) ((emacs (24 4)) (emojify (1 0)) (request (0 3 0))) "Display list of GitHub's emoji. (cheat sheet)" single ((:commit . "43f63c0dd64aae6c8054c2dad617bf810abdfadd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/emoji-github"))])
- (emoji-recall . [(20160723 2208) ((emacs (24))) "How many emoji can you recall from memory?" tar ((:commit . "d9122f8fb1467309260109a1985cd14f18fdf631") (:keywords "game") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/emoji-recall.el"))])
- (emojify . [(20200513 1627) ((seq (1 11)) (ht (2 0)) (emacs (24 3))) "Display emojis in Emacs" tar ((:commit . "dfa3c6d060914c6082d6837da32df0c337330ee4") (:keywords "multimedia" "convenience") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:url . "https://github.com/iqbalansari/emacs-emojify"))])
- (emojify-logos . [(20180814 917) ((emojify (0 4))) "Add logos to emojify" tar ((:commit . "a3e78bcbdf863092d4c9b026ac08bf7d1c7c0e8b") (:authors ("mxgoldstein" . "m_goldstein@gmx.net")) (:maintainer "mxgoldstein" . "m_goldstein@gmx.net") (:url . "https://github.com/mxgoldstein/emojify-logos"))])
- (empos . [(20151011 1916) nil "Locate bibtex citations from within emacs" single ((:commit . "7b99ad30e56937adb7e6349777e5a2045597d564") (:keywords "citations" "reference" "bibtex" "reftex") (:authors ("Dimitris Alikaniotis <da352 [at] cam.ac.uk>")) (:maintainer "Dimitris Alikaniotis <da352 [at] cam.ac.uk>") (:url . "http://github.com/dimalik/empos/"))])
- (emr . [(20200420 721) ((s (1 3 1)) (dash (1 2 0)) (cl-lib (0 2)) (popup (0 5 0)) (emacs (24 1)) (list-utils (0 3 0)) (paredit (24 0 0)) (projectile (0 9 1)) (clang-format (0 0 1)) (iedit (0 97))) "Emacs refactoring system." tar ((:commit . "a8f6ab823453decf43f0764d02e554d05009a631") (:keywords "tools" "convenience" "refactoring") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:url . "https://github.com/Wilfred/emacs-refactor"))])
- (enclose . [(20121008 1614) nil "Enclose cursor within punctuation pairs." tar ((:commit . "2747653e84af39017f503064bc66ed1812a77259"))])
- (encourage-mode . [(20151128 905) ((emacs (24 4))) "Encourages you in your work. :D" single ((:commit . "99edacf2d94d168d3da0609860dc7253db7c9815") (:keywords "fun") (:authors ("Patrick Mosby" . "patrick@schreiblogade.de")) (:maintainer "Patrick Mosby" . "patrick@schreiblogade.de") (:url . "https://github.com/halbtuerke/encourage-mode.el"))])
- (engine-mode . [(20200611 1825) ((cl-lib (0 5))) "Define and query search engines from within Emacs." single ((:commit . "e0910f141f2d37c28936c51c3c8bb8a9ca0c01d1") (:authors ("Harry R. Schwartz" . "hello@harryrschwartz.com")) (:maintainer "Harry R. Schwartz" . "hello@harryrschwartz.com") (:url . "https://github.com/hrs/engine-mode"))])
- (enh-ruby-mode . [(20200729 634) ((emacs (24 3))) "Major mode for editing Ruby files" tar ((:commit . "f0bffbe4b32bb59680f897731169442cce5a1eec") (:keywords "languages" "elisp" "ruby") (:authors ("Geoff Jacobsen")) (:maintainer "Ryan Davis") (:url . "http://github.com/zenspider/Enhanced-Ruby-Mode"))])
- (enlive . [(20170725 1417) nil "query html document with css selectors" single ((:commit . "604a8ca272b6889f114e2b5a13adb5b1dc4bae86") (:keywords "css" "selector" "query") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/enlive"))])
- (eno . [(20191013 1239) ((dash (2 12 1)) (edit-at-point (1 0))) "Goto/copy/cut any word/symbol/line in view, similar to ace-jump/easymotion" single ((:commit . "c5c6193687c0bede1ddf507c430cf8b0a6d272d9") (:authors (nil . "<e.enoson@gmail.com>")) (:maintainer nil . "<e.enoson@gmail.com>") (:url . "http://github.com/enoson/eno.el"))])
- (enotify . [(20130407 1348) nil "A networked notification system for emacs" tar ((:commit . "7fd2f48ef4ff32c8f013c634ea2dd6b1d1409f80"))])
- (envrc . [(20200714 201) ((seq (2)) (emacs (24 4))) "Support for `direnv' that operates buffer-locally" single ((:commit . "19b4d6a8384a8e2a52caa496315377797fa8a062") (:keywords "processes" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/envrc"))])
- (eopengrok . [(20200205 624) ((s (1 9 0)) (dash (2 10 0)) (magit (2 1 0)) (cl-lib (0 5))) "opengrok interface for emacs" single ((:commit . "6fa16c4ccaaebaef64dca0d3d29904c45fd6597d") (:keywords "tools") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com"))])
- (epc . [(20140610 534) ((concurrent (0 3 1)) (ctable (0 1 2))) "A RPC stack for the Emacs Lisp" tar ((:commit . "e1bfa5ca163273859336e3cc89b4b6460f7f8cda") (:keywords "lisp" "rpc") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:url . "https://github.com/kiwanami/emacs-epc"))])
- (epic . [(20170210 23) ((htmlize (1 47))) "Evernote Picker for Cocoa Emacs" single ((:commit . "a41826c330eb0ea061d58a08cc861b0c4ac8ec4e") (:keywords "evernote" "applescript") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:url . "https://github.com/yoshinari-nomura/epic"))])
- (epkg . [(20200727 2203) ((closql (1 0 1)) (emacs (25 1))) "browse the Emacsmirror package database" tar ((:commit . "8bdb6ada1a6193fddaa82c59c981edf2d894b070") (:keywords "tools") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/epkg"))])
- (epl . [(20180205 2049) ((cl-lib (0 3))) "Emacs Package Library" single ((:commit . "78ab7a85c08222cd15582a298a364774e3282ce6") (:keywords "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/cask/epl"))])
- (epm . [(20190509 443) ((emacs (24 3)) (epl (0 8))) "Emacs Package Manager" tar ((:commit . "6375ddbf93c5f25647f6ebb25b54045b3c93a5be") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/epm"))])
- (epresent . [(20160411 201) ((org (8)) (cl-lib (0 5))) "Simple presentation mode for Emacs Org-mode" single ((:commit . "6c8abedcf46ff08091fa2bba52eb905c6290057d") (:keywords "gui") (:url . "https://github.com/dakrone/epresent"))])
- (eprime-mode . [(20140513 1816) nil "An E-prime checking mode for Emacs" single ((:commit . "17a481af26496be91c07139a9bfc05cfe722506f") (:keywords "e-prime" "english" "grammar") (:authors ("Andrew Hynes" . "andrewhynes@openmailbox.org")) (:maintainer "Andrew Hynes" . "andrewhynes@openmailbox.org") (:url . "https://github.com/AndrewHynes/eprime-mode"))])
- (eproject . [(20180312 1642) ((helm (1 6 4))) "assign files to projects, programatically" tar ((:commit . "068218d2cf2138cb2e8fc29b57e773a0097a7e8b") (:keywords "programming" "projects") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us"))])
- (equake . [(20200724 1637) ((emacs (26 1)) (dash (2 14 1)) (tco (20190309 55))) "Drop-down console for (e)shell & terminal emulation" single ((:commit . "0fe809c739af309afed99d35e27494d8a99aa2df") (:keywords "convenience" "frames" "terminals" "tools" "window-system") (:authors ("Benjamin Slade" . "slade@jnanam.net")) (:maintainer "Benjamin Slade" . "slade@jnanam.net") (:url . "https://gitlab.com/emacsomancer/equake"))])
- (eradio . [(20200729 1817) ((emacs (24 1))) "A radio player frontend for vlc" single ((:commit . "5e257849113b70b2b42a999994d89ec8abadf253") (:authors ("Olav Fosse" . "fosseolav@gmail.com")) (:maintainer "Olav Fosse" . "fosseolav@gmail.com") (:url . "https://github.com/olav35/eradio"))])
- (erblint . [(20200622 5) ((emacs (24))) "An interface for checking HTML ERB files using Erblint" single ((:commit . "89af42f776d8dc656104322edaace2ede7499932") (:keywords "project" "convenience") (:authors ("Leonardo Santos")) (:maintainer "Leonardo Santos") (:url . "https://github.com/leodcs/erblint-emacs"))])
- (erc-colorize . [(20170107 1339) nil "Per user colorization of whole message" single ((:commit . "d026a016dcb9d63d9ac66d30627a92a8f1681bbd") (:keywords "erc" "convenience") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "https://github.com/thisirs/erc-colorize.git"))])
- (erc-crypt . [(20200516 2054) ((cl-lib (0 5))) "Symmetric Encryption for ERC" single ((:commit . "be87248435509f83c56a7f08ac9bcbbd3b20d780") (:keywords "comm") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:url . "https://github.com/atomontage/erc-crypt"))])
- (erc-hl-nicks . [(20200317 16) nil "ERC nick highlighter that ignores uniquifying chars when colorizing" single ((:commit . "a67fe361c8f2aa20fc235447fbb898f424b51439") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/erc-hl-nicks"))])
- (erc-image . [(20180522 1424) nil "Show received image urls in the ERC buffer" single ((:commit . "82fb3871f02e24b1e880770b9a3d187aab43d0f0") (:keywords "multimedia") (:authors ("Jon de Andrés Frías" . "jondeandres@gmail.com") ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainer "Jon de Andrés Frías" . "jondeandres@gmail.com"))])
- (erc-scrolltoplace . [(20180608 606) ((emacs (24 0)) (switch-buffer-functions (0 0 1))) "An Erc module to scrolltobottom better with keep-place" single ((:commit . "feb0fbf1fd4bdf220ae2d31ea7c066d8e62089f9") (:keywords "erc" "module" "comm" "scrolltobottom" "keep-place") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:url . "http://gitlab.com/jgkamat/erc-scrolltoplace"))])
- (erc-social-graph . [(20150508 1204) nil "A social network graph module for ERC." single ((:commit . "e6ef3416a1c5064054bf054d9f0c1c7bf54a9cd0") (:keywords "erc" "graph") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:url . "https://github.com/vibhavp/erc-social-graph"))])
- (erc-status-sidebar . [(20171223 2124) ((emacs (24 5)) (seq (2 3))) "a hexchat-like activity overview for ERC channels" single ((:commit . "ea4189a1dbfe60117359c36e681ad7c389e2968c") (:authors ("Andrew Barbarello")) (:maintainer "Andrew Barbarello") (:url . "https://github.com/drewbarbs/erc-status-sidebar"))])
- (erc-terminal-notifier . [(20140115 1024) nil "OSX notifications via the terminal-notifier gem for Emacs ERC." single ((:commit . "a3dacb935845e4a20031212bbd82b2170f68d2a8") (:keywords "erc" "terminal-notifier" "nick") (:authors ("Julien Blanchard" . "julien@sideburns.eu")) (:maintainer "Julien Blanchard" . "julien@sideburns.eu") (:url . "http://github.com/julienXX/"))])
- (erc-track-score . [(20130328 1215) nil "Add score support to tracked channel buffers" single ((:commit . "5b27531ea6b1a4c4b703b270dfa9128cb5bfdaa3") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "http://julien.danjou.info/erc-track-score.html"))])
- (erc-tweet . [(20150920 1258) nil "shows text of a tweet when an url is posted in erc buffers" single ((:commit . "91fed61e139fa788d66a7358f0d50acc896414b8") (:keywords "extensions") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com"))])
- (erc-twitch . [(20170427 606) ((json (1 3)) (erc (5 0))) "Support for Twitch emotes for ERC." single ((:commit . "53c6af0cb72e56d897d30a40e7e5066668d6b5ec") (:keywords "twitch" "erc" "emotes") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:url . "https://github.com/vibhavp/erc-twitch"))])
- (erc-view-log . [(20140227 2039) nil "Major mode for viewing ERC logs" single ((:commit . "c5a25f0cbca84ed2e4f72068c02b66bd0ea3b266") (:keywords "erc" "viewer" "logs" "colors") (:authors ("Antoine Levitt") ("Thomas Riccardi" . "riccardi.thomas@gmail.com")) (:maintainer "Antoine Levitt") (:url . "http://github.com/Niluge-KiWi/erc-view-log/raw/master/erc-view-log.el"))])
- (erc-youtube . [(20150603 2136) nil "Show info about a YouTube URL in an ERC buffer." single ((:commit . "97054ba8475b442e2aa81e5a291f668b7f28697f") (:keywords "multimedia") (:authors ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainer "Raimon Grau Cuscó" . "raimonster@gmail.com"))])
- (erc-yt . [(20150426 1249) ((dash (2 10 0))) "An erc module to display youtube links nicely" single ((:commit . "43e7d49325b17a3217a6ffb4a9daf75c5ff4e6f8") (:keywords "multimedia") (:authors ("William Stevenson" . "yhvh2000@gmail.com")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com"))])
- (ercn . [(20150523 1503) nil "Flexible ERC notifications" single ((:commit . "79a4df5609046ae2e2e3375998287be6dda80615") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/ercn"))])
- (ereader . [(20170810 501) ((emacs (24 4)) (dash (2 12 1)) (s (1 10 0)) (xml+ (0 0 0))) "Major mode for reading ebooks with org-mode integration" tar ((:commit . "f3bbd3f13195f8fba3e3c880aab0e4c60430dcf3") (:keywords "epub" "ebook") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com") (:url . "https://github.com/bddean/emacs-ereader"))])
- (eredis . [(20181119 131) ((dash (0))) "eredis, a Redis client in emacs lisp" single ((:commit . "bc86b9f63a3e7a5eb263875030d0e15d6f5f6e37") (:keywords "redis" "api" "tools" "org") (:authors ("Justin Heyes-Jones" . "justinhj@gmail.com")) (:maintainer "Justin Heyes-Jones" . "justinhj@gmail.com") (:url . "http://github.com/justinhj/eredis/"))])
- (erefactor . [(20200513 1252) ((cl-lib (0 3))) "Emacs-Lisp refactoring utilities" single ((:commit . "bfe27a1b8c7cac0fe054e76113e941efa3775fe8") (:keywords "extensions" "tools" "maint") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-erefactor"))])
- (ergoemacs-mode . [(20200526 18) ((emacs (24 1)) (undo-tree (0 6 5)) (cl-lib (0 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "6a3214e1a892a45f575604f0bc4bb83175142aa4") (:keywords "convenience") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))])
- (ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" single ((:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:authors ("Matthew Fidler")) (:maintainer "Matthew Fidler"))])
- (erlang . [(20200519 530) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "9e02dd87caa5cc0adfc413c66aaf227b742cb11c"))])
- (erlstack-mode . [(20190812 1117) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" single ((:commit . "d0a67fb6f91cef02376e71b4b4669b071ebd9737") (:keywords "tools" "erlang") (:authors ("k32")) (:maintainer "k32") (:url . "https://github.com/k32/erlstack-mode"))])
- (eros . [(20180415 618) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" single ((:commit . "dd8910279226259e100dab798b073a52f9b4233a") (:keywords "convenience" "lisp") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:url . "https://github.com/xiongtx/eros"))])
- (ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" single ((:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:keywords "lisp" "test") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/ert-async.el"))])
- (ert-expectations . [(20121009 734) nil "The simplest unit test framework in the world" single ((:commit . "aed70e002c4305b66aed7f6d0d48e9addd2dc1e6") (:keywords "test" "unittest" "ert" "expectations") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/emacs/download/ert-expectations.el"))])
- (ert-junit . [(20190802 2232) ((ert (0)) (emacs (23 4))) "JUnit XML reports from ert results" single ((:commit . "65f91c35b088b87943dbbbe7e1ce354bc9bc0992") (:keywords "tools" "test" "unittest" "ert") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:url . "http://bitbucket.org/olanilsson/ert-junit"))])
- (ert-modeline . [(20140115 1015) ((s (1 3 1)) (dash (1 2 0)) (emacs (24 1)) (projectile (0 9 1))) "displays ert test results in the modeline." single ((:commit . "e7be2b81191afb437b70368a819770f8f750e4af") (:keywords "tools" "tests" "convenience") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))])
- (ert-runner . [(20200704 1048) ((s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Opinionated Ert testing workflow" tar ((:commit . "59a0f07f4f6b7c4757768309e8a47cec983e862a") (:keywords "test") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/ert-runner.el"))])
- (es-lib . [(20141111 1830) ((cl-lib (0 3))) "A collection of emacs utilities" tar ((:commit . "753b27363e39c10edc9e4e452bdbbbe4d190df4a") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/es-lib"))])
- (es-mode . [(20191119 2018) ((dash (2 11 0)) (cl-lib (0 5)) (spark (1 0)) (s (1 11 0)) (request (0 3 0))) "A major mode for editing and executing Elasticsearch queries" tar ((:commit . "9e5bcb290b38d5bd143e0ee480ed49147cfd3504") (:keywords "elasticsearch") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org") (:url . "http://www.github.com/dakrone/es-mode"))])
- (es-windows . [(20140211 904) ((cl-lib (0 3)) (emacs (24))) "Window-management utilities" single ((:commit . "239e30408cb1adb4bc8bd63e2df34711fa910b4f") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/es-windows"))])
- (esa . [(20180403 1525) ((cl-lib (0 5))) "Interface to esa.io" single ((:commit . "417e0ac55abe9b17e0b7165d0df26bc018aff42e") (:keywords "tools" "esa") (:authors ("Nab Inno" . "nab@blahfe.com")) (:maintainer "Nab Inno" . "nab@blahfe.com") (:url . "https://github.com/nabinno/esa.el"))])
- (esh-autosuggest . [(20190228 401) ((emacs (24 4)) (company (0 9 4))) "History autosuggestions for eshell" single ((:commit . "972094808d231a86dc6e43862191167b1997d840") (:keywords "completion" "company" "matching" "convenience" "abbrev") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:url . "http://github.com/dieggsy/esh-autosuggest"))])
- (esh-buf-stack . [(20140107 1018) nil "Add a buffer stack feature to Eshell" single ((:commit . "ce0ea5aadca3150eaa9d2e6ec20296add4e99176") (:keywords "eshell" "extensions") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))])
- (esh-help . [(20190905 22) ((dash (1 4 0))) "Add some help functions and support for Eshell" single ((:commit . "417673ed18a983930a66a6692dbfb288a995cb80") (:keywords "eshell" "extensions") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/esh-help/"))])
- (eshell-autojump . [(20150927 724) nil "autojump command for Eshell" single ((:commit . "c6a8b81a16576df9875e721fbbfe6690d04e7e43") (:authors ("Alex Schroeder")) (:maintainer "Yen-Chin, Lee" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/eshell-autojump"))])
- (eshell-bookmark . [(20170922 1514) ((emacs (24 3))) "Integrate bookmarks with eshell." single ((:commit . "99a491c77e27ecc4626bdd4ad453ac71aa2654d4") (:keywords "convenience" "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/eshell-bookmark"))])
- (eshell-did-you-mean . [(20150915 1952) ((emacs (24 1)) (cl-lib (0 5))) "command not found (\"did you mean…\" feature) in Eshell" single ((:commit . "7cb6ef8e2274d0a50a9e114d412307a6543533d5") (:keywords "eshell") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/eshell-did-you-mean"))])
- (eshell-fixed-prompt . [(20190111 2235) ((emacs (25)) (s (1 11 0))) "Restrict eshell to a single fixed prompt" single ((:commit . "2c860029354bf1f69edc1f12e4a0d9aeb9054f5d") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))])
- (eshell-fringe-status . [(20170117 2316) nil "Show last status in fringe" single ((:commit . "adc6997c68e39c0d52a2af1b2fd5cf2057783797") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:url . "http://projects.ryuslash.org/eshell-fringe-status/"))])
- (eshell-git-prompt . [(20200109 2250) ((emacs (24 1)) (cl-lib (0 5)) (dash (2 11 0))) "Some Eshell prompt for Git users" single ((:commit . "48ee35774c9b8d0e2d96110e3ae84bac60f43dfd") (:keywords "eshell" "git") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/eshell-git-prompt"))])
- (eshell-prompt-extras . [(20200319 322) ((emacs (25))) "Display extra information for your eshell prompt." single ((:commit . "1801b3aeccf1363f138fe01ee99d892d10fc2a07") (:keywords "eshell" "prompt") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/zwild/eshell-prompt-extras"))])
- (eshell-toggle . [(20200528 1124) ((emacs (25 1)) (dash (2 11 0))) "Show/hide eshell under active window." single ((:commit . "aeb7c121e4518c0edd1d2972851502303a299984") (:keywords "processes") (:authors ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainer "Dmitry Cherkassov" . "dcherkassov@gmail.com") (:url . "https://github.com/4da/eshell-toggle"))])
- (eshell-up . [(20170425 1737) ((emacs (24))) "Quickly go to a specific parent directory in eshell" single ((:commit . "9c100bae5c3020e8d9307e4332d3b64e7dc28519") (:keywords "eshell") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:url . "https://github.com/peterwvj/eshell-up"))])
- (eshell-z . [(20191116 333) ((cl-lib (0 5))) "cd to frequent directory in eshell" single ((:commit . "337cb241e17bd472bd3677ff166a0800f684213c") (:keywords "convenience") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/eshell-z"))])
- (eslint-fix . [(20180514 700) nil "Fix JavaScript files using ESLint" single ((:commit . "f81f3b47a47460611fbdbdae1d23275ec78f2f8d") (:keywords "tools" "javascript" "eslint" "lint" "formatting" "style") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp") (:url . "https://github.com/codesuki/eslint-fix"))])
- (eslintd-fix . [(20190830 2116) ((dash (2 12 0)) (emacs (24 3))) "use eslint_d to automatically fix js files" single ((:commit . "0c431141be9a408c28aead152ea454df0804364f") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/eslintd-fix"))])
- (esonify . [(20190110 1621) ((deferred (0 3 1)) (cl-lib (0 5))) "Sonify your code" tar ((:commit . "bdc79d4ab2e3c449b5bef46e5cabc552beeed5c6") (:authors ("Oliver Flatt" . "oflatt@gmail.com")) (:maintainer "Oliver Flatt" . "oflatt@gmail.com") (:url . "https://github.com/oflatt/esonify"))])
- (espresso-theme . [(20181025 826) nil "Espresso Tutti Colori port for Emacs" single ((:commit . "d2fa034eb833bf37cc6842017070725e0da9b046") (:authors ("Martin Kühl <purl.org/net/mkhl>")) (:maintainer "Martin Kühl <purl.org/net/mkhl>") (:url . "https://github.com/dgutov/espresso-theme"))])
- (espuds . [(20160905 1300) ((s (1 7 0)) (dash (2 2 0)) (f (0 12 1))) "Ecukes step definitions" single ((:commit . "78fc53feaf77a98d63894cd410faee2a18107b00") (:keywords "test") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/ecukes/espuds"))])
- (espy . [(20200317 2333) ((emacs (24))) "Emacs Simple Password Yielder" single ((:commit . "2c01be937a5e5bde62921684a0b27300705fb4e0") (:keywords "convenience") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/espy"))])
- (esqlite . [(20151206 1206) ((pcsv (1 3 3))) "Manipulate sqlite file from Emacs" single ((:commit . "08a779a821f8d32c1a1985d8d9eb6cf21646ce2e") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-esqlite"))])
- (esqlite-helm . [(20151116 850) ((esqlite (0 2 0)) (helm (20131207 845))) "Define helm source for sqlite database" single ((:commit . "08a779a821f8d32c1a1985d8d9eb6cf21646ce2e") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-esqlite"))])
- (ess . [(20200721 1405) ((emacs (25 1))) "Emacs Speaks Statistics" tar ((:commit . "39093a71f8bd90dd8604e0b9609efc442e75e4c9") (:authors ("David Smith" . "dsmith@stats.adelaide.edu.au") ("A.J. Rossini" . "blindglobe@gmail.com") ("Richard M. Heiberger" . "rmh@temple.edu") ("Kurt Hornik" . "Kurt.Hornik@R-project.org") ("Martin Maechler" . "maechler@stat.math.ethz.ch") ("Rodney A. Sparapani" . "rsparapa@mcw.edu") ("Stephen Eglen" . "stephen@gnu.org") ("Sebastian P. Luque" . "spluque@gmail.com") ("Henning Redestig" . "henning.red@googlemail.com") ("Vitalie Spinu" . "spinuvit@gmail.com") ("Lionel Henry" . "lionel.hry@gmail.com") ("J. Alexander Branham" . "alex.branham@gmail.com")) (:maintainer "ESS Core Team" . "ESS-core@r-project.org") (:url . "https://ess.r-project.org/"))])
- (ess-R-data-view . [(20130509 1158) ((ctable (20130313 1743)) (popup (20130324 1305)) (ess (20130225 1754))) "Data viewer for GNU R" single ((:commit . "d6e98d3ae1e2a2ea39a56eebcdb73e99d29562e9") (:keywords "convenience") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/ess-R-data-view.el"))])
- (ess-smart-equals . [(20190204 449) ((emacs (25 1)) (ess (18 10))) "flexible, context-sensitive assignment key for R/S" single ((:commit . "746cf9e78c3b86cbbf78d69c335a8a4ff3da79d6") (:keywords "r" "s" "ess" "convenience") (:authors ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu") (:url . "https://github.com/genovese/ess-smart-equals"))])
- (ess-smart-underscore . [(20190309 101) ((ess (0))) "Ess Smart Underscore" tar ((:commit . "aa871c5b0448515db439ea9bed6a8574e82ddb47") (:keywords "ess" "underscore") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew Fidler") (:url . "http://github.com/mlf176f2/ess-smart-underscore.el"))])
- (ess-view . [(20181001 1730) ((ess (15)) (s (1 8 0)) (f (0 16 0))) "View R dataframes in a spreadsheet software" single ((:commit . "d4e5a340b7bcc58c434867b97923094bd0680283") (:keywords "extensions" "ess") (:authors ("Bocci Gionata" . "boccigionata@gmail.com")) (:maintainer "Bocci Gionata" . "boccigionata@gmail.com") (:url . "https://github.com/GioBo/ess-view"))])
- (esup . [(20200318 2256) ((cl-lib (0 5)) (emacs (25))) "The Emacs StartUp Profiler (ESUP)" tar ((:commit . "c9c95e245068d15d8e2732098af9a5d2bc8ec931") (:keywords "convenience" "processes") (:authors ("Joe Schafer" . "joe@jschaf.com")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:url . "https://github.com/jschaf/esup"))])
- (esxml . [(20171129 807) nil "Library for working with xml via esxml and sxml" tar ((:commit . "193d199305e7abcb5ed795b9bc5434ded20ae60e"))])
- (etable . [(20161028 2009) ((dash (2 9 0)) (interval-list (0 1)) (emacs (24 4))) "Implementation of javax.swing.JTable for Emacs." tar ((:commit . "d502141f0c69bf95256ba5cb9cd15350c7e942d2"))])
- (etc-sudoers-mode . [(20200608 1555) nil "Edit Sudo security policies" single ((:commit . "52d5be9214185cfbba56e0b39bc4af474fc95f45") (:keywords "languages") (:authors ("Peter Oliver" . "git@mavit.org.uk")) (:maintainer "Peter Oliver" . "git@mavit.org.uk") (:url . "https://gitlab.com/mavit/etc-sudoers-mode/"))])
- (eterm-256color . [(20190123 401) ((emacs (24 4)) (xterm-color (1 7)) (f (0 19 0))) "Customizable 256 colors for term." tar ((:commit . "0f0dab497239ebedbc9c4a48b3ec8cce4a47e980") (:keywords "faces") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:url . "http://github.com/dieggsy/eterm-256color"))])
- (eterm-fn . [(20191010 2331) ((term (0))) "Function keys (F1--F12) for term." tar ((:commit . "66f3b2f6308fa2ac4d8a32be5a7e35a96e08a9ee") (:url . "https://github.com/oitofelix/eterm-fn") (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")))])
- (ethan-wspace . [(20190522 1448) nil "whitespace customizations for emacs" single ((:commit . "0f110fc26b829093c352e8dc9e50ba51a4e483ac") (:keywords "whitespace" "tab" "newline" "trailing" "clean") (:authors ("Ethan Glasser-Camp" . "ethan@betacantrips.com")) (:maintainer "Ethan Glasser-Camp" . "ethan@betacantrips.com"))])
- (euslisp-mode . [(20170830 1929) ((emacs (24 3)) (s (1 9)) (exec-path-from-shell (0)) (helm-ag (0 58))) "Major mode for Euslisp-formatted text" single ((:commit . "db62a2d148482317794727982576494596365a55") (:keywords "euslisp" "euslisp" "github") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:url . "https://github.com/iory/euslisp-mode"))])
- (eval-expr . [(20120619 647) nil "enhanced eval-expression command" single ((:commit . "a0e69e83de41df8dbccefc1962ab4f02206a3328") (:keywords "lisp" "extensions") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainer nil . "friedman@splode.com"))])
- (eval-in-repl . [(20191116 1107) ((dash (0 0 0)) (paredit (0 0 0)) (ace-window (0 0 0))) "Consistent ESS-like eval interface for various REPLs" tar ((:commit . "c8e5f31a2476c922857d921e367b6a2320ce5a6f") (:url . "https://github.com/kaz-yos/eval-in-repl/"))])
- (eval-sexp-fu . [(20191128 825) ((cl-lib (0))) "Tiny functionality enhancements for evaluating sexps." single ((:commit . "36d2fe3bcf602e15ca10a7f487da103515ef391a") (:keywords "lisp" "highlight" "convenience") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net"))])
- (evalator . [(20160213 128) ((helm-core (1 9 1))) "Package for interactive transformation of data with helm" tar ((:commit . "f30da4da48c0b3f3cfa1fc1c7cfdb53ffe79df36") (:keywords "languages" "elisp" "helm") (:authors ("Sean Irby")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com") (:url . "http://www.github.com/seanirby/evalator"))])
- (evalator-clojure . [(20160208 2148) ((cider (0 10 0)) (evalator (1 0 0))) "Clojure evaluation context for evalator via CIDER." tar ((:commit . "caa4e0a137bdfada86593128a654e16aa617ad50") (:keywords "languages" "clojure" "cider" "helm") (:authors ("Sean Irby")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com") (:url . "http://www.github.com/seanirby/evalator-clojure"))])
- (eve-mode . [(20170822 2231) ((emacs (25)) (polymode (1 0)) (markdown-mode (2 0))) "Major mode for editing Eve documents." single ((:commit . "a4661114d9c18725691b76321d72167ca5a9070a") (:keywords "languages" "wp" "tools") (:authors ("Joshua Cole" . "joshuafcole@gmail.com")) (:maintainer "Joshua Cole" . "joshuafcole@gmail.com") (:url . "https://github.com/witheve/emacs-eve-mode"))])
- (evil . [(20200718 842) ((emacs (24 1)) (undo-tree (0 7 4)) (goto-chg (1 6)) (cl-lib (0 5))) "Extensible Vi layer for Emacs." tar ((:commit . "2bc6ca3587502fde67b93e411e329fc8224c916a"))])
- (evil-anzu . [(20200514 1902) ((evil (1 0 0)) (anzu (0 46))) "anzu for evil-mode" single ((:commit . "d3f6ed4773b48767bd5f4708c7f083336a8a8a86") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Fredrik Bergroth" . "fbergroth@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-evil-anzu"))])
- (evil-args . [(20180908 2157) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil." single ((:commit . "758ad5ae54ad34202064fec192c88151c08cb387") (:keywords "evil" "vim-emulation") (:authors ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainer "Connor Smith" . "wconnorsmith@gmail.com") (:url . "http://github.com/wcsmith/evil-args"))])
- (evil-avy . [(20150908 748) ((emacs (24 1)) (cl-lib (0 5)) (avy (0 3 0)) (evil (1 2 3))) "set-based completion" single ((:commit . "2dd955cc3ecaa7ddeb67b295298abdc6d16dd3a5") (:keywords "point" "location" "evil" "vim") (:authors ("Yufan Lou" . "loganlyf@gmail.com")) (:maintainer "Yufan Lou" . "loganlyf@gmail.com") (:url . "https://github.com/louy2/evil-avy"))])
- (evil-better-visual-line . [(20200123 2045) ((evil (1 2 13))) "gj and gk visual line mode fix" single ((:commit . "4373f930ab1a8d3a2a90e68540967702313b2ce9") (:keywords "evil" "vim" "motion") (:authors ("<nuckollsp at gmail.com>")) (:maintainer "<nuckollsp at gmail.com>") (:url . "https://github.com/yourfin/evil-better-visual-line"))])
- (evil-cleverparens . [(20170718 413) ((evil (1 0)) (paredit (1)) (smartparens (1 6 1)) (emacs (24 4)) (dash (2 12 0))) "Evil friendly minor-mode for editing lisp." tar ((:commit . "8c45879d49bfa6d4e414b6c1df700a4a51cbb869") (:keywords "cleverparens" "parentheses" "evil" "paredit" "smartparens") (:authors ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainer "Olli Piepponen" . "opieppo@gmail.com") (:url . "https://github.com/luxbock/evil-cleverparens"))])
- (evil-colemak-basics . [(20200630 1936) ((emacs (24 3)) (evil (1 2 12)) (evil-snipe (2 0 3))) "Basic Colemak key bindings for evil-mode" single ((:commit . "dcdf5c3e844f6eef2bf9d6a502cf8c81b3edaff2") (:keywords "convenience" "emulations" "colemak" "evil") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/evil-colemak-basics"))])
- (evil-colemak-minimal . [(20171006 1317) ((emacs (24)) (evil (1 2 12))) "Minimal Colemak key bindings for evil-mode" single ((:commit . "6d98b6da60f414524a0d718f76024c26dce742b3") (:keywords "colemak" "evil") (:authors ("Bryan Allred" . "bryan@revolvingcow.com")) (:maintainer "Bryan Allred" . "bryan@revolvingcow.com") (:url . "https://github.com/bmallred/evil-colemak-minimal"))])
- (evil-collection . [(20200711 2026) ((emacs (25 1)) (evil (1 2 13)) (annalist (1 0))) "A set of keybindings for Evil mode" tar ((:commit . "3e62b6b1312f7907081be41a032aaacffa732fef") (:keywords "evil" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/emacs-evil/evil-collection"))])
- (evil-commentary . [(20170413 1451) ((evil (1 0 0))) "Comment stuff out. A port of vim-commentary." tar ((:commit . "395f91014b69844b81660c155f42eb9b1b3d199d") (:keywords "evil" "comment" "commentary" "evil-commentary") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:url . "http://github.com/linktohack/evil-commentary"))])
- (evil-dvorak . [(20160416 1841) ((evil (1 0 8))) "evil keybindings for that work with dvorak mode" tar ((:commit . "824f7c56980d72a0ff04c662223540cd66f13754") (:keywords "evil" "vim-emulation" "dvorak" "keyboard") (:url . "https://github.com/jbranso/evil-dvorak.git"))])
- (evil-easymotion . [(20200424 135) ((emacs (24)) (avy (0 3 0)) (cl-lib (0 5))) "A port of vim's easymotion to emacs" single ((:commit . "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") (:keywords "convenience" "evil") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/pythonnut/evil-easymotion"))])
- (evil-ediff . [(20170724 1923) ((evil (1 2 3))) "Make ediff a little evil" single ((:commit . "50d26cb0654fca8f8fd7227410e5cbf0b8f681cf") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/evil-ediff"))])
- (evil-embrace . [(20160519 1829) ((emacs (24 4)) (embrace (0 1 0)) (evil-surround (0))) "Evil integration of embrace.el" single ((:commit . "4379adea032b25e359d01a36301b4a5afdd0d1b7") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (evil-escape . [(20180910 1234) nil "No description available." single ((:commit . "f4e9116bfbaac8c9d210c17ad488e0982291245f"))])
- (evil-ex-fasd . [(20180903 612) ((emacs (24 4)) (evil (1 1 0)) (fasd (0))) "using fasd right from evil-ex" single ((:commit . "ed8fbbe23a8a268d9dcbf1a6132e928ba2c655c5") (:keywords "tools" "fasd" "evil" "navigation") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:url . "https://github.com/yqrashawn/evil-ex-fasd"))])
- (evil-ex-shell-command . [(20181226 226) ((emacs (24 4)) (evil (1 1 0))) "invoke shell-command right from evil-ex" single ((:commit . "a6ca6d27c07f6a0807abfb5b8f8865f1d17f54aa") (:keywords "tools" "shell-command" "evil") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:url . "https://github.com/yqrashawn/evil-ex-shell-command"))])
- (evil-exchange . [(20200118 252) ((evil (1 2 8)) (cl-lib (0 3))) "Exchange text more easily within Evil" single ((:commit . "3030e21ee16a42dfce7f7cf86147b778b3f5d8c1") (:keywords "evil" "plugin") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:url . "http://github.com/Dewdrops/evil-exchange"))])
- (evil-expat . [(20190521 714) ((emacs (24 3)) (evil (1 0 0))) "Evil ex commands" single ((:commit . "f4fcd0aa3edc359adb5c986b5dd9188d220d84e2") (:keywords "emulations" "evil" "vim") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:url . "http://github.com/edkolev/evil-expat"))])
- (evil-extra-operator . [(20161213 403) ((evil (1 0 7))) "Evil operator for evaluating codes, taking notes, searching via google, etc." single ((:commit . "e16a9b36f9901254da9af8a73871061616410fc3") (:keywords "evil" "plugin") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:url . "http://github.com/Dewdrops/evil-extra-operator"))])
- (evil-find-char-pinyin . [(20160514 2041) ((evil (1 2 12)) (pinyinlib (0 1 0))) "Evil's f/F/t/T/evil-snipe commands with Pinyin support" single ((:commit . "04e277946d658f1a73c68dcbbadea9c21097a31c") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (evil-fringe-mark . [(20190320 453) ((emacs (24 3)) (evil (1 0 0)) (fringe-helper (0 1 1)) (goto-chg (1 6))) "Display evil-mode marks in the fringe" tar ((:commit . "a1689fddb7ee79aaa720a77aada1208b8afd5c20") (:authors ("Andrew Smith" . "andy.bill.smith@gmail.com")) (:maintainer "Andrew Smith" . "andy.bill.smith@gmail.com") (:url . "https://github.com/Andrew-William-Smith/evil-fringe-mark"))])
- (evil-god-state . [(20141117 255) ((evil (1 0 8)) (god-mode (2 12 0))) "use god-mode keybindings in evil-mode" single ((:commit . "3d44197dc0a1fb40e7b7ff8717f8a8c339ce1d40") (:keywords "evil" "leader" "god-mode") (:authors ("Eric Seidel")) (:maintainer "Eric Seidel") (:url . "https://github.com/gridaphobe/evil-god-state"))])
- (evil-goggles . [(20200101 1935) ((emacs (24 4)) (evil (1 0 0))) "Add a visual hint to evil operations" single ((:commit . "08a22058fd6a167f9f1b684c649008caef571459") (:keywords "emulations" "evil" "vim" "visual") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:url . "http://github.com/edkolev/evil-goggles"))])
- (evil-iedit-state . [(20180607 558) ((evil (1 0 9)) (iedit (0 97))) "Evil states to interface iedit mode." single ((:commit . "f75cff4ecbd5beaa9ca64a6c157c4105f078daec") (:keywords "convenience" "editing" "evil" "iedit" "mnemonic") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:url . "https://github.com/syl20bnr/evil-iedit-state"))])
- (evil-indent-plus . [(20151109 1906) ((evil (0)) (cl-lib (0 5))) "Evil textobjects based on indentation" single ((:commit . "0c7501e6efed661242c3a20e0a6c79a6455c2c40") (:keywords "convenience" "evil") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:url . "http://github.com/TheBB/evil-indent-plus"))])
- (evil-indent-textobject . [(20130831 2219) ((evil (0))) "evil textobjects based on indentation" single ((:commit . "70a1154a531b7cfdbb9a31d6922482791e20a3a7") (:keywords "convenience" "evil") (:authors ("Michael Markert" . "markert.michael@gmail.com")) (:maintainer "Michael Markert" . "markert.michael@gmail.com") (:url . "http://github.com/cofi/evil-indent-textobject"))])
- (evil-leader . [(20140606 1243) ((evil (0))) "let there be <leader>" single ((:commit . "39f7014bcf8b36463e0c7512c638bda4bac6c2cf") (:keywords "evil" "vim-emulation" "leader") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:url . "http://github.com/cofi/evil-leader"))])
- (evil-ledger . [(20180802 1612) ((emacs (24 4)) (evil (1 2 12)) (ledger-mode (0))) "Make `ledger-mode' more `evil'." single ((:commit . "7a9f9f5d39c42fffdba8004f8982642351f2b233") (:keywords "convenience" "evil" "languages" "ledger" "vim-emulation") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:url . "https://github.com/atheriel/evil-ledger"))])
- (evil-lion . [(20170811 614) ((emacs (24 3)) (evil (1 0 0))) "Evil align operator, port of vim-lion" single ((:commit . "6b03593f5dd6e7c9ca02207f9a73615cf94c93ab") (:keywords "emulations" "evil" "vim") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:url . "http://github.com/edkolev/evil-lion"))])
- (evil-lisp-state . [(20160404 248) ((evil (1 0 9)) (bind-map (0)) (smartparens (1 6 1))) "An evil state to edit Lisp code" single ((:commit . "3c65fecd9917a41eaf6460f22187e2323821f3ce") (:keywords "convenience" "editing" "evil" "smartparens" "lisp" "mnemonic") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:url . "https://github.com/syl20bnr/evil-lisp-state"))])
- (evil-lispy . [(20190502 739) ((lispy (0 26 0)) (evil (1 2 12)) (hydra (0 13 5))) "precision Lisp editing with Evil and Lispy" tar ((:commit . "ed317f7fccbdbeea8aa04a91b1b1f48a0e2ddc4e") (:keywords "lisp") (:authors ("Brandon Carrell <brandoncarrell@gmail.com>, Mika Vilpas" . "mika.vilpas@gmail.com")) (:maintainer "Brandon Carrell <brandoncarrell@gmail.com>, Mika Vilpas" . "mika.vilpas@gmail.com") (:url . "https://github.com/sp3ctum/evil-lispy"))])
- (evil-magit . [(20200604 110) ((evil (1 2 3)) (magit (2 6 0))) "evil-based key bindings for magit" single ((:commit . "88dc26ce59dbf4acb4e2891c79c4bd329553ba56") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/evil-magit"))])
- (evil-mark-replace . [(20200630 940) ((evil (1 14 0))) "replace the thing in marked area" single ((:commit . "d4fec7b10e93cca149163324cd2b2b2dcc211047") (:keywords "convenience") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/evil-mark-replace"))])
- (evil-matchit . [(20200723 238) ((evil (1 2 0)) (emacs (24 4))) "Vim matchit ported to Evil" tar ((:commit . "437f67689cc4685b92428986b5823093aa0be054") (:keywords "matchit" "vim" "evil") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/evil-matchit"))])
- (evil-mc . [(20200228 1535) ((emacs (24 3)) (evil (1 2 14)) (cl-lib (0 5))) "Multiple cursors for evil-mode" tar ((:commit . "4d4c0172e4c7f80acc1d0e73d5fb3e536929b262") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com") (:url . "https://github.com/gabesoft/evil-mc"))])
- (evil-mc-extras . [(20170202 1649) ((emacs (24 3)) (evil (1 2 12)) (cl-lib (0 5)) (evil-mc (0 0 2)) (evil-numbers (0 4))) "Extra functionality for evil-mc" tar ((:commit . "8c1af3232dd1e15b2ea38360b8cd1e857e11c416") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc-extras") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com") (:url . "https://github.com/gabesoft/evil-mc-extras"))])
- (evil-mu4e . [(20180613 1039) ((emacs (24 4)) (evil (1 2 10))) "evil-based key bindings for mu4e" single ((:commit . "5b22c1e30246318f233264506272d770f63897ca") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl") (:url . "https://github.com/JorisE/evil-mu4e"))])
- (evil-multiedit . [(20200229 528) ((emacs (24 4)) (evil (1 2 12)) (iedit (0 9)) (cl-lib (0 5))) "multiple cursors for evil-mode" single ((:commit . "9f271e0e6048297692f80ed6c5ae8994ac523abc") (:keywords "multiple cursors" "editing" "iedit") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/evil-multiedit"))])
- (evil-nerd-commenter . [(20200630 911) ((emacs (24 4))) "Comment/uncomment lines efficiently. Like Nerd Commenter in Vim" tar ((:commit . "87734b9c7fcd047f73a072b9d03ec05f786eeb03") (:keywords "convenience" "evil") (:authors ("Chen Bin <chenbin DOT sh AT gmail.com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail.com>") (:url . "http://github.com/redguardtoo/evil-nerd-commenter"))])
- (evil-nl-break-undo . [(20181125 2054) nil "Break evil's undo sequence on CR" single ((:commit . "4a8f2bf99c978a109eeb92965a72a17bedb68762") (:authors ("VanLaser" . "Gabriel.Lazar@com.utcluj.ro")) (:maintainer "VanLaser" . "Gabriel.Lazar@com.utcluj.ro") (:url . "https://github.com/VanLaser/evil-nl-break-undo"))])
- (evil-numbers . [(20140606 1251) nil "increment/decrement numbers like in vim" single ((:commit . "6ea1c8c3a9b37bed63d48f1128e9a4910e68187e") (:keywords "numbers" "increment" "decrement" "octal" "hex" "binary") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:url . "http://github.com/cofi/evil-numbers"))])
- (evil-opener . [(20161207 1810) ((evil (1 2 12)) (opener (0 2 2))) "opening urls as buffers in evil" tar ((:commit . "c384f67278046fdcd220275fdd212ab85672cbeb") (:keywords "url" "http" "files") (:authors ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainer "Tim Reddehase" . "tr@rightsrestricted.com") (:url . "https://github.com/0robustus1/opener.el"))])
- (evil-org . [(20200601 1855) ((emacs (24 4)) (evil (1 0))) "evil keybindings for org-mode" tar ((:commit . "4b23116a6ecfa687819050e5a9a419cf08d5ba90") (:keywords "evil" "vim-emulation" "org-mode" "key-bindings" "presets") (:maintainer "Somelauw") (:url . "https://github.com/Somelauw/evil-org-mode.git"))])
- (evil-owl . [(20200113 405) ((emacs (25 1)) (evil (1 2 13))) "Preview evil registers and marks before using them" single ((:commit . "ed5a98644a9cf321de213b50df6473de9f3a71ed") (:keywords "emulations" "evil" "visual") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:url . "https://github.com/mamapanda/evil-owl"))])
- (evil-paredit . [(20150413 2048) ((evil (1 0 9)) (paredit (25 -2))) "Paredit support for evil keybindings" single ((:commit . "e058fbdcf9dbf7ad6cc77f0172d7517ef233d55f") (:keywords "paredit" "evil") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:url . "https://github.com/roman/evil-paredit"))])
- (evil-pinyin . [(20200726 546) ((emacs (25)) (names (0 5)) (evil (1))) "Evil search Chinese characters by pinyin" tar ((:commit . "ee4ea5a297fb8a445e0c886f9d20bbd4e94c00df") (:keywords "extensions") (:url . "https://github.com/laishulu/evil-pinyin"))])
- (evil-python-movement . [(20180724 1420) ((emacs (25 1)) (cl-lib (0 5)) (dash (2 13 0)) (evil (1 0)) (s (1 12 0))) "Port Neovim's python movement to Evil" single ((:commit . "9936b3b7f8d96415d517c1f3604637889484a637") (:authors ("Felipe Lema <felipelema en mortemale punto org>")) (:maintainer "Felipe Lema <felipelema en mortemale punto org>") (:url . "https://bitbucket.org/FelipeLema/evil-python-movement.el/"))])
- (evil-quickscope . [(20160202 1924) ((evil (0))) "Highlight unique characters in words for f,F,t,T navigation" single ((:commit . "37a20e4c56c6058abf186ad4013c155e695e876f") (:keywords "faces" "emulation" "vim" "evil") (:authors ("Michael Chen" . "blorbx@gmail.com")) (:maintainer "Michael Chen" . "blorbx@gmail.com") (:url . "http://github.com/blorbx/evil-quickscope"))])
- (evil-rails . [(20190512 1517) ((evil (1 0)) (projectile-rails (1 0))) "Rails support for Evil Mode" single ((:commit . "b0f1c5de6720714febeb76c4b569b71bb891938c") (:keywords "ruby" "rails" "vim" "project" "convenience" "web" "evil" "projectile") (:authors ("Antono Vasiljev" . "antono.vasiljev@gmail.com")) (:maintainer "Antono Vasiljev" . "antono.vasiljev@gmail.com") (:url . "https://github.com/antono/evil-rails"))])
- (evil-replace-with-char . [(20180324 2206) ((evil (1 2 13)) (emacs (24))) "replace chars of a text object with a char" single ((:commit . "ed4a12d5bff11163eb03ad2826c52fd30f51a8d3") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/evil-replace-with-char"))])
- (evil-replace-with-register . [(20170713 925) ((evil (1 0 8))) "Port of vim plugin ReplaceWithRegister" single ((:commit . "91cc7bf21a94703c441cc9212214075b226b7f67") (:keywords "evil" "plugin") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:url . "https://github.com/Dewdrops/evil-ReplaceWithRegister"))])
- (evil-rsi . [(20160221 2104) ((evil (1 0 0))) "Use emacs motion keys in evil, inspired by vim-rsi" single ((:commit . "65ae60866be494e4622fe383e23975e04d2a42a3") (:keywords "evil" "rsi" "evil-rsi") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:url . "http://github.com/linktohack/evil-rsi"))])
- (evil-ruby-text-objects . [(20200323 1552) ((emacs (25 1)) (evil (1 2 0))) "Evil text objects for Ruby code" single ((:commit . "32983d91be83ed903b6ef9655e00f69beed2572c") (:keywords "languages") (:authors ("Sergio Gil" . "sgilperez@gmail.com")) (:maintainer "Sergio Gil" . "sgilperez@gmail.com") (:url . "https://github.com/porras/evil-ruby-text-objects"))])
- (evil-search-highlight-persist . [(20170523 334) ((highlight (0))) "Persistent highlights after search" single ((:commit . "979d2dec58d3b9c5ca5fdf4bb802a0209913794e") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net"))])
- (evil-smartparens . [(20171210 1513) ((evil (1 0)) (emacs (24 4)) (smartparens (1 10 1))) "Evil support for smartparens" single ((:commit . "026d4a3cfce415a4dfae1457f871b385386e61d3") (:keywords "evil" "smartparens") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:url . "https://www.github.com/expez/evil-smartparens"))])
- (evil-snipe . [(20200531 1008) ((emacs (24 4)) (evil (1 2 12)) (cl-lib (0 5))) "emulate vim-sneak & vim-seek" single ((:commit . "6dcac7f2516c6137a2de532fc2c052f242559ee3") (:keywords "emulation" "vim" "evil" "sneak" "seek") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/evil-snipe"))])
- (evil-space . [(20151208 1228) ((evil (1 0 0))) "Repeat motion in Evil. Correct the behaviour of what SPC should do." single ((:commit . "a9c07284d308425deee134c9d88a2d538dd229e6") (:keywords "space" "repeat" "motion") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:url . "http://github.com/linktohack/evil-space"))])
- (evil-string-inflection . [(20180313 1755) ((emacs (24)) (evil (1 2 13)) (string-inflection (1 0 6))) "snake_case -> CamelCase -> etc. for text objects" single ((:commit . "d22a90ab807afa7f27f3815b5b5ea47d52d05218") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/evil-string-inflection"))])
- (evil-surround . [(20200603 2216) ((evil (1 2 12))) "emulate surround.vim from Vim" single ((:commit . "346d4d85fcf1f9517e9c4991c1efe68b4130f93a") (:keywords "emulation" "vi" "evil") (:authors ("Tim Harper <timcharper at gmail dot com>") ("Vegard Øye <vegard_oye at hotmail dot com>")) (:maintainer "Tim Harper <timcharper at gmail dot com>"))])
- (evil-swap-keys . [(20191105 1426) ((emacs (24 4))) "Intelligently swap keys on text input with evil" single ((:commit . "b5ef105499f998b5667da40da30c073229a213ea") (:keywords "convenience" "data" "languages" "tools") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/evil-swap-keys"))])
- (evil-tabs . [(20160217 1520) ((evil (0 0 0)) (elscreen (0 0 0))) "Integrating Vim-style tabs for Evil mode users." single ((:commit . "53d3314a810017b6056ab6796aef671f5ea1c063") (:keywords "evil" "tab" "tabs" "vim") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/evil-tabs"))])
- (evil-terminal-cursor-changer . [(20170401 842) ((evil (1 0 8))) "Change cursor shape and color by evil state in terminal" single ((:commit . "b49ca4393d2f3cc6014174950059b36a5cb22949") (:keywords "evil" "terminal" "cursor") (:authors ("7696122")) (:maintainer "7696122") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))])
- (evil-test-helpers . [(20200304 911) ((evil (1 14 0))) "unit test helpers for Evil" single ((:commit . "2bc6ca3587502fde67b93e411e329fc8224c916a") (:authors ("Vegard Øye <vegard_oye at hotmail.com>")) (:maintainer "Vegard Øye <vegard_oye at hotmail.com>"))])
- (evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" single ((:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:keywords "convenience" "languages" "tools") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/evil-text-object-python"))])
- (evil-textobj-anyblock . [(20170905 1907) ((cl-lib (0 5)) (evil (1 1 0))) "Textobject for the closest user-defined blocks." single ((:commit . "ff00980f0634f95bf2ad9956b615a155ea8743be") (:keywords "evil") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:url . "https://github.com/noctuid/evil-textobj-anyblock"))])
- (evil-textobj-column . [(20170905 1905) ((names (0 5)) (emacs (24)) (evil (0))) "Provides column text objects." single ((:commit . "835d7036d0bc9a6e44fc9b7c54ccf2a7c01428cd") (:keywords "evil" "column" "text-object") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:url . "https://github.com/noctuid/evil-textobj-column"))])
- (evil-textobj-entire . [(20150422 1254) ((emacs (24)) (evil (1 0 0))) "text object for entire lines of buffer for evil" single ((:commit . "5b3a98f3a69edc3a788f539f6ffef4a0ef5e853d") (:keywords "convenience" "emulations") (:authors ("supermomonga")) (:maintainer "supermomonga") (:url . "https://github.com/supermomonga/evil-textobj-entire"))])
- (evil-textobj-line . [(20150729 1522) ((evil (1 0 0))) "evil textobj line" single ((:commit . "3d401b6831bdbeec967ec8e64177a8950251e812") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-evil-textobj-line"))])
- (evil-textobj-syntax . [(20181210 1213) ((names (0 5)) (emacs (24)) (evil (0))) "Provides syntax text objects." single ((:commit . "2d9ba8c75c754b409aea7469f46a5cfa52a872f3") (:keywords "evil" "syntax" "highlight" "text-object") (:url . "https://github.com/laishulu/evil-textobj-syntax"))])
- (evil-traces . [(20191214 558) ((emacs (25 1)) (evil (1 2 13))) "Visual hints for `evil-ex'" single ((:commit . "bc25cae9fa5ab0ba1507827f0944f52ce0ca7462") (:keywords "emulations" "evil" "visual") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:url . "https://github.com/mamapanda/evil-traces"))])
- (evil-tutor . [(20150103 650) ((evil (1 0 9))) "Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "4e124cd3911dc0d1b6817ad2c9e59b4753638f28") (:keywords "convenience" "editing" "evil") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:url . "https://github.com/syl20bnr/evil-tutor"))])
- (evil-tutor-ja . [(20160917 132) ((evil (1 0 9)) (evil-tutor (0 1))) "Japanese Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "99af7d82e02ce3bcdfaff47c5c80b57327a7ea8d") (:keywords "convenience" "editing" "evil" "japanese") (:authors ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainer "Kenji Miyazaki" . "kenjizmyzk@gmail.com") (:url . "https://github.com/kenjimyzk/evil-tutor-ja"))])
- (evil-vimish-fold . [(20200122 117) ((emacs (24 4)) (evil (1 0 0)) (vimish-fold (0 2 0))) "Integrate vimish-fold with evil" single ((:commit . "b6e0e6b91b8cd047e80debef1a536d9d49eef31a") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/evil-vimish-fold"))])
- (evil-visual-mark-mode . [(20190116 1557) ((evil (1 0 9)) (dash (2 10))) "Display evil marks on buffer" single ((:commit . "ac5997971972a9251f140b5542d82790ca4a43b4") (:keywords "evil") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))])
- (evil-visual-replace . [(20171016 613) ((evil (1 0 0))) "search/replace commands for evil visual state, inc. blocks" single ((:commit . "163fc827a1ffc106475da470c37fb26f4cc9b008") (:keywords "evil" "search" "replace" "regexp" "block" "rectangular" "region" "visual") (:authors ("Troy Pracy")) (:maintainer "Troy Pracy") (:url . "https://github.com/troyp/evil-visual-replace"))])
- (evil-visualstar . [(20160223 48) ((evil (0))) "Starts a * or # search from the visual selection" single ((:commit . "06c053d8f7381f91c53311b1234872ca96ced752") (:keywords "evil" "vim" "visualstar") (:authors ("Bailey Ling")) (:maintainer "Bailey Ling") (:url . "https://github.com/bling/evil-visualstar"))])
- (evm . [(20141007 1156) ((dash (2 3 0)) (f (0 13 0))) "Emacs Version Manager" single ((:commit . "d0623b2355436a5fd9f7238b419782080c79196b") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/evm"))])
- (ewal . [(20200305 230) ((emacs (25 1))) "A pywal-based theme generator" tar ((:commit . "4ecc355dae9c7d648cd2874e01a15dfa02b9350d") (:keywords "faces") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/ewal"))])
- (ewal-doom-themes . [(20200301 839) ((emacs (25)) (ewal (0 1)) (doom-themes (0 1))) "Dread the colors of darkness" tar ((:commit . "4ecc355dae9c7d648cd2874e01a15dfa02b9350d") (:keywords "faces") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/ewal"))])
- (ewal-evil-cursors . [(20190911 1315) ((emacs (25)) (ewal (0 1))) "`ewal'-colored evil cursor for Emacs and Spacemacs" single ((:commit . "4ecc355dae9c7d648cd2874e01a15dfa02b9350d") (:keywords "faces") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/ewal"))])
- (ewal-spacemacs-themes . [(20190911 1305) ((emacs (25)) (ewal (0 1)) (spacemacs-theme (0 1))) "Ride the rainbow spaceship" tar ((:commit . "4ecc355dae9c7d648cd2874e01a15dfa02b9350d") (:keywords "faces") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/ewal"))])
- (ewmctrl . [(20170922 217) nil "Use `wmctrl' to manage desktop windows via EWMH/NetWM." single ((:commit . "3d0217c4d6cdb5c308b6cb4293574f470d4faacf") (:keywords "desktop" "windows" "ewmh" "netwm") (:authors ("Alexis" . "flexibeast@gmail.com") ("Adam Plaice" . "plaice.adam@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:url . "https://github.com/flexibeast/ewmctrl"))])
- (eww-lnum . [(20150102 1512) nil "Conkeror-like functionality for eww" single ((:commit . "4b0ecec769919ecb05ca4fb15ec51911ba589929") (:keywords "eww" "browse" "conkeror") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:url . "https://github.com/m00natic/eww-lnum"))])
- (exato . [(20180305 1042) ((evil (1 2 13)) (emacs (24))) "EXATO: Evil XML/HTML Attributes Text Object" single ((:commit . "aee7af7b7a0e7551478f453d1de7d5b9cb2e06c4") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/exato"))])
- (exec-path-from-shell . [(20200526 324) ((emacs (24 1))) "Get environment variables such as $PATH from the shell" single ((:commit . "e1f14450f172d29a0024806404dfe4b70bfcd371") (:keywords "unix" "environment") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/exec-path-from-shell"))])
- (execline . [(20190711 2010) ((emacs (26 1)) (s (1 6 0))) "Major mode for editing execline scripts" single ((:commit . "c75dd9b2c54d8e59fc35fd4bd98d8e213948a3f5") (:keywords "tools" "unix" "languages") (:authors ("Dmitry Bogatov" . "KAction@debian.org")) (:maintainer "Dmitry Bogatov" . "KAction@debian.org") (:url . "https://gitlab.com/KAction/emacs-execline"))])
- (exiftool . [(20190520 1106) ((emacs (25))) "Elisp wrapper around ExifTool" single ((:commit . "e043df1bcef40cd5934a74c210e1e35d5eb0e5a6") (:keywords "data") (:authors ("Arun I" . "arunisaac@systemreboot.net")) (:maintainer "Arun I" . "arunisaac@systemreboot.net") (:url . "https://git.systemreboot.net/exiftool.el"))])
- (exotica-theme . [(20180212 2329) ((emacs (24))) "A dark theme with vibrant colors" single ((:commit . "ff3ef4f6fa38c93b99becad977c7810c990a4d2f") (:keywords "faces" "theme" "dark" "vibrant colors") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com") (:url . "https://github.com/jbharat/exotica-theme"))])
- (expand-line . [(20151006 207) nil "Expand selection by line" single ((:commit . "75a5d0241f35dd0748ab8ecb4ff16891535be372") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com"))])
- (expand-region . [(20200304 1839) nil "Increase selected region by semantic units." tar ((:commit . "ea6b4cbb9985ddae532bd2faf9bb00570c9f2781"))])
- (express . [(20140508 2041) ((string-utils (0 3 2))) "Alternatives to `message'" single ((:commit . "93dae7377eace4a5413ba99aecb6f26f90798725") (:keywords "extensions" "message" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/express"))])
- (exsqlaim-mode . [(20170607 1003) ((s (1 10 0))) "Use variables inside sql queries" single ((:commit . "a2e0a62ec8b87193d8eaa695774bfd689324b06c") (:authors ("Ahmad Nazir Raja" . "ahmadnazir@gmail.com")) (:maintainer "Ahmad Nazir Raja" . "ahmadnazir@gmail.com") (:url . "https://github.com/ahmadnazir/exsqlaim-mode"))])
- (extempore-mode . [(20200518 1043) ((emacs (24 4))) "Emacs major mode for Extempore source files" single ((:commit . "7d0ca861e6b483be1f4a08e63c5ade9cd07b4799") (:keywords "extempore") (:authors ("Ben Swift" . "ben@benswift.me")) (:maintainer "Ben Swift" . "ben@benswift.me") (:url . "http://github.com/extemporelang/extempore-emacs-mode"))])
- (extend-dnd . [(20151122 1850) nil "R drag and Drop" tar ((:commit . "80c966c93b82c9bb5c6225a432557c39144fc602") (:keywords "extend" "drag and drop") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:url . "https://github.com/mlf176f2/extend-dnd"))])
- (extmap . [(20200617 1905) ((emacs (24 1))) "Externally-stored constant mapping for Elisp" single ((:commit . "2a6373d4fad1a5ac95272cabb6f5e4af89233d67") (:keywords "lisp") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:url . "https://github.com/doublep/extmap"))])
- (exunit . [(20190919 1238) ((s (1 11 0)) (emacs (24 3)) (f (0 20 0))) "ExUnit test runner" single ((:commit . "c77b0397b80d772c98fcc34c9ab131a8350fbf40") (:keywords "processes" "elixir" "exunit") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:url . "http://github.com/ananthakumaran/exunit.el"))])
- (exwm-edit . [(20200728 8) ((emacs (25 1))) "Edit mode for EXWM" single ((:commit . "2fd9426922c8394ec8d21c50dcc20b7d03af21e4") (:keywords "convenience") (:authors ("Ag Ibragimov")) (:maintainer "Ag Ibragimov") (:url . "https://github.com/agzam/exwm-edit"))])
- (exwm-firefox-core . [(20190812 2110) ((emacs (24 4)) (exwm (0 16))) "Firefox hotkeys to functions" single ((:commit . "e2fe2a895e8f973307ef52f8c9976b26e701cbd0") (:keywords "extensions") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/exwm-firefox-core"))])
- (exwm-firefox-evil . [(20200206 2212) ((emacs (24 4)) (exwm (0 16)) (evil (1 0 0)) (exwm-firefox-core (1 0))) "evil-mode implementation of exwm-firefox-core" single ((:commit . "14643ee53a506ddcb5d2e06cb9f1be7310cd00b1") (:keywords "extensions") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/exwm-firefox-evil"))])
- (exwm-mff . [(20200516 2335) ((emacs (25)) (exwm (0 22 1))) "Mouse Follows Focus" single ((:commit . "81fbbea495e32aef2e2d86c097cb586422d8822c") (:keywords "unix") (:authors ("Ian Eure" . "public@lowbar.fyi")) (:maintainer "Ian Eure" . "public@lowbar.fyi") (:url . "https://github.com/ieure/exwm-mff"))])
- (exwm-surf . [(20171204 1140) ((emacs (24 4)) (exwm (0 16))) "Interface for Surf (surf.suckless.org) under exwm" single ((:commit . "6c17e2c1597fe4b7b454a1dac23b9127ac951e94") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:url . "https://github.com/ecraven/exwm-surf"))])
- (exwm-x . [(20190224 1152) ((cl-lib (0 5)) (exwm (0 22)) (switch-window (0 10)) (swiper (0 9 0)) (bind-key (1 0)) (counsel (0 9 0)) (ivy (0 9 0))) "A derivative wm based on EXWM (emacs x window manager)" tar ((:commit . "02ec31cd8996b1b3fe305405fef7334c4d08e72b") (:keywords "window-manager" "exwm") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/exwm-x"))])
- (eyebrowse . [(20200506 1303) ((dash (2 7 0)) (emacs (24 3 1))) "Easy window config switching" single ((:commit . "bde0eb8f56ec7e2501dc33154c273e43cafb1e5d") (:keywords "convenience") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/eyebrowse"))])
- (eyuml . [(20141028 2227) ((request (0 2 0)) (s (1 8 0))) "Write textual uml diagram from emacs using yuml.me" single ((:commit . "eb29c37316e44a14741f16e894fbcfcb7537dc80") (:keywords "uml") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:url . "http://github.com/antham/eyuml"))])
- (ez-query-replace . [(20170814 1321) ((dash (1 2 0)) (s (1 11 0))) "a smarter context-sensitive query-replace that can be reapplied" single ((:commit . "f5dbd2d3e5e62e6b7e7cc1a98fc4d0cd411e5afa") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (eziam-theme . [(20200327 1810) nil "A mostly monochrome theme, inspired by Tao and Leuven, with dark and light versions." tar ((:commit . "7a585de01b6fee081eaa167b09d7e12d02cf4149"))])
- (f . [(20191110 1357) ((s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" single ((:commit . "1814209e2ff43cf2e6d38c4cd476218915f550fb") (:keywords "files" "directories") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/f.el"))])
- (f3 . [(20180130 1158) ((emacs (24 3)) (helm (2 8 8)) (cl-lib (0 5))) "a helm interface to find" tar ((:commit . "000009ce4adf7a57eae80512f29c4ec2a1391ce5") (:keywords "find" "file" "files" "helm" "fast" "finder") (:authors ("Danny McClanahan")) (:maintainer "Danny McClanahan") (:url . "https://github.com/cosmicexplorer/f3"))])
- (fabric . [(20171116 656) nil "Launch Fabric using Emacs" tar ((:commit . "df79be341d0b34ed23850f9894136092fa5fea8c") (:keywords "python" "fabric") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@chmouel.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@chmouel.com") (:url . "https://github.com/nlamirault/fabric.el"))])
- (face-explorer . [(20190517 1857) nil "Library and tools for faces and text properties" single ((:commit . "ad1300e13e5643e4c246cabfd91f833d39113052") (:keywords "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/face-explorer"))])
- (face-shift . [(20190818 1551) ((emacs (24 4)) (cl-lib (0 5))) "Shift the colour of certain faces" single ((:commit . "8dd6fb5f6277d3a594654aeb3e6a7b7b5581656a") (:keywords "faces") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/face-shift"))])
- (faceup . [(20170925 1946) nil "Markup language for faces and font-lock regression testing" single ((:commit . "6c92dad56a133e14e7b27831e1bcf9b3a71ff154") (:keywords "faces" "languages") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/faceup"))])
- (factlog . [(20130210 140) ((deferred (0 3 1))) "File activity logger" single ((:commit . "6503d77ea882c995b051d22e72db336fb28770fc") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:url . "https://github.com/tkf/factlog"))])
- (faff-theme . [(20200304 1414) nil "Light Emacs color theme on cornsilk3 background" single ((:commit . "3a2f4b567de490ee7af32ecca46de741e7fd7d6a") (:keywords "color" "theme") (:authors ("James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>")) (:maintainer "James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>") (:url . "https://github.com/WJCFerguson/emacs-faff-theme"))])
- (fakespace . [(20120818 6) nil "fake namespaces with defpackage" single ((:commit . "d1bd1f4b14b2690d7a67f9a52622ec51ed84813a") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/elisp-fakespace"))])
- (fakir . [(20140729 1652) ((noflet (0 0 8)) (dash (1 3 2)) (kv (0 0 19))) "fakeing bits of Emacs" single ((:commit . "1fca406ad7de80fece6319ff75d4230b648534b0") (:keywords "lisp" "tools") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "http://github.com/nicferrier/emacs-fakir"))])
- (fancy-battery . [(20150101 1204) ((emacs (24 1))) "Fancy battery display" single ((:commit . "9b88ae77a01aa3edc529840338bcb2db7f445822") (:keywords "convenience" "tools" "hardware") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/lunaryorn/fancy-battery.el"))])
- (fancy-dabbrev . [(20200129 1933) ((emacs (24)) (popup (0 5 3))) "Like dabbrev-expand with preview and popup menu" single ((:commit . "158e1e54055cafe5da9122a59519e8b3ed1057cf") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net") (:url . "https://github.com/jrosdahl/fancy-dabbrev"))])
- (fancy-narrow . [(20171031 16) nil "narrow-to-region with more eye candy." single ((:commit . "c9b3363752c09045b8ce7a2635afae42d2ae63c7") (:keywords "faces" "convenience") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/fancy-narrow"))])
- (fantom-theme . [(20200328 604) ((emacs (24 1))) "Dark theme based on Phantom Code for VSCode" single ((:commit . "2c1c7fd53086c2ff86ee0961642c3b58e2343c08") (:authors ("Adam Svanberg")) (:maintainer "Adam Svanberg") (:url . "https://github.com/adsva/fantom-emacs-theme"))])
- (farmhouse-theme . [(20160713 2244) nil "Farmhouse Theme, Emacs edition" tar ((:commit . "7ddc1ff13b4a3d5466bd0d33ecb86100352e83a7") (:keywords "color" "theme") (:url . "https://github.com/mattly/emacs-farmhouse-theme"))])
- (fasd . [(20180606 505) nil "Emacs integration for the command-line productivity booster `fasd'" single ((:commit . "020c6a4b5fd1498a84ae142d2e32c7ff678fb029") (:keywords "cli" "bash" "zsh" "autojump") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://framagit.org/steckerhalter/emacs-fasd"))])
- (fast-scroll . [(20191016 327) ((emacs (25 1)) (cl-lib (0 6 1))) "Some utilities for faster scrolling over large buffers." single ((:commit . "3f6ca0d5556fe9795b74714304564f2295dcfa24") (:keywords "ahungry" "convenience" "fast" "scroll" "scrolling") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/fast-scroll"))])
- (fastdef . [(20160713 1329) ((ivy (0 7 0)) (w3m (0 0))) "Insert terminology from Google top search results" single ((:commit . "0696f41dc150d35ce31fe8d2ea74f4173818bb55") (:keywords "terminology" "org-mode" "markdown") (:authors ("Chen Bin <chenin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/fastdef"))])
- (fastnav . [(20120211 1457) nil "Fast navigation and editing routines." single ((:commit . "1019ba2b61d1a070204099b23da347278a61bc89") (:keywords "nav" "fast" "fastnav" "navigation") (:authors ("Zsolt Terek" . "zsolt@google.com")) (:maintainer "Zsolt Terek" . "zsolt@google.com"))])
- (faust-mode . [(20180205 926) nil "Faust syntax colorizer for Emacs." single ((:commit . "7c31b22bdbfd2f8c16ec117d2975d56dd61ac15c") (:keywords "languages" "faust") (:authors ("rukano" . "rukano@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com") (:url . "https://github.com/rukano/emacs-faust-mode"))])
- (faustine . [(20171122 1202) ((emacs (24 3)) (faust-mode (0 3))) "Edit, visualize, build and run Faust code" single ((:commit . "07a38963111518f86123802f9d477be0d4689a3f") (:keywords "languages" "faust") (:authors ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com") (:url . "https://bitbucket.org/yphil/faustine"))])
- (fcitx . [(20190806 1923) nil "Make fcitx better in Emacs" single ((:commit . "12dc2638ddd15c8f6cfaecb20e1f428ab2bb5624") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/fcitx.el"))])
- (fcopy . [(20150304 1403) nil "Funny Copy, set past point HERE then search copy text" single ((:commit . "e355f6ec889d8ecbdb096019c2dc660b1cec4941") (:keywords "convenience") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:url . "https://github.com/ataka/fcopy"))])
- (fd-dired . [(20200713 243) ((emacs (25))) "find-dired alternative using fd" single ((:commit . "5622041068d5fa2f299dbc8aa91fece0ba260086") (:keywords "tools" "fd" "find" "dired") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:url . "https://github.com/yqrashawn/fd-dired"))])
- (feather . [(20200321 1237) ((emacs (26 3)) (async (1 9)) (async-await (1 0)) (ppp (1 0)) (page-break-lines (0 1))) "Parallel thread modern package manager" tar ((:commit . "ae67aeea6f0391a15652b5746a92ef83c5db5da3") (:keywords "convenience" "package") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/feather.el"))])
- (feature-mode . [(20200728 50) nil "Major mode for editing Gherkin (i.e. Cucumber) user stories" tar ((:commit . "823c5d33ab37a6fbb9786ac6365821f6e5c954d2"))])
- (feebleline . [(20190822 1401) nil "Replace modeline with a slimmer proxy" single ((:commit . "b2f2db25cac77817bf0c49ea2cea6383556faea0") (:authors ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainer "Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com") (:url . "https://github.com/tautologyclub/feebleline"))])
- (feed-discovery . [(20200714 1118) ((emacs (25 1)) (dash (2 16 0))) "Discover feed url by RSS/Atom autodiscovery" single ((:commit . "47692787326a14c06dab6815bb18caced59a5bf0") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/feed-discovery"))])
- (fennel-mode . [(20200714 237) nil "a major-mode for editing Fennel code" single ((:commit . "a39543750ba337b9327108ba17ffb0cdb18c7f9b") (:keywords "languages" "tools") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:url . "https://gitlab.com/technomancy/fennel-mode"))])
- (fetch . [(20131201 730) nil "Fetch and unpack resources" single ((:commit . "3f2793afcbbc32f320e572453166f9354ecc6d06") (:authors ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainer "Christian 'crshd' Brassat" . "christian.brassat@gmail.com") (:url . "https://github.com/crshd/fetch.el"))])
- (ffmpeg-player . [(20200720 1028) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" single ((:commit . "164fb15d70adbc186eb2d987f5c5143aa7336659") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/ffmpeg-player"))])
- (fic-mode . [(20180603 2035) nil "Show FIXME/TODO/BUG(...) in special face only in comments and strings" single ((:commit . "a05fc36ed54ba0c6dc22ac216a6a72cf191ca13d") (:url . "https://github.com/lewang/fic-mode"))])
- (fifo-class . [(20160425 558) nil "First in first out abstract class" single ((:commit . "8fe4cf690727f4ac7b67f29c55f845df023c3f21") (:keywords "lisp") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:url . "https://github.com/mola-T/fifo-class"))])
- (figlet . [(20160218 2237) nil "Annoy people with big, ascii art text" single ((:commit . "19a38783a90e151faf047ff233a21a729db0cea9") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))])
- (filelock . [(20180524 2215) ((emacs (24)) (cl-lib (0)) (f (0))) "Functions for manipulating file locks" single ((:commit . "17a5ca6e0dee14d2e7d92c84be91143bca9d9663") (:keywords "extensions" "files" "tools") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/emacs-filelock"))])
- (filetags . [(20190706 804) ((emacs (24 4))) "Package to manage filetags in filename" single ((:commit . "01e6a919507a832ee001a2a0fc257657f8b04b72") (:keywords "convenience" "files") (:authors ("Max Beutelspacher")) (:maintainer "Max Beutelspacher") (:url . "https://github.com/DerBeutlin/filetags.el"))])
- (fill-column-indicator . [(20191109 10) nil "Graphically indicate the fill column" single ((:commit . "3d88b8a4a3eeabb8d1c9ef27d3c6f5d98517be77") (:keywords "convenience") (:authors ("Alp Aker" . "alp.tekin.aker@gmail.com")) (:maintainer "Alp Aker" . "alp.tekin.aker@gmail.com"))])
- (fill-function-arguments . [(20190710 929) ((emacs (24 4))) "Convert function arguments to/from single line" single ((:commit . "295d55d6056e6f79b68283f7631f6438ea8a7b5f") (:keywords "convenience") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/fill-function-arguments"))])
- (fillcode . [(20200524 2226) nil "Fill (wrap) function calls and expressions in source code" single ((:commit . "501468082e46bd0975ef4d8765363fd564338099") (:authors ("Ryan Barrett" . "fillcode@ryanb.org")) (:maintainer "Ryan Barrett" . "fillcode@ryanb.org") (:url . "https://snarfed.org/fillcode"))])
- (finalize . [(20170418 1945) ((emacs (24 1)) (cl-generic (0 3)) (cl-lib (0 3)) (eieio (1 4))) "finalizers for Emacs Lisp" tar ((:commit . "846731531e7d1d80451787992e07bfe7dedbe9ff"))])
- (find-by-pinyin-dired . [(20180210 218) ((pinyinlib (0 1 0))) "Find file by first PinYin character of Chinese Hanzi" single ((:commit . "3b4781148dddc84a701ad76c0934ed991ecd59d5") (:keywords "hanzi" "chinese" "dired" "find" "file" "pinyin") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "http://github.com/redguardtoo/find-by-pinyin-dired"))])
- (find-file-in-project . [(20200227 1204) ((ivy (0 10 0)) (emacs (24 4))) "Find file/directory and review Diff/Patch/Commit efficiently everywhere" single ((:commit . "506f35e91e06463cca7390da6ebffc411b8c220f") (:keywords "project" "convenience") (:authors ("Phil Hagelberg, Doug Alcorn, and Will Farrington")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "https://github.com/technomancy/find-file-in-project"))])
- (find-file-in-repository . [(20190404 828) nil "Quickly find files in a git, mercurial or other repository" single ((:commit . "b44d78682082270dc6b59cdc911333d0d3e7edaa") (:keywords "files" "convenience" "repository" "project" "source control") (:authors ("Samuel Hoffstaetter" . "samuel@hoffstaetter.com")) (:maintainer "Samuel Hoffstaetter" . "samuel@hoffstaetter.com") (:url . "https://github.com/hoffstaetter/find-file-in-repository"))])
- (find-temp-file . [(20200117 2254) nil "Open quickly a temporary file" single ((:commit . "2bfcdba0d6a8a0e6faa080cb04ff0f7ed06491ba") (:keywords "convenience") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "https://github.com/thisirs/find-temp-file.git"))])
- (find-things-fast . [(20150519 2226) nil "Find things fast, leveraging the power of git" single ((:commit . "efc7c189019ed65430e2f9e910e8e0a5ca9d2d03") (:keywords "project" "convenience") (:authors ("Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn")) (:maintainer "Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn"))])
- (findr . [(20130127 2032) nil "Breadth-first file-finding facility for (X)Emacs" single ((:commit . "1ddbc0464bb05dcda392b62666ad17239a2152d3") (:keywords "files") (:authors ("David Bakhash" . "cadet@bu.edu")) (:maintainer "David Bakhash" . "cadet@bu.edu"))])
- (fingers . [(20160817 829) nil "Modal editing with universal text manipulation helpers." tar ((:commit . "fed0f742afb1d72eaef29d8da394467550a030fa") (:keywords "fingers" "modal" "editing" "workman") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:url . "http://github.com/fgeller/fingers.el"))])
- (fiplr . [(20140724 645) ((grizzl (0 1 0)) (cl-lib (0 1))) "Fuzzy Search for Files in Projects" tar ((:commit . "3f50159fd42125440d5b0eb9d6398560461f030b"))])
- (fira-code-mode . [(20200415 2356) ((emacs (24 4))) "Minor mode for Fira Code ligatures using prettify-symbols" single ((:commit . "c6945a005b9a581c81e2f3560eab4bd629967364") (:keywords "faces" "ligatures" "fonts" "programming-ligatures") (:authors ("Jonathan Ming" . "jming422@gmail.com")) (:maintainer "Jonathan Ming" . "jming422@gmail.com") (:url . "https://github.com/jming422/fira-code-mode"))])
- (firecode-theme . [(20170808 1311) ((emacs (24 0))) "an Emacs 24 theme based on FireCode (tmTheme)" single ((:commit . "8b7b03ecdd41e70dab145b98906017e1392eaef4") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (firefox-controller . [(20160320 1847) ((moz (0)) (popwin (1 0 0)) (cl-lib (0 5))) "An improved Firefox controller" single ((:commit . "a8af8cbf70afaf6b89a26d6ac69af8e92afc181f") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/emacs-firefox-controller"))])
- (fireplace . [(20200402 2206) nil "A cozy fireplace for emacs" single ((:commit . "f6c23e259349922aae25cf2898ba815a7d8f2527") (:keywords "games") (:authors ("Johan Sivertsen" . "johanvts@gmail.com")) (:maintainer "Johan Sivertsen" . "johanvts@gmail.com") (:url . "https://github.com/johanvts/emacs-fireplace"))])
- (firestarter . [(20200506 1311) nil "Execute (shell) commands on save" single ((:commit . "5b117bf8d290af5c104d88c413f40e84da0c4ce8") (:keywords "convenience") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/firestarter"))])
- (firrtl-mode . [(20200329 2002) ((emacs (24 3))) "mode for working with FIRRTL files" single ((:commit . "fa40141411a876ce7a1a9d6d3fe47134bc1fa954") (:keywords "languages" "firrtl") (:authors ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainer "Schuyler Eldridge" . "schuyler.eldridge@ibm.com") (:url . "https://github.com/ibm/firrtl-mode"))])
- (fish-completion . [(20191103 1210) ((emacs (25 1))) "Fish completion for pcomplete (shell and Eshell)" single ((:commit . "10384881817b5ae38cf6197a077a663420090d2c") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://gitlab.com/Ambrevar/emacs-fish-completion"))])
- (fish-mode . [(20200213 2137) ((emacs (24))) "Major mode for fish shell scripts" single ((:commit . "db257db81058b0b12f788c324c264cc59b9a5bf4") (:keywords "fish" "shell") (:authors ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainer "Tony Wang" . "wwwjfy@gmail.com"))])
- (fit-text-scale . [(20200701 2239) ((emacs (25 1))) "Fit text by scaling" single ((:commit . "a87341d4fb2077076eb83af0fb510112900aaebe") (:keywords "convenience") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:url . "https://gitlab.com/marcowahl/fit-text-scale"))])
- (fix-input . [(20190713 1349) ((emacs (24 4))) "Make input methods play nicely with alternative keyboard layout on OS level" single ((:commit . "7aef6fb29840a2f3c7e3c01eeeb7838a0e702050") (:keywords "input" "method") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/fix-input"))])
- (fix-muscle-memory . [(20160823 439) nil "Simple hacks to fix muscle memory problems" single ((:commit . "a123e04f8a1d2982cbf930efb909cad9522ac884") (:keywords "spelling" "typing") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net"))])
- (fix-word . [(20190713 1338) ((emacs (24 1)) (cl-lib (0 5))) "Convenient word transformation" single ((:commit . "46487e5279a3079730e2d7146ace7c8ad42371ac") (:keywords "word" "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/fix-word"))])
- (fixmee . [(20150223 1355) ((button-lock (1 0 2)) (nav-flash (1 0 0)) (back-button (0 6 0)) (smartrep (0 0 3)) (string-utils (0 3 2)) (tabulated-list (0))) "Quickly navigate to FIXME notices in code" single ((:commit . "5cddb64e0d52635e9a1529d80cb5cefa6f829341") (:keywords "navigation" "convenience") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/fixmee"))])
- (flame . [(20180303 2016) ((emacs (24))) "automatic generation of flamage, as if we needed more." single ((:commit . "a749b2a77b87e505572d0f1f5d59fac76348bb73") (:keywords "games") (:authors ("Ian G. Batten" . "batten@uk.ac.bham.multics") ("Noah Friedman" . "friedman@splode.com")) (:maintainer "Noah Friedman" . "friedman@splode.com") (:url . "https://github.com/mschuldt/flame"))])
- (flames-of-freedom . [(20191202 1637) ((emacs (25 1))) "The flames of freedom" single ((:commit . "5e47ff27cfa2f7c06081be2ffefe91a731efd012") (:keywords "multimedia") (:authors ("Stéphane Champailler" . "schampailler@skynet.be")) (:maintainer "Stéphane Champailler" . "schampailler@skynet.be") (:url . "https://github.com/wiz21b/FlamesOfFreedom"))])
- (flappymacs . [(20171023 1004) nil "flappybird clone for emacs" single ((:commit . "27f3e21acb22f786606481e3f4e5dc1edbaaaed4") (:keywords "games") (:authors ("Takayuki Sato")) (:maintainer "Takayuki Sato") (:url . "https://github.com/taksatou/flappymacs"))])
- (flash-region . [(20130923 1817) nil "Flash a region" single ((:commit . "261b3597b23cdd40e5c14262a5687bcc6c1d0901") (:keywords "utility") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))])
- (flatfluc-theme . [(20200707 630) ((emacs (26 1))) "Custom merge of flucui and flatui themes" single ((:commit . "5a30b1cd344ac0d3c3bf9dab017805ab96897b54") (:keywords "lisp") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:url . "https://github.com/seblemaguer/flatfluc-theme"))])
- (flatland-black-theme . [(20170808 1312) ((emacs (24 0))) "an Emacs 24 theme based on Flatland Black (tmTheme)" single ((:commit . "348c5d5fe615e6ea13cadc17f046e506e789ce07") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/flatland-black-theme"))])
- (flatland-theme . [(20171113 1521) nil "A simple theme for Emacs based on the Flatland theme for Sublime Text" single ((:commit . "a98a6f19ad4dff0fa3fad1ea487b7d0ef634a19a") (:authors ("Greg Chapple" . "info@gregchapple.com")) (:maintainer "Greg Chapple" . "info@gregchapple.com") (:url . "http://github.com/gregchapple/flatland-emacs"))])
- (flatui-dark-theme . [(20170513 1422) ((emacs (24))) "Dark color theme with colors from https://flatuicolors.com/" single ((:commit . "5b959a9f743f891e4660b1b432086417947872ea") (:keywords "color" "theme" "dark" "flatui" "faces") (:authors ("Andrew Phillips" . "theasp@gmail.com")) (:maintainer "Andrew Phillips" . "theasp@gmail.com") (:url . "https://github.com/theasp/flatui-dark-theme"))])
- (flatui-theme . [(20160619 127) nil "A color theme for Emacs based on flatuicolors.com" single ((:commit . "9c15db5526c15c8dba55023f5698372b19c2a780") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/flatui-theme.el"))])
- (flex-autopair . [(20120809 1218) nil "Automatically insert pair braces and quotes, insertion conditions & actions are highly customizable." single ((:commit . "4bb757f2556a4a51828e2fed8fb81e31e83052cb") (:keywords "keyboard" "input") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:url . "https://github.com/uk-ar/flex-autopair.el"))])
- (flex-compile . [(20200506 1309) ((emacs (26)) (dash (2 13 0)) (buffer-manage (0 8))) "Run, evaluate and compile for a many languages and modes." tar ((:commit . "dc6d920b477fe96a71bc37d593beef5ae8b2ae7e") (:keywords "compilation" "integration" "processes") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/flex-compile"))])
- (flex-isearch . [(20170308 2010) nil "Flex matching (like ido) in isearch." single ((:commit . "b1f7e04de762282c276343cc2709af9ff4abc9d2") (:keywords "convenience" "search") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:url . "https://bitbucket.org/jpkotta/flex-isearch"))])
- (flim . [(20200303 319) ((apel (10 8))) "A library to provide basic features about message representation or encoding." tar ((:commit . "f303f2f6c124bc8635add96d3326a2209749437b"))])
- (flimenu . [(20200415 2353) ((emacs (24 4))) "Flatten imenu automatically" single ((:commit . "f110bc77415a7594742f3b12551571c4069c9157") (:keywords "imenu" "browse" "structure" "hook" "mode" "matching" "tools" "convenience" "files") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/flimenu"))])
- (fliptext . [(20171124 2056) nil "Input method for flipping characters upside down" single ((:commit . "fd821f645ffebae6ae3894afa7ba7fc06f91afc6") (:keywords "games" "i18n") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de"))])
- (floobits . [(20180801 524) ((json (1 2)) (highlight (0))) "Floobits plugin for real-time collaborative editing" tar ((:commit . "489b294a7f30ecd2af2edc0823dead8102f27af6") (:keywords "comm" "tools") (:authors ("Matt Kaniaris") ("Geoff Greer")) (:maintainer "Matt Kaniaris") (:url . "http://github.com/Floobits/floobits-emacs"))])
- (flow-js2-mode . [(20191213 1004) ((flow-minor-mode (0)) (js2-mode (0)) (emacs (25 1))) "Support for flow annotations in js2-mode" single ((:commit . "7520bdda70287e8d57b3f41033b1e0ca59a3be95") (:keywords "languages" "extensions") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (flow-minor-mode . [(20191214 1309) ((emacs (25 1))) "Flow type mode based on web-mode." single ((:commit . "5db3936d9eba8ccb2beca476afc84675b7b161ca") (:url . "https://github.com/an-sh/flow-minor-mode"))])
- (flower . [(20190215 1746) ((emacs (24 4)) (clomacs (0 0 3))) "Emacs task tracker client." tar ((:commit . "6ef1affa2d7090714ccc4494823de28cfc11da35") (:keywords "hypermedia" "outlines" "tools" "vc") (:authors ("Sergey Sobko" . "SSobko@ptsecurity.com")) (:maintainer "Sergey Sobko" . "SSobko@ptsecurity.com") (:url . "https://github.com/PositiveTechnologies/flower"))])
- (flucui-themes . [(20200204 1930) ((emacs (24))) "Custom theme inspired by the Flat UI palette" tar ((:commit . "01a3df3530474da7b4303e4eea2ed1fae00d1776") (:keywords "lisp") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:url . "https://github.com/MetroWind/flucui-theme"))])
- (flutter . [(20200718 1434) ((emacs (24 4))) "Tools for working with Flutter SDK" tar ((:commit . "78b3c572584c95220a40934bd67fd5e3fb096f96") (:keywords "languages") (:authors ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:url . "https://github.com/amake/flutter.el"))])
- (flutter-l10n-flycheck . [(20200221 1415) ((emacs (24 4)) (flycheck (30)) (flutter (0 1 0))) "Flycheck checker for intl_translation" single ((:commit . "78b3c572584c95220a40934bd67fd5e3fb096f96") (:keywords "languages") (:authors ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:url . "https://github.com/amake/flutter.el"))])
- (fluxus-mode . [(20191001 1716) ((osc (0 1)) (emacs (24 4))) "Major mode for interfacing with Fluxus" single ((:commit . "3d05fa15f141ac3e936f908097bb7eb6295cc367") (:keywords "languages") (:authors ("modula t." . "defaultxr@gmail.com")) (:maintainer "modula t." . "defaultxr@gmail.com") (:url . "https://github.com/defaultxr/fluxus-mode"))])
- (flx . [(20191115 659) ((cl-lib (0 3))) "fuzzy matching with good sorting" single ((:commit . "17f5c9cb2af18aa6f52910ff4a5a63591261ced5") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))])
- (flx-ido . [(20180117 1519) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" single ((:commit . "17f5c9cb2af18aa6f52910ff4a5a63591261ced5") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))])
- (flx-isearch . [(20191119 515) ((emacs (24)) (flx (20140821)) (cl-lib (0 5))) "Fuzzy incremental searching for emacs" single ((:commit . "a44097fb8f539a193c2f09a37ea52a68f2c51839") (:keywords "convenience" "search" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/pythonnut/flx-isearch"))])
- (flycheck . [(20200610 1809) ((dash (2 12 1)) (pkg-info (0 4)) (let-alist (1 0 4)) (seq (1 11)) (emacs (24 3))) "On-the-fly syntax checking" tar ((:commit . "c02cd773dded0215f9417ec04dfe8dabda63ef43") (:keywords "convenience" "languages" "tools") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:url . "http://www.flycheck.org"))])
- (flycheck-ameba . [(20191226 1011) ((emacs (24 4)) (flycheck (30))) "Add support for Ameba to Flycheck" single ((:commit . "0c4925ae0e998818326adcb47ed27ddf9761c7dc") (:keywords "tools" "crystal" "ameba") (:url . "https://github.com/crystal-ameba/ameba.el"))])
- (flycheck-apertium . [(20181211 1038) ((flycheck (0 25))) "Apertium checkers in flycheck" tar ((:commit . "22b60a17836477ac1edd15dc85b14f88ca871ba9") (:keywords "convenience" "tools" "xml") (:authors ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st") (:url . "http://wiki.apertium.org/wiki/Emacs"))])
- (flycheck-ats2 . [(20170225 1636) ((emacs (24 1)) (flycheck (0 22))) "Flycheck: ATS2 support" single ((:commit . "9f77add8408462af35bdddf87e37a661880255e3") (:keywords "convenience" "tools" "languages") (:authors ("Mark Laws" . "mdl@60hz.org")) (:maintainer "Mark Laws" . "mdl@60hz.org") (:url . "http://github.com/drvink/flycheck-ats2"))])
- (flycheck-bashate . [(20200625 642) ((flycheck (0 24)) (emacs (24 4))) "Integrate bashate with flycheck" single ((:commit . "69e53e84f712bafffd785d84d9304598c2df5615") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-bashate"))])
- (flycheck-cask . [(20191030 2253) ((emacs (24 3)) (flycheck (0 14)) (dash (2 4 0))) "Cask support in Flycheck" single ((:commit . "3457ae553c4feaf8168008f063d78fdde8fb5f94") (:keywords "tools" "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/flycheck/flycheck-cask"))])
- (flycheck-checkbashisms . [(20190403 218) ((emacs (24)) (flycheck (0 25))) "checkbashisms checker for flycheck" single ((:commit . "2e386775f1a0eb5d80e5d70e98474ee32ecafb24") (:keywords "convenience" "tools" "sh" "unix") (:authors ("Cuong Le" . "cuong.manhle.vn@gmail.com")) (:maintainer "Cuong Le" . "cuong.manhle.vn@gmail.com") (:url . "https://github.com/cuonglm/flycheck-checkbashisms"))])
- (flycheck-checkpatch . [(20170217 1025) ((emacs (25)) (flycheck (30))) "Flycheck support for checkpatch.pl tool" single ((:commit . "6461fc7b0d493eb9863814055f8bce5fa35739de") (:authors ("Alexander Yarygin" . "yarygin.alexander@gmail.com")) (:maintainer "Alexander Yarygin" . "yarygin.alexander@gmail.com") (:url . "https://github.com/zpp0/flycheck-checkpatch"))])
- (flycheck-clang-analyzer . [(20200429 238) ((flycheck (0 24)) (emacs (24 4))) "Integrate Clang Analyzer with flycheck" single ((:commit . "0c9b6e4626cd5376037464f8d6b8c64aa32768ee") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-clang-analyzer"))])
- (flycheck-clang-tidy . [(20191030 814) ((flycheck (0 30))) "Flycheck syntax checker using clang-tidy" single ((:commit . "2ae5542960785604a2974548f89e10407e2ccfc1") (:keywords "convenience" "languages" "tools") (:authors (nil . "Sebastian Nagel<sebastian.nagel@ncoding.at>")) (:maintainer "tastytea" . "tastytea@tastytea.de") (:url . "https://github.com/ch1bo/flycheck-clang-tidy"))])
- (flycheck-clangcheck . [(20150712 710) ((cl-lib (0 5)) (seq (1 7)) (flycheck (0 17))) "A Flycheck checker difinition for ClangCheck." single ((:commit . "24a9424c484420073a24443a829fd5779752362b") (:authors ("kumar8600" . "kumar8600@gmail.com")) (:maintainer "kumar8600" . "kumar8600@gmail.com") (:url . "https://github.com/kumar8600/flycheck-clangcheck"))])
- (flycheck-clj-kondo . [(20200414 1444) ((flycheck (0 18))) "Add clj-kondo linter to flycheck" single ((:commit . "5472c26ffdf754a0661357564874ffd4f8598805") (:authors ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainer "Michiel Borkent" . "michielborkent@gmail.com") (:url . "https://github.com/borkdude/flycheck-clj-kondo"))])
- (flycheck-clojure . [(20191215 2227) ((cider (0 22 0)) (flycheck (32 -4)) (let-alist (1 0 1)) (emacs (25))) "Flycheck: Clojure support" single ((:commit . "592c4f89efb5112784cbf94c9ea6fdd045771b62") (:authors ("Peter Fraenkel" . "pnf@podsnap.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Peter Fraenkel" . "pnf@podsnap.com") (:url . "https://github.com/clojure-emacs/squiggly-clojure"))])
- (flycheck-clolyze . [(20190422 2134) ((flycheck (0 25)) (emacs (24))) "Add Clolyze to to flycheck" single ((:commit . "c8b27602dd505aeae6486feb6f584754079baf51") (:authors ("Daniel Laps" . "daniel.laps@hhu.de")) (:maintainer "Daniel Laps" . "daniel.laps@hhu.de") (:url . "https://github.com/DLaps/flycheck-clolyze"))])
- (flycheck-color-mode-line . [(20200528 416) ((flycheck (0 15)) (dash (1 2)) (emacs (24 3))) "Change mode line color with Flycheck status" single ((:commit . "575b604cfe21f65fb07c134392c382c163c87739") (:keywords "convenience" "language" "tools") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:url . "https://github.com/flycheck/flycheck-color-mode-line"))])
- (flycheck-coverity . [(20170704 59) ((flycheck (0 24)) (dash (2 12 0)) (emacs (24 4))) "Integrate Coverity with flycheck" single ((:commit . "cb211e3dd50413a5042eb20175be518214591c9d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-coverity"))])
- (flycheck-credo . [(20170526 1545) ((flycheck (29))) "flycheck checker for elixir credo" single ((:commit . "e88f11ead53805c361ec7706e44c3dfee1daa19f") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-credo"))])
- (flycheck-crystal . [(20180627 242) ((flycheck (30))) "Add support for Crystal to Flycheck" single ((:commit . "2428b016243e78a0312cf6b3ba6939e7169a1405") (:keywords "tools" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))])
- (flycheck-css-colorguard . [(20161031 1122) ((flycheck (0 22)) (emacs (24))) "Detect similar colors in CSS" single ((:commit . "ae94fa0396acd99f9ec36d9572459df793f37fe8") (:keywords "flycheck" "css" "colorguard") (:authors ("Saša Jovanić" . "info@simplify.ba")) (:maintainer "Saša Jovanić" . "info@simplify.ba") (:url . "https://github.com/Simplify/flycheck-css-colorguard/"))])
- (flycheck-cstyle . [(20160905 2341) ((flycheck (0 24)) (emacs (24 4))) "Integrate cstyle with flycheck" single ((:commit . "207285140a353d08cf1fc450cacab158bc98ba82") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-cstyle"))])
- (flycheck-cython . [(20170724 958) ((flycheck (0 25))) "Support Cython in flycheck" single ((:commit . "ecc4454d35ab5317ab66a04406f36f0c1dbc0b76") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))])
- (flycheck-d-unittest . [(20160522 417) ((flycheck (0 21 -4 1)) (dash (1 4 0))) "Add D unittest support to flycheck" single ((:commit . "3e614f23cb4a5566fd7988dbcaaf254af81c7718") (:keywords "flycheck" "d") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/flycheck-d-unittest/"))])
- (flycheck-dedukti . [(20171103 1212) ((flycheck (0 19)) (dedukti-mode (0 1))) "Flycheck integration of Dedukti" single ((:commit . "3dbff5646355f39d57a3ec514f560a6b0082a1cd") (:keywords "convenience" "languages" "tools" "flycheck" "dedukti") (:authors ("Raphaël Cauderlier")) (:maintainer "Raphaël Cauderlier") (:url . "https://github.com/rafoo/flycheck-dedukti"))])
- (flycheck-dialyxir . [(20170515 1525) ((flycheck (29))) "flycheck checker for elixir dialyxir" single ((:commit . "adfb73374cb2bee75724822972f405f2ec371199") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-dialyxir"))])
- (flycheck-dialyzer . [(20160326 1430) ((flycheck (0 18))) "Support dialyzer in flycheck" single ((:commit . "a5df0db95ac69f397b5f85d325a6d88cf8974f64") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))])
- (flycheck-dmd-dub . [(20180625 1635) ((flycheck (0 24)) (f (0 18 2))) "Sets flycheck-dmd-include-paths from dub package information" single ((:commit . "d7df2895d7d27cc39916816e3c32a60ce0e1d2d9") (:keywords "languages") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:url . "http://github.com/atilaneves/flycheck-dmd-dub"))])
- (flycheck-dogma . [(20170125 721) ((flycheck (29))) "flycheck checker for elixir dogma" single ((:commit . "eea1844a81e87e2488b05e703a93272d0fc3bc74") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-dogma"))])
- (flycheck-drstring . [(20200210 1903) ((emacs (25 1)) (flycheck (0 25)) (swift-mode (8 0))) "Doc linting for Swift using DrString" single ((:commit . "d8d5a560e792a6657ef5ac69934c74f1ed51372d") (:keywords "tools" "flycheck") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:url . "https://github.com/danielmartin/flycheck-drstring"))])
- (flycheck-dtrace . [(20180903 1630) ((emacs (25 1)) (flycheck (0 22))) "Flycheck: DTrace support" single ((:commit . "951fab3a15c11d92b9fac1ea4791a80dfe034a00") (:keywords "languages" "convenience" "tools") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info"))])
- (flycheck-eldev . [(20200614 1904) ((flycheck (32)) (dash (2 17)) (emacs (24 4))) "Eldev support in Flycheck" single ((:commit . "c2e2bea1e69fe5f50a9629dec1d9b468ee92de54") (:keywords "tools" "convenience") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:url . "https://github.com/flycheck/flycheck-eldev"))])
- (flycheck-elixir . [(20180810 642) ((flycheck (0 25))) "Support Elixir in flycheck" single ((:commit . "11998d7e3e63a33453e934d25b3673f7c558e579") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))])
- (flycheck-elm . [(20181107 146) ((flycheck (0 29 -4)) (emacs (24 4)) (let-alist (1 0 5)) (seq (2 20))) "Flycheck support for the elm language" single ((:commit . "1b60050efd4729bfba548f3e5adbcb58436667cb") (:authors ("Brian Sermons")) (:maintainer "Brian Sermons") (:url . "https://github.com/bsermons/flycheck-elm"))])
- (flycheck-elsa . [(20200203 1758) ((emacs (25)) (seq (2 0))) "Flycheck for Elsa." tar ((:commit . "6274e6d5391bcdca46164b3238b045ca21c353a2") (:keywords "convenience") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/emacs-elsa/flycheck-elsa"))])
- (flycheck-flawfinder . [(20170116 327) ((flycheck (0 24)) (emacs (24 4))) "Integrate flawfinder with flycheck" single ((:commit . "7d964d38023b088adf3ffc2fddeead81f4491a45") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-flawfinder"))])
- (flycheck-flow . [(20190304 1459) ((flycheck (0 18)) (json (1 4))) "Support Flow in flycheck" single ((:commit . "9e8e52cfc98af6a23fd906f9cb5d5d470d8cf82d") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))])
- (flycheck-ghcmod . [(20150114 632) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using ghcmod" single ((:commit . "6bb7b7d879f05bbae54e99eb04806c877adf3ccc") (:keywords "convenience" "languages" "tools") (:authors ("Shen Chao" . "scturtle@gmail.com")) (:maintainer "Shen Chao" . "scturtle@gmail.com") (:url . "https://github.com/scturtle/flycheck-ghcmod"))])
- (flycheck-golangci-lint . [(20190330 1412) ((emacs (24)) (flycheck (0 22))) "Flycheck checker for golangci-lint" single ((:commit . "8e446c68311048f0b87febf8ef0379e29d358851") (:keywords "convenience" "tools" "go") (:authors ("Wei Jian Gan" . "weijiangan@outlook.com")) (:maintainer "Wei Jian Gan" . "weijiangan@outlook.com") (:url . "https://github.com/weijiangan/flycheck-golangci-lint"))])
- (flycheck-gometalinter . [(20180424 941) ((emacs (24)) (flycheck (0 22))) "flycheck checker for gometalinter" single ((:commit . "1e3eede14da405b914a7d8b00300846e4393cb83") (:keywords "convenience" "tools" "go") (:authors ("Diep Pham" . "me@favadi.com")) (:maintainer "Diep Pham" . "me@favadi.com") (:url . "https://github.com/favadi/flycheck-gometalinter"))])
- (flycheck-gradle . [(20190315 234) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Gradle." single ((:commit . "1ca08bbc343362a923cbdc2010f66e41655e92ab") (:keywords "languages" "gradle") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flycheck-gradle"))])
- (flycheck-grammalecte . [(20200515 1120) ((emacs (25 1)) (flycheck (26))) "Integrate Grammalecte with Flycheck" tar ((:commit . "8608df3144714d79b93afcfe13400693ed763ed8") (:keywords "i18n" "text") (:authors ("Guilhem Doulcier" . "guilhem.doulcier@espci.fr") ("Étienne Deparis" . "etienne@depar.is")) (:maintainer "Guilhem Doulcier" . "guilhem.doulcier@espci.fr") (:url . "https://git.deparis.io/flycheck-grammalecte/"))])
- (flycheck-grammarly . [(20200720 951) ((emacs (25 1)) (flycheck (0 14)) (grammarly (0 0 1))) "Grammarly support for Flycheck" single ((:commit . "698b82936f6b592591f7ed9cc3e3cdf0099e8d96") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/flycheck-grammarly"))])
- (flycheck-guile . [(20200721 103) ((emacs (24 1)) (flycheck (0 22)) (geiser (0 11))) "A Flycheck checker for GNU Guile" single ((:commit . "2940f1622fa352e7ca95a9e4ad65958c5575da02") (:authors ("Ricardo Wurmus" . "rekado@elephly.net")) (:maintainer "Andrew Whatson" . "whatson@gmail.com") (:url . "https://github.com/flatwhatson/flycheck-guile"))])
- (flycheck-haskell . [(20200218 753) ((emacs (24 3)) (flycheck (0 25)) (haskell-mode (13 7)) (dash (2 4 0)) (seq (1 11)) (let-alist (1 0 1))) "Flycheck: Automatic Haskell configuration" tar ((:commit . "23cfb9387faf6f70b421bb4c11b6847f0db38dfc") (:keywords "tools" "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/flycheck/flycheck-haskell"))])
- (flycheck-hdevtools . [(20160926 702) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using hdevtools" single ((:commit . "8248ebaf8376ee5e37ff47c814a291550a7bdcf2") (:keywords "convenience" "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/flycheck/flycheck-hdevtools"))])
- (flycheck-indent . [(20200129 2046) ((emacs (25 1)) (indent-lint (1 0 0)) (flycheck (31))) "Indent-lint frontend for flycheck" single ((:commit . "23ef4bab5509e2e7fb1f4a194895a9510fa7c797") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/indent-lint.el"))])
- (flycheck-indicator . [(20200331 1142) ((flycheck (0 15))) "A fancy mode line indicator for `flycheck-mode'" single ((:commit . "e00d9a20cbc21d6814c27cc9206296da394478e8") (:keywords "convenience" "language" "tools") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com") (:url . "https://github.com/gexplorer/flycheck-indicator"))])
- (flycheck-ini-pyinilint . [(20190312 1931) ((flycheck (31))) "Flycheck integration for PyINILint" single ((:commit . "e1c3adfc148caf721691a55cae686b5f31209204") (:keywords "convenience" "files" "tools") (:authors ("Daniel J. R. May" . "daniel.may@danieljrmay.com")) (:maintainer "Daniel J. R. May" . "daniel.may@danieljrmay.com") (:url . "https://gitlab.com/danieljrmay/flycheck-ini-pyinilint"))])
- (flycheck-inline . [(20190320 1611) ((emacs (25 1)) (flycheck (32))) "Display Flycheck errors inline" single ((:commit . "cf9eceabff8370f3b834b943a5777b9f914583f9") (:keywords "tools" "convenience") (:authors ("fmdkdd")) (:maintainer "fmdkdd") (:url . "https://github.com/flycheck/flycheck-inline"))])
- (flycheck-irony . [(20180604 2152) ((emacs (24 1)) (flycheck (0 22)) (irony (0 2 0))) "Flycheck: C/C++ support via Irony" single ((:commit . "42dbecd4a865cabeb301193bb4d660e26ae3befe") (:keywords "convenience" "tools" "c") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:url . "https://github.com/Sarcasm/flycheck-irony/"))])
- (flycheck-jest . [(20180411 328) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Jest." single ((:commit . "08f27c5ed97c83c445f99fab58f0b6c826f14449") (:keywords "languages" "jest") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flycheck-jest"))])
- (flycheck-joker . [(20200412 2346) ((flycheck (0 18))) "Add Clojure syntax checker (via Joker) to flycheck" single ((:commit . "93576295fef7a749bf779eeece5edd85e21868e2") (:authors ("Roman Bataev" . "roman.bataev@gmail.com")) (:maintainer "Roman Bataev" . "roman.bataev@gmail.com"))])
- (flycheck-julia . [(20170729 2141) ((emacs (24)) (flycheck (0 22))) "Julia support for Flycheck" single ((:commit . "213b60a5a9a1cb7887260e1d159b5bb27167cbb6") (:keywords "convenience" "tools" "languages") (:authors ("Guido Kraemer" . "guido.kraemer@gmx.de")) (:maintainer "Guido Kraemer" . "guido.kraemer@gmx.de") (:url . "https://github.com/gdkrmr/flycheck-julia"))])
- (flycheck-keg . [(20200726 218) ((emacs (24 3)) (keg (0 1)) (flycheck (0 1))) "Flycheck for Keg projects" single ((:commit . "fea2f831d84d7642c35820bb63250487e46683e5") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/keg.el"))])
- (flycheck-kotlin . [(20190808 630) ((flycheck (0 20))) "Support kotlin in flycheck" single ((:commit . "5104ee9a3fdb7f0a0a3d3bcfd8dd3c45a9929310") (:authors ("Elric Milon" . "whirm_REMOVETHIS__@gmx.com")) (:maintainer "Elric Milon" . "whirm_REMOVETHIS__@gmx.com"))])
- (flycheck-ledger . [(20200304 2204) ((emacs (24 1)) (flycheck (0 15))) "Flycheck integration for ledger files" single ((:commit . "628e25ba66604946085571652a94a54f4d1ad96f") (:keywords "convenience" "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flycheck-ledger"))])
- (flycheck-lilypond . [(20200614 2104) ((emacs (24 3)) (flycheck (0 22))) "LilyPond support in Flycheck" single ((:commit . "17133911b519be76365103dec8c10cb2f3729f1a") (:keywords "tools" "convenience") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:url . "https://github.com/hinrik/flycheck-lilypond"))])
- (flycheck-liquidhs . [(20170412 2326) ((flycheck (0 15))) "A flycheck checker for Haskell using liquid (i.e. liquidhaskell)" single ((:commit . "c27252ac24d77f4b6eec76a4ba9cd61761a3fba9") (:keywords "convenience" "languages" "tools") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu") (:url . "https://github.com/ucsd-progsys/liquidhaskell/flycheck-liquid.el"))])
- (flycheck-mercury . [(20181118 1952) ((flycheck (0 22)) (s (1 9 0)) (dash (2 4 0))) "Mercury support in Flycheck" single ((:commit . "b6807a8db70981e21a91a93324c31e49de85c89f") (:keywords "convenience" "languages" "tools") (:authors ("Matthias Güdemann" . "matthias.gudemann@gmail.com")) (:maintainer "Matthias Güdemann" . "matthias.gudemann@gmail.com") (:url . "https://github.com/flycheck/flycheck-mercury"))])
- (flycheck-mmark . [(20190713 1323) ((emacs (24 4)) (flycheck (0 29))) "Flycheck checker for the MMark markdown processor" single ((:commit . "a285d849e6e227b79bef98f575ecfa43a70661da") (:keywords "convenience" "text") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mmark-md/flycheck-mmark"))])
- (flycheck-mypy . [(20200113 1336) ((flycheck (0 18))) "Support mypy in flycheck" single ((:commit . "5b4e14ab0cbce2ff35fee7e69b5b95eafd609c80") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))])
- (flycheck-nim . [(20190927 1514) ((dash (2 4 0)) (flycheck (0 20))) "Defines a flycheck syntax checker for nim" single ((:commit . "ddfade51001571c2399f78bcc509e0aa8eb752a4") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/flycheck-nim"))])
- (flycheck-nimsuggest . [(20171027 2208) ((flycheck (0 23)) (emacs (24 3))) "flycheck backend for Nim using nimsuggest" single ((:commit . "dc9a5de1cb3ee05db5794d824610959a1f603bc9") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/flycheck-nimsuggest"))])
- (flycheck-objc-clang . [(20191116 1015) ((emacs (24 4)) (flycheck (26))) "Flycheck: Objective-C support using Clang" single ((:commit . "683d52e7bc3aeabd966c546a1d835d4c7191509b") (:keywords "convenience" "languages" "tools") (:authors ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainer "Goichi Hirakawa" . "gooichi@gyazsquare.com") (:url . "https://github.com/GyazSquare/flycheck-objc-clang"))])
- (flycheck-ocaml . [(20170730 2153) ((emacs (24 1)) (flycheck (0 22)) (merlin (3 0 1)) (let-alist (1 0 3))) "Flycheck: OCaml support" single ((:commit . "8707a7bf545a8639a6a5c600a98d9a2ea1487dc9") (:keywords "convenience" "tools" "languages") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/flycheck/flycheck-ocaml"))])
- (flycheck-package . [(20200304 2151) ((emacs (24 1)) (flycheck (0 22)) (package-lint (0 2))) "A Flycheck checker for elisp package authors" single ((:commit . "caea75f77dc7668c7aa0ebcd48f677e3522b5d77") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flycheck-package"))])
- (flycheck-pact . [(20180920 2052) ((emacs (24 3)) (flycheck (0 25)) (pact-mode (0 0 4))) "Flycheck support for pact-mode" single ((:commit . "0e10045064ef89ec8b6f5a473073d47b976a2ca3") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "linting") (:authors ("Stuart Popejoy")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io") (:url . "http://github.com/kadena-io/flycheck-pact"))])
- (flycheck-perl6 . [(20180509 2201) ((emacs (24 3)) (flycheck (0 22))) "Perl 6 support in Flycheck" single ((:commit . "b804702305d7a6e26f762ff98cfdeec2e9dd4cb7") (:keywords "tools" "convenience") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:url . "https://github.com/hinrik/flycheck-perl6"))])
- (flycheck-pest . [(20200317 1503) ((emacs (26 3)) (flycheck (31)) (pest-mode (0 1))) "Flycheck integration for Pest -" single ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:keywords "convenience" "flycheck") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/ksqsf/pest-mode"))])
- (flycheck-phpstan . [(20200411 531) ((emacs (24 3)) (flycheck (26)) (phpstan (0 5 0))) "Flycheck integration for PHPStan" single ((:commit . "2f715a186c5fe6576de83d4c0b64a37e2bfce101") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/phpstan.el"))])
- (flycheck-pkg-config . [(20200409 501) ((dash (2 8 0)) (s (1 9 0)) (flycheck (29))) "configure flycheck using pkg-config" single ((:commit . "b76b24ea1f4800f5fb96ce9c6c4788e0e63133d3") (:keywords "flycheck") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (flycheck-plantuml . [(20171018 111) ((flycheck (0 24)) (emacs (24 4)) (plantuml-mode (1 2 2))) "Integrate plantuml with flycheck" single ((:commit . "183be89e1dbba0b38237dd198dff600e0790309d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-plantuml"))])
- (flycheck-pony . [(20190227 235) ((flycheck (0 25 1))) "Pony support in Flycheck" single ((:commit . "43421fb43ab4fec759061a11e9d9166bb7da013d") (:keywords "tools" "convenience") (:url . "https://github.com/seantallen/flycheck-pony"))])
- (flycheck-popup-tip . [(20170812 2351) ((flycheck (0 22)) (popup (0 5)) (emacs (24))) "Display Flycheck error messages using popup.el" single ((:commit . "ef86aad907f27ca076859d8d9416f4f7727619c6") (:keywords "convenience" "tools" "flycheck" "tooltip") (:authors ("Saša Jovanić" . "sasa@simplify.ba")) (:maintainer "Saša Jovanić" . "sasa@simplify.ba") (:url . "https://github.com/flycheck/flycheck-popup-tip/"))])
- (flycheck-pos-tip . [(20200516 1600) ((emacs (24 1)) (flycheck (0 22)) (pos-tip (0 4 6))) "Display Flycheck errors in GUI tooltips" single ((:commit . "dc57beac0e59669926ad720c7af38b27c3a30467") (:keywords "tools" "convenience") (:authors ("Akiha Senda" . "senda.akiha@gmail.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/flycheck/flycheck-pos-tip"))])
- (flycheck-posframe . [(20191214 1109) ((flycheck (0 24)) (emacs (26)) (posframe (0 3 0))) "Show flycheck error messages using posframe.el" single ((:commit . "2b3e94c2e427ec9831c513007460c5ea9e2225a3") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-posframe"))])
- (flycheck-prospector . [(20180524 450) ((flycheck (0 22))) "Support prospector in flycheck" single ((:commit . "92f2680573290ba4a69a2d6e140f44680efce6a8") (:authors ("Carlos Coelho" . "carlospecter@gmail.com")) (:maintainer "Carlos Coelho" . "carlospecter@gmail.com") (:url . "https://github.com/chocoelho/flycheck-prospector"))])
- (flycheck-psalm . [(20200510 1540) ((emacs (24 3)) (flycheck (26)) (psalm (0 6 0))) "Flycheck integration for Psalm" single ((:commit . "b2a1e8a9524b0004e62996c70da5536f86e56182") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/psalm.el"))])
- (flycheck-pycheckers . [(20200704 433) ((flycheck (0 18))) "multiple syntax checker for Python, using Flycheck" tar ((:commit . "44b11b51c97fd334ecdce74169c0e65123ef5991") (:keywords "convenience" "tools" "languages") (:url . "https://github.com/msherry/flycheck-pycheckers"))])
- (flycheck-pyflakes . [(20170330 2311) ((flycheck (0 18))) "Support pyflakes in flycheck" single ((:commit . "61b045939e3743b2162b7e4e73249c66fc2b8f65") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (flycheck-pyre . [(20190215 1222) ((emacs (24)) (flycheck (29)) (cl-lib (0 6))) "Support Pyre in flycheck" tar ((:commit . "0560122caae207d99d8af1ac2b4e5d6f6a1ce444") (:authors ("Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com")) (:maintainer "Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com") (:url . "https://github.com/linnik/flycheck-pyre"))])
- (flycheck-relint . [(20200721 2217) ((emacs (26 1)) (flycheck (0 22)) (relint (1 15))) "A Flycheck checker for elisp regular expressions" single ((:commit . "d1e54d4bfdb12d0b60a1b9a8c2b11799426ddc57") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flycheck-relint"))])
- (flycheck-rtags . [(20191222 920) ((emacs (24)) (flycheck (0 23)) (rtags (2 10))) "RTags Flycheck integration" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com")) (:maintainer "Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))])
- (flycheck-rust . [(20190319 1546) ((emacs (24 1)) (flycheck (28)) (dash (2 13 0)) (seq (2 3)) (let-alist (1 0 4))) "Flycheck: Rust additions and Cargo support" single ((:commit . "a139cd53c5062697e9ed94ad80b803c37d999600") (:keywords "tools" "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/flycheck/flycheck-rust"))])
- (flycheck-stan . [(20200221 2025) ((emacs (25 1)) (flycheck (0 16 0)) (stan-mode (10 1 0))) "Add Stan support for Flycheck" tar ((:commit . "e891a0fcb3a7ab7d9cedbe3deda560134636897e") (:keywords "c" "languages") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:url . "https://github.com/stan-dev/stan-mode/tree/master/flycheck-stan"))])
- (flycheck-status-emoji . [(20180330 2325) ((cl-lib (0 1)) (emacs (24)) (flycheck (0 20)) (let-alist (1 0))) "Show flycheck status using cute, compact emoji" single ((:commit . "4bd113ab42dec9544b66e0a27ed9008ce8148433") (:keywords "convenience" "languages" "tools") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org") (:url . "https://github.com/liblit/flycheck-status-emoji"))])
- (flycheck-swift . [(20170129 549) ((emacs (24 4)) (flycheck (0 25))) "Flycheck extension for Apple's Swift." single ((:commit . "4c5ad401252400a78da395fd56a71e67ff8c2761") (:keywords "languages" "swift"))])
- (flycheck-swift3 . [(20191116 1113) ((emacs (24 4)) (flycheck (26))) "Flycheck: Swift support for Apple swift-mode" single ((:commit . "62c93add8ff65d335f6ef8a3123d2d4f53339df5") (:keywords "convenience" "languages" "tools") (:authors ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainer "Goichi Hirakawa" . "gooichi@gyazsquare.com") (:url . "https://github.com/GyazSquare/flycheck-swift3"))])
- (flycheck-swiftlint . [(20180830 340) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Swiftlint." single ((:commit . "8861ddbd9c1c2a951630d9ea29162ad0916580cb") (:keywords "languages" "swiftlint" "swift" "emacs") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flycheck-swiftlint"))])
- (flycheck-swiftx . [(20200504 1345) ((emacs (26 1)) (flycheck (26)) (xcode-project (1 0))) "Flycheck: Swift backend" single ((:commit . "1b9174fb37498dc3a3cf8bbbfbb4f0470e8ef139") (:keywords "convenience" "languages" "tools") (:authors ("John Buckley" . "john@olivetoast.com")) (:maintainer "John Buckley" . "john@olivetoast.com") (:url . "https://github.com/nhojb/flycheck-swiftx"))])
- (flycheck-tcl . [(20180327 1259) ((emacs (24 4)) (flycheck (0 22))) "A flycheck checker for Tcl using tclchecker" single ((:commit . "7ca23f4673e178b9f5dcc8a82b86cf05b15d7236") (:authors ("Niels Widger" . "niels.widger@gmail.com")) (:maintainer "Niels Widger" . "niels.widger@gmail.com") (:url . "https://github.com/nwidger/flycheck-tcl"))])
- (flycheck-tip . [(20171020 1048) ((flycheck (29)) (emacs (24 1)) (popup (0 5 0))) "Show flycheck/flymake errors by tooltip" tar ((:commit . "9b0072d92e6b4a52834bf5a34120a0f5e1c8c2fd") (:keywords "flycheck") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/flycheck-tip"))])
- (flycheck-title . [(20170216 2346) ((flycheck (30)) (emacs (24))) "show flycheck errors in the frame title" single ((:commit . "6faea67be8661faf8152217869d16e993cc2bc49") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (flycheck-vale . [(20190609 1533) ((emacs (24 4)) (flycheck (0 22)) (let-alist (1 0 4))) "flycheck integration for vale" single ((:commit . "f08249535348d046d0974b9c20fe1b7dd3cd2660") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/flycheck-vale"))])
- (flycheck-vdm . [(20190304 839) ((emacs (24)) (flycheck (32 -4)) (vdm-mode (0 0 4))) "Syntax checking for vdm-mode" single ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:keywords "languages") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:url . "https://github.com/peterwvj/vdm-mode"))])
- (flycheck-xcode . [(20180122 651) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Apple's Xcode." single ((:commit . "b76f872c8985801951a095b8b3c1572b94189f9e") (:keywords "languages" "xcode") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flycheck-xcode"))])
- (flycheck-yamllint . [(20170325 1735) ((flycheck (30))) "Flycheck integration for YAMLLint" single ((:commit . "1e9fe3b2d3e42d551b94473816a8eeee637b446c") (:keywords "convenience" "languages" "tools") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:url . "https://github.com/krzysztof-magosa/flycheck-yamllint"))])
- (flycheck-yang . [(20180312 1831) ((yang-mode (0 9 4)) (flycheck (0 18))) "YANG flycheck checker" single ((:commit . "47881fc42ef0163c47064b72b5d6dbef4f83d778") (:authors (nil . "Andrew Fort (@andaru)")) (:maintainer nil . "Andrew Fort (@andaru)"))])
- (flycheck-ycmd . [(20181016 618) ((emacs (24)) (dash (2 13 0)) (flycheck (0 22)) (ycmd (1 2)) (let-alist (1 0 5))) "flycheck integration for ycmd" single ((:commit . "bc81b992f79100c98f56b7b83caf64cb8ea60477") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-ycmd"))])
- (flymake-coffee . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for coffee script" single ((:commit . "dee295acf30820ed15fe0de17137d50bc27fc80c") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-coffee"))])
- (flymake-cppcheck . [(20140415 1257) ((flymake-easy (0 9))) "Flymake work with Cppcheck for C/C++" single ((:commit . "7eac8c7b9c74ebb5e600686f1f3891767dc87bb2") (:keywords "flymake" "cppcheck" "c" "c++") (:authors ("Akiha Senda" . "senda.akiha@gmail.com")) (:maintainer "Akiha Senda" . "senda.akiha@gmail.com") (:url . "https://github.com/senda-akiha/flymake-cppcheck/"))])
- (flymake-css . [(20170723 146) ((flymake-easy (0 1))) "Flymake support for css using csslint" single ((:commit . "de090163ba289910ceeb61b13368ce42d0f2dfd8") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-css"))])
- (flymake-cursor . [(20120322 1757) ((flymake (0 3))) "Show flymake messages in the minibuffer after delay" single ((:commit . "ecc539082c3fc9e91bba33d72c26989217411593") (:keywords "languages" "mode" "flymake") (:authors ("Unknown Original Author") ("Dino Chiesa" . "dpchiesa@hotmail.com") ("Sam Graham <libflymake-emacs BLAHBLAH illusori.co.uk>")) (:maintainer "Sam Graham <libflymake-emacs BLAHBLAH illusori.co.uk>") (:url . "https://github.com/illusori/emacs-flymake-cursor"))])
- (flymake-diagnostic-at-point . [(20180815 1004) ((emacs (26 1)) (popup (0 5 3))) "Display flymake diagnostics at point" single ((:commit . "379616b1c6f5ebeaf08fbe54ae765008a78b3be7") (:keywords "convenience" "languages" "tools") (:authors ("Ricardo Martins" . "ricardo@scarybox.net")) (:maintainer "Ricardo Martins" . "ricardo@scarybox.net") (:url . "https://github.com/meqif/flymake-diagnostic-at-point"))])
- (flymake-easy . [(20140818 755) nil "Helpers for easily building flymake checkers" single ((:commit . "de41ea49503f71f997e5c359a2ad08df696c0147") (:keywords "convenience" "internal") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-easy"))])
- (flymake-elixir . [(20130810 1417) nil "A flymake handler for elixir-mode .ex files." single ((:commit . "3810566cffe35d04cc3f01e27fe397d68d52f802") (:authors ("Sylvain Benner" . "syl20bnr@gmail.com")) (:maintainer "Sylvain Benner" . "syl20bnr@gmail.com"))])
- (flymake-eslint . [(20191129 1558) ((emacs (26 0))) "A Flymake backend for Javascript using eslint" single ((:commit . "6e2d376f84ddf9af593072954c97e9c82ab85331") (:authors ("Dan Orzechowski")) (:maintainer "Dan Orzechowski") (:url . "https://github.com/orzechowskid/flymake-eslint"))])
- (flymake-gjshint . [(20130327 1232) nil "A flymake handler for javascript using both jshint and gjslint" single ((:commit . "dc957c14cb060819585de8aedb330e24efa4b784") (:keywords "flymake" "javascript" "jshint" "gjslint") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))])
- (flymake-go . [(20150714 733) nil "A flymake handler for go-mode files" single ((:commit . "ae83761aa908c1a50ff34af04f00dcc46bca2ce9") (:keywords "go" "flymake") (:authors ("Michael Fellinger" . "michael@iron.io") ("Robert Zaremba" . "robert.marek.zaremba@wp.eu")) (:maintainer "Michael Fellinger" . "michael@iron.io") (:url . "https://github.com/robert-zaremba/flymake-go"))])
- (flymake-go-staticcheck . [(20190708 1325) ((emacs (25))) "Go staticcheck linter for flymake" single ((:commit . "130079fcd29c3e2a72f8325f3041042bcc6286f1") (:keywords "languages" "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:url . "https://github.com/s-kostyaev/flymake-go-staticcheck"))])
- (flymake-golangci . [(20191028 1927) ((flymake-easy (0 1)) (emacs (24))) "A flymake handler for go-mode files using Golang CI lint" single ((:commit . "dfc31a1a6ae3f087b49fe6f5f21b3866780aa91c") (:authors ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainer "Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx") (:url . "https://gitlab.com/shackra/flymake-golangci"))])
- (flymake-google-cpplint . [(20140205 1325) ((flymake-easy (0 9))) "Help to comply with the Google C++ Style Guide" single ((:commit . "426e56ae1278d7a078c368e9d495003825ada0bd") (:keywords "flymake" "c" "c++") (:authors ("Akiha Senda" . "senda.akiha@gmail.com")) (:maintainer "Akiha Senda" . "senda.akiha@gmail.com") (:url . "https://github.com/senda-akiha/flymake-google-cpplint/"))])
- (flymake-gradle . [(20190315 233) ((emacs (26 1))) "Flymake extension for Gradle." single ((:commit . "dbedd29b78d4828ef57d4de20867be5df3eaab99") (:keywords "languages" "gradle") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flymake-gradle"))])
- (flymake-haml . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haml files" single ((:commit . "22a81e8484734552d461e7ae7305664dc244447e") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-haml"))])
- (flymake-haskell-multi . [(20170723 146) ((flymake-easy (0 1))) "Syntax-check haskell-mode using both ghc and hlint" tar ((:commit . "b564a94312259885b1380272eb867bf52a164020"))])
- (flymake-hlint . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haskell-mode files using hlint" single ((:commit . "f910736b26784efc9a2fa29503f45c1f1dd0aa38") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-hlint"))])
- (flymake-joker . [(20200315 1429) ((emacs (26 1)) (flymake-quickdef (0 1 1))) "Add Clojure syntax checker (via Joker) to flymake" single ((:commit . "fc132beedac9e6f415b72e578e77318fd13af9ee") (:authors ("Mateusz Probachta" . "mateusz.probachta@gmail.com")) (:maintainer "Mateusz Probachta" . "mateusz.probachta@gmail.com") (:url . "https://github.com/beetleman/flymake-joker"))])
- (flymake-jshint . [(20140319 2200) ((flymake-easy (0 8))) "making flymake work with JSHint" single ((:commit . "79dd554c227883c487db38ac111306c8d5382c95") (:keywords "flymake" "jshint" "javascript") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (flymake-jslint . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for javascript using jslint" single ((:commit . "8edb82be605542b0ef62d38d818adcdde335eecb") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-jslint"))])
- (flymake-json . [(20180511 911) ((flymake-easy (0 1))) "A flymake handler for json using jsonlint" single ((:commit . "ae58795f948402e987cda4c15f10354f8ec2d0fd") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-json"))])
- (flymake-kondor . [(20200714 646) ((emacs (26 1)) (flymake-quickdef (1 0 0))) "Linter with clj-kondo" single ((:commit . "530bf3e6c401d17f6b4f784a1f2524d5ba2d3414") (:authors ("https://turbocafe.keybase.pub")) (:maintainer "https://turbocafe.keybase.pub") (:url . "https://github.com/turbo-cafe/flymake-kondor"))])
- (flymake-ktlint . [(20180831 346) ((emacs (26 1))) "Flymake extension for Ktlint." single ((:commit . "56aab6f2d22061999050783dbc3166cdb456d0bb") (:keywords "languages" "ktlint") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flymake-ktlint"))])
- (flymake-less . [(20151111 738) ((less-css-mode (0 15)) (flymake-easy (0 1))) "Flymake handler for LESS stylesheets (lesscss.org)" single ((:commit . "32d3c28a9a5c52b82d1741ff9d715013b6498421") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (flymake-lua . [(20170129 154) nil "Flymake for Lua" single ((:commit . "84589f20066921a5b79cf3a1f914a223a2552d2a") (:keywords "lua") (:authors (nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")")) (:maintainer nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")"))])
- (flymake-perlcritic . [(20120328 814) ((flymake (0 3))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:commit . "edfaa86500ddfa8a6a6f51f5581a81a821277df6") (:authors ("Sam Graham <libflymake-perlcritic-emacs BLAHBLAH illusori.co.uk>")) (:maintainer "Sam Graham <libflymake-perlcritic-emacs BLAHBLAH illusori.co.uk>") (:url . "https://github.com/illusori/emacs-flymake-perlcritic"))])
- (flymake-pest . [(20200317 1503) ((emacs (26 3)) (pest-mode (0 1))) "A flymake handler for Pest files" single ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:keywords "languages" "flymake") (:authors ("ksqsf" . "i@ksqsf.moe") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "ksqsf" . "i@ksqsf.moe") (:url . "https://github.com/ksqsf/pest-mode"))])
- (flymake-php . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for php-mode files" single ((:commit . "c045d01e002ba5e09b05f40e25bf5068d02126bc") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-php"))])
- (flymake-phpcs . [(20140713 631) ((flymake-easy (0 9))) "making flymake work with PHP CodeSniffer" single ((:commit . "bba25dbda15955b609ceae0893cf3be74ec67230") (:keywords "flymake" "phpcs" "php") (:authors ("Akiha Senda")) (:maintainer "Akiha Senda") (:url . "https://github.com/senda-akiha/flymake-phpcs/"))])
- (flymake-phpstan . [(20200415 1637) ((emacs (26 1)) (phpstan (0 5 0))) "Flymake backend for PHP using PHPStan" single ((:commit . "2f715a186c5fe6576de83d4c0b64a37e2bfce101") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/phpstan.el"))])
- (flymake-puppet . [(20170801 554) ((flymake-easy (0 9))) "Flymake handler using puppet-lint" single ((:commit . "8a772395f4ccc59d883712ab53a92a17c1d9a429") (:authors ("Ben Prew")) (:maintainer "Ben Prew") (:url . "https://github.com/benprew/flymake-puppet"))])
- (flymake-python-pyflakes . [(20170723 146) ((flymake-easy (0 8))) "A flymake handler for python-mode files using pyflakes (or flake8)" single ((:commit . "1d65c26bf65a5dcbd29fcd967e2feb90e1e7a33d") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-python-pyflakes"))])
- (flymake-quickdef . [(20200308 2342) ((emacs (26 1))) "Quickly define a new Flymake backend" single ((:commit . "150c5839768a3d32f988f9dc08052978a68f2ad7") (:keywords "languages" "tools" "convenience" "lisp") (:authors ("Karl Otness")) (:maintainer "Karl Otness") (:url . "https://github.com/karlotness/flymake-quickdef"))])
- (flymake-racket . [(20180912 109) ((emacs (26 1))) "Flymake extension for Racket." single ((:commit . "d20fa60d66db3f7c2df0133814564ee5b36d2aba") (:keywords "languages" "racket" "scheme") (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/flymake-racket"))])
- (flymake-ruby . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for ruby-mode files" single ((:commit . "6c320c6fb686c5223bf975cc35178ad6b195e073") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-ruby"))])
- (flymake-rust . [(20170729 2139) ((flymake-easy (0 1))) "A flymake handler for rust-mode files" single ((:commit . "2f42d1f2dad73ec9de460eda6176e3ab25c446f0") (:authors ("Joao Oliveira" . "joaoxsouls@gmail.com")) (:maintainer "Joao Oliveira" . "joaoxsouls@gmail.com") (:url . "https://github.com/joaoxsouls/flymake-rust"))])
- (flymake-sass . [(20170723 146) ((flymake-easy (0 1))) "Flymake handler for sass and scss files" single ((:commit . "2de28148e92deb93bff3d55fe14e7c67ac476056") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-sass"))])
- (flymake-shell . [(20170723 146) ((flymake-easy (0 1))) "A flymake syntax-checker for shell scripts" single ((:commit . "a16cf453056b9849cc7c912bb127fb0b08fc6dab") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-shell"))])
- (flymake-shellcheck . [(20200329 2005) ((emacs (26))) "A bash/sh Flymake backend powered by ShellCheck" single ((:commit . "78956f0e5bb9c4d35989657a55929e8e3f5691e6") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:url . "https://github.com/federicotdn/flymake-shellcheck"))])
- (flymake-solidity . [(20170805 644) ((flymake-easy (0 10))) "A flymake handler for solidity using solc" single ((:commit . "48bfe9525f764d8a68cc0270905dbf45bfd00bb8") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com") (:url . "https://github.com/kootenvp/flymake-solidity"))])
- (flymake-vala . [(20150326 531) ((flymake-easy (0 1))) "A flymake handler for vala-mode files" single ((:commit . "c3674f461fc84fb0300cd3a562fb903a59782745") (:keywords "convenience" "vala") (:authors ("Daniel Lawrence" . "dannyla@linux.com")) (:maintainer "Daniel Lawrence" . "dannyla@linux.com") (:url . "https://github.com/daniellawrence/flymake-vala"))])
- (flymake-vnu . [(20181128 216) ((emacs (26 1))) "Flymake extension for the v.Nu HTML validator." single ((:commit . "7c4ab9d12611756ad5a80d866890b2f9b73fb611") (:keywords "languages") (:maintainer "Stefan Kuznetsov" . "skuznetsov@posteo.net") (:url . "https://github.com/theneosloth/flymake-vnu"))])
- (flymake-yaml . [(20130423 1548) ((flymake-easy (0 1))) "A flymake handler for YAML" single ((:commit . "24cb5b744a1796e554e6dbfc6eeb237d06a00b10") (:keywords "yaml") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/flymake-yaml"))])
- (flymd . [(20160617 1214) ((cl-lib (0 5))) "On the fly markdown preview" tar ((:commit . "84d5a68bcfed4a295952c33ffcd11e880978d9d7") (:keywords "markdown" "convenience") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:url . "https://github.com/mola-T/flymd"))])
- (flyparens . [(20140723 1846) nil "Check for unbalanced parens on the fly" tar ((:commit . "af9b8cfd647d0e5f97684d613dc2eea7cfc19398") (:keywords "faces" "convenience" "lisp" "matching" "parentheses" "parens") (:authors ("Jisang Yoo")) (:maintainer "Jisang Yoo"))])
- (flyspell-correct . [(20200601 944) ((emacs (24))) "Correcting words with flyspell via custom interface" tar ((:commit . "dea1290a371c540dde7b8d0eef7a12d92f7a0b83") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))])
- (flyspell-correct-avy-menu . [(20200215 1337) ((flyspell-correct (0 6 1)) (avy-menu (0 1 1)) (emacs (24))) "Correcting words with flyspell via avy-menu interface" single ((:commit . "dea1290a371c540dde7b8d0eef7a12d92f7a0b83") (:authors ("Boris Buliga" . "boris@d12frosted.io") ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))])
- (flyspell-correct-helm . [(20200215 1337) ((flyspell-correct (0 6 1)) (helm (1 9 0)) (emacs (24))) "Correcting words with flyspell via helm interface" single ((:commit . "dea1290a371c540dde7b8d0eef7a12d92f7a0b83") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))])
- (flyspell-correct-ivy . [(20200513 708) ((flyspell-correct (0 6 1)) (ivy (0 8 0)) (emacs (24 3))) "Correcting words with flyspell via ivy interface" single ((:commit . "dea1290a371c540dde7b8d0eef7a12d92f7a0b83") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))])
- (flyspell-correct-popup . [(20200204 521) ((flyspell-correct (0 6 1)) (popup (0 5 3)) (emacs (24))) "Correcting words with flyspell via popup interface" single ((:commit . "dea1290a371c540dde7b8d0eef7a12d92f7a0b83") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))])
- (flyspell-lazy . [(20180224 2106) nil "Improve flyspell responsiveness using idle timers" single ((:commit . "3ebf68cc9eb10c972a2de8d7861cbabbbce69570") (:keywords "spelling") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/flyspell-lazy"))])
- (flyspell-popup . [(20170529 815) ((popup (0 5 0))) "Correcting words with Flyspell in popup menus" single ((:commit . "29311849bfd253b9b689bf331860b4c4d3bd4dde") (:keywords "convenience") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/flyspell-popup"))])
- (fm-bookmarks . [(20170104 1716) ((emacs (24 3)) (cl-lib (0 5))) "Use file manager bookmarks (eg Dolphin, Nautilus, PCManFM) in Dired" single ((:commit . "11dacfd16a926bfecba96a94c6b13e162c7717f7") (:keywords "files" "convenience") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:url . "http://github.com/kuanyui/fm-bookmarks.el"))])
- (fn . [(20170210 204) ((emacs (24)) (cl-lib (0 5)) (dash (2 12 1)) (dash-functional (1 2 0))) "Concise anonymous functions for Emacs Lisp" single ((:commit . "f685fd0c08ec3b1d1b9974b37e62edd78a000cb8") (:keywords "functional") (:authors ("Troy Pracy")) (:maintainer "Troy Pracy"))])
- (focus . [(20191209 2210) ((emacs (24 3)) (cl-lib (0 5))) "Dim the font color of text in surrounding sections" single ((:commit . "5f3f20e7f22fb9fd7c48abce8bd38061d97e4bc0") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no") (:url . "http://github.com/larstvei/Focus"))])
- (focus-autosave-mode . [(20160519 2116) ((emacs (24 4))) "Automatically save files in focus-out-hook." single ((:commit . "2e0844fabb6f0dc9e0f31928e4785febf38b9e35") (:keywords "convenience" "files" "frames" "mouse") (:authors ("Wojciech Siewierski" . "wojciech.siewierski@onet.pl")) (:maintainer "Wojciech Siewierski" . "wojciech.siewierski@onet.pl"))])
- (foggy-night-theme . [(20190123 1614) ((emacs (24))) "Dark low contrast theme with soft and muted colors." single ((:commit . "14894e06ee5c6e14db36f2cb07387ee971c1736f") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))])
- (fold-dwim . [(20140208 1637) nil "Unified user interface for Emacs folding modes" single ((:commit . "c46f4bb2ce91b4e307136320e72c28dd50b6cd8b") (:authors ("Peter Heslin" . "p.j.heslin@dur.ac.uk")) (:maintainer "Peter Heslin" . "p.j.heslin@dur.ac.uk") (:url . "http://www.dur.ac.uk/p.j.heslin/Software/Emacs"))])
- (fold-dwim-org . [(20131203 1351) ((fold-dwim (1 2))) "Fold DWIM bound to org key-strokes." single ((:commit . "c09bb2b46d65afbd1d0febc6fded7495be7a3037") (:keywords "folding" "emacs" "org-mode") (:authors ("Matthew L. Fidler & Shane Celis")) (:maintainer "Matthew L. Fidler") (:url . "https://github.com/mlf176f2/fold-dwim-org"))])
- (fold-this . [(20191107 1816) nil "Just fold this region please" single ((:commit . "c3912c738cf0515f65162479c55999e2992afce5") (:keywords "convenience") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/fold-this.el"))])
- (folding . [(20190524 1632) nil "A folding-editor-like minor mode." tar ((:commit . "a1361aa154b27bd4db2e1cfe6c3b81b4fc1fdc9a") (:keywords "tools") (:maintainer "Jari Aalto <jari aalto A T cante dt net>"))])
- (font-lock-profiler . [(20170208 2008) ((emacs (24 3))) "Coverage and timing tool for font-lock keywords." single ((:commit . "6e096458416888a4f63cca0d6bc5965a052753c8") (:keywords "faces" "tools") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/font-lock-profiler"))])
- (font-lock-studio . [(20170127 2051) ((emacs (24 3))) "interactive debugger for Font Lock keywords." single ((:commit . "12c35967b31233e06946c70627aa3152dacfe261") (:keywords "faces" "tools") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/font-lock-studio"))])
- (font-utils . [(20150806 1751) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Utility functions for working with fonts" single ((:commit . "9192d3f8ee6a4e75f34c3fed10378674cc2b11d3") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/font-utils"))])
- (fontawesome . [(20170305 1356) ((emacs (24 4))) "fontawesome utility" tar ((:commit . "a743f80bfd53767ca9ee32da34c5ca032172a480") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-fontawesome"))])
- (fontify-face . [(20180420 1624) ((emacs (24))) "Fontify symbols representing faces with that face." single ((:commit . "30ec0134f04d2b156bbc772e94edfa1a31ef0a58") (:keywords "faces") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/fontify-face"))])
- (forecast . [(20191004 1850) ((emacs (24 4))) "Weather forecasts" single ((:commit . "61a14d1a8c17930caca5c5daf893cedc9c23c5f3") (:keywords "weather" "forecast") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:url . "https://dev.gkayaalp.com/elisp/index.html#forecast-el"))])
- (foreign-regexp . [(20200325 50) nil "search and replace by foreign regexp." tar ((:commit . "e2dd47f2160cadc194eb156e7c76c3c869e6706e") (:keywords "convenience" "emulations" "matching" "tools" "unix" "wp") (:authors ("K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>")) (:maintainer "K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>"))])
- (foreman-mode . [(20170725 1422) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "View and manage Procfile-based applications" single ((:commit . "22b3bb13134b617870ed1e888af739f4818be929") (:keywords "foreman") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/foreman-mode"))])
- (forest-blue-theme . [(20160627 842) ((emacs (24))) "Emacs theme with a dark background." single ((:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:authors ("olkinn")) (:maintainer "olkinn"))])
- (forge . [(20200725 1419) ((emacs (25 1)) (closql (1 0 0)) (dash (2 14 1)) (emacsql-sqlite (3 0 0)) (ghub (20190319)) (let-alist (1 0 5)) (magit (20190408)) (markdown-mode (2 3)) (transient (0 1 0))) "Access Git forges from Magit." tar ((:commit . "2c487465d0b78ffe34252b47fcc06e27039330c4"))])
- (form-feed . [(20200527 2152) nil "Display ^L glyphs as horizontal lines" single ((:commit . "fc06255e185d32b1616bd86b69b55c1daabbe378") (:keywords "faces") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/form-feed"))])
- (format-all . [(20200726 1816) ((emacs (24)) (cl-lib (0 5)) (language-id (0 7 1))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" single ((:commit . "5748764079e427109a0501fbeda79debacc52a9e") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-format-all-the-code"))])
- (format-sql . [(20150422 1333) nil "Use format-sql to make your SQL readable in directly Emacs." single ((:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "https://github.com/paetzke/format-sql.el"))])
- (format-table . [(20181223 1616) ((emacs (25)) (dash (2 14 1))) "Parse and reformat tabular data." single ((:commit . "dfcae3a867e574577fc09a43b045889ff155b58f") (:keywords "data") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:url . "https://github.com/functionreturnfunction/format-table"))])
- (forth-mode . [(20170527 1930) nil "Programming language mode for Forth" tar ((:commit . "522256d98d1a909983bcfd3ae20c65226d5929b6") (:keywords "languages" "forth") (:authors ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainer "Lars Brinkhoff" . "lars@nocrew.org") (:url . "http://github.com/larsbrinkhoff/forth-mode"))])
- (fortpy . [(20150715 2032) ((epc (0 1 0)) (auto-complete (1 4)) (python-environment (0 0 2)) (pos-tip (0 4 5))) "a Fortran auto-completion for Emacs" tar ((:commit . "c614517e9396ef7a78be3b8786fbf303879cf43b") (:authors ("Conrad Rosenbrock <rosenbrockc at gmail.com>")) (:maintainer "Conrad Rosenbrock <rosenbrockc at gmail.com>"))])
- (fortune-cookie . [(20181223 842) nil "Print a fortune in your scratch buffer." single ((:commit . "6c1c08f5be83822c0b762872ab25e3dbee96f333") (:keywords "fortune" "cowsay" "scratch" "startup") (:authors ("Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com")) (:maintainer "Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com") (:url . "https://github.com/andschwa/fortune-cookie"))])
- (fountain-mode . [(20200724 240) ((emacs (24 4)) (seq (2 20))) "Major mode for screenwriting in Fountain markup" single ((:commit . "beb78240e95ca18af0243f64d1d21dfbbfe9936f") (:keywords "wp" "text") (:authors ("William Rankin" . "william@bydasein.com")) (:maintainer "William Rankin" . "william@bydasein.com") (:url . "https://github.com/rnkn/fountain-mode"))])
- (fraktur-mode . [(20160815 227) ((cl-lib (0 5))) "Easily insert Unicode mathematical Fraktur characters" single ((:commit . "514baf5546aed12a0d9fa0fe66e87cdcc7843b08") (:keywords "unicode" "fraktur" "math" "mathematical") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainer nil . "<gcr@wisdomandwonder.com>") (:url . "https://github.com/grettke/fraktur-mode"))])
- (frame-local . [(20180330 940) ((emacs (25 1))) "Variables local to a frame" single ((:commit . "7ee1106c3bcd4022f48421f8cb1ef4f995da816e") (:keywords "frames" "tools" "local" "lisp") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:url . "https://github.com/sebastiencs/frame-local"))])
- (frame-mode . [(20190710 2030) ((s (1 9 0)) (emacs (24 4))) "Use frames instead of windows" single ((:commit . "ae2366969927c9f89ea07c999bef382b0b47cac1") (:keywords "frames") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/frame-mode"))])
- (frame-purpose . [(20190114 1403) ((emacs (25 1)) (dash (2 12)) (dash-functional (1 2 0))) "Purpose-specific frames" single ((:commit . "78f978f13589ec5c5370187c008c8aa83e6e71b4") (:keywords "buffers" "convenience" "frames") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/frame-purpose.el"))])
- (frame-tag . [(20170111 6) ((cl-lib (0 5))) "Minor mode that assigns a unique number to each frame for easy switching" single ((:commit . "73d6163568c7d32952175e663318b872f995a4e5") (:keywords "frame" "movement") (:authors ("Wong Liang Zan" . "zan@liangzan.net")) (:maintainer "Wong Liang Zan" . "zan@liangzan.net") (:url . "http://github.com/liangzan/frame-tag.el"))])
- (frames-only-mode . [(20200728 740) ((emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Use frames instead of Emacs windows" single ((:commit . "3cd98cbf80b04ae2ebca1c67c52ba756116f6784") (:keywords "frames" "windows") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/frames-only-mode"))])
- (frameshot . [(20200103 1238) ((emacs (25 3))) "Take screenshots of a frame" single ((:commit . "1b5974f0cc7c2a34e5f9fab6b25578dad7df3dbf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/frameshot"))])
- (framesize . [(20131017 2132) ((key-chord (0 5 20080915))) "change the size of frames in Emacs" single ((:commit . "f2dbf5d2513b2bc45f2085370a55c1754b6025da") (:keywords "frames") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "http://github.com/nicferrier/emacs-framesize"))])
- (frecency . [(20170909 631) ((emacs (25 1)) (a (0 1)) (dash (2 13 0))) "Library for sorting items by frequency and recency of access" single ((:commit . "6d57aee131d96315aedf6cb7d6e5d6d09bf71503") (:keywords "libraries" "recency" "recent" "frequency" "frequent") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/frecency.el"))])
- (frecentf . [(20200624 1534) ((emacs (26 1)) (frecency (0 1 -1)) (persist (0 4))) "Pervasive recentf using frecency" single ((:commit . "d9d093365ffe12c46e81d16ee81850abd86a2177") (:keywords "files" "maint") (:authors ("Felipe Lema" . "felipel@mortemale.org")) (:maintainer "Felipe Lema" . "felipel@mortemale.org") (:url . "https://launchpad.net/frecentf.el"))])
- (free-keys . [(20160726 2050) ((cl-lib (0 3))) "Show free keybindings for modkeys or prefixes" single ((:commit . "edfd69dc369b2647447b7c28c7c1163b1ddf45b4") (:keywords "convenience") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/free-keys"))])
- (freeradius-mode . [(20190401 1743) ((emacs (24 4))) "major mode for FreeRadius server config files" single ((:commit . "cf8bf0359cf6c77848facbd24b764b3e111b4c2d") (:url . "https://github.com/VersBinarii/freeradius-mode"))])
- (freeze-it . [(20200416 1605) ((emacs (24 5))) "Minor mode to make your previous writing read-only" single ((:commit . "b93af18633bc783c2cb8443808aeeaaca33e1146") (:keywords "wp" "text") (:authors ("William Rankin" . "code@william.bydasein.com")) (:maintainer "William Rankin" . "code@william.bydasein.com") (:url . "https://github.com/rnkn/freeze-it"))])
- (friendly-remote-shell . [(20200527 830) ((emacs (24 1)) (cl-lib (0 6 1)) (with-shell-interpreter (0 2 3)) (friendly-tramp-path (0 1 0)) (friendly-shell (0 2 0))) "Human-friendly remote interactive shells" single ((:commit . "5c0eda312d8da6de0848d56abca1b0f5840e81e6") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))])
- (friendly-shell . [(20200527 830) ((emacs (24 1)) (cl-lib (0 6 1)) (with-shell-interpreter (0 2 3))) "Better shell-mode API" single ((:commit . "5c0eda312d8da6de0848d56abca1b0f5840e81e6") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))])
- (friendly-shell-command . [(20200527 830) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 3))) "Better shell-command API" single ((:commit . "5c0eda312d8da6de0848d56abca1b0f5840e81e6") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))])
- (friendly-tramp-path . [(20200502 1032) ((cl-lib (0 6 1))) "Human-friendly TRAMP path construction" single ((:commit . "be572b8953b9e5a3a35c30bb64c2936d3e9802ba") (:url . "https://github.com/p3r7/prf-tramp"))])
- (fringe-current-line . [(20140111 411) nil "show current line on the fringe." single ((:commit . "0ef000bac76abae30601222e6f06c7d133ab4942") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org") (:url . "http://github.com/kyanagi/fringe-current-line/raw/master/fringe-current-line.el"))])
- (fringe-helper . [(20140620 2109) nil "helper functions for fringe bitmaps" single ((:commit . "ef4a9c023bae18ec1ddd7265f1f2d6d2e775efdd") (:keywords "lisp") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/fringe-helper/"))])
- (frog-jump-buffer . [(20200114 1826) ((emacs (24)) (avy (0 4 0)) (dash (2 4 0)) (frog-menu (0 2 8))) "The fastest buffer-jumping Emacs lisp package around." single ((:commit . "1eb289c9b2a4bbebb3065076750f54216ac9c718") (:keywords "convenience" "tools") (:authors ("Justin Talbott")) (:maintainer "Justin Talbott") (:url . "https://github.com/waymondo/frog-jump-buffer"))])
- (fsbot-data-browser . [(20160921 1533) nil "browse the fsbot database using tabulated-list-mode" single ((:commit . "6bca4f7de63e31839d2542f6c678b79931dec344") (:keywords "fsbot" "irc" "tabulated-list-mode") (:authors ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:url . "http://github.com/benaiah/fsbot-data-browser"))])
- (fsharp-mode . [(20200520 1842) ((emacs (25)) (s (1 3 1)) (dash (1 1 0)) (eglot (0))) "Support for the F# programming language" tar ((:commit . "3e41fe1391b64eefa66a8a02fce27a12a04e1e01") (:keywords "languages") (:authors ("1993-1997 Xavier Leroy, Jacques Garrigue and Ian T Zimmerman") ("2010-2011 Laurent Le Brun" . "laurent@le-brun.eu") ("2012-2014 Robin Neatherway" . "robin.neatherway@gmail.com") ("2017-2019 Jürgen Hötzel")) (:maintainer "Jürgen Hötzel"))])
- (fstar-mode . [(20200624 2201) ((emacs (24 3)) (dash (2 11)) (company (0 8 12)) (quick-peek (1 0)) (yasnippet (0 11 0)) (flycheck (30 0)) (company-quickhelp (2 2 0))) "Support for F* programming" tar ((:commit . "bd28cb8f25538e26287c76efbbc5ef7378d1fbc6") (:keywords "convenience" "languages") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:url . "https://github.com/FStarLang/fstar-mode.el"))])
- (fuel . [(20200514 1516) ((cl-lib (0 2)) (emacs (24 2))) "Major mode for the Factor programming language." tar ((:commit . "5d0827ed4ee5254f4b8b93c226645db2850aebaa"))])
- (fuff . [(20170202 1503) ((seq (2 3))) "Find files with findutils, recursively" single ((:commit . "278e849913df87bd8756c59382282d87474802c3") (:keywords "files" "project" "convenience") (:authors ("Joel Moberg")) (:maintainer "Joel Moberg") (:url . "https://github.com/joelmo/fuff"))])
- (full-ack . [(20140223 1732) nil "a front-end for ack" single ((:commit . "761d846e105b150f8e6d13d7a8983f0248313a45") (:keywords "tools" "matching") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/full-ack/"))])
- (fullframe . [(20170816 1003) ((cl-lib (0 5))) "Generalized automatic execution in a single frame" single ((:commit . "2c4497f5d66898f5f4cbde3abe97402880e46c2c") (:keywords "fullscreen") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de"))])
- (function-args . [(20171031 1704) ((ivy (0 9 1))) "C++ completion for GNU Emacs" tar ((:commit . "609b25305670fff08d5e357298e7128e4f4e3497") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/function-args"))])
- (fuo . [(20190812 927) ((emacs (24 4))) "feeluown client." single ((:commit . "0e4122f94a336a50c02bc96652d25ac3d74bedeb") (:keywords "feeluown" "multimedia" "unix") (:authors ("cosven" . "yinshaowen241@gmail.com")) (:maintainer "cosven" . "yinshaowen241@gmail.com") (:url . "http://github.com/cosven/emacs-fuo"))])
- (furl . [(20150509 316) nil "Friendly URL retrieval" single ((:commit . "014438271e0ef27333dfcd599cb247f12a20d870") (:authors ("Natalie Weizenbaum" . "nweiz@google.com")) (:maintainer "Natalie Weizenbaum" . "nweiz@google.com"))])
- (futhark-mode . [(20200627 732) ((emacs (24 3)) (cl-lib (0 5))) "major mode for editing Futhark source files" tar ((:commit . "9db9fb81e08b6ded43a4eede5220644ce354060d") (:keywords "languages") (:url . "https://github.com/diku-dk/futhark-mode"))])
- (fuz . [(20200104 524) ((emacs (25 1))) "Fast and precise fuzzy scoring/matching utils" tar ((:commit . "0b6b64cebde5675be3a28520ee16234db48d3b8b") (:keywords "lisp") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:url . "https://github.com/cireu/fuz.el"))])
- (fuzzy . [(20150730 337) nil "Fuzzy Matching" single ((:commit . "a36bde2f6e94d6b2bfaae68d73bbd39734e5b907") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))])
- (fvwm-mode . [(20160411 1138) nil "A major mode for editing Fvwm configuration files" single ((:commit . "6832a1c1f68bf6249c3fd6672ea8e27dc7a5c79e") (:keywords "files") (:authors ("Bert Geens" . "bert@lair.be")) (:maintainer "Bert Geens" . "bert@lair.be") (:url . "https://github.com/theBlackDragon/fvwm-mode"))])
- (fwb-cmds . [(20180318 2219) nil "misc frame, window and buffer commands" single ((:commit . "90258a5c7dbbaa2ac227e0fb4ff6c7d5aec3628f") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/fwb-cmds"))])
- (fxrd-mode . [(20170728 1801) ((s (1 2))) "Major mode for editing fixed field width files" tar ((:commit . "18a603474abb5a786a8d9f20c283d5f7beed3540") (:keywords "convenience") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com") (:url . "https://github.com/msherry/fxrd-mode"))])
- (fyure . [(20130216 1314) nil "An interface to fix Japanese hyoki-yure" tar ((:commit . "b6977f1eb148e8b63259f7233b55bb050e44d9b8") (:keywords "languages") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com"))])
- (fzf . [(20180619 145) ((emacs (24 4))) "A front-end for fzf." single ((:commit . "521d18933cb586337c4e34281bdc71ac07202c98") (:keywords "fzf" "fuzzy" "search") (:authors ("Bailey Ling")) (:maintainer "Bailey Ling") (:url . "https://github.com/bling/fzf.el"))])
- (gameoflife . [(20200614 1814) nil "Screensaver running Conway's Game of Life" single ((:commit . "2483f3d98dbcf7f1633f551cc3691f5659b4b942") (:keywords "games") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/gameoflife"))])
- (gams-ac . [(20180423 926) ((emacs (24)) (auto-complete (1 0)) (gams-mode (4 0))) "auto-complete source file for GAMS mode" single ((:commit . "66d04ff36033f54205c19bc1d893e926d4dbf02e") (:keywords "languages" "tools" "gams-mode" "auto-complete") (:authors ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:url . "https://github.com/ShiroTakeda/gams-ac"))])
- (gams-mode . [(20200131 1335) ((emacs (24 3))) "Major mode for General Algebraic Modeling System (GAMS)" single ((:commit . "bb4e8a223c8aac5ec9268d1cfcf1a9ea9b3d8a49") (:keywords "languages" "tools" "gams") (:authors ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:url . "http://shirotakeda.org/en/gams/gams-mode/"))])
- (gandalf-theme . [(20130809 947) nil "Gandalf color theme" single ((:commit . "4e472fc851431458537d458d09c1f5895e338536") (:keywords "color" "theme") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))])
- (gap-mode . [(20191110 2237) nil "Major mode for editing files in the GAP programing language." tar ((:commit . "62adb8935033eead7fbf2c107c2dfb79afa53c67") (:keywords "gap") (:authors ("Michael Smith" . "smith@pell.anu.edu.au") ("Gary Zablackis") ("Goetz Pfeiffer") ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com") (:url . "https://gitlab.com/gvol/gap-mode"))])
- (gather . [(20141230 1338) nil "Gather string in buffer." single ((:commit . "50809fbc22d70a1c724c2dd99ac5a1f818ffeb6b") (:keywords "matching" "convenience" "tools") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-gather/raw/master/gather.el"))])
- (gcmh . [(20200409 1456) ((emacs (24))) "the Garbage Collector Magic Hack" single ((:commit . "b1bde5089169a74f62033d027e06e98cbeedd43f") (:keywords "internal") (:maintainer nil . "akrl@sdf.org") (:url . "https://gitlab.com/koral/gcmh"))])
- (gdscript-mode . [(20200726 1721) ((emacs (26 3))) "Major mode for Godot's GDScript language" tar ((:commit . "7aea87bd7b3cd14b1a767e7d835cee896722cd29") (:keywords "languages") (:authors ("Nathan Lovato <nathan@gdquest.com>, Fabián E. Gallina" . "fgallina@gnu.org")) (:maintainer nil . "nathan@gdquest.com") (:url . "https://github.com/GDQuest/emacs-gdscript-mode/"))])
- (geben . [(20170801 1251) ((emacs (24 3)) (cl-lib (0 5))) "DBGp protocol frontend, a script debugger" tar ((:commit . "ec3f5e9376cf1ea5615990bd8c212543d57f033b") (:keywords "c" "comm" "tools") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/geben"))])
- (geben-helm-projectile . [(20160611 59) ((emacs (24)) (geben (0 26)) (helm-projectile (0 13 0))) "Integrate helm-projectile with geben" single ((:commit . "31ce0faca5dcc71924884f03fd5a7a25d00ccd9b") (:keywords "ahungry" "emacs" "geben" "helm" "projectile" "debug") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/geben-helm-projectile"))])
- (geeknote . [(20160717 1249) ((emacs (24))) "Use Evernote in Emacs through geeknote" single ((:commit . "8ed607c76864afcc9c338972ab093caf4501cbf8") (:keywords "evernote" "geeknote" "note" "emacs-evernote" "evernote-mode") (:authors ("Evan Dale Aromin")) (:maintainer "Evan Dale Aromin") (:url . "http://github.com/avendael/emacs-geeknote"))])
- (geiser . [(20200714 1210) nil "GNU Emacs and Scheme talk to each other" tar ((:commit . "adc5c4ab5ff33cf94cb3fcd892bb9503b5fa2aa2") (:url . "http://www.nongnu.org/geiser/"))])
- (geiser-kawa . [(20200507 1305) ((emacs (26 1)) (geiser (0 11 2))) "Kawa scheme support for Geiser" tar ((:commit . "b96c008e9c3b8dc210d8b536ee7b76b8690c8af6") (:keywords "languages" "kawa" "scheme" "geiser") (:authors ("spellcard199" . "spellcard199@protonmail.com")) (:maintainer "spellcard199" . "spellcard199@protonmail.com") (:url . "https://gitlab.com/spellcard199/geiser-kawa"))])
- (gemini-mode . [(20200615 1131) ((emacs (24 3))) "A simple highlighting package for text/gemini" single ((:commit . "3aeb8f2f603ccc5004f93f1f25e989c31f9c6f65") (:keywords "languages") (:authors ("Jason McBrayer <jmcbray@carcosa.net>, tastytea" . "tastytea@tastytea.de")) (:maintainer "Jason McBrayer <jmcbray@carcosa.net>, tastytea" . "tastytea@tastytea.de") (:url . "https://git.carcosa.net/jmcbray/gemini.el"))])
- (general . [(20200516 50) ((emacs (24 4)) (cl-lib (0 5))) "Convenience wrappers for keybindings." tar ((:commit . "a0b17d207badf462311b2eef7c065b884462cb7c") (:keywords "vim" "evil" "leader" "keybindings" "keys") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:url . "https://github.com/noctuid/general.el"))])
- (genrnc . [(20140612 1237) ((deferred (0 3 1)) (concurrent (0 3)) (log4e (0 2 0)) (yaxception (0 1))) "generate RELAX NG Compact Schema from RELAX NG Schema, XML Schema and DTD." tar ((:commit . "da75b1966a73ad215ec2ced4522c25f4d0bf1f9a") (:keywords "xml") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-genrnc"))])
- (geoip . [(20200310 911) ((emacs (25 1))) "Find out where an IP address is located via GeoIP2" single ((:commit . "25eb1278788b942c38405c233d3614a1de92ddea") (:keywords "tools") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/geoip.el"))])
- (geolocation . [(20200308 2324) ((request-deferred (0 3 2)) (deferred (0 5 1)) (emacs (25 1))) "Get your location on Earth" single ((:commit . "83ab28e64bc067016b5344dffe93e380e9807e9c") (:keywords "hardware") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/gonewest818/geolocation.el"))])
- (german-holidays . [(20181213 644) nil "German holidays for Emacs calendar" single ((:commit . "a8462dffccaf2b665f2032e646b5370e993a386a") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com") (:url . "https://github.com/rudolfochrist/german-holidays"))])
- (gerrit . [(20200727 2006) ((emacs (25 1)) (hydra (0 15 0)) (magit (2 13 1)) (s (1 12 0)) (dash (0 2 15))) "Gerrit client" tar ((:commit . "da8d65d6636d30db53c4e84d4bd9cec1dd73bba3") (:keywords "extensions") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:url . "https://github.com/thisch/gerrit.el"))])
- (gerrit-download . [(20150714 1408) ((emacs (24 0)) (magit (2 1 0))) "Show gerrit reviews in a diff buffer." single ((:commit . "d568acc7c5935188c9bc19ba72719a6092d9f6fd") (:keywords "tools" "gerrit" "git") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:url . "https://github.com/chmouel/gerrit-download.el"))])
- (gf . [(20181028 1542) ((s (1 0)) (ht (2 0))) "Major mode for editing GF code" single ((:commit . "30b3127f229e0db522c7752f6957ca01b2ea2821") (:keywords "languages") (:authors ("Johan Bockgård" . "bojohan+mail@dd.chalmers.se")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:url . "https://github.com/GrammaticalFramework/gf-emacs-mode"))])
- (ggo-mode . [(20130524 1143) nil "Gengetopt major mode" single ((:commit . "e326899d9ed8217c7a4ea6cfdc4dd7aea61d6c1b") (:keywords "extensions" "convenience" "local") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu"))])
- (ggtags . [(20190320 2208) ((emacs (25))) "emacs frontend to GNU Global source code tagging system" single ((:commit . "4d9000034d352cd983ae6626f560e434d0b3e9ca") (:keywords "tools" "convenience") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com") (:url . "https://github.com/leoliu/ggtags"))])
- (gh . [(20180308 2138) ((emacs (24 3)) (pcache (0 4 1)) (logito (0 1)) (marshal (0 6 3))) "A GitHub library for Emacs" tar ((:commit . "f029fc11f345ef04ab62ee91c38657e29c462fea"))])
- (gh-md . [(20151207 1740) ((emacs (24))) "Render markdown using the Github api" single ((:commit . "693cb0dcadff70e813e1a9d303d227aff7898557") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/gh-md.el"))])
- (ghc . [(20180121 1218) ((haskell-mode (13 0))) "Sub mode for Haskell mode" tar ((:commit . "391e187a5dfef4421aab2508fa6ff7875cc8259d"))])
- (ghc-imported-from . [(20141124 1932) ((emacs (24 1))) "Haskell documentation lookup with ghc-imported-from" single ((:commit . "fcff08628a19f5d26151564659218cc677779b79") (:keywords "languages") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (ghci-completion . [(20151125 1257) ((emacs (24 1)) (cl-lib (0 5))) "Completion for GHCi commands in inferior-haskell buffers" single ((:commit . "c47e23d585d2a3c7b13aac163693fdc4f2bb90e5") (:keywords "convenience") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com"))])
- (gherkin-mode . [(20171224 1353) nil "An emacs major mode for editing gherkin files." single ((:commit . "0313492e7da152f0aa73ddf96c0287ded8f51253") (:keywords "languages") (:authors ("Craig Andera")) (:maintainer "Craig Andera"))])
- (ghost-blog . [(20171023 742) ((markdown-mode (1 0))) "A package to manage Ghost blog" single ((:commit . "71b358643cc9a2db1bf752281ff94aba9b59e4cc") (:keywords "ghost" "blog") (:authors ("Javier Aguirre" . "hello@javaguirre.net")) (:maintainer "Javier Aguirre" . "hello@javaguirre.net") (:url . "https://github.com/javaguirre/ghost-blog"))])
- (ghq . [(20160803 1557) nil "Ghq interface for emacs" single ((:commit . "aae4b8cb22fd6c24d2c9e3962c7e8e9dac6d9825") (:keywords "ghq") (:authors ("Roman Coedo" . "romancoedo@gmail.com")) (:maintainer "Roman Coedo" . "romancoedo@gmail.com"))])
- (ghub+ . [(20191229 1748) ((emacs (25)) (ghub (2 0)) (apiwrap (0 5))) "a thick GitHub API client built on ghub" single ((:commit . "b1adef2402d7599911d4dd447a987a0cea04e6fe") (:keywords "extensions" "multimedia" "tools") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:url . "https://github.com/vermiculus/ghub-plus"))])
- (ghub . [(20200725 1419) ((emacs (25 1)) (let-alist (1 0 5)) (treepy (0 1 1))) "Minuscule client libraries for Git forge APIs." tar ((:commit . "3611f42ba4325eb2b21db7f7b10506b07e3f0999"))])
- (gif-screencast . [(20200327 1332) ((emacs (25 1))) "One-frame-per-action GIF recording" single ((:commit . "e39786458fb30e2e9683094c75c6c2cef537d9c4") (:keywords "multimedia" "screencast") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://gitlab.com/ambrevar/emacs-gif-screencast"))])
- (gift-mode . [(20180530 1235) nil "major mode for editing GIFT format quizzes" single ((:commit . "b0441ae6e02f343be3b611a2d4b40495ecd932f0") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io") (:url . "https://github.com/csrhodes/gift-mode"))])
- (gildas-mode . [(20181022 649) ((polymode (0 1 5)) (emacs (25))) "Major mode for Gildas" single ((:commit . "d0c9e997e2aa0bcd9b8b7db082d69100448cb1b2") (:keywords "languages" "gildas") (:authors ("Sébastien Maret" . "sebastien.maret@icloud.com")) (:maintainer "Sébastien Maret" . "sebastien.maret@icloud.com") (:url . "https://github.com/smaret/gildas-mode"))])
- (gist . [(20171128 406) ((emacs (24 1)) (gh (0 10 0))) "Emacs integration for gist.github.com" single ((:commit . "314fe6ab80fae35b95f0734eceb82f72813b6f41") (:keywords "tools") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:url . "https://github.com/defunkt/gist.el"))])
- (git . [(20140128 1041) ((s (1 7 0)) (dash (2 2 0)) (f (0 10 0))) "An Elisp API for programmatically using Git" single ((:commit . "a3396a7027a7d986598c6a2d6d5599bac918f3da") (:keywords "git") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/git.el"))])
- (git-annex . [(20190625 2118) nil "Mode for easy editing of git-annex'd files" single ((:commit . "1324d3f23c534fe79391a2c256bb8803054e383b") (:keywords "files" "data" "git" "annex") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:url . "https://github.com/jwiegley/git-annex-el"))])
- (git-attr . [(20180925 2003) ((emacs (24 3))) "Git attributes of buffer file" tar ((:commit . "50df0630eba2a931146f676d349b29bde6b6b37b") (:keywords "vc") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:url . "https://github.com/arnested/emacs-git-attr"))])
- (git-auto-commit-mode . [(20200705 1428) nil "Emacs Minor mode to automatically commit and push" single ((:commit . "14e4def248d0d80c8f14bf2796493a3ef5b4b044") (:keywords "vc") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:url . "https://github.com/ryuslash/git-auto-commit-mode"))])
- (git-backup . [(20191209 2144) ((emacs (24 3)) (s (1 8 0))) "Backup each file change using git" single ((:commit . "643c8c292c128ac3d0c4d80f2d4a2e19db711e6c") (:keywords "backup" "files" "tools" "git") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:url . "http://github.com/antham/git-backup"))])
- (git-backup-ivy . [(20200709 818) ((ivy (0 12 0)) (git-backup (0 0 1)) (emacs (25 1))) "An ivy interface to git-backup" single ((:commit . "0a5c52e64d0062f77ffefc9213e75690c6d7b111") (:keywords "backup" "convenience" "files" "tools" "vc") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:url . "https://github.com/walseb/git-backup-ivy"))])
- (git-blamed . [(20161028 1926) nil "Minor mode for incremental blame for Git" single ((:commit . "cef196abf398e2dd11f775d1e6cd8690567408aa") (:keywords "git" "version control" "release management"))])
- (git-command . [(20191028 333) ((term-run (0 1 4)) (with-editor (2 3 1))) "A Git Command-Line interface" single ((:commit . "a773d40da39dfb1c6ecf2b0758aa370ddea8f06d") (:keywords "utility" "git") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/git-command-el"))])
- (git-commit . [(20200701 2112) ((emacs (25 1)) (dash (20200524)) (transient (20200601)) (with-editor (20200522))) "Edit Git commit messages" single ((:commit . "fccd3cff52fc5b655bbb80bc6c894a2a27f188ea") (:keywords "git" "tools" "vc") (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/magit"))])
- (git-commit-insert-issue . [(20191008 950) ((projectile (0)) (s (0)) (github-issues (0)) (gitlab (0)) (bitbucket (0))) "Get issues list when typing \"Fixes #\"" single ((:commit . "51c863d9ba21bf11f6681b54be19b4c04d50d1ba") (:keywords "git" "github" "gitlab" "bitbucket" "commit" "issues") (:authors ("Vindarel")) (:maintainer "Vindarel") (:url . "https://gitlab.com/emacs-stuff/git-commit-insert-issue/"))])
- (git-dwim . [(20170126 1214) nil "Context-aware git commands such as branch handling" single ((:commit . "485c732130686c2f28a026e385366006435394b9") (:keywords "git" "tools" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/git-dwim.el"))])
- (git-gutter+ . [(20151204 1723) ((git-commit (0)) (dash (0))) "Manage Git hunks straight from the buffer" single ((:commit . "b7726997806d9a2da9fe84ff00ecf21d62b6f975") (:keywords "git" "vc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/nonsequitur/git-gutter-plus"))])
- (git-gutter . [(20200326 1814) ((emacs (24 3))) "Port of Sublime Text plugin GitGutter" single ((:commit . "2c3242116a42dbbe30fc0844d1ec3c41074cdaba") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/git-gutter"))])
- (git-gutter-fringe+ . [(20140729 1103) ((git-gutter+ (0 1)) (fringe-helper (1 0 1))) "Fringe version of git-gutter+.el" single ((:commit . "7a2f49d2455a3a872e90e5f7dd4e6b27f1d96cfc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/nonsequitur/git-gutter-fringe-plus"))])
- (git-gutter-fringe . [(20200323 2249) ((git-gutter (0 88)) (fringe-helper (0 1 1)) (cl-lib (0 5)) (emacs (24))) "Fringe version of git-gutter.el" single ((:commit . "da19a474137876b29b5658ee7e9ae366f2b65c1d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/git-gutter-fringe"))])
- (git-identity . [(20200630 1730) ((emacs (25 1)) (dash (2 10)) (hydra (0 14)) (f (0 20))) "Identity management for (ma)git" tar ((:commit . "eec910b2a5459345321b5b9d166383f1323501f5") (:keywords "git" "vc" "convenience") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/git-identity.el"))])
- (git-io . [(20180317 1752) ((emacs (24 4))) "git.io integration" single ((:commit . "48753acba73b48b997bb678fb5e2a938ae63b5d6") (:keywords "convenience" "files") (:authors ("Tejas Bubane" . "tejasbubane@gmail.com")) (:maintainer "Tejas Bubane" . "tejasbubane@gmail.com") (:url . "https://github.com/tejasbubane/emacs-git-io"))])
- (git-lens . [(20190319 1342) ((emacs (24 4))) "Show new, deleted or modified files in branch" single ((:commit . "f6cc0a37c9c5c422c49c32650e70bc4721707985") (:keywords "vc" "convenience") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:url . "https://github.com/pidu/git-lens"))])
- (git-link . [(20200721 2250) ((emacs (24 3))) "Get the GitHub/Bitbucket/GitLab URL for a buffer location" single ((:commit . "cbaf7033edad8d4712b6e7dc11cad979c6a002de") (:keywords "git" "vc" "github" "bitbucket" "gitlab" "sourcehut" "convenience") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:url . "http://github.com/sshaw/git-link"))])
- (git-messenger . [(20200321 2337) ((emacs (24 3)) (popup (0 5 3))) "Popup last commit of current line" single ((:commit . "2d64e62e33be9f881ebb019afc183caac9c62eda") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto") (:url . "https://github.com/emacsorphanage/git-messenger"))])
- (git-msg-prefix . [(20191031 1304) ((emacs (24)) (s (1 10 0)) (dash (2 9 0))) "Insert commit message prefix (issue number)" single ((:commit . "43f6b31c1090371260a2f15b2117a7666920bee7") (:keywords "vc" "tools") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:url . "http://github.com/kidd/git-msg-prefix.el"))])
- (git-ps1-mode . [(20200113 704) nil "Global minor-mode to print __git_ps1 in mode-line" single ((:commit . "6762a309bd593d26258dfbf43e7bc21254a70fbf") (:keywords "utility" "mode-line" "git") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/git-ps1-mode-el"))])
- (git-time-metric . [(20181116 2011) nil "Provide function to record time with gtm ( git time metric )" single ((:commit . "287108ed1d6885dc795eb3bad4476aa08c626186") (:keywords "tools" "gtm" "productivity" "time") (:authors ("Anton Sivolapov" . "anton.sivolapov@gmail.com")) (:maintainer "Anton Sivolapov" . "anton.sivolapov@gmail.com") (:url . "https://github.com/c301/gtm-emacs-plugin"))])
- (git-timemachine . [(20200603 701) ((emacs (24 3)) (transient (0 1 0))) "Walk through git revisions of a file" single ((:commit . "8d675750e921a047707fcdc36d84f8439b19a907") (:keywords "vc") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:url . "https://gitlab.com/pidu/git-timemachine"))])
- (git-walktree . [(20191101 302) ((emacs (26 1)) (git (0 1 1)) (cl-lib (0 5))) "Browse Git tree and blob objects" tar ((:commit . "162d9073286c256502df4baa9845790b9f4c2f05") (:keywords "vc" "utility" "git") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:url . "https://github.com/10sr/git-walktree-el"))])
- (git-wip-timemachine . [(20150408 1006) ((s (1 9 0))) "Walk through git-wip revisions of a file" single ((:commit . "ed4c7931a5f5233bf3e358b1e81647d063526460") (:keywords "git") (:authors ("Tim Krones" . "t.krones@gmx.net")) (:maintainer "Tim Krones" . "t.krones@gmx.net") (:url . "https://github.com/itsjeyd/git-wip-timemachine"))])
- (gitattributes-mode . [(20180318 1956) nil "Major mode for editing .gitattributes files" single ((:commit . "55468314a5f6b77d2c96be62c7005ac94545e217") (:keywords "convenience" "vc" "git") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/git-modes"))])
- (gitconfig . [(20130718 935) nil "Emacs lisp interface to work with git-config variables" single ((:commit . "7612a37ca14009cac8fb8d6b6f54adad739a5741") (:keywords "git" "gitconfig" "git-config") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini"))])
- (gitconfig-mode . [(20180318 1956) nil "Major mode for editing .gitconfig files" single ((:commit . "55468314a5f6b77d2c96be62c7005ac94545e217") (:keywords "convenience" "vc" "git") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/git-modes"))])
- (github-browse-file . [(20160205 1427) ((cl-lib (0 5))) "View the file you're editing on GitHub" single ((:commit . "9742a5183af853788c6ecb83fb7ee0b00d1675ac") (:keywords "convenience" "vc" "git" "github") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:url . "https://github.com/osener/github-browse-file"))])
- (github-clone . [(20160623 310) ((gh (0 7 2)) (magit (2 1 0)) (emacs (24 4))) "Fork and clone github repos" single ((:commit . "467b40ca60a6c26257466ebc43c74414df7f19cc") (:keywords "vc" "tools") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:url . "https://github.com/dgtized/github-clone.el"))])
- (github-elpa . [(20200129 417) ((package-build (1 0)) (commander (0 7 0)) (git (0 1 1))) "Build and publish ELPA repositories with GitHub Pages" tar ((:commit . "04a55c723ffcd84dd35e5438e7e2b9f1cce08d42") (:authors (nil . "10sr<8slashes+el@gmail.com>")) (:maintainer nil . "10sr<8slashes+el@gmail.com>") (:url . "https://github.com/10sr/github-elpa"))])
- (github-explorer . [(20190701 630) ((emacs (24 4))) "Explore a GitHub repository on the fly" single ((:commit . "e3a410dd1113bdff382a745465ea48d9b1fe860b") (:keywords "comm") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:url . "https://github.com/TxGVNN/github-explorer"))])
- (github-issues . [(20160616 1841) ((emacs (24))) "Functions and modes for managing GitHub projects' issues" single ((:commit . "816f7712b0eb05bffec0add3507302862d2629c4") (:keywords "github" "issues") (:authors ("Leandro M. López (inkel)" . "inkel.ar@gmail.com")) (:maintainer "Leandro M. López (inkel)" . "inkel.ar@gmail.com") (:url . "http://inkel.github.com/github-issues.el/"))])
- (github-modern-theme . [(20171109 1251) nil "The GitHub color theme for Emacs." single ((:commit . "a7e7b8e5e9c122138e79e837caf9b7299e748d44") (:authors ("Philip Arvidsson" . "philip@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "philip@philiparvidsson.com") (:url . "https://github.com/philiparvidsson/GitHub-Theme-for-Emacs"))])
- (github-notifier . [(20180421 316) ((emacs (24))) "Displays your GitHub notifications unread count in mode-line" single ((:commit . "274f3812926ea371346f639fcee98066f6e8c96f") (:keywords "github" "mode-line") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/github-notifier.el"))])
- (github-pullrequest . [(20170116 616) ((emacs (24 4)) (request (0 2 0)) (dash (2 11 0)) (magit (2 10 0))) "Create and fetch Github Pull requests with ease" single ((:commit . "6ae5c38b0fc15b638b5ba4490112d9822ce5e267") (:keywords "tools") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com") (:url . "https://github.com/jakoblind/github-pullrequest"))])
- (github-review . [(20200314 438) ((emacs (25)) (s (1 12 0)) (ghub (2 0)) (dash (2 11 0)) (deferred (0 5 1))) "GitHub based code review" single ((:commit . "fab440aeae4fbf6a8192fd11795052e9eb5d27d1") (:keywords "git" "tools" "vc" "github") (:authors ("Laurent Charignon" . "l.charignon@gmail.com")) (:maintainer "Laurent Charignon" . "l.charignon@gmail.com") (:url . "https://github.com/charignon/github-review"))])
- (github-search . [(20190624 436) ((magit (0 8 1)) (gh (1 0 0))) "Clone repositories by searching github" single ((:commit . "b73efaf19491010522b09db35bb0f1bad1620e63") (:keywords "github" "search" "clone" "api" "gh" "magit" "vc" "tools") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/github-search"))])
- (github-stars . [(20190517 1319) ((emacs (25 1)) (ghub (2 0 0))) "Browse your Github Stars" single ((:commit . "a9f25ab2487c886f5d50d26693d49856bd51383b") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/github-stars.el"))])
- (github-theme . [(20170630 2201) nil "The GitHub color theme for Emacs." single ((:commit . "29f00a51d949a248a5f6355a97131e216747c797") (:authors ("Philip Arvidsson" . "philip@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "philip@philiparvidsson.com") (:url . "https://github.com/philiparvidsson/GitHub-Theme-for-Emacs"))])
- (gitignore-mode . [(20180318 1956) nil "Major mode for editing .gitignore files" single ((:commit . "55468314a5f6b77d2c96be62c7005ac94545e217") (:keywords "convenience" "vc" "git") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/git-modes"))])
- (gitignore-templates . [(20200228 1419) ((emacs (24 3))) "Create .gitignore using GitHub or gitignore.io API" single ((:commit . "b147d1930645dda76dbd48fb6f4f7f790353de26") (:keywords "tools") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/gitignore-templates.el"))])
- (gitlab . [(20180312 1647) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Gitlab" tar ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:keywords "gitlab") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/emacs-gitlab"))])
- (gitlab-ci-mode . [(20191022 2017) ((emacs (25 1)) (yaml-mode (0 0 12))) "Mode for editing GitLab CI files" single ((:commit . "c861dc5fa17d380d5c3aca99dc3bbec5eee623bc") (:keywords "tools" "vc") (:authors ("Joe Wreschnig")) (:maintainer "Joe Wreschnig") (:url . "https://gitlab.com/joewreschnig/gitlab-ci-mode/"))])
- (gitlab-ci-mode-flycheck . [(20190323 1829) ((emacs (25)) (flycheck (31)) (gitlab-ci-mode (1))) "Flycheck support for ‘gitlab-ci-mode’" single ((:commit . "eba81cfb7224fd1fa4e4da90d11729cc7ea12f72") (:keywords "tools" "vc" "convenience") (:authors ("Joe Wreschnig")) (:maintainer "Joe Wreschnig") (:url . "https://gitlab.com/joewreschnig/gitlab-ci-mode-flycheck/"))])
- (gitlab-snip-helm . [(20200427 2014) ((emacs (25)) (dash (2 12 0)) (helm (3 2))) "Gitlab snippets api helm package" single ((:commit . "782df679e33646db29e07508311bc8e8624b484e") (:keywords "tools" "files" "convenience") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:url . "https://gitlab.com/sasanidas/gitlab-snip-helm"))])
- (gitolite-clone . [(20160609 2355) ((dash (2 10 0)) (s (1 9 0)) (pcache (0 3 1)) (emacs (24))) "Clone gitolite repositories from a completing list" single ((:commit . "d8a4c2875c984e51137c980b5773f42703602721") (:keywords "gitolite" "clone" "git") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/gitolite-clone"))])
- (gitpatch . [(20170722 410) ((emacs (24 3))) "Git-format patch toolkit" single ((:commit . "577d5adf65c8133caa325c10e89e1e2fc323c907") (:keywords "convenience") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/gitpatch"))])
- (gitter . [(20180122 856) ((emacs (24 4)) (let-alist (1 0 4))) "An Emacs Gitter client" single ((:commit . "11cb9b4b45f67bdc24f055a9bfac21d2bd19ea1a") (:keywords "gitter" "chat" "client" "internet") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/gitter.el"))])
- (gl-conf-mode . [(20170714 1310) ((emacs (24 3))) "Mode for editing gitolite config files" single ((:commit . "9136a9b737e0a5b6471a91571d104c487c43f35b") (:keywords "git" "gitolite" "languages") (:authors ("Luis Lloret")) (:maintainer "Luis Lloret") (:url . "https://github.com/llloret/gitolite-emacs"))])
- (global-tags . [(20200520 1816) ((emacs (26 1))) "Elisp API and editor integration for GNU global" single ((:commit . "f3c93828ab08895bf7eac8a2d3bfd949303a6d1f") (:keywords "convenience" "matching" "tools") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org") (:url . "https://launchpad.net/global-tags.el"))])
- (glsl-mode . [(20200501 2304) nil "major mode for Open GLSL shader files" single ((:commit . "b07112016436d9634cd4ef747f9af6b01366d136") (:keywords "languages" "opengl" "gpu" "spir-v" "vulkan") (:url . "https://github.com/jimhourihan/glsl-mode"))])
- (gmail-message-mode . [(20160627 1847) ((ham-mode (1 0))) "A major-mode for editing gmail messages using markdown syntax." single ((:commit . "ec36672a9dc93c09ebe2f77597b498d11883d008") (:keywords "mail" "convenience" "emulation") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/gmail-message-mode"))])
- (gmail2bbdb . [(20170423 1144) nil "import email and name into bbdb from vcard." single ((:commit . "a84fa385cfaec7fc5f1518c368e52722da139f99") (:keywords "vcard" "bbdb" "email" "contact" "gmail") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "http://github.com/redguardtoo/gmail2bbdb"))])
- (gmpl-mode . [(20171031 2054) ((emacs (24))) "Major mode for editing GMPL(MathProg) files" single ((:commit . "c5d362169819ee8b8e8954145daee7e260c54921") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (gn-mode . [(20190428 1812) ((emacs (24)) (cl-lib (0 5))) "major mode for editing GN (generate ninja) files" single ((:commit . "fcf8e1e500d953364e97e7ebc5708a2c00fa3cd2") (:keywords "data") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net") (:url . "http://github.com/lashtear/gn-mode"))])
- (gnome-calendar . [(20161110 1256) nil "Integration with the GNOME Shell calendar" single ((:commit . "489f9f15f7bb35696b1cc19db75b554ae8328df2") (:keywords "gnome" "calendar") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))])
- (gnome-screencast . [(20200115 2230) ((emacs (25))) "Use Gnome screen recording functionality using elisp" single ((:commit . "8c5e787230b2b8a51520ab970d5b505cbbc8f32f") (:keywords "tools" "multimedia") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:url . "https://github.com/juergenhoetzel/emacs-gnome-screencast"))])
- (gnomenm . [(20150316 1918) ((s (1 9 0)) (dash (2 3 0)) (kv (0 0 19))) "Emacs interface to Gnome nmcli command" single ((:commit . "9065cda44ffc9e06239b8189a0154d31314c3b4d") (:keywords "processes" "hardware") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "http://github.com/nicferrier/emacs-nm"))])
- (gntp . [(20141025 250) nil "Growl Notification Protocol for Emacs" single ((:commit . "767571135e2c0985944017dc59b0be79af222ef5") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))])
- (gnu-apl-mode . [(20200108 1633) ((emacs (24))) "Integrate GNU APL with Emacs" tar ((:commit . "7f84eb307e9765fadcd1e0a9201ae562724ef1c9") (:keywords "languages" "apl") (:url . "https://github.com/lokedhs/gnu-apl-mode"))])
- (gnuplot . [(20200322 53) ((emacs (24 1))) "Major-mode and interactive frontend for gnuplot" tar ((:commit . "f0001c30010b2899e36d7d89046322467e923088") (:keywords "data" "gnuplot" "plotting") (:authors ("Jon Oddie") ("Bruce Ravel") ("Phil Type")) (:maintainer "Bruce Ravel" . "bruceravel1@gmail.com") (:url . "https://github.com/emacsorphanage/gnuplot"))])
- (gnuplot-mode . [(20171013 1616) nil "Major mode for editing gnuplot scripts" single ((:commit . "601f6392986f0cba332c87678d31ae0d0a496ce7") (:keywords "gnuplot" "plotting") (:url . "https://github.com/mkmcc/gnuplot-mode"))])
- (gnus-alias . [(20150316 42) nil "an alternative to gnus-posting-styles" single ((:commit . "9447d3ccb4c0e75d0468899cccff7aa249657bac") (:keywords "personality" "identity" "news" "mail" "gnus") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org"))])
- (gnus-desktop-notify . [(20180623 1538) ((gnus (1 0))) "Gnus Desktop Notification global minor mode" single ((:commit . "b438feb59136621a8ab979f0e2784f7002398d06") (:authors ("Yuri D'Elia <wavexx AT thregr.org>")) (:maintainer "Yuri D'Elia <wavexx AT thregr.org>") (:url . "http://www.thregr.org/~wavexx/software/gnus-desktop-notify.el/"))])
- (gnus-notes . [(20200605 1421) ((emacs (25 1)) (bbdb (3 1)) (helm (3 1)) (hydra (0 13 0)) (org (8 3)) (s (0 0)) (lv (0 0)) (async (1 9 1))) "Keep handy notes of read Gnus articles with helm and org" tar ((:commit . "2b587ac2e428fe3805443df5306e67d78bdf8ec2") (:keywords "convenience" "mail" "bbdb" "gnus" "helm" "org" "hydra") (:authors ("Deus Max" . "deusmax@gmx.com")) (:maintainer "Deus Max" . "deusmax@gmx.com") (:url . "https://github.com/deusmax/gnus-notes"))])
- (gnus-recent . [(20200513 1038) ((emacs (25 3 2))) "article breadcrumbs for Gnus" single ((:commit . "a7b131c5acd10df2949ef4f799af08ded013bc35") (:keywords "convenience" "mail") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "https://github.com/unhammer/gnus-recent"))])
- (gnus-select-account . [(20170722 511) nil "Select an account before writing a mail in gnus" single ((:commit . "ddc8c135eeaf90f5b6692a033af2badae36e68ce") (:keywords "convenience") (:authors ("Feng Shu " . "tumashu@163.com")) (:maintainer "Feng Shu " . "tumashu@163.com") (:url . "https://github.com/tumashu/gnus-select-account"))])
- (gnus-summary-ext . [(20180113 1316) nil "Extra limit and process mark commands for the gnus summary buffer" single ((:commit . "025fd853fe9280ae696a89ec2c2cac9befd010aa") (:keywords "comm") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/gnus-summary-ext"))])
- (gnus-summary-repo . [(20190617 1419) ((emacs (25))) "Import and export files between IMAP and local by using GNUS" single ((:commit . "3968667bfded60fbbf33f2fba3170e2b6501ec43") (:keywords "gnus" "repository") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:url . "https://github.com/TxGVNN/gnus-summary-repo"))])
- (gnus-x-gm-raw . [(20140610 731) ((log4e (0 2 0)) (yaxception (0 1))) "Search mail of Gmail using X-GM-RAW as web interface" single ((:commit . "978bdfcecc8844465b71641c2e909fcdc66b22be") (:keywords "gnus") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/gnus-x-gm-raw"))])
- (go . [(20161111 249) ((emacs (24))) "Play GO, translate and transfer between GO back ends" tar ((:commit . "ff45fb44d9cb6579d8511d8b6156ed0b34d5ac97") (:keywords "game" "go" "sgf") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:url . "http://eschulte.github.io/el-go/"))])
- (go-add-tags . [(20161123 1227) ((emacs (24 3)) (s (1 11 0))) "Add field tags for struct fields" single ((:commit . "54879945e46a0884c5f93d7fd6c866a9cdf401ac") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-add-tags"))])
- (go-autocomplete . [(20150904 240) ((auto-complete (1 4 0))) "auto-complete-mode backend for go-mode" single ((:commit . "4acdcbdea79de6b3dee1c637eca5cbea0fdbe37c") (:keywords "languages") (:authors ("Mikhail" . "tensai@cirno.in")) (:maintainer "Mikhail" . "tensai@cirno.in"))])
- (go-capf . [(20200602 1218) ((emacs (24 4))) "Completion-at-point backend for go" single ((:commit . "3e1f7c57aa1d60cceac3ec6a6f4989e3c637ad83") (:keywords "languages" "abbrev" "convenience") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/go-capf"))])
- (go-complete . [(20190409 516) ((go-mode (0)) (cl-lib (0 5))) "Native code completion for Go" single ((:commit . "056294014f37a1004958ec17ebd6748deed63502") (:keywords "go" "golang" "completion") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:url . "https://github.com/vibhavp/go-complete"))])
- (go-direx . [(20150316 143) ((direx (1 0 0)) (cl-lib (0 5))) "Tree style source code viewer for Go language" single ((:commit . "8f2206469328ee932c7f1892f5e1fb02dec98432") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-direx"))])
- (go-dlv . [(20200713 1202) ((go-mode (1 3 1))) "Go Delve - Debug Go programs interactively with the GUD." single ((:commit . "69b86c1bdb73d78fb3404f2f1eefbc9a93b1aba6") (:keywords "go" "debug" "debugger" "delve" "interactive" "gud") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:url . "https://github.com/benma/go-dlv.el/"))])
- (go-eldoc . [(20170305 1427) ((emacs (24 3)) (go-mode (1 0 0))) "eldoc for go-mode" single ((:commit . "cbbd2ea1e94a36004432a9ac61414cb5a95a39bd") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-eldoc"))])
- (go-errcheck . [(20160723 43) nil "errcheck integration for go-mode" single ((:commit . "9db21eccecedc2490793f176246094167164af31") (:authors ("Dominik Honnef" . "dominikh@fork-bomb.org")) (:maintainer "Dominik Honnef" . "dominikh@fork-bomb.org"))])
- (go-fill-struct . [(20171225 331) ((emacs (24))) "Fill struct for golang." single ((:commit . "a613d0b378473eef39e8fd5724abe790aea84321") (:keywords "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:url . "https://github.com/s-kostyaev/go-fill-struct"))])
- (go-gen-test . [(20171023 358) ((emacs (24 3)) (s (1 12))) "Generate tests for go code with gotests" single ((:commit . "44c202ac97e728e93a35cee028a0ea8dd6e4292c") (:keywords "languages") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:url . "https://github.com/s-kostyaev/go-gen-test"))])
- (go-gopath . [(20160705 1034) ((cl-lib (0 5))) "Will guess GOPATH using gb and projectile." single ((:commit . "5172fc53f21edbf9347d5ee7d1d745da1ec88a15") (:authors ("Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com")) (:maintainer "Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com") (:url . "http://github.com/iced/go-gopath/"))])
- (go-guru . [(20181012 330) ((go-mode (1 3 1)) (cl-lib (0 5))) "Integration of the Go 'guru' analysis tool into Emacs." single ((:commit . "734d5232455ffde088021ea5908849ac570e890f") (:keywords "tools"))])
- (go-imenu . [(20181029 1029) ((emacs (24 3))) "Enhance imenu for go language" single ((:commit . "4f3f334ed0b6f6afaca6b9775636a52ad3843053") (:keywords "tools") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:url . "https://github.com/brantou/go-imenu.el"))])
- (go-impl . [(20170125 1552) ((emacs (24 3)) (go-mode (1 3 0))) "impl integration for go-mode" single ((:commit . "69f0d0ef05771487e15abec500cd06befd171abf") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-impl"))])
- (go-imports . [(20190715 1647) nil "Insert go import statement given package name" tar ((:commit . "55681e815da93b6f927213c4aa352ae33db97c37") (:keywords "tools" "go" "import") (:authors ("Yaz Saito")) (:maintainer "Yaz Saito") (:url . "https://github.com/yasushi-saito/go-imports"))])
- (go-mode . [(20200425 1740) nil "Major mode for the Go programming language" single ((:commit . "734d5232455ffde088021ea5908849ac570e890f") (:keywords "languages" "go") (:authors ("The go-mode Authors")) (:maintainer "The go-mode Authors") (:url . "https://github.com/dominikh/go-mode.el"))])
- (go-noisegate . [(20200502 703) ((emacs (24 4))) "Run Golang tests with Noise Gate" single ((:commit . "e3fc198c234131c94f7d307b7f7c6ef623fb93b7") (:keywords "languages" "go" "test") (:authors ("The Noise Gate Authors")) (:maintainer "The Noise Gate Authors") (:url . "https://github.com/go-noisegate/go-noisegate.el"))])
- (go-playground . [(20190625 1855) ((emacs (24)) (go-mode (1 4 0)) (gotest (0 13 0))) "Local Golang playground for short snippets." single ((:commit . "508294fbc22b22b37f587b2dbc8f3a48a16a07a6") (:keywords "tools" "golang") (:authors ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov" . "grafov@gmail.com") (:url . "https://github.com/grafov/go-playground"))])
- (go-playground-cli . [(20160503 914) ((emacs (24)) (request (0 2 0)) (deferred (0 3 2)) (names (20151201 404)) (s (1 10 0)) (f (0 17 2)) (let-alist (1 0 4)) (cl-lib (0 5))) "Go Playground client tool" single ((:commit . "60beebd98e3930641d41cee0189c579626f223bc") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:url . "https://github.com/kosh04/go-playground-cli"))])
- (go-projectile . [(20200609 131) ((projectile (0 10 0)) (go-mode (0)) (go-eldoc (0 16)) (go-rename (0)) (go-guru (0)) (dash (2 17 0))) "Go add-ons for Projectile" single ((:commit . "ad4ca3b5695a0e31e95e3cc4ccab498f87d68303") (:keywords "project" "convenience") (:authors ("Doug MacEachern" . "dougm@vmware.com")) (:maintainer "Doug MacEachern" . "dougm@vmware.com") (:url . "https://github.com/dougm/go-projectile"))])
- (go-rename . [(20190805 2101) ((go-mode (1 3 1))) "Integration of the 'gorename' tool into Emacs." single ((:commit . "734d5232455ffde088021ea5908849ac570e890f") (:keywords "tools"))])
- (go-scratch . [(20150810 440) ((go-mode (1 3 1)) (emacs (24))) "*scratch* buffer for Go" single ((:commit . "3f68cbcce04f59eb8e83af109164731ec0454be0") (:keywords "languages" "go") (:authors ("Emanuel Evans" . "mail@emanuel.industries")) (:maintainer "Emanuel Evans" . "mail@emanuel.industries"))])
- (go-snippets . [(20180113 611) ((yasnippet (0 8 0))) "Yasnippets for go" tar ((:commit . "d437df148879566ffe7f2e503a3cf2602aa9fb28"))])
- (go-stacktracer . [(20150430 2142) nil "parse Go stack traces" single ((:commit . "a2ac6d801b389f80ca4e2fcc1ab44513a9e55976") (:keywords "tools") (:authors ("Samer Masterson" . "samer@samertm.com")) (:maintainer "Samer Masterson" . "samer@samertm.com") (:url . "https://github.com/samertm/go-stacktracer.el"))])
- (go-tag . [(20180227 411) ((emacs (24 0)) (go-mode (1 5 0))) "Edit Golang struct field tag" single ((:commit . "59b243f2fa079d9de9d56f6e2d94397e9560310a") (:keywords "tools") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:url . "https://github.com/brantou/emacs-go-tag"))])
- (gobgen . [(20161020 1523) ((emacs (24 4))) "Generate GObject descendants using a detailed form" single ((:commit . "ed2c2b0d217deae293096f3cf14aa492791ddd4f") (:keywords "gobject" "glib" "gtk" "helper" "utilities") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu"))])
- (god-mode . [(20200708 2200) ((emacs (25 1))) "Minor mode for God-like command entering" tar ((:commit . "2e519312fdef36dea523aa530d134a703d3032a6") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/emacsorphanage/god-mode"))])
- (godoctor . [(20180710 2152) nil "Frontend for godoctor" single ((:commit . "4b45ff3d0572f0e84056e4c3ba91fcc178199859") (:keywords "go" "golang" "refactoring") (:authors ("Sangho Na" . "microamp@protonmail.com")) (:maintainer "Sangho Na" . "microamp@protonmail.com") (:url . "https://github.com/microamp/godoctor.el"))])
- (gold-mode . [(20140607 206) ((sws-mode (0))) "Major mode for editing .gold files" single ((:commit . "6d3aa59602b1b835495271c8c9741ac344c2eab1") (:keywords "golang" "template" "gold") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/gold-mode-el"))])
- (golden-ratio . [(20191028 1732) nil "Automatic resizing of Emacs windows to the golden ratio" single ((:commit . "007911d8a431b72670f5fe5f0e5b4380c2777a31") (:keywords "window" "resizing") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))])
- (golden-ratio-scroll-screen . [(20200419 451) nil "Scroll half screen down or up, and highlight current line" single ((:commit . "1b6ff0e3e8822423335d3f7d88c1fcb4cf43ce42") (:keywords "scroll" "screen" "highlight") (:authors ("纪秀峰 <jixiuf at gmail dot com>")) (:maintainer "纪秀峰 <jixiuf at gmail dot com>") (:url . "https://github.com/jixiuf/golden-ratio-scroll-screen"))])
- (goldendict . [(20200731 1119) ((emacs (24 4)) (cl-lib (0 5))) "query word smartly with goldendict.el" single ((:commit . "ad5212f6ade58c193287851a46c3f9378fe2f059") (:keywords "dict" "goldendict") (:url . "https://github.com/stardiviner/goldendict.el"))])
- (golint . [(20180221 2015) nil "lint for the Go source code" single ((:commit . "738671d3881b9731cc63024d5d88cf28db875626") (:url . "https://github.com/golang/lint"))])
- (gom-mode . [(20131008 253) nil "Major mode for Gomfile" single ((:commit . "972e33df1d38ff323bc97de87477305826013701") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-gom-mode"))])
- (gomacro-mode . [(20200326 1103) ((emacs (24 4)) (go-mode (1 5 0))) "Gomacro mode and Go REPL integration" single ((:commit . "3112e56d2d5e645a3e0fd877f3e810dbccbf989f") (:keywords "gomacro" "repl" "languages" "tools" "processes") (:authors ("Petter Storvik")) (:maintainer "Petter Storvik") (:url . "https://github.com/storvik/gomacro-mode"))])
- (google . [(20140416 1748) nil "Emacs interface to the Google API" single ((:commit . "3b3189a8b201c8d36fed6e61496274e530dd40bd") (:keywords "comm" "processes" "tools") (:authors ("Edward O'Connor" . "ted@oconnor.cx")) (:maintainer "Edward O'Connor" . "ted@oconnor.cx"))])
- (google-c-style . [(20180130 1736) nil "Google's C/C++ style for c-mode" single ((:commit . "10748b8973817357ebe3fd1786979c9881f6afd5") (:keywords "c" "tools"))])
- (google-contacts . [(20180919 1314) ((oauth2 (0 10)) (cl-lib (0 5))) "Support for Google Contacts in Emacs" tar ((:commit . "2273582713712a58e71156a8a29972d42e8e690e") (:keywords "comm") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "http://julien.danjou.info/projects/emacs-packages#google-contacts"))])
- (google-maps . [(20181121 1532) ((emacs (24 3))) "Access Google Maps from Emacs" tar ((:commit . "2eb16ff609f5a9f8d02c15238a111fbb7db6c146") (:keywords "comm") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "https://julien.danjou.info/projects/emacs-packages#google-maps"))])
- (google-this . [(20170810 1215) ((emacs (24 1))) "A set of functions and bindings to google under point." single ((:commit . "8a2e3ca5da6a8c89bfe99a21486c6c7db125dc84") (:keywords "convenience" "hypermedia") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Malabarba/emacs-google-this"))])
- (google-translate . [(20200722 1447) nil "Emacs interface to Google Translate." tar ((:commit . "619d3183bbf99520a300eaa699999788f1405c89"))])
- (goose-theme . [(20160828 1245) ((emacs (24 1))) "A gray color theme" single ((:commit . "acd017b50ab25a75fd1331eb3de66467e2042e9c") (:authors ("Stephen Whipple" . "shw@wicdmedia.org")) (:maintainer "Stephen Whipple" . "shw@wicdmedia.org") (:url . "https://github.com/thwg/goose-theme"))])
- (gopher . [(20190512 1351) ((emacs (24 4)) (w3m (0))) "easily access and navigate Gopher servers" single ((:commit . "6f4accac226698b22e8388e41ad5723b12553dde") (:authors ("Matthew Snyder" . "matthew.c.snyder@gmail.com") ("and the gopher.el authors (see AUTHORS.org)")) (:maintainer "Matthew Snyder" . "matthew.c.snyder@gmail.com") (:url . "http://github.com/ardekantur/gopher.el"))])
- (gore-mode . [(20151123 1927) ((go-mode (1 0 0))) "Simple mode for gore, a command-line evaluator for golang." single ((:commit . "94d7f3e99104e06167967c98fdc201049c433c2d") (:keywords "go" "repl") (:authors ("Sergey Pashaev" . "sergey.pashaev@gmail.com")) (:maintainer "Sergey Pashaev" . "sergey.pashaev@gmail.com"))])
- (gorepl-mode . [(20170905 945) ((emacs (24)) (s (1 11 0)) (f (0 19 0)) (hydra (0 13 0))) "Go REPL Interactive Development in top of Gore" single ((:commit . "6a73bf352e8d893f89cad36c958c4db2b5e35e07") (:keywords "languages" "go" "golang" "gorepl") (:authors ("Manuel Alonso" . "manuteali@gmail.com")) (:maintainer "Manuel Alonso" . "manuteali@gmail.com") (:url . "http://www.github.com/manute/gorepl-mode"))])
- (gotest . [(20191128 1111) ((emacs (24 3)) (s (1 11 0)) (f (0 19 0)) (go-mode (1 5 0))) "Launch GO unit tests" single ((:commit . "70f63eafda1f6a2f0a01a9320cc4d2edee9a17b2") (:keywords "languages" "go" "tests") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/gotest.el"))])
- (gotham-theme . [(20200506 1250) nil "A very dark Emacs color theme." single ((:commit . "0e5965f897c8c976d6b2ca2471dec0dec9b29bbb") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/gotham-theme"))])
- (goto-char-preview . [(20200717 730) ((emacs (24 3))) "Preview character when executing `goto-char` command" single ((:commit . "11fb6b8c77c6191f839f86afc8c8ca3341919058") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/goto-char-preview"))])
- (goto-chg . [(20200603 1911) ((undo-tree (0 1 3))) "goto last change" single ((:commit . "85fca9f7d8b04be3fbb37cc5d42416f3c4d32830") (:keywords "convenience" "matching") (:authors ("David Andersson <l.david.andersson(at)sverige.nu>")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://github.com/emacs-evil/goto-chg"))])
- (goto-last-change . [(20150109 1823) nil "Move point through buffer-undo-list positions" single ((:commit . "58b0928bc255b47aad318cd183a5dce8f62199cc") (:keywords "convenience") (:authors ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainer "Kevin Rodgers" . "ihs_4664@yahoo.com") (:url . "https://github.com/camdez/goto-last-change.el"))])
- (goto-last-point . [(20190525 1855) ((emacs (24 3))) "Record and jump to the last point in the buffer." single ((:commit . "7ea191df18ff4774cf1dc568e1726143dd54ea02") (:keywords "convenience") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:url . "https://github.com/manuel-uberti/goto-last-point"))])
- (goto-line-preview . [(20200717 733) ((emacs (25))) "Preview line when executing `goto-line` command" single ((:commit . "b1df7fe72b0281704d277a69dfd9e2b8214a328b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elp/goto-line-preview"))])
- (govc . [(20191213 2131) ((emacs (24 3)) (dash (1 5 0)) (s (1 9 0)) (magit-popup (2 0 50)) (json-mode (1 6 0))) "Interface to govc for managing VMware ESXi and vCenter" single ((:commit . "6bae3aca4aa86025133660208b643785515e3e40") (:keywords "convenience") (:authors ("The govc developers")) (:maintainer "The govc developers") (:url . "https://github.com/vmware/govmomi/tree/master/govc/emacs"))])
- (govet . [(20170808 1724) nil "linter/problem finder for the Go source code" single ((:commit . "1c05817cf8b96589076c7ac4e52ee58a860a0cbf") (:url . "https://godoc.org/golang.org/x/tools/cmd/vet"))])
- (gpastel . [(20181229 1404) ((emacs (25 1))) "Integrates GPaste with the kill-ring" single ((:commit . "d5fc55bc825203f998537c5834718e665bb87c29") (:keywords "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))])
- (grab-mac-link . [(20200712 428) ((emacs (24))) "Grab link from Mac Apps and insert it into Emacs" single ((:commit . "9b47cbe126a0735fa447a3c5e1e8ba80a7ef8d26") (:keywords "mac" "hyperlink") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/grab-mac-link.el"))])
- (grab-x-link . [(20191113 848) ((emacs (24)) (cl-lib (0 5))) "Grab links from X11 apps and insert into Emacs" single ((:commit . "d898db46e4864118359fdedfe915e180de3fe290") (:keywords "hyperlink") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/grab-x-link"))])
- (gradle-mode . [(20150313 1905) ((s (1 8 0))) "Gradle integration with Emacs' compile" single ((:commit . "e4d665d5784ecda7ddfba015f07c69be3cfc45f2") (:keywords "gradle") (:authors ("Daniel Mijares" . "daniel.j.mijares@gmail.com")) (:maintainer "Daniel Mijares" . "daniel.j.mijares@gmail.com") (:url . "http://github.com/jacobono/emacs-gradle-mode"))])
- (grails . [(20200519 1909) ((emacs (24))) "Minor mode for Grails projects" single ((:commit . "d47273a619d6731683afe60636259b02e2c78a2e") (:url . "https://github.com/lifeisfoo/emacs-grails"))])
- (grails-mode . [(20160504 911) nil "minor-mode that adds some Grails project management to a grails project" single ((:commit . "cafdd98e06a3bbff213f3ccb163de2c42d412b66") (:keywords "languages") (:authors ("Jim Morris" . "morris@wolfman.com")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:url . "http://blog.wolfman.com"))])
- (grails-projectile-mode . [(20160327 1324) ((projectile (0 10 0)) (emacs (24)) (cl-lib (0 5))) "Grails mode with Projectile for projects management." tar ((:commit . "8efca50ce92b556fe9d467b157d7aec635bcc017") (:keywords "grails" "projectile") (:authors ("Yves Zoundi" . "rimerosolutions@gmail.com")) (:maintainer "Yves Zoundi") (:url . "https://github.com/yveszoundi/grails-projectile-mode"))])
- (grammarly . [(20200720 948) ((emacs (24 4)) (s (1 12 0)) (request (0 3 0)) (websocket (1 6))) "Grammarly API interface" single ((:commit . "d597c5d71bc64f5a91e96c707d7471bceaa84075") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/grammarly"))])
- (grandshell-theme . [(20180606 517) nil "Dark color theme for Emacs > 24 with intensive colors." tar ((:commit . "0ed8e4273607dd4fcaa742b4097259233b09eda6"))])
- (graphene . [(20180529 1112) ((dash (2 10 0)) (exec-path-from-shell (1 9)) (ppd-sr-speedbar (0 0 6)) (sr-speedbar (20140505)) (ido-completing-read+ (4 3)) (smex (3 0)) (web-mode (11 2)) (smartparens (1 8 0)) (graphene-meta-theme (0 0 2)) (flycheck (0 23)) (company (0 8 12))) "Friendly Emacs defaults" tar ((:commit . "cc8477fcfb7771ea4e5bbaf3c01f9e679234c1c1"))])
- (graphene-meta-theme . [(20161204 1607) nil "Integrated theming for common packages" single ((:commit . "62cc73fee31f1bd9474027b83a249feee050271e") (:keywords "defaults") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:url . "https://github.com/rdallasgray/graphene"))])
- (graphql . [(20180912 31) ((emacs (25))) "GraphQL utilities" single ((:commit . "e2b309689f4faf9225f290080f836e988c5a576d") (:keywords "hypermedia" "tools" "lisp") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:url . "https://github.com/vermiculus/graphql.el"))])
- (graphql-mode . [(20191024 1221) ((emacs (24 3))) "Major mode for editing GraphQL schemas" single ((:commit . "7c37aee28bf8c8ffb3da73df5571c4e1e352562b") (:keywords "languages") (:authors ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainer "David Vazquez Pua" . "davazp@gmail.com"))])
- (graphviz-dot-mode . [(20200304 432) ((emacs (25 0))) "Mode for the dot-language used by graphviz (att)." tar ((:commit . "3642a0a5f41a80c8ecef7c6143d514200b80e194") (:keywords "mode" "dot" "dot-language" "dotlanguage" "graphviz" "graphs" "att") (:maintainer "Pieter Pareit" . "pieter.pareit@gmail.com") (:url . "https://ppareit.github.io/graphviz-dot-mode/"))])
- (grapnel . [(20131001 1534) nil "HTTP request lib with flexible callback dispatch" single ((:commit . "fbd0f9a51139973d35e4014855964fa435e8ecaf") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/grapnel"))])
- (grass-mode . [(20170503 1500) ((cl-lib (0 2)) (dash (2 8 0))) "Provides Emacs modes for interacting with the GRASS GIS program" single ((:commit . "8a7e9dcb2295eef1ec25d886b05e09c876bd8398") (:keywords "grass" "gis") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca"))])
- (grayscale-theme . [(20171005 802) nil "A simple grayscale theme" single ((:commit . "53ad50e10e68f2f076ebfc96e10ecef7a932d38d") (:keywords "lisp") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/belak/emacs-grayscale-theme"))])
- (greek-polytonic . [(20190303 1358) ((emacs (24))) "Quail package for inputting polytonic Greek" single ((:commit . "114cba0f57cc077871693c799b807df2292341ec") (:keywords "i18n" "multilingual" "input method" "greek") (:authors ("Johannes Choo" . "jhanschoo@gmail.com")) (:maintainer "Johannes Choo" . "jhanschoo@gmail.com") (:url . "https://github.com/jhanschoo/greek-polytonic"))])
- (green-is-the-new-black-theme . [(20200529 242) nil "A cool and minimalist green blackened theme engine" single ((:commit . "9b682c0000bc732e4c55e876ac968877eada0402") (:keywords "faces" "themes") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainer "Fred Campos" . "fred.tecnologia@gmail.com") (:url . "https://github.com/fredcamps/green-is-the-new-black-emacs"))])
- (green-phosphor-theme . [(20150515 1447) nil "A light color theme with muted, autumnal colors." single ((:commit . "fa42f598626adfdc5450e5c380fa2d5df6110f28") (:keywords "color" "theme") (:authors ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainer "Adam Alpern" . "adam.alpern@gmail.com") (:url . "http://github.com/aalpern/emacs-color-theme-green-phosphor"))])
- (green-screen-theme . [(20180816 1502) nil "A nice color theme for those who miss green CRTs" single ((:commit . "774e8f6c033786406267f71ec07319d906a30b75") (:keywords "faces" "theme") (:authors ("Ricardo Banffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com") (:url . "https://github.com/rbanffy/green-screen-emacs"))])
- (gregorio-mode . [(20170705 1451) nil "Gregorio Mode for .gabc files" single ((:commit . "736fd3d05fb67f707cca1a7ce24e3ee7ca5e9567") (:keywords "gregorio" "chant") (:authors ("Fr. John Jenkins" . "jenkins@sspx.ng")) (:maintainer "Fr. John Jenkins" . "jenkins@sspx.ng") (:url . "https://jsrjenkins.github.io/gregorio-mode/"))])
- (grep-a-lot . [(20131006 1347) nil "manages multiple search results buffers for grep.el" single ((:commit . "9f9f645b9e308a0d887b66864ff97d0fca1ba4ad") (:keywords "tools" "convenience" "search") (:authors ("Avi Rozen" . "avi.rozen@gmail.com")) (:maintainer "Avi Rozen" . "avi.rozen@gmail.com") (:url . "https://github.com/ZungBang/emacs-grep-a-lot"))])
- (greymatters-theme . [(20150621 1123) ((emacs (24))) "Emacs 24 theme with a light background." single ((:commit . "a7220a8c6cf18ccae2b76946b6f01188a7c9d5d1") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))])
- (grip-mode . [(20200725 725) ((emacs (24 4))) "Instant GitHub-flavored Markdown/Org preview using grip." single ((:commit . "52768a0187f8ce9b42010dc45bbc432551aeccee") (:keywords "convenience" "markdown" "preview") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:url . "https://github.com/seagle0128/grip-mode"))])
- (grizzl . [(20160818 737) ((cl-lib (0 5)) (emacs (24 3))) "Fast fuzzy search index for Emacs." single ((:commit . "1e917253ce2b846f0272b8356fad3dbff9cd513a") (:keywords "convenience" "usability") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "https://github.com/grizzl/grizzl"))])
- (groovy-imports . [(20161003 851) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 2))) "Code for dealing with Groovy imports" single ((:commit . "e56d7dda617555ec6205644d32ffddf2e1fa43d9") (:keywords "groovy") (:authors ("Miro Bezjak")) (:maintainer "Miro Bezjak") (:url . "http://www.github.com/mbezjak/emacs-groovy-imports"))])
- (groovy-mode . [(20191031 2256) ((s (1 12 0)) (emacs (24 3)) (dash (2 13 0))) "Major mode for Groovy source files" tar ((:commit . "cafdd98e06a3bbff213f3ccb163de2c42d412b66") (:keywords "languages") (:authors ("Russel Winder" . "russel@winder.org.uk") ("Jim Morris" . "morris@wolfman.com") ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk"))])
- (gruber-darker-theme . [(20200227 2238) nil "Gruber Darker color theme for Emacs 24." single ((:commit . "7f95ce96079eb22b9214435ed25c5af98f60b482") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/gruber-darker-theme"))])
- (grugru . [(20200729 1453) ((emacs (24 4))) "Rotate text at point" tar ((:commit . "a027e0439695fc55123372ed894d05b7e56328af") (:keywords "convenience" "abbrev" "tools") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:url . "https://github.com/ROCKTAKEY/grugru"))])
- (grunt . [(20160316 1528) ((dash (2 9 0)) (ansi-color (3 4 2)) (emacs (24 3))) "Some glue to stick Emacs and Gruntfiles together" single ((:commit . "4c269e2738658643ec2ed9ef61a2a3d71b08d304") (:keywords "convenience" "grunt") (:authors ("Daniel Gempesaw" . "dgempesaw@sharecare.com")) (:maintainer "Daniel Gempesaw" . "dgempesaw@sharecare.com") (:url . "https://github.com/gempesaw/grunt.el"))])
- (gruvbox-theme . [(20200622 58) ((autothemer (0 2))) "A retro-groove colour theme for Emacs" tar ((:commit . "38489be48db4d3d679a952646e737adfb48f8115") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "http://github.com/greduan/emacs-theme-gruvbox"))])
- (gs-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" single ((:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:keywords "grads" "script" "major-mode") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org"))])
- (gscholar-bibtex . [(20190130 555) nil "Retrieve BibTeX from Google Scholar and other online sources(ACM, IEEE, DBLP)" single ((:commit . "3b651e3de116860eb1f1aef9b547a561784871fe") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (gsettings . [(20190513 1003) ((emacs (24 3)) (dash (2 16 0)) (gvariant (1 0 0)) (s (1 12 0))) "GSettings (Gnome) helpers" single ((:commit . "3009335a077636347defd08d24fb092495d16d3e") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-gsettings"))])
- (gtk-pomodoro-indicator . [(20191007 1500) nil "A pomodoro indicator for the GTK tray" tar ((:commit . "338e6dca6d749cfc85195907bba593f9f6855715") (:keywords "convenience" "pomodoro") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/gtk-pomodoro-indicator"))])
- (gtk-variant . [(20200416 2136) ((emacs (25 1))) "Set the GTK theme variant (titlebar color)" single ((:commit . "4462a5ab071ec001734e92d1ac2e5fa9721b94bd") (:keywords "frames" "gtk" "titlebar") (:authors ("Paul Oppenheimer")) (:maintainer "Paul Oppenheimer") (:url . "https://github.com/bepvte/gtk-variant.el"))])
- (guess-language . [(20200707 1058) ((cl-lib (0 5)) (emacs (24))) "Robust automatic language detection" tar ((:commit . "256230072f4f828e07db6ab17b6b7e90891b7308") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/guess-language.el"))])
- (guide-key . [(20150108 635) ((dash (2 10 0)) (popwin (0 3 0)) (s (1 9 0))) "Guide the following key bindings automatically and dynamically" single ((:commit . "8f8b839f42edd53af13d588254f07727108ae312") (:keywords "help" "convenience") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com") (:url . "https://github.com/kai2nenobu/guide-key"))])
- (guide-key-tip . [(20161011 823) ((guide-key (1 2 3)) (pos-tip (0 4 5))) "Show guide-key.el hints using pos-tip.el" single ((:commit . "02c5d4b0b65f3e91be5a47f0ff1ae5e86e00c64e") (:keywords "help" "convenience" "tooltip") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/guide-key-tip"))])
- (guix . [(20200730 930) ((emacs (24 3)) (dash (2 11 0)) (geiser (0 8)) (bui (1 2 0)) (magit-popup (2 1 0)) (edit-indirect (0 1 4))) "Interface for GNU Guix" tar ((:commit . "a975da31aa1059def4bf233be9ef3ac7771863ad") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://emacs-guix.gitlab.io/website/"))])
- (gulp-task-runner . [(20170718 2041) nil "Gulp task runner" single ((:commit . "877990e956b1d71e2d9c7c3e5a129ad199b9debb") (:keywords "convenience" "javascript") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))])
- (guru-mode . [(20200708 728) nil "Become an Emacs guru" single ((:commit . "9d0aff6cda6d3d78d5102f07f813b9fca6f0ab7b") (:keywords "convenience") (:authors ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:url . "https://github.com/bbatsov/guru-mode"))])
- (gvariant . [(20190513 1005) ((emacs (24)) (parsec (0 1 3))) "GVariant (GLib) helpers" single ((:commit . "b162867c03ead58784c47996ae329355ecea2869") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-gvariant"))])
- (gvpr-mode . [(20131208 1718) nil "A major mode offering basic syntax coloring for gvpr scripts." single ((:commit . "3d6cc6f4416faf2a1913821d12ba6eb624362af0") (:keywords "graphviz" "gv" "dot" "gvpr" "graph") (:authors ("Rod Waldhoff" . "r.waldhoff@gmail.com")) (:maintainer "Rod Waldhoff" . "r.waldhoff@gmail.com") (:url . "https://raw.github.com/rodw/gvpr-lib/master/extra/gvpr-mode.el"))])
- (gxref . [(20170411 1753) ((emacs (25))) "xref backend using GNU Global." single ((:commit . "380b02c3c3c2586c828456716eef6a6392bb043b") (:keywords "xref" "global" "tools") (:authors ("Dedi Hirschfeld")) (:maintainer "Dedi Hirschfeld") (:url . "https://github.com/dedi/gxref"))])
- (habamax-theme . [(20181001 850) ((emacs (24))) "Boring white background color that gets the job done." single ((:commit . "6e86a1b23b6e2aaf40d4374b5673da00a28be447") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/habamax-theme"))])
- (habitica . [(20190721 1620) ((org (8 3 5)) (emacs (24 3))) "Interface for habitica.com" single ((:commit . "c45c602ddf9d6cbb0e3baf5cb3e1b7ef90f2759d") (:keywords "habitica" "todo") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/emacs-habitica"))])
- (hack-mode . [(20200526 2210) ((emacs (25 1)) (s (1 11 0))) "Major mode for the Hack programming language" single ((:commit . "572c3b41bed91ea543434c04914a7a0c45fec7c7") (:authors ("John Allen <jallen@fb.com>, Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "John Allen <jallen@fb.com>, Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/hhvm/hack-mode"))])
- (hacker-typer . [(20170206 1520) ((emacs (24))) "Pretend to write code like a pro" tar ((:commit . "d5a23714a4ccc5071580622f278597d5973f40bd") (:keywords "hacker" "typer" "multimedia" "games") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:url . "http://github.com/therockmandolinist/emacs-hacker-typer"))])
- (hackernews . [(20200604 1557) nil "Hacker News Client for Emacs" single ((:commit . "019a727b41e2726516841048a2b5b04f2ed2301a") (:keywords "comm" "hypermedia" "news") (:authors ("Lincoln de Sousa" . "lincoln@comum.org")) (:maintainer "Basil L. Contovounesios" . "contovob@tcd.ie") (:url . "https://github.com/clarete/hackernews.el"))])
- (hal-mode . [(20160704 1746) nil "Major mode for editing HAL files" single ((:commit . "cd2f66f219ee520198d4586fb6b169cef7ad3f21") (:keywords "language") (:authors ("Alexander Rössler")) (:maintainer "Alexander Rössler") (:url . "https://github.com/strahlex/hal-mode/"))])
- (ham-mode . [(20150811 1306) ((html-to-markdown (1 2)) (markdown-mode (2 0))) "Html As Markdown. Transparently edit an html file using markdown" single ((:commit . "3a141986a21c2aa6eefb428983352abb8b7907d2") (:keywords "convenience" "emulation" "wp") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/ham-mode"))])
- (hamburg-theme . [(20160123 740) ((emacs (24))) "Color Theme with a dark blue background." single ((:commit . "aacefdf1501d97a5afc0e63c8ead4b2463323028") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))])
- (hamburger-menu . [(20160825 2031) ((emacs (24 5))) "Mode line hamburger menu" single ((:commit . "3568159c693c30bed7f61580e4f3b6241253ad4e") (:keywords "hamburger" "menu") (:authors ("Iain Nicol")) (:maintainer "Iain Nicol") (:url . "https://gitlab.com/iain/hamburger-menu-mode"))])
- (haml-mode . [(20190219 2102) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing Haml files" single ((:commit . "bf5b6c11b1206759d2b28af48765e04882dd1fc4") (:keywords "markup" "languages" "html") (:authors ("Natalie Weizenbaum")) (:maintainer "Natalie Weizenbaum") (:url . "https://github.com/nex3/haml-mode"))])
- (hamlet-mode . [(20131208 724) ((cl-lib (0 3)) (dash (2 3 0)) (s (1 7 0))) "Hamlet editing mode" single ((:commit . "7362b955e556a3d007fa06945a27e5b99349527d") (:keywords "wp" "languages" "comm") (:authors (nil . "Kata <lightquake@amateurtopologist.com")) (:maintainer nil . "Kata <lightquake@amateurtopologist.com") (:url . "https://github.com/lightquake/hamlet-mode"))])
- (handle . [(20191029 856) ((emacs (25 1)) (parent-mode (2 3))) "A handle for major-mode generic functions." single ((:commit . "e27b2d0b229923f81a2c8afa3e9c65ae9e84a0da") (:keywords "convenience") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/handle"))])
- (handlebars-mode . [(20150211 1749) nil "A major mode for editing Handlebars files." single ((:commit . "81f6b73fea8f397807781a1b51568397af21a6ef") (:authors ("Tony Gentilcore") ("Chris Wanstrath") ("Daniel Hackney") ("Daniel Evans")) (:maintainer "Tony Gentilcore"))])
- (handlebars-sgml-mode . [(20130623 2333) nil "Add Handlebars contextual indenting support to sgml-mode" single ((:commit . "c76df93a9a8c1b1b3efdcc4add32bf93304192a4") (:authors ("Geoff Jacobsen" . "geoffjacobsen@gmail.com")) (:maintainer "Geoff Jacobsen" . "geoffjacobsen@gmail.com") (:url . "http://github.com/jacott/handlebars-sgml-mode"))])
- (handoff . [(20150917 600) nil "Get your hand off that mouse, damn it!" single ((:commit . "75dc7a7e352f38679f65d0ca80ad158798e168bd") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/handoff.el"))])
- (hardcore-mode . [(20151114 701) nil "Disable arrow keys + optionally backspace and return" single ((:commit . "b1dda19692b4a7a58a689e81784a9b35be39e70d") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (hardhat . [(20160414 1413) ((ignoramus (0 7 0))) "Protect against clobbering user-writable files" single ((:commit . "9038a49ab55cd4c502cf7f07ed0d1b9b6bc3626e") (:keywords "convenience") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/hardhat"))])
- (harvest . [(20170822 1746) ((swiper (0 7 0)) (hydra (0 13 0)) (s (1 11 0))) "Harvest integration" single ((:commit . "7acbc0564b250521b67131ee2a0a92720239454f") (:keywords "harvest") (:authors ("Kosta Harlan" . "kosta@kostaharlan.net")) (:maintainer "Kosta Harlan" . "kosta@kostaharlan.net") (:url . "https://github.com/kostajh/harvest.el"))])
- (haskell-emacs . [(20160904 2026) nil "Write emacs extensions in haskell" tar ((:commit . "a2c6a079175904689eed7c6c200754bfa85d1ed9") (:keywords "haskell" "emacs" "ffi") (:authors ("Florian Knupfer")) (:maintainer "Florian Knupfer") (:url . "https://github.com/knupfer/haskell-emacs"))])
- (haskell-emacs-base . [(20150714 1559) ((haskell-emacs (2 4 0))) "Haskell functions from Prelude" tar ((:commit . "a2c6a079175904689eed7c6c200754bfa85d1ed9") (:keywords "haskell" "emacs" "ffi") (:authors ("Florian Knupfer")) (:maintainer "Florian Knupfer") (:url . "https://github.com/knupfer/haskell-emacs/modules/base"))])
- (haskell-emacs-text . [(20150713 1416) ((haskell-emacs (2 4 0))) "Haskell functions from Data.Text" tar ((:commit . "a2c6a079175904689eed7c6c200754bfa85d1ed9") (:keywords "haskell" "emacs" "ffi") (:authors ("Florian Knupfer")) (:maintainer "Florian Knupfer") (:url . "https://github.com/knupfer/haskell-emacs/modules/text"))])
- (haskell-mode . [(20200531 2255) ((emacs (25 1))) "A Haskell editing mode" tar ((:commit . "41683c0e634bb3f54eac8747919a82132e1714fe") (:keywords "haskell" "cabal" "ghc" "repl") (:url . "https://github.com/haskell/haskell-mode"))])
- (haskell-snippets . [(20160919 22) ((cl-lib (0 5)) (yasnippet (0 8 0))) "Yasnippets for Haskell" tar ((:commit . "07b0f460b946fd1be26c29652cb0468b47782f3a") (:keywords "snippets" "haskell") (:authors ("Luke Hoersten" . "luke@hoersten.org")) (:maintainer "Luke Hoersten" . "luke@hoersten.org") (:url . "https://github.com/haskell/haskell-snippets"))])
- (haskell-tab-indent . [(20200513 1950) nil "tab-based indentation for haskell-mode" single ((:commit . "3239e814d6999f31ad845cc58df53395ad299059") (:keywords "indentation" "haskell") (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name") (:url . "https://spwhitton.name/tech/code/haskell-tab-indent/"))])
- (hasklig-mode . [(20181110 1859) ((emacs (25))) "Hasklig ligatures" single ((:commit . "386c098c93a744f6b30ad937d193eebf0fd79e1b") (:authors ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/hasklig-mode"))])
- (hasky-extensions . [(20190204 2016) ((emacs (24 4)) (avy-menu (0 2))) "Toggle Haskell language extensions" single ((:commit . "4a0d1d9beb3be8ff4a1857eb920c916734dcc8e1") (:keywords "programming") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/hasky-mode/hasky-extensions"))])
- (hasky-stack . [(20190304 2248) ((emacs (24 4)) (f (0 18 0)) (magit-popup (2 10))) "Interface to the Stack Haskell development tool" single ((:commit . "9ef133ed831a95a2b9990a46a3c57f1918d0274f") (:keywords "tools" "haskell") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/hasky-mode/hasky-stack"))])
- (haste . [(20141030 2034) ((json (1 2))) "Emacs client for hastebin (http://hastebin.com/about.md)" single ((:commit . "22d05aacc3296ab50a7361222ab139fb4d447c25") (:authors ("Ric Lister")) (:maintainer "Ric Lister") (:url . "http://github.com/rlister/emacs-haste-client"))])
- (haxe-imports . [(20170330 2304) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 1))) "Code for dealing with Haxe imports" single ((:commit . "f104a641f3dfe698359d9aca1f28d9383cf43e04") (:keywords "haxe") (:authors ("Juan Karlo Licudine" . "karlo@accidentalrebel.com")) (:maintainer "Juan Karlo Licudine" . "karlo@accidentalrebel.com") (:url . "http://www.github.com/accidentalrebel/emacs-haxe-imports"))])
- (haxe-mode . [(20200204 1015) nil "An Emacs major mode for Haxe" single ((:commit . "9449b2b8bc733faa130d3ab68b97ac1ae1db3bff") (:authors ("Jens Peter Secher (original)")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:url . "https://github.com/elpa-host/haxe-mode"))])
- (haxor-mode . [(20160618 1129) ((emacs (24 0))) "Major mode for editing Haxor Assembly Files" single ((:commit . "6fa25a8e6b6a59481bc0354c2fe1e0ed53cbdc91") (:keywords "haxor") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:url . "https://github.com/krzysztof-magosa/haxor-mode"))])
- (hayoo . [(20140831 1221) ((emacs (24)) (json (1 3))) "Query hayoo and show results in a tabulated buffer." single ((:commit . "3ca2fb0c4d5f337d0410c21b2702dd147014e984") (:keywords "hayoo" "haskell") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:url . "https://github.com/benma/hayoo.el/"))])
- (hc-zenburn-theme . [(20150928 1633) nil "An higher contrast version of the Zenburn theme." single ((:commit . "fd0024a5191cdce204d91c8f1db99ba31640f6e9") (:authors ("Nantas Nardelli" . "nantas.nardelli@gmail.com")) (:maintainer "Nantas Nardelli" . "nantas.nardelli@gmail.com") (:url . "https:github.com/edran/hc-zenburn-emacs"))])
- (hcl-mode . [(20200315 2129) ((emacs (24 3))) "Major mode for Hashicorp" single ((:commit . "e12b1df2ca28d2b06c471cd709c038a2dc0bcdbd") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-hcl-mode"))])
- (headlong . [(20150417 1526) nil "reckless completion" single ((:commit . "f6830f87f236eee88263cb6976125f72422abe72") (:keywords "completion") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/headlong"))])
- (heaven-and-hell . [(20190713 1830) ((emacs (24 4))) "easy toggle light/dark themes" single ((:commit . "e1febfd60d060c110a1e43c5f093cd8537251308") (:keywords "faces") (:authors ("Valentin Ignatev" . "valentignatev@gmail.com")) (:maintainer "Valentin Ignatev" . "valentignatev@gmail.com") (:url . "https://github.com/valignatev/heaven-and-hell"))])
- (helm . [(20200731 649) ((emacs (25 1)) (async (1 9 4)) (popup (0 5 3)) (helm-core (3 6 2))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "0e77797ef5ce89663b02d9ab12ba25fa95b9074f") (:url . "https://emacs-helm.github.io/helm/"))])
- (helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:keywords "convenience") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/helm-R.el"))])
- (helm-ack . [(20141030 1226) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:commit . "889bc225318d14c6e3be80e73b1d9d6fb30e48c3") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ack"))])
- (helm-ad . [(20151209 1015) ((dash (2 8 0)) (helm (1 6 2))) "helm source for Active Directory" single ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:keywords "comm") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com"))])
- (helm-addressbook . [(20170903 728) ((helm (2 8 2)) (addressbook-bookmark (1 0)) (cl-lib (0 5)) (emacs (24 4))) "Helm for addressbook bookmarks." single ((:commit . "62497f72d46afd3a9f9f94b27d062a82fb232de4") (:url . "https://github.com/emacs-helm/helm-addressbook"))])
- (helm-ag . [(20200601 933) ((emacs (25 1)) (helm (2 0))) "The silver searcher with helm interface" single ((:commit . "08aaab53b8876caba619f956945a8152ece47182") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ag"))])
- (helm-ag-r . [(20131123 1531) ((helm (1 0))) "Search something by ag and display by helm" single ((:commit . "67de4ebafe9b088db950eefa5ef590a6d78b4ac8") (:keywords "searching") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/helm-ag-r"))])
- (helm-apt . [(20200719 1131) ((helm (3 6)) (emacs (25 1))) "Helm interface for Debian/Ubuntu packages (apt-*)" single ((:commit . "f6204e2333881291b007e4859d9446994e988653") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-apt"))])
- (helm-aws . [(20180514 1032) ((helm (1 5 3)) (cl-lib (0 5)) (s (1 9 0))) "Manage AWS EC2 server instances directly from Emacs" single ((:commit . "b36c744b3f00f458635a91d1f5158fccbb5baef6") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/helm-aws"))])
- (helm-backup . [(20180911 614) ((helm (1 5 5)) (s (1 8 0)) (cl-lib (0))) "Backup each file change using git" single ((:commit . "691fe542f38fc7c8cca409997f6a0ff5d76ad6c2") (:keywords "backup" "convenience" "files" "tools" "vc") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:url . "http://github.com/antham/helm-backup"))])
- (helm-bbdb . [(20190728 1325) ((emacs (24 3)) (helm (1 5)) (bbdb (3 1 2))) "Helm interface for bbdb" single ((:commit . "db69114ff1af8bf48b5a222242e3a8dd6e101e67") (:url . "https://github.com/emacs-helm/helm-bbdb"))])
- (helm-bibtex . [(20200429 1606) ((bibtex-completion (1 0 0)) (helm (1 5 5)) (cl-lib (0 5)) (emacs (24 1))) "A bibliography manager based on Helm" single ((:commit . "8a0dd9841316793aacddea744d6b8ca4a7857a35") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))])
- (helm-bibtexkey . [(20140214 1504) ((helm (1 5 8))) "Bibtexkey source for helm" tar ((:commit . "aa1637ea5c8c5f1817e480fc2a3750cafab3d99f") (:keywords "bib" "tex") (:authors ("TAKAGI Kentaro <kentaro0910_at_gmail.com>")) (:maintainer "TAKAGI Kentaro <kentaro0910_at_gmail.com>") (:url . "https://github.com/kenbeese/helm-bibtexkey"))])
- (helm-bind-key . [(20141109 515) ((bind-key (1 0)) (helm (1 6 4))) "helm-source for for bind-key." single ((:commit . "9da6ad8b7530e72fb4ac67be8c6a482898dddc25") (:keywords "convenience" "emulation") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe"))])
- (helm-bitbucket . [(20190422 1102) ((emacs (24)) (helm-core (3 0))) "Search Bitbucket with Helm" single ((:commit . "c722016622ad019202419cca60c3be3c53e56130") (:keywords "matching") (:authors ("Peter Urbak" . "tolowercase@gmail.com")) (:maintainer "Peter Urbak" . "tolowercase@gmail.com") (:url . "https://github.com/dragonwasrobot/helm-bitbucket"))])
- (helm-bm . [(20160321 1331) ((bm (1 0)) (cl-lib (0 5)) (helm (1 9 3)) (s (1 11 0))) "helm sources for bm.el" single ((:commit . "d66341f5646c23178d4d8bffb6cfebe3fb73f1d7") (:keywords "helm" "bookmark") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-bm"))])
- (helm-books . [(20170325 631) ((helm (1 7 7))) "Helm interface for searching books" single ((:commit . "625aadec1541a5ca36951e4ce1301f4b6fe2bf3f") (:authors ("grugrut" . "grugruglut+github@gmail.com")) (:maintainer "grugrut" . "grugruglut+github@gmail.com") (:url . "https://github.com/grugrut/helm-books"))])
- (helm-bufler . [(20200409 1253) ((emacs (26 3)) (bufler (0 2 -1)) (helm (1 9 4))) "Helm source for Bufler" single ((:commit . "b2b260e4f9e8ba76bb8b4d71344c7b75e05ac44f") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/bufler.el"))])
- (helm-bundle-show . [(20190526 1401) ((emacs (24)) (helm (1 8 0))) "Bundle show with helm interface" single ((:commit . "70f1ca7d1847c7d5cd5a3e488562cd4a295b809f") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-bundle-show"))])
- (helm-c-moccur . [(20151230 924) ((helm (20120811)) (color-moccur (2 71))) "helm source for color-moccur.el" single ((:commit . "b0a906f85fa352db091f88b91a9c510de607dfe9") (:keywords "convenience" "emulation") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com"))])
- (helm-c-yasnippet . [(20200520 1519) ((emacs (25 1)) (helm (1 7 7)) (yasnippet (0 8 0))) "helm source for yasnippet.el" single ((:commit . "89cc8561e7e57e9d1070ee3641df019c7f49c5dd") (:keywords "convenience" "emulation") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com"))])
- (helm-catkin . [(20190425 1520) ((emacs (24 3)) (helm (0)) (xterm-color (0))) "Package for compile ROS workspaces with catkin-tools" single ((:commit . "d33c71cecd35616dfa7c3b81d8f51c128405977f") (:keywords "catkin" "helm" "build" "tools" "ros") (:authors ("Thore Goll" . "thoregoll@googlemail.com")) (:maintainer "Thore Goll" . "thoregoll@googlemail.com") (:url . "https://github.com/gollth/helm-catkin"))])
- (helm-charinfo . [(20170810 1231) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "A helm source for character information" single ((:commit . "91798a49dc115342a7e01e48b264e9a0bf5ea414") (:keywords "convenience") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:url . "https://github.com/cwittern/helm-charinfo"))])
- (helm-chrome . [(20160719 520) ((helm (1 5)) (cl-lib (0 3)) (emacs (24))) "Helm interface for Chrome bookmarks" single ((:commit . "fd630ace4b4b4f33355a973743bbfe0c90ce4830") (:keywords "tools") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/helm-chrome"))])
- (helm-chrome-control . [(20190707 1807) ((emacs (25 1)) (helm-core (3 0))) "Control Chrome tabs with Helm (macOS only)" tar ((:commit . "e6758763099959e961e218bb1122526323f7ee5e") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/helm-chrome-control"))])
- (helm-chrome-history . [(20191031 1233) ((emacs (25 1)) (helm-core (3 0))) "Browse Chrome History with Helm" single ((:commit . "f9002d4c12df65a99830376b126dbbeae3ef2148") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/helm-chrome-history"))])
- (helm-chronos . [(20150528 2036) ((chronos (1 2)) (helm (1 7 1))) "helm interface for chronos timers" tar ((:commit . "a14fc3d65dd96ce6616234b3f7b8b08b4c1817ef") (:keywords "calendar") (:authors ("David Knight" . "dxknight@opmbx.org")) (:maintainer "David Knight" . "dxknight@opmbx.org") (:url . "http://github.com/dxknight/helm-chronos"))])
- (helm-cider . [(20180307 458) ((emacs (24 4)) (cider (0 16)) (helm-core (2 8))) "Helm interface to CIDER" tar ((:commit . "9363cc537f06233345aa3af5cd46aa5681ad607b") (:keywords "cider" "clojure" "helm" "languages") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:url . "https://github.com/clojure-emacs/helm-cider"))])
- (helm-cider-history . [(20150719 2120) ((helm (1 4 0)) (cider (0 9 0))) "Helm interface for cider history" single ((:commit . "c391fcb2e162a02001605a0b9449783575a831fd") (:keywords "convenience") (:authors ("Andreas Klein" . "git@kungi.org")) (:maintainer "Andreas Klein" . "git@kungi.org") (:url . "https://github.com/Kungi/helm-cider-history"))])
- (helm-circe . [(20160207 652) ((emacs (24)) (helm (0 0)) (circe (0 0)) (cl-lib (0 5))) "helm circe buffer management." single ((:commit . "9091651d9fdd8d49d8ff6f9dcf3a2ae416c9f15a") (:keywords "helm" "circe") (:authors ("Les Harris" . "les@lesharris.com")) (:maintainer "Les Harris" . "les@lesharris.com") (:url . "https://github.com/lesharris/helm-circe"))])
- (helm-clojuredocs . [(20160405 723) ((edn (1 1 2)) (helm (1 5 7))) "search for help in clojuredocs.org" single ((:commit . "5a7f0f2cb401be0b09e73262a1c18265ab9a3cea") (:keywords "helm" "clojure") (:authors ("Michal Buczko" . "michal.buczko@gmail.com")) (:maintainer "Michal Buczko" . "michal.buczko@gmail.com") (:url . "https://github.com/mbuczko/helm-clojuredocs"))])
- (helm-cmd-t . [(20170125 1459) nil "cmd-t style completion" tar ((:commit . "7fa3d4a9f7271512e54c5de999079b27c9eec6bf") (:keywords "helm" "project-management" "completion" "convenience" "cmd-t" "textmate") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/helm-cmd-t"))])
- (helm-codesearch . [(20190412 1153) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0)) (helm (1 7 7)) (cl-lib (0 5))) "helm interface for codesearch" single ((:commit . "72f1d1de746115ab7e861178b49fa3c0b6b58d90") (:keywords "tools") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com"))])
- (helm-commandlinefu . [(20150611 545) ((emacs (24 1)) (helm (1 7 0)) (json (1 3)) (let-alist (1 0 3))) "Search and browse commandlinefu.com from helm" single ((:commit . "9ee7e018c5db23ae9c8d1c8fa969876f15b7280d") (:keywords "commandlinefu.com") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/helm-commandlinefu"))])
- (helm-company . [(20190812 1429) ((helm (1 5 9)) (company (0 6 13))) "Helm interface for company-mode" single ((:commit . "6eb5c2d730a60e394e005b47c1db018697094dde") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))])
- (helm-core . [(20200728 913) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "0e77797ef5ce89663b02d9ab12ba25fa95b9074f") (:url . "https://emacs-helm.github.io/helm/"))])
- (helm-cscope . [(20190615 41) ((xcscope (1 0)) (helm (1 6 7)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface for xcscope.el." single ((:commit . "af1d9e7f4460a88d7400b5a74d5da68084089ac1") (:keywords "cscope" "helm") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:url . "https://github.com/alpha22jp/helm-cscope.el"))])
- (helm-css-scss . [(20191230 1549) ((emacs (24 3)) (helm (1 0))) "CSS/SCSS/LESS Selectors with helm interface" single ((:commit . "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3") (:keywords "convenience" "scss" "css" "less" "selector" "helm") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:url . "https://github.com/ShingoFukuyama/helm-css-scss"))])
- (helm-ctest . [(20191031 1435) ((s (1 9 0)) (dash (2 11 0)) (helm-core (1 7 4))) "Run ctest from within emacs" single ((:commit . "2a29cfb4ec583da247fa2ae7bac88790b1223e40") (:keywords "helm" "ctest") (:authors ("Dan LaManna" . "me@danlamanna.com")) (:maintainer "Dan LaManna" . "me@danlamanna.com"))])
- (helm-dash . [(20190527 1118) ((emacs (24 4)) (dash-docs (1 4 0)) (helm (1 9 2)) (cl-lib (0 5))) "Offline documentation browser for +150 APIs using Dash docsets." single ((:commit . "7f853bd34da666f0e9a883011c80f451b06f6c59") (:keywords "docs") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina " . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:url . "https://github.com/dash-docs-el/helm-dash"))])
- (helm-descbinds . [(20190501 935) ((helm (1 5))) "A convenient `describe-bindings' with `helm'" single ((:commit . "b72515982396b6e336ad7beb6767e95a80fca192") (:keywords "helm" "help") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:url . "https://github.com/emacs-helm/helm-descbinds"))])
- (helm-describe-modes . [(20160212 518) ((helm (1 9)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface to major and minor modes." single ((:commit . "11fb36af119b784539d31c6160002de1957408aa") (:keywords "docs" "convenience") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:url . "https://github.com/emacs-helm/helm-describe-modes"))])
- (helm-dictionary . [(20200406 1632) ((helm (1 5 5))) "Helm source for looking up dictionaries" single ((:commit . "1dfec049c7851754a5967329a60e9e9a9f805423") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/emacs-helm/helm-dictionary"))])
- (helm-directory . [(20170706 402) ((emacs (24 4)) (helm (2 0))) "selecting directory before select the file" single ((:commit . "51bd7cd6e40a84a7efda894283ec76a0107830ad") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-helm-directory"))])
- (helm-dired-history . [(20170524 1046) ((helm (1 9 8)) (cl-lib (0 5))) "Show dired history with helm.el support." single ((:commit . "281523f9fc46cf00fafd670ba5cd16552a607212") (:keywords "helm" "dired history") (:authors ("Joseph(纪秀峰)" . "jixiuf@gmail.com")) (:maintainer "Joseph(纪秀峰)" . "jixiuf@gmail.com") (:url . "https://github.com/jixiuf/helm-dired-history"))])
- (helm-dired-recent-dirs . [(20131228 1414) ((helm (1 0))) "Show recent dirs with helm.el support." single ((:commit . "3bcd125b44f5a707588ae3868777d91192351523") (:keywords "helm" "dired" "zsh") (:authors ("Akisute" . "akisute3@gmail.com")) (:maintainer "Akisute" . "akisute3@gmail.com"))])
- (helm-dirset . [(20151209 12) ((f (0 16 2)) (helm (1 6 1)) (s (1 9 0)) (cl-lib (0 5))) "helm sources for multi directories" single ((:commit . "eb30810cd26e1ee73d84a863e6b2667700e9aead") (:keywords "files" "directories") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "http://101000lab.org"))])
- (helm-elscreen . [(20170709 914) ((helm (2 8 0)) (elscreen (0)) (cl-lib (0 5)) (emacs (24 1))) "Elscreen with helm interface" single ((:commit . "b8212866939dc4a1e1dc23ad572407b688e130e3") (:keywords "files" "convenience") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-elscreen"))])
- (helm-emmet . [(20160713 1231) ((helm (1 0)) (emmet-mode (1 0 2))) "helm sources for emmet-mode's snippets" single ((:commit . "f0364e736b10cf44232053a78de04133a88185ae") (:keywords "convenience" "helm" "emmet") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-emmet"))])
- (helm-emms . [(20200322 1309) ((helm (1 5)) (emms (0 0)) (cl-lib (0 5)) (emacs (24 1))) "Emms for Helm." single ((:commit . "37e5aa029abfa5a5c48636314de8157142944fa2") (:url . "https://github.com/emacs-helm/helm-emms"))])
- (helm-esa . [(20190721 1429) ((emacs (26 2)) (helm (3 2)) (request (0 3 0))) "Esa with helm interface" single ((:commit . "d93b4af404346870cb2cf9c257d055332ef3f577") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-esa"))])
- (helm-etags-plus . [(20170113 1414) ((helm (1 7 8))) "Another Etags helm.el interface" single ((:commit . "704f0991ee4a2298b01c33aafc224eef322e15e3") (:keywords "helm" "etags") (:authors ("纪秀峰(Joseph)" . "jixiuf@gmail.com")) (:maintainer "纪秀峰(Joseph)" . "jixiuf@gmail.com") (:url . "https://github.com/jixiuf/helm-etags-plus"))])
- (helm-evil-markers . [(20200506 715) ((emacs (25 1)) (helm (2 0 0)) (evil (1 2 10))) "Show evil markers with helm" single ((:commit . "0245f0c268e0eaec85df51ab2deba7ac961f6770") (:keywords "extensions") (:authors ("Bill Xue")) (:maintainer "Bill Xue") (:url . "https://github.com/xueeinstein/helm-evil-markers"))])
- (helm-eww . [(20190315 907) ((emacs (24 4)) (helm (2 8 6)) (seq (1 8))) "Helm UI wrapper for EWW." single ((:commit . "76ba59fda8dd6f32a1bc7c6df0b43c6f76169911") (:keywords "helm" "packages") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-eww"))])
- (helm-ext . [(20200722 107) ((emacs (24 4)) (helm (2 5 3))) "A few extensions to Helm" tar ((:commit . "c30f7772ec577a5ce1de3215f0507826e0725a69") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (helm-exwm . [(20200325 1022) ((emacs (25 2)) (helm (2 8 5)) (exwm (0 15))) "Helm for EXWM buffers" single ((:commit . "00ddb4d2a127087a0b99f0a440562bd54408572d") (:keywords "helm" "exwm") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-exwm"))])
- (helm-fd . [(20190923 48) ((emacs (26 2)) (helm (3 3))) "Helm interface for fd command." single ((:commit . "84a2aa656473f2921e35abad62b158b3813ee944") (:keywords "fd" "find" "files" "helm" "fast") (:authors ("Romain Leroux" . "romain@leroux.dev")) (:maintainer "Romain Leroux" . "romain@leroux.dev") (:url . "https://github.com/lerouxrgd/helm-fd"))])
- (helm-file-preview . [(20190903 331) ((emacs (24 4)) (helm (2 0))) "Preview the current helm file selection." single ((:commit . "d7e0c1814299fc0e345e159f02733cee5277716e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/helm-file-preview"))])
- (helm-filesets . [(20140929 1835) ((helm (1 6 3)) (filesets+ (0))) "A helm source for emacs filesets" single ((:commit . "b352910af4c3099267a8aa0169c7f743b35bb1fa") (:keywords "filesets") (:authors ("Graham Clark" . "grclark@gmail.com")) (:maintainer "Graham Clark" . "grclark@gmail.com") (:url . "https://github.com/gcla/helm-filesets"))])
- (helm-firefox . [(20200612 800) ((helm (1 5)) (cl-lib (0 5)) (emacs (24 1))) "Firefox bookmarks" single ((:commit . "8ecf5bcb815d1650bf184deffeef10b1277e0e1e") (:url . "https://github.com/emacs-helm/helm-firefox"))])
- (helm-fish-completion . [(20200622 1255) ((emacs (25)) (helm (3)) (fish-completion (1 2))) "Helm interface for fish completion" single ((:commit . "f055dab2f14462ff130841d4ab421f34baab39d5") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-fish-completion"))])
- (helm-flx . [(20180103 516) ((emacs (24 4)) (helm (1 7 9)) (flx (0 5))) "Sort helm candidates by flx score" single ((:commit . "6640fac5cb16bee73c95b8ed1248a4e5e113690e") (:keywords "convenience" "helm" "fuzzy" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/PythonNut/helm-flx"))])
- (helm-flycheck . [(20160710 829) ((dash (2 12 1)) (flycheck (28)) (helm-core (1 9 8))) "Show flycheck errors with helm" single ((:commit . "3cf7d3bb194acacc6395f88360588013d92675d6") (:keywords "helm" "flycheck") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-flycheck"))])
- (helm-flymake . [(20160610 2) ((helm (1 0))) "helm interface for flymake" single ((:commit . "72cf18a1a1f843db9bb5d58301739ea9ccb1655b") (:authors ("Akira Tamamori" . "tamamori5917@gmail.com")) (:maintainer "Akira Tamamori" . "tamamori5917@gmail.com") (:url . "https://github.com/tam17aki"))])
- (helm-flyspell . [(20170210 1901) ((helm (1 6 5))) "Helm extension for correcting words with flyspell" single ((:commit . "8d4d947c687cb650cb149aa2271ad5201ea92594") (:keywords "convenience") (:authors ("Andrzej Pronobis")) (:maintainer "Andrzej Pronobis") (:url . "https://github.com/pronobis/helm-flyspell"))])
- (helm-frame . [(20180604 1005) ((emacs (24 4))) "open helm buffers in a dedicated frame" single ((:commit . "485e2a534b0de5e8dbeb144a9a60ceca00215a4a") (:keywords "lisp" "helm" "popup" "frame") (:authors ("chee" . "chee@snake.dog")) (:maintainer "chee" . "chee@snake.dog"))])
- (helm-fuz . [(20200104 524) ((emacs (25 1)) (fuz (1 4 0)) (helm (3 6))) "Integrate Helm and Fuz" single ((:commit . "0b6b64cebde5675be3a28520ee16234db48d3b8b") (:keywords "convenience") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:url . "https://github.com/cireu/fuz.el"))])
- (helm-fuzzier . [(20160605 2145) ((emacs (24 3)) (helm (1 7 0))) "Better fuzzy matching for Helm" single ((:commit . "8798dcf3583b863df5b9dea7fe3b0179ba1c35bc") (:keywords "convenience" "helm" "fuzzy") (:authors ("Ephram Perdition")) (:maintainer "Ephram Perdition") (:url . "http://github.com/EphramPerdition/helm-fuzzier"))])
- (helm-fuzzy . [(20190905 526) ((emacs (24 4)) (helm (1 7 9)) (flx (0 5))) "Fuzzy matching for helm source." single ((:commit . "152d54bcd7137e4f5df54cf213e578c9d71864bd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/helm-fuzzy"))])
- (helm-fuzzy-find . [(20171106 400) ((emacs (24 1)) (helm (1 7 0))) "Find file using Fuzzy Search" single ((:commit . "de2abbf7ca13609587325bacd4a1ed4376b5c927") (:keywords "helm" "fuzzy" "find" "file") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/helm-fuzzy-find"))])
- (helm-ghc . [(20141105 1459) ((emacs (24)) (cl-lib (0 5)) (helm (1 6 4)) (ghc (5 2 1 0))) "A Helm datasource for ghc-mod errors" single ((:commit . "e5ee7b8d3b745d162553aecfbd41381c4de85f35") (:keywords "languages" "helm") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (helm-ghq . [(20190526 1409) ((emacs (24)) (helm (2 2 0))) "Ghq with helm interface" single ((:commit . "d0d6aa0f407388e7012f0443df8ae657ece01779") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-ghq"))])
- (helm-ghs . [(20170715 541) ((emacs (24)) (helm (2 2 0))) "ghs with helm interface" single ((:commit . "17a70bf16255d90d67c8350e88200ec8bfd47563") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:url . "https://github.com/iory/emacs-helm-ghs"))])
- (helm-git . [(20120630 2103) nil "Helm extension for Git." single ((:commit . "cb96a52b5aecadd3c27aba7749d14e43ab128d55") (:keywords "helm" "git") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:url . "https://github.com/maio/helm-git"))])
- (helm-git-files . [(20141212 1317) ((helm (1 5 9))) "helm for git files" single ((:commit . "43193960774069369ac6964bbf7c026900206fa8") (:keywords "helm" "git") (:authors ("INA Lintaro <tarao.gnn at gmail.com>") ("TAKAGI Kentaro <kentaro0910_at_gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>"))])
- (helm-git-grep . [(20170614 1411) ((helm-core (2 2 0))) "helm for git grep, an incremental git-grep(1)" single ((:commit . "744cea07dba6e6a5effbdba83f1b786c78fd86d3") (:authors ("mechairoi")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-git-grep"))])
- (helm-github-stars . [(20190428 1047) ((helm (1 6 8)) (emacs (24 4))) "Helm interface for your github's stars" single ((:commit . "c891690218b0d8b957ea6cb45b1b6cffd15a6950") (:keywords "helm" "github" "stars") (:authors ("Sliim" . "sliim@mailoo.org") ("xuchunyang" . "xuchunyang56@gmail.com")) (:maintainer "Sliim" . "sliim@mailoo.org") (:url . "https://github.com/Sliim/helm-github-stars"))])
- (helm-gitignore . [(20170211 8) ((gitignore-mode (1 1 0)) (helm (1 7 0)) (request (0 1 0)) (cl-lib (0 5))) "Generate .gitignore files with gitignore.io." single ((:commit . "2a2e7da7855a6db0ab3bb6a6a087863d7abd4391") (:keywords "helm" "gitignore" "gitignore.io") (:authors ("Juan Placencia")) (:maintainer "Juan Placencia") (:url . "https://github.com/jupl/helm-gitignore"))])
- (helm-gitlab . [(20180312 1647) ((s (1 9 0)) (dash (2 9 0)) (helm (1 0)) (gitlab (0 8 0))) "Helm interface to Gitlab" single ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:keywords "gitlab" "helm") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/emacs-gitlab"))])
- (helm-go-package . [(20161103 153) ((emacs (24 4)) (helm-core (2 2 1)) (go-mode (1 4 0)) (deferred (0 4 0))) "helm sources for Go programming language's package" single ((:commit . "e42c563936c205ceedb930a687c11b4bb56447bc") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-go-package"))])
- (helm-google . [(20180606 520) ((helm (0))) "Emacs Helm Interface for quick Google searches" single ((:commit . "48e91a73d5f48c39d7a219022a24440cff548e1a") (:keywords "helm" "google" "search" "browse" "searx") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://framagit.org/steckerhalter/helm-google"))])
- (helm-grepint . [(20200727 1951) ((helm (2 9 7)) (emacs (24 4))) "Generic helm interface to grep" single ((:commit . "593aaac5e5cb9b0f224710ab945eddf6d861aa23") (:keywords "grep" "grepping" "searching" "helm" "tools" "convenience") (:authors ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainer "Kalle Kankare" . "kalle.kankare@iki.fi") (:url . "https://github.com/kopoli/helm-grepint"))])
- (helm-growthforecast . [(20140120 344) ((helm (1 5 9))) "helm extensions for growthforecast." single ((:commit . "0f94ac090d6c354058ad89a86e5c18385c136d9b") (:authors ("Daichi Hirata" . "daichi.hirat@gmail.com")) (:maintainer "Daichi Hirata" . "daichi.hirat@gmail.com") (:url . "https://github.com/daic-h/helm-growthforecast"))])
- (helm-gtags . [(20200602 1610) ((emacs (24 4)) (helm (2 0))) "GNU GLOBAL helm interface" single ((:commit . "a15fe1dd272d252ad933d8129db1dce02fd41adb") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-gtags"))])
- (helm-hatena-bookmark . [(20190609 1455) ((emacs (24)) (helm (2 8 2))) "Hatena::Bookmark with helm interface" single ((:commit . "10b8bfbd7fc4c3f503b2bc01f0c062dac128059e") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-hatena-bookmark"))])
- (helm-hayoo . [(20151014 651) ((helm (1 6 0)) (json (1 2)) (haskell-mode (13 7))) "Source and configured helm for searching hayoo" single ((:commit . "dd4c0c8c87521026edf1b808c4de01fa19b7c693") (:keywords "helm") (:authors ("Markus Hauck" . "markus1189@gmail.com")) (:maintainer "Markus Hauck" . "markus1189@gmail.com"))])
- (helm-helm-commands . [(20130902 1748) ((helm (1 5 4))) "List all helm commands with helm" single ((:commit . "3a05aa19c976501343ad9ae630a36810921a85f6") (:keywords "convenience") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/helm-helm-commands"))])
- (helm-hoogle . [(20161027 534) ((helm (1 6 2)) (emacs (24 4))) "Use helm to navigate query results from Hoogle" single ((:commit . "73969a9d46d2121a849a01a9f7ed3636d01f7bbc") (:keywords "haskell" "programming" "hoogle") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:url . "https://github.com/jwiegley/haskell-config"))])
- (helm-hunks . [(20171217 1933) ((emacs (24 4)) (helm (1 9 8))) "A helm interface for git hunks - browsing, staging, unstaging and killing" single ((:commit . "6392bf716f618eac23ce81140aceb0dfacb9c6d0") (:keywords "helm" "git" "hunks" "vc") (:authors ("@torgeir")) (:maintainer "@torgeir"))])
- (helm-icons . [(20200719 1359) ((emacs (25 1)) (dash (2 14 1)) (f (0 20 0)) (treemacs (2 7))) "Helm icons" single ((:commit . "d8c15dc61c1f321686b447e83abb17e14bc6f1c6") (:keywords "convenience") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:url . "https://github.com/yyoncho/helm-icons"))])
- (helm-idris . [(20141202 1757) ((helm (0 0 0)) (idris-mode (0 9 14))) "A Helm datasource for Idris documentation, queried from the compiler" single ((:commit . "a2f45d6817974f318b55ad9b7fd19d5df132d47e") (:keywords "languages" "helm") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (helm-img . [(20151224 2321) ((helm (1 7 7)) (cl-lib (0 5))) "Utilities for making image sources for helm." tar ((:commit . "aa3f8a5dce8d0413bf07584f07153a39015c2bfc") (:keywords "convenience") (:authors ("Sho Matsumoto <l3msh0_at_gmail.com>")) (:maintainer "l3msh0") (:url . "https://github.com/l3msh0/helm-img"))])
- (helm-img-tiqav . [(20151224 2322) ((helm-img (0 0 1))) "An helm-source for joking." single ((:commit . "33a7e9508bc8f37d53320b56c92b53d321a57bb0") (:keywords "convenience") (:authors ("Sho Matsumoto <l3msh0_at_gmail.com>")) (:maintainer "l3msh0") (:url . "https://github.com/l3msh0/helm-img"))])
- (helm-ispell . [(20151231 853) ((helm-core (1 7 7))) "ispell-complete-word with helm interface" single ((:commit . "cb735695ab3a0e66c123c2f3f3e8911fb1c2d5fc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ispell"))])
- (helm-itunes . [(20151013 648) ((helm (1 6 1))) "Play local iTunes and Spotify tracks" single ((:commit . "966de755a5aadbe02311a6cef77bd4790e84c263") (:authors ("Adam Schwartz" . "adam@adamschwartz.io")) (:maintainer "Adam Schwartz" . "adam@adamschwartz.io") (:url . "https://github.com/daschwa/helm-itunes"))])
- (helm-j-cheatsheet . [(20170217 829) ((helm (1 5 3))) "Quick J reference for Emacs" single ((:commit . "6c47e7162b9ba2de4b41221d01180146973d860b") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/helm-j-cheatsheet"))])
- (helm-jira . [(20180802 815) ((emacs (25)) (cl-lib (0 5)) (helm (1 9 9))) "Helm bindings for JIRA/Bitbucket/stash" single ((:commit . "75d6ed5bd7a041fa8c1adb21cbbbe57b5a7c7cc7") (:keywords "tools" "helm" "jira" "bitbucket" "stash") (:authors ("Roman Decker <roman dot decker at gmail dot com>")) (:maintainer "Roman Decker <roman dot decker at gmail dot com>") (:url . "https://github.com/DeX3/helm-jira"))])
- (helm-js-codemod . [(20190921 942) ((emacs (24 4)) (helm-core (1 9 8)) (js-codemod (1 0 0))) "A helm interface for running js-codemods" single ((:commit . "29b1b3c441f0d7e450a3c65b5ff9e72023dc6314") (:keywords "helm" "js" "codemod" "region") (:authors (nil . "Torgeir Thoresen <@torgeir>")) (:maintainer nil . "Torgeir Thoresen <@torgeir>"))])
- (helm-jstack . [(20150603 422) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "Helm interface to Jps & Jstack for Java/JVM processes" single ((:commit . "2064f7215dcf4ccbd6a7b8784223251507746da4") (:keywords "java" "jps" "jstack" "jvm" "emacs" "elisp" "helm") (:authors ("Raghav Kumar Gautam" . "rgautam@apache.com")) (:maintainer "Raghav Kumar Gautam" . "rgautam@apache.com"))])
- (helm-kythe . [(20170709 726) ((emacs (25)) (dash (2 12 0)) (helm (2 0))) "Google Kythe helm interface" single ((:commit . "eabbef4948f8ec7c7b2fac498e9145dfdb10ca82") (:authors ("Fangrui Song" . "i@maskray.me")) (:maintainer "Fangrui Song" . "i@maskray.me") (:url . "https://github.com/MaskRay/emacs-helm-kythe"))])
- (helm-lastpass . [(20180722 806) ((emacs (25 1)) (helm (2 0)) (csv (2 1))) "Helm interface of LastPass" single ((:commit . "82e1ffb6ae77d9d9e29c398eb013cd20ce963f77") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/helm-lastpass"))])
- (helm-lean . [(20200620 915) ((emacs (24 3)) (dash (2 12 0)) (helm (2 8 0)) (lean-mode (3 3 0))) "Helm interfaces for lean-mode" single ((:commit . "6b4377686128d5c2fb55d8fe61b92a9991d40fbd") (:keywords "languages") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:url . "https://github.com/leanprover/lean-mode"))])
- (helm-lib-babel . [(20180510 1324) ((cl-lib (0 5)) (helm (1 9 2)) (emacs (24 4))) "helm insertion of babel function references" single ((:commit . "41bc0cdea8a604c6c8dc83ed5066644d33688fad") (:keywords "convenience") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:url . "https://github.com/dfeich/helm-lib-babel.el"))])
- (helm-lines . [(20180601 2033) ((emacs (24 4)) (helm (1 9 8))) "A helm interface for completing by lines" single ((:commit . "3bfe15a60c6405682085ab289de3eb364624c4e9") (:keywords "files" "helm" "ag" "pt" "vc" "git" "lines" "complete" "tools" "languages") (:authors ("@torgeir")) (:maintainer "@torgeir") (:url . "https://github.com/torgeir/helm-lines.el/"))])
- (helm-lobsters . [(20150213 1546) ((helm (1 0)) (cl-lib (0 5))) "helm front-end for lobste.rs" single ((:commit . "53c5b42baf72776dcba891fc3d7cd7d47721e9b0") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu") (:url . "https://github.com/julienXX/helm-lobste.rs"))])
- (helm-ls-git . [(20200519 912) ((helm (1 7 8))) "list git files." single ((:commit . "4da1a53f2f0a078ee2e896a914a1b19c0bf1d5ed"))])
- (helm-ls-hg . [(20150909 543) ((helm (1 7 8))) "List hg files in hg project." single ((:commit . "61b91a22fcfb62d0fc56e361ec01ce96973c7165"))])
- (helm-ls-svn . [(20190316 2203) ((emacs (24 1)) (helm (1 7 0)) (cl-lib (0 5))) "helm extension to list svn files" single ((:commit . "a6043e1187282f649e2cb9f0e722a42daf41294b") (:keywords "helm" "svn") (:authors ("Chunyang Xu" . "chunyang@macports.org")) (:maintainer "Chunyang Xu" . "chunyang@macports.org") (:url . "https://svn.macports.org/repository/macports/users/chunyang/helm-ls-svn.el/helm-ls-svn.el"))])
- (helm-lsp . [(20200701 2042) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (5 0)) (helm (2 0))) "LSP helm integration" single ((:commit . "5c960e7800dc8f4432f3a1466a637d484b87dc35") (:keywords "languages" "debug") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:url . "https://github.com/yyoncho/helm-lsp"))])
- (helm-lxc . [(20200323 816) ((emacs (25)) (cl-lib (0 5)) (helm (2 9 4)) (lxc-tramp (0 2 0))) "Helm interface to manage LXC containers" single ((:commit . "37fe2d7ed97967edf59a3b68b1434910516ae24f") (:keywords "helm" "lxc" "convenience") (:authors ("montag451")) (:maintainer "montag451") (:url . "https://github.com/montag451/helm-lxc"))])
- (helm-make . [(20200620 27) nil "Select a Makefile target with helm" single ((:commit . "ebd71e85046d59b37f6a96535e01993b6962c559") (:keywords "makefile") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/helm-make"))])
- (helm-migemo . [(20151010 356) ((emacs (24 4)) (helm-core (1 7 8)) (migemo (1 9)) (cl-lib (0 5))) "Migemo plug-in for helm" single ((:commit . "66c6a19d07c6a385daefd2090d0709d26b608b4e") (:keywords "matching" "convenience" "tools" "i18n") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "Yuhei Maeda <yuhei.maeda_at_gmail.com>") (:url . "https://github.com/emacs-jp/helm-migemo"))])
- (helm-mode-manager . [(20151124 938) ((helm (1 5 3))) "Select and toggle major and minor modes with helm" single ((:commit . "5d9c3ca4f8205d07ff4e03c4c3e88f596751c1fc") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/helm-mode-manager"))])
- (helm-mt . [(20160918 452) ((emacs (24)) (helm (0 0)) (multi-term (0 0)) (cl-lib (0 5))) "helm multi-term management" single ((:commit . "d2bff4100118483bc398c56d0ff095294209265b") (:keywords "helm" "multi-term") (:authors ("Didier Deshommes" . "dfdeshom@gmail.com")) (:maintainer "Didier Deshommes" . "dfdeshom@gmail.com") (:url . "https://github.com/dfdeshom/helm-mt"))])
- (helm-mu . [(20190819 1311) ((helm (1 5 5))) "Helm sources for searching emails and contacts" single ((:commit . "481964fb26c59ea280a1ec7bce192d724ddf7d12") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/emacs-helm/helm-mu"))])
- (helm-navi . [(20200401 904) ((emacs (24 4)) (helm (1 9 4)) (helm-org (1 0)) (navi-mode (2 0)) (s (1 10 0))) "Helm for navi-mode" single ((:commit . "9bba79119edd8959d26484326c2f6868b7d942c0") (:keywords "navigation" "outlines") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/emacs-helm/helm-navi"))])
- (helm-nixos-options . [(20151013 2309) ((nixos-options (0 0 1)) (helm (1 5 6))) "Helm Interface for nixos-options" single ((:commit . "977b9a505ffc8b33b70ec7742f90e469b3168297") (:keywords "unix") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))])
- (helm-notmuch . [(20190320 1048) ((helm (1 9 3)) (notmuch (0 21))) "Search emails with Notmuch and Helm" single ((:commit . "97a01497e079a7b6505987e9feba6b603bbec288") (:keywords "mail") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/emacs-helm/helm-notmuch"))])
- (helm-open-github . [(20170220 159) ((emacs (24 4)) (helm-core (1 7 7)) (gh (0 8 2))) "Utilities of Opening Github Page" single ((:commit . "2f03d97552a1233db7694116d5f80ecde7612756") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-open-github"))])
- (helm-org . [(20200311 633) ((helm (3 3)) (emacs (24 4))) "Helm for org headlines and keywords completion" single ((:commit . "b7a18dfc17e8b933956d61d68c435eee03a96c24") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-org"))])
- (helm-org-multi-wiki . [(20200505 1053) ((emacs (26 1)) (org-multi-wiki (0 3)) (org-ql (0 4)) (dash (2 12)) (helm-org (1 0)) (helm (3 5))) "Helm interface to org-multi-wiki" single ((:commit . "97575f7b17b2c137127884deb51faf9be7ec5267") (:keywords "org" "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-multi-wiki"))])
- (helm-org-rifle . [(20200512 1943) ((emacs (24 4)) (dash (2 12)) (f (0 18 1)) (helm (1 9 4)) (s (1 10 0))) "Rifle through your Org files" single ((:commit . "263f56d70112f5d0496684c89a2aa07959e0a95f") (:keywords "hypermedia" "outlines") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/helm-org-rifle"))])
- (helm-orgcard . [(20151001 1524) ((helm-core (1 7 7))) "browse the orgcard by helm" single ((:commit . "9655ac340d1ccc5f3d1c0f7c49be8dd3556d4d0d") (:keywords "convenience" "helm" "org") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda") (:url . "https://github.com/emacs-jp/helm-orgcard"))])
- (helm-osx-app . [(20190717 958) ((emacs (25 1)) (helm-core (3 0))) "Launch macOS apps with helm" single ((:commit . "634ed5d721a20af265825a018e9df3ee6640daee") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/helm-osx-app"))])
- (helm-pages . [(20161121 226) ((helm (1 6 5)) (emacs (24)) (cl-lib (0 5))) "Pages in current buffer as Helm datasource" single ((:commit . "51dcb9374d1df9feaae85e60cfb39b970554ecba") (:keywords "convenience" "helm" "outlines") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk"))])
- (helm-pass . [(20190315 1335) ((emacs (25)) (helm (0)) (password-store (0)) (auth-source-pass (4 0 0))) "helm interface of pass, the standard Unix password manager" single ((:commit . "ed5798f2d83937575e8f23fde33323bca9e85131") (:authors ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-pass"))])
- (helm-perldoc . [(20200315 1716) ((helm-core (2 0)) (deferred (0 3 1)) (emacs (24 4))) "perldoc with helm interface" tar ((:commit . "6f3526f07f3df3059dbde779f8e681f5f1fee6ea") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-perldoc"))])
- (helm-perspeen . [(20170228 1345) ((perspeen (0 1 0)) (helm (2 5 0))) "Helm interface for perspeen." single ((:commit . "7fe2922d85608bfa9e18269fc44181428b8849ff") (:keywords "projects" "lisp") (:authors ("Yoshinobu Fujimoto")) (:maintainer "Yoshinobu Fujimoto") (:url . "https://github.com/jimo1001/helm-perspeen"))])
- (helm-phpunit . [(20160513 853) ((helm (1 9 5)) (phpunit (0 7 0))) "Helm integration for phpunit.el" single ((:commit . "739f26204ad2ba76c25f45e8eab1e5216f7c3518") (:keywords "phpunit" "helm" "php") (:authors ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Eric Hansen" . "hansen.c.eric@gmail.com") (:url . "https://github.com/eric-hansen/phpunit-helm"))])
- (helm-posframe . [(20200512 1146) ((emacs (26 0)) (posframe (0 1 0)) (helm (0 1))) "Using posframe to show helm window" single ((:commit . "b107e64eedef6292c49d590f30d320c29b64190b") (:keywords "abbrev" "convenience" "matching" "helm") (:authors ("Feng Shu")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/helm-posframe"))])
- (helm-proc . [(20161006 305) ((helm (1 6 0))) "Helm interface for managing system processes" tar ((:commit . "576d31c2d74ba3897d56e2acd2b0993f52c2547c"))])
- (helm-project-persist . [(20151210 1543) ((helm (1 5 2)) (project-persist (0 1 4))) "Helm integration for project-persist package" single ((:commit . "357950fbac18090985a750e40d5d8b10ee9dcd53") (:keywords "project-persist" "project" "helm") (:authors ("Sliim" . "sliim@mailoo.org")) (:maintainer "Sliim" . "sliim@mailoo.org"))])
- (helm-projectile . [(20200625 443) ((helm (1 9 9)) (projectile (2 2 0)) (cl-lib (0 3))) "Helm integration for Projectile" single ((:commit . "2f3a2a03d6cb9419c25b432637aa11c8d2f9f3b7") (:keywords "project" "convenience") (:authors ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:url . "https://github.com/bbatsov/helm-projectile"))])
- (helm-prosjekt . [(20140129 717) ((prosjekt (0 3)) (helm (1 5 9))) "Helm integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Sohail Somani" . "sohail@taggedtype.net")) (:maintainer "Sohail Somani" . "sohail@taggedtype.net") (:url . "https://github.com/abingham/prosjekt"))])
- (helm-pt . [(20160214 2342) ((helm (1 5 6))) "Helm interface to the platinum searcher" tar ((:commit . "8acc52911dad1ed0c3975f134a468762afe0b76b") (:keywords "helm" "platinum searcher"))])
- (helm-purpose . [(20170114 1636) ((emacs (24)) (helm (1 9 2)) (window-purpose (1 4))) "Helm Interface for Purpose" single ((:commit . "9ff4c21c1e9ebc7afb851b738f815df7343bb287") (:authors ("Bar Magal (2016)")) (:maintainer "Bar Magal (2016)") (:url . "https://github.com/bmag/helm-purpose"))])
- (helm-pydoc . [(20160918 542) ((helm-core (2 0)) (emacs (24 4))) "pydoc with helm interface" tar ((:commit . "85480a29b56dacde425655bc8f5a597c785afdf5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-pydoc"))])
- (helm-qiita . [(20190526 1359) ((emacs (24)) (helm (2 8 2))) "Qiita with helm interface" single ((:commit . "5f82010c595f8e122aa3f68148ba8d8ccb1333d8") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-qiita"))])
- (helm-rage . [(20180118 1532) ((helm (1 9 8)) (emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Helm command for rage characters." tar ((:commit . "5d0aefb53d859186181d4bdcfeff7d315339c7b8") (:keywords "helm" "rage" "meme") (:url . "https://github.com/bomgar/helm-rage"))])
- (helm-rails . [(20130424 1519) ((helm (1 5 1)) (inflections (1 1))) "Helm extension for Rails projects." single ((:commit . "506d9948d45dfbc575c9c4c0d102c1ad2f511e82") (:keywords "helm" "rails" "git") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:url . "https://github.com/asok/helm-rails"))])
- (helm-rb . [(20131123 1639) ((helm (1 0)) (helm-ag-r (20131123))) "Search Ruby's method by ag and display helm" tar ((:commit . "4949d646420a9849af234dacdd8eb34a77c662fd") (:keywords "searching" "ruby") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/helm-rb"))])
- (helm-rdefs . [(20161130 536) ((emacs (24)) (helm (1 6 4))) "rdefs with helm interface" single ((:commit . "cd3a6b3af3015ee58ef30cb7c81c79ebe5fc867b") (:keywords "matching" "tools") (:authors ("Hiroshi Saito" . "monodie@gmail.com")) (:maintainer "Hiroshi Saito" . "monodie@gmail.com") (:url . "https://github.com/saidie/helm-rdefs"))])
- (helm-recoll . [(20190729 453) ((helm (3 3)) (emacs (24 4))) "helm interface for the recoll desktop search tool." single ((:commit . "219e517dd79a7879414ca36e8de28a159a49c78a") (:keywords "convenience") (:authors ("Thierry Volpiatto <thierry.volpiatto at gmail.com>")) (:maintainer "Thierry Volpiatto <thierry.volpiatto at gmail.com>") (:url . "https://github.com/emacs-helm/helm-recoll"))])
- (helm-rg . [(20200721 725) ((emacs (25)) (cl-lib (0 5)) (dash (2 13 0)) (helm (2 8 8))) "a helm interface to ripgrep" single ((:commit . "ee0a3c09da0c843715344919400ab0a0190cc9dc") (:keywords "find" "file" "files" "helm" "fast" "rg" "ripgrep" "grep" "search" "match") (:authors ("Danny McClanahan")) (:maintainer "Danny McClanahan") (:url . "https://github.com/cosmicexplorer/helm-rg"))])
- (helm-rhythmbox . [(20160524 1158) ((helm (1 5 0)) (cl-lib (0 5))) "control Rhythmbox's play queue via Helm" single ((:commit . "c92e1ded34ddd4e62e7e9a558259c232e05193fa") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/helm-rhythmbox"))])
- (helm-robe . [(20151209 355) ((helm (1 7 7))) "completing read function for robe" single ((:commit . "6e69543b4ee76c5f8f3f2510c76e6d9aed17a370") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-robe"))])
- (helm-ros . [(20160812 1752) ((helm (1 9 9)) (xterm-color (1 0)) (cl-lib (0 5))) "Interfaces ROS with helm" single ((:commit . "92b0b215f6a017f0f57f1af15466cc0b2a5a0135") (:keywords "helm" "ros") (:authors ("David Landry" . "davidlandry93@gmail.com")) (:maintainer "David Landry" . "davidlandry93@gmail.com") (:url . "https://www.github.com/davidlandry93/helm-ros"))])
- (helm-rtags . [(20191222 920) ((helm (2 0)) (rtags (2 10))) "A front-end for rtags" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))])
- (helm-rubygems-local . [(20130712 111) ((helm (1 5 3))) "Installed local rubygems find-file for helm" single ((:commit . "289cb33d41c703af9791d6da46b55f070013c2e3") (:authors ("hadashiA" . "dev@hadashikick.jp")) (:maintainer "hadashiA" . "dev@hadashikick.jp") (:url . "https://github.com/f-kubotar/helm-rubygems-local"))])
- (helm-rubygems-org . [(20140826 1156) ((emacs (24)) (helm (1 6 3)) (cl-lib (0 5))) "Use helm to search rubygems.org" single ((:commit . "6aaed984f698cbdf9f9aceb0221404563e28764d") (:keywords "ruby" "rubygems" "gemfile" "helm") (:authors ("Chad Albers" . "calbers@neomantic.com")) (:maintainer "Chad Albers" . "calbers@neomantic.com") (:url . "https://github.com/neomantic/helm-rubygems-org"))])
- (helm-safari . [(20160404 324) ((helm (1 9 1)) (emacs (24))) "Browse your Safari bookmarks and history" single ((:commit . "664c7f4488829228eed7e90cd53002e14bec555b") (:keywords "tools") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/helm-safari"))])
- (helm-sage . [(20160514 745) ((cl-lib (0 5)) (helm (1 5 6)) (sage-shell-mode (0 1 0))) "A helm extension for sage-shell-mode." single ((:commit . "f14e9281d8f2162df7d8f9c2ad9ad1248a24803b") (:keywords "sage" "math" "helm") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:url . "https://github.com/stakemori/helm-sage"))])
- (helm-selected . [(20171223 210) ((emacs (24 4)) (helm (2 8 6)) (selected (1 1))) "helm extension for selected.el" single ((:commit . "a9c769998bc56373d19f0ec9cbbbb4bd89a43c2d") (:keywords "extensions" "convenience") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:url . "https://github.com/takaxp/helm-selected"))])
- (helm-sheet . [(20130630 1239) ((helm (1 0))) "helm sources for sheet" single ((:commit . "d360b68d0ddb09aa1854e7b2f3cb39caeee26463") (:keywords "helm" "sheet") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-sheet"))])
- (helm-slime . [(20191016 1601) ((emacs (25)) (helm (3 2)) (slime (2 18)) (cl-lib (0 5))) "helm-sources and some utilities for SLIME." single ((:commit . "7886cc49906a87ebd73be3b71f5dd6b1433a9b7b") (:keywords "convenience" "helm" "slime") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net") (:url . "https://github.com/emacs-helm/helm-slime"))])
- (helm-sly . [(20191104 1054) ((emacs (25 1)) (helm (3 2)) (cl-lib (0 5)) (sly (0 0))) "Helm sources and some utilities for SLY." single ((:commit . "b1567c27c0b421b9e25e350f0c83b9c7fe0fee6b") (:keywords "convenience" "helm" "sly" "lisp") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-sly"))])
- (helm-smex . [(20171004 2008) ((emacs (24)) (smex (3 0)) (helm (1 7 7))) "Helm interface for smex" single ((:commit . "2269375dfa452b88b5170d1a5d5849ebb2c1e413") (:keywords "convenience") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))])
- (helm-spaces . [(20161001 1409) ((helm-core (2 2)) (spaces (0 1 0))) "helm sources for spaces" single ((:commit . "877e2b5178926308d6a7c2a37477bb12c33a96d4") (:keywords "helm" "frames" "convenience") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-spaces"))])
- (helm-spotify . [(20160905 2147) ((helm (0 0 0)) (multi (2 0 0))) "Control Spotify with Helm." single ((:commit . "f7a62d1ff88e3127de9be7cd3e818b0a92268ab3") (:keywords "helm" "spotify") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/helm-spotify"))])
- (helm-spotify-plus . [(20190913 2236) ((emacs (24 4)) (helm (2 0 0)) (multi (2 0 1))) "Control Spotify search and select music with Helm." single ((:commit . "c3922ec368250965e483876cde5880d88a40a71b") (:authors ("Wanderson Ferreira <https://github.com/wandersoncferreira> and Luis Moneda <https://github.com/lgmoneda>")) (:maintainer "Wanderson Ferreira <https://github.com/wandersoncferreira> and Luis Moneda <https://github.com/lgmoneda>") (:url . "https://github.com/wandersoncferreira/helm-spotify-plus"))])
- (helm-sql-connect . [(20170319 1251) ((helm (0 0 0))) "Choose a database to connect to via Helm." single ((:commit . "5aead55b6f8636140945714d8c332b287ab9ef10") (:keywords "tools" "convenience" "comm") (:authors ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Eric Hansen" . "hansen.c.eric@gmail.com") (:url . "https://github.com/eric-hansen/helm-sql-connect"))])
- (helm-switch-shell . [(20200722 1917) ((emacs (25)) (helm (2 8 8)) (dash (2 16 0)) (s (1 12 0))) "A Helm source for switching between shell buffers" single ((:commit . "265d98201b9a8397b9acea1342af2f9058fa75e7") (:keywords "matching" "processes" "terminals" "tools") (:authors ("James N. V. Cash" . "james.cash@occasionallycogent.com")) (:maintainer "James N. V. Cash" . "james.cash@occasionallycogent.com") (:url . "https://github.com/jamesnvc/helm-switch-shell"))])
- (helm-swoop . [(20200515 417) ((emacs (24 4)) (helm (3 2))) "Efficiently hopping squeezed lines powered by helm interface" single ((:commit . "2efc552591102ab8b4408ad60a3c4be991bb8e93") (:keywords "convenience" "helm" "swoop" "inner" "buffer" "search") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:url . "https://github.com/emacsorphanage/helm-swoop"))])
- (helm-system-packages . [(20200502 751) ((emacs (24 4)) (helm (2 8 7)) (seq (1 8))) "Helm UI wrapper for system package managers." tar ((:commit . "d6ad2f682d744048ea0ac47c470be5a159a6541b") (:keywords "helm" "packages") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-system-packages"))])
- (helm-systemd . [(20180131 434) ((emacs (24 4)) (helm (1 9 2)) (with-editor (2 5 0))) "helm's systemd interface" single ((:commit . "96f5cd3ee3412539c2f8d145201f47c4f8e53b4f") (:keywords "convenience") (:authors (nil . "<lompik@oriontabArch>")) (:maintainer nil . "<lompik@oriontabArch>"))])
- (helm-tail . [(20181124 439) ((emacs (25 1)) (helm (2 7 0))) "Read recent output from various sources" single ((:commit . "1f5a6355aa3bdb00b9b0bc93db29c17f0d6701e3") (:keywords "maint" "tools") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/helm-tail"))])
- (helm-taskswitch . [(20190304 1414) ((emacs (24)) (helm (3 0))) "Use helm to switch windows and buffers" single ((:commit . "59f7cb99defa6e6bf6e7d599559fa8d5786cf8a9") (:keywords "frames") (:authors ("Brian Caruso" . "briancaruso@gmail.com")) (:maintainer "Brian Caruso" . "briancaruso@gmail.com") (:url . "https://github.com/bdc34/helm-taskswitch"))])
- (helm-themes . [(20200323 712) ((helm-core (2 0)) (emacs (24 4))) "Color theme selection with helm interface" single ((:commit . "244121903650c2d25a233d12b378060cf8b010e7") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-themes"))])
- (helm-tramp . [(20190616 125) ((emacs (24 3)) (helm (2 0))) "Tramp helm interface for ssh, docker, vagrant" single ((:commit . "55e56975fe1456591a293bf60c183c3dda9f788f") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-helm-tramp"))])
- (helm-unicode . [(20180608 1407) ((helm (1 9 8)) (emacs (24 4))) "Helm command for unicode characters." single ((:commit . "fbeb0c5e741a6f462520884b744d43a9acbe1d34"))])
- (helm-w32-launcher . [(20141223 2014) ((emacs (24)) (helm (1 6 5)) (cl-lib (0 5))) "Start Menu entry launcher using Helm" tar ((:commit . "3e59ad62b89dd21d334af0203d445a83eb25dc5b") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/helm-w32-launcher"))])
- (helm-w3m . [(20181029 726) ((helm (1 5)) (w3m (0 0)) (cl-lib (0 5)) (emacs (24 1))) "W3m bookmark - helm interface." single ((:commit . "c15d926631198d6d759ec8881837bcca5a64963b"))])
- (helm-wikipedia . [(20200630 504) ((helm (3 6)) (emacs (25 1))) "Wikipedia suggestions" single ((:commit . "a6c8b1d1ab5dc0a69cb44bb5f3eb6792ef091147") (:url . "https://github.com/emacs-helm/helm-wikipedia"))])
- (helm-wordnet . [(20160128 1507) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "Helm interface to local wordnet dictionary" single ((:commit . "a36dbc6fcb570b812870bc1e190f203e0a0042fc") (:keywords "dictionary" "wordnet" "emacs" "elisp" "helm") (:authors ("Raghav Kumar Gautam" . "rgautam@apache.com")) (:maintainer "Raghav Kumar Gautam" . "rgautam@apache.com") (:url . "https://github.com/raghavgautam/helm-wordnet"))])
- (helm-xcdoc . [(20160116 1018) ((helm (1 5)) (emacs (24 4))) "Search Xcode Document by docsetutil and eww with helm interface" single ((:commit . "a85612149a6d8e18ab309b3db2d222ce39c42049") (:authors ("Ryo Fujimoto" . "fujimisakri@gmail.com")) (:maintainer "Ryo Fujimoto" . "fujimisakri@gmail.com") (:url . "https://github.com/fujimisakari/emacs-helm-xcdoc"))])
- (helm-xref . [(20191108 859) ((emacs (25 1)) (helm (1 9 4))) "Helm interface for xref results" single ((:commit . "6b4a8bd91f5eaf82f51bd31b03f6587387fe6983") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeit/helm-xref"))])
- (helm-youtube . [(20190101 1733) ((request (0 2 0)) (helm (2 3 1)) (cl-lib (0 5))) "Query YouTube and play videos in your browser" single ((:commit . "e7272f1648c7fa836ea5ac1a61770b4931ab4709") (:keywords "youtube" "multimedia") (:authors ("Maximilian Roquemore" . "maximus12793@gmail.com")) (:maintainer "Maximilian Roquemore" . "maximus12793@gmail.com") (:url . "https://github.com/maximus12793/helm-youtube"))])
- (helm-z . [(20171204 325) ((helm (1 0))) "Show z directory list with helm.el support." single ((:commit . "37212220bebea8b9c238cb1bbacd8332b7f26c03") (:authors ("yynozk" . "yynozk@gmail.com")) (:maintainer "yynozk" . "yynozk@gmail.com") (:url . "https://github.com/yynozk/helm-z"))])
- (helm-zhihu-daily . [(20160625 1145) ((helm (1 0)) (cl-lib (0 5)) (emacs (24 4))) "Helm interface for 知乎日报 (http://daily.zhihu.com)" single ((:commit . "be27dcc6be1eb97663b65581a9a5c0fc81cfaba7") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/helm-zhihu-daily"))])
- (help-find-org-mode . [(20181204 234) ((emacs (24 4))) "Advise help to find org source over tangled code" single ((:commit . "aeda7f92c086dab9d8dfcd580fe80b332887a548") (:keywords "convenience") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com") (:url . "https://github.com/EricCrosson/help-find-org-mode"))])
- (helpful . [(20200506 816) ((emacs (25)) (dash (2 12 0)) (dash-functional (1 2 0)) (s (1 11 0)) (f (0 20 0)) (elisp-refs (1 2))) "a better *help* buffer" single ((:commit . "c0662aa07266fe204f4e6d72ccaa6af089400556") (:keywords "help" "lisp") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/helpful"))])
- (hemera-theme . [(20180916 924) ((emacs (24))) "Light theme" single ((:commit . "b67c902b210b37b00cac68726822404543147ba8") (:keywords "themes" "light-theme") (:authors ("Guido Schmidt")) (:maintainer "Guido Schmidt" . "guido.schmidt.2912@gmail.com") (:url . "https://github.com/GuidoSchmidt/emacs-hemera-theme"))])
- (hemisu-theme . [(20130508 1844) nil "Hemisu for Emacs." tar ((:commit . "5c206561aa2c844ecdf3e3b672c3235e559ddd7f") (:authors ("Andrzej Sliwa")) (:maintainer "Andrzej Sliwa") (:url . "http://github/anrzejsliwa/django-theme"))])
- (hercules . [(20200420 747) ((emacs (24 4)) (which-key (3 3 2))) "An auto-magical, which-key-based hydra banisher." single ((:commit . "557da39878d0637395fdded91243b340c37eff7b") (:keywords "convenience") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:url . "https://gitlab.com/jjzmajic/hercules"))])
- (heroku-theme . [(20150523 219) nil "Heroku color theme" single ((:commit . "8083643fe92ec3a1c3eb82f1b8dc2236c9c9691d") (:authors ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainer "Jonathan Chu" . "me@jonathanchu.is") (:url . "https://github.com/jonathanchu/color-theme-heroku"))])
- (hexo . [(20200416 1410) ((emacs (24 3))) "Major mode & tools for Hexo" single ((:commit . "d600b6c2d51959f1331c8abf3953365544322afa") (:keywords "tools" "hexo") (:authors ("Ono Hiroko (kuanyui)" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko (kuanyui)" . "azazabc123@gmail.com") (:url . "https://github.com/kuanyui/hexo.el"))])
- (hfst-mode . [(20160708 1202) nil "major mode for editing HFST files" single ((:commit . "ac1bb9dd92545d3e7fdc05c83996c227cc15c6b8") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "http://wiki.apertium.org/wiki/Emacs"))])
- (hg-histedit . [(20190707 11) ((emacs (25 1)) (with-editor (2 8 3))) "Edit HG histedit files" single ((:commit . "2448d00bc390fed3e53091d968ec1222c8e7e35b") (:keywords "mercurial" "hg" "emacs" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/hg-histedit"))])
- (hgignore-mode . [(20160501 7) nil "a major mode for editing hgignore files" single ((:commit . "7aa9f3b8a9c610dbd80b952061b40194e1d9c5bd") (:keywords "convenience" "vc" "hg") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:url . "http://github.com/omajid/hgignore-mode"))])
- (hgrc-mode . [(20150409 2043) nil "major mode for editing hgrc files" single ((:commit . "314e8320b82cc1ce74b1bd372f296252e7a23090") (:keywords "convenience" "vc" "hg") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:url . "http://github.com/omajid/hgrc-mode"))])
- (hi2 . [(20141005 1931) nil "indentation module for Haskell Mode" single ((:commit . "c9d199727b5cdcb9e36a972b38131ce4611fd6c8") (:keywords "indentation" "haskell") (:authors ("Gergely Risko" . "gergely@risko.hu")) (:maintainer "Gergely Risko" . "gergely@risko.hu") (:url . "https://github.com/errge/hi2"))])
- (hide-lines . [(20151127 1840) nil "Commands for hiding lines based on a regexp" single ((:commit . "331122bf19361130351cfe55968c2a7820329eb3") (:keywords "convenience") (:authors ("Mark Hulme-Jones <ture at plig cucumber dot net>")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/hide-lines"))])
- (hide-mode-line . [(20190922 115) ((emacs (24 4))) "minor mode that hides/masks your modeline" single ((:commit . "88888825b5b27b300683e662fa3be88d954b1cea") (:keywords "frames" "mode-line") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-hide-mode-line"))])
- (hidepw . [(20200326 112) nil "Minor mode to hide passwords" single ((:commit . "73f099da79d73fe4087472df3469d8b9b20a59f2") (:keywords "hide" "hidden" "password" "faces") (:authors ("Chris Forno" . "jekor@jekor.com")) (:maintainer "Chris Forno" . "jekor@jekor.com") (:url . "https://github.com/jekor/hidepw"))])
- (hideshow-org . [(20120223 2250) nil "Provides org-mode like hide and show for hideshow.el" single ((:commit . "16419e52e6cdd2f46f755144c0ab11ce00d1a626") (:keywords "c" "c++" "java" "lisp" "tools" "editing" "comments" "blocks" "hiding" "outlines" "org-mode") (:authors ("Shane Celis <shane (at) gnufoo (dot) org>")) (:maintainer "Shane Celis <shane (at) gnufoo (dot) org>"))])
- (hierarchy . [(20190425 842) ((emacs (25 1))) "Library to create and display hierarchy structures" single ((:commit . "be2634dc1f08a5e781d02ef301c727246863756f") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/hierarchy"))])
- (highlight . [(20190710 1527) nil "Highlighting commands." single ((:commit . "9258a2b8362d737115cbd87618f947eadb140411") (:keywords "faces" "help" "local") (:authors ("Drew Adams")) (:maintainer nil . "Drew Adams (concat \"drew.adams\" \"@\" \"oracle\" \".com\")") (:url . "https://www.emacswiki.org/emacs/download/highlight.el"))])
- (highlight-blocks . [(20190318 1557) ((emacs (24))) "Highlight the blocks point is in" single ((:commit . "33cf3d36662faa36c86c8d53e4d5a3922efa3eb8") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-blocks"))])
- (highlight-context-line . [(20181122 2203) nil "Improve orientation when scrolling" single ((:commit . "6b334e8207c780835a05b6909b4d826898c33d26") (:keywords "faces" "services" "user") (:authors ("Stefan Kamphausen <www.skamphausen.de>")) (:maintainer "Stefan Kamphausen <www.skamphausen.de>") (:url . "https://github.com/ska2342/highlight-context-line/"))])
- (highlight-defined . [(20181106 1718) ((emacs (24))) "Syntax highlighting of known Elisp symbols" single ((:commit . "8e05be23e555ab05edc6fb188f5ce28ef495c946") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-defined"))])
- (highlight-doxygen . [(20200520 1713) nil "Highlight Doxygen comments" single ((:commit . "eec4874e2e89d4eb39091aad89a67dff8f8ec84c") (:keywords "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/highlight-doxygen"))])
- (highlight-escape-sequences . [(20171117 1237) nil "Highlight escape sequences" single ((:commit . "08d846a7aa748209d65fecead2b6a766c3e5cb41") (:keywords "convenience") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru") ("Pavel Matcula" . "dev.plvlml@gmail.com")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:url . "https://github.com/dgutov/highlight-escape-sequences"))])
- (highlight-function-calls . [(20170908 500) ((emacs (24 4))) "Highlight function/macro calls" single ((:commit . "f7a1eaf95fc64cc0db4d0567f9ff79ec4ae04787") (:keywords "faces" "highlighting") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/highlight-function-calls"))])
- (highlight-indent-guides . [(20200528 2128) ((emacs (24))) "Minor mode to highlight indentation" single ((:commit . "a4f771418e4eed1f3f7879a43af28cf97747d41c") (:authors ("DarthFennec" . "darthfennec@derpymail.org")) (:maintainer "DarthFennec" . "darthfennec@derpymail.org") (:url . "https://github.com/DarthFennec/highlight-indent-guides"))])
- (highlight-indentation . [(20181204 839) nil "Minor modes for highlighting indentation" single ((:commit . "d03803f2c06749c430443a3d24e039cbafc9c58f") (:authors ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson" . "anton.johansson@gmail.com") (:url . "https://github.com/antonj/Highlight-Indentation-for-Emacs"))])
- (highlight-leading-spaces . [(20151216 1222) ((emacs (24 4))) "Highlight leading spaces" single ((:commit . "840db19d863dd97993fd9f893f5be501627b6354") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/highlight-leading-spaces"))])
- (highlight-numbers . [(20181013 1744) ((emacs (24)) (parent-mode (2 0))) "Highlight numbers in source code" single ((:commit . "8b4744c7f46c72b1d3d599d4fb75ef8183dee307") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-numbers"))])
- (highlight-operators . [(20170213 2220) nil "a face for operators in programming modes" single ((:commit . "7696b43419505d6e3511ad2781f9f1dd3c55ef8c") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))])
- (highlight-parentheses . [(20180704 1102) nil "highlight surrounding parentheses" single ((:commit . "f0bd58c8dadd2db703b7bfd09e911b5fda05b3df") (:keywords "faces" "matching") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Tassilo Horn" . "tsdh@gnu.org") (:url . "https://github.com/tsdh/highlight-parentheses.el"))])
- (highlight-quoted . [(20140916 1822) ((emacs (24))) "Highlight Lisp quotes and quoted symbols" single ((:commit . "24103478158cd19fbcfb4339a3f1fa1f054f1469") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-quoted"))])
- (highlight-refontification . [(20170211 2024) nil "Visualize font-lock refontification." single ((:commit . "32632897d88c4611fadb08517ca00ef5cbc989b6") (:keywords "faces" "tools") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/highlight-refontification"))])
- (highlight-stages . [(20161212 1457) nil "highlight staged (quasi-quoted) expressions" single ((:commit . "29cbc5b78261916da042ddb107420083da49b271") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (highlight-symbol . [(20160102 2009) nil "automatic and manual symbol highlighting" single ((:commit . "7a789c779648c55b16e43278e51be5898c121b3a") (:keywords "faces" "matching") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/highlight-symbol/"))])
- (highlight-thing . [(20181229 1301) nil "Minimalistic minor mode to highlight current thing under point." single ((:commit . "561d08a26f78f18d405d4f371f1c813db094e2f3") (:keywords "highlight" "thing" "symbol") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:url . "https://github.com/fgeller/highlight-thing.el"))])
- (highlight-unique-symbol . [(20130612 542) ((deferred (0 3 2))) "highlight symbols which not appear in the repository" single ((:commit . "4141bf86a94e30d94d9af9c29d40b16886226e1c") (:authors ("hitode909" . "hitode909@gmail.com")) (:maintainer "hitode909" . "hitode909@gmail.com") (:url . "https://github.com/hitode909/emacs-highlight-unique-symbol"))])
- (highlight2clipboard . [(20151020 1840) ((htmlize (1 47))) "Copy text to clipboard with highlighting." tar ((:commit . "6ce58a060d9c5843ccb8c79ec2bba7858c68ac15") (:keywords "tools") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren"))])
- (hindent . [(20180518 902) ((cl-lib (0 5))) "Indent haskell code using the \"hindent\" program" single ((:commit . "1cc411283726c03d9779cfd9fdcad7c33ad0930a") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/chrisdone/hindent"))])
- (hippie-exp-ext . [(20160502 2326) nil "Extension of hippie-expand" single ((:commit . "4eda13f90da51ab217d024701f4c30f91ffcb90e") (:keywords "abbrev" "convenience" "completions" "hippie-expand") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/emacs/download/hippie-exp-ext.el"))])
- (hippie-expand-slime . [(20170723 146) nil "Hook slime's completion into hippie-expand" single ((:commit . "39bbae94896a62854d31754debdfae71d35fec62") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/hippie-expand-slime"))])
- (hippie-namespace . [(20140508 2041) nil "Special treatment for namespace prefixes in hippie-expand" single ((:commit . "d0d0f15c67ab8bef5e9d1e29a89ecd3613a60b49") (:keywords "convenience" "lisp" "tools" "completion") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/hippie-namespace"))])
- (historian . [(20200203 1927) ((emacs (24 4))) "Persistently store selected minibuffer candidates" single ((:commit . "ac1bea7d99dd6965c72fabeb72d5fdc38c5380a4") (:keywords "convenience") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/PythonNut/historian.el"))])
- (history . [(20160821 1602) ((emacs (24 3))) "History utility for source code navigation" tar ((:commit . "5317663fb45bbd5e96d258cb0807dcc266ce67ff") (:authors ("boyw165")) (:maintainer "boyw165") (:url . "https://github.com/boyw165/history"))])
- (historyf . [(20151124 159) nil "file history library like browser" single ((:commit . "196c058ceb092fdd56b0e4ce85b7e714d6f72224") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "https://github.com/k1LoW/emacs-historyf"))])
- (hive . [(20131217 1512) ((sql (3 0))) "Hive SQL mode extension" single ((:commit . "11b5172e081ad8079fc78758bef6f306f82ae32b") (:keywords "sql" "hive") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com"))])
- (hiwin . [(20150825 827) nil "Visible active window mode." single ((:commit . "6ee8ed051405653bd9b7332d7e9fbb591d954051") (:keywords "faces" "editing" "emulating") (:authors ("k.sugita")) (:maintainer "k.sugita"))])
- (hl-anything . [(20160422 1708) ((emacs (24 3))) "Highlight symbols, selections, enclosing parens and more." tar ((:commit . "8696bc55a8cba408f0fc83a907a9ec529d79e558") (:authors ("boyw165")) (:maintainer "boyw165"))])
- (hl-block-mode . [(20200404 702) ((emacs (26 0))) "highlighting nested blocks" single ((:commit . "6dc75e71b0b179d7c087cf7de51823f5810d671a") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://github.com/ideasman42/emacs-hl-block-mode"))])
- (hl-fill-column . [(20200607 757) ((names (0 5)) (emacs (24))) "Highlight fill column." single ((:commit . "5782a91ba0182c4e562fa0db6379ff9dd472856b") (:keywords "fill column" "faces") (:url . "https://github.com/laishulu/hl-fill-column"))])
- (hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:keywords "convenience" "faces") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:url . "https://github.com/ikirill/hl-indent"))])
- (hl-sentence . [(20171018 1519) nil "highlight a sentence based on customizable face" single ((:commit . "86ae38d3103bd20da5485cbdd59dfbd396c45ee4") (:keywords "highlighting") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "http://github.com/milkypostman/hl-sentence"))])
- (hl-todo . [(20200726 952) ((emacs (25))) "highlight TODO and similar keywords" single ((:commit . "6469c5e0bc8ef66ba92f6145dc6d2097e7fb13a9") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/hl-todo"))])
- (hledger-mode . [(20191012 1046) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "8206f3c5d8e5b9b084733879191ec3724b60494d") (:keywords "data") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:url . "https://github.com/narendraj9/hledger-mode.git"))])
- (hlint-refactor . [(20190115 900) nil "Apply HLint suggestions" single ((:commit . "c4307f86aad6d02e32e9b30cb6edc115584c791c") (:keywords "haskell" "refactor") (:url . "https://github.com/mpickering/hlint-refactor-mode"))])
- (hlinum . [(20180422 412) ((cl-lib (0 2))) "Extension for linum.el to highlight current line number" single ((:commit . "5646d9c0b9e7598b20b2004eab5439fdc6dbeda5") (:keywords "convenience" "extensions") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/hlinum-mode/"))])
- (hmac . [(20180429 2010) ((cl-lib (0 5)) (emacs (25))) "hash-based message authentication code" single ((:commit . "30132cd3fee7d3d91a9f04709d49ca0dcb96d565") (:authors ("Sean McAfee")) (:maintainer "Sean McAfee") (:url . "https://github.com/grimnebulin/emacs-hmac"))])
- (hnreader . [(20200726 654) ((emacs (25 1)) (promise (1 1)) (request (0 3 0)) (org (9 2))) "A hackernews reader" single ((:commit . "7ff808d4728ce4e269b6d99a73604063dd9b374a") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-hnreader/"))])
- (hoa-mode . [(20200610 1339) nil "Major mode for the HOA format" single ((:commit . "18f5c981e256f867f29a93376ccdc04717b159cd") (:keywords "major-mode" "automata" "convenience") (:authors ("Alexandre Duret-Lutz" . "adl@lrde.epita.fr")) (:maintainer "Alexandre Duret-Lutz" . "adl@lrde.epita.fr") (:url . "https://gitlab.lrde.epita.fr/spot/emacs-modes"))])
- (hoa-pp-mode . [(20151027 736) ((emacs (24 1)) (names (20150723 0))) "Major mode for Hoa PP grammars" single ((:commit . "925b79930a3f4377b0fb2a36b3c6d5566d4b9a8e") (:keywords "php" "hoa") (:authors ("Steven Rémot")) (:maintainer "Steven Rémot") (:url . "https://github.com/hoaproject/Contributions-Emacs-Pp"))])
- (holiday-pascha-etc . [(20160822 58) nil "Eastern Christian analog to holiday-easter-etc" single ((:commit . "eb198656f63cb8679fb0e3a8248782df071a0f3c") (:authors ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:url . "http://github.com/hexmode/holiday-pascha-etc"))])
- (home-end . [(20180817 855) ((emacs (24 3)) (keypress-multi-event (1 0))) "Smart multi-purpose home / end keys" single ((:commit . "30676ceec0d4ad84038cd0d65ee45ae810ab185c") (:keywords "abbrev" "convenience" "wp" "keyboard") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:url . "https://www.github.com/Boruch_Baum/emacs-home-end"))])
- (homebrew-mode . [(20200205 224) ((emacs (24 4)) (inf-ruby (2 4 0)) (dash (1 2 0))) "minor mode for editing Homebrew formulae" single ((:commit . "8c04b040656dc99719efd7663c10f26f74df4a47") (:keywords "homebrew" "brew" "ruby") (:authors ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainer "Alex Dunn" . "dunn.alex@gmail.com") (:url . "https://github.com/dunn/homebrew-mode"))])
- (honcho . [(20190623 2120) ((emacs (25 1)) (sudo-edit (0 1))) "Run and manage long-running services" single ((:commit . "d5e6206dd23ff9305d976c52845c750a064aca4b") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/honcho.el"))])
- (hookify . [(20141216 2209) ((s (1 9 0)) (dash (1 5 0))) "Interactive commands to create temporary hooks" single ((:commit . "21baae7393b07257de5796402fde0ca72fb00d77") (:keywords "hook" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/hookify"))])
- (horizon-theme . [(20200720 1832) ((emacs (24 3))) "A beautifully warm dual theme" single ((:commit . "9595549c514a9376c61d5d303405f6a6982e9e46") (:url . "https://github.com/aodhneine/horizon-theme.el"))])
- (horoscope . [(20180409 641) ((emacs (24))) "generate horoscopes." single ((:commit . "f4c683e991adce0a8f9023f15050f306f9b9a9ed") (:keywords "extensions" "games") (:authors ("Bob Manson" . "manson@cygnus.com")) (:maintainer "Noah Friedman" . "friedman@prep.ai.mit.edu") (:url . "https://github.com/mschuldt/horoscope.el"))])
- (hound . [(20200122 1700) ((request (0 2 0)) (cl-lib (0 5))) "Display hound search results in a compilation window" single ((:commit . "35e2cdc81fcc904b450a7ef3ec00fd25df6a4431") (:authors ("Ryan Young")) (:maintainer "Ryan Young"))])
- (hover . [(20200321 1819) ((emacs (24 5))) "Package to use hover with flutter" single ((:commit . "6f9ed1a6517e3a43ef2deafc2f86c70b2abce008") (:keywords "hover" "flutter" "mobile" "tools") (:authors ("Eric Dallo")) (:maintainer "Eric Dallo") (:url . "https://github.com/ericdallo/hover.el"))])
- (howdoi . [(20150204 43) nil "Instant coding answers via Emacs." tar ((:commit . "5fbf7069ee160c597a328e5ce5fb32920e1ca88f"))])
- (howdoyou . [(20191118 2222) ((emacs (25 1)) (promise (1 1)) (request (0 3 0)) (org (9 2))) "A stackoverflow and its sisters' sites reader" single ((:commit . "23407fb7a950f08498b5586062ba69962a20ea24") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/howdoyou/"))])
- (howm . [(20190818 1144) ((cl-lib (0 5))) "Wiki-like note-taking tool" tar ((:commit . "4f550d35935abc943e37e1f2da78c52218ac7c8d") (:authors ("HIRAOKA Kazuyuki" . "khi@users.osdn.me")) (:maintainer "HIRAOKA Kazuyuki" . "khi@users.osdn.me") (:url . "https://howm.osdn.jp"))])
- (hsluv . [(20181127 1206) ((seq (2 20))) "hsluv color space conversions" single ((:commit . "c3bc5228e30d66e7dee9ff1a0694c2b976862fc0") (:keywords "color" "hsluv") (:authors ("Geert Vermeiren")) (:maintainer "Geert Vermeiren") (:url . "https://github.com/hsluv/hsluv-emacs"))])
- (ht . [(20200217 2331) ((dash (2 12 0))) "The missing hash table library for Emacs" single ((:commit . "fff8c43f0e03d5b98deb9f988522b839ce2ca253") (:keywords "hash table" "hash map" "hash") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (html-check-frag . [(20160131 535) ((emacs (24 3))) "Check html-fragments" single ((:commit . "feb89765eafd69dfcf07afeebded8985dc456e7c") (:keywords "html") (:authors ("Tobias.Zawada" . "i@tn-home.de")) (:maintainer "Tobias.Zawada" . "i@tn-home.de"))])
- (html-script-src . [(20120403 1815) nil "Insert <script src=\"..\"> for popular JavaScript libraries" single ((:commit . "66460f8ab1b24656e6f3ce5bd50cff6a81be8422") (:keywords "tools" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/html-script-src"))])
- (html-to-hiccup . [(20190909 1549) ((emacs (25 1)) (dash (2 13 0)) (s (1 10 0))) "Convert HTML to Hiccup syntax" single ((:commit . "50a52e2b0d13d865187acdf775b8203d5003f2f1") (:keywords "html" "hiccup" "clojure") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:url . "https://github.com/plexus/html-to-hiccup"))])
- (html-to-markdown . [(20151105 840) ((cl-lib (0 5))) "HTML to Markdown converter written in Emacs-lisp." single ((:commit . "60c5498c801be186478cf7c05be05b4430c4a144") (:keywords "tools" "wp" "languages") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/html-to-markdown"))])
- (html2org . [(20170418 501) ((emacs (24 4))) "Convert html to org format text" single ((:commit . "6904aed40259ad8afccff079ebd8a07bff319ebc") (:keywords "convenience" "html" "org") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "http://github.com/lujun9972/html2org.el"))])
- (htmlize . [(20191111 2130) nil "Convert buffer text and decorations to HTML." single ((:commit . "86f22f211e9230857197c42a9823d3f05381deed") (:keywords "hypermedia" "extensions") (:authors ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainer "Hrvoje Niksic" . "hniksic@gmail.com") (:url . "https://github.com/hniksic/emacs-htmlize"))])
- (htmltagwrap . [(20190517 511) ((emacs (24 4))) "Wraps a chunk of HTML code in tags." single ((:commit . "35c62dd95c580fad49f84c5270cd69810455fedd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/htmltagwrap"))])
- (http . [(20181008 2121) ((emacs (24 4)) (request (0 2 0)) (edit-indirect (0 1 4))) "Yet another HTTP client" single ((:commit . "1bbfff5994e16ffc185c4ac28d792cb040da3351") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/http.el"))])
- (http-post-simple . [(20170715 940) nil "HTTP POST requests using the url library" single ((:commit . "f53697fca278c741051aeb668b00466b5e0fd3fe") (:keywords "comm" "data" "processes" "hypermedia") (:authors ("Tom Schutzer-Weissmann")) (:maintainer "Tom Schutzer-Weissmann"))])
- (http-twiddle . [(20160801 1911) nil "send & twiddle & resend HTTP requests" single ((:commit . "4d0c73b7dcbde8b483d4f3a75c49c74d2fe3ca45") (:keywords "http" "rest" "soap") (:authors ("Luke Gorrie" . "luke@synap.se")) (:maintainer "Hasan Veldstra" . "h@vidiowiki.com") (:url . "https://github.com/hassy/http-twiddle/blob/master/http-twiddle.el"))])
- (httpcode . [(20121002 345) nil "explains the meaning of an HTTP status code" single ((:commit . "a45e735082b09477cd704a99294d336cdbeb12ba") (:authors ("Ruslan Spivak" . "ruslan.spivak@gmail.com")) (:maintainer "Ruslan Spivak" . "ruslan.spivak@gmail.com") (:url . "http://github.com/rspivak/httpcode.el"))])
- (httprepl . [(20141101 1734) ((s (1 9 0)) (dash (2 5 0)) (emacs (24))) "An HTTP REPL" single ((:commit . "cfa3693267a8ed1c96a86a126823f37dbfe077d8") (:keywords "http" "repl") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:url . "https://github.com/gregsexton/httprepl.el"))])
- (hugsql-ghosts . [(20180425 1129) ((s (1 9 0)) (dash (2 10 0)) (cider (0 14 0))) "Display hugsql defqueries in clojure code as an overlay." single ((:commit . "f3ebc60c66204ad39058cb84eb4bd5facce091df") (:authors ("Roland Kaercher" . "roland.kaercher@gmail.com")) (:maintainer "Roland Kaercher" . "roland.kaercher@gmail.com") (:url . "https://github.com/rkaercher/hugsql-ghosts"))])
- (humanoid-themes . [(20200403 1939) ((emacs (24 3))) "Color themes with a dark and light variant" tar ((:commit . "22c9a0987c7d746d7eb9fe850f93f232d91cae14") (:keywords "faces" "color" "theme") (:authors ("Thomas Friese")) (:maintainer "Thomas Friese") (:url . "https://github.com/humanoid-colors/emacs-humanoid-themes"))])
- (hungarian-holidays . [(20161020 1138) nil "Adds a list of Hungarian public holidays to Emacs calendar" single ((:commit . "653108769279499d84a79267c90e640d98823872") (:keywords "calendar") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu"))])
- (hungry-delete . [(20200309 209) nil "hungry delete minor mode" single ((:commit . "4a341cfa3a19185c5ecb687970e299082e1144e3") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/hungry-delete"))])
- (hy-mode . [(20200730 2340) ((dash (2 13 0)) (dash-functional (1 2 0)) (s (1 11 0)) (emacs (24))) "Major mode for Hylang" tar ((:commit . "55e84cadbdb63427a8d531992df3990414a26688") (:keywords "languages" "lisp" "python") (:url . "http://github.com/hylang/hy-mode"))])
- (hyai . [(20170301 1447) ((cl-lib (0 5)) (emacs (24))) "Haskell Yet Another Indentation" single ((:commit . "9efad2ac6a57059b3be624588f649e276a96fdd4") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/hyai"))])
- (hydandata-light-theme . [(20190809 1925) nil "A light color theme that is easy on your eyes" single ((:commit . "180c3797fa7ef3e4bb679baaf5b492c33bbb9b8b") (:keywords "color-theme" "theme") (:authors ("David Chkhikvadze" . "david@chkhd.net")) (:maintainer "David Chkhikvadze" . "david@chkhd.net") (:url . "https://github.com/chkhd/hydandata-light-theme"))])
- (hyde . [(20160508 308) nil "Major mode to help create and manage Jekyll blogs" tar ((:commit . "a8cd6ed00ecd8d7de0ded2f4867015b412b15b76"))])
- (hydra . [(20200711 1210) ((cl-lib (0 5)) (lv (0))) "Make bindings that stick around." tar ((:commit . "112e689f75b59398d8eca79ac6562dca12b8a959") (:keywords "bindings") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/hydra"))])
- (hyperlist-mode . [(20200515 2209) ((emacs (24))) "A major-mode for viewing Hyperlists" single ((:commit . "374cdc04761df23e7a50ca276319ba9745cda9d7") (:keywords "outlines") (:authors ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:url . "https://github.com/vifon/hyperlist-mode"))])
- (hyperspace . [(20190908 550) ((emacs (25)) (s (1 12 0))) "Get there from here" single ((:commit . "825ac47887bf2f63e7dc2ecce264a52d9f0fae70") (:keywords "tools" "convenience") (:authors ("Ian Eure" . "ian@retrospec.tv")) (:maintainer "Ian Eure" . "ian@retrospec.tv") (:url . "https://github.com/ieure/hyperspace-el"))])
- (i2b2-mode . [(20140710 104) nil "Highlights corresponding PHI data in the text portion of an i2b2 XML Document." single ((:commit . "db10efcfc8bed369a516bbf7526ede41f98cb95a") (:keywords "xml" "phi" "i2b2" "deidi2b2") (:authors ("Dan LaManna" . "dan.lamanna@gmail.com")) (:maintainer "Dan LaManna" . "dan.lamanna@gmail.com"))])
- (i3wm . [(20170822 1438) nil "i3wm integration library" single ((:commit . "71391dc61063fee77ad174f3b2ca25c60b41009e") (:keywords "convenience" "extensions") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:url . "https://git.flintfam.org/swf-projects/emacs-i3"))])
- (ialign . [(20200711 1117) ((emacs (24 4))) "visual align-regexp" single ((:commit . "eca40b8b59ea713dba21b18f5b047a6c086b91dc") (:keywords "tools" "editing" "align" "interactive") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:url . "https://github.com/mkcms/interactive-align"))])
- (iasm-mode . [(20171023 1422) nil "interactive assembly major mode." single ((:commit . "abbec7f308f9ce97beeb57e459fff35f559b4c18") (:keywords ":" "tools") (:authors ("Rémi Attab" . "remi.attab@gmail.com")) (:maintainer "Rémi Attab" . "remi.attab@gmail.com") (:url . "https://github.com/RAttab/iasm-mode"))])
- (ibuffer-git . [(20110508 731) nil "show git status in ibuffer column" single ((:commit . "d326319c05ddb8280885b31f9094040c1b365876") (:keywords "convenience") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us"))])
- (ibuffer-project . [(20200210 2252) ((emacs (25 1))) "Group ibuffer's list by project or any function" single ((:commit . "8cc8c96cb15874dd55cdbfce759f528de0046f9f") (:keywords "tools") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:url . "https://github.com/muffinmad/emacs-ibuffer-project"))])
- (ibuffer-projectile . [(20200304 2205) ((projectile (0 11 0)) (emacs (24 1))) "Group ibuffer's list by projectile root" single ((:commit . "504b0edaa0d937ce60ccc8fdf09f2dae0a90fbaf") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "http://github.com/purcell/ibuffer-projectile"))])
- (ibuffer-rcirc . [(20150215 2118) ((cl-lib (0 2))) "Ibuffer integration for rcirc" single ((:commit . "8a4409b1c679d65c819dee4085faf929840e79f8") (:keywords "buffer" "convenience" "comm") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:url . "https://github.com/fgallina/ibuffer-rcirc"))])
- (ibuffer-sidebar . [(20180219 131) ((emacs (25 1))) "Sidebar for `ibuffer'" single ((:commit . "7ddf1b5a158b33e9a7d3fe5dad7ea626a464d2bc") (:keywords "ibuffer" "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/ibuffer-sidebar"))])
- (ibuffer-tramp . [(20151118 1739) nil "Group ibuffer's list by TRAMP connection" single ((:commit . "bcad0bda3a67f55d1be936bf8fa9ef735fe1e3f3") (:keywords "convenience") (:authors ("Svend Sorensen" . "svend@ciffer.net")) (:maintainer "Svend Sorensen" . "svend@ciffer.net") (:url . "http://github.com/svend/ibuffer-tramp"))])
- (ibuffer-vc . [(20200304 2207) ((emacs (24 1)) (cl-lib (0 2))) "Group ibuffer's list by VC project, or show VC status" single ((:commit . "1249c1e30cf11badfe032ac3b1058f24ba510ace") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "http://github.com/purcell/ibuffer-vc"))])
- (iceberg-theme . [(20200515 934) ((emacs (26 1)) (solarized-theme (1 3))) "Well-designed, eye-friendly, dark blue color scheme" single ((:commit . "9615307cbd37e698d6939a04128162ef893313cb") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/iceberg-theme.el"))])
- (icomplete-vertical . [(20200616 2322) ((emacs (24 4))) "Display icomplete candidates vertically" single ((:commit . "a5871d39c5850ac4d9aac48350eaa1d31f3aaef7") (:keywords "convenience" "completion") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:url . "https://github.com/oantolin/icomplete-vertical"))])
- (icsql . [(20190815 501) ((emacs (26)) (choice-program (0 8)) (buffer-manage (0 10))) "Interactive iSQL iteraface to ciSQL." single ((:commit . "5e5cd04e3f3ad9963c29759293c1f7a54257866b") (:keywords "isql" "sql" "rdbms" "data") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/icsql"))])
- (id-manager . [(20170320 1246) nil "id-password management" single ((:commit . "14ebc35db298aac4dedc8aa188bc46bacab81f3b") (:keywords "password" "convenience") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>"))])
- (idea-darkula-theme . [(20160416 2303) ((emacs (24 1))) "Color theme based on IntelliJ IDEA Darkula color theme" single ((:commit . "52602d9b91883e1f297d000951aeed48bf60176e") (:keywords "themes") (:authors ("Alexey Veretennikov <alexey dot veretennikov at gmail dot com>")) (:maintainer "Alexey Veretennikov <alexey dot veretennikov at gmail dot com>") (:url . "http://github.com/fourier/idea-darkula-theme"))])
- (identica-mode . [(20130204 2253) nil "Major mode API client for status.net open microblogging" tar ((:commit . "cf9183ee11ac922e85c7c908f04e2d00b03111b3") (:keywords "identica" "web") (:authors ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com") (:url . "http://blog.gabrielsaldana.org/identica-mode-for-emacs/"))])
- (idle-highlight-in-visible-buffers-mode . [(20181027 1531) nil "highlight the word the point is on" single ((:commit . "8d8de309d5bd4b035c01bf7f0cfc6e079c79d898") (:keywords "convenience") (:authors ("Ignacy Moryc")) (:maintainer "Ignacy Moryc") (:url . "https://github.com/ignacy/idle-highlight-in-visible-buffers"))])
- (idle-highlight-mode . [(20120920 1648) nil "highlight the word the point is on" single ((:commit . "c466f2a9e291f9da1167dc879577b2e1a7880482") (:keywords "convenience") (:authors ("Phil Hagelberg, Cornelius Mika")) (:maintainer "Phil Hagelberg, Cornelius Mika") (:url . "http://www.emacswiki.org/cgi-bin/wiki/IdleHighlight"))])
- (idle-org-agenda . [(20190106 1844) nil "Shows your agenda when editor is idle." single ((:commit . "8e6052fc4923c30132052d67d794b76c92851c20") (:keywords "org" "org-mode" "org-agenda" "calendar") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "Enis Özgen" . "mail@enisozgen.com") (:url . "https://github.com/enisozgen/idle-org-agenda"))])
- (idle-require . [(20090715 2203) nil "load elisp libraries while Emacs is idle" single ((:commit . "33592bb098223b4432d7a35a1d65ab83f47c1ec1") (:keywords "internal") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/idle-require/"))])
- (ido-at-point . [(20151021 757) ((emacs (24))) "ido-style completion-at-point" single ((:commit . "e5907bbe8a3d148d07698b76bd994dc3076e16ee") (:keywords "convenience" "abbrev") (:authors ("katspaugh")) (:maintainer "katspaugh") (:url . "https://github.com/katspaugh/ido-at-point"))])
- (ido-complete-space-or-hyphen . [(20180929 150) nil "Complete SPACE or HYPHEN when type SPACE in ido" single ((:commit . "ed60ebed113e4e1552efeab0c416f7c88428268e") (:keywords "ido" "completion") (:authors ("Ian Yang <me (at) iany.me>")) (:maintainer "Ian Yang <me (at) iany.me>") (:url . "https://github.com/doitian/ido-complete-space-or-hyphen"))])
- (ido-completing-read+ . [(20200520 1535) ((emacs (24 4)) (seq (0 5)) (cl-lib (0 5)) (memoize (1 1))) "A completing-read-function using ido" single ((:commit . "b9ca2566b867464c25b720e2148d240961c110e7") (:keywords "ido" "completion" "convenience") (:authors ("Ryan Thompson")) (:maintainer "Ryan Thompson") (:url . "https://github.com/DarwinAwardWinner/ido-completing-read-plus"))])
- (ido-exit-target . [(20170717 1851) ((emacs (24 4))) "Commands and keys for selecting other window and frame targets within ido" single ((:commit . "e56fc6928649c87ccf39d56d84ab53ebaced1f73") (:keywords "convenience" "tools" "extensions") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/ido-exit-target"))])
- (ido-flex-with-migemo . [(20190408 350) ((flx-ido (0 6 1)) (migemo (1 9 1)) (emacs (24 4))) "use ido with flex and migemo" single ((:commit . "da64f2fe3849492d35e155d81a817308a4853473") (:keywords "matching") (:authors ("ROCKTAKEY " . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY " . "rocktakey@gmail.com") (:url . "https://github.com/ROCKTAKEY/ido-flex-with-migemo"))])
- (ido-gnus . [(20140216 1646) ((gnus (5 13))) "Access gnus groups or servers using ido" single ((:commit . "f5fe3f6aa8086f675ba216abace9e3d5f2e3a089") (:keywords "comm") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/ido-gnus"))])
- (ido-grid-mode . [(20160122 1139) ((emacs (24 4))) "Display ido-prospects in the minibuffer in a grid." single ((:commit . "7cfca3988a6dc3ad18e28abe114218095ff2366f") (:keywords "convenience") (:authors ("Tom Hinton")) (:maintainer "Tom Hinton" . "t@larkery.com") (:url . "https://github.com/larkery/ido-grid-mode.el"))])
- (ido-hacks . [(20190206 2153) nil "Put more IDO in your IDO" single ((:commit . "d2153a3e8d23436ee07ecae2a106f434361a10c5") (:keywords "convenience") (:authors ("Andreas Politz")) (:maintainer "Scott Jaderholm" . "jaderholm@gmail.com"))])
- (ido-load-library . [(20140611 1600) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Load-library alternative using ido-completing-read" single ((:commit . "e03b55957c93aa1a7dd190e173e16ec59dbb2ba7") (:keywords "maint" "completion") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/ido-load-library"))])
- (ido-migemo . [(20191017 1919) ((migemo (1 9 1))) "Migemo plug-in for Ido" single ((:commit . "09a2cc175b500cab7655a25ffc982e78d46ca669") (:keywords "files") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/ido-migemo.el"))])
- (ido-occasional . [(20150214 1248) ((emacs (24 1))) "Use ido where you choose." single ((:commit . "d405f1795e1e0c63be411ee2825184738d29c33a") (:keywords "completion") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/ido-occasional"))])
- (ido-select-window . [(20131220 2047) ((emacs (24 1))) "Select a window using ido and buffer names" single ((:commit . "a64707d8d154664d50d12e26417d586e4c3dd78b") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/ido-select-window"))])
- (ido-skk . [(20151111 950) ((emacs (24 4)) (ddskk (20150912 1820))) "ido interface for skk henkan" single ((:commit . "89a2e62799bff2841ff634517c86084c4ce69246") (:keywords "languages") (:authors ("tsukimizake <shomasd_at_gmail.com>")) (:maintainer "tsukimizake <shomasd_at_gmail.com>") (:url . "https://github.com/tsukimizake/ido-skk"))])
- (ido-sort-mtime . [(20171121 859) nil "Sort Ido's file list by modification time" single ((:commit . "f638ff0c922af862f5211779f2311a27fde428eb") (:keywords "convenience" "files") (:authors ("Paweł Kraśnicki")) (:maintainer "Paweł Kraśnicki"))])
- (ido-springboard . [(20170106 755) nil "Temporarily change default-directory for one command" single ((:commit . "687d1e5898a880878995dc9bffe93b4598366203") (:keywords "ido") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:url . "https://github.com/jwiegley/springboard"))])
- (ido-vertical-mode . [(20180618 2101) nil "Makes ido-mode display vertically." single ((:commit . "16c4c1a112796ee0bcf401ea39d3e2643a89feaf") (:keywords "convenience") (:authors ("Steven Degutis")) (:maintainer "Christopher Reichert" . "creichert07@gmail.com") (:url . "https://github.com/creichert/ido-vertical-mode.el"))])
- (ido-yes-or-no . [(20161108 2351) ((ido-completing-read+ (0))) "Use Ido to answer yes-or-no questions" single ((:commit . "c55383b1fce5879e87e7ca6809fc60534508e182") (:keywords "convenience" "completion" "ido") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/ido-yes-or-no"))])
- (idomenu . [(20141123 2120) nil "imenu tag selection a la ido" single ((:commit . "4b0152d606360c70204fb4c27f68de79ca885386") (:authors ("Georg Brandl" . "georg@python.org")) (:maintainer "Georg Brandl" . "georg@python.org"))])
- (idris-mode . [(20200522 808) ((emacs (24)) (prop-menu (0 1)) (cl-lib (0 5))) "Major mode for editing Idris code" tar ((:commit . "b77eadd8ac2048d5c882b4464bd9673e45dd6a59") (:keywords "languages") (:url . "https://github.com/idris-hackers/idris-mode"))])
- (ids-edit . [(20170818 1502) ((emacs (24 3))) "IDS (Ideographic Description Sequence) editing tool" tar ((:commit . "8562a6cbfb3f2d44bc6f62ab15081a80f8fee502") (:keywords "i18n" "wp") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "http://github.com/kawabata/ids-edit"))])
- (iedit . [(20200719 601) nil "Edit multiple regions in the same way simultaneously." tar ((:commit . "77eb0a1e2e44b453e4ebf4c38409affa353f5139") (:keywords "occurrence" "region" "simultaneous" "refactoring") (:authors ("Victor Ren" . "victorhge@gmail.com")) (:maintainer "Victor Ren" . "victorhge@gmail.com") (:url . "https://www.emacswiki.org/emacs/Iedit"))])
- (ietf-docs . [(20190420 851) nil "Fetch, Cache and Load IETF documents" single ((:commit . "ae157549eae5ec78dcbf215c2f48cb662b73abd0") (:keywords "ietf" "rfc") (:authors ("Christian E. Hopps" . "chopps@gmail.com")) (:maintainer "Christian E. Hopps" . "chopps@gmail.com") (:url . "https://github.com/choppsv1/ietf-docs"))])
- (iflipb . [(20200731 1655) nil "Interactively flip between recently visited buffers" single ((:commit . "d48884212499cd128d103c5ceba3173a90ebd2b4") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net") (:url . "https://github.com/jrosdahl/iflipb"))])
- (ignoramus . [(20160414 1409) nil "Ignore backups, build files, et al." single ((:commit . "b37dc7c07edd9d152436f9019c14df158b599be3") (:keywords "convenience" "tools") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/ignoramus"))])
- (igv . [(20141210 1227) nil "Control Integrative Genomic Viewer within Emacs" single ((:commit . "47ac6ceede252f451348a2c696398c0cb5279555") (:authors ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainer "Stefano Barbi" . "stefanobarbi@gmail.com"))])
- (image+ . [(20150707 1616) ((cl-lib (0 3))) "Image manipulate extensions for Emacs" single ((:commit . "6834d0c09bb4df9ecc0d7a559bd7827fed48fffc") (:keywords "multimedia" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-imagex"))])
- (image-archive . [(20150621 132) ((emacs (24)) (cl-lib (0 5))) "Image thumbnails in archive file with non-blocking" single ((:commit . "8d29535bd832329ffeeac780aae7aa8919af1175") (:keywords "multimedia") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-image-archive"))])
- (image-dired+ . [(20150430 544) ((cl-lib (0 3))) "Image-dired extensions" single ((:commit . "b68094625d963056ad64e0e44af0e2266b2eadc7") (:keywords "extensions" "multimedia") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-image-diredx"))])
- (imakado . [(20141024 923) nil "imakado's usefull macros and functions" single ((:commit . "00a1e7eea2cb9e9066343a23927d6c747707902f") (:keywords "convenience") (:authors ("imakado <ken.imakado_at_gmail.com>")) (:maintainer "imakado") (:url . "https://github.com/imakado/emacs-imakado"))])
- (imake . [(20200103 1238) ((emacs (24 3))) "Simple, opinionated make target runner" single ((:commit . "100d62c7095743fadddfad5b9e0740ee386ba4cf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/imake"))])
- (imapfilter . [(20180318 2027) nil "run the imapfilter executable" single ((:commit . "79bbbe918319bc1e8f42a0bef53dc7c77fe868ea") (:keywords "mail") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/imapfilter"))])
- (imenu-anywhere . [(20190512 1939) ((cl-lib (0 5)) (emacs (25))) "ido/ivy/helm imenu across same mode/project/etc buffers" single ((:commit . "88b0e120284058b32252e4b0ed1a07c9fe44092f") (:keywords "ido" "imenu" "tags") (:authors ("Vitalie Spinu <spinuvit.list[ aaattt ]gmail[ dot ]com>")) (:maintainer "Vitalie Spinu <spinuvit.list[ aaattt ]gmail[ dot ]com>") (:url . "https://github.com/vitoshka/imenu-anywhere"))])
- (imenu-list . [(20190115 2130) ((cl-lib (0 5))) "Show imenu entries in a separate buffer" single ((:commit . "46008738f8fef578a763c308cf6695e5b4d4aa77") (:authors ("Bar Magal (2015)")) (:maintainer "Bar Magal (2015)") (:url . "https://github.com/bmag/imenu-list"))])
- (imenus . [(20200730 855) ((cl-lib (0 5))) "Imenu for multiple buffers and without subgroups" single ((:commit . "90200f5f22377903b405082eabe185447968f3e2") (:keywords "tools" "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/imenus.el"))])
- (imgbb . [(20180609 1649) ((emacs (24)) (request (0 3 0))) "Simple image upload client for imgbb.com" single ((:commit . "a524a46263835aa474f908827ebab4e8fa586001") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:url . "https://github.com/ecraven/imgbb.el"))])
- (immaterial-theme . [(20200721 802) ((emacs (25))) "A flexible theme based on material design principles" tar ((:commit . "ea1190b51bb8a2548871f1e67d0259d290eeebbc") (:keywords "themes") (:authors ("Peter Gardfjäll")) (:maintainer "Peter Gardfjäll") (:url . "https://github.com/petergardfjall/emacs-immaterial-theme"))])
- (immortal-scratch . [(20160517 2118) nil "respawn the scratch buffer when it's killed" single ((:commit . "faeab0ad6c33c74c0cbd1dfcebffaa0690de40c6") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))])
- (immutant-server . [(20140311 2208) nil "Run your Immutant server in Emacs" single ((:commit . "2a21e65588acb6a976f2998e30b21fdabdba4dbb") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/immutant-server.el"))])
- (impatient-mode . [(20200723 2117) ((emacs (24 3)) (simple-httpd (1 5 0)) (htmlize (1 40))) "Serve buffers live over HTTP" tar ((:commit . "cbddfd54242210df3e1c3b590fada5bb5423f5ed") (:authors ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainer "Brian Taylor" . "el.wubo@gmail.com") (:url . "https://github.com/netguy204/imp.el"))])
- (import-js . [(20180709 1833) ((grizzl (0 1 0)) (emacs (24))) "Import Javascript dependencies" single ((:commit . "fb1f167e33c388b09a2afd32fbda90a67bfb2e40") (:keywords "javascript") (:authors ("Kevin Kehl" . "kevin.kehl@gmail.com")) (:maintainer "Kevin Kehl" . "kevin.kehl@gmail.com") (:url . "http://github.com/Galooshi/emacs-import-js/"))])
- (import-popwin . [(20170218 1407) ((emacs (24 3)) (popwin (0 6))) "popwin buffer near by import statements with popwin" single ((:commit . "bb05a9e226f8c63fe7b18a3e92010357049ab5ba") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-import-popwin"))])
- (importmagic . [(20180520 303) ((f (0 11 0)) (epc (0 1 0)) (emacs (24 3))) "Fix Python imports using importmagic." tar ((:commit . "701dfcca5f3ab42be0f26a8d381d7116c79be850") (:keywords "languages" "convenience") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com") (:url . "https://github.com/anachronic/importmagic.el"))])
- (indent-guide . [(20191106 240) nil "show vertical lines to guide indentation" single ((:commit . "7fc710748f9e5a086acfe77970f117df89ee9749") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (indent-info . [(20200128 1052) ((emacs (24 3))) "Show indentation information in status bar" single ((:commit . "9548f14e7f0f7220d6cd1b8e88756b89fc57c471") (:keywords "convenience" "tools") (:authors ("Terje Larsen" . "terlar@gmail.com")) (:maintainer "Terje Larsen" . "terlar@gmail.com") (:url . "https://github.com/terlar/indent-info.el"))])
- (indent-lint . [(20200129 2046) ((emacs (25 1)) (async-await (1 0)) (async (1 9 4))) "Async indentation checker" single ((:commit . "23ef4bab5509e2e7fb1f4a194895a9510fa7c797") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/indent-lint.el"))])
- (indent-tools . [(20190606 1642) ((s (0)) (hydra (0)) (yafolding (0))) "Indent, navigate (and more) by blocks of indentation: yaml, python etc." tar ((:commit . "c419874e6fb296ecdba94b2f4b73c9eecdd5329d") (:keywords "indentation" "movements" "navigation" "kill" "fold" "yaml" "python") (:authors ("vindarel" . "vindarel@mailz.org")) (:maintainer "vindarel" . "vindarel@mailz.org") (:url . "https://gitlab.com/emacs-stuff/indent-tools/"))])
- (indian-ext . [(20190424 1547) ((emacs (24))) "Extension to Indian language utilities" single ((:commit . "c941cde1205642c6b933ae6abbc47d199f609df0") (:keywords "i18n" "tools" "wp" "indian" "devanagari" "encoding") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:url . "https://github.com/paddymcall/indian-ext"))])
- (indicators . [(20161211 1126) ((dash (2 13 0)) (cl-lib (0 5 0))) "Display the buffer relative location of line in the fringe." single ((:commit . "f62a1201f21453e3aca93f48483e65ae8251432e") (:keywords "fringe" "frames") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/indicators.el"))])
- (indium . [(20200116 1247) ((emacs (25)) (seq (2 16)) (js2-mode (20140114)) (js2-refactor (0 9 0)) (company (0 9 0)) (json-process-client (0 2 0))) "JavaScript Awesome Development Environment" tar ((:commit . "59f12cb1bc73bb399e00b2c6c69d21bdcb9c0955") (:keywords "tools" "javascript") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://github.com/NicolasPetton/indium"))])
- (indy . [(20190807 625) nil "A minor mode and EDSL to manage your mode's indentation rules." single ((:commit . "abc5bee424780ad2de5520f8fefbf8e120c0d9ed") (:keywords "convenience" "matching" "tools") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com"))])
- (inf-clojure . [(20200727 1804) ((emacs (24 4)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" single ((:commit . "477fd7c03a2d7d1c83628db54abf34f5337bc3db") (:keywords "processes" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))])
- (inf-crystal . [(20180119 211) ((emacs (24 3)) (crystal-mode (0 1 0))) "Run a Inferior-Crystal process in a buffer" single ((:commit . "02007b2a2a3bea44902d7c83c4acba1e39d278e3") (:keywords "languages" "crystal") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:url . "https://github.com/brantou/inf-crystal.el"))])
- (inf-mongo . [(20180408 1338) nil "Run a MongoDB shell process in a buffer" single ((:commit . "2e498d1c88bd1904eeec18ed06b1a0cf8bdc2a92") (:keywords "databases" "mongodb") (:authors ("Tobias Svensson")) (:maintainer "Tobias Svensson") (:url . "http://github.com/endofunky/inf-mongo"))])
- (inf-ruby . [(20200730 1456) nil "Run a Ruby process in a buffer" single ((:commit . "9f0f79ff459c7c417e8931ca020db121e24b45b5") (:keywords "languages" "ruby") (:authors ("Yukihiro Matsumoto") ("Nobuyoshi Nakada") ("Cornelius Mika" . "cornelius.mika@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru") ("Kyle Hargraves" . "pd@krh.me")) (:maintainer "Yukihiro Matsumoto") (:url . "http://github.com/nonsequitur/inf-ruby"))])
- (inflections . [(20170913 916) ((cl-lib (0 5)) (emacs (24))) "convert english words between singular and plural" single ((:commit . "e4f1372cf22e811faca52fc86bdd5d817498a4d8") (:keywords "languages" "tools" "wp") (:authors ("Dmitry Galinsky, Howard Yeh")) (:maintainer "Dmitry Galinsky, Howard Yeh") (:url . "https://github.com/eschulte/jump.el"))])
- (info-beamer . [(20180604 2122) ((emacs (24 4))) "Utilities for working with info-beamer" single ((:commit . "97db34d23cb05b23e50c15875ee84f5d3236e0db") (:keywords "tools" "processes" "comm") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:url . "https://github.com/dakra/info-beamer.el"))])
- (info-buffer . [(20170112 1422) nil "Display info topics in separate buffers" single ((:commit . "d35dad6e766c6e2ddb8dc6acb4ce5b6e10fbcaa7") (:keywords "docs" "info") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainer "Lluís Vilanova" . "vilanova@ac.upc.edu") (:url . "http://www.github.com/llvilanova/info-buffer"))])
- (info-colors . [(20200125 1447) ((emacs (24)) (cl-lib (0 5))) "Extra colors for Info-mode" single ((:commit . "47ee73cc19b1049eef32c9f3e264ea7ef2aaf8a5") (:keywords "faces") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:url . "https://github.com/ubolonton/info-colors"))])
- (info-rename-buffer . [(20200328 1450) ((emacs (24 3))) "Rename Info buffers to match manuals" single ((:commit . "87fb263b18717538fd04878e3358e1e720415db8") (:keywords "help") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:url . "https://github.com/oitofelix/info-rename-buffer"))])
- (inform . [(20200723 500) ((emacs (25 1))) "Symbol links in Info buffers to their help documentation." tar ((:commit . "8ff0a19a9f40cfa8283da8ed73de94c35a327423") (:url . "https://github.com/dieter-wilhelm/inform") (:maintainer "H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")) (:keywords "help" "docs" "convenience"))])
- (inform7 . [(20200430 1539) ((emacs (24 3)) (s (1 12 0))) "Major mode for working with Inform 7 files" single ((:commit . "a409bbc6f04264f7f00616a995fa6ecf59d33d0d") (:keywords "languages") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:url . "https://github.com/GuiltyDolphin/inform7-mode"))])
- (inherit-local . [(20170409 1649) ((emacs (24 3))) "Inherited buffer-local variables" single ((:commit . "b1f4ff9c41f9d64e4adaf5adcc280b82f084cdc7") (:authors ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/inherit-local/tree-master/"))])
- (ini-mode . [(20170424 909) nil "Major mode for Windows-style ini files." single ((:commit . "2194cfa2fd13196a37350ec20b3f00dcf6162b7c") (:keywords "languages" "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/ini-mode"))])
- (init-loader . [(20200520 2345) nil "Loader for configuration files" single ((:commit . "44829fa70f5c4cba03d36db5fa2c969001325b91") (:authors ("IMAKADO" . "ken.imakado@gmail.com")) (:maintainer "IMAKADO" . "ken.imakado@gmail.com") (:url . "https://github.com/emacs-jp/init-loader/"))])
- (init-open-recentf . [(20200321 737) ((emacs (24 4))) "Invoke a command immediately after startup" single ((:commit . "369304d6adb6875948c4534419c4f303ac23c4f6") (:keywords "files" "recentf" "after-init-hook") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/init-open-recentf.el"))])
- (initsplit . [(20160919 1818) nil "code to split customizations into different files" single ((:commit . "c941d436eb2b10b01c76a582c5a2b23fb30751aa") (:keywords "lisp") (:authors ("John Wiegley <johnw@gnu.org>, Dave Abrahams" . "dave@boostpro.com")) (:maintainer "John Wiegley <johnw@gnu.org>, Dave Abrahams" . "dave@boostpro.com") (:url . "http://www.gci-net.com/users/j/johnw/emacs.html"))])
- (ink-mode . [(20200611 1807) ((emacs (26 1))) "Major mode for writing interactive fiction in Ink" tar ((:commit . "f610a2e7a5a5b176bdc831c66e52f85dc0e7e450") (:keywords "languages" "wp" "hypermedia") (:authors ("Erik Sjöstrand") ("Damien Picard")) (:maintainer "Damien Picard") (:url . "https://github.com/Kungsgeten/ink-mode"))])
- (inkpot-theme . [(20200616 434) nil "port of vim's inkpot theme" single ((:commit . "0a5f50c3aa590404ae81cdb08eb869ffc04da625") (:keywords "color" "theme") (:authors ("Sarah Iovan" . "sarah@hwaetageek.com") ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Sarah Iovan" . "sarah@hwaetageek.com") (:url . "https://github.com/ideasman42/emacs-inkpot-theme"))])
- (inline-crypt . [(20170824 900) nil "Simple inline encryption via openssl" tar ((:commit . "281385b383f850fd2e895926b1cef804dd052633"))])
- (inline-docs . [(20170523 450) ((emacs (24 3))) "Show inline contextual docs." single ((:commit . "b57f1681be6147f999cdc12abff414a0442e8897") (:keywords "inline" "docs" "overlay") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:url . "https://github.com/stardiviner/inline-docs.el"))])
- (inlineR . [(20191017 1920) nil "insert Tag for inline image of R graphics" single ((:commit . "bf6450a3540aa3538546d312324c41befd0a4e54") (:keywords "convenience" "iimage.el" "cacoo.el") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/inlineR.el"))])
- (insert-kaomoji . [(20200325 2248) ((emacs (24 4))) "Easily insert kaomojis" tar ((:commit . "d18423f78cc02ba866b1a1dfb0617476cd941c54") (:keywords "wp") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:url . "https://git.sr.ht/~zge/kaomoji"))])
- (insert-shebang . [(20180403 1214) nil "Insert shebang line automatically." single ((:commit . "af5f95ff98e2432837f5aa848ba38dd626e82fce") (:keywords "shebang" "tool" "convenience") (:authors ("Sachin Patil" . "iclcoolster@gmail.com")) (:maintainer "Sachin Patil" . "iclcoolster@gmail.com") (:url . "http://github.com/psachin/insert-shebang"))])
- (insfactor . [(20141117 2) nil "Client for a Clojure project with insfactor in it" single ((:commit . "7ef5446cebb08a17d4106d2e6f3c053e49e1e829") (:keywords "clojure") (:authors ("John D. Hume" . "duelin.markers@gmail.com")) (:maintainer "John D. Hume" . "duelin.markers@gmail.com") (:url . "http://github.com/duelinmarkers/insfactor.el"))])
- (instapaper . [(20110419 1355) nil "No description available." single ((:commit . "f21531bcb935e7e9b9e8df83dd0e0838adbf9b1b"))])
- (intel-hex-mode . [(20180423 31) nil "Mode for Intel Hex files." single ((:commit . "e83c94e1c31a8435a88b3ae395f2bc842ef83217") (:keywords "tools" "hex") (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:url . "https://github.com/mschuldt/intel-hex-mode"))])
- (intellij-theme . [(20171017 1415) nil "Inspired by IntelliJ's default theme" single ((:commit . "1bbfff8e6742d18e9b77ed796f44da3b7bd10606") (:keywords "faces") (:authors ("Vladimir Polushin" . "vovapolu@gmail.com")) (:maintainer "Vladimir Polushin" . "vovapolu@gmail.com"))])
- (interaction-log . [(20160305 1301) ((cl-lib (0))) "exhaustive log of interactions with Emacs" single ((:commit . "a49a06746d4df6bcfceec3c48dece065d635f9f9") (:keywords "convenience") (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") (:url . "https://github.com/michael-heerdegen/interaction-log.el"))])
- (interleave . [(20191129 958) nil "Interleaving text books since 2015" single ((:commit . "383eb955bf0084a6e6ec03c9bd34511e20e0407d") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com") (:url . "https://github.com/rudolfochrist/interleave"))])
- (intero . [(20200125 848) ((flycheck (0 25)) (company (0 8)) (emacs (24 4)) (haskell-mode (13 0))) "Complete development mode for Haskell" single ((:commit . "fdb0550a2ddb5692d470336aa4a057717d572695") (:keywords "haskell" "tools") (:authors ("Chris Done" . "chrisdone@fpcomplete.com")) (:maintainer "Chris Done" . "chrisdone@fpcomplete.com") (:url . "https://github.com/commercialhaskell/intero"))])
- (interval-list . [(20150327 1718) ((dash (2 4 0)) (cl-lib (0 5)) (emacs (24 4))) "Interval list data structure for 1D selections" single ((:commit . "38af7ecf0a493ad8f487074938a2a115f3531177") (:keywords "extensions" "data structure") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/interval-list"))])
- (interval-tree . [(20130325 1407) ((dash (1 1 0))) "Interval tree data structure for 1D range queries" single ((:commit . "301302f480617091cf3ab6989caac385d52543dc") (:keywords "extensions" "data structure") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/interval-tree"))])
- (inverse-acme-theme . [(20170823 254) ((autothemer (0 2)) (cl-lib (0 5))) "A theme that looks like an inverse of Acme's color scheme." single ((:commit . "74d6f3e2f6534371509dd2d77006435156c276d6") (:authors ("Dylan Johnson")) (:maintainer "Dylan Johnson") (:url . "http://github.com/djohnson/inverse-acme-theme"))])
- (io-mode . [(20161004 756) nil "Major mode to edit Io language files in Emacs" single ((:commit . "fd65ae769093defcf554d6d637eba6e6dfc29f56") (:keywords "languages" "io") (:authors ("Sergei Lebedev" . "superbobry@gmail.com")) (:maintainer "Sergei Lebedev" . "superbobry@gmail.com") (:url . "https://github.com/superbobry/io-mode"))])
- (io-mode-inf . [(20140128 1934) nil "Interaction with an Io interpreter." single ((:commit . "6dd2bac3fd87484bb7d97e135b06c29d70b444b6") (:keywords "io" "languages") (:url . "https://github.com/slackorama/io-emacs"))])
- (ioccur . [(20200326 1341) ((emacs (24)) (cl-lib (0 5))) "Incremental occur" single ((:commit . "59350b2066d61444f93c8a51b16353e746486e4c") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/ioccur"))])
- (iodine-theme . [(20151031 1639) ((emacs (24))) "A light emacs color theme" single ((:commit . "02fb780e1d8d8a6b9c709bfac399abe1665c6999") (:keywords "themes") (:authors ("Srđan Panić" . "srdja.panic@gmail.com")) (:maintainer "Srđan Panić" . "srdja.panic@gmail.com") (:url . "https://github.com/srdja/iodine-theme"))])
- (ipcalc . [(20170926 805) ((cl-lib (0 5))) "IP subnet calculator" single ((:commit . "2720f7e3e662e04e195f8338b81a499cf321296a") (:keywords "networking" "tools") (:authors ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainer "\"Aleksandar Simic\"" . "asimic@gmail.com") (:url . "http://github.com/dotemacs/ipcalc.el"))])
- (iplayer . [(20161120 2120) nil "Browse and download BBC TV/radio shows" single ((:commit . "b788fffa4b36bbd558047ffa6be51b1f0f462f23") (:keywords "multimedia" "bbc") (:authors ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainer "Christophe Rhodes" . "csr21@cantab.net") (:url . "https://github.com/csrhodes/iplayer-el"))])
- (ipretty . [(20180606 522) nil "Interactive Emacs Lisp pretty-printing" single ((:commit . "042f5cc4e6f81d59115e8335c582bb5c571c2585") (:keywords "pretty-print" "elisp" "buffer") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://framagit.org/steckerhalter/ipretty"))])
- (ipython-shell-send . [(20190220 2246) ((emacs (24))) "Send code (including magics) to ipython shell" single ((:commit . "0faed86faff02a361f23ce5fc923d0e9b09bb2da") (:keywords "tools" "processes") (:authors ("Jack Kamm" . "jackkamm@gmail.com")) (:maintainer "Jack Kamm" . "jackkamm@gmail.com") (:url . "https://github.com/jackkamm/ipython-shell-send-el"))])
- (iqa . [(20200520 1137) ((emacs (24 3))) "Init file(and directory) Quick Access" single ((:commit . "c1077aca6553cb2011f21b178e10271a17fe4f58") (:url . "https://github.com/a13/iqa.el"))])
- (ir-black-theme . [(20130303 755) nil "Port of ir-black theme" single ((:commit . "36e930d107604b5763c80294a6f92aaa02e6c272") (:keywords "faces") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com"))])
- (iregister . [(20150515 2107) nil "Interactive register commands for Emacs." tar ((:commit . "6a48c66187289de5f300492be11c83e98410c018") (:keywords "convenience") (:authors ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com") (:url . "https://github.com/atykhonov/iregister.el"))])
- (irony . [(20200130 849) ((cl-lib (0 5)) (json (1 2))) "C/C++ minor mode powered by libclang" tar ((:commit . "1e1aabaa686a08767ab33e5cd43ce8f0ebf8d020") (:keywords "c" "convenience" "tools") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:url . "https://github.com/Sarcasm/irony-mode"))])
- (irony-eldoc . [(20200622 2214) ((emacs (24)) (cl-lib (0 5)) (irony (0 1))) "irony-mode support for eldoc-mode" single ((:commit . "73e79a89fad982a2ba072f2fcc1b4e41f0aa2978") (:keywords "c" "c++" "objc" "convenience" "tools") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:url . "https://github.com/ikirill/irony-eldoc"))])
- (isearch-dabbrev . [(20141224 622) ((cl-lib (0 5))) "Use dabbrev in isearch" single ((:commit . "1efe7abba4923015cbc2462395deaec5446a9cc8") (:keywords "dabbrev" "isearch") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:url . "https://github.com/Dewdrops/isearch-dabbrev"))])
- (isearch-project . [(20200717 807) ((emacs (26 1)) (f (0 20 0))) "Incremental search through the whole project" single ((:commit . "9113d9452a9a879dc0e503f35e8c1fb4d44d9b64") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/isearch-project"))])
- (isearch-symbol-at-point . [(20130728 2221) nil "Use isearch to search for the symbol at point" single ((:commit . "51a1029bec1ec414885f9edb7e5947603dffdab2") (:keywords "isearch") (:authors ("atom smith")) (:maintainer "atom smith") (:url . "https://github.com/re5et/isearch-symbol-at-point"))])
- (isend-mode . [(20190201 832) nil "Interactively send parts of an Emacs buffer to an interpreter" single ((:commit . "38ace354d579eb364d4f95b9ea16081c171ea604") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/isend-mode.el"))])
- (isgd . [(20150414 936) nil "Shorten URLs using the isgd.com shortener service" single ((:commit . "764306dadd5a9213799081a48aba22f7c75cca9a") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:url . "https://github.com/chmouel/isgd.el"))])
- (isolate . [(20190808 731) ((emacs (25))) "Surrounding tool with flexible customizations." single ((:commit . "e93cb652f150705347480a2ee13b63fa625b1edf") (:keywords "convenience") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:url . "https://github.com/casouri/isolate"))])
- (isortify . [(20190315 2004) ((emacs (25)) (pythonic (0 1 0))) "(automatically) format python buffers using isort." single ((:commit . "ae7fb7163ce075209543f72953c9f431d103f6a3") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/isortify"))])
- (iss-mode . [(20141001 1913) nil "Mode for InnoSetup install scripts" single ((:commit . "3b517aff31529bab33f8d7b562bd17aff0107fd1") (:authors ("Stefan Reichoer," . "stefan@xsteve.at")) (:maintainer "Stefan Reichoer," . "stefan@xsteve.at"))])
- (itail . [(20171112 804) nil "An interactive tail mode" single ((:commit . "6e43c20da03be3b9c6ece93b7dc3495975ec1888") (:keywords "tail") (:authors ("atom smith")) (:maintainer "atom smith") (:url . "https://github.com/re5et/itail"))])
- (itasca . [(20170601 1622) ((emacs (24 3))) "Major modes for Itasca software data files." tar ((:commit . "3d15dd1b70d6db69b0f4758a3e28b8b506cc84ca") (:keywords "itasca" "flac" "3dec" "udec" "flac3d" "pfc" "pfc2d" "pfc3d" "fish") (:authors ("Jason Furtney" . "jkfurtney@gmail.com")) (:maintainer "Jason Furtney" . "jkfurtney@gmail.com") (:url . "http://github.com/jkfurtney/itasca-emacs/"))])
- (iter2 . [(20200517 1623) ((emacs (25 1))) "Reimplementation of Elisp generators" single ((:commit . "987045585d60700b4b9e617313c1a73618a144c9") (:keywords "elisp" "extensions") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:url . "https://github.com/doublep/iter2"))])
- (iterator . [(20170207 838) ((emacs (24)) (cl-lib (0 5))) "A library to create and use elisp iterators objects." single ((:commit . "9da54f9aed945b46866782cdf962c9e530419297") (:authors ("Thierry Volpiatto <thierry dot volpiatto at gmail dot com>")) (:maintainer "Thierry Volpiatto <thierry dot volpiatto at gmail dot com>") (:url . "https://github.com/thierryvolpiatto/iterator"))])
- (ivariants . [(20170823 224) ((emacs (24 3)) (ivs-edit (1 0))) "Ideographic variants editor and browser" tar ((:commit . "ca0b74d32b5d2d77a45cc6ad6edc00be0ee85284") (:keywords "i18n" "languages") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "http://github.com/kawabata/ivariants"))])
- (ivs-edit . [(20170818 1441) ((emacs (24 3)) (dash (2 6 0)) (cl-lib (1 0))) "IVS (Ideographic Variation Sequence) editing tool" tar ((:commit . "5db39c234aa7393b591168a4fd0a9a4cbbca347d") (:keywords "text") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "http://github.com/kawabata/ivs-edit"))])
- (ivy . [(20200624 1140) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:commit . "c6b60d34ac37bf4d91a25f16d22e528f85e06938") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/swiper"))])
- (ivy-avy . [(20200615 938) ((emacs (24 5)) (ivy (0 13 0)) (avy (0 5 0))) "Avy integration for Ivy" single ((:commit . "c6b60d34ac37bf4d91a25f16d22e528f85e06938") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/swiper"))])
- (ivy-bibtex . [(20200429 1606) ((bibtex-completion (1 0 0)) (swiper (0 7 0)) (cl-lib (0 5))) "A bibliography manager based on Ivy" single ((:commit . "8a0dd9841316793aacddea744d6b8ca4a7857a35") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))])
- (ivy-clipmenu . [(20200302 1419) ((emacs (26 1)) (f (0 20 0)) (s (1 12 0)) (dash (2 16 0)) (ivy (0 13 0))) "Ivy client for clipmenu" single ((:commit . "ef25acf3f058fe1ede3a29fae2e9cdac8b08cd17") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/ivy-clipmenu.el"))])
- (ivy-clojuredocs . [(20200714 1111) ((edn (1 1 2)) (ivy (0 12 0)) (emacs (24 4))) "Search for help in clojuredocs.org" single ((:commit . "0ea57b70a144ecfa80fbd2ec383ebabedb524c37") (:keywords "matching") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com") (:url . "https://github.com/wandersoncferreira/ivy-clojuredocs"))])
- (ivy-dired-history . [(20170626 556) ((ivy (0 9 0)) (counsel (0 9 0)) (cl-lib (0 5))) "use ivy to open recent directories" single ((:commit . "c9c67ea1ee5e68443f0e6006ba162d6c8d868b69") (:authors ("纪秀峰" . "jixiuf@gmail.com")) (:maintainer "纪秀峰" . "jixiuf@gmail.com") (:url . "https://github.com/jixiuf/ivy-dired-history"))])
- (ivy-emms . [(20200629 801) ((ivy (0 13 0)) (emms (0 0)) (emacs (24 4))) "Ivy interface to emms tracks" single ((:commit . "6f547f9f3dcbf0d5b88595760b3505c7195dc96b") (:keywords "multimedia") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:url . "https://github.com/franburstall/ivy-emms"))])
- (ivy-emoji . [(20200316 2351) ((emacs (26 1)) (ivy (0 13 0))) "Insert emojis with ivy" single ((:commit . "a1b7d32048278afd9b06536a8af96f533639d146") (:keywords "emoji" "ivy" "convenience") (:authors ("Gabriele Bozzola" . "sbozzolator@gmail.com")) (:maintainer "Gabriele Bozzola" . "sbozzolator@gmail.com") (:url . "https://github.com/sbozzolo/ivy-emoji.git"))])
- (ivy-erlang-complete . [(20191112 1137) ((async (1 9)) (counsel (0 11 0)) (ivy (0 11 0)) (erlang (19 2)) (emacs (25 1))) "Erlang context sensitive completion at point using ivy. It also support xref and eldoc." tar ((:commit . "c443dba0c466d36bef01a8985474f5da0a5a65fe"))])
- (ivy-explorer . [(20190909 1921) ((emacs (25)) (ivy (0 10 0))) "Dynamic file browsing grid using ivy" single ((:commit . "a413966cfbcecacc082d99297fa1abde0c10d3f3") (:keywords "convenience" "files" "matching") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net") (:url . "https://github.com/clemera/ivy-explorer"))])
- (ivy-fuz . [(20191222 946) ((emacs (25 1)) (fuz (1 3 0)) (ivy (0 13 0))) "Integration between fuz and ivy." single ((:commit . "f171ac73422a4bae1503d63d804e691482ed35b2") (:keywords "convenience") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/ivy-fuz.el"))])
- (ivy-gitlab . [(20181228 826) ((s (1 9 0)) (dash (2 9 0)) (ivy (0 8 0)) (gitlab (0 8))) "Ivy interface to Gitlab" single ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:keywords "gitlab" "ivy") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/emacs-gitlab"))])
- (ivy-historian . [(20190111 313) ((emacs (24 4)) (historian (20170111)) (ivy (0 8 0)) (flx (0 6 1))) "Persistently store selected minibuffer candidates" single ((:commit . "ac1bea7d99dd6965c72fabeb72d5fdc38c5380a4") (:keywords "convenience" "ivy") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/PythonNut/historian.el"))])
- (ivy-hydra . [(20200608 1010) ((emacs (24 5)) (ivy (0 13 0)) (hydra (0 15 0))) "Additional key bindings for Ivy" single ((:commit . "c6b60d34ac37bf4d91a25f16d22e528f85e06938") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/swiper"))])
- (ivy-lobsters . [(20171202 2041) ((ivy (0 8 0)) (cl-lib (0 5))) "Browse lobste.rs stories with ivy." single ((:commit . "4364df4b3685fd1b50865ac9360fb948c0288dd1") (:authors ("Julien Blanchard <https://github.com/julienXX>")) (:maintainer "Julien Blanchard <https://github.com/julienXX>") (:url . "https://github.com/julienXX/ivy-lobsters"))])
- (ivy-mpdel . [(20190428 920) ((emacs (25 1)) (ivy (0 10 0)) (libmpdel (1 0 0)) (mpdel (1 0 0))) "Ivy interface to navigate MPD" single ((:commit . "a42dcc943914c71975c115195d38c739f25e475c") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/ivy-mpdel"))])
- (ivy-omni-org . [(20200125 807) ((emacs (25 1)) (ivy (0 10)) (dash (2 12))) "Browse anything in Org mode" single ((:commit . "113477ae46ec857c5794fc0a031c1e579615f0a9") (:keywords "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/ivy-omni-org"))])
- (ivy-pass . [(20170812 1955) ((emacs (24)) (ivy (0 8 0)) (password-store (1 6 5))) "ivy interface for pass" single ((:commit . "5b523de1151f2109fdd6a8114d0af12eef83d3c5") (:keywords "pass" "password" "convenience" "data") (:authors ("ecraven")) (:maintainer "ecraven") (:url . "https://github.com/ecraven/ivy-pass/"))])
- (ivy-phpunit . [(20180219 915) ((ivy (0 10 0)) (phpunit (0 7 0)) (emacs (25))) "Ivy integration for phpunit.el" single ((:commit . "ffedb0138d36564e8e36a28fd9bc71ea8944681f") (:keywords "convenience" "tools" "ivy" "phpunit" "php") (:authors ("12pt")) (:maintainer "12pt") (:url . "https://github.com/12pt/ivy-phpunit"))])
- (ivy-posframe . [(20200528 553) ((emacs (26 0)) (posframe (0 1 0)) (ivy (0 11 0))) "Using posframe to show Ivy" single ((:commit . "44749562a9e68bd43ccaa225b31311476fab1251") (:keywords "abbrev" "convenience" "matching" "ivy") (:authors ("Feng Shu")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/ivy-posframe"))])
- (ivy-prescient . [(20200716 1414) ((emacs (25 1)) (prescient (5 0)) (ivy (0 11 0))) "prescient.el + Ivy" single ((:commit . "b11d79b10df12c58edc3487371c2c47dfb9b50e6") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/prescient.el"))])
- (ivy-purpose . [(20160724 1003) ((emacs (24)) (ivy (0 8)) (window-purpose (1 5))) "Ivy Interface for Purpose" single ((:commit . "0495f2f3aed64d7e0028125e76a9a68f8fc4107e") (:authors ("Bar Magal (2016)")) (:maintainer "Bar Magal (2016)") (:url . "https://github.com/bmag/ivy-purpose"))])
- (ivy-rich . [(20200601 104) ((emacs (25 1)) (ivy (0 13 0))) "More friendly display transformer for ivy" single ((:commit . "10970130b41c6ef9570893cdab8dfbe720e2b1a9") (:keywords "convenience" "ivy") (:authors ("Yevgnen Koh" . "wherejoystarts@gmail.com")) (:maintainer "Yevgnen Koh" . "wherejoystarts@gmail.com") (:url . "https://github.com/Yevgnen/ivy-rich"))])
- (ivy-rtags . [(20191222 920) ((ivy (0 7 0)) (rtags (2 10))) "RTags completion back-end for ivy" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))])
- (ivy-todo . [(20200323 2005) ((ivy (0 8 0)) (emacs (25))) "Manage org-mode TODOs with ivy" single ((:commit . "d74501cd334b7d709659946c5e02b21cfd5507de") (:keywords "convenience") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:url . "https://github.com/Kungsgeten/ivy-todo"))])
- (ivy-xcdoc . [(20160917 1055) ((ivy (0 8 0)) (emacs (24 4))) "Search Xcode documents with ivy interface." single ((:commit . "5ea22af36c4c2737fb0bec53432c233482d8b314") (:keywords "ivy" "xcode" "xcdoc") (:authors ("C.T.Chen" . "chenct@7adybird.com")) (:maintainer "C.T.Chen" . "chenct@7adybird.com") (:url . "https://github.com/hex2010/emacs-ivy-xcdoc"))])
- (ivy-xref . [(20191126 401) ((emacs (25 1)) (ivy (0 10 0))) "Ivy interface for xref results" single ((:commit . "3d4c35fe2b243d948d8fe02a1f0d76a249d63de9") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/ivy-xref"))])
- (ivy-yasnippet . [(20200704 700) ((emacs (24 1)) (cl-lib (0 6)) (ivy (0 10 0)) (yasnippet (0 12 2)) (dash (2 14 1))) "Preview yasnippets with ivy" single ((:commit . "83402d91b4eba5307f71884a72df8e11cc6a994e") (:keywords "convenience") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:url . "https://github.com/mkcms/ivy-yasnippet"))])
- (ivy-ycmd . [(20180909 1225) ((ycmd (1 3)) (emacs (24)) (ivy (0 10 0)) (dash (2 14 1))) "Ivy interface to ycmd" single ((:commit . "25bfee8f676e4ecbb645e4f30b47083410a00c58") (:keywords "tools") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-ivy-ycmd"))])
- (ivy-youtube . [(20181126 1039) ((request (0 2 0)) (ivy (0 8 0)) (cl-lib (0 5))) "Query YouTube and play videos in your browser" single ((:commit . "849b6db7ef02b080a86c1b887488e2935c31059a") (:keywords "youtube" "multimedia" "mpv" "vlc") (:authors ("Brunno dos Santos")) (:maintainer "Brunno dos Santos") (:url . "https://github.com/squiter/ivy-youtube"))])
- (ix . [(20131027 1629) ((grapnel (0 5 3))) "Emacs client for http://ix.io pastebin" single ((:commit . "aea4c54a5cc5a6f26637353c16a3a0e70fc76963") (:authors ("Abhishek L" . "abhishekl.2006@gmail.com")) (:maintainer "Abhishek L" . "abhishekl.2006@gmail.com") (:url . "http://www.github.com/theanalyst/ix.el"))])
- (iy-go-to-char . [(20141029 1546) nil "Go to next CHAR which is similar to \"f\" and \"t\" in vim" single ((:commit . "04ab4f5f3a241cbbc9b8c178a22b412a62f632f9") (:keywords "navigation" "search") (:authors ("Ian Yang <doit dot ian (at) gmail dot com>")) (:maintainer "Ian Yang <doit dot ian (at) gmail dot com>") (:url . "https://github.com/doitian/iy-go-to-char"))])
- (j-mode . [(20171224 1856) nil "Major mode for editing J programs" tar ((:commit . "e8725ac8af95498faabb2ca3ab3bd809a8f148e6") (:keywords "j" "languages") (:url . "http://github.com/zellio/j-mode"))])
- (jabber . [(20180927 2325) ((fsm (0 2)) (srv (0 2))) "A Jabber client for Emacs." tar ((:commit . "fff33826f42e040dad7ef64ea312d85215d3b0a1"))])
- (jabber-otr . [(20150918 1144) ((emacs (24)) (jabber (0 8 92))) "Off-The-Record messaging for jabber.el" tar ((:commit . "2692b1530234e0ba9a0d6c1eaa1cbe8679f193c0") (:keywords "comm") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:url . "https://github.com/legoscia/emacs-jabber-otr/"))])
- (jack-connect . [(20200519 1027) nil "Manage jack connections within Emacs" single ((:commit . "fae8c5f9b383f7606f3883badfd1294e8affb0db") (:authors ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainer "Stefano Barbi" . "stefanobarbi@gmail.com"))])
- (jade-mode . [(20160525 1441) nil "Major mode for editing .jade files" single ((:commit . "4dbde92542fc7ad61df38776980905a4721d642e") (:authors ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:url . "https://github.com/brianc/jade-mode"))])
- (jammer . [(20200506 1247) nil "Punish yourself for using Emacs inefficiently" single ((:commit . "76e006dddd491aecccfcb06939db56f9f7daa56d") (:keywords "games") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/jammer"))])
- (janet-mode . [(20200509 1651) ((emacs (24 3))) "Defines a major mode for Janet" single ((:commit . "2f5bcabcb6953e1ed1926ba6a2328c453e8b4ac7") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/janet-mode"))])
- (japanese-holidays . [(20190317 1220) ((cl-lib (0 3))) "calendar functions for the Japanese calendar" single ((:commit . "45e70a6eaf4a555fadc58ab731d522a037a81997") (:keywords "calendar") (:authors ("Takashi Hattori" . "hattori@sfc.keio.ac.jp") ("Hiroya Murata" . "lapis-lazuli@pop06.odn.ne.jp")) (:maintainer "Takashi Hattori" . "hattori@sfc.keio.ac.jp") (:url . "https://github.com/emacs-jp/japanese-holidays"))])
- (jape-mode . [(20140903 1506) nil "An Emacs editing mode mode for GATE's JAPE files" single ((:commit . "85b9182850707b5d107391f6caee5bd401507a7d") (:keywords "languages" "jape" "gate") (:url . "http://github.com/tanzoniteblack/jape-mode"))])
- (jar-manifest-mode . [(20160501 26) nil "Major mode to edit JAR manifest files" single ((:commit . "270dae14c481300f75ed96dad3a5ae42ca928a1d") (:keywords "convenience" "languages") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:url . "http://github.com/omajid/jar-manifest-mode"))])
- (jasminejs-mode . [(20150527 5) nil "A minor mode for manipulating jasmine test files" tar ((:commit . "9f8044bf81ab5b4841a30b0bd099916e1b7ff54a") (:keywords "javascript" "jasmine") (:authors ("Eric Stolten" . "stoltene2@gmail.com")) (:maintainer "Eric Stolten" . "stoltene2@gmail.com") (:url . "https://github.com/stoltene2/jasminejs-mode"))])
- (jastadd-ast-mode . [(20161219 926) ((emacs (24))) "Major mode for editing JastAdd AST files" single ((:commit . "a29fdb470cbf0a398164950a3b0d2217de48e0c0") (:keywords "languages") (:authors ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at") (:url . "https://github.com/rudi/jastadd-ast-mode"))])
- (java-imports . [(20170913 1410) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 2))) "Code for dealing with Java imports" single ((:commit . "e96ff44ed48b362ab6227b8b802b84d84f78bcaa") (:keywords "java") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org") (:url . "http://www.github.com/dakrone/emacs-java-imports"))])
- (java-snippets . [(20160627 252) ((yasnippet (0 8 0))) "Yasnippets for Java" tar ((:commit . "6d0e2768823be27dbe07448f4cb244cd657a7136") (:authors ("Takayoshi Kimura")) (:maintainer "Takayoshi Kimura") (:url . "https://github.com/nekop/yasnippet-java-mode"))])
- (javadoc-lookup . [(20160214 31) ((cl-lib (0 3))) "Javadoc Emacs integration with Maven" tar ((:commit . "507a2dd443d60b537b8f779c1847e2cd0ccd1382") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/javadoc-lookup"))])
- (javap-mode . [(20120223 2208) nil "Javap major mode" single ((:commit . "864c1130e204b2072e1d19cd027b6fce8ebe6629") (:url . "http://github.com/hiredman/javap-mode"))])
- (jaword . [(20170426 627) ((tinysegmenter (0 1))) "Minor-mode for handling Japanese words better" single ((:commit . "ac062b0e5ab4bd3270497e80aa0f3ac033a0493f") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (jazz-theme . [(20200417 2042) nil "A warm color theme for Emacs 24+." single ((:commit . "b6694f09e10aa7df14836aac2f6615c32aa572dd") (:authors ("Roman Parykin" . "donderom@ymail.com")) (:maintainer "Roman Parykin" . "donderom@ymail.com") (:url . "https://github.com/donderom/jazz-theme"))])
- (jbeans-theme . [(20180309 1625) ((emacs (24))) "Jbeans theme for GNU Emacs 24 (deftheme)" single ((:commit . "3caa95998d8492a2ca6c17971de499ca15609871") (:authors ("Adam Olsen" . "arolsen@gmail.com")) (:maintainer "Adam Olsen" . "arolsen@gmail.com") (:url . "https://github.com/synic/jbeans-emacs"))])
- (jdecomp . [(20170224 2200) ((emacs (24 5))) "Interface to Java decompilers" single ((:commit . "692866abc83deedce62be8d6040cf24dda7fb7a8") (:keywords "decompile" "java" "languages" "tools") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:url . "https://github.com/xiongtx/jdecomp"))])
- (jdee . [(20191102 1426) ((emacs (24 3)) (flycheck (30)) (memoize (1 0 1)) (dash (2 13 0)) (s (1 12 0))) "Java Development Environment for Emacs" tar ((:commit . "b510a29f1fc1bea218a6230fb219922775687c78") (:keywords "java" "tools") (:authors ("Paul Kinnucan" . "pkinnucan@attbi.com")) (:maintainer "Paul Landes") (:url . "http://github.com/jdee-emacs/jdee"))])
- (jedi . [(20191011 1750) ((emacs (24)) (jedi-core (0 2 2)) (auto-complete (1 4))) "a Python auto-completion for Emacs" single ((:commit . "9d5f29116c4d42cae561a9d69e6fba2b61e2cf43") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))])
- (jedi-core . [(20191011 1750) ((emacs (24)) (epc (0 1 0)) (python-environment (0 0 2)) (cl-lib (0 5))) "Common code of jedi.el and company-jedi.el" tar ((:commit . "9d5f29116c4d42cae561a9d69e6fba2b61e2cf43") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))])
- (jedi-direx . [(20140310 936) ((jedi (0 1 2)) (direx (0 1 -3))) "Tree style source code viewer for Python buffer" single ((:commit . "7a2e677400717ed12b959cb5988e7b3fb1c12117") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))])
- (jeison . [(20190721 1651) ((emacs (25 1)) (dash (2 16 0))) "A library for declarative JSON parsing" single ((:commit . "66e276c1f2f08ca54d2cd60f2c9f974c662aae8b") (:keywords "lisp" "json" "data-types") (:url . "http://github.com/SavchenkoValeriy/jeison"))])
- (jekyll-modes . [(20141117 1314) ((polymode (0 2))) "Major modes (markdown and HTML) for authoring Jekyll content" single ((:commit . "7cb10b50fd2883e3f7b10fdfd98f19f2f0b2381c") (:keywords "docs") (:authors ("Fredrik Appelberg" . "fredrik@milgrim.local")) (:maintainer "Fredrik Appelberg" . "fredrik@milgrim.local") (:url . "https://github.com/fred-o/jekyll-modes"))])
- (jemdoc-mode . [(20170704 2027) ((emacs (24 3))) "Major mode for editing jemdoc files" single ((:commit . "529b4d4681e1198b9892f340fdd6c3f1592a047a") (:keywords "convenience" "usability") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com") (:url . "https://github.com/drdv/jemdoc-mode"))])
- (jenkins . [(20200524 2016) ((dash (2 12)) (emacs (24 3)) (json (1 4))) "Minimalistic Jenkins client for Emacs" single ((:commit . "bd06cdc57c0cb9217d773eeba06ecc998f10033b") (:keywords "jenkins" "convenience") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com"))])
- (jenkins-watch . [(20121004 2326) nil "Watch continuous integration build status" single ((:commit . "37b84dfbd98240a57ff798e1ff8bc7dba2913577") (:authors ("Andrew Taylor" . "ataylor@redtoad.ca")) (:maintainer "Andrew Taylor" . "ataylor@redtoad.ca") (:url . "https://github.com/ataylor284/jenkins-watch"))])
- (jest . [(20200625 1611) ((emacs (24 4)) (dash (2 12 0)) (dash-functional (2 12 0)) (magit-popup (2 12 0)) (projectile (0 14 0)) (s (1 12 0)) (js2-mode (20180301)) (cl-lib (0 6 1))) "helpers to run jest" single ((:commit . "525947052c9ff2dadabc28fa05c02dcf06c5b2a4") (:keywords "jest" "javascript" "testing") (:authors ("Edmund Miller" . "edmund.a.miller@gmail.com")) (:maintainer "Edmund Miller" . "edmund.a.miller@gmail.com") (:url . "https://github.com/emiller88/emacs-jest/"))])
- (jest-test-mode . [(20200329 506) ((emacs (25 1))) "Minor mode for running Node.js tests using jest" single ((:commit . "f04d08db36715d7509fd68448f74f917c6c1a382") (:authors ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainer "Raymond Huang" . "rymndhng@gmail.com") (:url . "https://github.com/rymndhng/jest-test-mode.el"))])
- (jetbrains . [(20180301 502) ((emacs (24 3)) (cl-lib (0 5)) (f (0 17))) "JetBrains IDE bridge" single ((:commit . "56f71a17d455581c10d48f6dbb31d9e2126227bf") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/jetbrains.el"))])
- (jg-quicknav . [(20170809 130) ((s (1 9 0)) (cl-lib (0 5))) "Quickly navigate the file system to find a file." single ((:commit . "c8d53e774d63e68a944092c08a026b57da741038") (:keywords "navigation") (:authors ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com") (:url . "https://github.com/jeffgran/jg-quicknav"))])
- (jinja2-mode . [(20200718 730) nil "A major mode for jinja2" single ((:commit . "ecd19a40b7832bb00f0a2244e3b0713d0bf3850d") (:authors ("Florian Mounier aka paradoxxxzero")) (:maintainer "Florian Mounier aka paradoxxxzero"))])
- (jira-markup-mode . [(20150601 2109) nil "Emacs Major mode for JIRA-markup-formatted text files" single ((:commit . "4fc534c47df26a2f402bf835ebe2ed89474a4062") (:keywords "jira" "markup") (:authors ("Matthias Nuessler" . "m.nuessler@web.de>")) (:maintainer "Matthias Nuessler" . "m.nuessler@web.de>") (:url . "https://github.com/mnuessler/jira-markup-mode"))])
- (jiralib2 . [(20200520 2031) ((emacs (25)) (request (0 3)) (dash (2 14 1))) "JIRA REST API bindings to Elisp" single ((:commit . "c21c4e759eff549dbda11099f2f680b78d7f5a01") (:keywords "comm" "jira" "rest" "api") (:authors ("Henrik Nyman" . "h@nyymanni.com")) (:maintainer "Henrik Nyman" . "h@nyymanni.com") (:url . "https://github.com/nyyManni/jiralib2"))])
- (jist . [(20161229 1721) ((emacs (24 4)) (dash (2 12 0)) (seq (1 11)) (let-alist (1 0 4)) (magit (2 1 0)) (request (0 2 0))) "Gist integration" single ((:commit . "da0692452e312a99bb27d8708504b521798aca48") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/jist.el"))])
- (jknav . [(20121006 2025) nil "Automatically enable j/k keys for line-based navigation" single ((:commit . "861245715c728503dad6573278fdd75c271dbf8b") (:keywords "keyboard" "navigation") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com"))])
- (jonprl-mode . [(20160819 59) ((emacs (24 3)) (cl-lib (0 5)) (yasnippet (0 8 0))) "A major mode for editing JonPRL files" tar ((:commit . "6059bb64891fae45827174e044d6a87ac07172d8") (:keywords "languages") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (journalctl-mode . [(20200607 754) ((emacs (24 1))) "Sample major mode for viewing output journalctl" single ((:commit . "e8e057f387266d1c11f8fb68023ceb9607404948") (:keywords "unix") (:authors ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainer "Sebastian Meisel" . "sebastian.meisel@gmail.com") (:url . "https://github.com/SebastianMeisel/journalctl-mode"))])
- (jpop . [(20170410 1250) ((emacs (24)) (dash (2 11 0)) (cl-lib (0 5))) "Lightweight project caching and navigation framework" tar ((:commit . "7628b03260be96576b34459d45959ee77d8b2110") (:keywords "project" "convenience") (:authors ("Dom Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dom Charlesworth" . "dgc336@gmail.com") (:url . "https://github.com/domtronn/jpop.el"))])
- (jq-format . [(20190428 1434) ((emacs (24)) (reformatter (0 3))) "Reformat JSON and JSONLines using jq" single ((:commit . "47e1c5adb89b37b4d53fe01302d8c675913c20e7") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-jq-format"))])
- (jq-mode . [(20200604 833) ((emacs (25 1))) "Edit jq scripts." tar ((:commit . "42ad0a99f0114233e2cb317585cb9af494d18a2f") (:authors ("Bjarte Johansen <Bjarte dot Johansen at gmail dot com>")) (:maintainer "Bjarte Johansen <Bjarte dot Johansen at gmail dot com>") (:url . "https://github.com/ljos/jq-mode"))])
- (jquery-doc . [(20150812 758) nil "jQuery api documentation interface for emacs" tar ((:commit . "24032284919b942ec27707d929bdd8bf48420062") (:keywords "docs" "jquery") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))])
- (js-auto-beautify . [(20161031 509) ((web-beautify (0 3 1)) (web-mode (14 0 27))) "auto format you js/jsx file" single ((:commit . "180d15af7b5dfaab4ee1954cca2fdc797932f9de") (:authors (nil . "quanwei9958@126.com")) (:maintainer nil . "quanwei9958@126.com"))])
- (js-auto-format-mode . [(20180807 1352) ((emacs (24))) "Minor mode for auto-formatting JavaScript code" single ((:commit . "9d9460b17f59e4e7a4e5cc34576ba72b2ca56524") (:keywords "languages") (:authors ("Masafumi Koba" . "ybiquitous@gmail.com")) (:maintainer "Masafumi Koba" . "ybiquitous@gmail.com") (:url . "https://github.com/ybiquitous/js-auto-format-mode"))])
- (js-codemod . [(20190921 941) ((emacs (24 4))) "Run js-codemod on current sentence or selected region" tar ((:commit . "056bdf3e5e0c807b8cf17edb5834179a90fb722b") (:keywords "js" "codemod" "region") (:authors (nil . "Torgeir Thoresen <@torgeir>")) (:maintainer nil . "Torgeir Thoresen <@torgeir>"))])
- (js-comint . [(20200117 615) ((emacs (24 3))) "JavaScript interpreter in window." single ((:commit . "0dedaf4753fbe8cdbab14aa85f05d7673cbee8b6") (:keywords "javascript" "node" "inferior-mode" "convenience") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainer "Chen Bin <chenbin.sh AT gmail DOT com>") (:url . "https://github.com/redguardtoo/js-comint"))])
- (js-doc . [(20160715 434) nil "Insert JsDoc style comment easily" single ((:commit . "f0606e89d5aa89146f96edb38cf69af0068a9d1e") (:keywords "document" "comment") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:url . "https://github.com/mooz/js-doc"))])
- (js-format . [(20170119 102) ((emacs (24 1)) (js2-mode (20101228))) "Format or transform code style using NodeJS server with different javascript formatter" tar ((:commit . "544bda9be72b74ec2d442543ba60cff727d96669") (:keywords "js" "javascript" "format" "standard" "jsbeautify" "esformatter" "airbnb") (:authors ("James Yang" . "jamesyang999@gmail.com")) (:maintainer "James Yang" . "jamesyang999@gmail.com") (:url . "http://github.com/futurist/js-format.el"))])
- (js-import . [(20190218 1319) ((emacs (24 4)) (f (0 19 0)) (projectile (0 14 0)) (dash (2 13 0))) "Import Javascript files from your current project or dependencies" single ((:commit . "2ab3b120cc94ebf4bee2d959c8869440bc4c7484") (:keywords "tools") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com") (:url . "https://github.com/jakoblind/js-import"))])
- (js-react-redux-yasnippets . [(20200316 1144) ((emacs (24 3)) (yasnippet (0 8 0))) "JavaScript,React,Redux yasnippets" tar ((:commit . "9f509043f01fa59bff4daf31b2e95d63f8deab4a") (:keywords "convenience" "snippets") (:authors ("sooqua")) (:maintainer "sooqua") (:url . "https://github.com/sooqua/js-react-redux-yasnippets"))])
- (js2-closure . [(20170816 1918) ((js2-mode (20150909))) "Google Closure dependency manager" single ((:commit . "f59db386d7d0693935d0bf52babcd2c203c06d04") (:keywords "javascript" "closure") (:authors ("Justine Tunney" . "jart@google.com")) (:maintainer "Justine Tunney" . "jart@google.com") (:url . "http://github.com/jart/js2-closure"))])
- (js2-highlight-vars . [(20170418 1829) ((emacs (24 4)) (js2-mode (20150908))) "highlight occurrences of the variable under cursor" single ((:commit . "e3bb177e50f76b272e8073a94d4f46be6512a163") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com") (:url . "http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode/js2-highlight-vars-mode"))])
- (js2-mode . [(20200725 112) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "40aab27581279d0fdbfeb9afeb85f39d401a927f") (:keywords "languages" "javascript") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:url . "https://github.com/mooz/js2-mode/"))])
- (js2-refactor . [(20190630 2108) ((js2-mode (20101228)) (s (1 9 0)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (0 9 0 1))) "A JavaScript refactoring library for emacs." tar ((:commit . "d4c40b5fc86d3edd7c6a7d83ac86483ee1cb7a28"))])
- (js3-mode . [(20160515 1550) nil "An improved JavaScript editing mode" tar ((:commit . "229aeb374f1b1f3ee5c59b8ba3eebb6385c232cb") (:keywords "javascript" "languages") (:authors ("Thom Blake" . "webmaster@thomblake.com")) (:maintainer "Thom Blake" . "webmaster@thomblake.com"))])
- (jscs . [(20151015 1749) ((emacs (24 1)) (cl-lib (0 5))) "Consistent JavaScript editing using JSCS" single ((:commit . "9d39d0f2355e69a020bf76242504f3a33e013ccf") (:keywords "languages" "convenience") (:authors ("papaeye" . "papaeye@gmail.com")) (:maintainer "papaeye" . "papaeye@gmail.com") (:url . "https://github.com/papaeye/emacs-jscs"))])
- (jsfmt . [(20180920 1008) nil "Interface to jsfmt command for javascript files" single ((:commit . "ca141a135c7700eaedef92561d334e1fb7dc28a1") (:authors ("Brett Langdon" . "brett@blangdon.com")) (:maintainer "Brett Langdon" . "brett@blangdon.com") (:url . "https://github.com/brettlangdon/jsfmt.el"))])
- (json-mode . [(20190123 422) ((json-reformat (0 0 5)) (json-snatcher (1 0 0))) "Major mode for editing JSON files." single ((:commit . "0e819e519ae17a2686e0881c4ca51fa873fa9b83") (:authors ("Josh Johnston")) (:maintainer "Josh Johnston") (:url . "https://github.com/joshwnj/json-mode"))])
- (json-navigator . [(20191213 755) ((emacs (25 1)) (hierarchy (0 6 0))) "View and navigate JSON structures" single ((:commit . "afd902e0b5cde37fad4786515a695d17f1625286") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/json-navigator"))])
- (json-process-client . [(20190827 1858) ((emacs (25 1))) "Interact with a TCP process using JSON" single ((:commit . "422606a7bf08d13646e3db4f6c2bddb69bd61dec") (:authors ("Nicolas Petton" . "nicolas@petton.fr") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/nico/json-process-client"))])
- (json-reformat . [(20160212 853) nil "Reformatting tool for JSON" single ((:commit . "8eb6668ed447988aea06467ba8f42e1f2178246f") (:keywords "json") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:url . "https://github.com/gongo/json-reformat"))])
- (json-rpc . [(20200417 1629) ((emacs (24 1)) (cl-lib (0 5))) "JSON-RPC library" single ((:commit . "81a5a520072e20d18aeab2aac4d66c046b031e56") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-json-rpc"))])
- (json-rpc-server . [(20190714 1521) ((emacs (26))) "Server-side JSON-RPC library." single ((:commit . "1623346b308dc8f593346dc947fdc4092d674834") (:keywords "tools" "comm" "json" "rpc") (:authors ("GitHub user \"Jcaw\"")) (:maintainer "GitHub user \"Jcaw\"") (:url . "https://github.com/jcaw/json-rpc-server.el"))])
- (json-snatcher . [(20150512 347) ((emacs (24))) "Grabs the path to JSON values in a JSON file" single ((:commit . "c4cecc0a5051bd364373aa499c47a1bb7a5ac51c") (:authors ("Sterling Graham" . "sterlingrgraham@gmail.com")) (:maintainer "Sterling Graham" . "sterlingrgraham@gmail.com") (:url . "http://github.com/sterlingg/json-snatcher"))])
- (jsonl . [(20190623 509) ((emacs (25))) "Utility functions for working with line-delimited JSON" single ((:commit . "3dd0b7bb2b4bce9f9de7367941f0cc78f82049c9") (:keywords "tools") (:authors ("Erik Anderson" . "erik@ebpa.link")) (:maintainer "Erik Anderson" . "erik@ebpa.link") (:url . "https://github.com/ebpa/jsonl.el"))])
- (jsonnet-mode . [(20200218 2217) ((emacs (24))) "Major mode for editing jsonnet files" single ((:commit . "d8b486c8376a4785a7f2dc8a16fe1f2d82c6bfae") (:keywords "languages") (:authors ("Nick Lanham")) (:maintainer "Nick Lanham") (:url . "https://github.com/mgyucht/jsonnet-mode"))])
- (jss . [(20130508 1423) ((emacs (24 1)) (websocket (0)) (js2-mode (0))) "An emacs interface to webkit and mozilla debuggers" tar ((:commit . "41749257aecf13c7bd6ed489b5ab3304d06e40bc") (:keywords "languages") (:authors ("Marco Baringer" . "mb@bese.it")) (:maintainer "Marco Baringer" . "mb@bese.it"))])
- (jst . [(20150604 1138) ((s (1 9)) (f (0 17)) (dash (2 10)) (pcache (0 3)) (emacs (24 4))) "JS test mode" single ((:commit . "2a3fd16c992f7790dc67134ef06a814c3d20579c") (:keywords "js" "javascript" "jasmine" "coffee" "coffeescript") (:authors ("Cheung Hoi Yu" . "yeannylam@gmail.com")) (:maintainer "Cheung Hoi Yu" . "yeannylam@gmail.com") (:url . "https://github.com/cheunghy/jst-mode"))])
- (jtags . [(20160211 2029) nil "enhanced tags functionality for Java development" tar ((:commit . "b50daa48510f71e74ce0ec2eb85030896a79cf96") (:keywords "languages" "tools") (:authors ("Alexander Baltatzis" . "alexander@baltatzis.com") ("Johan Dykstrom" . "jody4711-sf@yahoo.se")) (:maintainer "Johan Dykstrom" . "jody4711-sf@yahoo.se") (:url . "http://jtags.sourceforge.net"))])
- (julia-mode . [(20200717 1915) ((emacs (24 3))) "Major mode for editing Julia source code" tar ((:commit . "b5f5983d2b232c8bba4c5eff75cccdb787c19d98") (:keywords "languages") (:url . "https://github.com/JuliaEditorSupport/julia-emacs"))])
- (julia-repl . [(20200625 924) ((emacs (25)) (s (1 12))) "A minor mode for a Julia REPL" tar ((:commit . "d073acb6339e99edf77833f82277afd9a076f16a") (:keywords "languages") (:authors ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainer "Tamas Papp" . "tkpapp@gmail.com") (:url . "https://github.com/tpapp/julia-repl"))])
- (julia-shell . [(20161125 1910) ((julia-mode (0 3))) "Major mode for an inferior Julia shell" tar ((:commit . "583a0b2ca20461ab4356929fd0f2212c22341b69") (:authors ("Dennis Ogbe" . "dogbe@purdue.edu")) (:maintainer "Dennis Ogbe" . "dogbe@purdue.edu"))])
- (julia-snail . [(20200711 452) ((emacs (26 2)) (cl-lib (0 5)) (dash (2 16 0)) (julia-mode (0 3)) (s (1 12 0)) (parsec (0 1 3)) (spinner (1 7 3)) (vterm (0 0 1))) "Julia Snail" tar ((:commit . "e2a6e0cdda849f78f43a506cdede054c6c8dfca6") (:url . "https://github.com/gcv/julia-snail"))])
- (jumblr . [(20170727 2043) ((s (1 8 0)) (dash (2 2 0))) "an anagram game for emacs" tar ((:commit . "34533dfb9db8538c005f4eaffafeff7ed193729f") (:keywords "anagram" "word game" "games") (:url . "https://github.com/mkmcc/jumblr"))])
- (jump . [(20161127 128) ((findr (0 7)) (inflections (2 4)) (cl-lib (0 5))) "build functions which contextually jump between files" single ((:commit . "e4f1372cf22e811faca52fc86bdd5d817498a4d8") (:keywords "project" "convenience" "navigation") (:authors ("Eric Schulte")) (:maintainer "Eric Schulte") (:url . "http://github.com/eschulte/jump.el"))])
- (jump-char . [(20180601 1348) nil "navigation by char" single ((:commit . "1e31a3c687f2b3c71bbfab881c6d75915534bb9e") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/jump-char"))])
- (jump-to-line . [(20130122 1653) nil "Jump to line number at point." single ((:commit . "01ef8c3529d85e6c59cc20840acbc4a8e8325bc8") (:keywords "jump" "line" "back" "file" "ruby" "csharp" "python" "perl") (:authors ("ongaeshi")) (:maintainer "ongaeshi"))])
- (jump-tree . [(20171014 1551) nil "Treat position history as a tree" tar ((:commit . "282267dc6305889e31d46b405b7ad4dfe5923b66") (:keywords "convenience" "position" "jump" "tree") (:authors ("Wen Yang" . "yangwen0228@foxmail.com")) (:maintainer "Wen Yang" . "yangwen0228@foxmail.com") (:url . "https://github.com/yangwen0228/jump-tree"))])
- (jumplist . [(20151120 345) ((cl-lib (0 5))) "Jump like vim jumplist or ex jumplist" single ((:commit . "c482d137d95bc5e1bcd790cdbde25b7f729b2502") (:keywords "jumplist" "vim") (:authors ("ganmacs <ganmacs_at_gmail.com>")) (:maintainer "ganmacs <ganmacs_at_gmail.com>") (:url . "https://github.com/ganmacs/jumplist"))])
- (jupyter . [(20200417 1907) ((emacs (26)) (zmq (0 10 3)) (cl-lib (0 5)) (simple-httpd (1 5 0)) (websocket (1 9))) "Jupyter" tar ((:commit . "785edbbff65abb0c929dc2fbd8b8305c77fd529e") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:url . "https://github.com/dzop/emacs-jupyter"))])
- (jvm-mode . [(20150422 708) ((dash (2 6 0)) (emacs (24))) "Monitor and manage your JVMs" single ((:commit . "3355dbaf5b0185aadfbad24160399abb32c5bea0") (:keywords "convenience") (:authors ("Martin Trojer" . "martin.trojer@gmail.com")) (:maintainer "Martin Trojer" . "martin.trojer@gmail.com") (:url . "https://github.com/martintrojer/jvm-mode.el"))])
- (k8s-mode . [(20191006 849) ((emacs (24 3)) (yaml-mode (0 0 10))) "Major mode for Kubernetes configuration file" tar ((:commit . "5984acee6f3891afa78acfd1d08c44a24953a233") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:url . "https://github.com/TxGVNN/emacs-k8s-mode"))])
- (kaesar . [(20160128 1008) ((cl-lib (0 3))) "Another AES algorithm encrypt/decrypt string with password." single ((:commit . "d087075cb1a46c2c85cd075220e09b2eaef9b86e") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))])
- (kaesar-file . [(20160128 1008) ((kaesar (0 1 1))) "Encrypt/Decrypt file by AES with password." single ((:commit . "d087075cb1a46c2c85cd075220e09b2eaef9b86e") (:keywords "data" "files") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))])
- (kaesar-mode . [(20160128 1008) ((kaesar (0 1 4)) (cl-lib (0 3))) "Encrypt/Decrypt buffer by AES with password." single ((:commit . "d087075cb1a46c2c85cd075220e09b2eaef9b86e") (:keywords "data" "convenience") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))])
- (kakapo-mode . [(20171004 451) ((cl-lib (0 5))) "TABS (hard or soft) for indentation (leading whitespace), and SPACES for alignment." single ((:commit . "292e07203c676361a1d918deb5acf2123cd70eaf") (:keywords "indentation") (:url . "https://github.com/listx/kakapo-mode"))])
- (kakoune . [(20200621 1818) ((ryo-modal (0 4)) (multiple-cursors (1 4)) (expand-region (0 11 0)) (emacs (25 1))) "A simulation, but not emulation, of kakoune" tar ((:commit . "ea8dde5dfe59c54d7729b141024976535b472573") (:authors ("Joseph Morag" . "jm4157@columbia.edu")) (:maintainer "Joseph Morag" . "jm4157@columbia.edu") (:url . "https://github.com/jmorag/kakoune.el"))])
- (kaleidoscope . [(20170808 817) ((s (1 11 0))) "Controlling Kaleidoscope-powered devices." single ((:commit . "52b5be3277f65cb5ca657973e9bd7f914b996356") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/kaleidoscope.el"))])
- (kaleidoscope-evil-state-flash . [(20170728 1020) ((evil (1 2 12)) (kaleidoscope (0 1 0)) (s (1 11 0))) "Flash keyboard LEDs when changing Evil state" single ((:commit . "52b5be3277f65cb5ca657973e9bd7f914b996356") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/kaleidoscope.el"))])
- (kanban . [(20170418 810) nil "Parse org-todo headlines to use org-tables as Kanban tables" single ((:commit . "dd11d722b20ae720f29b8aa93a3b1cad87650b33") (:keywords "outlines" "convenience") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de"))])
- (kanji-mode . [(20160826 1139) nil "View stroke order for kanji characters at cursor" tar ((:commit . "eda4f8666486689d36317db7dbda54fb73d3e3d2") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))])
- (kaocha-runner . [(20190904 1950) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER." single ((:commit . "1376d50f1fc91f9345351aeb4960b54bf83be59e") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/kaocha-runner.el"))])
- (kaolin-themes . [(20200720 1355) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "84f38e18254644319efd0086c19468798052ec0a") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))])
- (kaomoji . [(20171227 440) ((emacs (24 3)) (helm-core (1 9 1))) "Input kaomoji superb easily" tar ((:commit . "90a1490743b2a30762f5454c9d9309018eff83dd") (:keywords "tools" "fun") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:url . "https://github.com/kuanyui/kaomoji.el"))])
- (kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" single ((:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:keywords "kapacitor" "emacs" "magit" "tools") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com") (:url . "http://github.com/Manoj321/kapacitor-el"))])
- (karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" single ((:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:keywords "language" "javascript" "js" "karma" "testing") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:url . "http://github.com/tonini/karma.el"))])
- (kconfig-mode . [(20200628 1721) ((emacs (24 3))) "Major mode for editing Kconfig files" single ((:commit . "d9fdf751646abe2b75b7bbeb46e7552e0f36f290") (:keywords "kconfig" "languages" "linux" "kernel") (:authors ("Dela Anthonio" . "dell.anthonio@gmail.com")) (:maintainer "Dela Anthonio" . "dell.anthonio@gmail.com") (:url . "https://github.com/delaanthonio/kconfig-mode"))])
- (kdeconnect . [(20180126 2340) nil "An interface for KDE Connect" single ((:commit . "ca0cbf9a628ba7b519b43fa85e0d988ca26bf853") (:keywords "kdeconnect" "android") (:authors ("Carl Lieberman" . "dev@carl.ac")) (:maintainer "Carl Lieberman" . "dev@carl.ac"))])
- (keepass-mode . [(20200216 723) ((emacs (27))) "Mode to open Keepass DB" single ((:commit . "09dcc1da15808b5b6c22bc5d0cb4e2ba5d425ef8") (:keywords "data" "files" "tools") (:authors ("Ignasi Fosch" . "natx@y10k.ws")) (:maintainer "Ignasi Fosch" . "natx@y10k.ws") (:url . "https://github.com/ifosch/keepass-mode"))])
- (keg . [(20200726 228) ((emacs (24 1)) (cl-lib (0 6))) "Modern Elisp package development system" tar ((:commit . "fea2f831d84d7642c35820bb63250487e46683e5") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/keg.el"))])
- (keg-mode . [(20200601 333) ((emacs (24 4))) "Major mode for editing Keg files" single ((:commit . "fea2f831d84d7642c35820bb63250487e46683e5") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/keg.el"))])
- (kerl . [(20150424 2005) nil "Emacs integration for kerl" single ((:commit . "1732ee26213f021bf040919c45ad276aafcaae14") (:keywords "tools") (:authors ("Correl Roush" . "correl@gmail.com")) (:maintainer "Correl Roush" . "correl@gmail.com") (:url . "http://github.com/correl/kerl.el/"))])
- (key-chord . [(20160227 1238) nil "map pairs of simultaneously pressed keys to commands" single ((:commit . "72443e9ff3c4f1c3ccaced3130236801efde3d83") (:keywords "keyboard" "chord" "input") (:authors ("David Andersson <l.david.andersson(at)sverige.nu>")) (:maintainer "David Andersson <l.david.andersson(at)sverige.nu>"))])
- (key-combo . [(20150324 1439) nil "map key sequence to commands" single ((:commit . "2fb5c65bc82d5bd2964e2b163822429ab45d90a1") (:keywords "keyboard" "input") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:url . "https://github.com/uk-ar/key-combo"))])
- (key-intercept . [(20140211 749) nil "Intercept prefix keys" single ((:commit . "d9a60edb4ce893f2d3d94f242164fdcc62d43cf2") (:keywords "keyboard") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:url . "http://github.com/tarao/key-intercept-el"))])
- (key-leap . [(20160831 1447) ((emacs (24 3))) "Leap between lines by typing keywords" single ((:commit . "b3f6ef15c8a13870475d5af159fa24b30f97dea0") (:keywords "point" "convenience") (:authors ("Martin Rykfors" . "martinrykfors@gmail.com")) (:maintainer "Martin Rykfors" . "martinrykfors@gmail.com") (:url . "https://github.com/MartinRykfors/key-leap"))])
- (key-quiz . [(20200226 2129) ((emacs (26))) "Emacs Keys Quiz" single ((:commit . "1ee67f3f8977d95785e021f7896685de1979137e") (:keywords "games") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:url . "https://github.com/federicotdn/key-quiz"))])
- (key-seq . [(20150907 756) ((key-chord (0 6))) "map pairs of sequentially pressed keys to commands" single ((:commit . "e29b083a6427d061638749194fc249ef69ad2cc0") (:keywords "convenience" "keyboard" "keybindings") (:authors ("Vyacheslav Levit" . "dev@vlevit.org")) (:maintainer "Vyacheslav Levit" . "dev@vlevit.org") (:url . "http://github.com/vlevit/key-seq.el"))])
- (keycast . [(20200612 2247) ((emacs (25 3))) "Show current command and its key in the mode line" single ((:commit . "038475c178e90c7bad64d113db26d42cad60e149") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/keycast"))])
- (keychain-environment . [(20180318 2223) nil "load keychain environment variables" single ((:commit . "d3643196de6dc79ea77f9f4805028350fd76100b") (:keywords "gnupg" "pgp" "ssh") (:authors ("Paul Tipper <bluefoo at googlemail dot com>")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/keychain-environment"))])
- (keydef . [(20090428 1931) nil "a simpler way to define keys, with kbd syntax" single ((:commit . "dff2be9f58d12d8c6a490ad0c1b2b10b55528dc0") (:keywords "convenience" "lisp" "customization" "keyboard" "keys") (:authors ("Michael John Downes" . "mjd@ams.org")) (:maintainer "Michael John Downes" . "mjd@ams.org"))])
- (keyfreq . [(20160516 1416) ((cl-lib (0 5))) "track command frequencies" single ((:commit . "e5fe9d585ce882f1ba9afa5d894eaa82c79be4f4") (:authors ("Ryan Yeske, Michal Nazarewicz (mina86/AT/mina86.com)")) (:maintainer "David Capello, Xah lee"))])
- (keymap-utils . [(20200413 1858) ((cl-lib (0 3))) "keymap utilities" single ((:commit . "195e0ca5b1b9967faf94a3e5a634d8975b796705") (:keywords "convenience" "extensions") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/keymap-utils"))])
- (keypress-multi-event . [(20190109 530) ((emacs (24 3))) "Perform different actions for the same keypress." single ((:commit . "9de65a27e10d8ae47aa6d28c02c3eb82ee8c0b2e") (:keywords "abbrev" "convenience" "wp" "keyboard") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:url . "https://www.github.com/Boruch_Baum/emacs-keypress-multi-event"))])
- (keypression . [(20200626 130) ((emacs (26 3))) "Keystroke visualizer" single ((:commit . "e9f1fa49334aac29dec1df6bf0a40adc5eb327a2") (:keywords "key" "screencast" "tools") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:url . "https://github.com/chuntaro/emacs-keypression"))])
- (keyset . [(20150220 530) ((dash (2 8 0)) (cl-lib (0 5))) "A small library for structuring key bindings." single ((:commit . "45ce83c4b56f064874256db37e697a63b2c69e65") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/keyset"))])
- (keystore-mode . [(20190409 1946) ((emacs (24 3)) (origami (1 0)) (s (1 12 0)) (seq (2 20))) "A major mode for viewing and managing (java) keystores" tar ((:commit . "43bd5926348298d077c7221f37902c990df3f951") (:keywords "tools") (:authors ("Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com")) (:maintainer "Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com") (:url . "https://github.com/peterpaul/keystore-mode"))])
- (keyswap . [(20160813 957) ((emacs (24 3))) "swap bindings between key pairs" single ((:commit . "cd682a7c4a8d64d6bae6a005db5045232e5e7b95") (:keywords "convenience") (:authors ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainer "Matthew Malcomson" . "hardenedapple@gmail.com") (:url . "http://github.com/hardenedapple/keyswap.el"))])
- (keyword-search . [(20180424 1102) nil "browser keyword search from Emacs" tar ((:commit . "f8475ecaddb8804a9be6bee47678207c86ac8dee") (:keywords "web" "search" "keyword") (:maintainer "Jens Petersen") (:url . "https://github.com/juhp/keyword-search"))])
- (kfg . [(20140909 538) ((f (0 17 1))) "an emacs configuration system" single ((:commit . "d2c9dd26618fb2f7bf1e7b6eae193b1cceba3c97") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/kfg"))])
- (khardel . [(20191124 1257) ((emacs (25 1)) (yaml-mode (0 0 13))) "Integrate with khard" tar ((:commit . "5ee835a4429c58dec3900e4fa3d7cc1e778c969b") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/DamienCassou/khardel"))])
- (kibit-helper . [(20150508 1533) ((s (0 8)) (emacs (24))) "Conveniently use the Kibit Leiningen plugin from Emacs" single ((:commit . "16bdfff785ee05d8e74a5780f6808506d990cef7") (:keywords "languages" "clojure" "kibit") (:authors ("Jonas Enlund") ("James Elliott" . "james@brunchboy.com")) (:maintainer "Jonas Enlund") (:url . "http://www.github.com/brunchboy/kibit-helper"))])
- (kill-or-bury-alive . [(20190713 1340) ((emacs (24 4)) (cl-lib (0 5))) "Precise control over buffer killing in Emacs" single ((:commit . "7db85a3f3004ff400e24105d1875f4e3a6eec7a6") (:keywords "buffer" "killing" "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/kill-or-bury-alive"))])
- (kill-ring-search . [(20140422 1555) nil "incremental search for the kill ring" single ((:commit . "23535b4a01a1cb1574604e36c49614e84e85c883") (:keywords "convenience" "matching") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/kill-ring-search/"))])
- (killer . [(20190128 10) nil "kill and delete text" single ((:commit . "ace0547944933440384ceeb5876b1f68c082d540") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "http://github.com/tarsius/killer"))])
- (kite . [(20130201 1938) ((json (1 2)) (websocket (0 93 1))) "WebKit inspector front-end" tar ((:commit . "7ed74d1147a6ddd152d3da65dc30df3517d53144") (:keywords "tools") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com"))])
- (kite-mini . [(20160508 1106) ((dash (2 11 0)) (websocket (1 5))) "Remotely evaluate JavaScript in the WebKit debugger" tar ((:commit . "a68619dbc109c7989f3448426d8c1ee9e797c11f") (:keywords "webkit") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com") (:url . "https://github.com/tungd/kite-mini.el"))])
- (kivy-mode . [(20180702 2029) nil "Emacs major mode for editing Kivy files" single ((:commit . "ed2615e542d19a7b2f1a8afa85af5e1b190cd519") (:authors ("Dean Serenevy" . "dean@serenevy.net")) (:maintainer "Dean Serenevy" . "dean@serenevy.net"))])
- (kiwix . [(20200714 1357) ((emacs (24 4)) (cl-lib (0 5)) (request (0 3 0))) "Searching offline Wikipedia through Kiwix." tar ((:commit . "cb3e2531a55b896b9b41f38f97a597c26433da8e") (:keywords "kiwix" "wikipedia") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:url . "https://github.com/stardiviner/kiwix.el"))])
- (kixtart-mode . [(20150611 1604) ((emacs (24))) "major mode for Kixtart scripting files" single ((:commit . "1c2356797e7b766bbaaa2b341176a8b10499cd79") (:keywords "languages") (:authors ("Ryrun <https://github.com/ryrun>")) (:maintainer "Ryrun <https://github.com/ryrun>") (:url . "https://github.com/ryrun/kixtart-mode"))])
- (klere-theme . [(20180415 1823) ((emacs (24))) "A dark theme with lambent color highlights and incremental grays" single ((:commit . "c064f9e5c44173c239fce239a62c8d5e61827672") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:url . "https://github.com/WammKD/emacs-klere-theme"))])
- (know-your-http-well . [(20160208 2304) nil "Look up the meaning of HTTP headers, methods, relations, status codes" tar ((:commit . "3cc5ab6d2764ab7aacb1b6e026abaccbeb6c37f2"))])
- (kodi-remote . [(20190622 1325) ((request (0 2 0)) (let-alist (1 0 4)) (json (1 4)) (cl-lib (0 5)) (f (20190109 906))) "Remote Control for Kodi" single ((:commit . "f5e932036c16e2b61a63020e006fc601e38d181e") (:keywords "kodi" "tools" "convinience") (:authors ("Stefan Huchler" . "stefan.huchler@mail.de")) (:maintainer "Stefan Huchler" . "stefan.huchler@mail.de") (:url . "http://github.com/spiderbit/kodi-remote.el"))])
- (kolon-mode . [(20140122 1134) nil "Syntax highlighting for Text::Xslate's Kolon syntax" single ((:commit . "5af0955e280ae991862189ebecd3937c5fc8fb9f") (:keywords "xslate" "perl") (:authors ("Sam Tran")) (:maintainer "Sam Tran") (:url . "https://github.com/samvtran/kolon-mode"))])
- (kooten-theme . [(20161023 905) ((emacs (24 1))) "Dark color theme" single ((:commit . "d10197b4dd7af02cd14aeab2573c273a294798c3") (:keywords "themes") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com") (:url . "http://github.com/kootenpv/emacs-kooten-theme"))])
- (korean-holidays . [(20190102 1558) nil "Korean holidays for calendar." single ((:commit . "3f90ed86f46f8e5533f23baa40e2513ac497ca2b") (:keywords "calendar") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com") (:url . "https://github.com/tttuuu888/korean-holidays"))])
- (kosmos-theme . [(20170502 1850) ((emacs (24))) "Black and lightgray theme with not so much syntax highlighting." single ((:commit . "616456d2376a75dc31190ad65137d179fbad4336") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/kosmos-theme"))])
- (kotlin-mode . [(20191102 1510) ((emacs (24 3))) "Major mode for kotlin" tar ((:commit . "8e6dd578f2b3d77ac33b6384d2bfe1b1f6799a1a") (:keywords "languages") (:authors ("Shodai Yokoyama" . "quantumcars@gmail.com")) (:maintainer "Shodai Yokoyama" . "quantumcars@gmail.com"))])
- (kpm-list . [(20170924 1352) nil "An emacs buffer list that tries to intelligently group together buffers." single ((:commit . "e0f5112e5ce8ec1b603f4428fa51681c68bb28f5") (:authors ("Kevin Mahoney")) (:maintainer "Kevin Mahoney") (:url . "https://github.com/KMahoney/kpm-list/"))])
- (kroman . [(20150827 2340) nil "Korean hangul romanization" single ((:commit . "90402b6ae40383e75d8ba97d66eee93eebf40f70") (:keywords "korean" "roman") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com"))])
- (ksp-cfg-mode . [(20190414 2348) ((emacs (24)) (cl-lib (0 5))) "major mode for editing KSP CFG files" single ((:commit . "faec8bd8456c67276d065eb68c88a30efcef59ef") (:keywords "data") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net") (:url . "http://github.com/lashtear/ksp-cfg-mode"))])
- (kubectx-mode . [(20200116 1918) ((emacs (24))) "Change kubectl context/namespace and show in mode line" single ((:commit . "f08687ae5403eb18bbeffc6dafdfde469bdb9a36") (:keywords "tools" "kubernetes") (:authors ("Terje Sannum" . "terje@offpiste.org")) (:maintainer "Terje Sannum" . "terje@offpiste.org") (:url . "https://github.com/terjesannum/emacs-kubectx-mode"))])
- (kubel . [(20200611 1437) ((transient (0 1 0)) (emacs (25 3)) (dash (2 17 0)) (s (1 2 0))) "extension for controlling Kubernetes with limited permissions" single ((:commit . "53311433e0e39377ccd90c9e62bdfa9844bb8b15") (:keywords "kubernetes" "k8s" "tools" "processes") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/kubel"))])
- (kubel-evil . [(20200312 1349) ((kubel (1 0)) (evil (1 0)) (emacs (25 3))) "extension for kubel to provide evil keybindings" single ((:commit . "53311433e0e39377ccd90c9e62bdfa9844bb8b15") (:keywords "kubernetes" "k8s" "tools" "processes" "evil" "keybindings") (:authors ("Marcel Patzwahl")) (:maintainer "Marcel Patzwahl") (:url . "https://github.com/abrochard/kubel"))])
- (kubernetes . [(20200114 436) ((emacs (25 1)) (dash (2 12 0)) (magit (2 8 0)) (magit-popup (2 13 0))) "Magit-like porcelain for Kubernetes." tar ((:commit . "cc33d8c7bb114c34809ee86020b9e635eff0017b") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool"))])
- (kubernetes-evil . [(20191108 615) ((kubernetes (0 13 0)) (evil (1 2 12))) "Kubernetes keybindings for evil-mode." single ((:commit . "cc33d8c7bb114c34809ee86020b9e635eff0017b") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool"))])
- (kubernetes-helm . [(20190201 320) ((yaml-mode (0 0 13)) (emacs (25 3))) "extension for helm, the package manager for kubernetes" single ((:commit . "bdf9280899b5efab6d55ffd96bad716c5f8e75bc") (:keywords "kubernetes" "helm" "k8s" "tools" "processes") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/kubernetes-helm"))])
- (kubernetes-tramp . [(20181228 922) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for kubernetes containers" single ((:commit . "8713571b66940f8f3f496b55baa23cdf1df7a869") (:keywords "kubernetes" "convenience") (:authors ("Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com")) (:maintainer "Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com") (:url . "https://github.com/gruggiero/kubernetes-tramp"))])
- (kurecolor . [(20200113 2027) ((emacs (24 1)) (s (1 0))) "color editing goodies for Emacs" single ((:commit . "3fc84840cbbd75e646cafa2fd3a00004b55e37ec") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))])
- (kv . [(20140108 1534) nil "key/value data structure functions" single ((:commit . "721148475bce38a70e0b678ba8aa923652e8900e") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (kwin . [(20150308 1812) nil "communicatewith the KWin window manager" single ((:commit . "d4f8f3593598b71ee596e0a87b2c1d6a912a9566") (:authors ("Simon Hafner")) (:maintainer "Simon Hafner") (:url . "http://github.com/reactormonk/kwin-minor-mode"))])
- (lab-themes . [(20200204 1931) ((emacs (24))) "A custom theme carefully constructed in the LAB space" tar ((:commit . "2cd61072d2b4c563d961f80918fc6b1dc45f7ba4") (:keywords "lisp") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:url . "https://github.com/MetroWind/lab-theme"))])
- (labburn-theme . [(20200309 1556) nil "A lab color space zenburn theme." single ((:commit . "d11537a2060df7e992217ede8f65d6c11de49458") (:keywords "theme" "zenburn") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:url . "https://github.com/ksjogo/labburn-theme"))])
- (laguna-theme . [(20191229 19) nil "A theme that's easy on the eyes & focuses on importance." single ((:commit . "0da19f68ba22a39c02d83063f5b4936401ce4d97") (:authors ("Henry Newcomer" . "a.cliche.email@gmail.com")) (:maintainer "Henry Newcomer" . "a.cliche.email@gmail.com") (:url . "https://github.com/HenryNewcomer/laguna-theme"))])
- (lambdapi-mode . [(20200706 1546) ((emacs (26 1)) (eglot (1 5)) (math-symbol-lists (1 2 1))) "A major mode for editing Lambdapi source code" tar ((:commit . "5ae3dd537734c997e0908a92c13b52fcde09f546") (:keywords "languages") (:authors ("Rodolphe Lepigre, Gabriel Hondet")) (:maintainer "Deducteam" . "dedukti-dev@inria.fr") (:url . "https://github.com/Deducteam/lambdapi"))])
- (lammps-mode . [(20180801 1319) ((emacs (24 4))) "basic syntax highlighting for LAMMPS files" single ((:commit . "a5b68d7a59975770b56ee8f6e66fa4f703a72ffe") (:keywords "languages" "faces") (:authors ("Aidan Thompson <athomps at sandia.gov>")) (:maintainer "Rohit Goswami <r95g10 at gmail.com>") (:url . "https://github.com/lammps/lammps/tree/master/tools/emacs"))])
- (lang-refactor-perl . [(20131122 2127) nil "Simple refactorings, primarily for Perl" single ((:commit . "691bd69639de6b7af357e3b7143563ececd9c497") (:keywords "languages" "refactoring" "perl") (:authors (nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>")) (:maintainer nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>") (:url . "https://github.com/jplindstrom/emacs-lang-refactor-perl"))])
- (langdoc . [(20150218 645) ((cl-lib (0 2))) "Help to define help document mode for various languages" single ((:commit . "2c7223bacb116992d700ecb19a60df5c09c63424") (:keywords "convenience" "eldoc") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:url . "https://github.com/tom-tan/langdoc/"))])
- (langtool . [(20200529 230) ((cl-lib (0 3))) "Grammar check utility using LanguageTool" single ((:commit . "8276eccc5587bc12fd205ee58a7a982f0a136e41") (:keywords "docs") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-langtool"))])
- (language-detection . [(20161123 1813) ((emacs (24)) (cl-lib (0 5))) "Automatic language detection from code snippets" single ((:commit . "54a6ecf55304fba7d215ef38a4ec96daff2f35a4") (:authors ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainer "Andreas Jansson" . "andreas@jansson.me.uk") (:url . "https://github.com/andreasjansson/language-detection.el"))])
- (language-id . [(20200726 1813) ((emacs (24)) (cl-lib (0 5))) "Library to work with programming language identifiers" single ((:commit . "aa541a4461a07add17374fd56aef6e2fd1a61c60") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-language-id"))])
- (languagetool . [(20200507 610) ((emacs (25 1))) "LanguageTool integration for grammar check" tar ((:commit . "e7faecf8a7eec8086aafc48a5c4f1908bb5c4300") (:keywords "grammar" "text" "docs" "tools") (:authors ("Joar Buitrago" . "jebuitragoc@unal.edu.co")) (:maintainer "Joar Buitrago" . "jebuitragoc@unal.edu.co") (:url . "https://github.com/PillFall/Emacs-LanguageTool.el"))])
- (lastfm . [(20200701 715) ((emacs (26 1)) (request (0 3 0)) (anaphora (1 0 4)) (memoize (1 1)) (elquery (0 1 0)) (s (1 12 0))) "Last.fm API for Emacs Lisp" single ((:commit . "cfa5e9b0b1f54884dc36ae5d8f35e3c6b841ef74") (:keywords "multimedia" "api") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:url . "https://github.com/mihaiolteanu/lastfm.el/"))])
- (lastpass . [(20200320 2117) ((emacs (24 4)) (seq (1 9)) (cl-lib (0 5))) "LastPass command wrapper" single ((:commit . "ac472f844bd1e109c62479253cbc40bb5e50ed8f") (:keywords "extensions" "processes" "lpass" "lastpass") (:authors ("Petter Storvik")) (:maintainer "Petter Storvik") (:url . "https://github.com/storvik/emacs-lastpass"))])
- (latex-extra . [(20170817 147) ((auctex (11 86 1)) (cl-lib (0 5))) "Adds several useful functionalities to LaTeX-mode." single ((:commit . "82d99b8b0c2db20e5270749582e03bcc2443ffb5") (:keywords "tex") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com") (:url . "http://github.com/Malabarba/latex-extra"))])
- (latex-math-preview . [(20190123 802) nil "preview LaTeX mathematical expressions." single ((:commit . "90fd86da2d9514882146a5db40cb916fc533cf55") (:keywords "latex" "tex") (:authors ("Takayuki YAMAGUCHI" . "d@ytak.info")) (:maintainer "Takayuki YAMAGUCHI" . "d@ytak.info") (:url . "https://gitlab.com/latex-math-preview/latex-math-preview"))])
- (latex-pretty-symbols . [(20151112 1044) nil "Display many latex symbols as their unicode counterparts" single ((:commit . "83d5888147bb734a94dfd4847a11e975a7d86ba8") (:keywords "convenience" "display") (:authors ("Erik Parmann" . "eparmann@gmail.com") ("Pål Drange")) (:maintainer "Erik Parmann" . "eparmann@gmail.com") (:url . "https://bitbucket.org/mortiferus/latex-pretty-symbols.el"))])
- (latex-preview-pane . [(20181008 1822) nil "Makes LaTeX editing less painful by providing a updatable preview pane" tar ((:commit . "5297668a89996b50b2b62f99cba01cc544dbed2e"))])
- (latex-unicode-math-mode . [(20170123 1816) nil "Input method for Unicode math symbols" tar ((:commit . "eb4a5c9f9b00a58d2ca80f90782a851f4c8497b8") (:authors ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainer "Christoph Dittmann" . "github@christoph-d.de") (:url . "https://github.com/Christoph-D/latex-unicode-math-mode"))])
- (latexdiff . [(20190827 1651) ((emacs (24 4))) "Latexdiff integration in Emacs" single ((:commit . "56d0b240867527d1b43d3ddec14059361929b971") (:keywords "tex" "vc" "tools" "git" "helm") (:authors ("Launay Gaby" . "gaby.launay@tutanota.com")) (:maintainer "Launay Gaby" . "gaby.launay@tutanota.com") (:url . "http://github.com/galaunay/latexdiff.el"))])
- (launch . [(20130619 2204) nil "launch files with OS-standard associated applications." single ((:commit . "e7c3b573fc05fe4d3d322389079909311542e799") (:keywords "convenience" "processes") (:authors ("Simon Law" . "sfllaw@sfllaw.ca")) (:maintainer "Simon Law" . "sfllaw@sfllaw.ca") (:url . "https://github.com/sfllaw/emacs-launch"))])
- (launch-mode . [(20170106 512) ((emacs (24 4))) "Major mode for launch-formatted text" tar ((:commit . "25ebd4ba77afcbe729901eb74923dbe9ae81c313") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:url . "https://github.com/iory/launch-mode"))])
- (launchctl . [(20200531 1043) ((emacs (24 1))) "Interface to launchctl on Mac OS X." single ((:commit . "96886b7e64d15ffd3319c8b4b04310ccdc648576") (:keywords "tools" "convenience") (:authors ("Peking Duck <github.com/pekingduck>")) (:maintainer "Peking Duck <github.com/pekingduck>") (:url . "http://github.com/pekingduck/launchctl-el"))])
- (lavender-theme . [(20170808 1313) ((emacs (24 0))) "an Emacs 24 theme based on Lavender (tmTheme)" single ((:commit . "ef5e959b95d7fb8152137bc186c4c24e986c1e3c") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (lavenderless-theme . [(20200213 2057) ((colorless-themes (0 1))) "A mostly colorless version of lavender-theme" single ((:commit . "5df88f835527bb7c86fd18515af6fc18d661e386") (:keywords "faces" "theme") (:authors ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainer "Thomas Letan" . "contact@thomasletan.fr") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))])
- (lcb-mode . [(20160816 540) ((emacs (24))) "LiveCode Builder major mode" single ((:commit . "be0768e9aa6f9b8e76f2230f4f7f4d152a766b9a") (:keywords "languages") (:authors ("Peter TB Brett" . "peter@peter-b.co.uk")) (:maintainer "Peter TB Brett" . "peter@peter-b.co.uk") (:url . "https://github.com/peter-b/lcb-mode"))])
- (lcr . [(20180902 1919) ((dash (2 12 0)) (emacs (25 1))) "lightweight coroutines" single ((:commit . "c14f40692292d59156c7632dbdd2867c086aa75f") (:keywords "tools") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:url . "https://github.com/jyp/lcr"))])
- (leaf . [(20200706 2213) ((emacs (24 4))) "Simplify your init.el configuration, extended use-package" single ((:commit . "447b152be4a65a5e91f53ef795a0ebadcbb22bf5") (:keywords "lisp" "settings") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/leaf.el"))])
- (leaf-convert . [(20200415 1725) ((emacs (26 1)) (leaf (3 6 0)) (leaf-keywords (1 1 0)) (ppp (2 1))) "Convert many format to leaf format" single ((:commit . "2a8ec045d5d36e85e7deb2a46aefacaecf4bfafe") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/leaf-convert.el"))])
- (leaf-keywords . [(20200428 1803) ((emacs (24 4)) (leaf (3 5 0))) "Additional leaf.el keywords for external packages" single ((:commit . "bdf225b2b2cc76b87f5bf55dfa09c3a020ac1e7d") (:keywords "lisp" "settings") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/leaf-keywords.el"))])
- (leaf-manager . [(20200707 409) ((emacs (26 1)) (leaf (4 1)) (leaf-convert (1 0)) (ppp (2 1))) "Configuration manager for leaf based init.el" single ((:commit . "f9b8c47576eaeeedbabdda8d7b674866a6144d30") (:keywords "convenience" "leaf") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/leaf-manager.el"))])
- (leaf-tree . [(20200412 2355) ((emacs (25 1)) (imenu-list (0 8))) "Interactive side-bar feature for init.el using leaf" single ((:commit . "22f6c116cf1465c28d4a35d8a4587a8b614be175") (:keywords "convenience" "leaf") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/leaf-tree.el"))])
- (lean-mode . [(20200620 919) ((emacs (24 3)) (dash (2 12 0)) (dash-functional (1 2 0)) (s (1 10 0)) (f (0 19 0)) (flycheck (30))) "A major mode for the Lean language" tar ((:commit . "6b4377686128d5c2fb55d8fe61b92a9991d40fbd") (:keywords "languages") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:url . "https://github.com/leanprover/lean-mode"))])
- (leanote . [(20161223 139) ((emacs (24 4)) (cl-lib (0 5)) (request (0 2)) (let-alist (1 0 3)) (pcache (0 4 0)) (s (1 10 0)) (async (1 9))) "A minor mode writing markdown leanote" single ((:commit . "d499e7b59bb1f1a2fabc0e4c26fb101ed62ebc7b") (:keywords "leanote" "note" "markdown") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com") (:url . "https://github.com/aborn/leanote-emacs"))])
- (learn-ocaml . [(20200224 2229) ((emacs (25 1))) "Emacs frontend for learn-ocaml" single ((:commit . "86505672be0aabc9fa1048bc453ab2fc855b27e1") (:url . "https://github.com/pfitaxel/learn-ocaml.el"))])
- (ledger-import . [(20200522 853) ((emacs (25 1)) (ledger-mode (3 1 1))) "Fetch OFX files from bank and push them to Ledger" single ((:commit . "027a6caf173948feacd2f416a7995d82f82165e7") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/libmpdel"))])
- (ledger-mode . [(20200530 1710) ((emacs (25 1))) "Helper code for use with the \"ledger\" command-line tool" tar ((:commit . "f8463744191b4feb9fea54190917663f7ba26102"))])
- (leerzeichen . [(20170422 1313) nil "Minor mode to display whitespace characters." single ((:commit . "5acf9855ecb2b2cd5da4402bb48df149e7525cc5") (:keywords "whitespace" "characters") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:url . "http://github.com/fgeller/leerzeichen.el"))])
- (leetcode . [(20200730 1433) ((emacs (26)) (dash (2 16 0)) (graphql (0 1 1)) (spinner (1 7 3)) (aio (1 0)) (log4e (0 3 3))) "An leetcode client." single ((:commit . "153a3a6a9ffb64ffce37b3d203c13a85cc1884ab") (:keywords "extensions" "tools") (:authors ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainer "Wang Kai" . "kaiwkx@gmail.com") (:url . "https://github.com/kaiwk/leetcode.el"))])
- (legalese . [(20200119 2248) nil "Add legalese to your program files" single ((:commit . "e465471d2d5a62d35073d93e0f8d40387a82e302") (:keywords "convenience") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/jorgenschaefer/legalese"))])
- (lemon-mode . [(20130216 1304) nil "A major mode for editing lemon grammar files" single ((:commit . "155bfced6c9afc8072a0133d3d1baa54c6d67430") (:keywords "lemon") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com"))])
- (lenlen-theme . [(20170329 245) ((color-theme-solarized (20150110))) "a solarized-based kawaii light theme" single ((:commit . "b8a6412c81633b10fb98ba0930f55b25071c084a") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (lentic . [(20190102 2124) ((emacs (24 4)) (m-buffer (0 13)) (dash (2 5 0)) (f (0 17 2)) (s (1 9 0))) "One buffer as a view of another" tar ((:commit . "e6d013bf570bb235817f6c8f0abdd31d3b456d53") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))])
- (lentic-server . [(20160717 2052) ((lentic (0 8)) (web-server (0 1 1))) "Web Server for Emacs Literate Source" single ((:commit . "8e809fafbb27a98f815b544d9d9ee15843eb6a36") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))])
- (less-css-mode . [(20161001 453) nil "Major mode for editing LESS CSS files (lesscss.org)" single ((:commit . "c7fa3d56d83206b28657f2e56439dc62280a2bf2") (:keywords "less" "css" "mode") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/less-css-mode"))])
- (letcheck . [(20160202 1948) nil "Check the erroneous assignments in let forms" single ((:commit . "edf188ca2f85349e971b83f164c6484264e79426") (:keywords "convenience") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/letcheck"))])
- (letterbox-mode . [(20170702 125) ((emacs (24 3))) "hide sensitive text on a buffer" single ((:commit . "88c67a51d67216d569a28e8423200883fde096dd") (:keywords "password" "convenience") (:authors ("Fernando Leboran" . "f.leboran@gmail.com")) (:maintainer "Fernando Leboran" . "f.leboran@gmail.com") (:url . "http://github.com/pacha64/letterbox-mode"))])
- (leuven-theme . [(20200707 1143) nil "Awesome Emacs color theme on white background" tar ((:commit . "a116202c82613c087440d2e8a6a504b08f1862ce") (:keywords "color" "theme") (:authors ("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) (:maintainer "Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>") (:url . "https://github.com/fniessen/emacs-leuven-theme"))])
- (levenshtein . [(20090830 1040) nil "Edit distance between two strings." single ((:commit . "070925197ebf6b704e6e00c4f2d2ec783f3df38c") (:keywords "lisp") (:authors ("Aaron S. Hawley <ashawley at uvm dot edu>,") ("Art Taylor")) (:maintainer "Aaron S. Hawley <ashawley at uvm dot edu>,"))])
- (lexbind-mode . [(20141027 1429) nil "Puts the value of lexical-binding in the mode line" single ((:commit . "fa0a6848c1cfd3fbf45db43dc2deef16377d887d") (:keywords "convenience" "lisp") (:authors ("Andrew Kirkpatrick" . "ubermonk@gmail.com")) (:maintainer "Andrew Kirkpatrick" . "ubermonk@gmail.com") (:url . "https://github.com/spacebat/lexbind-mode"))])
- (lfe-mode . [(20170121 1254) nil "Lisp Flavoured Erlang mode" tar ((:commit . "abd6e57c24bb7bc7bd56a6ee291df678a5852643"))])
- (libbcel . [(20191203 654) ((emacs (26 1)) (request (0 3 1))) "Library to connect to basecamp 3 API" tar ((:commit . "df466d31544c53d8550f9c08e58b70adc559c48c") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/bcel/libbcel"))])
- (libelcouch . [(20190820 1632) ((emacs (25 1)) (request (0 3 0))) "Communication with CouchDB" single ((:commit . "29e369df4f96c7ad95bb33292de7a44122e0b4e7") (:keywords "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/elcouch/libelcouch/"))])
- (liberime . [(20200511 46) ((emacs (25 1))) "Rime elisp binding" tar ((:commit . "a631d3d575b5ffa2dc9a3a950c53f425c21380c1") (:keywords "convenience" "chinese" "input-method" "rime") (:authors ("A.I.")) (:maintainer "A.I.") (:url . "https://github.com/merrickluo/liberime"))])
- (libgit . [(20200515 1759) ((emacs (25 1))) "Thin bindings to libgit2." tar ((:commit . "0ef8b13aef011a98b7da756e4f1ce3bb18e4d55a") (:keywords "git" "vc") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:url . "https://github.com/magit/libegit2"))])
- (libmpdee . [(20160117 2301) nil "Client end library for mpd, a music playing daemon" single ((:commit . "a6ca3b7d6687f3ba60996b9b5044ad1d3b228290") (:keywords "music" "mpd") (:authors ("Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com")) (:maintainer "Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com"))])
- (libmpdel . [(20200105 1537) ((emacs (25 1))) "Communication with an MPD server" tar ((:commit . "95cb45ecea933e7befb2a5a6a6e7d15651c8746a") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/libmpdel"))])
- (lice . [(20200607 103) nil "License And Header Template" tar ((:commit . "482e58ab83fff86ed754b00be27b62a219597e7c") (:keywords "template" "license" "tools") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com") (:url . "https://github.com/buzztaiki/lice-el"))])
- (light-soap-theme . [(20150607 1445) ((emacs (24))) "Emacs 24 theme with a light background." single ((:commit . "76a787bd40c6b567ae68ced7f5d9f9f10725e00d"))])
- (line-reminder . [(20200731 258) ((emacs (24 4)) (indicators (0 0 4))) "Line annotation similar to Visual Studio" single ((:commit . "961f593aba142cab4133f3be3b8f5ebbd91ba2ab") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/line-reminder"))])
- (line-up-words . [(20180219 1024) nil "Align words in an intelligent way" single ((:commit . "ffa07b82102945f18efb4430a6554835c450f6bf") (:url . "https://github.com/janestreet/line-up-words"))])
- (lines-at-once . [(20180422 247) ((emacs (25))) "Insert and edit multiple lines at once" single ((:commit . "a018ba90549384d52ec58c2685fd14a0f65252be") (:keywords "abbrev" "tools") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:url . "https://github.com/jiahaowork/lines-at-once.el"))])
- (lingr . [(20100807 1731) nil "Lingr Client for GNU Emacs" single ((:commit . "4215a8704492d3c860097cbe2649936c22c196df") (:keywords "chat" "client" "internet") (:authors ("lugecy" . "lugecy@gmail.com")) (:maintainer "lugecy" . "lugecy@gmail.com") (:url . "http://github.com/lugecy/lingr-el"))])
- (linguistic . [(20181129 2116) nil "A package for basic linguistic analysis." tar ((:commit . "23e47e98cdb09ee61883669b6d8a11bf6449862c") (:keywords "linguistics" "text analysis" "matching") (:authors ("Andrew Favia <drewlinguistics01 at gmail dot com>")) (:maintainer "Andrew Favia <drewlinguistics01 at gmail dot com>") (:url . "https://github.com/andcarnivorous/linguistic"))])
- (link . [(20191111 446) nil "Hypertext links in text buffers" single ((:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:keywords "interface" "hypermedia") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net"))])
- (link-hint . [(20200718 1737) ((avy (0 4 0)) (emacs (24 1)) (cl-lib (0 5))) "Use avy to open, copy, etc. visible links." single ((:commit . "be735e5b57dfad891a7394c116b584bf005fe3b4") (:keywords "convenience" "url" "avy" "link" "links" "hyperlink") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:url . "https://github.com/noctuid/link-hint.el"))])
- (linkode . [(20200607 2152) nil "Generate a linkode snippet with region/buffer content" single ((:commit . "376fdc0f990322385534a16ee2cd08df20f76f48") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/linkode.el"))])
- (linphone . [(20130524 1109) nil "Emacs interface to Linphone" tar ((:commit . "99af3db941b7f4e5272bb48bff96c1ce4ceac302") (:keywords "comm") (:authors ("Yoni Rabkin" . "yonirabkin@member.fsf.org")) (:maintainer "Yoni Rabkin" . "yonirabkin@member.fsf.org") (:url . "https://github.com/zabbal/emacs-linphone"))])
- (linum-off . [(20160217 2137) nil "Provides an interface for turning line-numbering off" single ((:commit . "116e66ac259b183e0763b85616888316ab196822") (:keywords "line" "numbering") (:authors ("Matthew L. Fidler, Florian Adamsky (see wiki)")) (:maintainer "Matthew L. Fidler") (:url . "http://www.emacswiki.org/emacs/auto-indent-mode.el "))])
- (linum-relative . [(20180124 1047) nil "display relative line number in emacs." single ((:commit . "c74a6981b688a5e1e6b8e0809363963ff558ce4d") (:keywords "converience") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/linum-relative"))])
- (liquid-types . [(20151202 735) ((flycheck (0 13)) (dash (1 2)) (emacs (24 1)) (popup (0 5 2)) (pos-tip (0 5 0)) (flycheck-liquidhs (0 0 1)) (button-lock (1 0 2))) "show inferred liquid-types" single ((:commit . "cc4bacbbf204ef9cf0756f78dfebee2c6ae14d7b") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu"))])
- (liso-theme . [(20160410 2029) nil "Eclectic Dark Theme for GNU Emacs" single ((:commit . "844688245eb860d23043455e165ee24503454c81") (:keywords "theme" "themes") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com") (:url . "https://github.com/caisah/liso-theme"))])
- (lisp-butt-mode . [(20200727 1441) ((emacs (25))) "Slim Lisp Butts" single ((:commit . "1b178fec96cb200574a17cb26ac0742d9df571a9") (:keywords "lisp") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:url . "https://gitlab.com/marcowahl/lisp-butt-mode"))])
- (lisp-extra-font-lock . [(20181008 1921) nil "Highlight bound variables and quoted exprs." single ((:commit . "4605eccbe1a7fcbd3cacf5b71249435413b4db4f") (:keywords "languages" "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/lisp-extra-font-lock"))])
- (lisp-local . [(20200409 1330) ((emacs (24 3)) (cl-lib (0 5))) "Allow different Lisp indentation in each buffer" single ((:commit . "ff745a937f79df51cac0209b3cc3c35ce1d1fc61") (:keywords "languages" "lisp") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lispunion/emacs-lisp-local"))])
- (lispxmp . [(20170926 23) nil "Automagic emacs lisp code annotation" single ((:commit . "7ad077b4ee91ce8a42f84eeddb9fc7ea4eac7814") (:keywords "lisp" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/lispxmp.el"))])
- (lispy . [(20200722 1205) ((emacs (24 3)) (ace-window (0 9 0)) (iedit (0 9 9)) (counsel (0 11 0)) (hydra (0 14 0)) (zoutline (0 1 0))) "vi-like Paredit" tar ((:commit . "a83b66b1ab9457124ba1f6027c884f077ee9b57a"))])
- (lispyscript-mode . [(20170720 1917) nil "Major mode for LispyScript code." single ((:commit . "def632e3335b0c481fbcf5a17f18b0a8c58dd12f") (:keywords "lisp" "languages") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/lispyscript-mode"))])
- (lispyville . [(20200522 2248) ((lispy (0)) (evil (1 2 12)) (cl-lib (0 5)) (emacs (24 4))) "A minor mode for integrating evil with lispy." single ((:commit . "1bf38088c981f5ab4ef2e2684952ab6af96378db") (:keywords "vim" "evil" "lispy" "lisp" "parentheses") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:url . "https://github.com/noctuid/lispyville"))])
- (list-environment . [(20151227 256) nil "A tabulated process environment editor" single ((:commit . "b7ca30b05905047be2e55199a6475f8d98ce318b") (:keywords "processes" "unix") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com"))])
- (list-packages-ext . [(20151115 1716) ((s (1 6 0)) (ht (1 5 0)) (persistent-soft (0 8 6))) "Extras for list-packages" single ((:commit . "b4dd644e4369c9aa66f5bb8895ea49ebbfd0a27a") (:keywords "convenience" "tools") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))])
- (list-unicode-display . [(20181121 2316) ((emacs (24 3))) "Search for and list unicode characters by name" single ((:commit . "0ecc2402b258990e7a0cf7e60847712c69444070") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (list-utils . [(20200502 1309) nil "List-manipulation utility functions" single ((:commit . "9bb2487c83ec46a0b6e6c4158af69334ac797b82") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/list-utils"))])
- (lit-mode . [(20141123 1736) nil "Major mode for lit" single ((:commit . "c61c403afc8333a5649c5421ab1a6341dc1c7d92") (:keywords "languages" "tools") (:authors ("Hector A Escobedo" . "ninjahector.escobedo@gmail.com")) (:maintainer "Hector A Escobedo" . "ninjahector.escobedo@gmail.com"))])
- (litable . [(20200130 1329) ((dash (2 6 0))) "dynamic evaluation replacement with emacs" single ((:commit . "02247ca284cbc79f3afb783d62ed092bfc5b8d83") (:keywords "lisp") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))])
- (litanize . [(20200211 621) ((emacs (24 1)) (enlive (0 0 1)) (s (1 12 0))) "Generate \"Latour Litanies\"" single ((:commit . "ba73259e35b4649884ba56542d3a55f43bd3b80b") (:keywords "tools" "latour litany" "alien phenomenology" "ontography" "metaphorism" "carpentry") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:url . "https://github.com/zzkt/litanizer"))])
- (litecoin-ticker . [(20160612 11) ((json (1 2))) "litecoin price in modeline" single ((:commit . "3d8047c736e4ee0b8638953f8cc63eaefad34106") (:authors ("Zhe Lei")) (:maintainer "Zhe Lei"))])
- (literal-string . [(20191023 733) ((emacs (25)) (edit-indirect (0 1 5))) "edit string literals in a dedicated buffer" single ((:commit . "afffa86e626798ee9f9188ea3be2d5ee6ad17c39") (:keywords "lisp" "tools" "docs") (:authors ("Joost Diepenmaat" . "joost@zeekat.nl")) (:maintainer "Joost Diepenmaat" . "joost@zeekat.nl") (:url . "https://github.com/joodie/literal-string-mode/"))])
- (literate-calc-mode . [(20200703 723) ((emacs (25 1)) (s (1 12 0))) "Inline results from calc" single ((:commit . "e855bd718fa7d0d70b8f43264e10664369dd3a37") (:keywords "calc" "languages" "tools") (:authors ("Robin Schroer")) (:maintainer "Robin Schroer") (:url . "https://github.com/sulami/literate-calc-mode.el"))])
- (literate-coffee-mode . [(20170211 1515) ((coffee-mode (0 5 0))) "major-mode for Literate CoffeeScript" single ((:commit . "55ce0305495f4a38c8063c4bd63deb1e1252373d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-literate-coffee-mode"))])
- (literate-elisp . [(20200708 803) ((cl-lib (0 6)) (emacs (26 1))) "A library to write Emacs Lisp codes in org mode" single ((:commit . "722b7b3988336642167e0e0db12800a23410ab07") (:keywords "lisp" "docs" "extensions" "tools") (:authors ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainer "Jingtao Xu" . "jingtaozf@gmail.com") (:url . "https://github.com/jingtaozf/literate-elisp"))])
- (literate-starter-kit . [(20150730 1854) ((emacs (24 3))) "A literate starter kit to configure Emacs using Org-mode files." tar ((:commit . "6dce1d01781966c14558aa553cfc85008c06e115"))])
- (live-code-talks . [(20180907 1647) ((emacs (24)) (cl-lib (0 5)) (narrowed-page-navigation (0 1))) "Support for slides with live code in them" single ((:commit . "97f16a9ee4e6ff3e0f9291eaead772c66e3e12ae") (:keywords "docs" "multimedia") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (live-preview . [(20200730 1517) ((emacs (24 4))) "Live preview by any shell command while editing" single ((:commit . "b099cd4d9d4b30d432ffd2ca76f8db1b4c13cd08") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-live-preview"))])
- (live-py-mode . [(20200709 422) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "fdc85e5f2ddc72934be704ac90d5436d379c3381") (:keywords "live" "coding") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:url . "http://donkirkby.github.io/live-py-plugin/"))])
- (lively . [(20171005 754) nil "interactively updating text" single ((:commit . "348675828c6a81bfa1ac311ca465aad813542c1b") (:authors ("Luke Gorrie" . "luke@bup.co.nz")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (livereload . [(20170629 650) ((emacs (25)) (websocket (1 8))) "Livereload server" tar ((:commit . "1e501d7e46dbd476c2c7cc9d20b5ac9d41fb1955") (:keywords "convenience") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com"))])
- (livescript-mode . [(20140613 421) nil "Major mode for editing LiveScript files" single ((:commit . "90a918d9686e256e6d4d439cc20f24dad8d3b804") (:keywords "languages" "livescript") (:authors ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainer "Hisamatsu Yasuyuki" . "yas@null.net") (:url . "https://github.com/yhisamatsu/livescript-mode"))])
- (livid-mode . [(20131116 1344) ((skewer-mode (1 5 3)) (s (1 8 0))) "Live browser eval of JavaScript every time a buffer changes" single ((:commit . "dfe5212fa64738bc4138bfebf349fbc8bc237c26") (:authors ("Murphy McMahon")) (:maintainer "Murphy McMahon") (:url . "https://github.com/pandeiro/livid-mode"))])
- (lms . [(20200616 1814) ((emacs (25 1))) "Squeezebox / Logitech Media Server frontend" single ((:commit . "8090ba32866033c3ab580190cc79cac61463a180") (:keywords "multimedia") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:url . "https://hg.serna.eu/emacs/lms"))])
- (load-bash-alias . [(20200106 2015) ((emacs (24 1)) (seq (2 16))) "Convert bash aliases into eshell ones" single ((:commit . "999c613898085b37b9e16b60be1cbeaa9986d368") (:keywords "emacs" "bash" "eshell" "alias") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:url . "https://github.com/daviderestivo/load-bash-alias"))])
- (load-env-vars . [(20180511 2210) ((emacs (24))) "Load environment variables from files" single ((:commit . "3808520efaf9492033f6e11a9bffd68eabf02a0f") (:keywords "lisp") (:authors ("Jorge Dias" . "jorge@mrdias.com")) (:maintainer "Jorge Dias" . "jorge@mrdias.com") (:url . "https://github.com/diasjorge/emacs-load-env-vars"))])
- (load-relative . [(20200722 1109) nil "Relative file load (within a multi-file Emacs package)" tar ((:commit . "85b88d6fbf472381dfdaf0a762215b7e35ceee9b") (:keywords "internal") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/rocky/emacs-load-relative"))])
- (load-theme-buffer-local . [(20120702 2036) nil "Install emacs24 color themes by buffer." single ((:commit . "e606dec66f16a06140b9aad625a4fd52bca4f936") (:keywords "faces") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com") (:url . "http://github.com/vic/color-theme-buffer-local"))])
- (loc-changes . [(20200722 1111) nil "keep track of positions even after buffer changes" single ((:commit . "0a55bcba684f78417e831eef2cc32da24a207f29") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/rocky/emacs-loc-changes"))])
- (loccur . [(20191022 1955) ((emacs (24 3))) "Perform an occur-like folding in current buffer" single ((:commit . "4934c0560d2f63e6314b4584211a0cc0a7e671c4") (:keywords "matching") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:url . "https://github.com/fourier/loccur"))])
- (lockfile-mode . [(20170625 507) nil "Major mode for .lock files" single ((:commit . "fcfef88460cb3cd67c4d83a1801d0326d282feac") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-lockfile-mode"))])
- (lodgeit . [(20190802 1308) nil "Paste to a lodgeit powered pastebin" single ((:commit . "442637194d48a7105b7747b8d98772f5899f9e21") (:keywords "pastebin" "lodgeit") (:authors ("Eric Larson" . "eric@ionrock.org")) (:maintainer "Eric Larson" . "eric@ionrock.org") (:url . "https://github.com/ionrock/lodgeit-el"))])
- (log4e . [(20200420 745) nil "provide logging framework for elisp" single ((:commit . "7df0c1ff4656f8f993b87064b1567618eadb5546") (:keywords "log") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/log4e"))])
- (log4j-mode . [(20160108 1918) nil "major mode for viewing log files" single ((:commit . "26171b1e723502055e085393b0ecdcb6db406010") (:keywords "tools") (:authors ("Johan Dykstrom" . "jody4711-sf@yahoo.se")) (:maintainer "Johan Dykstrom" . "jody4711-sf@yahoo.se") (:url . "http://log4j-mode.sourceforge.net"))])
- (logalimacs . [(20131021 1829) ((popwin (0 6 2)) (popup (0 5 0)) (stem (20130120))) "Front-end to logaling-command for Ruby gems" single ((:commit . "8286e39502250fc6c3c6656a7f46a8eee8e9a713") (:keywords "translation" "logaling-command") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/logaling/logalimacs"))])
- (logito . [(20120225 2055) ((eieio (1 3))) "logging library for Emacs" single ((:commit . "824acb89d2cc18cb47281a4fbddd81ad244a2052") (:keywords "lisp" "tool") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))])
- (lognav-mode . [(20191124 1011) ((emacs (24 3))) "Navigate Log Error Messages" single ((:commit . "7eb9cd2af5b47116fe475870b41dded55052c14c") (:keywords "log" "error" "lognav-mode" "convenience") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:url . "https://hg.osdn.net/view/lognav-mode/lognav-mode"))])
- (logpad . [(20190927 2043) nil "Simulate Windows Notepad for logging." single ((:commit . "ff80fd198b196c4db9ca88ae8cf858cae491e121") (:keywords "files" "outlines" "notepad") (:authors ("Jens K. Loewe" . "git@tuxproject.de")) (:maintainer "Jens K. Loewe" . "git@tuxproject.de") (:url . "https://bitbucket.org/tux_/logpad.el"))])
- (logstash-conf . [(20200725 1843) nil "basic mode for editing logstash configuration" single ((:commit . "131565042f8f12b9b88bd477959246dd034fa7d6") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (logview . [(20200331 2111) ((emacs (24 4)) (datetime (0 6 1)) (extmap (1 0))) "Major mode for viewing log files" single ((:commit . "c67298a215136617de60c9041904ee6a455dcd4f") (:keywords "files" "tools") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:url . "https://github.com/doublep/logview"))])
- (lol-data-dragon . [(20200705 1822) ((emacs (25 1))) "Browse Champions of League of Legends on Data Dragon" single ((:commit . "0deec9867bd7ba96220ee2968a9b2a94fd474431") (:keywords "games" "hypermedia") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/lol-data-dragon.el"))])
- (lolcat . [(20190527 1145) ((emacs (24 3))) "Rainbows and unicorns!" single ((:commit . "4855e587a3b9681c077dac4b9f166dd860f439a4") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/lolcat.el"))])
- (lolcode-mode . [(20111002 847) nil "Major mode for editing LOLCODE" single ((:commit . "1914f1ba87587ecf5f175eeb2144c28e9f039317") (:keywords "lolcode" "major" "mode") (:authors ("Bodil Stokke" . "lolcode@bodil.tv")) (:maintainer "Bodil Stokke" . "lolcode@bodil.tv") (:url . "http://github.com/bodil/lolcode-mode"))])
- (look-dired . [(20160729 2323) ((look-mode (1 0))) "Extensions to look-mode for dired buffers" single ((:commit . "9bfa4e5e6f3810705b6426c88493ea0bf6b15640") (:keywords "convenience") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/look-dired"))])
- (look-mode . [(20190212 2346) nil "quick file viewer for image and text file browsing" single ((:commit . "d686e4cfafeac24e07e3efdb9763472f78d878f4") (:authors ("Peter H. Mao <peter.mao@gmail.com>" . "petermao@jpl.nasa.gov")) (:maintainer "Peter H. Mao <peter.mao@gmail.com>" . "petermao@jpl.nasa.gov"))])
- (loop . [(20160813 1407) nil "friendly imperative loop structures" single ((:commit . "e22807f83a0890dc8a904c51ee0742c34efccc6c") (:keywords "loop" "while" "for each" "break" "continue") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (lorem-ipsum . [(20190819 2042) nil "Insert dummy pseudo Latin text." single ((:commit . "da75c155da327c7a7aedb80f5cfe409984787049") (:keywords "tools" "language" "convenience") (:authors ("Jean-Philippe Theberge" . "jphil21@sourceforge.net")) (:maintainer "Joe Schafer" . "joe@jschaf.com"))])
- (love-minor-mode . [(20170727 536) ((lua-mode (20130419))) "Minor mode for working on LÖVE projects" single ((:commit . "3ca8f3405338f2d6f4fbcdd5e89342a46378543a") (:authors ("Eric James Michael Ritz")) (:maintainer "Eric James Michael Ritz") (:url . "https://github.com/ejmr/love-minor-mode"))])
- (lox-mode . [(20200619 1700) ((emacs (24 3))) "Major mode for the Lox programming language" single ((:commit . "b6935b3f5b131d2c1c7685cf6464274f7cd64943") (:keywords "languages" "lox") (:authors ("Timmy Jose" . "zoltan.jose@gmail.com")) (:maintainer "Timmy Jose" . "zoltan.jose@gmail.com") (:url . "https://github.com/timmyjose-projects/lox-mode"))])
- (lpy . [(20200722 1159) ((emacs (25 1)) (lispy (0 27 0))) "A lispy interface to Python" tar ((:commit . "c6744639ee313ee6dd4bc1e14b651d944b2ee1fd") (:keywords "python" "lisp") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/lpy"))])
- (lsp-dart . [(20200727 1625) ((emacs (26 1)) (lsp-treemacs (0 2)) (lsp-mode (7 0)) (dap-mode (0 5)) (f (0 20 0)) (dash (2 14 1)) (pkg-info (0 4)) (dart-mode (1 0 5))) "Dart support lsp-mode" tar ((:commit . "239369742e29e0f52543441d9e9a17d5b477f9c9") (:keywords "languages" "extensions") (:url . "https://emacs-lsp.github.io/lsp-dart"))])
- (lsp-docker . [(20200222 505) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (6 2 1))) "LSP Docker integration" single ((:commit . "5053b697d1541afd436bc4a93f51b6afd8f2b79f") (:keywords "languages" "langserver") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:url . "https://github.com/emacs-lsp/lsp-docker"))])
- (lsp-elixir . [(20190105 2059) ((lsp-mode (20190104 2105)) (emacs (24 4))) "Elixir tooling integration into Emacs" tar ((:commit . "9fd091c092144a09c0df2d477257c1f4c37bb985") (:keywords "languages" "elixir" "elixirc" "mix" "hex" "alchemist") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:url . "http://www.github.com/trevoke/lsp-elixir.el"))])
- (lsp-haskell . [(20200527 2014) ((lsp-mode (3 0)) (haskell-mode (1 0))) "Haskell support for lsp-mode" single ((:commit . "17d7d4c6615b5e6c7442828720730bfeda644af8") (:keywords "haskell") (:url . "https://github.com/emacs-lsp/lsp-haskell"))])
- (lsp-intellij . [(20180831 2051) ((emacs (25 1)) (lsp-mode (4 1))) "intellij lsp client" single ((:commit . "cf30f0ac63bd0140e758840b8ab070e8313697b2") (:keywords "languages" "processes" "tools") (:authors ("Ruin0x11" . "ipickering2@gmail.com")) (:maintainer "Ruin0x11" . "ipickering2@gmail.com") (:url . "https://github.com/Ruin0x11/lsp-intellij"))])
- (lsp-ivy . [(20200701 2043) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (6 2 1)) (ivy (0 13 0))) "LSP ivy integration" single ((:commit . "4cdb739fc2bc47f7d4dcad824f9240c70c4cb37d") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/lsp-ivy"))])
- (lsp-java . [(20200730 1226) ((emacs (25 1)) (lsp-mode (6 0)) (markdown-mode (2 3)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (dash-functional (1 2 0)) (request (0 3 0)) (treemacs (2 5)) (dap-mode (0 5))) "Java support for lsp-mode" tar ((:commit . "dd76488174caeb7e297cae4ff17b6c250144ea72") (:keywords "languague" "tools") (:url . "https://github.com/emacs-lsp/lsp-java"))])
- (lsp-javacomp . [(20190124 1755) ((emacs (25 1)) (lsp-mode (3 0)) (s (1 2 0))) "Provide Java IDE features powered by JavaComp." single ((:commit . "82aa4ad6ca03a74565c35e855b318b1887bcd89b") (:keywords "java" "tools" "lsp") (:url . "https://github.com/tigersoldier/lsp-javacomp"))])
- (lsp-jedi . [(20200608 1711) ((emacs (25 1)) (lsp-mode (6 0))) "Lsp client plugin for Python Jedi Language Server" single ((:commit . "a3c0527a5a029a1162734006f9d528b30dcb3263") (:keywords "language-server" "tools" "python" "jedi" "ide") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainer "Fred Campos") (:url . "http://github.com/fredcamps/lsp-jedi"))])
- (lsp-julia . [(20200511 1444) ((emacs (25 1)) (lsp-mode (6 0)) (julia-mode (0 3))) "Julia support for lsp-mode" tar ((:commit . "b342e5f74f9b815d2a7db9fffee7b9c46850d293") (:keywords "languages" "tools") (:authors ("Martin Wolke" . "vibhavp@gmail.com") ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:url . "https://github.com/non-Jedi/lsp-julia"))])
- (lsp-latex . [(20200718 928) ((emacs (25 1)) (lsp-mode (6 0))) "lsp-mode client for LaTeX, on texlab" single ((:commit . "a9a26a21bf16b9444021563d844719ace0c5c3b6") (:keywords "languages" "tex") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))])
- (lsp-metals . [(20200727 1925) ((emacs (26 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 14 1)) (dash-functional (2 14 1)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5))) "Scala Client settings" tar ((:commit . "039aa72439e3c52cfef4bcde416ba49d88ac0991") (:keywords "languages" "extensions") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:url . "https://github.com/emacs-lsp/lsp-metals"))])
- (lsp-mode . [(20200731 1945) ((emacs (26 1)) (dash (2 14 1)) (dash-functional (2 14 1)) (f (0 20 0)) (ht (2 0)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "5b41a8df955377832a9bd930d51b0b244ea3211f") (:keywords "languages") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:url . "https://github.com/emacs-lsp/lsp-mode"))])
- (lsp-mssql . [(20191204 1150) ((emacs (25 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:commit . "b462cfa9b8071c624b905baf37a255d808ac6376") (:keywords "data" "languages") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:url . "https://github.com/emacs-lsp/lsp-mssql"))])
- (lsp-origami . [(20200522 548) ((origami (1 0)) (lsp-mode (20190326 522))) "origami.el support for lsp-mode" single ((:commit . "d8b7b3ede9b10ce6dab61c1220f3bf5113e9f6d0") (:keywords "languages" "lsp-mode") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:url . "https://github.com/emacs-lsp/lsp-origami"))])
- (lsp-p4 . [(20190127 1049) ((lsp-mode (3 0))) "P4 support for lsp-mode" tar ((:commit . "54dd19d88cd561061ac3103dc452d6854e5899fa") (:keywords "lsp" "p4") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:url . "https://github.com/dmakarov/p4ls"))])
- (lsp-pascal . [(20200422 1610) ((emacs (24 4)) (lsp-mode (6 3))) "LSP client for Pascal" single ((:commit . "b132bdf66748e4abe0d4140f6d061b1ccd56082a") (:keywords "languages" "tools") (:authors ("Arjan Adriaanse" . "arjan@adriaan.se")) (:maintainer "Arjan Adriaanse" . "arjan@adriaan.se") (:url . "https://github.com/arjanadriaanse/lsp-pascal"))])
- (lsp-pyre . [(20190406 335) ((lsp-mode (6 0))) "lsp-mode client for python using pyre" single ((:commit . "e177b8f5efd1a955b5753aeb5d1894e6d21be35a") (:authors ("John Allen" . "oss@porcnick.com")) (:maintainer "John Allen" . "oss@porcnick.com") (:url . "https://github.com/jra3/lsp-pyre"))])
- (lsp-python-ms . [(20200725 758) ((emacs (25 1)) (lsp-mode (6 0))) "The lsp-mode client for Microsoft python-language-server" single ((:commit . "d42ffc2cc27ce36b5a7646ea922441f4c93b2678") (:keywords "languages" "tools") (:authors ("Charl Botha")) (:maintainer "Andrew Christianson, Vincent Zhang") (:url . "https://github.com/emacs-lsp/lsp-python-ms"))])
- (lsp-scala . [(20190604 1237) ((emacs (24 4)) (lsp-mode (5 0)) (sbt-mode (2 0))) "Scala support for lsp-mode" single ((:commit . "06f189aa5cafe93cecbdaa234bccd900def7bc68") (:keywords "languages" "tools" "scala" "lsp" "metals") (:authors ("Ross A. Baker" . "ross@rossabaker.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:url . "https://github.com/rossabaker/lsp-scala"))])
- (lsp-sonarlint . [(20200702 2351) ((emacs (25)) (dash (2 12 0)) (lsp-mode (6 3)) (ht (2 3))) "Emacs Sonarlint lsp client" tar ((:commit . "e0a27c07e886a147e2b8750471660af02e142086") (:keywords "languages" "tools" "php" "javascript" "xml" "ruby" "html" "scala" "java" "python") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:url . "https://github.com/emacs-lsp/lsp-sonarlint"))])
- (lsp-sourcekit . [(20181216 1450) ((emacs (25 1)) (lsp-mode (5))) "sourcekit-lsp client for lsp-mode" single ((:commit . "130f7a8f7a37869515953aa7715b3b969c3d7a0b") (:keywords "languages" "lsp" "swift" "objective-c" "c++") (:authors ("Daniel Martín")) (:maintainer "Daniel Martín") (:url . "https://github.com/emacs-lsp/lsp-sourcekit"))])
- (lsp-treemacs . [(20200729 1050) ((emacs (25 1)) (dash (2 14 1)) (dash-functional (2 14 1)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5)) (lsp-mode (6 0))) "LSP treemacs" tar ((:commit . "b4849ea48122cf3aa0f2c153f38df309f1850a88") (:keywords "languages") (:authors ("Ivan Yonchovski")) (:maintainer "Ivan Yonchovski") (:url . "https://github.com/emacs-lsp/lsp-treemacs"))])
- (lsp-ui . [(20200718 1035) ((emacs (26 1)) (dash (2 14)) (dash-functional (1 2 0)) (lsp-mode (6 0)) (markdown-mode (2 3))) "UI modules for lsp-mode" tar ((:commit . "1f3e9700395f4fae024ca45ca64c8d70e99b39d2") (:keywords "languages" "tools") (:authors ("Sebastien Chapuis <sebastien@chapu.is>, Fangrui Song" . "i@maskray.me")) (:maintainer "Sebastien Chapuis <sebastien@chapu.is>, Fangrui Song" . "i@maskray.me") (:url . "https://github.com/emacs-lsp/lsp-ui"))])
- (lua-mode . [(20200508 1316) ((emacs (24 3))) "a major-mode for editing Lua scripts" tar ((:commit . "35b6e4c20b8b4eaf783ccc8e613d0dd06dbd165c") (:keywords "languages" "processes" "tools") (:authors ("2011-2013 immerrr" . "immerrr+lua@gmail.com") ("2010-2011 Reuben Thomas" . "rrt@sc3d.org") ("2006 Juergen Hoetzel" . "juergen@hoetzel.info") ("2004 various (support for Lua 5 and byte compilation)") ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu") ("1997 Bret Mogilefsky" . "mogul-lua@gelatinous.com") ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de") ("with tons of assistance from") ("Paul Du Bois" . "pld-lua@gelatinous.com") ("Aaron Smith" . "aaron-lua@gelatinous.com")) (:maintainer "2011-2013 immerrr" . "immerrr+lua@gmail.com") (:url . "http://immerrr.github.com/lua-mode"))])
- (luarocks . [(20170430 2305) ((emacs (24)) (cl-lib (0 5))) "luarocks tools" single ((:commit . "cee27ba0716edf338077387969883226dd2b7484") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/luarocks.el"))])
- (lush-theme . [(20180816 2200) ((emacs (24))) "A dark theme with lush colors" single ((:commit . "645e1959143532df8f7ef90e1184e9556df18af7") (:keywords "theme" "dark" "strong colors") (:authors ("Andre Richter" . "andre.o.richter@gmail.com")) (:maintainer "Andre Richter" . "andre.o.richter@gmail.com") (:url . "https://github.com/andre-richter/emacs-lush-theme"))])
- (lusty-explorer . [(20200602 228) ((emacs (25 1))) "Dynamic filesystem explorer and buffer switcher" single ((:commit . "a746514ccd8df71fc920ba8ad0aa8dca58702631") (:keywords "convenience" "files" "matching" "tools") (:url . "https://github.com/sjbach/lusty-emacs"))])
- (lv . [(20200507 1518) nil "Other echo area" single ((:commit . "112e689f75b59398d8eca79ac6562dca12b8a959") (:authors ("Oleh Krehel")) (:maintainer "Oleh Krehel"))])
- (lxc . [(20140410 2022) nil "lxc integration with Emacs" single ((:commit . "88bed56c954d1edd9ff5ce0ced2c02dcf9f71835") (:keywords "processes") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "https://github.com/nicferrier/emacs-lxc"))])
- (lxc-tramp . [(20200414 1445) ((emacs (24)) (cl-lib (0 6))) "TRAMP integration for LXC containers" single ((:commit . "1585e55a5deb89e2f4e30a0ad9e0f121d1e0ebcb") (:keywords "lxc" "convenience") (:authors ("montag451")) (:maintainer "montag451") (:url . "https://github.com/montag451/lxc-tramp"))])
- (lxd-tramp . [(20181023 7) ((emacs (24 4)) (cl-lib (0 6))) "TRAMP integration for LXD containers" single ((:commit . "f335c76245f62b02cf67a9376eca6f3863c8a75a") (:keywords "lxd" "lxc" "convenience") (:authors ("Yc.S" . "onixie@gmail.com")) (:maintainer "Yc.S" . "onixie@gmail.com") (:url . "https://github.com/onixie/lxd-tramp.git"))])
- (lyrics . [(20180812 1841) ((emacs (25 1)) (seq (2 15))) "Show lyrics" single ((:commit . "d0b920be634a5be81ad49418cfaada0f0a57d6cd") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/lyrics.el"))])
- (m-buffer . [(20170407 2141) ((seq (2 14))) "List-Oriented, Functional Buffer Manipulation" tar ((:commit . "8681342aaffa187e5c54945ab91b812965a96d19") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.rg.uk"))])
- (mac-pseudo-daemon . [(20200215 513) ((cl-lib (0 1))) "Daemon mode that plays nice with Mac OS." single ((:commit . "703ee41303dc251b7672b7cba5aeb6aa54a76c90") (:keywords "convenience" "osx" "mac") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))])
- (maces-game . [(20170903 1551) ((dash (2 12 0)) (cl-lib (0 5)) (emacs (24))) "another anagram game." tar ((:commit . "c0fb795f5642467ea528d2f04d904547e8a77ecd") (:keywords "games" "word games" "anagram") (:authors ("Pawel Bokota" . "pawelb.lnx@gmail.com")) (:maintainer "Pawel Bokota" . "pawelb.lnx@gmail.com") (:url . "https://github.com/pawelbx/anagram-game"))])
- (macro-math . [(20130328 1604) nil "in-buffer mathematical operations" single ((:commit . "216e59371e9ee39c34117ba79b9acd78bb415750") (:keywords "convenience") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/macro-math/"))])
- (macrostep . [(20161120 2106) ((cl-lib (0 5))) "interactive macro expander" tar ((:commit . "424e3734a1ee526a1bd7b5c3cd1d3ef19d184267") (:keywords "lisp" "languages" "macro" "debugging") (:authors ("joddie" . "j.j.oddie@gmail.com")) (:maintainer "joddie" . "j.j.oddie@gmail.com") (:url . "https://github.com/joddie/macrostep"))])
- (madhat2r-theme . [(20170203 30) ((emacs (24))) "dark color theme that is easy on the eyes" single ((:commit . "6b387f09de055cfcc15d74981cd4f32f8f9a7323") (:keywords "color" "theme") (:authors ("Micah Duke")) (:maintainer "Micah Duke") (:url . "https://github.com/madhat2r/madhat2r-theme"))])
- (mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" single ((:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:keywords "convenience") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:url . "https://github.com/chumpage/mag-menu"))])
- (magic-filetype . [(20180219 1552) ((emacs (24)) (s (1 9 0))) "Enhance filetype major mode" single ((:commit . "019494add5ff02dd36cb3f500142fc51125522cc") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/magic-filetype.el"))])
- (magic-latex-buffer . [(20191106 241) ((cl-lib (0 5)) (emacs (24 3))) "Magically enhance LaTeX-mode font-locking for semi-WYSIWYG editing" single ((:commit . "8597f4db70732d6e479396e2f2a7e78742387253") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (magik-mode . [(20200304 1323) nil "mode for editing Magik + some utils." tar ((:commit . "e54f934952cde3f96d6a131968295d993b3cf624") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))])
- (magit . [(20200728 45) ((emacs (25 1)) (async (20200113)) (dash (20200524)) (git-commit (20200516)) (transient (20200601)) (with-editor (20200522))) "A Git porcelain inside Emacs." tar ((:commit . "fccd3cff52fc5b655bbb80bc6c894a2a27f188ea") (:keywords "git" "tools" "vc"))])
- (magit-annex . [(20200516 2028) ((cl-lib (0 3)) (magit (2 90 0))) "Control git-annex from Magit" single ((:commit . "c5ecb4b53ea2461e737ea00242ef1e69e35da398") (:keywords "vc" "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:url . "https://github.com/magit/magit-annex"))])
- (magit-circleci . [(20191209 2113) ((dash (2 16 0)) (transient (0 1 0)) (magit (2 90 0)) (emacs (25 3))) "CircleCI integration for Magit" single ((:commit . "3425ad5b16cb48d6802b7e9ed044b4cd7a99c785") (:keywords "circleci" "continuous" "integration" "magit" "vc" "tools") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/magit-circleci"))])
- (magit-delta . [(20200518 2205) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" single ((:commit . "d988abd99882c6b89f21f2746f721a4d7ece6ad4") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/magit-delta"))])
- (magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" single ((:commit . "28acf74f59e385865746cccf4b1e4c4025ae9433") (:keywords "convenience" "matching") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:url . "https://github.com/ragone/magit-diff-flycheck"))])
- (magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" single ((:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:keywords "tools") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de"))])
- (magit-find-file . [(20150702 830) ((magit (2 1 0)) (dash (2 8 0))) "completing-read over all files in Git" single ((:commit . "c3ea91bab37d10a814a829728ec972811f728d60") (:keywords "git") (:authors ("Bradley Wright" . "brad@intranation.com")) (:maintainer "Bradley Wright" . "brad@intranation.com") (:url . "https://github.com/bradleywright/magit-find-file.el"))])
- (magit-gerrit . [(20160226 930) ((magit (2 3 1))) "Magit plugin for Gerrit Code Review" single ((:commit . "ece6f369694aca17f3ac166ed2801b432acfe20d") (:authors ("Brian Fransioli" . "assem@terranpro.org")) (:maintainer "Brian Fransioli" . "assem@terranpro.org") (:url . "https://github.com/terranpro/magit-gerrit"))])
- (magit-gh-pulls . [(20191230 1944) ((emacs (24 4)) (gh (0 9 1)) (magit (2 12 0)) (pcache (0 2 3)) (s (1 6 1))) "GitHub pull requests extension for Magit" single ((:commit . "57f3a5158bbc7bfd169ee136fde351cce999e0ca") (:keywords "git" "tools") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:url . "https://github.com/sigma/magit-gh-pulls"))])
- (magit-gitflow . [(20170929 824) ((magit (2 1 0)) (magit-popup (2 2 0))) "gitflow extension for magit" single ((:commit . "cc41b561ec6eea947fe9a176349fb4f771ed865b") (:keywords "vc" "tools") (:authors ("Jan Tatarik" . "Jan.Tatarik@gmail.com")) (:maintainer "Jan Tatarik" . "Jan.Tatarik@gmail.com") (:url . "https://github.com/jtatarik/magit-gitflow"))])
- (magit-imerge . [(20200516 2029) ((emacs (24 4)) (magit (2 10 0))) "Magit extension for git-imerge" single ((:commit . "f4b88f0c127faa154f138907bf4e98b1baf12fb6") (:keywords "vc" "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:url . "https://github.com/magit/magit-imerge"))])
- (magit-lfs . [(20190831 118) ((emacs (24 4)) (magit (2 10 3)) (dash (2 13 0))) "Magit plugin for Git LFS" single ((:commit . "75bf6d3310eae24889589a09e96a4a855e1a11c4") (:keywords "magit" "git" "lfs" "tools" "vc") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:url . "https://github.com/ailrun/magit-lfs"))])
- (magit-libgit . [(20200102 2204) ((emacs (26 1)) (magit (0)) (libgit (0))) "Libgit functionality" single ((:commit . "fccd3cff52fc5b655bbb80bc6c894a2a27f188ea") (:keywords "git" "tools" "vc") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/magit"))])
- (magit-org-todos . [(20180709 1950) ((magit (2 0 0)) (emacs (24))) "Add local todo items to the magit status buffer" single ((:commit . "9ffa3efb098434d837cab4bacd1601fdfc6fe999") (:keywords "org-mode" "magit" "tools") (:authors ("Daniel Ma")) (:maintainer "Daniel Ma") (:url . "http://github.com/danielma/magit-org-todos"))])
- (magit-p4 . [(20170414 1246) ((magit (2 1)) (magit-popup (2 1)) (p4 (12 0)) (cl-lib (0 5))) "git-p4 plug-in for Magit" single ((:commit . "cdc05f2d564409baac9ca15b1a2a0110a6ff12b7") (:keywords "vc" "tools") (:authors ("Damian T. Dobroczy\\\\'nski" . "qoocku@gmail.com")) (:maintainer "Aleksey Fedotov" . "lexa@cfotr.com") (:url . "https://github.com/qoocku/magit-p4"))])
- (magit-patch-changelog . [(20200217 1202) ((emacs (25 1)) (magit (2 91 0))) "Generate a patch according to emacs-mirror/CONTRIBUTE" single ((:commit . "876c780bdb676b6ece64861704e199b94f33cf71") (:keywords "git" "tools" "vc") (:url . "https://github.com/dickmao/magit-patch-changelog"))])
- (magit-popup . [(20200719 1015) ((emacs (24 4)) (dash (2 13 0))) "Define prefix-infix-suffix command combos" tar ((:commit . "d8585fa39f88956963d877b921322530257ba9f5") (:keywords "bindings") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/magit-popup"))])
- (magit-rbr . [(20181009 2016) ((magit (2 13 0)) (emacs (24 3))) "Support for git rbr in Magit" single ((:commit . "029203b3e48537205052a058e964f058cd802c3c") (:keywords "git" "magit" "rbr" "tools") (:authors ("Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com")) (:maintainer "Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com") (:url . "https://github.com/fanatoly/magit-rbr"))])
- (magit-reviewboard . [(20200727 1748) ((emacs (25 2)) (magit (2 13 0)) (s (1 12 0)) (request (0 3 0))) "Show open Reviewboard reviews in Magit" single ((:commit . "aceedff88921f1dfef8a6b2fb18fe316fb7223a8") (:keywords "magit" "vc") (:authors ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainer "Jules Tamagnan" . "jtamagnan@gmail.com") (:url . "http://github.com/jtamagnan/magit-reviewboard"))])
- (magit-section . [(20200610 1111) ((emacs (25 1)) (dash (20200524))) "Sections for read-only buffers" tar ((:commit . "fccd3cff52fc5b655bbb80bc6c894a2a27f188ea") (:keywords "tools") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/magit"))])
- (magit-stgit . [(20190313 1158) nil "No description available." single ((:commit . "8294f34e4927798d9db883cafe946a9041b7e331"))])
- (magit-svn . [(20190821 1455) ((emacs (24 4)) (magit (2 1 0))) "Git-Svn extension for Magit" single ((:commit . "2cff1a30a30f2b3963342a7d185ec13fc12279c3") (:keywords "vc" "tools") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk"))])
- (magit-tbdiff . [(20200519 418) ((emacs (24 4)) (magit (2 10 0))) "Magit extension for range diffs" single ((:commit . "e52e8ab4906996c410f6c6db890b9bfe0951d4ce") (:keywords "vc" "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:url . "https://github.com/magit/magit-tbdiff"))])
- (magit-todos . [(20200310 28) ((emacs (25 2)) (async (1 9 2)) (dash (2 13 0)) (f (0 17 2)) (hl-todo (1 9 0)) (magit (2 13 0)) (pcre2el (1 8)) (s (1 12 0))) "Show source file TODOs in Magit" single ((:commit . "a0e5d1f3c7dfcb4f18c1b0d57f1746a4872df5c6") (:keywords "magit" "vc") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/magit-todos"))])
- (magit-topgit . [(20160313 1954) ((emacs (24 4)) (magit (2 1 0))) "TopGit extension for Magit" single ((:commit . "11489ea798bc88d0ea5244bbf725285eedfefbef") (:keywords "vc" "tools") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Robin Green" . "greenrd@greenrd.org"))])
- (magit-vcsh . [(20190817 2014) ((magit (2 90 1)) (vcsh (0 4)) (emacs (24 4))) "Magit vcsh integration" single ((:commit . "fcff128cdbe3ef547dc64f2496cb6405b8ee21ca") (:keywords "vc" "files" "magit") (:authors ("Štěpán Němec" . "stepnem@gmail.com")) (:maintainer "Štěpán Němec" . "stepnem@gmail.com") (:url . "https://gitlab.com/stepnem/magit-vcsh-el"))])
- (magithub . [(20190512 2316) ((emacs (25)) (magit (2 12)) (s (1 12 0)) (ghub+ (0 3)) (git-commit (2 12)) (markdown-mode (2 3))) "Magit interfaces for GitHub" tar ((:commit . "9fb9c653d0dad3da7ccff3ae321fa6e54c08f41b") (:keywords "git" "tools" "vc") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:url . "https://github.com/vermiculus/magithub"))])
- (magma-mode . [(20200312 1306) ((emacs (24 3)) (cl-lib (0 3)) (dash (2 6 0)) (f (0 17 1))) "Mode for editing Magma source code" tar ((:commit . "0d810239be625b3f8a82f4e27ffd311fc2e1841e") (:url . "https://github.com/ThibautVerron/magma-mode"))])
- (magnatune . [(20151030 1935) ((dash (2 9 0)) (s (1 9 0))) "browse magnatune's music catalog" tar ((:commit . "605b01505ba30589c77ebb4c96834b5072ccbdd4"))])
- (majapahit-theme . [(20160817 1848) nil "Color theme with a dark and light versions" tar ((:commit . "77c96df7619666b2102d90d452eeadf04adc89a6") (:keywords "color" "theme") (:url . "https://gitlab.com/franksn/majapahit-theme"))])
- (major-mode-hydra . [(20191030 2354) ((dash (2 15 0)) (pretty-hydra (0 2 2)) (emacs (25))) "Major mode keybindings managed by Hydra" single ((:commit . "20362323f66883c1336ffe70be24f91509addf54") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))])
- (major-mode-icons . [(20200127 512) ((emacs (24 3)) (powerline (2 4)) (xpm (1 0 4)) (all-the-icons (2 3 0))) "Display icon for major-mode on mode-line" tar ((:commit . "b36eae2e976bad3c431b082c64b1a724a2ba1fe6") (:keywords "frames" "multimedia") (:url . "http://github.com/stardiviner/major-mode-icons"))])
- (make-color . [(20140625 1150) nil "Alternative to picking color - update fg/bg color by pressing r/g/b/... keys" single ((:commit . "5ca1383ca9228bca82120b238bdc119f302b75c0") (:keywords "color") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/make-color.el"))])
- (make-it-so . [(20190625 1036) ((swiper (0 8 0)) (emacs (24))) "Transform files with Makefile recipes." tar ((:commit . "b73dfb640588123c9eece230ad72b37604f5c126") (:keywords "make" "dired") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/make-it-so"))])
- (makefile-executor . [(20180720 832) ((emacs (24 3)) (dash (2 11 0)) (f (0 11 0)) (s (1 10 0))) "Commands for conveniently running makefile targets" single ((:commit . "9a7d78f814a4b372d8f8179819cb1b37b83b1973") (:keywords "processes") (:authors ("Lowe Thiderman" . "lowe.thiderman@gmail.com")) (:maintainer "Lowe Thiderman" . "lowe.thiderman@gmail.com") (:url . "https://github.com/thiderman/makefile-executor.el"))])
- (makey . [(20131231 1430) ((cl-lib (0 2))) "interactive commandline mode" single ((:commit . "a61781e69d3b451551e269446e1c5f624ab81137") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))])
- (malinka . [(20171202 1021) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (cl-lib (0 3)) (rtags (0 0)) (projectile (0 11 0))) "A C/C++ project configuration package for Emacs" single ((:commit . "d4aa517c7a9022eae16c758c7efdb3a0403542d7") (:keywords "c" "c++" "project-management") (:authors ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas" . "lefteris@refu.co") (:url . "https://github.com/LefterisJP/malinka"))])
- (mallard-mode . [(20131204 425) nil "Major mode for editing Mallard files" tar ((:commit . "c48170c1ace4959abcc5fb1df0d4cb149cff44c1") (:keywords "xml" "mallard") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:url . "https://github.com/jhradilek/emacs-mallard-mode"))])
- (mallard-snippets . [(20131023 1851) ((yasnippet (0 8 0)) (mallard-mode (0 1 1))) "Yasnippets for Mallard" tar ((:commit . "70c5293f10722f2ace73bdf74d9a18f95b040edc") (:keywords "snippets" "mallard") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:url . "https://github.com/jhradilek/emacs-mallard-snippets"))])
- (malyon . [(20161208 2125) ((cl-lib (0 5))) "mode to execute Z-code files version 3, 5, 8" single ((:commit . "0d9882650720b4a791556f5e2d917388965d6fc0") (:keywords "games" "emulations") (:authors ("Peter Ilberg <peter.ilberg@gmail.com>, Christopher Madsen <cjm@cjmweb.net>, Erik Selberg" . "erik@selberg.org")) (:maintainer "Christopher Madsen <cjm@cjmweb.net>, Erik Selberg" . "erik@selberg.org") (:url . "https://github.com/speedenator/malyon"))])
- (man-commands . [(20151221 2221) ((cl-lib (0 5))) "Add interactive commands for every manpages installed in your computer." single ((:commit . "f4ba0c3790855d7544dff92d470d212f24de1d9d") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/man-commands"))])
- (manage-minor-mode . [(20200123 1406) ((emacs (24 3))) "Manage your minor-modes easily" single ((:commit . "0dfab46a728a21c91658ffcb14101b182cf1b403") (:keywords "tools" "minor-mode" "manage" "emacs") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:url . "https://github.com/ShingoFukuyama/manage-minor-mode"))])
- (manage-minor-mode-table . [(20200717 809) ((emacs (25 1)) (manage-minor-mode (1 1))) "Manage minor-modes in table" single ((:commit . "d377094c4ff5e93321e12f53892113083148bdaf") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/manage-minor-mode-table"))])
- (mandm-theme . [(20191112 1832) nil "An M&M color theme." single ((:commit . "4e6ce4f222c1fa175d56e926628f37caa5f398ce") (:authors ("Christian Hopps" . "chopps@gmail.com")) (:maintainer "Christian Hopps" . "chopps@gmail.com") (:url . "https://github.com/choppsv1/emacs-mandm-theme.git"))])
- (mandoku . [(20180403 1106) ((org (8 0)) (magit (20151028)) (github-clone (20150705)) (git (20140128))) "A tool to access repositories of premodern Chinese texts" tar ((:commit . "d65dbaa329ecf931f4142be72862972ea6a24e63"))])
- (mandoku-tls . [(20171118 240) ((emacs (24 4)) (mandoku (20170301)) (github-clone (0 2)) (hydra (0 13 6)) (helm (1 7 0)) (org (9 0)) (helm-charinfo (20170601))) "A tool to access the TLS database" single ((:commit . "ffeebf5bd451ac1806ddfe1744fbbd036a56f902") (:keywords "convenience") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:url . "https://github.com/mandoku/mandoku-tls"))])
- (map-progress . [(20190128 16) ((cl-lib (0 6 1))) "mapping macros that report progress" single ((:commit . "1fb916159cd054c233ce3c80d9d01adfae640297") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/map-progress"))])
- (map-regexp . [(20190128 18) ((cl-lib (0 6 1))) "map over matches of a regular expression" single ((:commit . "ae2d1c22f786ad987aef3e319925e80160a887a0") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/map-regexp"))])
- (marcopolo . [(20160421 1004) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client to the Docker HUB/Registry API" tar ((:commit . "9193aabdf12223087b5ed58f1507d5d8a24a4381") (:keywords "docker") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/marcopolo"))])
- (mark-multiple . [(20121118 1554) nil "Sorta lets you mark several regions at once." tar ((:commit . "f6a53c7c5283d640ae718f4548b0fda78877a375"))])
- (mark-thing-at . [(20200427 1453) ((emacs (26)) (choice-program (0 9))) "Mark a pattern at the current point" single ((:commit . "a69696635616c10184a3289d459d8eb532f04f47") (:keywords "mark" "point" "lisp") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/mark-thing-at"))])
- (mark-tools . [(20130614 1025) nil "Some simple tools to access the mark-ring in Emacs" single ((:commit . "a11b61effa90bd0abc876d12573674d36fc17f0c") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs-mark-tools"))])
- (markdown-changelog . [(20200120 2253) ((emacs (26)) (dash (2 13 0))) "Maintain changelog entries" single ((:commit . "1a2c3a4c3e4196f2b5dbb145b01b4bc435a93a96") (:keywords "markdown" "changelog" "files") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/markdown-changelog"))])
- (markdown-mode+ . [(20170320 2104) ((markdown-mode (20111229))) "extra functions for markdown-mode" tar ((:commit . "411d079f4430a33c34ec0bbcb1535fe1145a2509") (:keywords "markdown" "latex" "osx" "rtf") (:authors ("Donald Ephraim Curtis")) (:maintainer "Donald Ephraim Curtis") (:url . "http://github.com/milkypostman/markdown-mode-plus"))])
- (markdown-mode . [(20200724 633) ((emacs (25 1))) "Major mode for Markdown-formatted text" single ((:commit . "fa9fa20e3236006c2cf278209356f60cc4175120") (:keywords "markdown" "github flavored markdown" "itex") (:authors ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainer "Jason R. Blevins" . "jblevins@xbeta.org") (:url . "https://jblevins.org/projects/markdown-mode/"))])
- (markdown-preview-eww . [(20160111 1502) ((emacs (24 4))) "Realtime preview by eww" single ((:commit . "5853f836425c877c8a956501f0adda137ef1d3b7") (:authors ("niku" . "niku@niku.name")) (:maintainer "niku" . "niku@niku.name") (:url . "https://github.com/niku/markdown-preview-eww"))])
- (markdown-preview-mode . [(20181213 1339) ((emacs (24 3)) (websocket (1 6)) (markdown-mode (2 0)) (cl-lib (0 5)) (web-server (0 1 1))) "markdown realtime preview minor mode." tar ((:commit . "f98d9114ca87e3e8e5ce70e601d13061eda15415") (:keywords "markdown" "gfm" "convenience") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com") (:url . "https://github.com/ancane/markdown-preview-mode"))])
- (markdown-toc . [(20200517 1233) ((s (1 9 0)) (dash (2 11 0)) (markdown-mode (2 1))) "A simple TOC generator for markdown file" tar ((:commit . "9565eeaa1d26bc0ab83eb65bd30470888f724044"))])
- (markdownfmt . [(20160609 1241) ((emacs (24))) "Format markdown using markdownfmt" single ((:commit . "187a74eb4fd9e8520ce08da42d1d292b9af7f2b7") (:keywords "markdown") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/emacs-markdownfmt"))])
- (markless . [(20190306 1002) ((emacs (24 4))) "Major mode for Markless documents" single ((:commit . "75fdef45df96978e9326ea4d9bf4e534a250c4c0") (:keywords "languages" "wp") (:authors ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainer "Nicolas Hafner" . "shinmera@tymoon.eu") (:url . "http://github.com/shirakumo/markless.el/"))])
- (markup . [(20170420 1129) ((cl-lib (0 5))) "Simple markup generation helpers." single ((:commit . "876da2d3f23473475bb0fd0a1480ae11d2671291") (:keywords "convenience" "markup" "html") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:url . "http://github.com/leoc/markup.el"))])
- (markup-faces . [(20141110 817) nil "collection of faces for markup language modes" single ((:commit . "98a807ed82473eb41c6a201ed7ef816d6bcd67b0") (:keywords "wp" "faces") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainer "Florian Kaufmann" . "sensorflo@gmail.com") (:url . "https://github.com/sensorflo/markup-faces"))])
- (marmalade-client . [(20141231 2007) ((web (0 5 2)) (kv (0 0 19)) (gh (0 8 0))) "client for marmalade API from emacs" tar ((:commit . "f315dea57e4fbebd9ee0668c0bafd4c45c7b754a") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "https://github.com/nicferrier/emacs-marmalade-upload"))])
- (marquee-header . [(20200720 1034) ((emacs (25 1))) "Code interface for displaying marquee in header" single ((:commit . "d8e83b837bacdd45d274be42fe2d172fd1cbbba2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/marquee-header"))])
- (marshal . [(20180124 1239) ((eieio (1 4)) (json (1 3)) (ht (2 1))) "eieio extension for automatic (un)marshalling" single ((:commit . "f038689cbd5b3680b80b44edd0c7a63ca3038e26") (:keywords "eieio") (:authors ("Yann Hodique" . "hodiquey@vmware.com")) (:maintainer "Yann Hodique" . "hodiquey@vmware.com") (:url . "https://github.com/sigma/marshal.el"))])
- (maruo-macro-mode . [(20160616 1349) ((emacs (24 3))) "Major mode for editing Hidemaru/Maruo macro script" single ((:commit . "8fc9a38ad051eafa8eb94038711acc52c5d1d8d5") (:keywords "programming" "editor" "macro") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))])
- (masm-mode . [(20200308 1450) ((emacs (25 1))) "MASM x86 and x64 assembly major mode" single ((:commit . "626b9255c2bb967a53d1d50be0b98a1bcae3250c") (:keywords "languages") (:authors ("YiGeeker" . "zyfchinese@yeah.net")) (:maintainer "YiGeeker" . "zyfchinese@yeah.net") (:url . "https://github.com/YiGeeker/masm-mode"))])
- (mastodon . [(20190305 344) ((emacs (24 4))) "Client for Mastodon" tar ((:commit . "5095797ef32b922d2a624fa6beb970b5e9cf5ca0") (:authors ("Johnson Denen" . "johnson.denen@gmail.com")) (:maintainer "Johnson Denen" . "johnson.denen@gmail.com") (:url . "https://github.com/jdenen/mastodon.el"))])
- (material-theme . [(20200620 943) ((emacs (24 1))) "A Theme based on the colors of the Google Material Design" tar ((:commit . "2710e61ecee1bbec943538305c26af4fe4fca68a") (:keywords "themes") (:authors ("Christoph Paulik" . "cpaulik@gmail.com")) (:maintainer "Christoph Paulik" . "cpaulik@gmail.com") (:url . "http://github.com/cpaulik/emacs-material-theme"))])
- (math-symbol-lists . [(20200131 2333) nil "Lists of Unicode math symbols and latex commands" tar ((:commit . "1cf7e2885f3352f55852ee9eba26c7cb5a7cd74b") (:keywords "unicode" "symbols" "mathematics") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:url . "https://github.com/vspinu/math-symbol-lists"))])
- (math-symbols . [(20170818 1459) ((helm (1 0))) "Math Symbol Input methods and conversion tools" tar ((:commit . "3f8b466f002e1b28ddbe9a6f236c9a1352adb17d") (:keywords "i18n" "languages" "tex") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/math-symbols"))])
- (matlab-mode . [(20200213 930) nil "Major mode for MATLAB(R) dot-m files" tar ((:commit . "e14d97df706049ea2e2d6e5b515fdbd08cd94dd3") (:url . "http://sourceforge.net/projects/matlab-emacs/") (:keywords "matlab" "programming" "language" "(X)emacs"))])
- (maude-mode . [(20200725 2035) ((emacs (25))) "Emacs mode for the programming language Maude" single ((:commit . "008f372631a1efe15be033792cfb1686b1736aeb") (:keywords "languages" "maude") (:authors ("Ellef Gjelstad <ellefg+maude*ifi.uio.no>")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at") (:url . "https://github.com/rudi/abs-mode"))])
- (maven-test-mode . [(20141220 557) ((s (1 9)) (emacs (24))) "Utilities for navigating test files and running maven test tasks." single ((:commit . "a19151861df2ad8ae4880a2e7c86ddf848cb569a") (:keywords "java" "maven" "test") (:authors ("Renan Ranelli")) (:maintainer "Renan Ranelli") (:url . "http://github.com/rranelli/maven-test-mode"))])
- (maxframe . [(20170120 1705) nil "maximize the emacs frame based on display size" single ((:commit . "f7048ce95443f2c06cb6b140814451e3a037103a") (:keywords "display" "frame" "window" "maximize") (:authors ("Ryan McGeary")) (:maintainer "Ryan McGeary"))])
- (mb-url . [(20191006 1930) ((cl-lib (0))) "Multiple Backends for Emacs URL package." tar ((:commit . "7230902e1f844e0a1388f741e9ae6260cda3de69") (:url . "https://github.com/dochang/mb-url") (:keywords "url"))])
- (mbe . [(20151126 1134) ((emacs (24)) (cl-lib (0 5))) "Macros by Example" single ((:commit . "bb10aa8f26bb7e9b1d5746934c94edb00402940c") (:keywords "tools" "macros") (:authors ("Ian Price" . "ianprice90@googlemail.com")) (:maintainer "Ian Price" . "ianprice90@googlemail.com") (:url . "https://github.com/ijp/mbe.el"))])
- (mbo70s-theme . [(20170808 1315) ((emacs (24 0))) "70s style palette, with similarities to mbo theme" single ((:commit . "bed3db8965708ed4e9482b224a9b084765c052f2") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (mbsync . [(20200128 1053) nil "run mbsync to fetch mails" single ((:commit . "d3c81da81ce5b154c0d048047a47277338721a70") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "https://github.com/dimitri/mbsync-el"))])
- (mc-calc . [(20200420 1836) ((emacs (24 4)) (multiple-cursors (1 2 1))) "Combine multiple-cursors and calc" single ((:commit . "74a046a5728919a4d1135ca62738326b0dde278c") (:keywords "convenience") (:authors (nil . "Frank Roland hatheroldev@fgmail.com>")) (:maintainer nil . "Frank Roland hatheroldev@fgmail.com>") (:url . "https://github.com/hatheroldev/mc-calc"))])
- (mc-extras . [(20181109 1735) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode." tar ((:commit . "053abc52181b8718559d7361a587bbb795faf164") (:keywords "editing" "cursors") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/mc-extras.el"))])
- (md-readme . [(20191112 1943) nil "Markdown-formatted READMEs for your ELisp" tar ((:commit . "ca99f44de11fab18d1f50d4b1722f2ceee3c814d") (:keywords "lisp" "help" "readme" "markdown" "header" "documentation" "github") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com") (:url . "http://github.com/thomas11/md-readme/tree/master"))])
- (md4rd . [(20191113 2108) ((emacs (25 1)) (hierarchy (0 7 0)) (request (0 3 0)) (cl-lib (0 6 1)) (dash (2 12 0)) (s (1 12 0)) (tree-mode (1 0 0))) "Mode for reddit (browse it)." single ((:commit . "ff7d95fc0fdf46a3cb6b3bbe52396dc4e474b8fd") (:keywords "ahungry" "reddit" "browse" "news") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/md4rd"))])
- (mediawiki . [(20200718 1529) nil "mediawiki frontend" single ((:commit . "932497604fd417964e4f04614e28d96f4eee028e") (:keywords "mediawiki" "wikipedia" "network" "wiki") (:authors ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:url . "https://github.com/hexmode/mediawiki-el"))])
- (meghanada . [(20200506 743) ((emacs (24 3)) (yasnippet (0 6 1)) (company (0 9 0)) (flycheck (0 23))) "A better java development mode" tar ((:commit . "e119c7b3271281d60892b80a0cc6488503baf38f") (:keywords "languages" "java") (:authors ("Yutaka Matsubara" . "yutaka.matsubara@gmail.com")) (:maintainer "Yutaka Matsubara" . "yutaka.matsubara@gmail.com") (:url . "https://github.com/mopemope/meghanada-emacs"))])
- (melancholy-theme . [(20200305 133) nil "No description available." single ((:commit . "ffed56cb756f8acba93ce7edc664c950d75927d9"))])
- (mellow-theme . [(20170808 1317) ((emacs (24 0))) "an Emacs 24 theme based on Mellow (tmTheme)" single ((:commit . "2bdf18f05f5212b6f269d9a94afe2cf201766891") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (melpa-upstream-visit . [(20130720 1033) ((s (1 6 0))) "A set of kludges to visit a melpa-hosted package's homepage" single ((:commit . "7310c74fdead3c0f86ad6eff76cf989e63f70f66") (:keywords "convenience") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))])
- (memento-mori . [(20190628 2147) ((emacs (24)) (cl-lib (0 5))) "Reminder of mortality" single ((:commit . "b99c5ff526079fc5a1e1be097534855da176bc2b") (:keywords "help") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-memento-mori"))])
- (memoize . [(20200103 2036) nil "Memoization functions" single ((:commit . "51b075935ca7070f62fae1d69fe0ff7d8fa56fdd") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/emacs-memoize"))])
- (memolist . [(20150804 1721) ((markdown-mode (22 0)) (ag (0 45))) "memolist.el is Emacs port of memolist.vim." single ((:commit . "c437a32d3955f859d9bbcbadf0911bbe27d877ff") (:keywords "markdown" "memo") (:authors ("mikanfactory <k952i4j14x17_at_gmail.com>")) (:maintainer "mikanfactory") (:url . "http://github.com/mikanfactory/emacs-memolist"))])
- (mentor . [(20190511 1638) ((xml-rpc (1 6 9)) (seq (1 11)) (cl-lib (0 5)) (async (1 9 3))) "Frontend for the rTorrent bittorrent client" tar ((:commit . "b5e441b7dc077d5532a3818b5441e52baefad839") (:keywords "comm" "processes" "bittorrent") (:authors ("Stefan Kangas" . "stefankangas@gmail.com")) (:maintainer "Stefan Kangas" . "stefankangas@gmail.com"))])
- (meow . [(20200727 851) ((emacs (26 3)) (dash (2 12 0)) (cl-lib (0 6 1))) "Modal Editing On Wheel" tar ((:commit . "c9296491e923a678ac9a42a2743f21ce1e0552c4") (:keywords "convenience" "modal-editing") (:authors ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:url . "https://www.github.com/DogLooksGood/meow"))])
- (merlin . [(20191025 851) nil "Mode for Merlin, an assistant for OCaml." tar ((:commit . "3751cbfff75022c396c4ff4dc1729048f80daa4f") (:keywords "ocaml" "languages") (:authors ("Frédéric Bour <frederic.bour(_)lakaban.net>")) (:maintainer "Frédéric Bour <frederic.bour(_)lakaban.net>") (:url . "https://github.com/ocaml/merlin"))])
- (merlin-eldoc . [(20190830 517) ((emacs (24 4)) (merlin (3 0))) "eldoc for OCaml and Reason" single ((:commit . "db7fab1eddfe34781b7e79694f8923b285698032") (:keywords "merlin" "ocaml" "languages" "eldoc") (:authors ("Louis Roché" . "louis@louisroche.net")) (:maintainer "Louis Roché" . "louis@louisroche.net") (:url . "https://github.com/khady/merlin-eldoc"))])
- (mermaid-mode . [(20200702 1909) ((f (0 20 0)) (emacs (25 3))) "major mode for working with mermaid graphs" single ((:commit . "06d382c49d32fba702ae65f08822166f9ab0ab34") (:keywords "mermaid" "graphs" "tools" "processes") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/mermaid-mode"))])
- (meson-mode . [(20200722 1244) ((emacs (26 1))) "Major mode for the Meson build system files" tar ((:commit . "d63b85bcb014bb7e5469160183841775200d5a81") (:keywords "languages" "tools") (:authors ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainer "Michal Sojka" . "sojkam1@fel.cvut.cz") (:url . "https://github.com/wentasah/meson-mode"))])
- (message-attachment-reminder . [(20200428 124) ((emacs (24 1))) "Remind if missing attachment" single ((:commit . "a8b761d665c17694a04eccf1c2bc135d35bdf482") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/message-attachment-reminder"))])
- (messages-are-flowing . [(20191029 954) nil "visible indication when composing \"flowed\" emails" single ((:commit . "d582a564a63b7b90764ffc5c618bc5300225d0ab") (:keywords "mail") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com"))])
- (meta-presenter . [(20190414 1720) nil "A simple multi-file presentation tool for Emacs" single ((:commit . "704a2e0f2a3e6bb72578e00eccb772dfcf0670fc") (:keywords "productivity" "presentation") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:url . "http://ismail.teamfluxion.com"))])
- (metalheart-theme . [(20160710 641) ((emacs (24))) "Low-contrast theme with a dark blue-green background." single ((:commit . "ec98ea2c11dc1213dae8cbe1fe0cee73ca138bb2") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))])
- (metamorph . [(20180930 2028) ((emacs (24 4))) "Transform your buffers with lisp" single ((:commit . "d9dc7037b7eed7b3fe85ea50e91f332e3f831514") (:keywords "metaprogramming" "wp") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:url . "http://github.com/AdamNiederer/metamorph"))])
- (metascript-mode . [(20150709 57) ((emacs (24 3))) "Major mode for the Metascript programming language" single ((:commit . "edb361c7b0e5de231e5334a17b90652fb1df78f9") (:keywords "languages" "metascript" "mjs") (:url . "http://github.com/metascript/metascript-mode"))])
- (metaweblog . [(20191018 242) ((emacs (26 3))) "An XML-RPC MetaWeblog and WordPress API client." single ((:commit . "d9a9710585e3f4300b4c0ac1fb11c2ce5030899c") (:keywords "comm") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:url . "https://github.com/org2blog/org2blog"))])
- (metrics-tracker . [(20200602 1032) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" single ((:commit . "6283e1fc5ddb65323513eb77638181551bda967b") (:keywords "calendar") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:url . "https://github.com/ianxm/emacs-tracker"))])
- (metronome . [(20200502 1748) ((emacs (25 1))) "A simple metronome" tar ((:commit . "18257ecdd7b3d816104e83a5f0f96e676cc9fbfc") (:authors ("Jonathan Gregory <jgrg at autistici dot org>")) (:maintainer "Jonathan Gregory <jgrg at autistici dot org>") (:url . "https://gitlab.com/jagrg/metronome"))])
- (mew . [(20200316 221) nil "Messaging in the Emacs World" tar ((:commit . "5145145f87bfbe80fd91e82ded33033cf78ef54f") (:authors ("Kazu Yamamoto" . "Kazu@Mew.org")) (:maintainer "Kazu Yamamoto" . "Kazu@Mew.org"))])
- (mexican-holidays . [(20200622 132) nil "Mexico holidays for Emacs calendar." single ((:commit . "5b5dd6e71505e8938bac9e9733b30bd394631923") (:keywords "calendar") (:authors ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainer "Saúl Gutiérrez" . "me@sggc.me") (:url . "https://github.com/shopClerk/mexican-holidays"))])
- (meyvn . [(20200311 2209) ((emacs (25 1)) (cider (0 23)) (projectile (2 1)) (s (1 12)) (dash (2 17)) (parseedn (0 1 0))) "Meyvn client" single ((:commit . "5eb0423d4b7083cb330a73ef1cfd3e0dd8538567") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:url . "https://github.com/danielsz/meyvn-el"))])
- (mgmtconfig-mode . [(20200104 108) ((emacs (24 3))) "mgmt configuration management language" single ((:commit . "e9af8a2595e336542c9dfc656fe808ddc6937a59") (:keywords "languages") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainer "Mgmt contributors <https://github.com/purpleidea/mgmt>") (:url . "https://github.com/purpleidea/mgmt/misc/emacs"))])
- (mhc . [(20190807 513) ((calfw (20150703))) "Message Harmonized Calendaring system." tar ((:commit . "f9f048de9fe85a90d376d828ce3dad2a96c62c40") (:keywords "calendar") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:url . "http://www.quickhack.net/mhc"))])
- (mic-paren . [(20170731 1907) nil "advanced highlighting of matching parentheses" single ((:commit . "d0410c7d805c9aaf51a1bcefaaef092bed5824c4") (:keywords "languages" "faces" "parenthesis" "matching") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Klaus Berndl " . "berndl@sdm.de") ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "ttn"))])
- (micgoline . [(20160415 326) ((emacs (24 3)) (powerline (2 3))) "powerline mode, color schemes from microsoft and google's logo." single ((:commit . "837504263bb1711203b0f7efecd6b7b5f272fae0") (:keywords "mode-line" "powerline" "theme") (:authors ("yzprofile" . "yzprofiles@gmail.com")) (:maintainer "yzprofile" . "yzprofiles@gmail.com") (:url . "https://github.com/yzprofile/micgoline"))])
- (midje-mode . [(20170809 403) ((cider (0 1 4)) (clojure-mode (1 0))) "Minor mode for running Midje tests in emacs" tar ((:commit . "10ad5b6084cd03d5cd268b486a7c3c246d85535f"))])
- (migemo . [(20190112 516) ((cl-lib (0 5))) "Japanese incremental search through dynamic pattern expansion" single ((:commit . "f42832c8ac462ecbec9a16eb781194f876fba64a") (:authors ("Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp")) (:maintainer "Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp") (:url . "https://github.com/emacs-jp/migemo"))])
- (milkode . [(20140927 529) nil "Command line search and direct jump with Milkode" single ((:commit . "ba97e2aeefa1d9d0b3835bf08edd0de248b0c513") (:keywords "milkode" "search" "grep" "jump" "keyword") (:authors ("ongaeshi")) (:maintainer "ongaeshi"))])
- (minesweeper . [(20200416 2342) nil "play minesweeper in Emacs" single ((:commit . "d4248e3c9b3e9e7277cb9e6d081330611898f334") (:keywords "game" "fun" "minesweeper" "inane" "diversion") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com") (:url . "https://hg.sr.ht/~zck/minesweeper"))])
- (mingus . [(20190106 1443) ((libmpdee (2 1))) "MPD Interface" tar ((:commit . "4223be618f57f10f18114a74393a71955b568884") (:keywords "multimedia" "elisp" "music" "mpd") (:authors ("Niels Giesen <pft on #emacs>")) (:maintainer "Niels Giesen <pft on #emacs>") (:url . "https://github.com/pft/mingus"))])
- (mini-frame . [(20200430 721) ((emacs (26 1))) "Show minibuffer in child frame on read-from-minibuffer" single ((:commit . "78d9bbb272acc5f2927648cc706321f95e2955c9") (:keywords "frames") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:url . "https://github.com/muffinmad/emacs-mini-frame"))])
- (mini-header-line . [(20170621 1221) ((emacs (24 4))) "a minimal header-line" single ((:commit . "73b6724e0a26c4528d93768191c8aa59e6bce2e5") (:keywords "header-line" "mode-line") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:url . "https://github.com/ksjogo/mini-header-line"))])
- (mini-modeline . [(20200602 2355) ((emacs (25 1)) (dash (2 12 0))) "Display modeline in minibuffer" single ((:commit . "a8db97ff19affcb669643d5fb6527f1285ba7ede") (:keywords "convenience" "tools") (:authors ("Kien Nguyen" . "kien.n.quang@gmail.com")) (:maintainer "Kien Nguyen" . "kien.n.quang@gmail.com") (:url . "https://github.com/kiennq/emacs-mini-modeline"))])
- (minibuf-isearch . [(20151226 1943) nil "incremental search on minibuffer history" single ((:commit . "2846c6ac369ee623dad4cd3c8a7a6d9078965516") (:keywords "minibuffer" "history" "incremental search") (:authors ("Keiichiro Nagano" . "knagano@sodan.org") ("Hideyuki SHIRAI " . "shirai@meadowy.org")) (:maintainer "Keiichiro Nagano" . "knagano@sodan.org"))])
- (minibuffer-complete-cycle . [(20130813 1645) nil "Cycle through the *Completions* buffer" single ((:commit . "3df80135887d0169e02294a948711f6dfeca4a6f") (:keywords "completion") (:authors ("Akinori MUSHA" . "knu@iDaemons.org") ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/minibuffer-complete-cycle"))])
- (minibuffer-cua . [(20130906 1134) nil "Make CUA mode's S-up/S-down work in minibuffer" single ((:commit . "adc4979a64f8b36e05960e9afa0746dfa9e2e4c7") (:keywords "completion" "editing") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/minibuffer-cua.el"))])
- (miniedit . [(20100419 1745) nil "Enhanced editing for minibuffer fields." single ((:commit . "e12bf659c3eb92dd8a4cb77642dc0865c54667a3"))])
- (minimal-session-saver . [(20140508 2041) nil "Very lean session saver" single ((:commit . "cf654ac549850746dc21091746e4bcc1aef7668e") (:keywords "tools" "frames" "project") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/minimal-session-saver"))])
- (minimal-theme . [(20190113 2132) nil "A light/dark minimalistic Emacs 24 theme." tar ((:commit . "221b43aad320d226863892dfe4d85465e8eb81ce") (:keywords "color" "theme" "minimal") (:authors ("Anler Hp <anler86 [at] gmail.com>")) (:maintainer "Anler Hp <anler86 [at] gmail.com>") (:url . "http://github.com/ikame/minimal-theme"))])
- (minions . [(20200522 1052) ((emacs (25 2)) (dash (2 13 0))) "A minor-mode menu for the mode line" single ((:commit . "36d39bd25ae58d1359d17f99142520339bea5974") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/minions"))])
- (minitest . [(20200506 308) ((dash (1 0 0))) "An Emacs mode for ruby minitest files" tar ((:commit . "ddd152c990a528ad09a696bfad23afa4330ea4d7") (:authors ("Arthur Neves")) (:maintainer "Arthur Neves") (:url . "https://github.com/arthurnn/minitest-emacs"))])
- (minizinc-mode . [(20180201 1450) ((emacs (24 1))) "Major mode for MiniZinc code" single ((:commit . "2512521ba7f8e263a06db88df663fc6b3cca7e16") (:keywords "languages" "minizinc") (:url . "http://github.com/m00nlight/minizinc-mode"))])
- (minor-mode-hack . [(20170926 34) nil "Change priority of minor-mode keymaps" single ((:commit . "9688994e23ccb2de568225ef125b41c46e5667c3") (:keywords "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/minor-mode-hack.el"))])
- (minsk-theme . [(20200306 1220) ((emacs (24))) "Minsk, a theme in deep muted greens" single ((:commit . "e4dcdec3a4472a507d6b249ae2194dacaa885ecb") (:keywords "theme" "faces") (:authors ("Jean Lo" . "jlpaca@users.noreply.github.com")) (:maintainer "Jean Lo" . "jlpaca@users.noreply.github.com") (:url . "https://github.com/jlpaca/minsk-theme"))])
- (mip-mode . [(20151127 617) nil "virtual projects for emacs." single ((:commit . "7c88c383b4c7ed0a4c1dc397735f365c1fcb461c") (:keywords "workspaces" "workspace" "project" "projects" "mip-mode") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st"))])
- (mips-mode . [(20180502 1457) nil "Major-mode for MIPS assembly" single ((:commit . "75152fc78baa762af4f83602f6cb3c8b9bcebca3") (:keywords "languages" "mips" "assembly") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-mips-mode"))])
- (mix . [(20200419 820) ((emacs (25 1))) "Mix Major Mode. Build Elixir using Mix" single ((:commit . "37916fa5f7dfe448585fb83ea6253eb0f84df15f") (:keywords "tools") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:url . "https://github.com/ayrat555/mix.el"))])
- (mixed-pitch . [(20200511 2052) ((emacs (24 3))) "Use a variable pitch, keeping fixed pitch where it's sensible" single ((:commit . "1cad46fddf741ed7ec5fc477d70e079e908e9ce6") (:authors ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainer "J. Alexander Branham" . "branham@utexas.edu") (:url . "https://gitlab.com/jabranham/mixed-pitch"))])
- (mkdown . [(20140517 1418) ((markdown-mode (2 0))) "Pretty Markdown previews based on mkdown.com" tar ((:commit . "8e23de82719af6c5b53b52b3308a02b3a1fb872e") (:keywords "markdown") (:authors ("Andrew Tulloch")) (:maintainer "Andrew Tulloch") (:url . "https://github.com/ajtulloch/mkdown.el"))])
- (mlso-theme . [(20200513 1751) ((emacs (24))) "A dark, medium contrast theme" single ((:commit . "059c5773403b73a14a1b04d62d1d5b077a3f6e06") (:authors ("github.com/Mulling")) (:maintainer "github.com/Mulling") (:url . "https://github.com/Mulling/mlso-theme"))])
- (mmm-jinja2 . [(20170313 1420) ((mmm-mode (0 5 4))) "MMM submode class for Jinja2 Templates" single ((:commit . "c8cb763174fa2fb61b9a0e5e0ff8cb0210f8492f") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainer "Ben Hayden" . "hayden767@gmail.com") (:url . "https://github.com/glynnforrest/mmm-jinja2"))])
- (mmm-mode . [(20200714 1714) ((cl-lib (0 2))) "Allow Multiple Major Modes in a buffer" tar ((:commit . "9ffe364f3a31c7a771fe3401b8924642609953e8") (:keywords "convenience" "faces" "languages" "tools") (:authors ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:url . "https://github.com/purcell/mmm-mode"))])
- (mmt . [(20190713 1347) ((emacs (24 1)) (cl-lib (0 3))) "Missing macro tools for Emacs Lisp" single ((:commit . "d7729563e656a3e8adef6bce60348861ba183c09") (:keywords "macro" "emacs-lisp") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/mmt"))])
- (mo-git-blame . [(20160129 1759) nil "An interactive, iterative 'git blame' mode for Emacs" single ((:commit . "254a675eb794cdbbdef9fa2b4b7bb510b70089c0") (:keywords "tools") (:authors ("Moritz Bunkus" . "moritz@bunkus.org")) (:maintainer "Moritz Bunkus" . "moritz@bunkus.org"))])
- (mo-vi-ment-mode . [(20181217 206) nil "Provide vi-like cursor movement that's easy on the fingers" single ((:commit . "e8b525ffc5faa31d36ecc5496b40f0f5c3603c08") (:keywords "convenience") (:authors ("Ajay MT" . "ajay.tatachar@gmail.com")) (:maintainer "Ajay MT" . "ajay.tatachar@gmail.com"))])
- (mobdebug-mode . [(20140110 346) ((lua-mode (20130419)) (emacs (24))) "Major mode for MobDebug" single ((:commit . "e1d483bc4e341c762bc5c0a8c52306a8d01ea0da") (:authors ("Shihpin Tseng" . "deftsp@gmail.com")) (:maintainer "Shihpin Tseng" . "deftsp@gmail.com") (:url . "https://github.com/deftsp/mobdebug-mode"))])
- (mocha . [(20200729 1130) ((js2-mode (20150909)) (f (0 18))) "Run Mocha or Jasmine tests" single ((:commit . "6a72fa20e7be6e55c09b1bc9887ee09c5df28e45") (:keywords "javascript" "mocha" "jasmine") (:authors ("Al Scott")) (:maintainer "Al Scott") (:url . "http://github.com/scottaj/mocha.el"))])
- (mocha-snippets . [(20190417 1931) ((yasnippet (0 8 0))) "Yasnippets for the Mocha JS Testing Framework" tar ((:commit . "361a3809f755577406e109b9e44d473dfa7c08e0") (:keywords "test" "javascript") (:authors ("Charles Lowell" . "cowboyd@frontside.io")) (:maintainer "Charles Lowell" . "cowboyd@frontside.io"))])
- (mocker . [(20150917 154) ((eieio (1 3)) (el-x (0 2 4))) "mocking framework for emacs" single ((:commit . "6a1d7c9189bd721debd1a60707526e43a733f537") (:keywords "lisp" "testing") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))])
- (modalka . [(20190713 1335) ((emacs (24 4))) "Easily introduce native modal editing of your own design" single ((:commit . "4b2b92b14ed0b64fb0a0fa80a374ec9f87fbfeb6") (:keywords "modal" "editing") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/modalka"))])
- (mode-icons . [(20190627 2121) ((emacs (24)) (cl-lib (0 5))) "Show icons for modes" tar ((:commit . "f16969f053f43bf706257673d0800de438d4e33b") (:keywords "multimedia") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:url . "http://ryuslash.org/projects/mode-icons.html"))])
- (mode-line-bell . [(20181029 516) nil "Flash the mode line instead of ringing the bell" single ((:commit . "26ac7d97abdeb762ceaeab6b892f3ed7e3412494") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (mode-line-debug . [(20180318 2225) nil "show status of `debug-on-error' in the mode-line" single ((:commit . "a0fcc394b07d2414bd6f722da10f1c7567333f6b") (:keywords "convenience" "lisp") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/mode-line-debug"))])
- (modern-cpp-font-lock . [(20200530 1010) nil "Font-locking for \"Modern C++\"" single ((:commit . "865955d0035382a17a7f03add0d00d0bd812b103") (:keywords "languages" "c++" "cpp" "font-lock") (:authors ("Ludwig PACIFICI" . "ludwig@lud.cc")) (:maintainer "Ludwig PACIFICI" . "ludwig@lud.cc") (:url . "https://github.com/ludwigpacifici/modern-cpp-font-lock"))])
- (modern-fringes . [(20200321 1817) nil "Replaces default fringe bitmaps with better looking ones" single ((:commit . "108daba8407dc8acf140157e7f49137c397a0af7") (:keywords "themes" "fringes" "convenience") (:authors ("Quen Jankosky" . "quen.jankosky@gmail.com")) (:maintainer "Quen Jankosky" . "quen.jankosky@gmail.com") (:url . "http://github.com/specialbomb/emacs-modern-fringes"))])
- (modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files." single ((:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu") (:url . "http://www.github.com/jordonbiondo/modtime-skip-mode"))])
- (modus-operandi-theme . [(20200731 753) ((emacs (26 1))) "Accessible light theme (WCAG AAA)" single ((:commit . "c376b08059028737390f41fb82f64d748c42970c") (:keywords "faces" "theme" "accessibility") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:url . "https://gitlab.com/protesilaos/modus-themes"))])
- (modus-vivendi-theme . [(20200731 753) ((emacs (26 1))) "Accessible dark theme (WCAG AAA)" single ((:commit . "c376b08059028737390f41fb82f64d748c42970c") (:keywords "faces" "theme" "accessibility") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:url . "https://gitlab.com/protesilaos/modus-themes"))])
- (moe-theme . [(20200216 1927) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "01d00a8d75b19f641b639ba23793cdd507c61f05") (:url . "https://github.com/kuanyui/moe-theme.el"))])
- (molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" single ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:keywords ":" "languages" "terminals") (:authors (": drymer <drymer [ AT ] autistici.org>")) (:maintainer ": drymer <drymer [ AT ] autistici.org>") (:url . "https://git.daemons.it/drymer/molecule.el"))])
- (molokai-theme . [(20151016 1545) nil "molokai theme with Emacs theme engine" single ((:commit . "04a44f21184b6a26caae4f2c92db9019d883309c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/alloy-d/color-theme-molokai"))])
- (mongo . [(20150315 1219) nil "MongoDB driver for Emacs Lisp" tar ((:commit . "595529ddd70ecb9fab8b11daad2c3929941099d6") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))])
- (monitor . [(20161018 1144) ((dash (2 13 0))) "Utilities for monitoring expressions." tar ((:commit . "63f4643a0ee81616dbb692b8b03bae21df2283e2") (:keywords "lisp" "monitor" "utility") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:url . "https://github.com/guiltydolphin/monitor"))])
- (monky . [(20190619 1637) nil "Control Hg from Emacs." tar ((:commit . "9d379a2306a8b7cd9c4faba20490480acdc1d763") (:keywords "tools") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:url . "http://github.com/ananthakumaran/monky"))])
- (monochrome-theme . [(20140326 1050) nil "A dark Emacs 24 theme for your focused hacking sessions" tar ((:commit . "bfca67fe7365310bc47ae9ca96c417caada54896") (:authors ("Xavier Noria" . "fxn@hashref.com")) (:maintainer "Xavier Noria" . "fxn@hashref.com"))])
- (monokai-alt-theme . [(20170630 2048) ((emacs (24))) "Theme with a dark background. Based on sublime monokai theme." single ((:commit . "f342b6afc31f929be0626eca2d696ee9fab78011") (:authors ("Dmytro Koval")) (:maintainer "Dmytro Koval") (:url . "https://github.com/dawidof/emacs-monokai-theme"))])
- (monokai-pro-theme . [(20200525 1430) nil "A simple theme based on the Monokai Pro Sublime color schemes" single ((:commit . "d1bc669200bf5753cf1963e5e65269e0d60648d5") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/belak/emacs-monokai-pro-theme"))])
- (monokai-theme . [(20200416 2001) nil "A fruity color theme for Emacs." single ((:commit . "4281fc13dadef98942c8d43024de024f2392fec5") (:authors ("Kelvin Smith" . "oneKelvinSmith@gmail.com")) (:maintainer "Kelvin Smith" . "oneKelvinSmith@gmail.com") (:url . "http://github.com/oneKelvinSmith/monokai-emacs"))])
- (monotropic-theme . [(20181015 1230) ((emacs (24))) "Monotropic Theme" single ((:commit . "36df566aa8225e303f6c9d90c00740dd678a415e") (:authors ("caffo")) (:maintainer "caffo") (:url . "https://github.com/caffo/monotropic-theme"))])
- (monroe . [(20200703 1254) nil "Yet another client for nREPL" single ((:commit . "b540e13cf767055086c37b2878e551fd3eddf5c5") (:keywords "languages" "clojure" "nrepl" "lisp") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com") (:url . "http://www.github.com/sanel/monroe"))])
- (mood-line . [(20200722 2327) ((emacs (25 1))) "A minimal mode-line inspired by doom-modeline" single ((:commit . "64cbd61c3d9ebf8eb7e1b6366279e32382405f90") (:keywords "mode-line" "faces") (:authors ("Jessie Hildebrandt <jessieh.net>")) (:maintainer "Jessie Hildebrandt <jessieh.net>") (:url . "https://gitlab.com/jessieh/mood-line"))])
- (mood-one-theme . [(20200730 18) ((emacs (24 4))) "A dark color scheme inspired by the Doom One theme." single ((:commit . "00e2d3797a271c0b3ecb0bab56dc705558015311") (:keywords "mode-line" "faces") (:authors ("Jessie Hildebrandt <jessieh.net>")) (:maintainer "Jessie Hildebrandt <jessieh.net>") (:url . "https://gitlab.com/jessieh/mood-one-theme"))])
- (moody . [(20200514 1946) ((emacs (25 3))) "Tabs and ribbons for the mode line" single ((:commit . "f6bebfe6fe51b728ebd013b7084becad23cabad3") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/moody"))])
- (moom . [(20200725 126) ((emacs (25 1))) "Commands to control frame position and size" tar ((:commit . "d6dc1f42ccf0d53c8f5d5a327442ae52b2de7aed") (:keywords "frames" "faces" "convenience") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:url . "https://github.com/takaxp/Moom"))])
- (moonscript . [(20170831 2226) ((cl-lib (0 5)) (emacs (24))) "Major mode for editing MoonScript code" tar ((:commit . "56f90471e2ced2b0a177aed4d8c2f854797e9cc7") (:authors ("@GriffinSchneider, @k2052, @EmacsFodder")) (:maintainer "@GriffinSchneider, @k2052, @EmacsFodder"))])
- (moonshot . [(20200210 2356) ((emacs (25 1)) (cl-lib (0 5)) (f (0 18)) (s (1 11 0)) (projectile (2 0 0)) (counsel (0 11 0)) (realgud (1 5 1)) (seq (2 20)) (levenshtein (1 0))) "Run executable file, debug and build commands on project" single ((:commit . "83a9933cd4af234ae15fdc3a39e660d646b0c246") (:keywords "convenience" "files" "processes" "tools" "unix") (:authors ("Jong-Hyouk Yun" . "ageldama@gmail.com")) (:maintainer "Jong-Hyouk Yun" . "ageldama@gmail.com") (:url . "https://github.com/ageldama/moonshot"))])
- (morganey-mode . [(20170118 934) ((emacs (24 4))) "Major mode for editing Morganey files" single ((:commit . "5cf3870432a2aeb69d373abe63b3be1f325f6d21") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "https://github.com/morganey-lang/morganey-mode"))])
- (morlock . [(20180318 2023) nil "more font-lock keywords for elisp" single ((:commit . "b883d48024ddfffebe2d0dd69f5ed54c617f8834") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/morlock"))])
- (mosey . [(20180614 1649) ((emacs (24 4))) "Mosey around your buffers" single ((:commit . "2e3ac9d334fa2937ed5267193dfd25d8e1f14dc2") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/mosey.el"))])
- (most-used-words . [(20200704 354) ((emacs (24 3))) "Display most used words in buffer" single ((:commit . "f74bbb9c99381123e563d8d7a65d9a132ea3ab8b") (:keywords "convenience" "wp") (:authors ("Udyant Wig" . "udyant.wig@gmail.com")) (:maintainer "Udyant Wig" . "udyant.wig@gmail.com") (:url . "https://github.com/udyantw/most-used-words"))])
- (mote-mode . [(20160123 29) ((ruby-mode (1 1))) "Mote minor mode" single ((:commit . "666c6641addbd3b337a7aa01fd2742ded2f41b83") (:authors ("Leandro López (inkel)" . "inkel.ar@gmail.com")) (:maintainer "Leandro López (inkel)" . "inkel.ar@gmail.com") (:url . "http://inkel.github.com/mote-mode/"))])
- (motion-mode . [(20140920 156) ((flymake-easy (0 7)) (flymake-cursor (1 0 2))) "major mode for RubyMotion enviroment" tar ((:commit . "4c94180e3ecea611a61240a0c0cd48f1032c4a55") (:authors ("Satoshi Namai")) (:maintainer "Satoshi Namai") (:url . "https://github.com/ainame/motion-mode"))])
- (mouse-slider-mode . [(20161021 1914) ((emacs (24 3)) (cl-lib (0 3))) "scale numbers dragged under the mouse" single ((:commit . "b3c19cd231edecce76787c5a9bbe5e4046d91f88") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/mouse-slider-mode"))])
- (move-dup . [(20200506 2305) nil "Eclipse-like moving and duplicating lines or rectangles." single ((:commit . "fa9be365fcd6a2b89388b4d27dec93928d506678") (:keywords "convenience" "text" "edit") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:url . "https://github.com/wyuenho/move-dup"))])
- (move-text . [(20170909 330) nil "Move current line or region with M-up or M-down." single ((:commit . "7cbc941a9150468609010a93c429117da2523903") (:keywords "edit") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/emacsfodder/move-text"))])
- (mowedline . [(20161122 235) nil "elisp utilities for using mowedline" single ((:commit . "6121b7d4aacd18f7b24da226e61dbae054e50a7c") (:authors ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainer "John Foerch" . "jjfoerch@earthlink.net"))])
- (moz . [(20150805 1706) nil "Lets current buffer interact with inferior mozilla." single ((:commit . "ab3e79914445039ceb62f7f2dc342358fec3492e") (:authors ("Massimiliano Mirra, <bard [at] hyperstruct [dot] net>")) (:maintainer "Massimiliano Mirra, <bard [at] hyperstruct [dot] net>") (:url . "http://github.com/bard/mozrepl/raw/master/chrome/content/moz.el"))])
- (moz-controller . [(20151209 206) ((moz (0))) "Control Firefox from Emacs" single ((:commit . "46f665c03574fa922de767fc29795e0db4a7c5c6") (:authors ("任文山 (Ren Wenshan) <renws1990 at gmail.com>")) (:maintainer "任文山 (Ren Wenshan) <renws1990 at gmail.com>") (:url . "https://github.com/RenWenshan/emacs-moz-controller"))])
- (mozc . [(20180101 800) nil "minor mode to input Japanese with Mozc" single ((:commit . "afb03ddfe72dde4cf2409863a3bfea160f7a66d8") (:keywords "mule" "multilingual" "input method"))])
- (mozc-cand-posframe . [(20200208 750) ((emacs (26 1)) (posframe (0 5 0)) (mozc (20180101 800)) (s (1 12))) "Posframe frontend for mozc.el" single ((:commit . "1d07d5055381008ccbb29b97315d140e09a7ee95") (:keywords "i18n" "tooltip") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/mozc-posframe"))])
- (mozc-im . [(20160412 22) ((mozc (0))) "Mozc with input-method-function interface." single ((:commit . "df614a1076c28a11551fb3e822868bae47e855a5") (:keywords "i18n" "extentions") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com"))])
- (mozc-popup . [(20150224 34) ((popup (0 5 2)) (mozc (0))) "Mozc with popup" single ((:commit . "f0684b875a7427ec08f8df13939a486e5d5cf420") (:keywords "i18n" "extentions") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com"))])
- (mozc-temp . [(20160228 840) ((emacs (24)) (dash (2 10 0)) (mozc (0))) "Use mozc temporarily" single ((:commit . "90a6eb1db8fa1283b944432cfb83739286b37f92") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/mozc-temp"))])
- (mpages . [(20150710 1404) nil "An Emacs buffer for quickly writing your Morning Pages" single ((:commit . "39a72a0931ab1cdbfdf0ab9f412dc12d43a3829f") (:authors ("Sean Levin")) (:maintainer "Sean Levin") (:url . "https://github.com/slevin/mpages"))])
- (mpdel . [(20200221 1316) ((emacs (25 1)) (libmpdel (1 2 0)) (navigel (0 7 0))) "Play and control your MPD music" tar ((:commit . "29e7c46f83bab7aedfa0136c58e776faba6ad4ed") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/mpdel"))])
- (mpmc-queue . [(20180303 2029) ((emacs (26 0)) (queue (0 2 0))) "a multiple-producer-multiple-consumer queue" single ((:commit . "df07d6bef7468edb1d73ef73b8331b94d0e5d0ca") (:keywords "lisp" "async") (:authors ("Sho Mizoe" . "sho.mizoe@gmail.com")) (:maintainer "Sho Mizoe" . "sho.mizoe@gmail.com") (:url . "https://github.com/smizoe/mpmc-queue"))])
- (mpv . [(20200315 2158) ((cl-lib (0 5)) (emacs (24)) (json (1 3)) (org (8 0))) "control mpv for easy note-taking" single ((:commit . "2d40c4550558eb1bf35a69446777c4e9cae7a623") (:keywords "tools" "multimedia") (:authors ("Johann Klähn" . "kljohann@gmail.com")) (:maintainer "Johann Klähn" . "kljohann@gmail.com") (:url . "https://github.com/kljohann/mpv.el"))])
- (mqr . [(20180527 1204) ((emacs (24 4))) "Multi-dimensional query and replace" single ((:commit . "4ade19d4620b8b61340290bf63fa56d5e493859f") (:keywords "convenience" "extensions" "lisp") (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:url . "https://github.com/calancha/multi-replace"))])
- (mqtt-mode . [(20180605 1731) ((emacs (25)) (dash (2 12 0))) "client for interaction with MQTT servers" single ((:commit . "36d1d4296d79e17b8f35e8e14f2708980eb502db") (:keywords "tools") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:url . "https://github.com/andrmuel/mqtt-mode"))])
- (msgpack . [(20200323 515) ((emacs (25 1))) "Read and write MessagePack object" single ((:commit . "90e3086f259549b1667a3c5b9aa2d70aaeaa4d3d") (:keywords "lisp") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/msgpack.el"))])
- (msvc . [(20191211 540) ((emacs (24)) (cl-lib (0 5)) (cedet (1 0)) (ac-clang (2 0 0))) "Microsoft Visual C/C++ mode" tar ((:commit . "9fe50e5961fa63fc5cf7326370f441993e9d5cfc") (:keywords "languages" "completion" "syntax check" "mode" "intellisense") (:authors ("yaruopooner [https://github.com/yaruopooner]")) (:maintainer "yaruopooner [https://github.com/yaruopooner]") (:url . "https://github.com/yaruopooner/msvc"))])
- (mtg-deck-mode . [(20180613 2010) ((emacs (25 1))) "Major mode to edit MTG decks" tar ((:commit . "8265b8ed17fcd4406760c19aa6ee9c76068b1ab0") (:keywords "data" "mtg" "magic") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com") (:url . "https://github.com/mattiasb/mtg-deck-mode"))])
- (mu-cite . [(20190803 439) ((flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "b2c83bbce4646d100b942f0f0de0877a8d47298c"))])
- (mu2tex . [(20200512 704) nil "Convert plain text molecule names and units to TeX" single ((:commit . "4b84cdac955cb36a8c44a2be48f3310252e3d3ad") (:keywords "tex") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") (:url . "https://github.com/cdominik/mu2tex"))])
- (mu4e-alert . [(20190418 558) ((alert (1 2)) (s (1 10 0)) (ht (2 0)) (emacs (24 3))) "Desktop notification for mu4e" single ((:commit . "91f0657c5b245a9de57aa38391221fb5d141d9bd") (:keywords "mail" "convenience") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:url . "https://github.com/iqbalansari/mu4e-alert"))])
- (mu4e-conversation . [(20190609 812) ((emacs (25 1))) "Show a complete thread in a single buffer" single ((:commit . "98110bb9c300fc9866dee8e0023355f9f79c9b96") (:keywords "mail" "convenience" "mu4e") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://gitlab.com/Ambrevar/mu4e-conversation"))])
- (mu4e-jump-to-list . [(20190419 1442) ((emacs (24 4)) (cl-lib (0 5))) "mu4e jump-to-list extension" single ((:commit . "358bba003543b49ffa266e503e54aebd0ebe614b") (:keywords "mu4e" "mail" "convenience") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:url . "https://github.com/wavexx/mu4e-jump-to-list.el"))])
- (mu4e-maildirs-extension . [(20200508 712) ((dash (0 0 0))) "Show mu4e maildirs summary in mu4e-main-view" single ((:commit . "4d2ece2226fa69a0e0bb23517a418145b92bd573") (:authors ("Andreu Gil Pàmies" . "agpchil@gmail.com")) (:maintainer "Andreu Gil Pàmies" . "agpchil@gmail.com") (:url . "http://github.com/agpchil/mu4e-maildirs-extension"))])
- (mu4e-overview . [(20200218 546) ((emacs (26))) "Show overview of maildir" single ((:commit . "151d5d9e0dd5e8e8c775035203d3e17538151f33") (:keywords "mail" "tools") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:url . "https://github.com/mkcms/mu4e-overview"))])
- (mu4e-query-fragments . [(20170923 1322) ((emacs (24 4))) "mu4e query fragments extension" single ((:commit . "34ddad4e6785f575333efcc66153d892daa1c884") (:keywords "mu4e" "mail" "convenience") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:url . "https://github.com/wavexx/mu4e-query-fragments.el"))])
- (muban . [(20180415 1219) ((emacs (25))) "Lightweight template expansion tool" single ((:commit . "7078e439ee0433a8fbd1cb174464496f9a9d00fa") (:keywords "abbrev" "tools") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:url . "https://github.com/jiahaowork/muban.el"))])
- (mugur . [(20200602 642) ((emacs (26 1)) (s (1 12 0)) (anaphora (1 0 4))) "A high-level configurator for the ErgoDox EZ keyboard" single ((:commit . "5333d0ff56cb4d1448e4cdf48278abcbc32e96eb") (:keywords "multimedia") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:url . "https://github.com/mihaiolteanu/mugur"))])
- (multi . [(20131013 1544) ((emacs (24))) "Clojure-style multi-methods for emacs lisp" single ((:commit . "0987ab71692717ed457cb3984de184db9185806d") (:keywords "multimethod" "generic" "predicate" "dispatch") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com") (:url . "http://github.com/kurisuwhyte/emacs-multi"))])
- (multi-compile . [(20200517 1747) ((emacs (24)) (dash (2 12 1))) "Multi target interface to compile." single ((:commit . "e3772f7e68968f7fa2c97615115cd3fc0f701229") (:keywords "tools" "compile" "build") (:authors ("Kvashnin Vladimir" . "reangd@gmail.com")) (:maintainer "Kvashnin Vladimir" . "reangd@gmail.com") (:url . "https://github.com/ReanGD/emacs-multi-compile"))])
- (multi-line . [(20170822 226) ((emacs (24 3)) (s (1 9 0)) (cl-lib (0 5)) (dash (2 12 0)) (shut-up (0 3 2))) "multi-line statements" tar ((:commit . "d5ae863ced0adeb7032ada398005f27a6c669d79") (:keywords "multi" "line" "length" "whitespace" "programming" "tools" "convenience" "files") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/multi-line"))])
- (multi-project . [(20191117 1203) ((emacs (25))) "Find files, compile, and search for multiple projects." single ((:commit . "4045823d51f6330466b6ab83828b6c598ac817a0") (:keywords "convenience" "project" "management") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:url . "https://hg.osdn.net/view/multi-project/multi-project"))])
- (multi-run . [(20190507 2349) ((emacs (24)) (window-layout (1 4))) "Efficiently manage multiple remote nodes" tar ((:commit . "c6256b0cc2876c29faf381d8324b31b911045a27") (:keywords "multiple shells" "multi-run" "remote nodes") (:authors ("Sagar Jha")) (:maintainer "Sagar Jha") (:url . "https://www.github.com/sagarjha/multi-run"))])
- (multi-term . [(20200514 428) nil "Managing multiple terminal buffers in Emacs." single ((:commit . "017c77c550115936860e2ea71b88e585371475d5") (:keywords "term" "terminal" "multiple buffer") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com") (:url . "http://www.emacswiki.org/emacs/download/multi-term.el"))])
- (multi-vterm . [(20200614 548) ((emacs (26 3)) (vterm (0 0)) (projectile (1 2 0))) "Like multi-term.el but for vterm" single ((:commit . "723658c162d483acc07fccf2dd8ae5b8582616f7") (:keywords "terminals" "processes") (:url . "https://github.com/suonlight/multi-libvterm"))])
- (multi-web-mode . [(20130824 354) nil "multiple major mode support for web editing" tar ((:commit . "ad1c8d1c870334052d244c7ae3636cb7b9357b7c") (:keywords "convenience" "languages" "wp") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz") (:url . "https://github.com/fgallina/multi-web-mode"))])
- (multicolumn . [(20150202 2251) nil "Creating and managing multiple side-by-side windows." single ((:commit . "c7a3afecd470859b2e60aa7c554d6e4d436df7fa") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/multicolumn"))])
- (multifiles . [(20130615 2133) nil "View and edit parts of multiple files in one buffer" single ((:commit . "dddfe64b8e1c1cd1f9ccc1f03405477fc0d53897") (:keywords "multiple" "files") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (multiple-cursors . [(20191210 1759) ((cl-lib (0 5))) "Multiple cursors for Emacs." tar ((:commit . "b880554d04b8f61165afba7d4de19ac9e39bb7ab"))])
- (multistate . [(20200514 2206) ((emacs (25 1)) (cl-lib (0 5)) (ht (2 3))) "Multistate mode" single ((:commit . "eadd0df2745bf10500a9ad4ee8f66f3cb470bef0") (:keywords "convenience") (:authors ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:url . "https://gitlab.com/matsievskiysv/multistate"))])
- (multitran . [(20200201 55) ((emacs (24)) (cl-lib (0 5))) "Interface to multitran" single ((:commit . "475e2a92795dbed1aa3b1c5eba2c6c779cac4508") (:keywords "dictionary" "hypermedia") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru"))])
- (mustache . [(20200726 553) ((ht (0 9)) (s (1 3 0)) (dash (1 2 0))) "a mustache templating library in emacs lisp" tar ((:commit . "4649a47340b63214c7b8f1dcc178806d96288839"))])
- (mustache-mode . [(20141024 1432) nil "A major mode for editing Mustache files." single ((:commit . "bf9897eb287ca47ced65d7d4e07ea61ea0aec39f") (:authors ("Tony Gentilcore") ("Chris Wanstrath") ("Daniel Hackney")) (:maintainer "Tony Gentilcore"))])
- (mustang-theme . [(20170719 946) nil "port of vim's mustang theme" single ((:commit . "dda6d04803f1c9b196b620ef564e7768fee15de2") (:authors ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/mustang-theme"))])
- (mustard-theme . [(20170808 1319) ((emacs (24 0))) "an Emacs 24 theme based on Mustard (tmTheme)" single ((:commit . "3b15d992c79590d7ea2503004e2a863b57e274b5") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (mutant . [(20160124 1353) ((emacs (24 4)) (dash (2 1 0))) "An interface for the Mutant testing tool" single ((:commit . "de9cdefe48c880128a8f62c6699d7416e9c8ced1") (:keywords "mutant" "testing") (:authors ("Pedro Lambert")) (:maintainer "Pedro Lambert") (:url . "http://github.com/p-lambert/mutant.el"))])
- (mutt-mode . [(20191102 2330) ((emacs (24))) "major mode for editing mutt configuration" single ((:commit . "1d495de49e6f536459b00d5396a2f5ce5ad4757b") (:keywords "languages") (:authors ("Felix Weilbach" . "felix.weilbach@t-online.de")) (:maintainer "Felix Weilbach" . "felix.weilbach@t-online.de") (:url . "https://gitlab.com/flexw/mutt-mode"))])
- (mvn . [(20181002 1617) nil "helpers for compiling with maven" single ((:commit . "ffa40235b7dabb6c6c165f64f32a963cde8031f0") (:keywords "compilation" "maven" "java") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com") (:url . "https://github.com/apgwoz/mvn-el"))])
- (mw-thesaurus . [(20190620 2330) ((emacs (25)) (request (0 3 0)) (dash (2 16 0))) "Merriam-Webster Thesaurus" single ((:commit . "8327bae11588bcad5d73dcfbeb5e8d10f623d6b6") (:keywords "wp" "matching") (:authors ("Ag Ibragimov")) (:maintainer "Ag Ibragimov") (:url . "https://github.com/agzam/mw-thesaurus.el"))])
- (mwim . [(20181110 1900) nil "Switch between the beginning/end of line or code" single ((:commit . "b4f3edb4c0fb8f8b71cecbf8095c2c25a8ffbf85") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/mwim.el"))])
- (mxf-view . [(20180501 740) ((emacs (25))) "Simple MXF viewer" single ((:commit . "6ca3cc93d995fac5fc4d72275e1e984e9857ffcb") (:keywords "data" "multimedia") (:authors ("Tomotaka SUWA" . "tomotaka.suwa@gmail.com")) (:maintainer "Tomotaka SUWA" . "tomotaka.suwa@gmail.com") (:url . "https://github.com/t-suwa/mxf-view"))])
- (myanmar-input-methods . [(20160106 1537) nil "Emacs Input Method for Myanmar" single ((:commit . "9d4e0d6358c61bde7a2274e430ef71683faea32e") (:keywords "myanmar" "unicode" "keyboard") (:authors ("Ye Lin Kyaw" . "yelinkyaw@gmail.com")) (:maintainer "Ye Lin Kyaw" . "yelinkyaw@gmail.com") (:url . "http://github.com/yelinkyaw/emacs-myanmar-input-methods"))])
- (mybigword . [(20200730 717) ((emacs (25 1))) "Vocabulary builder using Zipf to extract English big words" tar ((:commit . "d1536debdf51b7c4494cd5efe9bcded9584929e0") (:keywords "convenience") (:authors ("Chen Bin <chenbin DOT sh AT gmail.com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail.com>") (:url . "https://github.com/redguardtoo/mybigword"))])
- (mykie . [(20150808 2205) ((emacs (24 3)) (cl-lib (0 5))) "Command multiplexer: Register multiple functions to a keybind" tar ((:commit . "7676f0e883af1d1054e404e97691f3c13aba196f") (:keywords "emacs" "configuration" "keybind") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/mykie-el"))])
- (mynt-mode . [(20150512 2049) ((virtualenvwrapper (20131514))) "Minor mode to work with the mynt static site generator" single ((:commit . "23d4489167bfa899634548cb41ed32fdeb3600c9") (:keywords "convenience") (:authors ("Christian Brassat")) (:maintainer "Christian Brassat") (:url . "https://github.com/crshd/mynt-mode"))])
- (myrddin-mode . [(20191225 2120) ((emacs (24 3))) "Major mode for editing Myrddin source files" single ((:commit . "51c0a2cb9dfc9526cd47e71313f5a745c99cadcc") (:keywords "languages") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:url . "https://git.sr.ht/~jakob/myrddin-mode"))])
- (mysql-to-org . [(20200602 2019) ((emacs (24 3)) (s (1 11 0))) "Minor mode to output the results of mysql queries to org tables" single ((:commit . "f3afc506f8b0d037238e49290de4b028c6ad9dd1") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))])
- (myterminal-controls . [(20190426 421) ((emacs (24))) "Quick toggle controls at a key-stroke" single ((:commit . "733cdd7ab4f172b6dca09720fc5ae7dbc248c822") (:keywords "convenience" "shortcuts") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:url . "http://ismail.teamfluxion.com"))])
- (n4js . [(20150714 231) ((emacs (24)) (cypher-mode (0))) "Neo4j Shell" single ((:commit . "3991ed8975151d5e8d568e952362df810f7ffab7") (:keywords "neo4j" "shell" "comint") (:authors ("TruongTx" . "me@truongtx.me")) (:maintainer "TruongTx" . "me@truongtx.me") (:url . "https://github.com/tmtxt/n4js.el"))])
- (name-this-color . [(20151014 2030) ((emacs (24)) (cl-lib (0 5)) (dash (2 11 0))) "Match RGB codes to names easily and precisely" single ((:commit . "e37cd1291d5d68d4c8d6386eab9cb9d94fd3bcfa") (:keywords "lisp" "color" "hex" "rgb" "shade" "name") (:url . "https://github.com/knl/name-this-color.el"))])
- (named-timer . [(20181120 2224) ((emacs (24 4))) "Simplified timer management for Emacs Lisp" single ((:commit . "670b81e3eddef2e7353a4eedc9553a85306445db") (:keywords "tools") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/emacs-named-timer"))])
- (nameframe . [(20171107 56) nil "Manage frames by name." single ((:commit . "aafb8c5c5fbe0510e2f5d5b6b6b5dd0b73abe5d8") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))])
- (nameframe-perspective . [(20170406 119) ((nameframe (0 4 1 -2)) (perspective (1 12))) "Nameframe integration with perspective.el" single ((:commit . "aafb8c5c5fbe0510e2f5d5b6b6b5dd0b73abe5d8") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))])
- (nameframe-projectile . [(20160928 403) ((nameframe (0 4 1 -2)) (projectile (0 13 0))) "Nameframe integration with Projectile" single ((:commit . "aafb8c5c5fbe0510e2f5d5b6b6b5dd0b73abe5d8") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))])
- (nameless . [(20190429 1202) ((emacs (24 4))) "Hide package namespace in your emacs-lisp code" single ((:commit . "a3a1ce3ec0c5724bcbfe553d831bd4f6b3fe863a") (:keywords "convenience" "lisp") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/nameless"))])
- (names . [(20180321 1155) ((emacs (24 1)) (cl-lib (0 5))) "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." tar ((:commit . "d8baba5360e5253938a25d3e005455b6d2d86971") (:keywords "extensions" "lisp") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/names"))])
- (namespaces . [(20130326 2250) nil "An implementation of namespaces for Elisp, with an emphasis on immutabilty." single ((:commit . "3d02525d9b9a5ae6e7be3adefd880121436e6270") (:authors ("Chris Barrett")) (:maintainer "Chris Barrett") (:url . "https://github.com/chrisbarrett/elisp-namespaces"))])
- (nand2tetris . [(20171201 1813) ((emacs (24))) "Major mode for HDL files in the nand2tetris course" tar ((:commit . "33acee34d24b1c6a87db833b7d23449cf858f64f") (:keywords "nand2tetris" "hdl") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "http://www.github.com/CestDiego/nand2tetris.el/"))])
- (nand2tetris-assembler . [(20171201 1813) ((nand2tetris (1 1 0))) "Assembler For the Nand2tetris Course" single ((:commit . "33acee34d24b1c6a87db833b7d23449cf858f64f") (:keywords "nand2tetris-assembler" "hdl") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "http://www.github.com/CestDiego/nand2tetris-assembler.el/"))])
- (nanowrimo . [(20151105 228) nil "Track progress for nanowrimo" single ((:commit . "b1d41458926ccb39cefbb1bb74aefe4f02fd349f") (:authors ("Ivan Andrus <darthandrus at gmail.com>")) (:maintainer "Ivan Andrus <darthandrus at gmail.com>") (:url . "https://bitbucket.org/gvol/nanowrimo-mode"))])
- (naquadah-theme . [(20190225 1427) nil "A theme based on Tango color set" single ((:commit . "430c3b7bd51922cb616b3f60301f4e2604816ed8"))])
- (narrow-reindent . [(20150722 1906) ((emacs (24 4))) "Defines a minor mode to left-align narrowed regions." single ((:commit . "87466aac4dbeb79597124dd077bf5c704872fd3d") (:authors ("J David Smith" . "emallson@atlanis.net")) (:maintainer "J David Smith" . "emallson@atlanis.net") (:url . "https://github.com/emallson/narrow-reindent.el"))])
- (narrowed-page-navigation . [(20150109 519) ((emacs (24)) (cl-lib (0 5))) "A minor mode for showing one page at a time" single ((:commit . "b215adbac4873f56fbab65772062f0f5be8058a1") (:keywords "outlines") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (nash-mode . [(20160830 1212) nil "Nash major mode" single ((:commit . "2cd96535eb7d669a94306183e95ee37333872c1a") (:keywords "nash" "languages") (:authors ("Tiago Natel de Moura")) (:maintainer "Tiago Natel de Moura") (:url . "https://github.com/tiago4orion/nash-mode.el"))])
- (nasm-mode . [(20190410 342) ((emacs (24 3))) "NASM x86 assembly major mode" single ((:commit . "65ca6546fc395711fac5b3b4299e76c2303d43a8") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/nasm-mode"))])
- (native-complete . [(20200424 1635) ((emacs (25 1))) "Shell completion using native complete mechanisms" single ((:commit . "0f290514564d3733b35e4b48d70446c1a6eb4b41") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete"))])
- (nav . [(20120507 707) nil "Emacs mode for filesystem navigation" tar ((:commit . "c5eb234c063f435dbdcd1f8bdc46cfc68c973ebe") (:authors ("Issac Trotts" . "issactrotts@google.com")) (:maintainer "Issac Trotts" . "issactrotts@google.com"))])
- (nav-flash . [(20191204 1427) nil "Briefly highlight the current line" single ((:commit . "dbb91216637e0a1e8bfd59aa883c75d45db70daf") (:keywords "extensions" "navigation" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/nav-flash"))])
- (navi-mode . [(20190720 2003) ((outshine (2 0)) (outorg (2 0))) "major-mode for easy buffer-navigation" single ((:commit . "7eb7cf0c4a6ee537ec462f5ec90f00d12e3ca9c2") (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/navi"))])
- (navi2ch . [(20200130 36) nil "Navigator for 2ch for Emacsen" tar ((:commit . "7811dba052f679bd920a1f648d621a6fecace10f") (:keywords "network" "2ch") (:authors ("Taiki SUGAWARA" . "taiki@users.sourceforge.net")) (:maintainer "Taiki SUGAWARA" . "taiki@users.sourceforge.net"))])
- (navigel . [(20200202 1214) ((emacs (25 1)) (tablist (1 0))) "Facilitate the creation of tabulated-list based UIs" single ((:commit . "0a2d624d6b49f8363badc5ba8699b7028ef85632") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/DamienCassou/navigel"))])
- (navorski . [(20141203 1824) ((s (1 9 0)) (dash (1 5 0)) (multi-term (0 8 14))) "Helping you live in the terminal, like Viktor did." single ((:commit . "698c1c62da70164aebe9a7a5d034778fbc30ea5b") (:keywords "terminal") (:authors ("Roman Gonzalez <romanandreg@gmail.com>, Tavis Rudd" . "tavis@birdseye-sw.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))])
- (naysayer-theme . [(20200405 123) ((emacs (24))) "The naysayer color theme" single ((:commit . "9d0bef898f31368cd30e063d53d443dee29683b0") (:authors ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainer "Nick Aversano" . "nickav@users.noreply.github.com") (:url . "https://github.com/nickav/naysayer-theme.el"))])
- (ncl-mode . [(20180129 703) ((emacs (24))) "Major Mode for editing NCL scripts and other goodies" tar ((:commit . "602292712a9e6b7e7c25155978999e77d06b7338"))])
- (nclip . [(20130617 2015) nil "Network (HTTP) Clipboard" tar ((:commit . "af88e38b1f04be02bf2e57affc662dbd0f828e67") (:keywords "nclip" "clipboard" "network") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:url . "http://www.github.com/maio/nclip.el"))])
- (neato-graph-bar . [(20181130 1649) ((emacs (24 3))) "Neat-o graph bars CPU/memory etc." single ((:commit . "a7ae35afd67911e8924f36e646bce0d3e3c1bbe6") (:authors ("Robert Cochran" . "robert-git@cochranmail.com")) (:maintainer "Robert Cochran" . "robert-git@cochranmail.com") (:url . "https://gitlab.com/RobertCochran/neato-graph-bar"))])
- (nemerle . [(20161029 2023) nil "major mode for editing nemerle programs" single ((:commit . "db4bc9078f1b6238da32df1519c1957e74b6834a") (:keywords "nemerle" "mode" "languages") (:authors ("Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl")) (:maintainer "Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl"))])
- (neon-mode . [(20180406 1156) nil "Simple major mode for editing neon files" single ((:commit . "99d15e46beaf1e7d71e39a00cce810df1f33229d") (:keywords "conf") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (neotree . [(20200324 1946) ((cl-lib (0 5))) "A tree plugin like NerdTree for Vim" tar ((:commit . "98fe21334affaffe2334bf7c987edaf1980d2d0b") (:authors ("jaypei" . "jaypei97159@gmail.com")) (:maintainer "jaypei" . "jaypei97159@gmail.com") (:url . "https://github.com/jaypei/emacs-neotree"))])
- (nerdtab . [(20180811 339) ((emacs (24 5))) "Keyboard-oriented tabs" single ((:commit . "74ccc14d7956712e477a34b4a733284e8b3832a6") (:keywords "convenience") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:url . "https://github.com/casouri/nerdtab"))])
- (netease-music . [(20190708 215) ((names (0 5)) (emacs (25))) "listen netease music" single ((:commit . "39a7d7a15f63435d9efaf469ea7c971069c07acb") (:keywords "multimedia" "chinese" "music") (:authors ("hiro方圆" . "wfy11235813@gmail.com")) (:maintainer "hiro方圆" . "wfy11235813@gmail.com") (:url . "https://github.com/nicehiro/netease-music"))])
- (netherlands-holidays . [(20150202 1617) nil "Netherlands holidays for Emacs calendar." single ((:commit . "26236178cdd650df9958bf5a086e184096559f00") (:keywords "calendar") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/netherlands-holidays"))])
- (netrunner . [(20160910 2332) ((popup (0 5 3)) (company (0 9 0)) (helm (1 9 5))) "Create Android: Netrunner decklists using Company, Helm and org-mode" single ((:commit . "c64672992175c8c1073c0f56c2e471839db71a0f") (:keywords "games") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:url . "http://github.com/Kungsgeten/netrunner"))])
- (network-watch . [(20171123 1146) ((emacs (24 3))) "Support for intermittent network connectivity" single ((:commit . "958dd0d419e4f9402648a86b754091ba346e01b8") (:keywords "unix" "tools" "hardware" "lisp") (:authors ("Juan Amiguet Vercher" . "jamiguet@gmail.com")) (:maintainer "Juan Amiguet Vercher" . "jamiguet@gmail.com") (:url . "https://github.com/jamiguet/network-watch"))])
- (neuron-mode . [(20200729 1132) ((emacs (26 3)) (f (0 20 0)) (markdown-mode (2 3))) "Major mode for editing zettelkasten notes using neuron" single ((:commit . "6cf3475ed778784fe127a755a3213cf7eabac920") (:keywords "outlines") (:authors ("felko <http://github/felko>")) (:maintainer "felko <http://github/felko>") (:url . "https://github.com/felko/neuron-mode"))])
- (never-comment . [(20140104 2207) nil "Never blocks are comment" single ((:commit . "74ded8f1e7f23240f5f6032d0451fb0a51733bc4") (:authors ("Scott Frazer")) (:maintainer "Toon Claes") (:url . "http://stackoverflow.com/a/4554658/89376"))])
- (newlisp-mode . [(20160226 1545) nil "newLISP editing mode for Emacs" single ((:commit . "ac23be40c81a360988ab803d365f1510733f6db4") (:keywords "language" "lisp" "newlisp") (:authors ("KOBAYASHI Shigeru <shigeru.kb[at]gmail.com>")) (:maintainer "KOBAYASHI Shigeru <shigeru.kb[at]gmail.com>") (:url . "https://github.com/kosh04/newlisp-mode"))])
- (nexus . [(20140114 1305) nil "REST Client for Nexus Maven Repository servers" tar ((:commit . "c46f499951b90839aa8683779fe43d8f01672a60") (:keywords "comm") (:authors ("Juergen Hoetzel" . "juergen@archlinux.org")) (:maintainer "Juergen Hoetzel" . "juergen@archlinux.org"))])
- (ng2-mode . [(20200703 1610) ((typescript-mode (0 1))) "Major modes for editing Angular 2" tar ((:commit . "d9feee65d882723b955483d2b8af01e49df21652") (:keywords "typescript" "angular" "angular2" "template") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:url . "http://github.com/AdamNiederer/ng2-mode"))])
- (nginx-mode . [(20170612 437) nil "major mode for editing nginx config files" single ((:commit . "a2bab83c2eb233d57d76b236e7c141c2ccc97005") (:keywords "languages" "nginx") (:authors ("Andrew J Cosgriff" . "andrew@cosgriff.name")) (:maintainer "Andrew J Cosgriff" . "andrew@cosgriff.name"))])
- (niceify-info . [(20160416 1244) nil "improve usability of Info pages" single ((:commit . "38df5062bc3b99d1074cab3e788b5ed66732111c"))])
- (niconama . [(20170910 1501) ((emacs (24)) (request (20170131 1747)) (cl-lib (0 5))) "Tools for Niconico Live Broadcast" single ((:commit . "96e7553e50e6bf7b58aac50f52c9b0b8edb41c56") (:keywords "comm") (:url . "https://github.com/NOBUTOKA/niconama.el"))])
- (night-owl-theme . [(20200622 1943) ((emacs (24))) "A color theme for the night owls out there" single ((:commit . "50315d6a4e170dccc83bf2d59a8a761f5ea32bb6") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "http://github.com/aaronjensen/night-owl-theme"))])
- (nikola . [(20170703 2021) ((async (1 5)) (emacs (24 3))) "Simple wrapper for nikola" single ((:commit . "964715ac30943c9d6976999cad208dc60d09def0") (:keywords ":" "nikola") (:authors (": drymer <drymer [ AT ] autistici.org>")) (:maintainer ": drymer <drymer [ AT ] autistici.org>") (:url . ": https://git.daemons.it/drymer/nikola.el"))])
- (nim-mode . [(20191219 847) ((emacs (24 4)) (epc (0 1 1)) (let-alist (1 0 1)) (commenter (0 5 1)) (flycheck-nimsuggest (0 8 1))) "A major mode for the Nim programming language" tar ((:commit . "16a245e4974d21a6e9e7163e7fbfb50a0bd89f99") (:keywords "nim" "languages") (:authors ("Simon Hafner")) (:maintainer "Simon Hafner" . "hafnersimon@gmail.com"))])
- (nimbus-theme . [(20200713 1746) ((emacs (24 1))) "An awesome dark theme" single ((:commit . "ca999d3c2b80850025fbeb6633dcb25889dbc343") (:keywords "faces") (:authors ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") ("See README.md for full list of contributors.")) (:maintainer "Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") (:url . "https://github.com/m-cat/nimbus-theme"))])
- (ninja-mode . [(20181024 1439) ((emacs (24))) "Major mode for editing .ninja files" single ((:commit . "086a9b2f8833fd45f2119596f74f90b9f7e2cdf5"))])
- (nix-buffer . [(20180212 1518) ((f (0 17 3)) (emacs (24 4))) "Set up buffer environments with nix" single ((:commit . "db57cda36e7477bdc7ef5a136357b971b1d4d099") (:authors ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/nix-buffer/tree/master/"))])
- (nix-env-install . [(20200113 751) ((emacs (25 1))) "Install packages using nix-env" single ((:commit . "b343a7e885206e78544da7313b860442abbd7440") (:keywords "processes" "tools") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/nix-env-install"))])
- (nix-haskell-mode . [(20190615 135) ((emacs (25)) (haskell-mode (16 0)) (nix-mode (1 3 0))) "haskell-mode integrations for Nix" single ((:commit . "68efbcbf949a706ecca6409506968ed2ef928a20") (:keywords "nix" "haskell" "languages" "processes") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:url . "https://github.com/matthewbauer/nix-haskell"))])
- (nix-mode . [(20200728 1945) ((emacs (25))) "Major mode for editing .nix files" tar ((:commit . "a00b3f776de65b5af7571976a73213ca2a5c683e") (:keywords "nix" "languages" "tools" "unix") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:url . "https://github.com/NixOS/nix-mode"))])
- (nix-sandbox . [(20191126 759) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" single ((:commit . "977b9a505ffc8b33b70ec7742f90e469b3168297") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com") (:url . "https://github.com/travisbhartwell/nix-emacs"))])
- (nix-update . [(20190124 1935) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" single ((:commit . "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (:keywords "nix") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:url . "https://github.com/jwiegley/nix-update-el"))])
- (nixos-options . [(20160209 1841) ((emacs (24))) "Interface for browsing and completing NixOS options." single ((:commit . "977b9a505ffc8b33b70ec7742f90e469b3168297") (:keywords "unix") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))])
- (nixpkgs-fmt . [(20200327 2302) ((emacs (24)) (reformatter (0 3))) "Reformat Nix using nixpkgs-fmt" single ((:commit . "cc8ee143d4ef45a8c540901852326ccdf6ff8482") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-nixpkgs-fmt"))])
- (nlinum-hl . [(20190301 2117) ((emacs (24 4)) (nlinum (1 7)) (cl-lib (0 5))) "heal nlinum's line numbers" single ((:commit . "dc6b365a58e06c7d637a76a31c71a40b20da8b56") (:keywords "nlinum" "highlight" "current" "line" "faces") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-nlinum-hl"))])
- (nlinum-relative . [(20160526 708) ((emacs (24 4)) (nlinum (1 5))) "Relative line number with nlinum" single ((:commit . "5b9950c97ba79a6f0683e38b13da23f39e01031c") (:keywords "convenience") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com"))])
- (nm . [(20151110 1910) ((notmuch (0 21)) (peg (0 6)) (company (0)) (emacs (24 3))) "NEVERMORE: an email interface for Notmuch" tar ((:commit . "5a3f29174b3a4b2b2e7a700a862f3b16a942687e") (:authors ("Trevor Jim")) (:maintainer "Trevor Jim") (:url . "https://github.com/tjim/nevermore"))])
- (nndiscourse . [(20200524 1649) ((emacs (25 1)) (dash (2 16)) (dash-functional (1 2 0)) (anaphora (1 0 4)) (rbenv (0 0 3)) (json-rpc (20200417))) "Gnus backend for Discourse" tar ((:commit . "e8d99d132d649e179f7cc81b80d873436b4e8ce1") (:keywords "news") (:url . "https://github.com/dickmao/nndiscourse"))])
- (nnhackernews . [(20200730 1052) ((emacs (25 2)) (request (20190819)) (dash (20190401)) (dash-functional (20180107)) (anaphora (20180618))) "Gnus backend for Hacker News" single ((:commit . "ad20d17f196a1b99c683ad2ffc39a9b4b2fada58") (:keywords "news") (:url . "https://github.com/dickmao/nnhackernews"))])
- (nnir-est . [(20180710 2103) nil "Gnus nnir interface for HyperEstraier" single ((:commit . "6d0d5c8e33f4e4ccbc22350324c0990d2676fb5a") (:keywords "mail") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/nnir-est"))])
- (nnreddit . [(20200524 1647) ((emacs (25)) (virtualenvwrapper (20190223)) (json-rpc (20200417)) (dash (20190401)) (anaphora (20180618)) (request (20190819))) "Gnus Backend For Reddit" tar ((:commit . "4f41473221ea3312085c9f562db59d8f22bf8910") (:url . "https://github.com/dickmao/nnreddit"))])
- (no-emoji . [(20180515 1837) ((emacs (24))) "Show :emoji-name: instead of emoji characters" single ((:commit . "ebceeab50dbfe4d60235180a57633745dbc18c77") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:url . "https://github.com/ecraven/no-emoji"))])
- (no-littering . [(20200725 1357) ((cl-lib (0 5))) "help keeping ~/.emacs.d clean" single ((:commit . "7edbc4ba9f1553b58169ba8806e4dff7e61b18c6") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/no-littering"))])
- (no-spam . [(20190724 1854) ((emacs (25 1))) "Add repeat delays to commands" single ((:commit . "860860e4a0d59bd15c8e092dc42f5f7f769a428e") (:keywords "keyboard" "tools") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:url . "https://github.com/mamapanda/no-spam"))])
- (noaa . [(20190202 1634) ((request (0 2 0)) (cl-lib (0 5)) (emacs (24)) (dash (2 14 1))) "Get NOAA weather data" single ((:commit . "ebc6a4a1cc56c01d2bb882e4a40934a6a1f4e9ca") (:authors ("David Thompson")) (:maintainer "David Thompson") (:url . "https://github.com/thomp/noaa"))])
- (noccur . [(20191015 719) nil "Run multi-occur on project/dired files" single ((:commit . "fa91647a305e89561d3dbe53da002fff49abe0bb") (:keywords "convenience") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (nocomments-mode . [(20170213 2037) nil "Minor mode that makes comments invisible." single ((:commit . "5a41a20cc44dfe4a9ea584354ed6dbc15dd92f46") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/nocomments-mode"))])
- (noctilux-theme . [(20161113 1442) ((emacs (24))) "Dark theme inspired by LightTable" single ((:commit . "a3265a1be7f4d73f44acce6d968ca6f7add1f2ca") (:authors ("Simon Manning" . "simon@ecksdee.org")) (:maintainer "Simon Manning" . "simon@ecksdee.org") (:url . "https://github.com/sjrmanning/noctilux-theme"))])
- (node-resolver . [(20140930 1723) ((cl-lib (0 5))) "hook to install node modules in background" single ((:commit . "ef9d0486907a746a80b02ffc6208a09c168a9f7c") (:keywords "convenience" "nodejs" "javascript" "npm") (:authors ("Dave Justice")) (:maintainer "Dave Justice") (:url . "https://github.com/meandavejustice/node-resolver.el"))])
- (nodejs-repl . [(20200320 1645) nil "Run Node.js REPL" single ((:commit . "6fad7d764fa0d818ba497450bd722ae10cb8efed") (:authors ("Takeshi Arabiki")) (:maintainer "Takeshi Arabiki"))])
- (nodemcu-mode . [(20180501 2225) ((emacs (25))) "Minor mode for NodeMCU" single ((:commit . "8effd9f3df40b6b92a2f05e4d54750b624afc4a7") (:keywords "tools") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:url . "https://github.com/andrmuel/nodemcu-mode"))])
- (noflet . [(20141102 1454) nil "locally override functions" single ((:commit . "7ae84dc3257637af7334101456dafe1759c6b68a") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "https://github.com/nicferrier/emacs-noflet"))])
- (nofrils-acme-theme . [(20180620 1248) ((emacs (24))) "Port of \"No Frils Acme\" Vim theme." tar ((:commit . "98ad7bfaff1d85b33dc162645670285b067c6f92") (:authors ("Eric Sessoms" . "esessoms@protonmail.com")) (:maintainer "Eric Sessoms" . "esessoms@protonmail.com") (:url . "https://gitlab.com/esessoms/nofrils-theme"))])
- (nord-theme . [(20200620 1122) ((emacs (24))) "An arctic, north-bluish clean and elegant theme" single ((:commit . "4f5b64605709d5803285953026137e905756c35f") (:authors ("Arctic Ice Studio" . "development@arcticicestudio.com")) (:maintainer "Arctic Ice Studio" . "development@arcticicestudio.com") (:url . "https://github.com/arcticicestudio/nord-emacs"))])
- (nordless-theme . [(20200213 2057) ((colorless-themes (0 1))) "A mostly colorless version of nord-theme" single ((:commit . "5df88f835527bb7c86fd18515af6fc18d661e386") (:keywords "faces" "theme") (:authors ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainer "Thomas Letan" . "contact@thomasletan.fr") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))])
- (northcode-theme . [(20180423 1649) ((emacs (24))) "A dark theme focused on blue and orange colors." single ((:commit . "4d3750461ba25ec45321318b5f1af4e8fdf16147") (:authors ("Andreas Larsen" . "andreas@northcode.no")) (:maintainer "Andreas Larsen" . "andreas@northcode.no") (:url . "https://github.com/Northcode/northcode-theme.el"))])
- (nothing-theme . [(20200504 402) ((emacs (24 1))) "Monochrome theme" single ((:commit . "d2514bb9707f66dda0d60f40f465e79914c50946") (:authors ("Jared Gorski," . "jaredgorski6@gmail.com")) (:maintainer "Jared Gorski," . "jaredgorski6@gmail.com") (:url . "https://github.com/jaredgorski/nothing.el"))])
- (notmuch . [(20200722 2248) nil "run notmuch within emacs" tar ((:commit . "00f48f397abcdc662041726b25dac0173880f2e5") (:url . "https://notmuchmail.org/"))])
- (notmuch-bookmarks . [(20200322 1925) ((seq (2 20)) (emacs (26 1)) (notmuch (0 29 3))) "Add bookmark handling for notmuch buffers" single ((:commit . "ec8edfdbd1ac475530591d73a570ded5c18ed86a") (:keywords "mail") (:authors ("Jörg Volbers" . "joerg@joergvolbers.de")) (:maintainer "Jörg Volbers" . "joerg@joergvolbers.de") (:url . "https://github.com/publicimageltd/notmuch-bookmarks"))])
- (notmuch-labeler . [(20131230 1719) ((notmuch (0))) "Improve notmuch way of displaying labels" tar ((:commit . "d65d1129555d368243df4770ecc1e7ccb88efc58") (:keywords "emacs" "package" "elisp" "notmuch" "emails") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "https://github.com/DamienCassou/notmuch-labeler"))])
- (nov . [(20200608 1339) ((dash (2 12 0)) (esxml (0 3 3)) (emacs (24 4))) "Featureful EPUB reader mode" single ((:commit . "3d32aac0f895c8605e254c8b7f246537816744f5") (:keywords "hypermedia" "multimedia" "epub") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/nov.el"))])
- (nova-theme . [(20200213 102) ((emacs (24 3))) "A dark, pastel color theme" single ((:commit . "4553fabbcd340f3f2fa59dbfb6f3f32ecb016e6f") (:keywords "theme" "dark" "nova" "pastel" "faces") (:authors ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainer "Muir Manders" . "muir+emacs@mnd.rs") (:url . "https://github.com/muirmanders/emacs-nova-theme"))])
- (noxml-fold . [(20170823 1357) nil "Fold away XML things." single ((:commit . "46c7f6a008672213238a9f8d7a416ce80916aa62") (:keywords "xml" "folding") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:url . "https://github.com/paddymcall/noxml-fold"))])
- (npm . [(20200406 1429) ((emacs (25 1)) (transient (0 1 0))) "Run your npm workflows" single ((:commit . "187ddd2732deb49df1e87fbaace153afb8a3e7e1") (:keywords "tools") (:authors ("Shane Kennedy")) (:maintainer "Shane Kennedy") (:url . "https://github.com/shaneikennedy/npm.el"))])
- (npm-mode . [(20190616 2025) ((emacs (24 1))) "minor mode for working with npm projects" single ((:commit . "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb") (:keywords "convenience" "project" "javascript" "node" "npm") (:authors ("Allen Gooch" . "allen.gooch@gmail.com")) (:maintainer "Allen Gooch" . "allen.gooch@gmail.com") (:url . "https://github.com/mojochao/npm-mode"))])
- (nrepl-eval-sexp-fu . [(20140311 1041) ((highlight (0 0 0)) (smartparens (0 0 0)) (thingatpt (0 0 0))) "Tiny functionality enhancements for evaluating sexps." single ((:commit . "3a24b7d4bca13e87c987a4ddd212da914ff59191") (:keywords "lisp" "highlight" "convenience") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net"))])
- (nrepl-sync . [(20140807 1554) ((cider (0 6))) "connect to nrepl port and eval .sync.clj." single ((:commit . "bab53a2361526d63a24cda176d07a1247bf5b399") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk") (:url . "https://github.com/phillord/lein-sync"))])
- (ns-auto-titlebar . [(20181022 2154) ((emacs (24 4))) "Set the MacOS transparent titlebar to match theme" single ((:commit . "1efc30d38509647b417f05587fd7003457719256") (:keywords "frames") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/ns-auto-titlebar"))])
- (nsis-mode . [(20190615 1827) nil "NSIS-mode" tar ((:commit . "0a2e6ece2fe682dced4d31688b38bb472a877cdf") (:keywords "nsis") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:url . "http://github.com/mlf176f2/nsis-mode"))])
- (nswbuff . [(20200312 2050) ((emacs (25 1))) "Quick switching between buffers." single ((:commit . "a601855cc96e303e38051d0d1af3402721dbb969") (:keywords "extensions" "convenience") (:authors ("David Ponce" . "david@dponce.com") ("Kahlil (Kal) HODGSON" . "dorge@tpg.com.au") ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://github.com/joostkremers/nswbuff"))])
- (nu-mode . [(20190404 2032) ((undo-tree (0 6 5)) (ace-window (0)) (lv (0)) (avy (0)) (which-key (0)) (transpose-frame (0))) "Modern Emacs Prompts Based Keybinding." tar ((:commit . "d5fb4d26d1b0bb383ea2827cc5af5dfb2a269d2b"))])
- (nubox . [(20170619 910) nil "Nubox color theme (dark, light and tty versions)" tar ((:commit . "1ccb8035ae42727ba6bdd5c1106fbceddeeed370") (:keywords "faces") (:authors ("Martijn Terpstra" . "bigmartijn@gmail.com")) (:maintainer "Martijn Terpstra" . "bigmartijn@gmail.com"))])
- (number . [(20170901 1312) nil "Working with numbers at point." single ((:commit . "bbc278d34dbcca83e70e3be855ec98b23debfb99"))])
- (number-lock . [(20160830 200) nil "Enter symbols on your number keys without pressing shift" single ((:commit . "74417b1238953bf485961a0dd7d20f5c36ae25ea") (:keywords "convenience") (:authors ("Liu233w" . "wwwlsmcom@outlook.com")) (:maintainer "Liu233w" . "wwwlsmcom@outlook.com") (:url . "https://github.com/Liu233w/number-lock.el"))])
- (numbers . [(20170802 1134) ((emacs (24))) "Display information and trivia about numbers" single ((:commit . "dd02508b788a13b7d4dbcc4923fa23134b783ab3") (:keywords "games" "trivia" "maths" "numbers") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/numbers.el"))])
- (nummm-mode . [(20131117 1014) nil "Display the number of minor modes instead of their names" single ((:commit . "81951e12032274543c5f7a585b29bd93961e94e4") (:authors ("Andreu Gil" . "agpchil@gmail.com")) (:maintainer "Andreu Gil" . "agpchil@gmail.com") (:url . "http://github.com/agpchil/nummm-mode"))])
- (nv-delete-back . [(20170224 1249) ((emacs (24))) "backward delete like modern text editors" single ((:commit . "b17cb826f14c18c2875d112574edb5e4f46f5296") (:keywords "lisp") (:authors ("Nicolas Vaughan <n.vaughan [at] oxon.org>")) (:maintainer "Nicolas Vaughan <n.vaughan [at] oxon.org>"))])
- (nvm . [(20200501 1414) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (dash-functional (2 4 0))) "Manage Node versions within Emacs" single ((:commit . "fc925b9afe738264cb15d5135c7426f999aeda47") (:keywords "node" "nvm") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/nvm.el"))])
- (nyan-mode . [(20200526 1054) nil "Nyan Cat shows position in current buffer in mode-line." tar ((:commit . "06e67ab2c490756d3eeed4a68aba7c33e508a5d5") (:keywords "nyan" "cat" "lulz" "scrolling" "pop tart cat" "build something amazing") (:authors ("Jacek \"TeMPOraL\" Zlydach" . "temporal.pl@gmail.com")) (:maintainer "Jacek \"TeMPOraL\" Zlydach" . "temporal.pl@gmail.com") (:url . "https://github.com/TeMPOraL/nyan-mode/"))])
- (nyx-theme . [(20170910 1307) ((emacs (24))) "Dark theme" single ((:commit . "afe2b8c3b5421b4c292d182dcf77079b278e93d8") (:keywords "themes" "dark-theme") (:authors ("Guido Schmidt")) (:maintainer "Guido Schmidt" . "guido.schmidt.2912@gmail.com") (:url . "https://github.com/GuidoSchmidt/emacs-nyx-theme"))])
- (nz-holidays . [(20190415 703) nil "New Zealand public holidays for calendar." single ((:commit . "afc875cf40789fa45a4a811685b0a7c4f239392f") (:keywords "calendar") (:authors ("Sod Oscarfono" . "sod@oscarfono.com")) (:maintainer "Sod Oscarfono" . "sod@oscarfono.com") (:url . "https://github.com/techquila/nz-holidays"))])
- (o-blog . [(20151202 2339) nil "Standalone orgmode blog exporter" tar ((:commit . "e466c59478feddc8126c43c1b98550474af484c0") (:keywords "emacs") (:authors ("Sébastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>")) (:maintainer "Sébastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>"))])
- (oauth . [(20130128 151) nil "Oauth library." tar ((:commit . "ee4744ad76a1560281b0c4944575a3bd598c6458") (:keywords "comm") (:authors ("Peter Sanford <peter AT petersdanceparty.com>")) (:maintainer "Peter Sanford <peter AT petersdanceparty.com>"))])
- (ob-ammonite . [(20190813 59) ((s (1 12 0)) (ammonite-term-repl (0 1)) (xterm-color (1 7))) "org-babel for scala evaluation in Ammonite." single ((:commit . "39937dff395e70aff76a4224fa49cf2ec6c57cca") (:keywords "tools" "ammnite" "org-mode" "scala" "org-babel") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:url . "https://github.com/zwild/ob-ammonite"))])
- (ob-applescript . [(20190709 1607) nil "Org-babel functions for AppleScript" single ((:commit . "2b07b77b75bd02f2102f62e6d52ffdd0f921439a") (:keywords "literate programming" "reproducible research" "mac") (:authors ("Stig Brautaset")) (:maintainer "Stig Brautaset") (:url . "http://github.com/stig/ob-applescript.el"))])
- (ob-async . [(20190916 1537) ((async (1 9)) (org (9 0 1)) (emacs (24 4)) (dash (2 14 1))) "Asynchronous org-babel src block execution" single ((:commit . "80a30b96a007d419ece12c976a81804ede340311") (:keywords "tools") (:authors ("Andrew Stahlman" . "andrewstahlman@gmail.com")) (:maintainer "Andrew Stahlman" . "andrewstahlman@gmail.com") (:url . "https://github.com/astahlman/ob-async"))])
- (ob-axiom . [(20190623 2052) ((emacs (24 2)) (axiom-environment (20171021))) "An org-babel backend for the axiom-environment system" single ((:commit . "25932da0dc40c6877463cbf019b14ab05a6b0164") (:keywords "axiom" "openaxiom" "fricas") (:authors ("Paul Onions")) (:maintainer "Paul Onions"))])
- (ob-blockdiag . [(20190720 1858) nil "org-babel functions for blockdiag evaluation" single ((:commit . "272fafcf3bc37f9de41b11beb6a33e0dbf0a1909") (:keywords "tools" "convenience") (:authors ("Dmitry Moskowski")) (:maintainer "Dmitry Moskowski") (:url . "https://github.com/corpix/ob-blockdiag.el"))])
- (ob-browser . [(20170720 1918) ((org (8))) "Render HTML in org-mode blocks." tar ((:commit . "a347d9df1c87b7eb660be8723982c7ad2563631a") (:keywords "org" "babel" "browser" "phantomjs") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/ob-browser"))])
- (ob-cfengine3 . [(20191011 1721) nil "Org Babel functions for CFEngine 3" single ((:commit . "195ba4694a0ec18d3fb89342e8e0988b382a5b1a") (:keywords "tools" "convenience") (:authors ("Nick Anderson" . "nick@cmdln.org")) (:maintainer "Nick Anderson" . "nick@cmdln.org") (:url . "https://github.com/nickanderson/ob-cfengine3"))])
- (ob-clojurescript . [(20180406 1828) ((emacs (24 4)) (org (9 0))) "org-babel functions for ClojureScript evaluation" single ((:commit . "17ee1558aa94c7b0246fd03f684884122806cfe7") (:keywords "literate programming" "reproducible research") (:authors ("Larry Staton Jr.")) (:maintainer "Larry Staton Jr.") (:url . "https://gitlab.com/statonjr/ob-clojurescript"))])
- (ob-coffee . [(20170725 1424) ((org (8))) "org-babel functions for coffee-script evaluation" tar ((:commit . "7f0b330273e8af7777de87a75fe52a89798e4548") (:keywords "org" "babel" "coffee-script") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-coffee"))])
- (ob-coffeescript . [(20180126 719) ((emacs (24 4))) "org-babel functions for coffee-script evaluation, and fully implementation!" single ((:commit . "5a5bb04aea9c2a6eab5b05f90f5c7cb6de7b4261") (:keywords "coffee-script" "literate programming" "reproducible research") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:url . "https://github.com/brantou/ob-coffeescript"))])
- (ob-crystal . [(20180126 718) ((emacs (24 3))) "org-babel functions for Crystal evaluation" tar ((:commit . "d84c1adee4b269cdba06a97caedb8071561a09af") (:keywords "crystal" "literate programming" "reproducible research") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:url . "https://github.com/brantou/ob-crystal"))])
- (ob-cypher . [(20200521 936) ((s (1 9 0)) (cypher-mode (0 0 6)) (dash (2 10 0)) (dash-functional (1 2 0))) "query neo4j using cypher in org-mode blocks" single ((:commit . "da9f97339474a48d759fc128cee610c0bc9ae6c0") (:keywords "org" "babel" "cypher" "neo4j") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-cypher"))])
- (ob-dao . [(20170816 1558) ((org (8))) "Org Babel Functions for Dao" single ((:commit . "fa92f62a63c684d689f57e790e5dd614c5bba270") (:keywords "literate programming" "reproducible research" "org" "babel" "dao") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/ob-dao"))])
- (ob-dart . [(20170106 1624) nil "org-babel functions for Dart evaluation" single ((:commit . "04d63b922a5469506560ca0c00678e57131e0269") (:keywords "literate programming" "reproducible research" "emacs" "org" "babel" "dart") (:authors ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:url . "http://github.org/mzimmerm/ob-dart"))])
- (ob-diagrams . [(20160407 1237) nil "org-babel functions for diagrams evaluation" single ((:commit . "ed6649616325ca5b2d2109f74aded8bcb8aa5186") (:keywords "literate programming" "reproducible research") (:authors ("Daniel Bergey")) (:maintainer "Daniel Bergey") (:url . "http://orgmode.org"))])
- (ob-elixir . [(20170725 1419) ((org (8))) "org-babel functions for elixir evaluation" single ((:commit . "8990a8178b2f7bd93504a9ab136622aab6e82e32") (:keywords "org" "babel" "elixir") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-elixir"))])
- (ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" single ((:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:keywords "languages" "tools") (:authors ("Bonface M. K.")) (:maintainer "Bonface M. K.") (:url . "https://www.bonfacemunyoki.com"))])
- (ob-elvish . [(20180427 1900) nil "org-babel functions for Elvish shell" single ((:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:url . "https://github.com/zzamboni/ob-elvish"))])
- (ob-fsharp . [(20170618 1429) ((emacs (25)) (fsharp-mode (1 9 8))) "Org-Babel F#" single ((:commit . "0b2fdd9bb4f38af8b5cf4914627af52f5b43d9f7") (:keywords "literate programming" "reproducible research") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:url . "https://github.com/juergenhoetzel/ob-fsharp"))])
- (ob-go . [(20190201 2040) nil "org-babel functions for go evaluation" tar ((:commit . "2067ed55f4c1d33a43cb3f6948609d240a8915f5") (:keywords "golang" "go" "literate programming" "reproducible research") (:authors ("K. Adam Christensen")) (:maintainer "K. Adam Christensen") (:url . "http://orgmode.org"))])
- (ob-graphql . [(20200108 2228) ((emacs (24 4)) (graphql-mode (20191024 1221)) (request (0 3 2))) "Org-Babel execution backend for GraphQL source blocks" single ((:commit . "ced37c6761d69e1ff206ff0ebd633f0e4fd2ac54") (:authors ("Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com")) (:maintainer "Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com") (:url . "https://github.com/jdormit/ob-graphql"))])
- (ob-html-chrome . [(20181219 1042) ((emacs (24 4)) (f (0 20 0)) (s (1 7 0))) "HTML code blocks converted to PNG using Chrome" single ((:commit . "7af6e4a24ed0aaf67751bdf752c7ca0ba02bb8d4") (:keywords "languages" "org" "org-babel" "chrome" "html") (:authors (nil . "Nik Clayton nik@ngo.org.uk")) (:maintainer nil . "Nik Clayton nik@ngo.org.uk") (:url . "http://github.com/nikclayton/ob-html-chrome"))])
- (ob-http . [(20180707 1448) ((s (1 9 0)) (cl-lib (0 5))) "http request in org-mode babel" tar ((:commit . "b1428ea2a63bcb510e7382a1bf5fe82b19c104a7") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-http"))])
- (ob-hy . [(20180702 540) ((emacs (24 4))) "org-babel functions for Hy-lang evaluation" tar ((:commit . "a42ecaf440adc03e279afe43ee5ef6093ddd542a") (:keywords "hy" "literate programming" "reproducible research") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:url . "https://github.com/brantou/ob-hy"))])
- (ob-ipython . [(20180224 953) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "org-babel functions for IPython evaluation" tar ((:commit . "7147455230841744fb5b95dcbe03320313a77124") (:keywords "literate programming" "reproducible research") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:url . "http://www.gregsexton.org"))])
- (ob-kotlin . [(20180823 1321) ((org (8))) "org-babel functions for kotlin evaluation" single ((:commit . "96e420cbd2e9ea8a77043e5dcaebdfc6da17492a") (:keywords "org" "babel" "kotlin") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-kotlin"))])
- (ob-latex-as-png . [(20200629 1013) ((emacs (26 1)) (org (9 1))) "Org-babel functions for latex-as-png evaluation" single ((:commit . "d21d436814e9605cf2a942b709f957695298dc70") (:keywords "literate programming" "reproducible research" "org" "convenience") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:url . "https://github.com/alhassy/ob-latex-as-png"))])
- (ob-lfe . [(20170725 1420) ((org (8))) "org-babel functions for lfe evaluation" single ((:commit . "f7780f58e650b4d29dfd834c662b1d354b620a8e") (:keywords "org" "babel" "lfe" "lisp" "erlang") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-lfe"))])
- (ob-mermaid . [(20200320 1504) nil "org-babel support for mermaid evaluation" single ((:commit . "cca09b64eff689d8bb15a77de9d4c7fe9845a1f9") (:keywords "lisp") (:authors ("Alexei Nunez" . "alexeirnunez@gmail.com")) (:maintainer "Alexei Nunez" . "alexeirnunez@gmail.com") (:url . "https://github.com/arnm/ob-mermaid"))])
- (ob-ml-marklogic . [(20190312 1314) nil "org-babel functions for MarkLogic evaluation" tar ((:commit . "d5660ad14f29e17cd26ae92eeb585b24030e9570") (:keywords "marklogic" "xquery" "javascript" "sparql") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:url . "http://github.com/ndw/ob-ml-marklogic"))])
- (ob-mongo . [(20170720 1919) ((org (8))) "Execute mongodb queries within org-mode blocks." single ((:commit . "371bf19c7c10eab2f86424f8db8ab685997eb5aa") (:keywords "org" "babel" "mongo" "mongodb") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/ob-mongo"))])
- (ob-nim . [(20170809 1830) ((cl-lib (0 5))) "Babel Functions for nim" single ((:commit . "bf1642cb93f0a898804dc13fd9408d2964403bd2") (:keywords "literate programming" "reproducible research") (:authors ("Lompik")) (:maintainer "Lompik"))])
- (ob-prolog . [(20190410 2130) nil "org-babel functions for prolog evaluation." single ((:commit . "331899cfe345c934026c70b78352d320f7d8e239") (:keywords "literate programming" "reproducible research") (:authors ("Bjarte Johansen")) (:maintainer "Bjarte Johansen") (:url . "https://github.com/ljos/ob-prolog"))])
- (ob-restclient . [(20200316 759) ((restclient (0))) "org-babel functions for restclient-mode" single ((:commit . "f7449b2068498fe9d8ab9589e0a638148861533f") (:keywords "literate programming" "reproducible research") (:authors ("Alf Lervåg")) (:maintainer "Alf Lervåg") (:url . "https://github.com/alf/ob-restclient.el"))])
- (ob-rust . [(20180911 1535) nil "Org-babel functions for Rust" tar ((:commit . "6a82587598cd097e9642be916243c31f1231b24a") (:keywords "rust" "languages" "org" "babel") (:authors ("Mican Zhang")) (:maintainer "Mican Zhang") (:url . "https://github.com/micanzhang/ob-rust"))])
- (ob-sagemath . [(20191106 828) ((sage-shell-mode (0 0 8)) (s (1 8 0)) (emacs (24))) "org-babel functions for SageMath evaluation" tar ((:commit . "79645bce0c25a650bae61e550434bed836995dce") (:keywords "sagemath" "org-babel") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:url . "https://github.com/stakemori/ob-sagemath"))])
- (ob-sml . [(20130829 1843) ((sml-mode (6 4))) "org-babel functions for template evaluation" single ((:commit . "958165c92b6cff6cada5c85c8ae5887806b8451b") (:keywords "literate programming" "reproducible research") (:authors ("David Nolen")) (:maintainer "David Nolen") (:url . "http://orgmode.org"))])
- (ob-sql-mode . [(20190421 1539) ((emacs (24 4))) "SQL code blocks evaluated by sql-mode" single ((:commit . "b31a016585324ad91f1742ff6205bcb76f3ece6e") (:keywords "languages" "org" "org-babel" "sql") (:authors (nil . "Nik Clayton nik@google.com")) (:maintainer nil . "Nik Clayton nik@google.com") (:url . "http://github.com/nikclayton/ob-sql-mode"))])
- (ob-svgbob . [(20190911 300) ((emacs (24))) "Babel Functions for svgbob" single ((:commit . "5747f96fb4fdb8711546b3313df9412177eb3c1a") (:keywords "tools" "files") (:authors ("Marcio Giaxa" . "i@mgxm.me")) (:maintainer "Marcio Giaxa" . "i@mgxm.me") (:url . "https://github.com/mgxm/ob-svgbob"))])
- (ob-swift . [(20170921 1325) ((org (8))) "org-babel functions for swift evaluation" single ((:commit . "ed478ddbbe41ce5373efde06b4dd0c3663c9055f") (:keywords "org" "babel" "swift") (:authors ("Feng Zhou" . "zf.pascal@gmail.com")) (:maintainer "Feng Zhou" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-swift"))])
- (ob-tmux . [(20190708 1202) ((emacs (25 1)) (seq (2 3)) (s (1 9 0))) "Babel Support for Interactive Terminal" single ((:commit . "3687ed7b874bdfe14617f5d14492887cb0836a85") (:keywords "literate programming" "interactive shell" "tmux") (:authors ("Allard Hendriksen")) (:maintainer "Allard Hendriksen") (:url . "https://github.com/ahendriksen/ob-tmux"))])
- (ob-translate . [(20170720 1919) ((google-translate (0 11)) (org (8))) "Translation of text blocks in org-mode." single ((:commit . "9d9054a51bafd5a29a8135964069b4fa3a80b169") (:keywords "org" "babel" "translate" "translation") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/ob-translate"))])
- (ob-typescript . [(20190910 946) ((emacs (24)) (org (8 0))) "org-babel functions for typescript evaluation" single ((:commit . "0b2766b9d136cd6d81f4c15f1ad4b28542f484b9") (:keywords "literate programming" "reproducible research" "typescript") (:authors ("KURASHIKI Satoru")) (:maintainer "KURASHIKI Satoru") (:url . "https://github.com/lurdan/ob-typescript"))])
- (ob-uart . [(20170521 858) nil "org-babel support for UART communication" single ((:commit . "90daeac90a9e75c20cdcf71234c67b812110c50e") (:keywords "tools" "comm" "org-mode" "uart" "literate programming" "reproducible development") (:authors ("Andreas Müller")) (:maintainer "Andreas Müller") (:url . "https://www.0x7.ch"))])
- (oberon . [(20120715 909) nil "Major mode for editing Oberon/Oberon-2 program texts" single ((:commit . "fb57d18ce13835a8a69b6bafecdd9193ca9a59a3") (:keywords "oberon" "oberon-2" "languages" "oop") (:authors ("Karl Landström" . "karl@karllandstrom.se")) (:maintainer "Karl Landström" . "karl@karllandstrom.se"))])
- (obfusurl . [(20170809 1524) ((cl-lib (0 5))) "Obfuscate URLs so they aren't spoilers" single ((:commit . "7a5a41905000ce2ec1fd72509a5567e5fd9f47e5") (:keywords "convenience" "web" "text") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/obfusurl.el"))])
- (objc-font-lock . [(20141021 1822) nil "Highlight Objective-C method calls." single ((:commit . "34b457d577f97ca94b8792d025f9a909c7610612") (:keywords "languages" "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/objc-font-lock"))])
- (objed . [(20200606 1320) ((emacs (25)) (cl-lib (0 5))) "Navigate and edit text objects." tar ((:commit . "e046331f947220c0af3ef1d4c55d6e17bf71d571") (:keywords "convenience") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net") (:url . "https://github.com/clemera/objed"))])
- (obsidian-theme . [(20170719 948) nil "port of the eclipse obsidian theme" single ((:commit . "f45efb2ebe9942466c1db6abbe2d0e6847b785ea") (:authors ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/obsidian-theme"))])
- (occidental-theme . [(20130312 1958) nil "Custom theme for faces based on Adwaita" single ((:commit . "fd2db7256d4f78c43d99c3cddb1c39106d479816") (:authors ("William Stevenson" . "yhvh2000@gmail.com") ("Erik Timan" . "dev@timan.info")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com") (:url . "http://github.com/olcai/occidental-theme"))])
- (occur-context-resize . [(20170904 2309) nil "dynamically resize context around matches in occur-mode" single ((:commit . "cdee5a631ceed9337579d4090e0acf8140747f80") (:keywords "matching") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:url . "https://github.com/dgtized/occur-context-resize.el"))])
- (occur-x . [(20130610 1343) nil "Extra functionality for occur" single ((:commit . "352f5fab207d8a1d3dd048073ff127a83e97c82b") (:keywords "occur" "search" "convenience") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com"))])
- (oceanic-theme . [(20161015 819) nil "Oceanic theme." single ((:commit . "a92ee9b470843c923e6cdcafdd65106ff994d04d") (:keywords "oceanic" "color" "theme") (:authors ("Tengfei Guo")) (:maintainer "Tengfei Guo") (:url . "https://github.com/terry3/oceanic-theme"))])
- (ocodo-svg-modelines . [(20150516 1419) ((svg-mode-line-themes (0))) "A collection of beautiful SVG modelines" tar ((:commit . "c7b0789a177219f117c4de5659ecfa8622958c40"))])
- (ocp-indent . [(20190726 1452) nil "automatic indentation with ocp-indent" single ((:commit . "9e26c0a2699b7076cebc04ece59fb354eb84c11c") (:keywords "ocaml" "languages") (:url . "http://www.typerex.org/ocp-indent.html"))])
- (octicons . [(20151101 340) ((cl-lib (0 5))) "octicons utility" tar ((:commit . "a61e561966ffd8faa3b48ce5b3a4eec10c59708b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-octicons"))])
- (octo-mode . [(20161008 1229) ((emacs (24))) "Major mode for Octo assembly language" single ((:commit . "bd4db7e5e3275b24c74e6a23c11d04f54e9feca5") (:keywords "languages") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:url . "https://github.com/cryon/octo-mode"))])
- (octopress . [(20190123 107) nil "A lightweight wrapper for Jekyll and Octopress." tar ((:commit . "f2c92d5420f14fc9167c7de1873836510e652de2") (:keywords "octopress" "blog") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:url . "https://github.com/aaronbieber/octopress.el"))])
- (oer-reveal . [(20200726 1754) ((emacs (24 4)) (org-re-reveal (3 0 0))) "OER with reveal.js, plugins, and org-re-reveal" tar ((:commit . "e3463929a99977188b1aeff95645a1b1566e699a") (:keywords "hypermedia" "tools" "slideshow" "presentation" "oer") (:authors ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:url . "https://gitlab.com/oer/oer-reveal"))])
- (offlineimap . [(20150916 1158) nil "Run OfflineIMAP from Emacs" single ((:commit . "cc3e067e6237a1eb7b21c575a41683b1febb47f1") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "http://julien.danjou.info/offlineimap-el.html"))])
- (oj . [(20200629 2201) ((emacs (26 1)) (quickrun (2 2))) "Competitive programming tools client for AtCoder, Codeforces" single ((:commit . "dc9207cf1a3ce2bbc8e9ee3d2039df64c3587e1c") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/oj.el"))])
- (old-norse-input . [(20170816 1842) ((emacs (24))) "An input method for Old Norse" single ((:commit . "c2e21ee72c3768e9152aff6baf12a19cde1d0c53") (:keywords "languages") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:url . "https://github.com/david-christiansen/emacs-old-norse-input"))])
- (oldlace-theme . [(20150705 1300) ((emacs (24))) "Emacs 24 theme with an 'oldlace' background." single ((:commit . "5c6f437203b0783b36a7aff4a578de4a0c8c4ee6") (:authors ("martin haesler")) (:maintainer "martin haesler"))])
- (olivetti . [(20200702 601) ((emacs (24 5))) "Minor mode for a nice writing environment" single ((:commit . "0bc5e98b8456493084d1bd3df35e92a12c5da3b2") (:keywords "wp" "text") (:authors ("William Rankin" . "william@bydasein.com")) (:maintainer "William Rankin" . "william@bydasein.com") (:url . "https://github.com/rnkn/olivetti"))])
- (om-mode . [(20140915 2110) nil "Insert Om component template with life cycle." single ((:commit . "cdc0c2912321f8438b0f3449ba8aca50ec150bba") (:keywords "clojurescript") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))])
- (omni-kill . [(20171016 2140) nil "Kill all the things" single ((:commit . "904549c8fd6ac3cf22b5d7111ca8944e179cffea") (:keywords "convenience" "editing" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))])
- (omni-log . [(20200304 2229) ((emacs (24)) (ht (2 0)) (s (1 6 1)) (dash (2 13 0))) "Logging utilities" tar ((:commit . "0a240660ccdd0b6588b4e3c322743b5ab1161338") (:keywords "convenience" "languages" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:url . "https://github.com/AdrieanKhisbe/omni-log.el"))])
- (omni-quotes . [(20200304 2341) ((dash (2 8)) (omni-log (0 4 0)) (f (0 19 0)) (s (1 11 0)) (ht (2 1))) "Random quotes displayer" tar ((:commit . "cfc7b7f01628a5d57384820d1096de4541e67cdf") (:keywords "convenience") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:url . "https://github.com/AdrieanKhisbe/omni-quotes.el"))])
- (omni-scratch . [(20171009 2151) nil "Easy and mode-specific draft buffers" single ((:commit . "9eee3161e5cb6df58618548a2173f4da7d194814") (:keywords "convenience" "languages" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:url . "https://github.com/AdrieanKhisbe/omni-scratch.el"))])
- (omni-tags . [(20170426 2109) ((pcre2el (1 7)) (cl-lib (0 5))) "Highlight and Actions for 'Tags'" tar ((:commit . "8f0f6c302fab900b7681e5c039f90850cbbabd33") (:keywords "convenience") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:url . "http://github.com/AdrieanKhisbe/omni-tags.el"))])
- (omnibox . [(20180423 49) ((emacs (26 1)) (dash (2 13)) (frame-local (0 0 1))) "Selection package" single ((:commit . "8ee75c71c20c438ebc43ba24ef6f543633d118f3") (:keywords "completion" "selection" "convenience" "frames") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:url . "https://github.com/sebastiencs/omnibox"))])
- (omnisharp . [(20191015 635) ((emacs (24 4)) (flycheck (30)) (dash (2 12 0)) (auto-complete (1 4)) (popup (0 5 1)) (csharp-mode (0 8 7)) (cl-lib (0 5)) (s (1 10 0)) (f (0 19 0))) "Omnicompletion (intellisense) and more for C#" tar ((:commit . "e658a18a762438c3e1737612737b05d02a21ca2a") (:keywords "languages" "csharp" "c#" "ide" "auto-complete" "intellisense") (:authors ("Mika Vilpas and others")) (:maintainer "Mika Vilpas and others") (:url . "https://github.com/Omnisharp/omnisharp-emacs"))])
- (omtose-phellack-theme . [(20161111 2120) nil "A dark theme, with cold bluish touch." tar ((:commit . "66f99633e199e65bd28641626435e8e59246529a"))])
- (on-parens . [(20180202 2241) ((dash (2 10 0)) (emacs (24)) (evil (1 1 6)) (smartparens (1 6 3))) "smartparens wrapper to fit with evil-mode/vim normal-state" single ((:commit . "7a41bc02bcffd265f8a69ed4b4e0df3c3009aaa4") (:keywords "evil" "smartparens") (:authors ("William G Hatch")) (:maintainer "William G Hatch"))])
- (on-screen . [(20160302 950) ((cl-lib (0))) "guide your eyes while scrolling" single ((:commit . "206468aa4de299ad26c2db12b757f5ad7290912f") (:keywords "convenience") (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") (:url . "https://github.com/michael-heerdegen/on-screen.el"))])
- (one-themes . [(20200720 1444) ((emacs (24))) "One Colorscheme" tar ((:commit . "0e77d31f9fc0cd55f3d92ec0db79513d616b2efd") (:authors ("Balaji Sivaraman" . "balaji@balajisivaraman.com")) (:maintainer "Balaji Sivaraman" . "balaji@balajisivaraman.com") (:url . "http://github.com/balajisivaraman/emacs-one-themes"))])
- (one-time-pad-encrypt . [(20160329 1513) nil "One time pad encryption within file" single ((:commit . "87cc1f124024ce3d277299ca0ac703f182937d9f") (:keywords "convenience") (:authors ("Garvin Guan" . "garvin.guan@gmail.com")) (:maintainer "Garvin Guan" . "garvin.guan@gmail.com") (:url . "https://github.com/garvinguan/emacs-one-time-pad/"))])
- (opam . [(20150719 1220) ((emacs (24 1))) "OPAM tools" single ((:commit . "4d589de5765728f56af7078fae328b6792de8600") (:keywords "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/lunaryorn/opam.el"))])
- (open-in-msvs . [(20170123 2228) nil "Open current file:line:column in Microsoft Visual Studio" tar ((:commit . "e0d071c83188ad5db8f3297d6ce784b4ed554a04") (:keywords "convenience" "usability" "integration" "visual studio" "msvs" "ide") (:authors ("Evgeny Panasyuk")) (:maintainer "Evgeny Panasyuk") (:url . "https://github.com/evgeny-panasyuk/open-in-msvs"))])
- (open-junk-file . [(20161210 1114) nil "Open a junk (memo) file to try-and-error" single ((:commit . "558bec7372b0fed4c4cb6074ab906535fae615bd") (:keywords "convenience" "tools") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/open-junk-file.el"))])
- (opencc . [(20170722 816) ((emacs (24 4))) "中文简繁转换 <-> 中文簡繁轉換 (Convert Chinese with OpenCC)" single ((:commit . "8c539f72669ba9a99d8b5198db5ea930897ad1b9") (:keywords "chinese") (:authors ("徐春阳" . "mail@xuchunyang.me")) (:maintainer "徐春阳" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/emacs-opencc"))])
- (opencl-mode . [(20190615 1957) nil "Syntax coloring for opencl kernels" single ((:commit . "55cb49c8243e6420961d719faced035bc547c1ef") (:keywords "c" "opencl") (:authors ("Salmane Bah" . "salmane.bah@u-bordeaux.fr")) (:maintainer "Salmane Bah" . "salmane.bah@u-bordeaux.fr") (:url . "https://github.com/salmanebah/opencl-mode"))])
- (opener . [(20161207 1810) ((request (0 2 0)) (emacs (24)) (cl-lib (0 5))) "opening urls as buffers" tar ((:commit . "c384f67278046fdcd220275fdd212ab85672cbeb") (:keywords "url" "http" "files") (:authors ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainer "Tim Reddehase" . "tr@rightsrestricted.com") (:url . "https://github.com/0robustus1/opener.el"))])
- (opensource . [(20160926 1616) ((s (1 11 0)) (dash (2 12 1)) (pkg-info (0 6 0)) (request (0 2 0))) "Client for Opensource API" tar ((:commit . "4c15049079878fcd386cca5dba20b99296a1de84") (:keywords "opensource") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/OpenSourceOrg/el-opensourceorg"))])
- (openstack-cgit-browse-file . [(20130819 927) nil "Browse the current file in OpenStack cgit" single ((:commit . "244219288b9aef41155044697bb114b7af83ab8f") (:keywords "convenience" "vc" "git" "cgit" "gerrit" "openstack") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:url . "https://github.com/chmouel/openstack-cgit-browse-file"))])
- (openwith . [(20120531 2136) nil "Open files with external programs" single ((:commit . "1dc89670822966fab6e656f6519fdd7f01e8301a") (:keywords "files" "processes") (:authors ("Markus Triska" . "markus.triska@gmx.at")) (:maintainer "Markus Triska" . "markus.triska@gmx.at") (:url . "https://bitbucket.org/jpkotta/openwith"))])
- (operate-on-number . [(20150707 623) nil "Operate on number at point with arithmetic functions" single ((:commit . "ceb3be565a29326c1098244fac0c50606723a56e") (:keywords "editing") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/operate-on-number.el"))])
- (orca . [(20200122 1511) ((emacs (24 3))) "Org Capture" single ((:commit . "654f185861ed4fedfe1394db48a83639a0be57f6") (:keywords "org" "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/orca"))])
- (orderless . [(20200614 1920) ((emacs (24 4))) "Completion style for matching regexps in any order" single ((:commit . "1f1e0380e2a8cd4fc29b8cc2e00cb01b56d86fbc") (:keywords "extensions") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:url . "https://github.com/oantolin/orderless"))])
- (ordinal . [(20190104 1421) ((emacs (24)) (cl-lib (0 5))) "Convert number to ordinal number notation" single ((:commit . "75af95abbac3e30c4dd804411cb3e867c741a747") (:keywords "lisp") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/ordinal.el"))])
- (org-ac . [(20170401 1307) ((auto-complete-pcmp (0 0 1)) (log4e (0 2 0)) (yaxception (0 1))) "Some auto-complete sources for org-mode" single ((:commit . "41e3ef8e4039619d0370c23c66730b3b2e9e32ed") (:keywords "org" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/org-ac"))])
- (org-agenda-property . [(20140626 2116) ((emacs (24 2))) "Display org properties in the agenda buffer." single ((:commit . "3b469f3e93de0036547f3631cd0366d53f7584c8") (:keywords "calendar") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/org-agenda-property"))])
- (org-alert . [(20180524 133) ((s (1 10 0)) (dash (2 11 0)) (alert (1 2))) "Notify org deadlines via notify-send" single ((:commit . "f87bff4acbd839acb4d2245b56b2c3d21f950911") (:keywords "org" "org-mode" "notify" "notifications" "calendar") (:authors ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainer "Stephen Pegoraro" . "spegoraro@tutive.com") (:url . "https://github.com/groksteve/org-alert"))])
- (org-analyzer . [(20191001 1717) nil "org-analyzer is a tool that extracts time tracking data from org files." tar ((:commit . "19da62aa4dcf1090be8f574f6f2d4c7e116163a8"))])
- (org-attach-screenshot . [(20180420 525) nil "screenshots integrated with org attachment dirs" single ((:commit . "6b1edbd2384191122a30788ac72f2233c2df0294") (:keywords "org") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:url . "https://github.com/dfeich/org-screenshot"))])
- (org-autolist . [(20170924 1901) nil "Improved list management in org-mode" single ((:commit . "c82d1e83e982b5f0c106b8800e5b0cfd5f73fdc1") (:keywords "lists" "checklists" "org-mode") (:authors ("Calvin Young")) (:maintainer "Calvin Young") (:url . "https://github.com/calvinwyoung/org-autolist"))])
- (org-babel-eval-in-repl . [(20200723 838) ((eval-in-repl (0 9 2)) (matlab-mode (3 3 6)) (ess (16 10)) (emacs (24))) "Eval org-mode babel code blocks in various REPLs." tar ((:commit . "85136ac7397fcdf0a4700a860de44d7912bb6b4c") (:keywords "literate programming" "reproducible research" "async execution") (:authors ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainer "Takeshi Teshima" . "diadochos.developer@gmail.com") (:url . "https://github.com/diadochos/org-babel-eval-in-repl"))])
- (org-beautify-theme . [(20170908 2218) nil "A sub-theme to make org-mode more beautiful." single ((:commit . "df6a1114fda313e1689363e196c8284fbe2a2738") (:keywords "org" "theme") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net"))])
- (org-board . [(20200619 1016) nil "bookmarking and web archival system for Org mode." single ((:commit . "1393bd46d11a81328ed4fb8471831415a3efe224") (:keywords "org" "bookmarks" "archives") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:url . "https://github.com/scallywag/org-board"))])
- (org-bookmark-heading . [(20200103 514) ((emacs (24 4)) (f (0 17 2))) "Emacs bookmark support for org-mode" single ((:commit . "38a2813f72ff65f3ae91e2ebb23e0bbb42a8d1df") (:keywords "hypermedia" "outlines") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/org-bookmark-heading"))])
- (org-books . [(20200522 1800) ((enlive (0 0 1)) (s (1 11 0)) (helm (2 9 2)) (helm-org (1 0)) (dash (2 14 1)) (emacs (25))) "Reading list management with Org mode and helm" single ((:commit . "49617901d087f532d7cae1aa23637671fd153d20") (:keywords "outlines") (:authors ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainer "Abhinav Tushar" . "abhinav@lepisma.xyz") (:url . "https://github.com/lepisma/org-books"))])
- (org-brain . [(20200625 2050) ((emacs (25 1)) (org (9 2))) "Org-mode concept mapping" single ((:commit . "671db0e08b91c7d2637d765a7afca8b2561275c8") (:keywords "outlines" "hypermedia") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:url . "http://github.com/Kungsgeten/org-brain"))])
- (org-bullets . [(20200317 1740) nil "Show bullets in org-mode as UTF-8 characters" single ((:commit . "767f55feb58b840a5a04eabfc3fbbf0d257c4792") (:authors ("sabof")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:url . "https://github.com/integral-dw/org-bullets"))])
- (org-caldav . [(20200510 2030) ((org (7))) "Sync org files with external calendar through CalDAV" single ((:commit . "8569941a0a5a9393ba51afc8923fd7b77b73fa7a") (:keywords "calendar" "caldav") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de"))])
- (org-capture-pop-frame . [(20160518 1008) ((emacs (24 4))) "Run org-capture in a new pop frame" single ((:commit . "b16fd712de62cf0d1f9befd03be6ab5983cb3301") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-capture-pop-frame.git"))])
- (org-category-capture . [(20200329 313) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." single ((:commit . "96a57a43555e24e5e0d81e79f0fbb47001c41bac") (:keywords "org-mode" "todo" "tools" "outlines") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/org-projectile"))])
- (org-chef . [(20200729 2021) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "5b461ed7d458cdcbff0af5013fbdbe88cbfb13a4") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:url . "https://github.com/Chobbes/org-chef"))])
- (org-cliplink . [(20190608 2134) ((emacs (24 4))) "insert org-mode links from the clipboard" tar ((:commit . "82402cae7e118d67de7328417fd018a18f95fac2") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/org-cliplink"))])
- (org-clock-convenience . [(20200705 1527) ((cl-lib (0 5)) (org (8)) (emacs (24 3))) "convenience functions for org time tracking" single ((:commit . "efc9773a8dedf834cf4a78fb6f5f8fffe55ef8eb") (:keywords "org") (:authors ("Derek Feichtinger <dfeich.gmail.com>")) (:maintainer "Derek Feichtinger <dfeich.gmail.com>") (:url . "https://github.com/dfeich/org-clock-convenience"))])
- (org-clock-csv . [(20200714 2109) ((org (8 3)) (s (1 0))) "Export `org-mode' clock entries to CSV format." single ((:commit . "499b961f26e1f9a9898bf0b1725b49d783893639") (:keywords "calendar" "data" "org") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:url . "https://github.com/atheriel/org-clock-csv"))])
- (org-clock-split . [(20200331 526) ((emacs (24))) "Split clock entries" single ((:commit . "39e1d2912a7a7223e2356a5fc4dff03507ae084d") (:keywords "calendar") (:authors ("Justin Taft <https://github.com/justintaft>")) (:maintainer "Justin Taft <https://github.com/justintaft>") (:url . "https://github.com/justintaft/emacs-org-clock-split"))])
- (org-clock-today . [(20191204 1558) ((emacs (25))) "Show total clocked time of the current day in the mode line" single ((:commit . "e326a45b60e0fd4ca057f1d1dc3e99a516a5aa2f") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com") (:url . "https://github.com/mallt/org-clock-today-mode"))])
- (org-commentary . [(20160802 637) ((dash (2 0)) (emacs (24 4)) (org (8 0))) "generate or update conventional library headers using Org mode files" tar ((:commit . "821ccb994811359c42f4e3d459e0e88849d42b75") (:keywords "convenience" "docs" "tools") (:authors ("Sergei Maximov" . "s.b.maximov@gmail.com")) (:maintainer "Sergei Maximov" . "s.b.maximov@gmail.com") (:url . "https://github.com/smaximov/org-commentary"))])
- (org-context . [(20200615 1554) nil "Contextual capture and agenda commands for Org-mode" single ((:commit . "8ef429124c13b1a68f7672cb6e6cb9c8b9d9db93") (:keywords "org" "capture" "agenda" "convenience") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "https://github.com/thisirs/org-context"))])
- (org-cua-dwim . [(20120203 534) nil "Org-mode and Cua mode compatibility layer" single ((:commit . "a55d6c7009fc0b22f1110c07de629acc955c85e4") (:keywords "org-mode" "cua-mode") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler"))])
- (org-d20 . [(20200416 2010) ((s (1 11 0)) (seq (2 19)) (dash (2 12 0)) (emacs (24))) "minor mode for d20 tabletop roleplaying games" single ((:commit . "7ede5726d640c4f81146585f6eb907f51a0f6a19") (:keywords "outlines" "games") (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name") (:url . "https://spwhitton.name/tech/code/org-d20/"))])
- (org-dashboard . [(20171223 1924) ((cl-lib (0 5))) "Visually summarize progress in org files" single ((:commit . "02c0699771d199075a286e4502340ca6e7c9e831") (:keywords "outlines" "calendar") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com") (:url . "http://github.com/bard/org-dashboard"))])
- (org-doing . [(20200510 1732) nil "Keep track of what you're doing" tar ((:commit . "df916bb13577f4de9d58332453cb8bf51eac37ba") (:keywords "tools" "org") (:authors ("Rudolf Olah")) (:maintainer "Rudolf Olah") (:url . "https://github.com/rudolfolah/org-doing"))])
- (org-dotemacs . [(20190903 2024) ((org (7 9 3)) (cl-lib (0 5))) "Store your emacs config as an org file, and choose which bits to load." single ((:commit . "ee59739c2d59151fe7d7d3034e87c7691120a5be") (:keywords "local") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/org-dotemacs"))])
- (org-download . [(20200615 936) ((emacs (24 3)) (async (1 2))) "Image drag-and-drop for Org-mode." single ((:commit . "768716b6fcc814b06360b99ad70bce44c0eb4a32") (:keywords "multimedia" "images" "screenshots" "download") (:authors ("Oleh Krehel")) (:maintainer "Oleh Krehel") (:url . "https://github.com/abo-abo/org-download"))])
- (org-dp . [(20180311 923) ((cl-lib (0 5))) "Declarative Local Programming with Org Elements" tar ((:commit . "e720f1c155a795a5b65a04790ad195c413449716") (:authors ("Thorsten Jolitz <tjolitz AT gmail DOT com>")) (:maintainer "Thorsten Jolitz <tjolitz AT gmail DOT com>") (:url . "https://github.com/tj64/org-dp"))])
- (org-drill . [(20200412 1812) ((emacs (25 3)) (seq (2 14)) (org (9 3)) (persist (0 3))) "Self-testing using spaced repetition" single ((:commit . "35c1ce349949cc213f3076799211210f49431850") (:keywords "games" "outlines" "multimedia") (:authors ("Paul Sexton" . "eeeickythump@gmail.com")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") (:url . "https://gitlab.com/phillord/org-drill/issues"))])
- (org-drill-table . [(20180115 1009) ((s (1 7 0)) (dash (2 2 0)) (cl-lib (0 3)) (org (8 2)) (emacs (24 1))) "Generate drill cards from org tables" single ((:commit . "2729aaa42c1e2720d9bf7bcc125e92dcf48b7f7d") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))])
- (org-dropbox . [(20150114 509) ((dash (2 2)) (names (20150000)) (emacs (24))) "move Dropbox notes from phone into org-mode datetree" single ((:commit . "75dab6d6f0438a7a8a18ccf3a5d55f50bf531f6e") (:keywords "dropbox" "android" "notes" "org-mode") (:authors ("Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com")) (:maintainer "Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com") (:url . "https://github.com/heikkil/org-dropbox"))])
- (org-easy-img-insert . [(20160915 2008) ((emacs (24 4))) "An easier way to add images from the web in org mode" single ((:commit . "9f8aaa7f68ff1f0d8d7b1e9b618abb15002f971e") (:keywords "convenience" "hypermedia" "files") (:authors ("Tashrif Sanil" . "tashrifsanil@kloke-source.com")) (:maintainer "Tashrif Sanil" . "tashrifsanil@kloke-source.com") (:url . "https://github.com/tashrifsanil/org-easy-img-insert"))])
- (org-edit-latex . [(20170908 1522) ((emacs (24 4)) (auctex (11 90))) "Edit embedded LaTeX in a dedicated buffer" single ((:commit . "1f228310ef2f3f2959a527f6d99e42ce977384c8") (:keywords "org" "latex") (:authors ("James Wong" . "jianwang.academic@gmail.com")) (:maintainer "James Wong" . "jianwang.academic@gmail.com") (:url . "https://github.com/et2010/org-edit-latex"))])
- (org-ehtml . [(20150506 2358) ((web-server (20140109 2200)) (emacs (24 3))) "Export Org-mode files as editable web pages" tar ((:commit . "9df85de1a0fe1e7b2d6c000777c1a0c0217f92d0"))])
- (org-elisp-help . [(20161122 55) ((cl-lib (0 5)) (org (9 0))) "org links to emacs-lisp documentation" single ((:commit . "3e33ab1a2933dd7f2782ef91d667a37f12d633ab") (:keywords "org" "remember" "lisp") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/org-elisp-help"))])
- (org-emms . [(20181010 1114) ((emacs (24))) "Play multimedia files from org-mode" single ((:commit . "07a8917f3d628c32e5de1dbd118ac08203772533") (:keywords "multimedia") (:authors ("Jonathan Gregory <jgrg at autistici dot org>")) (:maintainer "Jonathan Gregory <jgrg at autistici dot org>") (:url . "https://gitlab.com/jagrg/org-emms"))])
- (org-evil . [(20180620 1517) ((dash (2 13 0)) (evil (0)) (monitor (0)) (org (0))) "Evil extensions for Org." tar ((:commit . "3b4620edc606412ef75c0b5aa637af22486eb126") (:keywords "convenience" "evil" "org") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:url . "https://github.com/guiltydolphin/org-evil"))])
- (org-fancy-priorities . [(20180328 2331) nil "Display org priorities as custom strings" single ((:commit . "819bb993b71e7253cefef7047306ab4e0f9d0a86") (:keywords "convenience" "faces" "outlines") (:authors ("Harry Bournis" . "harrybournis@gmail.com")) (:maintainer "Harry Bournis" . "harrybournis@gmail.com") (:url . "https://github.com/harrybournis/org-fancy-priorities"))])
- (org-fragtog . [(20200703 229) ((emacs (24 3)) (org (9 3 2))) "Auto-toggle org fragments" single ((:commit . "92119e3ae7c9a0ae2b5c9d9e4801b5fdc4804ad7") (:authors ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainer "Benjamin Levy" . "blevy@protonmail.com") (:url . "https://github.com/io12/org-fragtog"))])
- (org-gcal . [(20200609 1915) ((request (20190901)) (request-deferred (20181129)) (alert (0)) (persist (0)) (emacs (26))) "Org sync with Google Calendar" single ((:commit . "744505832b34e07b44a5d97d8720b2d7492d7fc9") (:keywords "convenience") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:url . "https://github.com/kidd/org-gcal.el"))])
- (org-generate . [(20200718 1704) ((emacs (26 1)) (org (9 3)) (mustache (0 23))) "Generate template files/folders from org document" single ((:commit . "e516023bdfb02cd9768dcf3843d494392f85e054") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/org-generate.el"))])
- (org-gnome . [(20150614 1457) ((alert (1 2)) (telepathy (0 1)) (gnome-calendar (0 1))) "Orgmode integration with the GNOME desktop" single ((:commit . "122e14cf6f8104150a65246a9a7c10e1d7939862") (:keywords "org" "gnome") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (org-grep . [(20151202 1229) ((cl-lib (0 5))) "Kind of M-x rgrep adapted for Org mode." single ((:commit . "5bdd04c0f53b8a3d656f36ea17bba3df7f0cb684") (:authors ("François Pinard" . "pinard@iro.umontreal.ca")) (:maintainer "François Pinard" . "pinard@iro.umontreal.ca") (:url . "https://github.com/pinard/org-grep"))])
- (org-id-cleanup . [(20200523 735) ((org (9 2 6)) (dash (2 12 0)) (emacs (25 1))) "Interactively find, present and maybe clean up unused IDs of org-id" single ((:commit . "e79540b64e0ee5ef11adfeb932a9b04beb905680") (:authors ("Marc Ihm" . "1@2484.de")) (:maintainer "Marc Ihm" . "1@2484.de") (:url . "https://github.com/marcIhm/org-id-cleanup"))])
- (org-if . [(20150920 1513) nil "Interactive Fiction Authoring System for Org-Mode." tar ((:commit . "fab602cc1bbee7a4e99c0083e129219d3f9ed2e8"))])
- (org-index . [(20200516 1343) ((org (9 0 0)) (dash (2 12 0)) (emacs (25 1))) "A personal adaptive index for org" single ((:commit . "f868df4aa4f49484cf818627251b7c7282d8d20e") (:authors ("Marc Ihm" . "1@2484.de")) (:maintainer "Marc Ihm" . "1@2484.de") (:url . "https://github.com/marcIhm/org-index"))])
- (org-iv . [(20171001 1022) ((impatient-mode (1 0 0)) (org (8 0)) (cl-lib (0 5))) "a tool used to view html (in browser) generated by org-file once the org-file changes" tar ((:commit . "7f2bb1b32647655fd9d6684f6f09dcc66b61b0cd"))])
- (org-jira . [(20200714 41) ((emacs (24 5)) (cl-lib (0 5)) (request (0 2 0)) (dash (2 14 1))) "Syncing between Jira and Org-mode." tar ((:commit . "5c90dce918fcb873754bff375e988b17dcc69701") (:keywords "ahungry" "jira" "org" "bug" "tracker") (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/org-jira"))])
- (org-journal . [(20200731 1726) ((emacs (25 1)) (org (9 1))) "a simple org-mode based journaling mode" single ((:commit . "af2b9a88cfbbb0bbab743d5b31b3918f7e6911c3") (:authors ("Bastian Bechtold") ("Christian Schwarzgruber")) (:maintainer "Bastian Bechtold") (:url . "http://github.com/bastibe/org-journal"))])
- (org-journal-list . [(20190221 2052) ((emacs (25))) "Org mode Journal List" single ((:commit . "2b26d00181bb49bff64b31ad020490acd1b6ae02") (:authors ("Huy Tran" . "huytd189@gmail.com")) (:maintainer "Huy Tran" . "huytd189@gmail.com") (:url . "https://github.com/huytd/org-journal-list"))])
- (org-kanban . [(20200729 2120) ((s (0)) (dash (2 17 0)) (emacs (24 4)) (org (9 1))) "kanban dynamic block for org-mode." single ((:commit . "70b4c9823b32ae299f3da521966b6c5abacf73e2") (:keywords "org-mode" "org" "kanban" "tools") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainer "Christian Köstlin" . "christian.koestlin@gmail.com") (:url . "http://github.com/gizmomogwai/org-kanban"))])
- (org-kindle . [(20190315 439) ((emacs (25)) (cl-lib (0 5)) (seq (2 20))) "Send org link file to ebook reader." single ((:commit . "612a2894bbbff8a6cf54709d591fee86005755de") (:keywords "org" "link" "ebook" "kindle" "epub" "mobi") (:url . "https://github.com/stardiviner/org-kindle"))])
- (org-link-travis . [(20140405 2327) ((org (7))) "Insert/Export the link of Travis CI on org-mode" single ((:commit . "596615ad8373d9090bd4138da683524f0ad0bda5") (:keywords "org") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/org-link-travis"))])
- (org-linkotron . [(20200112 2235) ((emacs (26 1)) (org (9 3))) "Org-mode link selector" tar ((:commit . "d0adc5247b205bc73d2f1a83d4a512d2be541eb5") (:keywords "hypermedia" "org") (:authors ("Per Weijnitz" . "per.weijnitz@gmail.com")) (:maintainer "Per Weijnitz" . "per.weijnitz@gmail.com") (:url . "https://gitlab.com/perweij/org-linkotron"))])
- (org-listcruncher . [(20180815 603) ((cl-lib (0 5)) (seq (2 3)) (emacs (24 4))) "Parse Org mode list contents into table" single ((:commit . "65c09c5deba065752eb88875c54dc26abcdfaffb") (:keywords "convenience") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:url . "https://github.com/dfeich/org-listcruncher"))])
- (org-lookup-dnd . [(20190622 2224) ((emacs (24 4)) (org-pdfview (0 1))) "Reference the index of a D&D handbook pdf" single ((:commit . "bba86a9b9979bd79e9bfaf4a7b472682b9435490") (:authors ("Malte Lau Petersen" . "maltelau@protonmail.com")) (:maintainer "Malte Lau Petersen" . "maltelau@protonmail.com") (:url . "https://gitlab.com/maltelau/org-lookup-dnd"))])
- (org-make-toc . [(20200409 1436) ((emacs (26 1)) (dash (2 12)) (s (1 10 0)) (org (9 0))) "Automatic tables of contents for Org files" single ((:commit . "26fbd6a7e1e7f8e473fe3a5f74faec715c3a05aa") (:keywords "org" "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/org-make-toc"))])
- (org-mime . [(20200520 1100) ((emacs (25 1)) (cl-lib (0 5))) "org html export for text/html MIME emails" single ((:commit . "9bb6351b25c62835c7881fc64096028eb8ef83ef") (:keywords "mime" "mail" "email" "html") (:authors ("Eric Schulte")) (:maintainer "Chen Bin (redguardtoo)") (:url . "http://github.com/org-mime/org-mime"))])
- (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" single ((:commit . "95347b2f9291f5c5eb6ebac8e726c03634c61de3") (:keywords "orgmode" "extensions" "graphviz" "dot") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com") (:url . "https://github.com/theodorewiles/org-mind-map"))])
- (org-ml . [(20200728 101) ((emacs (26 1)) (dash (2 15)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "d804a97d46d431bd6e4792c4ec01437ea3bb6a2a") (:keywords "org-mode" "outlines") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch") (:url . "https://github.com/ndwarshuis/org-ml.el"))])
- (org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "automatically sync org-mobile on changes" single ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))])
- (org-mru-clock . [(20200128 1208) ((emacs (24 3))) "clock in/out of tasks with completion and persistent history" single ((:commit . "4fb77d9bb876e368e596d18324115cef6c1c71f3") (:keywords "convenience" "calendar") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "https://github.com/unhammer/org-mru-clock"))])
- (org-msg . [(20200722 2238) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." single ((:commit . "2db6725c4a4f4342a9c61895b7c3c82795b01fee") (:keywords "extensions" "mail") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:url . "https://github.com/jeremy-compostella/org-msg"))])
- (org-multi-wiki . [(20200419 1833) ((emacs (26 1)) (dash (2 12)) (s (1 12)) (org-ql (0 4)) (org (9 3))) "Multiple wikis based on Org mode" single ((:commit . "97575f7b17b2c137127884deb51faf9be7ec5267") (:keywords "org" "outlines" "files") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-multi-wiki"))])
- (org-multiple-keymap . [(20191017 1920) ((org (8 2 4)) (emacs (24)) (cl-lib (0 5))) "Set keymap to elements, such as timestamp and priority." single ((:commit . "4eb8aa0aada012b2346cc7f0c55e07783141a2c3") (:keywords "convenience" "org-mode") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/org-multiple-keymap.el"))])
- (org-notebook . [(20170322 452) ((emacs (24)) (org (8)) (cl-lib (0 5))) "Ease the use of org-mode as a notebook" single ((:commit . "86042d866bf441e2c9bb51f995e5994141b78517") (:keywords "convenience" "tools") (:authors ("Paul Elder" . "paul.elder@amanokami.net")) (:maintainer "Paul Elder" . "paul.elder@amanokami.net"))])
- (org-noter . [(20191020 1212) ((emacs (24 4)) (cl-lib (0 6)) (org (9 0))) "A synchronized, Org-mode, document annotator" single ((:commit . "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d") (:keywords "lisp" "pdf" "interleave" "annotate" "external" "sync" "notes" "documents" "org-mode") (:authors (nil . "Gonçalo Santos (aka. weirdNox@GitHub)")) (:maintainer nil . "Gonçalo Santos (aka. weirdNox@GitHub)") (:url . "https://github.com/weirdNox/org-noter"))])
- (org-noter-pdftools . [(20200418 929) ((emacs (26 1)) (org (9 4)) (pdf-tools (0 8)) (org-pdftools (1 0)) (org-noter (1 4 1))) "Integration between org-pdftools and org-noter" single ((:commit . "8cc15bb8014ed1f047eecc0abd8bf447f86c0505") (:keywords "convenience") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com") (:url . "https://github.com/fuxialexander/org-pdftools"))])
- (org-octopress . [(20170821 415) ((org (9 0)) (orglue (0 1)) (ctable (0 1 1))) "Compose octopress articles using org-mode." tar ((:commit . "38598ef98d04076a8eb78d549907ddfde8d3a652") (:keywords "org" "jekyll" "octopress" "blog") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))])
- (org-onenote . [(20171008 500) ((oauth2 (0 11)) (request (0 2 0)) (org (8 2 10))) "export org-mode document to onenote." single ((:commit . "5ce5cf4edb143180e0b185ac26826d39ae5bc929") (:keywords "tools" "docs" "org-mode" "onenote") (:authors ("Frei Zhang" . "ifree0@gmail.com")) (:maintainer "Frei Zhang" . "ifree0@gmail.com") (:url . "https://github.com/ifree/org-onenote"))])
- (org-outline-numbering . [(20180705 1501) ((emacs (24)) (org (8 3)) (cl-lib (0 6)) (ov (1 0 6))) "Show outline numbering as overlays in org-mode" single ((:commit . "22014917dd7e751c46fa13e1e836c2d0265ce82f") (:keywords "wp" "convenience") (:authors ("Anders Johansson")) (:maintainer "Anders Johansson") (:url . "https://gitlab.com/andersjohansson/org-outline-numbering"))])
- (org-outlook . [(20160705 1338) nil "Outlook org" tar ((:commit . "ec32d8d9d8ffd17e6de4de0b52fc3f5ad9b4cc0d") (:keywords "org-outlook") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:url . "https://github.com/mlf176f2/org-outlook.el"))])
- (org-page . [(20170807 224) ((ht (1 5)) (simple-httpd (1 4 6)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (cl-lib (0 5)) (git (0 1 1))) "a static site generator based on org mode" tar ((:commit . "d0e55416174a60d3305e97ca193b333f4cccba4f"))])
- (org-parser . [(20200417 301) ((emacs (25 1)) (dash (2 12 0)) (ht (2 1))) "parse org files into structured datatypes." single ((:commit . "fd4cb7035ff649378cc968b1ec2c386b5c565706") (:keywords "files" "outlines" "tools") (:url . "https://hg.sr.ht/~zck/org-parser"))])
- (org-password-manager . [(20180227 1810) ((org (8 2 10)) (s (1 9 0)) (dash (2 13 0))) "Password manager for Org Mode." single ((:commit . "4b30a36e71182553a02e4dd415369290d98ec03a") (:keywords "password") (:authors ("Leandro Facchinetti" . "me@leafac.com")) (:maintainer "Leandro Facchinetti" . "me@leafac.com") (:url . "https://git.leafac.com/org-password-manager"))])
- (org-pdftools . [(20200422 1350) ((emacs (26 1)) (org (9 3 6)) (pdf-tools (0 8)) (org-noter (1 4 1))) "Support for links to documents in pdfview mode" single ((:commit . "8cc15bb8014ed1f047eecc0abd8bf447f86c0505") (:keywords "convenience") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com") (:url . "https://github.com/fuxialexander/org-pdftools"))])
- (org-picklink . [(20191203 59) ((emacs (24 4))) "Pick a headline link from org-agenda" single ((:commit . "f79040ed988bdeec63b098b187e00f2b80d3d570") (:keywords "convenience") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-picklink"))])
- (org-pivotal . [(20200607 1505) ((a (0 1 1)) (dash (2 14 1)) (dash-functional (1 2 0)) (emacs (26 1)) (request (0 3 0))) "Sync Pivotal Tracker to org buffer" tar ((:commit . "125e70f9a682751e4ed7c3a350b2794af9600f47") (:authors ("Huy Duong" . "qhuyduong@hotmail.com")) (:maintainer "Huy Duong" . "qhuyduong@hotmail.com") (:url . "https://github.com/org-pivotal/org-pivotal"))])
- (org-pomodoro . [(20190530 1445) ((alert (0 5 10)) (cl-lib (0 5))) "Pomodoro implementation for org-mode." tar ((:commit . "aa07c11318f91219336197e62c47bc7a3d090479") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:url . "https://github.com/lolownia/org-pomodoro"))])
- (org-present . [(20200204 1647) ((org (7))) "Minimalist presentation minor-mode for Emacs org-mode." single ((:commit . "9709ca2d04a59959354222ac4d3f8b750785739a") (:authors ("Ric Lister")) (:maintainer "Ric Lister") (:url . "https://github.com/rlister/org-present"))])
- (org-present-remote . [(20191206 533) ((org-present (9)) (elnode (0 9)) (emacs (25))) "A web-based remote control for org-present" single ((:commit . "ba7e07af3bd1142e310e868893b919286758a007") (:keywords "comm" "docs") (:authors ("Duncan Bayne" . "duncan@bayne.id.au")) (:maintainer "Duncan Bayne" . "duncan@bayne.id.au") (:url . "https://gitlab.com/duncan-bayne/org-present-remote"))])
- (org-pretty-tags . [(20200303 2201) ((emacs (25))) "Surrogates for tags" single ((:commit . "40fd72f3e701e31813f383fb429d30bb88cee769") (:keywords "reading" "outlines") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:url . "https://gitlab.com/marcowahl/org-pretty-tags"))])
- (org-preview-html . [(20180625 619) ((org (8 0)) (emacs (24 4))) "automatically use eww to preview the current org file on save" single ((:commit . "8ba7ecd7ac624f33b3e2395f477bbff4f1ec4efe") (:keywords "convenience" "eww" "org") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/org-preview-html"))])
- (org-projectile . [(20190130 1439) ((projectile (0 11 0)) (dash (2 10 0)) (emacs (24)) (s (1 9 0)) (org-category-capture (0 0 0))) "Repository todo management for org-mode" single ((:commit . "96a57a43555e24e5e0d81e79f0fbb47001c41bac") (:keywords "org-mode" "projectile" "todo" "tools" "outlines") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/org-projectile"))])
- (org-projectile-helm . [(20180601 1822) ((org-projectile (1 0 0)) (helm (2 3 1)) (emacs (25))) "helm functions for org-projectile" single ((:commit . "96a57a43555e24e5e0d81e79f0fbb47001c41bac") (:keywords "org" "projectile" "todo" "helm" "outlines") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/org-projectile"))])
- (org-protocol-jekyll . [(20170328 1639) ((cl-lib (0 5))) "Jekyll's handler for org-protocol" single ((:commit . "dec064a42d6dfe81dfde7ba59ece5ca103ac6334") (:authors ("Vladimir S. Ivanov" . "ivvl82@gmail.com")) (:maintainer "Vladimir S. Ivanov" . "ivvl82@gmail.com"))])
- (org-ql . [(20200713 309) ((emacs (26 1)) (dash (2 13)) (dash-functional (1 2 0)) (f (0 17 2)) (map (2 1)) (org (9 0)) (org-super-agenda (1 2 -1)) (ov (1 0 6)) (peg (0 6)) (s (1 12 0)) (transient (0 1)) (ts (0 2 -1))) "Org Query Language, search command, and agenda-like view" tar ((:commit . "6633dbb276d51767c3f401d0f68ef99e7b9364b6") (:keywords "hypermedia" "outlines" "org" "agenda") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/org-ql"))])
- (org-radiobutton . [(20180612 1028) ((dash (2 13 0)) (emacs (24))) "Radiobutton for org-mode lists." single ((:commit . "4182aafbe5ae1bdfb0b07efa435bdba8bbd7199d") (:keywords "outlines") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/org-radiobutton"))])
- (org-random-todo . [(20190214 2057) ((emacs (24 3)) (alert (1 3))) "show a random TODO (with alert) every so often" single ((:commit . "a019c7186ec60c8c7c3657914cdce029811cf4e0") (:keywords "org" "todo" "notification" "calendar") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "https://github.com/unhammer/org-random-todo"))])
- (org-randomnote . [(20200110 1407) ((f (0 19 0)) (dash (2 12 0)) (org (0))) "Find a random note in your Org-Mode files" single ((:commit . "ea8cf4385970637efffff8f79e14576ba6d7ad13") (:authors ("Michael Fogleman" . "michaelwfogleman@gmail.com")) (:maintainer "Michael Fogleman" . "michaelwfogleman@gmail.com") (:url . "http://github.com/mwfogleman/org-randomnote"))])
- (org-re-reveal . [(20200724 643) ((emacs (24 4)) (org (8 3)) (htmlize (1 34))) "Org export to reveal.js presentations" tar ((:commit . "c548e239898e97e700f7c1d3f34a148ccbedb820") (:keywords "tools" "outlines" "hypermedia" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/org-re-reveal"))])
- (org-re-reveal-ref . [(20200624 615) ((emacs (25 1)) (org-ref (1 1 1)) (org-re-reveal (0 9 3))) "Citations and bibliography for org-re-reveal" tar ((:commit . "d60e7b000e863c60485f866f14f552506317f5b4") (:keywords "hypermedia" "tools" "slideshow" "presentation" "bibliography") (:authors ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:url . "https://gitlab.com/oer/org-re-reveal-ref"))])
- (org-recent-headings . [(20200228 215) ((emacs (26 1)) (org (9 0 5)) (dash (2 13 0)) (dash-functional (1 2 0)) (frecency (0 1)) (s (1 12 0))) "Jump to recently used Org headings" single ((:commit . "bb9c96bea63a0ce8c0d18e8b8b4b24085d4c9d89") (:keywords "hypermedia" "outlines" "org") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/org-recent-headings"))])
- (org-recur . [(20191216 2353) ((emacs (24)) (org (9 0))) "Recurring org-mode tasks" single ((:commit . "ae20a538b2b4dcec139089bb44f1e4abc5b04f72") (:authors ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com")) (:maintainer "Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") (:url . "https://github.com/m-cat/org-recur"))])
- (org-redmine . [(20160711 1114) nil "Redmine tools using Emacs OrgMode" single ((:commit . "e77d013bc3784947c46a5c53f03cd7d3c68552fc") (:keywords "redmine" "org") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:url . "https://github.com/gongo/org-redmine"))])
- (org-ref . [(20200730 2017) ((dash (2 11 0)) (htmlize (1 51)) (helm (1 5 5)) (helm-bibtex (2 0 0)) (ivy (0 8 0)) (hydra (0 13 2)) (key-chord (0)) (s (1 10 0)) (f (0 18 0)) (pdf-tools (0 7))) "citations, cross-references and bibliographies in org-mode" tar ((:commit . "93dcde7b3555507f35b335f06311a64f5ef80ec6") (:keywords "org-mode" "cite" "ref" "label") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:url . "https://github.com/jkitchin/org-ref"))])
- (org-repo-todo . [(20171228 119) nil "Simple repository todo management with org-mode" single ((:commit . "f73ebd91399c5760ad52c6ad9033de1066042003") (:keywords "convenience") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/org-repo-todo"))])
- (org-reverse-datetree . [(20200325 1003) ((emacs (26 1)) (dash (2 12))) "Create reverse date trees in org-mode" single ((:commit . "afac070eb64cc24917c0ab0e14686258da4916f6") (:keywords "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-reverse-datetree"))])
- (org-review . [(20160907 537) nil "schedule reviews for Org entries" single ((:commit . "058e75b7f28d2ad2390290fe17a63d98ef5ab763") (:keywords "org" "review") (:authors ("Alan Schmitt" . "alan.schmitt@polytechnique.org")) (:maintainer "Alan Schmitt" . "alan.schmitt@polytechnique.org") (:url . "https://github.com/brabalan/org-review"))])
- (org-rich-yank . [(20181120 1354) ((emacs (24 4))) "paste with org-mode markup and link to source" single ((:commit . "d2f350c5296cf05d6c84b02762ba44f09a02b4e3") (:keywords "convenience" "hypermedia" "org") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "https://github.com/unhammer/org-rich-yank"))])
- (org-roam . [(20200731 1329) ((emacs (26 1)) (dash (2 13)) (f (0 17 2)) (s (1 12 0)) (org (9 3)) (emacsql (3 0 0)) (emacsql-sqlite3 (1 0 0))) "Roam Research replica with Org-mode" tar ((:commit . "8881c9732be9616756459d188199fabbf5d0f905") (:keywords "org-mode" "roam" "convenience") (:authors ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Jethro Kuan" . "jethrokuan95@gmail.com") (:url . "https://github.com/org-roam/org-roam"))])
- (org-roam-bibtex . [(20200729 2138) ((emacs (26 1)) (org-roam (1 0 0)) (bibtex-completion (2 0 0))) "Org Roam meets BibTeX" tar ((:commit . "d3d01b6720c318ae39474dd572b4caea5398b9c0") (:keywords "org-mode" "roam" "convenience" "bibtex" "helm-bibtex" "ivy-bibtex" "org-ref") (:authors ("Leo Vivier" . "leo.vivier+dev@gmail.com") ("Mykhailo Shevchuk" . "mail@mshevchuk.com") ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Leo Vivier" . "leo.vivier+dev@gmail.com") (:url . "https://github.com/org-roam/org-roam-bibtex"))])
- (org-roam-server . [(20200715 1116) ((org-roam (1 2 0)) (org (9 3)) (emacs (26 1)) (dash (2 17 0)) (simple-httpd (1 5 1)) (s (1 12 0))) "Org Roam Database Visualizer" tar ((:commit . "bfc70327413948fb7e631f4424fb92c3dbdeafc0") (:authors ("Göktuğ Karakaşlı" . "karakasligk@gmail.com")) (:maintainer "Göktuğ Karakaşlı" . "karakasligk@gmail.com") (:url . "https://github.com/goktug97/org-roam-server"))])
- (org-rtm . [(20160214 1236) ((rtm (0 1))) "Simple import/export from rememberthemilk to org-mode" single ((:commit . "adc42ad1fbe92ab447ccc9553780f4456f2508d2") (:keywords "outlines" "data") (:authors ("Philipp Middendorf" . "pmidden@secure.mailbox.org")) (:maintainer "Philipp Middendorf" . "pmidden@secure.mailbox.org") (:url . "https://github.com/pmiddend/org-rtm"))])
- (org-runbook . [(20200523 2004) ((emacs (25 1)) (seq (2 3)) (f (0 20 0)) (s (1 12 0)) (dash (2 17 0)) (mustache (0 24)) (ht (0 9))) "Org mode for runbooks" single ((:commit . "27dafe2a470d54a2c664164b5f9cbd2a1e5d921e") (:keywords "convenience" "processes" "terminals" "files") (:authors ("Tyler Dodge")) (:maintainer "Tyler Dodge") (:url . "https://github.com/tyler-dodge/org-runbook"))])
- (org-scrum . [(20200131 1129) ((emacs (24 5)) (org (8 2)) (seq (2 3)) (cl-lib (1 0))) "org mode extensions for scrum planning and reporting" single ((:commit . "8b5cd196bb37cebd1aa5b02ed189ad7dadd92078") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:url . "https://github.com/ianxm/emacs-scrum"))])
- (org-seek . [(20161217 502) ((emacs (24 3)) (ag (0 48))) "Searching Org-mode files with search tools." single ((:commit . "1f51e6634e3b9a6a29d335d0d14370a6ffef2265") (:keywords "org" "search" "ag" "pt") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:url . "https://github.com/stardiviner/org-seek.el"))])
- (org-shoplist . [(20200603 1515) ((emacs (25))) "Eat the world" single ((:commit . "e1e465ef815500140940c3a247d508b8f7dd09c5") (:keywords "extensions" "matching") (:authors ("lordnik22")) (:maintainer "lordnik22") (:url . "https://github.com/lordnik22"))])
- (org-sidebar . [(20200501 1215) ((emacs (26 1)) (s (1 10 0)) (dash (2 13)) (dash-functional (1 2 0)) (org (9 0)) (org-ql (0 2)) (org-super-agenda (1 0))) "Helpful sidebar for Org buffers" single ((:commit . "6dfa3a2312e8dacc942980e4ab10f1faea922a49") (:keywords "hypermedia" "outlines" "org" "agenda") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/org-sidebar"))])
- (org-snooze . [(20181229 1424) ((emacs (24 4))) "Snooze your code, doc and feed" single ((:commit . "8799adc14a20f3489063d279ff69312de3180bf9") (:keywords "extensions") (:authors ("Bill Xue")) (:maintainer "Bill Xue") (:url . "https://github.com/xueeinstein/org-snooze.el"))])
- (org-special-block-extras . [(20200502 2057) ((s (1 12 0)) (dash (2 16 0)) (emacs (26 1)) (dash-functional (1 2 0)) (org (9 1))) "29 new custom blocks & 34 link types for Org-mode" single ((:commit . "38c3a0a2c2f9b99e0426334c7c6a9320cc6e39a5") (:keywords "org" "blocks" "colors" "convenience") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:url . "https://alhassy.github.io/org-special-block-extras"))])
- (org-sql . [(20200217 2130) ((emacs (25)) (dash (2 15))) "Org-Mode SQL converter" single ((:commit . "9543ad58bc471abf09705d2615c50c1ead90c660") (:keywords "org-mode" "data") (:authors ("Nathan Dwarshuis" . "natedwarshuis@gmail.com")) (:maintainer "Nathan Dwarshuis" . "natedwarshuis@gmail.com") (:url . "https://github.com/ndwarshuis/org-sql"))])
- (org-starter . [(20200321 520) ((emacs (25 1)) (dash (2 12)) (dash-functional (1 2 0))) "A basic configuration framework for org mode" single ((:commit . "5a2c8b5d3048bba50eb0599b3ea69d17464dae06") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-starter"))])
- (org-starter-swiper . [(20190929 646) ((emacs (25 1)) (swiper (0 11)) (org-starter (0 2 4))) "Swiper for org-starter" single ((:commit . "5a2c8b5d3048bba50eb0599b3ea69d17464dae06") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-starter"))])
- (org-static-blog . [(20200720 715) ((emacs (24 3))) "a simple org-mode based static blog generator" single ((:commit . "58019b6dd1ae1323b72d491e65bf9636a9278dd6") (:authors ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "https://github.com/bastibe/org-static-blog"))])
- (org-sticky-header . [(20191117 549) ((emacs (24 4)) (org (8 3 5))) "Show off-screen Org heading at top of window" single ((:commit . "1053ebdeb3bd14fc8d4538643532efb86d18b73c") (:keywords "hypermedia" "outlines" "org") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/org-sticky-header"))])
- (org-super-agenda . [(20200310 1337) ((emacs (26 1)) (s (1 10 0)) (dash (2 13)) (org (9 0)) (ht (2 2)) (ts (0 2))) "Supercharge your agenda" tar ((:commit . "dd0d104c269fab9ebe5af7009bc1dd2a3a8f3c12") (:keywords "hypermedia" "outlines" "org" "agenda") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/org-super-agenda"))])
- (org-superstar . [(20200616 1633) ((org (9 1 9)) (emacs (26 1))) "Prettify headings and plain lists in Org mode" single ((:commit . "17481852c1bd09afea877635a3185261fc19fd64") (:keywords "faces" "outlines") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:url . "https://github.com/integral-dw/org-superstar-mode"))])
- (org-sync . [(20181204 23) ((cl-lib (0 5)) (org (8 2)) (emacs (24))) "Synchronize Org documents with External Issue Trackers" tar ((:commit . "e34a385fa9e658c8341a0a6e6bc3472d4d536bb8") (:keywords "org" "synchronization" "issue tracking" "github" "redmine") (:authors ("Aurelien Aptel <aurelien dot aptel at gmail dot com>")) (:maintainer "Andrei Beliankou" . "arbox@yandex.ru") (:url . "https://github.com/arbox/org-sync"))])
- (org-sync-snippets . [(20190318 1744) ((org (8 3 5)) (emacs (24 3)) (f (0 17 3))) "Export snippets to org-mode and vice versa" single ((:commit . "50cefe5a37196ed1af3d330d6871c3b37fa90d41") (:keywords "snippet" "org-mode" "yasnippet" "tools") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/org-sync-snippets"))])
- (org-table-comment . [(20120209 1851) nil "Org table comment modes." single ((:commit . "33b9966c33ecbc3e27cca67c2f2cdea04364d74e") (:keywords "org-mode" "orgtbl") (:authors ("Matthew L. Fidler <matthew dot fidler at gmail . com>")) (:maintainer "Matthew L. Fidler") (:url . "http://github.com/mlf176f2/org-table-comment.el"))])
- (org-table-sticky-header . [(20190924 506) ((org (8 2 10)) (emacs (24 4))) "Sticky header for org-mode tables" single ((:commit . "b65442857128ab04724aaa301e60aa874a31a798") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (org-tanglesync . [(20200127 1616) ((emacs (24 4))) "Syncing org src blocks with tangled external files" single ((:commit . "af83a73ae542d5cb3c9d433cbf2ce1d4f4259117") (:keywords "outlines") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:url . "https://github.com/mtekman/org-tanglesync.el"))])
- (org-taskforecast . [(20200728 246) ((emacs (26 1)) (dash (2 16 0)) (dash-functional (2 16 0)) (s (1 12 0)) (org-ql (0 4))) "Manage closed task list and forecast time flow with org-mode" single ((:commit . "036da7c14e0defb85917293f00a5fa9ac0977da4") (:keywords "convenience") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/org-taskforecast"))])
- (org-tfl . [(20170923 1218) ((org (0 16 2)) (cl-lib (0 5)) (emacs (24 1))) "Transport for London meets Orgmode" tar ((:commit . "f0d7d39106a1de5457f5160cddd98ab892b61066") (:keywords "org" "tfl") (:authors ("storax (David Zuber), <zuber [dot] david [at] gmx [dot] de>")) (:maintainer "storax (David Zuber), <zuber [dot] david [at] gmx [dot] de>") (:url . "https://github.com/storax/org-tfl"))])
- (org-themis . [(20160122 404) ((cl-lib (0 4))) "Experimental project management mode for org-mode" single ((:commit . "78aadbbe22b1993be5c4accd0d3f91a4e85c9a3c") (:keywords "org-mode" "elisp" "project") (:maintainer "Zachary Elliott" . "contact@zell.io") (:url . "http://github.com/zellio/org-themis"))])
- (org-time-budgets . [(20200715 1016) ((alert (0 5 10)) (cl-lib (0 5))) "Define time budgets and display clocked time." single ((:commit . "1d6bfc323013bbf725167842d9e097fad805de03") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com"))])
- (org-timeline . [(20190612 1759) ((dash (2 13 0)) (emacs (24 3))) "Add graphical view of agenda to agenda buffer." single ((:commit . "f628519a12ce3d534b9aa5043b0273880cf29790") (:keywords "calendar") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/org-timeline/"))])
- (org-toodledo . [(20150301 1113) ((request-deferred (0 2 0)) (emacs (24)) (cl-lib (0 5))) "Toodledo integration for Emacs Org mode" tar ((:commit . "2c91a92bd07ae4a546771b018a6faa0e06399968") (:keywords "outlines" "data") (:authors ("Christopher J. White" . "emacs@grierwhite.com")) (:maintainer "Christopher J. White" . "emacs@grierwhite.com"))])
- (org-tracktable . [(20161118 1329) ((emacs (24)) (cl-lib (0 5))) "Track your writing progress in an org-table" single ((:commit . "8e0e60a582a034bd66d5efb72d513140b7d4d90a") (:keywords "org" "writing") (:authors ("tty-tourist" . "andreasrasholm@protonmail.com")) (:maintainer "tty-tourist" . "andreasrasholm@protonmail.com") (:url . "https://github.com/tty-tourist/org-tracktable"))])
- (org-transform-tree-table . [(20200413 1959) ((dash (2 10 0)) (s (1 3 0))) "Transform org-mode tree with properties to a table, and the other way around" single ((:commit . "d84e7fb87bf2d5fc2be252500de0cddf20facf4f") (:keywords "org-mode" "table" "org-table" "tree" "csv" "convert") (:authors (nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>")) (:maintainer nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>") (:url . "https://github.com/jplindstrom/emacs-org-transform-tree-table"))])
- (org-tree-slide . [(20200611 1143) ((emacs (24 3))) "A presentation tool for org-mode" single ((:commit . "7126a4365072a32898f169ead8fb59265dabc605") (:keywords "convenience" "org-mode" "presentation" "narrowing") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:url . "https://github.com/takaxp/org-tree-slide"))])
- (org-treescope . [(20200503 1609) ((emacs (24 3)) (org (9 2 3)) (org-ql (0 5 -1)) (dash (2 17 0))) "Time scoping sparse trees within org" tar ((:commit . "905029a9e2ce6ed325bb8e10f59dc589c181d148") (:keywords "outlines") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:url . "https://github.com/mtekman/org-treescope.el"))])
- (org-treeusage . [(20200418 1904) ((emacs (26 1)) (dash (2 17 0)) (org (9 1 6))) "Examine the usage of org headings in a tree-like manner" tar ((:commit . "fe4323bc500e2d949848c75e8f59340971b35562") (:keywords "outlines") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:url . "https://github.com/mtekman/org-treeusage.el"))])
- (org-trello . [(20200508 1705) ((request-deferred (0 2 0)) (deferred (0 4 0)) (s (1 11 0)) (dash-functional (2 12 1)) (dash (2 12 1))) "Minor mode to synchronize org-mode buffer and trello board" tar ((:commit . "56c519a00c6e3c8f6923cd0460342089d58c41c9"))])
- (org-variable-pitch . [(20191207 2022) ((emacs (25))) "Minor mode for variable pitch text in org mode." single ((:commit . "61a14d1a8c17930caca5c5daf893cedc9c23c5f3") (:keywords "faces") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:url . "https://dev.gkayaalp.com/elisp/index.html#ovp"))])
- (org-vcard . [(20200720 638) nil "org-mode support for vCard export and import." tar ((:commit . "1ae97371b207dabfecaf6b4f7118abafe6cc5e2b") (:keywords "outlines" "org" "vcard") (:authors ("Alexis" . "flexibeast@gmail.com") ("Will Dey" . "will123dey@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:url . "https://github.com/flexibeast/org-vcard"))])
- (org-wc . [(20200731 529) nil "Count words in org mode trees." single ((:commit . "cc2db5314582f47a4b4f468a020f55d3e465ea6f") (:authors ("Simon Guest")) (:maintainer "Simon Guest"))])
- (org-web-tools . [(20191217 1459) ((emacs (25 1)) (org (9 0)) (dash (2 12)) (esxml (0 3 4)) (s (1 10 0)) (request (0 3 0))) "Display and capture web content with Org-mode" tar ((:commit . "ebc7888f4f4cad26ec1298edd7bf606a5ea2d564") (:keywords "hypermedia" "outlines" "org" "web") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/org-web-tools"))])
- (org-wild-notifier . [(20200328 1153) ((alert (1 2)) (async (1 9 3)) (dash (2 13 0)) (dash-functional (1 2 0)) (emacs (24 4))) "Customizable org-agenda notifications" single ((:commit . "4011d7f557da3ae5eee73c56ae514b963fb4d1c1") (:keywords "notification" "alert" "org" "org-agenda" "agenda") (:authors ("Artem Khramov" . "futu.fata@gmail.com")) (:maintainer "Artem Khramov" . "futu.fata@gmail.com") (:url . "https://github.com/akhramov/org-wild-notifier.el"))])
- (org-working-set . [(20200728 1625) ((org (9 2 6)) (dash (2 12 0)) (s (1 12 0)) (emacs (25 1))) "Manage and visit a small set of org-nodes." single ((:commit . "65c5f3f3eb6b30acb62326959683322365118506") (:authors ("Marc Ihm" . "1@2484.de")) (:maintainer "Marc Ihm" . "1@2484.de") (:url . "https://github.com/marcIhm/org-working-set"))])
- (org-wunderlist . [(20191017 1917) ((request-deferred (0 2 0)) (alert (1 1)) (emacs (24)) (cl-lib (0 5)) (org (8 2 4)) (s (1 9 0))) "Org sync with Wunderlist" single ((:commit . "1a084bb49be4b5a1066db9cd9b7da2f8efab293f") (:keywords "convenience") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/org-wunderlist.el"))])
- (org2blog . [(20200627 301) ((htmlize (1 54)) (hydra (0 15 0)) (xml-rpc (1 6 12)) (metaweblog (1 1 1))) "Blog from Org mode to WordPress" tar ((:commit . "d9a9710585e3f4300b4c0ac1fb11c2ce5030899c") (:homepage . "https://github.com/org2blog/org2blog") (:keywords "comm" "convenience" "outlines" "wp") (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")))])
- (org2ctex . [(20200331 550) ((emacs (24 4))) "Export org to ctex (a latex macro for Chinese)" single ((:commit . "2e40aa5e78b0562516f46f689e7b74cdf451cc2a") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org2ctex"))])
- (org2elcomment . [(20170324 945) ((org (8 3 4))) "Convert Org file to Elisp comments" single ((:commit . "c88a75d9587c484ead18f7adf08592b09c1cceb0") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (org2issue . [(20190531 941) ((org (8 0)) (emacs (24 4)) (ox-gfm (0 1)) (gh (0 1)) (s (20160405 920))) "export org to github issue" single ((:commit . "910b98c858762fd14b11d261626c5e979dde0833") (:keywords "convenience" "github" "org") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/org2issue"))])
- (org2jekyll . [(20200622 1519) ((dash-functional (2 11 0)) (s (1 9 0))) "Minor mode to publish org-mode post to jekyll without specific yaml" tar ((:commit . "571249c977e0340edb3ef3af45b7841b62ec8065") (:keywords "org-mode" "jekyll" "blog" "publish") (:authors ("Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com") (:url . "https://github.com/ardumont/org2jekyll"))])
- (org2web . [(20171005 2317) ((cl-lib (1 0)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (el2org (0 10)) (simple-httpd (0 1))) "A static site generator based on org mode." tar ((:commit . "5243b399927a4c474bb3b8d1c8a00799df1f27d7"))])
- (organic-green-theme . [(20200717 1937) nil "Low-contrast green color theme." single ((:commit . "01fe614086e31e166d2a2f1d6b34e301f060458e"))])
- (organize-imports-java . [(20200717 757) ((emacs (25 1)) (f (0 20 0)) (s (1 12 0))) "Automatically organize imports in Java code" single ((:commit . "c431b338d34c94345217b2b904d9c6f331d4015c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/organize-imports-java"))])
- (orgbox . [(20180827 218) ((org (8 0)) (cl-lib (0 5))) "Mailbox-like task scheduling Org." single ((:commit . "3982f56efd67ec016389cad82ce5a44f619b36a9") (:keywords "org") (:authors ("Yasuhito Takamiya" . "yasuhito@gmail.com")) (:maintainer "Yasuhito Takamiya" . "yasuhito@gmail.com") (:url . "https://github.com/yasuhito/orgbox"))])
- (orgit . [(20200714 1943) ((emacs (25 1)) (magit (2 90 1)) (org (9 3))) "support for Org links to Magit buffers" single ((:commit . "ac9b1a42863a864fde9d225890ef5464bffdc646") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/orgit"))])
- (orgit-forge . [(20200621 2144) ((emacs (25 1)) (forge (0 2 0)) (magit (2 90 1)) (org (9 3)) (orgit (1 6 2))) "Org links to Forge issue buffers" single ((:commit . "63a19d1df1434e583aac1329ba4dcfa2ee59d7c1") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/orgit-forge"))])
- (orglink . [(20200719 917) ((emacs (24 3)) (org (9 3)) (seq (2 20))) "use Org Mode links in other modes" single ((:commit . "2f1939488204f67d2a427f224b45596361b402b1") (:keywords "hypertext") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/orglink"))])
- (orglue . [(20200411 311) ((org (9 3)) (epic (0 2))) "more functionality to org-mode." tar ((:commit . "9d5a8e24be9acb8c55bb4d6aa8b98e30e2677401") (:keywords "org") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))])
- (orgnav . [(20170608 1713) ((helm (2 7 0)) (s (1 11 0)) (dash (1 11 0)) (emacs (24))) "Org tree navigation using helm" tar ((:commit . "9e2cac9c1a67af5f0080e60022e821bf7b70312d") (:keywords "convenience" "outlines") (:authors ("Facet Framer" . "facet@facetframer.com")) (:maintainer "Facet Framer" . "facet@facetframer.com") (:url . "http://github.com/facetframer/orgnav"))])
- (orgtbl-aggregate . [(20200708 2131) nil "Create an aggregated Org table from another one" tar ((:commit . "99c6bc8c9b72dc9ce886a09540ed24ec83bcc056") (:keywords "org" "table" "aggregation" "filtering"))])
- (orgtbl-ascii-plot . [(20200411 711) nil "ascii-art bar plots in org-mode tables" single ((:commit . "59618630205fc8c0fcc74fb34c4581d9712a5181") (:keywords "org" "table" "ascii" "plot") (:authors ("Thierry Banel tbanelwebmin at free dot fr") ("Michael Brand")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr"))])
- (orgtbl-join . [(20200708 2127) ((cl-lib (0 5))) "join columns from another table" tar ((:commit . "1aa352a09a2c543352fceb32a505c44e080efcb3") (:keywords "org" "table" "join" "filtering") (:authors ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr"))])
- (orgtbl-show-header . [(20141023 837) nil "Show the header of the current column in the minibuffer" single ((:commit . "112d54a44682f065318ed0c9c89a8f5b8907342a") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))])
- (origami . [(20200331 1019) ((s (1 9 0)) (dash (2 5 0)) (emacs (24)) (cl-lib (0 5))) "Flexible text folding" tar ((:commit . "e558710a975e8511b9386edc81cd6bdd0a5bda74") (:keywords "folding") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:url . "https://github.com/gregsexton/origami.el"))])
- (origami-predef . [(20200615 1044) ((emacs (24 3)) (origami (1 0))) "Apply folding when finding (opening) files" single ((:commit . "edcba971ba52a14f69a436ad47888827d7927982") (:keywords "convenience" "folding") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:url . "https://github.com/alvarogonzalezsotillo/origami-predef"))])
- (ormolu . [(20200313 1631) ((emacs (24)) (reformatter (0 4))) "Format Haskell source code using the \"ormolu\" program" single ((:commit . "3141f9b65f8a68b4cbd6df4e08c64d98ce3aa3c9") (:keywords "files" "tools") (:authors ("Vasiliy Yorkin" . "vasiliy.yorkin@gmail.com")) (:maintainer "Vasiliy Yorkin") (:url . "https://github.com/vyorkin/ormolu.el"))])
- (osa . [(20200522 2103) ((emacs (25 1))) "OSA (JavaScript / AppleScript) bridge" tar ((:commit . "615ca9eef4131a23d9971691fa0d0f20fe59d01b") (:keywords "extensions") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:url . "https://github.com/atomontage/osa"))])
- (osa-chrome . [(20200627 1344) ((emacs (25 1)) (osa (1 0))) "Google Chrome remote tab control" tar ((:commit . "07894b9cb40171702b4c89b75542af1f1ac1403c") (:keywords "comm") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:url . "https://github.com/atomontage/osa-chrome"))])
- (osx-browse . [(20140508 2041) ((string-utils (0 3 2)) (browse-url-dwim (0 6 6))) "Web browsing helpers for OS X" single ((:commit . "44ded7cc3a7ee426c1c3257fae534c121f7e752e") (:keywords "hypermedia" "external") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/osx-browse"))])
- (osx-clipboard . [(20141012 717) nil "Use the OS X clipboard from terminal Emacs" single ((:commit . "e46dd31327a3f92f77b013b4c9b1e5fdd0e5c73d") (:authors ("Jon Oddie <jonxfield at gmail.com>")) (:maintainer "Jon Oddie <jonxfield at gmail.com>") (:url . "https://github.com/joddie/osx-clipboard-mode"))])
- (osx-dictionary . [(20191206 519) ((cl-lib (0 5))) "Interface for OSX Dictionary.app" tar ((:commit . "1b79ff64c72485cb078db9ab7ee3256b11a99f4b") (:keywords "mac" "dictionary") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/osx-dictionary.el"))])
- (osx-lib . [(20191121 1440) ((emacs (24 4))) "Basic function for Apple/OSX." single ((:commit . "01cba80ccc20412759f87b8f7531580bb04ec9c1") (:keywords "apple" "applescript" "osx" "finder" "emacs" "elisp" "vpn" "speech") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org") (:url . "https://github.com/raghavgautam/osx-lib"))])
- (osx-location . [(20200304 2209) ((emacs (24 1))) "Watch and respond to changes in geographical location on OS X" tar ((:commit . "18fcc306caa575c5afdeaf091aa1a9b003daa52a") (:keywords "convenience" "calendar") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/osx-location"))])
- (osx-org-clock-menubar . [(20150205 2111) nil "simple menubar integration for org-clock" tar ((:commit . "9964d2a97cc2fb6570dc4116da44f73bd8eb7cb3") (:keywords "org" "osx") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:url . "https://github.com/jordonbiondo/osx-org-clock-menubar"))])
- (osx-plist . [(20200212 1724) ((emacs (25 1))) "Apple plist file parser" single ((:commit . "7e717532c78a97eb77b79e2985cea0b201117ff8") (:keywords "convenience") (:authors ("Theresa O'Connor" . "tess@oconnor.cx")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/gonewest818/osx-plist"))])
- (osx-pseudo-daemon . [(20200215 513) nil "Daemon mode that plays nice with OSX." single ((:commit . "703ee41303dc251b7672b7cba5aeb6aa54a76c90") (:keywords "convenience" "osx") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))])
- (osx-trash . [(20160520 1300) ((emacs (24 1))) "System trash for OS X" tar ((:commit . "0f1dc052d0a750b8c75f14530a4897f5d4324b4e") (:keywords "files" "convenience" "tools" "unix") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/lunaryorn/osx-trash.el"))])
- (otama . [(20160404 1032) nil "Org-table Manipulator" single ((:commit . "c114fd8006762f891bc120a7c0ea213872e7ab31") (:keywords "database" "org-mode") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))])
- (other-emacs-eval . [(20180408 1348) ((emacs (25 1)) (async (1 9 2))) "Evaluate the Emacs Lisp expression in other Emacs" single ((:commit . "8ace5acafef65daabf0c6619eff60733d7f5d792") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/other-emacs-eval"))])
- (outline-magic . [(20180619 1819) nil "outline mode extensions for Emacs" single ((:commit . "2a5f07417b696cf7541d435c43bafcc64817636b") (:keywords "outlines") (:authors ("Carsten Dominik" . "dominik@science.uva.nl")) (:maintainer "Thorsten Jolitz <tjolitz AT gmail DOT com>"))])
- (outline-minor-faces . [(20200720 1954) ((emacs (25 1))) "Headings faces for outline-minor-mode" single ((:commit . "cb9c529bb992c6f60b054caf4e993b03c7b3ba9e") (:keywords "outlines") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/bicycle"))])
- (outline-toc . [(20200401 1208) nil "Sidebar showing a \"table of contents\"." single ((:commit . "81d373633b40628cc3a6b6fb534fd7730076bcdb") (:keywords "convenience" "outlines") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/outline-toc.el"))])
- (outlined-elisp-mode . [(20131108 1127) nil "outline-minor-mode settings for emacs lisp" single ((:commit . "c16cb02b540448919ad148f2be6a41523ee5489c") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (outlook . [(20180428 1430) ((emacs (24 4))) "send emails in MS Outlook style" tar ((:commit . "359683aff91b38bd1398a6ed4058a06f09a02d65") (:keywords "mail") (:authors ("Andrew Savonichev")) (:maintainer "Andrew Savonichev") (:url . "https://github.com/asavonic/outlook.el"))])
- (outorg . [(20190720 2002) ((emacs (24 4))) "Org-style comment editing" single ((:commit . "ef0f86f4b893b30be8bcf8b43a5ec357a6c70f07") (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/outorg"))])
- (outrespace . [(20190724 1553) ((emacs (24 4))) "Some c++ namespace utility functions" single ((:commit . "d8c1619ec81fd3f4e728212a3526cd13bc2b0147") (:keywords "tools" "c++" "namespace") (:authors ("Dan Harms" . "danielrharms@gmail.com")) (:maintainer "Dan Harms" . "danielrharms@gmail.com") (:url . "https://github.com/articuluxe/outrespace.git"))])
- (outshine . [(20191112 1414) ((outorg (2 0)) (cl-lib (0 5))) "outline with outshine outshines outline" tar ((:commit . "9334b555aaf1426a9e405a57b80809a1615627b3") (:keywords "convenience" "outlines" "org") (:authors ("Thorsten Jolitz")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:url . "https://github.com/alphapapa/outshine"))])
- (ov . [(20200326 1042) ((emacs (24 3))) "Overlay library for Emacs Lisp" single ((:commit . "c5b9aa4e1b00d702eb2caedd61c69a22a5fa1fab") (:keywords "convenience" "overlay") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:url . "https://github.com/ShingoFukuyama/ov.el"))])
- (overcast-theme . [(20200425 1601) ((emacs (24))) "A dark but vibrant color theme for Emacs" single ((:commit . "e02b835a08919ead079d7221d513348ac02ba92e") (:keywords "theme") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:url . "http://ismail.teamfluxion.com"))])
- (overseer . [(20180226 619) ((emacs (24)) (dash (2 10 0)) (pkg-info (0 4)) (f (0 18 1))) "Ert-runner Integration Into Emacs" single ((:commit . "02d49f582e80e36b4334c9187801c5ecfb027789") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:url . "http://www.github.com/tonini/overseer.el"))])
- (ovpn-mode . [(20200509 236) ((emacs (25)) (cl-lib (0 5))) "an openvpn management mode" single ((:commit . "3fb9b09506f06cfc7678a93b5401f49d2bf538bc") (:keywords "comm") (:authors ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer") (:url . "https://github.com/anticomputer/ovpn-mode"))])
- (owcmd . [(20200517 2039) ((emacs (26 3))) "Run a single command in the other window" single ((:commit . "05fb8f8f81838b5888fdec8b3947096dd2222e61") (:keywords "convenience") (:authors ("Jacob First" . "jacob.first@member.fsf.org")) (:maintainer "Jacob First" . "jacob.first@member.fsf.org") (:url . "https://github.com/fishyfriend/owcmd"))])
- (owdriver . [(20200410 1901) ((smartrep (0 0 3)) (log4e (0 2 0)) (yaxception (0 2 0))) "Quickly perform various actions on other windows" single ((:commit . "3c52a7b11c8275fdb2e4cf98f68f2a48ad09a3ae") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/owdriver"))])
- (ox-asciidoc . [(20181230 620) ((org (8 1))) "AsciiDoc Back-End for Org Export Engine" single ((:commit . "e931362e641f97d17dc738d22bb461e54045786d") (:keywords "org" "asciidoc") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:url . "https://github.com/yashi/org-asciidoc"))])
- (ox-bibtex-chinese . [(20170723 309) ((emacs (24 4))) "Let ox-bibtex work well for Chinese users" tar ((:commit . "2ad2364399229144110db7ef6365ad0461d6a38c"))])
- (ox-clip . [(20191122 237) ((org (8 2)) (htmlize (0))) "Cross-platform formatted copying for org-mode" single ((:commit . "f5eac28734ea33d0b7a3dbe10b777907a91cf9f9") (:keywords "org-mode") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:url . "https://github.com/jkitchin/ox-clip"))])
- (ox-epub . [(20181101 1854) ((emacs (24 3)) (org (9))) "Export org mode projects to EPUB" single ((:commit . "c9629ef4b4bc40d51afefd8c0bb2c683931e6409") (:keywords "hypermedia") (:authors ("Mark Meyer" . "mark@ofosos.org")) (:maintainer "Mark Meyer" . "mark@ofosos.org") (:url . "http://github.com/ofosos/org-epub"))])
- (ox-gfm . [(20170628 2102) nil "Github Flavored Markdown Back-End for Org Export Engine" single ((:commit . "99f93011b069e02b37c9660b8fcb45dab086a07f") (:keywords "org" "wp" "markdown" "github") (:authors ("Lars Tveito")) (:maintainer "Lars Tveito"))])
- (ox-haunt . [(20200202 229) ((emacs (24 3)) (org (9 0))) "Haunt-flavored HTML backend for the Org export engine" single ((:commit . "f3c8fda6fee78f45a259e5d218a519dfd11c00c7") (:keywords "convenience" "hypermedia" "wp") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:url . "https://git.sr.ht/~jakob/ox-haunt"))])
- (ox-html5slide . [(20131228 606) ((org (8 0))) "Export org-mode to HTML5 slide." single ((:commit . "4703dfbd9d79161509def673d2c1e118d722a58f") (:keywords "html" "presentation") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/org-html5slide"))])
- (ox-hugo . [(20200722 1939) ((emacs (24 4)) (org (9 0))) "Hugo Markdown Back-End for Org Export Engine" tar ((:commit . "75b849e9561c4a6022babf6eaf0e037310ded7c1") (:keywords "org" "markdown" "docs") (:url . "https://ox-hugo.scripter.co"))])
- (ox-impress-js . [(20150412 1716) ((org (8))) "impress.js Back-End for Org Export Engine" tar ((:commit . "91c6d2af6af308ade352a03355c4fb551b238c6b") (:keywords "outlines" "hypermedia" "calendar" "wp") (:authors ("Takumi Kinjo <takumi dot kinjo at gmail dot org>")) (:maintainer "Takumi Kinjo <takumi dot kinjo at gmail dot org>") (:url . "https://github.com/kinjo/org-impress-js.el"))])
- (ox-ioslide . [(20161015 1338) ((emacs (24 1)) (org (8 0)) (cl-lib (0 5)) (f (0 17 2)) (makey (0 3))) "Export org-mode to Google I/O HTML5 slide." tar ((:commit . "6555680be5364c8ddd2bf446865cb1a82adb6b9e") (:keywords "html" "presentation") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/org-ioslide"))])
- (ox-jekyll-md . [(20180831 1732) nil "Export Jekyll on Markdown articles using org-mode." single ((:commit . "ff7b81733354c2b427293e531bb51647fa84fc88") (:keywords "org" "jekyll") (:authors ("Elsa Gonsiorowski" . "gonsie@me.com")) (:maintainer "Elsa Gonsiorowski" . "gonsie@me.com"))])
- (ox-jira . [(20200616 2310) ((org (8 3))) "JIRA Backend for Org Export Engine" single ((:commit . "e9a47ef51862f11a5c006cf9e8c5f4ec5517aced") (:keywords "outlines" "hypermedia" "wp") (:authors ("Stig Brautaset" . "stig@brautaset.org")) (:maintainer "Stig Brautaset" . "stig@brautaset.org") (:url . "https://github.com/stig/ox-jira.el"))])
- (ox-json . [(20191225 750) ((emacs (24)) (org (9)) (s (1 12))) "JSON export backend for Org mode" single ((:commit . "8ce0fae6e8b596b93e05dd512be13973cb3cfa54") (:keywords "outlines") (:authors ("Jared Lumpe" . "mjlumpe@gmail.com")) (:maintainer "Jared Lumpe" . "mjlumpe@gmail.com") (:url . "https://github.com/jlumpe/ox-json"))])
- (ox-latex-subfigure . [(20200326 919) ((emacs (24 4)) (org (9 0))) "Subfigure for latex export" single ((:commit . "be0a0dde62fde8cdf8d72b6968344906aa8c6f54") (:keywords "convenience" "ox" "latex" "subfigure" "org" "org-mode") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:url . "http://github.com/linktohack/ox-latex-subfigure"))])
- (ox-leanpub . [(20200609 2017) ((org (9 1)) (ox-gfm (1 0)) (emacs (26 1))) "Export Org documents to Leanpub book format" tar ((:commit . "8512d5a980354106dd21dcd61387fc3f59b20dd9") (:keywords "files" "org" "leanpub") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:url . "https://gitlab.com/zzamboni/ox-leanpub"))])
- (ox-mdx-deck . [(20181115 1847) ((emacs (24)) (ox-hugo (0 7))) "org-mode to mdx-deck exporter" single ((:commit . "2e46ac76f7ac279c371474cbbf39634bbe40f4c7") (:keywords "lisp" "org" "ox" "mdx" "deck") (:authors ("Joshua Wolfe")) (:maintainer "Joshua Wolfe") (:url . "https://github.com/WolfeCub/ox-mdx-deck/"))])
- (ox-mediawiki . [(20180105 2154) ((cl-lib (0 5)) (s (1 9 0))) "Mediawiki Back-End for Org Export Engine" single ((:commit . "a9327150293e370e500ba55bddfe5fc435c6bf9b") (:keywords "org" "wp" "mediawiki") (:authors ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainer "Tom Alexander" . "tomalexander@paphus.com") (:url . "https://github.com/tomalexander/orgmode-mediawiki"))])
- (ox-minutes . [(20180202 1734) ((emacs (24 4))) "Plain text backend for Org for Meeting Minutes" single ((:commit . "27c29f3fdb9181322ae56f8bace8d95e621230e5") (:keywords "org" "exporter" "notes") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:url . "https://github.com/kaushalmodi/ox-minutes"))])
- (ox-nikola . [(20151114 1116) ((emacs (24 4)) (org (8 2 4)) (ox-rst (0 2))) "Export Nikola articles using org-mode." single ((:commit . "5bcbc1a38f6619f62294194f13ca0cd4ca14dd48") (:keywords "org" "nikola") (:authors ("IGARASHI Masanao" . "syoux2@gmail.com")) (:maintainer "IGARASHI Masanao" . "syoux2@gmail.com") (:url . "https://github.com/masayuko/ox-nikola"))])
- (ox-pandoc . [(20180510 1338) ((org (8 2)) (emacs (24)) (dash (2 8)) (ht (2 0)) (cl-lib (0 5))) "org exporter for pandoc." single ((:commit . "aa37dc7e94213d4ebedb85c384c1ba35007da18e") (:keywords "tools") (:authors ("KAWABATA, Taichi" . "kawabata.taichi@gmail.com")) (:maintainer "KAWABATA, Taichi" . "kawabata.taichi@gmail.com") (:url . "https://github.com/kawabata/ox-pandoc"))])
- (ox-pukiwiki . [(20150124 1716) ((org (8 1))) "Pukiwiki Back-End for Org Export Engine" single ((:commit . "bdbde2c294f5d3de11f08a3fe19f01175d2e011a") (:keywords "org" "pukiwiki") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:url . "https://github.com/yashi/org-pukiwiki"))])
- (ox-qmd . [(20200726 747) ((org (8 0))) "Qiita Markdown Back-End for Org Export Engine" single ((:commit . "bfda53bc804c7b8cd624503f5b1cb93b735c6a95") (:keywords "org" "wp" "markdown" "qiita") (:authors ("0x60DF" . "0x60DF@gmail.com")) (:maintainer "0x60DF" . "0x60DF@gmail.com") (:url . "https://github.com/0x60df/ox-qmd"))])
- (ox-reveal . [(20200703 2313) ((org (8 3))) "reveal.js Presentation Back-End for Org Export Engine" single ((:commit . "6a00388d8555f830be4bd6102dbe10eda699381b") (:keywords "outlines" "hypermedia" "slideshow" "presentation") (:authors ("Yujie Wen <yjwen.ty at gmail dot com>")) (:maintainer "Yujie Wen <yjwen.ty at gmail dot com>"))])
- (ox-rfc . [(20190926 851) ((emacs (24 3)) (org (8 3))) "RFC Back-End for Org Export Engine" tar ((:commit . "b86c9e6f21d99ea657b4f2224f816300485ed73f") (:keywords "org" "rfc" "wp" "xml") (:authors ("Christian Hopps" . "chopps@devhopps.com")) (:maintainer "Christian Hopps" . "chopps@devhopps.com") (:url . "https://github.com/choppsv1/org-rfc-export"))])
- (ox-rst . [(20191013 551) ((emacs (25 1)) (org (8 3))) "Export reStructuredText using org-mode." single ((:commit . "9158bfd18096c559e0a225ae62ab683f1c98a547") (:keywords "org" "rst" "rest" "restructuredtext") (:authors ("Masanao Igarashi" . "syoux2@gmail.com")) (:maintainer "Masanao Igarashi" . "syoux2@gmail.com") (:url . "https://github.com/msnoigrs/ox-rst"))])
- (ox-slack . [(20200108 1546) ((emacs (24)) (org (9 1 4)) (ox-gfm (1 0))) "Slack Exporter for org-mode" single ((:commit . "89cedb9da6ea08b78bc1fe77d6a39aa078172c1e") (:keywords "org" "slack" "outlines") (:authors ("Matt Price")) (:maintainer "Matt Price") (:url . "https://github.com/titaniumbones/ox-slack"))])
- (ox-slimhtml . [(20200302 728) ((emacs (24)) (cl-lib (0 6))) "a minimal HTML org export backend" single ((:commit . "6f774398d189430593c93e503bf0f3cd0e8bcc25") (:keywords "files") (:authors ("Elo Laszlo <hello at bald dot cat>")) (:maintainer "Elo Laszlo <hello at bald dot cat>") (:url . "http://bald.cat/slimhtml"))])
- (ox-spectacle . [(20181211 953) ((org (8 3))) "spectacle.js Presentation Back-End for Org Export Engine" single ((:commit . "9d3ec9a6326289074d8620e97d65e3105307ff51") (:keywords "presentation") (:authors ("imfine" . "lorniu@gmail.com")) (:maintainer "imfine" . "lorniu@gmail.com"))])
- (ox-textile . [(20180502 947) ((org (8 1))) "Textile Back-End for Org Export Engine" single ((:commit . "b179abaa6616604c6efe32cb509e62ad46e7374e") (:keywords "org" "textile") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:url . "https://github.com/yashi/org-textile"))])
- (ox-tiddly . [(20180626 2052) ((org (8)) (cl-lib (0 5))) "org TiddlyWiki exporter" single ((:commit . "99d0c25d56dbf75ce894a84e776ba4459208dbc2") (:keywords "org") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:url . "https://github.com/dfeich/org8-wikiexporters"))])
- (ox-trac . [(20171026 1823) ((org (9 0))) "Org Export Backend to Trac WikiFormat" single ((:commit . "03cc31efb1aa06991918f1071e250a9d58f96cfb") (:keywords "org-mode" "trac") (:authors ("Brian J. Carlson <hacker (at) abutilize (dot) com>")) (:maintainer "Brian J. Carlson <hacker (at) abutilize (dot) com>") (:url . "https://github.com/JalapenoGremlin/ox-trac"))])
- (ox-tufte . [(20160926 1607) ((org (8 2)) (emacs (24))) "Tufte HTML org-mode export backend" single ((:commit . "49d7ea78fde063b407ce6fa57739f90c83500682") (:keywords "org" "tufte" "html") (:authors ("M. Lee Hinman")) (:maintainer "M. Lee Hinman") (:url . "https://github.com/dakrone/ox-tufte"))])
- (ox-twbs . [(20200628 1949) nil "Bootstrap compatible HTML Back-End for Org" single ((:commit . "e8a27dc78b7be494d9918f26db7a3bbb6b45020b") (:keywords "org" "html" "publish" "twitter" "bootstrap") (:authors ("Carsten Dominik <carsten at orgmode dot org>") ("Jambunathan K <kjambunathan at gmail dot com>") ("Brandon van Beekum <marsmining at gmail dot com>")) (:maintainer "Carsten Dominik <carsten at orgmode dot org>") (:url . "https://github.com/marsmining/ox-twbs"))])
- (ox-twiki . [(20170803 2039) ((org (8)) (cl-lib (0 5))) "org Twiki and Foswiki export" single ((:commit . "99d0c25d56dbf75ce894a84e776ba4459208dbc2") (:keywords "org") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:url . "https://github.com/dfeich/org8-wikiexporters"))])
- (ox-wk . [(20191231 2058) ((emacs (24 4)) (org (8 3))) "Wiki Back-End for Org Export Engine" single ((:commit . "d34d1b72e4e940745a377bfa745dfb618900a09e") (:keywords "org" "wp" "wiki") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz") (:url . "https://github.com/w-vi/ox-wk.el"))])
- (p4 . [(20150721 1937) nil "Simple Perforce-Emacs Integration" single ((:commit . "eff047caa75dbe4965defca9d1212454cdb755d5") (:authors ("Gareth Rees" . "gdr@garethrees.org")) (:maintainer "Gareth Rees" . "gdr@garethrees.org") (:url . "https://github.com/gareth-rees/p4.el"))])
- (pabbrev . [(20160320 2101) nil "Predictive abbreviation expansion" single ((:commit . "56400d5d256b42ffe45c229ea9827f026b650cf5") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))])
- (pacfiles-mode . [(20200418 1806) ((emacs (26)) (cl-lib (0 5))) "pacnew and pacsave merging tool" tar ((:commit . "222ae3f540cddee306067c83451cfece1112c09e") (:keywords "files" "pacman" "arch" "pacnew" "pacsave" "update" "linux") (:authors ("Carlos G. Cordero <http://github/UndeadKernel>")) (:maintainer "Carlos G. Cordero" . "pacfiles@binarycharly.com") (:url . "https://github.com/UndeadKernel/pacfiles-mode"))])
- (pack . [(20191017 456) ((emacs (24)) (cl-lib (0 5))) "Pack and unpack archive files" single ((:commit . "85cd856fdc00a2365e88b50373b99f1b3d2227be") (:keywords "files" "dired") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:url . "https://github.com/10sr/pack-el"))])
- (package+ . [(20190702 253) ((emacs (24 3))) "Extensions for the package library." single ((:commit . "3d108ff6af00d2fe978787217a13660af057cafc") (:keywords "extensions" "tools") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:url . "https://github.com/zenspider/package"))])
- (package-build . [(20200601 1939) ((cl-lib (0 5)) (emacs (24 1))) "Tools for assembling a package archive" tar ((:commit . "4cb0f98a21729f9ef0189f095384555c9d2b6fe4") (:keywords "tools") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/melpa/package-build"))])
- (package-filter . [(20161122 719) nil "package archive whitelist and blacklist" single ((:commit . "bc73b41aea1d65ca44ef1593ca13126df9bbb39e") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/milkypostman/package-filter"))])
- (package-lint . [(20200616 2257) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "ff88d39dc47b4dd86e9d35614d8b5e227220339c") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/package-lint"))])
- (package-lint-flymake . [(20191116 45) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" single ((:commit . "ff88d39dc47b4dd86e9d35614d8b5e227220339c") (:url . "https://github.com/purcell/package-lint"))])
- (package-safe-delete . [(20150116 1607) ((emacs (24)) (epl (0 7 -4))) "Safely delete package.el packages" single ((:commit . "138171e4fc03c0ef05a8260cbb5cd2e114c1c194") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/package-safe-delete"))])
- (package-utils . [(20180514 1415) ((restart-emacs (0 1 1))) "Extensions for package.el" single ((:commit . "5621b95c56b55499f0463fd8b29501da25d861bd") (:keywords "package" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/package-utils"))])
- (packed . [(20180318 1729) ((emacs (24 3))) "package manager agnostic Emacs Lisp package utilities" single ((:commit . "c41c3dfda86ae33832ffc146923e2a4675cbacfa") (:keywords "compile" "convenience" "lisp" "package" "library") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/packed"))])
- (pacmacs . [(20160131 832) ((emacs (24 4)) (dash (2 11 0)) (dash-functional (1 2 0)) (cl-lib (0 5)) (f (0 18 0))) "Pacman for Emacs" tar ((:commit . "d813e9c62c2540fe619234824fc60e128c786442") (:authors ("Codingteam" . "codingteam@conference.jabber.ru")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/codingteam/pacmacs.el"))])
- (pact-mode . [(20191117 2337) ((emacs (24 3))) "Mode for Pact, a LISPlike smart contract language." single ((:commit . "220bf985cb31d60f47042d5f424de8b9a589e544") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "mode") (:authors ("Stuart Popejoy")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io") (:url . "https://github.com/kadena-io/pact-mode"))])
- (paganini-theme . [(20180815 1921) ((emacs (24 0))) "A colorful, dark and warm theme." single ((:commit . "255c5a2a8abee9c5935465ec42b9c3604c178c3c") (:authors ("Onur Temizkan")) (:maintainer "Onur Temizkan") (:url . "https://github.com/onurtemizkan/paganini"))])
- (page-break-lines . [(20200305 244) ((emacs (24 4))) "Display ^L page breaks as tidy horizontal lines" single ((:commit . "314b397910b3d16bb7cbcc25098696348e678080") (:keywords "convenience" "faces") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/page-break-lines"))])
- (pager . [(20151202 120) nil "windows-scroll commands" single ((:commit . "5c791ed23f1136e04040d6f4bc9b4ca5b6dc919f") (:authors (nil . "Mikael Sjödin -- mic@docs.uu.se")) (:maintainer nil . "Mikael Sjödin -- mic@docs.uu.se"))])
- (pager-default-keybindings . [(20130719 2057) ((pager (1 0))) "Add the default keybindings suggested for pager.el" single ((:commit . "dbbd49c2ac5906d1dabf9e9c832bfebc1ab405b3") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/pager-default-keybindings"))])
- (palimpsest . [(20200211 641) nil "Various deletion strategies when editing" single ((:commit . "389ec5b4c5067fa903c543b7fe1d804f30b6ced5") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))])
- (pallet . [(20150512 702) ((dash (2 10 0)) (s (1 9 0)) (f (0 17 1)) (cask (0 7))) "A package management tool for Emacs, using Cask." tar ((:commit . "b8d0df1883224a371ac0a3bc9b9c1c4dc61e6ac0"))])
- (pamparam . [(20200410 1155) ((emacs (24 3)) (lispy (0 26 0)) (worf (0 1 0)) (hydra (0 13 4))) "Simple and fast flashcards." tar ((:commit . "f9d83bbf5eb883bce6873dd6fd97484b6805215c") (:keywords "outlines" "hypermedia" "flashcards" "memory") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/pamparam"))])
- (panda . [(20200715 338) ((emacs (25))) "Client for Bamboo's REST API." single ((:commit . "6508ac3228975c39d10a1caa70b9ce34ff3ed21d") (:keywords "maint" "tool") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:url . "https://github.com/sebasmonia/panda"))])
- (panda-theme . [(20181128 1738) ((emacs (24))) "Panda Theme" single ((:commit . "60aa47c7a930377807da0d601351ad91e8ca446a") (:authors ("jamiecollinson" . "jamiecollinson@gmail.com")) (:maintainer "jamiecollinson" . "jamiecollinson@gmail.com") (:url . "https://github.com/jamiecollinson/emacs-panda-theme"))])
- (pandoc . [(20161128 1157) ((emacs (24 4))) "Pandoc interface" single ((:commit . "198d262d09e30448f1672338b0b5a81cf75e1eaa") (:keywords "hypermedia" "documentation" "markup" "converter") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/pandoc.el"))])
- (pandoc-mode . [(20200303 2322) ((hydra (0 10 0)) (dash (2 10 0))) "Minor mode for interacting with Pandoc" tar ((:commit . "befd7be704d6dbe3dba69da761fc62e0609c9366") (:keywords "text" "pandoc") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "http://joostkremers.github.io/pandoc-mode/"))])
- (pangu-spacing . [(20190823 401) nil "Minor-mode to add space between Chinese and English characters." single ((:commit . "f92898949ba3bf991fd229416f3bbb54e9c6c223") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/pangu-spacing"))])
- (paper-theme . [(20200510 5) ((emacs (24))) "A minimal Emacs colour theme." single ((:commit . "61a14d1a8c17930caca5c5daf893cedc9c23c5f3") (:keywords "theme" "paper") (:authors ("Göktuğ Kayaalp")) (:maintainer "Göktuğ Kayaalp") (:url . "https://dev.gkayaalp.com/elisp/index.html#paper"))])
- (paperless . [(20180224 1245) ((emacs (24 4)) (f (0 11 0)) (s (1 10 0)) (cl-lib (0 6 1))) "A major mode for sorting and filing PDF documents." tar ((:commit . "b3b6c05da393f6b1292a3d5937bc4499baabd0b6") (:keywords "pdf" "convenience") (:authors ("Anthony Green" . "green@moxielogic.com")) (:maintainer "Anthony Green" . "green@moxielogic.com") (:url . "http://github.com/atgreen/paperless"))])
- (paradox . [(20191011 1111) ((emacs (24 4)) (seq (1 7)) (let-alist (1 0 3)) (spinner (1 7 3)) (hydra (0 13 2))) "A modern Packages Menu. Colored, with package ratings, and customizable." tar ((:commit . "339fe3518d1d102b2295670340e75caf4f01a29a") (:keywords "package" "packages") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/paradox"))])
- (parchment-theme . [(20200514 2047) ((autothemer (0 2))) "Light theme inspired by Acme and Leuven" single ((:commit . "eff75ab5a6ec28e8280aae3f1e4c50fdb71e976a") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com") (:url . "https://github.com/ajgrf/parchment"))])
- (paredit . [(20191121 2328) nil "minor mode for editing parentheses" single ((:commit . "8330a41e8188fe18d3fa805bb9aa529f015318e8") (:keywords "lisp") (:authors ("Taylor R. Campbell" . "campbell+paredit@mumble.net")) (:maintainer "Taylor R. Campbell" . "campbell+paredit@mumble.net"))])
- (paredit-everywhere . [(20180506 849) ((paredit (22))) "Enable some paredit features in non-lisp buffers" single ((:commit . "f04c522e6b088a11255a95cb1e6a08198b4d6537") (:keywords "languages" "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (paredit-menu . [(20160128 1733) ((paredit (25))) "Adds a menu to paredit.el as memory aid" single ((:commit . "cc0ae85bd819f9ebfa4f2a419ab3b2d70e39c9c8") (:keywords "paredit") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))])
- (paren-completer . [(20160501 1052) ((emacs (24 3))) "Automatically, language agnostically, fill in delimiters." single ((:commit . "74183a8e13fa1266271bdcbcb4bfb29a4f915f0a") (:keywords "convenience") (:authors ("Matthew Bregg")) (:maintainer "Matthew Bregg") (:url . "https://github.com/MatthewBregg/paren-completer"))])
- (paren-face . [(20200103 1238) nil "a face for parentheses in lisp modes" single ((:commit . "eb4a51b8ef455e0914108105e7c0008d675457cc") (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/paren-face"))])
- (parent-mode . [(20150824 2300) nil "get major mode's parent modes" single ((:commit . "db692cf08deff2f0e973e6e86e26662b44813d1b") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/parent-mode"))])
- (parinfer . [(20180904 844) ((dash (2 13 0)) (cl-lib (0 5))) "Simpler Lisp editing" tar ((:commit . "eaad857ae4351f72a561ee3dec8943713510003f") (:keywords "parinfer") (:authors ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:url . "https://github.com/DogLooksGood/parinfer-mode"))])
- (parinfer-rust-mode . [(20200726 2320) ((emacs (26 1))) "An interface for the parinfer-rust library" tar ((:commit . "49324eaca8028fd7f3f8e85ecfc158a8a7dd66bf") (:keywords "lisp" "tools") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com") (:url . "https://github.com/justinbarclay/parinfer-rust-mode"))])
- (parrot . [(20191015 2127) ((emacs (24 1))) "Party Parrot rotates gracefully in mode-line." tar ((:commit . "29265d118267e524453aaa9121c4eae213a63164") (:keywords "party" "parrot" "rotate" "sirocco" "kakapo" "games") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com") (:url . "https://github.com/dp12/parrot.git"))])
- (parse-csv . [(20160512 1723) nil "Parse strings with CSV fields into s-expressions" single ((:commit . "96bef1ffbc89ea12d13311c9fa239c5c3e864890") (:keywords "csv") (:authors ("Edward Marco Baringer (Common Lisp)") ("Matt Curtis" . "matt.r.curtis@gmail.com")) (:maintainer "Matt Curtis" . "matt.r.curtis@gmail.com") (:url . "https://github.com/mrc/el-csv"))])
- (parse-it . [(20200720 1047) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "abf2b7528ea2ec5c45f99664a6ab9509ccd954f3") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/parse-it"))])
- (parsebib . [(20200513 2352) ((emacs (24 3))) "A library for parsing bib files" single ((:commit . "3497b6068d78ae15ba1eaf94e4315d18e9ae6b00") (:keywords "text" "bibtex") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://github.com/joostkremers/parsebib"))])
- (parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" single ((:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:url . "https://github.com/cute-jumper/parsec.el"))])
- (parseclj . [(20190531 711) ((emacs (25)) (a (0 1 0 -3 4))) "Clojure/EDN parser" tar ((:commit . "b34d3e13a249d4b92f1a008cdc1df20a92f866c5") (:keywords "lisp" "clojure" "edn" "parser") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))])
- (parseedn . [(20200419 1124) ((emacs (25)) (a (0 1 0 -3 4)) (parseclj (0 1 0))) "Clojure/EDN parser" single ((:commit . "92bf875962e62f8c6370b56991d546f122536c6b") (:keywords "lisp" "clojure" "edn" "parser") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))])
- (pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs." single ((:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com") (:url . "https://github.com/santifa/pasp-mode"))])
- (pass . [(20190830 2017) ((emacs (25)) (password-store (2 1 0)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" single ((:commit . "919d8e3826d556433ab67d4ee21a509d209d1baa") (:keywords "password-store" "password" "keychain") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (passmm . [(20181130 1612) ((emacs (24 4)) (password-store (0))) "A minor mode for pass (Password Store)." single ((:commit . "b25a92048c788a8477cc5ffe14c0c4a4df19d79a") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/passmm"))])
- (password-generator . [(20150222 2040) nil "Password generator for humans. Good, Bad, Phonetic passwords included." single ((:commit . "904cdb591a04305ba882ce19e1d117f5fa60f7d3") (:authors ("Zargener" . "zargener@gmail.com")) (:maintainer "Zargener" . "zargener@gmail.com") (:url . "http://github.com/zargener/emacs-password-genarator"))])
- (password-mode . [(20170412 629) nil "Hide password text using overlays" single ((:commit . "ed764a4ec1011526457c71b7c37fa9a659a866ab") (:keywords "docs" "password" "passphrase") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org"))])
- (password-store . [(20200328 1214) ((emacs (25)) (s (1 9 0)) (with-editor (2 5 11)) (auth-source-pass (5 0 0))) "Password store (pass) support" single ((:commit . "06f499994071bb6131244218b25d637103afe1d5") (:keywords "tools" "pass" "password" "password-store") (:authors ("Svend Sorensen" . "svend@svends.net")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:url . "https://www.passwordstore.org/"))])
- (password-store-otp . [(20190713 1748) ((emacs (25)) (s (1 9 0)) (password-store (0 1))) "Password store (pass) OTP extension support" single ((:commit . "04998c8578a060ab4a4e8f46f2ee0aafad4ab4d5") (:keywords "tools" "pass") (:authors ("Daniel Barreto")) (:maintainer "Daniel Barreto") (:url . "https://github.com/volrath/password-store-otp.el"))])
- (password-vault . [(20160126 1820) ((cl-lib (0 2)) (emacs (24))) "A Password manager for Emacs." single ((:commit . "dc56e6c2f5da66f1ab63736cecf08fb2c6c2b30f") (:keywords "password" "productivity") (:authors ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com")) (:maintainer "Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") (:url . "http://github.com/PuercoPop/password-vault"))])
- (paste-of-code . [(20170709 2355) ((emacs (24 3)) (request (0 2 0))) "paste code on https://paste.ofcode.org" single ((:commit . "92d258e8ec98598d847ecab82903f9224c7c2050") (:keywords "lisp") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net"))])
- (pastebin . [(20101125 2002) nil "A simple interface to the www.pastebin.com webservice" single ((:commit . "8e9a829298ce0f747ab80758aa26caeb2af6cb30"))])
- (pastehub . [(20140615 620) nil "A client for the PasteHub cloud service" single ((:commit . "37b045c67659c078f1517d0fbd5282dab58dca23") (:authors ("Kiyoka Nishiyama")) (:maintainer "Kiyoka Nishiyama") (:url . "https://github.com/kiyoka/pastehub"))])
- (pastelmac-theme . [(20151031 236) ((emacs (24 1))) "a soothing theme with a pastel color palette" single ((:commit . "bead21741e3f46f6506e8aef4469d4240a819389") (:keywords "themes") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:url . "https://github.com/bmastenbrook/pastelmac-theme-el"))])
- (pastery . [(20171114 349) ((emacs (24 4)) (request (0 2 0))) "paste snippets to pastery.net." tar ((:commit . "4493be98b743b4d062cb4e00760125e394a55022") (:keywords "tools") (:authors ("Bruno Dias" . "dias.h.bruno@gmail.com")) (:maintainer "Bruno Dias" . "dias.h.bruno@gmail.com") (:url . "https://github.com/diasbruno/pastery.el"))])
- (path-headerline-mode . [(20140423 1332) nil "Displaying file path on headerline." single ((:commit . "b5b2725c6a8b1cb592fc242b7dbbd54b4dff2e69") (:keywords "headerline") (:authors ("7696122")) (:maintainer "7696122") (:url . "https://github.com/7696122/path-headerline-mode"))])
- (path-helper . [(20181208 2229) ((emacs (24))) "Set PATH environment variables from config files" single ((:commit . "34538affb3f341b3c56a875bb094ddb2b859a8ef") (:keywords "tools" "unix") (:authors ("Arnaud Rouanet" . "arnaud@rouanet.org")) (:maintainer "Arnaud Rouanet" . "arnaud@rouanet.org") (:url . "https://github.com/arouanet/path-helper"))])
- (pathify . [(20160423 846) nil "Symlink your scripts into a PATH directory" single ((:commit . "401b184c743694a60b3bc4273fc43de05cd5ac4b") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://gitlab.com/alezost-emacs/pathify"))])
- (paxedit . [(20160730 1727) ((cl-lib (0 5)) (paredit (23))) "Structured, Context Driven LISP Editing and Refactoring" single ((:commit . "09f3d5aeb108937a801e77ef413e29eaa4ecc4be") (:keywords "lisp" "refactoring" "context") (:authors ("Mustafa Shameem")) (:maintainer "Mustafa Shameem") (:url . "https://github.com/promethial/paxedit"))])
- (pbcopy . [(20150225 459) nil "Emacs Interface to pbcopy" single ((:commit . "338f7245746b5de1bb96c5cc2b32bfd9b5d83272") (:keywords "mac" "osx" "pbcopy") (:authors ("Daniel Nelson")) (:maintainer "Daniel Nelson") (:url . "https://github.com/jkp/pbcopy.el"))])
- (pc-bufsw . [(20191014 848) nil "PC style quick buffer switcher" single ((:commit . "a7c7bba4b7d511eceaaa8fee34d598296402555b") (:keywords "buffer") (:authors ("Igor Bukanov" . "igor@mir2.org")) (:maintainer "Igor Bukanov" . "igor@mir2.org") (:url . "https://github.com/ibukanov/pc-bufsw"))])
- (pcache . [(20170105 2214) ((eieio (1 3))) "persistent caching for Emacs." single ((:commit . "1f31433ad0b37a2e68d60ee043a8188ef1ce3176") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))])
- (pcap-mode . [(20161025 1448) ((emacs (24 3))) "Major mode for working with PCAP files" single ((:commit . "52780669af0ade136f84d73f21b4dbb7ab655416") (:keywords "pcap" "packets" "tcpdump" "wireshark" "tshark") (:authors ("Aaron Conole" . "aconole@bytheb.org")) (:maintainer "Aaron Conole" . "aconole@bytheb.org"))])
- (pcmpl-args . [(20190223 1613) nil "Enhanced shell command completion" single ((:commit . "0b8a05fc6e370fa9c466250659619f8d6b53d446") (:keywords "abbrev" "completion" "convenience" "processes" "terminals" "unix") (:authors ("Jonathan Waltman" . "jonathan.waltman@gmail.com")) (:maintainer "Jonathan Waltman" . "jonathan.waltman@gmail.com") (:url . "https://github.com/JonWaltman/pcmpl-args.el"))])
- (pcmpl-git . [(20170121 59) nil "pcomplete for git" tar ((:commit . "9472ac70baeda025ef7becd1cf141d72aec93f32") (:keywords "tools") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com"))])
- (pcmpl-homebrew . [(20190213 318) nil "pcomplete for homebrew" single ((:commit . "39f2e8faf4d866410a625bbcf88f2504940c8982") (:keywords "pcomplete" "homebrew" "tools" "cask" "services") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com"))])
- (pcmpl-pip . [(20181229 1420) ((s (1 12 0)) (f (0 19 0)) (seq (2 15))) "pcomplete for pip" single ((:commit . "bc79228674ad5c1bc458c90dd8839790fb0a09e8") (:keywords "pcomplete" "pip" "python" "tools") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com"))])
- (pcomplete-extension . [(20190928 519) ((emacs (24)) (cl-lib (0 5))) "additional completion for pcomplete" single ((:commit . "bc5eb204fee659e0980056009409b44bc7655716") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/pcomplete-extension"))])
- (pcre2el . [(20161120 2103) ((emacs (24)) (cl-lib (0 3))) "regexp syntax converter" single ((:commit . "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d") (:authors ("joddie <jonxfield at gmail.com>")) (:maintainer "joddie <jonxfield at gmail.com>") (:url . "https://github.com/joddie/pcre2el"))])
- (pcsv . [(20150220 1131) nil "Parser of csv" single ((:commit . "798e0933f8d0818beb17aebf3b1056bbf74e03d0") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-pcsv/raw/master/pcsv.el"))])
- (pdb-capf . [(20200419 1237) ((emacs (25 1))) "Completion-at-point function for python debugger" single ((:commit . "2f4099aa1330f87df4e9cd526de057ee9b71de6c") (:keywords "languages" "abbrev" "convenience") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:url . "https://github.com/muffinmad/emacs-pdb-capf"))])
- (pdb-mode . [(20150128 1751) nil "Major mode for editing Protein Data Bank files" single ((:commit . "855fb18ebb73b5df30c8d7677c2bcd0f361b138a") (:keywords "data" "pdb") (:authors (nil . "charles.bond@uwa.edu.au")) (:maintainer nil . "aix.bing@gmail.com") (:url . "http://bondxray.org/software/pdb-mode/"))])
- (pdf-tools . [(20200512 1524) ((emacs (24 3)) (tablist (1 0)) (let-alist (1 0 4))) "Support library for PDF documents." tar ((:commit . "c510442ab89c8a9e9881230eeb364f4663f59e76") (:keywords "files" "multimedia") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de"))])
- (pdf-view-restore . [(20190904 1708) ((pdf-tools (0 90)) (emacs (26 0))) "Support for opening last known pdf position in pdfview mode" single ((:commit . "5a1947c01a3edecc9e0fe7629041a2f53e0610c9") (:keywords "files" "convenience") (:authors ("Kevin Kim" . "kevinkim1991@gmail.com")) (:maintainer "Kevin Kim" . "kevinkim1991@gmail.com") (:url . "https://github.com/007kevin/pdf-view-restore"))])
- (pdfgrep . [(20200306 209) ((emacs (24 4))) "run `pdfgrep' and display the results." single ((:commit . "1576fc98754d3bdaa40573a037a80f1973110756") (:keywords "extensions" "mail" "pdf" "grep") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:url . "https://github.com/jeremy-compostella/pdfgrep"))])
- (peacock-theme . [(20170808 1320) ((emacs (24 0))) "an Emacs 24 theme based on Peacock (tmTheme)" single ((:commit . "9e46fbfb562b6e26c6e3d6d618b044b3694da4c8") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (peek-mode . [(20130620 1946) ((elnode (0 9 8 1))) "Serve buffers live over HTTP with elnode backend" tar ((:commit . "55a7dd011375330c7d57322257a5167516702c71") (:authors ("Erik Iverson" . "erik@sigmafield.org")) (:maintainer "Erik Iverson" . "erik@sigmafield.org") (:url . "https://github.com/erikriverson/peek-mode"))])
- (peep-dired . [(20160321 2237) nil "Peep at files in another window from dired buffers" single ((:commit . "1d410a4e48db07a942e54d3b83a85c7a7ec0aab3") (:keywords "files" "convenience") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com"))])
- (pelican-mode . [(20190124 2336) ((emacs (25))) "Minor mode for editing Pelican sites" single ((:commit . "65d7caf5d926599a5007eb7bc279215908aa5252") (:keywords "convenience" "editing") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:url . "https://git.korewanetadesu.com/pelican-mode.git"))])
- (pepita . [(20200228 2257) ((emacs (25)) (csv (2 1))) "Run Splunk search commands, export results to CSV/HTML/JSON" single ((:commit . "263d6d940d7e4203bbecda46dbaa89b7af1db54f") (:keywords "tools" "convenience" "matching") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:url . "https://github.com/sebasmonia/pepita.git"))])
- (per-buffer-theme . [(20200527 1256) nil "No description available." single ((:commit . "f29b5c57198ebfedbf142f95129190c6c00b4822"))])
- (perfect-margin . [(20190722 126) ((emacs (24 0)) (cl-lib (0 5))) "auto center windows, work with minimap and/or linum-mode" single ((:commit . "94b055c743b1859098870c8aca3e915bd6e67d9d") (:keywords "convenience" "frames") (:authors ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainer "Randall Wang" . "randall.wjz@gmail.com") (:url . "https://github.com/mpwang/perfect-margin"))])
- (perlbrew . [(20161109 709) nil "A perlbrew wrapper for Emacs" single ((:commit . "3a3406c3307c92aa30f9400d430925c434a3b6f0") (:keywords "emacs" "perl") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com"))])
- (persistent-overlays . [(20161128 700) nil "Minor mode to store selected overlays to be loaded later" tar ((:commit . "f563c8b966edc78c9d806661c4eb80e4781c4eab") (:keywords "overlays" "persistent") (:authors ("Michael Neilly" . "mneilly@yahoo.com")) (:maintainer "Michael Neilly" . "mneilly@yahoo.com") (:url . "https://github.com/mneilly/Emacs-Persistent-Overlays"))])
- (persistent-scratch . [(20190922 1046) ((emacs (24))) "Preserve the scratch buffer across Emacs sessions" single ((:commit . "fd690e138459e0b490f1fda469811a9cbcb34df7") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/persistent-scratch"))])
- (persistent-soft . [(20150223 1853) ((pcache (0 3 1)) (list-utils (0 4 2))) "Persistent storage, returning nil on failure" single ((:commit . "a1e0ddf2a12a6f18cab565dee250f070384cbe02") (:keywords "data" "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/persistent-soft"))])
- (persp-fr . [(20191108 754) ((emacs (25 1)) (persp-mode (2 9 6)) (dash (2 13 0))) "In persp-mode, show perspective list in the GUI window title" single ((:commit . "1adbb6a9f9a4db580a9b7ed8b4091738e01345e6") (:keywords "perspectives" "workspace" "windows" "convenience") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://github.com/rocher/persp-fr"))])
- (persp-mode . [(20200617 2154) ((emacs (24 3))) "windows/buffers sets shared among frames + save/load." single ((:commit . "14325c11f7a347717d7c3780f29b24a38c68fbfc") (:keywords "perspectives" "session" "workspace" "persistence" "windows" "buffers" "convenience") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:url . "https://github.com/Bad-ptr/persp-mode.el"))])
- (persp-mode-projectile-bridge . [(20170315 1120) ((persp-mode (2 9)) (projectile (0 13 0)) (cl-lib (0 5))) "persp-mode + projectile integration." single ((:commit . "f6453cd7b8b4352c06e771706f2c5b7e2cdff1ce") (:keywords "persp-mode" "projectile") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:url . "https://github.com/Bad-ptr/persp-mode-projectile-bridge.el"))])
- (persp-projectile . [(20180616 1944) ((perspective (1 9)) (projectile (0 11 0)) (cl-lib (0 3))) "Perspective integration with Projectile" single ((:commit . "533808b3e4f8f95a1e3ed9c55d9aa720277ebd5f") (:keywords "project" "convenience") (:authors ("Daniel Wu")) (:maintainer "Daniel Wu"))])
- (perspective . [(20200720 1814) ((emacs (24 4)) (cl-lib (0 5))) "switch between named \"perspectives\" of the editor" single ((:commit . "532962f63a2c4e8c4618cd96a419915e0f90d022") (:keywords "workspace" "convenience" "frames") (:authors ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainer "Natalie Weizenbaum" . "nex342@gmail.com") (:url . "http://github.com/nex3/perspective-el"))])
- (perspeen . [(20171203 1021) ((emacs (25 0)) (powerline (2 4))) "An package for multi-workspace" tar ((:commit . "edb70c530bda50ff3d1756e32a703d5fef5e5480") (:keywords "lisp") (:authors ("Peng Li" . "seudut@gmail.com")) (:maintainer "Peng Li" . "seudut@gmail.com") (:url . "https://github.com/seudut/perspeen"))])
- (pest-mode . [(20200321 504) ((emacs (26 3))) "Major mode for editing Pest files" single ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:keywords "languages") (:authors ("ksqsf" . "i@ksqsf.moe")) (:maintainer "ksqsf" . "i@ksqsf.moe") (:url . "https://github.com/ksqsf/pest-mode"))])
- (pfuture . [(20200425 1357) ((emacs (25 2))) "a simple wrapper around asynchronous processes" single ((:commit . "d7926de3ba0105a36cfd00811fd6278aea903eef") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/pfuture"))])
- (pg . [(20130731 2142) nil "Emacs Lisp interface to the PostgreSQL RDBMS" single ((:commit . "4f6516ec3946d95dcef49abb6703cc89ecb5183d") (:keywords "data" "comm" "database" "postgresql") (:authors ("Eric Marsden" . "emarsden@laas.fr")) (:maintainer "Helmut Eller" . "heller@common-lisp.net"))])
- (pgdevenv . [(20150105 2236) nil "Manage your PostgreSQL development envs" tar ((:commit . "7f1d5bc734750aca98cf67a9491cdbd5615fd132") (:keywords "emacs" "postgresql" "development" "environment" "shell" "debug" "gdb") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))])
- (ph . [(20161029 1522) ((emacs (24 3))) "A global minor mode for managing multiple projects." tar ((:commit . "ed80dad9211583ed0db633448b3624c99b7fac23"))])
- (phabricator . [(20160510 1425) ((emacs (24 4)) (dash (1 0)) (projectile (0 13 0)) (s (1 10 0)) (f (0 17 2))) "Phabricator/Arcanist helpers for Emacs." single ((:commit . "d09d6f059aea92d3b11c68664a5e80c901182ab8") (:keywords "phabricator" "arcanist" "diffusion") (:authors ("Andrew Tulloch")) (:maintainer "Andrew Tulloch") (:url . "https://github.com/ajtulloch/phabricator.el"))])
- (phan . [(20191125 1408) ((emacs (24)) (composer (0 0 8)) (f (0 17))) "Utility functions for Phan (PHP static analizer)" single ((:commit . "2a6e1b66c2aad25fddb8b4f706a28a1aafaaa4c7") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@pixiv.com")) (:maintainer "USAMI Kenta" . "tadsan@pixiv.com") (:url . "https://github.com/emacs-php/phan.el"))])
- (phi-autopair . [(20191220 311) ((paredit (20))) "another simple-minded autopair implementation" single ((:commit . "5685b9541c4c9d4cc8a892743fdf245aceea1682") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (phi-grep . [(20190920 908) ((cl-lib (0 1))) "Interactively-editable recursive grep implementation in elisp" single ((:commit . "06b740e3fb20074be9bae87530f5616a122c3aca") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://github.com/zk-phi/phi-grep"))])
- (phi-rectangle . [(20151208 654) nil "another rectangle-mark command (rewrite of rect-mark)" single ((:commit . "0c12716afc71d803d1f39417469521dc465762d9") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (phi-search . [(20200510 905) nil "another incremental search & replace, compatible with \"multiple-cursors\"" tar ((:commit . "f567f048b3892062c5528b42d4f6af4b313721a3") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (phi-search-dired . [(20150405 714) ((phi-search (2 2 0))) "interactive filtering for dired powered by phi-search" single ((:commit . "162a5e4507c72512affae22744bb606a906d4193") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (phi-search-mc . [(20160324 1503) ((phi-search (2 0 0)) (multiple-cursors (1 2 1))) "multiple-cursors extension for phi-search" single ((:commit . "7aa671910f766437089aec26c3aa7814222d1356") (:keywords "search" "cursors") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/phi-search-mc.el"))])
- (phi-search-migemo . [(20170618 921) ((phi-search (2 2 0)) (migemo (1 9 1))) "migemo extension for phi-search" single ((:commit . "308909ebfc8003d16673f97ca9eb26a667b72969") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (phoenix-dark-mono-theme . [(20170729 1406) nil "Monochromatic version of the Phoenix theme" single ((:commit . "a54f515d162148bcb38676980bc2316adb3d7b8b") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca") (:url . "http://github.com/j0ni/phoenix-dark-mono"))])
- (phoenix-dark-pink-theme . [(20190821 48) nil "Originally a port of the Sublime Text 2 theme" single ((:commit . "ddd98a45775be105984ec598384e68df3d3e8046") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca") (:url . "http://github.com/j0ni/phoenix-dark-pink"))])
- (php-auto-yasnippets . [(20170331 114) ((php-mode (1 11)) (yasnippet (0 8 0))) "Creates snippets for PHP functions" tar ((:commit . "03e1f0899c081813901ac15c2f7a675a37cca9f5") (:authors ("Eric James Michael Ritz")) (:maintainer "Eric James Michael Ritz") (:url . "https://github.com/ejmr/php-auto-yasnippets"))])
- (php-boris . [(20130527 821) nil "Run boris php REPL" single ((:commit . "f2faebf610c917f7091f7ec0cd97645629c4f819") (:keywords "php" "commint" "repl" "boris") (:authors ("Tom Regner")) (:maintainer "Tom Regner" . "tom@goochesa.de"))])
- (php-boris-minor-mode . [(20140209 1835) ((php-boris (0 0 1)) (highlight (0))) "a minor mode to evaluate PHP code in the Boris repl" single ((:commit . "c70e176dd6545f2d42ca3427e87b469635616d8a") (:keywords "php" "repl" "eval") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://github.com/steckerhalter/php-boris-minor-mode"))])
- (php-cs-fixer . [(20200312 1309) ((cl-lib (0 5))) "php-cs-fixer wrapper." single ((:commit . "95eace9bc0ace128d5166e303c76df2b778c4ddb") (:keywords "languages" "php") (:authors ("Philippe Ivaldi for OVYA")) (:maintainer "Philippe Ivaldi for OVYA") (:url . "https://github.com/OVYA/php-cs-fixer"))])
- (php-eldoc . [(20140202 1941) nil "eldoc backend for php" tar ((:commit . "df05064146b884d9081e10657e32dc480f070cfe") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/php-eldoc"))])
- (php-mode . [(20200730 1950) ((emacs (24 3))) "Major mode for editing PHP code" tar ((:commit . "4345dfd81fc6da9b7ac123377902b42f5b7b3e0d") (:keywords "languages" "php") (:authors ("Eric James Michael Ritz")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/php-mode"))])
- (php-quickhelp . [(20200711 1717) ((emacs (25 1))) "Quickhelp at point for php" single ((:commit . "626461ccd422a29de81fe166d58321dd9e886665") (:authors ("Vincenzo Pupillo")) (:maintainer "Vincenzo Pupillo") (:url . "https://github.com/vpxyz/php-quickhelp"))])
- (php-refactor-mode . [(20171124 635) nil "Minor mode to quickly and safely perform common refactorings" single ((:commit . "7a794b0618df2882b1bd586fdd698dba0bc5130d") (:keywords "php" "refactor") (:authors ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainer "Matthew M. Keeler" . "keelerm84@gmail.com") (:url . "https://github.com/keelerm84/php-refactor-mode.el"))])
- (php-runtime . [(20181212 1825) ((emacs (25)) (cl-lib (0 5)) (f (0 20)) (s (1 7))) "Language binding bridge to PHP" single ((:commit . "017e0e70f07d6b25e37d5c5f4d271a914b677631") (:keywords "processes" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/php-runtime.el"))])
- (php-scratch . [(20161103 2217) ((emacs (24 3)) (s (1 11 0)) (php-mode (1 17 0))) "A scratch buffer to interactively evaluate php code" single ((:commit . "3aa66d1d53b84b779374edff7a7e6b5f2cd7575d") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))])
- (phpactor . [(20200618 1845) ((emacs (24 4)) (f (0 17)) (php-runtime (0 2)) (composer (0 2 0)) (async (1 9 3))) "Interface to Phpactor" tar ((:commit . "62d2372ea55c0c5fb4e77076988472ebb5d85f24") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/phpactor.el"))])
- (phpcbf . [(20181228 423) ((s (1 9 0))) "Format PHP code in Emacs using PHP_CodeSniffer's phpcbf" single ((:commit . "fb0bc6073a57126cf1a8404723aa0a715dd761aa") (:keywords "tools" "php") (:authors ("nishimaki10")) (:maintainer "nishimaki10") (:url . "https://github.com/nishimaki10/emacs-phpcbf"))])
- (phpstan . [(20200411 531) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to PHPStan" single ((:commit . "2f715a186c5fe6576de83d4c0b64a37e2bfce101") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/phpstan.el"))])
- (phpt-mode . [(20190512 1809) ((emacs (25)) (polymode (0 1 5)) (php-mode (1 21 2))) "Major mode for editing PHPT test code" single ((:commit . "deb386f1a81003074c476f15e1975d445ff6df01") (:keywords "languages" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/phpt-mode"))])
- (phpunit . [(20180829 1438) ((s (1 12 0)) (f (0 19 0)) (pkg-info (0 6)) (cl-lib (0 5)) (emacs (24 3))) "Launch PHP unit tests using phpunit" tar ((:commit . "fe6bc91c3bd8b329c6d26ad883a025f06b5121ee") (:keywords "tools" "php" "tests" "phpunit") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com") ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/phpunit.el"))])
- (pianobar . [(20180417 104) nil "thin wrapper for Pianobar, a Pandora Radio client" single ((:commit . "3154c4cb7401017fd441fcd6a7a0b669a4406882") (:authors ("Aaron Griffith" . "aargri@gmail.com")) (:maintainer "Aaron Griffith" . "aargri@gmail.com") (:url . "http://github.com/agrif/pianobar.el"))])
- (pickle . [(20190923 354) ((emacs (25 1)) (cl-lib (0 6 1))) "Major mode for editing cucumber gherkin files." single ((:commit . "3a0a717f2a24827667f34bc53830a3b81cd57460") (:keywords "ahungry" "languages" "cucumber" "gherkin") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/pickle-mode"))])
- (picpocket . [(20180914 1819) ((emacs (24 4))) "Image viewer" single ((:commit . "6fd88b8711c4370662c0f9c462170187d092a046") (:keywords "multimedia") (:authors ("Johan Claesson" . "johanclaesson@bredband.net")) (:maintainer "Johan Claesson" . "johanclaesson@bredband.net") (:url . "https://github.com/johanclaesson/picpocket"))])
- (pig-mode . [(20180520 1400) nil "Major mode for Pig files" single ((:commit . "4c6c6e1b1bb719d8adc6c47cc24665f6fe558959") (:maintainer "David A. Shamma"))])
- (pig-snippets . [(20130913 624) ((yasnippet (0 8 0))) "Snippets for pig-mode" tar ((:commit . "4c6c6e1b1bb719d8adc6c47cc24665f6fe558959"))])
- (pillar . [(20141112 1811) ((makey (0 3))) "Major mode for editing Pillar files" tar ((:commit . "13a7f676544cc66005ccd8e6fc1c25e4ccd6f909") (:keywords "markup" "major-mode") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "http://github.com/DamienCassou/pillar-mode"))])
- (pinboard . [(20200630 1544) ((emacs (25 1)) (cl-lib (0 5))) "A pinboard.in client" single ((:commit . "d426f9d2ebec5f907c8a89d6b38ccbcb13750d4f") (:keywords "hypermedia" "bookmarking" "reading" "pinboard") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/pinboard.el"))])
- (pinboard-api . [(20140324 1148) nil "Rudimentary http://pinboard.in integration" single ((:commit . "b7b5214d0c35178f8dca08cf22d6ef3c21f0fce4") (:keywords "pinboard" "www") (:authors ("Danie Roux" . "danie@danieroux.com")) (:maintainer "Danie Roux" . "danie@danieroux.com") (:url . "https://github.com/danieroux/pinboard-api-el"))])
- (pinboard-popular . [(20180511 1726) ((loop (1 4))) "Displays links from the pinboard.in popular page." single ((:commit . "c0bc76cd35f8ecf34723c64a702b82eec2751318") (:keywords "pinboard") (:url . "https://github.com/asimpson/pinboard-popular"))])
- (pine-script-mode . [(20181110 151) ((emacs (24))) "Trading View Pine Script major mode" single ((:commit . "f7892d373e30df0b2e8d2191e4ddb2064a92dd3c") (:keywords "extensions") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.edu")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.edu") (:url . "https://github.com/ericcrosson/pine-script-mode"))])
- (pinot . [(20140211 2026) nil "Emacs interface to pinot-search" tar ((:commit . "67fda555a155b22bb2ce44ba618b4bd6fc5f144a") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))])
- (pinyin . [(20180620 1241) ((cl-lib (0 5)) (emacs (24))) "Convert Hanzi to Pinyin (汉字转拼音)" tar ((:commit . "a325e790e9dd7c5028c4c8d110b08e9d78227382") (:keywords "extensions") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/pinyin.el"))])
- (pinyin-search . [(20160515 358) ((pinyinlib (0 1 0))) "Search Chinese by Pinyin" single ((:commit . "2e877a76851009d41bde66eb33182a03a7f04262") (:keywords "chinese" "search") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/pinyin-search.el"))])
- (pinyinlib . [(20170827 2142) nil "Convert first letter of Pinyin to Simplified/Traditional Chinese characters" single ((:commit . "45f05d3dbb4fe957f7ab332ca6f94675848b6aa3") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (pip-requirements . [(20181027 1629) ((dash (2 8 0))) "A major mode for editing pip requirements files." single ((:commit . "216cd1690f80cc965d4ae47b8753fc185f778ff6") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (pipenv . [(20190919 2147) ((emacs (25 1)) (f (0 19 0)) (s (1 12 0)) (pyvenv (1 20))) "A Pipenv porcelain." single ((:commit . "b730bb509e8b60af9f5ab1f1e6c3458d1d95d789") (:authors ("Paul Walsh" . "paulywalsh@gmail.com")) (:maintainer "Paul Walsh" . "paulywalsh@gmail.com") (:url . "https://github.com/pwalsh/pipenv.el"))])
- (pippel . [(20180710 856) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0))) "Frontend to python package manager pip" tar ((:commit . "21a5200e8e5ccaa1911abb4ebf090b76ca839756") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeitmacher/pippel"))])
- (pixie-mode . [(20180626 541) ((clojure-mode (3 0 1)) (inf-clojure (1 0 0))) "Major mode for Pixie-lang" single ((:commit . "a40c2632cfbe948852a5cdcfd44e6a65db11834d") (:authors ("John Walker" . "john.lou.walker@gmail.com")) (:maintainer "John Walker" . "john.lou.walker@gmail.com") (:url . "https://github.com/johnwalker/pixie-mode"))])
- (pixiv-novel-mode . [(20160220 1421) nil "Major mode for pixiv novel" single ((:commit . "0d1ca524d92b91f20a7105402a773bc21779b434") (:keywords "novel" "pixiv") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))])
- (pkg-info . [(20150517 1143) ((epl (0 8))) "Information about packages" single ((:commit . "76ba7415480687d05a4353b27fea2ae02b8d9d61") (:keywords "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:url . "https://github.com/lunaryorn/pkg-info.el"))])
- (pkgbuild-mode . [(20200425 616) ((emacs (25 1))) "Interface to the ArchLinux package manager" single ((:commit . "bc22301198b3f581d89352510e847454fb1cb9ff") (:keywords "languages") (:authors ("Juergen Hoetzel" . "juergen@hoetzel.info")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info") (:url . "https://github.com/juergenhoetzel/pkgbuild-mode"))])
- (plain-org-wiki . [(20200617 828) ((emacs (24 3)) (ivy (0 12 0))) "Simple jump-to-org-files in a directory package" single ((:commit . "5e32e7e6216e24d515624008fa0898077403aa7f") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/plain-org-wiki"))])
- (plain-theme . [(20171124 410) ((emacs (24))) "Plain theme without syntax highlighting" single ((:commit . "48b37b9b19d8f1e0accbf930f30b5346cf7959fe"))])
- (plan9-theme . [(20180804 1441) nil "A color theme for Emacs based on Plan9" single ((:commit . "c2da2fcb241e9800d931a1ff19ecd9fd84d30382") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/plan9-theme.el"))])
- (planet-theme . [(20161031 217) ((emacs (24))) "A dark theme inspired by Gmail's 'Planets' theme of yore" single ((:commit . "b0a310ff36565fe22224c407cf59569986698a32") (:keywords "themes") (:authors ("Charlie McMackin" . "charlie.mac@gmail.com")) (:maintainer "Charlie McMackin" . "charlie.mac@gmail.com") (:url . "https://github.com/cmack/emacs-planet-theme"))])
- (plantuml-mode . [(20191102 2056) ((dash (2 0 0)) (emacs (25 0))) "Major mode for PlantUML" single ((:commit . "ea45a13707abd2a70df183f1aec6447197fc9ccc") (:keywords "uml" "plantuml" "ascii") (:authors ("Zhang Weize (zwz)")) (:maintainer "Carlo Sciolla (skuro)"))])
- (plaster . [(20180127 2050) ((emacs (24 3))) "Pasting to a plaster host with buffers." single ((:commit . "f82f845ede3b48ca11934171b30effb523ba9fcf") (:keywords "convenience" "paste service") (:authors ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainer "Nicolas Hafner" . "shinmera@tymoon.eu") (:url . "http://github.com/shirakumo/plaster/"))])
- (platformio-mode . [(20161210 1339) ((projectile (0 13 0))) "PlatformIO integration" single ((:commit . "1466aed132a77f48fcb31938d64abb1a1e58ec42") (:authors ("Zach Massia" . "zmassia@gmail.com")) (:maintainer "Zach Massia" . "zmassia@gmail.com") (:url . "https://github.com/zachmassia/platformio-mode"))])
- (play-crystal . [(20180114 1024) ((emacs (24 4)) (dash (2 12 0)) (request (0 2 0))) "https://play.crystal-lang.org integration." single ((:commit . "0b4810a9025213bd11dbcbfd38b3ca928829e0a5") (:keywords "convenience") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:url . "https://github.com/veelenga/play-crystal.el"))])
- (play-routes-mode . [(20170426 733) nil "Play Framework Routes File Support" single ((:commit . "22d7b87e0eaf0330f2b2283872f8dc08a3258771") (:keywords "play" "scala") (:authors ("M.Riehl <max@flatmap.ninja>, P.Haun" . "bomgar85@googlemail.com")) (:maintainer "M.Riehl <max@flatmap.ninja>, P.Haun" . "bomgar85@googlemail.com") (:url . "https://github.com/brocode/play-routes-mode/"))])
- (playerctl . [(20180301 1354) nil "Control your music player (e.g. Spotify) with playerctl" single ((:commit . "3eee541423c2e5eb9f23a26fa9aa88c9c5a19ad1") (:keywords "multimedia" "playerctl" "music") (:authors ("Thomas Luquet" . "thomas@luquet.net")) (:maintainer "Thomas Luquet" . "thomas@luquet.net") (:url . "https://github.com/thomasluquet/playerctl.el"))])
- (playground . [(20180624 326) ((emacs (24 4))) "Manage sandboxes for alternative configurations" single ((:commit . "9212790026bea9ab5fb4ecf0da1163be8ab00776") (:keywords "maint") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/emacs-playground"))])
- (playonline . [(20200317 642) ((emacs (24 4)) (dash (2 1)) (request (0 2))) "Play code with online playgrounds" single ((:commit . "c75da1fdc1dfbd5d9aa274dc4e90ff631ea08e70") (:keywords "tools") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:url . "https://github.com/twlz0ne/playonline.el"))])
- (plenv . [(20130707 616) nil "A plenv wrapper for Emacs" single ((:commit . "ee937d0f3a1a7ba2d035f45be896d3ed8fefaee2") (:keywords "emacs" "perl") (:authors ("Kenta Sato" . "karupa@cpan.org")) (:maintainer "Kenta Sato" . "karupa@cpan.org"))])
- (plim-mode . [(20140813 13) nil "Major mode for editing Plim files" single ((:commit . "92e39190286f172567ceb02c80e1df3b81abfa2d") (:keywords "markup" "language") (:authors ("Dong Weiming")) (:maintainer "Dong Weiming") (:url . "http://github.com/dongweiming/plim-mode"))])
- (plisp-mode . [(20200427 405) nil "Major mode for PicoLisp programming." tar ((:commit . "59e682d77569b04e9fc80af9c4b05e4a997dbcec") (:keywords "picolisp" "lisp" "programming") (:authors ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:url . "https://github.com/flexibeast/plisp-mode"))])
- (plsense . [(20151104 1445) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 2 0))) "provide interface for PlSense that is a development tool for Perl." single ((:commit . "d50f9dccc98f42bdb42f1d1c8142246e03879218") (:keywords "perl" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-plsense"))])
- (plsense-direx . [(20140520 2008) ((direx (0 1 -3)) (plsense (0 3 2)) (log4e (0 2 0)) (yaxception (0 3 2))) "Perl Package Explorer" single ((:commit . "8a2f465264c74e04524cc789cdad0190ace43f6c") (:keywords "perl" "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/plsense-direx"))])
- (plur . [(20160504 924) ((emacs (24 4))) "Easily search and replace multiple variants of a word" single ((:commit . "5bdd3b9a2f0624414bd596e798644713cd1545f0") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/plur"))])
- (pmdm . [(20191101 2346) nil "poor man's desktop-mode alternative." single ((:commit . "1f30adce8a23da94b3c2460b7248d5910592d8af") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:url . "https://hg.serna.eu/emacs/pmdm"))])
- (pnpm-mode . [(20200527 557) ((emacs (24 1))) "Minor mode for working with pnpm projects" single ((:commit . "391207e6505948b0d0cb57b802ee4885e3292c21") (:keywords "convenience" "project" "javascript" "node" "npm" "pnpm") (:authors ("Rajasegar Chandran" . "rajasegar.c@gmail.com")) (:maintainer "Rajasegar Chandran" . "rajasegar.c@gmail.com") (:url . "https://github.com/rajasegar/pnpm-mode"))])
- (po-mode . [(20200610 1743) nil "major mode for GNU gettext PO files" single ((:commit . "3114e245c2ee6208e9b506f3e65e631e1b236019") (:keywords "i18n" "gettext"))])
- (pocket-api . [(20180403 109) ((emacs (24 4)) (request (0 2))) "another pocket api" single ((:commit . "3eb9430b9db90bc02e736e433eb86389f7655189") (:keywords "convenience" "pocket") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/pocket-api.el"))])
- (pocket-lib . [(20190720 1957) ((emacs (25 1)) (request (0 2)) (dash (2 13 0)) (kv (0 0 19)) (s (1 12 0))) "Library for accessing getpocket.com API" single ((:commit . "f794e3e619e1f6cad25bbfd5fe019a7e62820bf4") (:keywords "pocket") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/pocket-lib.el"))])
- (pocket-mode . [(20171201 1315) ((emacs (24 4)) (pocket-api (0 1))) "Manage your pocket" single ((:commit . "229de7d35b7e5605797591c46aa8200d7efc363c") (:keywords "convenience" "pocket") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (pocket-reader . [(20181219 930) ((emacs (25 1)) (dash (2 13 0)) (kv (0 0 19)) (pocket-lib (0 1)) (s (1 10)) (ov (1 0 6)) (rainbow-identifiers (0 2 2)) (org-web-tools (0 1)) (ht (2 2))) "Client for Pocket reading list" single ((:commit . "86c51c65d97819e11b3df403beea424f30125d30") (:keywords "pocket") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/pocket-reader.el"))])
- (podcaster . [(20200607 1054) ((cl-lib (0 5))) "Podcast client" single ((:commit . "7a21173da0c57e6aa41dbdc33383047386b35eb5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/podcaster"))])
- (poe-lootfilter-mode . [(20190330 1117) ((emacs (24 3))) "Major mode for editing Path of Exile lootfilters" single ((:commit . "5ef06684cb2b17b090ee1f303c2b789fa71bc106") (:keywords "languages" "games") (:authors ("Jeremiah Dodds" . "jeremiah.dodds@gmail.com")) (:maintainer "Jeremiah Dodds" . "jeremiah.dodds@gmail.com") (:url . "https://github.com/jdodds/poe-lootfilter-mode"))])
- (poet-client . [(20190124 654) ((emacs (24 4)) (request (0 3 0))) "Client for po.et network api" single ((:commit . "32382057b3e4b8a02ec5ac3190dbe4b93d058741") (:authors ("W.Yahia")) (:maintainer "W.Yahia") (:url . "https://github.com/wailo/emacs-poet"))])
- (poet-theme . [(20200606 2343) ((emacs (24 1))) "A theme for prose" tar ((:commit . "16eb694f0755c04c4db98614d0eca1199fddad70") (:keywords "faces" "theme" "prose") (:authors ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainer "Kunal Bhalla" . "bhalla.kunal@gmail.com") (:url . "https://github.com/kunalb/poet/"))])
- (poetry . [(20200527 948) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" single ((:commit . "d876522e5af576d53c62b2838f85c9441fe62258") (:keywords "python" "tools") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Gaby Launay" . "gaby.launay@protonmail.com") (:url . "https://github.com/galaunay/poetry.el"))])
- (point-pos . [(20170421 1632) nil "Save and restore point positions" single ((:commit . "442bccb40791832cbc2d6f5c8f53be745aea2b73") (:keywords "tools" "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/point-pos.el"))])
- (point-stack . [(20200427 107) nil "Back and forward navigation through buffer locations" single ((:commit . "cddcea2c91038710c245819b3cda2dd739726134") (:authors ("Matt Harrison" . "matthewharrison@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Matt Harrison" . "matthewharrison@gmail.com"))])
- (pointback . [(20100210 1552) nil "Restore window points when returning to buffers" single ((:commit . "e3a02c1784d81b5a1d2477338d049af581ed19f8") (:keywords "convenience") (:authors ("Markus Triska" . "markus.triska@gmx.at")) (:maintainer "Markus Triska" . "markus.triska@gmx.at"))])
- (pollen-mode . [(20191223 1920) ((emacs (24 3)) (cl-lib (0 5))) "major mode for editing pollen files" single ((:commit . "d0a33591498013886c2c4676e204cd684954e82a") (:keywords "languages" "pollen" "pollenpub") (:authors ("Junsong Li <ljs.darkfish AT GMAIL>")) (:maintainer "Junsong Li") (:url . "https://github.com/lijunsong/pollen-mode"))])
- (poly-R . [(20200316 1315) ((emacs (25)) (polymode (0 2 2)) (poly-markdown (0 2 2)) (poly-noweb (0 2 2))) "Various polymodes for R language" single ((:commit . "51ffeb6ec45dd44eafa4d22ad2d6150cc4b248fc") (:keywords "languages" "multi-modes") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/poly-R"))])
- (poly-ansible . [(20181222 1517) ((ansible (0)) (ansible-doc (0 4)) (jinja2-mode (0 2)) (polymode (0 1 5)) (yaml-mode (0 0 13))) "Polymode for Ansible: Jinja2 in YAML" tar ((:commit . "2cb970a0e27b41ae85bc51d24ef36fa2c7b34bbc") (:keywords "languages") (:authors ("Peter Oliver" . "poly-ansible@mavit.org.uk")) (:maintainer "Peter Oliver" . "poly-ansible@mavit.org.uk") (:url . "https://gitlab.com/mavit/poly-ansible/"))])
- (poly-erb . [(20200316 1314) ((emacs (25)) (polymode (0 2 2))) "Polymode for erb" single ((:commit . "56c744b8d87d8cbe0aba2696d4e8525afc4aa0e8") (:keywords "emacs") (:authors ("Siavash Sajjadi and Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/poly-erb"))])
- (poly-markdown . [(20200316 1315) ((emacs (25)) (polymode (0 2 2)) (markdown-mode (2 3))) "Polymode for markdown-mode" single ((:commit . "1536cf0c32f71d5cd05c90f7905905e38006e95d") (:keywords "emacs") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/poly-markdown"))])
- (poly-noweb . [(20200316 1315) ((emacs (25)) (polymode (0 2 2))) "Polymode for noweb" single ((:commit . "3b0cd36ca9a707e8a09337a3468fa85d81fc461c") (:keywords "languages" "multi-modes") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/poly-noweb"))])
- (poly-org . [(20200316 1315) ((emacs (25)) (polymode (0 2 2))) "Polymode for org-mode" single ((:commit . "8f4d11489532be98a291258ca27405aa528fc126") (:keywords "languages" "multi-modes") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/poly-org"))])
- (poly-rst . [(20200316 1315) ((emacs (25)) (polymode (0 2 2))) "poly-rst-mode polymode" single ((:commit . "8530f56fbdce01bcf4004839ff54e4156282c2b5") (:keywords "languages" "multi-modes") (:authors ("Gustaf Waldemarson, Vitalie Spinu")) (:maintainer "Gustaf Waldemarson, Vitalie Spinu") (:url . "https://github.com/polymode/poly-rst"))])
- (poly-ruby . [(20180905 929) ((emacs (25)) (polymode (0 1 2))) "Provides poly-ruby-mode" single ((:commit . "794ebb926ace23e9c1398da934701951432dcea2") (:keywords "languages") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/poly-ruby.el"))])
- (poly-slim . [(20200316 1316) ((emacs (25)) (polymode (0 2 2)) (slim-mode (1 1))) "Polymodes for slim" single ((:commit . "9e9b5164c68955974fd5f5d220aec5af9b5ba3ae") (:keywords "emacs") (:authors ("Siavash Sajjadi and Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/poly-slim"))])
- (poly-wdl . [(20190712 529) ((emacs (25)) (polymode (0 2)) (wdl-mode (20170709))) "Polymode for WDL" single ((:commit . "963faa828d15d49cee5a63f619c3c30e162c2d0f") (:keywords "languages") (:authors ("Jean Monlong" . "jean.monlong@gmail.com")) (:maintainer "Jean Monlong" . "jean.monlong@gmail.com") (:url . "https://github.com/jmonlong/poly-wdl"))])
- (polymode . [(20200606 1106) ((emacs (25))) "Extensible framework for multiple major modes" tar ((:commit . "3284ff10017d280ba82f27dc20fe5223b0df709c") (:keywords "languages" "multi-modes" "processes") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/polymode/polymode"))])
- (pomidor . [(20200722 1402) nil "No description available." tar ((:commit . "60da23c97c30e08254a914dca411b2e3fd639c99"))])
- (pomodoro . [(20190201 2152) nil "A timer for the Pomodoro Technique" single ((:commit . "6cd665ceeaca1f70954aa4caef6f085179f94c69") (:authors ("David Kerschner" . "dkerschner@gmail.com")) (:maintainer "David Kerschner" . "dkerschner@gmail.com"))])
- (pony-mode . [(20170807 1522) nil "Minor mode for working with Django Projects" tar ((:commit . "760684d30b6c234d1b88c9a4673a808f36f7f341"))])
- (pony-snippets . [(20200418 354) ((yasnippet (0 8 0))) "Yasnippets for Pony" tar ((:commit . "115a0d5066f89554bee9cb1045bcda5a18ebd441") (:keywords "snippets" "pony") (:url . "https://github.com/seantallen/pony-snippets"))])
- (ponylang-mode . [(20200724 137) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0)) (hl-todo (3 1 2)) (yafolding (0 4 1)) (yasnippet (0 14 0)) (company-ctags (0 0 4)) (rainbow-delimiters (2 1 4)) (fill-column-indicator (1 90))) "A major mode for the Pony programming language" single ((:commit . "245039a223b3a9eabea3591e28d8949e0c87968e") (:keywords "languages" "programming") (:url . "https://github.com/ponylang/ponylang-mode"))])
- (pophint . [(20200420 1429) ((log4e (0 3 3)) (yaxception (0 3))) "Provide navigation using pop-up tips, like Firefox's Vimperator Hint Mode" tar ((:commit . "5e13da4578ae7ba00e6f7bae31eb546d713cc19d") (:keywords "popup") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-pophint"))])
- (poporg . [(20170403 751) nil "Pop a comment or string to an empty buffer for text editing" single ((:commit . "2c58d68c81ecca4140bf179f19ed153ec804b65a") (:keywords "outlines" "tools") (:authors ("François Pinard" . "pinard@iro.umontreal.ca") ("Joseph Rabinoff" . "rabinoff@post.harvard.edu")) (:maintainer "Joseph Rabinoff" . "rabinoff@post.harvard.edu") (:url . "https://github.com/QBobWatson/poporg"))])
- (popup . [(20200610 317) ((cl-lib (0 5))) "Visual Popup User Interface" single ((:commit . "9d104d4bbbcb37bbc9d9ce762e74d41174683f86") (:keywords "lisp") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))])
- (popup-complete . [(20141109 308) ((popup (0 5 0))) "completion with popup" single ((:commit . "caa655a6d8472e9a4bfa1311126d90d7d1b07fca") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-popup-complete"))])
- (popup-edit-menu . [(20170404 1425) ((emacs (24))) "a popup context edit menu package" single ((:commit . "925600a6e29183841199e866cf55e566a6a1b002") (:keywords "lisp" "pop-up" "context" "edit" "menu") (:authors ("Debugfan Chin" . "debugfanchin@gmail.com")) (:maintainer "Debugfan Chin" . "debugfanchin@gmail.com"))])
- (popup-imenu . [(20170326 1040) ((dash (2 12 1)) (popup (0 5 3)) (flx-ido (0 6 1))) "imenu index popup" single ((:commit . "c5e2e69adbd3a630e4cb750965a1aee8c10c1f09") (:keywords "popup" "imenu") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com") (:url . "https://github.com/ancane/popup-imenu"))])
- (popup-kill-ring . [(20131020 1854) ((popup (0 4)) (pos-tip (0 4))) "interactively insert item from kill-ring" single ((:commit . "5773dfadc104a906c088a3ec62e8cdd3e01e57fa") (:keywords "popup" "kill-ring" "pos-tip") (:authors ("khiker" . "khiker.mail+elisp@gmail.com")) (:maintainer "khiker" . "khiker.mail+elisp@gmail.com") (:url . "https://github.com/waymondo/popup-kill-ring"))])
- (popup-switcher . [(20200701 2034) ((cl-lib (0 3)) (popup (0 5 3))) "switch to other buffers and files via popup." single ((:commit . "68bbe23f7ceaca889529be95762925ac29515545") (:keywords "popup" "switch" "buffers" "functions") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:url . "https://github.com/kostafey/popup-switcher"))])
- (popwin . [(20200122 1440) nil "Popup Window Manager." single ((:commit . "d69dca5c9ec4b08f5268ff2d6b5097618d4082d7") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))])
- (portage-navi . [(20141208 1355) ((concurrent (0 3 1)) (ctable (0 1 2))) "portage viewer" single ((:commit . "8016c3e99fe6cef101d479a3d69185796b22ca2f") (:keywords "tools" "gentoo") (:authors ("<m.sakurai at kiwanami.net>")) (:maintainer "<m.sakurai at kiwanami.net>") (:url . "https://github.com/kiwanami/emacs-portage-navi"))])
- (porthole . [(20200404 1454) ((emacs (26)) (web-server (0 1 2)) (f (0 19 0)) (json-rpc-server (0 1 2))) "RPC Servers in Emacs" single ((:commit . "9e68b419acf9245208f8094e10041b7f04511473") (:keywords "comm" "rpc" "http" "json") (:authors ("GitHub user \"Jcaw\"")) (:maintainer "GitHub user \"Jcaw\"") (:url . "https://github.com/jcaw/porthole"))])
- (pos-tip . [(20191227 1356) nil "Show tooltip at point" single ((:commit . "179cc126b363f72ca12fab1e0dc462ce0ee79742") (:keywords "tooltip") (:authors ("S. Irie")) (:maintainer "S. Irie"))])
- (posframe . [(20200731 34) ((emacs (26))) "Pop a posframe (just a frame) at point" single ((:commit . "0144261075b3b18dfda1cfa068464240bfe8a887") (:keywords "convenience" "tooltip") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/posframe"))])
- (posix-manual . [(20200301 1103) ((emacs (24))) "POSIX manual page lookup" tar ((:commit . "ebaacd7266ae7a66605317f57b9f42e9cfb2ce1e") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-posix-manual"))])
- (postcss-sorting . [(20180211 956) ((emacs (24))) "postcss-sorting interface" single ((:commit . "deb0c935d2904c11a965758a9aee5a0e905f21fc") (:authors ("Peiwen Lu" . "hi@peiwen.lu")) (:maintainer "Peiwen Lu" . "hi@peiwen.lu") (:url . "https://github.com/P233/postcss-sorting.el"))])
- (pov-mode . [(20161115 743) nil "Major mode for editing POV-Ray scene files." tar ((:commit . "9fc1db3aab7c27155674dd1a87ec62606035d074"))])
- (pow . [(20140420 806) ((emacs (24)) (cl-lib (0 5))) "pow (http://pow.cx/) manager for emacs" tar ((:commit . "ea83986b8ca8e27cb996290d6463b111ec0966ce") (:keywords "develop" "web" "pow") (:authors ("yukihiro hara" . "yukihr@gmail.com")) (:maintainer "yukihiro hara" . "yukihr@gmail.com") (:url . "http://github.com/yukihr/emacs-pow"))])
- (powerline . [(20200105 2053) ((cl-lib (0 2))) "Rewrite of Powerline" tar ((:commit . "edbb464eef680efc9d408730288c716cd4cac404") (:keywords "mode-line") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "http://github.com/milkypostman/powerline/"))])
- (powerline-evil . [(20190603 340) ((evil (1 0 8)) (powerline (2 3))) "Utilities for better Evil support for Powerline" tar ((:commit . "b77e2cf571e9990734f2b30d826f3a362b559fd1") (:keywords "evil" "mode-line" "powerline") (:authors ("Chris Johnson" . "chris@christophermjohnson.net")) (:maintainer "Chris Johnson" . "chris@christophermjohnson.net") (:url . "http://github.com/johnson-christopher/powerline-evil/"))])
- (powershell . [(20190421 2038) ((emacs (24))) "Mode for editing PowerShell scripts" single ((:commit . "87826777bd3ebd53740be99b4546bfc11ccc625d") (:keywords "powershell" "languages") (:authors ("Frédéric Perrin <frederic (dot) perrin (arobas) resel (dot) fr>")) (:maintainer "Frédéric Perrin <frederic (dot) perrin (arobas) resel (dot) fr>") (:url . "http://github.com/jschaf/powershell.el"))])
- (powerthesaurus . [(20200720 1546) ((emacs (24)) (request (0 3 0)) (s (1 12 0)) (jeison (1 0 0))) "Powerthesaurus integration" single ((:commit . "93036d3b111925ebc34f747ff846cb0b8669b92e") (:keywords "convenience" "writing") (:url . "http://github.com/SavchenkoValeriy/emacs-powerthesaurus"))])
- (ppd-sr-speedbar . [(20151108 1224) ((sr-speedbar (20140914 2339)) (project-persist-drawer (0 0 4))) "Sr Speedbar adaptor for project-persist-drawer." tar ((:commit . "d88d7f63f695824c435dd996405454d1e46d2aa3"))])
- (ppp . [(20200418 1551) ((emacs (25 1)) (leaf (4 1 1))) "Extended pretty printer for Emacs Lisp" single ((:commit . "27683aa4a0df67b4539bcaa2e82d865023cf1fae") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/ppp.el"))])
- (prassee-theme . [(20180709 1004) ((emacs (24))) "A high contrast color theme for Emacs." single ((:commit . "81126f69cdbaab836c00ae7a49aaf89d4229fde1") (:keywords "dark" "high-contrast" "faces") (:authors ("Prassee " . "prassee.sathian@gmail.com")) (:maintainer "Prassee " . "prassee.sathian@gmail.com") (:url . "https://github.com/prassee/prassee-emacs-theme"))])
- (preproc-font-lock . [(20151107 2018) nil "Highlight C-style preprocessor directives." single ((:commit . "565fda9f5fdeb0598986174a07e9fb09f7604397") (:keywords "c" "languages" "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/preproc-font-lock"))])
- (prescient . [(20200716 1414) ((emacs (25 1))) "Better sorting and filtering" single ((:commit . "b11d79b10df12c58edc3487371c2c47dfb9b50e6") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/prescient.el"))])
- (preseed-generic-mode . [(20180210 500) nil "Debian preseed file major mode" single ((:commit . "3aa8806c4a659064baa01751400c53fbaf847f66") (:authors ("Tong Sun" . "suntong@users.sourceforge.net")) (:maintainer "Tong Sun" . "suntong@users.sourceforge.net") (:url . "https://github.com/suntong/preseed-generic-mode"))])
- (presentation . [(20180427 224) ((emacs (24 4)) (cl-lib (0 5))) "Display large character for presentation" single ((:commit . "f53f67aeab97e8eea6d1f12df5f7ce3b1b03b879") (:keywords "environment" "faces" "frames") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/emacs-presentation-mode"))])
- (prettier . [(20200714 859) ((emacs (26 1)) (iter2 (0 9)) (nvm (0 2))) "Code formatting with Prettier" tar ((:commit . "000244b82ca9e2118376f6a44506bac8ab225677") (:keywords "convenience" "languages" "files") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com") (:url . "https://github.com/jscheid/prettier.el"))])
- (prettier-js . [(20180109 726) nil "Minor mode to format JS code on file save" single ((:commit . "e9b73e81d3e1642aec682195f127a42dfb0b5774") (:keywords "convenience" "wp" "edit" "js") (:authors ("James Long and contributors")) (:maintainer "James Long and contributors") (:url . "https://github.com/prettier/prettier-emacs"))])
- (prettify-greek . [(20160603 908) nil "Greek letters for prettify-symbols" single ((:commit . "698d07a6ffe85f6fb53f3bfec4f49380c25cfd90") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-prettify-greek"))])
- (pretty-hydra . [(20190930 2106) ((hydra (0 15 0)) (s (1 12 0)) (dash (2 15 0)) (dash-functional (1 2 0)) (emacs (24))) "A macro for creating nice-looking hydras" single ((:commit . "20362323f66883c1336ffe70be24f91509addf54") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))])
- (pretty-mode . [(20190615 2045) nil "Redisplay parts of the buffer as pretty Unicode symbols." single ((:commit . "5154355e90fdd70d3647257280a89eeb725ef084") (:keywords "pretty" "unicode" "symbols") (:authors ("Arthur Danskin" . "arthurdanskin@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:url . "https://github.com/akatov/pretty-mode"))])
- (pretty-sha-path . [(20141105 1826) nil "Prettify Guix/Nix store paths" single ((:commit . "a2b43dd9de423a38d67cda2e3bd9412f7d363257") (:keywords "faces" "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://gitorious.org/alezost-emacs/pretty-sha-path"))])
- (pretty-symbols . [(20140814 959) nil "Draw tokens as Unicode glyphs." single ((:commit . "582cbe51ecfe1cc0a5b185bc06113c8a661e3956") (:keywords "faces") (:authors ("David Röthlisberger" . "david@rothlis.net")) (:maintainer "David Röthlisberger" . "david@rothlis.net") (:url . "http://github.com/drothlis/pretty-symbols"))])
- (prism . [(20200407 1148) ((emacs (26 1)) (dash (2 14 1))) "Customizable, depth-based syntax coloring" single ((:commit . "b618f2cea2dbf7c13d8b4fec1760c346eb9ab036") (:keywords "faces" "lisp") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/prism.el"))])
- (private . [(20150122 157) ((aes (0 6))) "take care of your private configuration files." single ((:commit . "9266d01c095895cc3ee9de95bc20511e88353755") (:keywords "private" "configuration" "backup" "recover") (:authors ("Cheung Mou Wai" . "yeannylam@gmail.com")) (:maintainer "Cheung Mou Wai" . "yeannylam@gmail.com") (:url . "https://github.com/cheunghy/private"))])
- (private-diary . [(20151216 1657) ((emacs (24 0))) "maintain a private diary in Emacs" single ((:commit . "0c86fb6150ad8ed14f94def3504f5a68f4147283") (:keywords "diary" "encryption") (:authors ("James P. Ascher" . "jpa4q@virginia.edu")) (:maintainer "James P. Ascher" . "jpa4q@virginia.edu") (:url . "https://github.com/cacology/private-diary"))])
- (proc-net . [(20130322 12) nil "network process tools" single ((:commit . "10861112a1f3994c8e6374d6c5bb5d734cfeaf73") (:keywords "processes") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "http://github.com/nicferrier/emacs-procnet"))])
- (proced-narrow . [(20190911 1818) ((seq (2 20)) (emacs (24))) "Live-narrowing of search results for proced." single ((:commit . "0e2a4dfb072eb0369d0020b429e820ae620d325e") (:keywords "processes" "proced") (:authors ("Travis Jeffery" . "tj@travisjeffery.com")) (:maintainer "Travis Jeffery" . "tj@travisjeffery.com") (:url . "https://github.com/travisjeffery/proced-narrow"))])
- (processing-mode . [(20171022 2302) nil "Major mode for Processing 2.0" single ((:commit . "448aba82970c98322629eaf2746e73be6c30c98e") (:keywords "languages" "snippets") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:url . "https://github.com/ptrv/processing2-emacs"))])
- (processing-snippets . [(20140426 1428) ((yasnippet (0 8 0))) "Snippets for processing-mode" tar ((:commit . "448aba82970c98322629eaf2746e73be6c30c98e"))])
- (prodigy . [(20191212 1242) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (24))) "Manage external services from within Emacs" single ((:commit . "6ae71f27b09b172f03fb55b9eeef001206baacd3") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/prodigy.el"))])
- (professional-theme . [(20150315 1100) nil "Emacs port of Vim's professional theme" single ((:commit . "0927d1474049a193f9f366bde5eb1887b9ba20ed") (:keywords "theme" "light" "professional") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net") (:url . "https://github.com/juanjux/emacs-professional-theme"))])
- (prog-fill . [(20180607 132) ((emacs (25 1)) (cl-lib (0 6 1))) "Smartly format lines to use vertical space." single ((:commit . "3fbf7da6dd826e95c9077d659566ee29814a31d8") (:keywords "ahungry" "convenience" "c" "formatting" "editing") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/prog-fill"))])
- (prognth . [(20130920 1759) nil "Extend prog1 to arbitrary index" single ((:commit . "2f1ca4d34b1fd581163e1df122c85418137e8e62") (:keywords "lisp") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))])
- (programmer-dvorak . [(20150427 137) nil "Input method for Programmer Dvorak." single ((:commit . "3288a8f058eca4cab390a564babbbcb17cfa0350") (:keywords "dvorak" "programmer-dvorak" "input-method") (:authors ("Chenyun Yang" . "yangchenyun@gmail.com")) (:maintainer "Chenyun Yang" . "yangchenyun@gmail.com") (:url . "https://github.com/yangchenyun/programmer-dvorak"))])
- (project-abbrev . [(20200724 901) ((emacs (25 1))) "Customize abbreviation expansion in the project" single ((:commit . "7b5749eae33eda576da3293dc386794c1248bb48") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/project-abbrev"))])
- (project-explorer . [(20150504 14) ((cl-lib (0 3)) (es-lib (0 3)) (es-windows (0 1)) (emacs (24))) "A project explorer sidebar" single ((:commit . "589a09008706f5f4ef91393dc4306eede0d15ca9") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/project-explorer"))])
- (project-persist . [(20180906 1302) nil "A minor mode to allow loading and saving of project settings." tar ((:commit . "26d9435bef44da2a1b0892eba822f9f487b98eec"))])
- (project-persist-drawer . [(20151108 1222) ((project-persist (0 3))) "Use a project drawer with project-persist." tar ((:commit . "35bbe132a4fab6a0fec15ce6c0fd2fe6a4aa9626"))])
- (project-root . [(20110206 2030) nil "Define a project root and take actions based upon it." single ((:commit . "a49b1be864357683d9489074148b6d667f4ed23b") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))])
- (project-shells . [(20191123 914) ((emacs (24 3)) (seq (2 19))) "Manage the shell buffers of each project" single ((:commit . "5aea9ee0de93f2568afb3f18bb7b43a9715a9a2d") (:keywords "processes" "terminals") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:url . "https://github.com/hying-caritas/project-shells"))])
- (projectile . [(20200710 947) ((emacs (25 1)) (pkg-info (0 4))) "Manage and navigate projects in Emacs easily" single ((:commit . "bbcf781d3fddb8e00d0dc10eb68bc2528fb409b3") (:keywords "project" "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "https://github.com/bbatsov/projectile"))])
- (projectile-codesearch . [(20180508 1522) ((codesearch (20171122 431)) (projectile (20150405 126))) "Integration of codesearch into projectile" single ((:commit . "f6eb96f034a925444412cfa03e45e0ccbbafe3f2") (:keywords "tools" "development" "search") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-codesearch"))])
- (projectile-direnv . [(20160306 138) ((emacs (24)) (s (1 11 0)) (dash (2 12 0)) (projectile (0 13 0))) "Set environment variables from .envrc" single ((:commit . "d5d29e5228f840b7a25358a2fd50353ef2dc9b16") (:keywords "convenience") (:authors ("Christian Romney" . "crommney@pointslope.com")) (:maintainer "Christian Romney" . "crommney@pointslope.com") (:url . "https://github.com/christianromney/projectile-direnv"))])
- (projectile-git-autofetch . [(20191013 1806) ((emacs (25 1)) (projectile (0 14 0)) (alert (1 2))) "automatically fetch git repositories" single ((:commit . "4a3eba7658a52c6e955d5f7085cd3fd62b53b9c6") (:keywords "tools" "vc") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:url . "https://github.com/andrmuel/projectile-git-autofetch"))])
- (projectile-rails . [(20200417 1711) ((emacs (24 3)) (projectile (0 12 0)) (inflections (1 1)) (inf-ruby (2 2 6)) (f (0 13 0)) (rake (0 3 2))) "Minor mode for Rails projects based on projectile-mode" single ((:commit . "11980b2bcb99208888856a9b8666ff329b6f0142") (:keywords "rails" "projectile") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:url . "https://github.com/asok/projectile-rails"))])
- (projectile-ripgrep . [(20180914 1500) ((ripgrep (0 3 0)) (projectile (0 14 0))) "Run ripgrep with Projectile" single ((:commit . "40e871dcc4519a70981e9f28acea304692a60978") (:keywords "ripgrep" "projectile") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/ripgrep.el"))])
- (projectile-sift . [(20160107 1015) ((sift (0 2 0)) (projectile (0 13 0))) "Run a sift with Projectile" single ((:commit . "cdddba2d183146c340915003f1b5d09d13712c22") (:keywords "sift" "projectile") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/sift.el"))])
- (projectile-speedbar . [(20190807 2010) ((projectile (0 11 0)) (sr-speedbar (0))) "projectile integration for speedbar" single ((:commit . "93320e467ee78772065e599a5dba94889a77db22") (:keywords "project" "convenience" "speedbar" "projectile") (:authors ("Anshul Verma" . "anshul.verma86@gmail.com")) (:maintainer "Anshul Verma" . "anshul.verma86@gmail.com") (:url . "https://github.com/anshulverma/projectile-speedbar"))])
- (projectile-trailblazer . [(20170928 1624) ((emacs (24 4)) (projectile (0 12 0)) (inflections (1 1)) (inf-ruby (2 2 6)) (f (0 13 0)) (rake (0 3 2))) "Minor mode for Rails projects using trailblazer" single ((:commit . "a37a4f7b7f727d98e4c74c0256e059e84263553d") (:keywords "rails" "projectile" "trailblazer" "languages") (:authors ("Michael Dahl" . "michael.dahl84@gmail.com")) (:maintainer "Michael Dahl" . "michael.dahl84@gmail.com") (:url . "https://github.com/micdahl/projectile-trailblazer"))])
- (projectile-variable . [(20170208 1718) ((emacs (24)) (cl-lib (0 5))) "Store project local variables." single ((:commit . "8d348ac70bdd6dc320c13a12941b32b38140e264") (:keywords "project" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/projectile-variable"))])
- (projector . [(20190703 1418) ((alert (1 1)) (projectile (0 11 0)) (cl-lib (0 5))) "Lightweight library for managing project-aware shell and command buffers" single ((:commit . "bad51a81fbcae9aabe47dafc2499ba27cd7308be") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/projector.el"))])
- (projekt . [(20150324 848) ((emacs (24))) "some kind of staging for CVS" single ((:commit . "a65e554e5d8b0def08c5d06f3fe34fec40bebd83") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))])
- (projmake-mode . [(20161031 1715) ((dash (20150611 922)) (indicators (20130217 1405))) "Project oriented automatic builder and error highlighter, flymake for projects" tar ((:commit . "a897701f7e8f8cc11459ed44eb0e454db2a460c1"))])
- (promise . [(20200727 900) ((emacs (25 1))) "Promises/A+" tar ((:commit . "d7b59805e7a8da1f5edea9313b6e2d0f1115fec0") (:keywords "async" "promise" "convenience") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:url . "https://github.com/chuntaro/emacs-promise"))])
- (prompt-text . [(20190408 310) nil "Configure your minibuffer prompt" single ((:commit . "0a75ecd5058c9a006e02d1ecd3f1c84194881abd") (:keywords "utility" "minibuffer") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/prompt-text-el"))])
- (prompts . [(20160916 1041) ((dash (2 13 0))) "utilities for working with text prompts." single ((:commit . "1cd5e732ff2a86b47836eb7252e5b59cd4b6ab26") (:keywords "input" "minibuffer") (:authors ("Ben Moon" . "guiltydolphin@gmail.com")) (:maintainer "Ben Moon" . "guiltydolphin@gmail.com") (:url . "https://github.com/guiltydolphin/prompts.el"))])
- (pronto . [(20200218 1633) ((emacs (24))) "Compilation mode for pronto stylechecks" single ((:commit . "c2a2ec718c08de1fd2e681970456786cf4eac8fe") (:keywords "processes" "tools") (:authors ("Julian Rubisch" . "julian@julianrubisch.at")) (:maintainer "Julian Rubisch" . "julian@julianrubisch.at") (:url . "https://github.com/julianrubisch/pronto.el"))])
- (proof-general . [(20200623 1748) ((emacs (24 3))) "A generic front-end for proof assistants (interactive theorem provers)" tar ((:commit . "03e427a8f19485e12b2f95387ed3e0bff7cc944c"))])
- (prop-menu . [(20150728 1118) ((emacs (24 3)) (cl-lib (0 5))) "Create and display a context menu based on text and overlay properties" single ((:commit . "50b102c1c0935fd3e0c465feed7f27d66b21cdf3") (:keywords "convenience") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:url . "https://github.com/david-christiansen/prop-menu-el"))])
- (propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." single ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:keywords "faces") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:url . "https://github.com/ikirill/propfont-mixed"))])
- (proportional . [(20200309 1556) ((emacs (25 1))) "use a proportional font everywhere" single ((:commit . "0e4537af7ba2bc9dbb449c38350bce012b382f51") (:keywords "faces") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:url . "https://github.com/ksjogo/proportional"))])
- (prosjekt . [(20151127 1416) ((dash (2 8 0))) "a software project tool for emacs" tar ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))])
- (protobuf-mode . [(20200619 1742) nil "major mode for editing protocol buffers." single ((:commit . "92e3d3e02a886839c75aca74dab4d0ea4cef8eb8") (:keywords "google" "protobuf" "languages") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com"))])
- (protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions." single ((:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:keywords "convenience" "net" "protocols") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/protocols.el"))])
- (proxy-mode . [(20200131 816) ((emacs (25))) "A minor mode to toggle proxy." single ((:commit . "e9b2a4bb032aaf13b006b74eec309a9bf2249cf0") (:keywords "comm" "proxy") (:url . "https://github.com/stardiviner/proxy-mode"))])
- (psalm . [(20200510 1157) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to Psalm" single ((:commit . "b2a1e8a9524b0004e62996c70da5536f86e56182") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/psalm.el"))])
- (psc-ide . [(20200702 1540) ((emacs (25)) (dash (2 13 0)) (dash-functional (1 2 0)) (company (0 8 7)) (s (1 10 0)) (flycheck (0 24)) (let-alist (1 0 4)) (seq (1 11))) "Minor mode for PureScript's IDE server." tar ((:commit . "663f4e2cf9cbafdd4b9a60c34346596e2a40c87c") (:keywords "languages") (:authors ("Erik Post" . "erik@shinsetsu.nl") ("Dmitry Bushenko" . "d.bushenko@gmail.com") ("Christoph Hegemann" . "christoph.hegemann1337@gmail.com") ("Brian Sermons")) (:maintainer "Erik Post" . "erik@shinsetsu.nl") (:url . "https://github.com/purescript-emacs/psc-ide-emacs"))])
- (psci . [(20191025 830) ((emacs (24 4)) (purescript-mode (13 10)) (dash (2 9 0))) "Major mode for purescript repl psci" tar ((:commit . "95fb5d14033add8fe9c8c6b4379758beb88af1d0") (:keywords "languages" "purescript" "psci" "repl") (:authors ("Antoine R. Dumont <eniotna.t AT gmail.com>")) (:maintainer "Antoine R. Dumont <eniotna.t AT gmail.com>") (:url . "https://github.com/purescript-emacs/emacs-psci"))])
- (psession . [(20200714 555) ((emacs (24)) (cl-lib (0 5)) (async (1 9 3))) "Persistent save of elisp objects." single ((:commit . "d2b8f8d8c6acd2f86f3a7774a7079f40b1b75f8e") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/psession"))])
- (psysh . [(20190709 106) ((emacs (24 3)) (s (1 9 0)) (f (0 17)) (php-runtime (0 2))) "PsySH, PHP interactive shell (REPL)" single ((:commit . "21250984ad8137aa3440ac12e52475ef03f19fcb") (:keywords "processes" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/psysh.el"))])
- (pt . [(20161226 1959) nil "A front-end for pt, The Platinum Searcher." single ((:commit . "6d99b2aaded3ece3db19a20f4b8f1d4abe382622") (:keywords "pt" "ack" "ag" "grep" "search") (:authors ("Bailey Ling")) (:maintainer "Bailey Ling") (:url . "https://github.com/bling/pt.el"))])
- (pubmed . [(20200618 2203) ((emacs (25 1)) (deferred (0 5 1)) (esxml (0 3 4)) (s (1 12 0)) (unidecode (0 2))) "Interface to PubMed" tar ((:commit . "88aeb71ed4354af0b58354636ee6a9485887213d") (:keywords "pubmed" "hypermedia") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com") (:url . "https://gitlab.com/fvdbeek/emacs-pubmed"))])
- (pug-mode . [(20180513 2126) ((emacs (24 4)) (cl-lib (0 5))) "Major mode for jade/pug template files" single ((:commit . "685fd3414d89736bf232f5d1a6bed9e0353b98fe") (:keywords "markup" "language" "jade" "pug") (:authors ("Nathan Weizenbaum")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-pug-mode"))])
- (pulseaudio-control . [(20200406 752) nil "Use `pactl' to manage PulseAudio volumes." single ((:commit . "a931533140547510decdc368f39b2d2b97ca725f") (:keywords "multimedia" "hardware" "sound" "pulseaudio") (:authors ("Alexis" . "flexibeast@gmail.com") ("Ellington Santos" . "ellingtonsantos@gmail.com") ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:url . "https://github.com/flexibeast/pulseaudio-control"))])
- (punctuality-logger . [(20141120 2031) nil "Punctuality logger for Emacs" single ((:commit . "e09e5dd37bc92289fa2f7dc44aed51a7b5e04bb0") (:keywords "reminder" "calendar") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:url . "https://gitlab.com/elzair/punctuality-logger"))])
- (pungi . [(20150222 1246) ((jedi (0 2 0 -3 2)) (pyvenv (1 5))) "Integrates jedi with virtualenv and buildout python environments" single ((:commit . "a2d4d439ea371be0b064a12248288903b8a521a0") (:keywords "convenience") (:authors ("Matthew Russell" . "matthew.russell@horizon5.org")) (:maintainer "Matthew Russell" . "matthew.russell@horizon5.org"))])
- (punpun-theme . [(20200506 1241) nil "A bleak theme" tar ((:commit . "c1fa9f403b100aceac4c2dcb053111b2de701f16"))])
- (puppet-mode . [(20200505 344) ((emacs (24 1)) (pkg-info (0 4))) "Major mode for Puppet manifests" single ((:commit . "0e2e32a3b1644edd8010bd3d44e83def683348b3") (:keywords "languages") (:authors ("Vox Pupuli" . "voxpupuli@groups.io") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com") ("Russ Allbery" . "rra@stanford.edu")) (:maintainer "Vox Pupuli" . "voxpupuli@groups.io") (:url . "https://github.com/voxpupuli/puppet-mode"))])
- (purescript-mode . [(20200708 827) ((emacs (24)) (cl-lib (0 6))) "A PureScript editing mode" tar ((:commit . "154ad16b61fb9dec83a6c863ffaf92638278f00f"))])
- (purp-theme . [(20190629 1829) nil "No description available." tar ((:commit . "f821a7c30452d970ccb0ee08b68d56603860e31d"))])
- (purple-haze-theme . [(20141015 229) ((emacs (24 0))) "an overtly purple color theme for Emacs24." single ((:commit . "3e245cbef7cd09e6b3ee124963e372a04e9a6485") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-purple-haze-theme"))])
- (purty-mode . [(20131004 2259) nil "Safely pretty-print greek letters, mathematical symbols, or anything else." single ((:commit . "8eef77317a3bab07ade212353a50fbd3f20f365a") (:authors ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainer "James Atwood" . "jatwood@cs.umass.edu"))])
- (pushbullet . [(20140809 1232) ((grapnel (0 5 2)) (json (1 2))) "Emacs client for the PushBullet Android app" single ((:commit . "73c59a0f1dc04875b3e5a2c8afbc26c32128e445") (:keywords "convenience") (:authors ("Abhishek L" . "abhishek.lekshmanan@gmail.com")) (:maintainer "Abhishek L" . "abhishek.lekshmanan@gmail.com") (:url . "http://www.github.com/theanalyst/revolver"))])
- (pushover . [(20170818 2103) ((cl-lib (0 5))) "Pushover API Access" single ((:commit . "bbe3ac8df3c532a72da4552615af960b8a577588") (:keywords "notifications") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:url . "http://github.com/swflint/pushover.el"))])
- (px . [(20170317 2330) nil "preview inline latex in any mode" single ((:commit . "0c52f7933eab3ca1642ab0df151db9950430c9e2") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com") (:url . "http://github.com/aaptel/preview-latex"))])
- (py-autopep8 . [(20160925 1052) nil "Use autopep8 to beautify a Python buffer" single ((:commit . "68e12d8788c91c7ec53a68acf1d23adb2ffa4788") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzke" . "f.paetzke@gmail.com") (:url . "http://paetzke.me/project/py-autopep8.el"))])
- (py-gnitset . [(20170821 1732) nil "Run your Python tests any way you'd like" single ((:commit . "1e993cc29cbc31e06fe1e335dec198e21972fa55") (:authors ("Brandon W Maister" . "quodlibetor@gmail.com")) (:maintainer "Brandon W Maister" . "quodlibetor@gmail.com") (:url . "https://www.github.com/quodlibetor/py-gnitset"))])
- (py-import-check . [(20130802 1111) nil "Finds the unused python imports using importchecker" single ((:commit . "9787f87745a4234cd9bed711860b707902bc8ae4") (:keywords "python" "import" "check") (:authors ("Sibi" . "sibi@psibi.in")) (:maintainer "Sibi" . "sibi@psibi.in") (:url . "https://github.com/psibi/emacs-py-import-check"))])
- (py-isort . [(20160925 1018) nil "Use isort to sort the imports in a Python buffer" single ((:commit . "e67306f459c47c53a65604e4eea88a3914596560") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "http://paetzke.me/project/py-isort.el"))])
- (py-smart-operator . [(20170531 1209) ((s (1 9 0))) "smart-operator for python-mode" single ((:commit . "0c8a66faca4b35158d0b5885472cb75286039167") (:keywords "python" "convenience" "smart-operator") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com"))])
- (py-test . [(20151117 622) ((dash (2 9 0)) (f (0 17)) (emacs (24 4))) "A test runner for Python code." single ((:commit . "3b2a0bdaacb54df6f2bee8317423e5c0d159d5cf") (:keywords "python" "testing" "py.test") (:authors ("Bogdan Paul Popa" . "popa.bogdanp@gmail.com")) (:maintainer "Bogdan Paul Popa" . "popa.bogdanp@gmail.com") (:url . "https://github.com/Bogdanp/py-test.el"))])
- (py-yapf . [(20160925 1122) nil "Use yapf to beautify a Python buffer" single ((:commit . "a878304202ad827a1f3de3dce1badd9ca8731146") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzke" . "f.paetzke@gmail.com") (:url . "https://github.com/paetzke/py-yapf.el"))])
- (pycarddavel . [(20150831 1216) ((helm (1 7 0)) (emacs (24 0))) "Integrate pycarddav" single ((:commit . "a6d81ee4eb8309cd82f6082aeca68c5a015702a3") (:keywords "helm" "pyccarddav" "carddav" "message" "mu4e" "contacts") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))])
- (pycoverage . [(20200513 2047) ((emacs (24 3))) "Support for coverage stats on Python 2.X and 3" tar ((:commit . "3c69ed312121368f1b24cc04d54a29ce4ed4f743") (:keywords "project" "convenience") (:authors ("matt harrison")) (:maintainer "matt harrison") (:url . "https://github.com/mattharrison/pycoverage.el"))])
- (pydoc . [(20200107 54) nil "functional, syntax highlighted pydoc navigation" single ((:commit . "1dfbab7800827adadb649d6e02c31dd9cd65f0d3") (:keywords "pydoc" "python") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "Brian J. Lopes" . "statmobile@gmail.com") (:url . "https://github.com/statmobile/pydoc"))])
- (pyenv-mode . [(20200518 1521) ((pythonic (0 1 0))) "Integrate pyenv with python-mode" single ((:commit . "d191037fe62ed8d4fee5888845da3e2c386d8e89") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/pyenv-mode"))])
- (pyenv-mode-auto . [(20180620 1252) ((pyenv-mode (0 1 0)) (s (1 11 0)) (f (0 17 0))) "Automatically activates pyenv version if .python-version file exists." single ((:commit . "347b94cd5ad22e33cc41be661c102d4548767858") (:keywords "python" "pyenv") (:authors ("Sviatoslav Bulbakha" . "mail@ssbb.me")) (:maintainer "Sviatoslav Bulbakha" . "mail@ssbb.me") (:url . "https://github.com/ssbb/pyenv-mode-auto"))])
- (pygen . [(20161121 506) ((elpy (1 12 0)) (python-mode (6 2 2)) (dash (2 13 0))) "Python code generation using Elpy and Python-mode." single ((:commit . "9019ff44ba49d7295b1476530feab91fdadb084b") (:keywords "python" "code generation") (:authors ("Jack Crawley <http://www.github.com/jackcrawley>")) (:maintainer "Jack Crawley <http://www.github.com/jackcrawley>") (:url . "https://github.com/JackCrawley/pygen/"))])
- (pyim . [(20200510 704) ((emacs (24 4)) (popup (0 1)) (async (1 6)) (xr (1 13)) (pyim-basedict (0 1))) "A Chinese input method support quanpin, shuangpin, wubi and cangjie." tar ((:commit . "e54153f462dd8cd8e9bb379e0483a2849ec94f42"))])
- (pyim-basedict . [(20190719 1252) nil "The default pinyin dict of pyim" tar ((:commit . "d499104189a9462cb80f8efd9713e4064dc7093d") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/pyim-basedict"))])
- (pyim-cangjie5dict . [(20170730 246) ((pyim (1 0))) "Some cangjie5 dicts for pyim" tar ((:commit . "c8618590780b818db1a67a29bc47c5d25903517a") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:authors ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainer "Yuanchen Xie" . "yuanchen.gm@gmail.com") (:url . "https://github.com/erstern/pyim-cangjie5dict"))])
- (pyim-wbdict . [(20200331 542) ((pyim (1 0))) "Some wubi dicts for pyim" tar ((:commit . "daa223e2603a5ef3e6c8e33575d8f4e4604a8d3c") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/pyim-wbdict"))])
- (pyimport . [(20180308 1752) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" single ((:commit . "a6f63cf7ed93f0c0f7c207e6595813966f8852b9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (pyimpsort . [(20160130 453) ((emacs (24 3))) "Sort python imports." tar ((:commit . "d5c61d70896b642646dfd3c809c06174ae086c1a") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/pyimpsort.el"))])
- (pylint . [(20200503 1624) nil "minor mode for running `pylint'" single ((:commit . "707fc4603b9d505bda68cf6adf9805882b99d73c") (:keywords "languages" "python") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))])
- (pynt . [(20180710 726) ((emacs (24 4)) (ein (0 13 1)) (epc (0 1 1)) (deferred (0 5 1))) "Generate and scroll EIN buffers from python code" single ((:commit . "86cf9ce78d34f92bfd0764c9cbb75427ebd429e6") (:keywords "convenience") (:authors ("Edward Banner" . "edward.banner@gmail.com")) (:maintainer "Edward Banner" . "edward.banner@gmail.com") (:url . "https://github.com/ebanner/pynt"))])
- (pyramid . [(20181212 1204) ((emacs (25 2)) (pythonic (0 1 1)) (tablist (0 70))) "Minor mode for working with pyramid projects" tar ((:commit . "f0687b8aee3e685b55e2c66b16211e02ac5f9d94") (:keywords "python" "pyramid" "pylons" "convenience" "tools" "processes") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:url . "https://github.com/dakra/pyramid.el"))])
- (pytest . [(20200330 41) ((s (1 9 0))) "Easy Python test running in Emacs" single ((:commit . "6934047242db79b1c53e9fe3e0734cc9719ed1c4") (:keywords "pytest" "python" "testing") (:url . "https://github.com/ionrock/pytest-el"))])
- (pytest-pdb-break . [(20200426 2335) ((emacs (25))) "A pytest PDB launcher" tar ((:commit . "22e54796b0522f812423b2fb0ec842e2984ff0f7") (:keywords "languages" "tools") (:authors ("Jane Soko" . "poppyschmo@protonmail.com")) (:maintainer "Jane Soko" . "poppyschmo@protonmail.com") (:url . "https://github.com/poppyschmo/pytest-pdb-break"))])
- (python-black . [(20200324 930) ((emacs (25)) (dash (2 16 0)) (reformatter (0 3))) "Reformat Python using python-black" single ((:commit . "a11ca73f6dfcdc125d27ff184496d66bdbd71326") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-python-black"))])
- (python-cell . [(20200314 1147) ((emacs (25 1))) "Support for MATLAB-like cells in python mode" single ((:commit . "4f0778b05bfb936861449bcb998ed620cd9b31ad") (:keywords "extensions" "python" "matlab" "cell") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:url . "https://github.com/thisch/python-cell.el"))])
- (python-django . [(20150822 404) nil "A Jazzy package for managing Django projects" single ((:commit . "fc54ad74f0309670359b939f64d0f1fff68aeac4") (:keywords "languages") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "FSF") (:url . "https://github.com/fgallina/python-django.el"))])
- (python-docstring . [(20190716 921) nil "Smart Python docstring formatting" tar ((:commit . "ec253711f2bdcb3848046bb68f6405a7bf9eb0fb"))])
- (python-environment . [(20150310 853) ((deferred (0 3 1))) "virtualenv API for Emacs Lisp" tar ((:commit . "401006584e32864a10c69d29f14414828909362e") (:keywords "applications" "tools") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))])
- (python-info . [(20151228 1852) nil "Python info manual for Emacs" tar ((:commit . "306f15441b54b25757cdfd3b327b84024ea21ed7"))])
- (python-mode . [(20200608 737) nil "Python major mode" tar ((:commit . "6658e5d768db0c0d8dbc6fdedff3a85b65327061"))])
- (python-pytest . [(20200730 1937) ((emacs (24 4)) (dash (2 12 0)) (dash-functional (2 12 0)) (magit-popup (2 12 0)) (projectile (0 14 0)) (s (1 12 0))) "helpers to run pytest" single ((:commit . "6e6ba842be81924d85dfabd564ae73549e4cbdd9") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-python-pytest"))])
- (python-switch-quotes . [(20161228 809) ((emacs (24 3))) "cycle between ' and \" quotes in python strings" single ((:commit . "93f1e9b40e061a6cea480139e8b1362b6404abd0") (:keywords "python" "tools" "convenience") (:authors ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainer "Vladimir Lagunov" . "lagunov.vladimir@gmail.com") (:url . "https://github.com/werehuman/python-switch-quotes"))])
- (python-test . [(20181018 29) ((emacs (25 1))) "Python testing integration" single ((:commit . "f899975b133539e19ba822e4b0bfd1a28572967e") (:keywords "convenience" "tools" "processes") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/python-test.el"))])
- (python-x . [(20190611 1303) ((python (0 24)) (folding (0)) (cl-lib (0 5))) "python.el extras for interactive evaluation" tar ((:commit . "b1f8eaccee210d7c0580dba6dc9bd361fcf3765d") (:keywords "python" "eval" "folding") (:url . "https://github.com/wavexx/python-x.el") (:author . "Yuri D'Elia <wavexx@thregr.org>"))])
- (pythonic . [(20200304 1901) ((emacs (25 1)) (s (1 9)) (f (0 17 2))) "Utility functions for writing pythonic emacs package." single ((:commit . "f577f155fb0c6e57b3ff82447ac25dcb3ca0080f") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/pythonic"))])
- (pyvenv . [(20191202 1039) nil "Python virtual environment interface" single ((:commit . "861998b6d157ae73b829f02a5a6c8a9118310831") (:keywords "python" "virtualenv" "tools") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainer "Jorgen Schaefer" . "contact@jorgenschaefer.de") (:url . "http://github.com/jorgenschaefer/pyvenv"))])
- (q-mode . [(20181216 1747) ((emacs (24))) "A q editing mode" single ((:commit . "7a13fb68a0ad3d843c8cdc188cf0adb9723f42f7") (:keywords "faces" "files" "q") (:url . "https://github.com/psaris/q-mode"))])
- (ql . [(20180418 2020) ((emacs (24))) "Control Quod Libet" single ((:commit . "d976414ba6aa576ad524b5ee5bfa620efd072258") (:keywords "multimedia") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:url . "https://github.com/ieure/ql-el"))])
- (qml-mode . [(20161016 31) nil "Major mode for editing QT Declarative (QML) code." single ((:commit . "6c5f33ba88ae010bf201a80ee8095e20a724558c") (:keywords "qml" "qt" "qt declarative") (:authors ("Yen-Chin Lee" . "coldnew.tw@gmail.com")) (:maintainer "Yen-Chin Lee" . "coldnew.tw@gmail.com") (:url . "https://github.com/coldnew/qml-mode"))])
- (qt-pro-mode . [(20170604 1841) ((emacs (24))) "Qt Pro/Pri major mode" single ((:commit . "7a2da323de834294b413cbbb3c92f42f54913643") (:keywords "extensions") (:authors ("Todd Neal" . "tolchz@gmail.com")) (:maintainer "Todd Neal" . "tolchz@gmail.com"))])
- (qtcreator-theme . [(20200203 1436) ((emacs (24 3))) "A color theme that mimics Qt Creator IDE" single ((:commit . "c56d792d5ab01743e1350e0a7a8a89bb3d2e0c4f") (:keywords "theme" "light" "faces") (:authors ("Lesley Lai" . "lesley@lesleylai.info")) (:maintainer "Lesley Lai" . "lesley@lesleylai.info") (:url . "https://github.com/LesleyLai/emacs-qtcreator-theme"))])
- (quack . [(20181106 1301) nil "enhanced support for editing and running Scheme code" single ((:commit . "2146805ce2b5a9b155d73929986f11e713787e26"))])
- (quasi-monochrome-theme . [(20200415 705) nil "Quasi Monochrome theme" tar ((:commit . "b38d71860fdea945e10e8a766ac9dfa1410ade67") (:keywords "color" "theme" "monochrome"))])
- (quelpa . [(20200617 2205) ((emacs (25 1))) "Emacs Lisp packages built directly from source" tar ((:commit . "82de0abbeb0e550a1b4730bee88d80c4904908d4") (:keywords "tools" "package" "management" "build" "source" "elpa") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://github.com/quelpa/quelpa"))])
- (quelpa-use-package . [(20200307 805) ((emacs (25 1)) (quelpa (0)) (use-package (2))) "quelpa handler for use-package" single ((:commit . "00ce667293c7cd5dc79d4b6077785fcc57455775") (:keywords "package" "management" "elpa" "use-package") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://github.com/quelpa/quelpa-use-package"))])
- (quick-buffer-switch . [(20200727 720) nil "Quick switch to file or dir buffers." single ((:commit . "ceb5222599b861f9d1133b1509516fcf07a3cd67") (:keywords "emacs" "configuration") (:authors ("Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>")) (:maintainer "Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>"))])
- (quick-peek . [(20200130 2059) ((emacs (24 3))) "Inline quick-peek windows" single ((:commit . "03a276086795faad46a142454fc3e28cab058b70") (:keywords "tools" "help" "doc" "convenience") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com"))])
- (quick-preview . [(20191017 1920) nil "quick preview using GNOME sushi, gloobus or quick look" single ((:commit . "a312ab5539b9a362da9d305e4da814e17c5721c9") (:keywords "files" "hypermedia") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/quick-preview.el"))])
- (quick-shell-keybind . [(20171023 613) ((emacs (24))) "Interactively bind a key to shell commands" single ((:commit . "5f4541a5a5554d108bf16b5fd1713e962161ca1b") (:keywords "maint" "convenience" "processes") (:authors ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainer "eyeinsky" . "eyeinsky9@gmail.com") (:url . "https://github.com/eyeinsky/quick-shell-keybind"))])
- (quickref . [(20170817 1232) ((dash (1 0 3)) (s (1 0 0))) "Display relevant notes-to-self in the echo area" single ((:commit . "f368c8b8219bb90498c5ab84e26f00eedaa234cf") (:authors ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/quickref.el"))])
- (quickrun . [(20200603 1902) ((emacs (24 3))) "Run commands quickly" single ((:commit . "ce7383c53215077f7e1d258d389cf8731309fbe9") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-quickrun"))])
- (quiet . [(20200211 721) nil "Disconnect from the online world for a while" single ((:commit . "f8a4ef0be086f97e7fb631df7060f29cc4025b98") (:keywords "convenience" "quiet" "distraction" "network" "detachment" "offline") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:url . "https://github.com/zzkt/quiet"))])
- (quilt . [(20190828 506) ((emacs (26 0))) "Minor mode for working with files in quilt" single ((:commit . "b56a1f1acc46cdf8655710e4c8f24f5f31f22c6a") (:keywords "extensions") (:authors ("Matt Mackall" . "mpm@selenic.com")) (:maintainer "Jan Stranik" . "jan@stranik.org") (:url . "https://github.com/jstranik/emacs-quilt"))])
- (quiz . [(20190525 1206) ((cl-lib (0 5)) (emacs (25))) "Multiple choice quiz game" single ((:commit . "570bf53926d89282cdb9653bd5aa8fe968f92bbd") (:keywords "games" "trivia" "quiz") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/quiz.el"))])
- (r-autoyas . [(20140101 1510) ((ess (0)) (yasnippet (0 8 0))) "Provides automatically created yasnippets for R function argument lists." tar ((:commit . "b4020ee7f5f895e0065b8b26da8a49c51432d530") (:keywords "r" "yasnippet") (:authors ("Sven Hartenstein & Matthew Fidler")) (:maintainer "Matthew Fidler") (:url . "https://github.com/mlf176f2/r-autoyas.el"))])
- (racer . [(20191001 2344) ((emacs (25 1)) (rust-mode (0 2 0)) (dash (2 13 0)) (s (1 10 0)) (f (0 18 2)) (pos-tip (0 4 6))) "code completion, goto-definition and docs browsing for Rust via racer" single ((:commit . "a0bdf778f01e8c4b8a92591447257422ac0b455b") (:keywords "abbrev" "convenience" "matching" "rust" "tools") (:authors ("Phil Dawes")) (:maintainer "Phil Dawes") (:url . "https://github.com/racer-rust/emacs-racer"))])
- (racket-mode . [(20200623 1549) ((emacs (25 1)) (faceup (0 0 2)) (pos-tip (20191127 1028))) "Racket editing, REPL, and more" tar ((:commit . "5eb31a284c8db5102bc71b1e2c6ce3a095ae085b") (:authors ("Greg Hendershott")) (:maintainer "Greg Hendershott") (:url . "https://www.racket-mode.com/"))])
- (rails-log-mode . [(20140408 425) nil "Major mode for viewing Rails log files" single ((:commit . "ff440003ad7d47cb0ac3300f2a632f4cfd36a446") (:keywords "rails" "log") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))])
- (railscasts-reloaded-theme . [(20190308 759) nil "Railscasts Reloaded color theme" single ((:commit . "c6a1cf13a164f22b026b0959527c3b98c2b1aa49") (:authors ("George Thomas" . "iamgeorgethomas@gmail.com")) (:maintainer "George Thomas" . "iamgeorgethomas@gmail.com") (:url . "https://github.com/thegeorgeous/railscasts-reloaded-theme"))])
- (railscasts-theme . [(20150219 1525) nil "Railscasts color theme for GNU Emacs." single ((:commit . "1340c3f6c2717761cab95617cf8dcbd962b1095b") (:keywords "railscasts" "color" "theme") (:authors ("Oleg Shaldybin")) (:maintainer "Oleg Shaldybin") (:url . "https://github.com/mikenichols/railscasts-theme"))])
- (rainbow-blocks . [(20171025 1438) nil "Block syntax highlighting for lisp code" single ((:commit . "dd435d7bb34ff6f162a5f315df308b90b7e9f842") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/rainbow-blocks"))])
- (rainbow-delimiters . [(20191018 1233) nil "Highlight brackets according to their depth" single ((:commit . "5125f4e47604ad36c3eb4706310fcafac729ca8c") (:keywords "faces" "convenience" "lisp" "tools") (:authors ("Jeremy Rayman" . "opensource@jeremyrayman.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/rainbow-delimiters"))])
- (rainbow-fart . [(20200718 437) ((emacs (25 1)) (flycheck (32 -4))) "Checks the keywords of code to play suitable sounds" tar ((:commit . "af1a269f1752b6a4651641b53085050193389224") (:keywords "tools") (:url . "https://github.com/stardiviner/emacs-rainbow-fart"))])
- (rainbow-identifiers . [(20141102 1526) ((emacs (24))) "Highlight identifiers according to their names" single ((:commit . "19fbfded1baa98d12335f26f6d7b20e5ae44ce2e") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/rainbow-identifiers"))])
- (rake . [(20180212 1008) ((f (0 13 0)) (dash (1 5 0)) (cl-lib (0 5))) "Run rake commands" single ((:commit . "9c204334b03b4e899fadae6e59c20cf105404128") (:keywords "rake" "ruby") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:url . "https://github.com/asok/rake.el"))])
- (raku-mode . [(20200524 1625) ((emacs (24 4)) (pkg-info (0 1))) "Major mode for editing Raku code" tar ((:commit . "e0639c89a3a29e9196e298951da6c3a79fb944e8") (:keywords "languages") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:url . "https://github.com/hinrik/perl6-mode"))])
- (rally-mode . [(20161114 354) ((popwin (1 0 0))) "a mode to interact with the Rally Software web site." single ((:commit . "0f5e09a6abe2de7613f174b4f54863df93343134") (:keywords "rally" "ca" "agile") (:authors ("Sean LeBlanc" . "seanleblanc@gmail.com")) (:maintainer "Sean LeBlanc" . "seanleblanc@gmail.com") (:url . "https://pragcraft.wordpress.com/"))])
- (rand-theme . [(20151219 2335) ((cl-lib (0 5))) "Random Emacs theme at start-up!" single ((:commit . "65a00e5c5150f857aa96803b68f50bc8da0215b7") (:authors ("Daniel Gopar")) (:maintainer "Daniel Gopar") (:url . "https://github.com/gopar/rand-theme"))])
- (random-splash-image . [(20151003 130) nil "Randomly sets splash image to *GNU Emacs* buffer on startup." single ((:commit . "53a39ebfd8ac6be066a652a508a717870f94218a") (:keywords "games") (:authors ("kakakaya <kakakaya AT gmail.com>")) (:maintainer "kakakaya <kakakaya AT gmail.com>") (:url . "https://github.com/kakakaya/random-splash-image"))])
- (ranger . [(20200607 2002) ((emacs (24 4))) "Make dired more like ranger" single ((:commit . "d7c18370981c9e585bc0fb78f7e55033457ca643") (:keywords "files" "convenience" "dired") (:authors ("Rich Alesi <https://github.com/ralesi>")) (:maintainer "Rich Alesi <https://github.com/ralesi>") (:url . "https://github.com/ralesi/ranger"))])
- (rase . [(20120928 2045) nil "Run At Sun Event daemon" single ((:commit . "59b5f7e8102570b65040e8d55781c7ea28de7338") (:keywords "solar" "sunrise" "sunset" "midday" "midnight") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:url . "https://github.com/m00natic/rase/"))])
- (rats . [(20170818 1013) ((s (1 10 0)) (go-mode (1 3 1)) (cl-lib (0 5))) "Rapid testing suite for Go" single ((:commit . "a6d55aebcc54f669c6c6ffedf84364c4097903cc") (:keywords "go") (:authors ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainer "Antoine Kalmbach" . "ane@iki.fi"))])
- (rbenv . [(20141120 749) nil "Emacs integration for rbenv" single ((:commit . "2ea1a5bdc1266caef1dd77700f2c8f42429b03f1") (:keywords "ruby" "rbenv") (:authors ("Yves Senn" . "yves.senn@gmail.com")) (:maintainer "Yves Senn" . "yves.senn@gmail.com") (:url . "https://github.com/senny/rbenv.el"))])
- (rbt . [(20170202 2302) ((popup (0 5 3)) (magit (20160128 1201))) "Integrate reviewboard with emacs." single ((:commit . "32bfba9062a014e375451cf4203c29535b5efc1e") (:keywords "reviewboard" "rbt") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com"))])
- (rbtagger . [(20200714 1658) ((emacs (25 1))) "Ruby tagging tools" tar ((:commit . "b3333b9dc9ffdaf5dfb2ea6ef2dd0f74e2f0f03f") (:keywords "languages" "tools") (:authors ("Thiago Araújo" . "thiagoaraujos@gmail.com")) (:maintainer "Thiago Araújo" . "thiagoaraujos@gmail.com") (:url . "https://www.github.com/thiagoa/rbtagger"))])
- (rc-mode . [(20160913 1918) nil "Major mode for the Plan9 rc shell" single ((:commit . "fe2e0570bf9c19a292e16b18fd4b0a256df5d93f") (:keywords "rc" "plan9" "shell") (:authors ("Jordan Brown")) (:maintainer "Jordan Brown") (:url . "https://github.com/mrhmouse/rc-mode.el"))])
- (rcirc-alert . [(20141127 1047) nil "Configurable alert messages on top of RCIRC" tar ((:commit . "0adf8ff9c47023fec578f678424be62b0f49057f") (:keywords "lisp" "rcirc" "irc" "alert" "awesome") (:maintainer "Cayetano Santos"))])
- (rcirc-alertify . [(20140407 119) ((alert (20140406 1353))) "Cross platform notifications for rcirc" single ((:commit . "ea5cafc55893f375eccbe013d12dbaa94bf6e259") (:keywords "comm" "convenience") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org"))])
- (rcirc-groups . [(20170731 2101) nil "an emacs buffer in rcirc-groups major mode" single ((:commit . "b68ece9d219b909244d4e3c0d8bf6a746d6fead7") (:keywords "comm" "convenience") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "http://tapoueh.org/emacs/rcirc-groups.html"))])
- (rcirc-notify . [(20150219 2204) nil "libnotify popups" single ((:commit . "841a7b5a6cdb0c11a812df924d2c6a7d364fd455") (:keywords "lisp" "rcirc" "irc" "notify" "growl") (:authors ("Will Farrington, Alex Schroeder <alex@gnu.org>, Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (rcirc-styles . [(20160207 250) ((cl-lib (0 5))) "support mIRC-style color and attribute codes" single ((:commit . "f313bf6a7470bed314b27c7a40558cb787d7bc67"))])
- (rdf-prefix . [(20200216 914) nil "Prefix lookup for RDF" single ((:commit . "825af2c584fbad9e67c2c08e29040776fa647fe0") (:keywords "convenience" "abbrev") (:authors ("Simen Heggestøyl" . "simenheg@gmail.com")) (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") (:url . "https://github.com/simenheg/rdf-prefix"))])
- (rdp . [(20120929 154) nil "Recursive Descent Parser library" single ((:commit . "b620192afada04aec33b38cc130fef0765f41ca9") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/rdp"))])
- (rdxmk . [(20170630 134) nil "A small set of tools for redox developments" tar ((:commit . "e78749fb29738365ffa4d863ffabeb969ebb0bcf") (:keywords "redox" "convenience" "tools") (:authors ("Jacob Salzberg" . "jsalzbergedu@yahoo.com")) (:maintainer "Jacob Salzberg" . "jsalzbergedu@yahoo.com") (:url . "https://github.com/jsalzbergedu/rdxmk"))])
- (react-snippets . [(20181002 1046) ((yasnippet (0 7 0))) "Yasnippets for React" tar ((:commit . "87ccb640d265fe799583ab55605b84d113223694"))])
- (read-aloud . [(20160923 500) ((emacs (24 4))) "A simple interface to TTS engines" single ((:commit . "c662366226abfb07204ab442b4f853ed85438d8a") (:keywords "multimedia") (:authors ("Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com")) (:maintainer "Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com") (:url . "https://github.com/gromnitsky/read-aloud.el"))])
- (readline-complete . [(20150708 1437) nil "offers completions in shell mode" single ((:commit . "30c020c37b2741160cc37e656e13c85d826a0ebf") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))])
- (real-auto-save . [(20200505 1537) ((emacs (24 4))) "Automatically save your buffers/files at regular intervals" single ((:commit . "481a2d1460ab5a9b6df3721dda76ad515923bfd1") (:authors ("Chaoji Li <lichaoji AT gmail DOT com>") ("Anand Reddy Pandikunta <anand21nanda AT gmail DOT com>")) (:maintainer "Chaoji Li <lichaoji AT gmail DOT com>") (:url . "https://github.com/ChillarAnand/real-auto-save"))])
- (realgud . [(20200728 2336) ((load-relative (1 3 1)) (loc-changes (1 2)) (test-simple (1 3 0)) (emacs (25))) "A modular front-end for interacting with external debuggers" tar ((:commit . "de31e772092bf40cdc7de4ab3c63efe04f8e6736") (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud/"))])
- (realgud-byebug . [(20190520 1140) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to the Ruby byebug debugger" tar ((:commit . "f8f20b92c6b13f75cc9797921c0e28d3def48b1c") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-byebug"))])
- (realgud-ipdb . [(20200722 1116) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to ipdb" tar ((:commit . "f18f907aa4ddd3e59dc19ca296d4ee2dc5e436b0") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-ipdb"))])
- (realgud-jdb . [(20200722 1120) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to Java's jdb debugger\"" tar ((:commit . "1c183b2f8aae0de60942ea01444b896bf182c66a") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-jdb"))])
- (realgud-lldb . [(20190912 1335) ((load-relative (1 3 1)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to lldb" tar ((:commit . "47cb0178fdde50a9d9151ab45806b41007cd758a") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "http://github.com/realgud/realgud-lldb"))])
- (realgud-node-debug . [(20190525 1634) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (25))) "Realgud front-end to older \"node debug\"" tar ((:commit . "72e786359ce9dace1796b0d81a00e9340e9c90ad") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "http://github.com/realgud/realgud-node-debug"))])
- (realgud-node-inspect . [(20190523 1251) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to newer \"node inspect\"" tar ((:commit . "c3ed48cf3bc2b28f9fd23bcf60ea13a3cf019fc8") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "http://github.com/realgud/realgud-node-inspect"))])
- (realgud-old-debuggers . [(20190520 1150) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to older lesser-used debuggers" tar ((:commit . "0fad38283e885c452160232e01adf3f6ae51983b") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-old-debuggers"))])
- (realgud-pry . [(20200620 1006) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to the Ruby pry debugger" tar ((:commit . "7b502b9e802b8594c90da329b9716bcfd2c981b1") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-pry"))])
- (realgud-rdb2 . [(20190520 1146) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end for interacting with Ruby debugger2" tar ((:commit . "3594aa74f7afda3c3251bb2af7fe0e8ec6d621ae") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-ruby-debugger2"))])
- (realgud-trepan-ni . [(20200722 1118) ((load-relative (1 2)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to trepan-ni" tar ((:commit . "6e38cf838c7b47b5f1353d00901b939ffa36d707") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-trepan-ni"))])
- (reaper . [(20200420 1703) ((emacs (24 3))) "Interact with Harvest time tracking app" single ((:commit . "c594d2fb9a027f360e98539a1debf5db639846b7") (:keywords "tools") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:url . "https://github.com/xendk/reaper"))])
- (reason-mode . [(20190710 1037) ((emacs (24 3))) "A major mode for editing ReasonML" tar ((:commit . "7cf6fbf4e8e86ebb76d118b2703e20b968e030d4") (:keywords "languages" "ocaml") (:authors ("Mozilla")) (:maintainer "Mozilla") (:url . "https://github.com/reasonml-editor/reason-mode"))])
- (reazon . [(20180921 1437) ((emacs (26))) "miniKanren for Emacs" tar ((:commit . "020be6467a83957adcbdcb192b61f2c76a94079b") (:keywords "languages" "extensions" "lisp") (:authors ("Nick Drozd" . "nicholasdrozd@gmail.com")) (:maintainer "Nick Drozd" . "nicholasdrozd@gmail.com") (:url . "https://github.com/nickdrozd/reazon"))])
- (rebecca-theme . [(20180324 821) ((emacs (24))) "Rebecca Purple Theme" single ((:commit . "9ac0c71c2858b76dc5499f62c7c7fb7f9e8f16bc") (:keywords "theme" "dark") (:authors ("vic" . "vborja@apache.org")) (:maintainer "vic" . "vborja@apache.org") (:url . "https://github.com/vic/rebecca-theme"))])
- (rebox2 . [(20121113 1300) nil "Handling of comment boxes in various styles." single ((:commit . "00634eca420cc48657b81e40e599ff8548083985") (:authors ("François Pinard") ("Le Wang")) (:maintainer "Le Wang (lewang.emacs!!!gmayo.com remove exclamations, correct host, hint: google mail)") (:url . "https://github.com/lewang/rebox2"))])
- (recentf-ext . [(20170926 35) nil "Recentf extensions" single ((:commit . "450de5f8544ed6414e88d4924d7daa5caa55b7fe") (:keywords "convenience" "files") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/recentf-ext.el"))])
- (recentf-remove-sudo-tramp-prefix . [(20180205 556) ((emacs (24 4))) "Normalise recentf history" single ((:commit . "84bbac534cb114d8d11b86790435b65d36e99e68") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/recentf-remove-sudo-tramp-prefix"))])
- (recently . [(20200120 1432) ((cl-lib (0 5)) (emacs (24))) "Track recently opened files to visit them again" single ((:commit . "fa8b52fe891a0adaabe0456f6f5a56a2600a831f") (:keywords "utility" "files") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:url . "https://github.com/10sr/recently-el"))])
- (recompile-on-save . [(20151126 1446) ((dash (1 1 0)) (cl-lib (0 5))) "Trigger recompilation on file save." single ((:commit . "92e11446869d878803d4f3dec5d2101380c12bb2") (:keywords "convenience" "files" "processes" "tools") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:url . "https://github.com/maio/recompile-on-save.el"))])
- (recover-buffers . [(20171009 437) nil "revisit all buffers from an auto-save file" tar ((:commit . "81a5cb53099955ebc2a411a44cba5a394ee3f2d1") (:authors ("era eriksson <http://www.iki.fi/era>")) (:maintainer "era eriksson <http://www.iki.fi/era>"))])
- (rect+ . [(20150621 44) nil "Extensions to rect.el" single ((:commit . "299b742faa0bc4448e0d5fe9cb98ab1eb93b8dcc") (:keywords "extensions" "data" "tools") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-rectplus"))])
- (rectangle-utils . [(20190411 1757) ((emacs (24)) (cl-lib (0 5))) "Some useful rectangle functions." single ((:commit . "46f7e73340fee40c1ab9a4e766a08ae3fce83ebe") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/rectangle-utils"))])
- (recursive-narrow . [(20190306 1521) nil "narrow-to-region that operates recursively" single ((:commit . "5e3e2067d5a148d7e64e64e0355d3b6860e4c259") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/recursive-narrow"))])
- (redis . [(20150531 1948) ((emacs (24)) (cl-lib (0 5))) "Redis integration" single ((:commit . "2c33f3397bc14e7a8192867b55920492d4eead8c") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/redis.el"))])
- (redpen-paragraph . [(20160625 1050) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "RedPen interface." single ((:commit . "0062f326106ce8be3c9b7d3fa0e88ed2c7bbfa5e") (:keywords "document" "proofreading" "help") (:authors ("karronoli")) (:maintainer "karronoli") (:url . "https://github.com/karronoli/redpen-paragraph.el"))])
- (redprl . [(20180418 1434) ((emacs (24 3))) "Major mode for editing RedPRL proofs and interacting with RedPRL" single ((:commit . "c72190de76f7ed1cfbe1d2046c96e99ac5022b0c") (:keywords "languages") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com"))])
- (redshank . [(20180730 407) ((paredit (21))) "Common Lisp Editing Extensions" tar ((:commit . "d059c5841044aa163664f8bf87c1d981bf0a04fe") (:keywords "languages" "lisp") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org"))])
- (redtick . [(20180424 2136) ((emacs (24 4))) "Smallest pomodoro timer (1 char)" tar ((:commit . "94b4cd43ac20c64dcac96edac2c1a3b9fcc59bb9") (:keywords "calendar") (:authors ("F. Febles")) (:maintainer "F. Febles") (:url . "http://github.com/ferfebles/redtick"))])
- (redtt . [(20181121 21) ((emacs (25 3))) "Major mode for editing redtt proofs" single ((:commit . "50689559ff970e33013b8cf8a3bbc8be18ec4e09") (:keywords "languages") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com") (:url . "http://github.com/RedPRL/redtt"))])
- (refine . [(20200507 731) ((emacs (24 3)) (s (1 11 0)) (dash (2 12 0)) (list-utils (0 4 4)) (loop (1 2))) "interactive value editing" single ((:commit . "d72fa50910b86217a35bb1b7e56adea206052021") (:keywords "convenience") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (reformatter . [(20200426 818) ((emacs (24 3))) "Define commands which run reformatters on the current buffer" single ((:commit . "dc6278a6b1e3565604346ac41a6ffc3cbab04031") (:keywords "convenience" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/reformatter.el"))])
- (regex-dsl . [(20100124 1028) nil "lisp syntax for regexps" single ((:commit . "ac89ab8b7691a165ef3007cb84417125cfc0632e") (:authors ("Aliaksey Kandratsenka" . "alk@tut.by")) (:maintainer "Aliaksey Kandratsenka" . "alk@tut.by"))])
- (regex-tool . [(20170104 1918) nil "A regular expression evaluation tool for programmers" single ((:commit . "0b4a0111143c88ef94bec56624cb2e00c1a054e6") (:keywords "regex" "languages" "programming" "development") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:url . "http://www.newartisans.com/"))])
- (region-bindings-mode . [(20140407 2214) nil "Enable custom bindings when mark is active." single ((:commit . "3fa5dbdbd7c000bebff6d9d14a4be326ec24b6fc") (:keywords "convenience") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz") (:url . "https://github.com/fgallina/region-bindings-mode"))])
- (region-convert . [(20181221 528) nil "Convert string in region by Lisp function" single ((:commit . "a50a0828a989fc1788a32946249a3758793156b3") (:keywords "region" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/right-click-context"))])
- (region-occurrences-highlighter . [(20190905 730) ((emacs (24))) "Mark occurrences of current region (selection)." single ((:commit . "ee86d6a79342c6e4b3cfad5ec73cb0a40e18ae3d") (:keywords "convenience") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:url . "https://github.com/alvarogonzalezsotillo/region-occurrences-highlighter"))])
- (region-state . [(20181205 1746) nil "Show the number of chars/lines or rows/columns in the region" single ((:commit . "8c636b655eef45e0015684699737d31e15450000") (:keywords "convenience") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/region-state.el"))])
- (register-channel . [(20180926 2349) nil "Jump around fast using registers" single ((:commit . "9272923757402d177a0b2deab1d9c3c74601c48e") (:keywords "convenience") (:authors ("Yang Zhao" . "YangZhao11@users.noreply.github.com")) (:maintainer "Yang Zhao" . "YangZhao11@users.noreply.github.com"))])
- (register-quicknav . [(20200524 2006) ((emacs (25 3))) "Quickly jump to next/previous register" single ((:commit . "c15ea92b0946c28b3f14986d42b15b0b534aa6a2") (:keywords "convenience") (:authors ("tastytea" . "tastytea@tastytea.de")) (:maintainer "tastytea" . "tastytea@tastytea.de") (:url . "https://schlomp.space/tastytea/register-quicknav"))])
- (rego-mode . [(20200413 450) ((emacs (24 4)) (reformatter (0 3))) "A major mode for rego language" single ((:commit . "41c99057d0406c7fb3895a03da777af3961a648d") (:keywords "languages") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in") (:url . "https://github.com/psibi/rego-mode"))])
- (related . [(20190327 1024) ((cl-lib (0 5))) "Switch back and forth between similarly named buffers." single ((:commit . "546c7e811b290470288b617f2c27106bd83ccd33") (:keywords "file" "buffer" "switch" "selection" "matching" "convenience") (:authors ("Julien Montmartin")) (:maintainer "Julien Montmartin") (:url . "https://github.com/julien-montmartin/related"))])
- (remark-mode . [(20191103 1825) ((emacs (25 1)) (markdown-mode (2 0))) "Major mode for the remark slideshow tool" tar ((:commit . "e80a1b78304045dec3eceffb6c8cbaf2b6c7b57a") (:keywords "remark" "slideshow" "markdown" "hot reload") (:authors ("@torgeir")) (:maintainer "@torgeir"))])
- (remember-last-theme . [(20170619 2133) ((emacs (24 4))) "Remember the last used theme between sessions." single ((:commit . "0973f1aa6b96355fa376fffe8b45733b6e963c51") (:keywords "convenience" "faces") (:authors ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainer "Anler Hernández Peral" . "inbox+emacs@anler.me") (:url . "https://github.com/anler/remember-last-theme"))])
- (remind-bindings . [(20200301 2213) ((emacs (25 1)) (omni-quotes (0 5)) (popwin (1 0)) (map (2 0))) "Reminders for your init bindings" single ((:commit . "730b6d7b30e397f8f11a6d3d5c269df21a33c450") (:keywords "outlines") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:url . "https://github.com/mtekman/remind-bindings.el"))])
- (renpy . [(20200607 135) nil "silly walks for Renpy" single ((:commit . "f2f95a72a8c842f229f80999132e8ea8ee73f6fc") (:keywords "languages") (:authors ("PyTom" . "pytom@bishoujo.us")) (:maintainer "Dave Love" . "fx@gnu.org") (:url . "https://github.com/billywade/renpy-mode"))])
- (repeatable-motion . [(20170620 1848) ((emacs (24))) "Make repeatable versions of motions" tar ((:commit . "f29effdc4121c2dc7e3fec9b3a62debce29cda9d") (:keywords "motion" "repeatable") (:authors ("William Hatch" . "willghatch@gmail.com")) (:maintainer "William Hatch" . "willghatch@gmail.com") (:url . "https://github.com/willghatch/emacs-repeatable-motion"))])
- (repeater . [(20180418 1212) ((emacs (24 4))) "Repeat recent repeated commands" single ((:commit . "854b874542b186b2408cbc58ad0591fe8eb70b6c") (:keywords "convenience") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/repeater"))])
- (repl-toggle . [(20190430 713) ((fullframe (0 0 5))) "Switch to/from repl buffer for current major-mode" single ((:commit . "f066782c10226d31ea8c1cc386cfa7fa3a4e3aa7") (:keywords "repl" "buffers" "toggle") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de"))])
- (replace-from-region . [(20170227 2316) nil "Replace commands whose query is from region" single ((:commit . "dc9318b9b2822da7b00ecc34d1dc965c8f96c9bb") (:keywords "replace" "search" "region") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/emacs/download/replace-from-region.el"))])
- (replace-pairs . [(20160207 1251) ((emacs (24 4))) "Query-replace pairs of things" single ((:commit . "acfb254dddffcee4250092fab9394ef2b42ffbc0") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/replace-pairs"))])
- (replace-symbol . [(20160518 12) nil "Rename symbols in expressions or buffers" single ((:commit . "baf949e528aee1881f455f9c84e67718bedcb3f6") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:url . "https://github.com/bmastenbrook/replace-symbol-el"))])
- (replace-with-inflections . [(20180831 635) ((cl-lib (0 5)) (string-inflection (1 0 10)) (inflections (1 1))) "Inflection aware `query-replace'" single ((:commit . "d9201e047856492f282da65459b28aba25998dbb") (:keywords "matching") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/replace-with-inflections.el"))])
- (repo . [(20191201 38) ((emacs (24 3))) "Running repo from Emacs" single ((:commit . "7b3ce731f1209d74113cb65a2d6aa6f54ce8ed27") (:keywords "convenience") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:url . "https://github.com/canatella/repo-el"))])
- (req-package . [(20180122 500) ((use-package (1 0)) (dash (2 7 0)) (log4e (0 2 0)) (ht (0))) "A use-package wrapper for package runtime dependencies management" tar ((:commit . "0c0ac7451149dac6bfda2adfe959d1df1c273de6") (:keywords "dotemacs" "startup" "speed" "config" "package") (:authors ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainer "Edward Knyshov" . "edvorg@gmail.com") (:url . "https://github.com/edvorg/req-package"))])
- (request . [(20200517 1305) ((emacs (24 4))) "Compatible layer for URL request in Emacs" single ((:commit . "d02d1347ffdf138cffd380cbeac62ac8732036ef") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:url . "https://github.com/tkf/emacs-request"))])
- (request-deferred . [(20181129 317) ((deferred (0 3 1)) (request (0 2 0))) "Wrap request.el by deferred" single ((:commit . "d02d1347ffdf138cffd380cbeac62ac8732036ef") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:url . "https://github.com/tkf/emacs-request"))])
- (requirejs . [(20151204 719) ((js2-mode (20150713)) (popup (0 5 3)) (s (1 9 0)) (cl-lib (0 5)) (yasnippet (20151011 1823))) "Requirejs import manipulation and source traversal." tar ((:commit . "4ea2a5fcbc76e4cbb6a7461e6f05f019b75865b1") (:keywords "javascript" "requirejs") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com") (:url . "https://github.com/joeheyming/requirejs-emacs"))])
- (requirejs-mode . [(20130215 2104) nil "Improved AMD module management" single ((:commit . "bbb0c09f8eb2d6a33c17319be8137f68bb16bc92") (:keywords "javascript" "amd" "requirejs") (:authors ("Marc-Olivier Ricard" . "marco.ricard@gmail.com")) (:maintainer "Marc-Olivier Ricard" . "marco.ricard@gmail.com"))])
- (resize-window . [(20180918 538) ((emacs (24)) (cl-lib (0 5))) "easily resize windows" single ((:commit . "72018aa4d2401b60120588199d4cedd0dc1fbcfb") (:keywords "window" "resize") (:authors ("Dan Sutton " . "danielsutton01@gmail.com")) (:maintainer "Dan Sutton " . "danielsutton01@gmail.com") (:url . "https://github.com/dpsutton/resize-mode"))])
- (restart-emacs . [(20180601 1031) nil "Restart emacs from within emacs" single ((:commit . "9aa90d3df9e08bc420e1c9845ee3ff568e911bd9") (:keywords "convenience") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:url . "https://github.com/iqbalansari/restart-emacs"))])
- (restclient . [(20200502 831) nil "An interactive HTTP client for Emacs" single ((:commit . "ac8aad6c6b9e9d918062fa3c89c22c2f4ec48bc3") (:keywords "http") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com"))])
- (restclient-helm . [(20170314 1554) ((restclient (0)) (helm (1 9 4))) "helm interface for restclient.el" single ((:commit . "ac8aad6c6b9e9d918062fa3c89c22c2f4ec48bc3") (:keywords "http" "helm") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com"))])
- (restclient-test . [(20180106 2046) ((emacs (24 4)) (restclient (0))) "Run tests with restclient.el" single ((:commit . "4518561bc9661fedacb6fb352e9677207f45c418") (:authors ("Simen Heggestøyl" . "simenheg@gmail.com")) (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") (:url . "https://github.com/simenheg/restclient-test.el"))])
- (retrie . [(20200519 551) ((emacs (24 5))) "Refactoring Haskell code with retrie" single ((:commit . "976d6f01a3e214917f16b82e750d825cb9bfcc59") (:keywords "files" "languages" "tools") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:url . "https://github.com/Ailrun/emacs-retrie"))])
- (reveal-in-folder . [(20200618 1211) ((emacs (24 3)) (f (0 20 0)) (s (1 12 0))) "Reveal current file in folder" single ((:commit . "cc4f56c8870136aafcdc5afc010e9a73a9bfd707") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/reveal-in-folder"))])
- (reveal-in-osx-finder . [(20150802 1657) nil "Reveal file associated with buffer in OS X Finder" single ((:commit . "5710e5936e47139a610ec9a06899f72e77ddc7bc") (:keywords "os x" "finder") (:authors ("Kazuki YOSHIDA")) (:maintainer "Kazuki YOSHIDA") (:url . "https://github.com/kaz-yos/reveal-in-osx-finder"))])
- (reverse-im . [(20200520 853) ((emacs (25 1))) "Reverse mapping for non-default system layouts" single ((:commit . "90add9a1f8c4a3c78029d38087ff4d22fe5372d3") (:keywords "i18n") (:url . "https://github.com/a13/reverse-im.el"))])
- (reverse-theme . [(20141205 145) nil "Reverse theme for Emacs" single ((:commit . "8319d0d5342890a3530ffa4daafdb7c35feda1ca") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-reverse-theme"))])
- (review-mode . [(20200710 155) nil "major mode for ReVIEW" single ((:commit . "343e7155f8238a7a53ef1f753319b8e2f9e8e8b9") (:authors ("Kenshi Muto" . "kmuto@kmuto.jp")) (:maintainer "Kenshi Muto" . "kmuto@kmuto.jp") (:url . "https://github.com/kmuto/review-el"))])
- (reykjavik-theme . [(20180823 1544) ((emacs (24))) "Theme with a dark background." single ((:commit . "2cd0043ae6d046f812a95bb26398ea23141beccc") (:authors ("martin haesler")) (:maintainer "martin haesler"))])
- (rfc-mode . [(20200719 1241) ((emacs (25 1)) (helm (3 2))) "RFC document browser and viewer" single ((:commit . "02546beecf4c495940885e7b7b911d84b12646ef") (:authors ("Nicolas Martyanoff" . "khaelin@gmail.com")) (:maintainer "Nicolas Martyanoff" . "khaelin@gmail.com") (:url . "https://github.com/galdor/rfc-mode"))])
- (rg . [(20200703 1250) ((emacs (25 1)) (s (1 10 0)) (transient (0 1 0)) (wgrep (2 1 10))) "A search tool based on ripgrep" tar ((:commit . "853c1acaf999500d867180b9e71938366c8e1a7c") (:keywords "matching" "tools") (:authors ("David Landell" . "david.landell@sunnyhill.email") ("Roland McGrath" . "roland@gnu.org")) (:maintainer "David Landell" . "david.landell@sunnyhill.email") (:url . "https://github.com/dajva/rg.el"))])
- (rhtml-mode . [(20130422 1311) nil "major mode for editing RHTML files" tar ((:commit . "a6d71b38a3db867ccf82999c99805db1a3a33c33"))])
- (rib-mode . [(20170726 1448) ((emacs (24))) "RenderMan® Interface Bytestream (RIB) Major Mode" single ((:commit . "97470158784c3c212e22e2c20b8471ee65ba59af") (:authors ("Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com")) (:maintainer "Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com") (:url . "https://github.com/blezek/rib-mode"))])
- (rich-minority . [(20190419 1136) ((cl-lib (0 5))) "Clean-up and Beautify the list of minor-modes." single ((:commit . "a03e693f6f9232cf75363aaaf1cb041f21675c19") (:keywords "mode-line" "faces") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/rich-minority"))])
- (right-click-context . [(20190528 1832) ((emacs (24 3)) (cl-lib (0 5)) (popup (0 5)) (ordinal (0 0 1))) "Right Click Context menu" single ((:commit . "4b1a2cd2b3eaea2393d3696a36da8f42e386c23d") (:keywords "mouse" "menu" "rightclick") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/right-click-context"))])
- (rigid-tabs . [(20170903 1559) ((emacs (24 3))) "Fix TAB alignment in diff buffers" single ((:commit . "eba84ceaba2e57e76ad2dfbb7a7154238a25d956") (:keywords "diff" "whitespace" "version control" "magit") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:url . "https://github.com/wavexx/rigid-tabs.el"))])
- (rime . [(20200623 1457) ((emacs (26 3)) (dash (2 12 0)) (cl-lib (0 6 1)) (popup (0 5 3)) (posframe (0 1 0))) "Rime input method" tar ((:commit . "57ae3d36804b4635b3a9cd88a52964c12a9733a6") (:keywords "convenience" "input-method") (:authors ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:url . "https://www.github.com/DogLooksGood/emacs-rime"))])
- (rimero-theme . [(20180901 1348) ((emacs (24))) "Theme with a dark background suitable for UI and terminal usage." single ((:commit . "a2e706c2b34f749019979a133f08a2d94a1104b3") (:keywords "faces" "theme" "dark" "light colors") (:authors ("Yves Zoundi" . "yveszoundi@users.sf.net")) (:maintainer "Yves Zoundi" . "yveszoundi@users.sf.net") (:url . "https://github.com/yveszoundi/emacs-rimero-theme"))])
- (rinari . [(20150709 640) ((ruby-mode (1 0)) (inf-ruby (2 2 5)) (ruby-compilation (0 16)) (jump (2 0))) "Rinari Is Not A Rails IDE" single ((:commit . "134438af8fbdfa9c8077267c768d273a9792b484") (:keywords "ruby" "rails" "project" "convenience" "web") (:authors ("Phil Hagelberg, Eric Schulte, Steve Purcell")) (:maintainer "Phil Hagelberg, Eric Schulte, Steve Purcell") (:url . "https://github.com/eschulte/rinari"))])
- (rings . [(20160531 2027) nil "Buffer rings. Like tabs, but better." single ((:commit . "3590b222eb80652cbd27866f066bd3571d86edfc") (:keywords "utilities" "productivity") (:authors ("Konrad Scorciapino")) (:maintainer "Konrad Scorciapino") (:url . "http://github.com/konr/rings"))])
- (ripgrep . [(20190215 841) nil "Front-end for ripgrep, a command line search tool" single ((:commit . "40e871dcc4519a70981e9f28acea304692a60978") (:keywords "ripgrep" "ack" "pt" "ag" "sift" "grep" "search") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/ripgrep.el"))])
- (riscv-mode . [(20170804 1521) ((emacs (24 4))) "Major-mode for RISC V assembly" single ((:commit . "99febf97d1fa9441e8dada94fe30c2aa439c9749") (:keywords "riscv" "assembly") (:authors ("Adam Niederer <https://github.com/AdamNiederer>")) (:maintainer "Adam Niederer") (:url . "https://github.com/AdamNiederer/riscv-mode"))])
- (rivet-mode . [(20200514 1617) ((emacs (24)) (web-mode (16))) "A minor mode for editing Apache Rivet files" single ((:commit . "9f2e6c4f777dbe306b715ab42663a6fc82a7e431") (:authors ("Jade Michael Thornton")) (:maintainer "Jade Michael Thornton") (:url . "https://gitlab.com/thornjad/rivet-mode"))])
- (rjsx-mode . [(20200120 1446) ((emacs (24 4)) (js2-mode (20170504))) "Real support for JSX" single ((:commit . "0061587a06cdc2579a8d0e90863498d96bf982d8") (:keywords "languages") (:authors ("Felipe Ochoa" . "felipe@fov.space")) (:maintainer "Felipe Ochoa" . "felipe@fov.space") (:url . "https://github.com/felipeochoa/rjsx-mode/"))])
- (rmsbolt . [(20191218 257) ((emacs (25 1))) "A compiler output viewer" tar ((:commit . "2bc1afe528b70b8aad4243a3b2b72bcf09a599e1") (:keywords "compilation" "tools") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:url . "http://gitlab.com/jgkamat/rmsbolt"))])
- (robe . [(20200628 1225) ((inf-ruby (2 5 1)) (emacs (24 4))) "Code navigation, documentation lookup and completion for Ruby" tar ((:commit . "082da38797d247f9c64568ad712a345e041d5c84") (:keywords "ruby" "convenience" "rails") (:authors ("Dmitry Gutov")) (:maintainer "Dmitry Gutov") (:url . "https://github.com/dgutov/robe"))])
- (robots-txt-mode . [(20190812 1858) nil "Major mode for editing robots.txt" single ((:commit . "8bf67285a25a6756607354d184e36583f2847e7d") (:keywords "languages" "comm" "web") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/robots-txt-mode"))])
- (roguel-ike . [(20160120 302) ((popup (0 5 0))) "A coffee-break roguelike" tar ((:commit . "706dcb0687e8016d7d776f9d9e5ace9fdbbca43c"))])
- (rope-read-mode . [(20191215 1240) ((emacs (24))) "Rearrange lines to read text smoothly" single ((:commit . "d1246557e2c9c685b0ee4ec0e58237431b846096") (:keywords "reading" "convenience" "chill") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:url . "https://github.com/marcowahl/rope-read-mode"))])
- (ros . [(20200109 1940) ((emacs (24 4))) "Package to interact with and write code for ROS systems" tar ((:commit . "0babdd3bbc038ee7436db0cc869df35752456268") (:authors ("Max Beutelspacher" . "max.beutelspacher@mailbox.org")) (:maintainer "Max Beutelspacher" . "max.beutelspacher@mailbox.org") (:url . "https://github.com/DerBeutlin/ros.el"))])
- (rotate . [(20160909 836) nil "Rotate the layout of emacs" single ((:commit . "091b5ac4fc310773253efb317e3dbe8e46959ba6") (:keywords "window" "layout") (:authors ("daichi.hirata <hirata.daichi at gmail.com>")) (:maintainer "daichi.hirata <hirata.daichi at gmail.com>") (:url . "https://github.com/daichirata/emacs-rotate"))])
- (roy-mode . [(20121208 1158) nil "Roy major mode" single ((:commit . "0416f561edbc6b4a29fced8be84d2527a9613d65") (:keywords "extensions") (:authors ("Georgii Leontiev")) (:maintainer "Georgii Leontiev") (:url . "https://github.com/folone/roy-mode"))])
- (rpm-spec-mode . [(20160710 1136) nil "RPM spec file editing commands for Emacs/XEmacs" single ((:commit . "c1c38050c48ea330c7cea632b8785d66daeefb2b") (:keywords "unix" "languages") (:authors ("Stig Bjørlykke," . "stig@bjorlykke.org")) (:maintainer "Stig Bjørlykke," . "stig@bjorlykke.org"))])
- (rpn-calc . [(20181121 1154) ((popup (0 4))) "quick RPN calculator for hackers" single ((:commit . "27279f89c80eb3f28ff9f981eff06502056943e2") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "https://github.com/zk-phi/rpn-calc"))])
- (rsense . [(20100511 405) nil "RSense client for Emacs" single ((:commit . "8b5ee58318747ca1dde84ee41d48c4f50175cf35") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "tomo@cx4a.org")) (:maintainer "Tomohiro Matsuyama" . "tomo@cx4a.org"))])
- (rspec-mode . [(20200615 1443) ((ruby-mode (1 0)) (cl-lib (0 4))) "Enhance ruby-mode for RSpec" tar ((:commit . "f1029cad2a8d9fd096e9a0f1ae9e7d7e2c8bd1ec") (:keywords "rspec" "ruby") (:authors ("Peter Williams, et al.")) (:maintainer "Peter Williams, et al.") (:url . "http://github.com/pezra/rspec-mode"))])
- (rtags . [(20200507 1824) ((emacs (24 3))) "A front-end for rtags" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))])
- (rtags-xref . [(20200310 1909) ((emacs (25 1)) (rtags (2 37))) "RTags backend for xref.el" single ((:commit . "080cb0e6b025b5d3d40fe9f7aecc791c0ea53f36") (:authors ("Jörg Walter")) (:maintainer "RTags Team") (:url . "https://github.com/Andersbakken/rtags"))])
- (rtm . [(20180329 1508) ((cl-lib (1 0))) "An elisp implementation of the Remember The Milk API" single ((:commit . "3e3d09387cb84801343ecca8fb02e82f213e7bbe") (:keywords "remember" "the" "milk" "productivity" "todo") (:authors ("Friedrich Delgado Friedrichs" . "frie...@nomaden.org")) (:maintainer "Friedrich Delgado Friedrichs" . "frie...@nomaden.org") (:url . "https://github.com/pmiddend/emacs-rtm"))])
- (rubik . [(20180222 2014) ((cl-lib (1 0)) (emacs (25 3))) "Rubik's Cube" single ((:commit . "c8dab1726463dbc9042a0b00186e4a8df02eb868") (:keywords "games") (:authors ("Ivan 'Kurvivor' Truskov" . "trus19@gmail.com")) (:maintainer "Ivan 'Kurvivor' Truskov" . "trus19@gmail.com") (:url . "https://github.com/Kurvivor19/rubik-mode"))])
- (rubocop . [(20190326 1424) ((emacs (24))) "An Emacs interface for RuboCop" single ((:commit . "03bf15558a6eb65e4f74000cab29412efd46660e") (:keywords "project" "convenience") (:authors ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:url . "https://github.com/bbatsov/rubocop-emacs"))])
- (rubocopfmt . [(20200713 1144) ((cl-lib (0 5))) "Minor-mode to format Ruby code with RuboCop on save" single ((:commit . "b84810105940aa5e0bde20c9a89359c95c9b6917") (:keywords "convenience" "wp" "edit" "ruby" "rubocop") (:authors ("Jim Myhrberg")) (:maintainer "Jim Myhrberg") (:url . "https://github.com/jimeh/rubocopfmt.el"))])
- (ruby-compilation . [(20150709 640) ((inf-ruby (2 2 1))) "run a ruby process in a compilation buffer" single ((:commit . "134438af8fbdfa9c8077267c768d273a9792b484") (:keywords "test" "convenience") (:authors ("Eric Schulte")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/eschulte/rinari"))])
- (ruby-electric . [(20200328 1528) nil "Minor mode for electrically editing ruby code" single ((:commit . "f2323cd9b5df3b34aa9810ba8109502824925d23") (:keywords "languages" "ruby") (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/ruby/elisp-ruby-electric"))])
- (ruby-end . [(20141215 1223) nil "Automatic insertion of end blocks for Ruby" single ((:commit . "a136f75abb6d5577ce40d61dfeb778c2e9bb09c0") (:keywords "speed" "convenience" "ruby") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/ruby-end"))])
- (ruby-extra-highlight . [(20171106 1933) nil "Highlight Ruby parameters." single ((:commit . "83942d18eae361998d24c1c523b308eea821f048") (:keywords "languages" "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/ruby-extra-highlight"))])
- (ruby-factory . [(20160102 721) ((inflections (1 1))) "Minor mode for Ruby test object generation libraries" tar ((:commit . "2bb7ccc2fccb5257376a989aa395bc7b9eb1d55d") (:keywords "ruby" "rails" "convenience") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:url . "http://github.com/sshaw/ruby-factory-mode"))])
- (ruby-hash-syntax . [(20200304 2214) ((emacs (24 1))) "Toggle ruby hash syntax between => and 1.9+ styles" single ((:commit . "d64036278dcfb4fa0603e6697142e02c2876f634") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/ruby-hash-syntax"))])
- (ruby-interpolation . [(20131112 1652) nil "Ruby string interpolation helpers" single ((:commit . "1978e337601222cedf00e117bf4b5cac15d1f203") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:url . "http://github.com/leoc/ruby-interpolation.el"))])
- (ruby-refactor . [(20160214 1650) ((ruby-mode (1 2))) "A minor mode which presents various Ruby refactoring helpers." single ((:commit . "e6b7125878a08518bffec6942df0c606f748e9ee") (:keywords "refactor" "ruby") (:url . "https://github.com/ajvargo/ruby-refactor"))])
- (ruby-test-mode . [(20200521 907) ((ruby-mode (1 0)) (pcre2el (1 8))) "Minor mode for Behaviour and Test Driven" single ((:commit . "5bb6b7b7ba0a4c91ba2e029853215e76e5df7772") (:keywords "ruby" "unit" "test" "rspec" "tools") (:authors ("Roman Scherer" . "roman.scherer@gmx.de") ("Caspar Florian Ebeling" . "florian.ebeling@gmail.com")) (:maintainer "Roman Scherer" . "roman.scherer@burningswell.com") (:url . "https://github.com/ruby-test-mode/ruby-test-mode"))])
- (ruby-tools . [(20151209 1615) nil "Collection of handy functions for ruby-mode." tar ((:commit . "6b97066b58a4f82eb2ecea6434a0a7e981aa4c18"))])
- (rufo . [(20170718 1416) ((emacs (24 3))) "use rufo to automatically format ruby files" single ((:commit . "020b02ed6e9ab49e79d2ddf63e4ee2684c1728f4") (:authors ("Daniel Ma" . "danielhgma@gmail.com")) (:maintainer "Daniel Ma" . "danielhgma@gmail.com") (:url . "https://github.com/danielma/rufo.el"))])
- (rum-mode . [(20180127 22) ((emacs (24))) "Major mode for Rum programming language" single ((:commit . "b69a3866e0299cae8c9c805d644e69b2c17b64de") (:keywords "rum" "languages" "lisp") (:url . "https://github.com/rumlang/rum-mode"))])
- (run-stuff . [(20200106 443) ((emacs (24 4))) "context based command execution" single ((:commit . "d9f7fde3d33446481655d18ca5423c03a23c2e41") (:keywords "files" "lisp" "files" "convenience" "hypermedia") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://github.com/ideasman42/emacs-run-stuff"))])
- (runner . [(20160524 743) nil "Improved \"open with\" suggestions for dired" single ((:commit . "a211d57ddc600410d07a8b534920ba905b093d87") (:keywords "shell command" "dired" "file extension" "open with") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com") (:url . "https://github.com/thamer/runner"))])
- (runtests . [(20150807 831) nil "Run unit tests from Emacs" single ((:commit . "ed90249f24cc48290018df48b9b9b7172440be3e") (:keywords "test") (:authors ("Sune Simonsen" . "sune@we-knowhow.dk")) (:maintainer "Sune Simonsen" . "sune@we-knowhow.dk") (:url . "https://github.com/sunesimonsen/emacs-runtests"))])
- (russian-holidays . [(20170109 2140) nil "Russian holidays for the calendar" single ((:commit . "b285a30f29d85c48e3ea4eb93972d34a090c167b") (:authors ("Alexander I.Grafov" . "siberian@laika.name")) (:maintainer "Alexander I.Grafov" . "siberian@laika.name") (:url . "https://github.com/grafov/russian-holidays"))])
- (rust-auto-use . [(20200608 1359) nil "Utility to automatically insert Rust use statements" single ((:commit . "d5205f7b9b9eae0f7d0893f87d3391464719f9c0") (:keywords "languages") (:authors ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainer "Rotem Yaari" . "rotemy@MBP.local"))])
- (rust-mode . [(20200709 723) ((emacs (25 1))) "A major emacs mode for editing Rust source code" single ((:commit . "ca7d99c6fd90fc1e636aa9d4020a2f077786a0c3") (:keywords "languages") (:authors ("Mozilla")) (:maintainer "Mozilla") (:url . "https://github.com/rust-lang/rust-mode"))])
- (rust-playground . [(20200116 1043) ((emacs (24 3))) "Local Rust playground for short code snippets." single ((:commit . "5a117781dcb66065bea7830dd73618008fc34949") (:keywords "tools" "rust") (:authors ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov" . "grafov@gmail.com") (:url . "https://github.com/grafov/rust-playground"))])
- (rustic . [(20200724 1517) ((emacs (26 1)) (xterm-color (1 6)) (dash (2 13 0)) (s (1 10 0)) (f (0 18 2)) (projectile (0 14 0)) (markdown-mode (2 3)) (spinner (1 7 3)) (let-alist (1 0 4)) (seq (2 3)) (ht (2 0))) "Rust development environment" tar ((:commit . "75b99201bb4e7a0bd990c006896ad7897f284ca2") (:keywords "languages") (:authors ("Mozilla")) (:maintainer "Mozilla"))])
- (rvm . [(20150402 1442) nil "Emacs integration for rvm" single ((:commit . "081d5173158054c6d0780b9462c74c5697eac1fc") (:keywords "ruby" "rvm") (:authors ("Yves Senn" . "yves.senn@gmx.ch")) (:maintainer "Yves Senn" . "yves.senn@gmx.ch") (:url . "http://www.emacswiki.org/emacs/RvmEl"))])
- (ryo-modal . [(20200515 1703) ((emacs (25 1))) "Roll your own modal mode" single ((:commit . "5d988e8b3a5d3d6f2f58d97031d2f500ef55473b") (:keywords "convenience" "modal" "keys") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:url . "http://github.com/Kungsgeten/ryo-modal"))])
- (s . [(20180406 808) nil "The long lost Emacs string manipulation library." single ((:commit . "43ba8b563bee3426cead0e6d4ddc09398e1a349d") (:keywords "strings") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (s-buffer . [(20130605 2124) ((s (1 6 0)) (noflet (0 0 3))) "s operations for buffers" single ((:commit . "f95d234282377f00a2c3a9846681080cb95bb1df") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "http://github.com/nicferrier/emacs-s-buffer"))])
- (s12cpuv2-mode . [(20171013 2051) ((emacs (24 3))) "Major-mode for S12CPUV2 assembly" single ((:commit . "b17d4cf848dec1e20e66458e5c7ff77a2c051a8c") (:keywords "s12cpuv2" "assembly" "languages") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:url . "https://github.com/AdamNiederer/s12cpuv2-mode"))])
- (s3ed . [(20200720 1313) ((emacs (25 1)) (dash (2 17 0)) (s (1 12 0))) "Tramp-like access to s3" tar ((:commit . "3e3b962d3848e6cc8ce9dc491b2e29e915a5c351") (:keywords "s3" "tools") (:authors ("Matt Usifer" . "mattusifer@gmail.com")) (:maintainer "Matt Usifer" . "mattusifer@gmail.com") (:url . "https://github.com/mattusifer/s3ed"))])
- (sackspace . [(20130719 956) nil "A better backspace" single ((:commit . "fd0480eaaf6d3d11fd30ac5feb2da2f4f7572708") (:keywords "delete" "convenience") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:url . "http://github.com/cofi/sackspace.el"))])
- (sage-shell-mode . [(20200524 958) ((cl-lib (0 6 1)) (emacs (24 4)) (let-alist (1 0 5)) (deferred (0 5 1))) "A front-end for Sage Math" tar ((:commit . "855fb4ece47cea2c72295ce2158e0915829835b5") (:keywords "sage" "math") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:url . "https://github.com/sagemath/sage-shell-mode"))])
- (sailfish-scratchbox . [(20171202 1332) nil "Sailfish OS scratchbox inside the emacs." single ((:commit . "65c6b04abadd2cdeb4cc2dc2a8b96b06e0f27ed8") (:keywords "sb2" "mb2" "building" "scratchbox" "sailfish") (:authors ("V. V. Polevoy" . "fx@thefx.co")) (:maintainer "V. V. Polevoy" . "fx@thefx.co") (:url . "https://github.com/vityafx/sailfish-scratchbox.el"))])
- (salesforce-utils . [(20160814 154) ((cl-lib (0 5))) "simple utilities for Salesforce" single ((:commit . "73328baf0fb94ac0d0de645a8f6d42e5ae27f773") (:authors ("Sean McAfee")) (:maintainer "Sean McAfee") (:url . "https://github.com/grimnebulin/emacs-salesforce"))])
- (salt-mode . [(20200210 1200) ((emacs (24 4)) (yaml-mode (0 0 12)) (mmm-mode (0 5 4)) (mmm-jinja2 (0 1))) "Major mode for Salt States" single ((:commit . "c46b24e7fdf4a46df5507dc9c533bbc0064a46fa") (:keywords "languages") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainer "Glynn Forrest" . "me@glynnforrest.com") (:url . "https://github.com/glynnforrest/salt-mode"))])
- (sane-term . [(20181130 101) ((emacs (24 1))) "Multi Term is crazy. This is not." single ((:commit . "46352169bd6d2a86ca9c2052cd05ecd16fc7657b") (:authors ("Adam Patterson" . "adam@adamrt.com")) (:maintainer "Adam Patterson" . "adam@adamrt.com") (:url . "http://github.com/adamrt/sane-term"))])
- (sass-mode . [(20190502 53) ((haml-mode (3 0 15)) (cl-lib (0 5))) "Major mode for editing Sass files" single ((:commit . "247a0d4b509f10b28e4687cd8763492bca03599b") (:keywords "markup" "language" "css") (:authors ("Natalie Weizenbaum")) (:maintainer "Natalie Weizenbaum") (:url . "http://github.com/nex3/haml/tree/master"))])
- (sauron . [(20200516 1406) nil "Track (erc/org/dbus/...) events and react to them." tar ((:commit . "d2e06866d1045fa16015d135b8964d9caacc2985"))])
- (save-load-path . [(20140206 1214) nil "save load-path and reuse it to test" single ((:commit . "6cb763a37e2b8af505bff2bcd11fd49c9ea04d66") (:keywords "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/save-load-path.el"))])
- (save-visited-files . [(20200212 414) nil "save opened files across sessions" single ((:commit . "8203a05a322324ec17b14437c8dfb38efdb53241") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/save-visited-files"))])
- (savekill . [(20140418 229) nil "Save kill ring to disk" single ((:commit . "67fc94e3d8fe8ce3ca16f90518f6a46479b63e34") (:keywords "tools") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/savekill.el"))])
- (saveplace-pdf-view . [(20200719 113) ((emacs (24 1)) (pdf-tools (1 0))) "Save place in pdf-view buffers" single ((:commit . "bbbc466fff060b372a9d2b30e48ec6bbb7d03095") (:keywords "files" "convenience") (:authors ("Nicolai Singh <nicolaisingh at pm.me>")) (:maintainer "Nicolai Singh <nicolaisingh at pm.me>") (:url . "https://github.com/nicolaisingh/saveplace-pdf-view"))])
- (say-what-im-doing . [(20160706 1931) nil "dictate what you're doing with text to speech" single ((:commit . "5b2ce6783b02805bcac1107a149bfba3852cd9d5") (:keywords "text to speech" "dumb" "funny") (:authors ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:url . "http://github.com/benaiah/say-what-im-doing"))])
- (sayid . [(20190919 654) ((cider (0 21 0))) "sayid nREPL middleware client" single ((:commit . "f09c46d30211000b6a9aaf0633d5d9d9b46a55c2") (:authors ("Bill Piel" . "bill@billpiel.com")) (:maintainer "Bill Piel" . "bill@billpiel.com") (:url . "https://github.com/clojure-emacs/sayid"))])
- (sbt-mode . [(20200521 632) ((emacs (24 4))) "Interactive support for sbt projects" tar ((:commit . "4358ed862a1b1ec18ac9699afb4862146669eb79") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-sbt-mode"))])
- (scad-mode . [(20200628 2256) nil "A major mode for editing OpenSCAD code" single ((:commit . "caf9986a33b466f86ef103a92655b322cad41e28") (:keywords "languages") (:authors ("Len Trigg, Łukasz Stelmach")) (:maintainer "Len Trigg" . "lenbok@gmail.com") (:url . "https://raw.github.com/openscad/openscad/master/contrib/scad-mode.el"))])
- (scad-preview . [(20160206 1336) ((scad-mode (91 0))) "Preview SCAD models in real-time within Emacs" single ((:commit . "fee011589671cc8f1296cb6aa81553e5bb699819") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (scala-mode . [(20200524 1304) nil "Major mode for editing Scala" tar ((:commit . "1d08e885b1489313666c7f15a3962432a4f757ee") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-scala-mode"))])
- (scalariform . [(20190114 215) ((s (1 12 0)) (f (0 20 0))) "Format Scala code with scalariform." single ((:commit . "478a15ccb4f825aba73262bccd3e61ce7017f64b") (:keywords "processes" "scala" "scalariform") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:url . "https://github.com/zwild/scalariform"))])
- (scf-mode . [(20151122 248) nil "shorten file-names in compilation type buffers" single ((:commit . "dbfcdcd89034f208d65e181af58e0d73ad09f8b2") (:keywords "compilation") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/scf-mode"))])
- (scheme-complete . [(20181029 1255) nil "Smart auto completion for Scheme in Emacs" single ((:commit . "b86ee41d48664839181498313f4f3dc2fef17d6f") (:authors ("Alex Shinn")) (:maintainer "Alex Shinn"))])
- (schrute . [(20170521 1840) ((emacs (24 3))) "Help you remember there is a better way to do something." single ((:commit . "59faa6c4232ae183cea93237301acad8c0763997") (:keywords "convenience") (:authors ("Jorge Araya Navarro" . "elcorreo@deshackra.com")) (:maintainer "Jorge Araya Navarro" . "elcorreo@deshackra.com") (:url . "https://bitbucket.org/shackra/dwight-k.-schrute"))])
- (scihub . [(20200604 920) ((emacs (25 1))) "Sci-Hub integration" single ((:commit . "5a4666ca99de6a90108b4606b4c57270c03002ce") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/scihub.el"))])
- (scion . [(20130315 1255) nil "Haskell Minor Mode for Interacting with the Scion Library" single ((:commit . "99b4589175665687181a932cd836850205625f71") (:url . "https://code.google.com/p/scion-lib/"))])
- (sclang-extensions . [(20160509 338) ((auto-complete (1 4 0)) (s (1 3 1)) (dash (1 2 0)) (emacs (24 1))) "Extensions for the SuperCollider Emacs mode." tar ((:commit . "e9cc79732f16fdb582129303110c163dcc0d6da0") (:keywords "sclang" "supercollider" "languages" "tools") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))])
- (sclang-snippets . [(20130513 751) ((yasnippet (0 8 0))) "Snippets for the SuperCollider Emacs mode" tar ((:commit . "c840a416b96f83bdd70491e3d1fbe2f1ae8b3f58") (:keywords "snippets") (:authors ("ptrv" . "mail@petervasil.net")) (:maintainer "ptrv" . "mail@petervasil.net"))])
- (scpaste . [(20200717 2007) ((htmlize (1 39))) "Paste to the web via scp." single ((:commit . "2aa1513fa0a402f03b993c0a6929daf39820b02b") (:keywords "convenience" "hypermedia") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:url . "https://github.com/technomancy/scpaste"))])
- (scratch . [(20190314 614) ((emacs (25 1))) "Mode-specific scratch buffers" single ((:commit . "4813d82b39a451f2a6d5b730cd7ec49a9bdabcca") (:keywords "convenience" "tools" "files") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:url . "https://github.com/ieure/scratch-el"))])
- (scratch-comment . [(20200620 2105) ((emacs (26 1))) "Insert Elisp result as comment in scratch buffer" single ((:commit . "d62665ecbeb05d1f92761af185736609278ffba2") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/scratch-comment.el"))])
- (scratch-ext . [(20140104 516) nil "Extensions for *scratch*" single ((:commit . "388c53cddd0466b451264894667ed64a6947ad67") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org") (:url . "https://github.com/kyanagi/scratch-ext-el"))])
- (scratch-log . [(20141115 743) nil "Utility for *scratch* buffer." single ((:commit . "1168f7f16d36ca0f4ddf2bb98881f8db62cc5dc0") (:authors ("kmori" . "morihenotegami@gmail.com")) (:maintainer "kmori" . "morihenotegami@gmail.com"))])
- (scratch-message . [(20170107 1336) nil "Changing message in your scratch buffer" single ((:commit . "3ecc7f5e3b8a597ebd1492fd426d3720a7f34302") (:keywords "util" "scratch") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "https://github.com/thisirs/scratch-message.git"))])
- (scratch-palette . [(20150225 842) ((popwin (0 7 0 -3))) "make scratch buffer for each files" single ((:commit . "f6803b448079f4a81cc699cec7442ef543cd5818") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (scratch-pop . [(20200504 2004) ((popwin (0 7 0 -3))) "Generate, popup (& optionally backup) scratch buffer(s)." single ((:commit . "1a36cb5ab6668aa57b1b7192521a472feeec1ea2") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (scratches . [(20151006 416) ((dash (2 11 0)) (f (0 17 0))) "Multiple scratches in any language" single ((:commit . "9441afe6396ca38f08029123fab5d87429cbf315") (:keywords "scratch") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com"))])
- (scribble-mode . [(20190912 200) ((emacs (24))) "Major mode for editing Scribble documents" single ((:commit . "5c3ea3cc9bbad585476eee41ea76dc056c2012bb") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:url . "https://github.com/emacs-pe/scribble-mode"))])
- (scroll-on-drag . [(20200411 1050) ((emacs (26 2))) "Interactive scrolling" single ((:commit . "42d96a60a207cd73e7a58111358deb05f084c59e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://github.com/ideasman42/emacs-scroll-on-drag"))])
- (scrollkeeper . [(20190109 629) ((emacs (25 1))) "Custom scrolling commands with visual guidelines" single ((:commit . "3c4ac6b6b44686d31c260ee0b19daaee59bdccd6") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/scrollkeeper.el"))])
- (scrooge . [(20180630 1022) ((emacs (24)) (cl-lib (0 5)) (dash (2 13 0)) (thrift (0 9 3))) "Major mode for Twitter Scrooge files" single ((:commit . "0a8c58e9e6708abe4ef7e415bc1e0472318bb1b0") (:keywords "scrooge" "thrift") (:authors ("Daniel McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Daniel McClanahan" . "danieldmcclanahan@gmail.com"))])
- (scss-mode . [(20180123 1708) nil "Major mode for editing SCSS files" single ((:commit . "cf58dbec5394280503eb5502938f3b5445d1b53d") (:keywords "scss" "css" "mode") (:authors ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson" . "anton.johansson@gmail.com") (:url . "https://github.com/antonj/scss-mode"))])
- (sdcv . [(20190610 732) ((emacs (24 3)) (popup (0 5 3)) (showtip (0 1)) (pos-tip (0 4 6)) (cl-lib (0 3))) "Interface for sdcv (StartDict console version)." single ((:commit . "943ae3e90cc9a0a88a37cc710acd7424fd4defc4") (:keywords "startdict" "sdcv") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com") (:url . "http://www.emacswiki.org/emacs/download/sdcv.el"))])
- (sdlang-mode . [(20161201 711) ((emacs (24 3))) "Major mode for Simple Declarative Language files." single ((:commit . "d42a6eedefeb44919fbacf58d302b6df18f05bbc") (:keywords "languages") (:authors ("Vladimir Panteleev")) (:maintainer "Vladimir Panteleev") (:url . "https://github.com/CyberShadow/sdlang-mode"))])
- (search-web . [(20150312 1103) nil "Post web search queries using `browse-url'." single ((:commit . "c4ae86ac1acfc572b81f3d78764bd9a54034c331") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com"))])
- (searchq . [(20150829 1211) ((emacs (24 3))) "Framework of queued search tasks using GREP, ACK, AG and more." tar ((:commit . "dd510d55ad66a82c6ef022cfe7c4a73ad5365f82") (:authors ("boyw165")) (:maintainer "boyw165"))])
- (secretaria . [(20191128 250) ((emacs (24 4)) (alert (1 2)) (s (1 12)) (f (0 20 0)) (org (9))) "A personal assistant based on org-mode" single ((:commit . "03986130a2ada1fa952d45e83536729f20230fcf") (:keywords "org" "convenience") (:authors ("Jorge Araya Navarro" . "jorge@esavara.cr")) (:maintainer "Jorge Araya Navarro" . "jorge@esavara.cr") (:url . "https://gitlab.com/shackra/secretaria"))])
- (see-mode . [(20180511 41) ((emacs (24 4)) (language-detection (0 1 0))) "Edit string in a separate buffer" single ((:commit . "b6e72ea90105b03816c334be9e43bb41dcc79abf") (:keywords "convenience") (:authors ("Marcelo Muñoz" . "ma.munoz.araya@gmail.com")) (:maintainer "Marcelo Muñoz" . "ma.munoz.araya@gmail.com") (:url . "https://github.com/marcelino-m/see-mode"))])
- (seeing-is-believing . [(20170214 1320) nil "minor mode for running the seeing-is-believing ruby gem" single ((:commit . "fbbe246c0fda87bb26227bb826eebadb418a220f") (:authors ("John Cinnamond")) (:maintainer "John Cinnamond"))])
- (seethru . [(20150218 1829) ((shadchen (1 4))) "Easily change Emacs' transparency" single ((:commit . "d87e231f99313bea75b1e69e48c0f32968c82060") (:keywords "lisp" "tools" "alpha" "transparency") (:authors ("Benaiah Mischenko" . "benaiah@mischenko.com")) (:maintainer "Benaiah Mischenko" . "benaiah@mischenko.com") (:url . "http://github.com/benaiah/seethru"))])
- (sekka . [(20170803 1247) ((cl-lib (0 3)) (concurrent (0 3 1)) (popup (0 5 2))) "A client for Sekka IME server" single ((:commit . "61840b57d9ae32bf8e297b175942590a1319c7e7") (:keywords "ime" "skk" "japanese") (:authors ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainer "Kiyoka Nishiyama" . "kiyoka@sumibi.org") (:url . "https://github.com/kiyoka/sekka"))])
- (select-themes . [(20160221 106) nil "Color theme selection with completing-read" single ((:commit . "236f54287519a3ea6dd7b3992d053e4f4ff5d0fe") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-select-themes"))])
- (selected . [(20200528 606) nil "Keymap for when region is active" single ((:commit . "3043fd2609f7e71d809763ae6e8dd4b6c904e63d") (:keywords "convenience") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:url . "http://github.com/Kungsgeten/selected.el"))])
- (selectric-mode . [(20200209 2107) nil "IBM Selectric mode for Emacs" tar ((:commit . "bb9e66678f34e9bc23624ff6292cf5e7857e8e5f") (:keywords "multimedia" "convenience" "typewriter" "selectric") (:authors ("Ricardo Bánffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com") (:url . "https://github.com/rbanffy/selectric-mode"))])
- (selectrum . [(20200731 1708) ((emacs (25 1))) "Easily select item from list" tar ((:commit . "54f830cd4094564ed2e5d425d344fa4edd1105d5") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/selectrum"))])
- (selectrum-prescient . [(20200716 1414) ((emacs (25 1)) (prescient (5 0)) (selectrum (1 0))) "Selectrum integration" single ((:commit . "b11d79b10df12c58edc3487371c2c47dfb9b50e6") (:keywords "extensions") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:url . "https://github.com/raxod502/prescient.el"))])
- (semaphore . [(20190607 1949) ((emacs (26))) "Semaphore based on condition variables" single ((:commit . "a069b69018b96d284ce7553cd63350a88ea3679c") (:keywords "processes" "unix") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net") (:url . "http://github.com/webnf/semaphore.el"))])
- (semaphore-promise . [(20190607 2115) ((emacs (26)) (semaphore (1)) (promise (1))) "semaphore integration with promise" single ((:commit . "a069b69018b96d284ce7553cd63350a88ea3679c") (:keywords "processes" "unix") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net") (:url . "http://github.com/webnf/semaphore.el"))])
- (semi . [(20200429 641) ((flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "57a948c5f07e57e78ab3c0e6fd76ffcd591bb4ac"))])
- (seml-mode . [(20200419 1022) ((emacs (25 1)) (impatient-mode (1 1)) (htmlize (1 5)) (web-mode (16 0))) "Major-mode for SEML, S-Expression Markup Language, file" single ((:commit . "4ca9d275948898602640a46573cb95d7eef913e5") (:keywords "lisp" "html") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/seml-mode.el"))])
- (sendto . [(20160425 1250) ((emacs (24 4))) "send the region content to a function" single ((:commit . "076b81d7a53f75b0a59b0ef3448f35570567054c") (:keywords "convenience" "region") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/sendto.el"))])
- (sensitive . [(20170818 1251) ((emacs (24)) (sequences (0 1 0))) "A dead simple way to load sensitive information" single ((:commit . "69dd6125a41d8b55f4b6ba61daa4d1aa1f716fa8") (:keywords "convenience") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com"))])
- (sentence-navigation . [(20180408 1619) ((ample-regexps (0 1)) (cl-lib (0 5)) (emacs (24 4))) "Commands to navigate one-spaced sentences." single ((:commit . "7c5d2edeaed01196aec25031782e89adeaa089f0") (:keywords "sentence" "evil") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:url . "https://github.com/noctuid/emacs-sentence-navigation"))])
- (seoul256-theme . [(20180505 757) ((emacs (24 3))) "Low-contrast color scheme based on Seoul Colors." single ((:commit . "d28a9de73a5ffb1a1c9492db75a5c1efe5e9815f") (:keywords "theme") (:authors ("Anand Iyer" . "anand.ucb@gmail.com")) (:maintainer "Anand Iyer" . "anand.ucb@gmail.com") (:url . "http://github.com/anandpiyer/seoul256-emacs"))])
- (separedit . [(20200407 728) ((emacs (24 4)) (dash (2 0)) (edit-indirect (0 1 5))) "Edit comment/string/docstring/code block in separate buffer" single ((:commit . "e9a7b4402859d73f052330106d29ad14c3d9b6f3") (:keywords "tools" "languages" "docs") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:url . "https://github.com/twlz0ne/separedit.el"))])
- (sequences . [(20170818 1252) ((emacs (24))) "Ports of some Clojure sequence functions." single ((:commit . "564ebbd93b0beea4e75acfbf824350e90b5d5738") (:keywords "convenience") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com"))])
- (sequential-command . [(20170926 40) nil "Many commands into one command" tar ((:commit . "a48cbcbe273b33edd3ae56e68f44b4100fa3a48a") (:keywords "convenience" "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sequential-command.el"))])
- (servant . [(20140216 1219) ((s (1 8 0)) (dash (2 2 0)) (f (0 11 0)) (ansi (0 3 0)) (commander (0 5 0)) (epl (0 2)) (shut-up (0 2 1)) (web-server (0 0 1))) "ELPA server written in Emacs Lisp" tar ((:commit . "4d2aa8250b54b28e6e7ee4cd5ebd98a33db2c134") (:keywords "elpa" "server") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com") ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/servant.el"))])
- (serverspec . [(20150623 1155) ((dash (2 6 0)) (s (1 9 0)) (f (0 16 2)) (helm (1 6 1))) "Serverspec minor mode" tar ((:commit . "b6dfe82af9869438de5e5d860ced196641f372c0") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "http://101000lab.org"))])
- (services . [(20170802 1130) ((cl-lib (0 5))) "Services database access functions." single ((:commit . "04c7986041a33dfa0b0ae57c7d6fbd600548c596") (:keywords "convenience" "net" "services") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/services.el"))])
- (sesman . [(20190909 1754) ((emacs (25))) "Generic Session Manager" tar ((:commit . "edee869c209c016e5f0c5cbb8abb9f3ccd2d1e05") (:keywords "process") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:url . "https://github.com/vspinu/sesman"))])
- (session . [(20120511 0) nil "use variables, registers and buffer places across sessions" single ((:commit . "19ea0806873daac3539a4b956e15655e99e3dd6c") (:keywords "session" "session management" "desktop" "data" "tools") (:authors ("Christoph Wedler" . "wedler@users.sourceforge.net")) (:maintainer "Christoph Wedler" . "wedler@users.sourceforge.net") (:url . "http://emacs-session.sourceforge.net/"))])
- (seti-theme . [(20190201 1848) nil "A dark colored theme, inspired by Seti Atom Theme" single ((:commit . "9d76db0b91d4f574dd96ac80fad41da35bffa109") (:keywords "themes") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com") (:url . "https://github.com/caisah/seti-theme"))])
- (sexp-diff . [(20200314 2018) ((emacs (25))) "Diff sexps based on Levenshtein-like edit distance" single ((:commit . "7e8c988bea2af209e17b70fa51316ade55529acb") (:keywords "lisp") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/sexp-diff.el"))])
- (sexp-move . [(20150915 1730) nil "Improved S-Expression Movement" single ((:commit . "117f7a91ab7c25e438413753e916570122011ce7") (:keywords "sexp") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:url . "https://gitlab.com/elzair/sexp-move"))])
- (sexy-monochrome-theme . [(20200115 2146) nil "A sexy dark Emacs >= 24 theme for your sexy code" single ((:commit . "f3ad07d60c966ef34cb11026eaba053e114bb8f1") (:keywords "themes") (:authors ("Volodymyr Yevtushenko" . "voloyev@vivaldi.net")) (:maintainer "Volodymyr Yevtushenko" . "voloyev@vivaldi.net") (:url . "https://github.com/voloyev/sexy-monochrome-theme"))])
- (sfz-mode . [(20200716 1023) ((emacs (25 1))) "Major mode for SFZ files" single ((:commit . "aaf31d1b68817251affed7da719dfcb2acd4b51a") (:keywords "languages") (:authors ("Jean Pierre Cimalando" . "jp-dev@inbox.ru")) (:maintainer "Jean Pierre Cimalando" . "jp-dev@inbox.ru") (:url . "https://github.com/sfztools/emacs-sfz-mode"))])
- (shackle . [(20200529 1839) ((cl-lib (0 5))) "Enforce rules for popups" single ((:commit . "171c3f437d853f34782b201d86ef765665b755e2") (:keywords "convenience") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/shackle"))])
- (shadchen . [(20141102 1839) nil "pattern matching for elisp" single ((:commit . "35f2b9c304eec990c16efbd557198289dc7cbb1f") (:authors ("Vincent Toups")) (:maintainer "Vincent Toups"))])
- (shader-mode . [(20180518 1157) ((emacs (24))) "Major mode for shader" single ((:commit . "d7dc8d0d6fe8914e8b6d5cf2081ad61e6952359c") (:authors ("midnightSuyama" . "midnightSuyama@gmail.com")) (:maintainer "midnightSuyama" . "midnightSuyama@gmail.com") (:url . "https://github.com/midnightSuyama/shader-mode"))])
- (shadowenv . [(20190903 1907) ((emacs (24 3))) "Shadowenv integration." single ((:commit . "5f24c90bb8e7333ee4315619672dc2ec69d198be") (:keywords "shadowenv" "tools") (:authors ("Dante Catalfamo" . "dante.catalfamo@shopify.com")) (:maintainer "Dante Catalfamo" . "dante.catalfamo@shopify.com") (:url . "https://github.com/Shopify/shadowenv.el"))])
- (shakespeare-mode . [(20180704 2138) nil "A major mode for editing Shakespearean templates." single ((:commit . "c442eeea9d585e1b1fbb8813e33d47feec348a57") (:keywords "shakespeare" "hamlet" "lucius" "julius" "mode") (:authors ("Cody Reichert")) (:maintainer "Cody Reichert") (:url . "http://github.com/CodyReichert/shakespeare-mode"))])
- (shampoo . [(20131230 1019) nil "A remote Smalltalk development mode" tar ((:commit . "bc193c39636c30182159c5c91c37a9a4cb50fedf"))])
- (share2computer . [(20200316 31) ((emacs (25 1))) "Elisp helper of android ShareToComputer" single ((:commit . "15da47625a800e3310b8dc714bd4e41e32966d6a") (:keywords "convenience" "comm") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/share2computer"))])
- (shell-command . [(20090830 1040) nil "enables tab-completion for `shell-command'" single ((:commit . "7e22125f746ce9ffbe9b0282d62f4b4bbbe672bd") (:keywords "shell") (:authors ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org")) (:maintainer "TSUCHIYA Masatoshi" . "tsuchiya@namazu.org"))])
- (shell-current-directory . [(20140101 2354) nil "create new shell based on buffer directory" single ((:commit . "bf843771bf9a4aa05e054ade799eb8862f3be89a") (:keywords "shell" "comint") (:authors ("Daniel Polani")) (:maintainer "Daniel Polani"))])
- (shell-here . [(20191011 1959) nil "Open a shell relative to the working directory" single ((:commit . "88b80deb1337a97b403b20fc467fa2d579b3bfd5") (:keywords "unix" "tools" "processes") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com"))])
- (shell-history . [(20100505 839) nil "integration with shell history" single ((:commit . "ee371a81f2d2bf5a308344078329ca1e9b5ed38c") (:keywords "processes" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el"))])
- (shell-pop . [(20200315 1139) ((emacs (24)) (cl-lib (0 5))) "helps you to use shell easily on Emacs. Only one key action to work." single ((:commit . "4b4394037940a890a313d715d203d9ead2d156a6") (:keywords "shell" "terminal" "tools") (:authors ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainer "Kazuo YAGI" . "kazuo.yagi@gmail.com") (:url . "http://github.com/kyagi/shell-pop-el"))])
- (shell-split-string . [(20151224 1008) nil "Split strings using shell-like syntax" single ((:commit . "19f6f999c33cc66a4c91bacdcc3697c25d97bf5a") (:keywords "utility" "library" "shell" "string") (:authors ("10sr <8.slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/shell-split-string-el"))])
- (shell-switcher . [(20161029 552) ((emacs (24))) "Provide fast switching between shell buffers." tar ((:commit . "28a7f753dd7addd2933510526f52620cb5a22048"))])
- (shell-toggle . [(20150226 1411) nil "Toggle to and from the shell buffer" single ((:commit . "0d01bd9a780fdb7fe6609c552523f4498649a3b9") (:keywords "processes") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Matthieu Moy") ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Mikael Sjödin" . "mic@docs.uu.se") (:url . "https://github.com/knu/shell-toggle.el"))])
- (shelldoc . [(20200513 1206) ((cl-lib (0 3)) (s (1 9 0))) "shell command editing support with man page." single ((:commit . "fa69f67b6229fad3f31d936955ca8d1982009b77") (:keywords "applications") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "http://github.com/mhayashi1120/Emacs-shelldoc"))])
- (shelltest-mode . [(20180501 141) nil "Major mode for shelltestrunner" single ((:commit . "5fea8c9394380e822971a171905b6b5ab9be812d") (:keywords "languages") (:authors ("Dustin Fechner" . "dfe@rtrn.io")) (:maintainer "Dustin Fechner" . "dfe@rtrn.io") (:url . "https://github.com/rtrn/shelltest-mode"))])
- (shen-elisp . [(20180915 2028) ((emacs (24 4))) "Shen implementation in Elisp" tar ((:commit . "73b74c8d6e3a2ea34b667d177d9f130765bfe501") (:keywords "shen" "elisp") (:url . "http://github.com/deech/shen-elisp"))])
- (shfmt . [(20200421 103) ((emacs (24)) (reformatter (0 3))) "Reformat shell scripts using shfmt" single ((:commit . "342c55fab27f1e62472eebbb53cfc73b0d422a34") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-shfmt"))])
- (shift-number . [(20170301 1459) nil "Increase/decrease the number at point" single ((:commit . "cd099a5582fc996b800ac7607f6c38a004ce9740") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:url . "https://github.com/alezost/shift-number.el"))])
- (shift-text . [(20130831 1655) ((cl-lib (1 0)) (es-lib (0 3))) "Move the region in 4 directions, in a way similar to Eclipse's" single ((:commit . "1be9cbf994000022172ceb746fe1d597f57ea8ba") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/shift-text"))])
- (shimbun . [(20200406 2209) nil "interfacing with web newspapers" tar ((:commit . "ee8a7be409dd646ce290612f733f57784c1c06fa") (:keywords "news") (:authors ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") ("Akihiro Arisawa " . "ari@mbf.sphere.ne.jp") ("Yuuichi Teranishi " . "teranisi@gohome.org") ("Katsumi Yamaoka " . "yamaoka@jpl.org")) (:maintainer "TSUCHIYA Masatoshi" . "tsuchiya@namazu.org"))])
- (shm . [(20180327 57) nil "Structured Haskell Mode" tar ((:commit . "7f9df73f45d107017c18ce4835bbc190dfe6782e") (:keywords "development" "haskell" "structured") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com"))])
- (shoulda . [(20140616 1833) ((cl-lib (0 5))) "Shoulda test support for ruby" single ((:commit . "fbe8eb8efc6cfcca1713283a290882cfcdc8725e") (:keywords "ruby" "tests" "shoulda") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com"))])
- (show-css . [(20160210 1408) ((doom (1 3)) (s (1 10 0))) "Show the css of the html attribute the cursor is on" tar ((:commit . "771daeddd4df7a7c10f66419a837145649bab63b") (:keywords "hypermedia") (:authors ("Sheldon McGrandle" . "developer@rednemesis.com")) (:maintainer "Sheldon McGrandle" . "developer@rednemesis.com") (:url . "https://github.com/smmcg/showcss-mode"))])
- (show-eol . [(20200723 706) ((emacs (24 4))) "Show end of line symbol in buffer" single ((:commit . "9fe95a4b1cda218082eb1d977190cc66c7a6b4ea") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/show-eol"))])
- (showtip . [(20090830 1040) nil "Show tip at cursor" single ((:commit . "930da302809a4257e8d69425455b29e1cc91949b") (:keywords "help") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))])
- (shpec-mode . [(20150530 922) nil "Minor mode for shpec specification" single ((:commit . "146adc8281d0f115df39a3a3f982ac59ab61b754") (:keywords "languages" "tools") (:authors ("AdrieanKhisbe" . "adriean.khisbe@live.fr")) (:maintainer "AdrieanKhisbe" . "adriean.khisbe@live.fr") (:url . "http://github.com/shpec/shpec-mode"))])
- (shr-tag-pre-highlight . [(20200626 1047) ((emacs (25 1)) (language-detection (0 1 0))) "Syntax highlighting code block in HTML" single ((:commit . "931c447bc0d6c134ddc9657c664eeee33afbc54d") (:keywords "html") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/shr-tag-pre-highlight.el"))])
- (shrface . [(20200508 1711) ((emacs (25 1)) (org (9 0))) "Extend shr/eww with org features and analysis capability" single ((:commit . "45dc4c21a20c0fb8712412d7c6e3b0d811190e9f") (:keywords "faces") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:url . "https://github.com/chenyanming/shrface"))])
- (shrink-path . [(20190208 1335) ((emacs (24)) (s (1 6 1)) (dash (1 8 0)) (f (0 10 0))) "fish-style path" single ((:commit . "c14882c8599aec79a6e8ef2d06454254bb3e1e41") (:authors ("Benjamin Andresen")) (:maintainer "Benjamin Andresen") (:url . "https://gitlab.com/bennya/shrink-path.el"))])
- (shrink-whitespace . [(20181003 321) nil "Whitespace removal DWIM key" single ((:commit . "0407b89c142bd17e65edb666f35e2c6755bd0867") (:keywords "convenience") (:authors ("Jean-Christophe Petkovich" . "jcpetkovich@gmail.com")) (:maintainer "Jean-Christophe Petkovich" . "jcpetkovich@gmail.com") (:url . "https://gitlab.com/jcpetkovich/shrink-whitespace.el"))])
- (shroud . [(20200124 1833) ((emacs (25)) (epg (1 0 0)) (s (1 6 0)) (bui (1 2 0)) (dash (2 15 0)) (dash-functional (2 15 0))) "Shroud secrets" tar ((:commit . "bf8a854ecd440c525b870f9439f6785700af80d3") (:keywords "tools" "password") (:authors ("Amar Singh" . "nly@disroot.org")) (:maintainer "Amar Singh" . "nly@disroot.org") (:url . "https://github.com/o-nly/emacs-shroud"))])
- (shut-up . [(20180628 1830) ((cl-lib (0 3)) (emacs (24))) "Shut up would you!" single ((:commit . "081d6b01e3ba0e60326558e545c4019219e046ce") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/shut-up.el"))])
- (shx . [(20200410 639) ((emacs (24 4))) "Extras for the comint-mode shell" single ((:commit . "5308d6891276b0aa2b0fd865f6c6f8c1a80ecb54") (:keywords "terminals" "processes" "comint" "shell" "repl") (:url . "https://github.com/riscy/shx-for-emacs"))])
- (sibilant-mode . [(20151119 2145) nil "Support for the Sibilant programming language" single ((:commit . "bc1b5d8cd597918bafc9b2880ee49024740e54ab") (:keywords "languages") (:authors ("Jacob Rothstein" . "hi@jbr.me")) (:maintainer "Jacob Rothstein" . "hi@jbr.me") (:url . "http://sibilantjs.info"))])
- (sicp . [(20200512 1137) nil "Structure and Interpretation of Computer Programs in info format" tar ((:commit . "4002d83083d520c6b5ede2df36cc2cee885d450a") (:authors ("Hal Abelson") ("Jerry Sussman") ("Julie Sussman")) (:maintainer "Hal Abelson") (:url . "https://mitpress.mit.edu/sicp"))])
- (side-notes . [(20200617 1445) ((emacs (24 5))) "Easy access to a directory notes file" single ((:commit . "27c964334b8e30fa88e4278ae58dc3d00df34f1f") (:keywords "convenience") (:authors ("William Rankin" . "william@bydasein.com")) (:maintainer "William Rankin" . "william@bydasein.com") (:url . "https://github.com/rnkn/side-notes"))])
- (sift . [(20200421 1423) nil "Front-end for sift, a fast and powerful grep alternative" single ((:commit . "cdddba2d183146c340915003f1b5d09d13712c22") (:keywords "sift" "ack" "pt" "ag" "grep" "search") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/sift.el"))])
- (signal . [(20160816 1438) ((emacs (24)) (cl-lib (0 5))) "Advanced hook" single ((:commit . "aa58327e2297df921d72a0370468b48663efd438") (:keywords "internal" "lisp" "processes" "tools") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:url . "https://github.com/mola-T/signal"))])
- (silkworm-theme . [(20191005 1903) ((emacs (24))) "Light theme with pleasant, low contrast colors." single ((:commit . "6cb44e3bfb095588aa3bdf8d0d45b583521f9e2c") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))])
- (simp . [(20180607 254) nil "Simple project definition, chiefly for file finding, and grepping" tar ((:commit . "d4d4b8547055347828bedccbeffdb4fd2d5a5d34") (:keywords "project" "grep" "find") (:authors ("atom smith")) (:maintainer "atom smith") (:url . "https://github.com/re5et/simp"))])
- (simple-bookmarks . [(20190204 1426) ((cl-lib (0 5))) "Bookmark / functioncall manager" tar ((:commit . "54e8d771bcdb0eb235b31c0aa9642171369500e5") (:keywords "bookmark" "functioncall") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com") (:url . "https://github.com/jtkDvlp/simple-bookmarks"))])
- (simple-call-tree . [(20180224 2056) ((emacs (24 3)) (anaphora (1 0 0))) "analyze source code based on font-lock text-properties" single ((:commit . "20059eb5549408def76aeb03d0d20839903dedef") (:keywords "programming") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "http://www.emacswiki.org/emacs/download/simple-call-tree.el"))])
- (simple-httpd . [(20191103 1446) ((cl-lib (0 3))) "pure elisp HTTP server" single ((:commit . "22ce66ea43e0eadb9ec1d691a35d9695fc29cee6") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacs-http-server"))])
- (simple-modeline . [(20200427 717) ((emacs (26 1))) "A simple mode-line configuration for Emacs" tar ((:commit . "08197f4c37aa28c8305f0b0316619421e42a8b75") (:keywords "mode-line" "faces") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com") (:url . "https://github.com/gexplorer/simple-modeline"))])
- (simple-mpc . [(20200523 1804) ((s (1 10 0))) "provides a simple interface to mpc" tar ((:commit . "ce731fa390b7e4edfc461a9cfb4443c1aab4b011") (:keywords "multimedia" "mpd" "mpc") (:authors ("Joren Van Onder" . "joren@jvo.sh")) (:maintainer "Joren Van Onder" . "joren@jvo.sh") (:url . "https://github.com/jorenvo/simple-mpc"))])
- (simple-paren . [(20200120 2036) ((emacs (24)) (cl-lib (0 5))) "Non-electrical insert paired delimiter, wrap" single ((:commit . "2a4ba8f99f39abf17976db8118e32b80eff0798b") (:keywords "convenience") (:authors ("Andreas Röhler, Steve Purcell")) (:maintainer "Andreas Röhler, Steve Purcell") (:url . "https://github.com/andreas-roehler/simple-paren"))])
- (simple-rtm . [(20160222 1534) ((rtm (0 1)) (dash (2 0 0))) "Interactive Emacs mode for Remember The Milk" single ((:commit . "8c7cd96cf66ef112be5c363e3378e304f8f83999") (:keywords "remember" "the" "milk" "productivity" "todo") (:authors ("Moritz Bunkus" . "morit@bunkus.org")) (:maintainer "Moritz Bunkus" . "morit@bunkus.org"))])
- (simple-screen . [(20161009 920) nil "Simple screen configuration manager" single ((:commit . "596e3a451d9af24730ab31a8fe15c91a4264d09d") (:keywords "tools") (:authors ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainer "Tadashi Watanabe" . "wac@umiushi.org") (:url . "https://github.com/wachikun/simple-screen"))])
- (simpleclip . [(20200210 1406) nil "Simplified access to the system clipboard" single ((:commit . "970159c788d38877f55f6fe93fe590642d45fb47") (:keywords "convenience") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/simpleclip"))])
- (simplenote . [(20141118 1440) nil "Interact with simple-note.appspot.com" single ((:commit . "e836fcdb5a6497a9ffd6bceddd19b4bc52189078") (:keywords "simplenote") (:authors ("Konstantinos Efstathiou" . "konstantinos@efstathiou.gr")) (:maintainer "Konstantinos Efstathiou" . "konstantinos@efstathiou.gr"))])
- (simplenote2 . [(20190321 933) ((request-deferred (0 2 0)) (uuidgen (20140918)) (unicode-escape (1 1))) "Interact with app.simplenote.com" tar ((:commit . "760ffecda63bd218876b623f46d332e3ef079be6") (:keywords "simplenote") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com"))])
- (simplezen . [(20130421 1000) ((s (1 4 0)) (dash (1 1 0))) "A simple subset of zencoding-mode for Emacs." single ((:commit . "119fdf2c6890a0c56045ae72cf4fce0071a81481") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (sis . [(20200731 1316) ((emacs (25 1)) (terminal-focus-reporting (0 0))) "Switch native or OS input source (input method) smartly" single ((:commit . "925ce80f3af34ea24f1e0f55270a90d7fae65400") (:keywords "convenience") (:url . "https://github.com/laishulu/emacs-smart-input-source"))])
- (skeletor . [(20191129 841) ((s (1 7 0)) (f (0 14 0)) (dash (2 2 0)) (cl-lib (0 3)) (let-alist (1 0 3)) (emacs (24 1))) "Provides project skeletons for Emacs" tar ((:commit . "eb21383a9c9e7cf7ae2bbb85cb6d4f42aa3cb37f") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))])
- (skewer-less . [(20160828 2021) ((skewer-mode (1 5 3))) "Skewer support for live LESS stylesheet updates" single ((:commit . "8ce9d030e18133319181d5dabe3e905c8ca5fd6b") (:keywords "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))])
- (skewer-mode . [(20200304 1142) ((simple-httpd (1 4 0)) (js2-mode (20090723)) (emacs (24))) "live browser JavaScript, CSS, and HTML interaction" tar ((:commit . "e5bed351939c92a1f788f78398583c2f83f1bb3c"))])
- (skewer-reload-stylesheets . [(20160725 1220) ((skewer-mode (1 5 3))) "live-edit CSS, SCSS, Less, and friends." tar ((:commit . "b9cc5635230ac3c0603a6da690c6e632d0a7490a") (:authors ("Nate Eagleson" . "nate@nateeag.com")) (:maintainer "Nate Eagleson" . "nate@nateeag.com"))])
- (skype . [(20160711 824) nil "skype UI for emacs users.." tar ((:commit . "8e3b33e620ed355522aa36434ff41e3ced080629") (:keywords "skype" "chat") (:authors ("SAKURAI Masashi" . "m.sakurai@kiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakurai@kiwanami.net"))])
- (sl . [(20161217 1404) ((cl-lib (0 5))) "An Emacs clone of sl(1)" tar ((:commit . "fceb2ae12a3065b2a265b921baca0891c5ea54dc") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/sl.el"))])
- (slack . [(20200725 1052) ((websocket (1 8)) (request (0 2 0)) (oauth2 (0 10)) (circe (2 2)) (alert (1 2)) (emojify (0 2))) "Slack client for Emacs" tar ((:commit . "7570e82604b59b65e9ef31c5325bef45769ae027") (:url . "https://github.com/yuya373/emacs-slack"))])
- (slideview . [(20150324 2240) ((cl-lib (0 3))) "File slideshow" single ((:commit . "b6d170bda139aedf81b47dc55cbd1a3af512fb4c") (:keywords "files") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/Emacs-slideview"))])
- (slim-mode . [(20170728 1348) nil "Major mode for editing Slim files" single ((:commit . "3636d18ab1c8b316eea71c4732eb44743e2ded87") (:keywords "markup" "language") (:authors ("Nathan Weizenbaum")) (:maintainer "Nathan Weizenbaum") (:url . "http://github.com/slim-template/emacs-slim"))])
- (slime . [(20200721 1604) ((cl-lib (0 5)) (macrostep (0 9))) "Superior Lisp Interaction Mode for Emacs" tar ((:commit . "5f48c8c1f3c1538cccc155268d304172e6339aa7") (:keywords "languages" "lisp" "slime") (:url . "https://github.com/slime/slime"))])
- (slime-company . [(20200424 1045) ((emacs (24 4)) (slime (2 13)) (company (0 9 0))) "slime completion backend for company mode" single ((:commit . "cec203c45ebd678b05341d1cdbe420ad07a1b8e0") (:keywords "convenience" "lisp" "abbrev") (:authors ("Ole Arndt" . "anwyn@sugarshark.com")) (:maintainer "Ole Arndt" . "anwyn@sugarshark.com"))])
- (slime-docker . [(20190430 157) ((emacs (24)) (slime (2 16)) (docker-tramp (0 1)) (cl-lib (0 5))) "Integration of SLIME with Docker containers." tar ((:commit . "151cec4a11965cdc00d231900a50f2c9f455fce2") (:keywords "docker" "lisp" "slime") (:url . "https://github.com/daewok/slime-docker"))])
- (slime-repl-ansi-color . [(20200712 1226) ((emacs (24)) (slime (2 3 1))) "Turn on ANSI colors in REPL output;" single ((:commit . "e38c7958d9657e41c426b4e96938b3f604238795") (:keywords "lisp") (:authors ("Max Mikhanosha" . "max@openchat.com")) (:maintainer "Augustin Fabre" . "augustin@augfab.fr") (:url . "https://gitlab.com/augfab/slime-repl-ansi-color"))])
- (slime-theme . [(20170808 1322) ((emacs (24 0))) "an Emacs 24 theme based on Slime (tmTheme)" single ((:commit . "8e5880ac69e0b6a079103001cc3a90bdb688998f") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
- (slime-volleyball . [(20190701 1624) nil "An SVG Slime Volleyball Game" tar ((:commit . "6c135ad18897c3566d4dadfe847061532600ba2e") (:keywords "games") (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))])
- (slirm . [(20160201 1425) ((emacs (24 4))) "Systematic Literature Review Mode for Emacs." single ((:commit . "9adfbe1fc67580e7d0d90f7e927a25d63a797464") (:authors ("Florian Biermann" . "fbie@itu.dk")) (:maintainer "Florian Biermann" . "fbie@itu.dk") (:url . "http://github.com/fbie/slirm"))])
- (slovak-holidays . [(20150418 855) nil "Adds a list of slovak holidays to Emacs calendar" single ((:commit . "effb16dfcd14797bf7448f5113085479db339c02") (:keywords "calendar") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))])
- (slow-keys . [(20180831 459) ((emacs (24 1))) "Slow keys mode to avoid RSI" single ((:commit . "b93ad77f9fc1d14e080d7d64864fc9cb222248b6") (:keywords "convenience") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:url . "https://github.com/manuel-uberti/slow-keys"))])
- (slstats . [(20170823 849) ((cl-lib (0 5)) (emacs (24))) "Acquire and display stats about Second Life" single ((:commit . "e9696066abf3f2b7b818a57c062530dfd9377033") (:keywords "games") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/slstats.el"))])
- (sly . [(20200731 1138) ((emacs (24 3))) "Sylvester the Cat's Common Lisp IDE" tar ((:commit . "72bf07368ca8b390cdd87faa441ad644c44312ab") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/joaotavora/sly"))])
- (sly-asdf . [(20200306 433) ((emacs (24 3)) (sly (1 0 0 -2 2)) (popup (0 5 3))) "ASDF system support for SLY" tar ((:commit . "32ce14994e8faee9321605cec36d156b02996c46") (:keywords "languages" "lisp" "sly" "asdf") (:maintainer "Matt George" . "mmge93@gmail.com") (:url . "https://github.com/mmgeorge/sly-asdf"))])
- (sly-hello-world . [(20200225 1755) ((sly (1 0 0 -2 2))) "A template SLY contrib" tar ((:commit . "d25acc1220a3ce066bd9908251c2f0f88b1781e9") (:keywords "languages" "lisp" "sly") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/capitaomorte/sly-hello-world"))])
- (sly-macrostep . [(20191211 1630) ((sly (1 0 0 -2 2)) (macrostep (0 9))) "fancy macro-expansion via macrostep.el" tar ((:commit . "5113e4e926cd752b1d0bcc1508b3ebad5def5fad") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-macrostep"))])
- (sly-named-readtables . [(20191013 2138) ((sly (1 0 0 -2 2))) "Support named readtables in Common Lisp files" tar ((:commit . "a5a42674ccffa97ccd5e4e9742beaf3ea719931f") (:keywords "languages" "lisp" "sly") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/capitaomorte/sly-named-readtables"))])
- (sly-quicklisp . [(20200707 1635) ((sly (1 0 0 -2 2))) "Quicklisp support for SLY" tar ((:commit . "4707b62803d7a29f172e9c5ff993b91187a9aaf3") (:keywords "languages" "lisp" "sly") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/capitaomorte/sly-quicklisp"))])
- (sly-repl-ansi-color . [(20171020 1516) ((sly (0)) (cl-lib (0 5))) "Add ANSI colors support to the sly mrepl." single ((:commit . "b9cd52d1cf927bf7e08582d46ab0bcf1d4fb5048") (:keywords "sly") (:authors ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") ("Max Mikhanosha")) (:maintainer "Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") (:url . "https://github.com/PuercoPop/sly-repl-ansi-color"))])
- (smart-backspace . [(20171014 526) nil "intellj like backspace" single ((:commit . "a10ec44ff325ec8c4c98b1a6e44e89e60a9aa4ac") (:authors ("Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com")) (:maintainer "Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com") (:url . "https://github.com/itome/smart-backspace"))])
- (smart-comment . [(20160322 1839) nil "smarter commenting" single ((:commit . "17ddbd83205818763e6d68aa7a1aa9aaf414cbd4") (:keywords "lisp") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io"))])
- (smart-compile . [(20200727 1249) nil "an interface to `compile'" single ((:commit . "1f14c86af7ca5813ddc0b6dfcf2edd4a81371644") (:keywords "tools" "unix") (:authors ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainer "Seiji Zenitani" . "zenitani@gmail.com"))])
- (smart-cursor-color . [(20141124 1719) nil "Change cursor color dynamically" single ((:commit . "1d190f49ca77734b55ac58f1b6276e42ada967b0") (:keywords "cursor" "color" "face") (:authors ("7696122")) (:maintainer "7696122") (:url . "https://github.com/7696122/smart-cursor-color/"))])
- (smart-dash . [(20200104 1620) nil "Smart-Dash minor mode" single ((:commit . "9db5c6bb4a51457281588523a2725939a31d3f26") (:authors ("Dennis Lambe Jr." . "malsyned@malsyned.net")) (:maintainer "Dennis Lambe Jr." . "malsyned@malsyned.net"))])
- (smart-forward . [(20140430 713) ((expand-region (0 8 0))) "Semantic navigation" single ((:commit . "7b6dbfdbd4b646376a567c70e1a161545431b72b") (:keywords "navigation") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (smart-hungry-delete . [(20170412 1343) ((emacs (24 3))) "smart hungry deletion of whitespace" single ((:commit . "7c1d56a92481594e14d40b5fdf6c48657a0108a0") (:keywords "convenience") (:authors ("Hauke Rehfeld" . "emacs@haukerehfeld.de")) (:maintainer "Hauke Rehfeld" . "emacs@haukerehfeld.de") (:url . "https://github.com/hrehfeld/emacs-smart-hungry-delete"))])
- (smart-indent-rigidly . [(20141206 15) nil "Smart rigid indenting" single ((:commit . "323d1fe4d0b81e598249aad01bc44adb180ece0e") (:keywords "indenting" "coffee-mode" "haml-mode" "sass-mode") (:authors ("atom smith")) (:maintainer "atom smith") (:url . "https://github.com/re5et/smart-indent-rigidly"))])
- (smart-jump . [(20190925 1518) ((emacs (25 1)) (dumb-jump (0 5 1))) "Smart go to definition." tar ((:commit . "07800ddd508cf620e6360e4a1f5bb25f8eab3ab1") (:keywords "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/smart-jump"))])
- (smart-mark . [(20150912 210) nil "Restore point after C-g when mark" single ((:commit . "04b522a23e3aae8381c6a976fc978532fcb2e7d0") (:keywords "mark" "restore") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com"))])
- (smart-mode-line . [(20190527 1156) ((emacs (24 3)) (rich-minority (0 1 1))) "A color coded smart mode-line." tar ((:commit . "999be065b195f2eddb4e1b629f99038d832d44b7") (:keywords "mode-line" "faces" "themes") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "http://github.com/Malabarba/smart-mode-line"))])
- (smart-mode-line-atom-one-dark-theme . [(20200106 2016) ((emacs (24 3)) (smart-mode-line (2 10))) "Atom-one-dark theme for smart-mode-line" single ((:commit . "e281b52b164a477fcdb6a468976e8a1bdde1ca26") (:keywords "mode-line" "themes" "faces") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:url . "https://github.com/daviderestivo/smart-mode-line-atom-one-dark-theme"))])
- (smart-mode-line-powerline-theme . [(20160706 38) ((emacs (24 3)) (powerline (2 2)) (smart-mode-line (2 5))) "smart-mode-line theme that mimics the powerline appearance." tar ((:commit . "999be065b195f2eddb4e1b629f99038d832d44b7") (:keywords "mode-line" "faces" "themes") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:url . "http://github.com/Bruce-Connor/smart-mode-line"))])
- (smart-newline . [(20131208 340) nil "Provide smart newline for one keybind." single ((:commit . "0553a9e4be7188352de1a28f2eddfd28e7436f94") (:authors ("Satoshi Namai")) (:maintainer "Satoshi Namai"))])
- (smart-region . [(20150903 1403) ((emacs (24 4)) (expand-region (0 10 0)) (multiple-cursors (1 3 0)) (cl-lib (0 5))) "Smartly select region, rectangle, multi cursors" single ((:commit . "5a8017fd8e8dc3483865951c4942cab3f96f69f6") (:keywords "marking" "region") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:url . "https://github.com/uk-ar/smart-region"))])
- (smart-semicolon . [(20171008 133) ((emacs (25))) "Insert semicolon smartly" single ((:commit . "bcea2aa37befa40abf8b24a2d2314904e6df43b3") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/smart-semicolon"))])
- (smart-shift . [(20150203 725) nil "Smart shift text left/right." single ((:commit . "a26ab2b240137e62ec4bce1698ed9c5f7b6d13ae") (:keywords "convenience" "tools") (:authors ("Bin Huang" . "huangbin88@foxmail.com")) (:maintainer "Bin Huang" . "huangbin88@foxmail.com") (:url . "https://github.com/hbin/smart-shift"))])
- (smart-tab . [(20200416 2228) ((emacs (24 3))) "Intelligent tab completion and indentation" single ((:commit . "67bf4f93f8afca61a3dc4f6c7a34b0b8ca9ede21") (:keywords "extensions") (:authors ("John SJ Anderson" . "john@genehack.org") ("Sebastien Rocca Serra" . "sroccaserra@gmail.com") ("Daniel Hackney" . "dan@haxney.org")) (:maintainer "John SJ Anderson" . "john@genehack.org") (:url . "http://github.com/genehack/smart-tab/tree/master"))])
- (smart-tabs-mode . [(20160629 1452) nil "Intelligently indent with tabs, align with spaces!" single ((:commit . "9cc2594b82b03e7d68645a4878f9359f8b8c34c5") (:keywords "languages") (:authors ("John Croisant" . "jacius@gmail.com") ("Alan Pearce" . "alan@alanpearce.co.uk") ("Daniel Dehennin" . "daniel.dehennin@baby-gnu.org") ("Matt Renaud" . "mrenaud92@gmail.com")) (:maintainer "Joel C. Salomon" . "joelcsalomon@gmail.com") (:url . "http://www.emacswiki.org/emacs/SmartTabs"))])
- (smart-window . [(20160717 130) ((cl-lib (0 5))) "vim-like window controlling plugin" single ((:commit . "5996461b7cbc5ab4509ac48537916eb29a8e4c16") (:keywords "window") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com") (:url . "https://github.com/dryman/smart-window.el"))])
- (smartparens . [(20200324 2147) ((dash (2 13 0)) (cl-lib (0 3))) "Automatic insertion, wrapping and paredit-like navigation with user defined pairs." tar ((:commit . "555626a43f9bb1985aa9a0eb675f2b88b29702c8"))])
- (smartrep . [(20150509 230) nil "Support sequential operation which omitted prefix keys." single ((:commit . "f0ff5a6d7b8603603598ae3045c98b011e58d86e") (:keywords "convenience") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/smartrep.el"))])
- (smartscan . [(20170211 2033) nil "Jumps between other symbols found at point" single ((:commit . "234e077145710a174c20742de792b97ed2f965f6") (:keywords "extensions") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))])
- (smarty-mode . [(20100703 1158) nil "major mode for editing smarty templates" single ((:commit . "3dfdfe1571f5e9ef55a29c51e5a80046d4cb7568") (:keywords "smarty" "php" "languages" "templates") (:maintainer "Benj Carson") (:url . "none yet"))])
- (smbc . [(20171229 1808) nil "View SMBC from Emacs" single ((:commit . "10538e3d575ba6ef3c94d555af2744b42dfd36c7") (:keywords "smbc" "webcomic") (:authors ("Saksham Sharma" . "saksham0808@gmail.com")) (:maintainer "Saksham Sharma" . "saksham0808@gmail.com") (:url . "https://github.com/sakshamsharma/emacs-smbc"))])
- (smblog . [(20200424 938) ((emacs (24 3))) "samba log viewer" single ((:commit . "fc949cff7051b31f0dbc7169774144533a27b92f") (:authors ("Aurélien Aptel" . "aaptel@suse.com")) (:maintainer "Aurélien Aptel" . "aaptel@suse.com") (:url . "http://github.com/aaptel/smblog-mode"))])
- (smeargle . [(20200323 533) ((emacs (24 3))) "Highlighting region by last updated time" single ((:commit . "a0e9bc2ea694aa2940102e1f4cfd8db8be437931") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/smeargle"))])
- (smex . [(20151212 2209) ((emacs (24))) "M-x interface with Ido-style fuzzy matching." single ((:commit . "55aaebe3d793c2c990b39a302eb26c184281c42c") (:keywords "convenience" "usability") (:authors ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainer "Cornelius Mika" . "cornelius.mika@gmail.com") (:url . "http://github.com/nonsequitur/smex/"))])
- (smiles-mode . [(20160717 1120) nil "Major mode for SMILES." single ((:commit . "fbb381758adcb000a0c304be1b797f985f00e2de") (:keywords "smiles") (:authors (nil . "John Kitchin [jkitchin@andrew.cmu.edu]")) (:maintainer nil . "John Kitchin [jkitchin@andrew.cmu.edu]"))])
- (sml-modeline . [(20170614 2111) nil "Show position in a scrollbar like way in mode-line" single ((:commit . "d2f9f70174c4cf68c67eb3bb8088235735e34d9a") (:authors ("Lennart Borgman (lennart O borgman A gmail O com)")) (:maintainer "Lennart Borgman (lennart O borgman A gmail O com)") (:url . "http://bazaar.launchpad.net/~nxhtml/nxhtml/main/annotate/head%3A/util/sml-modeline.el"))])
- (smmry . [(20161024 901) nil "SMMRY client" single ((:commit . "986a1b0aec8ab1ef17dbfb7886f47e5558cf738a") (:keywords "api" "smmry") (:authors ("james sangho nah" . "microamp@protonmail.com")) (:maintainer "james sangho nah" . "microamp@protonmail.com") (:url . "https://github.com/microamp/smmry.el"))])
- (smog . [(20200211 528) ((emacs (24 1)) (org (8 1))) "Analyse the writing style, word use and readability of prose" single ((:commit . "531957d7356f623b026aa45923e536421f682c1a") (:keywords "tools" "style" "readability" "prose") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:url . "https://github.com/zzkt/smog"))])
- (smooth-scroll . [(20130322 414) nil "Minor mode for smooth scrolling and in-place scrolling." single ((:commit . "02320f28abb5cae28b3a18f6b9ce93129bdbfc45") (:keywords "convenience" "emulations" "frames") (:authors ("K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>")) (:maintainer "K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>") (:url . "http://www.emacswiki.org/emacs/download/smooth-scroll.el"))])
- (smooth-scrolling . [(20161002 1949) nil "Make emacs scroll smoothly" single ((:commit . "2462c13640aa4c75ab3ddad443fedc29acf68f84") (:keywords "convenience") (:authors ("Adam Spiers" . "emacs-ss@adamspiers.org") ("Jeremy Bondeson" . "jbondeson@gmail.com") ("Ryan C. Thompson" . "rct+github@thompsonclan.org")) (:maintainer "Adam Spiers" . "emacs-ss@adamspiers.org") (:url . "http://github.com/aspiers/smooth-scrolling/"))])
- (smotitah . [(20150218 1030) nil "Modular emacs configuration framework" tar ((:commit . "f9ab562128a5460549d016913533778e8c94bcf3"))])
- (smtpmail-multi . [(20160218 2349) nil "Use different smtp servers for sending mail" single ((:commit . "83fa9d7a02e000be95cb282c8b48446646896ea1") (:keywords "comm") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/smtpmail-multi"))])
- (smyx-theme . [(20141127 828) nil "smyx Color Theme" single ((:commit . "6263f6b401bbabaed388c8efcfc0be2e58c51401") (:keywords "color" "theme" "smyx") (:authors ("Uriel G Maldonado" . "uriel781@gmail.com")) (:maintainer "Uriel G Maldonado" . "uriel781@gmail.com"))])
- (snakemake-mode . [(20200720 349) ((emacs (24 5)) (cl-lib (0 5)) (magit-popup (2 4 0))) "Major mode for editing Snakemake files" tar ((:commit . "44b88fc2aff7c970c2699de2d8615d81092342f6") (:keywords "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:url . "https://git.kyleam.com/snakemake-mode/about"))])
- (snapshot-timemachine . [(20161221 929) ((emacs (24 4))) "Step through (Btrfs, ZFS, ...) snapshots of files" single ((:commit . "99efcebab309b11ed512a8dc62555d3834df5efb") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/snapshot-timemachine"))])
- (snapshot-timemachine-rsnapshot . [(20170324 1213) ((snapshot-timemachine (20160222 132)) (seq (2 19))) "rsnapshot backend for snapshot-timemachine" single ((:commit . "72b0b700d80f1a0442e62bbbb6a0c8c59182f97f") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))])
- (snazzy-theme . [(20170823 1832) ((emacs (24)) (base16-theme (2 1))) "An elegant syntax theme with bright colors" single ((:commit . "57a1763b49b4a776084c16bc70c219246fa5b412") (:keywords "faces" "theme" "color" "snazzy") (:url . "https://github.com/weijiangan/emacs-snazzy/"))])
- (snippet . [(20130210 2315) nil "Insert snippets of text into a buffer" single ((:commit . "11d00dd803874b93836f2010b08bd2c97b0f3c63") (:authors ("Pete Kazmier")) (:maintainer "Pete Kazmier"))])
- (snoopy . [(20171008 2004) ((emacs (24)) (cl-lib (0 6))) "minor mode for number row unshifted character insertion" single ((:commit . "ec4123bdebfe0bb7bf4feaac2dc02b59caffe386") (:keywords "lisp") (:authors ("António Nuno Monteiro" . "anmonteiro@gmail.com")) (:maintainer "António Nuno Monteiro" . "anmonteiro@gmail.com"))])
- (soar-mode . [(20190503 1843) nil "A major mode for the Soar language" single ((:commit . "13b6fca62ea6574d230516fddf359a61f6558ecd") (:keywords "languages" "soar") (:url . "https://github.com/adeschamps/soar-mode"))])
- (socyl . [(20170212 642) ((s (1 11 0)) (dash (2 12 0)) (pkg-info (0 5 0)) (cl-lib (0 5))) "Frontend for several search tools" tar ((:commit . "1ef2da42f66f3ab31a34131e51648f352416f0ba") (:keywords "ripgrep" "sift" "ack" "pt" "ag" "grep" "search") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/socyl"))])
- (soft-charcoal-theme . [(20140420 1643) nil "Dark charcoal theme with soft colors" single ((:commit . "5607ab977fae6638e78b1495e02da8955c9ba19f") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-charcoal-theme"))])
- (soft-morning-theme . [(20150918 2041) nil "Emacs24 theme with a light background." single ((:commit . "c0f9c70c97ef2be2a093cf839c4bfe27740a111c") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-morning-theme"))])
- (soft-stone-theme . [(20140614 835) ((emacs (24))) "Emacs 24 theme with a light background." single ((:commit . "fb475514cfb02cf30ce358a61c48e46614344d48") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-stone-theme"))])
- (solaire-mode . [(20200731 455) ((emacs (24 4)) (cl-lib (0 5))) "make certain buffers grossly incandescent" single ((:commit . "d3e8f9e1e3109a93a39602deac6a21be497f7f16") (:keywords "dim" "bright" "window" "buffer" "faces") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-solaire-mode"))])
- (solarized-theme . [(20200717 1054) ((emacs (24 1)) (dash (2 16))) "The Solarized color theme" tar ((:commit . "63eb59a7ef32abc6780883e27df69a6e42a8a6e4") (:keywords "convenience" "themes" "solarized") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://github.com/bbatsov/solarized-emacs"))])
- (solidity-flycheck . [(20200113 1721) ((flycheck (32 -4)) (solidity-mode (0 1 9))) "Flycheck integration for solidity emacs mode" single ((:commit . "d166a86b83907e0cfd64c191e9dfce4b44a9843e") (:keywords "languages" "solidity" "flycheck") (:authors ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas " . "lefteris@refu.co"))])
- (solidity-mode . [(20200529 1924) nil "Major mode for ethereum's solidity language" tar ((:commit . "d166a86b83907e0cfd64c191e9dfce4b44a9843e") (:keywords "languages" "solidity") (:authors ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas " . "lefteris@refu.co"))])
- (somafm . [(20200224 48) ((emacs (26 1)) (dash (2 12 0)) (request (0 3 2)) (cl-lib (0 6 1))) "A simple soma.fm interface" single ((:commit . "9fdb75e150e78170b3ca7863a8a0638c6ecc0fc0") (:keywords "multimedia") (:authors ("Arte Ebrahimi <>")) (:maintainer "Arte Ebrahimi <>") (:url . "https://github.com/artenator/somafm.el"))])
- (sonic-pi . [(20171205 1205) ((cl-lib (0 5)) (osc (0 1)) (dash (2 2 0)) (emacs (24)) (highlight (0))) "A Emacs client for SonicPi" tar ((:commit . "3cf101b3b299735ed91658c7791ea4f04164e076") (:keywords "sonicpi" "ruby") (:authors ("Joseph Wilk" . "joe@josephwilk.net")) (:maintainer "Joseph Wilk" . "joe@josephwilk.net") (:url . "http://www.github.com/repl-electric/sonic-pi.el"))])
- (soothe-theme . [(20141027 1441) ((emacs (24 1))) "a dark colorful theme for Emacs24." single ((:commit . "0786fe70c6c1b4ddcfb932fdc6862b9611cfc09b") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-soothe-theme"))])
- (sorcery-theme . [(20200413 2242) ((autothemer (0 2))) "A D&D (Dark and Dusty) Theme" single ((:commit . "fb041d0d8d4ae2840ddcfb1bd56fefe687da8c52") (:authors ("Maxime Tréca" . "maxime@gmail.com")) (:maintainer "Maxime Tréca" . "maxime@gmail.com") (:url . "http://github.com/vxid/emacs-theme-sorcery"))])
- (soria-theme . [(20200505 851) ((emacs (25 1))) "A xoria256 theme with some colors from openSUSE" single ((:commit . "0f73c5a87b874e72ed286cf43e0b8dfec73769c3") (:keywords "faces") (:authors ("Miquel Sabaté Solà" . "mikisabate@gmail.com")) (:maintainer "Miquel Sabaté Solà" . "mikisabate@gmail.com") (:url . "https://github.com/mssola/soria"))])
- (sort-words . [(20160929 1335) nil "Sort words in a selected region" single ((:commit . "7b6e108f80237363faf7ec28b2c58dec270b8601") (:keywords "tools") (:authors ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainer "\"Aleksandar Simic\"" . "asimic@gmail.com") (:url . "http://github.org/dotemacs/sort-words.el"))])
- (sos . [(20200510 1734) ((org (7))) "StackOverflow Search" single ((:commit . "6c25beae9f6db8fc7a037112ad5d4be9f5f36986") (:keywords "tools" "search" "questions") (:authors ("Rudolf Olah")) (:maintainer "Rudolf Olah") (:url . "https://github.com/rudolfolah/emacs-sos"))])
- (sotclojure . [(20170922 8) ((emacs (24 1)) (clojure-mode (4 0 0)) (cider (0 8)) (sotlisp (1 3))) "Write clojure at the speed of thought." tar ((:commit . "a480c887b53cb007b7b099c5ffcab89b9e59d7bc") (:keywords "convenience" "clojure") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/speed-of-thought-clojure"))])
- (sotlisp . [(20190211 2026) ((emacs (24 1))) "Write lisp at the speed of thought." single ((:commit . "ed2356a325c7a4a88ec1bd31381c8666e8997e97") (:keywords "convenience" "lisp") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:url . "https://github.com/Malabarba/speed-of-thought-lisp"))])
- (sound-wav . [(20200323 728) ((deferred (0 3 1)) (cl-lib (0 5))) "Play wav file" single ((:commit . "8a18f8a62f4fdde80dfa069986aa959091a42472") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-sound-wav"))])
- (soundcloud . [(20150502 326) ((emms (20131016)) (json (1 2)) (deferred (0 3 1)) (string-utils (0 3 2)) (request (20140316 417)) (request-deferred (20130526 1015))) "a SoundCloud client for Emacs" single ((:commit . "f998d4276ea90258909c698f6a5a51fccb667c08") (:keywords "soundcloud" "music" "audio") (:authors ("Travis Thieman" . "travis.thieman@gmail.com")) (:maintainer "Travis Thieman" . "travis.thieman@gmail.com"))])
- (soundklaus . [(20191220 2112) ((dash (2 12 1)) (emacs (24)) (emms (4 0)) (s (1 11 0)) (pkg-info (0 4)) (cl-lib (0 5)) (request (0 2 0))) "Play music on SoundCloud with Emacs via EMMS" tar ((:commit . "15ce6e7f24a45e4f202d83cca9fa3bfdd94ca592") (:keywords "soundcloud" "music" "emms") (:authors ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com") (:url . "https://github.com/r0man/soundklaus.el"))])
- (sourcekit . [(20180101 834) ((emacs (24 3)) (dash (2 12 1)) (dash-functional (1 2 0)) (request (0 2 0))) "Library to interact with sourcekittendaemon" single ((:commit . "abf9bc5a0102eb666d3aa6d6bf22f6efcc852781") (:keywords "tools" "processes") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:url . "https://github.com/nathankot/company-sourcekit"))])
- (sourcemap . [(20200315 1037) ((emacs (24 3))) "Sourcemap parser" single ((:commit . "bb2a56b2feb62b0c77d7f03ef2acd94f91be6b3f") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-sourcemap"))])
- (sourcerer-theme . [(20161014 1625) nil "A version of sourcerer by xero" single ((:commit . "c7f8e665d53bb48fb72f95f706710d53d24bd407") (:keywords "themes") (:authors ("Bryan Gilbert" . "gilbertw1@gmail.com")) (:maintainer "Bryan Gilbert" . "gilbertw1@gmail.com") (:url . "http://github.com/gilbertw1/sourcerer-emacs"))])
- (sourcetrail . [(20170410 2137) ((emacs (24 4))) "Communication with Sourcetrail" single ((:commit . "b8d5557aa565ae979622312576db20515f65f977") (:keywords "external" "tool") (:authors ("Andreas Stallinger" . "astallinger@sourcetrail.com")) (:maintainer "Andreas Stallinger" . "astallinger@sourcetrail.com"))])
- (space-theming . [(20200502 1032) ((emacs (24))) "Easilly override theme faces" single ((:commit . "31dca6954df643255175f7df68a86892aa3c71a7") (:keywords "faces") (:url . "https://github.com/p3r7/space-theming"))])
- (spacebar . [(20190719 334) ((eyebrowse (0 7 7)) (emacs (25 4 0))) "Workspaces Bar" single ((:commit . "2b2cd0e786877273103f048e62a06b0027deca2d") (:keywords "convenience") (:authors ("Matthias Margush" . "matthias.margush@gmail.com")) (:maintainer "Matthias Margush" . "matthias.margush@gmail.com") (:url . "https://github.com/matthias-margush/spacebar"))])
- (spacegray-theme . [(20150719 1931) ((emacs (24 1))) "A Hyperminimal UI Theme" single ((:commit . "9826265c2bceb2ebc1c5e16a45021da0253ace97") (:keywords "themes") (:authors ("Bruce Williams" . "brwcodes@gmail.com")) (:maintainer "Bruce Williams" . "brwcodes@gmail.com") (:url . "http://github.com/bruce/emacs-spacegray-theme"))])
- (spaceline . [(20191230 1221) ((emacs (24 4)) (cl-lib (0 5)) (powerline (2 3)) (dash (2 11 0)) (s (1 10 0))) "Modeline configuration library for powerline" tar ((:commit . "1b26af2c1a701481ac5d90928fe0200e389756c3") (:keywords "mode-line" "powerline" "spacemacs") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:url . "https://github.com/TheBB/spaceline"))])
- (spaceline-all-the-icons . [(20190325 1602) ((emacs (24 4)) (all-the-icons (2 6 0)) (spaceline (2 0 0)) (memoize (1 0 1))) "A Spaceline theme using All The Icons" tar ((:commit . "5afd48c10f1bd42d9b9648c5e64596b72f3e9042") (:keywords "convenience" "lisp" "tools") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:url . "https://github.com/domtronn/spaceline-all-the-icons.el"))])
- (spacemacs-theme . [(20200615 1304) nil "Color theme with a dark and light versions" tar ((:commit . "e39254159a4fa99a1a92037e4ae23216d362aab1") (:keywords "color" "theme") (:url . "https://github.com/nashamri/spacemacs-theme"))])
- (spaces . [(20170809 2208) nil "Create and switch between named window configurations." single ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:keywords "frames" "convenience") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:url . "https://github.com/chumpage/chumpy-windows"))])
- (spark . [(20160415 201) ((emacs (24 3))) "sparkline generation" single ((:commit . "0bf148c3ede3b31d56fd75f347cdd0b0eae60025") (:keywords "lisp" "data") (:authors ("Alvin Francis Dumalus")) (:maintainer "Alvin Francis Dumalus") (:url . "https://github.com/alvinfrancis/spark"))])
- (sparkline . [(20150101 1319) ((cl-lib (0 3))) "Make sparkline images from a list of numbers" single ((:commit . "a2b5d817d272d6363b67ed8f8cc75499a19fa8d2") (:keywords "extensions") (:authors ("Willem Rein Oudshoorn" . "woudshoo@xs4all.nl")) (:maintainer "Willem Rein Oudshoorn" . "woudshoo@xs4all.nl"))])
- (sparql-mode . [(20200429 1719) ((cl-lib (0 5)) (emacs (24 3))) "Edit and interactively evaluate SPARQL queries." tar ((:commit . "62f198256453265af48bef3a0207e80143fbff1e") (:authors ("Craig Andera <candera at wangdera dot com>")) (:maintainer "Bjarte Johansen <Bjarte dot Johansen at gmail dot com>") (:url . "https://github.com/ljos/sparql-mode"))])
- (speech-tagger . [(20170728 1829) ((cl-lib (0 5))) "tag parts of speech using coreNLP" tar ((:commit . "61955b40d4e8b09e66a3e8033e82893f81657c06") (:keywords "speech" "tag" "nlp" "language" "corenlp" "parsing" "natural") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com") (:url . "https://github.com/cosmicexplorer/speech-tagger"))])
- (speechd-el . [(20200706 1236) nil "Client to speech synthesizers and Braille displays." tar ((:commit . "058f91b4d1b0350221218656202ea80cd6827d65"))])
- (speed-type . [(20191204 1107) ((emacs (24 3)) (cl-lib (0 3))) "Practice touch and speed typing" single ((:commit . "5ef695f7159aa1f20c7c9e55f0c39bcdacce8d21") (:keywords "games") (:authors ("Gunther Hagleitner")) (:maintainer "Julien Pagès" . "j.parkouss@gmail.com") (:url . "https://github.com/parkouss/speed-type"))])
- (speedbar-git-respect . [(20191121 2120) ((f (0 8 0)) (emacs (25 1))) "Particular respect git repo in speedbar" single ((:commit . "4703650c20cb77f08833747529b55be13d450bae") (:authors ("Muromi Ukari" . "chendianbuji@gmail.com")) (:maintainer "Muromi Ukari" . "chendianbuji@gmail.com") (:url . "https://github.com/ukari/speedbar-git-respect"))])
- (speeddating . [(20180319 723) ((emacs (25))) "Increase date and time at point" single ((:commit . "df69db0560f19636a66a74f3d88c793bbb18b21e") (:keywords "date" "time") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/emacs-speeddating"))])
- (spell-fu . [(20200623 307) ((emacs (26 2))) "Fast & light spelling highlighter" single ((:commit . "e94d01cdc822e02968971cde09276047a5d55772") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-spell-fu-mode"))])
- (sphinx-doc . [(20160116 1117) ((s (1 9 0)) (cl-lib (0 5)) (dash (2 10 0))) "Sphinx friendly docstrings for Python functions" single ((:commit . "f39da2e6cae55d5d7c7ce887e69755b7529bcd67") (:keywords "sphinx" "python") (:authors ("Vineet Naik" . "naikvin@gmail.com")) (:maintainer "Vineet Naik" . "naikvin@gmail.com") (:url . "https://github.com/naiquevin/sphinx-doc.el"))])
- (sphinx-frontend . [(20161025 758) nil "Launch build process for rst documents via sphinx." single ((:commit . "0cbb03361c245382d3e679dded30c4fc1713c252") (:keywords "compile" "sphinx" "restructuredtext") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:url . "https://github.com/kostafey/sphinx-frontend"))])
- (sphinx-mode . [(20180620 915) ((f (0 20 0)) (dash (2 14 1))) "Minor mode providing sphinx support." tar ((:commit . "b5ac514e213459dcc57184086f10b5b6be3cecd8"))])
- (spice-mode . [(20190608 1033) ((emacs (24 3))) "Major mode for SPICE" single ((:commit . "e5e0644f03f9696f56dd69e2b6979da7f30ed600") (:keywords "spice" "spice2g6" "spice3" "eldo" "hspice" "layla" "mondriaan" "fasthenry" "cdl" "spectre compatibility" "netlist editing") (:authors ("Geert A. M. Van der Plas" . "geert_vanderplas@email.com") ("Emmanuel Rouat" . "emmanuel.rouat@wanadoo.fr") ("Carlin J. Vieri, MIT AI Lab" . "cvieri@ai.mit.edu")) (:maintainer "Geert A. M. Van der Plas" . "geert_vanderplas@email.com") (:url . "http://spice-mode.4t.com/"))])
- (spiral . [(20180223 1140) ((emacs (25 1)) (a (0 1 0 -3 4)) (avy (0 4 0)) (clojure-mode (5 6 0)) (highlight (0)) (treepy (1 0 0))) "Clojure IDE based on UNREPL" tar ((:commit . "907b9792467139a942ba7b07ca0276b90770baf9") (:keywords "languages" "clojure") (:authors ("Daniel Barreto" . "daniel@barreto.tech")) (:maintainer "Daniel Barreto" . "daniel@barreto.tech") (:url . "https://github.com/Unrepl/spiral"))])
- (splitjoin . [(20150505 1432) ((cl-lib (0 5))) "Transition between multiline and single-line code" single ((:commit . "e2945ee269e6e90f0243d6f2a33e067bb0a2873c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-splitjoin"))])
- (splitter . [(20170809 2208) nil "Manage window splits" single ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:keywords "frames" "convenience") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:url . "https://github.com/chumpage/chumpy-windows"))])
- (spotify . [(20200615 1418) ((cl-lib (0 5))) "Control the spotify application from emacs" single ((:commit . "7e28ef0b4519c6a46fce6a89c0ff1ed775eda71a") (:keywords "convenience") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:url . "https://github.com/remvee/spotify-el"))])
- (spotlight . [(20200109 2137) ((emacs (24 1)) (swiper (0 6 0)) (counsel (0 6 0))) "search files with Mac OS X spotlight" single ((:commit . "ea71f4fd380c51e50c47bb25855af4f40e4d8da0") (:keywords "search" "external") (:authors ("Ben Maughan" . "benmaughan@gmail.com")) (:maintainer "Ben Maughan" . "benmaughan@gmail.com") (:url . "http://www.pragmaticemacs.com"))])
- (spray . [(20160304 2220) nil "a speed reading mode" single ((:commit . "00638bc916227f2f961013543d10e85a43a32e29") (:keywords "convenience") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:url . "https://github.com/ian-kelling/spray"))])
- (springboard . [(20170106 755) ((helm (1 6 9))) "Temporarily change default-directory for one command" single ((:commit . "687d1e5898a880878995dc9bffe93b4598366203") (:keywords "helm") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:url . "https://github.com/jwiegley/springboard"))])
- (sprintly-mode . [(20121006 534) ((furl (0 0 2))) "Major mode for dealing with sprint.ly" single ((:commit . "6695892bae5860b5268bf3ae62be990ee9b63c11") (:authors ("Justin Lilly" . "justin@justinlilly.com")) (:maintainer "Justin Lilly" . "justin@justinlilly.com") (:url . "https://github.com/sprintly/sprintly-mode"))])
- (sproto-mode . [(20151115 1805) nil "Major mode for editing sproto." single ((:commit . "0583a88273204dccd884b7edaa3590cefd31e7f7") (:keywords "sproto") (:authors ("m2q1n9")) (:maintainer "m2q1n9"))])
- (sprunge . [(20160301 243) ((request (0 2 0)) (cl-lib (0 5))) "Upload pastes to sprunge.us" single ((:commit . "0fd386b8b29c4175022a04ad70ea5643185b6726") (:keywords "tools") (:authors ("Tom Jakubowski")) (:maintainer "Tom Jakubowski"))])
- (spu . [(20161214 324) ((emacs (24 4)) (signal (1 0)) (timp (1 2 0))) "Silently upgrade package in the background" tar ((:commit . "41eec86b595816e3852e8ad1a8e07e51a27fd065") (:keywords "convenience" "package") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:url . "https://github.com/mola-T/spu"))])
- (sql-clickhouse . [(20191209 1443) ((emacs (24))) "support ClickHouse as SQL interpreter" single ((:commit . "8403a4a5d332dbb6459b7fbce6ea95c36d390a5b") (:authors ("Robert Schwarz" . "mail@rschwarz.net")) (:maintainer "Robert Schwarz" . "mail@rschwarz.net") (:url . "https://github.com/leethargo/sql-clickhouse"))])
- (sql-impala . [(20181218 410) nil "comint support for Cloudera Impala" single ((:commit . "466e7c0c789ec3e5e8a276c8f6754f91bb584c3e") (:keywords "sql" "impala") (:authors ("Jason Terk" . "jason@goterkyourself.com")) (:maintainer "Jason Terk" . "jason@goterkyourself.com") (:url . "https://github.com/jterk/sql-impala"))])
- (sql-presto . [(20190113 1742) nil "No description available." single ((:commit . "bcda455e300a1af75c7bb805882329bc844703b2"))])
- (sql-sqlline . [(20191028 939) ((emacs (24 4))) "Adds SQLLine support to SQLi mode" single ((:commit . "990c79b7ebbf8ecb1e1161c9a942973efd8e2833") (:keywords "languages") (:authors ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainer "Matteo Redaelli" . "matteo.redaelli@gmail.com") (:url . "https://gitlab.com/matteo.redaelli/sql-sqlline"))])
- (sqlformat . [(20200327 2329) ((emacs (24 3)) (reformatter (0 3))) "Reformat SQL using sqlformat or pgformatter" single ((:commit . "2f10382034cd5cd2356cc69b4a1e9116d77a0d86") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/sqlformat"))])
- (sqlite . [(20180708 1711) nil "use sqlite via elisp" single ((:commit . "dad42b8bbca4994be1871343dd18fd6528ee5797") (:authors ("Christian Giménez")) (:maintainer "Christian Giménez"))])
- (sqlite3 . [(20200710 1432) ((emacs (25 1))) "Direct access to the core SQLite3 API" tar ((:commit . "e5b14b03183cde855059084eba425428ec4618c1") (:keywords "comm" "data" "sql") (:authors ("Y. N. Lo" . "gordonynlo@yahoo.com")) (:maintainer "Y. N. Lo" . "gordonynlo@yahoo.com") (:url . "https://github.com/pekingduck/emacs-sqlite3-api"))])
- (sqlup-mode . [(20170610 1537) nil "Upcase SQL words for you" single ((:commit . "3f9df9c88d6a7f9b1ae907e401cad8d3d7d63bbf") (:keywords "sql" "tools" "redis" "upcase") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:url . "https://github.com/trevoke/sqlup-mode.el"))])
- (sr-speedbar . [(20161025 831) nil "Same frame speedbar" single ((:commit . "77a83fb50f763a465c021eca7343243f465b4a47") (:keywords "speedbar" "sr-speedbar.el") (:authors ("Sebastian Rose" . "sebastian_rose@gmx.de")) (:maintainer "Sebastian Rose" . "sebastian_rose@gmx.de") (:url . "http://www.emacswiki.org/emacs/download/sr-speedbar.el"))])
- (srcery-theme . [(20200520 1119) ((emacs (24))) "Dark color theme." single ((:commit . "1c1001c7606aa146789c5d97e292e9b71720fe51") (:keywords "faces") (:authors ("Daniel Berg")) (:maintainer "Daniel Berg") (:url . "https://github.com/srcery-colors/srcery-emacs"))])
- (srefactor . [(20180703 1810) ((emacs (24 4))) "A refactoring tool based on Semantic parser framework" tar ((:commit . "6f2c97d17fb70f4ca2112f5a2b99a8ec162004f5") (:keywords "c" "languages" "tools") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:url . "https://github.com/tuhdo/semantic-refactor"))])
- (srfi . [(20200731 536) ((emacs (25 1))) "Scheme Requests for Implementation browser" tar ((:commit . "17cd3e3e6878c1b9f879a00eee937cc3d05c20a8") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/srfi-explorations/emacs-srfi"))])
- (srv . [(20180715 1959) ((emacs (24 3))) "perform SRV DNS requests" single ((:commit . "714387d5a5cf34d8d8cd96bdb1f9cb8ded823ff7") (:keywords "comm") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:url . "https://github.com/legoscia/srv.el"))])
- (ssass-mode . [(20200211 132) ((emacs (24 3))) "Edit Sass without a Turing Machine" single ((:commit . "96f557887ad97a0066a60c54f92b7234b8407016") (:keywords "languages" "sass") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:url . "http://github.com/AdamNiederer/ssass-mode"))])
- (ssh . [(20120904 2042) nil "Support for remote logins using ssh." single ((:commit . "812e27409d01c38d74906a1816640506d6e7e3ef") (:keywords "unix" "comm") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com"))])
- (ssh-agency . [(20200329 1558) ((emacs (24 4)) (dash (2 10 0))) "manage ssh-agent from Emacs" single ((:commit . "a5377e4317365a3d5442e06d5c255d4a7c7618db") (:authors ("Noam Postavsky" . "npostavs@user.sourceforge.net")) (:maintainer "Noam Postavsky" . "npostavs@user.sourceforge.net") (:url . "https://github.com/magit/ssh-agency"))])
- (ssh-config-mode . [(20200503 2042) nil "Mode for fontification of ~/.ssh/config" tar ((:commit . "8fda737131fef2e55c4965a938cf907acbf03372") (:keywords "ssh" "config" "emacs") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Harley Gorrell" . "harley@panix.com") (:url . "https://github.com/jhgorrell/ssh-config-mode-el"))])
- (ssh-deploy . [(20200306 1012) ((emacs (25))) "Deployment via Tramp, global or per directory." tar ((:commit . "1bb2f821d4a78d483c147759348a29531486cdc4") (:keywords "tools" "convenience") (:authors ("Christian Johansson" . "christian@cvj.se")) (:maintainer "Christian Johansson" . "christian@cvj.se") (:url . "https://github.com/cjohansson/emacs-ssh-deploy"))])
- (ssh-tunnels . [(20190622 931) ((cl-lib (0 5)) (emacs (24))) "Manage SSH tunnels" tar ((:commit . "d32e2072f50bcbde787196abb5862735837dc8be") (:keywords "tools" "convenience") (:authors ("death <github.com/death>")) (:maintainer "death <github.com/death>") (:url . "http://github.com/death/ssh-tunnels"))])
- (stack-mode . [(20150923 1523) ((haskell-mode (13 14)) (cl-lib (0 5)) (flycheck (0 23))) "A minor mode enabling various features based on stack-ide." tar ((:commit . "f3481e239dde9817152ec00e32bfc3ebf5aaf2cb") (:keywords "haskell" "stack") (:url . "https://github.com/commercialhaskell/stack-ide"))])
- (stan-mode . [(20200221 2025) ((emacs (24 4))) "Major mode for editing Stan files" tar ((:commit . "e891a0fcb3a7ab7d9cedbe3deda560134636897e") (:keywords "languages" "c") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Daniel Lee" . "bearlee@alum.mit.edu") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-mode"))])
- (stan-snippets . [(20200221 2025) ((emacs (24 3)) (stan-mode (10 1 0)) (yasnippet (0 8 0))) "Yasnippets for Stan" tar ((:commit . "e891a0fcb3a7ab7d9cedbe3deda560134636897e") (:keywords "languages" "tools") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-snippets"))])
- (standard-dirs . [(20200621 1603) ((emacs (26 1)) (f (0 20 0)) (s (1 7 0))) "Platform-specific paths for config, cache, and other data" single ((:commit . "e37b7e1c714c7798cd8e3a6569e4d71b96718a60") (:keywords "files") (:authors ("Joseph M LaFreniere" . "joseph@lafreniere.xyz")) (:maintainer "Joseph M LaFreniere" . "joseph@lafreniere.xyz") (:url . "https://github.com/lafrenierejm/standard-dirs.el"))])
- (standoff-mode . [(20171115 1731) nil "Create stand-off markup, also called external markup." tar ((:commit . "cf84b14066d63694d931395c6026fd0245d8a62b"))])
- (start-menu . [(20160426 1225) ((cl-lib (0 5)) (config-parser (0 1))) "start-menu for executing external program like in windows" single ((:commit . "f7d33fed7ad2dc61156f1c1cff9e1805366fbd69") (:keywords "convenience" "menu") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/el-start-menu"))])
- (stash . [(20151117 1427) nil "lightweight persistent caching" single ((:commit . "c2e494d20c752b80ebbdffbf66687b3cdfc425ad") (:keywords "extensions" "data" "internal" "lisp") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:url . "https://www.github.com/vermiculus/stash.el/"))])
- (state . [(20200727 1227) ((emacs (24))) "Quick navigation between workspaces" single ((:commit . "8cd9210f17c1b134274a7352b996839aed9a7d8c") (:keywords "convenience" "workspaces") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "https://github.com/thisirs/state.git"))])
- (status . [(20151230 1408) nil "This package adds support for status icons to Emacs." tar ((:commit . "b62c74bf272566f82a68622f29fb9edafea0f241"))])
- (steam . [(20190916 627) ((cl-lib (0 5))) "Organize and launch Steam games" single ((:commit . "f32951f4e0a4bc92813d0121d9df0257101b8992") (:keywords "games") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:url . "http://github.com/Kungsgeten/steam.el"))])
- (stem . [(20131102 1109) nil "Routines for stemming" single ((:commit . "d74e6611d6ba5025e0276a2cc7c8a90f46bfa9ac") (:keywords "stemming") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainer "Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp") (:url . "https://github.com/yuutayamada/stem"))])
- (stem-english . [(20180109 358) ((emacs (24 3))) "- routines for stemming English word" single ((:commit . "c9fc4c6ed6bf82382e479dae80912f4ae17d31f4") (:keywords "text") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "http://github.com/kawabata/stem-english"))])
- (stgit . [(20200606 1308) nil "major mode for StGit interaction" single ((:commit . "c3b5e179dd382218f94f457ef4af09951f973249") (:authors ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainer "David Kågedal" . "davidk@lysator.liu.se") (:url . "http://stacked-git.github.io"))])
- (sticky . [(20170926 36) nil "Sticky key for capital letters" single ((:commit . "fec4e1af38f17f5cd80eca361d8e8ef8772db366") (:keywords "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sticky.el"))])
- (stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" single ((:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:keywords "c" "languages" "tools") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance"))])
- (stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" single ((:commit . "f2e564142c9de84232839a5b01979cf95b04d6a9") (:keywords "comms") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:url . "https://github.com/hagleitn/stock-ticker"))])
- (stock-tracker . [(20200228 542) ((emacs (26)) (dash (2 16 0))) "Track stock price" single ((:commit . "32ae436a4cad49fea5038cc3e8eb638a3a83dd6c") (:keywords "convenience" "chinese" "stock") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:url . "https://github.com/beacoder/stock-tracker"))])
- (strace-mode . [(20171116 2039) nil "strace output syntax highlighting" single ((:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:keywords "languages") (:authors ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainer "Preston Moore" . "prestonkmoore@gmail.com"))])
- (strie . [(20160211 2222) ((cl-lib (0 5))) "A simple trie data structure implementation" single ((:commit . "eb7efb0cccc127c414f6a64db11454869d9c10a8") (:authors ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainer "James Atwood" . "jatwood@cs.umass.edu"))])
- (string-edit . [(20160411 656) ((dash (1 2 0))) "Avoid escape nightmares by editing string in separate buffer" single ((:commit . "c44b65b4c5e9f52be9c14d88ca2f402a18d9e1dd") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (string-inflection . [(20200517 115) nil "underscore -> UPCASE -> CamelCase -> lowerCamelCase conversion of names" single ((:commit . "1937db7513db570606ea8798916180b7dd75d3b1") (:keywords "elisp") (:authors ("akicho8" . "akicho8@gmail.com")) (:maintainer "akicho8" . "akicho8@gmail.com"))])
- (string-utils . [(20140508 2041) ((list-utils (0 4 2))) "String-manipulation utilities" single ((:commit . "c2232d691617973ecf12a970c6008a161c21da14") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/string-utils"))])
- (stripe-buffer . [(20141208 1508) ((cl-lib (1 0))) "Use a different background for even and odd lines" single ((:commit . "c252080f55cb78c951b19ebab9687f6d00237baf") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "sabof" . "esabof@gmail.com") (:url . "https://github.com/sabof/stripe-buffer"))])
- (stripes . [(20200330 2022) ((emacs (24))) "highlight alternating lines differently" single ((:commit . "7b1d501f44b697a0514ef6759fd126d65867f18d") (:keywords "convenience" "faces") (:authors ("Michael Schierl" . "schierlm-public@gmx.de") ("Štěpán Němec" . "stepnem@gmail.com")) (:maintainer "Štěpán Němec" . "stepnem@gmail.com") (:url . "https://gitlab.com/stepnem/stripes-el"))])
- (stumpwm-mode . [(20140131 216) nil "special lisp mode for evaluating code into running stumpwm" single ((:commit . "61a7cf27e49e0779a53c018b2342f5f1c5cc70b4") (:keywords "comm" "lisp" "tools") (:maintainer "Shawn Betts"))])
- (stupid-indent-mode . [(20170525 1117) nil "Plain stupid indentation minor mode" single ((:commit . "3295e7de5e2cfddc3bf0e462e852bf58972f5d70") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com"))])
- (stylefmt . [(20161025 824) nil "Stylefmt interface" single ((:commit . "7a38f26bf8ff947215f34f0a064c7ca80575ccbc") (:keywords "style" "code" "formatter") (:authors ("κeen")) (:maintainer "κeen") (:url . "https://github.com/KeenS/stylefmt.el"))])
- (stylus-mode . [(20150313 1512) ((sws-mode (0))) "Major mode for editing .jade files" single ((:commit . "4dbde92542fc7ad61df38776980905a4721d642e") (:authors ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:url . "https://github.com/brianc/jade-mode"))])
- (subatomic-theme . [(20190607 1022) nil "Low contrast bluish color theme" single ((:commit . "a13cdac97a6d0488b13bc36d4c2f4d4102ff6a31") (:keywords "color-theme" "blue" "low contrast") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:url . "https://github.com/cryon/subatomic"))])
- (subatomic256-theme . [(20130621 210) nil "Fork of subatomic-theme for terminals." single ((:commit . "326177d6f99cd2b1d30df695e67ee3bc441cd96f") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:url . "https://github.com/cryon/subatomic256"))])
- (subemacs . [(20170401 934) nil "Evaluating expressions in a fresh Emacs subprocess" single ((:commit . "18d53939fec8968c08dfc5aff7240ca07efb1aac") (:keywords "extensions" "lisp" "multiprocessing") (:authors ("Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com")) (:maintainer "Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com") (:url . "https://github.com/kbauer/subemacs"))])
- (sublime-themes . [(20170606 1844) nil "A collection of themes based on Sublime Text" tar ((:commit . "60ee40af82eb55b79d5ed4026f1911326311603f") (:keywords "faces") (:authors ("Owain Lewis" . "owain@owainlewis.com")) (:maintainer "Owain Lewis" . "owain@owainlewis.com"))])
- (sublimity . [(20200711 918) ((cl-lib (0 3))) "smooth-scrolling, minimap and distraction-free mode" tar ((:commit . "c56f9d41847ca18156415981854ee1ed1affad08") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "https://github.com/zk-phi/sublimity"))])
- (sudden-death . [(20180217 23) nil "Totsuzen-no-Shi" single ((:commit . "791a63d3f4df192e71f4232a9a4c5588f4b43dfb") (:authors ("yewton")) (:maintainer "yewton") (:url . "https://github.com/yewton/sudden-death.el"))])
- (sudo-edit . [(20200625 142) ((emacs (24)) (cl-lib (0 5))) "Open files as another user" single ((:commit . "0e2c32b5e5242d30f8780cbe8e1b1649476cac4d") (:keywords "convenience") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "https://github.com/nflath/sudo-edit"))])
- (sudo-ext . [(20170126 1214) nil "sudo support" single ((:commit . "9d4580f304121ce7b8104bd4bd3b64e4dfa3c9b3") (:keywords "unix") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sudo-ext.el"))])
- (sudoku . [(20191015 1315) ((emacs (24 4))) "Simple sudoku game, can download puzzles" single ((:commit . "b1924fd244a5fa284de9d67b66fbd69164b37318") (:keywords "games") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru"))])
- (suggest . [(20180916 1859) ((emacs (24 4)) (loop (1 3)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2)) (spinner (1 7 3))) "suggest elisp functions that give the output requested" tar ((:commit . "83a2679baf661ee834e9e75921fd546243a6d919") (:keywords "convenience") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/suggest.el"))])
- (suggestion-box . [(20170830 807) ((emacs (25 1)) (popup (0 5 3))) "show tooltip on the cursor" single ((:commit . "50af0776c8caf3c79c4d37fd51cbf304ea34b68e") (:keywords "convenience") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>"))])
- (sunburn-theme . [(20180602 1929) ((emacs (24))) "A low contrast color theme" single ((:commit . "ddb01b6f1f4f823398f7f8e08900c2b4a7811d3b") (:authors ("Martín Varela" . "martin@varela.fi")) (:maintainer "Martín Varela" . "martin@varela.fi") (:url . "http://github.com/mvarela/Sunburn-Theme"))])
- (sunny-day-theme . [(20140413 2125) nil "Emacs24 theme with a light background." single ((:commit . "420e0a6eb33fcc9b75c2c9e88ab60a975d782a00") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/sunny-day-theme"))])
- (sunshine . [(20200306 1711) ((cl-lib (0 5))) "Provide weather and forecast information." single ((:commit . "88256223539edcfe57017778a997a474c9c022f6") (:keywords "tools" "weather") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:url . "https://github.com/aaronbieber/sunshine.el"))])
- (suomalainen-kalenteri . [(20190310 910) nil "Finnish national and Christian holidays for calendar" tar ((:commit . "c8c03fe9bae57d4e15c287aef4f98911a3529240"))])
- (super-save . [(20190806 915) ((emacs (24 4))) "Auto-save buffers, based on your activity." single ((:commit . "279aa8e0103d6bd367619b7f57f9d60d7a3c5cfd") (:keywords "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "https://github.com/bbatsov/super-save"))])
- (supergenpass . [(20130329 548) nil "SuperGenPass for Emacs" single ((:commit . "549072ef7b5b82913cadd4758e8a0a9926f0a04a") (:keywords "supergenpass") (:authors ("Jaime Fournier" . "jaimef@linbsd.org")) (:maintainer "Jaime Fournier" . "jaimef@linbsd.org"))])
- (suscolors-theme . [(20190713 1009) nil "Colorful theme, inspired by Gruvbox." single ((:commit . "b4a979ee23e26e255b9a63525b0a28e810fab9ae") (:url . "https://github.com/TheSuspiciousWombat/SusColors-emacs"))])
- (sv-kalender-namnsdagar . [(20190421 1521) nil "Swedish celebrated name of the day" single ((:commit . "fff970f49c77abfc69e37817f25a939818420971") (:keywords "calendar" "swedish" "localization") (:authors ("Mats Lidell" . "mats.lidell@lidells.se")) (:maintainer "Mats Lidell" . "mats.lidell@lidells.se") (:url . "https://github.com/matsl/sv-kalender-namnsdagar"))])
- (svelte-mode . [(20200327 406) ((emacs (26 1))) "Emacs major mode for Svelte" single ((:commit . "48a26af6a3395a8bf3f09747d0a205c6dbc79313") (:keywords "wp" "languages") (:authors ("Leaf" . "leafvocation@gmail.com")) (:maintainer "Leaf" . "leafvocation@gmail.com") (:url . "https://github.com/leafOfTree/svelte-mode"))])
- (svg-mode-line-themes . [(20150425 2006) ((xmlgen (0 4))) "SVG-based themes for mode-line" tar ((:commit . "80a0e01839cafbd66899202e7764c33231974259") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/svg-mode-line-themes"))])
- (svnwrapper . [(20180414 1843) ((e2ansi (0 1 1))) "Highlighting and paging for shell command `svn'" tar ((:commit . "de5069f5784e5d9e87a0af0159ba5f28a3716583") (:keywords "faces") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/svnwrapper"))])
- (swagger-to-org . [(20160611 56) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "Convert a swagger.json file into an org-mode file" single ((:commit . "181357c71ea24bede263f5706d8781ad65e16877") (:keywords "ahungry" "emacs" "swagger" "openapi" "orgmode" "org" "export") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:url . "https://github.com/ahungry/swagger-to-org"))])
- (swap-buffers . [(20150506 2139) nil "The quickest way to swap buffers between windows. Based on switch-window package." single ((:commit . "46ab31359b70d935add6c6e9533443116dc51103") (:keywords "window" "swap" "buffer" "exchange") (:authors ("Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com")) (:maintainer "Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com") (:url . "https://github.com/ekazakov/swap-buffers"))])
- (swap-regions . [(20180915 1346) ((emacs (24 3))) "Swap text in two regions" single ((:commit . "f4fd9880cf690e003fcde88dcf2b46adbbbb03cd") (:keywords "convenience") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/swap-regions.el"))])
- (sweet-theme . [(20200708 1202) ((emacs (24 1))) "Sweet-looking theme" single ((:commit . "529e857c405229ea8cc89b42fd9d8d0cee1b314c") (:keywords "faces") (:authors ("2bruh4me")) (:maintainer "2bruh4me") (:url . "https://github.com/2bruh4me/sweet-theme"))])
- (sweetgreen . [(20180605 335) ((dash (2 12 1)) (helm (1 5 6)) (request (0 2 0)) (cl-lib (0 5))) "Order Salads from sweetgreen.com" single ((:commit . "e933fe466b5ef0e976967e203f88bd7a012469d1") (:keywords "salad" "food" "sweetgreen" "request") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "https://www.github.com/CestDiego/sweetgreen.el"))])
- (swift-helpful . [(20200701 2005) ((emacs (25 1)) (dash (2 12 0)) (lsp-mode (6 0)) (swift-mode (8 0 0))) "Show documentation for Swift programs." tar ((:commit . "72330e900650e211495c7093828abd0265020909") (:keywords "help" "swift") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:url . "https://github.com/danielmartin/swift-helpful"))])
- (swift-mode . [(20200606 730) ((emacs (24 4)) (seq (2 3))) "Major-mode for Apple's Swift programming language." tar ((:commit . "d266fbd300a1bf1592e1462ead4be093b8b68f98") (:keywords "languages" "swift") (:url . "https://github.com/swift-emacs/swift-mode"))])
- (swift-playground-mode . [(20190730 1707) ((emacs (24 4)) (seq (2 2 0))) "Run Apple's playgrounds in Swift buffers" tar ((:commit . "111cde906508824ee11d774b908df867142a8aec") (:keywords "languages" "swift") (:url . "https://gitlab.com/michael.sanders/swift-playground-mode"))])
- (swift3-mode . [(20160918 1250) ((emacs (24 4))) "Major-mode for Apple's Swift programming language." tar ((:commit . "4e51265c6905e17d8910e35b0b37cf51e20ecdfe") (:keywords "languages" "swift") (:url . "https://github.com/taku0/swift3-mode"))])
- (swiper . [(20200503 1102) ((emacs (24 5)) (ivy (0 13 0))) "Isearch with an overview. Oh, man!" single ((:commit . "c6b60d34ac37bf4d91a25f16d22e528f85e06938") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/swiper"))])
- (swiper-helm . [(20180131 1744) ((emacs (24 1)) (swiper (0 1 0)) (helm (1 5 3))) "Helm version of Swiper." single ((:commit . "93fb6db87bc6a5967898b5fd3286954cc72a0008") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/swiper-helm"))])
- (swiss-holidays . [(20200526 822) nil "Swiss holidays for the calendar" single ((:commit . "0995c9685033a09466f5b2dceb7316362bde997a") (:keywords "calendar") (:authors ("Christian Egli" . "christian.egli@alumni.ethz.ch")) (:maintainer "Christian Egli" . "christian.egli@alumni.ethz.ch") (:url . "https://github.com/egli/swiss-holidays"))])
- (switch-buffer-functions . [(20200127 409) nil "Hook run when current buffer changed" single ((:commit . "95a846baa93bac4c3b3c028b9d53507f1042b23a") (:keywords "hook" "utility") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/switch-buffer-functions-el"))])
- (switch-window . [(20200502 511) ((emacs (24))) "A *visual* way to switch window" tar ((:commit . "8710f6304d843365fb59b6efe7e1f729d14e557c") (:keywords "convenience") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "https://github.com/dimitri/switch-window"))])
- (swoop . [(20200618 905) ((emacs (24 3)) (ht (2 0)) (pcre2el (1 5)) (async (1 1))) "Peculiar buffer navigation" tar ((:commit . "828ae0f17f3beaea50ee66d06c500f4847ccc7dd") (:keywords "tools" "swoop" "inner" "buffer" "search" "navigation") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:url . "https://github.com/ShingoFukuyama/emacs-swoop"))])
- (sws-mode . [(20150317 1945) nil "(S)ignificant (W)hite(S)pace mode" single ((:commit . "4dbde92542fc7ad61df38776980905a4721d642e") (:authors ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:url . "https://github.com/brianc/jade-mode"))])
- (sx . [(20191229 1746) ((emacs (24 1)) (cl-lib (0 5)) (json (1 3)) (markdown-mode (2 0)) (let-alist (1 0 3))) "StackExchange client. Ask and answer questions on Stack Overflow, Super User, and the likes" tar ((:commit . "e9d1093c97507a6d7b4f4710ef65200dae725e5f") (:keywords "help" "hypermedia" "tools") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:url . "https://github.com/vermiculus/sx.el/"))])
- (sxiv . [(20200508 1620) ((dash (2 16 0)) (emacs (25 1))) "Run the sxiv image viewer" single ((:commit . "f1a030c538af6d47d32eef04ab6536eeef948268") (:keywords "multimedia") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr") (:url . "https://gitlab.com/contrapunctus/sxiv.el"))])
- (symbol-navigation-hydra . [(20200728 704) ((auto-highlight-symbol (1 53)) (hydra (0 15 0)) (emacs (24 4)) (multiple-cursors (1 4 0)) (grep (22 1))) "A symbol-aware, range-aware hydra" single ((:commit . "0a3dadbb55a0a969ee1f1f38c349b37e24ec2931") (:keywords "highlight" "face" "match" "convenience" "hydra" "symbol") (:authors ("Brett Wines" . "bgwines@cs.stanford.edu")) (:maintainer "Brett Wines" . "bgwines@cs.stanford.edu") (:url . "https://github.com/bgwines/symbol-navigation-hydra"))])
- (symbol-overlay . [(20191224 250) ((emacs (24 3)) (seq (2 2))) "Highlight symbols with keymap-enabled overlays" single ((:commit . "4528aa0e625cde12ab15ef953421b68289f342af") (:keywords "faces" "matching") (:authors ("wolray" . "wolray@foxmail.com")) (:maintainer "wolray" . "wolray@foxmail.com") (:url . "https://github.com/wolray/symbol-overlay/"))])
- (symbolword-mode . [(20180401 1427) ((emacs (24)) (f (0 19 0))) "modify word split" single ((:commit . "cd344b6c2cb6a8fcf061af2c85441644a4e7a006") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/symbolword-mode"))])
- (symex . [(20200526 211) ((emacs (24 4)) (cl-lib (0 6 1)) (lispy (0 26 0)) (paredit (24)) (evil-cleverparens (20170718 413)) (dash-functional (2 15 0)) (evil (1 2 14)) (smartparens (1 11 0)) (racket-mode (20181030 1345)) (geiser (0 10)) (evil-surround (1 0 4)) (hydra (0 15 0)) (cider (0 21 0)) (slime (2 24))) "An evil way to edit Lisp symbolic expressions as trees" tar ((:commit . "b35e3622601ca5b27bb8e1b7ab301cc6dd674a62") (:keywords "lisp" "evil") (:authors ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Siddhartha Kasivajhula" . "sid@countvajhula.com") (:url . "https://github.com/countvajhula/symex.el"))])
- (symon . [(20170224 833) nil "tiny graphical system monitor" single ((:commit . "8dd8b6df49b03cd7d31b85aedbe9dd08fb922335") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (symon-lingr . [(20150719 1342) ((symon (1 1 2)) (cl-lib (0 5))) "A notification-based Lingr client powered by symon.el" single ((:commit . "056d1a473e36992ff5881e5ce6fdc331cead975f") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (sync-recentf . [(20160326 2001) nil "Synchronize the recent files list between Emacs instances" single ((:commit . "0052561d5c5b5c2684faedc3eead776aec06c3ed") (:keywords "recentf") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/sync-recentf"))])
- (synonymous . [(20180325 1817) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "A thesaurus at your fingertips" single ((:commit . "2cb9a674d84fddf3f1b00c9d6b13a853576acb87") (:keywords "utility") (:authors ("Katherine Whitlock" . "toroidalcode@gmail.com") ("Snippets adapted from FlySpell, authored by Manuel Serrano" . "Manuel.Serrano@inria.fr")) (:maintainer "Katherine Whitlock" . "toroidalcode@gmail.com") (:url . "http://github.com/toroidal-code/synonymous.el"))])
- (synosaurus . [(20191125 552) ((cl-lib (0 5))) "An extensible thesaurus supporting lookup and substitution." tar ((:commit . "14d34fc92a77c3a916b4d58400424c44ae99cd81") (:url . "https://github.com/hpdeifel/synosaurus"))])
- (synquid . [(20160930 1550) ((flycheck (27)) (emacs (24 3))) "Major mode for editing Synquid files" single ((:commit . "28701ce1a15437202f53ab93a14bcba1de83fd2c") (:keywords "languages") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:url . "https://github.com/cpitclaudel/synquid-mode"))])
- (syntactic-close . [(20200408 1148) ((emacs (24)) (cl-lib (0 5))) "Insert closing delimiter" single ((:commit . "c21ffdf6a2f8c2a83d3efc729852cd2b09fe03a6") (:keywords "languages" "convenience") (:authors ("Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org")) (:maintainer "Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org") (:url . "https://github.com/emacs-berlin/syntactic-close"))])
- (syntactic-sugar . [(20140508 2041) nil "Effect-free forms such as if/then/else" single ((:commit . "7ddc4502c831abe1c4ad4c7d1ca628a2c9e13968") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/syntactic-sugar"))])
- (syntax-subword . [(20160519 1905) nil "make operations on words more fine-grained" single ((:commit . "ad0db0fcb464652a1d3408f525dee9293ce2b70c") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))])
- (sysctl . [(20200615 1824) ((emacs (26))) "Manage sysctl though org-mode" single ((:commit . "d8c2e18de1d7a3b2999a4d5054c0bbf30cb10fed") (:keywords "sysctl" "tools" "unix") (:authors ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:url . "https://github.com/dantecatalfamo/sysctl.el"))])
- (syslog-mode . [(20190913 2040) ((hide-lines (20130623)) (ov (20150311))) "Major-mode for viewing log files" single ((:commit . "18f441bf57dd70cdd48a71f1f4566ab35facdb35") (:keywords "unix") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:url . "https://github.com/vapniks/syslog-mode"))])
- (system-packages . [(20200426 1714) ((emacs (24 3))) "functions to manage system packages" single ((:commit . "92c58d98bc7282df9fd6f24436a105f5f518cde9") (:authors ("J. Alexander Branham" . "alex.branham@gmail.com")) (:maintainer "J. Alexander Branham" . "alex.branham@gmail.com") (:url . "https://gitlab.com/jabranham/system-packages"))])
- (system-specific-settings . [(20140818 1457) nil "Apply settings only on certain systems" single ((:commit . "0050d85b2175095aa5ecf580a2fe43c069b0eef3") (:keywords "configuration") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/emacs-system-specific-settings"))])
- (systemd . [(20191219 2304) ((emacs (24 4))) "Major mode for editing systemd units" tar ((:commit . "51c148e09a129ddf33d95276aa0e89d4ef6f8dd2") (:keywords "tools" "unix") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu"))])
- (systemtap-mode . [(20151122 1940) nil "A mode for SystemTap" single ((:commit . "1a968c2b1f3a054bebf91ac49739d3a81ce050a9") (:keywords "tools" "languages") (:maintainer nil . "ruediger@c-plusplus.de") (:url . "https://github.com/ruediger/systemtap-mode"))])
- (ta . [(20160619 1645) ((emacs (24 3)) (cl-lib (0 5))) "A tool to deal with Chinese homophonic characters" single ((:commit . "668ad41e71f374f8c32c8d0532f3d8485b355d35") (:keywords "tools") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:url . "http://github.com/kuanyui/ta.el"))])
- (tab-group . [(20140306 1450) nil "Grouped tabs and their tabbar" single ((:commit . "5a290ec2608e4100fb188fd60ecb77affcc3465b") (:keywords "convenience" "tabs") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:url . "http://github.com/tarao/tab-group-el"))])
- (tab-jump-out . [(20151006 130) ((dash (2 10)) (emacs (24 4))) "Use tab to jump out of delimiter pairs." single ((:commit . "1c3fec1826d2891177ea78e4e7cce1dc67e83e51") (:keywords "tab" "editing") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com"))])
- (tabbar . [(20180726 1735) nil "Display a tab bar in the header line" tar ((:commit . "82bbda31cbe8ef367dd6501c3aa14b7f2c835910") (:keywords "convenience") (:authors ("David Ponce" . "david@dponce.com")) (:maintainer "David Ponce" . "david@dponce.com"))])
- (tabbar-ruler . [(20160802 307) ((tabbar (2 0 1)) (powerline (2 3)) (mode-icons (0 4 0)) (cl-lib (0 5))) "Pretty tabbar, autohide, use both tabbar/ruler" tar ((:commit . "535568189aa12a3eff7f977d2783e57b6a65ab6a") (:keywords "tabbar" "ruler mode" "menu" "tool bar.") (:authors ("Matthew Fidler, Ta Quang Trung, Nathaniel Cunningham")) (:maintainer "Matthew L. Fidler") (:url . "http://github.com/mlf176f2/tabbar-ruler.el"))])
- (tablist . [(20200427 2205) ((emacs (24 3))) "Extended tabulated-list-mode" tar ((:commit . "faab7a035ef2258cc4ea2182f67e3aedab7e2af9") (:keywords "extensions" "lisp") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de"))])
- (tabula-rasa . [(20141216 547) ((emacs (24 4))) "Distraction free writing mode" single ((:commit . "e85fff9de18dc31bc6a7aca726e34a95cc5459f5") (:keywords "distraction free" "writing") (:authors ("Ido Magal" . "misc@satans.church")) (:maintainer "Ido Magal" . "misc@satans.church") (:url . "https://github.com/idomagal/Tabula-Rasa/blob/master/tabula-rasa.el"))])
- (tagedit . [(20161121 855) ((s (1 3 1)) (dash (1 0 3))) "Some paredit-like features for html-mode" single ((:commit . "b3a70101a0dcf85498c92b7fcfa7fdbac869746c") (:keywords "convenience") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (take-off . [(20140531 917) ((emacs (24 3)) (web-server (0 1 0))) "Emacs remote web access" tar ((:commit . "aa9ea45566fc74febbb6ee9c409ecc4b59246215") (:authors ("Thomas Burette" . "burettethomas@gmail.com")) (:maintainer "Thomas Burette" . "burettethomas@gmail.com") (:url . "https://github.com/tburette/take-off"))])
- (tango-2-theme . [(20120312 2025) nil "Tango 2 color theme for GNU Emacs 24" single ((:commit . "64e44c98e41ebbe3b827d54280e3b9615787daaa") (:authors ("Nick Parker")) (:maintainer "Nick Parker"))])
- (tango-plus-theme . [(20200423 804) nil "A color theme based on the tango palette" single ((:commit . "1e9484bb392bb0aad2be159505c502320f8d0a5c") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/tango-plus-theme"))])
- (tangotango-theme . [(20170924 1509) nil "Tango Palette color theme for Emacs 24." single ((:commit . "e2f2ea9c35f06dfc43a29c91c14cf0cdb19f2144") (:keywords "tango" "palette" "color" "theme" "emacs") (:authors ("Julien Barnier")) (:maintainer "Julien Barnier") (:url . "https://github.com/juba/color-theme-tangotango"))])
- (tao-theme . [(20200325 344) nil "This package provides two parametrized uncoloured color themes for Emacs: tao-yin and tao-yang." tar ((:commit . "34917843cde086943816d8a48977658c663a784e"))])
- (taskpaper-mode . [(20200701 1436) nil "Major mode for working with TaskPaper files" single ((:commit . "5ded73ae13d58ab0bbd52ac7556ff29e114a96d6") (:keywords "outlines" "notetaking" "task management" "productivity" "taskpaper") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainer "Dmitry Safronov" . "saf.dmitry@gmail.com") (:url . "https://github.com/saf-dmitry/taskpaper-mode"))])
- (taskrunner . [(20190916 1608) ((emacs (25 1)) (projectile (2 0 0)) (async (1 9 3))) "Retrieve build system/taskrunner tasks" tar ((:commit . "716323aff410b4d864d137c9ebe4bbb5b8587f5e") (:keywords "build-system" "taskrunner" "build" "task-runner" "tasks" "convenience") (:authors ("Yavor Konstantinov <ykonstantinov1 AT gmail DOT com>")) (:maintainer "Yavor Konstantinov <ykonstantinov1 AT gmail DOT com>") (:url . "https://github.com/emacs-taskrunner/emacs-taskrunner"))])
- (tawny-mode . [(20191108 1346) ((cider (0 12)) (emacs (25))) "Ontology Editing with Tawny-OWL" single ((:commit . "8dfb4f92db2d8598ba809636a82d210c378b4845") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))])
- (tblui . [(20161007 1912) ((dash (2 12 1)) (magit-popup (2 6 0)) (tablist (0 70)) (cl-lib (0 5))) "Define tabulated list UI easily" single ((:commit . "bb29323bb3e27093d50cb42db3a9329a096b6e4d") (:authors ("Yuki Inoue <inouetakahiroki _at_ gmail.com>")) (:maintainer "Yuki Inoue <inouetakahiroki _at_ gmail.com>") (:url . "https://github.com/Yuki-Inoue/tblui.el"))])
- (tbx2org . [(20140224 1559) ((dash (2 5 0)) (s (1 8 0)) (cl-lib (0 4))) "Tinderbox to org-mode conversion" single ((:commit . "08e9816ba6066f56936050b58d07ceb2187ae6f7") (:keywords "org-mode") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/tbx2org"))])
- (tc . [(20181109 428) nil "a Japanese input method with T-Code on Emacs" tar ((:commit . "cb3403fb134dc62d8a48253027891785849cff31") (:authors ("Kaoru Maeda" . "maeda@src.ricoh.co.jp") ("Yasushi Saito" . "yasushi@cs.washington.edu") ("KITAJIMA Akira" . "kitajima@isc.osakac.ac.jp")) (:maintainer "KITAJIMA Akira"))])
- (tco . [(20191129 2040) ((dash (1 2 0)) (emacs (24 3))) "Tail-call optimisation for Emacs lisp" single ((:commit . "d82478d56568f60b3a82fd010b3ca0bab2ef5dc9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/tco.el"))])
- (tea-time . [(20120331 820) nil "Simple timer package, useful to make perfect tea." single ((:commit . "1f6cf0bdd27c5eb3508989c5095427781f858eca") (:keywords "timer" "tea-time") (:authors ("konsty" . "antipin.konstantin@googlemail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com"))])
- (teacode-expand . [(20181231 640) ((emacs (24 4))) "Expansion of text by TeaCode program." single ((:commit . "3aae07c71249de616d42fed7fa2585c4fa6f25c6") (:keywords "lisp") (:authors ("Richard Guay" . "raguay@customct.com")) (:maintainer "Richard Guay" . "raguay@customct.com") (:url . "https://github.com/raguay/TeaCode-Expand"))])
- (teco . [(20200707 2309) nil "Teco interpreter" single ((:commit . "2529eb0f7f35c526c1b6fca5250399718ff5138a") (:keywords "convenience" "emulations" "files") (:authors ("Dale R. Worley" . "worley@alum.mit.edu")) (:maintainer "Mark T. Kennedy" . "mtk@acm.org") (:url . "https://github.com/mtk/teco.git"))])
- (telega . [(20200729 1619) ((emacs (26 1)) (visual-fill-column (1 9)) (rainbow-identifiers (0 2 2))) "Telegram client (unofficial)" tar ((:commit . "055d5590a30f625753fa930aae4e2f60191c1b8f") (:keywords "comm") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:url . "https://github.com/zevlg/telega.el"))])
- (telepathy . [(20131209 1258) nil "Access Telepathy from Emacs" single ((:commit . "211d785b02a29ddc254422fdcc3db45262582f8c") (:keywords "telepathy" "tools") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (telephone-line . [(20200516 2102) ((emacs (24 4)) (cl-lib (0 5)) (cl-generic (0 2)) (seq (1 8))) "Rewrite of Powerline" tar ((:commit . "110c578ccf6c0421cfd9eec7aa3e960b6fd49fb4") (:keywords "mode-line") (:authors ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainer "Daniel Bordak" . "dbordak@fastmail.fm") (:url . "https://github.com/dbordak/telephone-line"))])
- (template-overlays . [(20180706 1132) ((emacs (24 4)) (ov (1 0 6))) "Display template regions using overlays" single ((:commit . "d32db58c044b2aca3720879003f55b1d57208b07") (:keywords "faces" "convenience" "templates" "overlays") (:authors ("Mariano Montone" . "marianomontone@gmail.com")) (:maintainer "Mariano Montone" . "marianomontone@gmail.com") (:url . "http://www.github.com/mmontone/template-overlays"))])
- (temporary-persistent . [(20200201 1719) ((emacs (24 3)) (names (20151201 0)) (dash (2 12 1)) (s (1 10 0))) "Keep temp notes buffers persistent" single ((:commit . "0080879b0257d350aeba1c4d6901613d7dc534de") (:keywords "temp" "buffers" "notes") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:url . "https://github.com/kostafey/temporary-persistent"))])
- (ten-hundred-mode . [(20161028 2236) ((cl-lib (0 5))) "use only the ten hundred most usual words" tar ((:commit . "bdcfda49b1819e82d61fe90947e50bb948cf7933"))])
- (term+ . [(20170509 17) ((emacs (24)) (cl-lib (0 5))) "term-mode enhancement" tar ((:commit . "c3c9239b339c127231860de43abfa08c44c0201a") (:keywords "terminal" "emulation") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:url . "https://github.com/tarao/term-plus-el"))])
- (term+key-intercept . [(20140211 750) ((term+ (0 1)) (key-intercept (0 1))) "term+ intercept key mapping" single ((:commit . "fd0771fd66b8c7a909aaac972194485c79ba48c4") (:keywords "terminal" "emulation") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:url . "http://github.com/tarao/term+-el"))])
- (term+mux . [(20140211 749) ((term+ (0 1)) (tab-group (0 1))) "term+ terminal multiplexer and session management" single ((:commit . "81b60e80cf008472bfd7fad9233af2ef722c208a") (:keywords "terminal" "emulation") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:url . "http://github.com/tarao/term+-el"))])
- (term-alert . [(20161119 945) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el." tar ((:commit . "1166c39cc3fb1cb7808eb8955b7f9f6094a306cd"))])
- (term-cmd . [(20160517 1045) ((emacs (24 0)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el." tar ((:commit . "552aa58965aab9b78e46934462bafe54c0396ffb"))])
- (term-manager . [(20190610 2032) ((dash (2 12 0)) (emacs (24 4))) "Contextual terminal management" tar ((:commit . "eea7894350a4f31e1df0c666d3fb0bac822d34d2") (:keywords "terminals" "tools") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://www.github.com/IvanMalison/term-manager"))])
- (term-projectile . [(20190307 400) ((emacs (24)) (term-manager (0 1 0)) (projectile (0 13 0))) "projectile terminal management" single ((:commit . "eea7894350a4f31e1df0c666d3fb0bac822d34d2") (:keywords "projectile" "tools" "terminals" "vc") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://www.github.com/IvanMalison/term-manager"))])
- (term-run . [(20200128 702) nil "Run arbitrary command in terminal buffer" single ((:commit . "0fd135d55fcf864598b1fb8dd880833a1a322910") (:keywords "utility" "shell" "command" "term-mode") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:url . "https://github.com/10sr/term-run-el"))])
- (termbright-theme . [(20151031 235) ((emacs (24 1))) "a more usable theme for white-on-black terminals" single ((:commit . "bec6ab14336c0611e85f45486276004f16d20607") (:keywords "themes") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:url . "https://github.com/bmastenbrook/termbright-theme-el"))])
- (terminal-focus-reporting . [(20180830 719) ((emacs (24 4))) "Minor mode for terminal focus reporting." single ((:commit . "8b84bf18f4c5f1b59a11692eb706f13c3598d9a5") (:keywords "convenience") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:url . "https://github.com/veelenga/terminal-focus-reporting.el"))])
- (terminal-here . [(20200617 714) ((emacs (24 3)) (cl-lib (0 5))) "Run an external terminal in current directory" single ((:commit . "d8b95302abe6e4a8a91a4526441a1c5d51b886a6") (:keywords "tools" "frames") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/terminal-here"))])
- (terminal-toggle . [(20190226 1510) ((emacs (24)) (popwin (1 0 0))) "simple pop-up terminal" single ((:commit . "f824d634aef3600cb7a8e2ddf9e8444c6607c160") (:keywords "outlines") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:url . "https://github.com/mtekman/terminal-toggle.el"))])
- (tern . [(20181108 722) ((json (1 2)) (cl-lib (0 5)) (emacs (24))) "Tern-powered JavaScript integration" single ((:commit . "ef50c6f0269a6fd9ce742d0a87647d60a0ef850f") (:authors ("Marijn Haverbeke")) (:maintainer "Marijn Haverbeke") (:url . "http://ternjs.net/"))])
- (tern-auto-complete . [(20170521 1935) ((tern (0 0 1)) (auto-complete (1 4)) (cl-lib (0 5)) (emacs (24))) "Tern Completion by auto-complete.el" single ((:commit . "ef50c6f0269a6fd9ce742d0a87647d60a0ef850f") (:authors ("<m.sakurai at kiwanami.net>")) (:maintainer "<m.sakurai at kiwanami.net>"))])
- (tern-context-coloring . [(20161218 747) ((emacs (24 3)) (context-coloring (8 1 0)) (tern (0 0 1))) "Use Tern for context coloring" single ((:commit . "3a8e979d6cc83aabcb3dda3f5f31a6422532efba") (:keywords "convenience" "faces" "tools") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") (:url . "https://github.com/jacksonrayhamilton/tern-context-coloring"))])
- (terraform-doc . [(20190813 1254) ((emacs (24 4))) "Look up terraform documentation on the fly" single ((:commit . "2ec10ea7bef5a75edfffeb515dd268e19c1f8c9c") (:keywords "comm") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:url . "https://github.com/TxGVNN/terraform-doc"))])
- (terraform-mode . [(20170112 517) ((emacs (24 3)) (hcl-mode (0 3))) "Major mode for terraform configuration file" single ((:commit . "2967e7bdc05d15617e121052f6e43c61439b9070") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-terraform-mode"))])
- (test-c . [(20180423 1720) ((emacs (24 3))) "quickly test c code" single ((:commit . "761a576f62c7021ba941f178f153c51289df1553") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com") (:url . "http://github.com/aaptel/test-c"))])
- (test-case-mode . [(20130525 1434) ((fringe-helper (0 1 1))) "unit test front-end" single ((:commit . "6074df10ebc97ddfcc228c71c73db179e672dac3") (:keywords "tools") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/test-case-mode/"))])
- (test-kitchen . [(20171129 2035) nil "Run test-kitchen inside of emacs" single ((:commit . "0fc0ca4808425f03fbeb8125246043723e2a179a") (:keywords "chef" "ruby" "test-kitchen") (:authors ("JJ Asghar")) (:maintainer "JJ Asghar") (:url . "http://github.com/jjasghar/test-kitchen-el"))])
- (test-simple . [(20200722 1121) ((cl-lib (0))) "Simple Unit Test Framework for Emacs Lisp" single ((:commit . "ce6de04636e8d19ec84a475c03c0142b20a63de0") (:keywords "unit-test") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/rocky/emacs-test-simple"))])
- (tex-smart-umlauts . [(20190316 2215) nil "Smart umlaut conversion for TeX." single ((:commit . "f15ed781b1fb38bf3e46c481dd602c3999920b99") (:keywords "tex" "wp") (:authors ("Frank Fischer <frank-fischer at shadow-soft.de>")) (:maintainer "Frank Fischer <frank-fischer at shadow-soft.de>") (:url . "http://hub.darcs.net/lyro/tex-smart-umlauts"))])
- (texfrag . [(20200716 1331) ((emacs (25)) (auctex (11 90 2))) "preview LaTeX fragments in alien major modes" single ((:commit . "a5f59e0c5f43578f139a2943bd08e5b3140f4c2b") (:keywords "tex" "languages" "wp") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:url . "https://github.com/TobiasZawada/texfrag"))])
- (textile-mode . [(20170304 1716) nil "Textile markup editing major mode" single ((:commit . "c37aaab809503df008209390e31e19abf4e23630") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org"))])
- (textmate . [(20110816 2146) nil "TextMate minor mode for Emacs" single ((:commit . "350918b070148f0ace6d9d3cd4ebcaf15c1a8781") (:keywords "textmate" "osx" "mac") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org"))])
- (textmate-to-yas . [(20160409 1708) nil "Import Textmate macros into yasnippet syntax" tar ((:commit . "be3a768b7ac4c2e24b9d4aa6e9ac1d916cdc5a73") (:keywords "yasnippet" "textmate") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:url . "https://github.com/mlf176f2/textmate-to-yas.el/"))])
- (textx-mode . [(20170516 911) ((emacs (24 3))) "Major mode for editing TextX files" single ((:commit . "72f9f0c5855b382024f0da8f56833c22a70a5cb3") (:keywords "textx") (:authors ("Novak Boškov" . "gnovak.boskov@gmail.com")) (:maintainer "Novak Boškov" . "gnovak.boskov@gmail.com") (:url . "https://github.com/novakboskov/textx-mode"))])
- (tf2-conf-mode . [(20161209 1620) nil "TF2 Configuration files syntax highlighting" single ((:commit . "536950f64c071ffd8495fb2c7ac7c63a11e25f93") (:keywords "languages") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com") (:url . "https://github.com/wynro/emacs-tf2-conf-mode"))])
- (tfsmacs . [(20180911 2114) ((emacs (25)) (tablist (0 70))) "MS TFS source control interaction." single ((:commit . "3c20cb76ccd7951eda0b5f076cd79e42f71e7220") (:keywords "tfs" "vc") (:authors ("Dino Chiesa <dpchiesa@outlook.com>, Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Dino Chiesa <dpchiesa@outlook.com>, Sebastian Monia" . "smonia@outlook.com") (:url . "http://github.com/sebasmonia/tfsmacs/"))])
- (theme-changer . [(20171221 1927) nil "Sunrise/Sunset Theme Changer for Emacs" single ((:commit . "61945695a30d678e6a5d47cbe7c8aff59a8c30ea") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainer "Joshua B. Griffith" . "josh.griffith@gmail.com") (:url . "https://github.com/hadronzoo/theme-changer"))])
- (theme-looper . [(20200410 1757) ((emacs (24)) (cl-lib (0 5))) "Loop thru the available color-themes" single ((:commit . "eece1cef4483c02402f845d6158b35f6578447c3") (:keywords "convenience" "color-themes") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:url . "http://ismail.teamfluxion.com"))])
- (theme-magic . [(20190711 2034) ((emacs (25)) (seq (1 8))) "Apply your Emacs theme to the rest of Linux" tar ((:commit . "844c4311bd26ebafd4b6a1d72ddcc65d87f074e3") (:keywords "unix" "faces" "terminals" "extensions") (:authors ("GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com")) (:maintainer "GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com") (:url . "https://github.com/jcaw/theme-magic.el"))])
- (therapy . [(20151113 1953) ((emacs (24))) "Hooks for managing multiple Python major versions" single ((:commit . "775a92bb7b6b0fcc5b38c0b5198a9d0a1bef788a") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/therapy"))])
- (thingopt . [(20160520 2318) nil "Thing at Point optional utilities" single ((:commit . "5679815852652479f3b3c9f3a98affc927384b2c") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))])
- (thinks . [(20170802 1128) ((cl-lib (0 5))) "Insert text in a think bubble." single ((:commit . "c02f236abc8c2025d9f01460b09b89ebdc96e28d") (:keywords "convenience" "quoting") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/thinks.el"))])
- (thread-dump . [(20170816 1850) nil "Java thread dump viewer" single ((:commit . "204c9600242756d4b514bb5ff6293e052bf4b49d") (:authors ("Dmitry Neverov")) (:maintainer "Dmitry Neverov") (:url . "http://github.com/nd/thread-dump.el"))])
- (threes . [(20160820 1242) ((emacs (24)) (seq (1 11))) "A clone of Threes (a tiny puzzle game)" single ((:commit . "6981acb30b856c77cba6aba63fefbf102cbdfbb2") (:keywords "games") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/threes.el"))])
- (thrift . [(20200212 1903) ((emacs (24))) "major mode for fbthrift and Apache Thrift files" single ((:commit . "1607c82190843cd0b1531fbe05d1aec334c8605d") (:keywords "languages"))])
- (thumb-through . [(20120119 534) nil "Plain text reader of HTML documents" single ((:commit . "08d8fb720f93c6172653e035191a8fa9c3305e63") (:keywords "html"))])
- (tickscript-mode . [(20171219 203) ((emacs (24 1))) "A major mode for Tickscript files" single ((:commit . "f0579f38ff14954df5002ce30ae6d4a2c978d461") (:keywords "languages") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com") (:url . "https://github.com/msherry/tickscript-mode"))])
- (tidal . [(20200523 833) ((haskell-mode (16)) (emacs (24))) "Interact with TidalCycles for live coding patterns" single ((:commit . "a77a1630738304283fd6583ef1b4227f08947289") (:keywords "tools") (:authors (nil . "alex@slab.org")) (:maintainer nil . "alex@slab.org") (:url . "https://github.com/tidalcycles/Tidal"))])
- (tide . [(20200728 2022) ((dash (2 10 0)) (s (1 11 0)) (flycheck (27)) (typescript-mode (0 1)) (cl-lib (0 5))) "Typescript Interactive Development Environment" tar ((:commit . "c6b86277f1c7d3d04c07d93a6cf49378225da5a2") (:keywords "typescript") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:url . "http://github.com/ananthakumaran/tide"))])
- (tile . [(20161225 357) ((emacs (25 1)) (s (1 9 0)) (dash (2 12 0)) (stream (2 2 3))) "Tile windows with layouts" single ((:commit . "22660f21f6e95de5aba55cd5d293d4841e9a4661") (:keywords "tile" "tiling" "window" "manager" "dynamic" "frames") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:url . "https://github.com/IvanMalison/tile"))])
- (time-ext . [(20170126 1215) nil "more function for time/date" single ((:commit . "d128becf660fe3f30178eb1b05cd266741f4784a") (:keywords "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/time-ext.el"))])
- (timecop . [(20160520 1052) ((cl-lib (0 5)) (datetime-format (0 0 1))) "Freeze Time for testing" single ((:commit . "e6427538b547cbe02e1bd6ed4b765c73620bdae8") (:keywords "datetime" "testing") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/emacs-datetime"))])
- (timer-revert . [(20150122 2032) nil "minor mode to revert buffer for a given time interval." tar ((:commit . "615c91dec8b440d2b9b7c725dd733d7432564e45"))])
- (timesheet . [(20191024 151) ((s (1)) (org (7)) (auctex (11))) "Timesheet management add-on for org-mode" tar ((:commit . "5098dc87d3d4f289b6c1b6532070dacbfe6de9fd") (:keywords "org" "timesheet") (:authors ("Tom Marble")) (:maintainer "Tom Marble") (:url . "https://github.com/tmarble/timesheet.el"))])
- (timonier . [(20170411 800) ((emacs (24 4)) (s (1 11 0)) (f (0 19 0)) (dash (2 12 0)) (pkg-info (0 5 0)) (hydra (0 13 6)) (request (0 2 0)) (all-the-icons (2 0 0))) "Manage Kubernetes Applications" tar ((:commit . "0a150ea87bf695b43cf1740dfd7e553e0ae7601c") (:keywords "kubernetes" "docker") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/timonier"))])
- (timp . [(20160618 803) ((emacs (24 4)) (cl-lib (0 5)) (fifo-class (1 0)) (signal (1 0))) "Multithreading library" tar ((:commit . "66b21934b1eb8ee428c06dd64b3562ad44776a35") (:keywords "internal" "lisp" "processes" "tools") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:url . "https://github.com/mola-T/timp"))])
- (tinkerer . [(20170906 1224) ((s (1 2 0))) "Elisp wrapper for Tinkerer Blogging Engine." single ((:commit . "e34135555f3748b578c7f8706dfd0c888fb87581") (:keywords "tinkerer" "blog" "wrapper") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org") (:url . "https://github.com/yyr/tinkerer.el"))])
- (tiny . [(20190722 1212) nil "Quickly generate linear ranges in Emacs" single ((:commit . "fd8a6b0b0c564d8242259e20e557ee6041f40908") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/tiny"))])
- (tiny-menu . [(20161213 1235) ((emacs (24 4))) "Display tiny menus." single ((:commit . "05563b94537b6eb22aeddedef2a6e59e3f88d073") (:keywords "menu" "tools") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:url . "https://github.com/aaronbieber/tiny-menu.el"))])
- (tinypng . [(20200306 911) ((emacs (25 1))) "Compress PNG and JPEG with TinyPNG.com API" single ((:commit . "f7632e073ce13ef5ce30ae5584cb482a8bb9ffff") (:keywords "multimedia") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/tinypng.el"))])
- (tinysegmenter . [(20141124 1013) ((cl-lib (0 5))) "Super compact Japanese tokenizer in Javascript ported to emacs lisp" single ((:commit . "872134704bd25c13a4c59552433da4c6881b5230") (:keywords "convenience") (:authors ("lugecy" . "lugecy@gmail.com")) (:maintainer "myuhe") (:url . "https://github.com/myuhe/tinysegmenter.el"))])
- (tj3-mode . [(20180519 1228) nil "major mode for editing TaskJuggler 3 files" single ((:commit . "1d98eb23f1606392f34ef1b80517cfc940fb9950") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io") (:url . "https://github.com/csrhodes/tj3-mode"))])
- (tldr . [(20200330 1025) ((emacs (24 3)) (request (0 3 0))) "tldr client for Emacs" single ((:commit . "269bda7001613c0b70c0662d2a74d200765c1dcb") (:keywords "tools" "docs") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:url . "https://github.com/kuanyui/tldr.el"))])
- (tmmofl . [(20121025 1101) nil "Calls functions dependant on font lock highlighting at point" single ((:commit . "532aa6978e994e2b069ffe37aaf9a0011a07dadc") (:keywords "minor mode" "font lock" "toggling.") (:authors ("Phillip Lord" . "p.lord@hgmp.mrc.ac.uk")) (:maintainer "Phillip Lord" . "p.lord@hgmp.mrc.ac.uk"))])
- (tmux-pane . [(20200730 520) ((names (0 5)) (emacs (24)) (s (0))) "Provide integration between emacs window and tmux pane" single ((:commit . "923524efe8e6e5e0d269de6bb253b45e02d9a663") (:keywords "convenience" "terminals" "tmux" "window" "pane" "navigation" "integration") (:url . "https://github.com/laishulu/emacs-tmux-pane"))])
- (toc-org . [(20190902 1055) nil "add table of contents to org-mode files (formerly, org-toc)" single ((:commit . "5deaec41ed0e5c51715737d7f74c5ae1b3c00387") (:keywords "org-mode" "org-toc" "toc-org" "org" "toc" "table" "of" "contents") (:authors ("Sergei Nosov <sergei.nosov [at] gmail.com>")) (:maintainer "Sergei Nosov <sergei.nosov [at] gmail.com>") (:url . "https://github.com/snosov1/toc-org"))])
- (todoist . [(20200517 1825) ((dash (2 15 0)) (transient (0 1 0)) (org (8 3 5)) (emacs (25 3))) "Extension for interacting and managing todoist tasks" single ((:commit . "b3f003603111b7e31b94c354cf4c83c8208c01c3") (:keywords "todoist" "task" "todo" "comm") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/emacs-todoist"))])
- (todotxt . [(20200530 2337) nil "A major mode for editing todo.txt files" single ((:commit . "b51f7fa1357d2cbc1b72b10d15f8c6f009ce5a46") (:keywords "todo.txt" "todotxt" "todotxt.el") (:authors ("Rick Dillon" . "rpdillon@killring.org")) (:maintainer "Rick Dillon" . "rpdillon@killring.org") (:url . "https://github.com/rpdillon/todotxt.el"))])
- (todotxt-mode . [(20200228 952) nil "Major mode for editing todo.txt files" single ((:commit . "8b616ce1cf3e18a60757450a0acf22996abb9b79") (:keywords "wp" "files") (:authors ("Adolfo Villafiorita" . "adolfo.villafiorita@me.com")) (:maintainer "Adolfo Villafiorita" . "adolfo.villafiorita@me.com"))])
- (togetherly . [(20170426 616) ((cl-lib (0 3))) "allow multiple clients to edit a single buffer online" single ((:commit . "a6491bd5dd84f2aded0cd112ff06ae76ff78dfeb") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (toggle . [(20180316 3) ((cl-lib (0 5))) "quickly open corresponding file (eg test vs impl)." single ((:commit . "fc9ec563430e3beaefc00b26da179f4b4ca9855b") (:keywords "files" "extensions" "convenience") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com"))])
- (toggle-quotes . [(20140710 926) nil "Toggle between single and double quoted string" single ((:commit . "33abc221d6887f0518337851318065cd86c34b03") (:keywords "convenience" "quotes") (:authors ("Jim Tian" . "tianjin.sc@gmail.com")) (:maintainer "Jim Tian" . "tianjin.sc@gmail.com") (:url . "https://github.com/toctan/toggle-quotes.el"))])
- (toggle-test . [(20140723 537) nil "Toggle between source and test files in various programming languages" single ((:commit . "e969321f274903d705995a7d0345a257576ec5ff") (:keywords "tdd" "test" "toggle" "productivity") (:authors ("Raghunandan Rao" . "r.raghunandan@gmail.com")) (:maintainer "Raghunandan Rao" . "r.raghunandan@gmail.com") (:url . "https://github.com/rags/toggle-test"))])
- (toggle-window . [(20141207 1548) nil "toggle current window size between half and full" single ((:commit . "e82c60e543933880402ede11e9423e48a17dde53") (:keywords "hide" "window") (:authors ("Kenny Liu")) (:maintainer "Kenny Liu") (:url . "https://github.com/deadghost/toggle-window"))])
- (tomatinho . [(20180621 1748) nil "Simple and beautiful pomodoro timer" tar ((:commit . "b53354b9b9f496c0388d6a573b06b7d6fc53d0bd") (:keywords "time" "productivity" "pomodoro technique") (:authors ("Konrad Scorciapino" . "scorciapino@gmail.com")) (:maintainer "Konrad Scorciapino" . "scorciapino@gmail.com"))])
- (toml . [(20130903 1255) nil "TOML (Tom's Obvious, Minimal Language) parser" single ((:commit . "9633a6872928e737a2335aae1065768b23d8c3b3") (:keywords "toml" "parser") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:url . "https://github.com/gongo/emacs-toml"))])
- (toml-mode . [(20161107 1800) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing TOML files" single ((:commit . "f6c61817b00f9c4a3cab1bae9c309e0fc45cdd06") (:keywords "data" "toml") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com") (:url . "https://github.com/dryman/toml-mode.el"))])
- (tommyh-theme . [(20131004 2330) nil "A bright, bold-colored theme for emacs" single ((:commit . "46d1c69ee0a1ca7c67b569b891a2f28fed89e7d5") (:authors ("William Glass" . "william.glass@gmail.com")) (:maintainer "William Glass" . "william.glass@gmail.com"))])
- (tongbu . [(20200414 507) ((emacs (25 1)) (web-server (0 1 2))) "A web server to share text or files between two devices" single ((:commit . "6f6e5c5446f0c5735357ab520b249ab97295653e") (:keywords "tools") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/tongbu.el"))])
- (tornado-template-mode . [(20141128 1008) nil "A major mode for editing tornado templates" single ((:commit . "667c0663dbbd279b6c345446b9f2bc50eb52b747") (:authors ("Florian Mounier aka paradoxxxzero")) (:maintainer "Florian Mounier aka paradoxxxzero"))])
- (torus . [(20190325 753) ((emacs (26))) "A buffer groups manager" single ((:commit . "b309da8c2eaee573a2e2572f25a08ce5da9e9990") (:keywords "files" "buffers" "groups" "persistent" "history" "layout" "tabs") (:authors ("Chimay")) (:maintainer "Chimay") (:url . "https://github.com/chimay/torus"))])
- (total-lines . [(20171227 1239) ((emacs (24 3))) "Keep track of a buffer's total number of lines" single ((:commit . "473fa74a5416697ecd938866518bcad423f8fda6") (:keywords "convenience" "mode-line") (:authors ("Hinrik Örn Sigurðsson")) (:maintainer "Hinrik Örn Sigurðsson") (:url . "https://github.com/hinrik/total-lines"))])
- (totd . [(20150519 1440) ((s (1 9 0)) (cl-lib (0 5))) "Display a random daily emacs command." single ((:commit . "ca47b618ea8290776cdb5b0f1c2c335691f69660") (:keywords "help") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org"))])
- (tox . [(20160810 1555) nil "Launch current python test with tox" single ((:commit . "7655eb254038d5e34433e8a9d66b3ffc9c72e40c") (:keywords "convenience" "tox" "python" "tests") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:url . "https://github.com/chmouel/tox.el"))])
- (toxi-theme . [(20160424 2126) ((emacs (24))) "A dark color theme by toxi" single ((:commit . "90c8828b91025adf5adc96011a35d25682991b8a") (:authors ("Karsten Schmidt" . "info@postspectacular.com")) (:maintainer "Karsten Schmidt" . "info@postspectacular.com") (:url . "http://bitbucket.org/postspectacular/toxi-theme/"))])
- (tql-mode . [(20170724 254) ((emacs (24))) "TQL mode" single ((:commit . "488add79eb3fc8ec02aedaa997fe1ed9e5c3e638") (:keywords "languages" "tql") (:authors ("Sean McLaughlin" . "seanmcl@gmail.com")) (:maintainer "Sean McLaughlin" . "seanmcl@gmail.com"))])
- (traad . [(20180730 48) ((dash (2 13 0)) (deferred (0 3 2)) (popup (0 5 0)) (request (0 2 0)) (request-deferred (0 2 0)) (virtualenvwrapper (20151123)) (f (0 20 0)) (bind-map (1 1 1))) "emacs interface to the traad refactoring server." single ((:commit . "98e23363b7e8a590a2f55976123a8c3da75c87a5") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/traad"))])
- (tracking . [(20171210 2102) nil "Buffer modification tracking" tar ((:commit . "323a7e5245df4e9eb5c7af053a4c100af68134e7") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/jorgenschaefer/circe/wiki/Tracking"))])
- (tracwiki-mode . [(20150119 1621) ((xml-rpc (1 6 8))) "Emacs Major mode for working with Trac" single ((:commit . "6a620444d59b438f42383b48cd4c19c03105dba6") (:keywords "trac" "wiki" "tickets") (:authors ("Matthew Erickson" . "peawee@peawee.net")) (:maintainer "Matthew Erickson" . "peawee@peawee.net"))])
- (tramp-auto-auth . [(20191027 1419) ((emacs (24 4)) (tramp (0 0))) "TRAMP automatic authentication library" single ((:commit . "f15a12dfab651aff60f4a9d70f868030a12344ac") (:keywords "comm" "processes") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:url . "https://github.com/oitofelix/tramp-auto-auth"))])
- (tramp-hdfs . [(20170821 1320) ((emacs (24 4))) "Tramp extension to access hadoop/hdfs file system in Emacs" single ((:commit . "f8406f77bf83b66306ced693a5e4aaf606f46762") (:keywords "tramp" "emacs" "hdfs" "hadoop" "webhdfs" "rest") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org"))])
- (tramp-term . [(20190628 1207) nil "Automatic setup of directory tracking in ssh sessions." single ((:commit . "fdc3d5a29ca9549db462cd66d8f5d97026a1200f") (:keywords "tramp" "ssh") (:authors ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainer "Randy Morris" . "randy.morris@archlinux.us") (:url . "https://github.com/randymorris/tramp-term.el"))])
- (transfer-sh . [(20200601 1708) ((emacs (24 3)) (async (1 0))) "Simple interface for sending buffer contents to transfer.sh" single ((:commit . "0621a66d00ec91a209a542c10b158095088bd44d") (:keywords "comm" "convenience" "files") (:url . "https://gitlab.com/tuedachu/transfer-sh.el"))])
- (transient . [(20200719 955) ((emacs (25 1))) "Transient commands" tar ((:commit . "4d44d08e90355a8ef36aaad1f9f79c95de1ce0e9") (:keywords "bindings") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/transient"))])
- (transient-dwim . [(20200726 148) ((emacs (26 1)) (transient (0 1))) "Useful preset transient commands" single ((:commit . "ae1fb6d40f4503c096b4c15e30062294f6aac6f7") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:url . "https://github.com/conao3/transient-dwim.el"))])
- (transmission . [(20200620 402) ((emacs (24 4)) (let-alist (1 0 5))) "Interface to a Transmission session" single ((:commit . "7ed254437c1f95ce7f59e87e90d6ec5e4d91c01d") (:keywords "comm" "tools") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu"))])
- (transpose-frame . [(20200307 2119) nil "Transpose windows arrangement in a frame" single ((:commit . "12e523d70ff78cc8868097b56120848befab5dbc") (:keywords "window") (:authors ("S. Irie")) (:maintainer "S. Irie"))])
- (transpose-mark . [(20150405 716) nil "Transpose data using the Emacs mark" single ((:commit . "667327602004794de97214cf336ac61650ef75b7") (:keywords "transpose" "convenience") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com"))])
- (transwin . [(20200704 356) ((emacs (24 3))) "Make window/frame transparent" single ((:commit . "df814cb578b0a4c01ed68f1da262df17d2a0a694") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/transwin"))])
- (trashed . [(20200523 231) ((emacs (25 1))) "Viewing/editing system trash can" single ((:commit . "23e782f78d9adf6b5479a01bfac90b2cfbf729fe") (:keywords "files" "convenience" "unix") (:authors ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainer "Shingo Tanaka" . "shingo.fg8@gmail.com") (:url . "https://github.com/shingo256/trashed"))])
- (travis . [(20150825 1138) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Travis" tar ((:commit . "754ef07c17fed17ab03664ad11e2b0b2ef5e78ed") (:keywords "travis") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/emacs-travis"))])
- (tree-mode . [(20151104 1331) nil "A mode to manage tree widgets" single ((:commit . "b06078826d5875d74b0e7b7ac47b0d0917610534") (:keywords "help" "convenience" "widget") (:authors (nil . "wenbinye@163.com")) (:maintainer nil . "wenbinye@163.com"))])
- (treefactor . [(20200516 1631) ((emacs (26 1)) (dash (2 16 0)) (f (0 20 0)) (org (9 2 6)) (avy (0 5 0))) "Restructure your messy Org documents" single ((:commit . "75357757022a4399ab772ff0d92065bd114dabe9") (:keywords "outlines" "files" "convenience") (:authors ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainer "Leo Littlebook" . "Leo.Littlebook@gmail.com") (:url . "https://github.com/cyberthal/treefactor"))])
- (treemacs . [(20200716 2041) ((emacs (25 2)) (cl-lib (0 5)) (dash (2 11 0)) (s (1 12 0)) (f (0 11 0)) (ace-window (0 9 0)) (pfuture (1 7)) (hydra (0 13 2)) (ht (2 2))) "A tree style file explorer package" tar ((:commit . "644e9402f74dc6100a60fc2b54a2f94ba9bc52e0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))])
- (treemacs-evil . [(20200716 2041) ((emacs (25)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" single ((:commit . "644e9402f74dc6100a60fc2b54a2f94ba9bc52e0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))])
- (treemacs-icons-dired . [(20200530 2129) ((treemacs (0 0)) (emacs (25 2))) "Treemacs icons for dired" single ((:commit . "644e9402f74dc6100a60fc2b54a2f94ba9bc52e0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))])
- (treemacs-magit . [(20200421 1426) ((emacs (25 2)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "644e9402f74dc6100a60fc2b54a2f94ba9bc52e0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))])
- (treemacs-persp . [(20200530 2129) ((emacs (25 2)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" single ((:commit . "644e9402f74dc6100a60fc2b54a2f94ba9bc52e0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))])
- (treemacs-projectile . [(20200530 2129) ((emacs (25 2)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" single ((:commit . "644e9402f74dc6100a60fc2b54a2f94ba9bc52e0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))])
- (treepy . [(20191108 2217) ((emacs (25 1))) "Generic tree traversal tools" single ((:commit . "306f7031d26e4ebfc9ff36614acdc6993f3e23c3") (:keywords "lisp" "maint" "tools") (:authors ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainer "Daniel Barreto" . "daniel.barreto.n@gmail.com") (:url . "https://github.com/volrath/treepy.el"))])
- (trident-mode . [(20190410 2036) ((emacs (24)) (slime (20130526)) (skewer-mode (1 5 0)) (dash (1 0 3))) "Live Parenscript interaction" single ((:commit . "109a1bc10bd0c4b47679a6ca5c4cd27c7c8d4ccb") (:keywords "languages" "lisp" "processes" "tools") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com") (:url . "https://github.com/johnmastro/trident-mode.el"))])
- (trinary . [(20180904 2313) ((emacs (24))) "Trinary logic." single ((:commit . "886232c6d7e92a8e9fe573eef46754ebe321f90d") (:keywords "languages") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/trinary-logic"))])
- (tron-legacy-theme . [(20200601 533) nil "An original retro-futuristic theme inspired by Tron: Legacy" single ((:commit . "af17842821400a6fd466bb2769d13606e98550c0") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/tron-legacy-emacs-theme"))])
- (trr . [(20191019 1403) nil "a type-writing training program on GNU Emacs." tar ((:commit . "f841173e11213ac6916b2d3394b28fb202543871") (:keywords "games" "faces") (:authors ("YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp") ("KATO Kenji" . "kato@suri.co.jp") (" *Original Author") ("INAMURA You" . "inamura@icot.or.jp") (" *Original Author")) (:maintainer "YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp"))])
- (truthy . [(20140508 2041) ((list-utils (0 4 2))) "Test the content of a value" single ((:commit . "8ed8d07772aa8457554547eb17e264b5df2b4a69") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/truthy"))])
- (try . [(20181204 236) ((emacs (24))) "Try out Emacs packages." single ((:commit . "8831ded1784df43a2bd56c25ad3d0650cdb9df1d") (:keywords "packages") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no") (:url . "http://github.com/larstvei/try"))])
- (ts . [(20191010 210) ((emacs (26 1)) (dash (2 14 1)) (s (1 12 0))) "Timestamp and date/time library" single ((:commit . "df48734ef046547c1aa0de0f4c07d11964ef1f7f") (:keywords "date" "time" "timestamp") (:authors (nil . "Adam Porter <adam@alphapapa.net")) (:maintainer nil . "Adam Porter <adam@alphapapa.net") (:url . "http://github.com/alphapapa/ts.el"))])
- (ts-comint . [(20181219 719) nil "Run a Typescript interpreter in an inferior process window." single ((:commit . "786b88fffc553e122868a1c4883f14136a040df6") (:keywords "typescript" "node" "inferior-mode" "convenience") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainer "Paul Huff" . "paul.huff@gmail.com") (:url . "https://github.com/josteink/ts-comint"))])
- (tss . [(20150913 1408) ((auto-complete (1 4 0)) (json-mode (1 1 0)) (log4e (0 2 0)) (yaxception (0 1))) "provide a interface for auto-complete.el/flymake.el on typescript-mode." tar ((:commit . "81ac6351a2ae258fd0ebf916dae9bd5a179fefd0") (:keywords "typescript" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-tss"))])
- (tt-mode . [(20130804 1110) nil "Emacs major mode for editing Template Toolkit files." single ((:commit . "85ed3832e7eef391f7879d9990d59c7a3493c15e") (:authors ("Dave Cross" . "dave@dave.org.uk")) (:maintainer "Dave Cross" . "dave@dave.org.uk"))])
- (ttl-mode . [(20160505 832) nil "mode for Turtle (and Notation 3)" single nil])
- (tuareg . [(20200518 1820) ((caml (3 12 0 1)) (emacs (24 4))) "OCaml mode for Emacs." tar ((:commit . "ccde45bbc292123ec20617f1af7f7e19f7481545") (:keywords "ocaml" "languages") (:authors ("Albert Cohen" . "Albert.Cohen@inria.fr") ("Sam Steingold" . "sds@gnu.org") ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be") ("Till Varoquaux" . "till@pps.jussieu.fr") ("Sean McLaughlin" . "seanmcl@gmail.com") ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainer "Albert Cohen" . "Albert.Cohen@inria.fr") (:url . "https://github.com/ocaml/tuareg"))])
- (tumble . [(20160112 729) ((http-post-simple (0)) (cl-lib (0 5))) "an Tumblr mode for Emacs" single ((:commit . "e8fd7643cccf2b6ea4170f0c5f1f87d007e7fa00") (:keywords "tumblr") (:authors ("Federico Builes" . "federico.builes@gmail.com")) (:maintainer "Federico Builes" . "federico.builes@gmail.com"))])
- (tumblesocks . [(20191014 356) ((htmlize (1 39)) (oauth (1 0 3)) (markdown-mode (1 8 1))) "An Emacs tumblr client." tar ((:commit . "0e4c3847e31a59d405b9927107a23dde9531d744"))])
- (turing-machine . [(20180222 438) ((emacs (24 4))) "Single-tape Turing machine simulator" single ((:commit . "fa60b76a5bac1f54b7a1b3dc55aae7602c7e385b") (:keywords "turing" "machine" "simulation") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:url . "http://github.com/therockmandolinist/turing-machine"))])
- (turkish . [(20170910 1511) nil "Convert to Turkish characters on-the-fly" single ((:commit . "9831a316c176bb21a1b91226323ea4133163e00c") (:keywords "turkish" "languages" "automatic" "conversion") (:authors ("Deniz Yüret")) (:maintainer "Emre Sevinç" . "emre.sevinc@gmail.com") (:url . "http://www.denizyuret.com/2006/11/emacs-turkish-mode.html"))])
- (turnip . [(20150309 629) ((dash (2 6 0)) (s (1 9 0))) "Interacting with tmux from Emacs" single ((:commit . "2fd32562fc6fc1cda6d91aa939cfb29f9b16e9de") (:keywords "terminals" "tools") (:authors ("Johann Klähn" . "kljohann@gmail.com")) (:maintainer "Johann Klähn" . "kljohann@gmail.com"))])
- (twig-mode . [(20130220 1850) nil "A major mode for twig" single ((:commit . "2849f273a4855d3314a9c0cc84134f5b28ad5ea6") (:authors ("Bojan Matic aka moljac024")) (:maintainer "Bojan Matic aka moljac024"))])
- (twilight-anti-bright-theme . [(20160622 848) nil "A soothing Emacs 24 light-on-dark theme" single ((:commit . "523b95fcdbf4a6a6483af314ad05354a3d80f23f") (:keywords "themes") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:url . "https://github.com/jimeh/twilight-anti-bright-theme.el"))])
- (twilight-bright-theme . [(20130605 843) nil "A Emacs 24 faces port of the TextMate theme" single ((:commit . "322157cb2f3bf7920ecd209dafc31bc1c7959f49") (:keywords "themes") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:url . "https://github.com/jimeh/twilight-bright-theme.el"))])
- (twilight-theme . [(20120412 1303) nil "Twilight theme for GNU Emacs 24 (deftheme)" single ((:commit . "77c4741cb3dcf16e53d06d6c2ffdc660c40afb5b") (:authors ("Nick Parker" . "nickp@developernotes.com")) (:maintainer "Nick Parker" . "nickp@developernotes.com"))])
- (twittering-mode . [(20181121 1402) nil "Major mode for Twitter" single ((:commit . "114891e8fdb4f06b1326a6cf795e49c205cf9e29") (:keywords "twitter" "web") (:authors ("Tadashi MATSUO" . "tad@mymail.twin.ne.jp") ("Y. Hayamizu" . "y.hayamizu@gmail.com") ("Tsuyoshi CHO" . "Tsuyoshi.CHO+develop@Gmail.com") ("Alberto Garcia" . "agarcia@igalia.com") ("Xavier Maillard" . "xavier@maillard.im")) (:maintainer "Tadashi MATSUO" . "tad@mymail.twin.ne.jp") (:url . "http://twmode.sf.net/"))])
- (typescript-mode . [(20200430 1232) ((emacs (24 3))) "Major mode for editing typescript" tar ((:commit . "0fc729787007b5111f3584034af0f3ef2389098f") (:keywords "typescript" "languages") (:url . "http://github.com/ananthakumaran/typescript.el"))])
- (typing . [(20180830 2203) nil "The Typing Of Emacs" single ((:commit . "a2ef25dde2d8eb91bd9c0c6164cb5208208647fa") (:keywords "games") (:authors ("Alex Schroeder" . "alex@gnu.org")) (:maintainer "Alex Schroeder" . "alex@gnu.org") (:url . "http://www.emacswiki.org/emacs/TypingOfEmacs"))])
- (typing-game . [(20160426 1220) nil "a simple typing game" single ((:commit . "616435a5270274f4c7b698697674dbb2039049a4") (:keywords "lisp" "game") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (typit . [(20200217 2059) ((emacs (24 4)) (f (0 18)) (mmt (0 1 1))) "Typing game similar to tests on 10 fast fingers" tar ((:commit . "f567867a0a519e17ad3552837b48d3d45fb73aa5") (:keywords "games") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/typit"))])
- (typo . [(20200706 1714) nil "Minor mode for typographic editing" single ((:commit . "173ebe4fc7ac38f344b16e6eaf41f79e38f20d57") (:keywords "convenience" "wp") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/jorgenschaefer/typoel"))])
- (typoscript-mode . [(20170126 912) ((emacs (24 4)) (use-package (0))) "mode for TypoScript files" single ((:commit . "44e7567e921573c4f33c537b827f71fb1f565c32") (:keywords "typo3" "typoscript") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:url . "https://github.com/ksjogo/typoscript-mode"))])
- (ubuntu-theme . [(20150805 1506) nil "A theme inspired by the default terminal colors in Ubuntu" single ((:commit . "88b0eefc75d4cbcde103057e1c5968d4c3052f69") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://github.com/rocher/ubuntu-theme"))])
- (ucs-utils . [(20150826 1414) ((persistent-soft (0 8 8)) (pcache (0 2 3)) (list-utils (0 4 2))) "Utilities for Unicode characters" tar ((:commit . "cbfd42f822bf5717934fa2d92060e6e24a813433") (:keywords "i18n" "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/ucs-utils"))])
- (udev-mode . [(20200702 1536) ((emacs (24))) "Major mode for editing udev rules files" single ((:commit . "5ca236980662141518603672ebdbdf863756da5a") (:keywords "languages" "unix") (:authors ("Benjamin Staffin" . "benley@gmail.com")) (:maintainer "Benjamin Staffin" . "benley@gmail.com") (:url . "https://github.com/benley/emacs-udev-mode"))])
- (uimage . [(20160901 1221) nil "An iimage like mode with the ability to display url images" single ((:commit . "9893d09160ef7e8c0ecdcd74fca99ffeb5f9d70d") (:keywords "lisp" "url" "image") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))])
- (ujelly-theme . [(20180214 1624) nil "Ujelly theme for GNU Emacs 24 (deftheme)" single ((:commit . "bf724ce7806a738d2043544061e5f9bbfc56e674") (:authors ("Mark Tran" . "mark.tran@gmail.com")) (:maintainer "Mark Tran" . "mark.tran@gmail.com") (:url . "http://github.com/marktran/color-theme-ujelly"))])
- (ukrainian-holidays . [(20130720 1349) nil "Ukrainian holidays for Emacs calendar." single ((:commit . "e52b0c92843e9f4d0415a7ba3b8559785497d23d") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/ukrainian-holidays"))])
- (uml-mode . [(20200129 1147) ((emacs (24 4)) (seq (0))) "Minor mode for ascii uml sequence diagrams" single ((:commit . "4c37ac1c4424b2313cd8f16ba48a98a4cc214200") (:keywords "docs") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:url . "http://github.com/ianxm/emacs-uml"))])
- (uncrustify-mode . [(20130707 1359) nil "Minor mode to automatically uncrustify." single ((:commit . "73893d000361e95784911e5ec268ad0ab2a1473c") (:keywords "uncrustify") (:authors ("Tabito Ohtani" . "koko1000ban@gmail.com")) (:maintainer "Tabito Ohtani" . "koko1000ban@gmail.com"))])
- (undercover . [(20191122 2126) ((emacs (24)) (dash (2 0 0)) (shut-up (0 3 2))) "Test coverage library for Emacs Lisp" single ((:commit . "9f4fbd04cd25c61397a7058bf2bad33c7b669aa4") (:keywords "lisp" "tests" "coverage" "tools") (:authors ("Sviridov Alexander" . "sviridov.vmi@gmail.com")) (:maintainer "Sviridov Alexander" . "sviridov.vmi@gmail.com") (:url . "https://github.com/sviridov/undercover.el"))])
- (underline-with-char . [(20191128 2309) ((emacs (24))) "Underline with a char" single ((:commit . "36577e72aa4fbfa7f1abad01842359209f543751") (:keywords "convenience") (:maintainer nil . "marcowahlsoft@gmail.com") (:url . "https://gitlab.com/marcowahl/underline-with-char"))])
- (undersea-theme . [(20200719 618) ((emacs (24 3))) "Theme styled after undersea imagery" single ((:commit . "d4edb2cc110f1679ebc82cb52a4242cbc74636db") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/undersea-theme"))])
- (underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" single ((:commit . "4eb9ef014f580adc135d91d1cd68d37a310640b6") (:keywords "faces") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com"))])
- (undo-fu . [(20200701 1435) ((emacs (24 3))) "Undo helper with redo" single ((:commit . "c0806c1903c5a0e4c69b6615cdc3366470a9b8ca") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu"))])
- (undo-fu-session . [(20200517 949) ((emacs (24 1))) "Persistent undo, available between sessions" single ((:commit . "e2043f8350970e1a9ef06a94956a733826cdf32b") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))])
- (undo-propose . [(20200204 1612) ((emacs (24 3))) "Simple and safe undo navigation" single ((:commit . "20409358ad321fb937152cf93a50a4a775e405d6") (:keywords "convenience" "files" "undo" "redo" "history") (:authors ("Jack Kamm")) (:maintainer "Jack Kamm") (:url . "https://github.com/jackkamm/undo-propose.el"))])
- (undohist . [(20200120 1328) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" single ((:commit . "6c905772e6aa9969fd9ca500d2fe93e114130fe6") (:keywords "convenience") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainer "MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com"))])
- (unfill . [(20200304 2218) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" single ((:commit . "02c36a04364bcb586477ab79d2b5e0d4e6ae6d47") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/unfill"))])
- (unicode-emoticons . [(20150204 1108) nil "Shortcuts for common unicode emoticons" single ((:commit . "fb18631f342b0243cf77cf59ed2067c47aae5233") (:keywords "games" "entertainment" "comms") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:url . "https://github.com/hagleitn/unicode-emoticons"))])
- (unicode-enbox . [(20140508 2041) ((string-utils (0 3 2)) (ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Surround a string with box-drawing characters" single ((:commit . "77074fac1994a4236f111d6a1d0cf79ea3fca151") (:keywords "extensions" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/unicode-enbox"))])
- (unicode-escape . [(20160614 1234) ((emacs (24)) (names (20151201 0)) (dash (2 12 1))) "Escape/Unescape unicode notations" single ((:commit . "fc69ec780d9e54c364a9252bd0cf1d2507f3fab7") (:keywords "i18n" "unicode") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:url . "https://github.com/kosh04/unicode-escape.el"))])
- (unicode-fonts . [(20200720 1350) ((font-utils (0 7 8)) (ucs-utils (0 8 2)) (list-utils (0 4 2)) (persistent-soft (0 8 10)) (pcache (0 3 1))) "Configure Unicode fonts" single ((:commit . "b0021a5964c4e85a0186ba626afca0e55509402f") (:keywords "i18n" "faces" "frames" "wp" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/unicode-fonts"))])
- (unicode-math-input . [(20190813 1436) ((emacs (25))) "Insert Unicode math symbols using TeX notation" single ((:commit . "ba45edbfb8fa453e29c4c6c73af60f06637951d6") (:authors ("Augusto Stoffel")) (:maintainer "Augusto Stoffel") (:url . "https://github.com/astoff/unicode-math-input.el"))])
- (unicode-progress-reporter . [(20140508 2041) ((emacs (24 1 0)) (ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Progress-reporter with fancy characters" single ((:commit . "5e66724fd7d15743213b082474d798117b194494") (:keywords "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/unicode-progress-reporter"))])
- (unicode-troll-stopper . [(20190209 411) nil "Minor mode for Highlighting Unicode homoglyphs" single ((:commit . "5e8be35a7bf6382384a701663f7438ee27e4b67c") (:keywords "unicode") (:authors ("Cam Saül" . "cammsaul@gmail.com")) (:maintainer "Cam Saül" . "cammsaul@gmail.com") (:url . "https://github.com/camsaul/emacs-unicode-troll-stopper"))])
- (unicode-whitespace . [(20140508 2041) ((ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "teach whitespace-mode about fancy characters" single ((:commit . "a18c6b38d78b94f2eb1dcc4cb4fa91b6a17efabe") (:keywords "faces" "wp" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/unicode-whitespace"))])
- (unidecode . [(20180312 1926) nil "Transliterate Unicode to ASCII" tar ((:commit . "5502ada9287b4012eabb879f12f5b0a9df52c5b7") (:authors ("sindikat <sindikat at mail36 dot net>")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com"))])
- (unifdef . [(20200517 514) nil "Delete code guarded by processor directives" single ((:commit . "7a4b76f664c4375e3d98e8af0a29270752c13701") (:keywords "convenience" "languages") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/unifdef"))])
- (unify-opening . [(20171122 2012) ((emacs (24 4))) "Unify the mechanism to open files" single ((:commit . "502469ddba6d8d52159f53976265f7d956b6b17c") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "https://github.com/DamienCassou/unify-opening"))])
- (unipoint . [(20140113 2224) nil "a simple way to insert unicode characters by TeX name" single ((:commit . "5da04aebac35a5c9e1d8704f2231808d42f4b36a") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com") (:url . "https://github.com/apgwoz/unipoint"))])
- (unison . [(20160704 740) ((emacs (24 1))) "sync with Unison" single ((:commit . "a78a04c0d1398d00f75a1bd4799622a65bcb0f28") (:keywords "sync") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:url . "http://github.com/unhammer/unison.el"))])
- (unison-mode . [(20160513 1501) nil "Syntax highlighting for unison file synchronization program" single ((:commit . "0bd6a65c0d12f87fcf7bdff15fe54444959b93bf") (:keywords "symchronization" "unison") (:authors ("Karl Fogelmark" . "karlfogel@gmail.com")) (:maintainer "Karl Fogelmark" . "karlfogel@gmail.com") (:url . "https://github.com/impaktor/unison-mode"))])
- (unisonlang-mode . [(20200720 1708) ((emacs (25 1))) "Simple major mode for editing Unison" single ((:commit . "f793430068ade1b0a2d744aaa45f569c9dec9085") (:keywords "languages") (:authors ("Dario Oddenino")) (:maintainer "Dario Oddenino") (:url . "https://github.com/unison-mode-emacs"))])
- (universal-emotions-emoticons . [(20180729 1941) ((emacs (24 4))) "Emoticons For The Six Universal Expressions" single ((:commit . "9cedd09ee65cb9fa71f27b0ab46a8353bdc00902") (:keywords "convenience" "docs" "languages") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainer nil . "<gcr@wisdomandwonder.com>") (:url . "https://github.com/grettke/universal-emotions-emoticons"))])
- (unkillable-scratch . [(20190309 17) ((emacs (24))) "Disallow the \\*scratch\\* buffer from being killed" single ((:commit . "b24c2a760529833f230c14cb02ff6e7ec92288ab") (:keywords "convenience") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com") (:url . "https://github.com/EricCrosson/unkillable-scratch"))])
- (unobtrusive-magit-theme . [(20200411 1349) ((emacs (24 1))) "An unobtrusive Magit theme" single ((:commit . "aede357009655d19d4468320b2b61b0f26a47593") (:keywords "faces" "vc" "magit") (:authors ("Thomas A. Brown" . "tabsoftwareconsulting@gmail.com")) (:maintainer "Thomas A. Brown" . "tabsoftwareconsulting@gmail.com") (:url . "https://github.com/tee3/unobtrusive-magit-theme"))])
- (untitled-new-buffer . [(20161212 1508) ((emacs (24 4)) (magic-filetype (0 2 0))) "Open untitled new buffer like other text editors." single ((:commit . "4eabc6937b0e83062ffce9de0d42110224063a6c") (:keywords "files" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/zonuexe/untitled-new-buffer.el"))])
- (upbo . [(20180422 822) ((dash (2 12 0)) (emacs (24 4))) "Karma Test Runner Integration" single ((:commit . "1e4b1e7f44f242a6cdcce0c157d07efe667b7bef") (:keywords "javascript" "js" "test" "karma") (:authors ("Sungho Kim(shiren)")) (:maintainer "Sungho Kim(shiren)") (:url . "http://github.com/shiren"))])
- (uptimes . [(20191121 1030) ((cl-lib (0 5)) (emacs (24))) "Track and display Emacs session uptimes." single ((:commit . "29ae6585eeed5a00719b2e52f5ae1082087c1778") (:keywords "processes" "uptime") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/uptimes.el"))])
- (url-shortener . [(20170805 242) nil "shorten long url and expand tinyurl" single ((:commit . "06db8270213b9e352d6c335b0663059a1353d05e") (:authors ("Yu Yang" . "yy2012cn@NOSPAM.gmail.com")) (:maintainer "Yu Yang" . "yy2012cn@NOSPAM.gmail.com") (:url . "https://github.com/yuyang0/url-shortener"))])
- (urlenc . [(20140116 1456) nil "URL encoding/decoding utility for Emacs." single ((:commit . "835a6dcb783bbe84714bae87a3464aa0b128bfac") (:keywords "url") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:url . "https://github.com/buzztaiki/urlenc-el"))])
- (urscript-mode . [(20190219 1604) ((emacs (24 4))) "major mode for editing URScript." single ((:commit . "b341f96b129ead8fb74d680cb4f546985bf110a9") (:keywords "languages") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:url . "https://github.com/guidoschmidt/urscript-mode"))])
- (usage-memo . [(20170926 37) nil "integration of Emacs help system and memo" single ((:commit . "88e15a9942a3e0a6e36e9c3e51e3edb746067b1a") (:keywords "convenience" "languages" "lisp" "help" "tools" "docs") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/usage-memo.el"))])
- (use-package . [(20200721 2156) ((emacs (24 3)) (bind-key (2 4))) "A configuration macro for simplifying your .emacs" tar ((:commit . "7d925367ef0857d513d62eab4cb57b7436b9ffe9") (:keywords "dotemacs" "startup" "speed" "config" "package") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:url . "https://github.com/jwiegley/use-package"))])
- (use-package-chords . [(20181024 2322) ((use-package (2 1)) (bind-key (1 0)) (bind-chord (0 2)) (key-chord (0 6))) "key-chord keyword for use-package" single ((:commit . "7d925367ef0857d513d62eab4cb57b7436b9ffe9") (:keywords "convenience" "tools" "extensions") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/use-package-chords"))])
- (use-package-el-get . [(20180131 505) ((use-package (1 0))) "el-get support for use package" single ((:commit . "cba87c4e9a3a66b7c10962e3aefdf11c83d737bc") (:keywords "dotemacs" "startup" "speed" "config" "package" "tools") (:authors ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainer "Edward Knyshov" . "edvorg@gmail.com") (:url . "https://github.com/edvorg/use-package-el-get"))])
- (use-package-ensure-system-package . [(20180913 1501) ((use-package (2 1)) (system-packages (1 0 4))) "auto install system packages" single ((:commit . "7d925367ef0857d513d62eab4cb57b7436b9ffe9") (:keywords "convenience" "tools" "extensions") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/use-package-ensure-system-package"))])
- (use-package-hydra . [(20181228 745) ((emacs (24 3)) (use-package (2 4))) "Adds :hydra keyword to use-package macro" single ((:commit . "8cd55a1128fbdf6327bb38a199d206225896d146") (:keywords "convenience" "extensions" "tools") (:authors ("Toon Claes" . "toon@iotcl.com")) (:maintainer "Toon Claes" . "toon@iotcl.com") (:url . "https://gitlab.com/to1ne/use-package-hydra"))])
- (use-ttf . [(20200720 957) ((emacs (24 4)) (s (1 12 0))) "Keep font consistency across different OSs" single ((:commit . "e09f7d08b462984da6bf53b523b4fcd6826a6a5d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/use-ttf"))])
- (utop . [(20190715 1836) ((emacs (24))) "Universal toplevel for OCaml" single ((:commit . "7bc5117d3449fc19f5c706a6decfdb2a30984507") (:keywords "ocaml" "languages") (:authors ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainer "Jeremie Dimino" . "jeremie@dimino.org") (:url . "https://github.com/diml/utop"))])
- (uuid . [(20120910 851) nil "UUID's for EmacsLisp" single ((:commit . "1519bfeb0e31602b840bc8dd35d7c7e732c159fe") (:keywords "lisp") (:authors ("James Mastros")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (uuidgen . [(20200728 1202) nil "Provides various UUID generating functions" single ((:commit . "b59aefaed69dda2f704bbc63b13d120fa387309b") (:keywords "extensions" "lisp" "tools") (:authors ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainer "Kan-Ru Chen" . "kanru@kanru.info"))])
- (v2ex-mode . [(20160720 345) ((cl-lib (0 5)) (request (0 2)) (let-alist (1 0 3))) "Major mode for visit http://v2ex.com/ site." single ((:commit . "b7d19bb594b43ea3824a6f215dd1e5d1d4c0e8ad") (:keywords "v2ex" "v2ex.com") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com") (:url . "https://github.com/aborn/v2ex-mode"))])
- (vagrant . [(20170301 2206) nil "Manage a vagrant box from emacs" single ((:commit . "636ce2f9af32ea199170335a9cf1201b64873440") (:keywords "vagrant" "chef") (:authors ("Robert Crim" . "rob@servermilk.com")) (:maintainer "Robert Crim" . "rob@servermilk.com") (:url . "https://github.com/ottbot/vagrant.el"))])
- (vagrant-tramp . [(20200118 2324) ((dash (2 12 0))) "Vagrant method for TRAMP" tar ((:commit . "f67925928dd844b74e4002f433e6f0ebd3aae357") (:keywords "vagrant") (:authors ("Doug MacEachern" . "dougm@vmware.com") ("Ryan Prior " . "ryanprior@gmail.com")) (:maintainer "Doug MacEachern" . "dougm@vmware.com") (:url . "https://github.com/dougm/vagrant-tramp"))])
- (vala-mode . [(20150324 2225) nil "Vala mode derived mode" single ((:commit . "fb2871a4492d75d03d72e60474919ab89adb267b") (:keywords "vala" "languages" "oop") (:authors ("2005 Dylan R. E. Moonfire") (" 2008 Étienne BERSAC")) (:maintainer "Étienne BERSAC" . "bersace03@laposte.net"))])
- (vala-snippets . [(20150429 352) ((yasnippet (0 8 0))) "Yasnippets for Vala" tar ((:commit . "671439501060449bd100b9fffd524a86064fbfbb") (:authors ("Daniel Gopar")) (:maintainer "Daniel Gopar") (:url . "https://github.com/gopar/vala-snippets"))])
- (vale-mode . [(20190725 125) ((emacs (25))) "Major mode for writing Vale vaf files" single ((:commit . "48bbc4b4ee5bf0b1b73e52705c0fbc112b255cd0") (:keywords "convenience" "languages") (:authors ("Jay Bosamiya" . "jaybosamiya@gmail.com")) (:maintainer "Jay Bosamiya" . "jaybosamiya@gmail.com") (:url . "https://github.com/jaybosamiya/vale-mode.el"))])
- (vbasense . [(20140221 2353) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 1))) "provide a environment like Visual Basic Editor." tar ((:commit . "8c61a492d7c15218ae1a96e2aebfe6f78bfff6db") (:keywords "vba" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/emacs-vbasense"))])
- (vc-auto-commit . [(20170107 1333) nil "Auto-committing feature for your repository" tar ((:commit . "446f664f4ec835532f4f18ba18b5fb731f6030aa") (:keywords "vc" "convenience") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "http://github.com/thisirs/vc-auto-commit.git"))])
- (vc-check-status . [(20170107 1334) nil "Warn you when quitting emacs and leaving repo dirty." tar ((:commit . "37734beb16bfd8633ea328059bf9a47eed826d5c") (:keywords "vc" "convenience") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:url . "https://github.com/thisirs/vc-check-status"))])
- (vc-darcs . [(20170905 320) ((emacs (24))) "a VC backend for darcs" single ((:commit . "390fb1ebdda1ffac45b9be02626dde3b6d95ac11") (:keywords "vc") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx") ("Juliusz Chroboczek" . "jch@pps.univ-paris-diderot.fr")) (:maintainer "Libor Čapák" . "capak@inputwish.com"))])
- (vc-fossil . [(20180215 1635) nil "VC backend for the fossil sofware configuraiton management system" tar ((:commit . "7c5af95181213db38f81f5f9586f3334301a3ea0") (:authors ("Venkat Iyer" . "venkat@comit.com")) (:maintainer "Venkat Iyer" . "venkat@comit.com"))])
- (vc-hgcmd . [(20200615 1823) ((emacs (25 1))) "VC mercurial backend that uses hg command server" single ((:commit . "5c735b3e3897b7ba52b5ac4e6a2f43ca283fd52d") (:keywords "vc") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:url . "https://github.com/muffinmad/emacs-vc-hgcmd"))])
- (vc-msg . [(20191128 1010) ((emacs (24 4)) (popup (0 5 0))) "Show commit information of current line" tar ((:commit . "93794111daa95b809e46e6d961ad5f68eb8f78ed") (:keywords "git" "vc" "svn" "hg" "messenger") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/vc-msg"))])
- (vc-osc . [(20190402 2349) nil "non-resident support for osc version-control" single ((:commit . "bf5a515ed85f7d7cdfe66ed5bf4ef7554f8561e5") (:authors ("Adam Spiers (see vc.el for full credits)")) (:maintainer "Adam Spiers" . "aspiers@suse.com"))])
- (vcomp . [(20190128 20) nil "compare version strings" single ((:commit . "f839b3b3257a564b19d7f9557dc8bcbbe0b95842") (:keywords "versions") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/vcomp"))])
- (vcsh . [(20200226 1339) ((emacs (25 1))) "vcsh integration" single ((:commit . "7e376436b8f450a5571e19246136ccf77bbdd4f1") (:keywords "vc" "files") (:authors ("Štěpán Němec" . "stepnem@gmail.com")) (:maintainer "Štěpán Němec" . "stepnem@gmail.com") (:url . "https://gitlab.com/stepnem/vcsh-el"))])
- (vdf-mode . [(20200713 1838) ((emacs (24 3))) "Major mode for editing Valve VDF files." single ((:commit . "8fbf6157440345879a0543bcab233e790a7b60ee") (:authors ("Philipp Middendorf")) (:maintainer "Philipp Middendorf") (:url . "https://github.com/plapadoo/vdf-mode"))])
- (vdiff . [(20200214 1845) ((emacs (24 4)) (hydra (0 13 0))) "A diff tool similar to vimdiff" single ((:commit . "c0541ae9c2cb878be9ab3935da058a72155a14fc") (:keywords "diff") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-vdiff"))])
- (vdiff-magit . [(20190304 1707) ((emacs (24 4)) (vdiff (0 3)) (magit (2 10 0)) (transient (0 1 0))) "magit integration for vdiff" single ((:commit . "b100d126c69e5c26a61ae05aa1778bcc4302b597") (:keywords "diff") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-vdiff-magit"))])
- (vdirel . [(20190430 624) ((emacs (24 4)) (org-vcard (0 1 0)) (helm (1 7 0)) (seq (1 11))) "Manipulate vdir (i.e., vCard) repositories" single ((:commit . "a9ef32a70a1f14416e3dc5fee478ce138cc011d3") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/vdirel"))])
- (vdm-comint . [(20181127 2023) ((emacs (25)) (vdm-mode (0 0 4))) "REPL support for vdm-mode" single ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:keywords "languages") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:url . "https://github.com/peterwvj/vdm-mode"))])
- (vdm-mode . [(20190328 1408) ((emacs (25))) "Major mode for the Vienna Development Method" tar ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:keywords "languages") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:url . "https://github.com/peterwvj/vdm-mode"))])
- (vdm-snippets . [(20190313 1122) ((emacs (24)) (yasnippet (0 13 0))) "YASnippets for VDM mode" tar ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:keywords "languages") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:url . "https://github.com/peterwvj/vdm-mode"))])
- (vector-utils . [(20140508 2041) nil "Vector-manipulation utility functions" single ((:commit . "c38ca1c6a23b2b51a6ac36c2c64e50e21cbe9d21") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/vector-utils"))])
- (vega-view . [(20200520 1202) ((emacs (25)) (cider (0 24 0)) (parseedn (0 1))) "Vega visualization viewer" single ((:commit . "b0160c883f53ce069c0b4498880474c158ac7245") (:keywords "multimedia") (:authors ("Jack Rusher" . "jack@appliedscience.studio")) (:maintainer "Jack Rusher" . "jack@appliedscience.studio") (:url . "https://www.github.com/applied-science/emacs-vega-view"))])
- (verb . [(20200627 2134) ((emacs (25 1))) "Organize and send HTTP requests" tar ((:commit . "cb15a933810dbf82624531fc40f3c3d696d0d35b") (:keywords "tools") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:url . "https://github.com/federicotdn/verb"))])
- (veri-kompass . [(20200213 934) ((emacs (25)) (cl-lib (0 5)) (org (8 2 0))) "verilog codebase navigation facility" single ((:commit . "271903cdf92db05898ee7cffb65641f30fa08280") (:keywords "languages" "extensions" "verilog" "hardware" "rtl") (:maintainer nil . "andrea_corallo@yahoo.it") (:url . "https://gitlab.com/koral/veri-kompass"))])
- (verify-url . [(20160426 1228) ((cl-lib (0 5))) "find out invalid urls in the buffer or region" single ((:commit . "d6f3623cda8cd526a2d198619b137059cb1ba1ab") (:keywords "convenience" "usability" "url") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/verify-url"))])
- (versuri . [(20200316 852) ((emacs (26 1)) (dash (2 16 0)) (request (0 3 0)) (anaphora (1 0 4)) (esxml (0 1 0)) (s (1 12 0)) (esqlite (0 3 1)) (ivy (0 11 0))) "The lyrics package" single ((:commit . "41e20583d1080beeeda0e36d1b2e6d74b9c57920") (:keywords "multimedia") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:url . "https://github.com/mihaiolteanu/versuri/"))])
- (vertica . [(20131217 1511) ((sql (3 0))) "Vertica SQL mode extension" single ((:commit . "3c9647b425c5c13c30bf0cba483646af18196588") (:keywords "sql" "vertica") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com"))])
- (vertica-snippets . [(20200423 1200) ((yasnippet (0 6 1))) "Yasnippets for Vertica" tar ((:commit . "6ced718d9120878878700592fab430a8542b748f") (:keywords "convenience" "snippets") (:authors ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainer "Andreas Gerler" . "baron@bundesbrandschatzamt.de") (:url . "https://github.com/baron42bba/vertica-snippets"))])
- (vertigo . [(20180829 2230) ((dash (2 11 0))) "Jump across lines using the home row." single ((:commit . "6303d17270ea92290a6960890bca515274f1682b") (:keywords "vim" "vertigo") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:url . "https://github.com/noctuid/vertigo.el"))])
- (vhdl-capf . [(20160221 1734) nil "Completion at point function (capf) for vhdl-mode." single ((:commit . "290abe217050f33532bc9ccb04f894123402f414") (:keywords "convenience" "usability" "vhdl" "completion") (:authors ("sh-ow" . "sh-ow@users.noreply.github.com")) (:maintainer "sh-ow" . "sh-ow@users.noreply.github.com") (:url . "https://github.com/sh-ow/vhdl-capf"))])
- (vhdl-tools . [(20200330 1819) ((ggtags (0 9 0)) (emacs (26 2)) (helm-rg (0 1)) (outshine (3 1 -1))) "Utilities for navigating vhdl sources" single ((:commit . "b5d1eec90bb43ba10178219245afbddb6601e85b") (:keywords "convenience" "languages" "vhdl") (:authors ("Cayetano Santos")) (:maintainer "Cayetano Santos") (:url . "https://gitlab.com/emacs-elisp/vhdl-tools/-/wikis/home"))])
- (vi-tilde-fringe . [(20141028 242) ((emacs (24))) "Displays tildes in the fringe on empty lines a la Vi." single ((:commit . "f1597a8d54535bb1d84b442577b2024e6f910308") (:keywords "emulation") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:url . "https://github.com/syl20bnr/vi-tilde-fringe"))])
- (viewer . [(20170107 202) nil "View-mode extension" single ((:commit . "6c8db025bf4021428f7f2c3ef9d74fb13f5d267a") (:keywords "view" "extensions") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:url . "http://github.com/rubikitch/viewer/"))])
- (viking-mode . [(20160705 2027) nil "kill first, ask later" single ((:commit . "c76aa265d13ad91d6890d242e142d05e31f0340b") (:keywords "kill" "delete") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:url . "https://github.com/tlinden/viking-mode"))])
- (vim-empty-lines-mode . [(20150111 426) ((emacs (23))) "Vim-like empty line indicator at end of files." single ((:commit . "d4a5034ca8ea0c962ad6e92c86c0fa2a74d2964b") (:keywords "emulations") (:authors ("Jonne Mickelin" . "jonne@ljhms.com")) (:maintainer "Jonne Mickelin" . "jonne@ljhms.com") (:url . "https://github.com/jmickelin/vim-empty-lines-mode"))])
- (vim-region . [(20140329 1624) ((expand-region (20140127))) "Select region as vim" single ((:commit . "7c4a99ce3678fee40c83ab88e8ad075d2a935fdf") (:authors ("ongaeshi" . "ongaeshi0621@gmail.com")) (:maintainer "ongaeshi" . "ongaeshi0621@gmail.com") (:url . "https://github.com/ongaeshi/emacs-vim-region"))])
- (vimgolf . [(20200205 1420) nil "VimGolf interface for the One True Editor" single ((:commit . "f565447ed294898588a19438d56c116555d8c628") (:keywords "games" "vimgolf" "vim") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com") (:url . "https://github.com/timvisher/vimgolf.el"))])
- (vimish-fold . [(20200524 1729) ((emacs (24 4)) (cl-lib (0 5)) (f (0 18 0))) "Fold text like in Vim" single ((:commit . "9d12e39f01da517565666e09a2e32e01aed24a90") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/vimish-fold"))])
- (vimrc-mode . [(20181116 1919) nil "Major mode for vimrc files" single ((:commit . "13bc150a870d5d4a95f1111e4740e2b22813c30e") (:keywords "languages" "vim") (:url . "https://github.com/mcandre/vimrc-mode"))])
- (virtual-auto-fill . [(20200217 2333) ((emacs (25 2)) (adaptive-wrap (0 7)) (visual-fill-column (1 9))) "Readably display text without adding line breaks" single ((:commit . "291f6178a5423f01f2f69d6bc48603d4f605b61a") (:keywords "convenience" "mail" "outlines" "files" "wp") (:authors ("Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de")) (:maintainer "Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de") (:url . "https://github.com/luisgerhorst/virtual-auto-fill"))])
- (virtualenv . [(20140220 2301) nil "Virtualenv for Python" single ((:commit . "276c0f4d6493b402dc4d22ecdf17b2b072e911b3") (:keywords "python" "virtualenv") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com"))])
- (virtualenvwrapper . [(20190223 1919) ((dash (1 5 0)) (s (1 6 1))) "a featureful virtualenv tool for Emacs" single ((:commit . "107e7e0bf923f44d217712772cd58b414d0065cb") (:keywords "python" "virtualenv" "virtualenvwrapper") (:authors ("James J Porter" . "porterjamesj@gmail.com")) (:maintainer "James J Porter" . "porterjamesj@gmail.com") (:url . "http://github.com/porterjamesj/virtualenvwrapper.el"))])
- (visible-mark . [(20150624 450) nil "Make marks visible." single ((:commit . "a584db9bc88953b23a9648b3e14ade90767207f8") (:keywords "marking" "color" "faces") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:url . "https://gitlab.com/iankelling/visible-mark"))])
- (visual-ascii-mode . [(20150129 1046) nil "Visualize ascii code (small integer) on buffer." single ((:commit . "99285a099a17472ddd9f1b4f74e9d092dd8c5947") (:keywords "presentation") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:url . "https://github.com/Dewdrops/visual-ascii-mode"))])
- (visual-fill-column . [(20200428 816) ((emacs (24 3))) "fill-column for visual-line-mode" single ((:commit . "64d38bc1c00953be05c193c01332a633be67aac2") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://github.com/joostkremers/visual-fill-column"))])
- (visual-regexp . [(20190414 814) ((cl-lib (0 2))) "A regexp/replace command for Emacs with interactive visual feedback" single ((:commit . "3e3ed81a3cbadef1f1f4cb16f9112a58641d70ca") (:keywords "regexp" "replace" "visual" "feedback") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:url . "https://github.com/benma/visual-regexp.el/"))])
- (visual-regexp-steroids . [(20170222 253) ((visual-regexp (1 1))) "Extends visual-regexp to support other regexp engines" tar ((:commit . "a6420b25ec0fbba43bf57875827092e1196d8a9e") (:keywords "external" "foreign" "regexp" "replace" "python" "visual" "feedback") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:url . "https://github.com/benma/visual-regexp-steroids.el/"))])
- (vlc . [(20200328 1143) ((emacs (25 1))) "VideoLAN VLC Media Player Control" single ((:commit . "932840f874e7510ee86e796bb5dc20d44514e31a") (:keywords "tools") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/vlc.el"))])
- (vlf . [(20191126 2250) nil "View Large Files" tar ((:commit . "cc02f2533782d6b9b628cec7e2dcf25b2d05a27c") (:keywords "large files" "utilities") (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:url . "https://github.com/m00natic/vlfi"))])
- (vmd-mode . [(20200727 701) ((emacs (24 3))) "Fast Github-flavored Markdown preview using a vmd subprocess." single ((:commit . "31655a41caf006c3dd64d6e57f6c4488098f8bce") (:keywords "markdown" "preview" "live" "vmd") (:authors ("Blake Miller" . "blak3mill3r@gmail.com")) (:maintainer "Blake Miller" . "blak3mill3r@gmail.com") (:url . "https://github.com/blak3mill3r/vmd-mode"))])
- (voca-builder . [(20161101 1645) ((popup (0 5 2))) "Helps you build up your vocabulary" single ((:commit . "51573beec8cd8308477b0faf453aad93e17f57c5") (:keywords "english" "vocabulary") (:authors ("Yi Tang" . "yi.tang.uk@me.com")) (:maintainer "Yi Tang" . "yi.tang.uk@me.com") (:url . "https://github.com/yitang/voca-builder"))])
- (volatile-highlights . [(20160612 155) nil "Minor mode for visual feedback on some operations." single ((:commit . "9a20091f0ce7fc0a6b3e641a6a46d5f3ac4d8392") (:keywords "emulations" "convenience" "wp") (:authors ("K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>")) (:maintainer "K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>") (:url . "http://www.emacswiki.org/emacs/download/volatile-highlights.el"))])
- (volume . [(20200523 1246) nil "tweak your sound card volume from Emacs" single ((:commit . "bd0ca8430098164740f111ac2bd2582d7f628b79") (:authors ("Daniel Brockman" . "daniel@brockman.se")) (:maintainer "Daniel Brockman" . "daniel@brockman.se") (:url . "http://www.brockman.se/software/volume-el/"))])
- (vs-dark-theme . [(20191209 1600) ((emacs (24 1))) "Visual Studio IDE dark theme" single ((:commit . "aea1ca9932df2c19a19e47f7971b7bc6b821181f") (:authors ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/jcs090218/vs-dark-theme"))])
- (vs-light-theme . [(20191209 1600) ((emacs (24 1))) "Visual Studio IDE light theme" single ((:commit . "5c11a73bfc5f3873490ed0ba88eed44e4707e455") (:authors ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/jcs090218/vs-light-theme"))])
- (vscdark-theme . [(20191212 107) ((emacs (24 1))) "VS Code Dark+ like theme" single ((:commit . "8eba74059e8a9db974e4056ee024e52fe54da485") (:authors ("Alexander L. Belikoff")) (:maintainer "Alexander L. Belikoff") (:url . "https://github.com/abelikoff/vscdark-theme"))])
- (vscode-dark-plus-theme . [(20200728 455) nil "Default Visual Studio Code Dark+ theme" single ((:commit . "4271b83a2b4c71a468e1db0be76a4a5cae003fc1") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/vscode-dark-plus-emacs-theme"))])
- (vscode-icon . [(20191102 2010) ((emacs (25 1))) "Utility package to provide Vscode style icons" tar ((:commit . "4304e9f0a47406048129dc62171f08b67325a2ed") (:keywords "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:url . "https://github.com/jojojames/vscode-icon-emacs"))])
- (vterm . [(20200713 1344) ((emacs (25 1))) "Fully-featured terminal emulator" tar ((:commit . "f41849c2c9c1899f22d1c3d4f871ec47c82627ce") (:keywords "terminals") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:url . "https://github.com/akermu/emacs-libvterm"))])
- (vterm-toggle . [(20200614 1452) ((emacs (25 1)) (vterm (0 0 1)) (projectile (1 0 0))) "Toggles between the vterm buffer and other buffers." single ((:commit . "7f762d216fc7311bac4182f650e0207574c29357") (:keywords "vterm" "terminals") (:authors (nil . "jixiuf jixiuf@qq.com")) (:maintainer nil . "jixiuf jixiuf@qq.com") (:url . "https://github.com/jixiuf/vterm-toggle"))])
- (vue-html-mode . [(20180428 2035) nil "Major mode for editing Vue.js templates" single ((:commit . "1514939804bad558584feeb6298b38d22eadf64e") (:keywords "languages" "vue" "template") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:url . "http://github.com/AdamNiederer/vue-html-mode"))])
- (vue-mode . [(20190415 231) ((mmm-mode (0 5 5)) (vue-html-mode (0 2)) (ssass-mode (0 2)) (edit-indirect (0 1 4))) "Major mode for vue component based on mmm-mode" single ((:commit . "031edd1f97db6e7d8d6c295c0e6d58dd128b9e71") (:keywords "languages") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com"))])
- (vuiet . [(20200616 1136) ((emacs (26 1)) (lastfm (1 1)) (versuri (1 0)) (s (1 12 0)) (bind-key (2 4)) (mpv (0 1 0))) "The music player and explorer for Emacs" single ((:commit . "3dab1ea2253d5bc2974a1a064d2b1af3bd6b24f6") (:keywords "multimedia") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:url . "https://github.com/mihaiolteanu/vuiet"))])
- (vyper-mode . [(20180707 1935) ((emacs (24 3))) "Major mode for the Vyper programming language" single ((:commit . "323dfddfc38f0b11697e9ebaf04d1b53297e54e5") (:keywords "languages") (:authors ("Alex Stokes" . "r.alex.stokes@gmail.com")) (:maintainer "Alex Stokes" . "r.alex.stokes@gmail.com") (:url . "https://github.com/ralexstokes/vyper-mode"))])
- (w32-browser . [(20170101 1954) nil "Run Windows application associated with a file." single ((:commit . "e5c60eafd8f8d3546a0fa295ad5af2414d36b4e6") (:keywords "mouse" "dired" "w32" "explorer") (:authors ("Emacs Wiki, Drew Adams")) (:maintainer nil . "Drew Adams (concat \"drew.adams\" \"@\" \"oracle\" \".com\")") (:url . "http://www.emacswiki.org/w32-browser.el"))])
- (w3m . [(20200713 54) nil "an Emacs interface to w3m" tar ((:commit . "ee8a7be409dd646ce290612f733f57784c1c06fa") (:keywords "w3m" "www" "hypermedia"))])
- (wacspace . [(20180311 2350) ((dash (1 2 0)) (cl-lib (0 2))) "The WACky WorkSPACE manager for emACS" tar ((:commit . "54d19aab6fd2bc5945b7ffc58104e695064927e2"))])
- (waf-mode . [(20170403 1940) nil "Waf integration for Emacs" single ((:commit . "20c75eabd1d54fbce8e0dbef785c9fb68577ee4f") (:authors ("Denys Valchuk" . "dvalchuk@gmail.com")) (:maintainer "Denys Valchuk" . "dvalchuk@gmail.com") (:url . "https://bitbucket.org/dvalchuk/waf-mode"))])
- (waher-theme . [(20141115 1230) ((emacs (24 1))) "Emacs 24 theme based on waher for st2 by dduckster" single ((:commit . "60d31519fcfd8e797723d47961b255ae2f2e2c0a") (:authors ("Jasonm23" . "jasonm23@gmail.com")) (:maintainer "Jasonm23" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-waher-theme"))])
- (wakatime-mode . [(20200730 240) nil "Automatic time tracking extension for WakaTime" single ((:commit . "7626678315918bdbb81ede68149f20a7d97a928f") (:keywords "calendar" "comm") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainer "Alan Hamlett" . "alan@wakatime.com"))])
- (wakib-keys . [(20200430 2155) ((emacs (24 4))) "Minor Mode for Modern Keybindings" single ((:commit . "d958150c053dae57445be37cda1c2b50efcbaac3") (:keywords "convenience" "keybindings" "keys") (:authors ("Abdulla Bubshait")) (:maintainer "Abdulla Bubshait") (:url . "https://github.com/darkstego/wakib-keys/"))])
- (walkclj . [(20180718 900) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "2e54fa813b11d1a87c890cdf117f30165a193024") (:keywords "languages") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:url . "https://github.com/plexus/walkclj"))])
- (walkman . [(20200418 1554) ((transient (0 1 0)) (org (8 3 5)) (emacs (25 3))) "Write HTTP requests in Org mode" single ((:commit . "07a7710084c328dc238626f8b6e7d019380502de") (:keywords "walkman" "http" "curl" "org" "comm") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:url . "https://github.com/abrochard/walkman"))])
- (wallpaper . [(20200408 1353) ((emacs (25 1))) "Setting the wallpaper" single ((:commit . "9fb5be9c2f7279f7ef2860eefd416359b9026ba3") (:keywords "unix" "wallpaper" "extensions") (:authors ("Farlado" . "farlado@sdf.org")) (:maintainer "Farlado" . "farlado@sdf.org") (:url . "https://github.com/farlado/emacs-wallpaper"))])
- (wand . [(20200302 1536) ((dash (2 15 0)) (s (0 1 1))) "Magic wand for Emacs - Select and execute" tar ((:commit . "731b5ca33269fe563239bff16da6c41489432b80") (:keywords "extensions" "tools") (:authors ("Ha-Duong Nguyen <cmpitgATgmail>")) (:maintainer "Ha-Duong Nguyen <cmpitgATgmail>") (:url . "https://github.com/cmpitg/wand"))])
- (wandbox . [(20170603 1231) ((emacs (24)) (request (0 3 0)) (s (1 10 0))) "Wandbox client" tar ((:commit . "e002fe41f2cd9b4ce2b1dc80b83301176e9117f1") (:keywords "tools") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:url . "https://github.com/kosh04/emacs-wandbox"))])
- (wanderlust . [(20200124 858) ((semi (1 14 7))) "Yet Another Message Interface on Emacsen" tar ((:commit . "7af0d582cd48a37469e0606ea35887740d78c8b5"))])
- (warm-night-theme . [(20161101 1428) ((emacs (24))) "Emacs 24 theme with a dark background." single ((:commit . "020f084d23409b5035150508ba6e57c2509edd64") (:authors ("martin haesler")) (:maintainer "martin haesler"))])
- (watch-buffer . [(20120331 2044) nil "run a shell command when saving a buffer" single ((:commit . "761fd7252e6d7bf5148283c2a7ee935f087d9427") (:keywords "automation" "convenience") (:authors ("Michael Steger" . "mjsteger1@gmail.com")) (:maintainer "Michael Steger" . "mjsteger1@gmail.com") (:url . "https://github.com/mjsteger/watch-buffer"))])
- (wavefront-obj-mode . [(20170808 1716) nil "Major mode for Wavefront obj files" single ((:commit . "34027915de6496460d8e68b5991dd24d47d54859") (:authors ("Sasha Kovar" . "sasha-emacs@arcocene.org")) (:maintainer "Sasha Kovar" . "sasha-emacs@arcocene.org") (:url . "http://github.com/abend/wavefront-obj-mode"))])
- (wc-goal-mode . [(20140829 1359) nil "Running word count with goals (minor mode)" single ((:commit . "bf21ab9c5a449bcc20dd207a4915dcec218d2699") (:authors ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "https://github.com/bnbeckwith/wc-goal-mode"))])
- (wc-mode . [(20200108 1841) ((emacs (24 1))) "Running word count with goals (minor mode)" single ((:commit . "79107d1130e8be3e1db4619373b98045b4fd9033") (:authors ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "https://github.com/bnbeckwith/wc-mode"))])
- (wcheck-mode . [(20190626 1839) nil "General interface for text checkers" tar ((:commit . "271198bca70c05b4591c836d3c670b72cdfabe9c"))])
- (wdl-mode . [(20180831 1946) nil "WDL (Workflow Definition Language) major mode" single ((:commit . "cef86e5afc136ae5ad9324cd6e6d6f860b889bcf") (:keywords "languages") (:authors ("Xiaowei Zhan" . "zhanxw@gmail.com")) (:maintainer "Xiaowei Zhan" . "zhanxw@gmail.com") (:url . "http://github.com/zhanxw/wdl-mode"))])
- (weak-ref . [(20200217 2200) ((emacs (24 3))) "Weak references for Emacs Lisp" single ((:commit . "24e8c37da6465e65ce9f866267bd3fa53c8899c6") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-weak-ref"))])
- (weather-metno . [(20150901 107) ((emacs (24)) (cl-lib (0 3))) "Weather data from met.no in Emacs" tar ((:commit . "bfc7137095e0ee71aad70ac46f2af677f3c051b6"))])
- (web . [(20141231 2001) ((dash (2 9 0)) (s (1 5 0))) "useful HTTP client" single ((:commit . "483188dac4bc6b409b985c9dae45f3324a425efd") (:keywords "lisp" "http" "hypermedia") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:url . "http://github.com/nicferrier/emacs-web"))])
- (web-beautify . [(20161115 2247) nil "Format HTML, CSS and JavaScript/JSON" single ((:commit . "e1b45321d8c11b404b12c8e55afe55eaa7c84ee9") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/web-beautify"))])
- (web-completion-data . [(20160318 848) nil "Shared completion data for ac-html and company-web" tar ((:commit . "c272c94e8a71b779c29653a532f619acad433a4f") (:keywords "html" "auto-complete" "company") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:url . "https://github.com/osv/web-completion-data"))])
- (web-mode . [(20200612 1038) ((emacs (23 1))) "major mode for editing web templates" single ((:commit . "60ffd878c4371644bd964f00fea38054645e3e47") (:keywords "languages") (:authors ("François-Xavier Bois <fxbois AT Google Mail Service>")) (:maintainer "François-Xavier Bois") (:url . "http://web-mode.org"))])
- (web-mode-edit-element . [(20190531 852) ((emacs (24 4)) (web-mode (14))) "Helper-functions for attribute- and element-handling" tar ((:commit . "ad5d7e4dc2420bdd00ce65d9adffbd38a5904afa") (:keywords "languages" "convenience") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com") (:url . "https://github.com/jtkDvlp/web-mode-edit-element"))])
- (web-narrow-mode . [(20170407 210) ((web-mode (14 0 27))) "quick narrow code block in web-mode" single ((:commit . "73bdcb7d0701abe65dab4fc295d944885e05ae33") (:keywords "web-mode" "react" "narrow" "web") (:authors ("Qquanwei" . "quanwei9958@126.com")) (:maintainer "Johan Andersson" . "quanwei9958@126.com") (:url . "https://github.com/Qquanwei/web-narrow-mode"))])
- (web-search . [(20190620 602) ((emacs (24 3))) "Open a web search" tar ((:commit . "a22cbdc663a1895d5a5b69de91e1e3b9eb64b92f") (:keywords "web" "search") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/web-search.el"))])
- (web-server . [(20200330 1407) ((emacs (24 3))) "Emacs Web Server" tar ((:commit . "9edf4b5e3c6cea1738acf08241919e00437ec530") (:keywords "http" "server" "network") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:url . "https://github.com/eschulte/emacs-web-server"))])
- (webkit-color-picker . [(20180325 736) ((emacs (26 0)) (posframe (0 1 0))) "Insert and adjust colors using Webkit Widgets" tar ((:commit . "765cac80144cad4bc0bf59025ea0199f0486f737") (:keywords "tools") (:authors ("Ozan Sener" . "hi@ozan.email")) (:maintainer "Ozan Sener" . "hi@ozan.email") (:url . "https://github.com/osener/emacs-webkit-color-picker"))])
- (weblogger . [(20110926 1618) ((xml-rpc (1 6 8))) "Weblog maintenance via XML-RPC APIs" single ((:commit . "b3dd4aead9d3a87e6d85e7fef4f4f3bd40d87b53") (:keywords "weblog" "blogger" "cms" "movable" "type" "openweblog" "blog") (:url . "http://launchpad.net/weblogger-el"))])
- (webpaste . [(20200503 1919) ((emacs (24 4)) (request (0 2 0)) (cl-lib (0 5))) "Paste to pastebin-like services" single ((:commit . "5e963e8ef17e937745b8f3b64f29690290c7a5c0") (:keywords "convenience" "comm" "paste") (:authors ("Elis \"etu\" Hirwing")) (:maintainer "Elis \"etu\" Hirwing") (:url . "https://github.com/etu/webpaste.el"))])
- (websocket . [(20200419 2124) ((cl-lib (0 5))) "Emacs WebSocket client and server" single ((:commit . "be99c4636ad72bcea535392d9097c32b98ec0056") (:keywords "communication" "websocket" "server") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") (:url . "https://github.com/ahyatt/emacs-websocket"))])
- (wedge-ws . [(20140714 2149) nil "Wedge whitespace between columns in text" single ((:commit . "4669115f02d9c6fee067cc5369bb38c0f9db88b2") (:keywords "formatting" "indentation") (:authors ("Anders Eurenius" . "aes@spotify.com")) (:maintainer "Anders Eurenius" . "aes@spotify.com"))])
- (weechat . [(20190520 1551) ((s (1 3 1)) (cl-lib (0 2)) (emacs (24)) (tracking (1 2))) "Chat via WeeChat's relay protocol in Emacs" tar ((:commit . "d9a13306ea8be27367f92e9202d116a88fa1f441"))])
- (weechat-alert . [(20160416 1248) ((weechat (0 3 1)) (cl-lib (0 5)) (alert (1 2))) "Weechat notifier using alerts" single ((:commit . "a8fd557c8f335322f132c1c6c08b6741d6394e2e") (:keywords "irc" "chat" "network" "weechat") (:authors ("Andreas Klein" . "git@kungi.org")) (:maintainer "Andreas Klein" . "git@kungi.org") (:url . "https://github.com/kungi/weechat-alert"))])
- (weibo . [(20150307 2242) ((cl-lib (0 5))) "Weibo client for Emacs" tar ((:commit . "a8abb50b7602fe15fe2bc6400ac29780e956b390") (:keywords "weibo") (:authors ("Austin" . "austiny.cn@gmail.com")) (:maintainer "Austin" . "austiny.cn@gmail.com") (:url . "https://github.com/austin-----/weibo.emacs"))])
- (weyland-yutani-theme . [(20200729 1243) ((emacs (24 1))) "Emacs theme based off Alien movie franchise" single ((:commit . "02c493206c556f9c67c7a602d75b20ce0ba4c6cd") (:authors ("Joe Staursky")) (:maintainer "Joe Staursky") (:url . "https://github.com/jstaursky/weyland-yutani-theme"))])
- (wgrep . [(20200217 1030) nil "Writable grep buffer and apply the changes to files" single ((:commit . "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep.el"))])
- (wgrep-ack . [(20200128 109) ((wgrep (2 1 1))) "Writable ack-and-a-half buffer and apply the changes to files" single ((:commit . "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ack.el"))])
- (wgrep-ag . [(20200217 1028) ((wgrep (2 3 2))) "Writable ag buffer and apply the changes to files" single ((:commit . "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ag.el"))])
- (wgrep-helm . [(20200128 109) ((wgrep (2 1 1))) "Writable helm-grep-mode buffer and apply the changes to files" single ((:commit . "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-helm.el"))])
- (wgrep-pt . [(20200128 109) ((wgrep (2 1 5))) "Writable pt buffer and apply the changes to files" single ((:commit . "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi <mhayashi1120@gmail.com>, Bailey Ling" . "bling@live.ca")) (:maintainer "Masahiro Hayashi <mhayashi1120@gmail.com>, Bailey Ling" . "bling@live.ca") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-pt.el"))])
- (what-the-commit . [(20150901 1316) nil "Random commit message generator" single ((:commit . "868c80a1b8614bcbd2225cd0290142c72f2a7956") (:keywords "git" "commit" "message") (:authors ("Dan Barbarito" . "dan@barbarito.me")) (:maintainer "Dan Barbarito" . "dan@barbarito.me") (:url . "http://barbarito.me/"))])
- (which-key . [(20200721 1927) ((emacs (24 4))) "Display available keybindings in popup" single ((:commit . "3642c11d5ef9be3c6fb9edb8fd5ec3c370abd889") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-which-key"))])
- (which-key-posframe . [(20190427 1103) ((emacs (26 0)) (posframe (0 4 3)) (which-key (3 3 2))) "Using posframe to show which-key" single ((:commit . "e7f28608c7fc9507e407c6b840dff09062df533a") (:keywords "convenience" "bindings" "tooltip") (:authors ("Yanghao Xie")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:url . "https://github.com/yanghaoxie/which-key-posframe"))])
- (whitaker . [(20150814 1122) ((dash (2 10 0))) "Comint interface for Whitaker's Words" single ((:commit . "eaf26ea647b729ca705b73ea70312d5ffdf89448") (:keywords "processes") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))])
- (white-sand-theme . [(20151117 1648) ((emacs (24))) "Emacs theme with a light background." single ((:commit . "97621edd69267dd143760d94393db2c2558c9ea4") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))])
- (white-theme . [(20160917 1743) ((emacs (24))) "Minimalistic light color theme inspired by basic-theme" single ((:commit . "e9e6d5b9d43da6eb15e86f5fbc8b1ba83abe8c78") (:keywords "color" "theme" "minimal" "basic" "simple" "white") (:authors ("Anler Hernandez Peral" . "inbox@anler.me")) (:maintainer "Anler Hernandez Peral" . "inbox@anler.me") (:url . "http://github.com/anler/white-theme.el"))])
- (whitespace-cleanup-mode . [(20200304 2227) ((emacs (24 1))) "Intelligently call whitespace-cleanup on save" single ((:commit . "5fac49636cd72a0043e2473c9a09a788cfd68d5f") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/whitespace-cleanup-mode"))])
- (whizzml-mode . [(20191216 1743) ((emacs (24 4))) "Programming mode for editing WhizzML files" tar ((:commit . "65fa17f8c1dc50dcb90277b64019c2846a317293") (:keywords "languages" "lisp") (:authors ("Jose Antonio Ortega Ruiz" . "jao@bigml.com")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@bigml.com"))])
- (whois . [(20200715 1715) ((emacs (24))) "Syntax highlighted domain name queries using system whois" single ((:commit . "11d01c483ab3ba78b6ea1e195bda65b5e35f2d4c") (:keywords "network" "comm") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-whois"))])
- (whole-line-or-region . [(20200305 221) ((emacs (24 1))) "Operate on current line if region undefined" single ((:commit . "71f84725e2643b2ee74f27c60c4fd8b79c9c3c97") (:keywords "convenience" "wp") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/whole-line-or-region"))])
- (wide-column . [(20170925 1613) nil "Calls functions dependant on column position." single ((:commit . "ce9ef4675485a7bea381077866368ef875226b10") (:keywords "minor mode" "cursor colour" "column width") (:authors ("Phillip Lord" . "p.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "p.lord@russet.org.uk"))])
- (widget-mvc . [(20150102 406) nil "MVC framework for the emacs widgets" single ((:commit . "ff5a85880df7b87f9f480fe3c28438a0712b7b87") (:keywords "lisp" "widget") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>"))])
- (widgetjs . [(20160719 1504) ((makey (0 3)) (js2-mode (20140114)) (js2-refactor (0 6 1)) (s (1 9 0))) "Widgetjs mode" single ((:commit . "1de068d49a6b5faf8754d217bdaa2cbfc903a9fc") (:keywords "help") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))])
- (wiki-nav . [(20200309 1323) ((button-lock (1 0 2)) (nav-flash (1 0 0))) "Simple file navigation using [[WikiStrings]]" single ((:commit . "9afe0f4d05910b0cccc94cb6d4d880119f3b0528") (:keywords "mouse" "button" "hypermedia" "navigation") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/button-lock"))])
- (wiki-summary . [(20181010 1824) ((emacs (24))) "View Wikipedia summaries in Emacs easily." single ((:commit . "fa41ab6e50b3b80e54148af9d4bac18fd0405000") (:keywords "wikipedia" "utility") (:authors ("Danny Gratzer")) (:maintainer "Danny Gratzer") (:url . "https://github.com/jozefg/wiki-summary.el"))])
- (wilt . [(20180220 854) ((emacs (24 3)) (dash (2 12 0)) (s (1 10 0))) "An extensions for calculating WILT in a buffer." single ((:commit . "04dbe37fa35d0b24c791421785d2c97a8cbfe2cc") (:authors ("Austin Bingham" . "austin@sixty-north.com")) (:maintainer "Austin Bingham" . "austin@sixty-north.com") (:url . "https://github.com/sixty-north/emacs-wilt"))])
- (win-switch . [(20161009 1627) nil "fast, dynamic bindings for window-switching/resizing" single ((:commit . "954eb5e4c5737f0c06368c42a7f1c3dd374d782f") (:keywords "window" "switch" "key bindings" "ergonomic" "efficient") (:authors ("Christopher Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu") (:url . "http://www.stat.cmu.edu/~genovese/emacs/win-switch/"))])
- (windata . [(20090830 1040) nil "convert window configuration to list" single ((:commit . "a723fc446ceaec23d5f29ecc8245d94c99d91625") (:keywords "convenience" "frames") (:authors (nil . "wenbinye@gmail.com")) (:maintainer nil . "wenbinye@gmail.com"))])
- (window-end-visible . [(20140508 2041) nil "Find the last visible point in a window" single ((:commit . "525500fb2ebc08f3f9ea493972e5f2e1d79f89ef") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:url . "http://github.com/rolandwalker/window-end-visible"))])
- (window-jump . [(20170809 2208) nil "Move left/right/up/down through your windows." single ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:keywords "frames" "convenience") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:url . "https://github.com/chumpage/chumpy-windows"))])
- (window-layout . [(20170215 33) nil "window layout manager" single ((:commit . "cd2e4f967b610c2bbef53182829e47250d027056") (:keywords "window" "layout") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>"))])
- (window-number . [(20170801 151) nil "Select windows by numbers." single ((:commit . "d41722de646ffeb3f70d26e4a86a5a1ba5c6be87") (:keywords "windows") (:authors ("Johann \"Myrkraverk\" Oskarsson" . "myrkraverk@users.sourceforge.net")) (:maintainer "Nik Nyby" . "niknyby@riseup.net") (:url . "https://github.com/nikolas/window-number"))])
- (window-numbering . [(20160809 1810) nil "Numbered window shortcuts" single ((:commit . "10809b3993a97c7b544240bf5d7ce9b1110a1b89") (:keywords "faces" "matching") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:url . "http://nschum.de/src/emacs/window-numbering-mode/"))])
- (window-purpose . [(20190628 1827) ((emacs (24 4)) (let-alist (1 0 3)) (imenu-list (0 1))) "Purpose-based window management for Emacs" tar ((:commit . "f6421966761ad911fe8861aba2b110c5dd60d1ea") (:keywords "frames") (:authors ("Bar Magal")) (:maintainer "Bar Magal") (:url . "https://github.com/bmag/emacs-purpose"))])
- (winds . [(20200501 419) ((emacs (25 1))) "Window configuration switcher grouped by workspaces" single ((:commit . "720a0cedfdc20940f4c740e74fa0e16983cb0367") (:keywords "convenience") (:authors ("Javier A. Pollak" . "javi.po.123@gmail.com")) (:maintainer "Javier A. Pollak" . "javi.po.123@gmail.com") (:url . "https://github.com/Javyre/winds.el"))])
- (windsize . [(20181029 2257) nil "Simple, intuitive window resizing" single ((:commit . "62c2846bbe95b0a73e996c75e4a644d05f57aaaa") (:keywords "window" "resizing" "convenience") (:authors ("Chris Perkins" . "chrisperkins99@gmail.com")) (:maintainer "Chris Perkins" . "chrisperkins99@gmail.com") (:url . "http://github.com/grammati/windsize"))])
- (windswap . [(20200722 411) ((emacs (24 3))) "Like windmove, but swaps buffers while moving point" single ((:commit . "1a334f6543e0a30c55ea1e6071e9732d948f9e4b") (:keywords "frames" "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/windswap"))])
- (windwow . [(20170816 148) ((dash (2 11 0)) (cl-lib (0 6 1)) (emacs (24))) "simple workspace management" single ((:commit . "77bad26f651744b68d31b389389147014d250f23") (:keywords "frames") (:authors ("Viju Mathew" . "viju.jm@gmail.com")) (:maintainer "Viju Mathew" . "viju.jm@gmail.com") (:url . "github.com/vijumathew/windwow"))])
- (winnow . [(20170903 1206) ((emacs (24))) "winnow ag/grep results by matching/excluding lines" single ((:commit . "18cb6b94338f3b7b4f2cd0331dad22f82dd9e0d3") (:keywords "matching") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:url . "https://github.com/dgtized/winnow.el"))])
- (winpoint . [(20131023 1713) nil "Remember buffer positions per-window, not per buffer" single ((:commit . "e6050093c076308184566fa1d1012423d6934773") (:keywords "convenience") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/jorgenschaefer/winpoint"))])
- (winring . [(20180530 18) nil "Window configuration rings" single ((:commit . "f2d072bd446b73e93b127523f19ea82b99b9267f") (:keywords "frames" "tools") (:authors ("1997-2018 Barry A. Warsaw")) (:maintainer "1997-2018 Barry A. Warsaw") (:url . "https://gitlab.com/warsaw/winring"))])
- (winum . [(20190911 1607) ((cl-lib (0 5)) (dash (2 13 0))) "Navigate windows and frames using numbers." single ((:commit . "c5455e866e8a5f7eab6a7263e2057aff5f1118b9") (:keywords "convenience" "frames" "windows" "multi-screen") (:authors ("Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com")) (:maintainer "Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com") (:url . "http://github.com/deb0ch/winum.el"))])
- (wispjs-mode . [(20170720 1919) ((clojure-mode (0))) "Major mode for Wisp code." single ((:commit . "60f9f5fd9d1556e2d008939f67eb1b1d0f325fa8") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/wispjs-mode"))])
- (with-editor . [(20200720 2014) ((emacs (24 4)) (async (1 9))) "Use the Emacsclient as $EDITOR" tar ((:commit . "efafd482c21b90decbb0b682ed3159c86014d4f3") (:keywords "tools") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/with-editor"))])
- (with-emacs . [(20200210 1543) ((emacs (24 4))) "Evaluate Emacs Lisp expressions in a separate Emacs process" single ((:commit . "9f99bec56f87e53deb9f33b364eda77677a17eb9") (:keywords "tools") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:url . "https://github.com/twlz0ne/with-emacs.el"))])
- (with-namespace . [(20130407 1822) ((dash (1 1 0)) (loop (1 1))) "interoperable elisp namespaces" single ((:commit . "8ac52da3a09cf46087720e30cf730d00f140cde6") (:keywords "namespaces") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
- (with-proxy . [(20200510 414) ((emacs (24 4))) "Evaluate expressions with proxy" single ((:commit . "93b1ed2f3060f305009fa71f4fb5bb10173a10e3") (:keywords "comm") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:url . "https://github.com/twlz0ne/with-proxy.el"))])
- (with-shell-interpreter . [(20200527 828) ((emacs (25 1)) (cl-lib (0 6 1))) "Helper for shell command APIs" single ((:commit . "f8a01beda6260bd2eff3f9fe154ddc16da7b6504") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/with-shell-interpreter"))])
- (with-simulated-input . [(20200509 2010) ((emacs (24 4))) "A macro to simulate user input non-interactively" single ((:commit . "0d5e910f19657ab376f72e5848be50d13d3b8e50") (:keywords "lisp" "tools" "extensions") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:url . "https://github.com/DarwinAwardWinner/with-simulated-input"))])
- (with-venv . [(20200125 1620) ((cl-lib (0 5)) (emacs (24 4))) "Execute with Python virtual environment activated" single ((:commit . "51ba19ac75a2796d494587b3b20ce51d4eb178a5") (:keywords "processes" "python" "venv") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:url . "https://github.com/10sr/with-venv-el"))])
- (wn-mode . [(20151110 552) ((emacs (24))) "numeric window switching shortcuts" single ((:commit . "f05c3151523e529af5a0a3fa8c948b61fb369f6e") (:keywords "buffers" "windows" "switching-windows") (:authors ("Anonymous")) (:maintainer "Luís Oliveira" . "luismbo@gmail.com") (:url . "https://github.com/luismbo/wn-mode"))])
- (wolfram . [(20190805 1007) nil "Wolfram Alpha Integration" single ((:commit . "a172712d5045834f5434cca2843a7c3506805db8") (:keywords "math") (:authors ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainer "Hans Sjunnesson" . "hans.sjunnesson@gmail.com"))])
- (wolfram-mode . [(20180307 13) ((emacs (24 3))) "Mathematica editing and inferior mode." single ((:commit . "be680190cac6ccf579dbce107deaae495928d1b3") (:keywords "languages" "processes" "tools") (:authors ("Daichi Mochihashi <daichi at cslab.kecl.ntt.co.jp>")) (:maintainer "Daichi Mochihashi <daichi at cslab.kecl.ntt.co.jp>") (:url . "https://github.com/kawabata/wolfram-mode/"))])
- (wonderland . [(20130913 119) ((dash (2 0 0)) (dash-functional (1 0 0)) (multi (2 0 0)) (emacs (24))) "declarative configuration for Emacsen" single ((:commit . "89d274ad694b0e748efdac23ccd60b7d8b73d7c6") (:keywords "configuration" "profile" "wonderland") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com") (:url . "http://github.com/kurisuwhyte/emacs-wonderland"))])
- (wordgen . [(20170803 1820) ((emacs (24)) (cl-lib (0 5))) "Random word generator" single ((:commit . "aacad928ae99a953e034a831dfd0ebdf7d52ac1d") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/wordgen.el"))])
- (wordnut . [(20180313 443) ((emacs (24 4))) "Major mode interface to WordNet" tar ((:commit . "feac531404041855312c1a046bde7ea18c674915"))])
- (wordsmith-mode . [(20171025 1430) nil "Syntax analysis and NLP text-processing in Emacs (OSX-only)" single ((:commit . "589a97412138145bea70e0450eeddeb7f138d538") (:authors ("istib" . "istib@thebati.net")) (:maintainer "istib" . "istib@thebati.net"))])
- (worf . [(20200121 1629) ((swiper (0 11 0)) (ace-link (0 1 0)) (hydra (0 13 0)) (zoutline (0 1 0))) "A warrior does not press so many keys! (in org-mode)" tar ((:commit . "bdc8240ff4188c7403a020eb58dc10eea104b7df") (:keywords "lisp") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/worf"))])
- (workgroups . [(20110726 1641) nil "workgroups for windows (for Emacs)" single ((:commit . "9572b3492ee09054dc329f64ed846c962b395e39") (:keywords "session" "management" "window-configuration" "persistence") (:authors ("tlh" . "thunkout@gmail.com")) (:maintainer "tlh" . "thunkout@gmail.com"))])
- (workgroups2 . [(20200729 852) ((emacs (25 1)) (dash (2 8 0))) "New workspaces for Emacs" single ((:commit . "737306531f6834227eee2f63b197a23401003d23") (:keywords "session" "management" "window-configuration" "persistence") (:authors ("Sergey Pashinin <sergey at pashinin dot com>")) (:maintainer "Sergey Pashinin <sergey at pashinin dot com>") (:url . "https://github.com/pashinin/workgroups2"))])
- (world-time-mode . [(20140627 807) nil "show whole days of world-time diffs" single ((:commit . "ce7a3b45c87eb24cfe61eee453175d64f741d7cc") (:keywords "tools" "calendar") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
- (wotd . [(20170328 1948) ((emacs (24 4)) (org (8 2 10))) "Fetch word-of-the-day from multiple online sources" single ((:commit . "d2937a3d91e014f8028a1f33d21c18cc0b065a64") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))])
- (wrap-region . [(20140117 720) ((dash (1 0 3))) "Wrap text with punctation or tag" single ((:commit . "fbae9b0f106187af19823f1a6260b5c68b7252e6") (:keywords "speed" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/wrap-region"))])
- (writefreely . [(20190628 1606) ((emacs (24 3)) (org (9 0)) (ox-gfm (0 0)) (request (0 3))) "Push your Org files as markdown to a writefreely instance" single ((:commit . "83a487e48e0d8342c372deb74d04c0b43474268c") (:keywords "convenience") (:authors ("Daniel Gomez <d.gomez at posteo dot org>")) (:maintainer "Daniel Gomez <d.gomez at posteo dot org>") (:url . "https://github.com/dangom/writefreely.el"))])
- (writegood-mode . [(20180525 1343) nil "Polish up poor writing on the fly" single ((:commit . "b71757ec337e226909fb0422f0224e31acc71733") (:keywords "writing" "weasel-words" "grammar") (:authors ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "http://github.com/bnbeckwith/writegood-mode"))])
- (writeroom-mode . [(20200519 37) ((emacs (24 1)) (visual-fill-column (1 9))) "Minor mode for distraction-free writing" tar ((:commit . "8a226a31a12a9203067094774ba6fd6175793e70") (:keywords "text") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://github.com/joostkremers/writeroom-mode"))])
- (ws-butler . [(20170111 2334) nil "Unobtrusively remove trailing whitespace." single ((:commit . "52321b99be69aa1b661da7743c4421a30d8b6bcb") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/ws-butler"))])
- (wsd-mode . [(20191031 1211) nil "Emacs major-mode for www.websequencediagrams.com" tar ((:commit . "b87dee6d2d21fc868a3fae35bbd3f08910ad57e0") (:keywords "wsd" "diagrams" "design" "process" "modelling" "uml") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:url . "https://github.com/josteink/wsd-mode"))])
- (wttrin . [(20170614 1206) ((emacs (24 4)) (xterm-color (1 0))) "Emacs frontend for weather web service wttr.in" single ((:commit . "df5427ce2a5ad4dab652dbb1c4a1834d7ddc2abc") (:keywords "comm" "weather" "wttrin") (:authors ("Carl X. Su" . "bcbcarl@gmail.com") ("ono hiroko (kuanyui)" . "azazabc123@gmail.com")) (:maintainer "Carl X. Su" . "bcbcarl@gmail.com") (:url . "https://github.com/bcbcarl/emacs-wttrin"))])
- (wucuo . [(20200710 932) ((emacs (25 1))) "Fastest solution to spell check camel case code or plain text" single ((:commit . "54143769dbea06d34792687eadbc6c7a1cd89ea2") (:keywords "convenience") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:url . "http://github.com/redguardtoo/wucuo"))])
- (wwtime . [(20151122 1610) nil "Insert a time of day with appropriate world-wide localization" single ((:commit . "d04d8fa814b5d3644efaeb28f25520ada69acbbd") (:keywords "time") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com"))])
- (www-synonyms . [(20170128 2251) ((request (0 2 0)) (cl-lib (0 5))) "insert synonym for a word" single ((:commit . "7e37ea35064ff31c9945f0198a653647d408c936") (:keywords "lisp") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net"))])
- (x-path-walker . [(20160922 1835) ((helm-core (1 9 2))) "Navigation feature for JSON/XML/HTML based on path (imenu like)" tar ((:commit . "3b01dbd7a039c6c84fdf8c8ee53ba72090ee950a") (:keywords "convenience") (:authors (nil . "<lompik@ArchOrion>")) (:maintainer nil . "<lompik@ArchOrion>"))])
- (x509-mode . [(20180921 803) ((emacs (24 1)) (cl-lib (0 5))) "View certificates, CRLs and keys using OpenSSL." tar ((:commit . "9eb24c8721dcad9888b70213d06d770bc2386db7") (:authors ("Fredrik Axelsson" . "f.axelsson@gmai.com") ("Package-Requires: ((emacs \"24.1\") (cl-lib \"0.5\"))")) (:maintainer "Fredrik Axelsson" . "f.axelsson@gmai.com"))])
- (x86-lookup . [(20180528 1635) ((emacs (24 3)) (cl-lib (0 3))) "jump to x86 instruction documentation" single ((:commit . "609b2ba70dc5a246ac9b4b5f89eb5ef4331519bf") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/x86-lookup"))])
- (xah-css-mode . [(20200627 1652) ((emacs (24 3))) "Major mode for editing CSS code." single ((:commit . "98e550db52865d6de141d5bbb85f8b4e68b56b39") (:keywords "languages" "convenience" "css" "color") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/xah-css-mode.html"))])
- (xah-elisp-mode . [(20200719 1648) ((emacs (24 3))) "Major mode for editing emacs lisp." single ((:commit . "a051862622c56b7cad2057a95d8201ab38b50752") (:keywords "lisp" "languages") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/xah-elisp-mode.html"))])
- (xah-find . [(20190314 2039) ((emacs (24 1))) "find replace in pure emacs lisp. Purpose similar to grep/sed." single ((:commit . "a39f1ff9a7cf56e92b56c6f179741569b9172a48") (:keywords "convenience" "extensions" "files" "tools" "unix") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/elisp-xah-find-text.html"))])
- (xah-fly-keys . [(20200707 1310) ((emacs (24 1))) "ergonomic modal keybinding minor mode." single ((:commit . "8c9c4df25e1406b093a32c87da19803337e4e09c") (:keywords "convenience" "emulations" "vim" "ergoemacs") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/misc/ergoemacs_vi_mode.html"))])
- (xah-get-thing . [(20170821 1053) ((emacs (24 1))) "get thing or selection at point." single ((:commit . "e3ef069ea9fea3a092689d45c94c6211b51d0ea4") (:keywords "extensions" "lisp" "tools") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/elisp_get-selection-or-unit.html"))])
- (xah-lookup . [(20200420 1528) ((emacs (24 1))) "look up word on internet." single ((:commit . "c97a43dc0cebbfc519d0cce5b547dcc5e22b2085") (:keywords "help" "docs" "convenience") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/xah-lookup.html"))])
- (xah-math-input . [(20200217 740) ((emacs (24 1))) "a minor mode for inputting math and Unicode symbols." single ((:commit . "c1e72c4578a134e9aa3ec9ef425038d8c16fba94") (:keywords "abbrev" "convenience" "unicode" "math" "latex") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/xmsi-math-symbols-input.html"))])
- (xah-reformat-code . [(20170821 1111) nil "commands to reformat source code." single ((:commit . "7fec8b28e46b8cc2813fac5149e3bbb56c0aa6b1") (:keywords "convenience") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/emacs_reformat_lines.html"))])
- (xah-replace-pairs . [(20180508 249) ((emacs (24 1))) "emacs lisp functions for multi-pair find/replace." single ((:commit . "4d845cfbce32d45befd7c454e3476c3ce40d2b43") (:keywords "lisp" "tools" "find replace") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://ergoemacs.org/emacs/elisp_replace_string_region.html"))])
- (xahk-mode . [(20170821 1107) ((emacs (24 1))) "Major mode for editing AutoHotkey scripts." single ((:commit . "02012b20603c00e3b2ef32159a690ed1e05d12c3") (:keywords "languages") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:url . "http://xahlee.info/mswin/emacs_autohotkey_mode.html"))])
- (xbm-life . [(20200506 1217) nil "A XBM version of Conway's Game of Life" single ((:commit . "311ef62438c4ab057c054fcdda4dbfa5980759b5") (:keywords "games") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/xbm-life"))])
- (xcode-mode . [(20160907 1208) ((emacs (24 4)) (s (1 10 0)) (dash (2 11 0)) (multiple-cursors (1 0 0))) "A minor mode for emacs to perform Xcode like actions." single ((:commit . "2ae4f512d6c601ea39d5ab785c2b5288eac24b59") (:keywords "conveniences") (:authors ("Nickolas Lanasa" . "nick@nytekproductions.com")) (:maintainer "Nickolas Lanasa" . "nick@nytekproductions.com"))])
- (xcode-project . [(20181025 1244) ((emacs (25))) "A package for reading Xcode project files." tar ((:commit . "0bf9a4230fab7830350c750c39beda99ef74d72f") (:keywords "languages" "tools") (:authors ("John Buckley" . "john@olivetoast.com")) (:maintainer "John Buckley" . "john@olivetoast.com") (:url . "https://github.com/nhojb/xcode-project.git"))])
- (xcscope . [(20190723 629) nil "cscope interface for (X)Emacs" single ((:commit . "f3e2c84bd92f5a78182cc8d81f5358979a6c241c") (:keywords "languages" "c") (:authors ("Darryl Okahata" . "darrylo@sonic.net") ("Dima Kogan" . "dima@secretsauce.net")) (:maintainer "Dima Kogan" . "dima@secretsauce.net") (:url . "https://github.com/dkogan/xcscope.el"))])
- (xenops . [(20200730 1646) ((emacs (26 1)) (aio (1 0)) (auctex (12 2 0)) (avy (0 5 0)) (dash (2 17 0)) (dash-functional (1 2 0)) (f (0 20 0)) (s (1 12 0))) "A LaTeX editing environment for mathematical documents" tar ((:commit . "78cbe16b74480ac6304865c9c3cfad36b5d49d1d") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/xenops"))])
- (xkcd . [(20160419 1130) ((json (1 3))) "View xkcd from Emacs" single ((:commit . "66e928706fd660cfdab204c98a347b49c4267bdf") (:keywords "xkcd" "webcomic") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:url . "https://github.com/vibhavp/emacs-xkcd"))])
- (xml+ . [(20170727 2351) ((emacs (24 4)) (dash (2 12 0))) "Utilities for xml and html trees" single ((:commit . "232fa863c08fc159b21dd58c39ea45dce3334895") (:keywords "xml" "html") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com") (:url . "https://github.com/bddean/xml-plus"))])
- (xml-format . [(20191011 1148) ((emacs (25)) (reformatter (0 4))) "XML reformatter using xmllint" single ((:commit . "2861c4e33e18b077112efa072316b031bca4236c") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:url . "https://github.com/wbolster/emacs-xml-format"))])
- (xml-quotes . [(20200301 1222) nil "read quotations from an XML document" tar ((:commit . "8fc21e43b45f9a50b24642412f05afcc3a316a1f") (:keywords "xml" "quotations") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:url . "https://github.com/ndw/xml-quotes"))])
- (xml-rpc . [(20181002 1353) nil "An elisp implementation of clientside XML-RPC" single ((:commit . "8f624f8b964e9145acb504e4457c9510e87dd93c") (:keywords "xml" "rpc" "network") (:authors ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:url . "http://github.com/hexmode/xml-rpc-el"))])
- (xmlgen . [(20170411 1317) nil "A DSL for generating XML." single ((:commit . "dba66681f0c5e621a9e70e8afb34903c9ffe93c4") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))])
- (xmlunicode . [(20191124 2312) nil "Unicode support for XML" tar ((:commit . "80f30becf860db4277e71e3445994fccaf35ba98") (:keywords "utf-8" "unicode" "xml" "characters") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com"))])
- (xo . [(20160403 646) nil "XO linter integration with compilation mode" single ((:commit . "72fcd867cfa332fdb82f732925cf8977e690af78") (:keywords "processes") (:authors ("J.A" . "jer.github@gmail.com")) (:maintainer "J.A" . "jer.github@gmail.com"))])
- (xonsh-mode . [(20191214 114) ((emacs (24 3))) "Major mode for editing xonshrc files" single ((:commit . "01819823822b6ebe01c02af548276cb2deb343f4") (:keywords "languages") (:authors ("Sean Farley" . "sean@farley.io")) (:maintainer "Sean Farley" . "sean@farley.io") (:url . "https://github.com/seanfarley/xonsh-mode"))])
- (xquery-mode . [(20170214 1119) ((cl-lib (0 5))) "A simple mode for editing xquery programs" single ((:commit . "1b655ccf83d02a7bd473d2cf02359ed60bdf7369") (:url . "https://github.com/xquery-mode/xquery-mode"))])
- (xquery-tool . [(20190523 1119) nil "A simple interface to saxonb's xquery." single ((:commit . "7f0859cc722607240689e57e14de8e0719052016") (:keywords "xml" "xquery" "emacs") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:url . "https://github.com/paddymcall/xquery-tool.el"))])
- (xref-js2 . [(20190915 2032) ((emacs (25)) (js2-mode (20150909))) "Jump to references/definitions using ag & js2-mode's AST" single ((:commit . "6f1ed5dae0c2485416196a51f2fa92f32e4b8262") (:keywords "javascript" "convenience" "tools") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://github.com/NicolasPetton/xref-js2"))])
- (xresources-theme . [(20190108 1851) nil "Use your .Xresources as your emacs theme" single ((:commit . "5239acb51aa2dfa89a207e57012108d8fcf60562") (:keywords "xresources" "theme") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com"))])
- (xterm-color . [(20200605 2017) ((emacs (24 4))) "ANSI, XTERM 256 and Truecolor support" single ((:commit . "b9b1f84fb10fff5261702e38bf15b3ae75a4b6bb") (:keywords "faces") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:url . "https://github.com/atomontage/xterm-color"))])
- (xterm-keybinder . [(20160523 56) ((emacs (24 3)) (cl-lib (0 5)) (let-alist (1 0 1))) "Let you extra keybinds in xterm/urxvt" tar ((:commit . "b29c4f700b0fa0c9f627f6725b36462b8fab06d6") (:keywords "convenient") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>"))])
- (xtest . [(20141214 1706) ((cl-lib (0 5))) "Simple Testing with Emacs & ERT" single ((:commit . "2c2bdf32667506dd9ddf6eb311832add616bdf1c") (:keywords "testing" "ert") (:authors ("Mustafa Shameem")) (:maintainer "Mustafa Shameem") (:url . "https://github.com/promethial/xtest"))])
- (xwidgete . [(20171118 2116) ((emacs (25))) "enhances usability of current xwidget browser" single ((:commit . "e4e8410fe32176df85b46234717824519443fb04") (:keywords "xwidgete" "tools") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:url . "https://github.com/tuhdo/xwidgete"))])
- (xwwp . [(20200413 757) ((emacs (26 1))) "Enhance xwidget webkit browser" tar ((:commit . "dcf6f9430dd9745e5f2705c0f42e013fab961c0e") (:keywords "convenience") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:url . "https://github.com/canatella/xwwp"))])
- (xwwp-follow-link-helm . [(20200331 800) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `helm'" single ((:commit . "dcf6f9430dd9745e5f2705c0f42e013fab961c0e") (:keywords "convenience") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:url . "https://github.com/canatella/xwwp"))])
- (xwwp-follow-link-ivy . [(20200331 800) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `ivy'" single ((:commit . "dcf6f9430dd9745e5f2705c0f42e013fab961c0e") (:keywords "convenience") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:url . "https://github.com/canatella/xwwp"))])
- (yabin . [(20140206 351) nil "Yet Another Bignum package (A thin wrapper of calc.el)." single ((:commit . "db8c404507560ef9147fcce2b94cd706fbfa03b5") (:keywords "data") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com"))])
- (yafolding . [(20200119 1353) nil "Folding code blocks based on indentation" single ((:commit . "4c1888ae45f9241516519ae0ae3a899f2efa05ba") (:keywords "folding") (:authors ("Zeno Zeng" . "zenoofzeng@gmail.com")) (:maintainer "Zeno Zeng" . "zenoofzeng@gmail.com"))])
- (yagist . [(20160418 508) ((cl-lib (0 3))) "Yet Another Emacs integration for gist.github.com" single ((:commit . "dcdbd84f348414815d02f3da8a6ee0ac271632d4") (:keywords "tools") (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:url . "https://github.com/mhayashi1120/yagist.el"))])
- (yahtzee . [(20200511 2005) ((emacs (24 3))) "The yahtzee game" single ((:commit . "63b9b698fbb547603c3f66932c6d3e3bb217c443") (:keywords "games") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com") (:url . "https://github.com/drdv/yahtzee"))])
- (yalinum . [(20130217 1043) nil "yet another display line numbers." single ((:commit . "d3e0cbe3f4f5ca311e3298e684901d6fea3ad973") (:keywords "convenience" "tools") (:authors ("tm8st" . "tm8st@hotmail.co.jp")) (:maintainer "tm8st" . "tm8st@hotmail.co.jp"))])
- (yaml-imenu . [(20181001 627) ((emacs (24 4)) (yaml-mode (0))) "Enhancement of the imenu support in yaml-mode." tar ((:commit . "78a383098807014d9e7f2941196d8271677158cd") (:keywords "outlining" "convenience" "imenu") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:url . "https://github.com/knu/yaml-imenu.el"))])
- (yaml-mode . [(20200725 1836) ((emacs (24 1))) "Major mode for editing YAML files" single ((:commit . "68fecb5f0dec712a10c8655df6881392a4613617") (:keywords "data" "yaml") (:authors ("Yoshiki Kurihara" . "clouder@gmail.com") ("Marshall T. Vandegrift" . "llasram@gmail.com")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))])
- (yaml-tomato . [(20151123 753) ((s (1 9))) "copy or show the yaml path currently under cursor." single ((:commit . "f9df1c9bdfcec629b03031b2d2032f9dc533cb14") (:keywords "yaml") (:authors ("qrczeno")) (:maintainer "qrczeno"))])
- (yandex-weather . [(20160311 2037) nil "Fetch Yandex Weather forecasts." tar ((:commit . "6f823fd9e04ff9efb2aa65f333079e9f7e6e5b28"))])
- (yang-mode . [(20190507 724) nil "major mode for editing YANG files" single ((:commit . "4b4ab4d4a79d37d6c31c6ea7cccbc425e0b1eded") (:authors ("Martin Bjorklund" . "mbj4668@gmail.com")) (:maintainer "Martin Bjorklund" . "mbj4668@gmail.com"))])
- (yankpad . [(20200409 1747) ((emacs (25))) "Paste snippets from an org-mode file" single ((:commit . "acfccf3633d7fd3b91d717fda4ae98e8e3345a06") (:keywords "abbrev" "convenience") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:url . "http://github.com/Kungsgeten/yankpad"))])
- (yapfify . [(20200406 830) nil "(automatically) format python buffers using YAPF." single ((:commit . "3df4e8ce65f55fd69479b3417525ce83a2b00b45") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl") (:url . "https://github.com/JorisE/yapfify"))])
- (yara-mode . [(20190423 710) ((emacs (24))) "Major mode for editing yara rule file" single ((:commit . "cd8093b1bc4fc260462f5284b157008fefa84880") (:keywords "yara") (:authors (nil . "binjo.cn@gmail.com")) (:maintainer nil . "binjo.cn@gmail.com") (:url . "not distributed yet"))])
- (yard-mode . [(20170817 1237) nil "Minor mode for Ruby YARD comments" single ((:commit . "ba74a47463b0320ae152bd42a7dd7aeecd7b5748") (:authors ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/yard-mode.el"))])
- (yari . [(20151128 739) nil "Yet Another RI interface for Emacs" single ((:commit . "a2cb9656ee5dfe1fc2ee3854f3079a1c8e85dbe9") (:keywords "tools") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))])
- (yarn-mode . [(20200208 2332) ((emacs (24 3))) "Major mode for yarn.lock files." single ((:commit . "8239d4dc7d8a52fa1e3fa81bd32c904a359fcfc1") (:keywords "convenience") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com") (:url . "https://github.com/anachronic/yarn-mode"))])
- (yascroll . [(20200701 336) ((emacs (26 1)) (cl-lib (0 3))) "Yet Another Scroll Bar Mode" single ((:commit . "9e828920d1931da66a473a66019922b9c3b729f5") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:url . "https://github.com/emacsorphanage/yascroll"))])
- (yasnippet . [(20200604 246) ((cl-lib (0 5))) "Yet another snippet extension for Emacs" single ((:commit . "5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6") (:keywords "convenience" "emulation") (:maintainer "Noam Postavsky" . "npostavs@gmail.com") (:url . "http://github.com/joaotavora/yasnippet"))])
- (yasnippet-lean . [(20200526 326) ((yasnippet (0 8 0))) "Collection of snippets for the Lean prover" tar ((:commit . "e0933f55d59da5425d0604bdcdbbf3cb85967563") (:keywords "convenience" "snippets" "leanprover") (:maintainer "Simon Hudon" . "simon.hudon@gmail.com") (:url . "https://github.com/leanprover-community/yasnippet-lean"))])
- (yasnippet-snippets . [(20200606 1149) ((yasnippet (0 8 0)) (s (1 12 0))) "Collection of yasnippet snippets" tar ((:commit . "d5ef8ed2b34798c1576f2fbfed858ee5486d1792") (:keywords "snippets") (:authors ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainer "Andrea Crotti" . "andrea.crotti.0@gmail.com"))])
- (yatemplate . [(20200625 1336) ((yasnippet (0 8 1)) (emacs (24 3))) "File templates with yasnippet" single ((:commit . "23865adaee824db44acec8a4366ce2f29dd2e978") (:keywords "files" "convenience") (:authors ("Wieland Hoffmann" . "themineo+yatemplate@gmail.com")) (:maintainer "Wieland Hoffmann" . "themineo+yatemplate@gmail.com") (:url . "https://github.com/mineo/yatemplate"))])
- (yatex . [(20200208 931) nil "Yet Another tex-mode for emacs //野鳥//" tar ((:commit . "f4c2dca86202c2da5b4f0f6ec97c49dd1cb01e6c"))])
- (yaxception . [(20150105 1452) nil "Provide framework about exception like Java for Elisp" single ((:commit . "4e94cf3e0b9b5631b0e90eb4b7de597ee7185875") (:keywords "exception" "error" "signal") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:url . "https://github.com/aki2o/yaxception"))])
- (ycm . [(20150822 1836) nil "Emacs client for the YouCompleteMe auto-completion server." single ((:commit . "4da8a14abcd0f4fa3235042ade2e12b5068c0601") (:keywords "c" "abbrev") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net"))])
- (ycmd . [(20190416 807) ((emacs (24 4)) (dash (2 13 0)) (s (1 11 0)) (deferred (0 5 1)) (cl-lib (0 6 1)) (let-alist (1 0 5)) (request (0 3 0)) (request-deferred (0 3 0)) (pkg-info (0 6))) "emacs bindings to the ycmd completion server" tar ((:commit . "bc81b992f79100c98f56b7b83caf64cb8ea60477") (:url . "https://github.com/abingham/emacs-ycmd"))])
- (ydk-mode . [(20170113 921) nil "Language support for Yu-Gi-Oh! deck files" single ((:commit . "f3f125b29408e0b0a34fec27dcb7c02c5dbfd04e") (:keywords "faces" "games" "languages" "ydk" "yugioh" "yu-gi-oh") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") (:url . "https://github.com/jacksonrayhamilton/ydk-mode"))])
- (yequake . [(20200219 2323) ((emacs (25 2)) (dash (2 14 1))) "Drop-down frames, like Yakuake" single ((:commit . "d18166e597414350117d0b82a29e509fc53c636d") (:keywords "convenience" "window-system" "frames") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "http://github.com/alphapapa/yequake"))])
- (yesql-ghosts . [(20150220 1237) ((s (1 9 0)) (dash (2 10 0)) (cider (0 8 0))) "Display ghostly yesql defqueries inline" single ((:commit . "8f1faf0137b85a5072d13e1240a463d9a35ce2bb") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))])
- (yesterbox . [(20200327 52) ((emacs (24 3))) "Count number of inbox messages by day" single ((:commit . "10591342f1759e25756f5865371a53c132d8b0a0") (:keywords "mail") (:authors ("Stephen J. Eglen" . "sje30@cam.ac.uk")) (:maintainer "Stephen J. Eglen" . "sje30@cam.ac.uk") (:url . "http://github.com/sje30/yesterbox"))])
- (ynab . [(20200607 2008) ((emacs (26 3)) (cl-lib (0 5)) (ts (0 2))) "Major mode for YNAB (you need a budget)" single ((:commit . "2c6beb4d2c4996017f6b3c62c26db52a61e5c479") (:keywords "ynab" "budget" "convenience") (:authors ("Jim Anders <https://github.com/janders223>")) (:maintainer "Jim Anders" . "jimanders223@gmail.com") (:url . "https://github.com/janders223/ynab.el"))])
- (yoficator . [(20190509 1620) nil "Interactively yoficate Russian texts" tar ((:commit . "fa914f9648515bca54b5e558ca57d2b65fa57491") (:authors ("Eugene Minkovskii" . "emin@mccme.ru") ("Alexander Krotov" . "ilabdsf@gmail.com")) (:maintainer "Eugene Minkovskii" . "emin@mccme.ru") (:url . "https://gitlab.com/link2xt/yoficator"))])
- (yoshi-theme . [(20200422 208) nil "Theme named after my cat" single ((:commit . "caa83e4475885a2c9a126630f0feec1ce2eb0c4e") (:keywords "faces") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:url . "http://projects.ryuslash.org/yoshi-theme/"))])
- (youdao-dictionary . [(20200722 1705) ((popup (0 5 0)) (pos-tip (0 4 6)) (chinese-word-at-point (0 2)) (names (0 5)) (emacs (24))) "Youdao Dictionary interface for Emacs" single ((:commit . "8a4815a43565b9bfd257246e4895b8bfafb9d573") (:keywords "convenience" "chinese" "dictionary") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/youdao-dictionary.el"))])
- (ytdl . [(20200727 1824) ((emacs (26 1)) (async (1 9 4)) (transient (0 2 0)) (dash (2 17 0))) "Emacs Interface for youtube-dl" single ((:commit . "2d617ed1cc0be35158411f897e4156c20ff6565f") (:keywords "comm" "emulations" "multimedia") (:authors ("Arnaud Hoffmann" . "tuedachu@gmail.com")) (:maintainer "Arnaud Hoffmann" . "tuedachu@gmail.com") (:url . "https://gitlab.com/tuedachu/ytdl"))])
- (ytel . [(20200725 1056) ((emacs (25 3))) "Query YouTube via Invidious" single ((:commit . "d80c7964ec66589d5580fc13773e94f1834ab76f") (:keywords "youtube" "matching" "multimedia") (:authors ("Gabriele Rastello")) (:maintainer "Gabriele Rastello") (:url . "https://github.com/grastello/ytel"))])
- (z3-mode . [(20151120 2255) ((flycheck (0 23)) (emacs (24))) "A z3/SMTLIBv2 interactive development environment" single ((:commit . "163dc01d59e9880b4dc188d4e1ad84d6c0c852e1") (:keywords "z3" "yices" "mathsat" "smt" "beaver") (:authors ("Zephyr Pellerin" . "zephyr.pellerin@gmail.com")) (:maintainer "Zephyr Pellerin" . "zephyr.pellerin@gmail.com") (:url . "https://github.com/zv/z3-mode"))])
- (zeal-at-point . [(20180131 2354) nil "Search the word at point with Zeal" single ((:commit . "0fc3263f44e95acd3e9d91057677621ce4d297ee") (:authors ("Jinzhu" . "wosmvp@gmail.com")) (:maintainer "Jinzhu" . "wosmvp@gmail.com") (:url . "https://github.com/jinzhu/zeal-at-point"))])
- (zel . [(20171014 832) ((emacs (25)) (frecency (0 1))) "Access frecent files easily" single ((:commit . "9dae2d212224d1deae1f62561fa8e4d689fd09f2") (:keywords "convenience" "files" "matching") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com") (:url . "https://github.com/rudolfochrist/zel"))])
- (zen-and-art-theme . [(20120622 1437) nil "zen and art color theme for GNU Emacs 24" single ((:commit . "a7226cbce0bca2501d69a620cb2aeabfc396c232") (:authors ("Nick Parker")) (:maintainer "Nick Parker"))])
- (zen-mode . [(20200609 822) ((emacs (24 3))) "A major mode for the Zen programming language" single ((:commit . "c1b1806358f3cce6c04b30699987d82dc7d42559") (:keywords "zen" "languages") (:authors ("Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley <superjoe30@gmail.com>, kristopher tate <kt@connectfree.co.jp>, Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp")) (:maintainer "Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley <superjoe30@gmail.com>, kristopher tate <kt@connectfree.co.jp>, Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp") (:url . "https://github.com/zenlang/zen-mode"))])
- (zenburn-theme . [(20200701 1333) nil "A low contrast color theme for Emacs." single ((:commit . "c09dbd9a36bbc0062b90be182f2b4cac64128cee") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://github.com/bbatsov/zenburn-emacs"))])
- (zencoding-mode . [(20140213 822) nil "Unfold CSS-selector-like expressions to markup" single ((:commit . "58e42af182c98cb9941d27cd042d227fbf4e146c") (:keywords "convenience") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/rooney/zencoding"))])
- (zenity-color-picker . [(20160302 1154) ((emacs (24 4))) "Insert and adjust colors using Zenity" single ((:commit . "4f4f46676a461ebc881487fb70c8c181e323db5e") (:keywords "colors") (:authors ("Samuel Laurén" . "samuel.lauren@iki.fi")) (:maintainer "Samuel Laurén" . "samuel.lauren@iki.fi") (:url . "https://bitbucket.org/Soft/zenity-color-picker.el"))])
- (zeno-theme . [(20181027 118) ((emacs (24))) "A dark theme using different shades of blue" single ((:commit . "0914c4a5b1b9499e7f1ca5699b1c3ea2f4be3f1a") (:keywords "faces" "theme" "dark" "blue") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com") (:url . "https://github.com/jbharat/zeno-theme"))])
- (zephir-mode . [(20200417 830) ((cl-lib (0 5)) (pkg-info (0 4)) (emacs (25 1))) "Major mode for editing Zephir code" tar ((:commit . "4e9618b77dff67c1c7b6fff78605a62311db88b8") (:keywords "languages") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:url . "https://github.com/zephir-lang/zephir-mode"))])
- (zero-input . [(20200405 1220) ((emacs (24 3)) (s (1 2 0))) "Zero Chinese input method framework" single ((:commit . "729da9f4b99acb744ee6974ed7f3d4e252fd19da") (:url . "https://gitlab.emacsos.com/sylecn/zero-el"))])
- (zerodark-theme . [(20190528 923) ((all-the-icons (2 0 0))) "A dark, medium contrast theme for Emacs" single ((:commit . "df22536a244293591575e56970bf83814faa7c14") (:keywords "themes") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://github.com/NicolasPetton/zerodark-theme"))])
- (zetteldeft . [(20200723 2054) ((emacs (25 1)) (deft (0 8)) (ace-window (0 7 0))) "Turn deft into a zettelkasten system" tar ((:commit . "464e2702dd89e0d12be8d41832bad76fdc69e20a") (:keywords "deft" "zettelkasten" "zetteldeft" "wp" "files") (:authors ("EFLS <Elias Storms>")) (:maintainer "EFLS <Elias Storms>") (:url . "https://efls.github.io/zetteldeft/"))])
- (zig-mode . [(20200713 407) ((emacs (24 3))) "A major mode for the Zig programming language" single ((:commit . "d88580913586b8749ed0ac3ae228e825a68f9412") (:keywords "zig" "languages") (:authors ("Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley" . "superjoe30@gmail.com")) (:maintainer "Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley" . "superjoe30@gmail.com") (:url . "https://github.com/zig-lang/zig-mode"))])
- (zim-wiki-mode . [(20200316 1223) ((emacs (25)) (helm-ag (0 58)) (helm-projectile (0 14 0)) (dokuwiki-mode (0 1 1)) (link-hint (0 1)) (pretty-hydra (0 2 2))) "Zim Desktop Wiki edit mode" single ((:commit . "410fa67d5947b8801b03a58fcb2bd414cb5294f7") (:keywords "outlines") (:authors ("Will Foran" . "willforan+zim-wiki-mode@gmail.com")) (:maintainer "Will Foran" . "willforan+zim-wiki-mode@gmail.com") (:url . "https://github.com/WillForan/zim-wiki-mode"))])
- (zimports . [(20200606 1700) ((emacs (26 1)) (projectile (2 1 0))) "Reformat python imports with zimports" single ((:commit . "a96e9b993c9aaccf1fd07c8fddfc247c4e07618c") (:url . "https://github.com/schmir/zimports.el"))])
- (zlc . [(20151011 157) nil "Provides zsh like completion system to Emacs" single ((:commit . "4dd2ba267ecdeac845a7cbb3147294ee7daa25f4") (:keywords "matching" "convenience") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com"))])
- (zmq . [(20200305 2345) ((cl-lib (0 5)) (emacs (26))) "ZMQ bindings in elisp" tar ((:commit . "2aed40aee51d19cbca83d1f1edc23a5f1522dd8d") (:keywords "comm") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:url . "https://github.com/dzop/emacs-zmq"))])
- (znc . [(20160627 2032) ((cl-lib (0 2))) "ZNC + ERC" single ((:commit . "ce468d185e4a949c45fdd7586313144bc69d4fe5") (:authors ("Yaroslav Shirokov")) (:maintainer "Yaroslav Shirokov") (:url . "https://github.com/sshirokov/ZNC.el"))])
- (zombie . [(20141222 1616) nil "major mode for editing ZOMBIE programs" single ((:commit . "ff8cd1b4cdbb4b0b9b8fd1ec8f6fb93eba249345") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
- (zombie-trellys-mode . [(20150304 1448) ((emacs (24)) (cl-lib (0 5)) (haskell-mode (1 5))) "A minor mode for interaction with Zombie Trellys" single ((:commit . "7f0c45fdda3a44c3b6d1762d116abb1421b8fba2") (:keywords "languages") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))])
- (zone-nyan . [(20200506 1207) ((esxml (0 3 1))) "Zone out with nyan cat" single ((:commit . "48625814f42c39521405d08009e1d44108d880ac") (:keywords "zone") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/zone-nyan"))])
- (zone-rainbow . [(20160120 1334) ((emacs (24 3))) "Zone out with rainbow." single ((:commit . "2ba4f1a87c69c4712124ebf12c1f3ea171e1af36") (:keywords "games") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/zone-rainbow"))])
- (zone-select . [(20160118 1419) ((emacs (24 3)) (dash (2 8))) "Select zone programs." single ((:commit . "bf30da12f1625fe6563448fccf3c506acad10af7") (:keywords "games") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/zone-select"))])
- (zone-sl . [(20160201 1210) ((emacs (24 3))) "Zone out with steam locomotives." single ((:commit . "7ec22e3661c6348382f9fc39a9d0063dbd2352ff") (:keywords "games") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:url . "https://github.com/kawabata/zone-sl"))])
- (zoom . [(20200708 1105) ((emacs (24 4))) "Fixed and automatic balanced window layout" single ((:commit . "a373e7eed59ad93315e5ae88c816ca70404d2d34") (:keywords "frames") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com") (:url . "https://github.com/cyrus-and/zoom"))])
- (zoom-window . [(20200323 720) ((emacs (24 3))) "Zoom window like tmux" single ((:commit . "ab14a365f3e496b07f5efc20992f9094ec166f06") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-zoom-window"))])
- (zop-to-char . [(20160212 1554) ((cl-lib (0 5))) "A replacement of zap-to-char." single ((:commit . "00152aa666354b27e56e20565f186b363afa0dce") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/zop-to-char"))])
- (zotelo . [(20160602 949) ((cl-lib (0 5))) "Manage Zotero collections from emacs" single ((:commit . "d9dc089b9adfcc70a63f2a84269a12eb7cb4c748") (:keywords "zotero" "emacs" "reftex" "bibtex" "mozrepl" "bibliography manager") (:authors ("Spinu Vitalie")) (:maintainer "Spinu Vitalie") (:url . "https://github.com/vitoshka/zotelo"))])
- (zotxt . [(20200120 1950) ((request (0 3 2)) (deferred (0 5 1))) "Tools to integrate emacs with Zotero via the zotxt plugin." tar ((:commit . "2e7ce60fa4b0311c646a509c140fd1c94c08fa79"))])
- (zoutline . [(20190520 1819) nil "Simple outline library." single ((:commit . "63756846f8540b6faf89d885438186e4fe1c7d8a") (:keywords "outline") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/zoutline"))])
- (zpl-mode . [(20180906 1059) ((emacs (24 3))) "ZIMPL major mode" single ((:commit . "35e7e23c6baf31b5e65dd7405c8ab9b13c70637e") (:url . "https://github.com/ax487/zpl-mode.git"))])
- (zpresent . [(20200417 309) ((emacs (25 1)) (org-parser (0 4)) (dash (2 12 0)) (request (0 3 0))) "Simple presentation mode based on org files." single ((:commit . "406967322b7692492a5942d901335d626cace4d0") (:keywords "comm") (:url . "https://hg.sr.ht/~zck/zpresent"))])
- (zprint-mode . [(20200731 1238) ((emacs (24 3))) "Reformat Clojure(Script) code using zprint" tar ((:commit . "b9b72b4918156f2f44aa544be9e19ea391937c2a") (:keywords "tools") (:authors ("Paulus Esterhazy" . "pesterhazy@gmail.com")) (:maintainer "Paulus Esterhazy" . "pesterhazy@gmail.com") (:url . "https://github.com/pesterhazy/zprint-mode.el"))])
- (ztree . [(20191108 2234) ((cl-lib (0))) "Text mode directory tree" tar ((:commit . "0a5b25f364490a58ef7371534a39c75d11f54132") (:keywords "files" "tools") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:url . "https://github.com/fourier/ztree"))])
- (zweilight-theme . [(20170113 605) nil "A dark color theme for Emacs." single ((:commit . "7f45ab9e23164d65538edb2beb9692ecdc24c31e") (:authors ("Philip Arvidsson" . "contact@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "contact@philiparvidsson.com") (:url . "http://github.com/philiparvidsson/zweilight-emacs"))])
- (zygospore . [(20140703 852) nil "reversible C-x 1 (delete-other-windows)" single ((:commit . "1af5ee663f5a7aa08d96a77cacff834dcdf55ea8") (:authors ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainer "Louis Kottmann" . "louis.kottmann@gmail.com") (:url . "https://github.com/louiskottmann/zygospore.el"))])
- (zzz-to-char . [(20190713 1344) ((emacs (24 4)) (cl-lib (0 5)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" single ((:commit . "b0a50b8cb6925c3184405f81be9ef9be9da69f09") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/zzz-to-char"))])) \ No newline at end of file
diff --git a/elpa/archives/org/archive-contents b/elpa/archives/org/archive-contents
deleted file mode 100644
index 9608c56..0000000
--- a/elpa/archives/org/archive-contents
+++ /dev/null
@@ -1,2 +0,0 @@
-(1 (org . [(20200727) ( ) "Outline-based notes management and organizer" tar])
- (org-plus-contrib . [(20200727) ( ) "Outline-based notes management and organizer" tar]))
diff --git a/elpa/async-20200113.1745/async-autoloads.el b/elpa/async-20200113.1745/async-autoloads.el
deleted file mode 100644
index de07d21..0000000
--- a/elpa/async-20200113.1745/async-autoloads.el
+++ /dev/null
@@ -1,174 +0,0 @@
-;;; async-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "async" "async.el" (0 0 0 0))
-;;; Generated autoloads from async.el
-
-(autoload 'async-start-process "async" "\
-Start the executable PROGRAM asynchronously named NAME. See `async-start'.
-PROGRAM is passed PROGRAM-ARGS, calling FINISH-FUNC with the
-process object when done. If FINISH-FUNC is nil, the future
-object will return the process object when the program is
-finished. Set DEFAULT-DIRECTORY to change PROGRAM's current
-working directory.
-
-\(fn NAME PROGRAM FINISH-FUNC &rest PROGRAM-ARGS)" nil nil)
-
-(autoload 'async-start "async" "\
-Execute START-FUNC (often a lambda) in a subordinate Emacs process.
-When done, the return value is passed to FINISH-FUNC. Example:
-
- (async-start
- ;; What to do in the child process
- (lambda ()
- (message \"This is a test\")
- (sleep-for 3)
- 222)
-
- ;; What to do when it finishes
- (lambda (result)
- (message \"Async process done, result should be 222: %s\"
- result)))
-
-If FINISH-FUNC is nil or missing, a future is returned that can
-be inspected using `async-get', blocking until the value is
-ready. Example:
-
- (let ((proc (async-start
- ;; What to do in the child process
- (lambda ()
- (message \"This is a test\")
- (sleep-for 3)
- 222))))
-
- (message \"I'm going to do some work here\") ;; ....
-
- (message \"Waiting on async process, result should be 222: %s\"
- (async-get proc)))
-
-If you don't want to use a callback, and you don't care about any
-return value from the child process, pass the `ignore' symbol as
-the second argument (if you don't, and never call `async-get', it
-will leave *emacs* process buffers hanging around):
-
- (async-start
- (lambda ()
- (delete-file \"a remote file on a slow link\" nil))
- 'ignore)
-
-Note: Even when FINISH-FUNC is present, a future is still
-returned except that it yields no value (since the value is
-passed to FINISH-FUNC). Call `async-get' on such a future always
-returns nil. It can still be useful, however, as an argument to
-`async-ready' or `async-wait'.
-
-\(fn START-FUNC &optional FINISH-FUNC)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "async" '("async-")))
-
-;;;***
-
-;;;### (autoloads nil "async-bytecomp" "async-bytecomp.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from async-bytecomp.el
-
-(autoload 'async-byte-recompile-directory "async-bytecomp" "\
-Compile all *.el files in DIRECTORY asynchronously.
-All *.elc files are systematically deleted before proceeding.
-
-\(fn DIRECTORY &optional QUIET)" nil nil)
-
-(defvar async-bytecomp-package-mode nil "\
-Non-nil if Async-Bytecomp-Package mode is enabled.
-See the `async-bytecomp-package-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `async-bytecomp-package-mode'.")
-
-(custom-autoload 'async-bytecomp-package-mode "async-bytecomp" nil)
-
-(autoload 'async-bytecomp-package-mode "async-bytecomp" "\
-Byte compile asynchronously packages installed with package.el.
-Async compilation of packages can be controlled by
-`async-bytecomp-allowed-packages'.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'async-byte-compile-file "async-bytecomp" "\
-Byte compile Lisp code FILE asynchronously.
-
-Same as `byte-compile-file' but asynchronous.
-
-\(fn FILE)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "async-bytecomp" '("async-byte")))
-
-;;;***
-
-;;;### (autoloads nil "dired-async" "dired-async.el" (0 0 0 0))
-;;; Generated autoloads from dired-async.el
-
-(defvar dired-async-mode nil "\
-Non-nil if Dired-Async mode is enabled.
-See the `dired-async-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `dired-async-mode'.")
-
-(custom-autoload 'dired-async-mode "dired-async" nil)
-
-(autoload 'dired-async-mode "dired-async" "\
-Do dired actions asynchronously.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'dired-async-do-copy "dired-async" "\
-Run ‘dired-do-copy’ asynchronously.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'dired-async-do-symlink "dired-async" "\
-Run ‘dired-do-symlink’ asynchronously.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'dired-async-do-hardlink "dired-async" "\
-Run ‘dired-do-hardlink’ asynchronously.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'dired-async-do-rename "dired-async" "\
-Run ‘dired-do-rename’ asynchronously.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dired-async" '("dired-async-")))
-
-;;;***
-
-;;;### (autoloads nil "smtpmail-async" "smtpmail-async.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from smtpmail-async.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smtpmail-async" '("async-smtpmail-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("async-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; async-autoloads.el ends here
diff --git a/elpa/async-20200113.1745/async-bytecomp.el b/elpa/async-20200113.1745/async-bytecomp.el
deleted file mode 100644
index 1198497..0000000
--- a/elpa/async-20200113.1745/async-bytecomp.el
+++ /dev/null
@@ -1,210 +0,0 @@
-;;; async-bytecomp.el --- Compile elisp files asynchronously -*- lexical-binding: t -*-
-
-;; Copyright (C) 2014-2016 Free Software Foundation, Inc.
-
-;; Authors: John Wiegley <jwiegley@gmail.com>
-;; Thierry Volpiatto <thierry.volpiatto@gmail.com>
-
-;; Keywords: dired async byte-compile
-;; X-URL: https://github.com/jwiegley/dired-async
-
-;; 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 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-;;
-;; This package provide the `async-byte-recompile-directory' function
-;; which allows, as the name says to recompile a directory outside of
-;; your running emacs.
-;; The benefit is your files will be compiled in a clean environment without
-;; the old *.el files loaded.
-;; Among other things, this fix a bug in package.el which recompile
-;; the new files in the current environment with the old files loaded, creating
-;; errors in most packages after upgrades.
-;;
-;; NB: This package is advicing the function `package--compile'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'async)
-
-(defcustom async-bytecomp-allowed-packages
- ;; FIXME: Arguably the default should be `all', but currently
- ;; this minor mode is silently/forcefully enabled by Helm and Magit to ensure
- ;; they get compiled asynchronously, so this conservative default value is
- ;; here to make sure that the mode can be enabled without the user's
- ;; explicit consent.
- '(async forge helm helm-core helm-ls-git helm-ls-hg magit)
- "Packages in this list will be compiled asynchronously by `package--compile'.
-All the dependencies of these packages will be compiled async too,
-so no need to add dependencies to this list.
-The value of this variable can also be the symbol `all', in this case
-all packages are always compiled asynchronously."
- :group 'async
- :type '(choice
- (const :tag "All packages" all)
- (repeat symbol)))
-
-(defvar async-byte-compile-log-file
- (concat user-emacs-directory "async-bytecomp.log"))
-
-;;;###autoload
-(defun async-byte-recompile-directory (directory &optional quiet)
- "Compile all *.el files in DIRECTORY asynchronously.
-All *.elc files are systematically deleted before proceeding."
- (cl-loop with dir = (directory-files directory t "\\.elc\\'")
- unless dir return nil
- for f in dir
- when (file-exists-p f) do (delete-file f))
- ;; Ensure async is reloaded when async.elc is deleted.
- ;; This happen when recompiling its own directory.
- (load "async")
- (let ((call-back
- (lambda (&optional _ignore)
- (if (file-exists-p async-byte-compile-log-file)
- (let ((buf (get-buffer-create byte-compile-log-buffer))
- (n 0))
- (with-current-buffer buf
- (goto-char (point-max))
- (let ((inhibit-read-only t))
- (insert-file-contents async-byte-compile-log-file)
- (compilation-mode))
- (display-buffer buf)
- (delete-file async-byte-compile-log-file)
- (unless quiet
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "^.*:Error:" nil t)
- (cl-incf n)))
- (if (> n 0)
- (message "Failed to compile %d files in directory `%s'" n directory)
- (message "Directory `%s' compiled asynchronously with warnings" directory)))))
- (unless quiet
- (message "Directory `%s' compiled asynchronously with success" directory))))))
- (async-start
- `(lambda ()
- (require 'bytecomp)
- ,(async-inject-variables "\\`\\(load-path\\)\\|byte\\'")
- (let ((default-directory (file-name-as-directory ,directory))
- error-data)
- (add-to-list 'load-path default-directory)
- (byte-recompile-directory ,directory 0 t)
- (when (get-buffer byte-compile-log-buffer)
- (setq error-data (with-current-buffer byte-compile-log-buffer
- (buffer-substring-no-properties (point-min) (point-max))))
- (unless (string= error-data "")
- (with-temp-file ,async-byte-compile-log-file
- (erase-buffer)
- (insert error-data))))))
- call-back)
- (unless quiet (message "Started compiling asynchronously directory %s" directory))))
-
-(defvar package-archive-contents)
-(defvar package-alist)
-(declare-function package-desc-reqs "package.el" (cl-x))
-
-(defun async-bytecomp--get-package-deps (pkgs)
- ;; Same as `package--get-deps' but parse instead `package-archive-contents'
- ;; because PKG is not already installed and not present in `package-alist'.
- ;; However fallback to `package-alist' in case PKG no more present
- ;; in `package-archive-contents' due to modification to `package-archives'.
- ;; See issue #58.
- (let ((seen '()))
- (while pkgs
- (let ((pkg (pop pkgs)))
- (unless (memq pkg seen)
- (let ((pkg-desc (cadr (or (assq pkg package-archive-contents)
- (assq pkg package-alist)))))
- (when pkg-desc
- (push pkg seen)
- (setq pkgs (append (mapcar #'car (package-desc-reqs pkg-desc))
- pkgs)))))))
- seen))
-
-(defadvice package--compile (around byte-compile-async)
- (let ((cur-package (package-desc-name pkg-desc))
- (pkg-dir (package-desc-dir pkg-desc)))
- (if (or (member async-bytecomp-allowed-packages '(t all (all)))
- (memq cur-package (async-bytecomp--get-package-deps
- async-bytecomp-allowed-packages)))
- (progn
- (when (eq cur-package 'async)
- (fmakunbound 'async-byte-recompile-directory))
- ;; Add to `load-path' the latest version of async and
- ;; reload it when reinstalling async.
- (when (string= cur-package "async")
- (cl-pushnew pkg-dir load-path)
- (load "async-bytecomp"))
- ;; `async-byte-recompile-directory' will add directory
- ;; as needed to `load-path'.
- (async-byte-recompile-directory (package-desc-dir pkg-desc) t))
- ad-do-it)))
-
-;;;###autoload
-(define-minor-mode async-bytecomp-package-mode
- "Byte compile asynchronously packages installed with package.el.
-Async compilation of packages can be controlled by
-`async-bytecomp-allowed-packages'."
- :group 'async
- :global t
- (if async-bytecomp-package-mode
- (ad-activate 'package--compile)
- (ad-deactivate 'package--compile)))
-
-;;;###autoload
-(defun async-byte-compile-file (file)
- "Byte compile Lisp code FILE asynchronously.
-
-Same as `byte-compile-file' but asynchronous."
- (interactive "fFile: ")
- (let ((call-back
- (lambda (&optional _ignore)
- (let ((bn (file-name-nondirectory file)))
- (if (file-exists-p async-byte-compile-log-file)
- (let ((buf (get-buffer-create byte-compile-log-buffer))
- start)
- (with-current-buffer buf
- (goto-char (setq start (point-max)))
- (let ((inhibit-read-only t))
- (insert-file-contents async-byte-compile-log-file)
- (compilation-mode))
- (display-buffer buf)
- (delete-file async-byte-compile-log-file)
- (save-excursion
- (goto-char start)
- (if (re-search-forward "^.*:Error:" nil t)
- (message "Failed to compile `%s'" bn)
- (message "`%s' compiled asynchronously with warnings" bn)))))
- (message "`%s' compiled asynchronously with success" bn))))))
- (async-start
- `(lambda ()
- (require 'bytecomp)
- ,(async-inject-variables "\\`load-path\\'")
- (let ((default-directory ,(file-name-directory file)))
- (add-to-list 'load-path default-directory)
- (byte-compile-file ,file)
- (when (get-buffer byte-compile-log-buffer)
- (setq error-data (with-current-buffer byte-compile-log-buffer
- (buffer-substring-no-properties (point-min) (point-max))))
- (unless (string= error-data "")
- (with-temp-file ,async-byte-compile-log-file
- (erase-buffer)
- (insert error-data))))))
- call-back)))
-
-(provide 'async-bytecomp)
-
-;;; async-bytecomp.el ends here
diff --git a/elpa/async-20200113.1745/async-pkg.el b/elpa/async-20200113.1745/async-pkg.el
deleted file mode 100644
index 229bfe8..0000000
--- a/elpa/async-20200113.1745/async-pkg.el
+++ /dev/null
@@ -1,8 +0,0 @@
-(define-package "async" "20200113.1745" "Asynchronous processing in Emacs"
- '((emacs "24.3"))
- :commit "86aef2c38e7d35e8509b7feeee3e989d825eba91" :keywords
- '("async")
- :url "https://github.com/jwiegley/emacs-async")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/async-20200113.1745/async.el b/elpa/async-20200113.1745/async.el
deleted file mode 100644
index 6437a30..0000000
--- a/elpa/async-20200113.1745/async.el
+++ /dev/null
@@ -1,408 +0,0 @@
-;;; async.el --- Asynchronous processing -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2016 Free Software Foundation, Inc.
-
-;; Author: John Wiegley <jwiegley@gmail.com>
-;; Created: 18 Jun 2012
-;; Version: 1.9.4
-;; Package-Requires: ((emacs "24.3"))
-;; Keywords: convenience async
-;; URL: https://github.com/jwiegley/emacs-async
-
-;; 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 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Adds the ability to call asynchronous functions and process with ease. See
-;; the documentation for `async-start' and `async-start-process'.
-
-;;; Code:
-
-(eval-when-compile (require 'cl-lib))
-
-(defgroup async nil
- "Simple asynchronous processing in Emacs"
- :group 'emacs)
-
-(defcustom async-variables-noprops-function #'async--purecopy
- "Default function to remove text properties in variables."
- :group 'async
- :type 'function)
-
-(defvar async-debug nil)
-(defvar async-send-over-pipe t)
-(defvar async-in-child-emacs nil)
-(defvar async-callback nil)
-(defvar async-callback-for-process nil)
-(defvar async-callback-value nil)
-(defvar async-callback-value-set nil)
-(defvar async-current-process nil)
-(defvar async--procvar nil)
-
-(defun async--purecopy (object)
- "Remove text properties in OBJECT.
-
-Argument OBJECT may be a list or a string, if anything else it
-is returned unmodified."
- (cond ((stringp object)
- (substring-no-properties object))
- ((consp object)
- (cl-loop for elm in object
- ;; A string.
- if (stringp elm)
- collect (substring-no-properties elm)
- else
- ;; Proper lists.
- if (and (consp elm) (null (cdr (last elm))))
- collect (async--purecopy elm)
- else
- ;; Dotted lists.
- ;; We handle here only dotted list where car and cdr
- ;; are atoms i.e. (x . y) and not (x . (x . y)) or
- ;; (x . (x y)) which should fit most cases.
- if (and (consp elm) (cdr (last elm)))
- collect (let ((key (car elm))
- (val (cdr elm)))
- (cons (if (stringp key)
- (substring-no-properties key)
- key)
- (if (stringp val)
- (substring-no-properties val)
- val)))
- else
- collect elm))
- (t object)))
-
-(defun async-inject-variables
- (include-regexp &optional predicate exclude-regexp noprops)
- "Return a `setq' form that replicates part of the calling environment.
-
-It sets the value for every variable matching INCLUDE-REGEXP and
-also PREDICATE. It will not perform injection for any variable
-matching EXCLUDE-REGEXP (if present) or representing a `syntax-table'
-i.e. ending by \"-syntax-table\".
-When NOPROPS is non nil it tries to strip out text properties of each
-variable's value with `async-variables-noprops-function'.
-
-It is intended to be used as follows:
-
- (async-start
- `(lambda ()
- (require 'smtpmail)
- (with-temp-buffer
- (insert ,(buffer-substring-no-properties (point-min) (point-max)))
- ;; Pass in the variable environment for smtpmail
- ,(async-inject-variables \"\\`\\(smtpmail\\|\\(user-\\)?mail\\)-\")
- (smtpmail-send-it)))
- 'ignore)"
- `(setq
- ,@(let (bindings)
- (mapatoms
- (lambda (sym)
- (let* ((sname (and (boundp sym) (symbol-name sym)))
- (value (and sname (symbol-value sym))))
- (when (and sname
- (or (null include-regexp)
- (string-match include-regexp sname))
- (or (null exclude-regexp)
- (not (string-match exclude-regexp sname)))
- (not (string-match "-syntax-table\\'" sname)))
- (unless (or (stringp value)
- (memq value '(nil t))
- (numberp value)
- (vectorp value))
- (setq value `(quote ,value)))
- (when noprops
- (setq value (funcall async-variables-noprops-function
- value)))
- (when (or (null predicate)
- (funcall predicate sym))
- (setq bindings (cons value bindings)
- bindings (cons sym bindings)))))))
- bindings)))
-
-(defalias 'async-inject-environment 'async-inject-variables)
-
-(defun async-handle-result (func result buf)
- (if (null func)
- (progn
- (set (make-local-variable 'async-callback-value) result)
- (set (make-local-variable 'async-callback-value-set) t))
- (unwind-protect
- (if (and (listp result)
- (eq 'async-signal (nth 0 result)))
- (signal (car (nth 1 result))
- (cdr (nth 1 result)))
- (funcall func result))
- (unless async-debug
- (kill-buffer buf)))))
-
-(defun async-when-done (proc &optional _change)
- "Process sentinel used to retrieve the value from the child process."
- (when (eq 'exit (process-status proc))
- (with-current-buffer (process-buffer proc)
- (let ((async-current-process proc))
- (if (= 0 (process-exit-status proc))
- (if async-callback-for-process
- (if async-callback
- (prog1
- (funcall async-callback proc)
- (unless async-debug
- (kill-buffer (current-buffer))))
- (set (make-local-variable 'async-callback-value) proc)
- (set (make-local-variable 'async-callback-value-set) t))
- (goto-char (point-max))
- (backward-sexp)
- (async-handle-result async-callback (read (current-buffer))
- (current-buffer)))
- (set (make-local-variable 'async-callback-value)
- (list 'error
- (format "Async process '%s' failed with exit code %d"
- (process-name proc) (process-exit-status proc))))
- (set (make-local-variable 'async-callback-value-set) t))))))
-
-(defun async--receive-sexp (&optional stream)
- (let ((sexp (decode-coding-string (base64-decode-string
- (read stream)) 'utf-8-auto))
- ;; Parent expects UTF-8 encoded text.
- (coding-system-for-write 'utf-8-auto))
- (if async-debug
- (message "Received sexp {{{%s}}}" (pp-to-string sexp)))
- (setq sexp (read sexp))
- (if async-debug
- (message "Read sexp {{{%s}}}" (pp-to-string sexp)))
- (eval sexp)))
-
-(defun async--insert-sexp (sexp)
- (let (print-level
- print-length
- (print-escape-nonascii t)
- (print-circle t))
- (prin1 sexp (current-buffer))
- ;; Just in case the string we're sending might contain EOF
- (encode-coding-region (point-min) (point-max) 'utf-8-auto)
- (base64-encode-region (point-min) (point-max) t)
- (goto-char (point-min)) (insert ?\")
- (goto-char (point-max)) (insert ?\" ?\n)))
-
-(defun async--transmit-sexp (process sexp)
- (with-temp-buffer
- (if async-debug
- (message "Transmitting sexp {{{%s}}}" (pp-to-string sexp)))
- (async--insert-sexp sexp)
- (process-send-region process (point-min) (point-max))))
-
-(defun async-batch-invoke ()
- "Called from the child Emacs process' command line."
- ;; Make sure 'message' and 'prin1' encode stuff in UTF-8, as parent
- ;; process expects.
- (let ((coding-system-for-write 'utf-8-auto))
- (setq async-in-child-emacs t
- debug-on-error async-debug)
- (if debug-on-error
- (prin1 (funcall
- (async--receive-sexp (unless async-send-over-pipe
- command-line-args-left))))
- (condition-case err
- (prin1 (funcall
- (async--receive-sexp (unless async-send-over-pipe
- command-line-args-left))))
- (error
- (prin1 (list 'async-signal err)))))))
-
-(defun async-ready (future)
- "Query a FUTURE to see if it is ready.
-
-I.e., if no blocking
-would result from a call to `async-get' on that FUTURE."
- (and (memq (process-status future) '(exit signal))
- (let ((buf (process-buffer future)))
- (if (buffer-live-p buf)
- (with-current-buffer buf
- async-callback-value-set)
- t))))
-
-(defun async-wait (future)
- "Wait for FUTURE to become ready."
- (while (not (async-ready future))
- (sleep-for 0.05)))
-
-(defun async-get (future)
- "Get the value from process FUTURE when it is ready.
-FUTURE is returned by `async-start' or `async-start-process' when
-its FINISH-FUNC is nil."
- (and future (async-wait future))
- (let ((buf (process-buffer future)))
- (when (buffer-live-p buf)
- (with-current-buffer buf
- (async-handle-result
- #'identity async-callback-value (current-buffer))))))
-
-(defun async-message-p (value)
- "Return non-nil of VALUE is an async.el message packet."
- (and (listp value)
- (plist-get value :async-message)))
-
-(defun async-send (&rest args)
- "Send the given messages to the asychronous Emacs PROCESS."
- (let ((args (append args '(:async-message t))))
- (if async-in-child-emacs
- (if async-callback
- (funcall async-callback args))
- (async--transmit-sexp (car args) (list 'quote (cdr args))))))
-
-(defun async-receive ()
- "Send the given messages to the asychronous Emacs PROCESS."
- (async--receive-sexp))
-
-;;;###autoload
-(defun async-start-process (name program finish-func &rest program-args)
- "Start the executable PROGRAM asynchronously named NAME. See `async-start'.
-PROGRAM is passed PROGRAM-ARGS, calling FINISH-FUNC with the
-process object when done. If FINISH-FUNC is nil, the future
-object will return the process object when the program is
-finished. Set DEFAULT-DIRECTORY to change PROGRAM's current
-working directory."
- (let* ((buf (generate-new-buffer (concat "*" name "*")))
- (proc (let ((process-connection-type nil))
- (apply #'start-process name buf program program-args))))
- (with-current-buffer buf
- (set (make-local-variable 'async-callback) finish-func)
- (set-process-sentinel proc #'async-when-done)
- (unless (string= name "emacs")
- (set (make-local-variable 'async-callback-for-process) t))
- proc)))
-
-(defvar async-quiet-switch "-Q"
- "The Emacs parameter to use to call emacs without config.
-Can be one of \"-Q\" or \"-q\".
-Default is \"-Q\" but it is sometimes useful to use \"-q\" to have a
-enhanced config or some more variables loaded.")
-
-;;;###autoload
-(defun async-start (start-func &optional finish-func)
- "Execute START-FUNC (often a lambda) in a subordinate Emacs process.
-When done, the return value is passed to FINISH-FUNC. Example:
-
- (async-start
- ;; What to do in the child process
- (lambda ()
- (message \"This is a test\")
- (sleep-for 3)
- 222)
-
- ;; What to do when it finishes
- (lambda (result)
- (message \"Async process done, result should be 222: %s\"
- result)))
-
-If FINISH-FUNC is nil or missing, a future is returned that can
-be inspected using `async-get', blocking until the value is
-ready. Example:
-
- (let ((proc (async-start
- ;; What to do in the child process
- (lambda ()
- (message \"This is a test\")
- (sleep-for 3)
- 222))))
-
- (message \"I'm going to do some work here\") ;; ....
-
- (message \"Waiting on async process, result should be 222: %s\"
- (async-get proc)))
-
-If you don't want to use a callback, and you don't care about any
-return value from the child process, pass the `ignore' symbol as
-the second argument (if you don't, and never call `async-get', it
-will leave *emacs* process buffers hanging around):
-
- (async-start
- (lambda ()
- (delete-file \"a remote file on a slow link\" nil))
- 'ignore)
-
-Note: Even when FINISH-FUNC is present, a future is still
-returned except that it yields no value (since the value is
-passed to FINISH-FUNC). Call `async-get' on such a future always
-returns nil. It can still be useful, however, as an argument to
-`async-ready' or `async-wait'."
- (let ((sexp start-func)
- ;; Subordinate Emacs will send text encoded in UTF-8.
- (coding-system-for-read 'utf-8-auto))
- (setq async--procvar
- (async-start-process
- "emacs" (file-truename
- (expand-file-name invocation-name
- invocation-directory))
- finish-func
- async-quiet-switch "-l"
- ;; Using `locate-library' ensure we use the right file
- ;; when the .elc have been deleted.
- (locate-library "async")
- "-batch" "-f" "async-batch-invoke"
- (if async-send-over-pipe
- "<none>"
- (with-temp-buffer
- (async--insert-sexp (list 'quote sexp))
- (buffer-string)))))
- (if async-send-over-pipe
- (async--transmit-sexp async--procvar (list 'quote sexp)))
- async--procvar))
-
-(defmacro async-sandbox(func)
- "Evaluate FUNC in a separate Emacs process, synchronously."
- `(async-get (async-start ,func)))
-
-(defun async--fold-left (fn forms bindings)
- (let ((res forms))
- (dolist (binding bindings)
- (setq res (funcall fn res
- (if (listp binding)
- binding
- (list binding)))))
- res))
-
-(defmacro async-let (bindings &rest forms)
- "Implements `let', but each binding is established asynchronously.
-For example:
-
- (async-let ((x (foo))
- (y (bar)))
- (message \"%s %s\" x y))
-
- expands to ==>
-
- (async-start (foo)
- (lambda (x)
- (async-start (bar)
- (lambda (y)
- (message \"%s %s\" x y)))))"
- (declare (indent 1))
- (async--fold-left
- (lambda (acc binding)
- (let ((fun (pcase (cadr binding)
- ((and (pred functionp) f) f)
- (f `(lambda () ,f)))))
- `(async-start ,fun
- (lambda (,(car binding))
- ,acc))))
- `(progn ,@forms)
- (reverse bindings)))
-
-(provide 'async)
-
-;;; async.el ends here
diff --git a/elpa/async-20200113.1745/dired-async.el b/elpa/async-20200113.1745/dired-async.el
deleted file mode 100644
index 1dba956..0000000
--- a/elpa/async-20200113.1745/dired-async.el
+++ /dev/null
@@ -1,408 +0,0 @@
-;;; dired-async.el --- Asynchronous dired actions -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2016 Free Software Foundation, Inc.
-
-;; Authors: John Wiegley <jwiegley@gmail.com>
-;; Thierry Volpiatto <thierry.volpiatto@gmail.com>
-
-;; Keywords: dired async network
-;; X-URL: https://github.com/jwiegley/dired-async
-
-;; 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 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; This file provide a redefinition of `dired-create-file' function,
-;; performs copies, moves and all what is handled by `dired-create-file'
-;; in the background using a slave Emacs process,
-;; by means of the async.el module.
-;; To use it, put this in your .emacs:
-
-;; (dired-async-mode 1)
-
-;; This will enable async copy/rename etc...
-;; in dired and helm.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dired-aux)
-(require 'async)
-
-(eval-when-compile
- (defvar async-callback))
-
-(defgroup dired-async nil
- "Copy rename files asynchronously from dired."
- :group 'dired)
-
-(defcustom dired-async-env-variables-regexp
- "\\`\\(tramp-\\(default\\|connection\\|remote\\)\\|ange-ftp\\)-.*"
- "Variables matching this regexp will be loaded on Child Emacs."
- :type 'regexp
- :group 'dired-async)
-
-(defcustom dired-async-message-function 'dired-async-mode-line-message
- "Function to use to notify result when operation finish.
-Should take same args as `message'."
- :group 'dired-async
- :type 'function)
-
-(defcustom dired-async-log-file "/tmp/dired-async.log"
- "File use to communicate errors from Child Emacs to host Emacs."
- :group 'dired-async
- :type 'string)
-
-(defcustom dired-async-mode-lighter '(:eval
- (when (eq major-mode 'dired-mode)
- " Async"))
- "Mode line lighter used for `dired-async-mode'."
- :group 'dired-async
- :risky t
- :type 'sexp)
-
-(defface dired-async-message
- '((t (:foreground "yellow")))
- "Face used for mode-line message."
- :group 'dired-async)
-
-(defface dired-async-failures
- '((t (:foreground "red")))
- "Face used for mode-line message."
- :group 'dired-async)
-
-(defface dired-async-mode-message
- '((t (:foreground "Gold")))
- "Face used for `dired-async--modeline-mode' lighter."
- :group 'dired-async)
-
-(define-minor-mode dired-async--modeline-mode
- "Notify mode-line that an async process run."
- :group 'dired-async
- :global t
- :lighter (:eval (propertize (format " [%s Async job(s) running]"
- (length (dired-async-processes)))
- 'face 'dired-async-mode-message))
- (unless dired-async--modeline-mode
- (let ((visible-bell t)) (ding))))
-
-(defun dired-async-mode-line-message (text face &rest args)
- "Notify end of operation in `mode-line'."
- (message nil)
- (let ((mode-line-format (concat
- " " (propertize
- (if args
- (apply #'format text args)
- text)
- 'face face))))
- (force-mode-line-update)
- (sit-for 3)
- (force-mode-line-update)))
-
-(defun dired-async-processes ()
- (cl-loop for p in (process-list)
- when (cl-loop for c in (process-command p) thereis
- (string= "async-batch-invoke" c))
- collect p))
-
-(defun dired-async-kill-process ()
- (interactive)
- (let* ((processes (dired-async-processes))
- (proc (car (last processes))))
- (and proc (delete-process proc))
- (unless (> (length processes) 1)
- (dired-async--modeline-mode -1))))
-
-(defun dired-async-after-file-create (total operation failures skipped)
- "Callback function used for operation handled by `dired-create-file'."
- (unless (dired-async-processes)
- ;; Turn off mode-line notification
- ;; only when last process end.
- (dired-async--modeline-mode -1))
- (when operation
- (if (file-exists-p dired-async-log-file)
- (progn
- (pop-to-buffer (get-buffer-create dired-log-buffer))
- (goto-char (point-max))
- (setq inhibit-read-only t)
- (insert "Error: ")
- (insert-file-contents dired-async-log-file)
- (special-mode)
- (shrink-window-if-larger-than-buffer)
- (delete-file dired-async-log-file))
- (run-with-timer
- 0.1 nil
- (lambda ()
- ;; First send error messages.
- (cond (failures
- (funcall dired-async-message-function
- "%s failed for %d of %d file%s -- See *Dired log* buffer"
- 'dired-async-failures
- (car operation) (length failures)
- total (dired-plural-s total)))
- (skipped
- (funcall dired-async-message-function
- "%s: %d of %d file%s skipped -- See *Dired log* buffer"
- 'dired-async-failures
- (car operation) (length skipped) total
- (dired-plural-s total))))
- (when dired-buffers
- (cl-loop for (_f . b) in dired-buffers
- when (buffer-live-p b)
- do (with-current-buffer b
- (when (and (not (file-remote-p default-directory nil t))
- (file-exists-p default-directory))
- (revert-buffer nil t)))))
- ;; Finally send the success message.
- (funcall dired-async-message-function
- "Asynchronous %s of %s on %s file%s done"
- 'dired-async-message
- (car operation) (cadr operation)
- total (dired-plural-s total)))))))
-
-(defun dired-async-maybe-kill-ftp ()
- "Return a form to kill ftp process in child emacs."
- (quote
- (progn
- (require 'cl-lib)
- (let ((buf (cl-loop for b in (buffer-list)
- thereis (and (string-match
- "\\`\\*ftp.*"
- (buffer-name b)) b))))
- (when buf (kill-buffer buf))))))
-
-(defvar overwrite-query)
-(defun dired-async-create-files (file-creator operation fn-list name-constructor
- &optional _marker-char)
- "Same as `dired-create-files' but asynchronous.
-
-See `dired-create-files' for the behavior of arguments."
- (setq overwrite-query nil)
- (let ((total (length fn-list))
- failures async-fn-list skipped callback
- async-quiet-switch)
- (let (to)
- (dolist (from fn-list)
- (setq to (funcall name-constructor from))
- (if (and (equal to from)
- (null (eq file-creator 'backup-file)))
- (progn
- (setq to nil)
- (dired-log "Cannot %s to same file: %s\n"
- (downcase operation) from)))
- (if (not to)
- (setq skipped (cons (dired-make-relative from) skipped))
- (let* ((overwrite (and (null (eq file-creator 'backup-file))
- (file-exists-p to)))
- (dired-overwrite-confirmed ; for dired-handle-overwrite
- (and overwrite
- (let ((help-form `(format "\
-Type SPC or `y' to overwrite file `%s',
-DEL or `n' to skip to next,
-ESC or `q' to not overwrite any of the remaining files,
-`!' to overwrite all remaining files with no more questions." ,to)))
- (dired-query 'overwrite-query "Overwrite `%s'?" to)))))
- ;; Handle the `dired-copy-file' file-creator specially
- ;; When copying a directory to another directory or
- ;; possibly to itself or one of its subdirectories.
- ;; e.g "~/foo/" => "~/test/"
- ;; or "~/foo/" =>"~/foo/"
- ;; or "~/foo/ => ~/foo/bar/")
- ;; In this case the 'name-constructor' have set the destination
- ;; TO to "~/test/foo" because the old emacs23 behavior
- ;; of `copy-directory' was to not create the subdirectory
- ;; and instead copy the contents.
- ;; With the new behavior of `copy-directory'
- ;; (similar to the `cp' shell command) we don't
- ;; need such a construction of the target directory,
- ;; so modify the destination TO to "~/test/" instead of "~/test/foo/".
- (let ((destname (file-name-directory to)))
- (when (and (file-directory-p from)
- (file-directory-p to)
- (eq file-creator 'dired-copy-file))
- (setq to destname))
- ;; If DESTNAME is a subdirectory of FROM, not a symlink,
- ;; and the method in use is copying, signal an error.
- (and (eq t (car (file-attributes destname)))
- (eq file-creator 'dired-copy-file)
- (file-in-directory-p destname from)
- (error "Cannot copy `%s' into its subdirectory `%s'"
- from to)))
- (if overwrite
- (or (and dired-overwrite-confirmed
- (push (cons from to) async-fn-list))
- (progn
- (push (dired-make-relative from) failures)
- (dired-log "%s `%s' to `%s' failed\n"
- operation from to)))
- (push (cons from to) async-fn-list)))))
- ;; Fix tramp issue #80 with emacs-26, use "-q" only when needed.
- (setq async-quiet-switch
- (if (and (boundp 'tramp-cache-read-persistent-data)
- async-fn-list
- (cl-loop for (_from . to) in async-fn-list
- thereis (file-remote-p to)))
- "-q" "-Q"))
- ;; When failures have been printed to dired log add the date at bob.
- (when (or failures skipped) (dired-log t))
- ;; When async-fn-list is empty that's mean only one file
- ;; had to be copied and user finally answer NO.
- ;; In this case async process will never start and callback
- ;; will have no chance to run, so notify failures here.
- (unless async-fn-list
- (cond (failures
- (funcall dired-async-message-function
- "%s failed for %d of %d file%s -- See *Dired log* buffer"
- 'dired-async-failures
- operation (length failures)
- total (dired-plural-s total)))
- (skipped
- (funcall dired-async-message-function
- "%s: %d of %d file%s skipped -- See *Dired log* buffer"
- 'dired-async-failures
- operation (length skipped) total
- (dired-plural-s total)))))
- ;; Setup callback.
- (setq callback
- (lambda (&optional _ignore)
- (dired-async-after-file-create
- total (list operation (length async-fn-list)) failures skipped)
- (when (string= (downcase operation) "rename")
- (cl-loop for (file . to) in async-fn-list
- for bf = (get-file-buffer file)
- for destp = (file-exists-p to)
- do (and bf destp
- (with-current-buffer bf
- (set-visited-file-name to t t))))))))
- ;; Start async process.
- (when async-fn-list
- (async-start `(lambda ()
- (require 'cl-lib) (require 'dired-aux) (require 'dired-x)
- ,(async-inject-variables dired-async-env-variables-regexp)
- (let ((dired-recursive-copies (quote always))
- (dired-copy-preserve-time
- ,dired-copy-preserve-time))
- (setq overwrite-backup-query nil)
- ;; Inline `backup-file' as long as it is not
- ;; available in emacs.
- (defalias 'backup-file
- ;; Same feature as "cp -f --backup=numbered from to"
- ;; Symlinks are copied as file from source unlike
- ;; `dired-copy-file' which is same as cp -d.
- ;; Directories are omitted.
- (lambda (from to ok)
- (cond ((file-directory-p from) (ignore))
- (t (let ((count 0))
- (while (let ((attrs (file-attributes to)))
- (and attrs (null (nth 0 attrs))))
- (cl-incf count)
- (setq to (concat (file-name-sans-versions to)
- (format ".~%s~" count)))))
- (condition-case err
- (copy-file from to ok dired-copy-preserve-time)
- (file-date-error
- (dired-log "Can't set date on %s:\n%s\n" from err)))))))
- ;; Now run the FILE-CREATOR function on files.
- (cl-loop with fn = (quote ,file-creator)
- for (from . dest) in (quote ,async-fn-list)
- do (condition-case err
- (funcall fn from dest t)
- (file-error
- (dired-log "%s: %s\n" (car err) (cdr err)))
- nil))
- (when (get-buffer dired-log-buffer)
- (dired-log t)
- (with-current-buffer dired-log-buffer
- (write-region (point-min) (point-max)
- ,dired-async-log-file))))
- ,(dired-async-maybe-kill-ftp))
- callback)
- ;; Run mode-line notifications while process running.
- (dired-async--modeline-mode 1)
- (message "%s proceeding asynchronously..." operation))))
-
-(defvar wdired-use-interactive-rename)
-(defun dired-async-wdired-do-renames (old-fn &rest args)
- ;; Perhaps a better fix would be to ask for renaming BEFORE starting
- ;; OLD-FN when `wdired-use-interactive-rename' is non-nil. For now
- ;; just bind it to nil to ensure no questions will be asked between
- ;; each rename.
- (let (wdired-use-interactive-rename)
- (apply old-fn args)))
-
-(defadvice wdired-do-renames (around wdired-async)
- (let (wdired-use-interactive-rename)
- ad-do-it))
-
-(defadvice dired-create-files (around dired-async)
- (dired-async-create-files file-creator operation fn-list
- name-constructor marker-char))
-
-;;;###autoload
-(define-minor-mode dired-async-mode
- "Do dired actions asynchronously."
- :group 'dired-async
- :lighter dired-async-mode-lighter
- :global t
- (if dired-async-mode
- (if (fboundp 'advice-add)
- (progn (advice-add 'dired-create-files :override #'dired-async-create-files)
- (advice-add 'wdired-do-renames :around #'dired-async-wdired-do-renames))
- (ad-activate 'dired-create-files)
- (ad-activate 'wdired-do-renames))
- (if (fboundp 'advice-remove)
- (progn (advice-remove 'dired-create-files #'dired-async-create-files)
- (advice-remove 'wdired-do-renames #'dired-async-wdired-do-renames))
- (ad-deactivate 'dired-create-files)
- (ad-deactivate 'wdired-do-renames))))
-
-(defmacro dired-async--with-async-create-files (&rest body)
- "Evaluate BODY with ‘dired-create-files’ set to ‘dired-async-create-files’."
- (declare (indent 0))
- `(cl-letf (((symbol-function 'dired-create-files) #'dired-async-create-files))
- ,@body))
-
-;;;###autoload
-(defun dired-async-do-copy (&optional arg)
- "Run ‘dired-do-copy’ asynchronously."
- (interactive "P")
- (dired-async--with-async-create-files
- (dired-do-copy arg)))
-
-;;;###autoload
-(defun dired-async-do-symlink (&optional arg)
- "Run ‘dired-do-symlink’ asynchronously."
- (interactive "P")
- (dired-async--with-async-create-files
- (dired-do-symlink arg)))
-
-;;;###autoload
-(defun dired-async-do-hardlink (&optional arg)
- "Run ‘dired-do-hardlink’ asynchronously."
- (interactive "P")
- (dired-async--with-async-create-files
- (dired-do-hardlink arg)))
-
-;;;###autoload
-(defun dired-async-do-rename (&optional arg)
- "Run ‘dired-do-rename’ asynchronously."
- (interactive "P")
- (dired-async--with-async-create-files
- (dired-do-rename arg)))
-
-(provide 'dired-async)
-
-;;; dired-async.el ends here
diff --git a/elpa/async-20200113.1745/smtpmail-async.el b/elpa/async-20200113.1745/smtpmail-async.el
deleted file mode 100644
index ac26923..0000000
--- a/elpa/async-20200113.1745/smtpmail-async.el
+++ /dev/null
@@ -1,73 +0,0 @@
-;;; smtpmail-async.el --- Send e-mail with smtpmail.el asynchronously -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2016 Free Software Foundation, Inc.
-
-;; Author: John Wiegley <jwiegley@gmail.com>
-;; Created: 18 Jun 2012
-
-;; Keywords: email async
-;; X-URL: https://github.com/jwiegley/emacs-async
-
-;; 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 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Send e-mail with smtpmail.el asynchronously. To use:
-;;
-;; (require 'smtpmail-async)
-;;
-;; (setq send-mail-function 'async-smtpmail-send-it
-;; message-send-mail-function 'async-smtpmail-send-it)
-;;
-;; This assumes you already have smtpmail.el working.
-
-;;; Code:
-
-(defgroup smtpmail-async nil
- "Send e-mail with smtpmail.el asynchronously"
- :group 'smptmail)
-
-(require 'async)
-(require 'smtpmail)
-(require 'message)
-
-(defvar async-smtpmail-before-send-hook nil
- "Hook running in the child emacs in `async-smtpmail-send-it'.
-It is called just before calling `smtpmail-send-it'.")
-
-(defun async-smtpmail-send-it ()
- (let ((to (message-field-value "To"))
- (buf-content (buffer-substring-no-properties
- (point-min) (point-max))))
- (message "Delivering message to %s..." to)
- (async-start
- `(lambda ()
- (require 'smtpmail)
- (with-temp-buffer
- (insert ,buf-content)
- (set-buffer-multibyte nil)
- ;; Pass in the variable environment for smtpmail
- ,(async-inject-variables
- "\\`\\(smtpmail\\|async-smtpmail\\|\\(user-\\)?mail\\)-\\|auth-sources\\|epg\\|nsm"
- nil "\\`\\(mail-header-format-function\\|smtpmail-address-buffer\\|mail-mode-abbrev-table\\)")
- (run-hooks 'async-smtpmail-before-send-hook)
- (smtpmail-send-it)))
- (lambda (&optional _ignore)
- (message "Delivering message to %s...done" to)))))
-
-(provide 'smtpmail-async)
-
-;;; smtpmail-async.el ends here
diff --git a/elpa/bind-key-20191110.416/bind-key-autoloads.el b/elpa/bind-key-20191110.416/bind-key-autoloads.el
deleted file mode 100644
index 7f4d424..0000000
--- a/elpa/bind-key-20191110.416/bind-key-autoloads.el
+++ /dev/null
@@ -1,84 +0,0 @@
-;;; bind-key-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "bind-key" "bind-key.el" (0 0 0 0))
-;;; Generated autoloads from bind-key.el
-
-(autoload 'bind-key "bind-key" "\
-Bind KEY-NAME to COMMAND in KEYMAP (`global-map' if not passed).
-
-KEY-NAME may be a vector, in which case it is passed straight to
-`define-key'. Or it may be a string to be interpreted as
-spelled-out keystrokes, e.g., \"C-c C-z\". See documentation of
-`edmacro-mode' for details.
-
-COMMAND must be an interactive function or lambda form.
-
-KEYMAP, if present, should be a keymap and not a quoted symbol.
-For example:
-
- (bind-key \"M-h\" #'some-interactive-function my-mode-map)
-
-If PREDICATE is non-nil, it is a form evaluated to determine when
-a key should be bound. It must return non-nil in such cases.
-Emacs can evaluate this form at any time that it does redisplay
-or operates on menu data structures, so you should write it so it
-can safely be called at any time.
-
-\(fn KEY-NAME COMMAND &optional KEYMAP PREDICATE)" nil t)
-
-(autoload 'unbind-key "bind-key" "\
-Unbind the given KEY-NAME, within the KEYMAP (if specified).
-See `bind-key' for more details.
-
-\(fn KEY-NAME &optional KEYMAP)" nil t)
-
-(autoload 'bind-key* "bind-key" "\
-Similar to `bind-key', but overrides any mode-specific bindings.
-
-\(fn KEY-NAME COMMAND &optional PREDICATE)" nil t)
-
-(autoload 'bind-keys "bind-key" "\
-Bind multiple keys at once.
-
-Accepts keyword arguments:
-:map MAP - a keymap into which the keybindings should be
- added
-:prefix KEY - prefix key for these bindings
-:prefix-map MAP - name of the prefix map that should be created
- for these bindings
-:prefix-docstring STR - docstring for the prefix-map variable
-:menu-name NAME - optional menu string for prefix map
-:filter FORM - optional form to determine when bindings apply
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted).
-
-\(fn &rest ARGS)" nil t)
-
-(autoload 'bind-keys* "bind-key" "\
-
-
-\(fn &rest ARGS)" nil t)
-
-(autoload 'describe-personal-keybindings "bind-key" "\
-Display all the personal keybindings defined by `bind-key'.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "bind-key" '("compare-keybindings" "get-binding-description" "bind-key" "personal-keybindings" "override-global-m")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; bind-key-autoloads.el ends here
diff --git a/elpa/bind-key-20191110.416/bind-key-pkg.el b/elpa/bind-key-20191110.416/bind-key-pkg.el
deleted file mode 100644
index 12fde6d..0000000
--- a/elpa/bind-key-20191110.416/bind-key-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "bind-key" "20191110.416" "A simple way to manage personal keybindings" 'nil :commit "7d925367ef0857d513d62eab4cb57b7436b9ffe9" :keywords '("keys" "keybinding" "config" "dotemacs") :authors '(("John Wiegley" . "johnw@newartisans.com")) :maintainer '("John Wiegley" . "johnw@newartisans.com") :url "https://github.com/jwiegley/use-package")
diff --git a/elpa/bind-key-20191110.416/bind-key.el b/elpa/bind-key-20191110.416/bind-key.el
deleted file mode 100644
index 803d78e..0000000
--- a/elpa/bind-key-20191110.416/bind-key.el
+++ /dev/null
@@ -1,456 +0,0 @@
-;;; bind-key.el --- A simple way to manage personal keybindings
-
-;; Copyright (c) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 16 Jun 2012
-;; Modified: 29 Nov 2017
-;; Version: 2.4
-;; Package-Version: 20191110.416
-;; Package-Commit: 7d925367ef0857d513d62eab4cb57b7436b9ffe9
-;; Keywords: keys keybinding config dotemacs
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; without any warranty; without even the implied warranty of
-;; merchantability or fitness for a particular purpose. see the gnu
-;; general public license for more details.
-
-;; You should have received a copy of the gnu general public license
-;; along with gnu emacs; see the file copying. if not, write to the
-;; free software foundation, inc., 59 temple place - suite 330,
-;; boston, ma 02111-1307, usa.
-
-;;; Commentary:
-
-;; If you have lots of keybindings set in your .emacs file, it can be hard to
-;; know which ones you haven't set yet, and which may now be overriding some
-;; new default in a new emacs version. This module aims to solve that
-;; problem.
-;;
-;; Bind keys as follows in your .emacs:
-;;
-;; (require 'bind-key)
-;;
-;; (bind-key "C-c x" 'my-ctrl-c-x-command)
-;;
-;; If the keybinding argument is a vector, it is passed straight to
-;; `define-key', so remapping a key with `[remap COMMAND]' works as
-;; expected:
-;;
-;; (bind-key [remap original-ctrl-c-x-command] 'my-ctrl-c-x-command)
-;;
-;; If you want the keybinding to override all minor modes that may also bind
-;; the same key, use the `bind-key*' form:
-;;
-;; (bind-key* "<C-return>" 'other-window)
-;;
-;; If you want to rebind a key only in a particular keymap, use:
-;;
-;; (bind-key "C-c x" 'my-ctrl-c-x-command some-other-mode-map)
-;;
-;; To unbind a key within a keymap (for example, to stop your favorite major
-;; mode from changing a binding that you don't want to override everywhere),
-;; use `unbind-key':
-;;
-;; (unbind-key "C-c x" some-other-mode-map)
-;;
-;; To bind multiple keys at once, or set up a prefix map, a `bind-keys' macro
-;; is provided. It accepts keyword arguments, please see its documentation
-;; for a detailed description.
-;;
-;; To add keys into a specific map, use :map argument
-;;
-;; (bind-keys :map dired-mode-map
-;; ("o" . dired-omit-mode)
-;; ("a" . some-custom-dired-function))
-;;
-;; To set up a prefix map, use `:prefix-map' and `:prefix' arguments (both are
-;; required)
-;;
-;; (bind-keys :prefix-map my-customize-prefix-map
-;; :prefix "C-c c"
-;; ("f" . customize-face)
-;; ("v" . customize-variable))
-;;
-;; You can combine all the keywords together. Additionally,
-;; `:prefix-docstring' can be specified to set documentation of created
-;; `:prefix-map' variable.
-;;
-;; To bind multiple keys in a `bind-key*' way (to be sure that your bindings
-;; will not be overridden by other modes), you may use `bind-keys*' macro:
-;;
-;; (bind-keys*
-;; ("C-o" . other-window)
-;; ("C-M-n" . forward-page)
-;; ("C-M-p" . backward-page))
-;;
-;; After Emacs loads, you can see a summary of all your personal keybindings
-;; currently in effect with this command:
-;;
-;; M-x describe-personal-keybindings
-;;
-;; This display will tell you if you've overridden a default keybinding, and
-;; what the default was. Also, it will tell you if the key was rebound after
-;; your binding it with `bind-key', and what it was rebound it to.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'easy-mmode)
-
-(defgroup bind-key nil
- "A simple way to manage personal keybindings"
- :group 'emacs)
-
-(defcustom bind-key-column-widths '(18 . 40)
- "Width of columns in `describe-personal-keybindings'."
- :type '(cons integer integer)
- :group 'bind-key)
-
-(defcustom bind-key-segregation-regexp
- "\\`\\(\\(C-[chx] \\|M-[gso] \\)\\([CM]-\\)?\\|.+-\\)"
- "Regular expression used to divide key sets in the output from
-\\[describe-personal-keybindings]."
- :type 'regexp
- :group 'bind-key)
-
-(defcustom bind-key-describe-special-forms nil
- "If non-nil, extract docstrings from lambdas, closures and keymaps if possible."
- :type 'boolean
- :group 'bind-key)
-
-;; Create override-global-mode to force key remappings
-
-(defvar override-global-map (make-keymap)
- "override-global-mode keymap")
-
-(define-minor-mode override-global-mode
- "A minor mode so that keymap settings override other modes."
- t "")
-
-;; the keymaps in `emulation-mode-map-alists' take precedence over
-;; `minor-mode-map-alist'
-(add-to-list 'emulation-mode-map-alists
- `((override-global-mode . ,override-global-map)))
-
-(defvar personal-keybindings nil
- "List of bindings performed by `bind-key'.
-
-Elements have the form ((KEY . [MAP]) CMD ORIGINAL-CMD)")
-
-;;;###autoload
-(defmacro bind-key (key-name command &optional keymap predicate)
- "Bind KEY-NAME to COMMAND in KEYMAP (`global-map' if not passed).
-
-KEY-NAME may be a vector, in which case it is passed straight to
-`define-key'. Or it may be a string to be interpreted as
-spelled-out keystrokes, e.g., \"C-c C-z\". See documentation of
-`edmacro-mode' for details.
-
-COMMAND must be an interactive function or lambda form.
-
-KEYMAP, if present, should be a keymap and not a quoted symbol.
-For example:
-
- (bind-key \"M-h\" #'some-interactive-function my-mode-map)
-
-If PREDICATE is non-nil, it is a form evaluated to determine when
-a key should be bound. It must return non-nil in such cases.
-Emacs can evaluate this form at any time that it does redisplay
-or operates on menu data structures, so you should write it so it
-can safely be called at any time."
- (let ((namevar (make-symbol "name"))
- (keyvar (make-symbol "key"))
- (kdescvar (make-symbol "kdesc"))
- (bindingvar (make-symbol "binding")))
- `(let* ((,namevar ,key-name)
- (,keyvar (if (vectorp ,namevar) ,namevar
- (read-kbd-macro ,namevar)))
- (,kdescvar (cons (if (stringp ,namevar) ,namevar
- (key-description ,namevar))
- (quote ,keymap)))
- (,bindingvar (lookup-key (or ,keymap global-map) ,keyvar)))
- (let ((entry (assoc ,kdescvar personal-keybindings))
- (details (list ,command
- (unless (numberp ,bindingvar)
- ,bindingvar))))
- (if entry
- (setcdr entry details)
- (add-to-list 'personal-keybindings (cons ,kdescvar details))))
- ,(if predicate
- `(define-key (or ,keymap global-map) ,keyvar
- '(menu-item "" nil :filter (lambda (&optional _)
- (when ,predicate
- ,command))))
- `(define-key (or ,keymap global-map) ,keyvar ,command)))))
-
-;;;###autoload
-(defmacro unbind-key (key-name &optional keymap)
- "Unbind the given KEY-NAME, within the KEYMAP (if specified).
-See `bind-key' for more details."
- `(progn
- (bind-key ,key-name nil ,keymap)
- (setq personal-keybindings
- (cl-delete-if #'(lambda (k)
- ,(if keymap
- `(and (consp (car k))
- (string= (caar k) ,key-name)
- (eq (cdar k) ',keymap))
- `(and (stringp (car k))
- (string= (car k) ,key-name))))
- personal-keybindings))))
-
-;;;###autoload
-(defmacro bind-key* (key-name command &optional predicate)
- "Similar to `bind-key', but overrides any mode-specific bindings."
- `(bind-key ,key-name ,command override-global-map ,predicate))
-
-(defun bind-keys-form (args keymap)
- "Bind multiple keys at once.
-
-Accepts keyword arguments:
-:map MAP - a keymap into which the keybindings should be
- added
-:prefix KEY - prefix key for these bindings
-:prefix-map MAP - name of the prefix map that should be created
- for these bindings
-:prefix-docstring STR - docstring for the prefix-map variable
-:menu-name NAME - optional menu string for prefix map
-:filter FORM - optional form to determine when bindings apply
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted)."
- (let (map
- doc
- prefix-map
- prefix
- filter
- menu-name
- pkg)
-
- ;; Process any initial keyword arguments
- (let ((cont t))
- (while (and cont args)
- (if (cond ((and (eq :map (car args))
- (not prefix-map))
- (setq map (cadr args)))
- ((eq :prefix-docstring (car args))
- (setq doc (cadr args)))
- ((and (eq :prefix-map (car args))
- (not (memq map '(global-map
- override-global-map))))
- (setq prefix-map (cadr args)))
- ((eq :prefix (car args))
- (setq prefix (cadr args)))
- ((eq :filter (car args))
- (setq filter (cadr args)) t)
- ((eq :menu-name (car args))
- (setq menu-name (cadr args)))
- ((eq :package (car args))
- (setq pkg (cadr args))))
- (setq args (cddr args))
- (setq cont nil))))
-
- (when (or (and prefix-map (not prefix))
- (and prefix (not prefix-map)))
- (error "Both :prefix-map and :prefix must be supplied"))
-
- (when (and menu-name (not prefix))
- (error "If :menu-name is supplied, :prefix must be too"))
-
- (unless map (setq map keymap))
-
- ;; Process key binding arguments
- (let (first next)
- (while args
- (if (keywordp (car args))
- (progn
- (setq next args)
- (setq args nil))
- (if first
- (nconc first (list (car args)))
- (setq first (list (car args))))
- (setq args (cdr args))))
-
- (cl-flet
- ((wrap (map bindings)
- (if (and map pkg (not (memq map '(global-map
- override-global-map))))
- `((if (boundp ',map)
- ,(macroexp-progn bindings)
- (eval-after-load
- ,(if (symbolp pkg) `',pkg pkg)
- ',(macroexp-progn bindings))))
- bindings)))
-
- (append
- (when prefix-map
- `((defvar ,prefix-map)
- ,@(when doc `((put ',prefix-map 'variable-documentation ,doc)))
- ,@(if menu-name
- `((define-prefix-command ',prefix-map nil ,menu-name))
- `((define-prefix-command ',prefix-map)))
- ,@(if (and map (not (eq map 'global-map)))
- (wrap map `((bind-key ,prefix ',prefix-map ,map ,filter)))
- `((bind-key ,prefix ',prefix-map nil ,filter)))))
- (wrap map
- (cl-mapcan
- (lambda (form)
- (let ((fun (and (cdr form) (list 'function (cdr form)))))
- (if prefix-map
- `((bind-key ,(car form) ,fun ,prefix-map ,filter))
- (if (and map (not (eq map 'global-map)))
- `((bind-key ,(car form) ,fun ,map ,filter))
- `((bind-key ,(car form) ,fun nil ,filter))))))
- first))
- (when next
- (bind-keys-form (if pkg
- (cons :package (cons pkg next))
- next) map)))))))
-
-;;;###autoload
-(defmacro bind-keys (&rest args)
- "Bind multiple keys at once.
-
-Accepts keyword arguments:
-:map MAP - a keymap into which the keybindings should be
- added
-:prefix KEY - prefix key for these bindings
-:prefix-map MAP - name of the prefix map that should be created
- for these bindings
-:prefix-docstring STR - docstring for the prefix-map variable
-:menu-name NAME - optional menu string for prefix map
-:filter FORM - optional form to determine when bindings apply
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted)."
- (macroexp-progn (bind-keys-form args nil)))
-
-;;;###autoload
-(defmacro bind-keys* (&rest args)
- (macroexp-progn (bind-keys-form args 'override-global-map)))
-
-(defun get-binding-description (elem)
- (cond
- ((listp elem)
- (cond
- ((memq (car elem) '(lambda function))
- (if (and bind-key-describe-special-forms
- (stringp (nth 2 elem)))
- (nth 2 elem)
- "#<lambda>"))
- ((eq 'closure (car elem))
- (if (and bind-key-describe-special-forms
- (stringp (nth 3 elem)))
- (nth 3 elem)
- "#<closure>"))
- ((eq 'keymap (car elem))
- "#<keymap>")
- (t
- elem)))
- ;; must be a symbol, non-symbol keymap case covered above
- ((and bind-key-describe-special-forms (keymapp elem))
- (let ((doc (get elem 'variable-documentation)))
- (if (stringp doc) doc elem)))
- ((symbolp elem)
- elem)
- (t
- "#<byte-compiled lambda>")))
-
-(defun compare-keybindings (l r)
- (let* ((regex bind-key-segregation-regexp)
- (lgroup (and (string-match regex (caar l))
- (match-string 0 (caar l))))
- (rgroup (and (string-match regex (caar r))
- (match-string 0 (caar r))))
- (lkeymap (cdar l))
- (rkeymap (cdar r)))
- (cond
- ((and (null lkeymap) rkeymap)
- (cons t t))
- ((and lkeymap (null rkeymap))
- (cons nil t))
- ((and lkeymap rkeymap
- (not (string= (symbol-name lkeymap) (symbol-name rkeymap))))
- (cons (string< (symbol-name lkeymap) (symbol-name rkeymap)) t))
- ((and (null lgroup) rgroup)
- (cons t t))
- ((and lgroup (null rgroup))
- (cons nil t))
- ((and lgroup rgroup)
- (if (string= lgroup rgroup)
- (cons (string< (caar l) (caar r)) nil)
- (cons (string< lgroup rgroup) t)))
- (t
- (cons (string< (caar l) (caar r)) nil)))))
-
-;;;###autoload
-(defun describe-personal-keybindings ()
- "Display all the personal keybindings defined by `bind-key'."
- (interactive)
- (with-output-to-temp-buffer "*Personal Keybindings*"
- (princ (format (concat "Key name%s Command%s Comments\n%s %s "
- "---------------------\n")
- (make-string (- (car bind-key-column-widths) 9) ? )
- (make-string (- (cdr bind-key-column-widths) 8) ? )
- (make-string (1- (car bind-key-column-widths)) ?-)
- (make-string (1- (cdr bind-key-column-widths)) ?-)))
- (let (last-binding)
- (dolist (binding
- (setq personal-keybindings
- (sort personal-keybindings
- (lambda (l r)
- (car (compare-keybindings l r))))))
-
- (if (not (eq (cdar last-binding) (cdar binding)))
- (princ (format "\n\n%s: %s\n%s\n\n"
- (cdar binding) (caar binding)
- (make-string (+ 21 (car bind-key-column-widths)
- (cdr bind-key-column-widths)) ?-)))
- (if (and last-binding
- (cdr (compare-keybindings last-binding binding)))
- (princ "\n")))
-
- (let* ((key-name (caar binding))
- (at-present (lookup-key (or (symbol-value (cdar binding))
- (current-global-map))
- (read-kbd-macro key-name)))
- (command (nth 1 binding))
- (was-command (nth 2 binding))
- (command-desc (get-binding-description command))
- (was-command-desc (and was-command
- (get-binding-description was-command)))
- (at-present-desc (get-binding-description at-present))
- )
- (let ((line
- (format
- (format "%%-%ds%%-%ds%%s\n" (car bind-key-column-widths)
- (cdr bind-key-column-widths))
- key-name (format "`%s\'" command-desc)
- (if (string= command-desc at-present-desc)
- (if (or (null was-command)
- (string= command-desc was-command-desc))
- ""
- (format "was `%s\'" was-command-desc))
- (format "[now: `%s\']" at-present)))))
- (princ (if (string-match "[ \t]+\n" line)
- (replace-match "\n" t t line)
- line))))
-
- (setq last-binding binding)))))
-
-(provide 'bind-key)
-
-;; Local Variables:
-;; outline-regexp: ";;;\\(;* [^\s\t\n]\\|###autoload\\)\\|("
-;; indent-tabs-mode: nil
-;; End:
-
-;;; bind-key.el ends here
diff --git a/elpa/counsel-20200706.1447/counsel-autoloads.el b/elpa/counsel-20200706.1447/counsel-autoloads.el
deleted file mode 100644
index a08a13a..0000000
--- a/elpa/counsel-20200706.1447/counsel-autoloads.el
+++ /dev/null
@@ -1,642 +0,0 @@
-;;; counsel-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "counsel" "counsel.el" (0 0 0 0))
-;;; Generated autoloads from counsel.el
-
-(autoload 'counsel-company "counsel" "\
-Complete using `company-candidates'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-irony "counsel" "\
-Inline C/C++ completion using Irony.
-
-\(fn)" t nil)
-
-(autoload 'counsel-describe-variable "counsel" "\
-Forward to `describe-variable'.
-
-Variables declared using `defcustom' are highlighted according to
-`ivy-highlight-face'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-describe-function "counsel" "\
-Forward to `describe-function'.
-
-Interactive functions (i.e., commands) are highlighted according
-to `ivy-highlight-face'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-describe-symbol "counsel" "\
-Forward to `describe-symbol'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-set-variable "counsel" "\
-Set a variable SYM, with completion.
-
-When the selected variable is a `defcustom' with the type boolean
-or radio, offer completion of all possible values.
-
-Otherwise, offer a variant of `eval-expression', with the initial
-input corresponding to the chosen variable.
-
-With a prefix arg, restrict list to variables defined using
-`defcustom'.
-
-\(fn SYM)" t nil)
-
-(autoload 'counsel-apropos "counsel" "\
-Show all matching symbols.
-See `apropos' for further information on what is considered
-a symbol and how to search for them.
-
-\(fn)" t nil)
-
-(autoload 'counsel-info-lookup-symbol "counsel" "\
-Forward SYMBOL to `info-lookup-symbol' with ivy completion.
-With prefix arg MODE a query for the symbol help mode is offered.
-
-\(fn SYMBOL &optional MODE)" t nil)
-
-(autoload 'counsel-M-x "counsel" "\
-Ivy version of `execute-extended-command'.
-Optional INITIAL-INPUT is the initial input in the minibuffer.
-This function integrates with either the `amx' or `smex' package
-when available, in that order of precedence.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-command-history "counsel" "\
-Show the history of commands.
-
-\(fn)" t nil)
-
-(autoload 'counsel-load-library "counsel" "\
-Load a selected the Emacs Lisp library.
-The libraries are offered from `load-path'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-find-library "counsel" "\
-Visit a selected the Emacs Lisp library.
-The libraries are offered from `load-path'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-load-theme "counsel" "\
-Forward to `load-theme'.
-Usable with `ivy-resume', `ivy-next-line-and-call' and
-`ivy-previous-line-and-call'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-descbinds "counsel" "\
-Show a list of all defined keys and their definitions.
-If non-nil, show only bindings that start with PREFIX.
-BUFFER defaults to the current one.
-
-\(fn &optional PREFIX BUFFER)" t nil)
-
-(autoload 'counsel-describe-face "counsel" "\
-Completion for `describe-face'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-faces "counsel" "\
-Complete faces with preview.
-Actions are provided by default for describing or customizing the
-selected face.
-
-\(fn)" t nil)
-
-(autoload 'counsel-git "counsel" "\
-Find file in the current Git repository.
-INITIAL-INPUT can be given as the initial minibuffer input.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-git-grep "counsel" "\
-Grep for a string in the current Git repository.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-When CMD is a string, use it as a \"git grep\" command.
-When CMD is non-nil, prompt for a specific \"git grep\" command.
-
-\(fn &optional INITIAL-INPUT INITIAL-DIRECTORY CMD)" t nil)
-
-(autoload 'counsel-git-stash "counsel" "\
-Search through all available git stashes.
-
-\(fn)" t nil)
-
-(autoload 'counsel-git-change-worktree "counsel" "\
-Find the file corresponding to the current buffer on a different worktree.
-
-\(fn)" t nil)
-
-(autoload 'counsel-git-checkout "counsel" "\
-Call the \"git checkout\" command.
-
-\(fn)" t nil)
-
-(autoload 'counsel-git-log "counsel" "\
-Call the \"git log --grep\" shell command.
-
-\(fn)" t nil)
-
-(autoload 'counsel-find-file "counsel" "\
-Forward to `find-file'.
-When INITIAL-INPUT is non-nil, use it in the minibuffer during completion.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-dired "counsel" "\
-Forward to `dired'.
-When INITIAL-INPUT is non-nil, use it in the minibuffer during completion.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-recentf "counsel" "\
-Find a file on `recentf-list'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-buffer-or-recentf "counsel" "\
-Find a buffer visiting a file or file on `recentf-list'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-bookmark "counsel" "\
-Forward to `bookmark-jump' or `bookmark-set' if bookmark doesn't exist.
-
-\(fn)" t nil)
-
-(autoload 'counsel-bookmarked-directory "counsel" "\
-Ivy interface for bookmarked directories.
-
-With a prefix argument, this command creates a new bookmark which points to the
-current value of `default-directory'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-file-register "counsel" "\
-Search file in register.
-
-You cannot use Emacs' normal register commands to create file
-registers. Instead you must use the `set-register' function like
-so: `(set-register ?i \"/home/eric/.emacs.d/init.el\")'. Now you
-can use `C-x r j i' to open that file.
-
-\(fn)" t nil)
-
-(autoload 'counsel-locate-action-extern "counsel" "\
-Pass X to `xdg-open' or equivalent command via the shell.
-
-\(fn X)" t nil)
-
-(autoload 'counsel-locate "counsel" "\
-Call the \"locate\" shell command.
-INITIAL-INPUT can be given as the initial minibuffer input.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-tracker "counsel" "\
-
-
-\(fn)" t nil)
-
-(autoload 'counsel-fzf "counsel" "\
-Open a file using the fzf shell command.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-FZF-PROMPT, if non-nil, is passed as `ivy-read' prompt argument.
-
-\(fn &optional INITIAL-INPUT INITIAL-DIRECTORY FZF-PROMPT)" t nil)
-
-(autoload 'counsel-dpkg "counsel" "\
-Call the \"dpkg\" shell command.
-
-\(fn)" t nil)
-
-(autoload 'counsel-rpm "counsel" "\
-Call the \"rpm\" shell command.
-
-\(fn)" t nil)
-
-(autoload 'counsel-file-jump "counsel" "\
-Jump to a file below the current directory.
-List all files within the current directory or any of its sub-directories.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-
-\(fn &optional INITIAL-INPUT INITIAL-DIRECTORY)" t nil)
-
-(autoload 'counsel-dired-jump "counsel" "\
-Jump to a directory (see `dired-jump') below the current directory.
-List all sub-directories within the current directory.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-
-\(fn &optional INITIAL-INPUT INITIAL-DIRECTORY)" t nil)
-
-(autoload 'counsel-ag "counsel" "\
-Grep for a string in a root directory using ag.
-
-By default, the root directory is the first directory containing a .git subdirectory.
-
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-EXTRA-AG-ARGS, if non-nil, is appended to `counsel-ag-base-command'.
-AG-PROMPT, if non-nil, is passed as `ivy-read' prompt argument.
-CALLER is passed to `ivy-read'.
-
-With a `\\[universal-argument]' prefix argument, prompt for INITIAL-DIRECTORY.
-With a `\\[universal-argument] \\[universal-argument]' prefix argument, prompt additionally for EXTRA-AG-ARGS.
-
-\(fn &optional INITIAL-INPUT INITIAL-DIRECTORY EXTRA-AG-ARGS AG-PROMPT &key CALLER)" t nil)
-
-(autoload 'counsel-pt "counsel" "\
-Grep for a string in the current directory using pt.
-INITIAL-INPUT can be given as the initial minibuffer input.
-This uses `counsel-ag' with `counsel-pt-base-command' instead of
-`counsel-ag-base-command'.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-ack "counsel" "\
-Grep for a string in the current directory using ack.
-INITIAL-INPUT can be given as the initial minibuffer input.
-This uses `counsel-ag' with `counsel-ack-base-command' replacing
-`counsel-ag-base-command'.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-rg "counsel" "\
-Grep for a string in the current directory using rg.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-EXTRA-RG-ARGS string, if non-nil, is appended to `counsel-rg-base-command'.
-RG-PROMPT, if non-nil, is passed as `ivy-read' prompt argument.
-
-Example input with inclusion and exclusion file patterns:
- require i -- -g*.el
-
-\(fn &optional INITIAL-INPUT INITIAL-DIRECTORY EXTRA-RG-ARGS RG-PROMPT)" t nil)
-
-(autoload 'counsel-grep "counsel" "\
-Grep for a string in the file visited by the current buffer.
-When non-nil, INITIAL-INPUT is the initial search pattern.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-grep-backward "counsel" "\
-Grep for a string in the file visited by the current buffer going
-backward similar to `swiper-backward'. When non-nil, INITIAL-INPUT is
-the initial search pattern.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-grep-or-swiper "counsel" "\
-Call `swiper' for small buffers and `counsel-grep' for large ones.
-When non-nil, INITIAL-INPUT is the initial search pattern.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-grep-or-swiper-backward "counsel" "\
-Call `swiper-backward' for small buffers and `counsel-grep-backward' for
-large ones. When non-nil, INITIAL-INPUT is the initial search pattern.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel-recoll "counsel" "\
-Search for a string in the recoll database.
-You'll be given a list of files that match.
-Selecting a file will launch `swiper' for that file.
-INITIAL-INPUT can be given as the initial minibuffer input.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'counsel--org-get-tags "counsel" "\
-
-
-\(fn)" nil nil)
-
-(autoload 'counsel-org-tag "counsel" "\
-Add or remove tags in `org-mode'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-org-tag-agenda "counsel" "\
-Set tags for the current agenda item.
-
-\(fn)" t nil)
-
-(defalias 'counsel-org-goto #'counsel-outline)
-
-(autoload 'counsel-org-goto-all "counsel" "\
-Go to a different location in any org file.
-
-\(fn)" t nil)
-
-(autoload 'counsel-org-file "counsel" "\
-Browse all attachments for current Org file.
-
-\(fn)" t nil)
-
-(autoload 'counsel-org-entity "counsel" "\
-Complete Org entities using Ivy.
-
-\(fn)" t nil)
-
-(autoload 'counsel-org-capture "counsel" "\
-Capture something.
-
-\(fn)" t nil)
-
-(autoload 'counsel-org-agenda-headlines "counsel" "\
-Choose from headers of `org-mode' files in the agenda.
-
-\(fn)" t nil)
-
-(autoload 'counsel-org-link "counsel" "\
-Insert a link to an headline with completion.
-
-\(fn)" t nil)
-
-(autoload 'counsel-mark-ring "counsel" "\
-Browse `mark-ring' interactively.
-Obeys `widen-automatically', which see.
-
-\(fn)" t nil)
-
-(autoload 'counsel-evil-marks "counsel" "\
-Ivy replacement for `evil-show-marks'.
-By default, this function respects `counsel-evil-marks-exclude-registers'.
-When ARG is non-nil, display all active evil registers.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'counsel-package "counsel" "\
-Install or delete packages.
-
-Packages not currently installed are prefixed with \"+\", and
-selecting one of these will try to install it.
-Packages currently installed are prefixed with \"-\", and
-selecting one of these will try to delete it.
-
-Additional actions:\\<ivy-minibuffer-map>
-
- \\[ivy-dispatching-done] d: Describe package
- \\[ivy-dispatching-done] h: Visit package's homepage
-
-\(fn)" t nil)
-
-(autoload 'counsel-tmm "counsel" "\
-Text-mode emulation of looking and choosing from a menu bar.
-
-\(fn)" t nil)
-
-(autoload 'counsel-yank-pop "counsel" "\
-Ivy replacement for `yank-pop'.
-With a plain prefix argument (\\[universal-argument]),
-temporarily toggle the value of `counsel-yank-pop-after-point'.
-Any other value of ARG has the same meaning as in `yank-pop', but
-`counsel-yank-pop-preselect-last' determines its default value.
-See also `counsel-yank-pop-filter' for how to filter candidates.
-
-Note: Duplicate elements of `kill-ring' are always deleted.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'counsel-register "counsel" "\
-Interactively choose a register.
-
-\(fn)" t nil)
-
-(autoload 'counsel-evil-registers "counsel" "\
-Ivy replacement for `evil-show-registers'.
-
-\(fn)" t nil)
-
-(autoload 'counsel-imenu "counsel" "\
-Jump to a buffer position indexed by imenu.
-
-\(fn)" t nil)
-
-(autoload 'counsel-list-processes "counsel" "\
-Offer completion for `process-list'.
-The default action deletes the selected process.
-An extra action allows to switch to the process buffer.
-
-\(fn)" t nil)
-
-(autoload 'counsel-minibuffer-history "counsel" "\
-Browse minibuffer history.
-
-\(fn)" t nil)
-
-(autoload 'counsel-esh-history "counsel" "\
-Browse Eshell history.
-
-\(fn)" t nil)
-
-(autoload 'counsel-shell-history "counsel" "\
-Browse shell history.
-
-\(fn)" t nil)
-
-(autoload 'counsel-slime-repl-history "counsel" "\
-Browse Slime REPL history.
-
-\(fn)" t nil)
-
-(autoload 'counsel-hydra-heads "counsel" "\
-Call a head of the current/last hydra.
-
-\(fn)" t nil)
-
-(autoload 'counsel-semantic "counsel" "\
-Jump to a semantic tag in the current buffer.
-
-\(fn)" t nil)
-
-(autoload 'counsel-semantic-or-imenu "counsel" "\
-
-
-\(fn)" t nil)
-
-(autoload 'counsel-outline "counsel" "\
-Jump to an outline heading with completion.
-
-\(fn)" t nil)
-
-(autoload 'counsel-ibuffer "counsel" "\
-Use ibuffer to switch to another buffer.
-NAME specifies the name of the buffer (defaults to \"*Ibuffer*\").
-
-\(fn &optional NAME)" t nil)
-
-(autoload 'counsel-switch-to-shell-buffer "counsel" "\
-Switch to a shell buffer, or create one.
-
-\(fn)" t nil)
-
-(autoload 'counsel-unicode-char "counsel" "\
-Insert COUNT copies of a Unicode character at point.
-COUNT defaults to 1.
-
-\(fn &optional COUNT)" t nil)
-
-(autoload 'counsel-colors-emacs "counsel" "\
-Show a list of all supported colors for a particular frame.
-
-You can insert or kill the name or hexadecimal RGB value of the
-selected color.
-
-\(fn)" t nil)
-
-(autoload 'counsel-colors-web "counsel" "\
-Show a list of all W3C web colors for use in CSS.
-
-You can insert or kill the name or hexadecimal RGB value of the
-selected color.
-
-\(fn)" t nil)
-
-(autoload 'counsel-fonts "counsel" "\
-Show a list of all supported font families for a particular frame.
-
-You can insert or kill the name of the selected font.
-
-\(fn)" t nil)
-
-(autoload 'counsel-kmacro "counsel" "\
-Interactively choose and run a keyboard macro.
-
-With prefix argument, run macro that many times.
-
-Macros are run using the current value of `kmacro-counter-value'
-and their respective counter format. Displayed next to each macro is
-the counter's format and initial value.
-
-One can use actions to copy the counter format or initial counter
-value of a macro, using them for a new macro.
-
-\(fn)" t nil)
-
-(autoload 'counsel-geiser-doc-look-up-manual "counsel" "\
-Search Scheme documentation.
-
-\(fn)" t nil)
-
-(autoload 'counsel-rhythmbox "counsel" "\
-Choose a song from the Rhythmbox library to play or enqueue.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'counsel-linux-app "counsel" "\
-Launch a Linux desktop application, similar to Alt-<F2>.
-When ARG is non-nil, ignore NoDisplay property in *.desktop files.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'counsel-wmctrl "counsel" "\
-Select a desktop window using wmctrl.
-
-\(fn)" t nil)
-
-(autoload 'counsel-switch-buffer "counsel" "\
-Switch to another buffer.
-Display a preview of the selected ivy completion candidate buffer
-in the current window.
-
-\(fn)" t nil)
-
-(autoload 'counsel-switch-buffer-other-window "counsel" "\
-Switch to another buffer in another window.
-Display a preview of the selected ivy completion candidate buffer
-in the current window.
-
-\(fn)" t nil)
-
-(autoload 'counsel-compile "counsel" "\
-Call `compile' completing with smart suggestions, optionally for DIR.
-
-\(fn &optional DIR)" t nil)
-
-(autoload 'counsel-compile-env "counsel" "\
-Update `counsel-compile-env' interactively.
-
-\(fn)" t nil)
-
-(autoload 'counsel-minor "counsel" "\
-Enable or disable minor mode.
-
-Disabled minor modes are prefixed with \"+\", and
-selecting one of these will enable it.
-Enabled minor modes are prefixed with \"-\", and
-selecting one of these will enable it.
-
-Additional actions:\\<ivy-minibuffer-map>
-
- \\[ivy-dispatching-done] d: Go to minor mode definition
- \\[ivy-dispatching-done] h: Describe minor mode
-
-\(fn)" t nil)
-
-(autoload 'counsel-major "counsel" "\
-
-
-\(fn)" t nil)
-
-(autoload 'counsel-compilation-errors "counsel" "\
-Compilation errors.
-
-\(fn)" t nil)
-
-(autoload 'counsel-flycheck "counsel" "\
-Flycheck errors.
-
-\(fn)" t nil)
-
-(defvar counsel-mode nil "\
-Non-nil if Counsel mode is enabled.
-See the `counsel-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `counsel-mode'.")
-
-(custom-autoload 'counsel-mode "counsel" nil)
-
-(autoload 'counsel-mode "counsel" "\
-Toggle Counsel mode on or off.
-Turn Counsel mode on if ARG is positive, off otherwise. Counsel
-mode remaps built-in emacs functions that have counsel
-replacements.
-
-Local bindings (`counsel-mode-map'):
-\\{counsel-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "counsel" '("counsel-" "tmm-km-list" "ivy-function-called-at-point")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; counsel-autoloads.el ends here
diff --git a/elpa/counsel-20200706.1447/counsel-pkg.el b/elpa/counsel-20200706.1447/counsel-pkg.el
deleted file mode 100644
index dfc3c72..0000000
--- a/elpa/counsel-20200706.1447/counsel-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "counsel" "20200706.1447" "Various completion functions using Ivy" '((emacs "24.5") (swiper "0.13.0")) :commit "c6b60d34ac37bf4d91a25f16d22e528f85e06938" :keywords '("convenience" "matching" "tools") :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com")) :maintainer '("Oleh Krehel" . "ohwoeowho@gmail.com") :url "https://github.com/abo-abo/swiper")
diff --git a/elpa/counsel-20200706.1447/counsel.el b/elpa/counsel-20200706.1447/counsel.el
deleted file mode 100644
index acd0972..0000000
--- a/elpa/counsel-20200706.1447/counsel.el
+++ /dev/null
@@ -1,6850 +0,0 @@
-;;; counsel.el --- Various completion functions using Ivy -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015-2019 Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel <ohwoeowho@gmail.com>
-;; URL: https://github.com/abo-abo/swiper
-;; Package-Version: 20200706.1447
-;; Package-Commit: c6b60d34ac37bf4d91a25f16d22e528f85e06938
-;; Version: 0.13.0
-;; Package-Requires: ((emacs "24.5") (swiper "0.13.0"))
-;; Keywords: convenience, matching, tools
-
-;; This file is part of GNU Emacs.
-
-;; This file 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, 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.
-
-;; For a full copy of the GNU General Public License
-;; see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Just call one of the interactive functions in this file to complete
-;; the corresponding thing using `ivy'.
-;;
-;; Currently available:
-;; - Symbol completion for Elisp, Common Lisp, Python, Clojure, C, C++.
-;; - Describe functions for Elisp: function, variable, library, command,
-;; bindings, theme.
-;; - Navigation functions: imenu, ace-line, semantic, outline.
-;; - Git utilities: git-files, git-grep, git-log, git-stash, git-checkout.
-;; - Grep utilities: grep, ag, pt, recoll, ack, rg.
-;; - System utilities: process list, rhythmbox, linux-app.
-;; - Many more.
-
-;;; Code:
-
-(require 'swiper)
-
-(require 'compile)
-(require 'dired)
-
-(eval-when-compile
- (require 'subr-x))
-
-(defgroup counsel nil
- "Completion functions using Ivy."
- :group 'matching
- :prefix "counsel-")
-
-;;* Utility
-(defun counsel--elisp-to-pcre (regex &optional look-around)
- "Convert REGEX from Elisp format to PCRE format, on best-effort basis.
-REGEX may be of any format returned by an Ivy regex function,
-namely a string or a list. The return value is always a string.
-
-Note that incorrect results may be returned for sufficiently
-complex regexes."
- (if (consp regex)
- (if (and look-around
- (or (cdr regex)
- (not (cdar regex))))
- (concat
- "^"
- (mapconcat
- (lambda (pair)
- (let ((subexp (counsel--elisp-to-pcre (car pair))))
- (format "(?%c.*%s)"
- (if (cdr pair) ?= ?!)
- subexp)))
- regex
- ""))
- (mapconcat
- (lambda (pair)
- (let ((subexp (counsel--elisp-to-pcre (car pair))))
- (if (string-match-p "|" subexp)
- (format "(?:%s)" subexp)
- subexp)))
- (cl-remove-if-not #'cdr regex)
- ".*"))
- (replace-regexp-in-string
- "\\\\[(){}|`']\\|[()]"
- (lambda (s)
- (or (cdr (assoc s '(("\\(" . "(")
- ("\\)" . ")")
- ("(" . "\\(")
- (")" . "\\)")
- ("\\{" . "{")
- ("\\}" . "}")
- ("\\|" . "|")
- ("\\`" . "^")
- ("\\'" . "$"))))
- (error
- "Unexpected error in `counsel--elisp-to-pcre' (got match %S)" s)))
- regex t t)))
-
-(defun counsel-directory-name (dir)
- "Return the name of directory DIR with a slash."
- (file-name-as-directory
- (file-name-nondirectory
- (directory-file-name dir))))
-
-(defun counsel-string-compose (prefix str)
- "Make PREFIX the display prefix of STR through text properties."
- (let ((str (copy-sequence str)))
- (put-text-property
- 0 1 'display
- (concat prefix (substring str 0 1))
- str)
- str))
-
-(defun counsel-require-program (cmd)
- "Check system for program used in CMD, printing error if not found.
-CMD is either a string or a list of strings.
-To skip the `executable-find' check, start the string with a space."
- (unless (and (stringp cmd) (string-match-p "^ " cmd))
- (let ((program (if (listp cmd)
- (car cmd)
- (car (split-string cmd)))))
- (or (and (stringp program)
- (not (string= program ""))
- (executable-find program))
- (user-error "Required program \"%s\" not found in your path" program)))))
-
-(declare-function eshell-split-path "esh-util")
-
-(defun counsel-prompt-function-dir ()
- "Return prompt appended with the parent directory."
- (require 'esh-util)
- (let* ((dir (ivy-state-directory ivy-last))
- (parts (nthcdr 3 (eshell-split-path dir)))
- (dir (format " [%s]: " (if parts (apply #'concat "..." parts) dir))))
- (ivy-add-prompt-count
- (replace-regexp-in-string ; Insert dir before any trailing colon.
- "\\(?:: ?\\)?\\'" dir (ivy-state-prompt ivy-last) t t))))
-
-(defalias 'counsel--flatten
- ;; Added in Emacs 27.1
- (if (fboundp 'flatten-tree)
- #'flatten-tree
- (lambda (tree)
- (let (elems)
- (while (consp tree)
- (let ((elem (pop tree)))
- (while (consp elem)
- (push (cdr elem) tree)
- (setq elem (car elem)))
- (if elem (push elem elems))))
- (if tree (push tree elems))
- (nreverse elems))))
- "Compatibility shim for `flatten-tree'.")
-
-(defun counsel--format (formatter &rest args)
- "Like `format' but FORMATTER can be a list.
-When FORMATTER is a list, only `%s' is replaced with ARGS.
-
-Return a list or string depending on input."
- (cond
- ((listp formatter)
- (counsel--flatten (mapcar
- (lambda (it) (if (equal it "%s") (pop args) it))
- formatter)))
- (t (apply #'format formatter args))))
-
-;;* Async Utility
-(defvar counsel--async-time nil
- "Store the time when a new process was started.
-Or the time of the last minibuffer update.")
-
-(defvar counsel--async-start nil
- "Store the time when a new process was started.")
-
-(defvar counsel--async-timer nil
- "Timer used to dispose `counsel--async-command.")
-
-(defvar counsel--async-duration nil
- "Store the time a process takes to gather all its candidates.
-The time is measured in seconds.")
-
-(defvar counsel--async-exit-code-plist ()
- "Associate commands with their exit code descriptions.
-This plist maps commands to a plist mapping their exit codes to
-descriptions.")
-
-(defvar counsel--async-last-error-string nil
- "When the process returned non-0, store the output here.")
-
-(defun counsel-set-async-exit-code (cmd number str)
- "For CMD, associate NUMBER exit code with STR."
- (let ((plist (plist-get counsel--async-exit-code-plist cmd)))
- (setq counsel--async-exit-code-plist
- (plist-put counsel--async-exit-code-plist
- cmd
- (plist-put plist number str)))))
-
-(defvar counsel-async-split-string-re-alist '((t . "[\r\n]"))
- "Store the regexp for splitting shell command output.")
-
-(defvar counsel-async-ignore-re-alist nil
- "An alist of regexp matching candidates to ignore in `counsel--async-filter'.")
-
-(defvar counsel--async-last-command nil
- "Store the last command ran by `counsel--async-command-1'.")
-
-(defun counsel--async-command-1 (cmd &optional sentinel filter name)
- "Start and return new counsel process by calling CMD.
-CMD can be either a shell command as a string, or a list of the
-program name to be called directly, followed by its arguments.
-If the default counsel process or one with NAME already exists,
-kill it and its associated buffer before starting a new one.
-Give the process the functions SENTINEL and FILTER, which default
-to `counsel--async-sentinel' and `counsel--async-filter',
-respectively."
- (counsel-delete-process name)
- (setq name (or name " *counsel*"))
- (when (get-buffer name)
- (kill-buffer name))
- (setq counsel--async-last-command cmd)
- (let* ((buf (get-buffer-create name))
- (proc (if (listp cmd)
- (apply #'start-file-process name buf cmd)
- (start-file-process-shell-command name buf cmd))))
- (setq counsel--async-time (current-time))
- (setq counsel--async-start counsel--async-time)
- (set-process-sentinel proc (or sentinel #'counsel--async-sentinel))
- (set-process-filter proc (or filter #'counsel--async-filter))
- proc))
-
-(defcustom counsel-async-command-delay 0
- "Number of seconds to wait before spawning another async command."
- :type 'number)
-
-(defun counsel--async-command (&rest args)
- "Like `counsel--async-command-1', with same ARGS, but debounced.
-Calls to `counsel--async-command-1' are separated by at least
-`counsel-async-command-delay' seconds, so as to avoid issues
-caused by spawning too many subprocesses too quickly."
- (if (zerop counsel-async-command-delay)
- (apply #'counsel--async-command-1 args)
- (when counsel--async-timer
- (cancel-timer counsel--async-timer))
- (setq counsel--async-timer
- (apply #'run-with-timer
- counsel-async-command-delay
- nil
- #'counsel--async-command-1
- args))))
-
-(defun counsel--split-string (&optional str)
- (split-string
- (or str (buffer-string))
- (ivy-alist-setting counsel-async-split-string-re-alist)
- t))
-
-(defun counsel--sync-sentinel-on-exit (process)
- (if (zerop (process-exit-status process))
- (let ((cur (ivy-state-current ivy-last)))
- (ivy--set-candidates
- (ivy--sort-maybe
- (with-current-buffer (process-buffer process)
- (counsel--split-string))))
- (when counsel--async-start
- (setq counsel--async-duration
- (time-to-seconds (time-since counsel--async-start))))
- (let ((re (ivy-re-to-str ivy-regex)))
- (if ivy--old-cands
- (if (eq (ivy-alist-setting ivy-index-functions-alist) 'ivy-recompute-index-zero)
- (ivy-set-index 0)
- (ivy--recompute-index re ivy--all-candidates))
- ;; index was changed before a long-running query exited
- (unless (string= cur (nth ivy--index ivy--all-candidates))
- (let ((func (ivy-alist-setting ivy-index-functions-alist)))
- (if func
- (funcall func re ivy--all-candidates)
- (ivy--preselect-index
- (if (> (length re) 0)
- cur
- (ivy-state-preselect ivy-last))
- ivy--all-candidates))))))
- (setq ivy--old-cands ivy--all-candidates)
- (if ivy--all-candidates
- (ivy--exhibit)
- (ivy--insert-minibuffer "")))
- (setq counsel--async-last-error-string
- (with-current-buffer (process-buffer process) (buffer-string)))
- (setq ivy--all-candidates
- (let ((status (process-exit-status process))
- (plist (plist-get counsel--async-exit-code-plist
- (ivy-state-caller ivy-last))))
- (list (or (plist-get plist status)
- (format "error code %d" status)))))
- (setq ivy--old-cands ivy--all-candidates)
- (ivy--exhibit)))
-
-(defun counsel--async-sentinel (process _msg)
- "Sentinel function for an asynchronous counsel PROCESS."
- (when (eq (process-status process) 'exit)
- (counsel--sync-sentinel-on-exit process)))
-
-(defcustom counsel-async-filter-update-time 500000
- "The amount of microseconds to wait until updating `counsel--async-filter'."
- :type 'integer)
-
-(defun counsel--async-filter (process str)
- "Receive from PROCESS the output STR.
-Update the minibuffer with the amount of lines collected every
-`counsel-async-filter-update-time' microseconds since the last update."
- (with-current-buffer (process-buffer process)
- (insert str))
- (when (time-less-p (list 0 0 counsel-async-filter-update-time)
- (time-since counsel--async-time))
- (let (numlines)
- (with-current-buffer (process-buffer process)
- (setq numlines (count-lines (point-min) (point-max)))
- (ivy--set-candidates
- (let ((lines (counsel--split-string))
- (ignore-re (ivy-alist-setting counsel-async-ignore-re-alist)))
- (if (stringp ignore-re)
- (cl-remove-if (lambda (line)
- (string-match-p ignore-re line))
- lines)
- lines))))
- (let ((ivy--prompt (format "%d++ %s" numlines (ivy-state-prompt ivy-last))))
- (ivy--insert-minibuffer (ivy--format ivy--all-candidates)))
- (setq counsel--async-time (current-time)))))
-
-(defun counsel-delete-process (&optional name)
- "Delete current counsel process or that with NAME."
- (let ((process (get-process (or name " *counsel*"))))
- (when process
- (delete-process process))))
-
-;;* Completion at point
-(define-obsolete-function-alias 'counsel-el 'complete-symbol "<2020-05-20 Wed>")
-(define-obsolete-function-alias 'counsel-cl 'complete-symbol "<2020-05-20 Wed>")
-(define-obsolete-function-alias 'counsel-jedi 'complete-symbol "<2020-05-20 Wed>")
-(define-obsolete-function-alias 'counsel-clj 'complete-symbol "<2020-05-20 Wed>")
-
-;;** `counsel-company'
-(defvar company-candidates)
-(defvar company-common)
-(defvar company-prefix)
-(declare-function company-abort "ext:company")
-(declare-function company-complete "ext:company")
-(declare-function company-mode "ext:company")
-(declare-function company-call-backend "ext:company")
-(declare-function company--clean-string "ext:company")
-
-;;;###autoload
-(defun counsel-company ()
- "Complete using `company-candidates'."
- (interactive)
- (company-mode 1)
- (unless company-candidates
- (company-complete))
- (let ((len (cond ((let (l)
- (and company-common
- (string= company-common
- (buffer-substring
- (- (point) (setq l (length company-common)))
- (point)))
- l)))
- (company-prefix
- (length company-prefix)))))
- (when len
- (setq ivy-completion-beg (- (point) len))
- (setq ivy-completion-end (point))
- (ivy-read "Candidate: " company-candidates
- :action #'ivy-completion-in-region-action
- :caller 'counsel-company))))
-
-(ivy-configure 'counsel-company
- :display-transformer-fn #'counsel--company-display-transformer
- :unwind-fn #'company-abort)
-
-(defun counsel--company-display-transformer (s)
- (concat s (let ((annot (company-call-backend 'annotation s)))
- (when annot
- (company--clean-string annot)))))
-
-;;** `counsel-irony'
-(declare-function irony-completion-candidates-async "ext:irony-completion")
-(declare-function irony-completion-symbol-bounds "ext:irony-completion")
-(declare-function irony-completion-annotation "ext:irony-completion")
-
-;;;###autoload
-(defun counsel-irony ()
- "Inline C/C++ completion using Irony."
- (interactive)
- (irony-completion-candidates-async 'counsel-irony-callback))
-
-(defun counsel-irony-callback (candidates)
- "Callback function for Irony to search among CANDIDATES."
- (interactive)
- (let* ((symbol-bounds (irony-completion-symbol-bounds))
- (beg (car symbol-bounds))
- (end (cdr symbol-bounds))
- (prefix (buffer-substring-no-properties beg end)))
- (setq ivy-completion-beg beg
- ivy-completion-end end)
- (ivy-read "code: " (mapcar #'counsel-irony-annotate candidates)
- :predicate (lambda (candidate)
- (string-prefix-p prefix (car candidate)))
- :caller 'counsel-irony
- :action #'ivy-completion-in-region-action)))
-
-(defun counsel-irony-annotate (x)
- "Make Ivy candidate from Irony candidate X."
- (cons (concat (car x) (irony-completion-annotation x))
- (car x)))
-
-(add-to-list 'ivy-display-functions-alist '(counsel-irony . ivy-display-function-overlay))
-
-;;* Elisp symbols
-;;** `counsel-describe-variable'
-(defvar counsel-describe-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-.") #'counsel-find-symbol)
- (define-key map (kbd "C-,") #'counsel--info-lookup-symbol)
- map))
-
-(ivy-set-actions
- 'counsel-describe-variable
- '(("I" counsel-info-lookup-symbol "info")
- ("d" counsel--find-symbol "definition")))
-
-(defvar counsel-describe-symbol-history ()
- "History list for variable and function names.
-Used by commands `counsel-describe-symbol',
-`counsel-describe-variable', and `counsel-describe-function'.")
-
-(defun counsel-find-symbol ()
- "Jump to the definition of the current symbol."
- (interactive)
- (ivy-exit-with-action #'counsel--find-symbol))
-(put 'counsel-find-symbol 'no-counsel-M-x t)
-
-(defun counsel--info-lookup-symbol ()
- "Lookup the current symbol in the info docs."
- (interactive)
- (ivy-exit-with-action #'counsel-info-lookup-symbol))
-
-(defvar find-tag-marker-ring)
-(declare-function xref-push-marker-stack "xref")
-
-(defalias 'counsel--push-xref-marker
- ;; Added in Emacs 25.1.
- (if (require 'xref nil t)
- #'xref-push-marker-stack
- (require 'etags)
- (lambda (&optional m)
- (ring-insert (with-no-warnings find-tag-marker-ring) (or m (point-marker)))))
- "Compatibility shim for `xref-push-marker-stack'.")
-
-(defun counsel--find-symbol (x)
- "Find symbol definition that corresponds to string X."
- (with-ivy-window
- (counsel--push-xref-marker)
- (let ((full-name (get-text-property 0 'full-name x)))
- (if full-name
- (find-library full-name)
- (let ((sym (read x)))
- (cond ((and (eq (ivy-state-caller ivy-last)
- 'counsel-describe-variable)
- (boundp sym))
- (find-variable sym))
- ((fboundp sym)
- (find-function sym))
- ((boundp sym)
- (find-variable sym))
- ((or (featurep sym)
- (locate-library
- (prin1-to-string sym)))
- (find-library
- (prin1-to-string sym)))
- (t
- (error "Couldn't find definition of %s"
- sym))))))))
-
-(defun counsel--variable-p (symbol)
- "Return non-nil if SYMBOL is a bound or documented variable."
- (or (and (boundp symbol)
- (not (keywordp symbol)))
- (get symbol 'variable-documentation)))
-
-(defcustom counsel-describe-variable-function #'describe-variable
- "Function to call to describe a variable passed as parameter."
- :type 'function)
-
-(defun counsel-describe-variable-transformer (var)
- "Propertize VAR if it's a custom variable."
- (if (custom-variable-p (intern var))
- (ivy-append-face var 'ivy-highlight-face)
- var))
-
-;;;###autoload
-(defun counsel-describe-variable ()
- "Forward to `describe-variable'.
-
-Variables declared using `defcustom' are highlighted according to
-`ivy-highlight-face'."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (ivy-read "Describe variable: " obarray
- :predicate #'counsel--variable-p
- :require-match t
- :history 'counsel-describe-symbol-history
- :keymap counsel-describe-map
- :preselect (ivy-thing-at-point)
- :action (lambda (x)
- (funcall counsel-describe-variable-function (intern x)))
- :caller 'counsel-describe-variable)))
-
-(ivy-configure 'counsel-describe-variable
- :parent 'counsel-describe-symbol
- :display-transformer-fn #'counsel-describe-variable-transformer)
-
-;;** `counsel-describe-function'
-(ivy-set-actions
- 'counsel-describe-function
- '(("I" counsel-info-lookup-symbol "info")
- ("d" counsel--find-symbol "definition")))
-
-(defcustom counsel-describe-function-function #'describe-function
- "Function to call to describe a function passed as parameter."
- :type 'function)
-
-(defun counsel-describe-function-transformer (function-name)
- "Propertize FUNCTION-NAME if it's an interactive function."
- (if (commandp (intern function-name))
- (ivy-append-face function-name 'ivy-highlight-face)
- function-name))
-
-(defun ivy-function-called-at-point ()
- (let ((f (function-called-at-point)))
- (and f (symbol-name f))))
-
-(defcustom counsel-describe-function-preselect #'ivy-thing-at-point
- "Determine what `counsel-describe-function' should preselect."
- :type '(radio
- (function-item ivy-thing-at-point)
- (function-item ivy-function-called-at-point)))
-
-;;;###autoload
-(defun counsel-describe-function ()
- "Forward to `describe-function'.
-
-Interactive functions (i.e., commands) are highlighted according
-to `ivy-highlight-face'."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (ivy-read "Describe function: " obarray
- :predicate (lambda (sym)
- (or (fboundp sym)
- (get sym 'function-documentation)))
- :require-match t
- :history 'counsel-describe-symbol-history
- :keymap counsel-describe-map
- :preselect (funcall counsel-describe-function-preselect)
- :action (lambda (x)
- (funcall counsel-describe-function-function (intern x)))
- :caller 'counsel-describe-function)))
-
-(ivy-configure 'counsel-describe-function
- :parent 'counsel-describe-symbol
- :display-transformer-fn #'counsel-describe-function-transformer)
-
-;;** `counsel-describe-symbol'
-(defcustom counsel-describe-symbol-function #'describe-symbol
- "Function to call to describe a symbol passed as parameter."
- :type 'function)
-
-;;;###autoload
-(defun counsel-describe-symbol ()
- "Forward to `describe-symbol'."
- (interactive)
- (unless (functionp 'describe-symbol)
- (user-error "This command requires Emacs 25.1 or later"))
- (require 'help-mode)
- (let ((enable-recursive-minibuffers t))
- (ivy-read "Describe symbol: " obarray
- :predicate (lambda (sym)
- (cl-some (lambda (backend)
- (funcall (cadr backend) sym))
- describe-symbol-backends))
- :require-match t
- :history 'counsel-describe-symbol-history
- :keymap counsel-describe-map
- :preselect (ivy-thing-at-point)
- :action (lambda (x)
- (funcall counsel-describe-symbol-function (intern x)))
- :caller 'counsel-describe-symbol)))
-
-(ivy-configure 'counsel-describe-symbol
- :initial-input "^"
- :sort-fn #'ivy-string<)
-
-(ivy-set-actions
- 'counsel-describe-symbol
- `(("I" ,#'counsel-info-lookup-symbol "info")
- ("d" ,#'counsel--find-symbol "definition")))
-
-;;** `counsel-set-variable'
-(defvar counsel-set-variable-history nil
- "Store history for `counsel-set-variable'.")
-
-(defun counsel-read-setq-expression (sym)
- "Read and eval a setq expression for SYM."
- (setq this-command 'eval-expression)
- (let* ((minibuffer-completing-symbol t)
- (sym-value (symbol-value sym))
- (expr (minibuffer-with-setup-hook
- (lambda ()
- ;; Functions `elisp-eldoc-documentation-function' and
- ;; `elisp-completion-at-point' added in Emacs 25.1.
- (add-function :before-until (local 'eldoc-documentation-function)
- #'elisp-eldoc-documentation-function)
- (add-hook 'completion-at-point-functions #'elisp-completion-at-point nil t)
- (run-hooks 'eval-expression-minibuffer-setup-hook)
- (goto-char (minibuffer-prompt-end))
- (forward-char 6)
- (insert (format "%S " sym)))
- (read-from-minibuffer "Eval: "
- (format
- (if (and sym-value (or (consp sym-value)
- (symbolp sym-value)))
- "(setq '%S)"
- "(setq %S)")
- sym-value)
- read-expression-map t
- 'read-expression-history))))
- expr))
-
-(defun counsel--setq-doconst (x)
- "Return a cons of description and value for X.
-X is an item of a radio- or choice-type defcustom."
- (when (listp x)
- (let ((v (car-safe (last x)))
- (tag (and (eq (car x) 'const)
- (plist-get (cdr x) :tag))))
- (when (and (or v tag) (not (eq v 'function)))
- (cons
- (concat
- (when tag
- (concat tag ": "))
- (if (stringp v) v (prin1-to-string v)))
- (if (symbolp v)
- (list 'quote v)
- v))))))
-
-(declare-function lv-message "ext:lv")
-(declare-function lv-delete-window "ext:lv")
-(declare-function custom-variable-documentation "cus-edit")
-
-(defface counsel-variable-documentation
- '((t :inherit font-lock-comment-face))
- "Face for displaying Lisp documentation."
- :group 'ivy-faces)
-
-;;;###autoload
-(defun counsel-set-variable (sym)
- "Set a variable SYM, with completion.
-
-When the selected variable is a `defcustom' with the type boolean
-or radio, offer completion of all possible values.
-
-Otherwise, offer a variant of `eval-expression', with the initial
-input corresponding to the chosen variable.
-
-With a prefix arg, restrict list to variables defined using
-`defcustom'."
- (interactive (list (intern
- (ivy-read "Set variable: " obarray
- :predicate (if current-prefix-arg
- #'custom-variable-p
- #'counsel--variable-p)
- :history 'counsel-set-variable-history
- :preselect (ivy-thing-at-point)))))
- (let ((doc (and (require 'cus-edit)
- (require 'lv nil t)
- (not (string= "nil" (custom-variable-documentation sym)))
- (propertize (custom-variable-documentation sym)
- 'face 'counsel-variable-documentation)))
- sym-type
- cands)
- (unwind-protect
- (progn
- (when doc
- (lv-message (ivy--quote-format-string doc)))
- (if (and (boundp sym)
- (setq sym-type (get sym 'custom-type))
- (cond
- ((and (consp sym-type)
- (memq (car sym-type) '(choice radio)))
- (setq cands (delq nil (mapcar #'counsel--setq-doconst
- (cdr sym-type)))))
- ((eq sym-type 'boolean)
- (setq cands '(("nil" . nil) ("t" . t))))
- (t nil)))
- (let* ((sym-val (symbol-value sym))
- (res (ivy-read (format "Set (%S <%s>): " sym sym-val)
- cands
- :preselect (prin1-to-string sym-val))))
- (when res
- (setq res
- (if (assoc res cands)
- (cdr (assoc res cands))
- (read res)))
- (kill-new (format "(setq %S %S)" sym res))
- (set sym (if (and (listp res) (eq (car res) 'quote))
- (cadr res)
- res))))
- (unless (boundp sym)
- (set sym nil))
- (let ((expr (counsel-read-setq-expression sym)))
- (kill-new (format "%S" expr))
- (eval-expression expr))))
- (when doc
- (lv-delete-window)))))
-
-;;** `counsel-apropos'
-;;;###autoload
-(defun counsel-apropos ()
- "Show all matching symbols.
-See `apropos' for further information on what is considered
-a symbol and how to search for them."
- (interactive)
- (ivy-read "Search for symbol (word list or regexp): " obarray
- :predicate (lambda (sym)
- (or (fboundp sym)
- (boundp sym)
- (facep sym)
- (symbol-plist sym)))
- :history 'counsel-apropos-history
- :preselect (ivy-thing-at-point)
- :action (lambda (pattern)
- (when (string= pattern "")
- (user-error "Please specify a pattern"))
- ;; If the user selected a candidate form the list, we use
- ;; a pattern which matches only the selected symbol.
- (if (memq this-command '(ivy-immediate-done ivy-alt-done))
- ;; Regexp pattern are passed verbatim, other input is
- ;; split into words.
- (if (string= (regexp-quote pattern) pattern)
- (apropos (split-string pattern "[ \t]+" t))
- (apropos pattern))
- (apropos (concat "\\`" pattern "\\'"))))
- :caller 'counsel-apropos))
-
-(ivy-configure 'counsel-apropos
- :sort-fn #'ivy-string<)
-
-;;** `counsel-info-lookup-symbol'
-(defvar info-lookup-mode)
-(declare-function info-lookup-guess-default "info-look")
-(declare-function info-lookup->completions "info-look")
-(declare-function info-lookup->mode-value "info-look")
-(declare-function info-lookup-select-mode "info-look")
-(declare-function info-lookup-change-mode "info-look")
-(declare-function info-lookup "info-look")
-
-;;;###autoload
-(defun counsel-info-lookup-symbol (symbol &optional mode)
- "Forward SYMBOL to `info-lookup-symbol' with ivy completion.
-With prefix arg MODE a query for the symbol help mode is offered."
- (interactive
- (progn
- (require 'info-look)
- ;; Courtesy of `info-lookup-interactive-arguments'
- (let* ((topic 'symbol)
- (mode (cond (current-prefix-arg
- (info-lookup-change-mode topic))
- ((info-lookup->mode-value
- topic (info-lookup-select-mode))
- info-lookup-mode)
- ((info-lookup-change-mode topic))))
- (enable-recursive-minibuffers t))
- (list (ivy-read "Describe symbol: " (info-lookup->completions topic mode)
- :history 'info-lookup-history
- :preselect (info-lookup-guess-default topic mode)
- :caller 'counsel-info-lookup-symbol)
- mode))))
- (info-lookup-symbol symbol mode))
-
-(ivy-configure 'counsel-info-lookup-symbol
- :sort-fn #'ivy-string<)
-
-;;** `counsel-M-x'
-(defface counsel-key-binding
- '((t :inherit font-lock-keyword-face))
- "Face used by `counsel-M-x' for key bindings."
- :group 'ivy-faces)
-
-(defface counsel-active-mode
- '((t :inherit font-lock-builtin-face))
- "Face used by `counsel-M-x' for activated modes."
- :group 'ivy-faces)
-
-(defcustom counsel-alias-expand t
- "When non-nil, show the expansion of aliases in `counsel-M-x'."
- :type 'boolean
- :group 'ivy)
-
-(defun counsel-M-x-transformer (cmd)
- "Return CMD annotated with its active key binding, if any."
- (let* ((sym (intern cmd))
- (alias (symbol-function sym))
- (key (where-is-internal sym nil t)))
- (when (or (eq sym major-mode)
- (and
- (memq sym minor-mode-list)
- (boundp sym)
- (buffer-local-value sym (ivy-state-buffer ivy-last))))
- (setq cmd (propertize cmd 'face 'counsel-active-mode)))
- (concat cmd
- (when (and (symbolp alias) counsel-alias-expand)
- (format " (%s)" alias))
- (when key
- ;; Prefer `<f2>' over `C-x 6' where applicable
- (let ((i (cl-search [?\C-x ?6] key)))
- (when i
- (let ((dup (vconcat (substring key 0 i) [f2] (substring key (+ i 2))))
- (map (current-global-map)))
- (when (equal (lookup-key map key)
- (lookup-key map dup))
- (setq key dup)))))
- (setq key (key-description key))
- (put-text-property 0 (length key) 'face 'counsel-key-binding key)
- (format " (%s)" key)))))
-
-(defvar amx-initialized)
-(defvar amx-cache)
-(declare-function amx-initialize "ext:amx")
-(declare-function amx-detect-new-commands "ext:amx")
-(declare-function amx-update "ext:amx")
-(declare-function amx-rank "ext:amx")
-(defvar smex-initialized-p)
-(defvar smex-ido-cache)
-(declare-function smex-initialize "ext:smex")
-(declare-function smex-detect-new-commands "ext:smex")
-(declare-function smex-update "ext:smex")
-(declare-function smex-rank "ext:smex")
-
-(defun counsel--M-x-externs ()
- "Return `counsel-M-x' candidates from external packages.
-The return value is a list of strings. The currently supported
-packages are, in order of precedence, `amx' and `smex'."
- (cond ((require 'amx nil t)
- (unless amx-initialized
- (amx-initialize))
- (when (amx-detect-new-commands)
- (amx-update))
- (mapcar (lambda (entry)
- (symbol-name (car entry)))
- amx-cache))
- ((require 'smex nil t)
- (unless smex-initialized-p
- (smex-initialize))
- (when (smex-detect-new-commands)
- (smex-update))
- smex-ido-cache)))
-
-(defun counsel--M-x-prompt ()
- "String for `M-x' plus the string representation of `current-prefix-arg'."
- (concat (cond ((null current-prefix-arg)
- nil)
- ((eq current-prefix-arg '-)
- "- ")
- ((integerp current-prefix-arg)
- (format "%d " current-prefix-arg))
- ((= (car current-prefix-arg) 4)
- "C-u ")
- (t
- (format "%d " (car current-prefix-arg))))
- "M-x "))
-
-(defvar counsel-M-x-history nil
- "History for `counsel-M-x'.")
-
-(defun counsel-M-x-action (cmd)
- "Execute CMD."
- (setq cmd (intern
- (subst-char-in-string ?\s ?- (string-remove-prefix "^" cmd))))
- (cond ((bound-and-true-p amx-initialized)
- (amx-rank cmd))
- ((bound-and-true-p smex-initialized-p)
- (smex-rank cmd)))
- (setq prefix-arg current-prefix-arg)
- (setq this-command cmd)
- (setq real-this-command cmd)
- (command-execute cmd 'record))
-
-;;;###autoload
-(defun counsel-M-x (&optional initial-input)
- "Ivy version of `execute-extended-command'.
-Optional INITIAL-INPUT is the initial input in the minibuffer.
-This function integrates with either the `amx' or `smex' package
-when available, in that order of precedence."
- (interactive)
- ;; When `counsel-M-x' returns, `last-command' would be set to
- ;; `counsel-M-x' because :action hasn't been invoked yet.
- ;; Instead, preserve the old value of `this-command'.
- (setq this-command last-command)
- (setq real-this-command real-last-command)
- (let ((externs (counsel--M-x-externs)))
- (ivy-read (counsel--M-x-prompt) (or externs obarray)
- :predicate (if externs
- (lambda (x)
- (not (get (intern x) 'no-counsel-M-x)))
- (lambda (sym)
- (and (commandp sym)
- (not (get sym 'byte-obsolete-info))
- (not (get sym 'no-counsel-M-x)))))
- :require-match t
- :history 'counsel-M-x-history
- :action #'counsel-M-x-action
- :keymap counsel-describe-map
- :initial-input initial-input
- :caller 'counsel-M-x)))
-
-(ivy-configure 'counsel-M-x
- :initial-input "^"
- :display-transformer-fn #'counsel-M-x-transformer)
-
-(ivy-set-actions
- 'counsel-M-x
- `(("d" counsel--find-symbol "definition")
- ("h" ,(lambda (x) (funcall counsel-describe-function-function (intern x))) "help")))
-
-;;** `counsel-command-history'
-(defun counsel-command-history-action-eval (cmd)
- "Eval the command CMD."
- (eval (read cmd)))
-
-(defun counsel-command-history-action-edit-and-eval (cmd)
- "Edit and eval the command CMD."
- (edit-and-eval-command "Eval: " (read cmd)))
-
-(ivy-set-actions
- 'counsel-command-history
- '(("r" counsel-command-history-action-eval "eval command")
- ("e" counsel-command-history-action-edit-and-eval "edit and eval command")))
-
-;;;###autoload
-(defun counsel-command-history ()
- "Show the history of commands."
- (interactive)
- (ivy-read "Command: " (mapcar #'prin1-to-string command-history)
- :require-match t
- :action #'counsel-command-history-action-eval
- :caller 'counsel-command-history))
-
-;;** `counsel-load-library'
-(defun counsel-library-candidates ()
- "Return a list of completion candidates for `counsel-load-library'."
- (let ((suffix (concat (regexp-opt '(".el" ".el.gz") t) "\\'"))
- (cands (make-hash-table :test #'equal))
- short-name
- old-val
- dir-parent
- res)
- (dolist (dir load-path)
- (setq dir (or dir default-directory)) ;; interpret nil in load-path as default-directory
- (when (file-directory-p dir)
- (dolist (file (file-name-all-completions "" dir))
- (when (string-match suffix file)
- (unless (string-match "pkg.elc?$" file)
- (setq short-name (substring file 0 (match-beginning 0)))
- (if (setq old-val (gethash short-name cands))
- (progn
- ;; assume going up directory once will resolve name clash
- (setq dir-parent (counsel-directory-name (cdr old-val)))
- (puthash short-name
- (cons
- (counsel-string-compose dir-parent (car old-val))
- (cdr old-val))
- cands)
- (setq dir-parent (counsel-directory-name dir))
- (puthash (concat dir-parent short-name)
- (cons
- (propertize
- (counsel-string-compose
- dir-parent short-name)
- 'full-name (expand-file-name file dir))
- dir)
- cands))
- (puthash short-name
- (cons (propertize
- short-name
- 'full-name (expand-file-name file dir))
- dir)
- cands)))))))
- (maphash (lambda (_k v) (push (car v) res)) cands)
- (nreverse res)))
-
-;;;###autoload
-(defun counsel-load-library ()
- "Load a selected the Emacs Lisp library.
-The libraries are offered from `load-path'."
- (interactive)
- (let ((cands (counsel-library-candidates)))
- (ivy-read "Load library: " cands
- :action (lambda (x)
- (load-library
- (get-text-property 0 'full-name x)))
- :keymap counsel-describe-map)))
-
-(ivy-set-actions
- 'counsel-load-library
- '(("d" counsel--find-symbol "definition")))
-
-;;** `counsel-find-library'
-(declare-function find-library-name "find-func")
-(defun counsel-find-library-other-window (library)
- (let ((buf (find-file-noselect (find-library-name library))))
- (pop-to-buffer buf 'other-window)))
-
-(defun counsel-find-library-other-frame (library)
- (let ((buf (find-file-noselect (find-library-name library))))
- (condition-case nil
- (switch-to-buffer-other-frame buf)
- (error (pop-to-buffer buf)))))
-
-(ivy-set-actions
- 'counsel-find-library
- '(("j" counsel-find-library-other-window "other window")
- ("f" counsel-find-library-other-frame "other frame")))
-
-;;;###autoload
-(defun counsel-find-library ()
- "Visit a selected the Emacs Lisp library.
-The libraries are offered from `load-path'."
- (interactive)
- (let ((cands (counsel-library-candidates)))
- (ivy-read "Find library: " cands
- :action #'counsel--find-symbol
- :keymap counsel-describe-map
- :caller 'counsel-find-library)))
-
-;;** `counsel-load-theme'
-(declare-function powerline-reset "ext:powerline")
-
-(defun counsel-load-theme-action (x)
- "Disable current themes and load theme X."
- (condition-case nil
- (progn
- (mapc #'disable-theme custom-enabled-themes)
- (load-theme (intern x) t)
- (when (fboundp 'powerline-reset)
- (powerline-reset)))
- (error "Problem loading theme %s" x)))
-
-;;;###autoload
-(defun counsel-load-theme ()
- "Forward to `load-theme'.
-Usable with `ivy-resume', `ivy-next-line-and-call' and
-`ivy-previous-line-and-call'."
- (interactive)
- (ivy-read "Load custom theme: "
- (mapcar 'symbol-name
- (custom-available-themes))
- :action #'counsel-load-theme-action
- :caller 'counsel-load-theme))
-
-;;** `counsel-descbinds'
-(ivy-set-actions
- 'counsel-descbinds
- '(("d" counsel-descbinds-action-find "definition")
- ("I" counsel-descbinds-action-info "info")
- ("x" counsel-descbinds-action-exec "execute")))
-
-(defvar counsel-descbinds-history nil
- "History for `counsel-descbinds'.")
-
-(defun counsel--descbinds-cands (&optional prefix buffer)
- "Get key bindings starting with PREFIX in BUFFER.
-See `describe-buffer-bindings' for further information."
- (let ((buffer (or buffer (current-buffer)))
- (re-exclude (regexp-opt
- '("<vertical-line>" "<bottom-divider>" "<right-divider>"
- "<mode-line>" "<C-down-mouse-2>" "<left-fringe>"
- "<right-fringe>" "<header-line>"
- "<vertical-scroll-bar>" "<horizontal-scroll-bar>")))
- res)
- (with-temp-buffer
- (let ((indent-tabs-mode t))
- (describe-buffer-bindings buffer prefix))
- (goto-char (point-min))
- ;; Skip the "Key translations" section
- (re-search-forward " ")
- (forward-char 1)
- (while (not (eobp))
- (when (looking-at "^\\([^\t\n]+\\)[\t ]*\\(.*\\)$")
- (let ((key (match-string 1))
- (fun (match-string 2))
- cmd)
- (unless (or (member fun '("??" "self-insert-command"))
- (string-match re-exclude key)
- (not (or (commandp (setq cmd (intern-soft fun)))
- (member fun '("Prefix Command")))))
- (push
- (cons (format
- "%-15s %s"
- (propertize key 'face 'counsel-key-binding)
- fun)
- (cons key cmd))
- res))))
- (forward-line 1)))
- (nreverse res)))
-
-(defcustom counsel-descbinds-function #'describe-function
- "Function to call to describe a function passed as parameter."
- :type 'function)
-
-(defun counsel-descbinds-action-describe (x)
- "Describe function of candidate X.
-See `describe-function' for further information."
- (let ((cmd (cddr x)))
- (funcall counsel-descbinds-function cmd)))
-
-(defun counsel-descbinds-action-exec (x)
- "Run candidate X.
-See `execute-extended-command' for further information."
- (let ((cmd (cddr x)))
- (command-execute cmd 'record)))
-
-(defun counsel-descbinds-action-find (x)
- "Find symbol definition of candidate X.
-See `counsel--find-symbol' for further information."
- (let ((cmd (cddr x)))
- (counsel--find-symbol (symbol-name cmd))))
-
-(defun counsel-descbinds-action-info (x)
- "Display symbol definition of candidate X, as found in the relevant manual.
-See `info-lookup-symbol' for further information."
- (let ((cmd (cddr x)))
- (counsel-info-lookup-symbol (symbol-name cmd))))
-
-;;;###autoload
-(defun counsel-descbinds (&optional prefix buffer)
- "Show a list of all defined keys and their definitions.
-If non-nil, show only bindings that start with PREFIX.
-BUFFER defaults to the current one."
- (interactive)
- (ivy-read "Bindings: " (counsel--descbinds-cands prefix buffer)
- :action #'counsel-descbinds-action-describe
- :history 'counsel-descbinds-history
- :caller 'counsel-descbinds))
-
-;;** `counsel-describe-face'
-(defcustom counsel-describe-face-function #'describe-face
- "Function to call to describe a face or face name argument."
- :type 'function)
-
-(defun counsel--face-at-point ()
- "Return name of face around point.
-Try detecting a face name in the text around point before falling
-back to the face of the character after point, and finally the
-`default' face."
- (symbol-name (or (face-at-point t) 'default)))
-
-;;;###autoload
-(defun counsel-describe-face ()
- "Completion for `describe-face'."
- (interactive)
- (ivy-read "Face: " (face-list)
- :require-match t
- :history 'face-name-history
- :preselect (counsel--face-at-point)
- :action counsel-describe-face-function
- :caller 'counsel-describe-face))
-
-(ivy-configure 'counsel-describe-face
- :sort-fn #'ivy-string<)
-
-(defun counsel-customize-face (name)
- "Customize face with NAME."
- (customize-face (intern name)))
-
-(defun counsel-customize-face-other-window (name)
- "Customize face with NAME in another window."
- (customize-face-other-window (intern name)))
-
-(ivy-set-actions
- 'counsel-describe-face
- '(("c" counsel-customize-face "customize")
- ("C" counsel-customize-face-other-window "customize other window")))
-
-;;** `counsel-faces'
-(defvar counsel--faces-format "%-40s %s")
-
-(defun counsel--faces-format-function (names)
- "Format NAMES according to `counsel--faces-format'."
- (let ((formatter
- (lambda (name)
- (format counsel--faces-format name
- (propertize list-faces-sample-text
- 'face (intern name))))))
- (ivy--format-function-generic
- (lambda (name)
- (funcall formatter (ivy--add-face name 'ivy-current-match)))
- formatter names "\n")))
-
-;;;###autoload
-(defun counsel-faces ()
- "Complete faces with preview.
-Actions are provided by default for describing or customizing the
-selected face."
- (interactive)
- (let* ((names (mapcar #'symbol-name (face-list)))
- (counsel--faces-format
- (format "%%-%ds %%s"
- (apply #'max 0 (mapcar #'string-width names)))))
- (ivy-read "Face: " names
- :require-match t
- :history 'face-name-history
- :preselect (counsel--face-at-point)
- :action counsel-describe-face-function
- :caller 'counsel-faces)))
-
-(ivy-configure 'counsel-faces
- :parent 'counsel-describe-face
- :format-fn #'counsel--faces-format-function)
-
-(ivy-set-actions
- 'counsel-faces
- '(("c" counsel-customize-face "customize")
- ("C" counsel-customize-face-other-window "customize other window")))
-
-;;* Git
-;;** `counsel-git'
-(defvar counsel-git-cmd "git ls-files -z --full-name --"
- "Command for `counsel-git'.")
-
-(ivy-set-actions
- 'counsel-git
- '(("j" find-file-other-window "other window")
- ("x" counsel-find-file-extern "open externally")))
-
-(defun counsel--dominating-file (file &optional dir)
- "Look up directory hierarchy for FILE, starting in DIR.
-Like `locate-dominating-file', but DIR defaults to
-`default-directory' and the return value is expanded."
- (and (setq dir (locate-dominating-file (or dir default-directory) file))
- (expand-file-name dir)))
-
-(defun counsel-locate-git-root ()
- "Return the root of the Git repository containing the current buffer."
- (or (counsel--git-root)
- (error "Not in a Git repository")))
-
-(defun counsel-git-cands (dir)
- (let ((default-directory dir))
- (split-string
- (shell-command-to-string counsel-git-cmd)
- "\0"
- t)))
-
-;;;###autoload
-(defun counsel-git (&optional initial-input)
- "Find file in the current Git repository.
-INITIAL-INPUT can be given as the initial minibuffer input."
- (interactive)
- (counsel-require-program counsel-git-cmd)
- (let ((default-directory (counsel-locate-git-root)))
- (ivy-read "Find file: " (counsel-git-cands default-directory)
- :initial-input initial-input
- :action #'counsel-git-action
- :caller 'counsel-git)))
-
-(ivy-configure 'counsel-git
- :occur #'counsel-git-occur)
-
-(defun counsel-git-action (x)
- "Find file X in current Git repository."
- (with-ivy-window
- (let ((default-directory (ivy-state-directory ivy-last)))
- (find-file x))))
-
-(defun counsel-git-occur (&optional _cands)
- "Occur function for `counsel-git' using `counsel-cmd-to-dired'."
- (cd (ivy-state-directory ivy-last))
- (counsel-cmd-to-dired
- (counsel--expand-ls
- (format "%s | %s | xargs ls"
- (replace-regexp-in-string "\\(-0\\)\\|\\(-z\\)" "" counsel-git-cmd)
- (counsel--file-name-filter)))))
-
-(defvar counsel-dired-listing-switches "-alh"
- "Switches passed to `ls' for `counsel-cmd-to-dired'.")
-
-(defun counsel-cmd-to-dired (full-cmd &optional filter)
- "Adapted from `find-dired'."
- (let ((inhibit-read-only t))
- (erase-buffer)
- (dired-mode default-directory counsel-dired-listing-switches)
- (insert " " default-directory ":\n")
- (let ((point (point)))
- (insert " " full-cmd "\n")
- (dired-insert-set-properties point (point)))
- (setq-local dired-sort-inhibit t)
- (setq-local revert-buffer-function
- (lambda (_1 _2) (counsel-cmd-to-dired full-cmd)))
- (setq-local dired-subdir-alist
- (list (cons default-directory (point-min-marker))))
- (let ((proc (start-process-shell-command
- "counsel-cmd" (current-buffer) full-cmd)))
- (set-process-filter proc filter)
- (set-process-sentinel
- proc
- (lambda (process _msg)
- (when (and (eq (process-status process) 'exit)
- (zerop (process-exit-status process)))
- (goto-char (point-min))
- (forward-line 2)
- (dired-move-to-filename)))))))
-
-;;** `counsel-git-grep'
-(defvar counsel-git-grep-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-l") 'ivy-call-and-recenter)
- (define-key map (kbd "M-q") 'counsel-git-grep-query-replace)
- (define-key map (kbd "C-c C-m") 'counsel-git-grep-switch-cmd)
- (define-key map (kbd "C-x C-d") 'counsel-cd)
- map))
-
-(defvar counsel-git-grep-cmd-default "git --no-pager grep -n --no-color -I -e \"%s\""
- "Initial command for `counsel-git-grep'.")
-
-(defvar counsel-git-grep-cmd nil
- "Store the command for `counsel-git-grep'.")
-
-(defvar counsel-git-grep-history nil
- "History for `counsel-git-grep'.")
-
-(defvar counsel-git-grep-cmd-history
- (list counsel-git-grep-cmd-default)
- "History for `counsel-git-grep' shell commands.")
-
-(defcustom counsel-grep-post-action-hook nil
- "Hook that runs after the point moves to the next candidate.
-Typical value: '(recenter)."
- :type 'hook)
-
-(defcustom counsel-git-grep-cmd-function #'counsel-git-grep-cmd-function-default
- "How a git-grep shell call is built from the input.
-This function should set `ivy--old-re'."
- :type '(radio
- (function-item counsel-git-grep-cmd-function-default)
- (function-item counsel-git-grep-cmd-function-ignore-order)
- (function :tag "Other")))
-
-(defun counsel-git-grep-cmd-function-default (str)
- (format counsel-git-grep-cmd
- (setq ivy--old-re
- (if (eq ivy--regex-function #'ivy--regex-fuzzy)
- (replace-regexp-in-string
- "\n" "" (ivy--regex-fuzzy str))
- (ivy--regex str t)))))
-
-(defun counsel-git-grep-cmd-function-ignore-order (str)
- (setq ivy--old-re (ivy--regex str t))
- (let ((parts (split-string str " " t)))
- (concat
- "git --no-pager grep --full-name -n --no-color -i -e "
- (mapconcat #'shell-quote-argument parts " --and -e "))))
-
-(defun counsel-git-grep-function (string)
- "Grep in the current Git repository for STRING."
- (or
- (ivy-more-chars)
- (progn
- (counsel--async-command
- (concat
- (funcall counsel-git-grep-cmd-function string)
- (if (ivy--case-fold-p string) " -i" "")))
- nil)))
-
-(defun counsel-git-grep-action (x)
- "Go to occurrence X in current Git repository."
- (when (string-match "\\`\\(.*?\\):\\([0-9]+\\):\\(.*\\)\\'" x)
- (let ((file-name (match-string-no-properties 1 x))
- (line-number (match-string-no-properties 2 x)))
- (find-file (expand-file-name
- file-name
- (ivy-state-directory ivy-last)))
- (goto-char (point-min))
- (forward-line (1- (string-to-number line-number)))
- (when (re-search-forward (ivy--regex ivy-text t) (line-end-position) t)
- (when swiper-goto-start-of-match
- (goto-char (match-beginning 0))))
- (swiper--ensure-visible)
- (run-hooks 'counsel-grep-post-action-hook)
- (unless (eq ivy-exit 'done)
- (swiper--cleanup)
- (swiper--add-overlays (ivy--regex ivy-text))))))
-
-(defun counsel-git-grep-transformer (str)
- "Highlight file and line number in STR."
- (when (string-match "\\`\\([^:]+\\):\\([^:]+\\):" str)
- (add-face-text-property (match-beginning 1) (match-end 1)
- 'ivy-grep-info nil str)
- (add-face-text-property (match-beginning 2) (match-end 2)
- 'ivy-grep-line-number nil str))
- str)
-
-(defvar counsel-git-grep-projects-alist nil
- "An alist of project directory to \"git-grep\" command.
-Allows to automatically use a custom \"git-grep\" command for all
-files in a project.")
-
-(defun counsel--git-grep-cmd-and-proj (cmd)
- (let ((dd (expand-file-name default-directory))
- proj)
- (cond
- ((stringp cmd))
- (current-prefix-arg
- (if (setq proj
- (cl-find-if
- (lambda (x)
- (string-match (car x) dd))
- counsel-git-grep-projects-alist))
- (setq cmd (cdr proj))
- (setq cmd
- (ivy-read "cmd: " counsel-git-grep-cmd-history
- :history 'counsel-git-grep-cmd-history
- :re-builder #'ivy--regex))
- (setq counsel-git-grep-cmd-history
- (delete-dups counsel-git-grep-cmd-history))))
- (t
- (setq cmd counsel-git-grep-cmd-default)))
- (cons proj cmd)))
-
-(defun counsel--call (command &optional result-fn)
- "Synchronously call COMMAND and return its output as a string.
-COMMAND comprises the program name followed by its arguments, as
-in `make-process'. Signal `file-error' and emit a warning if
-COMMAND fails. Obey file handlers based on `default-directory'.
-On success, RESULT-FN is called in output buffer with no arguments."
- (let ((stderr (make-temp-file "counsel-call-stderr-"))
- status)
- (unwind-protect
- (with-temp-buffer
- (setq status (apply #'process-file (car command) nil
- (list t stderr) nil (cdr command)))
- (if (eq status 0)
- (if result-fn
- (funcall result-fn)
- ;; Return all output except trailing newline.
- (buffer-substring (point-min)
- (- (point)
- (if (eq (bobp) (bolp))
- 0
- 1))))
- ;; Convert process status into error list.
- (setq status (list 'file-error
- (mapconcat #'identity `(,@command "failed") " ")
- status))
- ;; Print stderr contents, if any, to *Warnings* buffer.
- (let ((msg (condition-case err
- (unless (zerop (cadr (insert-file-contents
- stderr nil nil nil t)))
- (buffer-string))
- (error (error-message-string err)))))
- (lwarn 'ivy :warning "%s" (apply #'concat
- (error-message-string status)
- (and msg (list "\n" msg)))))
- ;; Signal `file-error' with process status.
- (signal (car status) (cdr status))))
- (delete-file stderr))))
-
-(defun counsel--command (&rest command)
- "Forward COMMAND to `counsel--call'."
- (counsel--call command))
-
-(defun counsel--grep-unwind ()
- (counsel-delete-process)
- (swiper--cleanup))
-
-;;;###autoload
-(defun counsel-git-grep (&optional initial-input initial-directory cmd)
- "Grep for a string in the current Git repository.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-When CMD is a string, use it as a \"git grep\" command.
-When CMD is non-nil, prompt for a specific \"git grep\" command."
- (interactive)
- (let ((proj-and-cmd (counsel--git-grep-cmd-and-proj cmd))
- proj)
- (setq proj (car proj-and-cmd))
- (setq counsel-git-grep-cmd (cdr proj-and-cmd))
- (counsel-require-program counsel-git-grep-cmd)
- (let ((collection-function
- (if proj
- #'counsel-git-grep-proj-function
- #'counsel-git-grep-function))
- (default-directory (or initial-directory
- (if proj
- (car proj)
- (counsel-locate-git-root)))))
- (ivy-read "git grep: " collection-function
- :initial-input initial-input
- :dynamic-collection t
- :keymap counsel-git-grep-map
- :action #'counsel-git-grep-action
- :history 'counsel-git-grep-history
- :require-match t
- :caller 'counsel-git-grep))))
-
-(defun counsel--git-grep-index (_re-str cands)
- (let (name ln)
- (cond
- (ivy--old-cands
- (ivy-recompute-index-swiper-async nil cands))
- ((unless (with-ivy-window
- (when buffer-file-name
- (setq ln (line-number-at-pos))
- (setq name (file-name-nondirectory buffer-file-name))))
- 0))
- ;; Closest to current line going forwards.
- ((let ((beg (1+ (length name))))
- (cl-position-if (lambda (x)
- (and (string-prefix-p name x)
- (>= (string-to-number (substring x beg)) ln)))
- cands)))
- ;; Closest to current line going backwards.
- ((cl-position-if (lambda (x)
- (string-prefix-p name x))
- cands
- :from-end t))
- (t 0))))
-
-(ivy-configure 'counsel-git-grep
- :occur #'counsel-git-grep-occur
- :unwind-fn #'counsel--grep-unwind
- :index-fn #'counsel--git-grep-index
- :display-transformer-fn #'counsel-git-grep-transformer
- :grep-p t
- :exit-codes '(1 "No matches found"))
-
-(defun counsel-git-grep-proj-function (str)
- "Grep for STR in the current Git repository."
- (or
- (ivy-more-chars)
- (let ((regex (setq ivy--old-re
- (ivy--regex str t))))
- (counsel--async-command
- (concat
- (format counsel-git-grep-cmd regex)
- (if (ivy--case-fold-p str) " -i" "")))
- nil)))
-
-(defun counsel-git-grep-switch-cmd ()
- "Set `counsel-git-grep-cmd' to a different value."
- (interactive)
- (setq counsel-git-grep-cmd
- (ivy-read "cmd: " counsel-git-grep-cmd-history
- :history 'counsel-git-grep-cmd-history))
- (setq counsel-git-grep-cmd-history
- (delete-dups counsel-git-grep-cmd-history))
- (unless (ivy-state-dynamic-collection ivy-last)
- (setq ivy--all-candidates
- (all-completions "" 'counsel-git-grep-function))))
-
-(defun counsel--normalize-grep-match (str)
- ;; Prepend ./ if necessary:
- (unless (ivy--starts-with-dotslash str)
- (setq str (concat "./" str)))
- ;; Remove column info if any:
- (save-match-data
- (when (string-match
- "[^\n:]+?[^\n/:]:[\t ]*[1-9][0-9]*[\t ]*:\\([1-9][0-9]*:\\)"
- str)
- (setq str (replace-match "" t t str 1))))
- str)
-
-(defun counsel--git-grep-occur-cmd (input)
- (let* ((regex ivy--old-re)
- (positive-pattern (replace-regexp-in-string
- ;; git-grep can't handle .*?
- "\\.\\*\\?" ".*"
- (ivy-re-to-str regex)))
- (negative-patterns
- (if (stringp regex) ""
- (mapconcat (lambda (x)
- (and (null (cdr x))
- (format "| grep -v %s" (car x))))
- regex
- " "))))
- (concat
- (format counsel-git-grep-cmd positive-pattern)
- negative-patterns
- (if (ivy--case-fold-p input) " -i" ""))))
-
-(defun counsel-git-grep-occur (&optional _cands)
- "Generate a custom occur buffer for `counsel-git-grep'."
- (counsel-grep-like-occur #'counsel--git-grep-occur-cmd))
-
-(defun counsel-git-grep-query-replace ()
- "Start `query-replace' with string to replace from last search string."
- (interactive)
- (unless (window-minibuffer-p)
- (user-error
- "Should only be called in the minibuffer through `counsel-git-grep-map'"))
- (let* ((enable-recursive-minibuffers t)
- (from (ivy--regex ivy-text))
- (to (query-replace-read-to from "Query replace" t)))
- (ivy-exit-with-action
- (lambda (_)
- (let (done-buffers)
- (dolist (cand ivy--old-cands)
- (when (string-match "\\`\\(.*?\\):\\([0-9]+\\):\\(.*\\)\\'" cand)
- (with-ivy-window
- (let ((file-name (match-string-no-properties 1 cand)))
- (setq file-name (expand-file-name
- file-name
- (ivy-state-directory ivy-last)))
- (unless (member file-name done-buffers)
- (push file-name done-buffers)
- (find-file file-name)
- (goto-char (point-min)))
- (perform-replace from to t t nil))))))))))
-
-;;** `counsel-git-stash'
-(defun counsel-git-stash-kill-action (x)
- "Add git stash command to kill ring.
-The git command applies the stash entry where candidate X was found in."
- (when (string-match "\\([^:]+\\):" x)
- (kill-new (message (format "git stash apply %s" (match-string 1 x))))))
-
-;;;###autoload
-(defun counsel-git-stash ()
- "Search through all available git stashes."
- (interactive)
- (let* ((default-directory (counsel-locate-git-root))
- (cands (split-string (shell-command-to-string
- "IFS=$'\n'
-for i in `git stash list --format=\"%gd\"`; do
- git stash show -p $i | grep -H --label=\"$i\" \"$1\"
-done") "\n" t)))
- (ivy-read "git stash: " cands
- :action #'counsel-git-stash-kill-action
- :caller 'counsel-git-stash)))
-
-;;** `counsel-git-log'
-(defvar counsel-git-log-cmd "GIT_PAGER=cat git log --no-color --grep '%s'"
- "Command used for \"git log\".")
-
-(defun counsel-git-log-function (_)
- "Search for `ivy-regex' in git log."
- (or
- (ivy-more-chars)
- (progn
- ;; `counsel--yank-pop-format-function' uses this
- (setq ivy--old-re ivy-regex)
- (counsel--async-command
- ;; "git log --grep" likes to have groups quoted e.g. \(foo\).
- ;; But it doesn't like the non-greedy ".*?".
- (format counsel-git-log-cmd
- (replace-regexp-in-string "\\.\\*\\?" ".*"
- (ivy-re-to-str ivy--old-re))))
- nil)))
-
-(defun counsel-git-log-action (x)
- "Add candidate X to kill ring."
- (message "%S" (kill-new x)))
-
-(declare-function magit-show-commit "ext:magit-diff")
-
-(defun counsel-git-log-show-commit-action (log-entry)
- "Visit the commit corresponding to LOG-ENTRY."
- (require 'magit-diff)
- (let ((commit (substring-no-properties log-entry 0 (string-match-p "\\W" log-entry))))
- (magit-show-commit commit)))
-
-(ivy-set-actions
- 'counsel-git-log
- '(("v" counsel-git-log-show-commit-action "visit commit")))
-
-;;** `counsel-git-change-worktree'
-(defun counsel-git-change-worktree-action (git-root-dir tree)
- "Find the corresponding file in the worktree located at tree.
-The current buffer is assumed to be in a subdirectory of GIT-ROOT-DIR.
-TREE is the selected candidate."
- (let* ((new-root-dir (counsel-git-worktree-parse-root tree))
- (tree-filename (file-relative-name buffer-file-name git-root-dir))
- (file-name (expand-file-name tree-filename new-root-dir)))
- (find-file file-name)))
-
-(defun counsel-git-worktree-list ()
- "List worktrees in the Git repository containing the current buffer."
- (let ((default-directory (counsel-locate-git-root)))
- (split-string (shell-command-to-string "git worktree list") "\n" t)))
-
-(defun counsel-git-worktree-parse-root (tree)
- "Return worktree from candidate TREE."
- (substring tree 0 (string-match-p " " tree)))
-
-(defun counsel-git-close-worktree-files-action (root-dir)
- "Close all buffers from the worktree located at ROOT-DIR."
- (setq root-dir (counsel-git-worktree-parse-root root-dir))
- (save-excursion
- (dolist (buf (buffer-list))
- (set-buffer buf)
- (and buffer-file-name
- (string= "." (file-relative-name root-dir (counsel-locate-git-root)))
- (kill-buffer buf)))))
-
-(ivy-set-actions
- 'counsel-git-change-worktree
- '(("k" counsel-git-close-worktree-files-action "kill all")))
-
-;;;###autoload
-(defun counsel-git-change-worktree ()
- "Find the file corresponding to the current buffer on a different worktree."
- (interactive)
- (let ((default-directory (counsel-locate-git-root)))
- (ivy-read "Select worktree: "
- (or (cl-delete default-directory (counsel-git-worktree-list)
- :key #'counsel-git-worktree-parse-root :test #'string=)
- (error "No other worktrees"))
- :action (lambda (tree)
- (counsel-git-change-worktree-action
- (ivy-state-directory ivy-last) tree))
- :require-match t
- :caller 'counsel-git-change-worktree)))
-
-;;** `counsel-git-checkout'
-(defun counsel-git-checkout-action (branch)
- "Switch branch by invoking git-checkout(1).
-The command is passed a single argument comprising all characters
-in BRANCH up to, but not including, the first space
-character (#x20), or the string's end if it lacks a space."
- (shell-command
- (format "git checkout %s"
- (shell-quote-argument
- (substring branch 0 (string-match-p " " branch))))))
-
-(defun counsel-git-branch-list ()
- "Return list of branches in the current Git repository.
-Value comprises all local and remote branches bar the one
-currently checked out."
- (cl-mapcan (lambda (line)
- (and (string-match "\\`[[:blank:]]+" line)
- (list (substring line (match-end 0)))))
- (let ((default-directory (counsel-locate-git-root)))
- (split-string (shell-command-to-string "git branch -vv --all")
- "\n" t))))
-
-;;;###autoload
-(defun counsel-git-checkout ()
- "Call the \"git checkout\" command."
- (interactive)
- (ivy-read "Checkout branch: " (counsel-git-branch-list)
- :action #'counsel-git-checkout-action
- :caller 'counsel-git-checkout))
-
-(defvar counsel-yank-pop-truncate-radius)
-
-(defun counsel--git-log-format-function (str)
- (let ((counsel-yank-pop-truncate-radius 5))
- (counsel--yank-pop-format-function str)))
-
-;;;###autoload
-(defun counsel-git-log ()
- "Call the \"git log --grep\" shell command."
- (interactive)
- (ivy-read "Grep log: " #'counsel-git-log-function
- :dynamic-collection t
- :action #'counsel-git-log-action
- :caller 'counsel-git-log))
-
-(ivy-configure 'counsel-git-log
- :height 4
- :unwind-fn #'counsel-delete-process
- :format-fn #'counsel--git-log-format-function)
-
-(add-to-list 'counsel-async-split-string-re-alist '(counsel-git-log . "^commit "))
-(add-to-list 'counsel-async-ignore-re-alist '(counsel-git-log . "^[ \n]*$"))
-
-;;* File
-;;** `counsel-find-file'
-(defvar counsel-find-file-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-DEL") 'counsel-up-directory)
- (define-key map (kbd "C-<backspace>") 'counsel-up-directory)
- (define-key map (kbd "`") (ivy-make-magic-action 'counsel-find-file "b"))
- (define-key map [remap undo] 'counsel-find-file-undo)
- map))
-
-(when (executable-find "git")
- (add-to-list 'ivy-ffap-url-functions 'counsel-github-url-p)
- (add-to-list 'ivy-ffap-url-functions 'counsel-emacs-url-p))
-(add-to-list 'ivy-ffap-url-functions 'counsel-url-expand)
-(defun counsel-find-file-cd-bookmark-action (_)
- "Reset `counsel-find-file' from selected directory."
- (ivy-read "cd: "
- (progn
- (ivy--virtual-buffers)
- (delete-dups
- (mapcar (lambda (x) (file-name-directory (cdr x)))
- ivy--virtual-buffers)))
- :action (lambda (x)
- (let ((default-directory (file-name-directory x)))
- (counsel-find-file)))))
-
-(defcustom counsel-root-command "sudo"
- "Command to gain root privileges."
- :type 'string)
-
-(defun counsel-find-file-as-root (x)
- "Find file X with root privileges."
- (counsel-require-program counsel-root-command)
- (let* ((host (file-remote-p x 'host))
- (file-name (format "/%s:%s:%s"
- counsel-root-command
- (or host "")
- (expand-file-name
- (if host
- (file-remote-p x 'localname)
- x)))))
- ;; If the current buffer visits the same file we are about to open,
- ;; replace the current buffer with the new one.
- (if (eq (current-buffer) (get-file-buffer x))
- (find-alternate-file file-name)
- (find-file file-name))))
-
-(defun counsel--yes-or-no-p (fmt &rest args)
- "Ask user a yes or no question created using FMT and ARGS.
-If Emacs 26 user option `read-answer-short' is bound, use it to
-choose between `yes-or-no-p' and `y-or-n-p'; otherwise default to
-`yes-or-no-p'."
- (funcall (if (and (boundp 'read-answer-short)
- (cond ((eq read-answer-short t))
- ((eq read-answer-short 'auto)
- (eq (symbol-function 'yes-or-no-p) 'y-or-n-p))))
- #'y-or-n-p
- #'yes-or-no-p)
- (apply #'format fmt args)))
-
-(defun counsel-find-file-copy (x)
- "Copy file X."
- (require 'dired-aux)
- (counsel--find-file-1 "Copy file to: "
- ivy--directory
- (lambda (new-name)
- (dired-copy-file x new-name 1))
- 'counsel-find-file-copy))
-
-(defun counsel-find-file-delete (x)
- "Delete file X."
- (when (or delete-by-moving-to-trash
- ;; `dired-delete-file', which see, already prompts for directories
- (eq t (car (file-attributes x)))
- (counsel--yes-or-no-p "Delete %s? " x))
- (dired-delete-file x dired-recursive-deletes delete-by-moving-to-trash)
- (dired-clean-up-after-deletion x)
- (let ((win (and (not (eq ivy-exit 'done))
- (active-minibuffer-window))))
- (when win (with-selected-window win (ivy--cd ivy--directory))))))
-
-(defun counsel-find-file-move (x)
- "Move or rename file X."
- (require 'dired-aux)
- (counsel--find-file-1 "Rename file to: "
- ivy--directory
- (lambda (new-name)
- (dired-rename-file x new-name 1))
- 'counsel-find-file-move))
-
-(defun counsel-find-file-mkdir-action (_x)
- "Create a directory and any nonexistent parent dirs from `ivy-text'."
- (let ((dir (file-name-as-directory
- (expand-file-name ivy-text ivy--directory)))
- (win (and (not (eq ivy-exit 'done))
- (active-minibuffer-window))))
- (make-directory dir t)
- (when win (with-selected-window win (ivy--cd dir)))))
-
-(ivy-set-actions
- 'counsel-find-file
- '(("j" find-file-other-window "other window")
- ("f" find-file-other-frame "other frame")
- ("b" counsel-find-file-cd-bookmark-action "cd bookmark")
- ("x" counsel-find-file-extern "open externally")
- ("r" counsel-find-file-as-root "open as root")
- ("R" find-file-read-only "read only")
- ("l" find-file-literally "open literally")
- ("k" counsel-find-file-delete "delete")
- ("c" counsel-find-file-copy "copy file")
- ("m" counsel-find-file-move "move or rename")
- ("d" counsel-find-file-mkdir-action "mkdir")))
-
-(defcustom counsel-find-file-at-point nil
- "When non-nil, add file-at-point to the list of candidates."
- :type 'boolean)
-
-(defcustom counsel-preselect-current-file nil
- "When non-nil, preselect current file in list of candidates."
- :type 'boolean)
-
-(defcustom counsel-find-file-ignore-regexp nil
- "A regexp of files to ignore while in `counsel-find-file'.
-These files are un-ignored if `ivy-text' matches them. The
-common way to show all files is to start `ivy-text' with a dot.
-
-Example value: \"\\(?:\\`[#.]\\)\\|\\(?:[#~]\\'\\)\". This will hide
-temporary and lock files.
-\\<ivy-minibuffer-map>
-Choosing the dotfiles option, \"\\`\\.\", might be convenient,
-since you can still access the dotfiles if your input starts with
-a dot. The generic way to toggle ignored files is \\[ivy-toggle-ignore],
-but the leading dot is a lot faster."
- :type `(choice
- (const :tag "None" nil)
- (const :tag "Dotfiles and Lockfiles" "\\(?:\\`\\|[/\\]\\)\\(?:[#.]\\)")
- (const :tag "Ignored Extensions"
- ,(regexp-opt completion-ignored-extensions))
- (regexp :tag "Regex")))
-
-(defvar counsel--find-file-predicate nil
- "When non-nil, `counsel--find-file-matcher' will use this predicate.")
-
-(defun counsel--find-file-matcher (regexp candidates)
- "Return REGEXP matching CANDIDATES.
-Skip some dotfiles unless `ivy-text' requires them."
- (let ((res
- (ivy--re-filter
- regexp candidates
- (lambda (re-str)
- (lambda (x)
- (string-match re-str (directory-file-name x)))))))
- (when counsel--find-file-predicate
- (let ((default-directory ivy--directory))
- (setq res (cl-remove-if-not counsel--find-file-predicate res))))
- (if (or (null ivy-use-ignore)
- (null counsel-find-file-ignore-regexp)
- (string-match-p counsel-find-file-ignore-regexp ivy-text))
- res
- (or (cl-remove-if
- (lambda (x)
- (and
- (string-match-p counsel-find-file-ignore-regexp x)
- (not (member x ivy-extra-directories))))
- res)
- res))))
-
-(declare-function ffap-guesser "ffap")
-
-(defvar counsel-find-file-speedup-remote t
- "Speed up opening remote files by disabling `find-file-hook' for them.")
-
-(defcustom counsel-find-file-extern-extensions '("mp4" "mkv" "xlsx")
- "List of extensions that make `counsel-find-file' use `counsel-find-file-extern'."
- :type '(repeat string))
-
-(defun counsel-find-file-action (x)
- "Find file X."
- (with-ivy-window
- (cond ((and counsel-find-file-speedup-remote
- (file-remote-p ivy--directory))
- (let ((find-file-hook nil))
- (find-file (expand-file-name x ivy--directory))))
- ((member (file-name-extension x) counsel-find-file-extern-extensions)
- (counsel-find-file-extern x))
- (t
- (find-file (expand-file-name x ivy--directory))))))
-
-(defun counsel--preselect-file ()
- "Return candidate to preselect during filename completion.
-The preselect behavior can be customized via user options
-`counsel-find-file-at-point' and
-`counsel-preselect-current-file', which see."
- (or
- (when counsel-find-file-at-point
- (require 'ffap)
- (let ((f (ffap-guesser)))
- (when (and f (not (ivy-ffap-url-p f)))
- (expand-file-name f))))
- (and counsel-preselect-current-file
- buffer-file-name
- (file-name-nondirectory buffer-file-name))))
-
-(defun counsel--find-file-1 (prompt initial-input action caller)
- (let ((default-directory
- (if (eq major-mode 'dired-mode)
- (dired-current-directory)
- default-directory)))
- (ivy-read prompt #'read-file-name-internal
- :matcher #'counsel--find-file-matcher
- :initial-input initial-input
- :action action
- :preselect (counsel--preselect-file)
- :require-match 'confirm-after-completion
- :history 'file-name-history
- :keymap counsel-find-file-map
- :caller caller)))
-
-;;;###autoload
-(defun counsel-find-file (&optional initial-input)
- "Forward to `find-file'.
-When INITIAL-INPUT is non-nil, use it in the minibuffer during completion."
- (interactive)
- (counsel--find-file-1
- "Find file: " initial-input
- #'counsel-find-file-action
- 'counsel-find-file))
-
-(ivy-configure 'counsel-find-file
- :parent 'read-file-name-internal
- :occur #'counsel-find-file-occur)
-
-(defvar counsel-find-file-occur-cmd "ls -a | %s | xargs -d '\\n' ls -d --group-directories-first"
- "Format string for `counsel-find-file-occur'.")
-
-(defvar counsel-find-file-occur-use-find (not (eq system-type 'gnu/linux))
- "When non-nil, `counsel-find-file-occur' will use \"find\" as the base cmd.")
-
-(defun counsel--expand-ls (cmd)
- "Expand CMD that ends in \"ls\" with switches."
- (concat cmd " " counsel-dired-listing-switches " | sed -e \"s/^/ /\""))
-
-(defvar counsel-file-name-filter-alist
- '(("ag -i '%s'" . t)
- ("ack -i '%s'" . t)
- ("perl -ne '/(.*%s.*)/i && print \"$1\\n\";'" . t)
- ("grep -i -E '%s'"))
- "Alist of file name filtering commands.
-The car is a shell command and the cdr is t when the shell
-command supports look-arounds. The executable for the commands
-will be checked for existence via `executable-find'. The first
-one that exists will be used.")
-
-(defun counsel--file-name-filter (&optional use-ignore)
- "Return a command that filters a file list to match ivy candidates.
-If USE-IGNORE is non-nil, try to generate a command that respects
-`counsel-find-file-ignore-regexp'."
- (let ((regex ivy--old-re))
- (if (= 0 (length regex))
- "cat"
- (let ((filter-cmd (cl-find-if
- (lambda (x)
- (executable-find
- (car (split-string (car x)))))
- counsel-file-name-filter-alist))
- cmd)
- (when (and use-ignore ivy-use-ignore
- counsel-find-file-ignore-regexp
- (cdr filter-cmd)
- (not (string-match-p counsel-find-file-ignore-regexp ivy-text))
- (not (string-match-p counsel-find-file-ignore-regexp
- (or (car ivy--old-cands) ""))))
- (let ((ignore-re (list (counsel--elisp-to-pcre
- counsel-find-file-ignore-regexp))))
- (setq regex (if (stringp regex)
- (list ignore-re (cons regex t))
- (cons ignore-re regex)))))
- (setq cmd (format (car filter-cmd)
- (counsel--elisp-to-pcre regex (cdr filter-cmd))))
- (if (string-match-p "csh\\'" shell-file-name)
- (replace-regexp-in-string "\\?!" "?\\\\!" cmd)
- cmd)))))
-
-(defun counsel--occur-cmd-find ()
- (let ((cmd (format
- "find . -maxdepth 1 | %s | xargs -I {} find {} -maxdepth 0 -ls"
- (counsel--file-name-filter t))))
- (concat
- (counsel--cmd-to-dired-by-type "d" cmd)
- " && "
- (counsel--cmd-to-dired-by-type "f" cmd))))
-
-(defun counsel--cmd-to-dired-by-type (type cmd)
- (let ((exclude-dots
- (if (string-match "^\\." ivy-text)
- ""
- " | grep -v '/\\\\.'")))
- (replace-regexp-in-string
- " | grep"
- (concat " -type " type exclude-dots " | grep") cmd)))
-
-(defun counsel-find-file-occur (&optional _cands)
- (require 'find-dired)
- (cd ivy--directory)
- (if counsel-find-file-occur-use-find
- (counsel-cmd-to-dired
- (counsel--occur-cmd-find)
- 'find-dired-filter)
- (counsel-cmd-to-dired
- (counsel--expand-ls
- (format counsel-find-file-occur-cmd
- (if (string-match-p "grep" counsel-find-file-occur-cmd)
- ;; for backwards compatibility
- (counsel--elisp-to-pcre ivy--old-re)
- (counsel--file-name-filter t)))))))
-
-(defvar counsel-up-directory-level t
- "Control whether `counsel-up-directory' goes up a level or always a directory.
-
-If non-nil, then `counsel-up-directory' will remove the final level of the path.
-For example: /a/long/path/file.jpg => /a/long/path/
- /a/long/path/ => /a/long/
-
-If nil, then `counsel-up-directory' will go up a directory.
-For example: /a/long/path/file.jpg => /a/long/
- /a/long/path/ => /a/long/")
-
-(defun counsel-up-directory ()
- "Go to the parent directory preselecting the current one.
-
-If the current directory is remote and it's not possible to go up any
-further, make the remote prefix editable.
-
-See variable `counsel-up-directory-level'."
- (interactive)
- (let* ((cur-dir (directory-file-name (expand-file-name ivy--directory)))
- (up-dir (file-name-directory cur-dir)))
- (if (and (file-remote-p cur-dir) (string-equal cur-dir up-dir))
- (progn
- ;; make the remote prefix editable
- (setq ivy--old-cands nil)
- (setq ivy--old-re nil)
- (ivy-set-index 0)
- (setq ivy--directory "")
- (setq ivy--all-candidates nil)
- (ivy-set-text "")
- (delete-minibuffer-contents)
- (insert up-dir))
- (if (and counsel-up-directory-level (not (string= ivy-text "")))
- (delete-region (line-beginning-position) (line-end-position))
- (ivy--cd up-dir)
- (setf (ivy-state-preselect ivy-last)
- (file-name-as-directory (file-name-nondirectory cur-dir)))))))
-
-(defun counsel-down-directory ()
- "Descend into the current directory."
- (interactive)
- (ivy--directory-enter))
-
-(defun counsel-find-file-undo ()
- (interactive)
- (if (string= ivy-text "")
- (let ((dir (progn
- (pop ivy--directory-hist)
- (pop ivy--directory-hist))))
- (when dir
- (ivy--cd dir)))
- (undo)))
-
-(defun counsel-at-git-issue-p ()
- "When point is at an issue in a Git-versioned file, return the issue string."
- (and (looking-at "#[0-9]+")
- (or (eq (vc-backend buffer-file-name) 'Git)
- (memq major-mode '(magit-commit-mode vc-git-log-view-mode))
- (bound-and-true-p magit-commit-mode))
- (match-string-no-properties 0)))
-
-(defun counsel-github-url-p ()
- "Return a Github issue URL at point."
- (counsel-require-program "git")
- (let ((url (counsel-at-git-issue-p)))
- (when url
- (let ((origin (shell-command-to-string
- "git remote get-url origin"))
- user repo)
- (cond ((string-match "\\`git@github.com:\\([^/]+\\)/\\(.*\\)\\.git$"
- origin)
- (setq user (match-string 1 origin))
- (setq repo (match-string 2 origin)))
- ((string-match "\\`https://github.com/\\([^/]+\\)/\\(.*\\)$"
- origin)
- (setq user (match-string 1 origin))
- (setq repo (match-string 2 origin))))
- (when user
- (setq url (format "https://github.com/%s/%s/issues/%s"
- user repo (substring url 1))))))))
-
-(defun counsel-emacs-url-p ()
- "Return a Debbugs issue URL at point."
- (counsel-require-program "git")
- (let ((url (counsel-at-git-issue-p)))
- (when url
- (let ((origin (shell-command-to-string
- "git remote get-url origin")))
- (when (string-match "git.sv.gnu.org:/srv/git/emacs.git" origin)
- (format "https://debbugs.gnu.org/cgi/bugreport.cgi?bug=%s"
- (substring url 1)))))))
-
-(defvar counsel-url-expansions-alist nil
- "Map of regular expressions to expansions.
-
-This variable should take the form of a list of (REGEXP . FORMAT)
-pairs.
-
-`counsel-url-expand' will expand the word at point according to
-FORMAT for the first matching REGEXP. FORMAT can be either a
-string or a function. If it is a string, it will be used as the
-format string for the `format' function, with the word at point
-as the next argument. If it is a function, it will be called
-with the word at point as the sole argument.
-
-For example, a pair of the form:
- '(\"\\`BSERV-[[:digit:]]+\\'\" . \"https://jira.atlassian.com/browse/%s\")
-will expand to URL `https://jira.atlassian.com/browse/BSERV-100'
-when the word at point is BSERV-100.
-
-If the format element is a function, more powerful
-transformations are possible. As an example,
- '(\"\\`issue\\([[:digit:]]+\\)\\'\" .
- (lambda (word)
- (concat \"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=\"
- (match-string 1 word))))
-trims the \"issue\" prefix from the word at point before creating the URL.")
-
-(defun counsel-url-expand ()
- "Expand word at point using `counsel-url-expansions-alist'.
-The first pair in the list whose regexp matches the word at point
-will be expanded according to its format. This function is
-intended to be used in `ivy-ffap-url-functions' to browse the
-result as a URL."
- (let ((word-at-point (current-word)))
- (when word-at-point
- (cl-some
- (lambda (pair)
- (let ((regexp (car pair))
- (formatter (cdr pair)))
- (when (string-match regexp word-at-point)
- (if (functionp formatter)
- (funcall formatter word-at-point)
- (format formatter word-at-point)))))
- counsel-url-expansions-alist))))
-
-;;** `counsel-dired'
-(declare-function dired "dired")
-
-;;;###autoload
-(defun counsel-dired (&optional initial-input)
- "Forward to `dired'.
-When INITIAL-INPUT is non-nil, use it in the minibuffer during completion."
- (interactive)
- (let ((counsel--find-file-predicate #'file-directory-p))
- (counsel--find-file-1
- "Dired (directory): " initial-input
- (lambda (d) (dired (expand-file-name d)))
- 'counsel-dired)))
-
-(ivy-configure 'counsel-dired
- :parent 'read-file-name-internal)
-
-;;** `counsel-recentf'
-(defvar recentf-list)
-(declare-function recentf-mode "recentf")
-
-(defcustom counsel-recentf-include-xdg-list nil
- "Include recently used files listed by XDG-compliant environments.
-Examples of such environments are GNOME and KDE. See the URL
-`https://www.freedesktop.org/wiki/Specifications/desktop-bookmark-spec'."
- :type 'boolean
- :link '(url-link "\
-https://www.freedesktop.org/wiki/Specifications/desktop-bookmark-spec"))
-
-;;;###autoload
-(defun counsel-recentf ()
- "Find a file on `recentf-list'."
- (interactive)
- (require 'recentf)
- (recentf-mode)
- (ivy-read "Recentf: " (counsel-recentf-candidates)
- :action (lambda (f)
- (with-ivy-window
- (find-file f)))
- :require-match t
- :caller 'counsel-recentf))
-
-(ivy-set-actions
- 'counsel-recentf
- `(("j" find-file-other-window "other window")
- ("f" find-file-other-frame "other frame")
- ("x" counsel-find-file-extern "open externally")
- ("d" ,(lambda (file) (setq recentf-list (delete file recentf-list)))
- "delete from recentf")))
-
-(defun counsel-recentf-candidates ()
- "Return candidates for `counsel-recentf'.
-
-When `counsel-recentf-include-xdg-list' is non-nil, also include
-the files in said list, sorting the combined list by file access
-time."
- (if (and counsel-recentf-include-xdg-list
- (>= emacs-major-version 26))
- (delete-dups
- (sort (nconc (mapcar #'substring-no-properties recentf-list)
- (counsel--recentf-get-xdg-recent-files))
- (lambda (file1 file2)
- (cond ((file-remote-p file1)
- nil)
- ((file-remote-p file2))
- (t
- ;; Added in Emacs 26.1.
- (declare-function file-attribute-access-time "files"
- (attributes))
- (time-less-p (file-attribute-access-time
- (file-attributes file2))
- (file-attribute-access-time
- (file-attributes file1))))))))
- (mapcar #'substring-no-properties recentf-list)))
-
-(defalias 'counsel--xml-parse-region
- (if (cond ((fboundp 'libxml-available-p)
- ;; Added in Emacs 27.1.
- (libxml-available-p))
- ((fboundp 'libxml-parse-xml-region)
- ;; Checking for `fboundp' is not enough on Windows, where it
- ;; will return non-nil even if the library is not installed.
- (with-temp-buffer
- (insert "<xml/>")
- (libxml-parse-xml-region (point-min) (point-max)))))
- (lambda (&optional beg end)
- (libxml-parse-xml-region (or beg (point-min)) (or end (point-max))))
- #'xml-parse-region)
- "Compatibility shim for `libxml-parse-xml-region'.
-For convenience, BEG and END default to `point-min' and
-`point-max', respectively.
-
-\(fn &optional BEG END)")
-
-(defun counsel--recentf-get-xdg-recent-files ()
- "Return list of XDG recent files.
-
-This information is parsed from the file \"recently-used.xbel\",
-which lists both files and directories, under `xdg-data-home'.
-This function uses the `dom' library from Emacs 25.1 or later."
- (unless (require 'dom nil t)
- (user-error "This function requires Emacs 25.1 or later"))
- (declare-function dom-attr "dom" (node attr))
- (declare-function dom-by-tag "dom" (dom tag))
- (let ((file-of-recent-files
- (expand-file-name "recently-used.xbel" (counsel--xdg-data-home))))
- (unless (file-readable-p file-of-recent-files)
- (user-error "List of XDG recent files not found: %s"
- file-of-recent-files))
- (cl-mapcan (lambda (bookmark-node)
- (let* ((file (dom-attr bookmark-node 'href))
- (file (string-remove-prefix "file://" file))
- (file (url-unhex-string file t))
- (file (decode-coding-string file 'utf-8 t)))
- (and (file-exists-p file)
- (list file))))
- (let ((dom (with-temp-buffer
- (insert-file-contents file-of-recent-files)
- (counsel--xml-parse-region))))
- (nreverse (dom-by-tag dom 'bookmark))))))
-
-(defun counsel-buffer-or-recentf-candidates ()
- "Return candidates for `counsel-buffer-or-recentf'."
- (require 'recentf)
- (recentf-mode)
- (let ((buffers
- (delq nil
- (mapcar (lambda (b)
- (when (buffer-file-name b)
- (buffer-file-name b)))
- (buffer-list)))))
- (append
- buffers
- (cl-remove-if (lambda (f) (member f buffers))
- (counsel-recentf-candidates)))))
-
-;;;###autoload
-(defun counsel-buffer-or-recentf ()
- "Find a buffer visiting a file or file on `recentf-list'."
- (interactive)
- (ivy-read "Buffer File or Recentf: " (counsel-buffer-or-recentf-candidates)
- :action (lambda (s)
- (with-ivy-window
- (if (bufferp s)
- (switch-to-buffer s)
- (find-file s))))
- :require-match t
- :caller 'counsel-buffer-or-recentf))
-
-(ivy-configure 'counsel-buffer-or-recentf
- :display-transformer-fn #'counsel-buffer-or-recentf-transformer)
-
-(ivy-set-actions
- 'counsel-buffer-or-recentf
- '(("j" find-file-other-window "other window")
- ("f" find-file-other-frame "other frame")
- ("x" counsel-find-file-extern "open externally")))
-
-(defun counsel-buffer-or-recentf-transformer (var)
- "Propertize VAR if it's a buffer visiting a file."
- (if (member var (mapcar #'buffer-file-name (buffer-list)))
- (ivy-append-face var 'ivy-highlight-face)
- var))
-
-;;** `counsel-bookmark'
-(defcustom counsel-bookmark-avoid-dired nil
- "If non-nil, open directory bookmarks with `counsel-find-file'.
-By default `counsel-bookmark' opens a dired buffer for directories."
- :type 'boolean)
-
-(defvar bookmark-alist)
-(declare-function bookmark-location "bookmark")
-(declare-function bookmark-all-names "bookmark")
-(declare-function bookmark-get-filename "bookmark")
-(declare-function bookmark-maybe-load-default-file "bookmark")
-
-;;;###autoload
-(defun counsel-bookmark ()
- "Forward to `bookmark-jump' or `bookmark-set' if bookmark doesn't exist."
- (interactive)
- (require 'bookmark)
- (ivy-read "Create or jump to bookmark: "
- (bookmark-all-names)
- :history 'bookmark-history
- :action (lambda (x)
- (cond ((and counsel-bookmark-avoid-dired
- (member x (bookmark-all-names))
- (file-directory-p (bookmark-location x)))
- (with-ivy-window
- (let ((default-directory (bookmark-location x)))
- (counsel-find-file))))
- ((member x (bookmark-all-names))
- (with-ivy-window
- (bookmark-jump x)))
- (t
- (bookmark-set x))))
- :caller 'counsel-bookmark))
-
-(defun counsel--apply-bookmark-fn (fn)
- "Return a function applying FN to a bookmark's location."
- (lambda (bookmark)
- (funcall fn (bookmark-location bookmark))))
-
-(ivy-set-actions
- 'counsel-bookmark
- `(("d" bookmark-delete "delete")
- ("e" bookmark-rename "edit")
- ("s" bookmark-set "overwrite")
- ("x" ,(counsel--apply-bookmark-fn #'counsel-find-file-extern)
- "open externally")
- ("r" ,(counsel--apply-bookmark-fn #'counsel-find-file-as-root)
- "open as root")))
-
-;;** `counsel-bookmarked-directory'
-(defun counsel-bookmarked-directory--candidates ()
- "Get a list of bookmarked directories sorted by file path."
- (bookmark-maybe-load-default-file)
- (sort (cl-remove-if-not
- #'ivy--dirname-p
- (delq nil (mapcar #'bookmark-get-filename bookmark-alist)))
- #'string<))
-
-;;;###autoload
-(defun counsel-bookmarked-directory ()
- "Ivy interface for bookmarked directories.
-
-With a prefix argument, this command creates a new bookmark which points to the
-current value of `default-directory'."
- (interactive)
- (require 'bookmark)
- (ivy-read "Bookmarked directory: "
- (counsel-bookmarked-directory--candidates)
- :caller 'counsel-bookmarked-directory
- :action #'dired))
-
-(ivy-set-actions 'counsel-bookmarked-directory
- `(("j" dired-other-window "other window")
- ("x" counsel-find-file-extern "open externally")
- ("r" counsel-find-file-as-root "open as root")
- ("f" ,(lambda (dir)
- (let ((default-directory dir))
- (call-interactively #'find-file)))
- "find-file")))
-
-;;** `counsel-file-register'
-;;;###autoload
-(defun counsel-file-register ()
- "Search file in register.
-
-You cannot use Emacs' normal register commands to create file
-registers. Instead you must use the `set-register' function like
-so: `(set-register ?i \"/home/eric/.emacs.d/init.el\")'. Now you
-can use `C-x r j i' to open that file."
- (interactive)
- (ivy-read "File Register: "
- ;; Use the `register-alist' variable to filter out file
- ;; registers. Each entry for a file register will have the
- ;; following layout:
- ;;
- ;; (NUMBER 'file . "string/path/to/file")
- ;;
- ;; So we go through each entry and see if the `cadr' is
- ;; `eq' to the symbol `file'. If so then add the filename
- ;; (`cddr') which `ivy-read' will use for its choices.
- (mapcar (lambda (register-alist-entry)
- (if (eq 'file (cadr register-alist-entry))
- (cddr register-alist-entry)))
- register-alist)
- :require-match t
- :history 'counsel-file-register
- :caller 'counsel-file-register
- :action (lambda (register-file)
- (with-ivy-window (find-file register-file)))))
-
-(ivy-configure 'counsel-file-register
- :sort-fn #'ivy-string<)
-
-(ivy-set-actions
- 'counsel-file-register
- '(("j" find-file-other-window "other window")))
-
-;;** `counsel-locate'
-(defcustom counsel-locate-cmd (cond ((memq system-type '(darwin berkeley-unix))
- 'counsel-locate-cmd-noregex)
- ((and (eq system-type 'windows-nt)
- (executable-find "es.exe"))
- 'counsel-locate-cmd-es)
- (t
- 'counsel-locate-cmd-default))
- "The function for producing a locate command string from the input.
-
-The function takes a string - the current input, and returns a
-string - the full shell command to run."
- :type '(choice
- (const :tag "Default" counsel-locate-cmd-default)
- (const :tag "No regex" counsel-locate-cmd-noregex)
- (const :tag "mdfind" counsel-locate-cmd-mdfind)
- (const :tag "everything" counsel-locate-cmd-es)))
-
-(ivy-set-actions
- 'counsel-locate
- '(("x" counsel-locate-action-extern "xdg-open")
- ("r" counsel-find-file-as-root "open as root")
- ("d" counsel-locate-action-dired "dired")))
-
-(defvar counsel-locate-history nil
- "History for `counsel-locate'.")
-
-;;;###autoload
-(defun counsel-locate-action-extern (x)
- "Pass X to `xdg-open' or equivalent command via the shell."
- (interactive "FFile: ")
- (if (and (eq system-type 'windows-nt)
- (fboundp 'w32-shell-execute))
- (w32-shell-execute "open" x)
- (call-process-shell-command (format "%s %s"
- (cl-case system-type
- (darwin "open")
- (cygwin "cygstart")
- (t "xdg-open"))
- (shell-quote-argument x))
- nil 0)))
-
-(defalias 'counsel-find-file-extern #'counsel-locate-action-extern)
-
-(declare-function dired-jump "dired-x")
-
-(defun counsel-locate-action-dired (x)
- "Use `dired-jump' on X."
- (dired-jump nil x))
-
-(defun counsel-locate-cmd-default (input)
- "Return a shell command based on INPUT."
- (counsel-require-program "locate")
- (format "locate -i --regex '%s'"
- (counsel--elisp-to-pcre
- (ivy--regex input))))
-
-(defun counsel-locate-cmd-noregex (input)
- "Return a shell command based on INPUT."
- (counsel-require-program "locate")
- (format "locate -i '%s'" input))
-
-(defun counsel-locate-cmd-mdfind (input)
- "Return a shell command based on INPUT."
- (counsel-require-program "mdfind")
- (format "mdfind -name '%s'" input))
-
-(defvar w32-ansi-code-page)
-
-(defun counsel-locate-cmd-es (input)
- "Return a shell command based on INPUT."
- (counsel-require-program "es.exe")
- (let ((raw-string (format "es.exe -i -p -r %s"
- (counsel--elisp-to-pcre
- (ivy--regex input t)))))
- ;; W32 don't use Unicode by default, so we encode search command
- ;; to local codepage to support searching filename contains non-ASCII
- ;; characters.
- (if (and (eq system-type 'windows-nt)
- (boundp 'w32-ansi-code-page))
- (encode-coding-string raw-string
- (intern (format "cp%d" w32-ansi-code-page)))
- raw-string)))
-
-(defun counsel-locate-function (input)
- "Call the \"locate\" shell command with INPUT."
- (or
- (ivy-more-chars)
- (progn
- (counsel--async-command
- (funcall counsel-locate-cmd input))
- '("" "working..."))))
-
-(defcustom counsel-locate-db-path "~/.local/mlocate.db"
- "Location where to put the locatedb in case your home folder is encrypted."
- :type 'file)
-
-(defun counsel-file-stale-p (fname seconds)
- "Return non-nil if FNAME was modified more than SECONDS ago."
- (> (time-to-seconds
- (time-subtract
- (current-time)
- (nth 5 (file-attributes fname))))
- seconds))
-
-(defun counsel--locate-updatedb ()
- (when (file-exists-p "~/.Private")
- (let ((db-fname (expand-file-name counsel-locate-db-path)))
- (setenv "LOCATE_PATH" db-fname)
- (when (or (not (file-exists-p db-fname))
- (counsel-file-stale-p db-fname 60))
- (message "Updating %s..." db-fname)
- (counsel--command
- "updatedb" "-l" "0" "-o" db-fname "-U" (expand-file-name "~"))))))
-
-;;;###autoload
-(defun counsel-locate (&optional initial-input)
- "Call the \"locate\" shell command.
-INITIAL-INPUT can be given as the initial minibuffer input."
- (interactive)
- (counsel--locate-updatedb)
- (ivy-read "Locate: " #'counsel-locate-function
- :initial-input initial-input
- :dynamic-collection t
- :history 'counsel-locate-history
- :action (lambda (file)
- (when file
- (with-ivy-window
- (find-file
- (concat (file-remote-p default-directory) file)))))
- :caller 'counsel-locate))
-
-(ivy-configure 'counsel-locate
- :unwind-fn #'counsel-delete-process
- :exit-codes '(1 "Nothing found"))
-
-;;** `counsel-tracker'
-(defun counsel-tracker-function (input)
- "Call the \"tracker\" shell command with INPUT."
- (or
- (ivy-more-chars)
- (progn
- (counsel--async-command
- (format
- "tracker sparql -q \"SELECT ?url WHERE { ?s a nfo:FileDataObject ; nie:url ?url . FILTER (STRSTARTS (?url, 'file://$HOME/')) . FILTER regex(?url, '%s') }\" | tail -n +2 | head -n -1"
- (counsel--elisp-to-pcre (funcall ivy--regex-function input))))
- '("" "working..."))))
-
-(defun counsel-tracker-transformer (str)
- (if (string-match "file:///" str)
- (decode-coding-string (url-unhex-string (substring str 9)) 'utf-8)
- str))
-
-;;;###autoload
-(defun counsel-tracker ()
- (interactive)
- (ivy-read "Tracker: " 'counsel-tracker-function
- :dynamic-collection t
- :action (lambda (s) (find-file (counsel-tracker-transformer s)))
- :caller 'counsel-tracker))
-
-(ivy-configure 'counsel-tracker
- :display-transformer-fn #'counsel-tracker-transformer
- :unwind-fn #'counsel-delete-process)
-
-;;** `counsel-fzf'
-(defvar counsel-fzf-cmd "fzf -f \"%s\""
- "Command for `counsel-fzf'.")
-
-(defvar counsel--fzf-dir nil
- "Store the base fzf directory.")
-
-(defvar counsel-fzf-dir-function 'counsel-fzf-dir-function-projectile
- "Function that returns a directory for fzf to use.")
-
-(defun counsel-fzf-dir-function-projectile ()
- (if (and
- (fboundp 'projectile-project-p)
- (fboundp 'projectile-project-root)
- (projectile-project-p))
- (projectile-project-root)
- default-directory))
-
-(defun counsel-fzf-function (str)
- (let ((default-directory counsel--fzf-dir))
- (setq ivy--old-re (ivy--regex-fuzzy str))
- (counsel--async-command
- (format counsel-fzf-cmd str)))
- nil)
-
-;;;###autoload
-(defun counsel-fzf (&optional initial-input initial-directory fzf-prompt)
- "Open a file using the fzf shell command.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-FZF-PROMPT, if non-nil, is passed as `ivy-read' prompt argument."
- (interactive
- (let ((fzf-basename (car (split-string counsel-fzf-cmd))))
- (list nil
- (when current-prefix-arg
- (counsel-read-directory-name (concat
- fzf-basename
- " in directory: "))))))
- (counsel-require-program counsel-fzf-cmd)
- (setq counsel--fzf-dir
- (or initial-directory
- (funcall counsel-fzf-dir-function)))
- (ivy-read (or fzf-prompt "fzf: ")
- #'counsel-fzf-function
- :initial-input initial-input
- :re-builder #'ivy--regex-fuzzy
- :dynamic-collection t
- :action #'counsel-fzf-action
- :caller 'counsel-fzf))
-
-(ivy-configure 'counsel-fzf
- :occur #'counsel-fzf-occur
- :unwind-fn #'counsel-delete-process
- :exit-codes '(1 "Nothing found"))
-
-(defun counsel-fzf-action (x)
- "Find file X in current fzf directory."
- (with-ivy-window
- (let ((default-directory counsel--fzf-dir))
- (find-file x))))
-
-(defun counsel-fzf-occur (&optional _cands)
- "Occur function for `counsel-fzf' using `counsel-cmd-to-dired'."
- (cd counsel--fzf-dir)
- (counsel-cmd-to-dired
- (counsel--expand-ls
- (format
- "%s --print0 | xargs -0 ls"
- (format counsel-fzf-cmd ivy-text)))))
-
-(ivy-set-actions
- 'counsel-fzf
- '(("x" counsel-locate-action-extern "xdg-open")
- ("d" counsel-locate-action-dired "dired")))
-
-;;** `counsel-dpkg'
-;;;###autoload
-(defun counsel-dpkg ()
- "Call the \"dpkg\" shell command."
- (interactive)
- (counsel-require-program "dpkg")
- (let ((cands (mapcar
- (lambda (x)
- (let ((y (split-string x " +")))
- (cons (format "%-40s %s"
- (ivy--truncate-string
- (nth 1 y) 40)
- (nth 4 y))
- (mapconcat #'identity y " "))))
- (split-string
- (shell-command-to-string "dpkg -l | tail -n+6") "\n" t))))
- (ivy-read "dpkg: " cands
- :action (lambda (x)
- (message (cdr x)))
- :caller 'counsel-dpkg)))
-
-;;** `counsel-rpm'
-;;;###autoload
-(defun counsel-rpm ()
- "Call the \"rpm\" shell command."
- (interactive)
- (counsel-require-program "rpm")
- (let ((cands (mapcar
- (lambda (x)
- (let ((y (split-string x "|")))
- (cons (format "%-40s %s"
- (ivy--truncate-string
- (nth 0 y) 40)
- (nth 1 y))
- (mapconcat #'identity y " "))))
- (split-string
- (shell-command-to-string "rpm -qa --qf \"%{NAME}|%{SUMMARY}\\n\"") "\n" t))))
- (ivy-read "rpm: " cands
- :action (lambda (x)
- (message (cdr x)))
- :caller 'counsel-rpm)))
-
-(defun counsel--find-return-list (args)
- (unless (listp args)
- (user-error
- "`counsel-file-jump-args' is a list now; please customize accordingly"))
- (counsel--call
- (cons find-program args)
- (lambda ()
- (let (files)
- (goto-char (point-min))
- (while (< (point) (point-max))
- (when (looking-at "\\./")
- (goto-char (match-end 0)))
- (push (buffer-substring (point) (line-end-position)) files)
- (beginning-of-line 2))
- (nreverse files)))))
-
-(defcustom counsel-file-jump-args (split-string ". -name .git -prune -o -type f -print")
- "Arguments for the `find-command' when using `counsel-file-jump'."
- :type '(repeat string))
-
-;;** `counsel-file-jump'
-;;;###autoload
-(defun counsel-file-jump (&optional initial-input initial-directory)
- "Jump to a file below the current directory.
-List all files within the current directory or any of its sub-directories.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search."
- (interactive
- (list nil
- (when current-prefix-arg
- (counsel-read-directory-name "From directory: "))))
- (counsel-require-program find-program)
- (let ((default-directory (or initial-directory default-directory)))
- (ivy-read "Find file: "
- (counsel--find-return-list counsel-file-jump-args)
- :matcher #'counsel--find-file-matcher
- :initial-input initial-input
- :action #'find-file
- :preselect (counsel--preselect-file)
- :require-match 'confirm-after-completion
- :history 'file-name-history
- :caller 'counsel-file-jump)))
-
-(ivy-set-actions
- 'counsel-file-jump
- `(("d" ,(lambda (x)
- (dired (or (file-name-directory x) default-directory)))
- "open in dired")))
-
-(defcustom counsel-dired-jump-args (split-string ". -name .git -prune -o -type d -print")
- "Arguments for the `find-command' when using `counsel-dired-jump'."
- :type '(repeat string))
-
-;;** `counsel-dired-jump'
-;;;###autoload
-(defun counsel-dired-jump (&optional initial-input initial-directory)
- "Jump to a directory (see `dired-jump') below the current directory.
-List all sub-directories within the current directory.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search."
- (interactive
- (list nil
- (when current-prefix-arg
- (counsel-read-directory-name "From directory: "))))
- (counsel-require-program find-program)
- (let ((default-directory (or initial-directory default-directory)))
- (ivy-read "Find directory: "
- (cdr
- (counsel--find-return-list counsel-dired-jump-args))
- :matcher #'counsel--find-file-matcher
- :initial-input initial-input
- :action (lambda (d) (dired-jump nil (expand-file-name d)))
- :history 'file-name-history
- :keymap counsel-find-file-map
- :caller 'counsel-dired-jump)))
-
-;;* Grep
-;;** `counsel-ag'
-(defvar counsel-ag-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-l") 'ivy-call-and-recenter)
- (define-key map (kbd "M-q") 'counsel-git-grep-query-replace)
- (define-key map (kbd "C-'") 'swiper-avy)
- (define-key map (kbd "C-x C-d") 'counsel-cd)
- map))
-
-(defcustom counsel-ag-base-command "ag --vimgrep %s"
- "Format string to use in `counsel-ag-function' to construct the command.
-The %s will be replaced by optional extra ag arguments followed by the
-regex string."
- :type '(radio
- (const "ag --vimgrep %s")
- (const "ag --nocolor --nogroup %s")
- (string :tag "custom")))
-
-(defvar counsel-ag-command nil)
-
-(defvar counsel--grep-tool-look-around t)
-
-(defvar counsel--regex-look-around nil)
-
-(defconst counsel--command-args-separator " -- ")
-
-(defun counsel--split-command-args (arguments)
- "Split ARGUMENTS into its switches and search-term parts.
-Return pair of corresponding strings (SWITCHES . SEARCH-TERM)."
- (if (string-match counsel--command-args-separator arguments)
- (let ((args (substring arguments (match-end 0)))
- (search-term (substring arguments 0 (match-beginning 0))))
- (if (string-prefix-p "-" arguments)
- (cons search-term args)
- (cons args search-term)))
- (cons "" arguments)))
-
-(defun counsel--format-ag-command (extra-args needle)
- "Construct a complete `counsel-ag-command' as a string.
-EXTRA-ARGS is a string of the additional arguments.
-NEEDLE is the search string."
- (counsel--format counsel-ag-command
- (if (listp counsel-ag-command)
- (if (string-match " \\(--\\) " extra-args)
- (counsel--format
- (split-string (replace-match "%s" t t extra-args 1))
- needle)
- (nconc (split-string extra-args) needle))
- (if (string-match " \\(--\\) " extra-args)
- (replace-match needle t t extra-args 1)
- (concat extra-args " " needle)))))
-
-(defun counsel--grep-regex (str)
- (counsel--elisp-to-pcre
- (setq ivy--old-re
- (funcall (ivy-state-re-builder ivy-last) str))
- counsel--regex-look-around))
-
-(defun counsel--ag-extra-switches (regex)
- "Get additional switches needed for look-arounds."
- (and (stringp counsel--regex-look-around)
- ;; using look-arounds
- (string-match-p "\\`\\^(\\?[=!]" regex)
- (concat " " counsel--regex-look-around " ")))
-
-(defun counsel-ag-function (string)
- "Grep in the current directory for STRING."
- (let* ((command-args (counsel--split-command-args string))
- (search-term (cdr command-args)))
- (or
- (let ((ivy-text search-term))
- (ivy-more-chars))
- (let* ((default-directory (ivy-state-directory ivy-last))
- (regex (counsel--grep-regex search-term))
- (switches (concat (car command-args)
- (counsel--ag-extra-switches regex)
- (if (ivy--case-fold-p string)
- " -i "
- " -s "))))
- (counsel--async-command (counsel--format-ag-command
- switches
- (funcall (if (listp counsel-ag-command) #'identity
- #'shell-quote-argument)
- regex)))
- nil))))
-
-;;;###autoload
-(cl-defun counsel-ag (&optional initial-input initial-directory extra-ag-args ag-prompt
- &key caller)
- "Grep for a string in a root directory using ag.
-
-By default, the root directory is the first directory containing a .git subdirectory.
-
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-EXTRA-AG-ARGS, if non-nil, is appended to `counsel-ag-base-command'.
-AG-PROMPT, if non-nil, is passed as `ivy-read' prompt argument.
-CALLER is passed to `ivy-read'.
-
-With a `\\[universal-argument]' prefix argument, prompt for INITIAL-DIRECTORY.
-With a `\\[universal-argument] \\[universal-argument]' prefix argument, \
-prompt additionally for EXTRA-AG-ARGS."
- (interactive)
- (setq counsel-ag-command counsel-ag-base-command)
- (setq counsel--regex-look-around counsel--grep-tool-look-around)
- (counsel-require-program counsel-ag-command)
- (let ((prog-name (car (if (listp counsel-ag-command) counsel-ag-command
- (split-string counsel-ag-command))))
- (arg (prefix-numeric-value current-prefix-arg)))
- (when (>= arg 4)
- (setq initial-directory
- (or initial-directory
- (counsel-read-directory-name (concat
- prog-name
- " in directory: ")))))
- (when (>= arg 16)
- (setq extra-ag-args
- (or extra-ag-args
- (read-from-minibuffer (format "%s args: " prog-name)))))
- (setq counsel-ag-command (counsel--format-ag-command (or extra-ag-args "") "%s"))
- (let ((default-directory (or initial-directory
- (counsel--git-root)
- default-directory)))
- (ivy-read (or ag-prompt
- (concat prog-name ": "))
- #'counsel-ag-function
- :initial-input initial-input
- :dynamic-collection t
- :keymap counsel-ag-map
- :history 'counsel-git-grep-history
- :action #'counsel-git-grep-action
- :require-match t
- :caller (or caller 'counsel-ag)))))
-
-(ivy-configure 'counsel-ag
- :occur #'counsel-ag-occur
- :unwind-fn #'counsel--grep-unwind
- :display-transformer-fn #'counsel-git-grep-transformer
- :grep-p t
- :exit-codes '(1 "No matches found"))
-
-(defun counsel-read-directory-name (prompt &optional default)
- "Read a directory name from user, a (partial) replacement of `read-directory-name'."
- (let ((counsel--find-file-predicate #'file-directory-p))
- (ivy-read prompt
- #'read-file-name-internal
- :matcher #'counsel--find-file-matcher
- :def default
- :history 'file-name-history
- :keymap counsel-find-file-map
- :caller 'counsel-read-directory-name)))
-
-(ivy-configure 'counsel-read-directory-name
- :parent 'read-file-name-internal)
-
-(defun counsel-cd ()
- "Change the directory for the currently running Ivy grep-like command.
-Works for `counsel-git-grep', `counsel-ag', etc."
- (interactive)
- (counsel-delete-process)
- (let* ((input ivy-text)
- (enable-recursive-minibuffers t)
- (def-dir (buffer-file-name (ivy-state-buffer ivy-last)))
- (def-dir (and def-dir (file-name-directory def-dir)))
- (new-dir (counsel-read-directory-name "cd: " def-dir)))
- (ivy-quit-and-run
- (funcall (ivy-state-caller ivy-last) input new-dir))))
-
-(defun counsel--grep-smart-case-flag ()
- (if (ivy--case-fold-p ivy-text)
- "-i"
- (if (and (stringp counsel-ag-base-command)
- (string-match-p "\\`pt" counsel-ag-base-command))
- "-S"
- "-s")))
-
-(defun counsel-grep-like-occur (cmd-template)
- (unless (eq major-mode 'ivy-occur-grep-mode)
- (ivy-occur-grep-mode)
- (setq default-directory (ivy-state-directory ivy-last)))
- (ivy-set-text
- (and (string-match "\"\\(.*\\)\"" (buffer-name))
- (match-string 1 (buffer-name))))
- (let* ((cmd
- (if (functionp cmd-template)
- (funcall cmd-template ivy-text)
- (let* ((command-args (counsel--split-command-args ivy-text))
- (regex (counsel--grep-regex (cdr command-args)))
- (all-args (append
- (when (car command-args)
- (split-string (car command-args)))
- (counsel--ag-extra-switches regex)
- (list
- (counsel--grep-smart-case-flag)
- regex))))
- (if (stringp cmd-template)
- (counsel--format
- cmd-template
- (mapconcat #'shell-quote-argument all-args " "))
- (cl-mapcan
- (lambda (x) (if (string= x "%s") (copy-sequence all-args) (list x)))
- cmd-template)))))
- (cands (counsel--split-string
- (if (stringp cmd)
- (shell-command-to-string cmd)
- (counsel--call cmd)))))
- (swiper--occur-insert-lines (mapcar #'counsel--normalize-grep-match cands))))
-
-(defun counsel-ag-occur (&optional _cands)
- "Generate a custom occur buffer for `counsel-ag'."
- (counsel-grep-like-occur
- counsel-ag-command))
-
-;;** `counsel-pt'
-(defcustom counsel-pt-base-command "pt --nocolor --nogroup -e %s"
- "Alternative to `counsel-ag-base-command' using pt."
- :type 'string)
-
-;;;###autoload
-(defun counsel-pt (&optional initial-input)
- "Grep for a string in the current directory using pt.
-INITIAL-INPUT can be given as the initial minibuffer input.
-This uses `counsel-ag' with `counsel-pt-base-command' instead of
-`counsel-ag-base-command'."
- (interactive)
- (let ((counsel-ag-base-command counsel-pt-base-command)
- (counsel--grep-tool-look-around nil))
- (counsel-ag initial-input nil nil nil :caller 'counsel-pt)))
-
-(ivy-configure 'counsel-pt
- :unwind-fn #'counsel--grep-unwind
- :display-transformer-fn #'counsel-git-grep-transformer
- :grep-p t)
-
-;;** `counsel-ack'
-(defcustom counsel-ack-base-command
- (concat
- (file-name-nondirectory
- (or (executable-find "ack-grep") "ack"))
- " --nocolor --nogroup %s")
- "Alternative to `counsel-ag-base-command' using ack."
- :type 'string)
-
-;;;###autoload
-(defun counsel-ack (&optional initial-input)
- "Grep for a string in the current directory using ack.
-INITIAL-INPUT can be given as the initial minibuffer input.
-This uses `counsel-ag' with `counsel-ack-base-command' replacing
-`counsel-ag-base-command'."
- (interactive)
- (let ((counsel-ag-base-command counsel-ack-base-command)
- (counsel--grep-tool-look-around t))
- (counsel-ag
- initial-input nil nil nil
- :caller 'counsel-ack)))
-
-
-;;** `counsel-rg'
-(defcustom counsel-rg-base-command
- (split-string
- (if (memq system-type '(ms-dos windows-nt))
- "rg -M 240 --with-filename --no-heading --line-number --color never %s --path-separator / ."
- "rg -M 240 --with-filename --no-heading --line-number --color never %s"))
- "Alternative to `counsel-ag-base-command' using ripgrep.
-
-Note: don't use single quotes for the regex."
- :type '(choice
- (repeat :tag "List to be used in `process-file'." string)
- (string :tag "String to be used in `shell-command-to-string'.")))
-
-(defun counsel--rg-targets ()
- "Return a list of files to operate on, based on `dired-mode' marks."
- (when (eq major-mode 'dired-mode)
- (let ((files
- (dired-get-marked-files 'no-dir nil nil t)))
- (when (or (cdr files)
- (when (string-match-p "\\*ivy-occur" (buffer-name))
- (dired-toggle-marks)
- (setq files (dired-get-marked-files 'no-dir))
- (dired-toggle-marks)
- t))
- (delq t files)))))
-
-;;;###autoload
-(defun counsel-rg (&optional initial-input initial-directory extra-rg-args rg-prompt)
- "Grep for a string in the current directory using rg.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search.
-EXTRA-RG-ARGS string, if non-nil, is appended to `counsel-rg-base-command'.
-RG-PROMPT, if non-nil, is passed as `ivy-read' prompt argument.
-
-Example input with inclusion and exclusion file patterns:
- require i -- -g*.el"
- (interactive)
- (let ((counsel-ag-base-command
- (if (listp counsel-rg-base-command)
- (append counsel-rg-base-command (counsel--rg-targets))
- (concat counsel-rg-base-command " "
- (mapconcat #'shell-quote-argument (counsel--rg-targets) " "))))
- (counsel--grep-tool-look-around
- (let ((rg (car (if (listp counsel-rg-base-command) counsel-rg-base-command
- (split-string counsel-rg-base-command))))
- (switch "--pcre2"))
- (and (eq 0 (call-process rg nil nil nil switch "--pcre2-version"))
- switch))))
- (counsel-ag initial-input initial-directory extra-rg-args rg-prompt
- :caller 'counsel-rg)))
-
-(ivy-configure 'counsel-rg
- :occur #'counsel-ag-occur
- :unwind-fn #'counsel--grep-unwind
- :display-transformer-fn #'counsel-git-grep-transformer
- :grep-p t
- :exit-codes '(1 "No matches found"))
-
-;;** `counsel-grep'
-(defvar counsel-grep-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-l") 'ivy-call-and-recenter)
- (define-key map (kbd "M-q") 'swiper-query-replace)
- (define-key map (kbd "C-'") 'swiper-avy)
- map))
-
-(defcustom counsel-grep-base-command "grep -E -n -e %s %s"
- "Format string used by `counsel-grep' to build a shell command.
-It should contain two %-sequences (see function `format') to be
-substituted by the search regexp and file, respectively. Neither
-%-sequence should be contained in single quotes."
- :type 'string)
-
-(defvar counsel-grep-command nil)
-
-(defun counsel-grep-function (string)
- "Grep in the current directory for STRING."
- (or
- (ivy-more-chars)
- (let* ((regex (counsel--grep-regex string))
- (cmd (counsel--format
- counsel-grep-command
- (funcall (if (listp counsel-grep-command) #'identity
- #'shell-quote-argument)
- regex))))
- (counsel--async-command
- (if (ivy--case-fold-p regex)
- (if (listp cmd) (nconc (list (car cmd) "-i") (cdr cmd))
- (string-match " " cmd)
- (replace-match " -i " nil nil cmd))
- cmd))
- nil)))
-
-(defvar counsel--grep-last-pos nil
- "Store the last point and line that `counsel-grep-action' scrolled to.
-This speeds up scrolling: instead of going to `point-min' and
-`forward-line' with a huge arg (e.g. to scroll 50K lines), scroll
-relative to the last position stored here.")
-
-(defun counsel-grep-action (x)
- "Go to candidate X."
- (with-ivy-window
- (swiper--cleanup)
- (let ((default-directory
- (file-name-directory
- (ivy-state-directory ivy-last)))
- file-name line-number)
- (when (cond ((string-match "\\`\\([0-9]+\\):\\(.*\\)\\'" x)
- (setq file-name (buffer-file-name (ivy-state-buffer ivy-last)))
- (setq line-number (match-string-no-properties 1 x)))
- ((string-match "\\`\\([^:]+\\):\\([0-9]+\\):\\(.*\\)\\'" x)
- (setq file-name (match-string-no-properties 1 x))
- (setq line-number (match-string-no-properties 2 x))))
- ;; If the file buffer is already open, just get it. Prevent doing
- ;; `find-file', as that file could have already been opened using
- ;; `find-file-literally'.
- (with-current-buffer (or (get-file-buffer file-name)
- (find-file file-name))
- (setq line-number (string-to-number line-number))
- (if (and counsel--grep-last-pos (= (point) (car counsel--grep-last-pos)))
- (forward-line (- line-number (cdr counsel--grep-last-pos)))
- (goto-char (point-min))
- (forward-line (1- line-number)))
- (setq counsel--grep-last-pos (cons (point) line-number))
- (when (re-search-forward (ivy--regex ivy-text t) (line-end-position) t)
- (when swiper-goto-start-of-match
- (goto-char (match-beginning 0))))
- (run-hooks 'counsel-grep-post-action-hook)
- (if (eq ivy-exit 'done)
- (swiper--ensure-visible)
- (isearch-range-invisible (line-beginning-position)
- (line-end-position))
- (swiper--add-overlays (ivy--regex ivy-text))))))))
-
-(defun counsel-grep-occur (&optional _cands)
- "Generate a custom occur buffer for `counsel-grep'."
- (counsel-grep-like-occur
- (format
- "grep -niE %%s %s /dev/null"
- (shell-quote-argument
- (file-name-nondirectory
- (buffer-file-name
- (ivy-state-buffer ivy-last)))))))
-
-(defvar counsel-grep-history nil
- "History for `counsel-grep'.")
-
-;;;###autoload
-(defun counsel-grep (&optional initial-input)
- "Grep for a string in the file visited by the current buffer.
-When non-nil, INITIAL-INPUT is the initial search pattern."
- (interactive)
- (unless buffer-file-name
- (user-error "Current buffer is not visiting a file"))
- (counsel-require-program counsel-grep-base-command)
- (setq counsel-grep-command
- (counsel--format counsel-grep-base-command "%s"
- (funcall (if (listp counsel-grep-base-command) #'identity
- #'shell-quote-argument)
- (file-name-nondirectory
- buffer-file-name))))
- (let ((default-directory (file-name-directory buffer-file-name))
- (init-point (point))
- res)
- (unwind-protect
- (setq res (ivy-read "grep: " #'counsel-grep-function
- :initial-input initial-input
- :dynamic-collection t
- :require-match t
- :preselect
- (when (< (- (line-end-position) (line-beginning-position)) 300)
- (format "%d:%s"
- (line-number-at-pos)
- (regexp-quote
- (buffer-substring-no-properties
- (line-beginning-position)
- (line-end-position)))))
- :keymap counsel-grep-map
- :history 'counsel-grep-history
- :re-builder #'ivy--regex
- :action #'counsel-grep-action
- :caller 'counsel-grep))
- (unless res
- (goto-char init-point)))))
-
-(ivy-configure 'counsel-grep
- :update-fn 'auto
- :unwind-fn #'counsel--grep-unwind
- :index-fn #'ivy-recompute-index-swiper-async
- :occur #'counsel-grep-occur
- :more-chars 2
- :grep-p t
- :exit-codes '(1 ""))
-
-;;;###autoload
-(defun counsel-grep-backward (&optional initial-input)
- "Grep for a string in the file visited by the current buffer going
-backward similar to `swiper-backward'. When non-nil, INITIAL-INPUT is
-the initial search pattern."
- (interactive)
- (let ((ivy-index-functions-alist
- '((counsel-grep . ivy-recompute-index-swiper-async-backward))))
- (counsel-grep initial-input)))
-
-;;** `counsel-grep-or-swiper'
-(defcustom counsel-grep-swiper-limit 300000
- "Buffer size threshold for `counsel-grep-or-swiper'.
-When the number of characters in a buffer exceeds this threshold,
-`counsel-grep' will be used instead of `swiper'."
- :type 'integer)
-
-(defcustom counsel-grep-use-swiper-p #'counsel-grep-use-swiper-p-default
- "When this function returns non-nil, call `swiper', else `counsel-grep'."
- :type '(choice
- (const :tag "Rely on `counsel-grep-swiper-limit'."
- counsel-grep-use-swiper-p-default)
- (const :tag "Always use `counsel-grep'." ignore)
- (function :tag "Custom")))
-
-(defun counsel-grep-use-swiper-p-default ()
- (<= (buffer-size)
- (/ counsel-grep-swiper-limit
- (if (eq major-mode 'org-mode) 4 1))))
-
-;;;###autoload
-(defun counsel-grep-or-swiper (&optional initial-input)
- "Call `swiper' for small buffers and `counsel-grep' for large ones.
-When non-nil, INITIAL-INPUT is the initial search pattern."
- (interactive)
- (if (or (not buffer-file-name)
- (buffer-narrowed-p)
- (ignore-errors
- (file-remote-p buffer-file-name))
- (jka-compr-get-compression-info buffer-file-name)
- (funcall counsel-grep-use-swiper-p))
- (swiper initial-input)
- (when (file-writable-p buffer-file-name)
- (save-buffer))
- (counsel-grep initial-input)))
-
-;;** `counsel-grep-or-swiper-backward'
-;;;###autoload
-(defun counsel-grep-or-swiper-backward (&optional initial-input)
- "Call `swiper-backward' for small buffers and `counsel-grep-backward' for
-large ones. When non-nil, INITIAL-INPUT is the initial search pattern."
- (interactive)
- (let ((ivy-index-functions-alist
- '((swiper . ivy-recompute-index-swiper-backward)
- (counsel-grep . ivy-recompute-index-swiper-async-backward))))
- (counsel-grep-or-swiper initial-input)))
-
-;;** `counsel-recoll'
-(defun counsel-recoll-function (str)
- "Run recoll for STR."
- (or
- (ivy-more-chars)
- (progn
- (counsel--async-command
- (format "recoll -t -b %s"
- (shell-quote-argument str)))
- nil)))
-
-;; This command uses the recollq command line tool that comes together
-;; with the recoll (the document indexing database) source:
-;; https://www.lesbonscomptes.com/recoll/download.html
-;; You need to build it yourself (together with recoll):
-;; cd ./query && make && sudo cp recollq /usr/local/bin
-;; You can try the GUI version of recoll with:
-;; sudo apt-get install recoll
-;; Unfortunately, that does not install recollq.
-;;;###autoload
-(defun counsel-recoll (&optional initial-input)
- "Search for a string in the recoll database.
-You'll be given a list of files that match.
-Selecting a file will launch `swiper' for that file.
-INITIAL-INPUT can be given as the initial minibuffer input."
- (interactive)
- (counsel-require-program "recoll")
- (ivy-read "recoll: " 'counsel-recoll-function
- :initial-input initial-input
- :dynamic-collection t
- :history 'counsel-git-grep-history
- :action (lambda (x)
- (when (string-match "file://\\(.*\\)\\'" x)
- (let ((file-name (match-string 1 x)))
- (find-file file-name)
- (unless (string-match "pdf$" x)
- (swiper ivy-text)))))
- :caller 'counsel-recoll))
-
-(ivy-configure 'counsel-recoll
- :unwind-fn #'counsel-delete-process)
-
-;;* Org
-;;** `counsel-org-tag'
-(defvar counsel-org-tags nil
- "Store the current list of tags.")
-
-(defvar org-outline-regexp)
-(defvar org-indent-mode)
-(defvar org-indent-indentation-per-level)
-(defvar org-tags-column)
-(declare-function org-get-tags-string "org")
-(declare-function org-get-tags "org")
-(declare-function org-make-tag-string "org")
-(declare-function org-move-to-column "org-compat")
-
-(defun counsel--org-make-tag-string ()
- (if (fboundp #'org-make-tag-string)
- ;; >= Org 9.2
- (org-make-tag-string (counsel--org-get-tags))
- (with-no-warnings
- (org-get-tags-string))))
-
-(defun counsel-org-change-tags (tags)
- "Change tags of current org headline to TAGS."
- (let ((current (counsel--org-make-tag-string))
- (col (current-column))
- level)
- ;; Insert new tags at the correct column
- (beginning-of-line 1)
- (setq level (or (and (looking-at org-outline-regexp)
- (- (match-end 0) (point) 1))
- 1))
- (cond
- ((and (equal current "") (equal tags "")))
- ((re-search-forward
- (concat "\\([ \t]*" (regexp-quote current) "\\)[ \t]*$")
- (line-end-position) t)
- (if (equal tags "")
- (delete-region
- (match-beginning 0)
- (match-end 0))
- (goto-char (match-beginning 0))
- (let* ((c0 (current-column))
- ;; compute offset for the case of org-indent-mode active
- (di (if (bound-and-true-p org-indent-mode)
- (* (1- org-indent-indentation-per-level) (1- level))
- 0))
- (p0 (if (equal (char-before) ?*) (1+ (point)) (point)))
- (tc (+ org-tags-column (if (> org-tags-column 0) (- di) di)))
- (c1 (max (1+ c0) (if (> tc 0) tc (- (- tc) (string-width tags)))))
- (rpl (concat (make-string (max 0 (- c1 c0)) ?\ ) tags)))
- (replace-match rpl t t)
- (and c0 indent-tabs-mode (tabify p0 (point)))
- tags)))
- (t (error "Tags alignment failed")))
- (org-move-to-column col)))
-
-(defun counsel-org--set-tags ()
- "Set tags of current org headline to `counsel-org-tags'."
- (counsel-org-change-tags
- (if counsel-org-tags
- (format ":%s:"
- (mapconcat #'identity counsel-org-tags ":"))
- "")))
-
-(defvar org-agenda-bulk-marked-entries)
-
-(declare-function org-get-at-bol "org")
-(declare-function org-agenda-error "org-agenda")
-
-(defun counsel-org-tag-action (x)
- "Add tag X to `counsel-org-tags'.
-If X is already part of the list, remove it instead. Quit the selection if
-X is selected by either `ivy-done', `ivy-alt-done' or `ivy-immediate-done',
-otherwise continue prompting for tags."
- (if (member x counsel-org-tags)
- (progn
- (setq counsel-org-tags (delete x counsel-org-tags)))
- (unless (equal x "")
- (setq counsel-org-tags (append counsel-org-tags (list x)))
- (unless (member x ivy--all-candidates)
- (setq ivy--all-candidates (append ivy--all-candidates (list x))))))
- (let ((prompt (counsel-org-tag-prompt)))
- (setf (ivy-state-prompt ivy-last) prompt)
- (setq ivy--prompt (concat "%-4d " prompt)))
- (cond ((memq this-command '(ivy-done
- ivy-alt-done
- ivy-immediate-done))
- (if (eq major-mode 'org-agenda-mode)
- (if (null org-agenda-bulk-marked-entries)
- (let ((hdmarker (or (org-get-at-bol 'org-hd-marker)
- (org-agenda-error))))
- (with-current-buffer (marker-buffer hdmarker)
- (goto-char hdmarker)
- (counsel-org--set-tags)))
- (let ((add-tags (copy-sequence counsel-org-tags)))
- (dolist (m org-agenda-bulk-marked-entries)
- (with-current-buffer (marker-buffer m)
- (save-excursion
- (goto-char m)
- (setq counsel-org-tags
- (delete-dups
- (append (counsel--org-get-tags) add-tags)))
- (counsel-org--set-tags))))))
- (counsel-org--set-tags)
- (unless (member x counsel-org-tags)
- (message "Tag %S has been removed." x))))
- ((eq this-command 'ivy-call)
- (with-selected-window (active-minibuffer-window)
- (delete-minibuffer-contents)))))
-
-(defun counsel-org-tag-prompt ()
- "Return prompt for `counsel-org-tag'."
- (format "Tags (%s): "
- (mapconcat #'identity counsel-org-tags ", ")))
-
-(defvar org-setting-tags)
-(defvar org-last-tags-completion-table)
-(defvar org-tag-persistent-alist)
-(defvar org-tag-alist)
-(defvar org-complete-tags-always-offer-all-agenda-tags)
-
-(declare-function org-at-heading-p "org")
-(declare-function org-back-to-heading "org")
-(declare-function org-get-buffer-tags "org")
-(declare-function org-global-tags-completion-table "org")
-(declare-function org-agenda-files "org")
-(declare-function org-agenda-set-tags "org-agenda")
-(declare-function org-tags-completion-function "org")
-
-;;;###autoload
-(defun counsel--org-get-tags ()
- (delete "" (condition-case nil
- (org-get-tags nil t)
- (error (org-get-tags)))))
-
-;;;###autoload
-(defun counsel-org-tag ()
- "Add or remove tags in `org-mode'."
- (interactive)
- (save-excursion
- (if (eq major-mode 'org-agenda-mode)
- (if org-agenda-bulk-marked-entries
- (setq counsel-org-tags nil)
- (let ((hdmarker (or (org-get-at-bol 'org-hd-marker)
- (org-agenda-error))))
- (with-current-buffer (marker-buffer hdmarker)
- (goto-char hdmarker)
- (setq counsel-org-tags (counsel--org-get-tags)))))
- (unless (org-at-heading-p)
- (org-back-to-heading t))
- (setq counsel-org-tags (counsel--org-get-tags)))
- (let ((org-last-tags-completion-table
- (append (and (or org-complete-tags-always-offer-all-agenda-tags
- (eq major-mode 'org-agenda-mode))
- (org-global-tags-completion-table
- (org-agenda-files)))
- (unless (boundp 'org-current-tag-alist)
- org-tag-persistent-alist)
- (or (if (boundp 'org-current-tag-alist)
- org-current-tag-alist
- org-tag-alist)
- (org-get-buffer-tags)))))
- (ivy-read (counsel-org-tag-prompt)
- (lambda (str _pred _action)
- (delete-dups
- (all-completions str #'org-tags-completion-function)))
- :history 'org-tags-history
- :action #'counsel-org-tag-action
- :caller 'counsel-org-tag))))
-
-(defvar org-version)
-
-;;;###autoload
-(defun counsel-org-tag-agenda ()
- "Set tags for the current agenda item."
- (interactive)
- (cl-letf (((symbol-function (if (version< org-version "9.2")
- 'org-set-tags
- 'org-set-tags-command))
- #'counsel-org-tag))
- (org-agenda-set-tags)))
-
-(defcustom counsel-org-headline-display-tags nil
- "If non-nil, display tags in matched `org-mode' headlines."
- :type 'boolean)
-
-(defcustom counsel-org-headline-display-todo nil
- "If non-nil, display todo keywords in matched `org-mode' headlines."
- :type 'boolean)
-
-(defcustom counsel-org-headline-display-priority nil
- "If non-nil, display priorities in matched `org-mode' headlines."
- :type 'boolean)
-
-(defcustom counsel-org-headline-display-comment nil
- "If non-nil, display COMMENT string in matched `org-mode' headlines."
- :type 'boolean)
-
-(defcustom counsel-org-headline-display-statistics nil
- "If non-nil, display statistics cookie in matched `org-mode' headlines."
- :type 'boolean)
-
-(declare-function org-get-heading "org")
-(declare-function org-goto-marker-or-bmk "org")
-(declare-function outline-next-heading "outline")
-
-;;;###autoload
-(defalias 'counsel-org-goto #'counsel-outline)
-
-(defcustom counsel-org-goto-all-outline-path-prefix nil
- "Prefix for outline candidates in `counsel-org-goto-all'."
- :type '(choice
- (const :tag "None" nil)
- (const :tag "File name" file-name)
- (const :tag "File name (nondirectory part)" file-name-nondirectory)
- (const :tag "Buffer name" buffer-name)))
-
-(defun counsel-org-goto-all--outline-path-prefix ()
- (cl-case counsel-org-goto-all-outline-path-prefix
- (file-name buffer-file-name)
- (file-name-nondirectory (file-name-nondirectory buffer-file-name))
- (buffer-name (buffer-name))))
-
-(defvar counsel-outline-settings
- '((emacs-lisp-mode
- :outline-regexp ";;[;*]+[\s\t]+"
- :outline-level counsel-outline-level-emacs-lisp)
- (org-mode
- :outline-title counsel-outline-title-org
- :action counsel-org-goto-action
- :history counsel-org-goto-history
- :caller counsel-org-goto)
- ;; markdown-mode package
- (markdown-mode
- :outline-title counsel-outline-title-markdown)
- ;; Built-in mode or AUCTeX package
- (latex-mode
- :outline-title counsel-outline-title-latex))
- "Alist mapping major modes to their `counsel-outline' settings.
-
-Each entry is a pair (MAJOR-MODE . PLIST). `counsel-outline'
-checks whether an entry exists for the current buffer's
-MAJOR-MODE and, if so, loads the settings specified by PLIST
-instead of the default settings. The following settings are
-recognized:
-
-- `:outline-regexp' is a regexp to match the beginning of an
- outline heading. It is only checked at the start of a line and
- so need not start with \"^\".
- Defaults to the value of the variable `outline-regexp'.
-
-- `:outline-level' is a function of no arguments which computes
- the level of an outline heading. It is called with point at
- the beginning of `outline-regexp' and with the match data
- corresponding to `outline-regexp'.
- Defaults to the value of the variable `outline-level'.
-
-- `:outline-title' is a function of no arguments which returns
- the title of an outline heading. It is called with point at
- the end of `outline-regexp' and with the match data
- corresponding to `outline-regexp'.
- Defaults to the function `counsel-outline-title'.
-
-- `:action' is a function of one argument, the selected outline
- heading to jump to. This setting corresponds directly to its
- eponymous `ivy-read' keyword, as used by `counsel-outline', so
- the type of the function's argument depends on the value
- returned by `counsel-outline-candidates'.
- Defaults to the function `counsel-outline-action'.
-
-- `:history' is a history list, usually a symbol representing a
- history list variable. It corresponds directly to its
- eponymous `ivy-read' keyword, as used by `counsel-outline'.
- Defaults to the symbol `counsel-outline-history'.
-
-- `:caller' is a symbol to uniquely identify the caller to
- `ivy-read'. It corresponds directly to its eponymous
- `ivy-read' keyword, as used by `counsel-outline'.
- Defaults to the symbol `counsel-outline'.
-
-- `:display-style' overrides the variable
- `counsel-outline-display-style'.
-
-- `:path-separator' overrides the variable
- `counsel-outline-path-separator'.
-
-- `:face-style' overrides the variable
- `counsel-outline-face-style'.
-
-- `:custom-faces' overrides the variable
- `counsel-outline-custom-faces'.")
-
-;;;###autoload
-(defun counsel-org-goto-all ()
- "Go to a different location in any org file."
- (interactive)
- (let (entries)
- (dolist (b (buffer-list))
- (with-current-buffer b
- (when (derived-mode-p 'org-mode)
- (setq entries
- (nconc entries
- (counsel-outline-candidates
- (cdr (assq 'org-mode counsel-outline-settings))
- (counsel-org-goto-all--outline-path-prefix)))))))
- (ivy-read "Goto: " entries
- :history 'counsel-org-goto-history
- :action #'counsel-org-goto-action
- :caller 'counsel-org-goto-all)))
-
-(defun counsel-org-goto-action (x)
- "Go to headline in candidate X."
- (org-goto-marker-or-bmk (cdr x)))
-
-(defun counsel--org-get-heading-args ()
- "Return list of arguments for `org-get-heading'.
-Try to return the right number of arguments for the current Org
-version. Argument values are based on the
-`counsel-org-headline-display-*' user options."
- (nbutlast (mapcar #'not (list counsel-org-headline-display-tags
- counsel-org-headline-display-todo
- counsel-org-headline-display-priority
- counsel-org-headline-display-comment))
- ;; Added in Emacs 26.1.
- (if (if (fboundp 'func-arity)
- (< (cdr (func-arity #'org-get-heading)) 3)
- (version< org-version "9.1.1"))
- 2 0)))
-
-;;** `counsel-org-file'
-(declare-function org-attach-dir "org-attach")
-(declare-function org-attach-file-list "org-attach")
-(defvar org-attach-directory)
-
-(defun counsel-org-files ()
- "Return list of all files under current Org attachment directories.
-Filenames returned are relative to `default-directory'. For each
-attachment directory associated with the current buffer, all
-contained files are listed, so the return value could conceivably
-include attachments of other Org buffers."
- (require 'org-attach)
- (let (dirs)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "^:\\(ATTACH_DIR\\|ID\\):[\t ]+\\(.*\\)$" nil t)
- (let ((dir (org-attach-dir)))
- (when dir
- (push dir dirs)))))
- (cl-mapcan
- (lambda (dir)
- (mapcar (lambda (file)
- (file-relative-name (expand-file-name file dir)))
- (org-attach-file-list dir)))
- (nreverse dirs))))
-
-;;;###autoload
-(defun counsel-org-file ()
- "Browse all attachments for current Org file."
- (interactive)
- (ivy-read "file: " (counsel-org-files)
- :action #'counsel-locate-action-dired
- :caller 'counsel-org-file))
-
-;;** `counsel-org-entity'
-(defvar org-entities)
-(defvar org-entities-user)
-
-;;;###autoload
-(defun counsel-org-entity ()
- "Complete Org entities using Ivy."
- (interactive)
- (require 'org)
- (ivy-read "Entity: " (cl-loop for element in (append org-entities org-entities-user)
- unless (stringp element)
- collect (cons
- (format "%20s | %20s | %20s | %s"
- (cl-first element) ; name
- (cl-second element) ; latex
- (cl-fourth element) ; html
- (cl-seventh element)) ; utf-8
- element))
- :require-match t
- :action '(1
- ("u" (lambda (candidate)
- (insert (cl-seventh (cdr candidate)))) "utf-8")
- ("o" (lambda (candidate)
- (insert "\\" (cl-first (cdr candidate)))) "org-entity")
- ("l" (lambda (candidate)
- (insert (cl-second (cdr candidate)))) "latex")
- ("h" (lambda (candidate)
- (insert (cl-fourth (cdr candidate)))) "html")
- ("a" (lambda (candidate)
- (insert (cl-fifth (cdr candidate)))) "ascii")
- ("L" (lambda (candidate)
- (insert (cl-sixth (cdr candidate))) "Latin-1")))))
-
-;;** `counsel-org-capture'
-(defvar org-capture-templates)
-(defvar org-capture-templates-contexts)
-(declare-function org-contextualize-keys "org")
-(declare-function org-capture-goto-last-stored "org-capture")
-(declare-function org-capture-goto-target "org-capture")
-(declare-function org-capture-upgrade-templates "org-capture")
-
-;;;###autoload
-(defun counsel-org-capture ()
- "Capture something."
- (interactive)
- (require 'org-capture)
- (ivy-read "Capture template: "
- (delq nil
- (mapcar
- (lambda (x)
- (when (> (length x) 2)
- (format "%-5s %s" (nth 0 x) (nth 1 x))))
- ;; We build the list of capture templates as in
- ;; `org-capture-select-template':
- (or (org-contextualize-keys
- (org-capture-upgrade-templates org-capture-templates)
- org-capture-templates-contexts)
- '(("t" "Task" entry (file+headline "" "Tasks")
- "* TODO %?\n %u\n %a")))))
- :require-match t
- :action (lambda (x)
- (org-capture nil (car (split-string x))))
- :caller 'counsel-org-capture))
-
-(ivy-configure 'counsel-org-capture
- :initial-input "^")
-
-(ivy-set-actions
- 'counsel-org-capture
- `(("t" ,(lambda (x)
- (org-capture-goto-target (car (split-string x))))
- "go to target")
- ("l" ,(lambda (_x)
- (org-capture-goto-last-stored))
- "go to last stored")
- ("p" ,(lambda (x)
- (org-capture 0 (car (split-string x))))
- "insert template at point")
- ("c" ,(lambda (_x)
- (customize-variable 'org-capture-templates))
- "customize org-capture-templates")))
-
-;;** `counsel-org-agenda-headlines'
-(defvar org-odd-levels-only)
-(declare-function org-set-startup-visibility "org")
-(declare-function org-show-entry "org")
-(declare-function org-map-entries "org")
-(declare-function org-heading-components "org")
-
-(defun counsel-org-agenda-headlines-action-goto (headline)
- "Go to the `org-mode' agenda HEADLINE."
- (find-file (nth 1 headline))
- (org-set-startup-visibility)
- (goto-char (nth 2 headline))
- (org-show-entry))
-
-(ivy-set-actions
- 'counsel-org-agenda-headlines
- '(("g" counsel-org-agenda-headlines-action-goto "goto headline")))
-
-(defvar counsel-org-agenda-headlines-history nil
- "History for `counsel-org-agenda-headlines'.")
-
-(defcustom counsel-outline-display-style 'path
- "The style used when displaying matched outline headings.
-
-If `headline', the title is displayed with leading stars
-indicating the outline level.
-
-If `path', the path hierarchy is displayed. For each entry the
-title is shown. Entries are separated with
-`counsel-outline-path-separator'.
-
-If `title' or any other value, only the title of the heading is
-displayed.
-
-For displaying tags and TODO keywords in `org-mode' buffers, see
-`counsel-org-headline-display-tags' and
-`counsel-org-headline-display-todo', respectively."
- :type '(choice
- (const :tag "Title only" title)
- (const :tag "Headline" headline)
- (const :tag "Path" path)))
-
-(defcustom counsel-outline-path-separator "/"
- "String separating path entries in matched outline headings.
-This variable has no effect unless
-`counsel-outline-display-style' is set to `path'."
- :type 'string)
-
-(declare-function org-get-outline-path "org")
-
-(defun counsel-org-agenda-headlines--candidates ()
- "Return a list of completion candidates for `counsel-org-agenda-headlines'."
- (org-map-entries
- (lambda ()
- (let* ((components (org-heading-components))
- (level (and (eq counsel-outline-display-style 'headline)
- (make-string
- (if org-odd-levels-only
- (nth 1 components)
- (nth 0 components))
- ?*)))
- (todo (and counsel-org-headline-display-todo
- (nth 2 components)))
- (path (and (eq counsel-outline-display-style 'path)
- (org-get-outline-path)))
- (priority (and counsel-org-headline-display-priority
- (nth 3 components)))
- (text (nth 4 components))
- (tags (and counsel-org-headline-display-tags
- (nth 5 components))))
- (list
- (mapconcat
- 'identity
- (cl-remove-if 'null
- (list
- level
- todo
- (and priority (format "[#%c]" priority))
- (mapconcat 'identity
- (append path (list text))
- counsel-outline-path-separator)
- tags))
- " ")
- buffer-file-name
- (point))))
- nil
- 'agenda))
-
-;;;###autoload
-(defun counsel-org-agenda-headlines ()
- "Choose from headers of `org-mode' files in the agenda."
- (interactive)
- (require 'org)
- (let ((minibuffer-allow-text-properties t))
- (ivy-read "Org headline: "
- (counsel-org-agenda-headlines--candidates)
- :action #'counsel-org-agenda-headlines-action-goto
- :history 'counsel-org-agenda-headlines-history
- :caller 'counsel-org-agenda-headlines)))
-
-;;** `counsel-org-link'
-(declare-function org-insert-link "ol")
-(declare-function org-id-get-create "org-id")
-
-(defun counsel-org-link-action (x)
- "Insert a link to X."
- (let ((id (save-excursion
- (goto-char (cdr x))
- (org-id-get-create))))
- (org-insert-link nil (concat "id:" id) (car x))))
-
-;;;###autoload
-(defun counsel-org-link ()
- "Insert a link to an headline with completion."
- (interactive)
- (ivy-read "Link: " (counsel-outline-candidates
- '(:outline-title counsel-outline-title-org ))
- :action #'counsel-org-link-action
- :history 'counsel-org-link-history
- :caller 'counsel-org-link))
-
-;; Misc. Emacs
-;;** `counsel-mark-ring'
-(defface counsel--mark-ring-highlight
- '((t (:inherit highlight)))
- "Face for current `counsel-mark-ring' line."
- :group 'ivy-faces)
-
-(defvar counsel--mark-ring-overlay nil
- "Internal overlay to highlight line by candidate of `counsel-mark-ring'.")
-
-(defun counsel--mark-ring-add-highlight ()
- "Add highlight to current line."
- (setq counsel--mark-ring-overlay
- (make-overlay (line-beginning-position) (1+ (line-end-position))))
- (with-ivy-window
- (overlay-put counsel--mark-ring-overlay 'face
- 'counsel--mark-ring-highlight)))
-
-(defun counsel--mark-ring-delete-highlight ()
- "If `counsel-mark-ring' have highlight, delete highlight."
- (if counsel--mark-ring-overlay (delete-overlay counsel--mark-ring-overlay)))
-
-(defvar counsel--mark-ring-calling-point 0
- "Internal variable to remember calling position.")
-
-(defun counsel--mark-ring-unwind ()
- "Return back to calling position of `counsel-mark-ring'."
- (goto-char counsel--mark-ring-calling-point)
- (counsel--mark-ring-delete-highlight))
-
-(defun counsel--mark-ring-update-fn ()
- "Show preview by candidate."
- (let ((pos (get-text-property 0 'point (ivy-state-current ivy-last))))
- (counsel--mark-ring-delete-highlight)
- (with-ivy-window
- (goto-char pos)
- (counsel--mark-ring-add-highlight))))
-
-;;;###autoload
-(defun counsel-mark-ring ()
- "Browse `mark-ring' interactively.
-Obeys `widen-automatically', which see."
- (interactive)
- (let* ((counsel--mark-ring-calling-point (point))
- (marks (copy-sequence mark-ring))
- (marks (delete-dups marks))
- (marks
- ;; mark-marker is empty?
- (if (equal (mark-marker) (make-marker))
- marks
- (cons (copy-marker (mark-marker)) marks)))
- (candidates (counsel-mark--get-candidates marks)))
- (if candidates
- (counsel-mark--ivy-read candidates 'counsel-mark-ring)
- (message "Mark ring is empty"))))
-
-(defun counsel-mark--get-candidates (marks)
- "Convert a list of MARKS into mark candidates.
-candidates are simply strings formatted to have the line number of the
-associated mark prepended to them and having an extra text property of
-point to indicarte where the candidate mark is."
- (when marks
- (save-excursion
- (save-restriction
- ;; Widen, both to save `line-number-at-pos' the trouble
- ;; and for `buffer-substring' to work.
- (widen)
- (let* ((width (length (number-to-string (line-number-at-pos (point-max)))))
- (fmt (format "%%%dd %%s" width)))
- (mapcar (lambda (mark)
- (goto-char (marker-position mark))
- (let ((linum (line-number-at-pos))
- (line (buffer-substring
- (line-beginning-position) (line-end-position))))
- (propertize (format fmt linum line) 'point (point))))
- marks))))))
-
-(defun counsel-mark--ivy-read (candidates caller)
- "call `ivy-read' with sane defaults for traversing marks.
-CANDIDATES should be an alist with the `car' of the list being
-the string displayed by ivy and the `cdr' being the point that
-mark should take you to.
-
-NOTE This has been abstracted out into it's own method so it can
-be used by both `counsel-mark-ring' and `counsel-evil-marks'"
- (ivy-read "Mark: " candidates
- :require-match t
- :update-fn #'counsel--mark-ring-update-fn
- :action (lambda (cand)
- (let ((pos (get-text-property 0 'point cand)))
- (when pos
- (unless (<= (point-min) pos (point-max))
- (if widen-automatically
- (widen)
- (error "\
-Position of selected mark outside accessible part of buffer")))
- (goto-char pos))))
- :unwind #'counsel--mark-ring-unwind
- :caller caller))
-
-(ivy-configure 'counsel-mark-ring
- :update-fn #'counsel--mark-ring-update-fn
- :unwind-fn #'counsel--mark-ring-unwind
- :sort-fn #'ivy-string<)
-
-;;** `counsel-evil-marks'
-(defvar counsel-evil-marks-exclude-registers nil
- "List of evil registers to not display in `counsel-evil-marks' by default.
-Each member of the list should be a character (stored as an integer).")
-
-(defvar evil-markers-alist)
-(declare-function evil-global-marker-p "ext:evil-common")
-
-(defun counsel-mark--get-evil-candidates (all-markers-p)
- "Convert all evil MARKS in the current buffer to mark candidates.
-Works like `counsel-mark--get-candidates' but also prepends the
-register tied to a mark in the message string."
- ;; evil doesn't provide a standalone method to access the list of
- ;; marks in the current buffer, as it does with registers.
- (let* ((all-markers
- (append
- (cl-remove-if (lambda (m)
- (or (evil-global-marker-p (car m))
- (not (markerp (cdr m)))))
- evil-markers-alist)
- (cl-remove-if (lambda (m)
- (or (not (evil-global-marker-p (car m)))
- (not (markerp (cdr m)))))
- (default-value 'evil-markers-alist))))
-
- (all-markers
- ;; with prefix, ignore register exclusion list.
- (if all-markers-p
- all-markers
- (cl-remove-if-not
- (lambda (x) (not (member (car x) counsel-evil-marks-exclude-registers)))
- all-markers)))
- ;; separate the markers from the evil registers
- ;; for call to `counsel-mark--get-candidates'
- (registers (mapcar #'car all-markers))
- (markers (mapcar #'cdr all-markers))
- (candidates (counsel-mark--get-candidates markers)))
- (when candidates
- (let (register candidate result)
- (while (and (setq register (pop registers))
- (setq candidate (pop candidates)))
- (let ((point (get-text-property 0 'point candidate))
- (evil-candidate
- (format "[%s]: %s"
- (propertize (char-to-string register)
- 'face 'counsel-evil-register-face)
- candidate)))
- (push (propertize evil-candidate 'point point) result)))
- result))))
-
-;;;###autoload
-(defun counsel-evil-marks (&optional arg)
- "Ivy replacement for `evil-show-marks'.
-By default, this function respects `counsel-evil-marks-exclude-registers'.
-When ARG is non-nil, display all active evil registers."
- (interactive "P")
- (if (and (boundp 'evil-markers-alist)
- (fboundp 'evil-global-marker-p))
- (let* ((counsel--mark-ring-calling-point (point))
- (candidates (counsel-mark--get-evil-candidates arg)))
- (if candidates
- (counsel-mark--ivy-read candidates 'counsel-evil-marks)
- (message "no evil marks are active")))
- (user-error "Required feature `evil' not installed or loaded")))
-
-;;** `counsel-package'
-(defvar package--initialized)
-(defvar package-alist)
-(defvar package-archive-contents)
-(defvar package-archives)
-(defvar package-user-dir)
-(declare-function package-installed-p "package")
-(declare-function package-delete "package")
-(declare-function package-desc-extras "package")
-
-(defvar counsel-package-history nil
- "History for `counsel-package'.")
-
-(defun counsel--package-candidates ()
- "Return completion alist for `counsel-package'."
- (unless package--initialized
- (package-initialize t))
- (if (or (not package-archive-contents)
- (cl-find-if (lambda (package-archive)
- (let ((fname
- (format
- "%s/archives/%s/archive-contents"
- package-user-dir (car package-archive))))
- (or (not (file-exists-p fname))
- (counsel-file-stale-p fname (* 4 60 60)))))
- package-archives))
- (package-refresh-contents))
- (sort (mapcar (lambda (entry)
- (cons (let ((pkg (car entry)))
- (concat (if (package-installed-p pkg) "-" "+")
- (symbol-name pkg)))
- entry))
- package-archive-contents)
- #'counsel--package-sort))
-
-;;;###autoload
-(defun counsel-package ()
- "Install or delete packages.
-
-Packages not currently installed are prefixed with \"+\", and
-selecting one of these will try to install it.
-Packages currently installed are prefixed with \"-\", and
-selecting one of these will try to delete it.
-
-Additional actions:\\<ivy-minibuffer-map>
-
- \\[ivy-dispatching-done] d: Describe package
- \\[ivy-dispatching-done] h: Visit package's homepage"
- (interactive)
- (require 'package)
- (ivy-read "Packages (install +pkg or delete -pkg): "
- (counsel--package-candidates)
- :action #'counsel-package-action
- :require-match t
- :history 'counsel-package-history
- :caller 'counsel-package))
-
-(cl-pushnew '(counsel-package . "^+") ivy-initial-inputs-alist :key #'car)
-
-(defun counsel-package-action (package)
- "Delete or install PACKAGE."
- (setq package (cadr package))
- (if (package-installed-p package)
- (package-delete (cadr (assq package package-alist)))
- (package-install package)))
-
-(defun counsel-package-action-describe (package)
- "Call `describe-package' on PACKAGE."
- (describe-package (cadr package)))
-
-(defun counsel-package-action-homepage (package)
- "Open homepage for PACKAGE in a WWW browser."
- (let ((url (cdr (assq :url (package-desc-extras (nth 2 package))))))
- (if url
- (browse-url url)
- (message "No homepage specified for package `%s'" (nth 1 package)))))
-
-(defun counsel--package-sort (a b)
- "Sort function for `counsel-package' candidates."
- (let* ((a (car a))
- (b (car b))
- (a-inst (= (string-to-char a) ?+))
- (b-inst (= (string-to-char b) ?+)))
- (or (and a-inst (not b-inst))
- (and (eq a-inst b-inst) (string-lessp a b)))))
-
-(ivy-set-actions
- 'counsel-package
- '(("d" counsel-package-action-describe "describe package")
- ("h" counsel-package-action-homepage "open package homepage")))
-
-;;** `counsel-tmm'
-(defvar tmm-km-list nil)
-(declare-function tmm-get-keymap "tmm")
-(declare-function tmm--completion-table "tmm")
-(declare-function tmm-get-keybind "tmm")
-
-(defun counsel-tmm-prompt (menu)
- "Select and call an item from the MENU keymap."
- (let (out
- choice
- chosen-string)
- (setq tmm-km-list nil)
- (map-keymap (lambda (k v) (tmm-get-keymap (cons k v))) menu)
- (setq tmm-km-list (nreverse tmm-km-list))
- (setq out (ivy-read "Menu bar: " (tmm--completion-table tmm-km-list)
- :require-match t))
- (setq choice (cdr (assoc out tmm-km-list)))
- (setq chosen-string (car choice))
- (setq choice (cdr choice))
- (cond ((keymapp choice)
- (counsel-tmm-prompt choice))
- ((and choice chosen-string)
- (setq last-command-event chosen-string)
- (call-interactively choice)))))
-
-(defvar tmm-table-undef)
-
-;;;###autoload
-(defun counsel-tmm ()
- "Text-mode emulation of looking and choosing from a menu bar."
- (interactive)
- (require 'tmm)
- (run-hooks 'menu-bar-update-hook)
- (setq tmm-table-undef nil)
- (counsel-tmm-prompt (tmm-get-keybind [menu-bar])))
-
-;;** `counsel-yank-pop'
-(defcustom counsel-yank-pop-truncate-radius 2
- "Number of context lines around `counsel-yank-pop' candidates."
- :type 'integer)
-
-(defun counsel--yank-pop-truncate (str)
- "Truncate STR for use in `counsel-yank-pop'."
- (condition-case nil
- (let* ((lines (split-string str "\n" t))
- (n (length lines))
- (re (ivy-re-to-str ivy--old-re))
- (first-match (cl-position-if
- (lambda (s) (string-match re s))
- lines))
- (beg (max 0 (- first-match
- counsel-yank-pop-truncate-radius)))
- (end (min n (+ first-match
- counsel-yank-pop-truncate-radius
- 1)))
- (seq (cl-subseq lines beg end)))
- (if (null first-match)
- (error "Could not match %s" str)
- (when (> beg 0)
- (setcar seq (concat "[...] " (car seq))))
- (when (< end n)
- (setcar (last seq)
- (concat (car (last seq)) " [...]")))
- (mapconcat #'identity seq "\n")))
- (error str)))
-
-(defcustom counsel-yank-pop-separator "\n"
- "Separator for the kill ring strings in `counsel-yank-pop'."
- :type '(choice
- (const :tag "Plain" "\n")
- (const :tag "Dashes" "\n----\n")
- string))
-
-(defun counsel--yank-pop-format-function (cand-pairs)
- "Transform CAND-PAIRS into a string for `counsel-yank-pop'."
- (ivy--format-function-generic
- (lambda (str)
- (mapconcat
- (lambda (s)
- (ivy--add-face s 'ivy-current-match))
- (split-string
- (counsel--yank-pop-truncate str) "\n" t)
- "\n"))
- (lambda (str)
- (counsel--yank-pop-truncate str))
- cand-pairs
- (propertize counsel-yank-pop-separator 'face 'ivy-separator)))
-
-(defun counsel--yank-pop-position (s)
- "Return position of S in `kill-ring' relative to last yank."
- (or (cl-position s kill-ring-yank-pointer :test #'equal-including-properties)
- (cl-position s kill-ring-yank-pointer :test #'equal)
- (+ (or (cl-position s kill-ring :test #'equal-including-properties)
- (cl-position s kill-ring :test #'equal))
- (- (length kill-ring-yank-pointer)
- (length kill-ring)))))
-
-(defun counsel-string-non-blank-p (s)
- "Return non-nil if S includes non-blank characters.
-Newlines and carriage returns are considered blank."
- (not (string-match-p "\\`[\n\r[:blank:]]*\\'" s)))
-
-(defcustom counsel-yank-pop-filter #'counsel-string-non-blank-p
- "Unary filter function applied to `counsel-yank-pop' candidates.
-All elements of `kill-ring' for which this function returns nil
-will be destructively removed from `kill-ring' before completion.
-All blank strings are deleted from `kill-ring' by default."
- :type '(radio
- (function-item counsel-string-non-blank-p)
- (function-item identity)
- (function :tag "Other")))
-
-(defun counsel--yank-pop-kills ()
- "Return filtered `kill-ring' for `counsel-yank-pop' completion.
-Both `kill-ring' and `kill-ring-yank-pointer' may be
-destructively modified to eliminate duplicates under
-`equal-including-properties', satisfy `counsel-yank-pop-filter',
-and incorporate `interprogram-paste-function'."
- ;; Protect against `kill-ring' and result of
- ;; `interprogram-paste-function' both being nil
- (ignore-errors (current-kill 0))
- ;; Keep things consistent with the rest of Emacs
- (dolist (sym '(kill-ring kill-ring-yank-pointer))
- (set sym (cl-delete-duplicates
- (cl-delete-if-not counsel-yank-pop-filter (symbol-value sym))
- :test #'equal-including-properties :from-end t)))
- kill-ring)
-
-(defcustom counsel-yank-pop-after-point nil
- "Whether `counsel-yank-pop' yanks after point.
-Nil means `counsel-yank-pop' puts point at the end of the yanked
-text and mark at its beginning, as per the default \\[yank].
-Non-nil means `counsel-yank-pop' swaps the resulting point and
-mark, as per \\[universal-argument] \\[yank]."
- :type 'boolean)
-
-(defun counsel-yank-pop-action (s)
- "Like `yank-pop', but insert the kill corresponding to S.
-Signal a `buffer-read-only' error if called from a read-only
-buffer position."
- (with-ivy-window
- (barf-if-buffer-read-only)
- (setq last-command 'yank)
- (setq yank-window-start (window-start))
- (condition-case nil
- ;; Avoid unexpected additions to `kill-ring'
- (let (interprogram-paste-function)
- (yank-pop (counsel--yank-pop-position s)))
- (error
- (insert s)))
- (when (funcall (if counsel-yank-pop-after-point #'> #'<)
- (point) (mark t))
- (exchange-point-and-mark t))))
-
-(defun counsel-yank-pop-action-remove (s)
- "Remove all occurrences of S from the kill ring."
- (dolist (sym '(kill-ring kill-ring-yank-pointer))
- (set sym (cl-delete s (symbol-value sym)
- :test #'equal-including-properties)))
- ;; Update collection and preselect for next `ivy-call'
- (setf (ivy-state-collection ivy-last) kill-ring)
- (setf (ivy-state-preselect ivy-last)
- (nth (min ivy--index (1- (length kill-ring)))
- kill-ring))
- (ivy--reset-state ivy-last))
-
-(defun counsel-yank-pop-action-rotate (s)
- "Rotate the yanking point to S in the kill ring.
-See `current-kill' for how this interacts with the window system
-selection."
- (let ((i (counsel--yank-pop-position s)))
- ;; Avoid unexpected additions to `kill-ring'
- (let (interprogram-paste-function)
- (setf (ivy-state-preselect ivy-last) (current-kill i)))
- ;; Manually change window system selection because `current-kill' won't
- (when (and (zerop i)
- yank-pop-change-selection
- interprogram-cut-function)
- (funcall interprogram-cut-function (car kill-ring-yank-pointer))))
- (ivy--reset-state ivy-last))
-
-(defcustom counsel-yank-pop-preselect-last nil
- "Whether `counsel-yank-pop' preselects the last kill by default.
-
-The command `counsel-yank-pop' always preselects the same kill
-that `yank-pop' would have inserted, given the same prefix
-argument.
-
-When `counsel-yank-pop-preselect-last' is nil (the default), the
-prefix argument of `counsel-yank-pop' defaults to 1 (as per
-`yank-pop'), which causes the next-to-last kill to be
-preselected. Otherwise, the prefix argument defaults to 0, which
-results in the most recent kill being preselected."
- :type 'boolean)
-
-;; Moved to subr.el in Emacs 27.1.
-(autoload 'xor "array")
-
-;;;###autoload
-(defun counsel-yank-pop (&optional arg)
- "Ivy replacement for `yank-pop'.
-With a plain prefix argument (\\[universal-argument]),
-temporarily toggle the value of `counsel-yank-pop-after-point'.
-Any other value of ARG has the same meaning as in `yank-pop', but
-`counsel-yank-pop-preselect-last' determines its default value.
-See also `counsel-yank-pop-filter' for how to filter candidates.
-
-Note: Duplicate elements of `kill-ring' are always deleted."
- ;; Do not specify `*' to allow browsing `kill-ring' in read-only buffers
- (interactive "P")
- (let ((kills (or (counsel--yank-pop-kills)
- (error "Kill ring is empty or blank")))
- (preselect (let (interprogram-paste-function)
- (current-kill (cond ((nlistp arg)
- (prefix-numeric-value arg))
- (counsel-yank-pop-preselect-last 0)
- (t 1))
- t)))
- (counsel-yank-pop-after-point
- (xor (consp arg) counsel-yank-pop-after-point)))
- (unless (eq last-command 'yank)
- (push-mark))
- (ivy-read "kill-ring: " kills
- :require-match t
- :preselect preselect
- :action #'counsel-yank-pop-action
- :caller 'counsel-yank-pop)))
-
-(ivy-configure 'counsel-yank-pop
- :height 5
- :format-fn #'counsel--yank-pop-format-function)
-
-(ivy-set-actions
- 'counsel-yank-pop
- '(("d" counsel-yank-pop-action-remove "delete")
- ("r" counsel-yank-pop-action-rotate "rotate")))
-
-;;** `counsel-register'
-(defvar counsel-register-actions
- '(("\\`buffer" . jump-to-register)
- ("\\`text" . insert-register)
- ("\\`rectangle" . insert-register)
- ("\\`window" . jump-to-register)
- ("\\`frame" . jump-to-register)
- ("\\`[-+]?[0-9]+\\(?:\\.[0-9]\\)?\\'" . insert-register)
- ("\\`\\(?:the \\)?file " . jump-to-register)
- ("\\`keyboard" . jump-to-register)
- ("\\`file-query" . jump-to-register))
- "Alist of (REGEXP . FUNCTION) pairs for `counsel-register'.
-Selecting a register whose description matches REGEXP specifies
-FUNCTION as the action to take on the register.")
-
-(defvar counsel-register-history nil
- "History for `counsel-register'.")
-
-(defun counsel-register-action (register)
- "Default action for `counsel-register'.
-
-Call a function on REGISTER. The function is determined by
-matching the register's value description against a regexp in
-`counsel-register-actions'."
- (let* ((val (get-text-property 0 'register register))
- (desc (register-describe-oneline val))
- (action (cdr (cl-assoc-if (lambda (re) (string-match-p re desc))
- counsel-register-actions))))
- (if action
- (funcall action val)
- (error "No action was found for register %s"
- (single-key-description val)))))
-
-;;;###autoload
-(defun counsel-register ()
- "Interactively choose a register."
- (interactive)
- (ivy-read "Register: "
- (cl-mapcan
- (lambda (reg)
- (let ((s (funcall register-preview-function reg)))
- (setq s (substring s 0 (string-match-p "[ \t\n\r]+\\'" s)))
- (unless (string= s "")
- (put-text-property 0 1 'register (car reg) s)
- (list s))))
- register-alist)
- :require-match t
- :history 'counsel-register-history
- :action #'counsel-register-action
- :caller 'counsel-register))
-
-(ivy-configure 'counsel-register
- :sort-fn #'ivy-string<)
-
-;;** `counsel-evil-registers'
-(defface counsel-evil-register-face
- '((t (:inherit counsel-outline-1)))
- "Face for highlighting `evil' registers in ivy."
- :group 'ivy-faces)
-
-;;;###autoload
-(defun counsel-evil-registers ()
- "Ivy replacement for `evil-show-registers'."
- (interactive)
- (if (fboundp 'evil-register-list)
- (ivy-read "evil-registers: "
- (cl-loop for (key . val) in (evil-register-list)
- collect (format "[%s]: %s"
- (propertize (char-to-string key)
- 'face 'counsel-evil-register-face)
- (if (stringp val) val "")))
- :require-match t
- :action #'counsel-evil-registers-action
- :caller 'counsel-evil-registers)
- (user-error "Required feature `evil' not installed")))
-
-(ivy-configure 'counsel-evil-registers
- :height 5
- :format-fn #'counsel--yank-pop-format-function)
-
-(defun counsel-evil-registers-action (s)
- "Paste contents of S, trimming the register part.
-
-S will be of the form \"[register]: content\"."
- (with-ivy-window
- (insert
- (replace-regexp-in-string "\\`\\[.*?\\]: " "" s))))
-
-;;** `counsel-imenu'
-(defvar imenu-auto-rescan)
-(defvar imenu-auto-rescan-maxout)
-(declare-function imenu--subalist-p "imenu")
-(declare-function imenu--make-index-alist "imenu")
-
-(defun counsel--imenu-candidates ()
- (require 'imenu)
- (let* ((imenu-auto-rescan t)
- (imenu-auto-rescan-maxout (if current-prefix-arg
- (buffer-size)
- imenu-auto-rescan-maxout))
- (items (imenu--make-index-alist t))
- (items (delete (assoc "*Rescan*" items) items))
- (items (if (eq major-mode 'emacs-lisp-mode)
- (counsel-imenu-categorize-functions items)
- items)))
- (counsel-imenu-get-candidates-from items)))
-
-(defun counsel-imenu-get-candidates-from (alist &optional prefix)
- "Create a list of (key . value) from ALIST.
-PREFIX is used to create the key."
- (cl-mapcan
- (lambda (elm)
- (if (imenu--subalist-p elm)
- (counsel-imenu-get-candidates-from
- (cl-loop for (e . v) in (cdr elm) collect
- (cons e (if (integerp v) (copy-marker v) v)))
- ;; pass the prefix to next recursive call
- (concat prefix (if prefix ".") (car elm)))
- (let ((key (concat
- (when prefix
- (concat
- (propertize prefix 'face 'ivy-grep-info)
- ": "))
- (car elm))))
- (list (cons key
- (cons key (if (overlayp (cdr elm))
- (overlay-start (cdr elm))
- (cdr elm))))))))
- alist))
-
-(defvar counsel-imenu-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-l") 'ivy-call-and-recenter)
- map))
-
-(defun counsel-imenu-categorize-functions (items)
- "Categorize all the functions of imenu."
- (let ((fns (cl-remove-if #'listp items :key #'cdr)))
- (if fns
- (nconc (cl-remove-if #'nlistp items :key #'cdr)
- `(("Functions" ,@fns)))
- items)))
-
-(defun counsel-imenu-action (x)
- (with-ivy-window
- (imenu (cdr x))))
-
-(defvar counsel-imenu-history nil
- "History for `counsel-imenu'.")
-
-;;;###autoload
-(defun counsel-imenu ()
- "Jump to a buffer position indexed by imenu."
- (interactive)
- (ivy-read "imenu items: " (counsel--imenu-candidates)
- :preselect (thing-at-point 'symbol)
- :require-match t
- :action #'counsel-imenu-action
- :keymap counsel-imenu-map
- :history 'counsel-imenu-history
- :caller 'counsel-imenu))
-
-;;** `counsel-list-processes'
-(defun counsel-list-processes-action-delete (x)
- "Delete process X."
- (delete-process x)
- (setf (ivy-state-collection ivy-last)
- (setq ivy--all-candidates
- (delete x ivy--all-candidates))))
-
-(defun counsel-list-processes-action-switch (x)
- "Switch to buffer of process X."
- (let* ((proc (get-process x))
- (buf (and proc (process-buffer proc))))
- (if buf
- (switch-to-buffer buf)
- (message "Process %s doesn't have a buffer" x))))
-
-;;;###autoload
-(defun counsel-list-processes ()
- "Offer completion for `process-list'.
-The default action deletes the selected process.
-An extra action allows to switch to the process buffer."
- (interactive)
- (with-temp-buffer
- (list-processes--refresh))
- (ivy-read "Process: " (mapcar #'process-name (process-list))
- :require-match t
- :action
- '(1
- ("o" counsel-list-processes-action-delete "kill")
- ("s" counsel-list-processes-action-switch "switch"))
- :caller 'counsel-list-processes))
-
-;;** `counsel-ace-link'
-(defun counsel-ace-link ()
- "Use Ivy completion for `ace-link'."
- (interactive)
- (let (collection action)
- (cond ((eq major-mode 'Info-mode)
- (setq collection 'ace-link--info-collect)
- (setq action 'ace-link--info-action))
- ((eq major-mode 'help-mode)
- (setq collection 'ace-link--help-collect)
- (setq action 'ace-link--help-action))
- ((eq major-mode 'woman-mode)
- (setq collection 'ace-link--woman-collect)
- (setq action 'ace-link--woman-action))
- ((eq major-mode 'eww-mode)
- (setq collection 'ace-link--eww-collect)
- (setq action 'ace-link--eww-action))
- ((eq major-mode 'compilation-mode)
- (setq collection 'ace-link--eww-collect)
- (setq action 'ace-link--compilation-action))
- ((eq major-mode 'org-mode)
- (setq collection 'ace-link--org-collect)
- (setq action 'ace-link--org-action)))
- (if (null collection)
- (error "%S is not supported" major-mode)
- (ivy-read "Ace-Link: " (funcall collection)
- :action (lambda (x) (funcall action (cdr x)))
- :require-match t
- :caller 'counsel-ace-link))))
-
-;;** `counsel-minibuffer-history'
-;;;###autoload
-(defun counsel-minibuffer-history ()
- "Browse minibuffer history."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (ivy-read "History: " (ivy-history-contents minibuffer-history-variable)
- :keymap ivy-reverse-i-search-map
- :action (lambda (x)
- (insert (substring-no-properties (car x))))
- :caller 'counsel-minibuffer-history)))
-
-;;** `counsel-esh-history'
-(defvar comint-input-ring-index)
-(defvar eshell-history-index)
-(defvar slime-repl-input-history-position)
-
-(defvar counsel-esh--index-last)
-(defvar counsel-shell-history--index-last)
-(defvar counsel-slime-repl-history--index-last)
-
-(defun counsel--browse-history-action (pair)
- (let ((snd (cdr pair)))
- (cl-case (ivy-state-caller ivy-last)
- (counsel-esh-history
- (setq eshell-history-index snd
- counsel-esh--index-last snd))
- (counsel-shell-history
- (setq comint-input-ring-index snd
- counsel-shell-history--index-last snd))
- (counsel-slime-repl-history
- (setq slime-repl-input-history-position snd
- counsel-slime-repl-history--index-last snd)))
- (ivy-completion-in-region-action (car pair))))
-
-(cl-defun counsel--browse-history (ring &key caller)
- "Use Ivy to navigate through RING."
- (let* ((proc (get-buffer-process (current-buffer)))
- (end (point))
- (beg (if proc
- (min (process-mark proc) end)
- end))
- (input (when (< beg end)
- (concat "^" (buffer-substring beg end)))))
- (setq ivy-completion-beg beg)
- (setq ivy-completion-end end)
- (ivy-read "History: " (ivy-history-contents ring)
- :keymap ivy-reverse-i-search-map
- :initial-input input
- :action #'counsel--browse-history-action
- :caller caller)))
-
-(defvar eshell-history-ring)
-(defvar eshell-matching-input-from-input-string)
-
-(defvar counsel-esh--index-last nil
- "Index corresponding to last selection with `counsel-esh-history'.")
-
-;;;###autoload
-(defun counsel-esh-history ()
- "Browse Eshell history."
- (interactive)
- (require 'em-hist)
- (counsel--browse-history eshell-history-ring
- :caller #'counsel-esh-history))
-
-(defadvice eshell-previous-matching-input (before
- counsel-set-eshell-history-index
- activate)
- "Reassign `eshell-history-index'."
- (when (and (memq last-command '(ivy-alt-done ivy-done))
- (equal (ivy-state-caller ivy-last) 'counsel-esh-history))
- (setq eshell-history-index counsel-esh--index-last)))
-
-(defvar comint-input-ring)
-(defvar comint-matching-input-from-input-string)
-
-(defvar counsel-shell-history--index-last nil
- "Index corresponding to last selection with `counsel-shell-history'.")
-
-;;;###autoload
-(defun counsel-shell-history ()
- "Browse shell history."
- (interactive)
- (require 'comint)
- (counsel--browse-history comint-input-ring
- :caller #'counsel-shell-history))
-
-(defadvice comint-previous-matching-input (before
- counsel-set-comint-history-index
- activate)
- "Reassign `comint-input-ring-index'."
- (when (and (memq last-command '(ivy-alt-done ivy-done))
- (equal (ivy-state-caller ivy-last) 'counsel-shell-history))
- (setq comint-input-ring-index counsel-shell-history--index-last)))
-
-(defvar slime-repl-input-history)
-
-(defvar counsel-slime-repl-history--index-last nil
- "Index corresponding to last selection with `counsel-slime-repl-history'.")
-
-;;;###autoload
-(defun counsel-slime-repl-history ()
- "Browse Slime REPL history."
- (interactive)
- (require 'slime-repl)
- (counsel--browse-history slime-repl-input-history
- :caller #'counsel-slime-repl-history))
-
-;; TODO: add advice for slime-repl-input-previous/next to properly
-;; reassign the ring index and match string
-
-;;** `counsel-hydra-heads'
-(defvar hydra-curr-body-fn)
-(declare-function hydra-keyboard-quit "ext:hydra")
-
-;;;###autoload
-(defun counsel-hydra-heads ()
- "Call a head of the current/last hydra."
- (interactive)
- (let* ((base (substring
- (prin1-to-string hydra-curr-body-fn)
- 0 -4))
- (heads (eval (intern (concat base "heads"))))
- (keymap (eval (intern (concat base "keymap"))))
- (head-names
- (mapcar (lambda (x)
- (cons
- (if (nth 2 x)
- (format "[%s] %S (%s)" (nth 0 x) (nth 1 x) (nth 2 x))
- (format "[%s] %S" (nth 0 x) (nth 1 x)))
- (lookup-key keymap (kbd (nth 0 x)))))
- heads)))
- (ivy-read "head: " head-names
- :action (lambda (x) (call-interactively (cdr x))))
- (hydra-keyboard-quit)))
-;;** `counsel-semantic'
-(declare-function semantic-tag-start "semantic/tag")
-(declare-function semantic-tag-class "semantic/tag")
-(declare-function semantic-tag-name "semantic/tag")
-(declare-function semantic-tag-put-attribute "semantic/tag")
-(declare-function semantic-tag-get-attribute "semantic/tag")
-(declare-function semantic-fetch-tags "semantic")
-(declare-function semantic-format-tag-summarize "semantic/format")
-(declare-function semantic-active-p "semantic/fw")
-
-(defun counsel-semantic-action (x)
- "Got to semantic TAG."
- (goto-char (semantic-tag-start (cdr x))))
-
-(defvar counsel-semantic-history nil
- "History for `counsel-semantic'.")
-
-(defun counsel-semantic-format-tag (tag)
- "Return a pretty string representation of TAG."
- (let ((depth (or (semantic-tag-get-attribute tag :depth) 0))
- (parent (semantic-tag-get-attribute tag :parent)))
- (concat (make-string (* depth 2) ?\ )
- (if parent
- (concat "(" parent ") ")
- "")
- (semantic-format-tag-summarize tag nil t))))
-
-(defun counsel-flatten-forest (func treep forest)
- "Use FUNC and TREEP to flatten FOREST.
-FUNC is applied to each node.
-TREEP is used to expand internal nodes."
- (cl-labels ((reducer (forest out depth)
- (dolist (tree forest)
- (let ((this (cons (funcall func tree depth) out))
- (leafs (funcall treep tree)))
- (setq out
- (if leafs
- (reducer leafs this (1+ depth))
- this))))
- out))
- (nreverse (reducer forest nil 0))))
-
-(defun counsel-semantic-tags ()
- "Fetch semantic tags."
- (counsel-flatten-forest
- (lambda (tree depth)
- (semantic-tag-put-attribute tree :depth depth))
- (lambda (tag)
- (when (eq (semantic-tag-class tag) 'type)
- (let ((name (semantic-tag-name tag)))
- (mapcar
- (lambda (x) (semantic-tag-put-attribute x :parent name))
- (semantic-tag-get-attribute tag :members)))))
- (semantic-fetch-tags)))
-
-;;;###autoload
-(defun counsel-semantic ()
- "Jump to a semantic tag in the current buffer."
- (interactive)
- (let ((tags (mapcar
- (lambda (x)
- (cons
- (counsel-semantic-format-tag x)
- x))
- (counsel-semantic-tags))))
- (ivy-read "tag: " tags
- :action #'counsel-semantic-action
- :history 'counsel-semantic-history
- :caller 'counsel-semantic)))
-
-;;;###autoload
-(defun counsel-semantic-or-imenu ()
- (interactive)
- (require 'semantic/fw)
- (if (semantic-active-p)
- (counsel-semantic)
- (counsel-imenu)))
-
-;;** `counsel-outline'
-(declare-function org-trim "org-macs")
-
-(defcustom counsel-outline-face-style nil
- "Determines how to style outline headings during completion.
-
-If `org', the faces `counsel-outline-1' through
-`counsel-outline-8' are applied in a similar way to Org.
-Note that no cycling is performed, so headings on levels 9 and
-higher are not styled.
-
-If `verbatim', the faces used in the buffer are applied. For
-simple headlines in `org-mode' buffers, this is usually the same
-as the `org' setting, except that it depends on how much of the
-buffer has been completely fontified. If your buffer exceeds a
-certain size, headlines are styled lazily depending on which
-parts of the tree are visible. Headlines which are not yet
-styled in the buffer will appear unstyled in the minibuffer as
-well. If your headlines contain parts which are fontified
-differently than the headline itself (e.g. TODO keywords, tags,
-links) and you want these parts to be styled properly, verbatim
-is the way to go; otherwise you are probably better off using the
-`org' setting instead.
-
-If `custom', the faces defined in `counsel-outline-custom-faces'
-are applied. Note that no cycling is performed, so if there is
-no face defined for a certain level, headlines on that level will
-not be styled.
-
-If `nil', all headlines are highlighted using
-`counsel-outline-default'.
-
-For displaying tags and TODO keywords in `org-mode' buffers, see
-`counsel-org-headline-display-tags' and
-`counsel-org-headline-display-todo', respectively."
- :type '(choice
- (const :tag "Same as org-mode" org)
- (const :tag "Verbatim" verbatim)
- (const :tag "Custom" custom)
- (const :tag "No style" nil)))
-
-(defcustom counsel-outline-custom-faces nil
- "List of faces for custom display of outline headings.
-
-Headlines on level N are fontified with the Nth entry of this
-list, starting with N = 1. Headline levels with no corresponding
-entry in this list will not be styled.
-
-This variable has no effect unless `counsel-outline-face-style'
-is set to `custom'."
- :type '(repeat face))
-
-(defun counsel-outline-title ()
- "Return title of current outline heading.
-Intended as a value for the `:outline-title' setting in
-`counsel-outline-settings', which see."
- (buffer-substring (point) (line-end-position)))
-
-(defun counsel-outline-title-org ()
- "Return title of current outline heading.
-Like `counsel-outline-title' (which see), but for `org-mode'
-buffers."
- (let ((statistics-re "\\[[0-9]*\\(?:%\\|/[0-9]*\\)]")
- (heading (apply #'org-get-heading (counsel--org-get-heading-args))))
- (cond (counsel-org-headline-display-statistics
- heading)
- (heading
- (org-trim (replace-regexp-in-string statistics-re " " heading))))))
-
-(defun counsel-outline-title-markdown ()
- "Return title of current outline heading.
-Like `counsel-outline-title' (which see), but for
-`markdown-mode' (from the eponymous package) buffers."
- ;; `outline-regexp' is set by `markdown-mode' to match both setext
- ;; (underline) and atx (hash) headings (see
- ;; `markdown-regex-header').
- (or (match-string 1) ; setext heading title
- (match-string 5))) ; atx heading title
-
-(defun counsel-outline-title-latex ()
- "Return title of current outline heading.
-Like `counsel-outline-title' (which see), but for `latex-mode'
-buffers."
- ;; `outline-regexp' is set by `latex-mode' (see variable
- ;; `latex-section-alist' for the built-in mode or function
- ;; `LaTeX-outline-regexp' for the AUCTeX package) to match section
- ;; macros, in which case we get the section name, as well as
- ;; `\appendix', `\documentclass', `\begin{document}', and
- ;; `\end{document}', in which case we simply return that.
- (if (and (assoc (match-string 1) ; Macro name
- (or (bound-and-true-p LaTeX-section-list) ; AUCTeX
- (bound-and-true-p latex-section-alist))) ; Built-in
- (progn
- ;; Point is at end of macro name, skip stars and optional args
- (skip-chars-forward "*")
- (while (looking-at-p "\\[")
- (forward-list))
- ;; First mandatory arg should be section title
- (looking-at-p "{")))
- (buffer-substring (1+ (point)) (1- (progn (forward-list) (point))))
- (buffer-substring (line-beginning-position) (point))))
-
-(defun counsel-outline-level-emacs-lisp ()
- "Return level of current outline heading.
-Like `lisp-outline-level', but adapted for the `:outline-level'
-setting in `counsel-outline-settings', which see."
- (if (looking-at ";;\\([;*]+\\)")
- (- (match-end 1) (match-beginning 1))
- (funcall outline-level)))
-
-(defvar counsel-outline--preselect 0
- "Index of the preselected candidate in `counsel-outline'.")
-
-(defun counsel-outline-candidates (&optional settings prefix)
- "Return an alist of outline heading completion candidates.
-Each element is a pair (HEADING . MARKER), where the string
-HEADING is located at the position of MARKER. SETTINGS is a
-plist entry from `counsel-outline-settings', which see.
-PREFIX is a string prepended to all candidates."
- (let* ((bol-regex (concat "^\\(?:"
- (or (plist-get settings :outline-regexp)
- outline-regexp)
- "\\)"))
- (outline-title-fn (or (plist-get settings :outline-title)
- #'counsel-outline-title))
- (outline-level-fn (or (plist-get settings :outline-level)
- outline-level))
- (display-style (or (plist-get settings :display-style)
- counsel-outline-display-style))
- (path-separator (or (plist-get settings :path-separator)
- counsel-outline-path-separator))
- (face-style (or (plist-get settings :face-style)
- counsel-outline-face-style))
- (custom-faces (or (plist-get settings :custom-faces)
- counsel-outline-custom-faces))
- (stack-level 0)
- (orig-point (point))
- (stack (and prefix (list (counsel-outline--add-face
- prefix 0 face-style custom-faces))))
- cands name level marker)
- (save-excursion
- (setq counsel-outline--preselect 0)
- (goto-char (point-min))
- (while (re-search-forward bol-regex nil t)
- (save-excursion
- (setq name (or (save-match-data
- (funcall outline-title-fn))
- ""))
- (goto-char (match-beginning 0))
- (setq marker (point-marker))
- (setq level (funcall outline-level-fn))
- (cond ((eq display-style 'path)
- ;; Update stack. The empty entry guards against incorrect
- ;; headline hierarchies, e.g. a level 3 headline
- ;; immediately following a level 1 entry.
- (while (<= level stack-level)
- (pop stack)
- (cl-decf stack-level))
- (while (> level stack-level)
- (push "" stack)
- (cl-incf stack-level))
- (setf (car stack)
- (counsel-outline--add-face
- name level face-style custom-faces))
- (setq name (mapconcat #'identity
- (reverse stack)
- path-separator)))
- (t
- (when (eq display-style 'headline)
- (setq name (concat (make-string level ?*) " " name)))
- (setq name (counsel-outline--add-face
- name level face-style custom-faces))))
- (push (cons name marker) cands))
- (unless (or (string= name "")
- (< orig-point marker))
- (cl-incf counsel-outline--preselect))))
- (nreverse cands)))
-
-(defun counsel-outline--add-face (name level &optional face-style custom-faces)
- "Set the `face' property on headline NAME according to LEVEL.
-FACE-STYLE and CUSTOM-FACES override `counsel-outline-face-style'
-and `counsel-outline-custom-faces', respectively, which determine
-the face to apply."
- (let ((face (cl-case (or face-style counsel-outline-face-style)
- (verbatim)
- (custom (nth (1- level)
- (or custom-faces counsel-outline-custom-faces)))
- (org (format "counsel-outline-%d" level))
- (t 'counsel-outline-default))))
- (when face
- (put-text-property 0 (length name) 'face face name)))
- name)
-
-(defun counsel-outline-action (x)
- "Go to outline X."
- (goto-char (cdr x)))
-
-;;;###autoload
-(defun counsel-outline ()
- "Jump to an outline heading with completion."
- (interactive)
- (let ((settings (cdr (assq major-mode counsel-outline-settings))))
- (ivy-read "Outline: " (counsel-outline-candidates settings)
- :action (or (plist-get settings :action)
- #'counsel-outline-action)
- :history (or (plist-get settings :history)
- 'counsel-outline-history)
- :preselect (max (1- counsel-outline--preselect) 0)
- :caller (or (plist-get settings :caller)
- 'counsel-outline))))
-
-;;** `counsel-ibuffer'
-(defvar counsel-ibuffer--buffer-name nil
- "Name of the buffer to use for `counsel-ibuffer'.")
-
-;;;###autoload
-(defun counsel-ibuffer (&optional name)
- "Use ibuffer to switch to another buffer.
-NAME specifies the name of the buffer (defaults to \"*Ibuffer*\")."
- (interactive)
- (setq counsel-ibuffer--buffer-name (or name "*Ibuffer*"))
- (ivy-read "Switch to buffer: " (counsel-ibuffer--get-buffers)
- :history 'counsel-ibuffer-history
- :action #'counsel-ibuffer-visit-buffer
- :caller 'counsel-ibuffer))
-
-(declare-function ibuffer-update "ibuffer")
-(declare-function ibuffer-current-buffer "ibuffer")
-(declare-function ibuffer-forward-line "ibuffer")
-(defvar ibuffer-movement-cycle)
-
-(defun counsel-ibuffer--get-buffers ()
- "Return list of buffer-related lines in Ibuffer as strings."
- (let ((oldbuf (get-buffer counsel-ibuffer--buffer-name)))
- (unless oldbuf
- ;; Avoid messing with the user's precious window/frame configuration.
- (save-window-excursion
- (let ((display-buffer-overriding-action
- '(display-buffer-same-window (inhibit-same-window . nil))))
- (ibuffer nil counsel-ibuffer--buffer-name nil t))))
- (with-current-buffer counsel-ibuffer--buffer-name
- (when oldbuf
- ;; Forcibly update possibly stale existing buffer.
- (ibuffer-update nil t))
- (goto-char (point-min))
- (let ((ibuffer-movement-cycle nil)
- entries)
- (while (not (eobp))
- (ibuffer-forward-line 1 t)
- (let ((buf (ibuffer-current-buffer)))
- ;; We are only interested in buffers we can actually visit.
- ;; This filters out headings and other unusable entries.
- (when (buffer-live-p buf)
- (push (cons (buffer-substring-no-properties
- (line-beginning-position)
- (line-end-position))
- buf)
- entries))))
- (nreverse entries)))))
-
-(defun counsel-ibuffer-visit-buffer (x)
- "Switch to buffer of candidate X."
- (switch-to-buffer (cdr x)))
-
-(defun counsel-ibuffer-visit-buffer-other-window (x)
- "Switch to buffer of candidate X in another window."
- (switch-to-buffer-other-window (cdr x)))
-
-(defun counsel-ibuffer-visit-ibuffer (_)
- "Switch to Ibuffer buffer."
- (switch-to-buffer counsel-ibuffer--buffer-name))
-
-(ivy-set-actions
- 'counsel-ibuffer
- '(("j" counsel-ibuffer-visit-buffer-other-window "other window")
- ("v" counsel-ibuffer-visit-ibuffer "switch to Ibuffer")))
-
-;;** `counsel-switch-to-shell-buffer'
-(defun counsel--buffers-with-mode (mode)
- "Return names of buffers with MODE as their `major-mode'."
- (let (bufs)
- (dolist (buf (buffer-list))
- (when (eq (buffer-local-value 'major-mode buf) mode)
- (push (buffer-name buf) bufs)))
- (nreverse bufs)))
-
-(declare-function shell-mode "shell")
-
-;;;###autoload
-(defun counsel-switch-to-shell-buffer ()
- "Switch to a shell buffer, or create one."
- (interactive)
- (ivy-read "Shell buffer: " (counsel--buffers-with-mode #'shell-mode)
- :action #'counsel--switch-to-shell
- :caller 'counsel-switch-to-shell-buffer))
-
-(defun counsel--switch-to-shell (name)
- "Display shell buffer with NAME and select its window.
-Reuse any existing window already displaying the named buffer.
-If there is no such buffer, start a new `shell' with NAME."
- (if (get-buffer name)
- (pop-to-buffer name '((display-buffer-reuse-window
- display-buffer-same-window)
- (inhibit-same-window . nil)
- (reusable-frames . visible)))
- (shell name)))
-
-;;** `counsel-unicode-char'
-(defvar counsel-unicode-char-history nil
- "History for `counsel-unicode-char'.")
-
-(defun counsel--unicode-names ()
- "Return formatted and sorted list of `ucs-names'.
-The result of `ucs-names' is mostly, but not completely, sorted,
-so this function ensures lexicographic order."
- (let* (cands
- (table (ucs-names)) ; Either hash map or alist
- (fmt (lambda (name code) ; Common format function
- (let ((cand (format "%06X %-58s %c" code name code)))
- (put-text-property 0 1 'code code cand)
- (push cand cands)))))
- (if (not (hash-table-p table))
- ;; Support `ucs-names' returning an alist in Emacs < 26.
- ;; The result of `ucs-names' comes pre-reversed so no need to repeat.
- (dolist (entry table)
- (funcall fmt (car entry) (cdr entry)))
- (maphash fmt table)
- ;; Reverse to speed up sorting
- (setq cands (nreverse cands)))
- (sort cands #'string-lessp)))
-
-(defvar counsel--unicode-table
- (lazy-completion-table counsel--unicode-table counsel--unicode-names)
- "Lazy completion table for `counsel-unicode-char'.
-Candidates comprise `counsel--unicode-names', which see.")
-
-;;;###autoload
-(defun counsel-unicode-char (&optional count)
- "Insert COUNT copies of a Unicode character at point.
-COUNT defaults to 1."
- (interactive "p")
- (setq ivy-completion-beg (point))
- (setq ivy-completion-end (point))
- (ivy-read "Unicode name: " counsel--unicode-table
- :history 'counsel-unicode-char-history
- :action (lambda (name)
- (with-ivy-window
- (delete-region ivy-completion-beg ivy-completion-end)
- (setq ivy-completion-beg (point))
- (insert-char (get-text-property 0 'code name) count)
- (setq ivy-completion-end (point))))
- :caller 'counsel-unicode-char))
-
-(ivy-configure 'counsel-unicode-char
- :sort-fn #'ivy-string<)
-
-(defun counsel-unicode-copy (name)
- "Ivy action to copy the unicode from NAME to the kill ring."
- (kill-new (char-to-string (get-text-property 0 'code name))))
-
-(ivy-set-actions
- 'counsel-unicode-char
- '(("w" counsel-unicode-copy "copy")))
-
-;;** `counsel-colors'
-(defun counsel-colors-action-insert-hex (color)
- "Insert the hexadecimal RGB value of COLOR."
- (insert (get-text-property 0 'hex color)))
-
-(defun counsel-colors-action-kill-hex (color)
- "Kill the hexadecimal RGB value of COLOR."
- (kill-new (get-text-property 0 'hex color)))
-
-;;** `counsel-colors-emacs'
-(defvar counsel-colors-emacs-history ()
- "History for `counsel-colors-emacs'.")
-
-(defun counsel-colors--name-to-hex (name)
- "Return hexadecimal RGB value of color with NAME.
-
-Return nil if NAME does not designate a valid color."
- (let ((rgb (color-name-to-rgb name)))
- (when rgb
- (apply #'color-rgb-to-hex rgb))))
-
-(defvar shr-color-visible-luminance-min)
-(declare-function shr-color-visible "shr-color")
-(defvar counsel--colors-format "%-20s %s %s%s")
-
-(defun counsel--colors-emacs-format-function (colors)
- "Format function for `counsel-colors-emacs'."
- (require 'shr-color)
- (let* ((blank (make-string 10 ?\s))
- (formatter
- (lambda (color)
- (let ((fg (list :foreground color)))
- (format counsel--colors-format color
- (propertize (get-text-property 0 'hex color) 'face fg)
- (propertize blank 'face (list :background color))
- (propertize (mapconcat (lambda (dup)
- (concat " " dup))
- (get-text-property 0 'dups color)
- ",")
- 'face fg))))))
- (ivy--format-function-generic
- (lambda (color)
- (let* ((hex (get-text-property 0 'hex color))
- (shr-color-visible-luminance-min 100)
- (fg (cadr (shr-color-visible hex "black" t))))
- (propertize (funcall formatter color)
- 'face (list :foreground fg :background hex))))
- formatter colors "\n")))
-
-(defun counsel--colors-web-format-function (colors)
- "Format function for `counsel-colors-web'."
- (require 'shr-color)
- (let* ((blank (make-string 10 ?\s))
- (formatter (lambda (color)
- (let ((hex (get-text-property 0 'hex color)))
- (format counsel--colors-format color
- (propertize hex 'face (list :foreground hex))
- (propertize blank 'face (list :background hex)))))))
- (ivy--format-function-generic
- (lambda (color)
- (let* ((hex (get-text-property 0 'hex color))
- (shr-color-visible-luminance-min 100)
- (fg (cadr (shr-color-visible hex "black" t))))
- (propertize (funcall formatter color)
- 'face (list :foreground fg :background hex))))
- formatter colors "\n")))
-
-;;;###autoload
-(defun counsel-colors-emacs ()
- "Show a list of all supported colors for a particular frame.
-
-You can insert or kill the name or hexadecimal RGB value of the
-selected color."
- (interactive)
- (let* ((colors
- (delete nil
- (mapcar (lambda (cell)
- (let* ((name (car cell))
- (dups (cdr cell))
- (hex (counsel-colors--name-to-hex name)))
- (when hex
- (propertize name 'hex hex 'dups dups))))
- (list-colors-duplicates))))
- (counsel--colors-format
- (format "%%-%ds %%s %%s%%s"
- (apply #'max 0 (mapcar #'string-width colors)))))
- (ivy-read "Emacs color: " colors
- :require-match t
- :history 'counsel-colors-emacs-history
- :action #'insert
- :caller 'counsel-colors-emacs)))
-(ivy-configure 'counsel-colors-emacs
- :format-fn #'counsel--colors-emacs-format-function)
-
-(ivy-set-actions
- 'counsel-colors-emacs
- '(("h" counsel-colors-action-insert-hex "insert hexadecimal value")
- ("H" counsel-colors-action-kill-hex "kill hexadecimal value")))
-
-;;** `counsel-colors-web'
-(defvar shr-color-html-colors-alist)
-
-(defun counsel-colors--web-alist ()
- "Return list of CSS colors for `counsel-colors-web'."
- (require 'shr-color)
- (let* ((alist (copy-alist shr-color-html-colors-alist))
- (mp (assoc "MediumPurple" alist))
- (pvr (assoc "PaleVioletRed" alist))
- (rp (assoc "RebeccaPurple" alist)))
- ;; Backport GNU Emacs bug#30377
- (when mp (setcdr mp "#9370db"))
- (when pvr (setcdr pvr "#db7093"))
- (unless rp (push (cons "rebeccapurple" "#663399") alist))
- (sort (mapcar (lambda (cell)
- (propertize (downcase (car cell))
- 'hex (downcase (cdr cell))))
- alist)
- #'string-lessp)))
-
-(defvar counsel-colors-web-history ()
- "History for `counsel-colors-web'.")
-
-;;;###autoload
-(defun counsel-colors-web ()
- "Show a list of all W3C web colors for use in CSS.
-
-You can insert or kill the name or hexadecimal RGB value of the
-selected color."
- (interactive)
- (let* ((colors (counsel-colors--web-alist))
- (counsel--colors-format
- (format "%%-%ds %%s %%s"
- (apply #'max 0 (mapcar #'string-width colors)))))
- (ivy-read "Web color: " colors
- :require-match t
- :history 'counsel-colors-web-history
- :action #'insert
- :caller 'counsel-colors-web)))
-
-(ivy-configure 'counsel-colors-web
- :sort-fn #'ivy-string<
- :format-fn #'counsel--colors-web-format-function)
-
-(ivy-set-actions
- 'counsel-colors-web
- '(("h" counsel-colors-action-insert-hex "insert hexadecimal value")
- ("H" counsel-colors-action-kill-hex "kill hexadecimal value")))
-
-;;** `counsel-fonts'
-(defvar counsel-fonts-history ()
- "History for `counsel-fonts'.")
-
-;;;###autoload
-(defun counsel-fonts ()
- "Show a list of all supported font families for a particular frame.
-
-You can insert or kill the name of the selected font."
- (interactive)
- (let ((current-font
- (symbol-name (font-get (face-attribute 'default :font) :family))))
- (ivy-read "Font: " (delete-dups (font-family-list))
- :preselect current-font
- :require-match t
- :history 'counsel-fonts-history
- :action #'insert
- :caller 'counsel-fonts)))
-
-(ivy-configure 'counsel-fonts
- :display-transformer-fn #'counsel--font-with-sample)
-
-(defun counsel--font-with-sample (font-name)
- "Format function for `counsel-fonts'."
- (format "%-75s%s" font-name
- (propertize "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
- 'face (list :family font-name))))
-
-;;** `counsel-kmacro'
-(defvar counsel-kmacro-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-k") #'counsel-kmacro-kill)
- map))
-
-(defun counsel-kmacro-kill ()
- "Kill the line, or delete the keyboard macro."
- (interactive)
- (if (not (eolp))
- (ivy-kill-line)
- (counsel-kmacro-action-delete-kmacro
- (assoc
- (ivy-state-current ivy-last)
- (ivy-state-collection ivy-last)))
- (ivy--kill-current-candidate)))
-
-;;;###autoload
-(defun counsel-kmacro ()
- "Interactively choose and run a keyboard macro.
-
-With prefix argument, run macro that many times.
-
-Macros are run using the current value of `kmacro-counter-value'
-and their respective counter format. Displayed next to each macro is
-the counter's format and initial value.
-
-One can use actions to copy the counter format or initial counter
-value of a macro, using them for a new macro."
- (interactive)
- (if (or last-kbd-macro kmacro-ring)
- (ivy-read
- (concat "Execute macro (counter at "
- (number-to-string (or kmacro-initial-counter-value kmacro-counter))
- "): ")
- (counsel--kmacro-candidates)
- :keymap counsel-kmacro-map
- :require-match t
- :action #'counsel-kmacro-action-run
- :caller 'counsel-kmacro)
- (user-error "No keyboard macros defined")))
-
-(ivy-configure 'counsel-kmacro
- :format-fn #'counsel--kmacro-format-function)
-
-(defcustom counsel-kmacro-separator "\n------------------------\n"
- "Separator displayed between keyboard macros in `counsel-kmacro'."
- :type 'string)
-
-(defun counsel--kmacro-format-function (formatted-kmacro)
- "Transform FORMATTED-KMACRO into a string for `counsel-kmacro'."
- (ivy--format-function-generic
- (lambda (str) (ivy--add-face str 'ivy-current-match))
- (lambda (str) str)
- formatted-kmacro
- (propertize counsel-kmacro-separator 'face 'ivy-separator)))
-
-(defun counsel--kmacro-candidates ()
- "Create the list of keyboard macros used by `counsel-kmacro'.
-This is a combination of `kmacro-ring' and, together in a list, `last-kbd-macro',
-`kmacro-counter-format-start', and `kmacro-counter-value-start'."
- (mapcar
- (lambda (kmacro)
- (cons
- (concat "(" (nth 2 kmacro) "," (number-to-string (nth 1 kmacro)) "): "
- (condition-case nil
- (format-kbd-macro (if (listp kmacro) (car kmacro) kmacro) 1)
- ;; Recover from error from `edmacro-fix-menu-commands'.
- (error "Warning: Cannot display macros containing mouse clicks")))
- kmacro))
- (cons
- (if (listp last-kbd-macro)
- last-kbd-macro
- (list
- last-kbd-macro
- kmacro-counter-value-start
- kmacro-counter-format-start))
- kmacro-ring)))
-
-(defun counsel-kmacro-action-run (x)
- "Run keyboard macro."
- (let* ((actual-kmacro (cdr x))
- (kmacro-keys (nth 0 actual-kmacro))
- (kmacro-counter-format-start (nth 2 actual-kmacro)))
- ;; With prefix argument, call the macro that many times.
- (kmacro-call-macro (or current-prefix-arg 1) t nil kmacro-keys)))
-
-(defun counsel-kmacro-action-delete-kmacro (x)
- "Delete a keyboard macro from within `counsel-kmacro'.
-
-Either delete a macro from `kmacro-ring', or set `last-kbd-macro'
-to the popped head of the ring."
- (let ((actual-macro (cdr x)))
- (if (eq (nth 0 actual-macro) last-kbd-macro)
- (setq last-kbd-macro
- (if (eq kmacro-ring nil)
- nil
- (let ((prev-macro (pop kmacro-ring)))
- (if (listp prev-macro)
- (nth 0 prev-macro)
- prev-macro))))
- (setq kmacro-ring (delq actual-macro kmacro-ring)))))
-
-(defun counsel-kmacro-action-copy-initial-counter-value (x)
- "Pass an existing keyboard macro's original value to `kmacro-set-counter'.
-This value will be used by the next executed macro, or as an
-initial value by the next macro defined.
-
-Note that calling an existing macro that itself uses a counter
-effectively resets the initial counter value for the next defined macro
-to 0."
- ;; NOTE:
- ;; Calling `kmacro-start-macro' without an argument sets `kmacro-counter'
- ;; to 0 if `kmacro-initial-counter'is nil, and sets `kmacro-initial-counter'
- ;; to nil regardless.
- ;; Using `kmacro-insert-counter' sets `kmacro-initial-counter' to nil.
- (let* ((actual-kmacro (cdr x))
- (number (nth 1 actual-kmacro)))
- (kmacro-set-counter number)))
-
-(defun counsel-kmacro-action-copy-counter-format-for-new-macro (x)
- "Set `kmacro-default-counter-format' to an existing keyboard macro's counter format.
-This will apply to the next macro a user defines."
- (let* ((actual-kmacro (cdr x))
- (format (nth 2 actual-kmacro)))
- (kmacro-set-format format)))
-
-(defun counsel-kmacro-action-cycle-ring-to-macro (x)
- "Cycle `kmacro-ring' until `last-kbd-macro' is the selected macro.
-This is convenient when using \\[kmacro-end-or-call-macro] to call macros.
-Note that cycling the ring changes the starting value of the current macro
-to changes the current macro counter."
- (let ((actual-kmacro (cdr x)))
- (unless (equal last-kbd-macro
- (if (listp last-kbd-macro)
- last-kbd-macro
- (car actual-kmacro)))
- (while (not (equal actual-kmacro
- (car kmacro-ring)))
- (kmacro-cycle-ring-previous))
- ;; Once selected macro is at the head of the ring,
- ;; cycle one last time.
- (kmacro-cycle-ring-previous))))
-
-(defun counsel-kmacro-action-set-saved-starting-counter (x)
- "Set the starting counter value of the chosen macro.
-
-By default, sets to current value of the counter. It has no
-effect when selecting the current macro.
-
-Normally, when cycling keyboard macro ring with \\[kmacro-cycle-ring-previous]
-or \\[kmacro-cycle-ring-next], the current value of the macro counter is
-included with the current macro definition. Then, when cycling
-back, that counter value is restored. This function is meant to
-achieve something similar when cycling macros in the context of
-using `counsel-kmacro', which does not use different counter
-values when running different macros."
- (let ((actual-kmacro (cdr x))
- (default-kmacro-counter-string (number-to-string kmacro-counter)))
- (setq kmacro-ring (mapcar (lambda (this-macro-in-ring)
- (if (equal this-macro-in-ring actual-kmacro)
- (list (car this-macro-in-ring)
- (read-from-minibuffer (concat "Set initial counter for macro (default: "
- default-kmacro-counter-string
- "): ")
- nil nil t nil
- default-kmacro-counter-string)
- (cl-caddr this-macro-in-ring))
- this-macro-in-ring))
- kmacro-ring))))
-
-(defun counsel-kmacro-action-execute-after-prompt (x)
- "Execute an existing keyboard macro, prompting for a starting counter value, a
-counter format, and the number of times to execute the macro.
-
-If called with a prefix, will suggest that value for both the
-counter value and iteration amount."
- (let* ((default-string (if current-prefix-arg
- (number-to-string current-prefix-arg)
- nil))
- (actual-kmacro (cdr x))
- (kmacro-keys (nth 0 actual-kmacro))
- (kmacro-starting-counter (number-to-string (nth 1 actual-kmacro)))
- (kmacro-starting-format (nth 2 actual-kmacro))
- (number-of-iterations
- (read-from-minibuffer
- (concat "Enter number of iterations for macro (default: "
- (or default-string (number-to-string 2))
- "): ")
- nil nil t nil
- (or default-string (number-to-string 2))))
- (kmacro-initial-counter-value
- (read-from-minibuffer
- (concat "Enter a starting counter for macro (default: "
- (or default-string kmacro-starting-counter)
- "): ")
- nil nil t nil
- (or default-string kmacro-starting-counter)))
- (kmacro-counter-format-start
- (symbol-name (read-from-minibuffer
- (concat "Enter format for macro counter (default: "
- kmacro-starting-format
- "): ")
- nil nil t nil
- kmacro-starting-format))))
- (kmacro-call-macro number-of-iterations t nil kmacro-keys)))
-
-(ivy-set-actions
- 'counsel-kmacro
- '(("c" counsel-kmacro-action-cycle-ring-to-macro "cycle to")
- ("d" counsel-kmacro-action-delete-kmacro "delete")
- ("e" counsel-kmacro-action-execute-after-prompt "execute after prompt")
- ("f" counsel-kmacro-action-copy-counter-format-for-new-macro "copy counter format for new macro")
- ("s" counsel-kmacro-action-set-saved-starting-counter "set this counter value")
- ("v" counsel-kmacro-action-copy-initial-counter-value "copy initial counter value")))
-
-;;** `counsel-geiser-doc-look-up-manual'
-(declare-function geiser-doc-manual-for-symbol "ext:geiser-doc")
-(defvar geiser-completion-symbol-list-func)
-
-(defvar counsel-geiser-doc-look-up-manual-history ()
- "History for `counsel-geiser-doc-look-up-manual'.")
-
-;;;###autoload
-(defun counsel-geiser-doc-look-up-manual ()
- "Search Scheme documentation."
- (interactive)
- (ivy-read "Symbol: " geiser-completion-symbol-list-func
- :require-match t
- :history 'counsel-geiser-doc-look-up-manual-history
- :action (lambda (cand)
- (geiser-doc-manual-for-symbol (intern cand)))
- :caller 'counsel-geiser-doc-look-up-manual))
-
-;;* Misc. OS
-;;** `counsel-rhythmbox'
-(declare-function dbus-call-method "dbus")
-(declare-function dbus-get-property "dbus")
-
-(defun counsel--run (&rest program-and-args)
- (let ((name (mapconcat #'identity program-and-args " ")))
- (apply #'start-process name nil program-and-args)
- name))
-
-(defun counsel--sl (cmd)
- "Shell command to list."
- (split-string (shell-command-to-string cmd) "\n" t))
-
-(defun counsel-rhythmbox-play-song (song)
- "Let Rhythmbox play SONG."
- (let ((first (string= (shell-command-to-string "pidof rhythmbox") ""))
- (service "org.gnome.Rhythmbox3")
- (path "/org/mpris/MediaPlayer2")
- (interface "org.mpris.MediaPlayer2.Player"))
- (when first
- (counsel--run "nohup" "rhythmbox")
- (sit-for 1.5))
- (dbus-call-method :session service path interface
- "OpenUri" (cdr song))
- (let ((id (and first
- (cdr (counsel--wmctrl-parse
- (shell-command-to-string
- "wmctrl -l -p | grep $(pidof rhythmbox)"))))))
- (when id
- (sit-for 0.2)
- (counsel--run "wmctrl" "-ic" id)))))
-
-(defun counsel-rhythmbox-enqueue-song (song)
- "Let Rhythmbox enqueue SONG."
- (let ((service "org.gnome.Rhythmbox3")
- (path "/org/gnome/Rhythmbox3/PlayQueue")
- (interface "org.gnome.Rhythmbox3.PlayQueue"))
- (dbus-call-method :session service path interface
- "AddToQueue" (cdr song))))
-
-(defun counsel-rhythmbox-playpause-current-song ()
- "Play/pause the current song."
- (interactive)
- (let ((service "org.gnome.Rhythmbox3")
- (path "/org/mpris/MediaPlayer2")
- (interface "org.mpris.MediaPlayer2.Player"))
- (dbus-call-method :session service path interface
- "PlayPause")))
-
-(defun counsel-rhythmbox-toggle-shuffle (_song)
- "Toggle Rhythmbox shuffle setting."
- (let* ((old-order (counsel--command "dconf" "read" "/org/gnome/rhythmbox/player/play-order"))
- (new-order (if (string= old-order "'shuffle'")
- "'linear'"
- "'shuffle'")))
- (counsel--command
- "dconf"
- "write"
- "/org/gnome/rhythmbox/player/play-order"
- new-order)
- (message (if (string= new-order "'shuffle'")
- "shuffle on"
- "shuffle off"))))
-
-(defvar counsel-rhythmbox-history nil
- "History for `counsel-rhythmbox'.")
-
-(defvar counsel-rhythmbox-songs nil)
-
-(defun counsel-rhythmbox-current-song ()
- "Return the currently playing song title."
- (ignore-errors
- (let* ((entry (dbus-get-property
- :session
- "org.mpris.MediaPlayer2.rhythmbox"
- "/org/mpris/MediaPlayer2"
- "org.mpris.MediaPlayer2.Player"
- "Metadata"))
- (artist (caar (cadr (assoc "xesam:artist" entry))))
- (album (cl-caadr (assoc "xesam:album" entry)))
- (title (cl-caadr (assoc "xesam:title" entry))))
- (format "%s - %s - %s" artist album title))))
-
-;;;###autoload
-(defun counsel-rhythmbox (&optional arg)
- "Choose a song from the Rhythmbox library to play or enqueue."
- (interactive "P")
- (require 'dbus)
- (when (or arg (null counsel-rhythmbox-songs))
- (let* ((service "org.gnome.Rhythmbox3")
- (path "/org/gnome/UPnP/MediaServer2/Library/all")
- (interface "org.gnome.UPnP.MediaContainer2")
- (nb-songs (dbus-get-property
- :session service path interface "ChildCount")))
- (if (not nb-songs)
- (error "Couldn't connect to Rhythmbox")
- (setq counsel-rhythmbox-songs
- (mapcar (lambda (x)
- (cons
- (format
- "%s - %s - %s"
- (cl-caadr (assoc "Artist" x))
- (cl-caadr (assoc "Album" x))
- (cl-caadr (assoc "DisplayName" x)))
- (cl-caaadr (assoc "URLs" x))))
- (dbus-call-method
- :session service path interface "ListChildren"
- 0 nb-songs '("*")))))))
- (ivy-read "Rhythmbox: " counsel-rhythmbox-songs
- :require-match t
- :history 'counsel-rhythmbox-history
- :preselect (counsel-rhythmbox-current-song)
- :action
- '(1
- ("p" counsel-rhythmbox-play-song "Play song")
- ("e" counsel-rhythmbox-enqueue-song "Enqueue song")
- ("s" counsel-rhythmbox-toggle-shuffle "Shuffle on/off"))
- :caller 'counsel-rhythmbox))
-
-;;** `counsel-linux-app'
-
-;; Added in Emacs 26.1.
-(require 'xdg nil t)
-
-(defalias 'counsel--xdg-data-home
- (if (fboundp 'xdg-data-home)
- #'xdg-data-home
- (lambda ()
- (let ((directory (getenv "XDG_DATA_HOME")))
- (if (or (null directory) (string= directory ""))
- "~/.local/share"
- directory))))
- "Compatibility shim for `xdg-data-home'.")
-
-(defalias 'counsel--xdg-data-dirs
- (if (fboundp 'xdg-data-dirs)
- #'xdg-data-dirs
- (lambda ()
- (let ((path (getenv "XDG_DATA_DIRS")))
- (if (or (null path) (string= path ""))
- '("/usr/local/share" "/usr/share")
- (parse-colon-path path)))))
- "Compatibility shim for `xdg-data-dirs'.")
-
-(defcustom counsel-linux-apps-directories
- (mapcar (lambda (dir) (expand-file-name "applications" dir))
- (cons (counsel--xdg-data-home)
- (counsel--xdg-data-dirs)))
- "Directories in which to search for applications (.desktop files)."
- :type '(repeat directory))
-
-(defcustom counsel-linux-app-format-function #'counsel-linux-app-format-function-default
- "Function to format Linux application names the `counsel-linux-app' menu.
-The format function will be passed the application's name, comment, and command
-as arguments."
- :type '(choice
- (const :tag "Command : Name - Comment" counsel-linux-app-format-function-default)
- (const :tag "Name - Comment (Command)" counsel-linux-app-format-function-name-first)
- (const :tag "Name - Comment" counsel-linux-app-format-function-name-only)
- (const :tag "Command" counsel-linux-app-format-function-command-only)
- (function :tag "Custom")))
-
-(defface counsel-application-name
- '((t :inherit font-lock-builtin-face))
- "Face for displaying executable names."
- :group 'ivy-faces)
-
-(defface counsel-outline-1
- '((t :inherit org-level-1))
- "Face for displaying level 1 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-2
- '((t :inherit org-level-2))
- "Face for displaying level 2 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-3
- '((t :inherit org-level-3))
- "Face for displaying level 3 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-4
- '((t :inherit org-level-4))
- "Face for displaying level 4 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-5
- '((t :inherit org-level-5))
- "Face for displaying level 5 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-6
- '((t :inherit org-level-6))
- "Face for displaying level 6 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-7
- '((t :inherit org-level-7))
- "Face for displaying level 7 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-8
- '((t :inherit org-level-8))
- "Face for displaying level 8 headings."
- :group 'ivy-faces)
-
-(defface counsel-outline-default
- '((t :inherit minibuffer-prompt))
- "Face for displaying headings."
- :group 'ivy-faces)
-
-(defvar counsel-linux-apps-faulty nil
- "List of faulty desktop files.")
-
-(defvar counsel--linux-apps-cache nil
- "Cache of desktop files data.")
-
-(defvar counsel--linux-apps-cached-files nil
- "List of cached desktop files.")
-
-(defvar counsel--linux-apps-cache-timestamp nil
- "Time when we last updated the cached application list.")
-
-(defvar counsel--linux-apps-cache-format-function nil
- "The function used to format the cached Linux application menu.")
-
-(defun counsel-linux-app-format-function-default (name comment exec)
- "Default Linux application name formatter.
-NAME is the name of the application, COMMENT its comment and EXEC
-the command to launch it."
- (format "% -45s: %s%s"
- (propertize
- (ivy--truncate-string exec 45)
- 'face 'counsel-application-name)
- name
- (if comment
- (concat " - " comment)
- "")))
-
-(defun counsel-linux-app-format-function-name-first (name comment exec)
- "Format Linux application names with the NAME (and COMMENT) first.
-EXEC is the command to launch the application."
- (format "%s%s (%s)"
- name
- (if comment
- (concat " - " comment)
- "")
- (propertize exec 'face 'counsel-application-name)))
-
-(defun counsel-linux-app-format-function-name-only (name comment _exec)
- "Format Linux application names with the NAME (and COMMENT) only."
- (format "%s%s"
- name
- (if comment
- (concat " - " comment)
- "")))
-
-(defun counsel-linux-app-format-function-command-only (_name _comment exec)
- "Display only the command EXEC when formatting Linux application names."
- exec)
-
-(defun counsel-linux-apps-list-desktop-files ()
- "Return an alist of all Linux applications.
-Each list entry is a pair of (desktop-name . desktop-file).
-This function always returns its elements in a stable order."
- (let ((hash (make-hash-table :test #'equal))
- result)
- (dolist (dir counsel-linux-apps-directories)
- (when (file-exists-p dir)
- (let ((dir (file-name-as-directory dir)))
- ;; Function `directory-files-recursively' added in Emacs 25.1.
- (dolist (file (directory-files-recursively dir ".*\\.desktop$"))
- (let ((id (subst-char-in-string ?/ ?- (file-relative-name file dir))))
- (when (and (not (gethash id hash)) (file-readable-p file))
- (push (cons id file) result)
- (puthash id file hash)))))))
- result))
-
-(defun counsel-linux-app--parse-file (file)
- (with-temp-buffer
- (insert-file-contents file)
- (goto-char (point-min))
- (let ((start (re-search-forward "^\\[Desktop Entry\\] *$" nil t))
- (end (re-search-forward "^\\[" nil t))
- (visible t)
- name comment exec)
- (catch 'break
- (unless start
- (push file counsel-linux-apps-faulty)
- (message "Warning: File %s has no [Desktop Entry] group" file)
- (throw 'break nil))
-
- (goto-char start)
- (when (re-search-forward "^\\(Hidden\\|NoDisplay\\) *= *\\(1\\|true\\) *$" end t)
- (setq visible nil))
- (setq name (match-string 1))
-
- (goto-char start)
- (unless (re-search-forward "^Type *= *Application *$" end t)
- (throw 'break nil))
- (setq name (match-string 1))
-
- (goto-char start)
- (unless (re-search-forward "^Name *= *\\(.+\\)$" end t)
- (push file counsel-linux-apps-faulty)
- (message "Warning: File %s has no Name" file)
- (throw 'break nil))
- (setq name (match-string 1))
-
- (goto-char start)
- (when (re-search-forward "^Comment *= *\\(.+\\)$" end t)
- (setq comment (match-string 1)))
-
- (goto-char start)
- (unless (re-search-forward "^Exec *= *\\(.+\\)$" end t)
- ;; Don't warn because this can technically be a valid desktop file.
- (throw 'break nil))
- (setq exec (match-string 1))
-
- (goto-char start)
- (when (re-search-forward "^TryExec *= *\\(.+\\)$" end t)
- (let ((try-exec (match-string 1)))
- (unless (locate-file try-exec exec-path nil #'file-executable-p)
- (throw 'break nil))))
- (propertize
- (funcall counsel-linux-app-format-function name comment exec)
- 'visible visible)))))
-
-(defun counsel-linux-apps-parse (desktop-entries-alist)
- "Parse the given alist of Linux desktop entries.
-Each entry in DESKTOP-ENTRIES-ALIST is a pair of ((id . file-name)).
-Any desktop entries that fail to parse are recorded in
-`counsel-linux-apps-faulty'."
- (let (result)
- (setq counsel-linux-apps-faulty nil)
- (dolist (entry desktop-entries-alist result)
- (let* ((id (car entry))
- (file (cdr entry))
- (r (counsel-linux-app--parse-file file)))
- (when r
- (push (cons r id) result))))))
-
-(defun counsel-linux-apps-list ()
- "Return list of all Linux desktop applications."
- (let* ((new-desktop-alist (counsel-linux-apps-list-desktop-files))
- (new-files (mapcar 'cdr new-desktop-alist)))
- (unless (and
- (eq counsel-linux-app-format-function
- counsel--linux-apps-cache-format-function)
- (equal new-files counsel--linux-apps-cached-files)
- (null (cl-find-if
- (lambda (file)
- (time-less-p
- counsel--linux-apps-cache-timestamp
- (nth 5 (file-attributes file))))
- new-files)))
- (setq counsel--linux-apps-cache (counsel-linux-apps-parse new-desktop-alist))
- (setq counsel--linux-apps-cache-format-function counsel-linux-app-format-function)
- (setq counsel--linux-apps-cache-timestamp (current-time))
- (setq counsel--linux-apps-cached-files new-files)))
- counsel--linux-apps-cache)
-
-
-(defun counsel-linux-app-action-default (desktop-shortcut)
- "Launch DESKTOP-SHORTCUT."
- (call-process "gtk-launch" nil 0 nil (cdr desktop-shortcut)))
-
-(defun counsel-linux-app-action-file (desktop-shortcut)
- "Launch DESKTOP-SHORTCUT with a selected file."
- (call-process "gtk-launch" nil 0 nil
- (cdr desktop-shortcut)
- (read-file-name "File: ")))
-
-(defun counsel-linux-app-action-open-desktop (desktop-shortcut)
- "Open DESKTOP-SHORTCUT."
- (let* ((app (cdr desktop-shortcut))
- (file (cdr (assoc app (counsel-linux-apps-list-desktop-files)))))
- (if file
- (find-file file)
- (error "Could not find location of file %s" app))))
-
-(ivy-set-actions
- 'counsel-linux-app
- '(("f" counsel-linux-app-action-file "run on a file")
- ("d" counsel-linux-app-action-open-desktop "open desktop file")))
-
-;;;###autoload
-(defun counsel-linux-app (&optional arg)
- "Launch a Linux desktop application, similar to Alt-<F2>.
-When ARG is non-nil, ignore NoDisplay property in *.desktop files."
- (interactive "P")
- (ivy-read "Run a command: " (counsel-linux-apps-list)
- :predicate (unless arg (lambda (x) (get-text-property 0 'visible (car x))))
- :action #'counsel-linux-app-action-default
- :caller 'counsel-linux-app))
-
-;;** `counsel-wmctrl'
-(defun counsel-wmctrl-action (x)
- "Select the desktop window that corresponds to X."
- (counsel--run "wmctrl" "-i" "-a" (cdr x)))
-
-(defvar counsel-wmctrl-ignore '("XdndCollectionWindowImp"
- "unity-launcher" "unity-panel" "unity-dash"
- "Hud" "Desktop")
- "List of window titles to ignore for `counsel-wmctrl'.")
-
-(defun counsel--wmctrl-parse (s)
- (when (string-match "\\`\\([0-9a-fx]+\\) +\\([-0-9]+\\) +\\(?:[0-9]+\\) +\\([^ ]+\\) \\(.+\\)$" s)
- (let ((title (match-string 4 s))
- (id (match-string 1 s)))
- (unless (member title counsel-wmctrl-ignore)
- (cons title id)))))
-
-;;;###autoload
-(defun counsel-wmctrl ()
- "Select a desktop window using wmctrl."
- (interactive)
- (let* ((cands1 (counsel--sl "wmctrl -l -p"))
- (cands2 (delq nil (mapcar #'counsel--wmctrl-parse cands1))))
- (ivy-read "window: " cands2
- :action #'counsel-wmctrl-action
- :caller 'counsel-wmctrl)))
-
-(defvar counsel--switch-buffer-temporary-buffers nil
- "Internal.")
-
-(defvar counsel--switch-buffer-previous-buffers nil
- "Internal.")
-
-(defun counsel--switch-buffer-unwind ()
- "Clear temporary file buffers and restore `buffer-list'.
-The buffers are those opened during a session of `counsel-switch-buffer'."
- (mapc #'kill-buffer counsel--switch-buffer-temporary-buffers)
- (mapc #'bury-buffer (cl-remove-if-not
- #'buffer-live-p
- counsel--switch-buffer-previous-buffers))
- (setq counsel--switch-buffer-temporary-buffers nil
- counsel--switch-buffer-previous-buffers nil))
-
-(defcustom counsel-switch-buffer-preview-virtual-buffers t
- "When non-nil, `counsel-switch-buffer' will preview virtual buffers."
- :type 'boolean)
-
-(defun counsel--switch-buffer-update-fn ()
- (unless counsel--switch-buffer-previous-buffers
- (setq counsel--switch-buffer-previous-buffers (buffer-list)))
- (let* ((virtual (assoc (ivy-state-current ivy-last) ivy--virtual-buffers)))
- (when (member (ivy-state-current ivy-last) ivy-marked-candidates)
- (setf (ivy-state-current ivy-last)
- (substring (ivy-state-current ivy-last) (length ivy-mark-prefix))))
- (cond
- ((get-buffer (ivy-state-current ivy-last))
- (let ((ivy-marked-candidates nil))
- (ivy-call)))
- ((and counsel-switch-buffer-preview-virtual-buffers virtual (file-exists-p (cdr virtual)))
- (let ((buf (ignore-errors
- ;; may not open due to `large-file-warning-threshold' etc.
- (find-file-noselect (cdr virtual)))))
- (if buf
- (progn
- (push buf counsel--switch-buffer-temporary-buffers)
- (ivy-call))
- ;; clean up the minibuffer so that there's no delay before
- ;; the Ivy candidates are displayed once again
- (message ""))))
- (t
- (with-ivy-window
- (switch-to-buffer (ivy-state-buffer ivy-last)))))))
-
-;;;###autoload
-(defun counsel-switch-buffer ()
- "Switch to another buffer.
-Display a preview of the selected ivy completion candidate buffer
-in the current window."
- (interactive)
- (let ((ivy-update-fns-alist
- '((ivy-switch-buffer . counsel--switch-buffer-update-fn)))
- (ivy-unwind-fns-alist
- '((ivy-switch-buffer . counsel--switch-buffer-unwind))))
- (ivy-switch-buffer)))
-
-;;;###autoload
-(defun counsel-switch-buffer-other-window ()
- "Switch to another buffer in another window.
-Display a preview of the selected ivy completion candidate buffer
-in the current window."
- (interactive)
- (let ((ivy-update-fns-alist
- '((ivy-switch-buffer-other-window . counsel--switch-buffer-update-fn)))
- (ivy-unwind-fns-alist
- '((ivy-switch-buffer-other-window . counsel--switch-buffer-unwind))))
- (ivy-switch-buffer-other-window)))
-
-(defun counsel-open-buffer-file-externally (buffer)
- "Open the file associated with BUFFER with an external program."
- (when (zerop (length buffer))
- (user-error "Can't open that"))
- (let* ((virtual (assoc buffer ivy--virtual-buffers))
- (filename (if virtual
- (cdr virtual)
- (buffer-file-name (get-buffer buffer)))))
- (unless filename
- (user-error "Can't open `%s' externally" buffer))
- (counsel-locate-action-extern (expand-file-name filename))))
-
-(ivy-add-actions
- 'ivy-switch-buffer
- '(("x" counsel-open-buffer-file-externally "open externally")))
-
-(ivy-set-actions
- 'counsel-switch-buffer
- '(("x" counsel-open-buffer-file-externally "open externally")
- ("j" ivy--switch-buffer-other-window-action "other window")))
-
-;;** `counsel-compile'
-(defvar counsel-compile-history nil
- "History for `counsel-compile'.
-
-This is a list of strings with additional properties which allow
-the history to be filtered depending on the context of the call.
-The properties include:
-
-`srcdir'
- the root directory of the source code
-`blddir'
- the root directory of the build (in or outside the `srcdir')
-`bldenv'
- the build environment as passed to `compilation-environment'
-`recursive'
- the completion should be run again in `blddir' of this result
-`cmd'
- if set, pass only the substring with this property to `compile'
-
-This variable is suitable for addition to
-`savehist-additional-variables'.")
-
-(defvar counsel-compile-root-functions
- '(counsel--projectile-root
- counsel--project-current
- counsel--configure-root
- counsel--git-root
- counsel--dir-locals-root)
- "Special hook to find the project root for compile commands.
-Each function on this hook is called in turn with no arguments
-and should return either a directory, or nil if no root was
-found.")
-
-(defun counsel--compile-root ()
- "Return root of current project or signal an error on failure.
-The root is determined by `counsel-compile-root-functions'."
- (or (run-hook-with-args-until-success 'counsel-compile-root-functions)
- (error "Couldn't find project root")))
-
-(defun counsel--projectile-root ()
- "Return root of current projectile project or nil on failure.
-Use `projectile-project-root' to determine the root."
- (and (fboundp 'projectile-project-root)
- (projectile-project-root)))
-
-(defun counsel--project-current ()
- "Return root of current project or nil on failure.
-Use `project-current' to determine the root."
- (and (fboundp 'project-current)
- (cdr (project-current))))
-
-(defun counsel--configure-root ()
- "Return root of current project or nil on failure.
-Use the presence of a \"configure\" file to determine the root."
- (counsel--dominating-file "configure"))
-
-(defun counsel--git-root ()
- "Return root of current project or nil on failure.
-Use the presence of a \".git\" file to determine the root."
- (counsel--dominating-file ".git"))
-
-(defun counsel--dir-locals-root ()
- "Return root of current project or nil on failure.
-Use the presence of a `dir-locals-file' to determine the root."
- (counsel--dominating-file dir-locals-file))
-
-(defvar counsel-compile-local-builds
- '(counsel-compile-get-filtered-history
- counsel-compile-get-build-directories
- counsel-compile-get-make-invocation)
- "Additional compile invocations to feed into `counsel-compile'.
-
-This can either be a list of compile invocation strings or
-functions that will provide such a list. You should customize
-this if you want to provide specific non-standard build types to
-`counsel-compile'. The default helpers are set up to handle
-common build environments.")
-
-(defcustom counsel-compile-make-args "-k"
- "Additional arguments for make.
-You may, for example, want to add \"-jN\" for the number of cores
-N in your system."
- :type 'string)
-
-(defcustom counsel-compile-env nil
- "List of environment variables for compilation to inherit.
-Each element should be a string of the form ENVVARNAME=VALUE. This
-list is passed to `compilation-environment'."
- :type '(repeat (string :tag "ENVVARNAME=VALUE")))
-
-(defvar counsel-compile-env-history nil
- "History for `counsel-compile-env'.")
-
-(defvar counsel-compile-env-pattern
- "[_[:digit:][:upper:]]+=[/[:alnum:]]*"
- "Pattern to match valid environment variables.")
-
-(defcustom counsel-compile-make-pattern "\\`\\(?:GNUm\\|[Mm]\\)akefile\\'"
- "Regexp for matching the names of Makefiles."
- :type 'regexp)
-
-(defcustom counsel-compile-build-directories
- '("build" "builds" "bld" ".build")
- "List of potential build subdirectory names to check for."
- :type '(repeat directory))
-
-(defvar counsel-compile-phony-pattern "^\\.PHONY:[\t ]+\\(.+\\)$"
- "Regexp for extracting phony targets from Makefiles.")
-
-;; This is loosely based on the Bash Make completion code
-(defun counsel-compile--probe-make-targets (dir)
- "Return a list of Make targets for DIR.
-
-Return an empty list is Make exits with an error. This might
-happen because some sort of configuration needs to be done first
-or the source tree is pristine and being used for multiple build
-trees."
- (let ((default-directory dir)
- (targets nil))
- (with-temp-buffer
- ;; 0 = no-rebuild, -q & 1 needs rebuild, 2 error (for GNUMake at
- ;; least)
- (when (< (call-process "make" nil t nil "-nqp") 2)
- (goto-char (point-min))
- (while (re-search-forward counsel-compile-phony-pattern nil t)
- (setq targets
- (nconc targets (split-string
- (match-string-no-properties 1)))))))
- (sort targets #'string-lessp)))
-
-(defun counsel-compile--pretty-propertize (leader text face)
- "Return a pretty string of the form \" LEADER TEXT\".
-LEADER is propertized with a warning face and the remaining
-text with FACE."
- (concat (propertize (concat " " leader " ")
- 'face
- 'font-lock-warning-face)
- (propertize text 'face face)))
-
-(defun counsel--compile-get-make-targets (srcdir &optional blddir)
- "Return a list of Make targets for a given SRCDIR/BLDDIR combination.
-
-We search the Makefile for a list of phony targets which are
-generally the top level targets a Make system provides.
-The resulting strings are tagged with properties that
-`counsel-compile-history' can use for filtering results."
- (let ((fmt (format (propertize "make %s %%s" 'cmd t)
- counsel-compile-make-args))
- (suffix (and blddir
- (counsel-compile--pretty-propertize "in" blddir
- 'dired-directory)))
- (build-env (and counsel-compile-env
- (counsel-compile--pretty-propertize
- "with"
- (mapconcat #'identity counsel-compile-env " ")
- 'font-lock-variable-name-face)))
- (props `(srcdir ,srcdir blddir ,blddir bldenv ,counsel-compile-env)))
- (mapcar (lambda (target)
- (setq target (concat (format fmt target) suffix build-env))
- (add-text-properties 0 (length target) props target)
- target)
- (counsel-compile--probe-make-targets (or blddir srcdir)))))
-
-(defun counsel-compile-get-make-invocation (&optional blddir)
- "Have a look in the root directory for any build control files.
-
-The optional BLDDIR is useful for other helpers that have found
-sub-directories that builds may be invoked in."
- (let ((srcdir (counsel--compile-root)))
- (when (directory-files (or blddir srcdir) nil
- counsel-compile-make-pattern t)
- (counsel--compile-get-make-targets srcdir blddir))))
-
-(defun counsel--find-build-subdir (srcdir)
- "Return builds subdirectory of SRCDIR, if one exists."
- (cl-some (lambda (dir)
- (setq dir (expand-file-name dir srcdir))
- (and (file-directory-p dir) dir))
- counsel-compile-build-directories))
-
-(defun counsel--get-build-subdirs (blddir)
- "Return all subdirs under BLDDIR sorted by modification time.
-If there are non-directory files in BLDDIR, include BLDDIR in the
-list as it may also be a build directory."
- (let* ((files (directory-files-and-attributes
- blddir t directory-files-no-dot-files-regexp t))
- (dirs (cl-remove-if-not #'cl-second files)))
- ;; Any non-dir files?
- (when (< (length dirs)
- (length files))
- (push (cons blddir (file-attributes blddir)) dirs))
- (mapcar #'car (sort dirs (lambda (x y)
- (time-less-p (nth 6 y) (nth 6 x)))))))
-
-(defun counsel-compile-get-build-directories (&optional dir)
- "Return a list of potential build directories."
- (let* ((srcdir (or dir (counsel--compile-root)))
- (blddir (counsel--find-build-subdir srcdir))
- (props `(srcdir ,srcdir recursive t))
- (fmt (concat (propertize "Select build in "
- 'face 'font-lock-warning-face)
- (propertize "%s" 'face 'dired-directory))))
- (mapcar (lambda (subdir)
- (let ((s (format fmt subdir)))
- (add-text-properties 0 (length s) `(blddir ,subdir ,@props) s)
- s))
- (and blddir (counsel--get-build-subdirs blddir)))))
-
-;; This is a workaround for the fact there is no concept of "project"
-;; local variables (as opposed to for example buffer-local). So we
-;; store all our history in a global list filter out the results we
-;; don't want.
-(defun counsel-compile-get-filtered-history (&optional dir)
- "Return a compile history relevant to current project."
- (let ((root (or dir (counsel--compile-root)))
- history)
- (dolist (item counsel-compile-history)
- (let ((srcdir (get-text-property 0 'srcdir item))
- (blddir (get-text-property 0 'blddir item)))
- (when (or (and srcdir (file-in-directory-p srcdir root))
- (and blddir (file-in-directory-p blddir root)))
- (push item history))))
- (nreverse history)))
-
-(defun counsel--get-compile-candidates (&optional dir)
- "Return the list of compile commands.
-This is determined by `counsel-compile-local-builds', which see."
- (let (cands)
- (dolist (cmds counsel-compile-local-builds)
- (when (functionp cmds)
- (setq cmds (funcall cmds dir)))
- (when cmds
- (push (if (listp cmds) cmds (list cmds)) cands)))
- (apply #'append (nreverse cands))))
-
-;; This is a workaround to ensure we tag all the relevant metadata in
-;; our compile history. This also allows M-x compile to do fancy
-;; things like infer `default-directory' from 'cd's in the string.
-(defun counsel-compile--update-history (_proc)
- "Update `counsel-compile-history' from the compilation state."
- (let* ((srcdir (counsel--compile-root))
- (blddir default-directory)
- (bldenv compilation-environment)
- (cmd (concat
- (propertize (car compilation-arguments) 'cmd t)
- (unless (file-equal-p blddir srcdir)
- (counsel-compile--pretty-propertize "in" blddir
- 'dired-directory))
- (when bldenv
- (counsel-compile--pretty-propertize "with"
- (mapconcat #'identity bldenv " ")
- 'font-lock-variable-name-face)))))
- (add-text-properties 0 (length cmd)
- `(srcdir ,srcdir blddir ,blddir bldenv ,bldenv) cmd)
- (add-to-history 'counsel-compile-history cmd)))
-
-(defvar counsel-compile--current-build-dir nil
- "Tracks the last directory `counsel-compile' was called with.
-
-This state allows us to set it correctly if the user has manually
-edited the command, thus losing our embedded state.")
-
-(defun counsel-compile--action (cmd)
- "Process CMD to call `compile'.
-
-If CMD has the `recursive' property set we call `counsel-compile'
-again to further refine the compile options in the directory
-specified by the `blddir' property."
- (let ((blddir (get-text-property 0 'blddir cmd))
- (bldenv (get-text-property 0 'bldenv cmd)))
- (if (get-text-property 0 'recursive cmd)
- (counsel-compile blddir)
- (when (get-char-property 0 'cmd cmd)
- (setq cmd (substring-no-properties
- cmd 0 (next-single-property-change 0 'cmd cmd))))
- (let ((default-directory (or blddir
- counsel-compile--current-build-dir
- default-directory))
- (compilation-environment bldenv))
- ;; No need to specify `:history' because of this hook.
- (add-hook 'compilation-start-hook #'counsel-compile--update-history)
- (unwind-protect
- (compile cmd)
- (remove-hook 'compilation-start-hook #'counsel-compile--update-history))))))
-
-;;;###autoload
-(defun counsel-compile (&optional dir)
- "Call `compile' completing with smart suggestions, optionally for DIR."
- (interactive)
- (setq counsel-compile--current-build-dir (or dir
- (counsel--compile-root)
- default-directory))
- (ivy-read "Compile command: "
- (delete-dups (counsel--get-compile-candidates dir))
- :action #'counsel-compile--action
- :caller 'counsel-compile))
-
-(ivy-add-actions
- 'counsel-compile
- '(("d" counsel-compile-forget-command "delete")))
-
-(defun counsel-compile-forget-command (cmd)
- "Delete CMD from `counsel-compile-history'."
- (setq counsel-compile-history
- (delete cmd counsel-compile-history)))
-
-(defun counsel-compile-env--format-hint (cands)
- "Return a formatter for compile-env CANDS."
- (let ((rmstr
- (propertize "remove" 'face 'font-lock-warning-face))
- (addstr
- (propertize "add" 'face 'font-lock-variable-name-face)))
- (ivy--format-function-generic
- (lambda (selected)
- (format "%s %s"
- (if (member selected counsel-compile-env) rmstr addstr)
- selected))
- #'identity
- cands
- "\n")))
-
-(defun counsel-compile-env--update (var)
- "Update `counsel-compile-env' either adding or removing VAR."
- (cond ((member var counsel-compile-env)
- (setq counsel-compile-env (delete var counsel-compile-env)))
- ((string-match-p counsel-compile-env-pattern var)
- (push var counsel-compile-env))
- (t (user-error "Ignoring malformed variable: '%s'" var))))
-
-;;;###autoload
-(defun counsel-compile-env ()
- "Update `counsel-compile-env' interactively."
- (interactive)
- (ivy-read "Compile environment variable: "
- (delete-dups (append
- counsel-compile-env counsel-compile-env-history))
- :action #'counsel-compile-env--update
- :predicate (lambda (cand)
- (string-match-p counsel-compile-env-pattern
- cand))
- :history 'counsel-compile-env-history
- :caller 'counsel-compile-env))
-
-(ivy-configure 'counsel-compile-env
- :format-fn #'counsel-compile-env--format-hint)
-
-;;** `counsel-minor'
-(defvar counsel-minor-history nil
- "History for `counsel-minor'.")
-
-(defun counsel--minor-candidates ()
- "Return completion alist for `counsel-minor'.
-
-The alist element is cons of minor mode string with its lighter
-and minor mode symbol."
- (delq nil
- (mapcar
- (lambda (mode)
- (when (and (boundp mode) (commandp mode))
- (let ((lighter (cdr (assq mode minor-mode-alist))))
- (cons (concat
- (if (symbol-value mode) "-" "+")
- (symbol-name mode)
- (propertize
- (if lighter
- (format " \"%s\""
- (format-mode-line (cons t lighter)))
- "")
- 'face font-lock-string-face))
- mode))))
- minor-mode-list)))
-
-;;;###autoload
-(defun counsel-minor ()
- "Enable or disable minor mode.
-
-Disabled minor modes are prefixed with \"+\", and
-selecting one of these will enable it.
-Enabled minor modes are prefixed with \"-\", and
-selecting one of these will enable it.
-
-Additional actions:\\<ivy-minibuffer-map>
-
- \\[ivy-dispatching-done] d: Go to minor mode definition
- \\[ivy-dispatching-done] h: Describe minor mode"
-
- (interactive)
- (ivy-read "Minor modes (enable +mode or disable -mode): "
- (counsel--minor-candidates)
- :require-match t
- :history 'counsel-minor-history
- :action (lambda (x)
- (call-interactively (cdr x)))))
-
-(ivy-configure 'counsel-minor
- :initial-input "^+"
- :sort-fn #'ivy-string<)
-
-(ivy-set-actions
- 'counsel-minor
- `(("d" ,(lambda (x) (find-function (cdr x))) "definition")
- ("h" ,(lambda (x) (describe-function (cdr x))) "help")))
-
-;;;###autoload
-(defun counsel-major ()
- (interactive)
- (ivy-read "Major modes: " obarray
- :predicate (lambda (f)
- (and (commandp f) (string-match "-mode$" (symbol-name f))
- (or (and (autoloadp (symbol-function f))
- (let ((doc-split (help-split-fundoc (documentation f) f)))
- ;; major mode starters have no arguments
- (and doc-split (null (cdr (read (car doc-split)))))))
- (null (help-function-arglist f)))))
- :action #'counsel-M-x-action
- :caller 'counsel-major))
-
-;;** `counsel-search'
-(declare-function request "ext:request")
-
-(defcustom counsel-search-engine 'ddg
- "The search engine choice in `counsel-search-engines-alist'."
- :type '(choice
- (const ddg)
- (const google)))
-
-(defcustom counsel-search-engines-alist
- '((google
- "http://suggestqueries.google.com/complete/search"
- "https://www.google.com/search?q="
- counsel--search-request-data-google)
- (ddg
- "https://duckduckgo.com/ac/"
- "https://duckduckgo.com/html/?q="
- counsel--search-request-data-ddg))
- "Search engine parameters for `counsel-search'."
- :type '(list))
-
-(defun counsel--search-request-data-google (data)
- (mapcar #'identity (aref data 1)))
-
-(defun counsel--search-request-data-ddg (data)
- (mapcar #'cdar data))
-
-(defun counsel-search-function (input)
- "Create a request to a search engine with INPUT.
-Return 0 tells `ivy--exhibit' not to update the minibuffer.
-We update it in the callback with `ivy-update-candidates'."
- (or
- (ivy-more-chars)
- (let ((engine (cdr (assoc counsel-search-engine counsel-search-engines-alist))))
- (request
- (nth 0 engine)
- :type "GET"
- :params (list
- (cons "client" "firefox")
- (cons "q" input))
- :parser 'json-read
- :success (cl-function
- (lambda (&key data &allow-other-keys)
- (ivy-update-candidates
- (funcall (nth 2 engine) data)))))
- 0)))
-
-(defun counsel-search-action (x)
- "Search for X."
- (browse-url
- (concat
- (nth 2 (assoc counsel-search-engine counsel-search-engines-alist))
- x)))
-
-(defun counsel-search ()
- "Ivy interface for dynamically querying a search engine."
- (interactive)
- (require 'request)
- (require 'json)
- (ivy-read "search: " #'counsel-search-function
- :action #'counsel-search-action
- :dynamic-collection t
- :caller 'counsel-search))
-
-(define-obsolete-function-alias 'counsel-google
- 'counsel-search "<2019-10-17 Thu>")
-
-;;** `counsel-compilation-errors'
-(defun counsel--compilation-errors-buffer (buf)
- (with-current-buffer buf
- (let ((res nil)
- (pt (point-min)))
- (save-excursion
- (while (setq pt (compilation-next-single-property-change
- pt 'compilation-message))
- (let ((loc (get-text-property pt 'compilation-message)))
- (when (and loc (setq loc (compilation--message->loc loc)))
- (goto-char pt)
- (push
- (propertize
- (buffer-substring-no-properties pt (line-end-position))
- 'pt pt
- 'buffer buf)
- res)))))
- (nreverse res))))
-
-(defun counsel-compilation-errors-cands ()
- (cl-loop
- for buf in (buffer-list)
- when (compilation-buffer-p buf)
- nconc (counsel--compilation-errors-buffer buf)))
-
-(defun counsel-compilation-errors-action (x)
- (pop-to-buffer (get-text-property 0 'buffer x))
- (goto-char (get-text-property 0 'pt x))
- (compile-goto-error))
-
-;;;###autoload
-(defun counsel-compilation-errors ()
- "Compilation errors."
- (interactive)
- (ivy-read "compilation errors: " (counsel-compilation-errors-cands)
- :require-match t
- :action #'counsel-compilation-errors-action
- :history 'counsel-compilation-errors-history))
-
-;;** `counsel-flycheck'
-(defvar flycheck-current-errors)
-(declare-function flycheck-error-filename "ext:flycheck")
-(declare-function flycheck-error-line "ext:flycheck")
-(declare-function flycheck-error-message "ext:flycheck")
-(declare-function flycheck-jump-to-error "ext:flycheck")
-
-(defun counsel-flycheck-errors-cands ()
- (mapcar
- (lambda (err)
- (propertize
- (format "%s:%d:%s"
- (file-name-base (flycheck-error-filename err))
- (flycheck-error-line err)
- (flycheck-error-message err)) 'error err))
- flycheck-current-errors))
-
-(defun counsel-flycheck-occur (cands)
- "Generate a custom occur buffer for `counsel-flycheck'."
- (unless (eq major-mode 'ivy-occur-grep-mode)
- (ivy-occur-grep-mode)
- (setq default-directory (ivy-state-directory ivy-last)))
- (swiper--occur-insert-lines
- (mapcar
- (lambda (cand)
- (let ((err (get-text-property 0 'error cand)))
- (propertize
- (format
- "%s:%d:%s"
- (flycheck-error-filename err)
- (flycheck-error-line err)
- cand)
- 'error err)))
- cands)))
-
-(defun counsel-flycheck-errors-action (err)
- (flycheck-jump-to-error (get-text-property 0 'error err)))
-
-(ivy-configure 'counsel-flycheck
- :occur #'counsel-flycheck-occur)
-
-;;;###autoload
-(defun counsel-flycheck ()
- "Flycheck errors."
- (interactive)
- (require 'flycheck)
- (ivy-read "flycheck errors: " (counsel-flycheck-errors-cands)
- :require-match t
- :action #'counsel-flycheck-errors-action
- :history 'counsel-flycheck-errors-history))
-
-
-;;* `counsel-mode'
-(defvar counsel-mode-map
- (let ((map (make-sparse-keymap)))
- (dolist (binding
- '((execute-extended-command . counsel-M-x)
- (describe-bindings . counsel-descbinds)
- (describe-function . counsel-describe-function)
- (describe-variable . counsel-describe-variable)
- (describe-symbol . counsel-describe-symbol)
- (apropos-command . counsel-apropos)
- (describe-face . counsel-describe-face)
- (list-faces-display . counsel-faces)
- (find-file . counsel-find-file)
- (find-library . counsel-find-library)
- (imenu . counsel-imenu)
- (load-library . counsel-load-library)
- (load-theme . counsel-load-theme)
- (yank-pop . counsel-yank-pop)
- (info-lookup-symbol . counsel-info-lookup-symbol)
- (pop-to-mark-command . counsel-mark-ring)
- (geiser-doc-look-up-manual . counsel-geiser-doc-look-up-manual)
- (bookmark-jump . counsel-bookmark)))
- (define-key map (vector 'remap (car binding)) (cdr binding)))
- map)
- "Map for `counsel-mode'.
-Remaps built-in functions to counsel replacements.")
-
-(defcustom counsel-mode-override-describe-bindings nil
- "Whether to override `describe-bindings' when `counsel-mode' is active."
- :type 'boolean)
-
-;;;###autoload
-(define-minor-mode counsel-mode
- "Toggle Counsel mode on or off.
-Turn Counsel mode on if ARG is positive, off otherwise. Counsel
-mode remaps built-in emacs functions that have counsel
-replacements.
-
-Local bindings (`counsel-mode-map'):
-\\{counsel-mode-map}"
- :global t
- :keymap counsel-mode-map
- :lighter " counsel"
- (if counsel-mode
- (progn
- (when counsel-mode-override-describe-bindings
- (advice-add #'describe-bindings :override #'counsel-descbinds))
- (define-key minibuffer-local-map (kbd "C-r")
- 'counsel-minibuffer-history))
- (advice-remove #'describe-bindings #'counsel-descbinds)))
-
-(provide 'counsel)
-
-;;; counsel.el ends here
diff --git a/elpa/csv-mode-1.12.signed b/elpa/csv-mode-1.12.signed
deleted file mode 100644
index 99e2570..0000000
--- a/elpa/csv-mode-1.12.signed
+++ /dev/null
@@ -1 +0,0 @@
-Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2020-02-16T02:05:01-0800 using RSA \ No newline at end of file
diff --git a/elpa/csv-mode-1.12/ChangeLog b/elpa/csv-mode-1.12/ChangeLog
deleted file mode 100644
index b3929ea..0000000
--- a/elpa/csv-mode-1.12/ChangeLog
+++ /dev/null
@@ -1,251 +0,0 @@
-2020-02-16 Simen Heggestøyl <simenheg@gmail.com>
-
- * packages/csv-mode/csv-mode.el: Bump version number
-
-2020-02-15 Simen Heggestøyl <simenheg@gmail.com>
-
- Add tests for CSV mode
-
- * packages/csv-mode/csv-mode-tests.el: New file with tests for
- csv-mode.el.
-
-2020-02-15 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Revert part of last change.
- (csv-end-of-field, csv-beginning-of-field): Don't use csv-field-quotes.
- I was confused.
-
-2020-01-30 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: New TAB/backtab commands
-
- (csv-tab-command, csv-backtab-command): New commands.
- (csv-mode-map): Bind them.
- (csv-end-of-field, csv-beginning-of-field): Obey csv-field-quotes.
-
-2019-10-22 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el (csv-align--cursor-truncated): Fix C-e
- case
-
-2019-10-22 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Auto-shorten columns as well
-
- (csv--column-widths): Also return the position of the widest field in
- each column.
- (csv-align-fields, csv--jit-align): Update accordingly.
- (csv--jit-width-change): New function.
- (csv--jit-merge-columns): Use it on overlays placed on the widest field
- of each column, to detect when they're shortened.
-
-2019-10-19 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: More cvs-align-mode improvements
-
- Rename csv-align-fields-* to cvs-align-*.
- (csv-transpose): Use split-string.
- (csv-split-string): Delete function.
- (csv--config-column-widths): New var.
- (csv-align--set-column): New function.
- (csv-align-set-column-width): New command.
- (csv--jit-align): Use them to obey the per-column width settings. Delay
- context refresh by jit-lock-context-time. Set cursor-sensor-functions to
- untruncate fields on-the-fly.
- (csv-align--cursor-truncated): New function.
- (csv-align-mode): Activate cursor-sensor-mode.
-
-2019-10-19 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Fix incorrect truncation
-
- (csv--field-index): New function, extracted from csv-field-index.
- (csv--jit-align): Don't apply csv-align-fields-max-width to the last
- column. Fix move-to-column call.
-
-2019-10-10 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Fix header-line's alignment
-
- (csv-header-line): Change csv--header-line into an overlay. Add a
- modification-hooks to auto-refresh the header-line.
- (csv--header-flush, csv--header-string): New functions.
- (csv--compute-header-string): Make sure jit-lock was applied.
- csv--header-hscroll can be nil sometimes somehow!
- (csv--jit-flush, csv-align-fields-mode): Flush header-line as well.
- (csv--jit-align): Flush header-line when applicable. Fix typo.
-
-2019-10-09 Filipp Gunbin <fgunbin@fastmail.fm>
-
- packages/csv-mode/csv-mode.el: Fix csv-align-fields doc
-
- (csv-align-fields): docstring mentioned csv-align-fields instead of
- csv-align-padding
-
-2019-09-29 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Remove Francis as maintainer
-
- (csv-unalign-fields): Also remove the `invisible` property since we use
- it to truncate fields in csv--jit-align.
- (csv-align-fields-max-width): Rename from csv-align-field-max-width to
- match the "csv-align-fields" prefix.
- (csv--ellipsis-width): New function.
- (csv--jit-align): Use it to truncate more correctly.
-
-2019-09-27 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el (csv-align-field-max-width): New var
-
- (csv--jit-unalign): Erase invisible property as well.
- (csv--jit-align): Truncate field to fit within csv-align-field-max-width
- when needed.
- (csv-align-fields-mode): Add/remove `csv-truncate` to invisibility spec.
-
-2019-09-27 Francis Wright <f.j.wright@qmul.ac.uk>
-
- * packages/csv-mode/csv-mode.el: Fix for customize-mode
-
- (csv-mode, tsv-mode): Specify :group explicitly for `customize-mode`s
- benefit
-
-2019-09-24 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Add tsv-mode and csv-align-fields-mode
-
- Require cl-lib. Don't set buffer-invisibility-spec directly.
- (csv--skip-chars): Rename from misleading csv--skip-regexp.
- (csv-mode): Set normal-auto-fill-function to really disable
- auto-fill-mode.
- (csv--column-widths): Only operate over new args beg..end.
- (csv-align-fields): No need to narrow before csv--column-widths any
- more.
- (csv-align-fields-mode): New minor mode.
- (tsv-mode): New major mode.
-
-2019-09-18 Simen Heggestøyl <simenheg@gmail.com>
-
- Speed up 'csv-align-fields'
-
- * packages/csv-mode/csv-mode.el: Bump version number and make the
- dependency on Emacs 24.1 or higher explicit.
- (csv--column-widths): Return the field widths as well.
- (csv-align-fields): Speed up by using the field widths already computed
- by 'csv--column-widths' (bug#37393).
-
-2017-12-05 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * csv-mode/csv-mode.el (csv-header-line): New command
-
- (csv-menu): Add an entry for it.
- (csv--header-line, csv--header-hscroll, csv--header-string): New vars.
- (csv--compute-header-string): New function.
-
-2016-07-11 Paul Eggert <eggert@cs.ucla.edu>
-
- Fix some quoting problems in doc strings
-
- Most of these are minor issues involving, e.g., quoting `like this'
- instead of 'like this'. A few involve escaping ` and ' with a preceding
- \= when the characters should not be turned into curved single quotes.
-
-2016-04-21 Leo Liu <sdl.web@gmail.com>
-
- Fix csv-mode to delete its own overlays only
-
- * csv-mode/csv-mode.el (csv--make-overlay, csv--delete-overlay): New
- functions.
- (csv-align-fields, csv-unalign-fields, csv-transpose): Use them.
-
-2016-03-04 Francis Wright <f.j.wright@qmul.ac.uk>
-
- * csv-mode/csv-mode.el: Remove out-of-date "URL:" header.
-
-2016-03-03 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * csv-mode, landmark: Fix maintainer's email
-
-2015-07-09 Leo Liu <sdl.web@gmail.com>
-
- Fix column width calculation in cvs-mode.el
-
- * csv-mode/cvs-mode.el (csv--column-widths, csv-align-fields): Fix
- column width calculation.
-
-2015-05-24 Leo Liu <sdl.web@gmail.com>
-
- * csv-mode/cvs-mode.el (csv-set-comment-start): Handle nil.
-
- See also http://debbugs.gnu.org/20564.
-
-2015-04-15 Stefan Monnier <monnier@iro.umontreal.ca>
-
- (csv-mode): Set mode-line-position rather than mode-line-format.
-
- Fixes: debbugs:20343
-
- * csv-mode/csv-mode.el (csv-mode-line-format): Only keep the CSV part of
- the mode line.
-
-2014-01-15 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * csv-mode (csv-mode-line-help-echo): Remove.
-
-2013-04-24 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * csv-mode.el (csv-kill-one-field): Check for presence before deleting
- trailing separator. Remove last arg and turn into a function.
- (csv-kill-one-column, csv-kill-many-columns): Adjust callers.
-
-2012-10-22 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el (csv-end-of-field): Don't skip TABs.
- (csv--skip-regexp): Rename from csv-skip-regexp.
-
-2012-10-10 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * csv-mode.el: Bump version number.
-
-2012-10-10 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * csv-mode.el: Use lexical-binding. Remove redundant :group args.
- (csv-separators): Add TAB to the default.
- (csv-invisibility-default): Change default to t.
- (csv-separator-face): Inherit from escape-glyph. Remove variable.
- (csv-mode-line-format): Remove trailing "--". Move next to line-number.
- (csv-interactive-args): Use use-region-p.
- (csv--column-widths): New function, extracted from csv-align-fields.
- (csv-align-fields): Use it. Use whole buffer by default. Use :align-to
- and text-properties when possible.
- (csv-unalign-fields): Also remove properties.
- (csv-mode): Truncate lines.
-
-2012-03-24 Chong Yidong <cyd@gnu.org>
-
- Commentary fix for quarter-plane.el.
-
-2012-03-24 Chong Yidong <cyd@gnu.org>
-
- Commentary tweaks for csv-mode, ioccur, and nhexl-mode packages.
-
-2012-03-24 Chong Yidong <cyd@gnu.org>
-
- csv-mode.el: Improve commentary.
-
-2012-03-12 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * packages/csv-mode/csv-mode.el: Minor installation cleanups. Fix up
- copyright notice. Set version.
- (csv-separators, csv-field-quotes): Fix calls to `error'.
- (csv-mode-line-help-echo, csv-mode-line-format): Replace
- mode-line-format for default-mode-line-format.
- (csv-mode-map): Declare and initialize.
- (csv-mode): Add autoload cookie.
- (csv-set-comment-start): Make sure vars are made buffer-local.
- (csv-field-index-mode, csv-field-index): Use derived-mode-p.
- (csv-align-fields): Improve insertion types of overlay's markers.
-
-2012-03-12 Stefan Monnier <monnier@iro.umontreal.ca>
-
- Add csv-mode.el.
-
diff --git a/elpa/csv-mode-1.12/csv-mode-autoloads.el b/elpa/csv-mode-1.12/csv-mode-autoloads.el
deleted file mode 100644
index 386fd02..0000000
--- a/elpa/csv-mode-1.12/csv-mode-autoloads.el
+++ /dev/null
@@ -1,81 +0,0 @@
-;;; csv-mode-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "csv-mode" "csv-mode.el" (0 0 0 0))
-;;; Generated autoloads from csv-mode.el
-
-(autoload 'csv-mode "csv-mode" "\
-Major mode for editing files of comma-separated value type.
-
-CSV mode is derived from `text-mode', and runs `text-mode-hook' before
-running `csv-mode-hook'. It turns `auto-fill-mode' off by default.
-CSV mode can be customized by user options in the CSV customization
-group. The separators are specified by the value of `csv-separators'.
-
-CSV mode commands ignore blank lines and comment lines beginning with
-the value of `csv-comment-start', which delimit \"paragraphs\".
-\"Sexp\" is re-interpreted to mean \"field\", so that `forward-sexp'
-\(\\[forward-sexp]), `kill-sexp' (\\[kill-sexp]), etc. all apply to fields.
-Standard comment commands apply, such as `comment-dwim' (\\[comment-dwim]).
-
-If `font-lock-mode' is enabled then separators, quoted values and
-comment lines are highlighted using respectively `csv-separator-face',
-`font-lock-string-face' and `font-lock-comment-face'.
-
-The user interface (UI) for CSV mode commands is similar to that of
-the standard commands `sort-fields' and `sort-numeric-fields', except
-that if there is no prefix argument then the UI prompts for the field
-index or indices. In `transient-mark-mode' only: if the region is not
-set then the UI attempts to set it to include all consecutive CSV
-records around point, and prompts for confirmation; if there is no
-prefix argument then the UI prompts for it, offering as a default the
-index of the field containing point if the region was not set
-explicitly. The region set automatically is delimited by blank lines
-and comment lines, and the number of header lines at the beginning of
-the region given by the value of `csv-header-lines' are skipped.
-
-Sort order is controlled by `csv-descending'.
-
-CSV mode provides the following specific keyboard key bindings:
-
-\\{csv-mode-map}
-
-\(fn)" t nil)
-
-(add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
-
-(add-to-list 'auto-mode-alist '("\\.tsv\\'" . tsv-mode))
-
-(autoload 'tsv-mode "csv-mode" "\
-Major mode for editing files of tab-separated value type.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "csv-mode" '("tsv-" "csv-")))
-
-;;;***
-
-;;;### (autoloads nil "csv-mode-tests" "csv-mode-tests.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from csv-mode-tests.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "csv-mode-tests" '("csv-mode-tests--align-fields")))
-
-;;;***
-
-;;;### (autoloads nil nil ("csv-mode-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; csv-mode-autoloads.el ends here
diff --git a/elpa/csv-mode-1.12/csv-mode-pkg.el b/elpa/csv-mode-1.12/csv-mode-pkg.el
deleted file mode 100644
index 612ecd2..0000000
--- a/elpa/csv-mode-1.12/csv-mode-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;; Generated package description from csv-mode.el -*- no-byte-compile: t -*-
-(define-package "csv-mode" "1.12" "Major mode for editing comma/char separated values" '((emacs "24.1") (cl-lib "0.5")) :url "http://elpa.gnu.org/packages/csv-mode.html" :keywords '("convenience") :authors '(("\"Francis J. Wright\"" . "F.J.Wright@qmul.ac.uk")) :maintainer '(nil . "emacs-devel@gnu.org"))
diff --git a/elpa/csv-mode-1.12/csv-mode-tests.el b/elpa/csv-mode-1.12/csv-mode-tests.el
deleted file mode 100644
index b5e0b49..0000000
--- a/elpa/csv-mode-1.12/csv-mode-tests.el
+++ /dev/null
@@ -1,102 +0,0 @@
-;;; csv-mode-tests.el --- Tests for CSV mode -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2020 Free Software Foundation, Inc
-
-;; Author: Simen Heggestøyl <simenheg@gmail.com>
-;; Keywords:
-
-;; 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 this program. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;
-
-;;; Code:
-
-(require 'ert)
-(require 'csv-mode)
-(eval-when-compile (require 'subr-x))
-
-(ert-deftest csv-mode-tests-end-of-field ()
- (with-temp-buffer
- (csv-mode)
- (insert "aaa,bbb")
- (goto-char (point-min))
- (csv-end-of-field)
- (should (equal (buffer-substring (point-min) (point))
- "aaa"))
- (forward-char)
- (csv-end-of-field)
- (should (equal (buffer-substring (point-min) (point))
- "aaa,bbb"))))
-
-(ert-deftest csv-mode-tests-end-of-field-with-quotes ()
- (with-temp-buffer
- (csv-mode)
- (insert "aaa,\"b,b\"")
- (goto-char (point-min))
- (csv-end-of-field)
- (should (equal (buffer-substring (point-min) (point))
- "aaa"))
- (forward-char)
- (csv-end-of-field)
- (should (equal (buffer-substring (point-min) (point))
- "aaa,\"b,b\""))))
-
-(ert-deftest csv-mode-tests-beginning-of-field ()
- (with-temp-buffer
- (csv-mode)
- (insert "aaa,bbb")
- (csv-beginning-of-field)
- (should (equal (buffer-substring (point) (point-max))
- "bbb"))
- (backward-char)
- (csv-beginning-of-field)
- (should (equal (buffer-substring (point) (point-max))
- "aaa,bbb"))))
-
-(ert-deftest csv-mode-tests-beginning-of-field-with-quotes ()
- (with-temp-buffer
- (csv-mode)
- (insert "aaa,\"b,b\"")
- (csv-beginning-of-field)
- (should (equal (buffer-substring (point) (point-max))
- "\"b,b\""))
- (backward-char)
- (csv-beginning-of-field)
- (should (equal (buffer-substring (point) (point-max))
- "aaa,\"b,b\""))))
-
-(defun csv-mode-tests--align-fields (before after)
- (with-temp-buffer
- (insert (string-join before "\n"))
- (csv-align-fields t (point-min) (point-max))
- (should (equal (buffer-string) (string-join after "\n")))))
-
-(ert-deftest csv-mode-tests-align-fields ()
- (csv-mode-tests--align-fields
- '("aaa,bbb,ccc"
- "1,2,3")
- '("aaa, bbb, ccc"
- "1 , 2 , 3")))
-
-(ert-deftest csv-mode-tests-align-fields-with-quotes ()
- (csv-mode-tests--align-fields
- '("aaa,\"b,b\",ccc"
- "1,2,3")
- '("aaa, \"b,b\", ccc"
- "1 , 2 , 3")))
-
-(provide 'csv-mode-tests)
-;;; csv-mode-tests.el ends here
diff --git a/elpa/csv-mode-1.12/csv-mode.el b/elpa/csv-mode-1.12/csv-mode.el
deleted file mode 100644
index 4e4c4b7..0000000
--- a/elpa/csv-mode-1.12/csv-mode.el
+++ /dev/null
@@ -1,1737 +0,0 @@
-;;; csv-mode.el --- Major mode for editing comma/char separated values -*- lexical-binding: t -*-
-
-;; Copyright (C) 2003, 2004, 2012-2020 Free Software Foundation, Inc
-
-;; Author: "Francis J. Wright" <F.J.Wright@qmul.ac.uk>
-;; Maintainer: emacs-devel@gnu.org
-;; Version: 1.12
-;; Package-Requires: ((emacs "24.1") (cl-lib "0.5"))
-;; Keywords: convenience
-
-;; This package 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, or (at your option)
-;; any later version.
-
-;; This package 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 <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package implements CSV mode, a major mode for editing records
-;; in a generalized CSV (character-separated values) format. It binds
-;; files with prefix ".csv" to `csv-mode' (and ".tsv" to `tsv-mode') in
-;; `auto-mode-alist'.
-
-;; In CSV mode, the following commands are available:
-
-;; - C-c C-s (`csv-sort-fields') and C-c C-n (`csv-sort-numeric-fields')
-;; respectively sort lexicographically and numerically on a
-;; specified field or column.
-
-;; - C-c C-r (`csv-reverse-region') reverses the order. (These
-;; commands are based closely on, and use, code in `sort.el'.)
-
-;; - C-c C-k (`csv-kill-fields') and C-c C-y (`csv-yank-fields') kill
-;; and yank fields or columns, although they do not use the normal
-;; kill ring. C-c C-k can kill more than one field at once, but
-;; multiple killed fields can be yanked only as a fixed group
-;; equivalent to a single field.
-
-;; - `csv-align-mode' keeps fields visually aligned, on-the-fly.
-;; It truncates fields to a maximum width that can be changed per-column
-;; with `csv-align-set-column-width'.
-;; Alternatively, C-c C-a (`csv-align-fields') aligns fields into columns
-;; and C-c C-u (`csv-unalign-fields') undoes such alignment;
-;; separators can be hidden within aligned records (controlled by
-;; `csv-invisibility-default' and `csv-toggle-invisibility').
-
-;; - C-c C-t (`csv-transpose') interchanges rows and columns. For
-;; details, see the documentation for the individual commands.
-
-;; CSV mode can recognize fields separated by any of several single
-;; characters, specified by the value of the customizable user option
-;; `csv-separators'. CSV data fields can be delimited by quote
-;; characters (and must if they contain separator characters). This
-;; implementation supports quoted fields, where the quote characters
-;; allowed are specified by the value of the customizable user option
-;; `csv-field-quotes'. By default, the both commas and tabs are considered
-;; as separators and the only field quote is a double quote.
-;; These user options can be changed ONLY by customizing them, e.g. via M-x
-;; customize-variable.
-
-;; CSV mode commands ignore blank lines and comment lines beginning
-;; with the value of the buffer local variable `csv-comment-start',
-;; which by default is #. The user interface is similar to that of
-;; the standard commands `sort-fields' and `sort-numeric-fields', but
-;; see the major mode documentation below.
-
-;; The global minor mode `csv-field-index-mode' provides display of
-;; the current field index in the mode line, cf. `line-number-mode'
-;; and `column-number-mode'. It is on by default.
-
-;;; Installation:
-
-;; Put this file somewhere that Emacs can find it (i.e. in one of the
-;; directories in your `load-path' such as `site-lisp'), optionally
-;; byte-compile it (recommended), and put this in your .emacs file:
-;;
-;; (add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
-;; (autoload 'csv-mode "csv-mode"
-;; "Major mode for editing comma-separated value files." t)
-
-;;; History:
-
-;; Begun on 15 November 2003 to provide lexicographic sorting of
-;; simple CSV data by field and released as csv.el. Facilities to
-;; kill multiple fields and customize separator added on 9 April 2004.
-;; Converted to a major mode and renamed csv-mode.el on 10 April 2004,
-;; partly at the suggestion of Stefan Monnier <monnier at
-;; IRO.UMontreal.CA> to avoid conflict with csv.el by Ulf Jasper.
-;; Field alignment, comment support and CSV mode customization group
-;; added on 1 May 2004. Support for index ranges added on 6 June
-;; 2004. Multiple field separators added on 12 June 2004.
-;; Transposition added on 22 June 2004. Separator invisibility added
-;; on 23 June 2004.
-
-;;; See also:
-
-;; the standard GNU Emacs 21 packages align.el, which will align
-;; columns within a region, and delim-col.el, which helps to prettify
-;; columns in a text region or rectangle;
-
-;; csv.el by Ulf Jasper <ulf.jasper at web.de>, which provides
-;; functions for reading/parsing comma-separated value files and is
-;; available at http://de.geocities.com/ulf_jasper/emacs.html (and in
-;; the gnu.emacs.sources archives).
-
-;;; To do (maybe):
-
-;; Make separators and quotes buffer-local and locally settable.
-;; Support (La)TeX tables: set separator and comment; support record
-;; end string.
-;; Convert comma-separated to space- or tab-separated.
-
-;;; Code:
-
-(eval-when-compile (require 'cl-lib))
-
-(defgroup CSV nil
- "Major mode for editing files of comma-separated value type."
- :group 'convenience)
-
-(defvar csv-separator-chars nil
- "Field separators as a list of character.
-Set by customizing `csv-separators' -- do not set directly!")
-
-(defvar csv-separator-regexp nil
- "Regexp to match a field separator.
-Set by customizing `csv-separators' -- do not set directly!")
-
-(defvar csv--skip-chars nil
- "Char set used by `skip-chars-forward' etc. to skip fields.
-Set by customizing `csv-separators' -- do not set directly!")
-
-(defvar csv-font-lock-keywords nil
- "Font lock keywords to highlight the field separators in CSV mode.
-Set by customizing `csv-separators' -- do not set directly!")
-
-(defcustom csv-separators '("," "\t")
- "Field separators: a list of *single-character* strings.
-For example: (\",\"), the default, or (\",\" \";\" \":\").
-Neighbouring fields may be separated by any one of these characters.
-The first is used when inserting a field separator into the buffer.
-All must be different from the field quote characters, `csv-field-quotes'."
- ;; Suggested by Eckhard Neber <neber@mwt.e-technik.uni-ulm.de>
- :type '(repeat string)
- ;; FIXME: Character would be better, but in Emacs 21.3 does not display
- ;; correctly in a customization buffer.
- :set (lambda (variable value)
- (mapc (lambda (x)
- (if (/= (length x) 1)
- (error "Non-single-char string %S" x))
- (if (and (boundp 'csv-field-quotes)
- (member x csv-field-quotes))
- (error "%S is already a quote" x)))
- value)
- (custom-set-default variable value)
- (setq csv-separator-chars (mapcar #'string-to-char value)
- csv--skip-chars (apply #'concat "^\n" csv-separators)
- csv-separator-regexp (apply #'concat `("[" ,@value "]"))
- csv-font-lock-keywords
- ;; NB: csv-separator-face variable evaluates to itself.
- `((,csv-separator-regexp (0 'csv-separator-face))))))
-
-(defcustom csv-field-quotes '("\"")
- "Field quotes: a list of *single-character* strings.
-For example: (\"\\\"\"), the default, or (\"\\\"\" \"\\='\" \"\\=`\").
-A field can be delimited by a pair of any of these characters.
-All must be different from the field separators, `csv-separators'."
- :type '(repeat string)
- ;; Character would be better, but in Emacs 21 does not display
- ;; correctly in a customization buffer.
- :set (lambda (variable value)
- (mapc (lambda (x)
- (if (/= (length x) 1)
- (error "Non-single-char string %S" x))
- (if (member x csv-separators)
- (error "%S is already a separator" x)))
- value)
- (when (boundp 'csv-mode-syntax-table)
- ;; FIRST remove old quote syntax:
- (with-syntax-table text-mode-syntax-table
- (mapc (lambda (x)
- (modify-syntax-entry
- (string-to-char x)
- (string (char-syntax (string-to-char x)))
- ;; symbol-value to avoid compiler warning:
- (symbol-value 'csv-mode-syntax-table)))
- csv-field-quotes))
- ;; THEN set new quote syntax:
- (csv-set-quote-syntax value))
- ;; BEFORE setting new value of `csv-field-quotes':
- (custom-set-default variable value)))
-
-(defun csv-set-quote-syntax (field-quotes)
- "Set syntax for field quote characters FIELD-QUOTES to be \"string\".
-FIELD-QUOTES should be a list of single-character strings."
- (mapc (lambda (x)
- (modify-syntax-entry
- (string-to-char x) "\""
- ;; symbol-value to avoid compiler warning:
- (symbol-value 'csv-mode-syntax-table)))
- field-quotes))
-
-(defvar csv-comment-start nil
- "String that starts a comment line, or nil if no comment syntax.
-Such comment lines are ignored by CSV mode commands.
-This variable is buffer local\; its default value is that of
-`csv-comment-start-default'. It is set by the function
-`csv-set-comment-start' -- do not set it directly!")
-
-(make-variable-buffer-local 'csv-comment-start)
-
-(defcustom csv-comment-start-default "#"
- "String that starts a comment line, or nil if no comment syntax.
-Such comment lines are ignored by CSV mode commands.
-Default value of buffer-local variable `csv-comment-start'.
-Changing this variable does not affect any existing CSV mode buffer."
- :type '(choice (const :tag "None" nil) string)
- :set (lambda (variable value)
- (custom-set-default variable value)
- (setq-default csv-comment-start value)))
-
-(defcustom csv-align-style 'left
- "Aligned field style: one of `left', `centre', `right' or `auto'.
-Alignment style used by `csv-align-mode' and `csv-align-fields'.
-Auto-alignment means left align text and right align numbers."
- :type '(choice (const left) (const centre)
- (const right) (const auto)))
-
-(defcustom csv-align-padding 1
- "Aligned field spacing: must be a positive integer.
-Number of spaces used by `csv-align-mode' and `csv-align-fields' after separators."
- :type 'integer)
-
-(defcustom csv-header-lines 0
- "Header lines to skip when setting region automatically."
- :type 'integer)
-
-(defcustom csv-invisibility-default t
- "If non-nil, make separators in aligned records invisible."
- :type 'boolean)
-
-(defface csv-separator-face
- '((t :inherit escape-glyph))
- "CSV mode face used to highlight separators.")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Mode definition, key bindings and menu
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
-(defconst csv-mode-line-format
- '(csv-field-index-string ("" csv-field-index-string))
- "Mode line format string for CSV mode.")
-
-(defvar csv-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [(control ?c) (control ?v)] 'csv-toggle-invisibility)
- (define-key map [(control ?c) (control ?t)] 'csv-transpose)
- (define-key map [(control ?c) (control ?c)] 'csv-set-comment-start)
- (define-key map [(control ?c) (control ?u)] 'csv-unalign-fields)
- (define-key map [(control ?c) (control ?a)] 'csv-align-fields)
- (define-key map [(control ?c) (control ?z)] 'csv-yank-as-new-table)
- (define-key map [(control ?c) (control ?y)] 'csv-yank-fields)
- (define-key map [(control ?c) (control ?k)] 'csv-kill-fields)
- (define-key map [(control ?c) (control ?d)] 'csv-toggle-descending)
- (define-key map [(control ?c) (control ?r)] 'csv-reverse-region)
- (define-key map [(control ?c) (control ?n)] 'csv-sort-numeric-fields)
- (define-key map [(control ?c) (control ?s)] 'csv-sort-fields)
- (define-key map "\t" #'csv-tab-command)
- (define-key map [backtab] #'csv-backtab-command)
- map))
-
-;;;###autoload
-(define-derived-mode csv-mode text-mode "CSV"
- "Major mode for editing files of comma-separated value type.
-
-CSV mode is derived from `text-mode', and runs `text-mode-hook' before
-running `csv-mode-hook'. It turns `auto-fill-mode' off by default.
-CSV mode can be customized by user options in the CSV customization
-group. The separators are specified by the value of `csv-separators'.
-
-CSV mode commands ignore blank lines and comment lines beginning with
-the value of `csv-comment-start', which delimit \"paragraphs\".
-\"Sexp\" is re-interpreted to mean \"field\", so that `forward-sexp'
-\(\\[forward-sexp]), `kill-sexp' (\\[kill-sexp]), etc. all apply to fields.
-Standard comment commands apply, such as `comment-dwim' (\\[comment-dwim]).
-
-If `font-lock-mode' is enabled then separators, quoted values and
-comment lines are highlighted using respectively `csv-separator-face',
-`font-lock-string-face' and `font-lock-comment-face'.
-
-The user interface (UI) for CSV mode commands is similar to that of
-the standard commands `sort-fields' and `sort-numeric-fields', except
-that if there is no prefix argument then the UI prompts for the field
-index or indices. In `transient-mark-mode' only: if the region is not
-set then the UI attempts to set it to include all consecutive CSV
-records around point, and prompts for confirmation; if there is no
-prefix argument then the UI prompts for it, offering as a default the
-index of the field containing point if the region was not set
-explicitly. The region set automatically is delimited by blank lines
-and comment lines, and the number of header lines at the beginning of
-the region given by the value of `csv-header-lines' are skipped.
-
-Sort order is controlled by `csv-descending'.
-
-CSV mode provides the following specific keyboard key bindings:
-
-\\{csv-mode-map}"
- :group 'CSV
- ;; We used to `turn-off-auto-fill' here instead, but that's not very
- ;; effective since text-mode-hook is run afterwards anyway!
- (setq-local normal-auto-fill-function nil)
- ;; Set syntax for field quotes:
- (csv-set-quote-syntax csv-field-quotes)
- ;; Make sexp functions apply to fields:
- (set (make-local-variable 'forward-sexp-function) #'csv-forward-field)
- (csv-set-comment-start csv-comment-start)
- ;; Font locking -- separator plus syntactic:
- (setq font-lock-defaults '(csv-font-lock-keywords))
- (setq-local jit-lock-contextually nil) ;Each line should be independent.
- (if csv-invisibility-default (add-to-invisibility-spec 'csv))
- ;; Mode line to support `csv-field-index-mode':
- (set (make-local-variable 'mode-line-position)
- (pcase mode-line-position
- (`(,(or (pred consp) (pred stringp)) . ,_)
- `(,@mode-line-position ,csv-mode-line-format))
- (_ `("" ,mode-line-position ,csv-mode-line-format))))
- (set (make-local-variable 'truncate-lines) t)
- ;; Enable or disable `csv-field-index-mode' (could probably do this
- ;; a bit more efficiently):
- (csv-field-index-mode (symbol-value 'csv-field-index-mode)))
-
-(defun csv-set-comment-start (string)
- "Set comment start for this CSV mode buffer to STRING.
-It must be either a string or nil."
- (interactive
- (list (edit-and-eval-command
- "Comment start (string or nil): " csv-comment-start)))
- ;; Paragraph means a group of contiguous records:
- (set (make-local-variable 'paragraph-separate) "[:space:]*$") ; White space.
- (set (make-local-variable 'paragraph-start) "\n");Must include \n explicitly!
- ;; Remove old comment-start/end if available
- (with-syntax-table text-mode-syntax-table
- (when comment-start
- (modify-syntax-entry (string-to-char comment-start)
- (string (char-syntax (string-to-char comment-start)))
- csv-mode-syntax-table))
- (modify-syntax-entry ?\n
- (string (char-syntax ?\n))
- csv-mode-syntax-table))
- (when string
- (setq paragraph-separate (concat paragraph-separate "\\|" string)
- paragraph-start (concat paragraph-start "\\|" string))
- (set (make-local-variable 'comment-start) string)
- (modify-syntax-entry
- (string-to-char string) "<" csv-mode-syntax-table)
- (modify-syntax-entry ?\n ">" csv-mode-syntax-table))
- (setq csv-comment-start string))
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
-
-(defvar csv-descending nil
- "If non-nil, CSV mode sort functions sort in order of descending sort key.
-Usually they sort in order of ascending sort key.")
-
-(defun csv-toggle-descending ()
- "Toggle `csv-descending'."
- (interactive)
- (setq csv-descending (not csv-descending))
- (message "Sort order is %sscending" (if csv-descending "de" "a")))
-
-(defun csv-toggle-invisibility ()
- ;; FIXME: Make it into a proper minor mode?
- "Toggle `buffer-invisibility-spec'."
- (interactive)
- (if (memq 'csv buffer-invisibility-spec)
- (remove-from-invisibility-spec 'csv)
- (add-to-invisibility-spec 'csv))
- (message "Separators in aligned records will be %svisible \
-\(after re-aligning if soft\)"
- (if (memq 'csv buffer-invisibility-spec) "in" ""))
- (redraw-frame (selected-frame)))
-
-(easy-menu-define
- csv-menu
- csv-mode-map
- "CSV major mode menu keymap"
- '("CSV"
- ["Sort By Field Lexicographically" csv-sort-fields :active t
- :help "Sort lines in region lexicographically by the specified field"]
- ["Sort By Field Numerically" csv-sort-numeric-fields :active t
- :help "Sort lines in region numerically by the specified field"]
- ["Reverse Order of Lines" csv-reverse-region :active t
- :help "Reverse the order of the lines in the region"]
- ["Use Descending Sort Order" csv-toggle-descending :active t
- :style toggle :selected csv-descending
- :help "If selected, use descending order when sorting"]
- "--"
- ["Kill Fields (Columns)" csv-kill-fields :active t
- :help "Kill specified fields of each line in the region"]
- ["Yank Fields (Columns)" csv-yank-fields :active t
- :help "Yank killed fields as specified field of each line in region"]
- ["Yank As New Table" csv-yank-as-new-table :active t
- :help "Yank killed fields as a new table at point"]
- ["Align Fields into Columns" csv-align-fields :active t
- :help "Align the start of every field of each line in the region"]
- ["Unalign Columns into Fields" csv-unalign-fields :active t
- :help "Undo soft alignment and optionally remove redundant white space"]
- ["Transpose Rows and Columns" csv-transpose :active t
- :help "Rewrite rows (which may have different lengths) as columns"]
- "--"
- ["Forward Field" forward-sexp :active t
- :help "Move forward across one field; with ARG, do it that many times"]
- ["Backward Field" backward-sexp :active t
- :help "Move backward across one field; with ARG, do it that many times"]
- ["Kill Field Forward" kill-sexp :active t
- :help "Kill field following cursor; with ARG, do it that many times"]
- ["Kill Field Backward" backward-kill-sexp :active t
- :help "Kill field preceding cursor; with ARG, do it that many times"]
- "--"
- ("Alignment Style"
- ["Left" (setq csv-align-style 'left) :active t
- :style radio :selected (eq csv-align-style 'left)
- :help "If selected, `csv-align' left aligns fields"]
- ["Centre" (setq csv-align-style 'centre) :active t
- :style radio :selected (eq csv-align-style 'centre)
- :help "If selected, `csv-align' centres fields"]
- ["Right" (setq csv-align-style 'right) :active t
- :style radio :selected (eq csv-align-style 'right)
- :help "If selected, `csv-align' right aligns fields"]
- ["Auto" (setq csv-align-style 'auto) :active t
- :style radio :selected (eq csv-align-style 'auto)
- :help "\
-If selected, `csv-align' left aligns text and right aligns numbers"]
- )
- ["Set header line" csv-header-line :active t]
- ["Auto-(re)align fields" csv-align-mode
- :style toggle :selected csv-align-mode]
- ["Show Current Field Index" csv-field-index-mode :active t
- :style toggle :selected csv-field-index-mode
- :help "If selected, display current field index in mode line"]
- ["Make Separators Invisible" csv-toggle-invisibility :active t
- :style toggle :selected (memq 'csv buffer-invisibility-spec)
- :visible (not (tsv--mode-p))
- :help "If selected, separators in aligned records are invisible"]
- ["Set Buffer's Comment Start" csv-set-comment-start :active t
- :help "Set comment start string for this buffer"]
- ["Customize CSV Mode" (customize-group 'CSV) :active t
- :help "Open a customization buffer to change CSV mode options"]
- ))
-
-(require 'sort)
-
-(defsubst csv-not-looking-at-record ()
- "Return t if looking at blank or comment line, nil otherwise.
-Assumes point is at beginning of line."
- (looking-at paragraph-separate))
-
-(defun csv-interactive-args (&optional type)
- "Get arg or field(s) and region interactively, offering sensible defaults.
-Signal an error if the buffer is read-only.
-If TYPE is noarg then return a list (beg end).
-Otherwise, return a list (arg beg end), where arg is:
- the raw prefix argument by default\;
- a single field index if TYPE is single\;
- a list of field indices or index ranges if TYPE is multiple.
-Field defaults to the current prefix arg\; if not set, prompt user.
-
-A field index list consists of positive or negative integers or ranges,
-separated by any non-integer characters. A range has the form m-n,
-where m and n are positive or negative integers, m < n, and n defaults
-to the last field index if omitted.
-
-In transient mark mode, if the mark is not active then automatically
-select and highlight CSV records around point, and query user.
-The default field when read interactively is the current field."
- ;; Must be run interactively to activate mark!
- (let* ((arg current-prefix-arg) (default-field 1)
- (region
- (if (not (use-region-p))
- ;; Set region automatically:
- (save-excursion
- (if arg
- (beginning-of-line)
- (let ((lbp (line-beginning-position)))
- (while (re-search-backward csv-separator-regexp lbp 1)
- ;; Move as far as possible, i.e. to beginning of line.
- (setq default-field (1+ default-field)))))
- (if (csv-not-looking-at-record)
- (error "Point must be within CSV records"))
- (let ((startline (point)))
- ;; Set mark at beginning of region:
- (while (not (or (bobp) (csv-not-looking-at-record)))
- (forward-line -1))
- (if (csv-not-looking-at-record) (forward-line 1))
- ;; Skip header lines:
- (forward-line csv-header-lines)
- (set-mark (point)) ; OK since in save-excursion
- ;; Move point to end of region:
- (goto-char startline)
- (beginning-of-line)
- (while (not (or (eobp) (csv-not-looking-at-record)))
- (forward-line 1))
- ;; Show mark briefly if necessary:
- (unless (and (pos-visible-in-window-p)
- (pos-visible-in-window-p (mark)))
- (exchange-point-and-mark)
- (sit-for 1)
- (exchange-point-and-mark))
- (or (y-or-n-p "Region OK? ")
- (error "Action aborted by user"))
- (message nil) ; clear y-or-n-p message
- (list (region-beginning) (region-end))))
- ;; Use region set by user:
- (list (region-beginning) (region-end)))))
- (setq default-field (number-to-string default-field))
- (cond
- ((eq type 'multiple)
- (if arg
- ;; Ensure that field is a list:
- (or (consp arg)
- (setq arg (list (prefix-numeric-value arg))))
- ;; Read field interactively, ignoring non-integers:
- (setq arg
- (mapcar
- (lambda (x)
- (if (string-match "-" x 1) ; not first character
- ;; Return a range as a pair - the cdr may be nil:
- (let ((m (substring x 0 (match-beginning 0)))
- (n (substring x (match-end 0))))
- (cons (car (read-from-string m))
- (and (not (string= n ""))
- (car (read-from-string n)))))
- ;; Return a number as a number:
- (car (read-from-string x))))
- (split-string
- (read-string
- "Fields (sequence of integers or ranges): " default-field)
- "[^-+0-9]+")))))
- ((eq type 'single)
- (if arg
- (setq arg (prefix-numeric-value arg))
- (while (not (integerp arg))
- (setq arg (eval-minibuffer "Field (integer): " default-field))))))
- (if (eq type 'noarg) region (cons arg region))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Sorting by field
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun csv-nextrecfun ()
- "Called by `csv-sort-fields-1' with point at end of previous record.
-It moves point to the start of the next record.
-It should move point to the end of the buffer if there are no more records."
- (forward-line)
- (while (and (not (eobp)) (csv-not-looking-at-record))
- (forward-line)))
-
-(defun csv-sort-fields-1 (field beg end startkeyfun endkeyfun)
- "Modified version of `sort-fields-1' that skips blank or comment lines.
-
-FIELD is a single field index, and BEG and END specify the region to
-sort.
-
-STARTKEYFUN moves from the start of the record to the start of the key.
-It may return either a non-nil value to be used as the key, or
-else the key is the substring between the values of point after
-STARTKEYFUN and ENDKEYFUN are called. If STARTKEYFUN is nil, the key
-starts at the beginning of the record.
-
-ENDKEYFUN moves from the start of the sort key to the end of the sort key.
-ENDKEYFUN may be nil if STARTKEYFUN returns a value or if it would be the
-same as ENDRECFUN."
- (let ((tbl (syntax-table)))
- (if (zerop field) (setq field 1))
- (unwind-protect
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (set-syntax-table sort-fields-syntax-table)
- (sort-subr csv-descending
- 'csv-nextrecfun 'end-of-line
- startkeyfun endkeyfun)))
- (set-syntax-table tbl))))
-
-(defun csv-sort-fields (field beg end)
- "Sort lines in region lexicographically by the ARGth field of each line.
-If not set, the region defaults to the CSV records around point.
-Fields are separated by `csv-separators' and null fields are allowed anywhere.
-Field indices increase from 1 on the left or decrease from -1 on the right.
-A prefix argument specifies a single field, otherwise prompt for field index.
-Ignore blank and comment lines. The variable `sort-fold-case'
-determines whether alphabetic case affects the sort order.
-When called non-interactively, FIELD is a single field index\;
-BEG and END specify the region to sort."
- ;; (interactive "*P\nr")
- (interactive (csv-interactive-args 'single))
- (barf-if-buffer-read-only)
- (csv-sort-fields-1 field beg end
- (lambda () (csv-sort-skip-fields field) nil)
- (lambda () (skip-chars-forward csv--skip-chars))))
-
-(defun csv-sort-numeric-fields (field beg end)
- "Sort lines in region numerically by the ARGth field of each line.
-If not set, the region defaults to the CSV records around point.
-Fields are separated by `csv-separators'.
-Null fields are allowed anywhere and sort as zeros.
-Field indices increase from 1 on the left or decrease from -1 on the right.
-A prefix argument specifies a single field, otherwise prompt for field index.
-Specified non-null field must contain a number in each line of the region,
-which may begin with \"0x\" or \"0\" for hexadecimal and octal values.
-Otherwise, the number is interpreted according to sort-numeric-base.
-Ignore blank and comment lines.
-When called non-interactively, FIELD is a single field index\;
-BEG and END specify the region to sort."
- ;; (interactive "*P\nr")
- (interactive (csv-interactive-args 'single))
- (barf-if-buffer-read-only)
- (csv-sort-fields-1 field beg end
- (lambda ()
- (csv-sort-skip-fields field)
- (let* ((case-fold-search t)
- (base
- (if (looking-at "\\(0x\\)[0-9a-f]\\|\\(0\\)[0-7]")
- (cond ((match-beginning 1)
- (goto-char (match-end 1))
- 16)
- ((match-beginning 2)
- (goto-char (match-end 2))
- 8)
- (t nil)))))
- (string-to-number (buffer-substring (point)
- (save-excursion
- (forward-sexp 1)
- (point)))
- (or base sort-numeric-base))))
- nil))
-
-(defun csv-reverse-region (beg end)
- "Reverse the order of the lines in the region.
-This is just a CSV-mode style interface to `reverse-region', which is
-the function that should be used non-interactively. It takes two
-point or marker arguments, BEG and END, delimiting the region."
- ;; (interactive "*P\nr")
- (interactive (csv-interactive-args 'noarg))
- (barf-if-buffer-read-only)
- (reverse-region beg end))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Moving by field
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun csv-end-of-field ()
- "Skip forward over one field."
- (skip-chars-forward " ")
- (if (eq (char-syntax (following-char)) ?\")
- (goto-char (scan-sexps (point) 1)))
- (skip-chars-forward csv--skip-chars))
-
-(defun csv-beginning-of-field ()
- "Skip backward over one field."
- (skip-syntax-backward " ")
- (if (eq (char-syntax (preceding-char)) ?\")
- (goto-char (scan-sexps (point) -1)))
- (skip-chars-backward csv--skip-chars))
-
-(defun csv-forward-field (arg)
- "Move forward across one field, cf. `forward-sexp'.
-With ARG, do it that many times. Negative arg -N means
-move backward across N fields."
- (interactive "p")
- (if (< arg 0)
- (csv-backward-field (- arg))
- (while (>= (setq arg (1- arg)) 0)
- (if (or (bolp)
- (when (and (not (eobp)) (eolp)) (forward-char) t))
- (while (and (not (eobp)) (csv-not-looking-at-record))
- (forward-line 1)))
- (if (memq (following-char) csv-separator-chars) (forward-char))
- (csv-end-of-field))))
-
-(defun csv-backward-field (arg)
- "Move backward across one field, cf. `backward-sexp'.
-With ARG, do it that many times. Negative arg -N means
-move forward across N fields."
- (interactive "p")
- (if (< arg 0)
- (csv-forward-field (- arg))
- (while (>= (setq arg (1- arg)) 0)
- (when (or (eolp)
- (when (and (not (bobp)) (bolp)) (backward-char) t))
- (while (progn
- (beginning-of-line)
- (csv-not-looking-at-record))
- (backward-char))
- (end-of-line))
- (if (memq (preceding-char) csv-separator-chars) (backward-char))
- (csv-beginning-of-field))))
-
-(defun csv-tab-command ()
- "Skip to the next field on the same line.
-Create a new field at end of line, if needed."
- (interactive)
- (skip-chars-forward csv--skip-chars)
- (if (eolp)
- (insert (car csv-separators))
- (forward-char 1)))
-
-(defun csv-backtab-command ()
- "Skip to the beginning of the previous field."
- (interactive)
- (skip-chars-backward csv--skip-chars)
- (forward-char -1)
- (skip-chars-backward csv--skip-chars))
-
-(defun csv-sort-skip-fields (n &optional yank)
- "Position point at the beginning of field N on the current line.
-Fields are separated by `csv-separators'; null terminal field allowed.
-Assumes point is initially at the beginning of the line.
-YANK non-nil allows N to be greater than the number of fields, in
-which case extend the record as necessary."
- (if (> n 0)
- ;; Skip across N - 1 fields.
- (let ((i (1- n)))
- (while (> i 0)
- (csv-end-of-field)
- (if (eolp)
- (if yank
- (if (> i 1) (insert (car csv-separators)))
- (error "Line has too few fields: %s"
- (buffer-substring
- (save-excursion (beginning-of-line) (point))
- (save-excursion (end-of-line) (point)))))
- (forward-char)) ; skip separator
- (setq i (1- i))))
- (end-of-line)
- ;; Skip back across -N - 1 fields.
- (let ((i (1- (- n))))
- (while (> i 0)
- (csv-beginning-of-field)
- (if (bolp)
- (error "Line has too few fields: %s"
- (buffer-substring
- (save-excursion (beginning-of-line) (point))
- (save-excursion (end-of-line) (point)))))
- (backward-char) ; skip separator
- (setq i (1- i)))
- ;; Position at the front of the field
- ;; even if moving backwards.
- (csv-beginning-of-field))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Field index mode
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; Based partly on paren.el
-
-(defcustom csv-field-index-delay 0.125
- "Time in seconds to delay before updating field index display."
- :type '(number :tag "seconds"))
-
-(defvar csv-field-index-idle-timer nil)
-
-(defvar csv-field-index-string nil)
-(make-variable-buffer-local 'csv-field-index-string)
-
-(defvar csv-field-index-old nil)
-(make-variable-buffer-local 'csv-field-index-old)
-
-(define-minor-mode csv-field-index-mode
- "Toggle CSV-Field-Index mode.
-With prefix ARG, turn CSV-Field-Index mode on if and only if ARG is positive.
-Returns the new status of CSV-Field-Index mode (non-nil means on).
-When CSV-Field-Index mode is enabled, the current field index appears in
-the mode line after `csv-field-index-delay' seconds of Emacs idle time."
- :global t
- :init-value t ; for documentation, since default is t
- ;; This macro generates a function that first sets the mode
- ;; variable, then runs the following code, runs the mode hooks,
- ;; displays a message if interactive, updates the mode line and
- ;; finally returns the variable value.
-
- ;; First, always disable the mechanism (to avoid having two timers):
- (when csv-field-index-idle-timer
- (cancel-timer csv-field-index-idle-timer)
- (setq csv-field-index-idle-timer nil))
- ;; Now, if the mode is on and any buffer is in CSV mode then
- ;; re-initialize and enable the mechanism by setting up a new timer:
- (if csv-field-index-mode
- (if (memq t (mapcar (lambda (buffer)
- (with-current-buffer buffer
- (when (derived-mode-p 'csv-mode)
- (setq csv-field-index-string nil
- csv-field-index-old nil)
- t)))
- (buffer-list)))
- (setq csv-field-index-idle-timer
- (run-with-idle-timer csv-field-index-delay t
- #'csv-field-index)))
- ;; but if the mode is off then remove the display from the mode
- ;; lines of all CSV buffers:
- (mapc (lambda (buffer)
- (with-current-buffer buffer
- (when (derived-mode-p 'csv-mode)
- (setq csv-field-index-string nil
- csv-field-index-old nil)
- (force-mode-line-update))))
- (buffer-list))))
-
-(defun csv--field-index ()
- (save-excursion
- (let ((lbp (line-beginning-position)) (field 1))
- (while (re-search-backward csv-separator-regexp lbp 'move)
- ;; Move as far as possible, i.e. to beginning of line.
- (setq field (1+ field)))
- (unless (csv-not-looking-at-record) field))))
-
-(defun csv-field-index ()
- "Construct `csv-field-index-string' to display in mode line.
-Called by `csv-field-index-idle-timer'."
- (if (derived-mode-p 'csv-mode)
- (let ((field (csv--field-index)))
- (when (not (eq field csv-field-index-old))
- (setq csv-field-index-old field
- csv-field-index-string
- (and field (format "F%d" field)))
- (force-mode-line-update)))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Killing and yanking fields
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar csv-killed-fields nil
- "A list of the fields or sub-records last killed by `csv-kill-fields'.")
-
-(defun csv-kill-fields (fields beg end)
- "Kill specified fields of each line in the region.
-If not set, the region defaults to the CSV records around point.
-Fields are separated by `csv-separators' and null fields are allowed anywhere.
-Field indices increase from 1 on the left or decrease from -1 on the right.
-The fields are stored for use by `csv-yank-fields'. Fields can be
-specified in any order but are saved in increasing index order.
-Ignore blank and comment lines.
-
-When called interactively, a prefix argument specifies a single field,
-otherwise prompt for a field list, which may include ranges in the form
-m-n, where m < n and n defaults to the last field index if omitted.
-
-When called non-interactively, FIELDS is a single field index or a
-list of field indices, with ranges specified as (m.n) or (m), and BEG
-and END specify the region to process."
- ;; (interactive "*P\nr")
- (interactive (csv-interactive-args 'multiple))
- (barf-if-buffer-read-only)
- ;; Kill the field(s):
- (setq csv-killed-fields nil)
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (if (or (cdr fields) (consp (car fields)))
- (csv-kill-many-columns fields)
- (csv-kill-one-column (car fields)))))
- (setq csv-killed-fields (nreverse csv-killed-fields)))
-
-(defun csv-kill-one-field (field)
- "Kill field with index FIELD in current line.
-Return killed text. Assumes point is at beginning of line."
- ;; Move to start of field to kill:
- (csv-sort-skip-fields field)
- ;; Kill to end of field (cf. `kill-region'):
- (prog1 (delete-and-extract-region
- (point)
- (progn (csv-end-of-field) (point)))
- (if (eolp)
- (unless (bolp) (delete-char -1)) ; Delete trailing separator at eol
- (delete-char 1)))) ; or following separator otherwise.
-
-(defun csv-kill-one-column (field)
- "Kill field with index FIELD in all lines in (narrowed) buffer.
-Save killed fields in `csv-killed-fields'.
-Assumes point is at `point-min'. Called by `csv-kill-fields'.
-Ignore blank and comment lines."
- (while (not (eobp))
- (or (csv-not-looking-at-record)
- (push (csv-kill-one-field field) csv-killed-fields))
- (forward-line)))
-
-(defun csv-kill-many-columns (fields)
- "Kill several fields in all lines in (narrowed) buffer.
-FIELDS is an unordered list of field indices.
-Save killed fields in increasing index order in `csv-killed-fields'.
-Assumes point is at `point-min'. Called by `csv-kill-fields'.
-Ignore blank and comment lines."
- (if (eolp) (error "First record is empty"))
- ;; Convert non-positive to positive field numbers:
- (let ((last 1) (f fields))
- (csv-end-of-field)
- (while (not (eolp))
- (forward-char) ; skip separator
- (csv-end-of-field)
- (setq last (1+ last))) ; last = # fields in first record
- (while f
- (cond ((consp (car f))
- ;; Expand a field range: (m.n) -> m m+1 ... n-1 n.
- ;; If n is nil then it defaults to the number of fields.
- (let* ((range (car f)) (cdrf (cdr f))
- (m (car range)) (n (cdr range)))
- (if (< m 0) (setq m (+ m last 1)))
- (if n
- (if (< n 0) (setq n (+ n last 1)))
- (setq n last))
- (setq range (list n))
- (while (> n m) (push (setq n (1- n)) range))
- (setcar f (car range))
- (setcdr f (cdr range))
- (setcdr (setq f (last range)) cdrf)))
- ((zerop (car f)) (setcar f 1))
- ((< (car f) 0) (setcar f (+ f last 1))))
- (setq f (cdr f))))
- (goto-char (point-min))
- ;; Kill from right to avoid miscounting:
- (setq fields (sort fields '>))
- (while (not (eobp))
- (or (csv-not-looking-at-record)
- (let ((fields fields) killed-fields field)
- (while fields
- (setq field (car fields)
- fields (cdr fields))
- (beginning-of-line)
- (push (csv-kill-one-field field) killed-fields))
- (push (mapconcat #'identity killed-fields (car csv-separators))
- csv-killed-fields)))
- (forward-line)))
-
-(defun csv-yank-fields (field beg end)
- "Yank fields as the ARGth field of each line in the region.
-ARG may be arbitrarily large and records are extended as necessary.
-If not set, the region defaults to the CSV records around point\;
-if point is not in a CSV record then offer to yank as a new table.
-The fields yanked are those last killed by `csv-kill-fields'.
-Fields are separated by `csv-separators' and null fields are allowed anywhere.
-Field indices increase from 1 on the left or decrease from -1 on the right.
-A prefix argument specifies a single field, otherwise prompt for field index.
-Ignore blank and comment lines. When called non-interactively, FIELD
-is a single field index\; BEG and END specify the region to process."
- ;; (interactive "*P\nr")
- (interactive (condition-case err
- (csv-interactive-args 'single)
- (error (list nil nil err))))
- (barf-if-buffer-read-only)
- (if (null beg)
- (if (y-or-n-p (concat (error-message-string end)
- ". Yank as a new table? "))
- (csv-yank-as-new-table)
- (error (error-message-string end)))
- (if (<= field 0) (setq field (1+ field)))
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (let ((fields csv-killed-fields))
- (while (not (eobp))
- (unless (csv-not-looking-at-record)
- ;; Yank at start of specified field if possible,
- ;; otherwise yank at end of record:
- (if (zerop field)
- (end-of-line)
- (csv-sort-skip-fields field 'yank))
- (and (eolp) (insert (car csv-separators)))
- (when fields
- (insert (car fields))
- (setq fields (cdr fields)))
- (or (eolp) (insert (car csv-separators))))
- (forward-line)))))))
-
-(defun csv-yank-as-new-table ()
- "Yank fields as a new table starting at point.
-The fields yanked are those last killed by `csv-kill-fields'."
- (interactive "*")
- (let ((fields csv-killed-fields))
- (while fields
- (insert (car fields) ?\n)
- (setq fields (cdr fields)))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Aligning fields
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun csv--make-overlay (beg end &optional buffer front-advance rear-advance props)
- (let ((o (make-overlay beg end buffer front-advance rear-advance)))
- (overlay-put o 'csv t)
- (while props
- (overlay-put o (pop props) (pop props)))
- o))
-
-(defun csv--delete-overlay (o)
- (and (overlay-get o 'csv) (delete-overlay o)))
-
-(defun csv--column-widths (beg end)
- "Return a list of two lists (COLUMN-WIDTHS FIELD-WIDTHS).
-COLUMN-WIDTHS is a list of elements (WIDTH START END)
-indicating the widths of the columns after point (and the position of the
-widest field that determined the overall width).
-FIELD-WIDTHS contains the widths of each individual field after
-point."
- (let ((column-widths '())
- (field-widths '()))
- (goto-char beg)
- ;; Construct list of column widths:
- (while (< (point) end) ; for each record...
- (or (csv-not-looking-at-record)
- (let ((w column-widths)
- (col (current-column))
- (beg (point))
- field-width)
- (while (not (eolp))
- (csv-end-of-field)
- (setq field-width (- (current-column) col))
- (push field-width field-widths)
- (if w
- (if (> field-width (caar w))
- (setcar w (list field-width beg (point))))
- (setq w (list (list field-width beg (point)))
- column-widths (nconc column-widths w)))
- (or (eolp) (forward-char)) ; Skip separator.
- (setq w (cdr w) col (current-column) beg (point)))))
- (forward-line))
- (list column-widths (nreverse field-widths))))
-
-(defun csv-align-fields (hard beg end)
- "Align all the fields in the region to form columns.
-The alignment style is specified by `csv-align-style'. The number of
-spaces specified by `csv-align-padding' appears after each separator.
-Use soft alignment done by displaying virtual white space after the
-separators unless invoked with an argument, in which case insert real
-space characters into the buffer after the separators.
-Unalign first (see `csv-unalign-fields'). Ignore blank and comment lines.
-
-In hard-aligned records, separators become invisible whenever
-`buffer-invisibility-spec' is non-nil. In soft-aligned records, make
-separators invisible if and only if `buffer-invisibility-spec' is
-non-nil when the records are aligned\; this can be changed only by
-re-aligning. \(Unaligning always makes separators visible.)
-
-When called non-interactively, use hard alignment if HARD is non-nil\;
-BEG and END specify the region to align.
-If there is no selected region, default to the whole buffer."
- (interactive (cons current-prefix-arg
- (if (use-region-p)
- (list (region-beginning) (region-end))
- (list (point-min) (point-max)))))
- ;; FIXME: Use csv--jit-align when applicable!
- (setq end (copy-marker end))
- (csv-unalign-fields hard beg end) ; If hard then barfs if buffer read only.
- (save-excursion
- (pcase-let ((`(,column-widths ,field-widths) (csv--column-widths beg end)))
- (save-restriction
- (narrow-to-region beg end)
- (set-marker end nil)
-
- ;; Align fields:
- (goto-char (point-min))
- (while (not (eobp)) ; for each record...
- (unless (csv-not-looking-at-record)
- (let ((w column-widths)
- (column 0)) ;Desired position of left-side of this column.
- (while (and w (not (eolp)))
- (let* ((beg (point))
- (align-padding (if (bolp) 0 csv-align-padding))
- (left-padding 0) (right-padding 0)
- (field-width (pop field-widths))
- (column-width (car (pop w)))
- (x (- column-width field-width))) ; Required padding.
- (csv-end-of-field)
- (set-marker end (point)) ; End of current field.
- ;; beg = beginning of current field
- ;; end = (point) = end of current field
-
- ;; Compute required padding:
- (cond
- ((eq csv-align-style 'left)
- ;; Left align -- pad on the right:
- (setq left-padding align-padding
- right-padding x))
- ((eq csv-align-style 'right)
- ;; Right align -- pad on the left:
- (setq left-padding (+ align-padding x)))
- ((eq csv-align-style 'auto)
- ;; Auto align -- left align text, right align numbers:
- (if (string-match "\\`[-+.[:digit:]]+\\'"
- (buffer-substring beg (point)))
- ;; Right align -- pad on the left:
- (setq left-padding (+ align-padding x))
- ;; Left align -- pad on the right:
- (setq left-padding align-padding
- right-padding x)))
- ((eq csv-align-style 'centre)
- ;; Centre -- pad on both left and right:
- (let ((y (/ x 2))) ; truncated integer quotient
- (setq left-padding (+ align-padding y)
- right-padding (- x y)))))
-
- (cond
- (hard ;; Hard alignment...
- (when (> left-padding 0) ; Pad on the left.
- ;; Insert spaces before field:
- (if (= beg end) ; null field
- (insert (make-string left-padding ?\ ))
- (goto-char beg) ; beginning of current field
- (insert (make-string left-padding ?\ ))
- (goto-char end))) ; end of current field
- (unless (eolp)
- (if (> right-padding 0) ; pad on the right
- ;; Insert spaces after field:
- (insert (make-string right-padding ?\ )))
- ;; Make separator (potentially) invisible;
- ;; in Emacs 21.3, neighbouring overlays
- ;; conflict, so use the following only
- ;; with hard alignment:
- (csv--make-overlay (point) (1+ (point)) nil t nil
- '(invisible csv evaporate t))
- (forward-char))) ; skip separator
-
- ;; Soft alignment...
- ((or (memq 'csv buffer-invisibility-spec)
- ;; For TSV, hidden or not doesn't make much difference,
- ;; but the behavior is slightly better when we "hide"
- ;; the TABs with a `display' property than if we add
- ;; before/after-strings.
- (tsv--mode-p))
-
- ;; Hide separators...
- ;; Merge right-padding from previous field
- ;; with left-padding from this field:
- (if (zerop column)
- (when (> left-padding 0)
- ;; Display spaces before first field
- ;; by overlaying first character:
- (csv--make-overlay
- beg (1+ beg) nil nil nil
- `(before-string ,(make-string left-padding ?\ ))))
- ;; Display separator as spaces:
- (with-silent-modifications
- (put-text-property
- (1- beg) beg
- 'display `(space :align-to
- ,(+ left-padding column)))))
- (unless (eolp) (forward-char)) ; Skip separator.
- (setq column (+ column column-width align-padding)))
-
- (t ;; Do not hide separators...
- (let ((overlay (csv--make-overlay beg (point) nil nil t)))
- (when (> left-padding 0) ; Pad on the left.
- ;; Display spaces before field:
- (overlay-put overlay 'before-string
- (make-string left-padding ?\ )))
- (unless (eolp)
- (if (> right-padding 0) ; Pad on the right.
- ;; Display spaces after field:
- (overlay-put
- overlay
- 'after-string (make-string right-padding ?\ )))
- (forward-char)))) ; Skip separator.
-
- )))))
- (forward-line)))))
- (set-marker end nil))
-
-(defun csv-unalign-fields (hard beg end)
- "Undo soft alignment and optionally remove redundant white space.
-Undo soft alignment introduced by `csv-align-fields'. If invoked with
-an argument then also remove all spaces and tabs around separators.
-Also make all invisible separators visible again.
-Ignore blank and comment lines. When called non-interactively, remove
-spaces and tabs if HARD non-nil\; BEG and END specify region to unalign.
-If there is no selected region, default to the whole buffer."
- (interactive (cons current-prefix-arg
- (if (use-region-p)
- (list (region-beginning) (region-end))
- (list (point-min) (point-max)))))
- ;; Remove any soft alignment:
- (mapc #'csv--delete-overlay (overlays-in beg end))
- (with-silent-modifications
- (remove-list-of-text-properties beg end '(display invisible)))
- (when hard
- (barf-if-buffer-read-only)
- ;; Remove any white-space padding around separators:
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (while (not (eobp))
- (or (csv-not-looking-at-record)
- (while (not (eolp))
- ;; Delete horizontal white space forward:
- ;; (delete-horizontal-space)
- ;; This relies on left-to-right argument evaluation;
- ;; see info node (elisp) Function Forms.
- (delete-region (point)
- (+ (point) (skip-chars-forward " \t")))
- (csv-end-of-field)
- ;; Delete horizontal white space backward:
- ;; (delete-horizontal-space t)
- (delete-region (point)
- (+ (point) (skip-chars-backward " \t")))
- (or (eolp) (forward-char))))
- (forward-line))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Transposing rows and columns
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun csv-transpose (beg end)
- "Rewrite rows (which may have different lengths) as columns.
-Null fields are introduced as necessary within records but are
-stripped from the ends of records. Preserve soft alignment.
-This function is its own inverse. Ignore blank and comment lines.
-When called non-interactively, BEG and END specify region to process."
- ;; (interactive "*P\nr")
- (interactive (csv-interactive-args 'noarg))
- (barf-if-buffer-read-only)
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- ;; Delete rows and collect them as a reversed list of lists of
- ;; fields, skipping comment and blank lines:
- (let ((sep (car csv-separators))
- (align (overlays-in beg end))
- rows columns)
- ;; Remove soft alignment if necessary:
- (when align
- (mapc #'csv--delete-overlay align)
- (setq align t))
- (while (not (eobp))
- (if (csv-not-looking-at-record)
- ;; Skip blank and comment lines:
- (forward-line)
- (let ((lep (line-end-position)))
- (push
- (split-string
- (buffer-substring-no-properties (point) lep)
- csv-separator-regexp)
- rows)
- (delete-region (point) lep)
- (or (eobp) (delete-char 1)))))
- ;; Rows must have monotonic decreasing lengths to be
- ;; transposable, so ensure this by padding with null fields.
- ;; rows is currently a reversed list of field lists, which
- ;; must therefore have monotonic increasing lengths.
- (let ((oldlen (length (car rows))) newlen
- (r (cdr rows)))
- (while r
- (setq newlen (length (car r)))
- (if (< newlen oldlen)
- (nconc (car r) (make-list (- oldlen newlen) nil))
- (setq oldlen newlen))
- (setq r (cdr r))))
- ;; Collect columns as a reversed list of lists of fields:
- (while rows
- (let (column (r rows) row)
- (while r
- (setq row (car r))
- ;; Provided it would not be a trailing null field, push
- ;; field onto column:
- (if (or column (string< "" (car row)))
- (push (car row) column))
- ;; Pop field off row:
- (setcar r (cdr row))
- ;; If row is now empty then remove it:
- (or (car r) (setq rows (cdr rows)))
- (setq r (cdr r)))
- (push column columns)))
- ;; Insert columns into buffer as rows:
- (setq columns (nreverse columns))
- (while columns
- (insert (mapconcat #'identity (car columns) sep) ?\n)
- (setq columns (cdr columns)))
- ;; Re-do soft alignment if necessary:
- (if align (csv-align-fields nil (point-min) (point-max)))))))
-
-(defvar-local csv--header-line nil)
-(defvar-local csv--header-hscroll nil)
-(defvar-local csv--header-string nil)
-
-(defun csv-header-line (&optional use-current-line)
- "Set/unset the header line.
-If the optional prefix arg USE-CURRENT-LINE is nil, use the first line
-as the header line.
-If there is already a header line, then unset the header line."
- (interactive "P")
- (if csv--header-line
- (progn
- (delete-overlay csv--header-line)
- (setq csv--header-line nil)
- (kill-local-variable 'header-line-format))
- (save-excursion
- (unless use-current-line (goto-char (point-min)))
- (setq csv--header-line (make-overlay (line-beginning-position)
- (line-end-position)
- nil nil t))
- (overlay-put csv--header-line 'modification-hooks
- '(csv--header-flush)))
- (csv--header-flush)
- (setq header-line-format
- '(:eval (csv--header-string)))))
-
-(defun csv--header-flush (&rest _)
- ;; Force re-computation of the header-line.
- (setq csv--header-hscroll nil))
-
-(defun csv--header-string ()
- ;; FIXME: Won't work with multiple windows showing that same buffer.
- (if (eql (window-hscroll) csv--header-hscroll)
- csv--header-string
- (setq csv--header-hscroll (window-hscroll))
- (setq csv--header-string
- (csv--compute-header-string))))
-
-(defun csv--compute-header-string ()
- (with-demoted-errors "csv--compute-header-string %S"
- (save-excursion
- (goto-char (overlay-start csv--header-line))
- ;; Re-set the line-end-position, just in case.
- (move-overlay csv--header-line (point) (line-end-position))
- (jit-lock-fontify-now (point) (line-end-position))
- ;; Not sure why it is sometimes nil!
- (move-to-column (or csv--header-hscroll 0))
- (let ((str (buffer-substring (point) (line-end-position)))
- (i 0))
- (while (and i (< i (length str)))
- (let ((prop (get-text-property i 'display str)))
- (and (eq (car-safe prop) 'space)
- (eq (car-safe (cdr prop)) :align-to)
- (let* ((x (nth 2 prop))
- (nexti (next-single-property-change i 'display str))
- (newprop
- `(space :align-to
- ,(if (numberp x)
- (- x (or csv--header-hscroll 0))
- `(- ,x csv--header-hscroll)))))
- (put-text-property i (or nexti (length str))
- 'display newprop str)
- (setq i nexti))))
- (setq i (next-single-property-change i 'display str)))
- (concat (propertize " " 'display '((space :align-to 0))) str)))))
-
-;;; Auto-alignment
-
-(defcustom csv-align-max-width 40
- "Maximum width of a column in `csv-align-mode'.
-This does not apply to the last column (for which the usual `truncate-lines'
-setting works better)."
- :type 'integer)
-
-(defvar-local csv--config-column-widths nil
- "Settings per column, stored as a list indexed by the column.")
-
-(defun csv-align--set-column (column value)
- (let ((len (length csv--config-column-widths)))
- (if (< len column)
- (setq csv--config-column-widths
- (nconc csv--config-column-widths (make-list (- column len) nil))))
- (setf (nth (1- column) csv--config-column-widths) value)))
-
-(defun csv-align-set-column-width (column width)
- "Set the max WIDTH to use for COLUMN."
- (interactive
- (let* ((field (or (csv--field-index) 1))
- (curwidth (nth (1- field) csv--config-column-widths)))
- (list field
- (cond
- ((numberp current-prefix-arg)
- current-prefix-arg)
- (current-prefix-arg
- (read-number (format "Column width (for field %d): " field)
- curwidth))
- (t (if curwidth nil (csv--ellipsis-width)))))))
- (when (eql width csv-align-max-width)
- (setq width nil))
- (csv-align--set-column column width)
- (jit-lock-refontify))
-
-(defvar-local csv--jit-columns nil)
-
-(defun csv--jit-merge-columns (column-widths)
- ;; FIXME: The incremental update (delayed by jit-lock-context-time) of column
- ;; width is a bit jarring at times. It's OK while scrolling or when
- ;; extending a column, but not right when enabling the csv-align-mode or
- ;; when shortening the longest field (or deleting the line containing it),
- ;; because in that case we have *several* cascaded updates, e.g.:
- ;; - Remove the line with the longest field of column N.
- ;; - Edit some line: this line is updated as if its field was the widest,
- ;; hence its subsequent fields are too much to the left.
- ;; - The rest is updated starting from the first few lines (according
- ;; to jit-lock-chunk-size).
- ;; - After the first few lines, come the next set of few lines,
- ;; which may cause the previous few lines to need refresh again.
- ;; - etc.. until arriving again at the edited line which is re-aligned
- ;; again.
- ;; - etc.. until the end of the windows, potentially causing yet more
- ;; refreshes as we discover yet-wider fields for this column.
- (let ((old-columns csv--jit-columns)
- (changed nil))
- (while (and old-columns column-widths)
- (when (or (> (caar column-widths) (caar old-columns))
- ;; Apparently modification-hooks aren't run when the
- ;; whole text containing the overlay is deleted (e.g.
- ;; the whole line), so detect this case here.
- ;; It's a bit too late, but better than never.
- (null (overlay-buffer (cdar old-columns))))
- (setq changed t) ;; Return non-nil if some existing column changed.
- (pcase-let ((`(,width ,beg ,end) (car column-widths)))
- (setf (caar old-columns) width)
- (move-overlay (cdar old-columns) beg end)))
- (setq old-columns (cdr old-columns))
- (setq column-widths (cdr column-widths)))
- (when column-widths
- ;; New columns appeared.
- (setq csv--jit-columns
- (nconc csv--jit-columns
- (mapcar (lambda (x)
- (pcase-let*
- ((`(,width ,beg ,end) x)
- (ol (make-overlay beg end)))
- (overlay-put ol 'csv-width t)
- (overlay-put ol 'evaporate t)
- (overlay-put ol 'modification-hooks
- (list #'csv--jit-width-change))
- (cons width ol)))
- column-widths))))
- changed))
-
-(defun csv--jit-width-change (ol after _beg _end &optional len)
- (when (and after (> len 0))
- ;; (let ((x (rassq ol csv--jit-columns)))
- ;; (when x (setf (car x) -1)))
- (delete-overlay ol)))
-
-(defun csv--jit-unalign (beg end)
- (remove-text-properties beg end
- '(display nil csv--jit nil invisible nil
- cursor-sensor-functions nil csv--revealed nil))
- (remove-overlays beg end 'csv--jit t))
-
-(defun csv--jit-flush (beg end)
- "Cause all the buffer (except for the BEG...END region) to be re-aligned."
- (cl-assert (>= end beg))
- ;; The buffer shouldn't have changed since beg/end were computed,
- ;; but just in case, let's make sure they're still sane.
- (when (< beg (point-min))
- (setq beg (point-min) end (max end beg)))
- (when (< (point-max) end)
- (setq end (point-max) beg (min end beg)))
- (let ((pos (point-min)))
- (while (and (< pos beg)
- (setq pos (text-property-any pos beg 'csv--jit t)))
- (jit-lock-refontify
- pos (setq pos (or (text-property-any pos beg 'csv--jit nil) beg))))
- (setq pos end)
- (while (and (< pos (point-max))
- (setq pos (text-property-any pos (point-max) 'csv--jit t)))
- (jit-lock-refontify
- pos (setq pos (or (text-property-any pos (point-max) 'csv--jit nil)
- (point-max))))))
- (csv--header-flush))
-
-(defun csv--ellipsis-width ()
- (let ((ellipsis
- (when standard-display-table
- (display-table-slot standard-display-table
- 'selective-display))))
- (if ellipsis (length ellipsis) 3)))
-
-(defun csv-align--cursor-truncated (window oldpos dir)
- ;; FIXME: Neither the `entered' nor the `left' event are guaranteed
- ;; to be sent, and for the `left' case, even when we do get called,
- ;; it may be unclear where the revealed text was (it's somewhere around
- ;; `oldpos', but that position can be stale).
- ;; Worse, if we have several windows displaying the buffer, when one
- ;; cursor leaves we may need to keep the text revealed because of
- ;; another window's cursor.
- (let* ((prop (if (eq dir 'entered) 'invisible 'csv--revealed))
- (pos (cond
- ((eq dir 'entered) (window-point window))
- (t (max (point-min)
- (min (point-max)
- (or oldpos (window-point window)))))))
- (start (cond
- ((and (> pos (point-min))
- (eq (get-text-property (1- pos) prop) 'csv-truncate))
- (or (previous-single-property-change pos prop) (point-min)))
- (t pos)))
- (end (if (eq (get-text-property pos prop) 'csv-truncate)
- (or (next-single-property-change pos prop) (point-max))
- pos)))
- (unless (eql start end)
- (with-silent-modifications
- (put-text-property start end
- (if (eq dir 'entered) 'csv--revealed 'invisible)
- 'csv-truncate)
- (remove-text-properties start end (list prop))))))
-
-(defun csv--jit-align (beg end)
- (save-excursion
- ;; This is run with inhibit-modification-hooks set, so the overlays'
- ;; modification-hook doesn't work :-(
- (and csv--header-line
- (<= beg (overlay-end csv--header-line))
- (>= end (overlay-start csv--header-line))
- (csv--header-flush))
- ;; First, round up to a whole number of lines.
- (goto-char end)
- (unless (bolp) (forward-line 1) (setq end (point)))
- (goto-char beg)
- (unless (bolp) (forward-line 1) (setq beg (point)))
- (csv--jit-unalign beg end)
- (put-text-property beg end 'csv--jit t)
-
- (pcase-let* ((`(,column-widths ,field-widths) (csv--column-widths beg end))
- (changed (csv--jit-merge-columns column-widths))
- (ellipsis-width (csv--ellipsis-width)))
- (when changed
- ;; Do it after the current redisplay is over.
- (run-with-timer jit-lock-context-time nil #'csv--jit-flush beg end))
-
- ;; Align fields:
- (goto-char beg)
- (while (< (point) end)
- (unless (csv-not-looking-at-record)
- (let ((w csv--jit-columns)
- (widths-config csv--config-column-widths)
- (column 0)) ;Desired position of left-side of this column.
- (while (and w (not (eolp)))
- (let* ((field-beg (point))
- (width-config (pop widths-config))
- (align-padding (if (bolp) 0 csv-align-padding))
- (left-padding 0) (right-padding 0)
- (field-width (pop field-widths))
- (column-width
- (min (car (pop w))
- (or width-config
- ;; Don't apply csv-align-max-width
- ;; to the last field!
- (if w csv-align-max-width
- most-positive-fixnum))))
- (x (- column-width field-width)) ; Required padding.
- (truncate nil))
- (csv-end-of-field)
- ;; beg = beginning of current field
- ;; end = (point) = end of current field
- (when (< x 0)
- (setq truncate (max column
- (+ column column-width
- align-padding (- ellipsis-width))))
- (setq x 0))
- ;; Compute required padding:
- (pcase csv-align-style
- ('left
- ;; Left align -- pad on the right:
- (setq left-padding align-padding
- right-padding x))
- ('right
- ;; Right align -- pad on the left:
- (setq left-padding (+ align-padding x)))
- ('auto
- ;; Auto align -- left align text, right align numbers:
- (if (string-match "\\`[-+.[:digit:]]+\\'"
- (buffer-substring field-beg (point)))
- ;; Right align -- pad on the left:
- (setq left-padding (+ align-padding x))
- ;; Left align -- pad on the right:
- (setq left-padding align-padding
- right-padding x)))
- ('centre
- ;; Centre -- pad on both left and right:
- (let ((y (/ x 2))) ; truncated integer quotient
- (setq left-padding (+ align-padding y)
- right-padding (- x y)))))
-
- (cond
-
- ((or (memq 'csv buffer-invisibility-spec)
- ;; For TSV, hidden or not doesn't make much difference,
- ;; but the behavior is slightly better when we "hide"
- ;; the TABs with a `display' property than if we add
- ;; before/after-strings.
- (tsv--mode-p))
-
- ;; Hide separators...
- ;; Merge right-padding from previous field
- ;; with left-padding from this field:
- (if (zerop column)
- (when (> left-padding 0)
- ;; Display spaces before first field
- ;; by overlaying first character:
- (csv--make-overlay
- field-beg (1+ field-beg) nil nil nil
- `(before-string ,(make-string left-padding ?\ )
- csv--jit t)))
- ;; Display separator as spaces:
- (with-silent-modifications
- (put-text-property
- (1- field-beg) field-beg
- 'display `(space :align-to
- ,(+ left-padding column))))))
-
- (t ;; Do not hide separators...
- (let ((overlay (csv--make-overlay field-beg (point)
- nil nil t
- '(csv--jit t))))
- (when (> left-padding 0) ; Pad on the left.
- ;; Display spaces before field:
- (overlay-put overlay 'before-string
- (make-string left-padding ?\ )))
- (unless (eolp)
- (if (> right-padding 0) ; Pad on the right.
- ;; Display spaces after field:
- (overlay-put
- overlay
- 'after-string (make-string right-padding ?\ )))))))
- (setq column (+ column column-width align-padding))
- ;; Do it after applying the property, so `move-to-column' can
- ;; take it into account.
- (when truncate
- (let ((trunc-pos
- (save-excursion
- ;; ¡¡ BIG UGLY HACK !!
- ;; `current-column' and `move-to-column' count
- ;; text hidden with an ellipsis "as if" it were
- ;; fully visible, which is completely wrong here,
- ;; so circumvent this by temporarily pretending
- ;; that `csv-truncate' is fully invisible (which
- ;; isn't quite right either, but should work
- ;; just well enough for us here).
- (let ((buffer-invisibility-spec
- buffer-invisibility-spec))
- (add-to-invisibility-spec 'csv-truncate)
- (move-to-column truncate))
- (point))))
- (put-text-property trunc-pos (point)
- 'invisible 'csv-truncate)
- (when (> (- (point) trunc-pos) 1)
- ;; Arrange to temporarily untruncate the string when
- ;; cursor moves into it.
- ;; FIXME: This only works if
- ;; `global-disable-point-adjustment' is non-nil!
- ;; Arguably this should be fixed by making
- ;; point-adjustment code pay attention to
- ;; cursor-sensor-functions!
- (put-text-property
- (1+ trunc-pos) (point)
- 'cursor-sensor-functions
- (list #'csv-align--cursor-truncated)))))
- (unless (eolp) (forward-char)) ; Skip separator.
- ))))
- (forward-line)))
- `(jit-lock-bounds ,beg . ,end)))
-
-(define-minor-mode csv-align-mode
- "Align columns on the fly."
- :global nil
- (csv-unalign-fields nil (point-min) (point-max)) ;Just in case.
- (cond
- (csv-align-mode
- (add-to-invisibility-spec '(csv-truncate . t))
- (kill-local-variable 'csv--jit-columns)
- (cursor-sensor-mode 1)
- (jit-lock-register #'csv--jit-align)
- (jit-lock-refontify))
- (t
- (remove-from-invisibility-spec '(csv-truncate . t))
- (jit-lock-unregister #'csv--jit-align)
- (csv--jit-unalign (point-min) (point-max))))
- (csv--header-flush))
-
-;;; TSV support
-
-;; Since "the" CSV format is really a bunch of different formats, it includes
-;; TSV as a subcase, but this subcase is sufficiently interesting that it has
-;; its own mime-type and mostly standard file extension, also it suffers
-;; less from the usual quoting problems of CSV (because the only problematic
-;; chars are LF and TAB, really, which are much less common inside fields than
-;; commas, space, and semi-colons) so it's "better behaved".
-
-(defvar tsv-mode-syntax-table
- ;; Inherit from `text-mode-syntax-table' rather than from
- ;; `csv-mode-syntax-table' so as not to inherit the
- ;; `csv-field-quotes' settings.
- (let ((st (make-syntax-table text-mode-syntax-table)))
- st))
-
-(defvar tsv-mode-map
- (let ((map (make-sparse-keymap)))
- ;; In `tsv-mode', the `csv-invisibility-default/csv-toggle-invisibility'
- ;; business doesn't make much sense.
- (define-key map [remap csv-toggle-invisibility] #'undefined)
- map))
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.tsv\\'" . tsv-mode))
-
-(defun tsv--mode-p ()
- (equal csv-separator-chars '(?\t)))
-
-;;;###autoload
-(define-derived-mode tsv-mode csv-mode "TSV"
- "Major mode for editing files of tab-separated value type."
- :group 'CSV
- ;; In TSV we know TAB is the only possible separator.
- (setq-local csv-separators '("\t"))
- ;; FIXME: Copy&pasted from the `:set'ter of csv-separators!
- (setq-local csv-separator-chars '(?\t))
- (setq-local csv--skip-chars "^\n\t")
- (setq-local csv-separator-regexp "\t")
- (setq-local csv-font-lock-keywords
- ;; NB: csv-separator-face variable evaluates to itself.
- `((,csv-separator-regexp (0 'csv-separator-face))))
-
- ;; According to wikipedia, TSV doesn't use quotes but uses backslash escapes
- ;; of the form \n, \t, \r, and \\ instead.
- (setq-local csv-field-quotes nil))
-
-
-(provide 'csv-mode)
-
-;;; csv-mode.el ends here
diff --git a/elpa/dash-20200524.1947/dash-autoloads.el b/elpa/dash-20200524.1947/dash-autoloads.el
deleted file mode 100644
index c5e7902..0000000
--- a/elpa/dash-20200524.1947/dash-autoloads.el
+++ /dev/null
@@ -1,26 +0,0 @@
-;;; dash-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "dash" "dash.el" (0 0 0 0))
-;;; Generated autoloads from dash.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dash" '("dash-" "-keep" "-butlast" "-non" "-only-some" "-zip" "-e" "->" "-a" "-gr" "-when-let" "-d" "-l" "-s" "-p" "-r" "-m" "-i" "-f" "-u" "-value-to-list" "-t" "--" "-c" "!cons" "!cdr")))
-
-;;;***
-
-;;;### (autoloads nil nil ("dash-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; dash-autoloads.el ends here
diff --git a/elpa/dash-20200524.1947/dash-pkg.el b/elpa/dash-20200524.1947/dash-pkg.el
deleted file mode 100644
index 08d8982..0000000
--- a/elpa/dash-20200524.1947/dash-pkg.el
+++ /dev/null
@@ -1,9 +0,0 @@
-(define-package "dash" "20200524.1947" "A modern list library for Emacs" 'nil :commit "732d92eac56023a4fb4a5dc3d9d4e274ebf44bf9" :keywords
- '("lists")
- :authors
- '(("Magnar Sveen" . "magnars@gmail.com"))
- :maintainer
- '("Magnar Sveen" . "magnars@gmail.com"))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/dash-20200524.1947/dash.el b/elpa/dash-20200524.1947/dash.el
deleted file mode 100644
index 1fc2ec8..0000000
--- a/elpa/dash-20200524.1947/dash.el
+++ /dev/null
@@ -1,3072 +0,0 @@
-;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2016 Free Software Foundation, Inc.
-
-;; Author: Magnar Sveen <magnars@gmail.com>
-;; Version: 2.17.0
-;; Keywords: lists
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; A modern list api for Emacs.
-;;
-;; See documentation on https://github.com/magnars/dash.el#functions
-;;
-;; **Please note** The lexical binding in this file is not utilised at the
-;; moment. We will take full advantage of lexical binding in an upcoming 3.0
-;; release of Dash. In the meantime, we've added the pragma to avoid a bug that
-;; you can read more about in https://github.com/magnars/dash.el/issues/130.
-;;
-
-;;; Code:
-
-;; TODO: `gv' was introduced in Emacs 24.3, so remove this and all
-;; calls to `defsetf' when support for earlier versions is dropped.
-(eval-when-compile
- (unless (fboundp 'gv-define-setter)
- (require 'cl)))
-
-(defgroup dash ()
- "Customize group for dash.el"
- :group 'lisp
- :prefix "dash-")
-
-(defun dash--enable-fontlock (symbol value)
- (when value
- (dash-enable-font-lock))
- (set-default symbol value))
-
-(defcustom dash-enable-fontlock nil
- "If non-nil, enable fontification of dash functions, macros and
-special values."
- :type 'boolean
- :set 'dash--enable-fontlock
- :group 'dash)
-
-(defmacro !cons (car cdr)
- "Destructive: Set CDR to the cons of CAR and CDR."
- `(setq ,cdr (cons ,car ,cdr)))
-
-(defmacro !cdr (list)
- "Destructive: Set LIST to the cdr of LIST."
- `(setq ,list (cdr ,list)))
-
-(defmacro --each (list &rest body)
- "Anaphoric form of `-each'."
- (declare (debug (form body))
- (indent 1))
- (let ((l (make-symbol "list")))
- `(let ((,l ,list)
- (it-index 0))
- (while ,l
- (let ((it (car ,l)))
- ,@body)
- (setq it-index (1+ it-index))
- (!cdr ,l)))))
-
-(defmacro -doto (eval-initial-value &rest forms)
- "Eval a form, then insert that form as the 2nd argument to other forms.
-The EVAL-INITIAL-VALUE form is evaluated once. Its result is
-passed to FORMS, which are then evaluated sequentially. Returns
-the target form."
- (declare (indent 1))
- (let ((retval (make-symbol "value")))
- `(let ((,retval ,eval-initial-value))
- ,@(mapcar (lambda (form)
- (if (sequencep form)
- `(,(-first-item form) ,retval ,@(cdr form))
- `(funcall form ,retval)))
- forms)
- ,retval)))
-
-(defmacro --doto (eval-initial-value &rest forms)
- "Anaphoric form of `-doto'.
-Note: `it' is not required in each form."
- (declare (indent 1))
- `(let ((it ,eval-initial-value))
- ,@forms
- it))
-
-(defun -each (list fn)
- "Call FN with every item in LIST. Return nil, used for side-effects only."
- (--each list (funcall fn it)))
-
-(put '-each 'lisp-indent-function 1)
-
-(defalias '--each-indexed '--each)
-
-(defun -each-indexed (list fn)
- "Call (FN index item) for each item in LIST.
-
-In the anaphoric form `--each-indexed', the index is exposed as symbol `it-index'.
-
-See also: `-map-indexed'."
- (--each list (funcall fn it-index it)))
-(put '-each-indexed 'lisp-indent-function 1)
-
-(defmacro --each-while (list pred &rest body)
- "Anaphoric form of `-each-while'."
- (declare (debug (form form body))
- (indent 2))
- (let ((l (make-symbol "list"))
- (c (make-symbol "continue")))
- `(let ((,l ,list)
- (,c t)
- (it-index 0))
- (while (and ,l ,c)
- (let ((it (car ,l)))
- (if (not ,pred) (setq ,c nil) ,@body))
- (setq it-index (1+ it-index))
- (!cdr ,l)))))
-
-(defun -each-while (list pred fn)
- "Call FN with every item in LIST while (PRED item) is non-nil.
-Return nil, used for side-effects only."
- (--each-while list (funcall pred it) (funcall fn it)))
-
-(put '-each-while 'lisp-indent-function 2)
-
-(defmacro --each-r (list &rest body)
- "Anaphoric form of `-each-r'."
- (declare (debug (form body))
- (indent 1))
- (let ((v (make-symbol "vector")))
- ;; Implementation note: building vector is considerably faster
- ;; than building a reversed list (vector takes less memory, so
- ;; there is less GC), plus length comes naturally. In-place
- ;; 'nreverse' would be faster still, but BODY would be able to see
- ;; that, even if modification was reversed before we return.
- `(let* ((,v (vconcat ,list))
- (it-index (length ,v))
- it)
- (while (> it-index 0)
- (setq it-index (1- it-index))
- (setq it (aref ,v it-index))
- ,@body))))
-
-(defun -each-r (list fn)
- "Call FN with every item in LIST in reversed order.
- Return nil, used for side-effects only."
- (--each-r list (funcall fn it)))
-
-(defmacro --each-r-while (list pred &rest body)
- "Anaphoric form of `-each-r-while'."
- (declare (debug (form form body))
- (indent 2))
- (let ((v (make-symbol "vector")))
- `(let* ((,v (vconcat ,list))
- (it-index (length ,v))
- it)
- (while (> it-index 0)
- (setq it-index (1- it-index))
- (setq it (aref ,v it-index))
- (if (not ,pred)
- (setq it-index -1)
- ,@body)))))
-
-(defun -each-r-while (list pred fn)
- "Call FN with every item in reversed LIST while (PRED item) is non-nil.
-Return nil, used for side-effects only."
- (--each-r-while list (funcall pred it) (funcall fn it)))
-
-(defmacro --dotimes (num &rest body)
- "Repeatedly executes BODY (presumably for side-effects) with symbol `it' bound to integers from 0 through NUM-1."
- (declare (debug (form body))
- (indent 1))
- (let ((n (make-symbol "num")))
- `(let ((,n ,num)
- (it 0))
- (while (< it ,n)
- ,@body
- (setq it (1+ it))))))
-
-(defun -dotimes (num fn)
- "Repeatedly calls FN (presumably for side-effects) passing in integers from 0 through NUM-1."
- (--dotimes num (funcall fn it)))
-
-(put '-dotimes 'lisp-indent-function 1)
-
-(defun -map (fn list)
- "Return a new list consisting of the result of applying FN to the items in LIST."
- (mapcar fn list))
-
-(defmacro --map (form list)
- "Anaphoric form of `-map'."
- (declare (debug (form form)))
- `(mapcar (lambda (it) ,form) ,list))
-
-(defmacro --reduce-from (form initial-value list)
- "Anaphoric form of `-reduce-from'."
- (declare (debug (form form form)))
- `(let ((acc ,initial-value))
- (--each ,list (setq acc ,form))
- acc))
-
-(defun -reduce-from (fn initial-value list)
- "Return the result of applying FN to INITIAL-VALUE and the
-first item in LIST, then applying FN to that result and the 2nd
-item, etc. If LIST contains no items, return INITIAL-VALUE and
-do not call FN.
-
-In the anaphoric form `--reduce-from', the accumulated value is
-exposed as symbol `acc'.
-
-See also: `-reduce', `-reduce-r'"
- (--reduce-from (funcall fn acc it) initial-value list))
-
-(defmacro --reduce (form list)
- "Anaphoric form of `-reduce'."
- (declare (debug (form form)))
- (let ((lv (make-symbol "list-value")))
- `(let ((,lv ,list))
- (if ,lv
- (--reduce-from ,form (car ,lv) (cdr ,lv))
- (let (acc it) ,form)))))
-
-(defun -reduce (fn list)
- "Return the result of applying FN to the first 2 items in LIST,
-then applying FN to that result and the 3rd item, etc. If LIST
-contains no items, return the result of calling FN with no
-arguments. If LIST contains a single item, return that item
-and do not call FN.
-
-In the anaphoric form `--reduce', the accumulated value is
-exposed as symbol `acc'.
-
-See also: `-reduce-from', `-reduce-r'"
- (if list
- (-reduce-from fn (car list) (cdr list))
- (funcall fn)))
-
-(defmacro --reduce-r-from (form initial-value list)
- "Anaphoric version of `-reduce-r-from'."
- (declare (debug (form form form)))
- `(--reduce-from ,form ,initial-value (reverse ,list)))
-
-(defun -reduce-r-from (fn initial-value list)
- "Replace conses with FN, nil with INITIAL-VALUE and evaluate
-the resulting expression. If LIST is empty, INITIAL-VALUE is
-returned and FN is not called.
-
-Note: this function works the same as `-reduce-from' but the
-operation associates from right instead of from left.
-
-See also: `-reduce-r', `-reduce'"
- (--reduce-r-from (funcall fn it acc) initial-value list))
-
-(defmacro --reduce-r (form list)
- "Anaphoric version of `-reduce-r'."
- (declare (debug (form form)))
- `(--reduce ,form (reverse ,list)))
-
-(defun -reduce-r (fn list)
- "Replace conses with FN and evaluate the resulting expression.
-The final nil is ignored. If LIST contains no items, return the
-result of calling FN with no arguments. If LIST contains a single
-item, return that item and do not call FN.
-
-The first argument of FN is the new item, the second is the
-accumulated value.
-
-Note: this function works the same as `-reduce' but the operation
-associates from right instead of from left.
-
-See also: `-reduce-r-from', `-reduce'"
- (if list
- (--reduce-r (funcall fn it acc) list)
- (funcall fn)))
-
-(defun -reductions-from (fn init list)
- "Return a list of the intermediate values of the reduction.
-
-See `-reduce-from' for explanation of the arguments.
-
-See also: `-reductions', `-reductions-r', `-reduce-r'"
- (nreverse (--reduce-from (cons (funcall fn (car acc) it) acc) (list init) list)))
-
-(defun -reductions (fn list)
- "Return a list of the intermediate values of the reduction.
-
-See `-reduce' for explanation of the arguments.
-
-See also: `-reductions-from', `-reductions-r', `-reduce-r'"
- (and list (-reductions-from fn (car list) (cdr list))))
-
-(defun -reductions-r-from (fn init list)
- "Return a list of the intermediate values of the reduction.
-
-See `-reduce-r-from' for explanation of the arguments.
-
-See also: `-reductions-r', `-reductions', `-reduce'"
- (--reduce-r-from (cons (funcall fn it (car acc)) acc) (list init) list))
-
-(defun -reductions-r (fn list)
- "Return a list of the intermediate values of the reduction.
-
-See `-reduce-r' for explanation of the arguments.
-
-See also: `-reductions-r-from', `-reductions', `-reduce'"
- (when list
- (let ((rev (reverse list)))
- (--reduce-from (cons (funcall fn it (car acc)) acc)
- (list (car rev))
- (cdr rev)))))
-
-(defmacro --filter (form list)
- "Anaphoric form of `-filter'.
-
-See also: `--remove'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result")))
- `(let (,r)
- (--each ,list (when ,form (!cons it ,r)))
- (nreverse ,r))))
-
-(defun -filter (pred list)
- "Return a new list of the items in LIST for which PRED returns a non-nil value.
-
-Alias: `-select'
-
-See also: `-keep', `-remove'."
- (--filter (funcall pred it) list))
-
-(defalias '-select '-filter)
-(defalias '--select '--filter)
-
-(defmacro --remove (form list)
- "Anaphoric form of `-remove'.
-
-See also `--filter'."
- (declare (debug (form form)))
- `(--filter (not ,form) ,list))
-
-(defun -remove (pred list)
- "Return a new list of the items in LIST for which PRED returns nil.
-
-Alias: `-reject'
-
-See also: `-filter'."
- (--remove (funcall pred it) list))
-
-(defalias '-reject '-remove)
-(defalias '--reject '--remove)
-
-(defun -remove-first (pred list)
- "Return a new list with the first item matching PRED removed.
-
-Alias: `-reject-first'
-
-See also: `-remove', `-map-first'"
- (let (front)
- (while (and list (not (funcall pred (car list))))
- (push (car list) front)
- (!cdr list))
- (if list
- (-concat (nreverse front) (cdr list))
- (nreverse front))))
-
-(defmacro --remove-first (form list)
- "Anaphoric form of `-remove-first'."
- (declare (debug (form form)))
- `(-remove-first (lambda (it) ,form) ,list))
-
-(defalias '-reject-first '-remove-first)
-(defalias '--reject-first '--remove-first)
-
-(defun -remove-last (pred list)
- "Return a new list with the last item matching PRED removed.
-
-Alias: `-reject-last'
-
-See also: `-remove', `-map-last'"
- (nreverse (-remove-first pred (reverse list))))
-
-(defmacro --remove-last (form list)
- "Anaphoric form of `-remove-last'."
- (declare (debug (form form)))
- `(-remove-last (lambda (it) ,form) ,list))
-
-(defalias '-reject-last '-remove-last)
-(defalias '--reject-last '--remove-last)
-
-(defun -remove-item (item list)
- "Remove all occurrences of ITEM from LIST.
-
-Comparison is done with `equal'."
- (declare (pure t) (side-effect-free t))
- (--remove (equal it item) list))
-
-(defmacro --keep (form list)
- "Anaphoric form of `-keep'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result"))
- (m (make-symbol "mapped")))
- `(let (,r)
- (--each ,list (let ((,m ,form)) (when ,m (!cons ,m ,r))))
- (nreverse ,r))))
-
-(defun -keep (fn list)
- "Return a new list of the non-nil results of applying FN to the items in LIST.
-
-If you want to select the original items satisfying a predicate use `-filter'."
- (--keep (funcall fn it) list))
-
-(defun -non-nil (list)
- "Return all non-nil elements of LIST."
- (declare (pure t) (side-effect-free t))
- (-remove 'null list))
-
-(defmacro --map-indexed (form list)
- "Anaphoric form of `-map-indexed'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result")))
- `(let (,r)
- (--each ,list
- (!cons ,form ,r))
- (nreverse ,r))))
-
-(defun -map-indexed (fn list)
- "Return a new list consisting of the result of (FN index item) for each item in LIST.
-
-In the anaphoric form `--map-indexed', the index is exposed as symbol `it-index'.
-
-See also: `-each-indexed'."
- (--map-indexed (funcall fn it-index it) list))
-
-(defmacro --map-when (pred rep list)
- "Anaphoric form of `-map-when'."
- (declare (debug (form form form)))
- (let ((r (make-symbol "result")))
- `(let (,r)
- (--each ,list (!cons (if ,pred ,rep it) ,r))
- (nreverse ,r))))
-
-(defun -map-when (pred rep list)
- "Return a new list where the elements in LIST that do not match the PRED function
-are unchanged, and where the elements in LIST that do match the PRED function are mapped
-through the REP function.
-
-Alias: `-replace-where'
-
-See also: `-update-at'"
- (--map-when (funcall pred it) (funcall rep it) list))
-
-(defalias '-replace-where '-map-when)
-(defalias '--replace-where '--map-when)
-
-(defun -map-first (pred rep list)
- "Replace first item in LIST satisfying PRED with result of REP called on this item.
-
-See also: `-map-when', `-replace-first'"
- (let (front)
- (while (and list (not (funcall pred (car list))))
- (push (car list) front)
- (!cdr list))
- (if list
- (-concat (nreverse front) (cons (funcall rep (car list)) (cdr list)))
- (nreverse front))))
-
-(defmacro --map-first (pred rep list)
- "Anaphoric form of `-map-first'."
- `(-map-first (lambda (it) ,pred) (lambda (it) (ignore it) ,rep) ,list))
-
-(defun -map-last (pred rep list)
- "Replace last item in LIST satisfying PRED with result of REP called on this item.
-
-See also: `-map-when', `-replace-last'"
- (nreverse (-map-first pred rep (reverse list))))
-
-(defmacro --map-last (pred rep list)
- "Anaphoric form of `-map-last'."
- `(-map-last (lambda (it) ,pred) (lambda (it) (ignore it) ,rep) ,list))
-
-(defun -replace (old new list)
- "Replace all OLD items in LIST with NEW.
-
-Elements are compared using `equal'.
-
-See also: `-replace-at'"
- (declare (pure t) (side-effect-free t))
- (--map-when (equal it old) new list))
-
-(defun -replace-first (old new list)
- "Replace the first occurrence of OLD with NEW in LIST.
-
-Elements are compared using `equal'.
-
-See also: `-map-first'"
- (declare (pure t) (side-effect-free t))
- (--map-first (equal old it) new list))
-
-(defun -replace-last (old new list)
- "Replace the last occurrence of OLD with NEW in LIST.
-
-Elements are compared using `equal'.
-
-See also: `-map-last'"
- (declare (pure t) (side-effect-free t))
- (--map-last (equal old it) new list))
-
-(defmacro --mapcat (form list)
- "Anaphoric form of `-mapcat'."
- (declare (debug (form form)))
- `(apply 'append (--map ,form ,list)))
-
-(defun -mapcat (fn list)
- "Return the concatenation of the result of mapping FN over LIST.
-Thus function FN should return a list."
- (--mapcat (funcall fn it) list))
-
-(defun -flatten (l)
- "Take a nested list L and return its contents as a single, flat list.
-
-Note that because `nil' represents a list of zero elements (an
-empty list), any mention of nil in L will disappear after
-flattening. If you need to preserve nils, consider `-flatten-n'
-or map them to some unique symbol and then map them back.
-
-Conses of two atoms are considered \"terminals\", that is, they
-aren't flattened further.
-
-See also: `-flatten-n'"
- (declare (pure t) (side-effect-free t))
- (if (and (listp l) (listp (cdr l)))
- (-mapcat '-flatten l)
- (list l)))
-
-(defmacro --iterate (form init n)
- "Anaphoric version of `-iterate'."
- (declare (debug (form form form)))
- `(-iterate (lambda (it) ,form) ,init ,n))
-
-(defun -flatten-n (num list)
- "Flatten NUM levels of a nested LIST.
-
-See also: `-flatten'"
- (declare (pure t) (side-effect-free t))
- (-last-item (--iterate (--mapcat (-list it) it) list (1+ num))))
-
-(defun -concat (&rest lists)
- "Return a new list with the concatenation of the elements in the supplied LISTS."
- (declare (pure t) (side-effect-free t))
- (apply 'append lists))
-
-(defalias '-copy 'copy-sequence
- "Create a shallow copy of LIST.
-
-\(fn LIST)")
-
-(defun -splice (pred fun list)
- "Splice lists generated by FUN in place of elements matching PRED in LIST.
-
-FUN takes the element matching PRED as input.
-
-This function can be used as replacement for `,@' in case you
-need to splice several lists at marked positions (for example
-with keywords).
-
-See also: `-splice-list', `-insert-at'"
- (let (r)
- (--each list
- (if (funcall pred it)
- (let ((new (funcall fun it)))
- (--each new (!cons it r)))
- (!cons it r)))
- (nreverse r)))
-
-(defmacro --splice (pred form list)
- "Anaphoric form of `-splice'."
- `(-splice (lambda (it) ,pred) (lambda (it) ,form) ,list))
-
-(defun -splice-list (pred new-list list)
- "Splice NEW-LIST in place of elements matching PRED in LIST.
-
-See also: `-splice', `-insert-at'"
- (-splice pred (lambda (_) new-list) list))
-
-(defmacro --splice-list (pred new-list list)
- "Anaphoric form of `-splice-list'."
- `(-splice-list (lambda (it) ,pred) ,new-list ,list))
-
-(defun -cons* (&rest args)
- "Make a new list from the elements of ARGS.
-
-The last 2 members of ARGS are used as the final cons of the
-result so if the final member of ARGS is not a list the result is
-a dotted list."
- (declare (pure t) (side-effect-free t))
- (-reduce-r 'cons args))
-
-(defun -snoc (list elem &rest elements)
- "Append ELEM to the end of the list.
-
-This is like `cons', but operates on the end of list.
-
-If ELEMENTS is non nil, append these to the list as well."
- (-concat list (list elem) elements))
-
-(defmacro --first (form list)
- "Anaphoric form of `-first'."
- (declare (debug (form form)))
- (let ((n (make-symbol "needle")))
- `(let (,n)
- (--each-while ,list (not ,n)
- (when ,form (setq ,n it)))
- ,n)))
-
-(defun -first (pred list)
- "Return the first x in LIST where (PRED x) is non-nil, else nil.
-
-To get the first item in the list no questions asked, use `car'.
-
-Alias: `-find'"
- (--first (funcall pred it) list))
-
-(defalias '-find '-first)
-(defalias '--find '--first)
-
-(defmacro --some (form list)
- "Anaphoric form of `-some'."
- (declare (debug (form form)))
- (let ((n (make-symbol "needle")))
- `(let (,n)
- (--each-while ,list (not ,n)
- (setq ,n ,form))
- ,n)))
-
-(defun -some (pred list)
- "Return (PRED x) for the first LIST item where (PRED x) is non-nil, else nil.
-
-Alias: `-any'"
- (--some (funcall pred it) list))
-
-(defalias '-any '-some)
-(defalias '--any '--some)
-
-(defmacro --last (form list)
- "Anaphoric form of `-last'."
- (declare (debug (form form)))
- (let ((n (make-symbol "needle")))
- `(let (,n)
- (--each ,list
- (when ,form (setq ,n it)))
- ,n)))
-
-(defun -last (pred list)
- "Return the last x in LIST where (PRED x) is non-nil, else nil."
- (--last (funcall pred it) list))
-
-(defalias '-first-item 'car
- "Return the first item of LIST, or nil on an empty list.
-
-See also: `-second-item', `-last-item'.
-
-\(fn LIST)")
-
-;; Ensure that calls to `-first-item' are compiled to a single opcode,
-;; just like `car'.
-(put '-first-item 'byte-opcode 'byte-car)
-(put '-first-item 'byte-compile 'byte-compile-one-arg)
-
-(defalias '-second-item 'cadr
- "Return the second item of LIST, or nil if LIST is too short.
-
-See also: `-third-item'.
-
-\(fn LIST)")
-
-(defalias '-third-item
- (if (fboundp 'caddr)
- #'caddr
- (lambda (list) (car (cddr list))))
- "Return the third item of LIST, or nil if LIST is too short.
-
-See also: `-fourth-item'.
-
-\(fn LIST)")
-
-(defun -fourth-item (list)
- "Return the fourth item of LIST, or nil if LIST is too short.
-
-See also: `-fifth-item'."
- (declare (pure t) (side-effect-free t))
- (car (cdr (cdr (cdr list)))))
-
-(defun -fifth-item (list)
- "Return the fifth item of LIST, or nil if LIST is too short.
-
-See also: `-last-item'."
- (declare (pure t) (side-effect-free t))
- (car (cdr (cdr (cdr (cdr list))))))
-
-(defun -last-item (list)
- "Return the last item of LIST, or nil on an empty list."
- (declare (pure t) (side-effect-free t))
- (car (last list)))
-
-;; Use `with-no-warnings' to suppress unbound `-last-item' or
-;; undefined `gv--defsetter' warnings arising from both
-;; `gv-define-setter' and `defsetf' in certain Emacs versions.
-(with-no-warnings
- (if (fboundp 'gv-define-setter)
- (gv-define-setter -last-item (val x) `(setcar (last ,x) ,val))
- (defsetf -last-item (x) (val) `(setcar (last ,x) ,val))))
-
-(defun -butlast (list)
- "Return a list of all items in list except for the last."
- ;; no alias as we don't want magic optional argument
- (declare (pure t) (side-effect-free t))
- (butlast list))
-
-(defmacro --count (pred list)
- "Anaphoric form of `-count'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result")))
- `(let ((,r 0))
- (--each ,list (when ,pred (setq ,r (1+ ,r))))
- ,r)))
-
-(defun -count (pred list)
- "Counts the number of items in LIST where (PRED item) is non-nil."
- (--count (funcall pred it) list))
-
-(defun ---truthy? (val)
- (declare (pure t) (side-effect-free t))
- (not (null val)))
-
-(defmacro --any? (form list)
- "Anaphoric form of `-any?'."
- (declare (debug (form form)))
- `(---truthy? (--some ,form ,list)))
-
-(defun -any? (pred list)
- "Return t if (PRED x) is non-nil for any x in LIST, else nil.
-
-Alias: `-any-p', `-some?', `-some-p'"
- (--any? (funcall pred it) list))
-
-(defalias '-some? '-any?)
-(defalias '--some? '--any?)
-(defalias '-any-p '-any?)
-(defalias '--any-p '--any?)
-(defalias '-some-p '-any?)
-(defalias '--some-p '--any?)
-
-(defmacro --all? (form list)
- "Anaphoric form of `-all?'."
- (declare (debug (form form)))
- (let ((a (make-symbol "all")))
- `(let ((,a t))
- (--each-while ,list ,a (setq ,a ,form))
- (---truthy? ,a))))
-
-(defun -all? (pred list)
- "Return t if (PRED x) is non-nil for all x in LIST, else nil.
-
-Alias: `-all-p', `-every?', `-every-p'"
- (--all? (funcall pred it) list))
-
-(defalias '-every? '-all?)
-(defalias '--every? '--all?)
-(defalias '-all-p '-all?)
-(defalias '--all-p '--all?)
-(defalias '-every-p '-all?)
-(defalias '--every-p '--all?)
-
-(defmacro --none? (form list)
- "Anaphoric form of `-none?'."
- (declare (debug (form form)))
- `(--all? (not ,form) ,list))
-
-(defun -none? (pred list)
- "Return t if (PRED x) is nil for all x in LIST, else nil.
-
-Alias: `-none-p'"
- (--none? (funcall pred it) list))
-
-(defalias '-none-p '-none?)
-(defalias '--none-p '--none?)
-
-(defmacro --only-some? (form list)
- "Anaphoric form of `-only-some?'."
- (declare (debug (form form)))
- (let ((y (make-symbol "yes"))
- (n (make-symbol "no")))
- `(let (,y ,n)
- (--each-while ,list (not (and ,y ,n))
- (if ,form (setq ,y t) (setq ,n t)))
- (---truthy? (and ,y ,n)))))
-
-(defun -only-some? (pred list)
- "Return `t` if at least one item of LIST matches PRED and at least one item of LIST does not match PRED.
-Return `nil` both if all items match the predicate or if none of the items match the predicate.
-
-Alias: `-only-some-p'"
- (--only-some? (funcall pred it) list))
-
-(defalias '-only-some-p '-only-some?)
-(defalias '--only-some-p '--only-some?)
-
-(defun -slice (list from &optional to step)
- "Return copy of LIST, starting from index FROM to index TO.
-
-FROM or TO may be negative. These values are then interpreted
-modulo the length of the list.
-
-If STEP is a number, only each STEPth item in the resulting
-section is returned. Defaults to 1."
- (declare (pure t) (side-effect-free t))
- (let ((length (length list))
- (new-list nil))
- ;; to defaults to the end of the list
- (setq to (or to length))
- (setq step (or step 1))
- ;; handle negative indices
- (when (< from 0)
- (setq from (mod from length)))
- (when (< to 0)
- (setq to (mod to length)))
-
- ;; iterate through the list, keeping the elements we want
- (--each-while list (< it-index to)
- (when (and (>= it-index from)
- (= (mod (- from it-index) step) 0))
- (push it new-list)))
- (nreverse new-list)))
-
-(defun -take (n list)
- "Return a new list of the first N items in LIST, or all items if there are fewer than N.
-
-See also: `-take-last'"
- (declare (pure t) (side-effect-free t))
- (let (result)
- (--dotimes n
- (when list
- (!cons (car list) result)
- (!cdr list)))
- (nreverse result)))
-
-(defun -take-last (n list)
- "Return the last N items of LIST in order.
-
-See also: `-take'"
- (declare (pure t) (side-effect-free t))
- (copy-sequence (last list n)))
-
-(defalias '-drop 'nthcdr
- "Return the tail of LIST without the first N items.
-
-See also: `-drop-last'
-
-\(fn N LIST)")
-
-(defun -drop-last (n list)
- "Remove the last N items of LIST and return a copy.
-
-See also: `-drop'"
- ;; No alias because we don't want magic optional argument
- (declare (pure t) (side-effect-free t))
- (butlast list n))
-
-(defmacro --take-while (form list)
- "Anaphoric form of `-take-while'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result")))
- `(let (,r)
- (--each-while ,list ,form (!cons it ,r))
- (nreverse ,r))))
-
-(defun -take-while (pred list)
- "Return a new list of successive items from LIST while (PRED item) returns a non-nil value."
- (--take-while (funcall pred it) list))
-
-(defmacro --drop-while (form list)
- "Anaphoric form of `-drop-while'."
- (declare (debug (form form)))
- (let ((l (make-symbol "list")))
- `(let ((,l ,list))
- (while (and ,l (let ((it (car ,l))) ,form))
- (!cdr ,l))
- ,l)))
-
-(defun -drop-while (pred list)
- "Return the tail of LIST starting from the first item for which (PRED item) returns nil."
- (--drop-while (funcall pred it) list))
-
-(defun -split-at (n list)
- "Return a list of ((-take N LIST) (-drop N LIST)), in no more than one pass through the list."
- (declare (pure t) (side-effect-free t))
- (let (result)
- (--dotimes n
- (when list
- (!cons (car list) result)
- (!cdr list)))
- (list (nreverse result) list)))
-
-(defun -rotate (n list)
- "Rotate LIST N places to the right. With N negative, rotate to the left.
-The time complexity is O(n)."
- (declare (pure t) (side-effect-free t))
- (when list
- (let* ((len (length list))
- (n-mod-len (mod n len))
- (new-tail-len (- len n-mod-len)))
- (append (-drop new-tail-len list) (-take new-tail-len list)))))
-
-(defun -insert-at (n x list)
- "Return a list with X inserted into LIST at position N.
-
-See also: `-splice', `-splice-list'"
- (declare (pure t) (side-effect-free t))
- (let ((split-list (-split-at n list)))
- (nconc (car split-list) (cons x (cadr split-list)))))
-
-(defun -replace-at (n x list)
- "Return a list with element at Nth position in LIST replaced with X.
-
-See also: `-replace'"
- (declare (pure t) (side-effect-free t))
- (let ((split-list (-split-at n list)))
- (nconc (car split-list) (cons x (cdr (cadr split-list))))))
-
-(defun -update-at (n func list)
- "Return a list with element at Nth position in LIST replaced with `(func (nth n list))`.
-
-See also: `-map-when'"
- (let ((split-list (-split-at n list)))
- (nconc (car split-list) (cons (funcall func (car (cadr split-list))) (cdr (cadr split-list))))))
-
-(defmacro --update-at (n form list)
- "Anaphoric version of `-update-at'."
- (declare (debug (form form form)))
- `(-update-at ,n (lambda (it) ,form) ,list))
-
-(defun -remove-at (n list)
- "Return a list with element at Nth position in LIST removed.
-
-See also: `-remove-at-indices', `-remove'"
- (declare (pure t) (side-effect-free t))
- (-remove-at-indices (list n) list))
-
-(defun -remove-at-indices (indices list)
- "Return a list whose elements are elements from LIST without
-elements selected as `(nth i list)` for all i
-from INDICES.
-
-See also: `-remove-at', `-remove'"
- (declare (pure t) (side-effect-free t))
- (let* ((indices (-sort '< indices))
- (diffs (cons (car indices) (-map '1- (-zip-with '- (cdr indices) indices))))
- r)
- (--each diffs
- (let ((split (-split-at it list)))
- (!cons (car split) r)
- (setq list (cdr (cadr split)))))
- (!cons list r)
- (apply '-concat (nreverse r))))
-
-(defmacro --split-with (pred list)
- "Anaphoric form of `-split-with'."
- (declare (debug (form form)))
- (let ((l (make-symbol "list"))
- (r (make-symbol "result"))
- (c (make-symbol "continue")))
- `(let ((,l ,list)
- (,r nil)
- (,c t))
- (while (and ,l ,c)
- (let ((it (car ,l)))
- (if (not ,pred)
- (setq ,c nil)
- (!cons it ,r)
- (!cdr ,l))))
- (list (nreverse ,r) ,l))))
-
-(defun -split-with (pred list)
- "Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)), in no more than one pass through the list."
- (--split-with (funcall pred it) list))
-
-(defmacro -split-on (item list)
- "Split the LIST each time ITEM is found.
-
-Unlike `-partition-by', the ITEM is discarded from the results.
-Empty lists are also removed from the result.
-
-Comparison is done by `equal'.
-
-See also `-split-when'"
- (declare (debug (form form)))
- `(-split-when (lambda (it) (equal it ,item)) ,list))
-
-(defmacro --split-when (form list)
- "Anaphoric version of `-split-when'."
- (declare (debug (form form)))
- `(-split-when (lambda (it) ,form) ,list))
-
-(defun -split-when (fn list)
- "Split the LIST on each element where FN returns non-nil.
-
-Unlike `-partition-by', the \"matched\" element is discarded from
-the results. Empty lists are also removed from the result.
-
-This function can be thought of as a generalization of
-`split-string'."
- (let (r s)
- (while list
- (if (not (funcall fn (car list)))
- (push (car list) s)
- (when s (push (nreverse s) r))
- (setq s nil))
- (!cdr list))
- (when s (push (nreverse s) r))
- (nreverse r)))
-
-(defmacro --separate (form list)
- "Anaphoric form of `-separate'."
- (declare (debug (form form)))
- (let ((y (make-symbol "yes"))
- (n (make-symbol "no")))
- `(let (,y ,n)
- (--each ,list (if ,form (!cons it ,y) (!cons it ,n)))
- (list (nreverse ,y) (nreverse ,n)))))
-
-(defun -separate (pred list)
- "Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one pass through the list."
- (--separate (funcall pred it) list))
-
-(defun ---partition-all-in-steps-reversed (n step list)
- "Private: Used by -partition-all-in-steps and -partition-in-steps."
- (when (< step 1)
- (error "Step must be a positive number, or you're looking at some juicy infinite loops."))
- (let ((result nil))
- (while list
- (!cons (-take n list) result)
- (setq list (-drop step list)))
- result))
-
-(defun -partition-all-in-steps (n step list)
- "Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart.
-The last groups may contain less than N items."
- (declare (pure t) (side-effect-free t))
- (nreverse (---partition-all-in-steps-reversed n step list)))
-
-(defun -partition-in-steps (n step list)
- "Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart.
-If there are not enough items to make the last group N-sized,
-those items are discarded."
- (declare (pure t) (side-effect-free t))
- (let ((result (---partition-all-in-steps-reversed n step list)))
- (while (and result (< (length (car result)) n))
- (!cdr result))
- (nreverse result)))
-
-(defun -partition-all (n list)
- "Return a new list with the items in LIST grouped into N-sized sublists.
-The last group may contain less than N items."
- (declare (pure t) (side-effect-free t))
- (-partition-all-in-steps n n list))
-
-(defun -partition (n list)
- "Return a new list with the items in LIST grouped into N-sized sublists.
-If there are not enough items to make the last group N-sized,
-those items are discarded."
- (declare (pure t) (side-effect-free t))
- (-partition-in-steps n n list))
-
-(defmacro --partition-by (form list)
- "Anaphoric form of `-partition-by'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result"))
- (s (make-symbol "sublist"))
- (v (make-symbol "value"))
- (n (make-symbol "new-value"))
- (l (make-symbol "list")))
- `(let ((,l ,list))
- (when ,l
- (let* ((,r nil)
- (it (car ,l))
- (,s (list it))
- (,v ,form)
- (,l (cdr ,l)))
- (while ,l
- (let* ((it (car ,l))
- (,n ,form))
- (unless (equal ,v ,n)
- (!cons (nreverse ,s) ,r)
- (setq ,s nil)
- (setq ,v ,n))
- (!cons it ,s)
- (!cdr ,l)))
- (!cons (nreverse ,s) ,r)
- (nreverse ,r))))))
-
-(defun -partition-by (fn list)
- "Apply FN to each item in LIST, splitting it each time FN returns a new value."
- (--partition-by (funcall fn it) list))
-
-(defmacro --partition-by-header (form list)
- "Anaphoric form of `-partition-by-header'."
- (declare (debug (form form)))
- (let ((r (make-symbol "result"))
- (s (make-symbol "sublist"))
- (h (make-symbol "header-value"))
- (b (make-symbol "seen-body?"))
- (n (make-symbol "new-value"))
- (l (make-symbol "list")))
- `(let ((,l ,list))
- (when ,l
- (let* ((,r nil)
- (it (car ,l))
- (,s (list it))
- (,h ,form)
- (,b nil)
- (,l (cdr ,l)))
- (while ,l
- (let* ((it (car ,l))
- (,n ,form))
- (if (equal ,h ,n)
- (when ,b
- (!cons (nreverse ,s) ,r)
- (setq ,s nil)
- (setq ,b nil))
- (setq ,b t))
- (!cons it ,s)
- (!cdr ,l)))
- (!cons (nreverse ,s) ,r)
- (nreverse ,r))))))
-
-(defun -partition-by-header (fn list)
- "Apply FN to the first item in LIST. That is the header
-value. Apply FN to each item in LIST, splitting it each time FN
-returns the header value, but only after seeing at least one
-other value (the body)."
- (--partition-by-header (funcall fn it) list))
-
-(defun -partition-after-pred (pred list)
- "Partition directly after each time PRED is true on an element of LIST."
- (when list
- (let ((rest (-partition-after-pred pred
- (cdr list))))
- (if (funcall pred (car list))
- ;;split after (car list)
- (cons (list (car list))
- rest)
-
- ;;don't split after (car list)
- (cons (cons (car list)
- (car rest))
- (cdr rest))))))
-
-(defun -partition-before-pred (pred list)
- "Partition directly before each time PRED is true on an element of LIST."
- (nreverse (-map #'reverse
- (-partition-after-pred pred (reverse list)))))
-
-(defun -partition-after-item (item list)
- "Partition directly after each time ITEM appears in LIST."
- (-partition-after-pred (lambda (ele) (equal ele item))
- list))
-
-(defun -partition-before-item (item list)
- "Partition directly before each time ITEM appears in LIST."
- (-partition-before-pred (lambda (ele) (equal ele item))
- list))
-
-(defmacro --group-by (form list)
- "Anaphoric form of `-group-by'."
- (declare (debug t))
- (let ((n (make-symbol "n"))
- (k (make-symbol "k"))
- (grp (make-symbol "grp")))
- `(nreverse
- (-map
- (lambda (,n)
- (cons (car ,n)
- (nreverse (cdr ,n))))
- (--reduce-from
- (let* ((,k (,@form))
- (,grp (assoc ,k acc)))
- (if ,grp
- (setcdr ,grp (cons it (cdr ,grp)))
- (push
- (list ,k it)
- acc))
- acc)
- nil ,list)))))
-
-(defun -group-by (fn list)
- "Separate LIST into an alist whose keys are FN applied to the
-elements of LIST. Keys are compared by `equal'."
- (--group-by (funcall fn it) list))
-
-(defun -interpose (sep list)
- "Return a new list of all elements in LIST separated by SEP."
- (declare (pure t) (side-effect-free t))
- (let (result)
- (when list
- (!cons (car list) result)
- (!cdr list))
- (while list
- (setq result (cons (car list) (cons sep result)))
- (!cdr list))
- (nreverse result)))
-
-(defun -interleave (&rest lists)
- "Return a new list of the first item in each list, then the second etc."
- (declare (pure t) (side-effect-free t))
- (when lists
- (let (result)
- (while (-none? 'null lists)
- (--each lists (!cons (car it) result))
- (setq lists (-map 'cdr lists)))
- (nreverse result))))
-
-(defmacro --zip-with (form list1 list2)
- "Anaphoric form of `-zip-with'.
-
-The elements in list1 are bound as symbol `it', the elements in list2 as symbol `other'."
- (declare (debug (form form form)))
- (let ((r (make-symbol "result"))
- (l1 (make-symbol "list1"))
- (l2 (make-symbol "list2")))
- `(let ((,r nil)
- (,l1 ,list1)
- (,l2 ,list2))
- (while (and ,l1 ,l2)
- (let ((it (car ,l1))
- (other (car ,l2)))
- (!cons ,form ,r)
- (!cdr ,l1)
- (!cdr ,l2)))
- (nreverse ,r))))
-
-(defun -zip-with (fn list1 list2)
- "Zip the two lists LIST1 and LIST2 using a function FN. This
-function is applied pairwise taking as first argument element of
-LIST1 and as second argument element of LIST2 at corresponding
-position.
-
-The anaphoric form `--zip-with' binds the elements from LIST1 as symbol `it',
-and the elements from LIST2 as symbol `other'."
- (--zip-with (funcall fn it other) list1 list2))
-
-(defun -zip-lists (&rest lists)
- "Zip LISTS together. Group the head of each list, followed by the
-second elements of each list, and so on. The lengths of the returned
-groupings are equal to the length of the shortest input list.
-
-The return value is always list of lists, which is a difference
-from `-zip-pair' which returns a cons-cell in case two input
-lists are provided.
-
-See also: `-zip'"
- (declare (pure t) (side-effect-free t))
- (when lists
- (let (results)
- (while (-none? 'null lists)
- (setq results (cons (mapcar 'car lists) results))
- (setq lists (mapcar 'cdr lists)))
- (nreverse results))))
-
-(defun -zip (&rest lists)
- "Zip LISTS together. Group the head of each list, followed by the
-second elements of each list, and so on. The lengths of the returned
-groupings are equal to the length of the shortest input list.
-
-If two lists are provided as arguments, return the groupings as a list
-of cons cells. Otherwise, return the groupings as a list of lists.
-
-Use `-zip-lists' if you need the return value to always be a list
-of lists.
-
-Alias: `-zip-pair'
-
-See also: `-zip-lists'"
- (declare (pure t) (side-effect-free t))
- (when lists
- (let (results)
- (while (-none? 'null lists)
- (setq results (cons (mapcar 'car lists) results))
- (setq lists (mapcar 'cdr lists)))
- (setq results (nreverse results))
- (if (= (length lists) 2)
- ;; to support backward compatibility, return
- ;; a cons cell if two lists were provided
- (--map (cons (car it) (cadr it)) results)
- results))))
-
-(defalias '-zip-pair '-zip)
-
-(defun -zip-fill (fill-value &rest lists)
- "Zip LISTS, with FILL-VALUE padded onto the shorter lists. The
-lengths of the returned groupings are equal to the length of the
-longest input list."
- (declare (pure t) (side-effect-free t))
- (apply '-zip (apply '-pad (cons fill-value lists))))
-
-(defun -unzip (lists)
- "Unzip LISTS.
-
-This works just like `-zip' but takes a list of lists instead of
-a variable number of arguments, such that
-
- (-unzip (-zip L1 L2 L3 ...))
-
-is identity (given that the lists are the same length).
-
-Note in particular that calling this on a list of two lists will
-return a list of cons-cells such that the above identity works.
-
-See also: `-zip'"
- (apply '-zip lists))
-
-(defun -cycle (list)
- "Return an infinite copy of LIST that will cycle through the
-elements and repeat from the beginning."
- (declare (pure t) (side-effect-free t))
- (let ((newlist (-map 'identity list)))
- (nconc newlist newlist)))
-
-(defun -pad (fill-value &rest lists)
- "Appends FILL-VALUE to the end of each list in LISTS such that they
-will all have the same length."
- (let* ((annotations (-annotate 'length lists))
- (n (-max (-map 'car annotations))))
- (--map (append (cdr it) (-repeat (- n (car it)) fill-value)) annotations)))
-
-(defun -annotate (fn list)
- "Return a list of cons cells where each cell is FN applied to each
-element of LIST paired with the unmodified element of LIST."
- (-zip (-map fn list) list))
-
-(defmacro --annotate (form list)
- "Anaphoric version of `-annotate'."
- (declare (debug (form form)))
- `(-annotate (lambda (it) ,form) ,list))
-
-(defun dash--table-carry (lists restore-lists &optional re)
- "Helper for `-table' and `-table-flat'.
-
-If a list overflows, carry to the right and reset the list."
- (while (not (or (car lists)
- (equal lists '(nil))))
- (setcar lists (car restore-lists))
- (pop (cadr lists))
- (!cdr lists)
- (!cdr restore-lists)
- (when re
- (push (nreverse (car re)) (cadr re))
- (setcar re nil)
- (!cdr re))))
-
-(defun -table (fn &rest lists)
- "Compute outer product of LISTS using function FN.
-
-The function FN should have the same arity as the number of
-supplied lists.
-
-The outer product is computed by applying fn to all possible
-combinations created by taking one element from each list in
-order. The dimension of the result is (length lists).
-
-See also: `-table-flat'"
- (let ((restore-lists (copy-sequence lists))
- (last-list (last lists))
- (re (make-list (length lists) nil)))
- (while (car last-list)
- (let ((item (apply fn (-map 'car lists))))
- (push item (car re))
- (setcar lists (cdar lists)) ;; silence byte compiler
- (dash--table-carry lists restore-lists re)))
- (nreverse (car (last re)))))
-
-(defun -table-flat (fn &rest lists)
- "Compute flat outer product of LISTS using function FN.
-
-The function FN should have the same arity as the number of
-supplied lists.
-
-The outer product is computed by applying fn to all possible
-combinations created by taking one element from each list in
-order. The results are flattened, ignoring the tensor structure
-of the result. This is equivalent to calling:
-
- (-flatten-n (1- (length lists)) (apply \\='-table fn lists))
-
-but the implementation here is much more efficient.
-
-See also: `-flatten-n', `-table'"
- (let ((restore-lists (copy-sequence lists))
- (last-list (last lists))
- re)
- (while (car last-list)
- (let ((item (apply fn (-map 'car lists))))
- (push item re)
- (setcar lists (cdar lists)) ;; silence byte compiler
- (dash--table-carry lists restore-lists)))
- (nreverse re)))
-
-(defun -partial (fn &rest args)
- "Take a function FN and fewer than the normal arguments to FN,
-and return a fn that takes a variable number of additional ARGS.
-When called, the returned function calls FN with ARGS first and
-then additional args."
- (apply 'apply-partially fn args))
-
-(defun -elem-index (elem list)
- "Return the index of the first element in the given LIST which
-is equal to the query element ELEM, or nil if there is no
-such element."
- (declare (pure t) (side-effect-free t))
- (car (-elem-indices elem list)))
-
-(defun -elem-indices (elem list)
- "Return the indices of all elements in LIST equal to the query
-element ELEM, in ascending order."
- (declare (pure t) (side-effect-free t))
- (-find-indices (-partial 'equal elem) list))
-
-(defun -find-indices (pred list)
- "Return the indices of all elements in LIST satisfying the
-predicate PRED, in ascending order."
- (apply 'append (--map-indexed (when (funcall pred it) (list it-index)) list)))
-
-(defmacro --find-indices (form list)
- "Anaphoric version of `-find-indices'."
- (declare (debug (form form)))
- `(-find-indices (lambda (it) ,form) ,list))
-
-(defun -find-index (pred list)
- "Take a predicate PRED and a LIST and return the index of the
-first element in the list satisfying the predicate, or nil if
-there is no such element.
-
-See also `-first'."
- (car (-find-indices pred list)))
-
-(defmacro --find-index (form list)
- "Anaphoric version of `-find-index'."
- (declare (debug (form form)))
- `(-find-index (lambda (it) ,form) ,list))
-
-(defun -find-last-index (pred list)
- "Take a predicate PRED and a LIST and return the index of the
-last element in the list satisfying the predicate, or nil if
-there is no such element.
-
-See also `-last'."
- (-last-item (-find-indices pred list)))
-
-(defmacro --find-last-index (form list)
- "Anaphoric version of `-find-last-index'."
- `(-find-last-index (lambda (it) ,form) ,list))
-
-(defun -select-by-indices (indices list)
- "Return a list whose elements are elements from LIST selected
-as `(nth i list)` for all i from INDICES."
- (declare (pure t) (side-effect-free t))
- (let (r)
- (--each indices
- (!cons (nth it list) r))
- (nreverse r)))
-
-(defun -select-columns (columns table)
- "Select COLUMNS from TABLE.
-
-TABLE is a list of lists where each element represents one row.
-It is assumed each row has the same length.
-
-Each row is transformed such that only the specified COLUMNS are
-selected.
-
-See also: `-select-column', `-select-by-indices'"
- (declare (pure t) (side-effect-free t))
- (--map (-select-by-indices columns it) table))
-
-(defun -select-column (column table)
- "Select COLUMN from TABLE.
-
-TABLE is a list of lists where each element represents one row.
-It is assumed each row has the same length.
-
-The single selected column is returned as a list.
-
-See also: `-select-columns', `-select-by-indices'"
- (declare (pure t) (side-effect-free t))
- (--mapcat (-select-by-indices (list column) it) table))
-
-(defmacro -> (x &optional form &rest more)
- "Thread the expr through the forms. Insert X as the second item
-in the first form, making a list of it if it is not a list
-already. If there are more forms, insert the first form as the
-second item in second form, etc."
- (declare (debug (form &rest [&or symbolp (sexp &rest form)])))
- (cond
- ((null form) x)
- ((null more) (if (listp form)
- `(,(car form) ,x ,@(cdr form))
- (list form x)))
- (:else `(-> (-> ,x ,form) ,@more))))
-
-(defmacro ->> (x &optional form &rest more)
- "Thread the expr through the forms. Insert X as the last item
-in the first form, making a list of it if it is not a list
-already. If there are more forms, insert the first form as the
-last item in second form, etc."
- (declare (debug ->))
- (cond
- ((null form) x)
- ((null more) (if (listp form)
- `(,@form ,x)
- (list form x)))
- (:else `(->> (->> ,x ,form) ,@more))))
-
-(defmacro --> (x &rest forms)
- "Starting with the value of X, thread each expression through FORMS.
-
-Insert X at the position signified by the symbol `it' in the first
-form. If there are more forms, insert the first form at the position
-signified by `it' in in second form, etc."
- (declare (debug (form body)))
- `(-as-> ,x it ,@forms))
-
-(defmacro -as-> (value variable &rest forms)
- "Starting with VALUE, thread VARIABLE through FORMS.
-
-In the first form, bind VARIABLE to VALUE. In the second form, bind
-VARIABLE to the result of the first form, and so forth."
- (declare (debug (form symbolp body)))
- (if (null forms)
- `,value
- `(let ((,variable ,value))
- (-as-> ,(if (symbolp (car forms))
- (list (car forms) variable)
- (car forms))
- ,variable
- ,@(cdr forms)))))
-
-(defmacro -some-> (x &optional form &rest more)
- "When expr is non-nil, thread it through the first form (via `->'),
-and when that result is non-nil, through the next form, etc."
- (declare (debug ->)
- (indent 1))
- (if (null form) x
- (let ((result (make-symbol "result")))
- `(-some-> (-when-let (,result ,x)
- (-> ,result ,form))
- ,@more))))
-
-(defmacro -some->> (x &optional form &rest more)
- "When expr is non-nil, thread it through the first form (via `->>'),
-and when that result is non-nil, through the next form, etc."
- (declare (debug ->)
- (indent 1))
- (if (null form) x
- (let ((result (make-symbol "result")))
- `(-some->> (-when-let (,result ,x)
- (->> ,result ,form))
- ,@more))))
-
-(defmacro -some--> (x &optional form &rest more)
- "When expr in non-nil, thread it through the first form (via `-->'),
-and when that result is non-nil, through the next form, etc."
- (declare (debug ->)
- (indent 1))
- (if (null form) x
- (let ((result (make-symbol "result")))
- `(-some--> (-when-let (,result ,x)
- (--> ,result ,form))
- ,@more))))
-
-(defun -grade-up (comparator list)
- "Grade elements of LIST using COMPARATOR relation, yielding a
-permutation vector such that applying this permutation to LIST
-sorts it in ascending order."
- ;; ugly hack to "fix" lack of lexical scope
- (let ((comp `(lambda (it other) (funcall ',comparator (car it) (car other)))))
- (->> (--map-indexed (cons it it-index) list)
- (-sort comp)
- (-map 'cdr))))
-
-(defun -grade-down (comparator list)
- "Grade elements of LIST using COMPARATOR relation, yielding a
-permutation vector such that applying this permutation to LIST
-sorts it in descending order."
- ;; ugly hack to "fix" lack of lexical scope
- (let ((comp `(lambda (it other) (funcall ',comparator (car other) (car it)))))
- (->> (--map-indexed (cons it it-index) list)
- (-sort comp)
- (-map 'cdr))))
-
-(defvar dash--source-counter 0
- "Monotonic counter for generated symbols.")
-
-(defun dash--match-make-source-symbol ()
- "Generate a new dash-source symbol.
-
-All returned symbols are guaranteed to be unique."
- (prog1 (make-symbol (format "--dash-source-%d--" dash--source-counter))
- (setq dash--source-counter (1+ dash--source-counter))))
-
-(defun dash--match-ignore-place-p (symbol)
- "Return non-nil if SYMBOL is a symbol and starts with _."
- (and (symbolp symbol)
- (eq (aref (symbol-name symbol) 0) ?_)))
-
-(defun dash--match-cons-skip-cdr (skip-cdr source)
- "Helper function generating idiomatic shifting code."
- (cond
- ((= skip-cdr 0)
- `(pop ,source))
- (t
- `(prog1 ,(dash--match-cons-get-car skip-cdr source)
- (setq ,source ,(dash--match-cons-get-cdr (1+ skip-cdr) source))))))
-
-(defun dash--match-cons-get-car (skip-cdr source)
- "Helper function generating idiomatic code to get nth car."
- (cond
- ((= skip-cdr 0)
- `(car ,source))
- ((= skip-cdr 1)
- `(cadr ,source))
- (t
- `(nth ,skip-cdr ,source))))
-
-(defun dash--match-cons-get-cdr (skip-cdr source)
- "Helper function generating idiomatic code to get nth cdr."
- (cond
- ((= skip-cdr 0)
- source)
- ((= skip-cdr 1)
- `(cdr ,source))
- (t
- `(nthcdr ,skip-cdr ,source))))
-
-(defun dash--match-cons (match-form source)
- "Setup a cons matching environment and call the real matcher."
- (let ((s (dash--match-make-source-symbol))
- (n 0)
- (m match-form))
- (while (and (consp m)
- (dash--match-ignore-place-p (car m)))
- (setq n (1+ n)) (!cdr m))
- (cond
- ;; when we only have one pattern in the list, we don't have to
- ;; create a temporary binding (--dash-source--) for the source
- ;; and just use the input directly
- ((and (consp m)
- (not (cdr m)))
- (dash--match (car m) (dash--match-cons-get-car n source)))
- ;; handle other special types
- ((> n 0)
- (dash--match m (dash--match-cons-get-cdr n source)))
- ;; this is the only entry-point for dash--match-cons-1, that's
- ;; why we can't simply use the above branch, it would produce
- ;; infinite recursion
- (t
- (cons (list s source) (dash--match-cons-1 match-form s))))))
-
-(defun dash--get-expand-function (type)
- "Get expand function name for TYPE."
- (intern-soft (format "dash-expand:%s" type)))
-
-(defun dash--match-cons-1 (match-form source &optional props)
- "Match MATCH-FORM against SOURCE.
-
-MATCH-FORM is a proper or improper list. Each element of
-MATCH-FORM is either a symbol, which gets bound to the respective
-value in source or another match form which gets destructured
-recursively.
-
-If the cdr of last cons cell in the list is `nil', matching stops
-there.
-
-SOURCE is a proper or improper list."
- (let ((skip-cdr (or (plist-get props :skip-cdr) 0)))
- (cond
- ((consp match-form)
- (cond
- ((cdr match-form)
- (cond
- ((and (symbolp (car match-form))
- (functionp (dash--get-expand-function (car match-form))))
- (dash--match-kv (dash--match-kv-normalize-match-form match-form) (dash--match-cons-get-cdr skip-cdr source)))
- ((dash--match-ignore-place-p (car match-form))
- (dash--match-cons-1 (cdr match-form) source
- (plist-put props :skip-cdr (1+ skip-cdr))))
- (t
- (-concat (dash--match (car match-form) (dash--match-cons-skip-cdr skip-cdr source))
- (dash--match-cons-1 (cdr match-form) source)))))
- (t ;; Last matching place, no need for shift
- (dash--match (car match-form) (dash--match-cons-get-car skip-cdr source)))))
- ((eq match-form nil)
- nil)
- (t ;; Handle improper lists. Last matching place, no need for shift
- (dash--match match-form (dash--match-cons-get-cdr skip-cdr source))))))
-
-(defun dash--vector-tail (seq start)
- "Return the tail of SEQ starting at START."
- (cond
- ((vectorp seq)
- (let* ((re-length (- (length seq) start))
- (re (make-vector re-length 0)))
- (--dotimes re-length (aset re it (aref seq (+ it start))))
- re))
- ((stringp seq)
- (substring seq start))))
-
-(defun dash--match-vector (match-form source)
- "Setup a vector matching environment and call the real matcher."
- (let ((s (dash--match-make-source-symbol)))
- (cond
- ;; don't bind `s' if we only have one sub-pattern
- ((= (length match-form) 1)
- (dash--match (aref match-form 0) `(aref ,source 0)))
- ;; if the source is a symbol, we don't need to re-bind it
- ((symbolp source)
- (dash--match-vector-1 match-form source))
- ;; don't bind `s' if we only have one sub-pattern which is not ignored
- ((let* ((ignored-places (mapcar 'dash--match-ignore-place-p match-form))
- (ignored-places-n (length (-remove 'null ignored-places))))
- (when (= ignored-places-n (1- (length match-form)))
- (let ((n (-find-index 'null ignored-places)))
- (dash--match (aref match-form n) `(aref ,source ,n))))))
- (t
- (cons (list s source) (dash--match-vector-1 match-form s))))))
-
-(defun dash--match-vector-1 (match-form source)
- "Match MATCH-FORM against SOURCE.
-
-MATCH-FORM is a vector. Each element of MATCH-FORM is either a
-symbol, which gets bound to the respective value in source or
-another match form which gets destructured recursively.
-
-If second-from-last place in MATCH-FORM is the symbol &rest, the
-next element of the MATCH-FORM is matched against the tail of
-SOURCE, starting at index of the &rest symbol. This is
-conceptually the same as the (head . tail) match for improper
-lists, where dot plays the role of &rest.
-
-SOURCE is a vector.
-
-If the MATCH-FORM vector is shorter than SOURCE vector, only
-the (length MATCH-FORM) places are bound, the rest of the SOURCE
-is discarded."
- (let ((i 0)
- (l (length match-form))
- (re))
- (while (< i l)
- (let ((m (aref match-form i)))
- (push (cond
- ((and (symbolp m)
- (eq m '&rest))
- (prog1 (dash--match
- (aref match-form (1+ i))
- `(dash--vector-tail ,source ,i))
- (setq i l)))
- ((and (symbolp m)
- ;; do not match symbols starting with _
- (not (eq (aref (symbol-name m) 0) ?_)))
- (list (list m `(aref ,source ,i))))
- ((not (symbolp m))
- (dash--match m `(aref ,source ,i))))
- re)
- (setq i (1+ i))))
- (-flatten-n 1 (nreverse re))))
-
-(defun dash--match-kv-normalize-match-form (pattern)
- "Normalize kv PATTERN.
-
-This method normalizes PATTERN to the format expected by
-`dash--match-kv'. See `-let' for the specification."
- (let ((normalized (list (car pattern)))
- (skip nil)
- (fill-placeholder (make-symbol "--dash-fill-placeholder--")))
- (-each (apply '-zip (-pad fill-placeholder (cdr pattern) (cddr pattern)))
- (lambda (pair)
- (let ((current (car pair))
- (next (cdr pair)))
- (if skip
- (setq skip nil)
- (if (or (eq fill-placeholder next)
- (not (or (and (symbolp next)
- (not (keywordp next))
- (not (eq next t))
- (not (eq next nil)))
- (and (consp next)
- (not (eq (car next) 'quote)))
- (vectorp next))))
- (progn
- (cond
- ((keywordp current)
- (push current normalized)
- (push (intern (substring (symbol-name current) 1)) normalized))
- ((stringp current)
- (push current normalized)
- (push (intern current) normalized))
- ((and (consp current)
- (eq (car current) 'quote))
- (push current normalized)
- (push (cadr current) normalized))
- (t (error "-let: found key `%s' in kv destructuring but its pattern `%s' is invalid and can not be derived from the key" current next)))
- (setq skip nil))
- (push current normalized)
- (push next normalized)
- (setq skip t))))))
- (nreverse normalized)))
-
-(defun dash--match-kv (match-form source)
- "Setup a kv matching environment and call the real matcher.
-
-kv can be any key-value store, such as plist, alist or hash-table."
- (let ((s (dash--match-make-source-symbol)))
- (cond
- ;; don't bind `s' if we only have one sub-pattern (&type key val)
- ((= (length match-form) 3)
- (dash--match-kv-1 (cdr match-form) source (car match-form)))
- ;; if the source is a symbol, we don't need to re-bind it
- ((symbolp source)
- (dash--match-kv-1 (cdr match-form) source (car match-form)))
- (t
- (cons (list s source) (dash--match-kv-1 (cdr match-form) s (car match-form)))))))
-
-(defun dash-expand:&hash (key source)
- "Generate extracting KEY from SOURCE for &hash destructuring."
- `(gethash ,key ,source))
-
-(defun dash-expand:&plist (key source)
- "Generate extracting KEY from SOURCE for &plist destructuring."
- `(plist-get ,source ,key))
-
-(defun dash-expand:&alist (key source)
- "Generate extracting KEY from SOURCE for &alist destructuring."
- `(cdr (assoc ,key ,source)))
-
-(defun dash-expand:&hash? (key source)
- "Generate extracting KEY from SOURCE for &hash? destructuring.
-Similar to &hash but check whether the map is not nil."
- (let ((src (make-symbol "src")))
- `(let ((,src ,source))
- (when ,src (gethash ,key ,src)))))
-
-(defalias 'dash-expand:&keys 'dash-expand:&plist)
-
-(defun dash--match-kv-1 (match-form source type)
- "Match MATCH-FORM against SOURCE of type TYPE.
-
-MATCH-FORM is a proper list of the form (key1 place1 ... keyN
-placeN). Each placeK is either a symbol, which gets bound to the
-value of keyK retrieved from the key-value store, or another
-match form which gets destructured recursively.
-
-SOURCE is a key-value store of type TYPE, which can be a plist,
-an alist or a hash table.
-
-TYPE is a token specifying the type of the key-value store.
-Valid values are &plist, &alist and &hash."
- (-flatten-n 1 (-map
- (lambda (kv)
- (let* ((k (car kv))
- (v (cadr kv))
- (getter
- (funcall (dash--get-expand-function type) k source)))
- (cond
- ((symbolp v)
- (list (list v getter)))
- (t (dash--match v getter)))))
- (-partition 2 match-form))))
-
-(defun dash--match-symbol (match-form source)
- "Bind a symbol.
-
-This works just like `let', there is no destructuring."
- (list (list match-form source)))
-
-(defun dash--match (match-form source)
- "Match MATCH-FORM against SOURCE.
-
-This function tests the MATCH-FORM and dispatches to specific
-matchers based on the type of the expression.
-
-Key-value stores are disambiguated by placing a token &plist,
-&alist or &hash as a first item in the MATCH-FORM."
- (cond
- ((symbolp match-form)
- (dash--match-symbol match-form source))
- ((consp match-form)
- (cond
- ;; Handle the "x &as" bindings first.
- ((and (consp (cdr match-form))
- (symbolp (car match-form))
- (eq '&as (cadr match-form)))
- (let ((s (car match-form)))
- (cons (list s source)
- (dash--match (cddr match-form) s))))
- ((functionp (dash--get-expand-function (car match-form)))
- (dash--match-kv (dash--match-kv-normalize-match-form match-form) source))
- (t (dash--match-cons match-form source))))
- ((vectorp match-form)
- ;; We support the &as binding in vectors too
- (cond
- ((and (> (length match-form) 2)
- (symbolp (aref match-form 0))
- (eq '&as (aref match-form 1)))
- (let ((s (aref match-form 0)))
- (cons (list s source)
- (dash--match (dash--vector-tail match-form 2) s))))
- (t (dash--match-vector match-form source))))))
-
-(defun dash--normalize-let-varlist (varlist)
- "Normalize VARLIST so that every binding is a list.
-
-`let' allows specifying a binding which is not a list but simply
-the place which is then automatically bound to nil, such that all
-three of the following are identical and evaluate to nil.
-
- (let (a) a)
- (let ((a)) a)
- (let ((a nil)) a)
-
-This function normalizes all of these to the last form."
- (--map (if (consp it) it (list it nil)) varlist))
-
-(defmacro -let* (varlist &rest body)
- "Bind variables according to VARLIST then eval BODY.
-
-VARLIST is a list of lists of the form (PATTERN SOURCE). Each
-PATTERN is matched against the SOURCE structurally. SOURCE is
-only evaluated once for each PATTERN.
-
-Each SOURCE can refer to the symbols already bound by this
-VARLIST. This is useful if you want to destructure SOURCE
-recursively but also want to name the intermediate structures.
-
-See `-let' for the list of all possible patterns."
- (declare (debug ((&rest [&or (sexp form) sexp]) body))
- (indent 1))
- (let* ((varlist (dash--normalize-let-varlist varlist))
- (bindings (--mapcat (dash--match (car it) (cadr it)) varlist)))
- `(let* ,bindings
- ,@body)))
-
-(defmacro -let (varlist &rest body)
- "Bind variables according to VARLIST then eval BODY.
-
-VARLIST is a list of lists of the form (PATTERN SOURCE). Each
-PATTERN is matched against the SOURCE \"structurally\". SOURCE
-is only evaluated once for each PATTERN. Each PATTERN is matched
-recursively, and can therefore contain sub-patterns which are
-matched against corresponding sub-expressions of SOURCE.
-
-All the SOURCEs are evalled before any symbols are
-bound (i.e. \"in parallel\").
-
-If VARLIST only contains one (PATTERN SOURCE) element, you can
-optionally specify it using a vector and discarding the
-outer-most parens. Thus
-
- (-let ((PATTERN SOURCE)) ..)
-
-becomes
-
- (-let [PATTERN SOURCE] ..).
-
-`-let' uses a convention of not binding places (symbols) starting
-with _ whenever it's possible. You can use this to skip over
-entries you don't care about. However, this is not *always*
-possible (as a result of implementation) and these symbols might
-get bound to undefined values.
-
-Following is the overview of supported patterns. Remember that
-patterns can be matched recursively, so every a, b, aK in the
-following can be a matching construct and not necessarily a
-symbol/variable.
-
-Symbol:
-
- a - bind the SOURCE to A. This is just like regular `let'.
-
-Conses and lists:
-
- (a) - bind `car' of cons/list to A
-
- (a . b) - bind car of cons to A and `cdr' to B
-
- (a b) - bind car of list to A and `cadr' to B
-
- (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to A3 ...
-
- (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to REST.
-
-Vectors:
-
- [a] - bind 0th element of a non-list sequence to A (works with
- vectors, strings, bit arrays...)
-
- [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st to
- A1, 2nd to A2, ...
- If the PATTERN is shorter than SOURCE, the values at
- places not in PATTERN are ignored.
- If the PATTERN is longer than SOURCE, an `error' is
- thrown.
-
- [a1 a2 a3 ... &rest rest] - as above, but bind the rest of
- the sequence to REST. This is
- conceptually the same as improper list
- matching (a1 a2 ... aN . rest)
-
-Key/value stores:
-
- (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the
- SOURCE plist to aK. If the
- value is not found, aK is nil.
- Uses `plist-get' to fetch values.
-
- (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the
- SOURCE alist to aK. If the
- value is not found, aK is nil.
- Uses `assoc' to fetch values.
-
- (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the
- SOURCE hash table to aK. If the
- value is not found, aK is nil.
- Uses `gethash' to fetch values.
-
-Further, special keyword &keys supports \"inline\" matching of
-plist-like key-value pairs, similarly to &keys keyword of
-`cl-defun'.
-
- (a1 a2 ... aN &keys key1 b1 ... keyN bK)
-
-This binds N values from the list to a1 ... aN, then interprets
-the cdr as a plist (see key/value matching above).
-
-A shorthand notation for kv-destructuring exists which allows the
-patterns be optionally left out and derived from the key name in
-the following fashion:
-
-- a key :foo is converted into `foo' pattern,
-- a key 'bar is converted into `bar' pattern,
-- a key \"baz\" is converted into `baz' pattern.
-
-That is, the entire value under the key is bound to the derived
-variable without any further destructuring.
-
-This is possible only when the form following the key is not a
-valid pattern (i.e. not a symbol, a cons cell or a vector).
-Otherwise the matching proceeds as usual and in case of an
-invalid spec fails with an error.
-
-Thus the patterns are normalized as follows:
-
- ;; derive all the missing patterns
- (&plist :foo 'bar \"baz\") => (&plist :foo foo 'bar bar \"baz\" baz)
-
- ;; we can specify some but not others
- (&plist :foo 'bar explicit-bar) => (&plist :foo foo 'bar explicit-bar)
-
- ;; nothing happens, we store :foo in x
- (&plist :foo x) => (&plist :foo x)
-
- ;; nothing happens, we match recursively
- (&plist :foo (a b c)) => (&plist :foo (a b c))
-
-You can name the source using the syntax SYMBOL &as PATTERN.
-This syntax works with lists (proper or improper), vectors and
-all types of maps.
-
- (list &as a b c) (list 1 2 3)
-
-binds A to 1, B to 2, C to 3 and LIST to (1 2 3).
-
-Similarly:
-
- (bounds &as beg . end) (cons 1 2)
-
-binds BEG to 1, END to 2 and BOUNDS to (1 . 2).
-
- (items &as first . rest) (list 1 2 3)
-
-binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3)
-
- [vect &as _ b c] [1 2 3]
-
-binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as usual).
-
- (plist &as &plist :b b) (list :a 1 :b 2 :c 3)
-
-binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and &hash.
-
-This is especially useful when we want to capture the result of a
-computation and destructure at the same time. Consider the
-form (function-returning-complex-structure) returning a list of
-two vectors with two items each. We want to capture this entire
-result and pass it to another computation, but at the same time
-we want to get the second item from each vector. We can achieve
-it with pattern
-
- (result &as [_ a] [_ b]) (function-returning-complex-structure)
-
-Note: Clojure programmers may know this feature as the \":as
-binding\". The difference is that we put the &as at the front
-because we need to support improper list binding."
- (declare (debug ([&or (&rest [&or (sexp form) sexp])
- (vector [&rest [sexp form]])]
- body))
- (indent 1))
- (if (vectorp varlist)
- `(let* ,(dash--match (aref varlist 0) (aref varlist 1))
- ,@body)
- (let* ((varlist (dash--normalize-let-varlist varlist))
- (inputs (--map-indexed (list (make-symbol (format "input%d" it-index)) (cadr it)) varlist))
- (new-varlist (--map (list (caar it) (cadr it)) (-zip varlist inputs))))
- `(let ,inputs
- (-let* ,new-varlist ,@body)))))
-
-(defmacro -lambda (match-form &rest body)
- "Return a lambda which destructures its input as MATCH-FORM and executes BODY.
-
-Note that you have to enclose the MATCH-FORM in a pair of parens,
-such that:
-
- (-lambda (x) body)
- (-lambda (x y ...) body)
-
-has the usual semantics of `lambda'. Furthermore, these get
-translated into normal lambda, so there is no performance
-penalty.
-
-See `-let' for the description of destructuring mechanism."
- (declare (doc-string 2) (indent defun)
- (debug (&define sexp
- [&optional stringp]
- [&optional ("interactive" interactive)]
- def-body)))
- (cond
- ((not (consp match-form))
- (signal 'wrong-type-argument "match-form must be a list"))
- ;; no destructuring, so just return regular lambda to make things faster
- ((-all? 'symbolp match-form)
- `(lambda ,match-form ,@body))
- (t
- (let* ((inputs (--map-indexed (list it (make-symbol (format "input%d" it-index))) match-form)))
- ;; TODO: because inputs to the lambda are evaluated only once,
- ;; -let* need not to create the extra bindings to ensure that.
- ;; We should find a way to optimize that. Not critical however.
- `(lambda ,(--map (cadr it) inputs)
- (-let* ,inputs ,@body))))))
-
-(defmacro -setq (&rest forms)
- "Bind each MATCH-FORM to the value of its VAL.
-
-MATCH-FORM destructuring is done according to the rules of `-let'.
-
-This macro allows you to bind multiple variables by destructuring
-the value, so for example:
-
- (-setq (a b) x
- (&plist :c c) plist)
-
-expands roughly speaking to the following code
-
- (setq a (car x)
- b (cadr x)
- c (plist-get plist :c))
-
-Care is taken to only evaluate each VAL once so that in case of
-multiple assignments it does not cause unexpected side effects.
-
-\(fn [MATCH-FORM VAL]...)"
- (declare (debug (&rest sexp form))
- (indent 1))
- (when (= (mod (length forms) 2) 1)
- (error "Odd number of arguments"))
- (let* ((forms-and-sources
- ;; First get all the necessary mappings with all the
- ;; intermediate bindings.
- (-map (lambda (x) (dash--match (car x) (cadr x)))
- (-partition 2 forms)))
- ;; To preserve the logic of dynamic scoping we must ensure
- ;; that we `setq' the variables outside of the `let*' form
- ;; which holds the destructured intermediate values. For
- ;; this we generate for each variable a placeholder which is
- ;; bound to (lexically) the result of the destructuring.
- ;; Then outside of the helper `let*' form we bind all the
- ;; original variables to their respective placeholders.
- ;; TODO: There is a lot of room for possible optimization,
- ;; for start playing with `special-variable-p' to eliminate
- ;; unnecessary re-binding.
- (variables-to-placeholders
- (-mapcat
- (lambda (bindings)
- (-map
- (lambda (binding)
- (let ((var (car binding)))
- (list var (make-symbol (concat "--dash-binding-" (symbol-name var) "--")))))
- (--filter (not (string-prefix-p "--" (symbol-name (car it)))) bindings)))
- forms-and-sources)))
- `(let ,(-map 'cadr variables-to-placeholders)
- (let* ,(-flatten-n 1 forms-and-sources)
- (setq ,@(-flatten (-map 'reverse variables-to-placeholders))))
- (setq ,@(-flatten variables-to-placeholders)))))
-
-(defmacro -if-let* (vars-vals then &rest else)
- "If all VALS evaluate to true, bind them to their corresponding
-VARS and do THEN, otherwise do ELSE. VARS-VALS should be a list
-of (VAR VAL) pairs.
-
-Note: binding is done according to `-let*'. VALS are evaluated
-sequentially, and evaluation stops after the first nil VAL is
-encountered."
- (declare (debug ((&rest (sexp form)) form body))
- (indent 2))
- (->> vars-vals
- (--mapcat (dash--match (car it) (cadr it)))
- (--reduce-r-from
- (let ((var (car it))
- (val (cadr it)))
- `(let ((,var ,val))
- (if ,var ,acc ,@else)))
- then)))
-
-(defmacro -if-let (var-val then &rest else)
- "If VAL evaluates to non-nil, bind it to VAR and do THEN,
-otherwise do ELSE.
-
-Note: binding is done according to `-let'.
-
-\(fn (VAR VAL) THEN &rest ELSE)"
- (declare (debug ((sexp form) form body))
- (indent 2))
- `(-if-let* (,var-val) ,then ,@else))
-
-(defmacro --if-let (val then &rest else)
- "If VAL evaluates to non-nil, bind it to symbol `it' and do THEN,
-otherwise do ELSE."
- (declare (debug (form form body))
- (indent 2))
- `(-if-let (it ,val) ,then ,@else))
-
-(defmacro -when-let* (vars-vals &rest body)
- "If all VALS evaluate to true, bind them to their corresponding
-VARS and execute body. VARS-VALS should be a list of (VAR VAL)
-pairs.
-
-Note: binding is done according to `-let*'. VALS are evaluated
-sequentially, and evaluation stops after the first nil VAL is
-encountered."
- (declare (debug ((&rest (sexp form)) body))
- (indent 1))
- `(-if-let* ,vars-vals (progn ,@body)))
-
-(defmacro -when-let (var-val &rest body)
- "If VAL evaluates to non-nil, bind it to VAR and execute body.
-
-Note: binding is done according to `-let'.
-
-\(fn (VAR VAL) &rest BODY)"
- (declare (debug ((sexp form) body))
- (indent 1))
- `(-if-let ,var-val (progn ,@body)))
-
-(defmacro --when-let (val &rest body)
- "If VAL evaluates to non-nil, bind it to symbol `it' and
-execute body."
- (declare (debug (form body))
- (indent 1))
- `(--if-let ,val (progn ,@body)))
-
-(defvar -compare-fn nil
- "Tests for equality use this function or `equal' if this is nil.
-It should only be set using dynamic scope with a let, like:
-
- (let ((-compare-fn #\\='=)) (-union numbers1 numbers2 numbers3)")
-
-(defun -distinct (list)
- "Return a new list with all duplicates removed.
-The test for equality is done with `equal',
-or with `-compare-fn' if that's non-nil.
-
-Alias: `-uniq'"
- ;; Implementation note: The speedup gained from hash table lookup
- ;; starts to outweigh its overhead for lists of length greater than
- ;; 32. See discussion in PR #305.
- (let* ((len (length list))
- (lut (and (> len 32)
- ;; Check that `-compare-fn' is a valid hash-table
- ;; lookup function or `nil'.
- (memq -compare-fn '(nil equal eq eql))
- (make-hash-table :test (or -compare-fn #'equal)
- :size len))))
- (if lut
- (--filter (unless (gethash it lut)
- (puthash it t lut))
- list)
- (--each list (unless (-contains? lut it) (!cons it lut)))
- (nreverse lut))))
-
-(defalias '-uniq '-distinct)
-
-(defun -union (list list2)
- "Return a new list containing the elements of LIST and elements of LIST2 that are not in LIST.
-The test for equality is done with `equal',
-or with `-compare-fn' if that's non-nil."
- ;; We fall back to iteration implementation if the comparison
- ;; function isn't one of `eq', `eql' or `equal'.
- (let* ((result (reverse list))
- ;; TODO: get rid of this dynamic variable, pass it as an
- ;; argument instead.
- (-compare-fn (if (bound-and-true-p -compare-fn)
- -compare-fn
- 'equal)))
- (if (memq -compare-fn '(eq eql equal))
- (let ((ht (make-hash-table :test -compare-fn)))
- (--each list (puthash it t ht))
- (--each list2 (unless (gethash it ht) (!cons it result))))
- (--each list2 (unless (-contains? result it) (!cons it result))))
- (nreverse result)))
-
-(defun -intersection (list list2)
- "Return a new list containing only the elements that are members of both LIST and LIST2.
-The test for equality is done with `equal',
-or with `-compare-fn' if that's non-nil."
- (--filter (-contains? list2 it) list))
-
-(defun -difference (list list2)
- "Return a new list with only the members of LIST that are not in LIST2.
-The test for equality is done with `equal',
-or with `-compare-fn' if that's non-nil."
- (--filter (not (-contains? list2 it)) list))
-
-(defun -powerset (list)
- "Return the power set of LIST."
- (if (null list) '(())
- (let ((last (-powerset (cdr list))))
- (append (mapcar (lambda (x) (cons (car list) x)) last)
- last))))
-
-(defun -permutations (list)
- "Return the permutations of LIST."
- (if (null list) '(())
- (apply #'append
- (mapcar (lambda (x)
- (mapcar (lambda (perm) (cons x perm))
- (-permutations (remove x list))))
- list))))
-
-(defun -inits (list)
- "Return all prefixes of LIST."
- (let ((res (list list)))
- (setq list (reverse list))
- (while list
- (push (reverse (!cdr list)) res))
- res))
-
-(defun -tails (list)
- "Return all suffixes of LIST"
- (-reductions-r-from 'cons nil list))
-
-(defun -common-prefix (&rest lists)
- "Return the longest common prefix of LISTS."
- (declare (pure t) (side-effect-free t))
- (--reduce (--take-while (and acc (equal (pop acc) it)) it)
- lists))
-
-(defun -common-suffix (&rest lists)
- "Return the longest common suffix of LISTS."
- (nreverse (apply #'-common-prefix (mapcar #'reverse lists))))
-
-(defun -contains? (list element)
- "Return non-nil if LIST contains ELEMENT.
-
-The test for equality is done with `equal', or with `-compare-fn'
-if that's non-nil.
-
-Alias: `-contains-p'"
- (not
- (null
- (cond
- ((null -compare-fn) (member element list))
- ((eq -compare-fn 'eq) (memq element list))
- ((eq -compare-fn 'eql) (memql element list))
- (t
- (let ((lst list))
- (while (and lst
- (not (funcall -compare-fn element (car lst))))
- (setq lst (cdr lst)))
- lst))))))
-
-(defalias '-contains-p '-contains?)
-
-(defun -same-items? (list list2)
- "Return true if LIST and LIST2 has the same items.
-
-The order of the elements in the lists does not matter.
-
-Alias: `-same-items-p'"
- (let ((length-a (length list))
- (length-b (length list2)))
- (and
- (= length-a length-b)
- (= length-a (length (-intersection list list2))))))
-
-(defalias '-same-items-p '-same-items?)
-
-(defun -is-prefix? (prefix list)
- "Return non-nil if PREFIX is prefix of LIST.
-
-Alias: `-is-prefix-p'"
- (declare (pure t) (side-effect-free t))
- (--each-while list (equal (car prefix) it)
- (!cdr prefix))
- (not prefix))
-
-(defun -is-suffix? (suffix list)
- "Return non-nil if SUFFIX is suffix of LIST.
-
-Alias: `-is-suffix-p'"
- (declare (pure t) (side-effect-free t))
- (-is-prefix? (reverse suffix) (reverse list)))
-
-(defun -is-infix? (infix list)
- "Return non-nil if INFIX is infix of LIST.
-
-This operation runs in O(n^2) time
-
-Alias: `-is-infix-p'"
- (declare (pure t) (side-effect-free t))
- (let (done)
- (while (and (not done) list)
- (setq done (-is-prefix? infix list))
- (!cdr list))
- done))
-
-(defalias '-is-prefix-p '-is-prefix?)
-(defalias '-is-suffix-p '-is-suffix?)
-(defalias '-is-infix-p '-is-infix?)
-
-(defun -sort (comparator list)
- "Sort LIST, stably, comparing elements using COMPARATOR.
-Return the sorted list. LIST is NOT modified by side effects.
-COMPARATOR is called with two elements of LIST, and should return non-nil
-if the first element should sort before the second."
- (sort (copy-sequence list) comparator))
-
-(defmacro --sort (form list)
- "Anaphoric form of `-sort'."
- (declare (debug (form form)))
- `(-sort (lambda (it other) ,form) ,list))
-
-(defun -list (&rest args)
- "Return a list with ARGS.
-
-If first item of ARGS is already a list, simply return ARGS. If
-not, return a list with ARGS as elements."
- (declare (pure t) (side-effect-free t))
- (let ((arg (car args)))
- (if (listp arg) arg args)))
-
-(defun -repeat (n x)
- "Return a list with X repeated N times.
-Return nil if N is less than 1."
- (declare (pure t) (side-effect-free t))
- (let (ret)
- (--dotimes n (!cons x ret))
- ret))
-
-(defun -sum (list)
- "Return the sum of LIST."
- (declare (pure t) (side-effect-free t))
- (apply '+ list))
-
-(defun -running-sum (list)
- "Return a list with running sums of items in LIST.
-
-LIST must be non-empty."
- (declare (pure t) (side-effect-free t))
- (unless (consp list)
- (error "LIST must be non-empty"))
- (-reductions '+ list))
-
-(defun -product (list)
- "Return the product of LIST."
- (declare (pure t) (side-effect-free t))
- (apply '* list))
-
-(defun -running-product (list)
- "Return a list with running products of items in LIST.
-
-LIST must be non-empty."
- (declare (pure t) (side-effect-free t))
- (unless (consp list)
- (error "LIST must be non-empty"))
- (-reductions '* list))
-
-(defun -max (list)
- "Return the largest value from LIST of numbers or markers."
- (declare (pure t) (side-effect-free t))
- (apply 'max list))
-
-(defun -min (list)
- "Return the smallest value from LIST of numbers or markers."
- (declare (pure t) (side-effect-free t))
- (apply 'min list))
-
-(defun -max-by (comparator list)
- "Take a comparison function COMPARATOR and a LIST and return
-the greatest element of the list by the comparison function.
-
-See also combinator `-on' which can transform the values before
-comparing them."
- (--reduce (if (funcall comparator it acc) it acc) list))
-
-(defun -min-by (comparator list)
- "Take a comparison function COMPARATOR and a LIST and return
-the least element of the list by the comparison function.
-
-See also combinator `-on' which can transform the values before
-comparing them."
- (--reduce (if (funcall comparator it acc) acc it) list))
-
-(defmacro --max-by (form list)
- "Anaphoric version of `-max-by'.
-
-The items for the comparator form are exposed as \"it\" and \"other\"."
- (declare (debug (form form)))
- `(-max-by (lambda (it other) ,form) ,list))
-
-(defmacro --min-by (form list)
- "Anaphoric version of `-min-by'.
-
-The items for the comparator form are exposed as \"it\" and \"other\"."
- (declare (debug (form form)))
- `(-min-by (lambda (it other) ,form) ,list))
-
-(defun -iterate (fun init n)
- "Return a list of iterated applications of FUN to INIT.
-
-This means a list of form:
-
- (init (fun init) (fun (fun init)) ...)
-
-N is the length of the returned list."
- (if (= n 0) nil
- (let ((r (list init)))
- (--dotimes (1- n)
- (push (funcall fun (car r)) r))
- (nreverse r))))
-
-(defun -fix (fn list)
- "Compute the (least) fixpoint of FN with initial input LIST.
-
-FN is called at least once, results are compared with `equal'."
- (let ((re (funcall fn list)))
- (while (not (equal list re))
- (setq list re)
- (setq re (funcall fn re)))
- re))
-
-(defmacro --fix (form list)
- "Anaphoric form of `-fix'."
- `(-fix (lambda (it) ,form) ,list))
-
-(defun -unfold (fun seed)
- "Build a list from SEED using FUN.
-
-This is \"dual\" operation to `-reduce-r': while -reduce-r
-consumes a list to produce a single value, `-unfold' takes a
-seed value and builds a (potentially infinite!) list.
-
-FUN should return `nil' to stop the generating process, or a
-cons (A . B), where A will be prepended to the result and B is
-the new seed."
- (let ((last (funcall fun seed)) r)
- (while last
- (push (car last) r)
- (setq last (funcall fun (cdr last))))
- (nreverse r)))
-
-(defmacro --unfold (form seed)
- "Anaphoric version of `-unfold'."
- (declare (debug (form form)))
- `(-unfold (lambda (it) ,form) ,seed))
-
-(defun -cons-pair? (con)
- "Return non-nil if CON is true cons pair.
-That is (A . B) where B is not a list.
-
-Alias: `-cons-pair-p'"
- (declare (pure t) (side-effect-free t))
- (and (listp con)
- (not (listp (cdr con)))))
-
-(defalias '-cons-pair-p '-cons-pair?)
-
-(defun -cons-to-list (con)
- "Convert a cons pair to a list with `car' and `cdr' of the pair respectively."
- (declare (pure t) (side-effect-free t))
- (list (car con) (cdr con)))
-
-(defun -value-to-list (val)
- "Convert a value to a list.
-
-If the value is a cons pair, make a list with two elements, `car'
-and `cdr' of the pair respectively.
-
-If the value is anything else, wrap it in a list."
- (declare (pure t) (side-effect-free t))
- (cond
- ((-cons-pair? val) (-cons-to-list val))
- (t (list val))))
-
-(defun -tree-mapreduce-from (fn folder init-value tree)
- "Apply FN to each element of TREE, and make a list of the results.
-If elements of TREE are lists themselves, apply FN recursively to
-elements of these nested lists.
-
-Then reduce the resulting lists using FOLDER and initial value
-INIT-VALUE. See `-reduce-r-from'.
-
-This is the same as calling `-tree-reduce-from' after `-tree-map'
-but is twice as fast as it only traverse the structure once."
- (cond
- ((not tree) nil)
- ((-cons-pair? tree) (funcall fn tree))
- ((listp tree)
- (-reduce-r-from folder init-value (mapcar (lambda (x) (-tree-mapreduce-from fn folder init-value x)) tree)))
- (t (funcall fn tree))))
-
-(defmacro --tree-mapreduce-from (form folder init-value tree)
- "Anaphoric form of `-tree-mapreduce-from'."
- (declare (debug (form form form form)))
- `(-tree-mapreduce-from (lambda (it) ,form) (lambda (it acc) ,folder) ,init-value ,tree))
-
-(defun -tree-mapreduce (fn folder tree)
- "Apply FN to each element of TREE, and make a list of the results.
-If elements of TREE are lists themselves, apply FN recursively to
-elements of these nested lists.
-
-Then reduce the resulting lists using FOLDER and initial value
-INIT-VALUE. See `-reduce-r-from'.
-
-This is the same as calling `-tree-reduce' after `-tree-map'
-but is twice as fast as it only traverse the structure once."
- (cond
- ((not tree) nil)
- ((-cons-pair? tree) (funcall fn tree))
- ((listp tree)
- (-reduce-r folder (mapcar (lambda (x) (-tree-mapreduce fn folder x)) tree)))
- (t (funcall fn tree))))
-
-(defmacro --tree-mapreduce (form folder tree)
- "Anaphoric form of `-tree-mapreduce'."
- (declare (debug (form form form)))
- `(-tree-mapreduce (lambda (it) ,form) (lambda (it acc) ,folder) ,tree))
-
-(defun -tree-map (fn tree)
- "Apply FN to each element of TREE while preserving the tree structure."
- (cond
- ((not tree) nil)
- ((-cons-pair? tree) (funcall fn tree))
- ((listp tree)
- (mapcar (lambda (x) (-tree-map fn x)) tree))
- (t (funcall fn tree))))
-
-(defmacro --tree-map (form tree)
- "Anaphoric form of `-tree-map'."
- (declare (debug (form form)))
- `(-tree-map (lambda (it) ,form) ,tree))
-
-(defun -tree-reduce-from (fn init-value tree)
- "Use FN to reduce elements of list TREE.
-If elements of TREE are lists themselves, apply the reduction recursively.
-
-FN is first applied to INIT-VALUE and first element of the list,
-then on this result and second element from the list etc.
-
-The initial value is ignored on cons pairs as they always contain
-two elements."
- (cond
- ((not tree) nil)
- ((-cons-pair? tree) tree)
- ((listp tree)
- (-reduce-r-from fn init-value (mapcar (lambda (x) (-tree-reduce-from fn init-value x)) tree)))
- (t tree)))
-
-(defmacro --tree-reduce-from (form init-value tree)
- "Anaphoric form of `-tree-reduce-from'."
- (declare (debug (form form form)))
- `(-tree-reduce-from (lambda (it acc) ,form) ,init-value ,tree))
-
-(defun -tree-reduce (fn tree)
- "Use FN to reduce elements of list TREE.
-If elements of TREE are lists themselves, apply the reduction recursively.
-
-FN is first applied to first element of the list and second
-element, then on this result and third element from the list etc.
-
-See `-reduce-r' for how exactly are lists of zero or one element handled."
- (cond
- ((not tree) nil)
- ((-cons-pair? tree) tree)
- ((listp tree)
- (-reduce-r fn (mapcar (lambda (x) (-tree-reduce fn x)) tree)))
- (t tree)))
-
-(defmacro --tree-reduce (form tree)
- "Anaphoric form of `-tree-reduce'."
- (declare (debug (form form)))
- `(-tree-reduce (lambda (it acc) ,form) ,tree))
-
-(defun -tree-map-nodes (pred fun tree)
- "Call FUN on each node of TREE that satisfies PRED.
-
-If PRED returns nil, continue descending down this node. If PRED
-returns non-nil, apply FUN to this node and do not descend
-further."
- (if (funcall pred tree)
- (funcall fun tree)
- (if (and (listp tree)
- (not (-cons-pair? tree)))
- (-map (lambda (x) (-tree-map-nodes pred fun x)) tree)
- tree)))
-
-(defmacro --tree-map-nodes (pred form tree)
- "Anaphoric form of `-tree-map-nodes'."
- `(-tree-map-nodes (lambda (it) ,pred) (lambda (it) ,form) ,tree))
-
-(defun -tree-seq (branch children tree)
- "Return a sequence of the nodes in TREE, in depth-first search order.
-
-BRANCH is a predicate of one argument that returns non-nil if the
-passed argument is a branch, that is, a node that can have children.
-
-CHILDREN is a function of one argument that returns the children
-of the passed branch node.
-
-Non-branch nodes are simply copied."
- (cons tree
- (when (funcall branch tree)
- (-mapcat (lambda (x) (-tree-seq branch children x))
- (funcall children tree)))))
-
-(defmacro --tree-seq (branch children tree)
- "Anaphoric form of `-tree-seq'."
- `(-tree-seq (lambda (it) ,branch) (lambda (it) ,children) ,tree))
-
-(defun -clone (list)
- "Create a deep copy of LIST.
-The new list has the same elements and structure but all cons are
-replaced with new ones. This is useful when you need to clone a
-structure such as plist or alist."
- (declare (pure t) (side-effect-free t))
- (-tree-map 'identity list))
-
-(defun dash-enable-font-lock ()
- "Add syntax highlighting to dash functions, macros and magic values."
- (eval-after-load 'lisp-mode
- '(progn
- (let ((new-keywords '(
- "!cons"
- "!cdr"
- "-each"
- "--each"
- "-each-indexed"
- "--each-indexed"
- "-each-while"
- "--each-while"
- "-doto"
- "-dotimes"
- "--dotimes"
- "-map"
- "--map"
- "-reduce-from"
- "--reduce-from"
- "-reduce"
- "--reduce"
- "-reduce-r-from"
- "--reduce-r-from"
- "-reduce-r"
- "--reduce-r"
- "-reductions-from"
- "-reductions-r-from"
- "-reductions"
- "-reductions-r"
- "-filter"
- "--filter"
- "-select"
- "--select"
- "-remove"
- "--remove"
- "-reject"
- "--reject"
- "-remove-first"
- "--remove-first"
- "-reject-first"
- "--reject-first"
- "-remove-last"
- "--remove-last"
- "-reject-last"
- "--reject-last"
- "-remove-item"
- "-non-nil"
- "-keep"
- "--keep"
- "-map-indexed"
- "--map-indexed"
- "-splice"
- "--splice"
- "-splice-list"
- "--splice-list"
- "-map-when"
- "--map-when"
- "-replace-where"
- "--replace-where"
- "-map-first"
- "--map-first"
- "-map-last"
- "--map-last"
- "-replace"
- "-replace-first"
- "-replace-last"
- "-flatten"
- "-flatten-n"
- "-concat"
- "-mapcat"
- "--mapcat"
- "-copy"
- "-cons*"
- "-snoc"
- "-first"
- "--first"
- "-find"
- "--find"
- "-some"
- "--some"
- "-any"
- "--any"
- "-last"
- "--last"
- "-first-item"
- "-second-item"
- "-third-item"
- "-fourth-item"
- "-fifth-item"
- "-last-item"
- "-butlast"
- "-count"
- "--count"
- "-any?"
- "--any?"
- "-some?"
- "--some?"
- "-any-p"
- "--any-p"
- "-some-p"
- "--some-p"
- "-some->"
- "-some->>"
- "-some-->"
- "-all?"
- "-all-p"
- "--all?"
- "--all-p"
- "-every?"
- "--every?"
- "-all-p"
- "--all-p"
- "-every-p"
- "--every-p"
- "-none?"
- "--none?"
- "-none-p"
- "--none-p"
- "-only-some?"
- "--only-some?"
- "-only-some-p"
- "--only-some-p"
- "-slice"
- "-take"
- "-drop"
- "-drop-last"
- "-take-last"
- "-take-while"
- "--take-while"
- "-drop-while"
- "--drop-while"
- "-split-at"
- "-rotate"
- "-insert-at"
- "-replace-at"
- "-update-at"
- "--update-at"
- "-remove-at"
- "-remove-at-indices"
- "-split-with"
- "--split-with"
- "-split-on"
- "-split-when"
- "--split-when"
- "-separate"
- "--separate"
- "-partition-all-in-steps"
- "-partition-in-steps"
- "-partition-all"
- "-partition"
- "-partition-after-item"
- "-partition-after-pred"
- "-partition-before-item"
- "-partition-before-pred"
- "-partition-by"
- "--partition-by"
- "-partition-by-header"
- "--partition-by-header"
- "-group-by"
- "--group-by"
- "-interpose"
- "-interleave"
- "-unzip"
- "-zip-with"
- "--zip-with"
- "-zip"
- "-zip-fill"
- "-zip-lists"
- "-zip-pair"
- "-cycle"
- "-pad"
- "-annotate"
- "--annotate"
- "-table"
- "-table-flat"
- "-partial"
- "-elem-index"
- "-elem-indices"
- "-find-indices"
- "--find-indices"
- "-find-index"
- "--find-index"
- "-find-last-index"
- "--find-last-index"
- "-select-by-indices"
- "-select-columns"
- "-select-column"
- "-grade-up"
- "-grade-down"
- "->"
- "->>"
- "-->"
- "-as->"
- "-when-let"
- "-when-let*"
- "--when-let"
- "-if-let"
- "-if-let*"
- "--if-let"
- "-let*"
- "-let"
- "-lambda"
- "-distinct"
- "-uniq"
- "-union"
- "-intersection"
- "-difference"
- "-powerset"
- "-permutations"
- "-inits"
- "-tails"
- "-common-prefix"
- "-common-suffix"
- "-contains?"
- "-contains-p"
- "-same-items?"
- "-same-items-p"
- "-is-prefix-p"
- "-is-prefix?"
- "-is-suffix-p"
- "-is-suffix?"
- "-is-infix-p"
- "-is-infix?"
- "-sort"
- "--sort"
- "-list"
- "-repeat"
- "-sum"
- "-running-sum"
- "-product"
- "-running-product"
- "-max"
- "-min"
- "-max-by"
- "--max-by"
- "-min-by"
- "--min-by"
- "-iterate"
- "--iterate"
- "-fix"
- "--fix"
- "-unfold"
- "--unfold"
- "-cons-pair?"
- "-cons-pair-p"
- "-cons-to-list"
- "-value-to-list"
- "-tree-mapreduce-from"
- "--tree-mapreduce-from"
- "-tree-mapreduce"
- "--tree-mapreduce"
- "-tree-map"
- "--tree-map"
- "-tree-reduce-from"
- "--tree-reduce-from"
- "-tree-reduce"
- "--tree-reduce"
- "-tree-seq"
- "--tree-seq"
- "-tree-map-nodes"
- "--tree-map-nodes"
- "-clone"
- "-rpartial"
- "-juxt"
- "-applify"
- "-on"
- "-flip"
- "-const"
- "-cut"
- "-orfn"
- "-andfn"
- "-iteratefn"
- "-fixfn"
- "-prodfn"
- ))
- (special-variables '(
- "it"
- "it-index"
- "acc"
- "other"
- )))
- (font-lock-add-keywords 'emacs-lisp-mode `((,(concat "\\_<" (regexp-opt special-variables 'paren) "\\_>")
- 1 font-lock-variable-name-face)) 'append)
- (font-lock-add-keywords 'emacs-lisp-mode `((,(concat "(\\s-*" (regexp-opt new-keywords 'paren) "\\_>")
- 1 font-lock-keyword-face)) 'append))
- (--each (buffer-list)
- (with-current-buffer it
- (when (and (eq major-mode 'emacs-lisp-mode)
- (boundp 'font-lock-mode)
- font-lock-mode)
- (font-lock-refresh-defaults)))))))
-
-(provide 'dash)
-;;; dash.el ends here
diff --git a/elpa/dash-20200524.1947/dash.info b/elpa/dash-20200524.1947/dash.info
deleted file mode 100644
index a88cea7..0000000
--- a/elpa/dash-20200524.1947/dash.info
+++ /dev/null
@@ -1,3410 +0,0 @@
-This is dash.info, produced by makeinfo version 6.5 from dash.texi.
-
-This manual is for ‘dash.el’ version 2.12.1.
-
- Copyright © 2012-2015 Magnar Sveen
-
- 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 this program. If not, see
- <http://www.gnu.org/licenses/>.
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Dash: (dash.info). A modern list library for GNU Emacs
-END-INFO-DIR-ENTRY
-
-
-File: dash.info, Node: Top, Next: Installation, Up: (dir)
-
-dash
-****
-
-This manual is for ‘dash.el’ version 2.12.1.
-
- Copyright © 2012-2015 Magnar Sveen
-
- 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 this program. If not, see
- <http://www.gnu.org/licenses/>.
-
-* Menu:
-
-* Installation::
-* Functions::
-* Development::
-* Index::
-
-— The Detailed Node Listing —
-
-Installation
-
-* Using in a package::
-* Syntax highlighting of dash functions::
-
-Functions
-
-* Maps::
-* Sublist selection::
-* List to list::
-* Reductions::
-* Unfolding::
-* Predicates::
-* Partitioning::
-* Indexing::
-* Set operations::
-* Other list operations::
-* Tree operations::
-* Threading macros::
-* Binding::
-* Side-effects::
-* Destructive operations::
-* Function combinators::
-
-Development
-
-* Contribute:: How to contribute
-* Changes:: List of significant changes by version
-* Contributors:: List of contributors
-
-
-File: dash.info, Node: Installation, Next: Functions, Prev: Top, Up: Top
-
-1 Installation
-**************
-
-It’s available on Melpa (https://melpa.org/); use ‘M-x package-install’:
-
-‘M-x package-install <RET> dash’
- Install the dash library.
-
-‘M-x package-install <RET> dash-functional’
- Optional, if you want the function combinators.
-
- Alternatively, you can just dump dash.el or dash-functional.el in
-your load path somewhere.
-
-* Menu:
-
-* Using in a package::
-* Syntax highlighting of dash functions::
-
-
-File: dash.info, Node: Using in a package, Next: Syntax highlighting of dash functions, Up: Installation
-
-1.1 Using in a package
-======================
-
-Add this to the big comment block at the top:
-
- ;; Package-Requires: ((dash "2.12.1"))
-
-To get function combinators:
-
- ;; Package-Requires: ((dash "2.12.1") (dash-functional "1.2.0") (emacs "24"))
-
-
-File: dash.info, Node: Syntax highlighting of dash functions, Prev: Using in a package, Up: Installation
-
-1.2 Syntax highlighting of dash functions
-=========================================
-
-Font lock of dash functions in emacs lisp buffers is now optional.
-Include this in your emacs settings to get syntax highlighting:
-
- (eval-after-load 'dash '(dash-enable-font-lock))
-
-
-File: dash.info, Node: Functions, Next: Development, Prev: Installation, Up: Top
-
-2 Functions
-***********
-
-This chapter contains reference documentation for the dash application
-programming interface (API). All functions and constructs in the library
-are prefixed with a dash (-).
-
- There are also anaphoric versions of functions where that makes
-sense, prefixed with two dashes instead of one.
-
- For instance, while ‘-map’ takes a function to map over the list, one
-can also use the anaphoric form with double dashes - which will then be
-executed with ‘it’ exposed as the list item. Here’s an example:
-
- (-map (lambda (n) (* n n)) '(1 2 3 4)) ;; normal version
-
- (--map (* it it) '(1 2 3 4)) ;; anaphoric version
-
-Of course, the original can also be written like
-
- (defun square (n) (* n n))
-
- (-map 'square '(1 2 3 4))
-
-which demonstrates the usefulness of both versions.
-
-* Menu:
-
-* Maps::
-* Sublist selection::
-* List to list::
-* Reductions::
-* Unfolding::
-* Predicates::
-* Partitioning::
-* Indexing::
-* Set operations::
-* Other list operations::
-* Tree operations::
-* Threading macros::
-* Binding::
-* Side-effects::
-* Destructive operations::
-* Function combinators::
-
-
-File: dash.info, Node: Maps, Next: Sublist selection, Up: Functions
-
-2.1 Maps
-========
-
-Functions in this category take a transforming function, which is then
-applied sequentially to each or selected elements of the input list.
-The results are collected in order and returned as new list.
-
- -- Function: -map (fn list)
- Return a new list consisting of the result of applying FN to the
- items in LIST.
-
- (-map (lambda (num) (* num num)) '(1 2 3 4))
- ⇒ '(1 4 9 16)
- (-map 'square '(1 2 3 4))
- ⇒ '(1 4 9 16)
- (--map (* it it) '(1 2 3 4))
- ⇒ '(1 4 9 16)
-
- -- Function: -map-when (pred rep list)
- Return a new list where the elements in LIST that do not match the
- PRED function are unchanged, and where the elements in LIST that do
- match the PRED function are mapped through the REP function.
-
- Alias: ‘-replace-where’
-
- See also: ‘-update-at’ (*note -update-at::)
-
- (-map-when 'even? 'square '(1 2 3 4))
- ⇒ '(1 4 3 16)
- (--map-when (> it 2) (* it it) '(1 2 3 4))
- ⇒ '(1 2 9 16)
- (--map-when (= it 2) 17 '(1 2 3 4))
- ⇒ '(1 17 3 4)
-
- -- Function: -map-first (pred rep list)
- Replace first item in LIST satisfying PRED with result of REP
- called on this item.
-
- See also: ‘-map-when’ (*note -map-when::), ‘-replace-first’ (*note
- -replace-first::)
-
- (-map-first 'even? 'square '(1 2 3 4))
- ⇒ '(1 4 3 4)
- (--map-first (> it 2) (* it it) '(1 2 3 4))
- ⇒ '(1 2 9 4)
- (--map-first (= it 2) 17 '(1 2 3 2))
- ⇒ '(1 17 3 2)
-
- -- Function: -map-last (pred rep list)
- Replace last item in LIST satisfying PRED with result of REP called
- on this item.
-
- See also: ‘-map-when’ (*note -map-when::), ‘-replace-last’ (*note
- -replace-last::)
-
- (-map-last 'even? 'square '(1 2 3 4))
- ⇒ '(1 2 3 16)
- (--map-last (> it 2) (* it it) '(1 2 3 4))
- ⇒ '(1 2 3 16)
- (--map-last (= it 2) 17 '(1 2 3 2))
- ⇒ '(1 2 3 17)
-
- -- Function: -map-indexed (fn list)
- Return a new list consisting of the result of (FN index item) for
- each item in LIST.
-
- In the anaphoric form ‘--map-indexed’, the index is exposed as
- symbol ‘it-index’.
-
- See also: ‘-each-indexed’ (*note -each-indexed::).
-
- (-map-indexed (lambda (index item) (- item index)) '(1 2 3 4))
- ⇒ '(1 1 1 1)
- (--map-indexed (- it it-index) '(1 2 3 4))
- ⇒ '(1 1 1 1)
-
- -- Function: -annotate (fn list)
- Return a list of cons cells where each cell is FN applied to each
- element of LIST paired with the unmodified element of LIST.
-
- (-annotate '1+ '(1 2 3))
- ⇒ '((2 . 1) (3 . 2) (4 . 3))
- (-annotate 'length '(("h" "e" "l" "l" "o") ("hello" "world")))
- ⇒ '((5 "h" "e" "l" "l" "o") (2 "hello" "world"))
- (--annotate (< 1 it) '(0 1 2 3))
- ⇒ '((nil . 0) (nil . 1) (t . 2) (t . 3))
-
- -- Function: -splice (pred fun list)
- Splice lists generated by FUN in place of elements matching PRED in
- LIST.
-
- FUN takes the element matching PRED as input.
-
- This function can be used as replacement for ‘,@’ in case you need
- to splice several lists at marked positions (for example with
- keywords).
-
- See also: ‘-splice-list’ (*note -splice-list::), ‘-insert-at’
- (*note -insert-at::)
-
- (-splice 'even? (lambda (x) (list x x)) '(1 2 3 4))
- ⇒ '(1 2 2 3 4 4)
- (--splice 't (list it it) '(1 2 3 4))
- ⇒ '(1 1 2 2 3 3 4 4)
- (--splice (equal it :magic) '((list of) (magical) (code)) '((foo) (bar) :magic (baz)))
- ⇒ '((foo) (bar) (list of) (magical) (code) (baz))
-
- -- Function: -splice-list (pred new-list list)
- Splice NEW-LIST in place of elements matching PRED in LIST.
-
- See also: ‘-splice’ (*note -splice::), ‘-insert-at’ (*note
- -insert-at::)
-
- (-splice-list 'keywordp '(a b c) '(1 :foo 2))
- ⇒ '(1 a b c 2)
- (-splice-list 'keywordp nil '(1 :foo 2))
- ⇒ '(1 2)
- (--splice-list (keywordp it) '(a b c) '(1 :foo 2))
- ⇒ '(1 a b c 2)
-
- -- Function: -mapcat (fn list)
- Return the concatenation of the result of mapping FN over LIST.
- Thus function FN should return a list.
-
- (-mapcat 'list '(1 2 3))
- ⇒ '(1 2 3)
- (-mapcat (lambda (item) (list 0 item)) '(1 2 3))
- ⇒ '(0 1 0 2 0 3)
- (--mapcat (list 0 it) '(1 2 3))
- ⇒ '(0 1 0 2 0 3)
-
- -- Function: -copy (arg)
- Create a shallow copy of LIST.
-
- (fn LIST)
-
- (-copy '(1 2 3))
- ⇒ '(1 2 3)
- (let ((a '(1 2 3))) (eq a (-copy a)))
- ⇒ nil
-
-
-File: dash.info, Node: Sublist selection, Next: List to list, Prev: Maps, Up: Functions
-
-2.2 Sublist selection
-=====================
-
-Functions returning a sublist of the original list.
-
- -- Function: -filter (pred list)
- Return a new list of the items in LIST for which PRED returns a
- non-nil value.
-
- Alias: ‘-select’
-
- See also: ‘-keep’ (*note -keep::), ‘-remove’ (*note -remove::).
-
- (-filter (lambda (num) (= 0 (% num 2))) '(1 2 3 4))
- ⇒ '(2 4)
- (-filter 'even? '(1 2 3 4))
- ⇒ '(2 4)
- (--filter (= 0 (% it 2)) '(1 2 3 4))
- ⇒ '(2 4)
-
- -- Function: -remove (pred list)
- Return a new list of the items in LIST for which PRED returns nil.
-
- Alias: ‘-reject’
-
- See also: ‘-filter’ (*note -filter::).
-
- (-remove (lambda (num) (= 0 (% num 2))) '(1 2 3 4))
- ⇒ '(1 3)
- (-remove 'even? '(1 2 3 4))
- ⇒ '(1 3)
- (--remove (= 0 (% it 2)) '(1 2 3 4))
- ⇒ '(1 3)
-
- -- Function: -remove-first (pred list)
- Return a new list with the first item matching PRED removed.
-
- Alias: ‘-reject-first’
-
- See also: ‘-remove’ (*note -remove::), ‘-map-first’ (*note
- -map-first::)
-
- (-remove-first 'even? '(1 3 5 4 7 8 10))
- ⇒ '(1 3 5 7 8 10)
- (-remove-first 'stringp '(1 2 "first" "second" "third"))
- ⇒ '(1 2 "second" "third")
- (--remove-first (> it 3) '(1 2 3 4 5 6 7 8 9 10))
- ⇒ '(1 2 3 5 6 7 8 9 10)
-
- -- Function: -remove-last (pred list)
- Return a new list with the last item matching PRED removed.
-
- Alias: ‘-reject-last’
-
- See also: ‘-remove’ (*note -remove::), ‘-map-last’ (*note
- -map-last::)
-
- (-remove-last 'even? '(1 3 5 4 7 8 10 11))
- ⇒ '(1 3 5 4 7 8 11)
- (-remove-last 'stringp '(1 2 "last" "second" "third"))
- ⇒ '(1 2 "last" "second")
- (--remove-last (> it 3) '(1 2 3 4 5 6 7 8 9 10))
- ⇒ '(1 2 3 4 5 6 7 8 9)
-
- -- Function: -remove-item (item list)
- Remove all occurrences of ITEM from LIST.
-
- Comparison is done with ‘equal’.
-
- (-remove-item 3 '(1 2 3 2 3 4 5 3))
- ⇒ '(1 2 2 4 5)
- (-remove-item 'foo '(foo bar baz foo))
- ⇒ '(bar baz)
- (-remove-item "bob" '("alice" "bob" "eve" "bob" "dave"))
- ⇒ '("alice" "eve" "dave")
-
- -- Function: -non-nil (list)
- Return all non-nil elements of LIST.
-
- (-non-nil '(1 nil 2 nil nil 3 4 nil 5 nil))
- ⇒ '(1 2 3 4 5)
-
- -- Function: -slice (list from &optional to step)
- Return copy of LIST, starting from index FROM to index TO.
-
- FROM or TO may be negative. These values are then interpreted
- modulo the length of the list.
-
- If STEP is a number, only each STEPth item in the resulting section
- is returned. Defaults to 1.
-
- (-slice '(1 2 3 4 5) 1)
- ⇒ '(2 3 4 5)
- (-slice '(1 2 3 4 5) 0 3)
- ⇒ '(1 2 3)
- (-slice '(1 2 3 4 5 6 7 8 9) 1 -1 2)
- ⇒ '(2 4 6 8)
-
- -- Function: -take (n list)
- Return a new list of the first N items in LIST, or all items if
- there are fewer than N.
-
- See also: ‘-take-last’ (*note -take-last::)
-
- (-take 3 '(1 2 3 4 5))
- ⇒ '(1 2 3)
- (-take 17 '(1 2 3 4 5))
- ⇒ '(1 2 3 4 5)
-
- -- Function: -take-last (n list)
- Return the last N items of LIST in order.
-
- See also: ‘-take’ (*note -take::)
-
- (-take-last 3 '(1 2 3 4 5))
- ⇒ '(3 4 5)
- (-take-last 17 '(1 2 3 4 5))
- ⇒ '(1 2 3 4 5)
- (-take-last 1 '(1 2 3 4 5))
- ⇒ '(5)
-
- -- Function: -drop (n list)
- Return the tail of LIST without the first N items.
-
- See also: ‘-drop-last’ (*note -drop-last::)
-
- (fn N LIST)
-
- (-drop 3 '(1 2 3 4 5))
- ⇒ '(4 5)
- (-drop 17 '(1 2 3 4 5))
- ⇒ '()
-
- -- Function: -drop-last (n list)
- Remove the last N items of LIST and return a copy.
-
- See also: ‘-drop’ (*note -drop::)
-
- (-drop-last 3 '(1 2 3 4 5))
- ⇒ '(1 2)
- (-drop-last 17 '(1 2 3 4 5))
- ⇒ '()
-
- -- Function: -take-while (pred list)
- Return a new list of successive items from LIST while (PRED item)
- returns a non-nil value.
-
- (-take-while 'even? '(1 2 3 4))
- ⇒ '()
- (-take-while 'even? '(2 4 5 6))
- ⇒ '(2 4)
- (--take-while (< it 4) '(1 2 3 4 3 2 1))
- ⇒ '(1 2 3)
-
- -- Function: -drop-while (pred list)
- Return the tail of LIST starting from the first item for which
- (PRED item) returns nil.
-
- (-drop-while 'even? '(1 2 3 4))
- ⇒ '(1 2 3 4)
- (-drop-while 'even? '(2 4 5 6))
- ⇒ '(5 6)
- (--drop-while (< it 4) '(1 2 3 4 3 2 1))
- ⇒ '(4 3 2 1)
-
- -- Function: -select-by-indices (indices list)
- Return a list whose elements are elements from LIST selected as
- ‘(nth i list)‘ for all i from INDICES.
-
- (-select-by-indices '(4 10 2 3 6) '("v" "e" "l" "o" "c" "i" "r" "a" "p" "t" "o" "r"))
- ⇒ '("c" "o" "l" "o" "r")
- (-select-by-indices '(2 1 0) '("a" "b" "c"))
- ⇒ '("c" "b" "a")
- (-select-by-indices '(0 1 2 0 1 3 3 1) '("f" "a" "r" "l"))
- ⇒ '("f" "a" "r" "f" "a" "l" "l" "a")
-
- -- Function: -select-columns (columns table)
- Select COLUMNS from TABLE.
-
- TABLE is a list of lists where each element represents one row. It
- is assumed each row has the same length.
-
- Each row is transformed such that only the specified COLUMNS are
- selected.
-
- See also: ‘-select-column’ (*note -select-column::),
- ‘-select-by-indices’ (*note -select-by-indices::)
-
- (-select-columns '(0 2) '((1 2 3) (a b c) (:a :b :c)))
- ⇒ '((1 3) (a c) (:a :c))
- (-select-columns '(1) '((1 2 3) (a b c) (:a :b :c)))
- ⇒ '((2) (b) (:b))
- (-select-columns nil '((1 2 3) (a b c) (:a :b :c)))
- ⇒ '(nil nil nil)
-
- -- Function: -select-column (column table)
- Select COLUMN from TABLE.
-
- TABLE is a list of lists where each element represents one row. It
- is assumed each row has the same length.
-
- The single selected column is returned as a list.
-
- See also: ‘-select-columns’ (*note -select-columns::),
- ‘-select-by-indices’ (*note -select-by-indices::)
-
- (-select-column 1 '((1 2 3) (a b c) (:a :b :c)))
- ⇒ '(2 b :b)
-
-
-File: dash.info, Node: List to list, Next: Reductions, Prev: Sublist selection, Up: Functions
-
-2.3 List to list
-================
-
-Functions returning a modified copy of the input list.
-
- -- Function: -keep (fn list)
- Return a new list of the non-nil results of applying FN to the
- items in LIST.
-
- If you want to select the original items satisfying a predicate use
- ‘-filter’ (*note -filter::).
-
- (-keep 'cdr '((1 2 3) (4 5) (6)))
- ⇒ '((2 3) (5))
- (-keep (lambda (num) (when (> num 3) (* 10 num))) '(1 2 3 4 5 6))
- ⇒ '(40 50 60)
- (--keep (when (> it 3) (* 10 it)) '(1 2 3 4 5 6))
- ⇒ '(40 50 60)
-
- -- Function: -concat (&rest lists)
- Return a new list with the concatenation of the elements in the
- supplied LISTS.
-
- (-concat '(1))
- ⇒ '(1)
- (-concat '(1) '(2))
- ⇒ '(1 2)
- (-concat '(1) '(2 3) '(4))
- ⇒ '(1 2 3 4)
-
- -- Function: -flatten (l)
- Take a nested list L and return its contents as a single, flat
- list.
-
- Note that because ‘nil’ represents a list of zero elements (an
- empty list), any mention of nil in L will disappear after
- flattening. If you need to preserve nils, consider ‘-flatten-n’
- (*note -flatten-n::) or map them to some unique symbol and then map
- them back.
-
- Conses of two atoms are considered "terminals", that is, they
- aren’t flattened further.
-
- See also: ‘-flatten-n’ (*note -flatten-n::)
-
- (-flatten '((1)))
- ⇒ '(1)
- (-flatten '((1 (2 3) (((4 (5)))))))
- ⇒ '(1 2 3 4 5)
- (-flatten '(1 2 (3 . 4)))
- ⇒ '(1 2 (3 . 4))
-
- -- Function: -flatten-n (num list)
- Flatten NUM levels of a nested LIST.
-
- See also: ‘-flatten’ (*note -flatten::)
-
- (-flatten-n 1 '((1 2) ((3 4) ((5 6)))))
- ⇒ '(1 2 (3 4) ((5 6)))
- (-flatten-n 2 '((1 2) ((3 4) ((5 6)))))
- ⇒ '(1 2 3 4 (5 6))
- (-flatten-n 3 '((1 2) ((3 4) ((5 6)))))
- ⇒ '(1 2 3 4 5 6)
-
- -- Function: -replace (old new list)
- Replace all OLD items in LIST with NEW.
-
- Elements are compared using ‘equal’.
-
- See also: ‘-replace-at’ (*note -replace-at::)
-
- (-replace 1 "1" '(1 2 3 4 3 2 1))
- ⇒ '("1" 2 3 4 3 2 "1")
- (-replace "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo"))
- ⇒ '("a" "nice" "bar" "sentence" "about" "bar")
- (-replace 1 2 nil)
- ⇒ nil
-
- -- Function: -replace-first (old new list)
- Replace the first occurrence of OLD with NEW in LIST.
-
- Elements are compared using ‘equal’.
-
- See also: ‘-map-first’ (*note -map-first::)
-
- (-replace-first 1 "1" '(1 2 3 4 3 2 1))
- ⇒ '("1" 2 3 4 3 2 1)
- (-replace-first "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo"))
- ⇒ '("a" "nice" "bar" "sentence" "about" "foo")
- (-replace-first 1 2 nil)
- ⇒ nil
-
- -- Function: -replace-last (old new list)
- Replace the last occurrence of OLD with NEW in LIST.
-
- Elements are compared using ‘equal’.
-
- See also: ‘-map-last’ (*note -map-last::)
-
- (-replace-last 1 "1" '(1 2 3 4 3 2 1))
- ⇒ '(1 2 3 4 3 2 "1")
- (-replace-last "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo"))
- ⇒ '("a" "nice" "foo" "sentence" "about" "bar")
- (-replace-last 1 2 nil)
- ⇒ nil
-
- -- Function: -insert-at (n x list)
- Return a list with X inserted into LIST at position N.
-
- See also: ‘-splice’ (*note -splice::), ‘-splice-list’ (*note
- -splice-list::)
-
- (-insert-at 1 'x '(a b c))
- ⇒ '(a x b c)
- (-insert-at 12 'x '(a b c))
- ⇒ '(a b c x)
-
- -- Function: -replace-at (n x list)
- Return a list with element at Nth position in LIST replaced with X.
-
- See also: ‘-replace’ (*note -replace::)
-
- (-replace-at 0 9 '(0 1 2 3 4 5))
- ⇒ '(9 1 2 3 4 5)
- (-replace-at 1 9 '(0 1 2 3 4 5))
- ⇒ '(0 9 2 3 4 5)
- (-replace-at 4 9 '(0 1 2 3 4 5))
- ⇒ '(0 1 2 3 9 5)
-
- -- Function: -update-at (n func list)
- Return a list with element at Nth position in LIST replaced with
- ‘(func (nth n list))‘.
-
- See also: ‘-map-when’ (*note -map-when::)
-
- (-update-at 0 (lambda (x) (+ x 9)) '(0 1 2 3 4 5))
- ⇒ '(9 1 2 3 4 5)
- (-update-at 1 (lambda (x) (+ x 8)) '(0 1 2 3 4 5))
- ⇒ '(0 9 2 3 4 5)
- (--update-at 2 (length it) '("foo" "bar" "baz" "quux"))
- ⇒ '("foo" "bar" 3 "quux")
-
- -- Function: -remove-at (n list)
- Return a list with element at Nth position in LIST removed.
-
- See also: ‘-remove-at-indices’ (*note -remove-at-indices::),
- ‘-remove’ (*note -remove::)
-
- (-remove-at 0 '("0" "1" "2" "3" "4" "5"))
- ⇒ '("1" "2" "3" "4" "5")
- (-remove-at 1 '("0" "1" "2" "3" "4" "5"))
- ⇒ '("0" "2" "3" "4" "5")
- (-remove-at 2 '("0" "1" "2" "3" "4" "5"))
- ⇒ '("0" "1" "3" "4" "5")
-
- -- Function: -remove-at-indices (indices list)
- Return a list whose elements are elements from LIST without
- elements selected as ‘(nth i list)‘ for all i from INDICES.
-
- See also: ‘-remove-at’ (*note -remove-at::), ‘-remove’ (*note
- -remove::)
-
- (-remove-at-indices '(0) '("0" "1" "2" "3" "4" "5"))
- ⇒ '("1" "2" "3" "4" "5")
- (-remove-at-indices '(0 2 4) '("0" "1" "2" "3" "4" "5"))
- ⇒ '("1" "3" "5")
- (-remove-at-indices '(0 5) '("0" "1" "2" "3" "4" "5"))
- ⇒ '("1" "2" "3" "4")
-
-
-File: dash.info, Node: Reductions, Next: Unfolding, Prev: List to list, Up: Functions
-
-2.4 Reductions
-==============
-
-Functions reducing lists into single value.
-
- -- Function: -reduce-from (fn initial-value list)
- Return the result of applying FN to INITIAL-VALUE and the first
- item in LIST, then applying FN to that result and the 2nd item,
- etc. If LIST contains no items, return INITIAL-VALUE and do not
- call FN.
-
- In the anaphoric form ‘--reduce-from’, the accumulated value is
- exposed as symbol ‘acc’.
-
- See also: ‘-reduce’ (*note -reduce::), ‘-reduce-r’ (*note
- -reduce-r::)
-
- (-reduce-from '- 10 '(1 2 3))
- ⇒ 4
- (-reduce-from (lambda (memo item) (format "(%s - %d)" memo item)) "10" '(1 2 3))
- ⇒ "(((10 - 1) - 2) - 3)"
- (--reduce-from (concat acc " " it) "START" '("a" "b" "c"))
- ⇒ "START a b c"
-
- -- Function: -reduce-r-from (fn initial-value list)
- Replace conses with FN, nil with INITIAL-VALUE and evaluate the
- resulting expression. If LIST is empty, INITIAL-VALUE is returned
- and FN is not called.
-
- Note: this function works the same as ‘-reduce-from’ (*note
- -reduce-from::) but the operation associates from right instead of
- from left.
-
- See also: ‘-reduce-r’ (*note -reduce-r::), ‘-reduce’ (*note
- -reduce::)
-
- (-reduce-r-from '- 10 '(1 2 3))
- ⇒ -8
- (-reduce-r-from (lambda (item memo) (format "(%d - %s)" item memo)) "10" '(1 2 3))
- ⇒ "(1 - (2 - (3 - 10)))"
- (--reduce-r-from (concat it " " acc) "END" '("a" "b" "c"))
- ⇒ "a b c END"
-
- -- Function: -reduce (fn list)
- Return the result of applying FN to the first 2 items in LIST, then
- applying FN to that result and the 3rd item, etc. If LIST contains
- no items, return the result of calling FN with no arguments. If
- LIST contains a single item, return that item and do not call FN.
-
- In the anaphoric form ‘--reduce’, the accumulated value is exposed
- as symbol ‘acc’.
-
- See also: ‘-reduce-from’ (*note -reduce-from::), ‘-reduce-r’ (*note
- -reduce-r::)
-
- (-reduce '- '(1 2 3 4))
- ⇒ -8
- (-reduce 'list '(1 2 3 4))
- ⇒ '(((1 2) 3) 4)
- (--reduce (format "%s-%d" acc it) '(1 2 3))
- ⇒ "1-2-3"
-
- -- Function: -reduce-r (fn list)
- Replace conses with FN and evaluate the resulting expression. The
- final nil is ignored. If LIST contains no items, return the result
- of calling FN with no arguments. If LIST contains a single item,
- return that item and do not call FN.
-
- The first argument of FN is the new item, the second is the
- accumulated value.
-
- Note: this function works the same as ‘-reduce’ (*note -reduce::)
- but the operation associates from right instead of from left.
-
- See also: ‘-reduce-r-from’ (*note -reduce-r-from::), ‘-reduce’
- (*note -reduce::)
-
- (-reduce-r '- '(1 2 3 4))
- ⇒ -2
- (-reduce-r (lambda (item memo) (format "%s-%d" memo item)) '(1 2 3))
- ⇒ "3-2-1"
- (--reduce-r (format "%s-%d" acc it) '(1 2 3))
- ⇒ "3-2-1"
-
- -- Function: -reductions-from (fn init list)
- Return a list of the intermediate values of the reduction.
-
- See ‘-reduce-from’ (*note -reduce-from::) for explanation of the
- arguments.
-
- See also: ‘-reductions’ (*note -reductions::), ‘-reductions-r’
- (*note -reductions-r::), ‘-reduce-r’ (*note -reduce-r::)
-
- (-reductions-from (lambda (a i) (format "(%s FN %d)" a i)) "INIT" '(1 2 3 4))
- ⇒ '("INIT" "(INIT FN 1)" "((INIT FN 1) FN 2)" "(((INIT FN 1) FN 2) FN 3)" "((((INIT FN 1) FN 2) FN 3) FN 4)")
- (-reductions-from 'max 0 '(2 1 4 3))
- ⇒ '(0 2 2 4 4)
- (-reductions-from '* 1 '(1 2 3 4))
- ⇒ '(1 1 2 6 24)
-
- -- Function: -reductions-r-from (fn init list)
- Return a list of the intermediate values of the reduction.
-
- See ‘-reduce-r-from’ (*note -reduce-r-from::) for explanation of
- the arguments.
-
- See also: ‘-reductions-r’ (*note -reductions-r::), ‘-reductions’
- (*note -reductions::), ‘-reduce’ (*note -reduce::)
-
- (-reductions-r-from (lambda (i a) (format "(%d FN %s)" i a)) "INIT" '(1 2 3 4))
- ⇒ '("(1 FN (2 FN (3 FN (4 FN INIT))))" "(2 FN (3 FN (4 FN INIT)))" "(3 FN (4 FN INIT))" "(4 FN INIT)" "INIT")
- (-reductions-r-from 'max 0 '(2 1 4 3))
- ⇒ '(4 4 4 3 0)
- (-reductions-r-from '* 1 '(1 2 3 4))
- ⇒ '(24 24 12 4 1)
-
- -- Function: -reductions (fn list)
- Return a list of the intermediate values of the reduction.
-
- See ‘-reduce’ (*note -reduce::) for explanation of the arguments.
-
- See also: ‘-reductions-from’ (*note -reductions-from::),
- ‘-reductions-r’ (*note -reductions-r::), ‘-reduce-r’ (*note
- -reduce-r::)
-
- (-reductions (lambda (a i) (format "(%s FN %d)" a i)) '(1 2 3 4))
- ⇒ '(1 "(1 FN 2)" "((1 FN 2) FN 3)" "(((1 FN 2) FN 3) FN 4)")
- (-reductions '+ '(1 2 3 4))
- ⇒ '(1 3 6 10)
- (-reductions '* '(1 2 3 4))
- ⇒ '(1 2 6 24)
-
- -- Function: -reductions-r (fn list)
- Return a list of the intermediate values of the reduction.
-
- See ‘-reduce-r’ (*note -reduce-r::) for explanation of the
- arguments.
-
- See also: ‘-reductions-r-from’ (*note -reductions-r-from::),
- ‘-reductions’ (*note -reductions::), ‘-reduce’ (*note -reduce::)
-
- (-reductions-r (lambda (i a) (format "(%d FN %s)" i a)) '(1 2 3 4))
- ⇒ '("(1 FN (2 FN (3 FN 4)))" "(2 FN (3 FN 4))" "(3 FN 4)" 4)
- (-reductions-r '+ '(1 2 3 4))
- ⇒ '(10 9 7 4)
- (-reductions-r '* '(1 2 3 4))
- ⇒ '(24 24 12 4)
-
- -- Function: -count (pred list)
- Counts the number of items in LIST where (PRED item) is non-nil.
-
- (-count 'even? '(1 2 3 4 5))
- ⇒ 2
- (--count (< it 4) '(1 2 3 4))
- ⇒ 3
-
- -- Function: -sum (list)
- Return the sum of LIST.
-
- (-sum '())
- ⇒ 0
- (-sum '(1))
- ⇒ 1
- (-sum '(1 2 3 4))
- ⇒ 10
-
- -- Function: -running-sum (list)
- Return a list with running sums of items in LIST.
-
- LIST must be non-empty.
-
- (-running-sum '(1 2 3 4))
- ⇒ '(1 3 6 10)
- (-running-sum '(1))
- ⇒ '(1)
- (-running-sum '())
- ⇒ error
-
- -- Function: -product (list)
- Return the product of LIST.
-
- (-product '())
- ⇒ 1
- (-product '(1))
- ⇒ 1
- (-product '(1 2 3 4))
- ⇒ 24
-
- -- Function: -running-product (list)
- Return a list with running products of items in LIST.
-
- LIST must be non-empty.
-
- (-running-product '(1 2 3 4))
- ⇒ '(1 2 6 24)
- (-running-product '(1))
- ⇒ '(1)
- (-running-product '())
- ⇒ error
-
- -- Function: -inits (list)
- Return all prefixes of LIST.
-
- (-inits '(1 2 3 4))
- ⇒ '(nil (1) (1 2) (1 2 3) (1 2 3 4))
- (-inits nil)
- ⇒ '(nil)
- (-inits '(1))
- ⇒ '(nil (1))
-
- -- Function: -tails (list)
- Return all suffixes of LIST
-
- (-tails '(1 2 3 4))
- ⇒ '((1 2 3 4) (2 3 4) (3 4) (4) nil)
- (-tails nil)
- ⇒ '(nil)
- (-tails '(1))
- ⇒ '((1) nil)
-
- -- Function: -common-prefix (&rest lists)
- Return the longest common prefix of LISTS.
-
- (-common-prefix '(1))
- ⇒ '(1)
- (-common-prefix '(1 2) '(3 4) '(1 2))
- ⇒ nil
- (-common-prefix '(1 2) '(1 2 3) '(1 2 3 4))
- ⇒ '(1 2)
-
- -- Function: -common-suffix (&rest lists)
- Return the longest common suffix of LISTS.
-
- (-common-suffix '(1))
- ⇒ '(1)
- (-common-suffix '(1 2) '(3 4) '(1 2))
- ⇒ nil
- (-common-suffix '(1 2 3 4) '(2 3 4) '(3 4))
- ⇒ '(3 4)
-
- -- Function: -min (list)
- Return the smallest value from LIST of numbers or markers.
-
- (-min '(0))
- ⇒ 0
- (-min '(3 2 1))
- ⇒ 1
- (-min '(1 2 3))
- ⇒ 1
-
- -- Function: -min-by (comparator list)
- Take a comparison function COMPARATOR and a LIST and return the
- least element of the list by the comparison function.
-
- See also combinator ‘-on’ (*note -on::) which can transform the
- values before comparing them.
-
- (-min-by '> '(4 3 6 1))
- ⇒ 1
- (--min-by (> (car it) (car other)) '((1 2 3) (2) (3 2)))
- ⇒ '(1 2 3)
- (--min-by (> (length it) (length other)) '((1 2 3) (2) (3 2)))
- ⇒ '(2)
-
- -- Function: -max (list)
- Return the largest value from LIST of numbers or markers.
-
- (-max '(0))
- ⇒ 0
- (-max '(3 2 1))
- ⇒ 3
- (-max '(1 2 3))
- ⇒ 3
-
- -- Function: -max-by (comparator list)
- Take a comparison function COMPARATOR and a LIST and return the
- greatest element of the list by the comparison function.
-
- See also combinator ‘-on’ (*note -on::) which can transform the
- values before comparing them.
-
- (-max-by '> '(4 3 6 1))
- ⇒ 6
- (--max-by (> (car it) (car other)) '((1 2 3) (2) (3 2)))
- ⇒ '(3 2)
- (--max-by (> (length it) (length other)) '((1 2 3) (2) (3 2)))
- ⇒ '(1 2 3)
-
-
-File: dash.info, Node: Unfolding, Next: Predicates, Prev: Reductions, Up: Functions
-
-2.5 Unfolding
-=============
-
-Operations dual to reductions, building lists from seed value rather
-than consuming a list to produce a single value.
-
- -- Function: -iterate (fun init n)
- Return a list of iterated applications of FUN to INIT.
-
- This means a list of form:
-
- (init (fun init) (fun (fun init)) ...)
-
- N is the length of the returned list.
-
- (-iterate '1+ 1 10)
- ⇒ '(1 2 3 4 5 6 7 8 9 10)
- (-iterate (lambda (x) (+ x x)) 2 5)
- ⇒ '(2 4 8 16 32)
- (--iterate (* it it) 2 5)
- ⇒ '(2 4 16 256 65536)
-
- -- Function: -unfold (fun seed)
- Build a list from SEED using FUN.
-
- This is "dual" operation to ‘-reduce-r’ (*note -reduce-r::): while
- -reduce-r consumes a list to produce a single value, ‘-unfold’
- (*note -unfold::) takes a seed value and builds a (potentially
- infinite!) list.
-
- FUN should return ‘nil’ to stop the generating process, or a cons
- (A . B), where A will be prepended to the result and B is the new
- seed.
-
- (-unfold (lambda (x) (unless (= x 0) (cons x (1- x)))) 10)
- ⇒ '(10 9 8 7 6 5 4 3 2 1)
- (--unfold (when it (cons it (cdr it))) '(1 2 3 4))
- ⇒ '((1 2 3 4) (2 3 4) (3 4) (4))
- (--unfold (when it (cons it (butlast it))) '(1 2 3 4))
- ⇒ '((1 2 3 4) (1 2 3) (1 2) (1))
-
-
-File: dash.info, Node: Predicates, Next: Partitioning, Prev: Unfolding, Up: Functions
-
-2.6 Predicates
-==============
-
- -- Function: -any? (pred list)
- Return t if (PRED x) is non-nil for any x in LIST, else nil.
-
- Alias: ‘-any-p’, ‘-some?’, ‘-some-p’
-
- (-any? 'even? '(1 2 3))
- ⇒ t
- (-any? 'even? '(1 3 5))
- ⇒ nil
- (-any? 'null '(1 3 5))
- ⇒ nil
-
- -- Function: -all? (pred list)
- Return t if (PRED x) is non-nil for all x in LIST, else nil.
-
- Alias: ‘-all-p’, ‘-every?’, ‘-every-p’
-
- (-all? 'even? '(1 2 3))
- ⇒ nil
- (-all? 'even? '(2 4 6))
- ⇒ t
- (--all? (= 0 (% it 2)) '(2 4 6))
- ⇒ t
-
- -- Function: -none? (pred list)
- Return t if (PRED x) is nil for all x in LIST, else nil.
-
- Alias: ‘-none-p’
-
- (-none? 'even? '(1 2 3))
- ⇒ nil
- (-none? 'even? '(1 3 5))
- ⇒ t
- (--none? (= 0 (% it 2)) '(1 2 3))
- ⇒ nil
-
- -- Function: -only-some? (pred list)
- Return ‘t‘ if at least one item of LIST matches PRED and at least
- one item of LIST does not match PRED. Return ‘nil‘ both if all
- items match the predicate or if none of the items match the
- predicate.
-
- Alias: ‘-only-some-p’
-
- (-only-some? 'even? '(1 2 3))
- ⇒ t
- (-only-some? 'even? '(1 3 5))
- ⇒ nil
- (-only-some? 'even? '(2 4 6))
- ⇒ nil
-
- -- Function: -contains? (list element)
- Return non-nil if LIST contains ELEMENT.
-
- The test for equality is done with ‘equal’, or with ‘-compare-fn’
- if that’s non-nil.
-
- Alias: ‘-contains-p’
-
- (-contains? '(1 2 3) 1)
- ⇒ t
- (-contains? '(1 2 3) 2)
- ⇒ t
- (-contains? '(1 2 3) 4)
- ⇒ nil
-
- -- Function: -same-items? (list list2)
- Return true if LIST and LIST2 has the same items.
-
- The order of the elements in the lists does not matter.
-
- Alias: ‘-same-items-p’
-
- (-same-items? '(1 2 3) '(1 2 3))
- ⇒ t
- (-same-items? '(1 2 3) '(3 2 1))
- ⇒ t
- (-same-items? '(1 2 3) '(1 2 3 4))
- ⇒ nil
-
- -- Function: -is-prefix? (prefix list)
- Return non-nil if PREFIX is prefix of LIST.
-
- Alias: ‘-is-prefix-p’
-
- (-is-prefix? '(1 2 3) '(1 2 3 4 5))
- ⇒ t
- (-is-prefix? '(1 2 3 4 5) '(1 2 3))
- ⇒ nil
- (-is-prefix? '(1 3) '(1 2 3 4 5))
- ⇒ nil
-
- -- Function: -is-suffix? (suffix list)
- Return non-nil if SUFFIX is suffix of LIST.
-
- Alias: ‘-is-suffix-p’
-
- (-is-suffix? '(3 4 5) '(1 2 3 4 5))
- ⇒ t
- (-is-suffix? '(1 2 3 4 5) '(3 4 5))
- ⇒ nil
- (-is-suffix? '(3 5) '(1 2 3 4 5))
- ⇒ nil
-
- -- Function: -is-infix? (infix list)
- Return non-nil if INFIX is infix of LIST.
-
- This operation runs in O(n^2) time
-
- Alias: ‘-is-infix-p’
-
- (-is-infix? '(1 2 3) '(1 2 3 4 5))
- ⇒ t
- (-is-infix? '(2 3 4) '(1 2 3 4 5))
- ⇒ t
- (-is-infix? '(3 4 5) '(1 2 3 4 5))
- ⇒ t
-
-
-File: dash.info, Node: Partitioning, Next: Indexing, Prev: Predicates, Up: Functions
-
-2.7 Partitioning
-================
-
-Functions partitioning the input list into a list of lists.
-
- -- Function: -split-at (n list)
- Return a list of ((-take N LIST) (-drop N LIST)), in no more than
- one pass through the list.
-
- (-split-at 3 '(1 2 3 4 5))
- ⇒ '((1 2 3) (4 5))
- (-split-at 17 '(1 2 3 4 5))
- ⇒ '((1 2 3 4 5) nil)
-
- -- Function: -split-with (pred list)
- Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)),
- in no more than one pass through the list.
-
- (-split-with 'even? '(1 2 3 4))
- ⇒ '(nil (1 2 3 4))
- (-split-with 'even? '(2 4 5 6))
- ⇒ '((2 4) (5 6))
- (--split-with (< it 4) '(1 2 3 4 3 2 1))
- ⇒ '((1 2 3) (4 3 2 1))
-
- -- Macro: -split-on (item list)
- Split the LIST each time ITEM is found.
-
- Unlike ‘-partition-by’ (*note -partition-by::), the ITEM is
- discarded from the results. Empty lists are also removed from the
- result.
-
- Comparison is done by ‘equal’.
-
- See also ‘-split-when’ (*note -split-when::)
-
- (-split-on '| '(Nil | Leaf a | Node [Tree a]))
- ⇒ '((Nil) (Leaf a) (Node [Tree a]))
- (-split-on ':endgroup '("a" "b" :endgroup "c" :endgroup "d" "e"))
- ⇒ '(("a" "b") ("c") ("d" "e"))
- (-split-on ':endgroup '("a" "b" :endgroup :endgroup "d" "e"))
- ⇒ '(("a" "b") ("d" "e"))
-
- -- Function: -split-when (fn list)
- Split the LIST on each element where FN returns non-nil.
-
- Unlike ‘-partition-by’ (*note -partition-by::), the "matched"
- element is discarded from the results. Empty lists are also
- removed from the result.
-
- This function can be thought of as a generalization of
- ‘split-string’.
-
- (-split-when 'even? '(1 2 3 4 5 6))
- ⇒ '((1) (3) (5))
- (-split-when 'even? '(1 2 3 4 6 8 9))
- ⇒ '((1) (3) (9))
- (--split-when (memq it '(&optional &rest)) '(a b &optional c d &rest args))
- ⇒ '((a b) (c d) (args))
-
- -- Function: -separate (pred list)
- Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one
- pass through the list.
-
- (-separate (lambda (num) (= 0 (% num 2))) '(1 2 3 4 5 6 7))
- ⇒ '((2 4 6) (1 3 5 7))
- (--separate (< it 5) '(3 7 5 9 3 2 1 4 6))
- ⇒ '((3 3 2 1 4) (7 5 9 6))
- (-separate 'cdr '((1 2) (1) (1 2 3) (4)))
- ⇒ '(((1 2) (1 2 3)) ((1) (4)))
-
- -- Function: -partition (n list)
- Return a new list with the items in LIST grouped into N-sized
- sublists. If there are not enough items to make the last group
- N-sized, those items are discarded.
-
- (-partition 2 '(1 2 3 4 5 6))
- ⇒ '((1 2) (3 4) (5 6))
- (-partition 2 '(1 2 3 4 5 6 7))
- ⇒ '((1 2) (3 4) (5 6))
- (-partition 3 '(1 2 3 4 5 6 7))
- ⇒ '((1 2 3) (4 5 6))
-
- -- Function: -partition-all (n list)
- Return a new list with the items in LIST grouped into N-sized
- sublists. The last group may contain less than N items.
-
- (-partition-all 2 '(1 2 3 4 5 6))
- ⇒ '((1 2) (3 4) (5 6))
- (-partition-all 2 '(1 2 3 4 5 6 7))
- ⇒ '((1 2) (3 4) (5 6) (7))
- (-partition-all 3 '(1 2 3 4 5 6 7))
- ⇒ '((1 2 3) (4 5 6) (7))
-
- -- Function: -partition-in-steps (n step list)
- Return a new list with the items in LIST grouped into N-sized
- sublists at offsets STEP apart. If there are not enough items to
- make the last group N-sized, those items are discarded.
-
- (-partition-in-steps 2 1 '(1 2 3 4))
- ⇒ '((1 2) (2 3) (3 4))
- (-partition-in-steps 3 2 '(1 2 3 4))
- ⇒ '((1 2 3))
- (-partition-in-steps 3 2 '(1 2 3 4 5))
- ⇒ '((1 2 3) (3 4 5))
-
- -- Function: -partition-all-in-steps (n step list)
- Return a new list with the items in LIST grouped into N-sized
- sublists at offsets STEP apart. The last groups may contain less
- than N items.
-
- (-partition-all-in-steps 2 1 '(1 2 3 4))
- ⇒ '((1 2) (2 3) (3 4) (4))
- (-partition-all-in-steps 3 2 '(1 2 3 4))
- ⇒ '((1 2 3) (3 4))
- (-partition-all-in-steps 3 2 '(1 2 3 4 5))
- ⇒ '((1 2 3) (3 4 5) (5))
-
- -- Function: -partition-by (fn list)
- Apply FN to each item in LIST, splitting it each time FN returns a
- new value.
-
- (-partition-by 'even? '())
- ⇒ '()
- (-partition-by 'even? '(1 1 2 2 2 3 4 6 8))
- ⇒ '((1 1) (2 2 2) (3) (4 6 8))
- (--partition-by (< it 3) '(1 2 3 4 3 2 1))
- ⇒ '((1 2) (3 4 3) (2 1))
-
- -- Function: -partition-by-header (fn list)
- Apply FN to the first item in LIST. That is the header value.
- Apply FN to each item in LIST, splitting it each time FN returns
- the header value, but only after seeing at least one other value
- (the body).
-
- (--partition-by-header (= it 1) '(1 2 3 1 2 1 2 3 4))
- ⇒ '((1 2 3) (1 2) (1 2 3 4))
- (--partition-by-header (> it 0) '(1 2 0 1 0 1 2 3 0))
- ⇒ '((1 2 0) (1 0) (1 2 3 0))
- (-partition-by-header 'even? '(2 1 1 1 4 1 3 5 6 6 1))
- ⇒ '((2 1 1 1) (4 1 3 5) (6 6 1))
-
- -- Function: -partition-after-pred (pred list)
- Partition directly after each time PRED is true on an element of
- LIST.
-
- (-partition-after-pred #'odd? '())
- ⇒ '()
- (-partition-after-pred #'odd? '(1))
- ⇒ '((1))
- (-partition-after-pred #'odd? '(0 1))
- ⇒ '((0 1))
-
- -- Function: -partition-before-pred (pred list)
- Partition directly before each time PRED is true on an element of
- LIST.
-
- (-partition-before-pred #'odd? '())
- ⇒ '()
- (-partition-before-pred #'odd? '(1))
- ⇒ '((1))
- (-partition-before-pred #'odd? '(0 1))
- ⇒ '((0) (1))
-
- -- Function: -partition-before-item (item list)
- Partition directly before each time ITEM appears in LIST.
-
- (-partition-before-item 3 '())
- ⇒ '()
- (-partition-before-item 3 '(1))
- ⇒ '((1))
- (-partition-before-item 3 '(3))
- ⇒ '((3))
-
- -- Function: -partition-after-item (item list)
- Partition directly after each time ITEM appears in LIST.
-
- (-partition-after-item 3 '())
- ⇒ '()
- (-partition-after-item 3 '(1))
- ⇒ '((1))
- (-partition-after-item 3 '(3))
- ⇒ '((3))
-
- -- Function: -group-by (fn list)
- Separate LIST into an alist whose keys are FN applied to the
- elements of LIST. Keys are compared by ‘equal’.
-
- (-group-by 'even? '())
- ⇒ '()
- (-group-by 'even? '(1 1 2 2 2 3 4 6 8))
- ⇒ '((nil 1 1 3) (t 2 2 2 4 6 8))
- (--group-by (car (split-string it "/")) '("a/b" "c/d" "a/e"))
- ⇒ '(("a" "a/b" "a/e") ("c" "c/d"))
-
-
-File: dash.info, Node: Indexing, Next: Set operations, Prev: Partitioning, Up: Functions
-
-2.8 Indexing
-============
-
-Return indices of elements based on predicates, sort elements by indices
-etc.
-
- -- Function: -elem-index (elem list)
- Return the index of the first element in the given LIST which is
- equal to the query element ELEM, or nil if there is no such
- element.
-
- (-elem-index 2 '(6 7 8 2 3 4))
- ⇒ 3
- (-elem-index "bar" '("foo" "bar" "baz"))
- ⇒ 1
- (-elem-index '(1 2) '((3) (5 6) (1 2) nil))
- ⇒ 2
-
- -- Function: -elem-indices (elem list)
- Return the indices of all elements in LIST equal to the query
- element ELEM, in ascending order.
-
- (-elem-indices 2 '(6 7 8 2 3 4 2 1))
- ⇒ '(3 6)
- (-elem-indices "bar" '("foo" "bar" "baz"))
- ⇒ '(1)
- (-elem-indices '(1 2) '((3) (1 2) (5 6) (1 2) nil))
- ⇒ '(1 3)
-
- -- Function: -find-index (pred list)
- Take a predicate PRED and a LIST and return the index of the first
- element in the list satisfying the predicate, or nil if there is no
- such element.
-
- See also ‘-first’ (*note -first::).
-
- (-find-index 'even? '(2 4 1 6 3 3 5 8))
- ⇒ 0
- (--find-index (< 5 it) '(2 4 1 6 3 3 5 8))
- ⇒ 3
- (-find-index (-partial 'string-lessp "baz") '("bar" "foo" "baz"))
- ⇒ 1
-
- -- Function: -find-last-index (pred list)
- Take a predicate PRED and a LIST and return the index of the last
- element in the list satisfying the predicate, or nil if there is no
- such element.
-
- See also ‘-last’ (*note -last::).
-
- (-find-last-index 'even? '(2 4 1 6 3 3 5 8))
- ⇒ 7
- (--find-last-index (< 5 it) '(2 7 1 6 3 8 5 2))
- ⇒ 5
- (-find-last-index (-partial 'string-lessp "baz") '("q" "foo" "baz"))
- ⇒ 1
-
- -- Function: -find-indices (pred list)
- Return the indices of all elements in LIST satisfying the predicate
- PRED, in ascending order.
-
- (-find-indices 'even? '(2 4 1 6 3 3 5 8))
- ⇒ '(0 1 3 7)
- (--find-indices (< 5 it) '(2 4 1 6 3 3 5 8))
- ⇒ '(3 7)
- (-find-indices (-partial 'string-lessp "baz") '("bar" "foo" "baz"))
- ⇒ '(1)
-
- -- Function: -grade-up (comparator list)
- Grade elements of LIST using COMPARATOR relation, yielding a
- permutation vector such that applying this permutation to LIST
- sorts it in ascending order.
-
- (-grade-up '< '(3 1 4 2 1 3 3))
- ⇒ '(1 4 3 0 5 6 2)
- (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-up '< l) l))
- ⇒ '(1 1 2 3 3 3 4)
-
- -- Function: -grade-down (comparator list)
- Grade elements of LIST using COMPARATOR relation, yielding a
- permutation vector such that applying this permutation to LIST
- sorts it in descending order.
-
- (-grade-down '< '(3 1 4 2 1 3 3))
- ⇒ '(2 0 5 6 3 1 4)
- (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-down '< l) l))
- ⇒ '(4 3 3 3 2 1 1)
-
-
-File: dash.info, Node: Set operations, Next: Other list operations, Prev: Indexing, Up: Functions
-
-2.9 Set operations
-==================
-
-Operations pretending lists are sets.
-
- -- Function: -union (list list2)
- Return a new list containing the elements of LIST and elements of
- LIST2 that are not in LIST. The test for equality is done with
- ‘equal’, or with ‘-compare-fn’ if that’s non-nil.
-
- (-union '(1 2 3) '(3 4 5))
- ⇒ '(1 2 3 4 5)
- (-union '(1 2 3 4) '())
- ⇒ '(1 2 3 4)
- (-union '(1 1 2 2) '(3 2 1))
- ⇒ '(1 1 2 2 3)
-
- -- Function: -difference (list list2)
- Return a new list with only the members of LIST that are not in
- LIST2. The test for equality is done with ‘equal’, or with
- ‘-compare-fn’ if that’s non-nil.
-
- (-difference '() '())
- ⇒ '()
- (-difference '(1 2 3) '(4 5 6))
- ⇒ '(1 2 3)
- (-difference '(1 2 3 4) '(3 4 5 6))
- ⇒ '(1 2)
-
- -- Function: -intersection (list list2)
- Return a new list containing only the elements that are members of
- both LIST and LIST2. The test for equality is done with ‘equal’,
- or with ‘-compare-fn’ if that’s non-nil.
-
- (-intersection '() '())
- ⇒ '()
- (-intersection '(1 2 3) '(4 5 6))
- ⇒ '()
- (-intersection '(1 2 3 4) '(3 4 5 6))
- ⇒ '(3 4)
-
- -- Function: -powerset (list)
- Return the power set of LIST.
-
- (-powerset '())
- ⇒ '(nil)
- (-powerset '(x y z))
- ⇒ '((x y z) (x y) (x z) (x) (y z) (y) (z) nil)
-
- -- Function: -permutations (list)
- Return the permutations of LIST.
-
- (-permutations '())
- ⇒ '(nil)
- (-permutations '(1 2))
- ⇒ '((1 2) (2 1))
- (-permutations '(a b c))
- ⇒ '((a b c) (a c b) (b a c) (b c a) (c a b) (c b a))
-
- -- Function: -distinct (list)
- Return a new list with all duplicates removed. The test for
- equality is done with ‘equal’, or with ‘-compare-fn’ if that’s
- non-nil.
-
- Alias: ‘-uniq’
-
- (-distinct '())
- ⇒ '()
- (-distinct '(1 2 2 4))
- ⇒ '(1 2 4)
- (-distinct '(t t t))
- ⇒ '(t)
-
-
-File: dash.info, Node: Other list operations, Next: Tree operations, Prev: Set operations, Up: Functions
-
-2.10 Other list operations
-==========================
-
-Other list functions not fit to be classified elsewhere.
-
- -- Function: -rotate (n list)
- Rotate LIST N places to the right. With N negative, rotate to the
- left. The time complexity is O(n).
-
- (-rotate 3 '(1 2 3 4 5 6 7))
- ⇒ '(5 6 7 1 2 3 4)
- (-rotate -3 '(1 2 3 4 5 6 7))
- ⇒ '(4 5 6 7 1 2 3)
- (-rotate 16 '(1 2 3 4 5 6 7))
- ⇒ '(6 7 1 2 3 4 5)
-
- -- Function: -repeat (n x)
- Return a list with X repeated N times. Return nil if N is less
- than 1.
-
- (-repeat 3 :a)
- ⇒ '(:a :a :a)
- (-repeat 1 :a)
- ⇒ '(:a)
- (-repeat 0 :a)
- ⇒ nil
-
- -- Function: -cons* (&rest args)
- Make a new list from the elements of ARGS.
-
- The last 2 members of ARGS are used as the final cons of the result
- so if the final member of ARGS is not a list the result is a dotted
- list.
-
- (-cons* 1 2)
- ⇒ '(1 . 2)
- (-cons* 1 2 3)
- ⇒ '(1 2 . 3)
- (-cons* 1)
- ⇒ 1
-
- -- Function: -snoc (list elem &rest elements)
- Append ELEM to the end of the list.
-
- This is like ‘cons’, but operates on the end of list.
-
- If ELEMENTS is non nil, append these to the list as well.
-
- (-snoc '(1 2 3) 4)
- ⇒ '(1 2 3 4)
- (-snoc '(1 2 3) 4 5 6)
- ⇒ '(1 2 3 4 5 6)
- (-snoc '(1 2 3) '(4 5 6))
- ⇒ '(1 2 3 (4 5 6))
-
- -- Function: -interpose (sep list)
- Return a new list of all elements in LIST separated by SEP.
-
- (-interpose "-" '())
- ⇒ '()
- (-interpose "-" '("a"))
- ⇒ '("a")
- (-interpose "-" '("a" "b" "c"))
- ⇒ '("a" "-" "b" "-" "c")
-
- -- Function: -interleave (&rest lists)
- Return a new list of the first item in each list, then the second
- etc.
-
- (-interleave '(1 2) '("a" "b"))
- ⇒ '(1 "a" 2 "b")
- (-interleave '(1 2) '("a" "b") '("A" "B"))
- ⇒ '(1 "a" "A" 2 "b" "B")
- (-interleave '(1 2 3) '("a" "b"))
- ⇒ '(1 "a" 2 "b")
-
- -- Function: -zip-with (fn list1 list2)
- Zip the two lists LIST1 and LIST2 using a function FN. This
- function is applied pairwise taking as first argument element of
- LIST1 and as second argument element of LIST2 at corresponding
- position.
-
- The anaphoric form ‘--zip-with’ binds the elements from LIST1 as
- symbol ‘it’, and the elements from LIST2 as symbol ‘other’.
-
- (-zip-with '+ '(1 2 3) '(4 5 6))
- ⇒ '(5 7 9)
- (-zip-with 'cons '(1 2 3) '(4 5 6))
- ⇒ '((1 . 4) (2 . 5) (3 . 6))
- (--zip-with (concat it " and " other) '("Batman" "Jekyll") '("Robin" "Hyde"))
- ⇒ '("Batman and Robin" "Jekyll and Hyde")
-
- -- Function: -zip (&rest lists)
- Zip LISTS together. Group the head of each list, followed by the
- second elements of each list, and so on. The lengths of the
- returned groupings are equal to the length of the shortest input
- list.
-
- If two lists are provided as arguments, return the groupings as a
- list of cons cells. Otherwise, return the groupings as a list of
- lists.
-
- Use ‘-zip-lists’ (*note -zip-lists::) if you need the return value
- to always be a list of lists.
-
- Alias: ‘-zip-pair’
-
- See also: ‘-zip-lists’ (*note -zip-lists::)
-
- (-zip '(1 2 3) '(4 5 6))
- ⇒ '((1 . 4) (2 . 5) (3 . 6))
- (-zip '(1 2 3) '(4 5 6 7))
- ⇒ '((1 . 4) (2 . 5) (3 . 6))
- (-zip '(1 2) '(3 4 5) '(6))
- ⇒ '((1 3 6))
-
- -- Function: -zip-lists (&rest lists)
- Zip LISTS together. Group the head of each list, followed by the
- second elements of each list, and so on. The lengths of the
- returned groupings are equal to the length of the shortest input
- list.
-
- The return value is always list of lists, which is a difference
- from ‘-zip-pair’ which returns a cons-cell in case two input lists
- are provided.
-
- See also: ‘-zip’ (*note -zip::)
-
- (-zip-lists '(1 2 3) '(4 5 6))
- ⇒ '((1 4) (2 5) (3 6))
- (-zip-lists '(1 2 3) '(4 5 6 7))
- ⇒ '((1 4) (2 5) (3 6))
- (-zip-lists '(1 2) '(3 4 5) '(6))
- ⇒ '((1 3 6))
-
- -- Function: -zip-fill (fill-value &rest lists)
- Zip LISTS, with FILL-VALUE padded onto the shorter lists. The
- lengths of the returned groupings are equal to the length of the
- longest input list.
-
- (-zip-fill 0 '(1 2 3 4 5) '(6 7 8 9))
- ⇒ '((1 . 6) (2 . 7) (3 . 8) (4 . 9) (5 . 0))
-
- -- Function: -unzip (lists)
- Unzip LISTS.
-
- This works just like ‘-zip’ (*note -zip::) but takes a list of
- lists instead of a variable number of arguments, such that
-
- (-unzip (-zip L1 L2 L3 ...))
-
- is identity (given that the lists are the same length).
-
- Note in particular that calling this on a list of two lists will
- return a list of cons-cells such that the above identity works.
-
- See also: ‘-zip’ (*note -zip::)
-
- (-unzip (-zip '(1 2 3) '(a b c) '("e" "f" "g")))
- ⇒ '((1 2 3) (a b c) ("e" "f" "g"))
- (-unzip '((1 2) (3 4) (5 6) (7 8) (9 10)))
- ⇒ '((1 3 5 7 9) (2 4 6 8 10))
- (-unzip '((1 2) (3 4)))
- ⇒ '((1 . 3) (2 . 4))
-
- -- Function: -cycle (list)
- Return an infinite copy of LIST that will cycle through the
- elements and repeat from the beginning.
-
- (-take 5 (-cycle '(1 2 3)))
- ⇒ '(1 2 3 1 2)
- (-take 7 (-cycle '(1 "and" 3)))
- ⇒ '(1 "and" 3 1 "and" 3 1)
- (-zip (-cycle '(1 2 3)) '(1 2))
- ⇒ '((1 . 1) (2 . 2))
-
- -- Function: -pad (fill-value &rest lists)
- Appends FILL-VALUE to the end of each list in LISTS such that they
- will all have the same length.
-
- (-pad 0 '())
- ⇒ '(nil)
- (-pad 0 '(1))
- ⇒ '((1))
- (-pad 0 '(1 2 3) '(4 5))
- ⇒ '((1 2 3) (4 5 0))
-
- -- Function: -table (fn &rest lists)
- Compute outer product of LISTS using function FN.
-
- The function FN should have the same arity as the number of
- supplied lists.
-
- The outer product is computed by applying fn to all possible
- combinations created by taking one element from each list in order.
- The dimension of the result is (length lists).
-
- See also: ‘-table-flat’ (*note -table-flat::)
-
- (-table '* '(1 2 3) '(1 2 3))
- ⇒ '((1 2 3) (2 4 6) (3 6 9))
- (-table (lambda (a b) (-sum (-zip-with '* a b))) '((1 2) (3 4)) '((1 3) (2 4)))
- ⇒ '((7 15) (10 22))
- (apply '-table 'list (-repeat 3 '(1 2)))
- ⇒ '((((1 1 1) (2 1 1)) ((1 2 1) (2 2 1))) (((1 1 2) (2 1 2)) ((1 2 2) (2 2 2))))
-
- -- Function: -table-flat (fn &rest lists)
- Compute flat outer product of LISTS using function FN.
-
- The function FN should have the same arity as the number of
- supplied lists.
-
- The outer product is computed by applying fn to all possible
- combinations created by taking one element from each list in order.
- The results are flattened, ignoring the tensor structure of the
- result. This is equivalent to calling:
-
- (-flatten-n (1- (length lists)) (apply ’-table fn lists))
-
- but the implementation here is much more efficient.
-
- See also: ‘-flatten-n’ (*note -flatten-n::), ‘-table’ (*note
- -table::)
-
- (-table-flat 'list '(1 2 3) '(a b c))
- ⇒ '((1 a) (2 a) (3 a) (1 b) (2 b) (3 b) (1 c) (2 c) (3 c))
- (-table-flat '* '(1 2 3) '(1 2 3))
- ⇒ '(1 2 3 2 4 6 3 6 9)
- (apply '-table-flat 'list (-repeat 3 '(1 2)))
- ⇒ '((1 1 1) (2 1 1) (1 2 1) (2 2 1) (1 1 2) (2 1 2) (1 2 2) (2 2 2))
-
- -- Function: -first (pred list)
- Return the first x in LIST where (PRED x) is non-nil, else nil.
-
- To get the first item in the list no questions asked, use ‘car’.
-
- Alias: ‘-find’
-
- (-first 'even? '(1 2 3))
- ⇒ 2
- (-first 'even? '(1 3 5))
- ⇒ nil
- (-first 'null '(1 3 5))
- ⇒ nil
-
- -- Function: -some (pred list)
- Return (PRED x) for the first LIST item where (PRED x) is non-nil,
- else nil.
-
- Alias: ‘-any’
-
- (-some 'even? '(1 2 3))
- ⇒ t
- (-some 'null '(1 2 3))
- ⇒ nil
- (-some 'null '(1 2 nil))
- ⇒ t
-
- -- Function: -last (pred list)
- Return the last x in LIST where (PRED x) is non-nil, else nil.
-
- (-last 'even? '(1 2 3 4 5 6 3 3 3))
- ⇒ 6
- (-last 'even? '(1 3 7 5 9))
- ⇒ nil
- (--last (> (length it) 3) '("a" "looong" "word" "and" "short" "one"))
- ⇒ "short"
-
- -- Function: -first-item (list)
- Return the first item of LIST, or nil on an empty list.
-
- See also: ‘-second-item’ (*note -second-item::), ‘-last-item’
- (*note -last-item::).
-
- (fn LIST)
-
- (-first-item '(1 2 3))
- ⇒ 1
- (-first-item nil)
- ⇒ nil
- (let ((list (list 1 2 3))) (setf (-first-item list) 5) list)
- ⇒ '(5 2 3)
-
- -- Function: -second-item (arg1)
- Return the second item of LIST, or nil if LIST is too short.
-
- See also: ‘-third-item’ (*note -third-item::).
-
- (fn LIST)
-
- (-second-item '(1 2 3))
- ⇒ 2
- (-second-item nil)
- ⇒ nil
-
- -- Function: -third-item (arg1)
- Return the third item of LIST, or nil if LIST is too short.
-
- See also: ‘-fourth-item’ (*note -fourth-item::).
-
- (fn LIST)
-
- (-third-item '(1 2 3))
- ⇒ 3
- (-third-item nil)
- ⇒ nil
-
- -- Function: -fourth-item (list)
- Return the fourth item of LIST, or nil if LIST is too short.
-
- See also: ‘-fifth-item’ (*note -fifth-item::).
-
- (-fourth-item '(1 2 3 4))
- ⇒ 4
- (-fourth-item nil)
- ⇒ nil
-
- -- Function: -fifth-item (list)
- Return the fifth item of LIST, or nil if LIST is too short.
-
- See also: ‘-last-item’ (*note -last-item::).
-
- (-fifth-item '(1 2 3 4 5))
- ⇒ 5
- (-fifth-item nil)
- ⇒ nil
-
- -- Function: -last-item (list)
- Return the last item of LIST, or nil on an empty list.
-
- (-last-item '(1 2 3))
- ⇒ 3
- (-last-item nil)
- ⇒ nil
- (let ((list (list 1 2 3))) (setf (-last-item list) 5) list)
- ⇒ '(1 2 5)
-
- -- Function: -butlast (list)
- Return a list of all items in list except for the last.
-
- (-butlast '(1 2 3))
- ⇒ '(1 2)
- (-butlast '(1 2))
- ⇒ '(1)
- (-butlast '(1))
- ⇒ nil
-
- -- Function: -sort (comparator list)
- Sort LIST, stably, comparing elements using COMPARATOR. Return the
- sorted list. LIST is NOT modified by side effects. COMPARATOR is
- called with two elements of LIST, and should return non-nil if the
- first element should sort before the second.
-
- (-sort '< '(3 1 2))
- ⇒ '(1 2 3)
- (-sort '> '(3 1 2))
- ⇒ '(3 2 1)
- (--sort (< it other) '(3 1 2))
- ⇒ '(1 2 3)
-
- -- Function: -list (&rest args)
- Return a list with ARGS.
-
- If first item of ARGS is already a list, simply return ARGS. If
- not, return a list with ARGS as elements.
-
- (-list 1)
- ⇒ '(1)
- (-list 1 2 3)
- ⇒ '(1 2 3)
- (-list '(1 2 3))
- ⇒ '(1 2 3)
-
- -- Function: -fix (fn list)
- Compute the (least) fixpoint of FN with initial input LIST.
-
- FN is called at least once, results are compared with ‘equal’.
-
- (-fix (lambda (l) (-non-nil (--mapcat (-split-at (/ (length it) 2) it) l))) '((1 2 3 4 5 6)))
- ⇒ '((1) (2) (3) (4) (5) (6))
- (let ((data '(("starwars" "scifi") ("jedi" "starwars" "warrior")))) (--fix (-uniq (--mapcat (cons it (cdr (assoc it data))) it)) '("jedi" "book")))
- ⇒ '("jedi" "starwars" "warrior" "scifi" "book")
-
-
-File: dash.info, Node: Tree operations, Next: Threading macros, Prev: Other list operations, Up: Functions
-
-2.11 Tree operations
-====================
-
-Functions pretending lists are trees.
-
- -- Function: -tree-seq (branch children tree)
- Return a sequence of the nodes in TREE, in depth-first search
- order.
-
- BRANCH is a predicate of one argument that returns non-nil if the
- passed argument is a branch, that is, a node that can have
- children.
-
- CHILDREN is a function of one argument that returns the children of
- the passed branch node.
-
- Non-branch nodes are simply copied.
-
- (-tree-seq 'listp 'identity '(1 (2 3) 4 (5 (6 7))))
- ⇒ '((1 (2 3) 4 (5 (6 7))) 1 (2 3) 2 3 4 (5 (6 7)) 5 (6 7) 6 7)
- (-tree-seq 'listp 'reverse '(1 (2 3) 4 (5 (6 7))))
- ⇒ '((1 (2 3) 4 (5 (6 7))) (5 (6 7)) (6 7) 7 6 5 4 (2 3) 3 2 1)
- (--tree-seq (vectorp it) (append it nil) [1 [2 3] 4 [5 [6 7]]])
- ⇒ '([1 [2 3] 4 [5 [6 7]]] 1 [2 3] 2 3 4 [5 [6 7]] 5 [6 7] 6 7)
-
- -- Function: -tree-map (fn tree)
- Apply FN to each element of TREE while preserving the tree
- structure.
-
- (-tree-map '1+ '(1 (2 3) (4 (5 6) 7)))
- ⇒ '(2 (3 4) (5 (6 7) 8))
- (-tree-map '(lambda (x) (cons x (expt 2 x))) '(1 (2 3) 4))
- ⇒ '((1 . 2) ((2 . 4) (3 . 8)) (4 . 16))
- (--tree-map (length it) '("<body>" ("<p>" "text" "</p>") "</body>"))
- ⇒ '(6 (3 4 4) 7)
-
- -- Function: -tree-map-nodes (pred fun tree)
- Call FUN on each node of TREE that satisfies PRED.
-
- If PRED returns nil, continue descending down this node. If PRED
- returns non-nil, apply FUN to this node and do not descend further.
-
- (-tree-map-nodes 'vectorp (lambda (x) (-sum (append x nil))) '(1 [2 3] 4 (5 [6 7] 8)))
- ⇒ '(1 5 4 (5 13 8))
- (-tree-map-nodes 'keywordp (lambda (x) (symbol-name x)) '(1 :foo 4 ((5 6 :bar) :baz 8)))
- ⇒ '(1 ":foo" 4 ((5 6 ":bar") ":baz" 8))
- (--tree-map-nodes (eq (car-safe it) 'add-mode) (-concat it (list :mode 'emacs-lisp-mode)) '(with-mode emacs-lisp-mode (foo bar) (add-mode a b) (baz (add-mode c d))))
- ⇒ '(with-mode emacs-lisp-mode (foo bar) (add-mode a b :mode emacs-lisp-mode) (baz (add-mode c d :mode emacs-lisp-mode)))
-
- -- Function: -tree-reduce (fn tree)
- Use FN to reduce elements of list TREE. If elements of TREE are
- lists themselves, apply the reduction recursively.
-
- FN is first applied to first element of the list and second
- element, then on this result and third element from the list etc.
-
- See ‘-reduce-r’ (*note -reduce-r::) for how exactly are lists of
- zero or one element handled.
-
- (-tree-reduce '+ '(1 (2 3) (4 5)))
- ⇒ 15
- (-tree-reduce 'concat '("strings" (" on" " various") ((" levels"))))
- ⇒ "strings on various levels"
- (--tree-reduce (cond ((stringp it) (concat it " " acc)) (t (let ((sn (symbol-name it))) (concat "<" sn ">" acc "</" sn ">")))) '(body (p "some words") (div "more" (b "bold") "words")))
- ⇒ "<body><p>some words</p> <div>more <b>bold</b> words</div></body>"
-
- -- Function: -tree-reduce-from (fn init-value tree)
- Use FN to reduce elements of list TREE. If elements of TREE are
- lists themselves, apply the reduction recursively.
-
- FN is first applied to INIT-VALUE and first element of the list,
- then on this result and second element from the list etc.
-
- The initial value is ignored on cons pairs as they always contain
- two elements.
-
- (-tree-reduce-from '+ 1 '(1 (1 1) ((1))))
- ⇒ 8
- (--tree-reduce-from (-concat acc (list it)) nil '(1 (2 3 (4 5)) (6 7)))
- ⇒ '((7 6) ((5 4) 3 2) 1)
-
- -- Function: -tree-mapreduce (fn folder tree)
- Apply FN to each element of TREE, and make a list of the results.
- If elements of TREE are lists themselves, apply FN recursively to
- elements of these nested lists.
-
- Then reduce the resulting lists using FOLDER and initial value
- INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::).
-
- This is the same as calling ‘-tree-reduce’ (*note -tree-reduce::)
- after ‘-tree-map’ (*note -tree-map::) but is twice as fast as it
- only traverse the structure once.
-
- (-tree-mapreduce 'list 'append '(1 (2 (3 4) (5 6)) (7 (8 9))))
- ⇒ '(1 2 3 4 5 6 7 8 9)
- (--tree-mapreduce 1 (+ it acc) '(1 (2 (4 9) (2 1)) (7 (4 3))))
- ⇒ 9
- (--tree-mapreduce 0 (max acc (1+ it)) '(1 (2 (4 9) (2 1)) (7 (4 3))))
- ⇒ 3
-
- -- Function: -tree-mapreduce-from (fn folder init-value tree)
- Apply FN to each element of TREE, and make a list of the results.
- If elements of TREE are lists themselves, apply FN recursively to
- elements of these nested lists.
-
- Then reduce the resulting lists using FOLDER and initial value
- INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::).
-
- This is the same as calling ‘-tree-reduce-from’ (*note
- -tree-reduce-from::) after ‘-tree-map’ (*note -tree-map::) but is
- twice as fast as it only traverse the structure once.
-
- (-tree-mapreduce-from 'identity '* 1 '(1 (2 (3 4) (5 6)) (7 (8 9))))
- ⇒ 362880
- (--tree-mapreduce-from (+ it it) (cons it acc) nil '(1 (2 (4 9) (2 1)) (7 (4 3))))
- ⇒ '(2 (4 (8 18) (4 2)) (14 (8 6)))
- (concat "{" (--tree-mapreduce-from (cond ((-cons-pair? it) (concat (symbol-name (car it)) " -> " (symbol-name (cdr it)))) (t (concat (symbol-name it) " : {"))) (concat it (unless (or (equal acc "}") (equal (substring it (1- (length it))) "{")) ", ") acc) "}" '((elips-mode (foo (bar . booze)) (baz . qux)) (c-mode (foo . bla) (bum . bam)))))
- ⇒ "{elips-mode : {foo : {bar -> booze{, baz -> qux{, c-mode : {foo -> bla, bum -> bam}}"
-
- -- Function: -clone (list)
- Create a deep copy of LIST. The new list has the same elements and
- structure but all cons are replaced with new ones. This is useful
- when you need to clone a structure such as plist or alist.
-
- (let* ((a '(1 2 3)) (b (-clone a))) (nreverse a) b)
- ⇒ '(1 2 3)
-
-
-File: dash.info, Node: Threading macros, Next: Binding, Prev: Tree operations, Up: Functions
-
-2.12 Threading macros
-=====================
-
- -- Macro: -> (x &optional form &rest more)
- Thread the expr through the forms. Insert X as the second item in
- the first form, making a list of it if it is not a list already.
- If there are more forms, insert the first form as the second item
- in second form, etc.
-
- (-> '(2 3 5))
- ⇒ '(2 3 5)
- (-> '(2 3 5) (append '(8 13)))
- ⇒ '(2 3 5 8 13)
- (-> '(2 3 5) (append '(8 13)) (-slice 1 -1))
- ⇒ '(3 5 8)
-
- -- Macro: ->> (x &optional form &rest more)
- Thread the expr through the forms. Insert X as the last item in
- the first form, making a list of it if it is not a list already.
- If there are more forms, insert the first form as the last item in
- second form, etc.
-
- (->> '(1 2 3) (-map 'square))
- ⇒ '(1 4 9)
- (->> '(1 2 3) (-map 'square) (-remove 'even?))
- ⇒ '(1 9)
- (->> '(1 2 3) (-map 'square) (-reduce '+))
- ⇒ 14
-
- -- Macro: --> (x &rest forms)
- Starting with the value of X, thread each expression through FORMS.
-
- Insert X at the position signified by the symbol ‘it’ in the first
- form. If there are more forms, insert the first form at the
- position signified by ‘it’ in in second form, etc.
-
- (--> "def" (concat "abc" it "ghi"))
- ⇒ "abcdefghi"
- (--> "def" (concat "abc" it "ghi") (upcase it))
- ⇒ "ABCDEFGHI"
- (--> "def" (concat "abc" it "ghi") upcase)
- ⇒ "ABCDEFGHI"
-
- -- Macro: -as-> (value variable &rest forms)
- Starting with VALUE, thread VARIABLE through FORMS.
-
- In the first form, bind VARIABLE to VALUE. In the second form,
- bind VARIABLE to the result of the first form, and so forth.
-
- (-as-> 3 my-var (1+ my-var) (list my-var) (mapcar (lambda (ele) (* 2 ele)) my-var))
- ⇒ '(8)
- (-as-> 3 my-var 1+)
- ⇒ 4
- (-as-> 3 my-var)
- ⇒ 3
-
- -- Macro: -some-> (x &optional form &rest more)
- When expr is non-nil, thread it through the first form (via ‘->’
- (*note ->::)), and when that result is non-nil, through the next
- form, etc.
-
- (-some-> '(2 3 5))
- ⇒ '(2 3 5)
- (-some-> 5 square)
- ⇒ 25
- (-some-> 5 even? square)
- ⇒ nil
-
- -- Macro: -some->> (x &optional form &rest more)
- When expr is non-nil, thread it through the first form (via ‘->>’
- (*note ->>::)), and when that result is non-nil, through the next
- form, etc.
-
- (-some->> '(1 2 3) (-map 'square))
- ⇒ '(1 4 9)
- (-some->> '(1 3 5) (-last 'even?) (+ 100))
- ⇒ nil
- (-some->> '(2 4 6) (-last 'even?) (+ 100))
- ⇒ 106
-
- -- Macro: -some--> (x &optional form &rest more)
- When expr in non-nil, thread it through the first form (via ‘-->’
- (*note -->::)), and when that result is non-nil, through the next
- form, etc.
-
- (-some--> "def" (concat "abc" it "ghi"))
- ⇒ "abcdefghi"
- (-some--> nil (concat "abc" it "ghi"))
- ⇒ nil
- (-some--> '(1 3 5) (-filter 'even? it) (append it it) (-map 'square it))
- ⇒ nil
-
-
-File: dash.info, Node: Binding, Next: Side-effects, Prev: Threading macros, Up: Functions
-
-2.13 Binding
-============
-
-Convenient versions of ‘let‘ and ‘let*‘ constructs combined with flow
-control.
-
- -- Macro: -when-let (var-val &rest body)
- If VAL evaluates to non-nil, bind it to VAR and execute body.
-
- Note: binding is done according to ‘-let’ (*note -let::).
-
- (fn (VAR VAL) &rest BODY)
-
- (-when-let (match-index (string-match "d" "abcd")) (+ match-index 2))
- ⇒ 5
- (-when-let ((&plist :foo foo) (list :foo "foo")) foo)
- ⇒ "foo"
- (-when-let ((&plist :foo foo) (list :bar "bar")) foo)
- ⇒ nil
-
- -- Macro: -when-let* (vars-vals &rest body)
- If all VALS evaluate to true, bind them to their corresponding VARS
- and execute body. VARS-VALS should be a list of (VAR VAL) pairs.
-
- Note: binding is done according to ‘-let*’ (*note -let*::). VALS
- are evaluated sequentially, and evaluation stops after the first
- nil VAL is encountered.
-
- (-when-let* ((x 5) (y 3) (z (+ y 4))) (+ x y z))
- ⇒ 15
- (-when-let* ((x 5) (y nil) (z 7)) (+ x y z))
- ⇒ nil
-
- -- Macro: -if-let (var-val then &rest else)
- If VAL evaluates to non-nil, bind it to VAR and do THEN, otherwise
- do ELSE.
-
- Note: binding is done according to ‘-let’ (*note -let::).
-
- (fn (VAR VAL) THEN &rest ELSE)
-
- (-if-let (match-index (string-match "d" "abc")) (+ match-index 3) 7)
- ⇒ 7
- (--if-let (even? 4) it nil)
- ⇒ t
-
- -- Macro: -if-let* (vars-vals then &rest else)
- If all VALS evaluate to true, bind them to their corresponding VARS
- and do THEN, otherwise do ELSE. VARS-VALS should be a list of (VAR
- VAL) pairs.
-
- Note: binding is done according to ‘-let*’ (*note -let*::). VALS
- are evaluated sequentially, and evaluation stops after the first
- nil VAL is encountered.
-
- (-if-let* ((x 5) (y 3) (z 7)) (+ x y z) "foo")
- ⇒ 15
- (-if-let* ((x 5) (y nil) (z 7)) (+ x y z) "foo")
- ⇒ "foo"
- (-if-let* (((_ _ x) '(nil nil 7))) x)
- ⇒ 7
-
- -- Macro: -let (varlist &rest body)
- Bind variables according to VARLIST then eval BODY.
-
- VARLIST is a list of lists of the form (PATTERN SOURCE). Each
- PATTERN is matched against the SOURCE "structurally". SOURCE is
- only evaluated once for each PATTERN. Each PATTERN is matched
- recursively, and can therefore contain sub-patterns which are
- matched against corresponding sub-expressions of SOURCE.
-
- All the SOURCEs are evalled before any symbols are bound (i.e. "in
- parallel").
-
- If VARLIST only contains one (PATTERN SOURCE) element, you can
- optionally specify it using a vector and discarding the outer-most
- parens. Thus
-
- (-let ((PATTERN SOURCE)) ..)
-
- becomes
-
- (-let [PATTERN SOURCE] ..).
-
- ‘-let’ (*note -let::) uses a convention of not binding places
- (symbols) starting with _ whenever it’s possible. You can use this
- to skip over entries you don’t care about. However, this is not
- *always* possible (as a result of implementation) and these symbols
- might get bound to undefined values.
-
- Following is the overview of supported patterns. Remember that
- patterns can be matched recursively, so every a, b, aK in the
- following can be a matching construct and not necessarily a
- symbol/variable.
-
- Symbol:
-
- a - bind the SOURCE to A. This is just like regular ‘let’.
-
- Conses and lists:
-
- (a) - bind ‘car’ of cons/list to A
-
- (a . b) - bind car of cons to A and ‘cdr’ to B
-
- (a b) - bind car of list to A and ‘cadr’ to B
-
- (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to A3
- ...
-
- (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to
- REST.
-
- Vectors:
-
- [a] - bind 0th element of a non-list sequence to A (works with
- vectors, strings, bit arrays...)
-
- [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st
- to A1, 2nd to A2, ... If the PATTERN is shorter than SOURCE, the
- values at places not in PATTERN are ignored. If the PATTERN is
- longer than SOURCE, an ‘error’ is thrown.
-
- [a1 a2 a3 ... &rest rest] - as above, but bind the rest of the
- sequence to REST. This is conceptually the same as improper list
- matching (a1 a2 ... aN . rest)
-
- Key/value stores:
-
- (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the
- SOURCE plist to aK. If the value is not found, aK is nil. Uses
- ‘plist-get’ to fetch values.
-
- (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the
- SOURCE alist to aK. If the value is not found, aK is nil. Uses
- ‘assoc’ to fetch values.
-
- (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the
- SOURCE hash table to aK. If the value is not found, aK is nil.
- Uses ‘gethash’ to fetch values.
-
- Further, special keyword &keys supports "inline" matching of
- plist-like key-value pairs, similarly to &keys keyword of
- ‘cl-defun’.
-
- (a1 a2 ... aN &keys key1 b1 ... keyN bK)
-
- This binds N values from the list to a1 ... aN, then interprets
- the cdr as a plist (see key/value matching above).
-
- A shorthand notation for kv-destructuring exists which allows the
- patterns be optionally left out and derived from the key name in
- the following fashion:
-
- - a key :foo is converted into ‘foo’ pattern, - a key ’bar is
- converted into ‘bar’ pattern, - a key "baz" is converted into ‘baz’
- pattern.
-
- That is, the entire value under the key is bound to the derived
- variable without any further destructuring.
-
- This is possible only when the form following the key is not a
- valid pattern (i.e. not a symbol, a cons cell or a vector).
- Otherwise the matching proceeds as usual and in case of an invalid
- spec fails with an error.
-
- Thus the patterns are normalized as follows:
-
- ;; derive all the missing patterns (&plist :foo ’bar "baz") =>
- (&plist :foo foo ’bar bar "baz" baz)
-
- ;; we can specify some but not others (&plist :foo ’bar
- explicit-bar) => (&plist :foo foo ’bar explicit-bar)
-
- ;; nothing happens, we store :foo in x (&plist :foo x) => (&plist
- :foo x)
-
- ;; nothing happens, we match recursively (&plist :foo (a b c)) =>
- (&plist :foo (a b c))
-
- You can name the source using the syntax SYMBOL &as PATTERN. This
- syntax works with lists (proper or improper), vectors and all types
- of maps.
-
- (list &as a b c) (list 1 2 3)
-
- binds A to 1, B to 2, C to 3 and LIST to (1 2 3).
-
- Similarly:
-
- (bounds &as beg . end) (cons 1 2)
-
- binds BEG to 1, END to 2 and BOUNDS to (1 . 2).
-
- (items &as first . rest) (list 1 2 3)
-
- binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3)
-
- [vect &as _ b c] [1 2 3]
-
- binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as
- usual).
-
- (plist &as &plist :b b) (list :a 1 :b 2 :c 3)
-
- binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and
- &hash.
-
- This is especially useful when we want to capture the result of a
- computation and destructure at the same time. Consider the form
- (function-returning-complex-structure) returning a list of two
- vectors with two items each. We want to capture this entire result
- and pass it to another computation, but at the same time we want to
- get the second item from each vector. We can achieve it with
- pattern
-
- (result &as [_ a] [_ b]) (function-returning-complex-structure)
-
- Note: Clojure programmers may know this feature as the ":as
- binding". The difference is that we put the &as at the front
- because we need to support improper list binding.
-
- (-let (([a (b c) d] [1 (2 3) 4])) (list a b c d))
- ⇒ '(1 2 3 4)
- (-let [(a b c . d) (list 1 2 3 4 5 6)] (list a b c d))
- ⇒ '(1 2 3 (4 5 6))
- (-let [(&plist :foo foo :bar bar) (list :baz 3 :foo 1 :qux 4 :bar 2)] (list foo bar))
- ⇒ '(1 2)
-
- -- Macro: -let* (varlist &rest body)
- Bind variables according to VARLIST then eval BODY.
-
- VARLIST is a list of lists of the form (PATTERN SOURCE). Each
- PATTERN is matched against the SOURCE structurally. SOURCE is only
- evaluated once for each PATTERN.
-
- Each SOURCE can refer to the symbols already bound by this VARLIST.
- This is useful if you want to destructure SOURCE recursively but
- also want to name the intermediate structures.
-
- See ‘-let’ (*note -let::) for the list of all possible patterns.
-
- (-let* (((a . b) (cons 1 2)) ((c . d) (cons 3 4))) (list a b c d))
- ⇒ '(1 2 3 4)
- (-let* (((a . b) (cons 1 (cons 2 3))) ((c . d) b)) (list a b c d))
- ⇒ '(1 (2 . 3) 2 3)
- (-let* (((&alist "foo" foo "bar" bar) (list (cons "foo" 1) (cons "bar" (list 'a 'b 'c)))) ((a b c) bar)) (list foo a b c bar))
- ⇒ '(1 a b c (a b c))
-
- -- Macro: -lambda (match-form &rest body)
- Return a lambda which destructures its input as MATCH-FORM and
- executes BODY.
-
- Note that you have to enclose the MATCH-FORM in a pair of parens,
- such that:
-
- (-lambda (x) body) (-lambda (x y ...) body)
-
- has the usual semantics of ‘lambda’. Furthermore, these get
- translated into normal lambda, so there is no performance penalty.
-
- See ‘-let’ (*note -let::) for the description of destructuring
- mechanism.
-
- (-map (-lambda ((x y)) (+ x y)) '((1 2) (3 4) (5 6)))
- ⇒ '(3 7 11)
- (-map (-lambda ([x y]) (+ x y)) '([1 2] [3 4] [5 6]))
- ⇒ '(3 7 11)
- (funcall (-lambda ((_ . a) (_ . b)) (-concat a b)) '(1 2 3) '(4 5 6))
- ⇒ '(2 3 5 6)
-
- -- Macro: -setq (&rest forms)
- Bind each MATCH-FORM to the value of its VAL.
-
- MATCH-FORM destructuring is done according to the rules of ‘-let’
- (*note -let::).
-
- This macro allows you to bind multiple variables by destructuring
- the value, so for example:
-
- (-setq (a b) x (&plist :c c) plist)
-
- expands roughly speaking to the following code
-
- (setq a (car x) b (cadr x) c (plist-get plist :c))
-
- Care is taken to only evaluate each VAL once so that in case of
- multiple assignments it does not cause unexpected side effects.
-
- (fn [MATCH-FORM VAL]...)
-
- (progn (-setq a 1) a)
- ⇒ 1
- (progn (-setq (a b) (list 1 2)) (list a b))
- ⇒ '(1 2)
- (progn (-setq (&plist :c c) (list :c "c")) c)
- ⇒ "c"
-
-
-File: dash.info, Node: Side-effects, Next: Destructive operations, Prev: Binding, Up: Functions
-
-2.14 Side-effects
-=================
-
-Functions iterating over lists for side-effect only.
-
- -- Function: -each (list fn)
- Call FN with every item in LIST. Return nil, used for side-effects
- only.
-
- (let (s) (-each '(1 2 3) (lambda (item) (setq s (cons item s)))))
- ⇒ nil
- (let (s) (-each '(1 2 3) (lambda (item) (setq s (cons item s)))) s)
- ⇒ '(3 2 1)
- (let (s) (--each '(1 2 3) (setq s (cons it s))) s)
- ⇒ '(3 2 1)
-
- -- Function: -each-while (list pred fn)
- Call FN with every item in LIST while (PRED item) is non-nil.
- Return nil, used for side-effects only.
-
- (let (s) (-each-while '(2 4 5 6) 'even? (lambda (item) (!cons item s))) s)
- ⇒ '(4 2)
- (let (s) (--each-while '(1 2 3 4) (< it 3) (!cons it s)) s)
- ⇒ '(2 1)
-
- -- Function: -each-indexed (list fn)
- Call (FN index item) for each item in LIST.
-
- In the anaphoric form ‘--each-indexed’, the index is exposed as
- symbol ‘it-index’.
-
- See also: ‘-map-indexed’ (*note -map-indexed::).
-
- (let (s) (-each-indexed '(a b c) (lambda (index item) (setq s (cons (list item index) s)))) s)
- ⇒ '((c 2) (b 1) (a 0))
- (let (s) (--each-indexed '(a b c) (setq s (cons (list it it-index) s))) s)
- ⇒ '((c 2) (b 1) (a 0))
-
- -- Function: -each-r (list fn)
- Call FN with every item in LIST in reversed order. Return nil,
- used for side-effects only.
-
- (let (s) (-each-r '(1 2 3) (lambda (item) (setq s (cons item s)))))
- ⇒ nil
- (let (s) (-each-r '(1 2 3) (lambda (item) (setq s (cons item s)))) s)
- ⇒ '(1 2 3)
- (let (s) (--each-r '(1 2 3) (setq s (cons it s))) s)
- ⇒ '(1 2 3)
-
- -- Function: -each-r-while (list pred fn)
- Call FN with every item in reversed LIST while (PRED item) is
- non-nil. Return nil, used for side-effects only.
-
- (let (s) (-each-r-while '(2 4 5 6) 'even? (lambda (item) (!cons item s))) s)
- ⇒ '(6)
- (let (s) (--each-r-while '(1 2 3 4) (>= it 3) (!cons it s)) s)
- ⇒ '(3 4)
-
- -- Function: -dotimes (num fn)
- Repeatedly calls FN (presumably for side-effects) passing in
- integers from 0 through NUM-1.
-
- (let (s) (-dotimes 3 (lambda (n) (!cons n s))) s)
- ⇒ '(2 1 0)
- (let (s) (--dotimes 5 (!cons it s)) s)
- ⇒ '(4 3 2 1 0)
-
- -- Macro: -doto (eval-initial-value &rest forms)
- Eval a form, then insert that form as the 2nd argument to other
- forms. The EVAL-INITIAL-VALUE form is evaluated once. Its result
- is passed to FORMS, which are then evaluated sequentially. Returns
- the target form.
-
- (-doto '(1 2 3) (!cdr) (!cdr))
- ⇒ '(3)
- (-doto '(1 . 2) (setcar 3) (setcdr 4))
- ⇒ '(3 . 4)
-
- -- Macro: --doto (eval-initial-value &rest forms)
- Anaphoric form of ‘-doto’ (*note -doto::). Note: ‘it’ is not
- required in each form.
-
- (gethash "key" (--doto (make-hash-table :test 'equal) (puthash "key" "value" it)))
- ⇒ "value"
-
-
-File: dash.info, Node: Destructive operations, Next: Function combinators, Prev: Side-effects, Up: Functions
-
-2.15 Destructive operations
-===========================
-
- -- Macro: !cons (car cdr)
- Destructive: Set CDR to the cons of CAR and CDR.
-
- (let (l) (!cons 5 l) l)
- ⇒ '(5)
- (let ((l '(3))) (!cons 5 l) l)
- ⇒ '(5 3)
-
- -- Macro: !cdr (list)
- Destructive: Set LIST to the cdr of LIST.
-
- (let ((l '(3))) (!cdr l) l)
- ⇒ '()
- (let ((l '(3 5))) (!cdr l) l)
- ⇒ '(5)
-
-
-File: dash.info, Node: Function combinators, Prev: Destructive operations, Up: Functions
-
-2.16 Function combinators
-=========================
-
-These combinators require Emacs 24 for its lexical scope. So they are
-offered in a separate package: ‘dash-functional‘.
-
- -- Function: -partial (fn &rest args)
- Takes a function FN and fewer than the normal arguments to FN, and
- returns a fn that takes a variable number of additional ARGS. When
- called, the returned function calls FN with ARGS first and then
- additional args.
-
- (funcall (-partial '- 5) 3)
- ⇒ 2
- (funcall (-partial '+ 5 2) 3)
- ⇒ 10
-
- -- Function: -rpartial (fn &rest args)
- Takes a function FN and fewer than the normal arguments to FN, and
- returns a fn that takes a variable number of additional ARGS. When
- called, the returned function calls FN with the additional args
- first and then ARGS.
-
- (funcall (-rpartial '- 5) 8)
- ⇒ 3
- (funcall (-rpartial '- 5 2) 10)
- ⇒ 3
-
- -- Function: -juxt (&rest fns)
- Takes a list of functions and returns a fn that is the
- juxtaposition of those fns. The returned fn takes a variable
- number of args, and returns a list containing the result of
- applying each fn to the args (left-to-right).
-
- (funcall (-juxt '+ '-) 3 5)
- ⇒ '(8 -2)
- (-map (-juxt 'identity 'square) '(1 2 3))
- ⇒ '((1 1) (2 4) (3 9))
-
- -- Function: -compose (&rest fns)
- Takes a list of functions and returns a fn that is the composition
- of those fns. The returned fn takes a variable number of
- arguments, and returns the result of applying each fn to the result
- of applying the previous fn to the arguments (right-to-left).
-
- (funcall (-compose 'square '+) 2 3)
- ⇒ (square (+ 2 3))
- (funcall (-compose 'identity 'square) 3)
- ⇒ (square 3)
- (funcall (-compose 'square 'identity) 3)
- ⇒ (square 3)
-
- -- Function: -applify (fn)
- Changes an n-arity function FN to a 1-arity function that expects a
- list with n items as arguments
-
- (-map (-applify '+) '((1 1 1) (1 2 3) (5 5 5)))
- ⇒ '(3 6 15)
- (-map (-applify (lambda (a b c) `(,a (,b (,c))))) '((1 1 1) (1 2 3) (5 5 5)))
- ⇒ '((1 (1 (1))) (1 (2 (3))) (5 (5 (5))))
- (funcall (-applify '<) '(3 6))
- ⇒ t
-
- -- Function: -on (operator transformer)
- Return a function of two arguments that first applies TRANSFORMER
- to each of them and then applies OPERATOR on the results (in the
- same order).
-
- In types: (b -> b -> c) -> (a -> b) -> a -> a -> c
-
- (-sort (-on '< 'length) '((1 2 3) (1) (1 2)))
- ⇒ '((1) (1 2) (1 2 3))
- (-min-by (-on '> 'length) '((1 2 3) (4) (1 2)))
- ⇒ '(4)
- (-min-by (-on 'string-lessp 'number-to-string) '(2 100 22))
- ⇒ 22
-
- -- Function: -flip (func)
- Swap the order of arguments for binary function FUNC.
-
- In types: (a -> b -> c) -> b -> a -> c
-
- (funcall (-flip '<) 2 1)
- ⇒ t
- (funcall (-flip '-) 3 8)
- ⇒ 5
- (-sort (-flip '<) '(4 3 6 1))
- ⇒ '(6 4 3 1)
-
- -- Function: -const (c)
- Return a function that returns C ignoring any additional arguments.
-
- In types: a -> b -> a
-
- (funcall (-const 2) 1 3 "foo")
- ⇒ 2
- (-map (-const 1) '("a" "b" "c" "d"))
- ⇒ '(1 1 1 1)
- (-sum (-map (-const 1) '("a" "b" "c" "d")))
- ⇒ 4
-
- -- Macro: -cut (&rest params)
- Take n-ary function and n arguments and specialize some of them.
- Arguments denoted by <> will be left unspecialized.
-
- See SRFI-26 for detailed description.
-
- (funcall (-cut list 1 <> 3 <> 5) 2 4)
- ⇒ '(1 2 3 4 5)
- (-map (-cut funcall <> 5) '(1+ 1- (lambda (x) (/ 1.0 x))))
- ⇒ '(6 4 0.2)
- (-map (-cut <> 1 2 3) (list 'list 'vector 'string))
- ⇒ '((1 2 3) [1 2 3] "")
-
- -- Function: -not (pred)
- Take a unary predicate PRED and return a unary predicate that
- returns t if PRED returns nil and nil if PRED returns non-nil.
-
- (funcall (-not 'even?) 5)
- ⇒ t
- (-filter (-not (-partial '< 4)) '(1 2 3 4 5 6 7 8))
- ⇒ '(1 2 3 4)
-
- -- Function: -orfn (&rest preds)
- Take list of unary predicates PREDS and return a unary predicate
- with argument x that returns non-nil if at least one of the PREDS
- returns non-nil on x.
-
- In types: [a -> Bool] -> a -> Bool
-
- (-filter (-orfn 'even? (-partial (-flip '<) 5)) '(1 2 3 4 5 6 7 8 9 10))
- ⇒ '(1 2 3 4 6 8 10)
- (funcall (-orfn 'stringp 'even?) "foo")
- ⇒ t
-
- -- Function: -andfn (&rest preds)
- Take list of unary predicates PREDS and return a unary predicate
- with argument x that returns non-nil if all of the PREDS returns
- non-nil on x.
-
- In types: [a -> Bool] -> a -> Bool
-
- (funcall (-andfn (-cut < <> 10) 'even?) 6)
- ⇒ t
- (funcall (-andfn (-cut < <> 10) 'even?) 12)
- ⇒ nil
- (-filter (-andfn (-not 'even?) (-cut >= 5 <>)) '(1 2 3 4 5 6 7 8 9 10))
- ⇒ '(1 3 5)
-
- -- Function: -iteratefn (fn n)
- Return a function FN composed N times with itself.
-
- FN is a unary function. If you need to use a function of higher
- arity, use ‘-applify’ (*note -applify::) first to turn it into a
- unary function.
-
- With n = 0, this acts as identity function.
-
- In types: (a -> a) -> Int -> a -> a.
-
- This function satisfies the following law:
-
- (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init
- (1+ n))).
-
- (funcall (-iteratefn (lambda (x) (* x x)) 3) 2)
- ⇒ 256
- (funcall (-iteratefn '1+ 3) 1)
- ⇒ 4
- (funcall (-iteratefn 'cdr 3) '(1 2 3 4 5))
- ⇒ '(4 5)
-
- -- Function: -fixfn (fn &optional equal-test halt-test)
- Return a function that computes the (least) fixpoint of FN.
-
- FN must be a unary function. The returned lambda takes a single
- argument, X, the initial value for the fixpoint iteration. The
- iteration halts when either of the following conditions is
- satisfied:
-
- 1. Iteration converges to the fixpoint, with equality being tested
- using EQUAL-TEST. If EQUAL-TEST is not specified, ‘equal’ is used.
- For functions over the floating point numbers, it may be necessary
- to provide an appropriate approximate comparison test.
-
- 2. HALT-TEST returns a non-nil value. HALT-TEST defaults to a
- simple counter that returns t after ‘-fixfn-max-iterations’, to
- guard against infinite iteration. Otherwise, HALT-TEST must be a
- function that accepts a single argument, the current value of X,
- and returns non-nil as long as iteration should continue. In this
- way, a more sophisticated convergence test may be supplied by the
- caller.
-
- The return value of the lambda is either the fixpoint or, if
- iteration halted before converging, a cons with car ‘halted’ and
- cdr the final output from HALT-TEST.
-
- In types: (a -> a) -> a -> a.
-
- (funcall (-fixfn 'cos 'approx-equal) 0.7)
- ⇒ 0.7390851332151607
- (funcall (-fixfn (lambda (x) (expt (+ x 10) 0.25))) 2.0)
- ⇒ 1.8555845286409378
- (funcall (-fixfn 'sin 'approx-equal) 0.1)
- ⇒ '(halted . t)
-
- -- Function: -prodfn (&rest fns)
- Take a list of n functions and return a function that takes a list
- of length n, applying i-th function to i-th element of the input
- list. Returns a list of length n.
-
- In types (for n=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d)
-
- This function satisfies the following laws:
-
- (-compose (-prodfn f g ...) (-prodfn f’ g’ ...)) = (-prodfn
- (-compose f f’) (-compose g g’) ...) (-prodfn f g ...) = (-juxt
- (-compose f (-partial ’nth 0)) (-compose g (-partial ’nth 1)) ...)
- (-compose (-prodfn f g ...) (-juxt f’ g’ ...)) = (-juxt (-compose
- f f’) (-compose g g’) ...) (-compose (-partial ’nth n) (-prod f1
- f2 ...)) = (-compose fn (-partial ’nth n))
-
- (funcall (-prodfn '1+ '1- 'number-to-string) '(1 2 3))
- ⇒ '(2 1 "3")
- (-map (-prodfn '1+ '1-) '((1 2) (3 4) (5 6) (7 8)))
- ⇒ '((2 1) (4 3) (6 5) (8 7))
- (apply '+ (funcall (-prodfn 'length 'string-to-number) '((1 2 3) "15")))
- ⇒ 18
-
-
-File: dash.info, Node: Development, Next: Index, Prev: Functions, Up: Top
-
-3 Development
-*************
-
-The dash repository is hosted on GitHub:
-<https://github.com/magnars/dash.el>
-
-* Menu:
-
-* Contribute:: How to contribute
-* Changes:: List of significant changes by version
-* Contributors:: List of contributors
-
-
-File: dash.info, Node: Contribute, Next: Changes, Up: Development
-
-3.1 Contribute
-==============
-
-Yes, please do. Pure functions in the list manipulation realm only,
-please. There’s a suite of tests in dev/examples.el, so remember to add
-tests for your function, or it might get broken later.
-
- Run the tests with ‘./run-tests.sh’. Create the docs with
-‘./create-docs.sh’. I highly recommend that you install these as a
-pre-commit hook, so that the tests are always running and the docs are
-always in sync:
-
-cp pre-commit.sh .git/hooks/pre-commit
-
- Oh, and don’t edit ‘README.md’ directly, it is auto-generated.
-Change ‘readme-template.md’ or ‘examples-to-docs.el’ instead. The same
-goes for the info manual.
-
-
-File: dash.info, Node: Changes, Next: Contributors, Prev: Contribute, Up: Development
-
-3.2 Changes
-===========
-
-Changes in 2.10:
-
- • Add ‘-let’ destructuring to ‘-if-let’ and ‘-when-let’ (Fredrik
- Bergroth)
-
-Changes in 2.9:
-
- • Add ‘-let’, ‘-let*’ and ‘-lambda’ with destructuring
- • Add ‘-tree-seq’ and ‘-tree-map-nodes’
- • Add ‘-non-nil’
- • Add ‘-fix’
- • Add ‘-fixfn’ (dash-functional 1.2)
- • Add ‘-copy’ (Wilfred Hughes)
-
-Changes in 2.8:
-
- • Add ‘-butlast’
-
-Changes in 2.7:
-
- • ‘-zip’ now supports more than two lists (Steve Lamb)
- • Add ‘-cycle’, ‘-pad’, ‘-annotate’, ‘-zip-fill’ (Steve Lamb)
- • Add ‘-table’, ‘-table-flat’ (finite cartesian product)
- • Add ‘-flatten-n’
- • ‘-slice’ now supports "step" argument
- • Add functional combinators ‘-iteratefn’, ‘-prodfn’
- • Add ‘-replace’, ‘-splice’, ‘-splice-list’ which generalize
- ‘-replace-at’ and ‘-insert-at’
- • Add ‘-compose’, ‘-iteratefn’ and ‘-prodfn’ (dash-functional 1.1)
-
-Changes in 2.6:
-
- • Add ‘-is-prefix-p’, ‘-is-suffix-p’, ‘-is-infix-p’ (Matus Goljer)
- • Add ‘-iterate’, ‘-unfold’ (Matus Goljer)
- • Add ‘-split-on’, ‘-split-when’ (Matus Goljer)
- • Add ‘-find-last-index’ (Matus Goljer)
- • Add ‘-list’ (Johan Andersson)
-
-Changes in 2.5:
-
- • Add ‘-same-items?’ (Johan Andersson)
- • A few bugfixes
-
-Changes in 2.4:
-
- • Add ‘-snoc’ (Matus Goljer)
- • Add ‘-replace-at’, ‘-update-at’, ‘-remove-at’, and
- ‘-remove-at-indices’ (Matus Goljer)
-
-Changes in 2.3:
-
- • Add tree operations (Matus Goljer)
- • Make font-lock optional
-
-Changes in 2.2:
-
- • Add ‘-compose’ (Christina Whyte)
-
-Changes in 2.1:
-
- • Add indexing operations (Matus Goljer)
-
-Changes in 2.0:
-
- • Split out ‘dash-functional.el’ (Matus Goljer)
- • Add ‘-andfn’, ‘-orfn’, ‘-not’, ‘-cut’, ‘-const’, ‘-flip’ and ‘-on’.
- (Matus Goljer)
- • Fix ‘-min’, ‘-max’, ‘-min-by’ and ‘-max-by’ (Matus Goljer)
-
-Changes in 1.8:
-
- • Add ‘-first-item’ and ‘-last-item’ (Wilfred Hughes)
-
-Changes in 1.7:
-
- • Add ‘-rotate’ (Matus Goljer)
-
-Changes in 1.6:
-
- • Add ‘-min’, ‘-max’, ‘-min-by’ and ‘-max-by’ (Johan Andersson)
-
-Changes in 1.5:
-
- • Add ‘-sum’ and ‘-product’ (Johan Andersson)
-
-Changes in 1.4:
-
- • Add ‘-sort’
- • Add ‘-reduce-r’ (Matus Goljer)
- • Add ‘-reduce-r-from’ (Matus Goljer)
-
-Changes in 1.3:
-
- • Add ‘-partition-in-steps’
- • Add ‘-partition-all-in-steps’
-
-Changes in 1.2:
-
- • Add ‘-last’ (Matus Goljer)
- • Add ‘-insert-at’ (Emanuel Evans)
- • Add ‘-when-let’ and ‘-if-let’ (Emanuel Evans)
- • Add ‘-when-let*’ and ‘-if-let*’ (Emanuel Evans)
- • Some bugfixes
-
-
-File: dash.info, Node: Contributors, Prev: Changes, Up: Development
-
-3.3 Contributors
-================
-
- • Matus Goljer (https://github.com/Fuco1) contributed lots of
- features and functions.
- • Takafumi Arakaki (https://github.com/tkf) contributed ‘-group-by’.
- • tali713 (https://github.com/tali713) is the author of ‘-applify’.
- • Víctor M. Valenzuela (https://github.com/vemv) contributed
- ‘-repeat’.
- • Nic Ferrier (https://github.com/nicferrier) contributed ‘-cons*’.
- • Wilfred Hughes (https://github.com/Wilfred) contributed ‘-slice’,
- ‘-first-item’ and ‘-last-item’.
- • Emanuel Evans (https://github.com/shosti) contributed ‘-if-let’,
- ‘-when-let’ and ‘-insert-at’.
- • Johan Andersson (https://github.com/rejeep) contributed ‘-sum’,
- ‘-product’ and ‘-same-items?’
- • Christina Whyte (https://github.com/kurisuwhyte) contributed
- ‘-compose’
- • Steve Lamb (https://github.com/steventlamb) contributed ‘-cycle’,
- ‘-pad’, ‘-annotate’, ‘-zip-fill’ and an n-ary version of ‘-zip’.
- • Fredrik Bergroth (https://github.com/fbergroth) made the ‘-if-let’
- family use ‘-let’ destructuring and improved script for generating
- documentation.
- • Mark Oteiza (https://github.com/holomorph) contributed the script
- to create an info manual.
- • Vasilij Schneidermann (https://github.com/wasamasa) contributed
- ‘-some’.
- • William West (https://github.com/occidens) made ‘-fixfn’ more
- robust at handling floats.
-
- Thanks!
-
-
-File: dash.info, Node: Index, Prev: Development, Up: Top
-
-Index
-*****
-
-
-* Menu:
-
-* !cdr: Destructive operations.
- (line 14)
-* !cons: Destructive operations.
- (line 6)
-* -->: Threading macros. (line 32)
-* --doto: Side-effects. (line 81)
-* ->: Threading macros. (line 6)
-* ->>: Threading macros. (line 19)
-* -all?: Predicates. (line 18)
-* -andfn: Function combinators.
- (line 138)
-* -annotate: Maps. (line 79)
-* -any?: Predicates. (line 6)
-* -applify: Function combinators.
- (line 55)
-* -as->: Threading macros. (line 46)
-* -butlast: Other list operations.
- (line 340)
-* -clone: Tree operations. (line 122)
-* -common-prefix: Reductions. (line 223)
-* -common-suffix: Reductions. (line 233)
-* -compose: Function combinators.
- (line 42)
-* -concat: List to list. (line 22)
-* -cons*: Other list operations.
- (line 30)
-* -const: Function combinators.
- (line 92)
-* -contains?: Predicates. (line 57)
-* -copy: Maps. (line 134)
-* -count: Reductions. (line 151)
-* -cut: Function combinators.
- (line 104)
-* -cycle: Other list operations.
- (line 168)
-* -difference: Set operations. (line 20)
-* -distinct: Set operations. (line 62)
-* -dotimes: Side-effects. (line 61)
-* -doto: Side-effects. (line 70)
-* -drop: Sublist selection. (line 124)
-* -drop-last: Sublist selection. (line 136)
-* -drop-while: Sublist selection. (line 157)
-* -each: Side-effects. (line 8)
-* -each-indexed: Side-effects. (line 28)
-* -each-r: Side-effects. (line 41)
-* -each-r-while: Side-effects. (line 52)
-* -each-while: Side-effects. (line 19)
-* -elem-index: Indexing. (line 9)
-* -elem-indices: Indexing. (line 21)
-* -fifth-item: Other list operations.
- (line 320)
-* -filter: Sublist selection. (line 8)
-* -find-index: Indexing. (line 32)
-* -find-indices: Indexing. (line 60)
-* -find-last-index: Indexing. (line 46)
-* -first: Other list operations.
- (line 234)
-* -first-item: Other list operations.
- (line 271)
-* -fix: Other list operations.
- (line 376)
-* -fixfn: Function combinators.
- (line 175)
-* -flatten: List to list. (line 33)
-* -flatten-n: List to list. (line 55)
-* -flip: Function combinators.
- (line 80)
-* -fourth-item: Other list operations.
- (line 310)
-* -grade-down: Indexing. (line 81)
-* -grade-up: Indexing. (line 71)
-* -group-by: Partitioning. (line 187)
-* -if-let: Binding. (line 36)
-* -if-let*: Binding. (line 49)
-* -inits: Reductions. (line 203)
-* -insert-at: List to list. (line 109)
-* -interleave: Other list operations.
- (line 68)
-* -interpose: Other list operations.
- (line 58)
-* -intersection: Set operations. (line 32)
-* -is-infix?: Predicates. (line 110)
-* -is-prefix?: Predicates. (line 86)
-* -is-suffix?: Predicates. (line 98)
-* -iterate: Unfolding. (line 9)
-* -iteratefn: Function combinators.
- (line 152)
-* -juxt: Function combinators.
- (line 31)
-* -keep: List to list. (line 8)
-* -lambda: Binding. (line 252)
-* -last: Other list operations.
- (line 261)
-* -last-item: Other list operations.
- (line 330)
-* -let: Binding. (line 65)
-* -let*: Binding. (line 232)
-* -list: Other list operations.
- (line 363)
-* -map: Maps. (line 10)
-* -map-first: Maps. (line 37)
-* -map-indexed: Maps. (line 65)
-* -map-last: Maps. (line 51)
-* -map-when: Maps. (line 21)
-* -mapcat: Maps. (line 123)
-* -max: Reductions. (line 267)
-* -max-by: Reductions. (line 277)
-* -min: Reductions. (line 243)
-* -min-by: Reductions. (line 253)
-* -non-nil: Sublist selection. (line 79)
-* -none?: Predicates. (line 30)
-* -not: Function combinators.
- (line 117)
-* -on: Function combinators.
- (line 66)
-* -only-some?: Predicates. (line 42)
-* -orfn: Function combinators.
- (line 126)
-* -pad: Other list operations.
- (line 179)
-* -partial: Function combinators.
- (line 9)
-* -partition: Partitioning. (line 74)
-* -partition-after-item: Partitioning. (line 177)
-* -partition-after-pred: Partitioning. (line 145)
-* -partition-all: Partitioning. (line 86)
-* -partition-all-in-steps: Partitioning. (line 109)
-* -partition-before-item: Partitioning. (line 167)
-* -partition-before-pred: Partitioning. (line 156)
-* -partition-by: Partitioning. (line 121)
-* -partition-by-header: Partitioning. (line 132)
-* -partition-in-steps: Partitioning. (line 97)
-* -permutations: Set operations. (line 52)
-* -powerset: Set operations. (line 44)
-* -prodfn: Function combinators.
- (line 209)
-* -product: Reductions. (line 181)
-* -reduce: Reductions. (line 46)
-* -reduce-from: Reductions. (line 8)
-* -reduce-r: Reductions. (line 65)
-* -reduce-r-from: Reductions. (line 27)
-* -reductions: Reductions. (line 119)
-* -reductions-from: Reductions. (line 87)
-* -reductions-r: Reductions. (line 135)
-* -reductions-r-from: Reductions. (line 103)
-* -remove: Sublist selection. (line 23)
-* -remove-at: List to list. (line 145)
-* -remove-at-indices: List to list. (line 158)
-* -remove-first: Sublist selection. (line 37)
-* -remove-item: Sublist selection. (line 67)
-* -remove-last: Sublist selection. (line 52)
-* -repeat: Other list operations.
- (line 19)
-* -replace: List to list. (line 67)
-* -replace-at: List to list. (line 120)
-* -replace-first: List to list. (line 81)
-* -replace-last: List to list. (line 95)
-* -rotate: Other list operations.
- (line 8)
-* -rpartial: Function combinators.
- (line 20)
-* -running-product: Reductions. (line 191)
-* -running-sum: Reductions. (line 169)
-* -same-items?: Predicates. (line 72)
-* -second-item: Other list operations.
- (line 286)
-* -select-by-indices: Sublist selection. (line 168)
-* -select-column: Sublist selection. (line 198)
-* -select-columns: Sublist selection. (line 179)
-* -separate: Partitioning. (line 63)
-* -setq: Binding. (line 274)
-* -slice: Sublist selection. (line 85)
-* -snoc: Other list operations.
- (line 44)
-* -some: Other list operations.
- (line 248)
-* -some-->: Threading macros. (line 83)
-* -some->: Threading macros. (line 59)
-* -some->>: Threading macros. (line 71)
-* -sort: Other list operations.
- (line 350)
-* -splice: Maps. (line 90)
-* -splice-list: Maps. (line 110)
-* -split-at: Partitioning. (line 8)
-* -split-on: Partitioning. (line 28)
-* -split-when: Partitioning. (line 46)
-* -split-with: Partitioning. (line 17)
-* -sum: Reductions. (line 159)
-* -table: Other list operations.
- (line 190)
-* -table-flat: Other list operations.
- (line 209)
-* -tails: Reductions. (line 213)
-* -take: Sublist selection. (line 101)
-* -take-last: Sublist selection. (line 112)
-* -take-while: Sublist selection. (line 146)
-* -third-item: Other list operations.
- (line 298)
-* -tree-map: Tree operations. (line 28)
-* -tree-map-nodes: Tree operations. (line 39)
-* -tree-mapreduce: Tree operations. (line 84)
-* -tree-mapreduce-from: Tree operations. (line 103)
-* -tree-reduce: Tree operations. (line 52)
-* -tree-reduce-from: Tree operations. (line 69)
-* -tree-seq: Tree operations. (line 8)
-* -unfold: Unfolding. (line 25)
-* -union: Set operations. (line 8)
-* -unzip: Other list operations.
- (line 146)
-* -update-at: List to list. (line 132)
-* -when-let: Binding. (line 9)
-* -when-let*: Binding. (line 23)
-* -zip: Other list operations.
- (line 95)
-* -zip-fill: Other list operations.
- (line 138)
-* -zip-lists: Other list operations.
- (line 119)
-* -zip-with: Other list operations.
- (line 79)
-
-
-
-Tag Table:
-Node: Top946
-Node: Installation2425
-Node: Using in a package2958
-Node: Syntax highlighting of dash functions3322
-Node: Functions3705
-Node: Maps4916
-Ref: -map5211
-Ref: -map-when5552
-Ref: -map-first6130
-Ref: -map-last6608
-Ref: -map-indexed7081
-Ref: -annotate7561
-Ref: -splice8051
-Ref: -splice-list8832
-Ref: -mapcat9294
-Ref: -copy9670
-Node: Sublist selection9874
-Ref: -filter10067
-Ref: -remove10519
-Ref: -remove-first10925
-Ref: -remove-last11452
-Ref: -remove-item11973
-Ref: -non-nil12368
-Ref: -slice12527
-Ref: -take13059
-Ref: -take-last13367
-Ref: -drop13690
-Ref: -drop-last13963
-Ref: -take-while14223
-Ref: -drop-while14573
-Ref: -select-by-indices14929
-Ref: -select-columns15443
-Ref: -select-column16149
-Node: List to list16613
-Ref: -keep16805
-Ref: -concat17308
-Ref: -flatten17605
-Ref: -flatten-n18364
-Ref: -replace18751
-Ref: -replace-first19214
-Ref: -replace-last19711
-Ref: -insert-at20201
-Ref: -replace-at20528
-Ref: -update-at20918
-Ref: -remove-at21409
-Ref: -remove-at-indices21897
-Node: Reductions22479
-Ref: -reduce-from22648
-Ref: -reduce-r-from23414
-Ref: -reduce24181
-Ref: -reduce-r24910
-Ref: -reductions-from25781
-Ref: -reductions-r-from26496
-Ref: -reductions27221
-Ref: -reductions-r27846
-Ref: -count28481
-Ref: -sum28705
-Ref: -running-sum28894
-Ref: -product29187
-Ref: -running-product29396
-Ref: -inits29709
-Ref: -tails29957
-Ref: -common-prefix30204
-Ref: -common-suffix30501
-Ref: -min30798
-Ref: -min-by31024
-Ref: -max31547
-Ref: -max-by31772
-Node: Unfolding32300
-Ref: -iterate32539
-Ref: -unfold32984
-Node: Predicates33792
-Ref: -any?33916
-Ref: -all?34236
-Ref: -none?34566
-Ref: -only-some?34868
-Ref: -contains?35353
-Ref: -same-items?35742
-Ref: -is-prefix?36127
-Ref: -is-suffix?36450
-Ref: -is-infix?36773
-Node: Partitioning37127
-Ref: -split-at37315
-Ref: -split-with37600
-Ref: -split-on38003
-Ref: -split-when38679
-Ref: -separate39319
-Ref: -partition39761
-Ref: -partition-all40213
-Ref: -partition-in-steps40641
-Ref: -partition-all-in-steps41138
-Ref: -partition-by41623
-Ref: -partition-by-header42005
-Ref: -partition-after-pred42609
-Ref: -partition-before-pred42953
-Ref: -partition-before-item43304
-Ref: -partition-after-item43615
-Ref: -group-by43921
-Node: Indexing44358
-Ref: -elem-index44560
-Ref: -elem-indices44955
-Ref: -find-index45338
-Ref: -find-last-index45827
-Ref: -find-indices46331
-Ref: -grade-up46739
-Ref: -grade-down47142
-Node: Set operations47552
-Ref: -union47735
-Ref: -difference48177
-Ref: -intersection48594
-Ref: -powerset49031
-Ref: -permutations49244
-Ref: -distinct49544
-Node: Other list operations49922
-Ref: -rotate50147
-Ref: -repeat50517
-Ref: -cons*50780
-Ref: -snoc51167
-Ref: -interpose51580
-Ref: -interleave51878
-Ref: -zip-with52247
-Ref: -zip52964
-Ref: -zip-lists53796
-Ref: -zip-fill54497
-Ref: -unzip54820
-Ref: -cycle55565
-Ref: -pad55938
-Ref: -table56261
-Ref: -table-flat57050
-Ref: -first58058
-Ref: -some58430
-Ref: -last58739
-Ref: -first-item59073
-Ref: -second-item59489
-Ref: -third-item59769
-Ref: -fourth-item60047
-Ref: -fifth-item60313
-Ref: -last-item60575
-Ref: -butlast60867
-Ref: -sort61114
-Ref: -list61603
-Ref: -fix61934
-Node: Tree operations62474
-Ref: -tree-seq62670
-Ref: -tree-map63528
-Ref: -tree-map-nodes63971
-Ref: -tree-reduce64821
-Ref: -tree-reduce-from65703
-Ref: -tree-mapreduce66304
-Ref: -tree-mapreduce-from67164
-Ref: -clone68450
-Node: Threading macros68778
-Ref: ->68923
-Ref: ->>69414
-Ref: -->69919
-Ref: -as->70475
-Ref: -some->70930
-Ref: -some->>71304
-Ref: -some-->71740
-Node: Binding72211
-Ref: -when-let72423
-Ref: -when-let*72908
-Ref: -if-let73431
-Ref: -if-let*73826
-Ref: -let74443
-Ref: -let*80533
-Ref: -lambda81473
-Ref: -setq82270
-Node: Side-effects83086
-Ref: -each83280
-Ref: -each-while83687
-Ref: -each-indexed84047
-Ref: -each-r84565
-Ref: -each-r-while84998
-Ref: -dotimes85373
-Ref: -doto85676
-Ref: --doto86104
-Node: Destructive operations86379
-Ref: !cons86552
-Ref: !cdr86758
-Node: Function combinators86953
-Ref: -partial87227
-Ref: -rpartial87623
-Ref: -juxt88026
-Ref: -compose88458
-Ref: -applify89011
-Ref: -on89442
-Ref: -flip89968
-Ref: -const90280
-Ref: -cut90619
-Ref: -not91105
-Ref: -orfn91415
-Ref: -andfn91849
-Ref: -iteratefn92344
-Ref: -fixfn93047
-Ref: -prodfn94610
-Node: Development95678
-Node: Contribute96027
-Node: Changes96775
-Node: Contributors99773
-Node: Index101392
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/dash-20200524.1947/dir b/elpa/dash-20200524.1947/dir
deleted file mode 100644
index 49b1700..0000000
--- a/elpa/dash-20200524.1947/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* Dash: (dash.info). A modern list library for GNU Emacs
diff --git a/elpa/dashboard-20200306.1344/banners/1.txt b/elpa/dashboard-20200306.1344/banners/1.txt
deleted file mode 100644
index 8bd71a7..0000000
--- a/elpa/dashboard-20200306.1344/banners/1.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-######## ## ## ### ###### ######
-## ### ### ## ## ## ## ## ##
-## #### #### ## ## ## ##
-###### ## ### ## ## ## ## ######
-## ## ## ######### ## ##
-## ## ## ## ## ## ## ## ##
-######## ## ## ## ## ###### ######
diff --git a/elpa/dashboard-20200306.1344/banners/2.txt b/elpa/dashboard-20200306.1344/banners/2.txt
deleted file mode 100644
index 73b761b..0000000
--- a/elpa/dashboard-20200306.1344/banners/2.txt
+++ /dev/null
@@ -1,6 +0,0 @@
- _______ .___ ___. ___ ______ _______.
-| ____|| \/ | / \ / | / |
-| |__ | \ / | / ^ \ | ,----' | (----`
-| __| | |\/| | / /_\ \ | | \ \
-| |____ | | | | / _____ \ | `----.----) |
-|_______||__| |__| /__/ \__\ \______|_______/
diff --git a/elpa/dashboard-20200306.1344/banners/3.txt b/elpa/dashboard-20200306.1344/banners/3.txt
deleted file mode 100644
index 3abfd82..0000000
--- a/elpa/dashboard-20200306.1344/banners/3.txt
+++ /dev/null
@@ -1,8 +0,0 @@
- _______ _____ ______ ________ ________ ________
-|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\
-\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_
- \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \
- \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \
- \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \
- \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\
- \|_________|
diff --git a/elpa/dashboard-20200306.1344/banners/emacs.png b/elpa/dashboard-20200306.1344/banners/emacs.png
deleted file mode 100644
index 718b071..0000000
--- a/elpa/dashboard-20200306.1344/banners/emacs.png
+++ /dev/null
Binary files differ
diff --git a/elpa/dashboard-20200306.1344/banners/logo.png b/elpa/dashboard-20200306.1344/banners/logo.png
deleted file mode 100644
index c9de00c..0000000
--- a/elpa/dashboard-20200306.1344/banners/logo.png
+++ /dev/null
Binary files differ
diff --git a/elpa/dashboard-20200306.1344/dashboard-autoloads.el b/elpa/dashboard-20200306.1344/dashboard-autoloads.el
deleted file mode 100644
index cc682f5..0000000
--- a/elpa/dashboard-20200306.1344/dashboard-autoloads.el
+++ /dev/null
@@ -1,41 +0,0 @@
-;;; dashboard-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0))
-;;; Generated autoloads from dashboard.el
-
-(autoload 'dashboard-setup-startup-hook "dashboard" "\
-Setup post initialization hooks.
-If a command line argument is provided,
-assume a filename and skip displaying Dashboard.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard" '("dashboard-")))
-
-;;;***
-
-;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from dashboard-widgets.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard-widgets" '("dashboard-" "recentf-list")))
-
-;;;***
-
-;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; dashboard-autoloads.el ends here
diff --git a/elpa/dashboard-20200306.1344/dashboard-pkg.el b/elpa/dashboard-20200306.1344/dashboard-pkg.el
deleted file mode 100644
index 44d332a..0000000
--- a/elpa/dashboard-20200306.1344/dashboard-pkg.el
+++ /dev/null
@@ -1,13 +0,0 @@
-(define-package "dashboard" "20200306.1344" "A startup screen extracted from Spacemacs"
- '((emacs "25.3")
- (page-break-lines "0.11"))
- :commit "bf38867ae80902d58207974b4a2bba4249324599" :keywords
- '("startup" "screen" "tools" "dashboard")
- :authors
- '(("Rakan Al-Hneiti"))
- :maintainer
- '("Rakan Al-Hneiti")
- :url "https://github.com/emacs-dashboard/emacs-dashboard")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/dashboard-20200306.1344/dashboard-widgets.el b/elpa/dashboard-20200306.1344/dashboard-widgets.el
deleted file mode 100644
index a045ce7..0000000
--- a/elpa/dashboard-20200306.1344/dashboard-widgets.el
+++ /dev/null
@@ -1,729 +0,0 @@
-;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*-
-
-;; Copyright (c) 2016-2020 Rakan Al-Hneiti & Contributors
-;;
-;; Author: Rakan Al-Hneiti
-;; URL: https://github.com/emacs-dashboard/emacs-dashboard
-;;
-;; This file is not part of GNU Emacs.
-;;
-;;; License: GPLv3
-;;
-;; Created: October 05, 2016
-;; Package-Version: 1.8.0-SNAPSHOT
-;; Keywords: startup, screen, tools, dashboard
-;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11"))
-;;; Commentary:
-
-;; An extensible Emacs dashboard, with sections for
-;; bookmarks, projectile projects, org-agenda and more.
-
-;;; Code:
-
-(require 'cl-lib)
-
-;; Compiler pacifier
-(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el")
-(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el")
-(declare-function bookmark-get-filename "ext:bookmark.el")
-(declare-function bookmark-all-names "ext:bookmark.el")
-(declare-function calendar-date-compare "ext:calendar.el")
-(declare-function projectile-cleanup-known-projects "ext:projectile.el")
-(declare-function projectile-load-known-projects "ext:projectile.el")
-(declare-function projectile-mode "ext:projectile.el")
-(declare-function projectile-relevant-known-projects "ext:projectile.el")
-(declare-function org-agenda-format-item "ext:org-agenda.el")
-(declare-function org-compile-prefix-format "ext:org-agenda.el")
-(declare-function org-entry-is-done-p "ext:org.el")
-(declare-function org-get-category "ext:org.el")
-(declare-function org-get-deadline-time "ext:org.el")
-(declare-function org-get-heading "ext:org.el")
-(declare-function org-get-scheduled-time "ext:org.el")
-(declare-function org-get-tags "ext:org.el")
-(declare-function org-map-entries "ext:org.el")
-(declare-function org-outline-level "ext:org.el")
-(defvar all-the-icons-dir-icon-alist)
-(defvar package-activated-list)
-
-(defcustom dashboard-page-separator "\n\f\n"
- "Separator to use between the different pages."
- :type 'string
- :group 'dashboard)
-
-(defcustom dashboard-image-banner-max-height 0
- "Maximum height of banner image.
-
-This setting applies only if Emacs is compiled with Imagemagick
-support. When value is non-zero the image banner will be resized
-to the specified height, with aspect ratio preserved."
- :type 'integer
- :group 'dashboard)
-
-(defcustom dashboard-image-banner-max-width 0
- "Maximum width of banner image.
-
-This setting applies if Emacs is compiled with Imagemagick
-support. When value is non-zero the image banner will be resized
-to the specified width, with aspect ratio preserved."
- :type 'integer
- :group 'dashboard)
-
-(defcustom dashboard-set-heading-icons nil
- "When non nil, heading sections will have icons."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-set-file-icons nil
- "When non nil, file lists will have icons."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-set-navigator nil
- "When non nil, a navigator will be displayed under the banner."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-set-init-info t
- "When non nil, init info will be displayed under the banner."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-set-footer t
- "When non nil, a footer will be displayed at the bottom."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-footer-messages
- '("The one true editor, Emacs!"
- "Who the hell uses VIM anyway? Go Evil!"
- "Free as free speech, free as free Beer"
- "Richard Stallman is proud of you"
- "Happy coding!"
- "Vi Vi Vi, the editor of the beast"
- "Welcome to the church of Emacs"
- "While any text editor can save your files,\
- only Emacs can save your soul"
- "I showed you my source code, pls respond")
- "A list of messages, one of which dashboard chooses to display."
- :type 'list
- :group 'dashboard)
-
-(defcustom dashboard-show-shortcuts t
- "Whether to show shortcut keys for each section."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-org-agenda-categories nil
- "Specify the Categories to consider when using agenda in dashboard.
-Example:
-'(\"Tasks\" \"Habits\")"
- :type 'list
- :group 'dashboard)
-
-(defconst dashboard-banners-directory
- (concat (file-name-directory
- (locate-library "dashboard"))
- "/banners/"))
-
-(defconst dashboard-banner-official-png
- (expand-file-name (concat dashboard-banners-directory "emacs.png"))
- "Emacs banner image.")
-
-(defconst dashboard-banner-logo-png
- (expand-file-name (concat dashboard-banners-directory "logo.png"))
- "Emacs banner image.")
-
-(defconst dashboard-banner-length 75
- "Width of a banner.")
-
-(defcustom dashboard-banner-logo-title "Welcome to Emacs!"
- "Specify the startup banner."
- :type 'string
- :group 'dashboard)
-
-(defcustom dashboard-navigator-buttons nil
- "Specify the navigator buttons.
-The format is: 'icon title help action face prefix suffix'.
-
-Example:
-'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) (show-stars)) 'warning \"[\" \"]\"))"
- :type '(repeat (repeat (list string string string function symbol string string)))
- :group 'dashboard)
-
-(defcustom dashboard-init-info
- ;; Check if package.el was loaded and if package loading was enabled
- (if (bound-and-true-p package-alist)
- (format "%d packages loaded in %s"
- (length package-activated-list) (emacs-init-time))
- (if (and (boundp 'straight--profile-cache) (hash-table-p straight--profile-cache))
- (format "%d packages loaded in %s"
- (hash-table-size straight--profile-cache) (emacs-init-time))
- (format "Emacs started in %s" (emacs-init-time))))
- "Init info with packages loaded and init time."
- :type 'boolean
- :group 'dashboard)
-
-(defcustom dashboard-footer
- (let ((list '("The one true editor, Emacs!"
- "Who the hell uses VIM anyway? Go Evil!"
- "Free as free speech, free as free Beer"
- "Richard Stallman is proud of you"
- "Happy coding!"
- "Vi Vi Vi, the editor of the beast"
- "Welcome to the church of Emacs"
- "While any text editor can save your files,\
- only Emacs can save your soul"
- "I showed you my source code, pls respond"
- )))
- (nth (random (1- (1+ (length list)))) list))
- "A footer with some short message."
- :type 'string
- :group 'dashboard)
-
-(defcustom dashboard-footer-icon
- (if (and (display-graphic-p)
- (or (fboundp 'all-the-icons-fileicon)
- (require 'all-the-icons nil 'noerror)))
- (all-the-icons-fileicon "emacs"
- :height 1.1
- :v-adjust -0.05
- :face 'font-lock-keyword-face)
- (propertize ">" 'face 'dashboard-footer))
- "Footer's icon."
- :type 'string
- :group 'dashboard)
-
-(defcustom dashboard-startup-banner 'official
- "Specify the startup banner.
-Default value is `official', it displays
-the Emacs logo. `logo' displays Emacs alternative logo.
-An integer value is the index of text
-banner. A string value must be a path to a .PNG file.
-If the value is nil then no banner is displayed."
- :type '(choice (const :tag "offical" official)
- (const :tag "logo" logo)
- (string :tag "a png path"))
- :group 'dashboard)
-
-(defcustom dashboard-buffer-last-width nil
- "Previous width of dashboard-buffer."
- :type 'integer
- :group 'dashboard)
-
-(defcustom dashboard-item-generators '((recents . dashboard-insert-recents)
- (bookmarks . dashboard-insert-bookmarks)
- (projects . dashboard-insert-projects)
- (agenda . dashboard-insert-agenda)
- (registers . dashboard-insert-registers))
- "Association list of items to how to generate in the startup buffer.
-Will be of the form `(list-type . list-function)'.
-Possible values for list-type are: `recents', `bookmarks', `projects',
-`agenda' ,`registers'."
- :type '(repeat (alist :key-type symbol :value-type function))
- :group 'dashboard)
-
-(defcustom dashboard-items '((recents . 5)
- (bookmarks . 5)
- (agenda . 5))
- "Association list of items to show in the startup buffer.
-Will be of the form `(list-type . list-size)'.
-If nil it is disabled. Possible values for list-type are:
-`recents' `bookmarks' `projects' `agenda' `registers'."
- :type '(repeat (alist :key-type symbol :value-type integer))
- :group 'dashboard)
-
-(defcustom dashboard-items-default-length 20
- "Length used for startup lists with otherwise unspecified bounds.
-Set to nil for unbounded."
- :type 'integer
- :group 'dashboard)
-
-(defcustom dashboard-heading-icons '((recents . "history")
- (bookmarks . "bookmark")
- (agenda . "calendar")
- (projects . "rocket")
- (registers . "database"))
- "Association list for the icons of the heading sections.
-Will be of the form `(list-type . icon-name-string)`.
-If nil it is disabled. Possible values for list-type are:
-`recents' `bookmarks' `projects' `agenda' `registers'"
- :type '(repeat (alist :key-type symbol :value-type string))
- :group 'dashboard)
-
-(defvar recentf-list nil)
-
-;;
-;; Faces
-;;
-(defface dashboard-text-banner
- '((t (:inherit font-lock-keyword-face)))
- "Face used for text banners."
- :group 'dashboard)
-
-(defface dashboard-banner-logo-title
- '((t :inherit default))
- "Face used for the banner title."
- :group 'dashboard)
-
-(defface dashboard-navigator
- '((t (:inherit font-lock-keyword-face)))
- "Face used for the navigator."
- :group 'dashboard)
-
-(defface dashboard-heading
- '((t (:inherit font-lock-keyword-face)))
- "Face used for widget headings."
- :group 'dashboard)
-
-(defface dashboard-footer
- '((t (:inherit font-lock-doc-face)))
- "Face used for widget headings."
- :group 'dashboard)
-
-(define-obsolete-face-alias
- 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6")
-(define-obsolete-face-alias
- 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6")
-(define-obsolete-face-alias
- 'dashboard-heading-face 'dashboard-heading "1.2.6")
-
-;;
-;; Generic widget helpers
-;;
-(defun dashboard-subseq (seq start end)
- "Return the subsequence of SEQ from START to END..
-Uses `cl-subseq`, but accounts for end points greater than the size of the
-list.
-Return entire list if `END' is omitted."
- (let ((len (length seq)))
- (cl-subseq seq start (and (number-or-marker-p end)
- (min len end)))))
-
-(defmacro dashboard-insert-shortcut (shortcut-char
- search-label
- &optional no-next-line)
- "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL.
-Optionally, provide NO-NEXT-LINE to move the cursor forward a line."
- `(progn
- (eval-when-compile (defvar dashboard-mode-map))
- (let ((sym (make-symbol (format "Jump to \"%s\"" ,search-label))))
- (fset sym (lambda ()
- (interactive)
- (unless (search-forward ,search-label (point-max) t)
- (search-backward ,search-label (point-min) t))
- ,@(unless no-next-line
- '((forward-line 1)))
- (back-to-indentation)))
- (eval-after-load 'dashboard
- (define-key dashboard-mode-map ,shortcut-char sym)))))
-
-(defun dashboard-append (msg &optional _messagebuf)
- "Append MSG to dashboard buffer.
-If MESSAGEBUF is not nil then MSG is also written in message buffer."
- (with-current-buffer (get-buffer-create "*dashboard*")
- (goto-char (point-max))
- (let ((buffer-read-only nil))
- (insert msg))))
-
-(defun dashboard-modify-heading-icons (alist)
- "Append ALIST items to `dashboard-heading-icons' to modify icons."
- (dolist (icon alist)
- (add-to-list 'dashboard-heading-icons icon)))
-
-(defun dashboard-insert-page-break ()
- "Insert a page break line in dashboard buffer."
- (dashboard-append dashboard-page-separator))
-
-(defun dashboard-insert-heading (heading &optional shortcut)
- "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided."
- (when (and (display-graphic-p)
- dashboard-set-heading-icons)
- ;; Try loading `all-the-icons'
- (unless (or (fboundp 'all-the-icons-octicon)
- (require 'all-the-icons nil 'noerror))
- (error "Package `all-the-icons' isn't installed"))
-
- (insert (cond
- ((string-equal heading "Recent Files:")
- (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons))
- :height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
- ((string-equal heading "Bookmarks:")
- (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons))
- :height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
- ((or (string-equal heading "Agenda for today:")
- (string-equal heading "Agenda for the coming week:"))
- (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons))
- :height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
- ((string-equal heading "Registers:")
- (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons))
- :height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
- ((string-equal heading "Projects:")
- (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons))
- :height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
- (t " ")))
- (insert " "))
-
- (insert (propertize heading 'face 'dashboard-heading))
- (if shortcut (insert (format " (%s)" shortcut))))
-
-(defun dashboard-center-line (string)
- "Center a STRING accoring to it's size."
- (insert (make-string (max 0 (floor (/ (- dashboard-banner-length
- (+ (length string) 1)) 2))) ?\ )))
-
-;;
-;; BANNER
-;;
-(defun dashboard-insert-ascii-banner-centered (file)
- "Insert banner from FILE."
- (let ((ascii-banner
- (with-temp-buffer
- (insert-file-contents file)
- (let ((banner-width 0))
- (while (not (eobp))
- (let ((line-length (- (line-end-position) (line-beginning-position))))
- (if (< banner-width line-length)
- (setq banner-width line-length)))
- (forward-line 1))
- (goto-char 0)
- (let ((margin
- (max 0 (floor (/ (- dashboard-banner-length banner-width) 2)))))
- (while (not (eobp))
- (insert (make-string margin ?\ ))
- (forward-line 1))))
- (buffer-string))))
- (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner)
- (insert ascii-banner)))
-
-(defun dashboard-insert-image-banner (banner)
- "Display an image BANNER."
- (when (file-exists-p banner)
- (let* ((title dashboard-banner-logo-title)
- (spec
- (if (image-type-available-p 'imagemagick)
- (apply 'create-image banner 'imagemagick nil
- (append (when (> dashboard-image-banner-max-width 0)
- (list :max-width dashboard-image-banner-max-width))
- (when (> dashboard-image-banner-max-height 0)
- (list :max-height dashboard-image-banner-max-height))))
- (create-image banner)))
- (size (image-size spec))
- (width (car size))
- (left-margin (max 0 (floor (- dashboard-banner-length width) 2))))
- (goto-char (point-min))
- (insert "\n")
- (insert (make-string left-margin ?\ ))
- (insert-image spec)
- (insert "\n\n")
- (when title
- (dashboard-center-line title)
- (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title)))))))
-
-;;
-;; INIT INFO
-;;
-(defun dashboard-insert-init-info ()
- "Insert init info when `dashboard-set-init-info' is t."
- (when dashboard-set-init-info
- (dashboard-center-line dashboard-init-info)
- (insert
- (propertize dashboard-init-info 'face 'font-lock-comment-face))))
-
-(defun dashboard-get-banner-path (index)
- "Return the full path to banner with index INDEX."
- (concat dashboard-banners-directory (format "%d.txt" index)))
-
-(defun dashboard-choose-banner ()
- "Return the full path of a banner based on the dotfile value."
- (when dashboard-startup-banner
- (cond ((eq 'official dashboard-startup-banner)
- (if (and (display-graphic-p) (image-type-available-p 'png))
- dashboard-banner-official-png
- (dashboard-get-banner-path 1)))
- ((eq 'logo dashboard-startup-banner)
- (if (and (display-graphic-p) (image-type-available-p 'png))
- dashboard-banner-logo-png
- (dashboard-get-banner-path 1)))
- ((integerp dashboard-startup-banner)
- (dashboard-get-banner-path dashboard-startup-banner))
- ((and dashboard-startup-banner
- (image-type-available-p (intern (file-name-extension
- dashboard-startup-banner)))
- (display-graphic-p))
- (if (file-exists-p dashboard-startup-banner)
- dashboard-startup-banner
- (message (format "could not find banner %s"
- dashboard-startup-banner))
- (dashboard-get-banner-path 1)))
- (t (dashboard-get-banner-path 1)))))
-
-(defun dashboard-insert-banner ()
- "Insert Banner at the top of the dashboard."
- (goto-char (point-max))
- (let ((banner (dashboard-choose-banner))
- (buffer-read-only nil))
- (progn
- (when banner
- (if (image-type-available-p (intern (file-name-extension banner)))
- (dashboard-insert-image-banner banner)
- (dashboard-insert-ascii-banner-centered banner))
- (dashboard-insert-navigator)
- (dashboard-insert-init-info)))))
-
-(defun dashboard-insert-navigator ()
- "Insert Navigator of the dashboard."
- (when (and dashboard-set-navigator dashboard-navigator-buttons)
- (dolist (line dashboard-navigator-buttons)
- (dolist (btn line)
- (let* ((icon (car btn))
- (title (cadr btn))
- (help (or (cadr (cdr btn)) ""))
- (action (or (cadr (cddr btn)) #'ignore))
- (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator))
- (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face)))
- (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face))))
- (widget-create 'item
- :tag (concat
- (when icon
- (propertize icon 'face `(:inherit
- ,(get-text-property 0 'face icon)
- :inherit
- ,face)))
- (when (and icon title
- (not (string-equal icon ""))
- (not (string-equal title "")))
- (propertize " " 'face 'variable-pitch))
- (when title (propertize title 'face face)))
- :help-echo help
- :action action
- :button-face `(:underline nil)
- :mouse-face 'highlight
- :button-prefix prefix
- :button-suffix suffix
- :format "%[%t%]")
- (insert " ")))
- (let* ((width (current-column)))
- (beginning-of-line)
- (dashboard-center-line (make-string width ?\s))
- (end-of-line))
- (insert "\n"))
- (insert "\n")))
-
-(defmacro dashboard-insert-section (section-name list list-size shortcut action &rest widget-params)
- "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard.
-SHORTCUT is the keyboard shortcut used to access the section.
-ACTION is theaction taken when the user activates the widget button.
-WIDGET-PARAMS are passed to the \"widget-create\" function."
- `(progn
- (dashboard-insert-heading ,section-name
- (if (and ,list dashboard-show-shortcuts) ,shortcut))
- (if ,list
- (when (dashboard-insert-section-list
- ,section-name
- (dashboard-subseq ,list 0 ,list-size)
- ,action
- ,@widget-params)
- (dashboard-insert-shortcut ,shortcut ,section-name))
- (insert "\n --- No items ---"))))
-
-;;
-;; Section list
-;;
-(defmacro dashboard-insert-section-list (section-name list action &rest rest)
- "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST to widget creation."
- `(when (car ,list)
- (mapc
- (lambda (el)
- (let ((tag ,@rest))
- (insert "\n ")
-
- (when (and (display-graphic-p)
- dashboard-set-file-icons
- (or (fboundp 'all-the-icons-icon-for-dir)
- (require 'all-the-icons nil 'noerror)))
- (let* ((path (car (last (split-string ,@rest " - "))))
- (icon (if (and (not (file-remote-p path))
- (file-directory-p path))
- (all-the-icons-icon-for-dir path nil "")
- (cond
- ((string-equal ,section-name "Agenda for today:")
- (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01))
- ((file-remote-p path)
- (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01))
- (t (all-the-icons-icon-for-file (file-name-nondirectory path)
- :v-adjust -0.05))))))
- (setq tag (concat icon " " ,@rest))))
-
- (widget-create 'item
- :tag tag
- :action ,action
- :button-face `(:underline nil)
- :mouse-face 'highlight
- :button-prefix ""
- :button-suffix ""
- :format "%[%t%]")))
- ,list)))
-
-;; Footer
-(defun dashboard-random-footer ()
- "Return a random footer from `dashboard-footer-messages'."
- (nth (random (length dashboard-footer-messages)) dashboard-footer-messages))
-
-(defun dashboard-insert-footer ()
- "Insert footer of dashboard."
- (let ((footer (and dashboard-set-footer (dashboard-random-footer))))
- (when footer
- (insert "\n")
- (dashboard-center-line footer)
- (insert dashboard-footer-icon)
- (insert " ")
- (insert (propertize footer 'face 'dashboard-footer))
- (insert "\n"))))
-
-;;
-;; Recentf
-;;
-(defun dashboard-insert-recents (list-size)
- "Add the list of LIST-SIZE items from recently edited files."
- (recentf-mode)
- (dashboard-insert-section
- "Recent Files:"
- recentf-list
- list-size
- "r"
- `(lambda (&rest ignore) (find-file-existing ,el))
- (abbreviate-file-name el)))
-
-;;
-;; Bookmarks
-;;
-(defun dashboard-insert-bookmarks (list-size)
- "Add the list of LIST-SIZE items of bookmarks."
- (require 'bookmark)
- (dashboard-insert-section
- "Bookmarks:"
- (dashboard-subseq (bookmark-all-names)
- 0 list-size)
- list-size
- "m"
- `(lambda (&rest ignore) (bookmark-jump ,el))
- (let ((file (bookmark-get-filename el)))
- (if file
- (format "%s - %s" el (abbreviate-file-name file))
- el))))
-
-;;
-;; Projectile
-;;
-(defun dashboard-insert-projects (list-size)
- "Add the list of LIST-SIZE items of projects."
- (require 'projectile)
- (let ((inhibit-message t) (message-log-max nil))
- (projectile-cleanup-known-projects))
- (projectile-load-known-projects)
- (dashboard-insert-section
- "Projects:"
- (dashboard-subseq (projectile-relevant-known-projects)
- 0 list-size)
- list-size
- "p"
- `(lambda (&rest ignore) (projectile-switch-project-by-name ,el))
- (abbreviate-file-name el)))
-
-;;
-;; Org Agenda
-;;
-(defun dashboard-timestamp-to-gregorian-date (timestamp)
- "Convert TIMESTAMP to a gregorian date.
-
-The result can be used with functions like
-`calendar-date-compare'."
- (let ((decoded-timestamp (decode-time timestamp)))
- (list (nth 4 decoded-timestamp)
- (nth 3 decoded-timestamp)
- (nth 5 decoded-timestamp))))
-
-(defun dashboard-date-due-p (timestamp &optional due-date)
- "Check if TIMESTAMP is today or in the past.
-
-If DUE-DATE is nil, compare TIMESTAMP to today; otherwise,
-compare to the date in DUE-DATE.
-
-The time part of both TIMESTAMP and DUE-DATE is ignored, only the
-date part is considered."
- (unless due-date
- (setq due-date (current-time)))
- (setq due-date (time-add due-date 86400))
- (let* ((gregorian-date (dashboard-timestamp-to-gregorian-date timestamp))
- (gregorian-due-date (dashboard-timestamp-to-gregorian-date due-date)))
- (calendar-date-compare (list gregorian-date)
- (list gregorian-due-date))))
-
-(defun dashboard-get-agenda ()
- "Get agenda items for today or for a week from now."
- (org-compile-prefix-format 'agenda)
- (let ((due-date nil))
- (if (and (boundp 'show-week-agenda-p) show-week-agenda-p)
- (setq due-date (time-add (current-time) (* 86400 7)))
- (setq due-date nil)
- )
- (let* ((filtered-entries nil))
- (org-map-entries
- (lambda ()
- (let* ((schedule-time (org-get-scheduled-time (point)))
- (deadline-time (org-get-deadline-time (point)))
- (item (org-agenda-format-item
- (format-time-string "%Y-%m-%d" schedule-time)
- (org-get-heading t t)
- (org-outline-level)
- (org-get-category)
- (org-get-tags)
- t))
- (loc (point))
- (file (buffer-file-name)))
- (if (or (equal dashboard-org-agenda-categories nil)
- (member (org-get-category) dashboard-org-agenda-categories))
- (when (and (not (org-entry-is-done-p))
- (or (and schedule-time (dashboard-date-due-p schedule-time due-date))
- (and deadline-time (dashboard-date-due-p deadline-time due-date))))
- (setq filtered-entries
- (append filtered-entries
- (list (list item schedule-time deadline-time loc file))))))))
- nil
- 'agenda)
- filtered-entries)))
-
-(defun dashboard-insert-agenda (list-size)
- "Add the list of LIST-SIZE items of agenda."
- (require 'org-agenda)
- (require 'calendar)
- (let ((agenda (dashboard-get-agenda)))
- (dashboard-insert-section
- (or (and (boundp 'show-week-agenda-p) show-week-agenda-p "Agenda for the coming week:")
- "Agenda for today:")
- agenda
- list-size
- "a"
- `(lambda (&rest ignore)
- (let ((buffer (find-file-other-window (nth 4 ',el))))
- (with-current-buffer buffer
- (goto-char (nth 3 ',el)))
- (switch-to-buffer buffer)))
- (format "%s" (nth 0 el)))))
-
-;;
-;; Registers
-;;
-(defun dashboard-insert-registers (list-size)
- "Add the list of LIST-SIZE items of registers."
- (require 'register)
- (dashboard-insert-section
- "Registers:"
- register-alist
- list-size
- "e"
- (lambda (&rest _ignore) (jump-to-register (car el)))
- (format "%c - %s" (car el) (register-describe-oneline (car el)))))
-
-(provide 'dashboard-widgets)
-;;; dashboard-widgets.el ends here
diff --git a/elpa/dashboard-20200306.1344/dashboard.el b/elpa/dashboard-20200306.1344/dashboard.el
deleted file mode 100644
index 56b6418..0000000
--- a/elpa/dashboard-20200306.1344/dashboard.el
+++ /dev/null
@@ -1,258 +0,0 @@
-;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*-
-
-;; Copyright (c) 2016-2020 Rakan Al-Hneiti & Contributors
-;;
-;; Author: Rakan Al-Hneiti
-;; URL: https://github.com/emacs-dashboard/emacs-dashboard
-;;
-;; This file is not part of GNU Emacs.
-;;
-;;; License: GPLv3
-;;
-;; Created: October 05, 2016
-;; Package-Version: 1.8.0-SNAPSHOT
-;; Keywords: startup, screen, tools, dashboard
-;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11"))
-;;; Commentary:
-
-;; An extensible Emacs dashboard, with sections for
-;; bookmarks, projectile projects, org-agenda and more.
-
-;;; Code:
-
-(require 'seq)
-(require 'page-break-lines)
-(require 'recentf)
-
-(require 'dashboard-widgets)
-
-;; Custom splash screen
-(defvar dashboard-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-p") 'dashboard-previous-line)
- (define-key map (kbd "C-n") 'dashboard-next-line)
- (define-key map (kbd "<up>") 'dashboard-previous-line)
- (define-key map (kbd "<down>") 'dashboard-next-line)
- (define-key map (kbd "k") 'dashboard-previous-line)
- (define-key map (kbd "j") 'dashboard-next-line)
- (define-key map [tab] 'widget-forward)
- (define-key map (kbd "C-i") 'widget-forward)
- (define-key map [backtab] 'widget-backward)
- (define-key map (kbd "RET") 'dashboard-return)
- (define-key map [down-mouse-1] 'widget-button-click)
- (define-key map (kbd "g") #'dashboard-refresh-buffer)
- (define-key map (kbd "}") #'dashboard-next-section)
- (define-key map (kbd "{") #'dashboard-previous-section)
- map)
- "Keymap for dashboard mode.")
-
-(define-derived-mode dashboard-mode special-mode "Dashboard"
- "Dashboard major mode for startup screen.
-\\<dashboard-mode-map>
-"
- :group 'dashboard
- :syntax-table nil
- :abbrev-table nil
- (buffer-disable-undo)
- (whitespace-mode -1)
- (linum-mode -1)
- (when (>= emacs-major-version 26)
- (display-line-numbers-mode -1))
- (page-break-lines-mode 1)
- (setq inhibit-startup-screen t)
- (setq buffer-read-only t
- truncate-lines t))
-
-(defgroup dashboard nil
- "Extensible startup screen."
- :group 'applications)
-
-(defcustom dashboard-center-content nil
- "Whether to center content within the window."
- :type 'boolean
- :group 'dashboard)
-
-(defconst dashboard-buffer-name "*dashboard*"
- "Dashboard's buffer name.")
-
-(defvar dashboard--section-starts nil
- "List of section starting positions.")
-
-(defun dashboard-previous-section ()
- "Navigate back to previous section."
- (interactive)
- (let ((current-section-start nil)
- (current-position (point))
- (previous-section-start nil))
- (dolist (elt dashboard--section-starts)
- (when (and current-section-start
- (not previous-section-start))
- (setq previous-section-start elt))
- (when (and (not current-section-start)
- (< elt current-position))
- (setq current-section-start elt)))
- (goto-char (if (eq current-position current-section-start)
- previous-section-start
- current-section-start))))
-
-(defun dashboard-next-section ()
- "Navigate forward to next section."
- (interactive)
- (let ((current-position (point))
- (next-section-start nil)
- (section-starts (reverse dashboard--section-starts)))
- (dolist (elt section-starts)
- (when (and (not next-section-start)
- (> elt current-position))
- (setq next-section-start elt)))
- (when next-section-start
- (goto-char next-section-start))))
-
-(defun dashboard-previous-line (arg)
- "Move point up and position it at that line’s item.
-Optional prefix ARG says how many lines to move; default is one line."
- (interactive "^p")
- (dashboard-next-line (- arg)))
-
-(defun dashboard-next-line (arg)
- "Move point down and position it at that line’s item.
-Optional prefix ARG says how many lines to move; default is one line."
- ;; code heavily inspired by `dired-next-line'
- (interactive "^p")
- (let ((line-move-visual nil)
- (goal-column nil))
- (line-move arg t))
- ;; We never want to move point into an invisible line. Dashboard doesn’t
- ;; use invisible text currently but when it does we’re ready!
- (while (and (invisible-p (point))
- (not (if (and arg (< arg 0)) (bobp) (eobp))))
- (forward-char (if (and arg (< arg 0)) -1 1)))
- (beginning-of-line-text))
-
-(defun dashboard-return ()
- "Hit return key in dashboard buffer."
- (interactive)
- (let ((start-ln (line-number-at-pos))
- (fd-cnt 0)
- (diff-line nil)
- (entry-pt nil))
- (save-excursion
- (while (and (not diff-line)
- (not (= (point) (point-min)))
- (not (get-char-property (point) 'button))
- (not (= (point) (point-max))))
- (forward-char 1)
- (setq fd-cnt (1+ fd-cnt))
- (unless (= start-ln (line-number-at-pos))
- (setq diff-line t)))
- (unless (= (point) (point-max))
- (setq entry-pt (point))))
- (when (= fd-cnt 1)
- (setq entry-pt (1- (point))))
- (if entry-pt
- (widget-button-press entry-pt)
- (call-interactively #'widget-button-press))))
-
-(defun dashboard-maximum-section-length ()
- "For the just-inserted section, calculate the length of the longest line."
- (let ((max-line-length 0))
- (save-excursion
- (dashboard-previous-section)
- (while (not (eobp))
- (setq max-line-length
- (max max-line-length
- (- (line-end-position) (line-beginning-position))))
- (forward-line)))
- max-line-length))
-
-(defun dashboard-insert-startupify-lists ()
- "Insert the list of widgets into the buffer."
- (interactive)
- (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name)))
- (recentf-is-on (recentf-enabled-p))
- (origial-recentf-list recentf-list)
- (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0))
- (max-line-length 0))
- ;; disable recentf mode,
- ;; so we don't flood the recent files list with org mode files
- ;; do this by making a copy of the part of the list we'll use
- ;; let dashboard widgets change that
- ;; then restore the orginal list afterwards
- ;; (this avoids many saves/loads that would result from
- ;; disabling/enabling recentf-mode)
- (if recentf-is-on
- (setq recentf-list (seq-take recentf-list dashboard-num-recents)))
- (when (or (not (eq dashboard-buffer-last-width (window-width)))
- (not buffer-exists))
- (setq dashboard-banner-length (window-width)
- dashboard-buffer-last-width dashboard-banner-length)
- (with-current-buffer (get-buffer-create dashboard-buffer-name)
- (let ((buffer-read-only nil))
- (erase-buffer)
- (dashboard-insert-banner)
- (dashboard-insert-page-break)
- (setq dashboard--section-starts nil)
- (mapc (lambda (els)
- (let* ((el (or (car-safe els) els))
- (list-size
- (or (cdr-safe els)
- dashboard-items-default-length))
- (item-generator
- (cdr-safe (assoc el dashboard-item-generators))))
- (add-to-list 'dashboard--section-starts (point))
- (funcall item-generator list-size)
- (setq max-line-length
- (max max-line-length (dashboard-maximum-section-length)))
- (dashboard-insert-page-break)))
- dashboard-items)
- (when dashboard-center-content
- (when dashboard--section-starts
- (goto-char (car (last dashboard--section-starts))))
- (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2))))
- (while (not (eobp))
- (and (not (eq ? (char-after)))
- (insert (make-string margin ?\ )))
- (forward-line 1))))
- (dashboard-insert-footer))
- (dashboard-mode)
- (goto-char (point-min))))
- (if recentf-is-on
- (setq recentf-list origial-recentf-list))))
-
-(add-hook 'window-setup-hook
- (lambda ()
- (add-hook 'window-size-change-functions 'dashboard-resize-on-hook)
- (dashboard-resize-on-hook)))
-
-(defun dashboard-refresh-buffer ()
- "Refresh buffer."
- (interactive)
- (kill-buffer dashboard-buffer-name)
- (dashboard-insert-startupify-lists)
- (switch-to-buffer dashboard-buffer-name))
-
-(defun dashboard-resize-on-hook (&optional _)
- "Re-render dashboard on window size change."
- (let ((space-win (get-buffer-window dashboard-buffer-name))
- (frame-win (frame-selected-window)))
- (when (and space-win
- (not (window-minibuffer-p frame-win)))
- (with-selected-window space-win
- (dashboard-insert-startupify-lists)))))
-
-;;;###autoload
-(defun dashboard-setup-startup-hook ()
- "Setup post initialization hooks.
-If a command line argument is provided,
-assume a filename and skip displaying Dashboard."
- (when (< (length command-line-args) 2 )
- (add-hook 'after-init-hook (lambda ()
- ;; Display useful lists of items
- (dashboard-insert-startupify-lists)))
- (add-hook 'emacs-startup-hook '(lambda ()
- (switch-to-buffer "*dashboard*")
- (goto-char (point-min))
- (redisplay)))))
-
-(provide 'dashboard)
-;;; dashboard.el ends here
diff --git a/elpa/dumb-jump-20200730.1839/dumb-jump-autoloads.el b/elpa/dumb-jump-20200730.1839/dumb-jump-autoloads.el
deleted file mode 100644
index f341134..0000000
--- a/elpa/dumb-jump-20200730.1839/dumb-jump-autoloads.el
+++ /dev/null
@@ -1,88 +0,0 @@
-;;; dumb-jump-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "dumb-jump" "dumb-jump.el" (0 0 0 0))
-;;; Generated autoloads from dumb-jump.el
-
-(defvar dumb-jump-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "C-M-g") 'dumb-jump-go) (define-key map (kbd "C-M-p") 'dumb-jump-back) (define-key map (kbd "C-M-q") 'dumb-jump-quick-look) map))
-
-(autoload 'dumb-jump-back "dumb-jump" "\
-Jump back to where the last jump was done.
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-quick-look "dumb-jump" "\
-Run dumb-jump-go in quick look mode. That is, show a tooltip of where it would jump instead.
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-go-other-window "dumb-jump" "\
-Like 'dumb-jump-go' but use 'find-file-other-window' instead of 'find-file'.
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-go-current-window "dumb-jump" "\
-Like dumb-jump-go but always use 'find-file'.
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-go-prefer-external "dumb-jump" "\
-Like dumb-jump-go but prefer external matches from the current file.
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-go-prompt "dumb-jump" "\
-Like dumb-jump-go but prompts for function instead of using under point
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-go-prefer-external-other-window "dumb-jump" "\
-Like dumb-jump-go-prefer-external but use 'find-file-other-window' instead of 'find-file'.
-
-\(fn)" t nil)
-
-(autoload 'dumb-jump-go "dumb-jump" "\
-Go to the function/variable declaration for thing at point.
-When USE-TOOLTIP is t a tooltip jump preview will show instead.
-When PREFER-EXTERNAL is t it will sort external matches before
-current file.
-
-\(fn &optional USE-TOOLTIP PREFER-EXTERNAL PROMPT)" t nil)
-
-(defvar dumb-jump-mode nil "\
-Non-nil if Dumb-Jump mode is enabled.
-See the `dumb-jump-mode' command
-for a description of this minor mode.")
-
-(custom-autoload 'dumb-jump-mode "dumb-jump" nil)
-
-(autoload 'dumb-jump-mode "dumb-jump" "\
-Minor mode for jumping to variable and function definitions
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'dumb-jump-xref-activate "dumb-jump" "\
-Function to activate xref backend.
-Add this function to `xref-backend-functions' to dumb jump to be
-activiated, whenever it finds a project. It is recommended to add
-it to the end, so that it only gets activated when no better
-option is found.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dumb-jump" '("dumb-jump-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; dumb-jump-autoloads.el ends here
diff --git a/elpa/dumb-jump-20200730.1839/dumb-jump-pkg.el b/elpa/dumb-jump-20200730.1839/dumb-jump-pkg.el
deleted file mode 100644
index 0f85c75..0000000
--- a/elpa/dumb-jump-20200730.1839/dumb-jump-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "dumb-jump" "20200730.1839" "Jump to definition for 40+ languages without configuration" '((emacs "24.3") (s "1.11.0") (dash "2.9.0") (popup "0.5.3")) :commit "254fe568738df22a51054a558d3d5b91c74b9e89" :keywords '("programming") :authors '(("jack angers and contributors")) :maintainer '("jack angers and contributors") :url "https://github.com/jacktasia/dumb-jump")
diff --git a/elpa/dumb-jump-20200730.1839/dumb-jump.el b/elpa/dumb-jump-20200730.1839/dumb-jump.el
deleted file mode 100644
index 6c66dfa..0000000
--- a/elpa/dumb-jump-20200730.1839/dumb-jump.el
+++ /dev/null
@@ -1,3076 +0,0 @@
-;;; dumb-jump.el --- Jump to definition for 40+ languages without configuration -*- lexical-binding: t; -*-
-;; Copyright (C) 2015-2019 jack angers
-;; Author: jack angers and contributors
-;; Url: https://github.com/jacktasia/dumb-jump
-;; Package-Version: 20200730.1839
-;; Package-Commit: 254fe568738df22a51054a558d3d5b91c74b9e89
-;; Version: 0.5.3
-;; Package-Requires: ((emacs "24.3") (s "1.11.0") (dash "2.9.0") (popup "0.5.3"))
-;; Keywords: programming
-
-;; Dumb Jump 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, or (at your option)
-;; any later version.
-;;
-;; Dumb Jump 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 Dumb Jump. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Dumb Jump is an Emacs "jump to definition" package with support for 40+ programming languages that favors
-;; "just working" over speed or accuracy. This means minimal -- and ideally zero -- configuration with absolutely
-;; no stored indexes (TAGS) or persistent background processes.
-;;
-;; Dumb Jump provides a xref-based interface for jumping to
-;; definitions. It is based on tools such as grep, the silver searcher
-;; (https://geoff.greer.fm/ag/), ripgrep
-;; (https://github.com/BurntSushi/ripgrep) or git-grep
-;; (https://git-scm.com/docs/git-grep).
-;;
-;; To enable Dumb Jump, add the following to your initialisation file:
-;;
-;; (add-hook 'xref-backend-functions #'dumb-jump-xref-activate)
-;;
-;; Now pressing M-. on an identifier should open a buffer at the place
-;; where it is defined, or a list of candidates if uncertain. This
-;; list can be navigated using M-g M-n (next-error) and M-g M-p
-;; (previous-error).
-
-;;; Code:
-(unless (require 'xref nil :noerror)
- (require 'etags))
-(require 's)
-(require 'dash)
-(require 'popup)
-(require 'cl-generic nil :noerror)
-
-(defgroup dumb-jump nil
- "Easily jump to project function and variable definitions"
- :group 'tools
- :group 'convenience)
-
-;;;###autoload
-(defvar dumb-jump-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-M-g") 'dumb-jump-go)
- (define-key map (kbd "C-M-p") 'dumb-jump-back)
- (define-key map (kbd "C-M-q") 'dumb-jump-quick-look)
- map))
-
-(defcustom dumb-jump-window
- 'current
- "Which window to use when jumping. Valid options are 'current (default) or 'other."
- :group 'dumb-jump
- :type '(choice (const :tag "Current window" current)
- (const :tag "Other window" other)))
-
-(defcustom dumb-jump-use-visible-window
- t
- "When true will jump in a visible window if that window already has the file open."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-selector
- 'popup
- "Which selector to use when there is multiple choices. `ivy` and `helm' are also supported."
- :group 'dumb-jump
- :type '(choice (const :tag "Popup" popup)
- (const :tag "Helm" helm)
- (const :tag "Ivy" ivy)
- (const :tag "Completing Read" completing-read)))
-
-(defcustom dumb-jump-ivy-jump-to-selected-function
- #'dumb-jump-ivy-jump-to-selected
- "Prompts user for a choice using ivy then dumb-jump to that choice.")
-
-(defcustom dumb-jump-prefer-searcher
- nil
- "The preferred searcher to use 'ag, 'rg, 'git-grep, 'gnu-grep,or 'grep.
-If nil then the most optimal searcher will be chosen at runtime."
- :group 'dumb-jump
- :type '(choice (const :tag "Best Available" nil)
- (const :tag "ag" ag)
- (const :tag "rg" rg)
- (const :tag "grep" gnu-grep)
- (const :tag "git grep" git-grep)
- (const :tag "git grep + ag" git-grep-plus-ag)))
-
-(defcustom dumb-jump-force-searcher
- nil
- "Forcibly use searcher: 'ag, 'rg, 'git-grep, 'gnu-grep, or 'grep.
-Set to nil to not force anything and use `dumb-jump-prefer-searcher'
-or most optimal searcher."
- :group 'dumb-jump
- :type '(choice (const :tag "Best Available" nil)
- (const :tag "ag" ag)
- (const :tag "rg" rg)
- (const :tag "grep" gnu-grep)
- (const :tag "git grep" git-grep)
- (const :tag "git grep + ag" git-grep-plus-ag)))
-
-(defcustom dumb-jump-grep-prefix
- "LANG=C"
- "Prefix to grep command. Seemingly makes it faster for pure text."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-grep-cmd
- "grep"
- "The path to grep. By default assumes it is in path."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-ag-cmd
- "ag"
- "The the path to the silver searcher. By default assumes it is in path. If not found fallbacks to grep."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-rg-cmd
- "rg"
- "The the path to ripgrep. By default assumes it is in path. If not found fallbacks to grep."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-git-grep-cmd
- "git grep"
- "The the path to git grep. By default assumes it is in path. If not found fallbacks to grep."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-ag-word-boundary
- "(?![a-zA-Z0-9\\?\\*-])"
- "`\\b` thinks `-` is a word boundary. When this matters use `\\j` instead and ag will use this value."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-rg-word-boundary
- "($|[^a-zA-Z0-9\\?\\*-])"
- "`\\b` thinks `-` is a word boundary. When this matters use `\\j` instead and rg will use this value."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-git-grep-word-boundary
- "($|[^a-zA-Z0-9\\?\\*-])"
- "`\\b` thinks `-` is a word boundary. When this matters use `\\j` instead and git grep will use this value."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-grep-word-boundary
- "($|[^a-zA-Z0-9\\?\\*-])"
- "`\\b` thinks `-` is a word boundary. When this matters use `\\j` instead and grep will use this value."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-fallback-regex
- "\\bJJJ\\j"
- "When dumb-jump-fallback-search is t use this regex. Defaults to boundary search of symbol under point."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-fallback-search
- t
- "If nothing is found with normal search fallback to searching the fallback regex."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-force-grep
- nil
- "When t will use grep even if ag is available."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-zgrep-cmd
- "zgrep"
- "The path to grep to use for gzipped files. By default assumes it is in path."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-grep-args "-REn"
- "Grep command args [R]ecursive, [E]xtended regexes, and show line [n]umbers."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-gnu-grep-args "-rEn"
- "Grep command args [r]ecursive and [E]xtended regexes, and show line [n]umbers."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-max-find-time
- 2
- "Number of seconds a grep/find command can take before being warned to use ag and config."
- :group 'dumb-jump
- :type 'integer)
-
-(defcustom dumb-jump-functions-only
- nil
- "Should we only jump to functions?"
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-quiet
- nil
- "If non-nil Dumb Jump will not log anything to *Messages*."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-ignore-context
- nil
- "If non-nil Dumb Jump will ignore the context of point when jumping."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-git-grep-search-untracked
- t
- "If non-nil Dumb Jump will also search untracked files when using searcher git-grep."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-git-grep-search-args
- ""
- "Appends the passed arguments to the git-grep search function. Default: \"\""
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-ag-search-args
- ""
- "Appends the passed arguments to the ag search function. Default: \"\""
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-rg-search-args
- "--pcre2"
- "Appends the passed arguments to the rg search function. Default: \"--pcre2\""
- :group 'dumb-jump
- :type 'string)
-
-
-(defcustom dumb-jump-find-rules
- '((:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "elisp"
- :regex "\\\((defun|cl-defun)\\s+JJJ\\j"
- ;; \\j usage see `dumb-jump-ag-word-boundary`
- :tests ("(defun test (blah)" "(defun test\n" "(cl-defun test (blah)" "(cl-defun test\n")
- :not ("(defun test-asdf (blah)" "(defun test-blah\n" "(cl-defun test-asdf (blah)"
- "(cl-defun test-blah\n" "(defun tester (blah)" "(defun test? (blah)" "(defun test- (blah)"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "elisp"
- :regex "\\\(defvar\\b\\s*JJJ\\j"
- :tests ("(defvar test " "(defvar test\n")
- :not ("(defvar tester" "(defvar test?" "(defvar test-"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "elisp"
- :regex "\\\(defcustom\\b\\s*JJJ\\j"
- :tests ("(defcustom test " "(defcustom test\n")
- :not ("(defcustom tester" "(defcustom test?" "(defcustom test-"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "elisp"
- :regex "\\\(setq\\b\\s*JJJ\\j" :tests ("(setq test 123)")
- :not ("setq test-blah 123)" "(setq tester" "(setq test?" "(setq test-"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "elisp"
- :regex "\\\(JJJ\\s+" :tests ("(let ((test 123)))") :not ("(let ((test-2 123)))"))
-
- ;; variable in method signature
- (:type "variable" :supports ("ag" "rg" "git-grep") :language "elisp"
- :regex "\\((defun|cl-defun)\\s*.+\\\(?\\s*JJJ\\j\\s*\\\)?"
- :tests ("(defun blah (test)" "(defun blah (test blah)" "(defun (blah test)")
- :not ("(defun blah (test-1)" "(defun blah (test-2 blah)" "(defun (blah test-3)"))
-
- ;; common lisp
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "commonlisp"
- :regex "\\\(defun\\s+JJJ\\j"
- ;; \\j usage see `dumb-jump-ag-word-boundary`
- :tests ("(defun test (blah)" "(defun test\n")
- :not ("(defun test-asdf (blah)" "(defun test-blah\n"
- "(defun tester (blah)" "(defun test? (blah)" "(defun test- (blah)"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "commonlisp"
- :regex "\\\(defparameter\\b\\s*JJJ\\j"
- :tests ("(defparameter test " "(defparameter test\n")
- :not ("(defparameter tester" "(defparameter test?" "(defparameter test-"))
-
- ;; racket
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\\(define\\s+\\(\\s*JJJ\\j"
- :tests ("(define (test blah)" "(define (test\n")
- :not ("(define test blah" "(define (test-asdf blah)" "(define test (lambda (blah"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\\(define\\s+JJJ\\s*\\\(\\s*lambda"
- :tests ("(define test (lambda (blah" "(define test (lambda\n")
- :not ("(define test blah" "(define test-asdf (lambda (blah)" "(define (test)" "(define (test blah) (lambda (foo"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\\(let\\s+JJJ\\s*(\\\(|\\\[)*"
- :tests ("(let test ((blah foo) (bar bas))" "(let test\n" "(let test [(foo")
- :not ("(let ((test blah"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\\(define\\s+JJJ\\j"
- :tests ("(define test " "(define test\n")
- :not ("(define (test"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "(\\\(|\\\[)\\s*JJJ\\s+"
- :tests ("(let ((test 'foo" "(let [(test 'foo" "(let [(test 'foo" "(let [[test 'foo" "(let ((blah 'foo) (test 'bar)")
- :not ("{test foo"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\\(lambda\\s+\\\(?[^\(\)]*\\s*JJJ\\j\\s*\\\)?"
- :tests ("(lambda (test)" "(lambda (foo test)" "(lambda test (foo)")
- :not ("(lambda () test"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\\(define\\s+\\\([^\(\)]+\\s*JJJ\\j\\s*\\\)?"
- :tests ("(define (foo test)" "(define (foo test bar)")
- :not ("(define foo test" "(define (test foo" "(define (test)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "racket"
- :regex "\\(struct\\s+JJJ\\j"
- :tests ("(struct test (a b)"))
-
- ;; scheme
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "\\\(define\\s+\\(\\s*JJJ\\j"
- :tests ("(define (test blah)" "(define (test\n")
- :not ("(define test blah" "(define (test-asdf blah)" "(define test (lambda (blah"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "\\\(define\\s+JJJ\\s*\\\(\\s*lambda"
- :tests ("(define test (lambda (blah" "(define test (lambda\n")
- :not ("(define test blah" "(define test-asdf (lambda (blah)" "(define (test)" "(define (test blah) (lambda (foo"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "\\\(let\\s+JJJ\\s*(\\\(|\\\[)*"
- :tests ("(let test ((blah foo) (bar bas))" "(let test\n" "(let test [(foo")
- :not ("(let ((test blah"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "\\\(define\\s+JJJ\\j"
- :tests ("(define test " "(define test\n")
- :not ("(define (test"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "(\\\(|\\\[)\\s*JJJ\\s+"
- :tests ("(let ((test 'foo" "(let [(test 'foo" "(let [(test 'foo" "(let [[test 'foo" "(let ((blah 'foo) (test 'bar)")
- :not ("{test foo"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "\\\(lambda\\s+\\\(?[^\(\)]*\\s*JJJ\\j\\s*\\\)?"
- :tests ("(lambda (test)" "(lambda (foo test)" "(lambda test (foo)")
- :not ("(lambda () test"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scheme"
- :regex "\\\(define\\s+\\\([^\(\)]+\\s*JJJ\\j\\s*\\\)?"
- :tests ("(define (foo test)" "(define (foo test bar)")
- :not ("(define foo test" "(define (test foo" "(define (test)"))
-
- ;; c++
- (:type "function" :supports ("ag" "rg" "git-grep") :language "c++"
- :regex "\\bJJJ(\\s|\\))*\\((\\w|[,&*.<>]|\\s)*(\\))\\s*(const|->|\\{|$)|typedef\\s+(\\w|[(*]|\\s)+JJJ(\\)|\\s)*\\("
- :tests ("int test(){" "my_struct (*test)(int a, int b){" "auto MyClass::test ( Builder& reference, ) -> decltype( builder.func() ) {" "int test( int *random_argument) const {" "test::test() {" "typedef int (*test)(int);")
- :not ("return test();)" "int test(a, b);" "if( test() ) {" "else test();"))
-
- ;; (:type "variable" :supports ("grep") :language "c++"
- ;; :regex "(\\b\\w+|[,>])([*&]|\\s)+JJJ\\s*(\\[([0-9]|\\s)*\\])*\\s*([=,){;]|:\\s*[0-9])|#define\\s+JJJ\\b"
- ;; :tests ("int test=2;" "char *test;" "int x = 1, test = 2" "int test[20];" "#define test" "unsigned int test:2;"))
-
- (:type "variable" :supports ("ag" "rg") :language "c++"
- :regex "\\b(?!(class\\b|struct\\b|return\\b|else\\b|delete\\b))(\\w+|[,>])([*&]|\\s)+JJJ\\s*(\\[(\\d|\\s)*\\])*\\s*([=,(){;]|:\\s*\\d)|#define\\s+JJJ\\b"
- :tests ("int test=2;" "char *test;" "int x = 1, test = 2" "int test[20];" "#define test" "typedef int test;" "unsigned int test:2")
- :not ("return test;" "#define NOT test" "else test=2;"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "c++"
- :regex "\\b(class|struct|enum|union)\\b\\s*JJJ\\b\\s*(final\\s*)?(:((\\s*\\w+\\s*::)*\\s*\\w*\\s*<?(\\s*\\w+\\s*::)*\\w+>?\\s*,*)+)?((\\{|$))|}\\s*JJJ\\b\\s*;"
- :tests ("typedef struct test {" "enum test {" "} test;" "union test {" "class test final: public Parent1, private Parent2{" "class test : public std::vector<int> {")
- :not("union test var;" "struct test function() {"))
-
- ;; clojure
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(def\\s+JJJ\\j"
- :tests ("(def test (foo)"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(defn-?\\s+JJJ\\j"
- :tests ("(defn test [foo]" "(defn- test [foo]")
- :not ("(defn test? [foo]" "(defn- test? [foo]"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(defmacro\\s+JJJ\\j"
- :tests ("(defmacro test [foo]"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(deftask\\s+JJJ\\j"
- :tests ("(deftask test [foo]"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(deftype\\s+JJJ\\j"
- :tests ("(deftype test [foo]"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(defmulti\\s+JJJ\\j"
- :tests ("(defmulti test fn"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(defmethod\\s+JJJ\\j"
- :tests ("(defmethod test type"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(definterface\\s+JJJ\\j"
- :tests ("(definterface test (foo)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(defprotocol\\s+JJJ\\j"
- :tests ("(defprotocol test (foo)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "clojure"
- :regex "\\(defrecord\\s+JJJ\\j"
- :tests ("(defrecord test [foo]"))
-
- ;; coffeescript
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "coffeescript"
- :regex "^\\s*JJJ\\s*[=:].*[-=]>"
- :tests ("test = () =>" "test= =>" "test = ->" "test=()->"
- "test : () =>" "test: =>" "test : ->" "test:()->")
- :not ("# test = =>" "test = 1"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "coffeescript"
- :regex "^\\s*JJJ\\s*[:=][^:=-][^>]+$"
- :tests ("test = $" "test : [" "test = {" "test = a")
- :not ("test::a" "test: =>" "test == 1" "# test = 1"))
-
- (:type "class" :supports ("ag" "grep" "rg" "git-grep") :language "coffeescript"
- :regex "^\\s*\\bclass\\s+JJJ"
- :tests ("class test" "class test extends")
- :not ("# class"))
-
- ;; obj-c
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "objc"
- :regex "\\\)\\s*JJJ(:|\\b|\\s)"
- :tests ("- (void)test" "- (void)test:(UIAlertView *)alertView")
- :not ("- (void)testnot" "- (void)testnot:(UIAlertView *)alertView"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "objc"
- :regex "\\b\\*?JJJ\\s*=[^=\\n]+"
- :tests ("NSString *test = @\"asdf\"")
- :not ("NSString *testnot = @\"asdf\"" "NSString *nottest = @\"asdf\""))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "objc"
- :regex "(@interface|@protocol|@implementation)\\b\\s*JJJ\\b\\s*"
- :tests ("@interface test: UIWindow")
- :not ("@interface testnon: UIWindow"))
-
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "objc"
- :regex "typedef\\b\\s+(NS_OPTIONS|NS_ENUM)\\b\\([^,]+?,\\s*JJJ\\b\\s*"
- :tests ("typedef NS_ENUM(NSUInteger, test)")
- :not ("typedef NS_ENUMD(NSUInteger, test)"))
-
- ;; swift
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "swift"
- :regex "(let|var)\\s*JJJ\\s*(=|:)[^=:\\n]+"
- :tests ("let test = 1234" "var test = 1234" "private lazy var test: UITapGestureRecognizer")
- :not ("if test == 1234:"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "swift"
- :regex "func\\s+JJJ\\b\\s*(<[^>]*>)?\\s*\\("
- :tests ("func test(asdf)" "func test()" "func test<Value: Protocol>()")
- :not ("func testnot(asdf)" "func testnot()"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "swift"
- :regex "(class|struct|protocol|enum)\\s+JJJ\\b\\s*?"
- :tests ("struct test" "struct test: Codable" "struct test<Value: Codable>"
- "class test:" "class test: UIWindow" "class test<Value: Codable>")
- :not ("class testnot:" "class testnot(object):" "struct testnot(object)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "swift"
- :regex "(typealias)\\s+JJJ\\b\\s*?="
- :tests ("typealias test =")
- :not ("typealias testnot"))
-
- ;; c#
- (:type "function" :supports ("ag" "rg") :language "csharp"
- :regex "^\\s*(?:[\\w\\[\\]]+\\s+){1,3}JJJ\\s*\\\("
- :tests ("int test()" "int test(param)" "static int test()" "static int test(param)"
- "public static MyType test()" "private virtual SomeType test(param)" "static int test()")
- :not ("test()" "testnot()" "blah = new test()"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "csharp"
- :regex "\\s*\\bJJJ\\s*=[^=\\n)]+" :tests ("int test = 1234") :not ("if test == 1234:" "int nottest = 44"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "csharp"
- :regex "(class|interface)\\s*JJJ\\b"
- :tests ("class test:" "public class test : IReadableChannel, I")
- :not ("class testnot:" "public class testnot : IReadableChannel, I"))
-
- ;; java (literally the same regexes as c#, but different tests)
- (:type "function" :supports ("ag" "rg") :language "java"
- :regex "^\\s*(?:[\\w\\[\\]]+\\s+){1,3}JJJ\\s*\\\("
- :tests ("int test()" "int test(param)" "static int test()" "static int test(param)"
- "public static MyType test()" "private virtual SomeType test(param)" "static int test()"
- "private foo[] test()")
- :not ("test()" "testnot()" "blah = new test()" "foo bar = test()"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "java"
- :regex "\\s*\\bJJJ\\s*=[^=\\n)]+" :tests ("int test = 1234") :not ("if test == 1234:" "int nottest = 44"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "java"
- :regex "(class|interface)\\s*JJJ\\b"
- :tests ("class test:" "public class test implements Something")
- :not ("class testnot:" "public class testnot implements Something"))
-
- ;; vala (again just like c#, exactly the same..)
- (:type "function" :supports ("ag" "rg") :language "vala"
- :regex "^\\s*(?:[\\w\\[\\]]+\\s+){1,3}JJJ\\s*\\\("
- :tests ("int test()" "int test(param)" "static int test()" "static int test(param)"
- "public static MyType test()" "private virtual SomeType test(param)" "static int test()")
- :not ("test()" "testnot()" "blah = new test()"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "vala"
- :regex "\\s*\\bJJJ\\s*=[^=\\n)]+" :tests ("int test = 1234") :not ("if test == 1234:" "int nottest = 44"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "vala"
- :regex "(class|interface)\\s*JJJ\\b"
- :tests ("class test:" "public class test : IReadableChannel, I")
- :not ("class testnot:" "public class testnot : IReadableChannel, I"))
-
- ;; coq
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Variable\\s+JJJ\\b"
- :tests ("Variable test")
- :not ("Variable testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Inductive\\s+JJJ\\b"
- :tests ("Inductive test")
- :not ("Inductive testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Lemma\\s+JJJ\\b"
- :tests ("Lemma test")
- :not ("Lemma testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Definition\\s+JJJ\\b"
- :tests ("Definition test")
- :not ("Definition testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Hypothesis\\s+JJJ\\b"
- :tests ("Hypothesis test")
- :not ("Hypothesis testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Theorm\\s+JJJ\\b"
- :tests ("Theorm test")
- :not ("Theorm testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Fixpoint\\s+JJJ\\b"
- :tests ("Fixpoint test")
- :not ("Fixpoint testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*Module\\s+JJJ\\b"
- :tests ("Module test")
- :not ("Module testx"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "coq"
- :regex "\\s*CoInductive\\s+JJJ\\b"
- :tests ("CoInductive test")
- :not ("CoInductive testx"))
-
- ;; python
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "python"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+"
- :tests ("test = 1234")
- :not ("if test == 1234:" "_test = 1234"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "python"
- :regex "def\\s*JJJ\\b\\s*\\\("
- :tests ("\tdef test(asdf)" "def test()")
- :not ("\tdef testnot(asdf)" "def testnot()"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "python"
- :regex "class\\s*JJJ\\b\\s*\\\(?"
- :tests ("class test(object):" "class test:")
- :not ("class testnot:" "class testnot(object):"))
-
- ;; matlab
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "matlab"
- :regex "^\\s*\\bJJJ\\s*=[^=\\n]+"
- :tests ("test = 1234")
- :not ("for test = 1:2:" "_test = 1234"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "matlab"
- :regex "^\\s*function\\s*[^=]+\\s*=\\s*JJJ\\b"
- :tests ("\tfunction y = test(asdf)" "function x = test()" "function [x, losses] = test(A, y, lambda, method, qtile)")
- :not ("\tfunction testnot(asdf)" "function testnot()"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "matlab"
- :regex "^\\s*classdef\\s*JJJ\\b\\s*"
- :tests ("classdef test")
- :not ("classdef testnot"))
-
- ;; nim
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "nim"
- :regex "(const|let|var)\\s*JJJ\\s*(=|:)[^=:\\n]+"
- :tests ("let test = 1234" "var test = 1234" "var test: Stat" "const test = 1234")
- :not ("if test == 1234:"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "nim"
- :regex "(proc|func|macro|template)\\s*`?JJJ`?\\b\\s*\\\("
- :tests ("\tproc test(asdf)" "proc test()" "func test()" "macro test()" "template test()")
- :not ("\tproc testnot(asdf)" "proc testnot()"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "nim"
- :regex "type\\s*JJJ\\b\\s*(\\{[^}]+\\})?\\s*=\\s*\\w+"
- :tests ("type test = object" "type test {.pure.} = enum")
- :not ("type testnot = object"))
-
- ;; nix
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "nix"
- :regex "\\b\\s*JJJ\\s*=[^=;]+"
- :tests ("test = 1234;" "test = 123;" "test=123")
- :not ("testNot = 1234;" "Nottest = 1234;" "AtestNot = 1234;"))
-
- ;; ruby
- (:type "variable" :supports ("ag" "rg" "git-grep") :language "ruby"
- :regex "^\\s*((\\w+[.])*\\w+,\\s*)*JJJ(,\\s*(\\w+[.])*\\w+)*\\s*=([^=>~]|$)"
- :tests ("test = 1234" "self.foo, test, bar = args")
- :not ("if test == 1234" "foo_test = 1234"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "ruby"
- :regex "(^|[^\\w.])((private|public|protected)\\s+)?def\\s+(\\w+(::|[.]))*JJJ($|[^\\w|:])"
- :tests ("def test(foo)" "def test()" "def test foo" "def test; end"
- "def self.test()" "def MODULE::test()" "private def test")
- :not ("def test_foo"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "ruby"
- :regex "(^|\\W)define(_singleton|_instance)?_method(\\s|[(])\\s*:JJJ($|[^\\w|:])"
- :tests ("define_method(:test, &body)"
- "mod.define_instance_method(:test) { body }"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "ruby"
- :regex "(^|[^\\w.])class\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("class test" "class Foo::test"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "ruby"
- :regex "(^|[^\\w.])module\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("module test" "module Foo::test"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "ruby"
- :regex "(^|\\W)alias(_method)?\\W+JJJ(\\W|$)"
- :tests ("alias test some_method"
- "alias_method :test, :some_method"
- "alias_method 'test' 'some_method'"
- "some_class.send(:alias_method, :test, :some_method)")
- :not ("alias some_method test"
- "alias_method :some_method, :test"
- "alias test_foo test"))
-
- ;; Groovy
- (:type "variable" :supports ("ag" "rg" "git-grep") :language "groovy"
- :regex "^\\s*((\\w+[.])*\\w+,\\s*)*JJJ(,\\s*(\\w+[.])*\\w+)*\\s*=([^=>~]|$)"
- :tests ("test = 1234" "self.foo, test, bar = args")
- :not ("if test == 1234" "foo_test = 1234"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "groovy"
- :regex "(^|[^\\w.])((private|public)\\s+)?def\\s+(\\w+(::|[.]))*JJJ($|[^\\w|:])"
- :tests ("def test(foo)" "def test()" "def test foo" "def test; end"
- "def self.test()" "def MODULE::test()" "private def test")
- :not ("def test_foo"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "groovy"
- :regex "(^|[^\\w.])class\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("class test" "class Foo::test"))
-
- ;; crystal
- (:type "variable" :supports ("ag" "rg" "git-grep") :language "crystal"
- :regex "^\\s*((\\w+[.])*\\w+,\\s*)*JJJ(,\\s*(\\w+[.])*\\w+)*\\s*=([^=>~]|$)"
- :tests ("test = 1234" "self.foo, test, bar = args")
- :not ("if test == 1234" "foo_test = 1234"))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "crystal"
- :regex "(^|[^\\w.])((private|public|protected)\\s+)?def\\s+(\\w+(::|[.]))*JJJ($|[^\\w|:])"
- :tests ("def test(foo)" "def test()" "def test foo" "def test; end"
- "def self.test()" "def MODULE::test()" "private def test")
- :not ("def test_foo"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "crystal"
- :regex "(^|[^\\w.])class\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("class test" "class Foo::test"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "crystal"
- :regex "(^|[^\\w.])module\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("module test" "module Foo::test"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "crystal"
- :regex "(^|[^\\w.])struct\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("struct test" "struct Foo::test"))
-
- (:type "type" :supports ("ag" "rg" "git-grep") :language "crystal"
- :regex "(^|[^\\w.])alias\\s+(\\w*::)*JJJ($|[^\\w|:])"
- :tests ("alias test" "alias Foo::test"))
-
- ;; scad
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scad"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+" :tests ("test = 1234") :not ("if test == 1234 {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scad"
- :regex "function\\s*JJJ\\s*\\\("
- :tests ("function test()" "function test ()"))
-
- (:type "module" :supports ("ag" "grep" "rg" "git-grep") :language "scad"
- :regex "module\\s*JJJ\\s*\\\("
- :tests ("module test()" "module test ()"))
-
- ;; scala
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "\\bval\\s*JJJ\\s*=[^=\\n]+" :tests ("val test = 1234") :not ("case test => 1234"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "\\bvar\\s*JJJ\\s*=[^=\\n]+" :tests ("var test = 1234") :not ("case test => 1234"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "\\btype\\s*JJJ\\s*=[^=\\n]+" :tests ("type test = 1234") :not ("case test => 1234"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "\\bdef\\s*JJJ\\s*\\\("
- :tests ("def test(asdf)" "def test()"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "class\\s*JJJ\\s*\\\(?"
- :tests ("class test(object)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "trait\\s*JJJ\\s*\\\(?"
- :tests ("trait test(object)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "scala"
- :regex "object\\s*JJJ\\s*\\\(?"
- :tests ("object test(object)"))
-
- ;; R
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "r"
- :regex "\\bJJJ\\s*=[^=><]" :tests ("test = 1234") :not ("if (test == 1234)"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "r"
- :regex "\\bJJJ\\s*<-\\s*function\\b"
- :tests ("test <- function" "test <- function(")
- :not ("test <- functionX"))
-
- ;; perl
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "perl"
- :regex "sub\\s*JJJ\\s*(\\{|\\()"
- :tests ("sub test{" "sub test {" "sub test(" "sub test ("))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "perl"
- :regex "JJJ\\s*=\\s*"
- :tests ("$test = 1234"))
-
- ;; shell
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "shell"
- :regex "function\\s*JJJ\\s*"
- :tests ("function test{" "function test {" "function test () {")
- :not ("function nottest {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "shell"
- :regex "JJJ\\\(\\\)\\s*\\{"
- :tests ("test() {")
- :not ("testx() {"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "shell"
- :regex "\\bJJJ\\s*=\\s*"
- :tests ("test = 1234") :not ("blahtest = 1234"))
-
- ;; php
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "function\\s*JJJ\\s*\\\("
- :tests ("function test()" "function test ()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "\\*\\s@method\\s+[^ \t]+\\s+JJJ\\("
- :tests ("/** @method string|false test($a)" " * @method bool test()"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "(\\s|->|\\$|::)JJJ\\s*=\\s*"
- :tests ("$test = 1234" "$foo->test = 1234"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "\\*\\s@property(-read|-write)?\\s+([^ \t]+\\s+)&?\\$JJJ(\\s+|$)"
- :tests ("/** @property string $test" "/** @property string $test description for $test property" " * @property-read bool|bool $test" " * @property-write \\ArrayObject<string,resource[]> $test"))
- (:type "trait" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "trait\\s*JJJ\\s*\\\{"
- :tests ("trait test{" "trait test {"))
-
- (:type "interface" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "interface\\s*JJJ\\s*\\\{"
- :tests ("interface test{" "interface test {"))
-
- (:type "class" :supports ("ag" "grep" "rg" "git-grep") :language "php"
- :regex "class\\s*JJJ\\s*(extends|implements|\\\{)"
- :tests ("class test{" "class test {" "class test extends foo" "class test implements foo"))
-
- ;; dart
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "dart"
- :regex "\\bJJJ\\s*\\([^()]*\\)\\s*[{]"
- :tests ("test(foo) {" "test (foo){" "test(foo){"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "dart"
- :regex "class\\s*JJJ\\s*[\\\(\\\{]"
- :tests ("class test(object) {" "class test{"))
-
- ;; faust
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "faust"
- :regex "\\bJJJ\(\\\(.+\\\)\)*\\s*="
- :tests ("test = osc + 0.5;" "test(freq) = osc(freq) + 0.5;"))
-
- ;; fortran
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "fortran"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+"
- :tests ("test = 1234")
- :not ("if (test == 1234)"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "fortran"
- :regex "\\b(function|subroutine|FUNCTION|SUBROUTINE)\\s+JJJ\\b\\s*\\\("
- :tests ("function test (foo)" "integer function test(foo)"
- "subroutine test (foo, bar)" "FUNCTION test (foo)"
- "INTEGER FUNCTION test(foo)" "SUBROUTINE test (foo, bar)")
- :not ("end function test" "end subroutine test" "END FUNCTION test"
- "END SUBROUTINE test"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "fortran"
- :regex "^\\s*(interface|INTERFACE)\\s+JJJ\\b"
- :tests ("interface test" "INTERFACE test")
- :not ("interface test2" "end interface test" "INTERFACE test2"
- "END INTERFACE test"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "fortran"
- :regex "^\\s*(module|MODULE)\\s+JJJ\\s*"
- :tests ("module test" "MODULE test")
- :not ("end module test" "END MODULE test"))
-
- ;; go
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "go"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+" :tests ("test = 1234") :not ("if test == 1234 {"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "go"
- :regex "\\s*\\bJJJ\\s*:=\\s*" :tests ("test := 1234"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "go"
- :regex "func\\s+\\\([^\\\)]*\\\)\\s+JJJ\\s*\\\("
- :tests ("func (s *blah) test(filename string) string {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "go"
- :regex "func\\s+JJJ\\s*\\\("
- :tests ("func test(url string) (string, error)"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "go"
- :regex "type\\s+JJJ\\s+struct\\s+\\\{"
- :tests ("type test struct {"))
-
- ;; javascript extended
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "(service|factory)\\\(['\"]JJJ['\"]" :tags ("angular")
- :tests ("module.factory('test', [\"$rootScope\", function($rootScope) {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "\\bJJJ\\s*[=:]\\s*\\\([^\\\)]*\\\)\\s+=>" :tags ("es6")
- :tests ("const test = (foo) => " "test: (foo) => {" " test: (foo) => {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "\\bJJJ\\s*\\([^()]*\\)\\s*[{]" :tags ("es6")
- :tests ("test(foo) {" "test (foo){" "test(foo){")
- :not ("test = blah.then(function(){"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript" :tags ("es6")
- :regex "class\\s*JJJ\\s*[\\\(\\\{]"
- :tests ("class test(object) {" "class test{"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript" :tags ("es6")
- :regex "class\\s*JJJ\\s+extends"
- :tests ("class test extends Component{"))
-
- ;; javascript
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+" :tests ("test = 1234" "const test = props =>") :not ("if (test === 1234)"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "\\bfunction\\b[^\\(]*\\\(\\s*[^\\)]*\\bJJJ\\b\\s*,?\\s*\\\)?"
- :tests ("function (test)" "function (test, blah)" "function somefunc(test, blah) {" "function(blah, test)")
- :not ("function (testLen)" "function (test1, blah)" "function somefunc(testFirst, blah) {" "function(blah, testLast)"
- "function (Lentest)" "function (blahtest, blah)" "function somefunc(Firsttest, blah) {" "function(blah, Lasttest)"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "function\\s*JJJ\\s*\\\("
- :tests ("function test()" "function test ()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "\\bJJJ\\s*:\\s*function\\s*\\\("
- :tests ("test: function()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "javascript"
- :regex "\\bJJJ\\s*=\\s*function\\s*\\\("
- :tests ("test = function()"))
-
- ;; hcl terraform
- (:type "block" :supports ("ag" "grep" "rg" "git-grep") :language "hcl"
- :regex "(variable|output|module)\\s*\"JJJ\"\\s*\\\{"
- :tests ("variable \"test\" {"
- "output \"test\" {"
- "module \"test\" {"))
-
- (:type "block" :supports ("ag" "grep" "rg" "git-grep") :language "hcl"
- :regex "(data|resource)\\s*\"\\w+\"\\s*\"JJJ\"\\s*\\\{"
- :tests ("data \"openstack_images_image_v2\" \"test\" {"
- "resource \"google_compute_instance\" \"test\" {"))
-
- ;; typescript
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "(service|factory)\\\(['\"]JJJ['\"]" :tags ("angular")
- :tests ("module.factory('test', [\"$rootScope\", function($rootScope) {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "\\bJJJ\\s*[=:]\\s*\\\([^\\\)]*\\\)\\s+=>"
- :tests ("const test = (foo) => " "test: (foo) => {" " test: (foo) => {"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "\\bJJJ\\s*\\([^()]*\\)\\s*[{]"
- :tests ("test(foo) {" "test (foo){" "test(foo){")
- :not ("test = blah.then(function(){"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "class\\s*JJJ\\s*[\\\(\\\{]"
- :tests ("class test{"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "class\\s*JJJ\\s+extends"
- :tests ("class test extends Component{"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "function\\s*JJJ\\s*\\\("
- :tests ("function test()" "function test ()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "\\bJJJ\\s*:\\s*function\\s*\\\("
- :tests ("test: function()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "\\bJJJ\\s*=\\s*function\\s*\\\("
- :tests ("test = function()"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+" :tests ("test = 1234" "const test = props =>") :not ("if (test === 1234)"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "typescript"
- :regex "\\bfunction\\b[^\\(]*\\\(\\s*[^\\)]*\\bJJJ\\b\\s*,?\\s*\\\)?"
- :tests ("function (test)" "function (test, blah)" "function somefunc(test, blah) {" "function(blah, test)")
- :not ("function (testLen)" "function (test1, blah)" "function somefunc(testFirst, blah) {" "function(blah, testLast)"
- "function (Lentest)" "function (blahtest, blah)" "function somefunc(Firsttest, blah) {" "function(blah, Lasttest)"))
-
- ;; julia
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "julia"
- :regex "(@noinline|@inline)?\\s*function\\s*JJJ(\\{[^\\}]*\\})?\\("
- :tests ("function test()" "@inline function test()"
- "function test{T}(h)"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "julia"
- :regex "(@noinline|@inline)?JJJ(\\{[^\\}]*\\})?\\([^\\)]*\\)\s*="
- :tests ("test(a)=1" "test(a,b)=1*8"
- "@noinline test()=1" "test{T}(x)=x"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "julia"
- :regex "macro\\s*JJJ\\("
- :tests ("macro test(a)=1" " macro test(a,b)=1*8"))
-
- (:type "variable" :supports ("ag" "rg") :language "julia"
- :regex "const\\s+JJJ\\b"
- :tests ("const test = "))
-
- (:type "type" :supports ("ag" "rg") :language "julia"
- :regex "(mutable)?\\s*struct\\s*JJJ"
- :tests ("struct test"))
-
- (:type "type" :supports ("ag" "rg") :language "julia"
- :regex "(type|immutable|abstract)\\s*JJJ"
- :tests ("type test" "immutable test" "abstract test <:Testable" ))
-
- ;; haskell
- (:type "module" :supports ("ag") :language "haskell"
- :regex "^module\\s+JJJ\\s+"
- :tests ("module Test (exportA, exportB) where"))
-
- ; TODO Doesn't support any '=' in arguments. E.g. 'foo A{a = b,..} = bar'.
- (:type "top level function" :supports ("ag") :language "haskell"
- :regex "^\\bJJJ(?!(\\s+::))\\s+((.|\\s)*?)=\\s+"
- :tests ("test n = n * 2"
- "test X{..} (Y a b c) \n bcd \n =\n x * y"
- "test ab cd e@Datatype {..} (Another thing, inTheRow) = \n undefined"
- "test = runRealBasedMode @ext @ctx identity identity"
- "test unwrap wrap nr@Naoeu {..} (Action action, specSpecs) = \n undefined")
- :not ("nottest n = n * 2"
- "let testnot x y = x * y" "test $ y z" "let test a o = mda"
- "test :: Sometype -> AnotherType aoeu kek = undefined"))
-
- (:type "type-like" :supports ("ag") :language "haskell"
- :regex "^\\s*((data(\\s+family)?)|(newtype)|(type(\\s+family)?))\\s+JJJ\\s+"
- :tests ("newtype Test a = Something { b :: Kek }"
- "data Test a b = Somecase a | Othercase b"
- "type family Test (x :: *) (xs :: [*]) :: Nat where"
- "data family Test "
- "type Test = TestAlias")
- :not ("newtype NotTest a = NotTest (Not a)"
- "data TestNot b = Aoeu"))
-
- ; datatype contstuctor that doesn't match type definition.
- (:type "(data)type constructor 1" :supports ("ag") :language "haskell"
- :regex "(data|newtype)\\s{1,3}(?!JJJ\\s+)([^=]{1,40})=((\\s{0,3}JJJ\\s+)|([^=]{0,500}?((?<!(-- ))\\|\\s{0,3}JJJ\\s+)))"
- :tests ("data Something a = Test { b :: Kek }"
- "data Mem a = TrueMem { b :: Kek } | Test (Mem Int) deriving Mda"
- "newtype SafeTest a = Test (Kek a) deriving (YonedaEmbedding)")
- :not ("data Test = Test { b :: Kek }"))
-
-
- (:type "data/newtype record field" :supports ("ag") :language "haskell"
- :regex "(data|newtype)([^=]*)=[^=]*?({([^=}]*?)(\\bJJJ)\\s+::[^=}]+})"
- :tests ("data Mem = Mem { \n mda :: A \n , test :: Kek \n , \n aoeu :: E \n }"
- "data Mem = Mem { \n test :: A \n , mda :: Kek \n , \n aoeu :: E \n }"
- "data Mem = Mem { \n mda :: A \n , aoeu :: Kek \n , \n test :: E \n }"
- "data Mem = Mem { test :: Kek } deriving Mda"
- "data Mem = Mem { \n test :: Kek \n } deriving Mda"
- "newtype Mem = Mem { \n test :: Kek \n } deriving (Eq)"
- "newtype Mem = Mem { -- | Some docs \n test :: Kek -- ^ More docs } deriving Eq"
- "newtype Mem = Mem { test :: Kek } deriving (Eq,Monad)"
- "newtype NewMem = OldMem { test :: [Tx] }"
- "newtype BlockHeaderList ssc = BHL\n { test :: ([Aoeu a], [Ssss])\n } deriving (Eq)")
- :not ("data Heh = Mda { sometest :: Kek, testsome :: Mem }"))
-
- (:type "typeclass" :supports ("ag") :language "haskell"
- :regex "^class\\s+(.+=>\\s*)?JJJ\\s+"
- :tests (
- "class (Constr1 m, Constr 2) => Test (Kek a) where"
- "class Test (Veryovka a) where ")
- :not ("class Test2 (Kek a) where"
- "class MakeTest (AoeuTest x y z) where"))
-
- ;; ocaml
- (:type "type" :supports ("ag" "rg") :language "ocaml"
- :regex "^\\s*(and|type)\\s+.*\\bJJJ\\b"
- :tests ("type test ="
- "and test ="
- "type 'a test ="
- "type ('a, _, 'c) test"))
-
- (:type "variable" :supports ("ag" "rg") :language "ocaml"
- :regex "let\\s+JJJ\\b"
- :tests ("let test ="
- "let test x y ="))
-
- (:type "variable" :supports ("ag" "rg") :language "ocaml"
- :regex "let\\s+rec\\s+JJJ\\b"
- :tests ("let rec test ="
- "let rec test x y ="))
-
- (:type "variable" :supports ("ag" "rg") :language "ocaml"
- :regex "\\s*val\\s*\\bJJJ\\b\\s*"
- :tests ("val test"))
-
- (:type "module" :supports ("ag" "rg") :language "ocaml"
- :regex "^\\s*module\\s*\\bJJJ\\b"
- :tests ("module test ="))
-
- (:type "module" :supports ("ag" "rg") :language "ocaml"
- :regex "^\\s*module\\s*type\\s*\\bJJJ\\b"
- :tests ("module type test ="))
-
- ;; lua
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "lua"
- :regex "\\s*\\bJJJ\\s*=[^=\\n]+" :tests ("test = 1234") :not ("if test === 1234"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "lua"
- :regex "\\bfunction\\b[^\\(]*\\\(\\s*[^\\)]*\\bJJJ\\b\\s*,?\\s*\\\)?"
- :tests ("function (test)" "function (test, blah)" "function somefunc(test, blah)" "function(blah, test)")
- :not ("function (testLen)" "function (test1, blah)" "function somefunc(testFirst, blah)" "function(blah, testLast)"
- "function (Lentest)" "function (blahtest, blah)" "function somefunc(Firsttest, blah)" "function(blah, Lasttest)"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "lua"
- :regex "function\\s*JJJ\\s*\\\("
- :tests ("function test()" "function test ()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "lua"
- :regex "function\\s*.+[.:]JJJ\\s*\\\("
- :tests ("function MyClass.test()" "function MyClass.test ()"
- "function MyClass:test()" "function MyClass:test ()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "lua"
- :regex "\\bJJJ\\s*=\\s*function\\s*\\\("
- :tests ("test = function()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "lua"
- :regex "\\b.+\\.JJJ\\s*=\\s*function\\s*\\\("
- :tests ("MyClass.test = function()"))
-
- ;; rust
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\blet\\s+(\\\([^=\\n]*)?(mut\s+)?JJJ([^=\\n]*\\\))?(:\\s*[^=\\n]+)?\\s*=\\s*[^=\\n]+"
- :tests ("let test = 1234;"
- "let test: u32 = 1234;"
- "let test: Vec<u32> = Vec::new();"
- "let mut test = 1234;"
- "let mut test: Vec<u32> = Vec::new();"
- "let (a, test, b) = (1, 2, 3);"
- "let (a, mut test, mut b) = (1, 2, 3);"
- "let (mut a, mut test): (u32, usize) = (1, 2);"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\bconst\\s+JJJ:\\s*[^=\\n]+\\s*=[^=\\n]+"
- :tests ("const test: u32 = 1234;"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\bstatic\\s+(mut\\s+)?JJJ:\\s*[^=\\n]+\\s*=[^=\\n]+"
- :tests ("static test: u32 = 1234;"
- "static mut test: u32 = 1234;"))
-
- ;; variable in method signature
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\bfn\\s+.+\\s*\\\((.+,\\s+)?JJJ:\\s*[^=\\n]+\\s*(,\\s*.+)*\\\)"
- :tests ("fn abc(test: u32) -> u32 {"
- "fn abc(x: u32, y: u32, test: Vec<u32>, z: Vec<Foo>)"
- "fn abc(x: u32, y: u32, test: &mut Vec<u32>, z: Vec<Foo>)"))
-
- ;; "if let" and "while let" desugaring
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "(if|while)\\s+let\\s+([^=\\n]+)?(mut\\s+)?JJJ([^=\\n\\\(]+)?\\s*=\\s*[^=\\n]+"
- :tests ("if let Some(test) = abc() {"
- "if let Some(mut test) = abc() {"
- "if let Ok(test) = abc() {"
- "if let Ok(mut test) = abc() {"
- "if let Foo(mut test) = foo {"
- "if let test = abc() {"
- "if let Some(test) = abc()"
- "if let Some((a, test, b)) = abc()"
- "while let Some(test) = abc() {"
- "while let Some(mut test) = abc() {"
- "while let Ok(test) = abc() {"
- "while let Ok(mut test) = abc() {")
- :not ("while let test(foo) = abc() {"))
-
- ;; structure fields
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "struct\\s+[^\\n{]+[{][^}]*(\\s*JJJ\\s*:\\s*[^\\n},]+)[^}]*}"
- :tests ("struct Foo { abc: u32, test: Vec<String>, b: PathBuf }"
- "struct Foo<T>{test:Vec<T>}"
- "struct FooBar<'a> { test: Vec<String> }")
- :not ("struct Foo { abc: u32, b: Vec<String> }"
- "/// ... construct the equivalent ...\nfn abc() {\n"))
-
- ;; enum variants
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "enum\\s+[^\\n{]+\\s*[{][^}]*\\bJJJ\\b[^}]*}"
- :tests ("enum Foo { VariantA, test, VariantB(u32) }"
- "enum Foo<T> { test(T) }"
- "enum BadStyle{test}"
- "enum Foo32 { Bar, testing, test(u8) }")
- :not ("enum Foo { testing }"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\bfn\\s+JJJ\\s*\\\("
- :tests ("fn test(asdf: u32)" "fn test()" "pub fn test()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\bmacro_rules!\\s+JJJ"
- :tests ("macro_rules! test"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "struct\\s+JJJ\\s*[{\\\(]?"
- :tests ("struct test(u32, u32)"
- "struct test;"
- "struct test { abc: u32, def: Vec<String> }"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "trait\\s+JJJ\\s*[{]?"
- :tests ("trait test;" "trait test { fn abc() -> u32; }"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "\\btype\\s+JJJ([^=\\n]+)?\\s*=[^=\\n]+;"
- :tests ("type test<T> = Rc<RefCell<T>>;"
- "type test = Arc<RwLock<Vec<u32>>>;"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "impl\\s+((\\w+::)*\\w+\\s+for\\s+)?(\\w+::)*JJJ\\s+[{]?"
- :tests ("impl test {"
- "impl abc::test {"
- "impl std::io::Read for test {"
- "impl std::io::Read for abc::test {"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "rust"
- :regex "mod\\s+JJJ\\s*[{]?"
- :tests ("mod test;" "pub mod test {"))
-
- ;; elixir
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "elixir"
- :regex "\\bdef(p)?\\s+JJJ\\s*[ ,\\\(]"
- :tests ("def test do"
- "def test, do:"
- "def test() do"
- "def test(), do:"
- "def test(foo, bar) do"
- "def test(foo, bar), do:"
- "defp test do"
- "defp test(), do:"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "elixir"
- :regex "\\s*JJJ\\s*=[^=\\n]+"
- :tests ("test = 1234")
- :not ("if test == 1234"))
-
- (:type "module" :supports ("ag" "grep" "rg" "git-grep") :language "elixir"
- :regex "defmodule\\s+(\\w+\\.)*JJJ\\s+"
- :tests ("defmodule test do"
- "defmodule Foo.Bar.test do"))
-
- (:type "module" :supports ("ag" "grep" "rg" "git-grep") :language "elixir"
- :regex "defprotocol\\s+(\\w+\\.)*JJJ\\s+"
- :tests ("defprotocol test do"
- "defprotocol Foo.Bar.test do"))
-
- ;; erlang
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "erlang"
- :regex "^JJJ\\b\\s*\\\("
- :tests ("test() ->"
- "test()->"
- "test(Foo) ->"
- "test (Foo,Bar) ->"
- "test(Foo, Bar)->"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "erlang"
- :regex "\\s*JJJ\\s*=[^:=\\n]+"
- :tests ("test = 1234")
- :not ("if test =:= 1234"
- "if test == 1234"))
-
- (:type "module" :supports ("ag" "grep" "rg" "git-grep") :language "erlang"
- :regex "^-module\\\(JJJ\\\)"
- :tests ("-module(test)."))
-
- ;; scss
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scss"
- :regex "@mixin\\sJJJ\\b\\s*\\\("
- :tests ("@mixin test()"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "scss"
- :regex "@function\\sJJJ\\b\\s*\\\("
- :tests ("@function test()"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "scss"
- :regex "JJJ\\s*:\\s*"
- :tests ("test :"))
-
- ;; sml
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "sml"
- :regex "\\s*(data)?type\\s+.*\\bJJJ\\b"
- :tests ("datatype test ="
- "datatype test="
- "datatype 'a test ="
- "type test ="
- "type 'a test ="
- "type 'a test"
- "type test")
- :not ("datatypetest ="))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "sml"
- :regex "\\s*val\\s+\\bJJJ\\b"
- :tests ("val test ="
- "val test="
- "val test : bool"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "sml"
- :regex "\\s*fun\\s+\\bJJJ\\b.*\\s*="
- :tests ("fun test list ="
- "fun test (STRING_NIL, a) ="
- "fun test ((s1,s2): 'a queue) : 'a * 'a queue ="
- "fun test (var : q) : int ="
- "fun test f e xs ="))
-
- (:type "module" :supports ("ag" "grep" "rg" "git-grep") :language "sml"
- :regex "\\s*(structure|signature|functor)\\s+\\bJJJ\\b"
- :tests ("structure test ="
- "structure test : MYTEST ="
- "signature test ="
- "functor test (T:TEST) ="
- "functor test(T:TEST) ="))
-
- ;; sql
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "sql"
- :regex "(CREATE|create)\\s+(.+?\\s+)?(FUNCTION|function|PROCEDURE|procedure)\\s+JJJ\\s*\\\("
- :tests ("CREATE FUNCTION test(i INT) RETURNS INT"
- "create or replace function test (int)"
- "CREATE PROCEDURE test (OUT p INT)"
- "create definer = 'test'@'localhost' procedure test()"))
-
- (:type "table" :supports ("ag" "grep" "rg" "git-grep") :language "sql"
- :regex "(CREATE|create)\\s+(.+?\\s+)?(TABLE|table)(\\s+(IF NOT EXISTS|if not exists))?\\s+JJJ\\b"
- :tests ("CREATE TABLE test ("
- "create temporary table if not exists test"
- "CREATE TABLE IF NOT EXISTS test ("
- "create global temporary table test"))
-
- (:type "view" :supports ("ag" "grep" "rg" "git-grep") :language "sql"
- :regex "(CREATE|create)\\s+(.+?\\s+)?(VIEW|view)\\s+JJJ\\b"
- :tests ("CREATE VIEW test ("
- "create sql security definer view test"
- "CREATE OR REPLACE VIEW test AS foo"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "sql"
- :regex "(CREATE|create)\\s+(.+?\\s+)?(TYPE|type)\\s+JJJ\\b"
- :tests ("CREATE TYPE test"
- "CREATE OR REPLACE TYPE test AS foo ("
- "create type test as ("))
-
- ;; systemverilog
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "systemverilog"
- :regex "\\s*class\\s+\\bJJJ\\b"
- :tests ("virtual class test;" "class test;" "class test extends some_class")
- :not ("virtual class testing;" "class test2;" "class some_test" "class some_class extends test"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "systemverilog"
- :regex "\\s*task\\s+\\bJJJ\\b"
- :tests ("task test (" "task test(")
- :not ("task testing (" "task test2("))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "systemverilog"
- :regex "\\s*\\bJJJ\\b\\s*="
- :tests ("assign test =" "assign test=" "int test =" "int test=")
- :not ("assign testing =" "assign test2="))
-
- (:type "function" :supports ("ag" "rg" "git-grep") :language "systemverilog"
- :regex "function\\s[^\\s]+\\s*\\bJJJ\\b"
- :tests ("function Matrix test ;" "function Matrix test;")
- :not ("function test blah"))
-
- ;; matches SV class handle declarations
- (:type "function" :supports ("ag" "rg" "git-grep") :language "systemverilog"
- :regex "^\\s*[^\\s]*\\s*[^\\s]+\\s+\\bJJJ\\b"
- :tests ("some_class_name test" " another_class_name test ;" "some_class test[];" "some_class #(1) test")
- :not ("test some_class_name" "class some_class extends test"))
-
- ;; vhdl
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "vhdl"
- :regex "\\s*type\\s+\\bJJJ\\b"
- :tests ("type test is" "type test is")
- :not ("type testing is" "type test2 is"))
-
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "vhdl"
- :regex "\\s*constant\\s+\\bJJJ\\b"
- :tests ("constant test :" "constant test:")
- :not ("constant testing " "constant test2:"))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "vhdl"
- :regex "function\\s*\"?JJJ\"?\\s*\\\("
- :tests ("function test(signal)" "function test (signal)" "function \"test\" (signal)")
- :not ("function testing(signal"))
-
- ;; latex
- (:type "command" :supports ("ag" "grep" "rg" "git-grep") :language "tex"
- :regex "\\\\.*newcommand\\\*?\\s*\\\{\\s*(\\\\)JJJ\\s*}"
- :tests ("\\newcommand{\\test}" "\\renewcommand{\\test}" "\\renewcommand*{\\test}" "\\newcommand*{\\test}" "\\renewcommand{ \\test }")
- :not("\\test" "test"))
-
- (:type "command" :supports ("ag" "grep" "rg" "git-grep") :language "tex"
- :regex "\\\\.*newcommand\\\*?\\s*(\\\\)JJJ\\j"
- :tests ("\\newcommand\\test {}" "\\renewcommand\\test{}" "\\newcommand \\test")
- :not("\\test" "test"))
-
- (:type "length" :supports ("ag" "grep" "rg" "git-grep") :language "tex"
- :regex "\\\\(s)etlength\\s*\\\{\\s*(\\\\)JJJ\\s*}"
- :tests ("\\setlength { \\test}" "\\setlength{\\test}" "\\setlength{\\test}{morecommands}" )
- :not("\\test" "test"))
-
- (:type "counter" :supports ("ag" "grep" "rg" "git-grep") :language "tex"
- :regex "\\\\newcounter\\\{\\s*JJJ\\s*}"
- :tests ("\\newcounter{test}" )
- :not("\\test" "test"))
-
- (:type "environment" :supports ("ag" "grep" "rg" "git-grep") :language "tex"
- :regex "\\\\.*newenvironment\\s*\\\{\\s*JJJ\\s*}"
- :tests ("\\newenvironment{test}" "\\newenvironment {test}{morecommands}" "\\lstnewenvironment{test}" "\\newenvironment {test}" )
- :not("\\test" "test" ))
-
- ;; pascal (todo: var, type, const)
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "pascal"
- :regex "\\bfunction\\s+JJJ\\b"
- :tests (" function test : "))
-
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "pascal"
- :regex "\\bprocedure\\s+JJJ\\b"
- :tests (" procedure test ; "))
-
- ;; f#
- (:type "variable" :supports ("ag" "grep" "git-grep") :language "fsharp"
- :regex "let\\s+JJJ\\b.*\\\="
- :tests ("let test = 1234" "let test() = 1234" "let test abc def = 1234")
- :not ("let testnot = 1234" "let testnot() = 1234" "let testnot abc def = 1234"))
-
- (:type "interface" :supports ("ag" "grep" "git-grep") :language "fsharp"
- :regex "member(\\b.+\\.|\\s+)JJJ\\b.*\\\="
- :tests ("member test = 1234" "member this.test = 1234")
- :not ("member testnot = 1234" "member this.testnot = 1234"))
-
- (:type "type" :supports ("ag" "grep" "git-grep") :language "fsharp"
- :regex "type\\s+JJJ\\b.*\\\="
- :tests ("type test = 1234")
- :not ("type testnot = 1234"))
-
- ;; kotlin
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "kotlin"
- :regex "fun\\s*(<[^>]*>)?\\s*JJJ\\s*\\("
- :tests ("fun test()" "fun <T> test()"))
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "kotlin"
- :regex "(val|var)\\s*JJJ\\b"
- :not ("val testval" "var testvar")
- :tests ("val test " "var test"))
- (:type "type" :supports ("ag" "grep" "rg" "git-grep") :language "kotlin"
- :regex "(class|interface)\\s*JJJ\\b"
- :tests ("class test" "class test : SomeInterface" "interface test"))
-
- ;; zig
- (:type "function" :supports ("ag" "grep" "rg" "git-grep") :language "zig"
- :regex "fn\\s+JJJ\\b"
- :tests ("fn test() void {"
- "fn test(a: i32) i32 {"
- "pub fn test(a: i32) i32 {"
- "export fn test(a: i32) i32 {"
- "extern \"c\" fn test(a: i32) i32 {"
- "inline fn test(a: i32) i32 {"))
-
- (:type "variable" :supports ("ag" "grep" "rg" "git-grep") :language "zig"
- :regex "(var|const)\\s+JJJ\\b"
- :tests ("const test: i32 = 3;"
- "var test: i32 = 3;"
- "pub const test: i32 = 3;"))
-
- ;; protobuf
- (:type "message" :supports ("ag" "grep" "rg" "git-grep") :language "protobuf"
- :regex "message\\s+JJJ\\s*\\\{"
- :tests ("message test{" "message test {"))
-
- (:type "enum" :supports ("ag" "grep" "rg" "git-grep") :language "protobuf"
- :regex "enum\\s+JJJ\\s*\\\{"
- :tests ("enum test{" "enum test {")))
-
-
- "List of regex patttern templates organized by language and type to use for generating the grep command."
- :group 'dumb-jump
- :type
- '(repeat
- (plist
- :options ((:type string)
- (:supports string)
- (:language string)
- (:regex string)
- (:tests (repeat string))
- (:not (repeat string))))))
-
- ; https://github.com/ggreer/the_silver_searcher/blob/master/tests/list_file_types.t
- ; https://github.com/BurntSushi/ripgrep/blob/master/ignore/src/types.rs#L99
-(defcustom dumb-jump-language-file-exts
- '((:language "elisp" :ext "el" :agtype "elisp" :rgtype "elisp")
- (:language "elisp" :ext "el.gz" :agtype "elisp" :rgtype "elisp")
- (:language "commonlisp" :ext "lisp" :agtype "lisp" :rgtype "lisp")
- (:language "commonlisp" :ext "lsp" :agtype "lisp" :rgtype "lisp")
- (:language "c++" :ext "c" :agtype "cc" :rgtype "c")
- (:language "c++" :ext "h" :agtype "cc" :rgtype "c")
- (:language "c++" :ext "C" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "H" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "tpp" :agtype "cpp" :rgtype nil)
- (:language "c++" :ext "cpp" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "hpp" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "cxx" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "hxx" :agtype "cpp" :rgtype nil)
- (:language "c++" :ext "cc" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "hh" :agtype "cpp" :rgtype "cpp")
- (:language "c++" :ext "c++" :agtype nil :rgtype nil)
- (:language "c++" :ext "h++" :agtype nil :rgtype nil)
- (:language "coq" :ext "v" :agtype nil :rgtype nil)
- (:language "ocaml" :ext "ml" :agtype "ocaml" :rgtype "ocaml")
- (:language "ocaml" :ext "mli" :agtype "ocaml" :rgtype "ocaml")
- (:language "ocaml" :ext "mll" :agtype "ocaml" :rgtype "ocaml")
- (:language "ocaml" :ext "mly" :agtype "ocaml" :rgtype "ocaml")
- ;; groovy is nil type because jenkinsfile is not in searcher type lists
- (:language "groovy" :ext "gradle" :agtype nil :rgtype nil)
- (:language "groovy" :ext "groovy" :agtype nil :rgtype nil)
- (:language "groovy" :ext "jenkinsfile" :agtype nil :rgtype nil)
- (:language "haskell" :ext "hs" :agtype "haskell" :rgtype "haskell")
- (:language "haskell" :ext "lhs" :agtype "haskell" :rgtype "haskell")
- (:language "objc" :ext "m" :agtype "objc" :rgtype "objc")
- (:language "csharp" :ext "cs" :agtype "csharp" :rgtype "csharp")
- (:language "java" :ext "java" :agtype "java" :rgtype "java")
- (:language "vala" :ext "vala" :agtype "vala" :rgtype "vala")
- (:language "vala" :ext "vapi" :agtype "vala" :rgtype "vala")
- (:language "julia" :ext "jl" :agtype "julia" :rgtype "julia")
- (:language "clojure" :ext "clj" :agtype "clojure" :rgtype "clojure")
- (:language "clojure" :ext "cljc" :agtype "clojure" :rgtype "clojure")
- (:language "clojure" :ext "cljs" :agtype "clojure" :rgtype "clojure")
- (:language "clojure" :ext "cljx" :agtype "clojure" :rgtype "clojure")
- (:language "coffeescript" :ext "coffee" :agtype "coffee" :rgtype "coffeescript")
- (:language "faust" :ext "dsp" :agtype nil :rgtype nil)
- (:language "faust" :ext "lib" :agtype nil :rgtype nil)
- (:language "fortran" :ext "F" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "f" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "f77" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "f90" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "f95" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "F77" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "F90" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "F95" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "f03" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "for" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "ftn" :agtype "fortran" :rgtype "fortran")
- (:language "fortran" :ext "fpp" :agtype "fortran" :rgtype "fortran")
- (:language "go" :ext "go" :agtype "go" :rgtype "go")
- (:language "javascript" :ext "js" :agtype "js" :rgtype "js")
- (:language "javascript" :ext "jsx" :agtype "js" :rgtype "js")
- (:language "javascript" :ext "vue" :agtype "js" :rgtype "js")
- (:language "javascript" :ext "html" :agtype "html" :rgtype "html")
- (:language "javascript" :ext "css" :agtype "css" :rgtype "css")
- (:language "typescript" :ext "ts" :agtype "ts" :rgtype "ts")
- (:language "typescript" :ext "tsx" :agtype "ts" :rgtype "ts")
- (:language "typescript" :ext "vue" :agtype "ts" :rgtype "ts")
- (:language "dart" :ext "dart" :agtype nil :rgtype "dart")
- (:language "lua" :ext "lua" :agtype "lua" :rgtype "lua")
- ;; the extension "m" is also used by obj-c so must use matlab-mode
- ;; since obj-c will win by file extension, but here for searcher types
- (:language "matlab" :ext "m" :agtype "matlab" :rgtype "matlab")
- (:language "nim" :ext "nim" :agtype "nim" :rgtype "nim")
- (:language "nix" :ext "nix" :agtype "nix" :rgtype "nix")
- (:language "org" :ext "org" :agtype nil :rgtype "org")
- (:language "perl" :ext "pl" :agtype "perl" :rgtype "perl")
- (:language "perl" :ext "pm" :agtype "perl" :rgtype "perl")
- (:language "perl" :ext "pm6" :agtype "perl" :rgtype nil)
- (:language "perl" :ext "perl" :agtype nil :rgtype "perl")
- (:language "perl" :ext "plh" :agtype nil :rgtype "perl")
- (:language "perl" :ext "plx" :agtype nil :rgtype "perl")
- (:language "perl" :ext "pod" :agtype "perl" :rgtype "pod")
- (:language "perl" :ext "t" :agtype "perl" :rgtype nil)
- (:language "php" :ext "php" :agtype "php" :rgtype "php")
- (:language "php" :ext "php3" :agtype "php" :rgtype "php")
- (:language "php" :ext "php4" :agtype "php" :rgtype "php")
- (:language "php" :ext "php5" :agtype "php" :rgtype "php")
- (:language "php" :ext "phtml" :agtype "php" :rgtype "php")
- (:language "php" :ext "inc" :agtype "php" :rgtype nil)
- (:language "python" :ext "py" :agtype "python" :rgtype "py")
- (:language "r" :ext "R" :agtype "r" :rgtype "r")
- (:language "r" :ext "r" :agtype "r" :rgtype "r")
- (:language "r" :ext "Rmd" :agtype "r" :rgtype "r")
- (:language "r" :ext "Rnw" :agtype "r" :rgtype "r")
- (:language "r" :ext "Rtex" :agtype "r" :rgtype nil)
- (:language "r" :ext "Rrst" :agtype "r" :rgtype nil)
- (:language "racket" :ext "rkt" :agtype "racket" :rgtype "lisp")
- (:language "crystal" :ext "cr" :agtype "crystal" :rgtype "crystal")
- (:language "crystal" :ext "ecr" :agtype "crystal" :rgtype nil)
- (:language "ruby" :ext "rb" :agtype "ruby" :rgtype "ruby")
- (:language "ruby" :ext "erb" :agtype "ruby" :rgtype nil)
- (:language "ruby" :ext "haml" :agtype "ruby" :rgtype nil)
- (:language "ruby" :ext "rake" :agtype "ruby" :rgtype nil)
- (:language "ruby" :ext "slim" :agtype "ruby" :rgtype nil)
- (:language "rust" :ext "rs" :agtype "rust" :rgtype "rust")
- (:language "zig" :ext "zig" :agtype nil :rgtype "zig")
- (:language "scad" :ext "scad" :agtype nil :rgtype nil)
- (:language "scala" :ext "scala" :agtype "scala" :rgtype "scala")
- (:language "scheme" :ext "scm" :agtype "scheme" :rgtype "lisp")
- (:language "scheme" :ext "ss" :agtype "scheme" :rgtype "lisp")
- (:language "scheme" :ext "sld" :agtype "scheme" :rgtype "lisp")
- (:language "shell" :ext "sh" :agtype nil :rgtype nil)
- (:language "shell" :ext "bash" :agtype nil :rgtype nil)
- (:language "shell" :ext "csh" :agtype nil :rgtype nil)
- (:language "shell" :ext "ksh" :agtype nil :rgtype nil)
- (:language "shell" :ext "tcsh" :agtype nil :rgtype nil)
- (:language "sml" :ext "sml" :agtype "sml" :rgtype "sml")
- (:language "sql" :ext "sql" :agtype "sql" :rgtype "sql")
- (:language "swift" :ext "swift" :agtype nil :rgtype "swift")
- (:language "tex" :ext "tex" :agtype "tex" :rgtype "tex")
- (:language "elixir" :ext "ex" :agtype "elixir" :rgtype "elixir")
- (:language "elixir" :ext "exs" :agtype "elixir" :rgtype "elixir")
- (:language "elixir" :ext "eex" :agtype "elixir" :rgtype "elixir")
- (:language "erlang" :ext "erl" :agtype "erlang" :rgtype "erlang")
- (:language "systemverilog" :ext "sv" :agtype "verilog" :rgtype "verilog")
- (:language "systemverilog" :ext "svh" :agtype "verilog" :rgtype "verilog")
- (:language "vhdl" :ext "vhd" :agtype "vhdl" :rgtype "vhdl")
- (:language "vhdl" :ext "vhdl" :agtype "vhdl" :rgtype "vhdl")
- (:language "scss" :ext "scss" :agtype "css" :rgtype "css")
- (:language "pascal" :ext "pas" :agtype "delphi" :rgtype nil)
- (:language "pascal" :ext "dpr" :agtype "delphi" :rgtype nil)
- (:language "pascal" :ext "int" :agtype "delphi" :rgtype nil)
- (:language "pascal" :ext "dfm" :agtype "delphi" :rgtype nil)
- (:language "fsharp" :ext "fs" :agtype "fsharp" :rgtype nil)
- (:language "fsharp" :ext "fsi" :agtype "fsharp" :rgtype nil)
- (:language "fsharp" :ext "fsx" :agtype "fsharp" :rgtype nil)
- (:language "kotlin" :ext "kt" :agtype "kotlin" :rgtype "kotlin")
- (:language "kotlin" :ext "kts" :agtype "kotlin" :rgtype "kotlin")
- (:language "protobuf" :ext "proto" :agtype "proto" :rgtype "protobuf")
- (:language "hcl" :ext "tf" :agtype "terraform" :rgtype "tf")
- (:language "hcl" :ext "tfvars" :agtype "terraform" :rgtype nil))
-
- "Mapping of programming language(s) to file extensions."
- :group 'dumb-jump
- :type
- '(repeat
- (plist
- :options ((:language (string :tag "Language"))
- (:ext (string :tag "Extension"))
- (:agtype (string :tag "Ag type"))
- (:rgtype (string :tag "Ripgrep type"))))))
-
-(defcustom dumb-jump-language-contexts
- '((:language "javascript" :type "function" :right "^(" :left nil)
- (:language "javascript" :type "variable" :right nil :left "($")
- (:language "javascript" :type "variable" :right "^)" :left "($")
- (:language "javascript" :type "variable" :right "^\\." :left nil)
- (:language "javascript" :type "variable" :right "^;" :left nil)
- (:language "typescript" :type "function" :right "^(" :left nil)
- (:language "perl" :type "function" :right "^(" :left nil)
- (:language "php" :type "function" :right "^(" :left nil)
- (:language "php" :type "class" :right nil :left "new\s+")
- (:language "elisp" :type "function" :right nil :left "($")
- (:language "elisp" :type "variable" :right "^)" :left nil)
- (:language "scheme" :type "function" :right nil :left "($")
- (:language "scheme" :type "variable" :right "^)" :left nil))
-
- "List of under points contexts for each language.
-This helps limit the number of regular expressions we use
-if we know that if there's a '(' immediately to the right of
-a symbol then it's probably a function call"
- :group 'dumb-jump
- :type
- '(repeat
- (plist
- :options ((:language (string :tag "Language"))
- (:type (choice (const "function")
- (const "variable")))
- (:left (choice (const :tag "Anything" nil)
- (string :tag "Regular expression")))
- (:right (choice (const :tag "Anything" nil)
- (string :tag "Regular expression")))))))
-
-(defcustom dumb-jump-project-denoters
- '(".dumbjump" ".projectile" ".git" ".hg" ".fslckout" ".bzr" "_darcs" ".svn" "Makefile" "PkgInfo" "-pkg.el")
- "Files and directories that signify a directory is a project root."
- :group 'dumb-jump
- :type '(repeat (string :tag "Name")))
-
-(defcustom dumb-jump-default-project "~"
- "The default project to search within if a project root is not found."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-project nil
- "The project to search within if normal denoters will not work. This should only be needed in the rarest of cases."
- :group 'dumb-jump
- :type 'string)
-
-(defcustom dumb-jump-before-jump-hook nil
- "Hooks called before jumping."
- :type 'hook
- :group 'dumb-jump
- :type 'hook)
-
-(defcustom dumb-jump-after-jump-hook nil
- "Hooks called after jumping."
- :type 'hook
- :group 'dumb-jump
- :type 'hook)
-
-(defcustom dumb-jump-aggressive
- nil
- "If `t` jump aggressively with the possibility of a false positive.
-If `nil` always show list of more than 1 match."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-debug
- nil
- "If `t` will print helpful debug information."
- :group 'dumb-jump
- :type 'boolean)
-
-(defcustom dumb-jump-confirm-jump-to-modified-file
- t
- "If t, confirm before jumping to a modified file (which may lead to an
-inaccurate jump). If nil, jump without confirmation but print a warning."
- :group 'dumb-jump
- :type 'boolean)
-
-(defun dumb-jump-message-prin1 (str &rest args)
- "Helper function when debugging apply STR 'prin1-to-string' to all ARGS."
- (apply 'message str (-map 'prin1-to-string args)))
-
-(defvar dumb-jump--ag-installed? 'unset)
-(defun dumb-jump-ag-installed? ()
- "Return t if ag is installed."
- (if (eq dumb-jump--ag-installed? 'unset)
- (setq dumb-jump--ag-installed?
- (s-contains? "ag version" (shell-command-to-string (concat dumb-jump-ag-cmd " --version"))))
- dumb-jump--ag-installed?))
-
-(defvar dumb-jump--git-grep-plus-ag-installed? 'unset)
-(defun dumb-jump-git-grep-plus-ag-installed? ()
- "Return t if git grep and ag is installed."
- (if (eq dumb-jump--git-grep-plus-ag-installed? 'unset)
- (setq dumb-jump--git-grep-plus-ag-installed?
- (and (dumb-jump-git-grep-installed?) (dumb-jump-ag-installed?)))
- dumb-jump--git-grep-plus-ag-installed?))
-
-(defvar dumb-jump--rg-installed? 'unset)
-(defun dumb-jump-rg-installed? ()
- "Return t if rg is installed."
- (if (eq dumb-jump--rg-installed? 'unset)
- (setq dumb-jump--rg-installed?
- (let ((result (s-match "ripgrep \\([0-9]+\\)\\.\\([0-9]+\\).*"
- (shell-command-to-string (concat dumb-jump-rg-cmd " --version")))))
- (when (equal (length result) 3)
- (let ((major (string-to-number (nth 1 result)))
- (minor (string-to-number (nth 2 result))))
- (or
- (and (= major 0) (>= minor 10))
- (>= major 1))))))
- dumb-jump--rg-installed?))
-
-(defvar dumb-jump--git-grep-installed? 'unset)
-(defun dumb-jump-git-grep-installed? ()
- "Return t if git-grep is installed."
- (if (eq dumb-jump--git-grep-installed? 'unset)
- (setq dumb-jump--git-grep-installed?
- (s-contains? "fatal: no pattern given"
- (shell-command-to-string (concat dumb-jump-git-grep-cmd))))
- dumb-jump--git-grep-installed?))
-
-(defvar dumb-jump--grep-installed? 'unset)
-(defun dumb-jump-grep-installed? ()
- "Return 'gnu if GNU grep is installed, 'bsd if BSD grep is installed, and nil otherwise."
- (if (eq dumb-jump--grep-installed? 'unset)
- (let* ((version (shell-command-to-string (concat dumb-jump-grep-cmd " --version")))
- (variant (cond ((s-match "GNU grep" version) 'gnu)
- ((s-match "[0-9]+\\.[0-9]+" version) 'bsd)
- (t nil))))
- (setq dumb-jump--grep-installed? variant))
- dumb-jump--grep-installed?))
-
-(defun dumb-jump-find-start-pos (line-in look-for cur-pos)
- "Find start column position for LINE-IN of LOOK-FOR using CUR-POS as a hint."
- (let ((is-found nil)
- (line (s-replace "\t" (s-repeat tab-width " ") line-in)))
- (while (and (> cur-pos 0) (not is-found))
- (let* ((char (substring line cur-pos (1+ cur-pos)))
- (is-at (s-index-of char look-for)))
- (if (null is-at)
- (setq is-found t)
- (setq cur-pos (1- cur-pos)))))
- (1+ cur-pos)))
-
-(defun dumb-jump-run-test (test cmd)
- "Use TEST as the standard input for the CMD."
- (with-temp-buffer
- (insert test)
- (shell-command-on-region (point-min) (point-max) cmd nil t)
- (buffer-substring-no-properties (point-min) (point-max))))
-
-(defun dumb-jump-run-test-temp-file (test thefile realcmd)
- "Write content to the temporary file, run cmd on it, return result"
- (with-temp-buffer
- (insert test)
- (write-file thefile nil)
- (delete-region (point-min) (point-max))
- (shell-command realcmd t)
- (delete-file thefile)
- (buffer-substring-no-properties (point-min) (point-max))))
-
-(defun dumb-jump-run-git-grep-test (test cmd)
- "Use string TEST as input through a local, temporary file for CMD.
-Because git grep must be given a file as input, not just a string."
- (let ((thefile ".git.grep.test"))
- (dumb-jump-run-test-temp-file test thefile (concat cmd " " thefile))))
-
-(defun dumb-jump-run-ag-test (test cmd)
- "Use TEST as input, but first write it into temporary file
-and then run ag on it. The difference is that ag ignores multiline
-matches when passed input from stdin, which is a crucial feature."
- (let ((thefile ".ag.test"))
- (dumb-jump-run-test-temp-file test thefile (concat cmd " " thefile))))
-
-(defun dumb-jump-test-grep-rules (&optional run-not-tests)
- "Test all the grep rules and return count of those that fail.
-Optionally pass t for RUN-NOT-TESTS to see a list of all failed rules."
- (let ((fail-tmpl "grep FAILURE '%s' %s in response '%s' | CMD: '%s' | rule: '%s'")
- (variant (if (eq (dumb-jump-grep-installed?) 'gnu) 'gnu-grep 'grep)))
- (-mapcat
- (lambda (rule)
- (-mapcat
- (lambda (test)
- (let* ((cmd (concat "grep -En -e "
- (shell-quote-argument (dumb-jump-populate-regex (plist-get rule :regex) "test" variant))))
- (resp (dumb-jump-run-test test cmd)))
- (when (or
- (and (not run-not-tests) (not (s-contains? test resp)))
- (and run-not-tests (> (length resp) 0)))
- (list (format fail-tmpl (if run-not-tests "not" "")
- test (if run-not-tests "IS unexpectedly" "NOT") resp cmd (plist-get rule :regex))))))
- (plist-get rule (if run-not-tests :not :tests))))
- (--filter (member "grep" (plist-get it :supports)) dumb-jump-find-rules))))
-
-(defun dumb-jump-test-ag-rules (&optional run-not-tests)
- "Test all the ag rules and return count of those that fail.
-Optionally pass t for RUN-NOT-TESTS to see a list of all failed rules"
- (let ((fail-tmpl "ag FAILURE '%s' %s in response '%s' | CMD: '%s' | rule: '%s'"))
- (-mapcat
- (lambda (rule)
- (-mapcat
- (lambda (test)
- (let* ((cmd (concat "ag --nocolor --nogroup --nonumber "
- (shell-quote-argument (dumb-jump-populate-regex (plist-get rule :regex) "test" 'ag))))
- (resp (dumb-jump-run-ag-test test cmd)))
- (when (or
- (and (not run-not-tests) (not (s-contains? test resp)))
- (and run-not-tests (> (length resp) 0)))
- (list (format fail-tmpl test (if run-not-tests "IS unexpectedly" "NOT") resp cmd rule)))))
- (plist-get rule (if run-not-tests :not :tests))))
- (--filter (member "ag" (plist-get it :supports)) dumb-jump-find-rules))))
-
-(defun dumb-jump-test-rg-rules (&optional run-not-tests)
- "Test all the rg rules and return count of those that fail.
-Optionally pass t for RUN-NOT-TESTS to see a list of all failed rules"
- (let ((fail-tmpl "rg FAILURE '%s' %s in response '%s' | CMD: '%s' | rule: '%s'"))
- (-mapcat
- (lambda (rule)
- (-mapcat
- (lambda (test)
- (let* ((cmd (concat "rg --color never --no-heading -U --pcre2 "
- (shell-quote-argument (dumb-jump-populate-regex (plist-get rule :regex) "test" 'rg))))
- (resp (dumb-jump-run-test test cmd)))
- (when (or
- (and (not run-not-tests) (not (s-contains? test resp)))
- (and run-not-tests (> (length resp) 0)))
- (list (format fail-tmpl test (if run-not-tests "IS unexpectedly" "NOT") resp cmd rule)))))
- (plist-get rule (if run-not-tests :not :tests))))
- (--filter (member "rg" (plist-get it :supports)) dumb-jump-find-rules))))
-
-(defun dumb-jump-test-git-grep-rules (&optional run-not-tests)
- "Test all the git grep rules and return count of those that fail.
-Optionally pass t for RUN-NOT-TESTS to see a list of all failed rules"
- (let ((fail-tmpl "rg FAILURE '%s' %s in response '%s' | CMD: '%s' | rule: '%s'"))
- (-mapcat
- (lambda (rule)
- (-mapcat
- (lambda (test)
- (let* ((cmd (concat "git grep --color=never -h --untracked -E "
- (shell-quote-argument (dumb-jump-populate-regex (plist-get rule :regex) "test" 'git-grep))))
- (resp (dumb-jump-run-git-grep-test test cmd)))
- (when (or
- (and (not run-not-tests) (not (s-contains? test resp)))
- (and run-not-tests (> (length resp) 0)))
- (list (format fail-tmpl test (if run-not-tests "IS unexpectedly" "NOT") resp cmd rule)))))
- (plist-get rule (if run-not-tests :not :tests))))
- (--filter (member "grep" (plist-get it :supports)) dumb-jump-find-rules))))
-
-(defun dumb-jump-message (str &rest args)
- "Log message STR with ARGS to the *Messages* buffer if not using dumb-jump-quiet."
- (when (not dumb-jump-quiet)
- (apply 'message str args))
- nil)
-
-(defmacro dumb-jump-debug-message (&rest exprs)
- "Generate a debug message to print all expressions EXPRS."
- (declare (indent defun))
- (let ((i 5) frames frame)
- ;; based on https://emacs.stackexchange.com/a/2312
- (while (setq frame (backtrace-frame i))
- (push frame frames)
- (cl-incf i))
- ;; this is a macro-expanded version of the code in the stackexchange
- ;; code from above. This version should work on emacs-24.3, since it
- ;; doesn't depend on thread-last.
- (let* ((frame (cl-find-if
- (lambda (frame)
- (ignore-errors
- (and (car frame)
- (eq (caaddr frame)
- 'defalias))))
- (reverse frames)))
- (func (cl-cadadr (cl-caddr frame)))
- (defun-name (symbol-name func)))
- (with-temp-buffer
- (insert "DUMB JUMP DEBUG `")
- (insert defun-name)
- (insert "` START\n----\n\n")
- (dolist (expr exprs)
- (insert (prin1-to-string expr) ":\n\t%s\n\n"))
- (insert "\n-----\nDUMB JUMP DEBUG `")
- (insert defun-name)
- (insert "` END\n-----")
- `(when dumb-jump-debug
- (dumb-jump-message
- ,(buffer-string)
- ,@exprs))))))
-
-(defun dumb-jump-get-point-context (line func cur-pos)
- "Get the LINE context to the left and right of FUNC using CUR-POS as hint."
- (let* ((loc (dumb-jump-find-start-pos line func cur-pos))
- (func-len (length func))
- (sen-len (length line))
- (right-loc-start (+ loc func-len))
- (right-loc-end (length line))
- (left (substring line 0 loc))
- (right (if (> right-loc-end sen-len)
- ""
- (substring line right-loc-start right-loc-end))))
- `(:left ,left :right ,right)))
-
-(defun dumb-jump-to-selected (results choices selected)
- "With RESULTS use CHOICES to find the SELECTED choice from multiple options."
- (let* ((result-index (--find-index (string= selected it) choices))
- (result (when result-index
- (nth result-index results))))
- (when result
- (dumb-jump-result-follow result))))
-
-(defun dumb-jump-helm-persist-action (candidate)
- "Previews CANDIDATE in a temporary buffer displaying the file at the matched line.
-\\<helm-map>
-This is the persistent action (\\[helm-execute-persistent-action]) for helm."
- (let* ((file (plist-get candidate :path))
- (line (plist-get candidate :line))
- (default-directory-old default-directory))
- (switch-to-buffer (get-buffer-create " *helm dumb jump persistent*"))
- (setq default-directory default-directory-old)
- (fundamental-mode)
- (erase-buffer)
- (insert-file-contents file)
- (let ((buffer-file-name file))
- (set-auto-mode)
- (font-lock-fontify-region (point-min) (point-max))
- (goto-char (point-min))
- (forward-line (1- line)))))
-
-(defun dumb-jump--format-result (proj result)
- (format "%s:%s: %s"
- (s-replace proj "" (plist-get result :path))
- (plist-get result :line)
- (s-trim (plist-get result :context))))
-
-(defun dumb-jump-ivy-jump-to-selected (results choices _proj)
- "Offer CHOICES as candidates through `ivy-read', then execute
-`dumb-jump-result-follow' on the selected choice. Ignore _PROJ."
- (ivy-read "Jump to: " (-zip choices results)
- :action (lambda (cand)
- (dumb-jump-result-follow (cdr cand)))
- :caller 'dumb-jump-ivy-jump-to-selected))
-
-(defun dumb-jump-prompt-user-for-choice (proj results)
- "Put a PROJ's list of RESULTS in a 'popup-menu' (or helm/ivy)
-for user to select. Filters PROJ path from files for display."
- (let ((choices (--map (dumb-jump--format-result proj it) results)))
- (cond
- ((eq dumb-jump-selector 'completing-read)
- (dumb-jump-to-selected results choices (completing-read "Jump to: " choices)))
- ((and (eq dumb-jump-selector 'ivy) (fboundp 'ivy-read))
- (funcall dumb-jump-ivy-jump-to-selected-function results choices proj))
- ((and (eq dumb-jump-selector 'helm) (fboundp 'helm))
- (helm :sources
- (helm-build-sync-source "Jump to: "
- :action '(("Jump to match" . dumb-jump-result-follow))
- :candidates (-zip choices results)
- :persistent-action 'dumb-jump-helm-persist-action)
- :buffer "*helm dumb jump choices*"))
- (t
- (dumb-jump-to-selected results choices (popup-menu* choices))))))
-
-(defun dumb-jump-get-project-root (filepath)
- "Keep looking at the parent dir of FILEPATH until a denoter file/dir is found."
- (s-chop-suffix
- "/"
- (expand-file-name
- (or
- dumb-jump-project
- (locate-dominating-file filepath #'dumb-jump-get-config)
- dumb-jump-default-project))))
-
-(defun dumb-jump-get-config (dir)
- "If a project denoter is in DIR then return it, otherwise
-nil. However, if DIR contains a `.dumbjumpignore' it returns nil
-to keep looking for another root."
- (if (file-exists-p (expand-file-name ".dumbjumpignore" dir))
- nil
- (car (--filter
- (file-exists-p (expand-file-name it dir))
- dumb-jump-project-denoters))))
-
-(defun dumb-jump-get-language (file)
- "Get language from FILE extension and then fallback to using 'major-mode' name."
- (let* ((languages (-distinct
- (--map (plist-get it :language)
- dumb-jump-find-rules)))
- (language (or (dumb-jump-get-language-from-mode)
- (dumb-jump-get-language-by-filename file)
- (dumb-jump-get-mode-base-name))))
- (if (member language languages)
- language
- (format ".%s file" (or (file-name-extension file) "")))))
-
-(defun dumb-jump-get-mode-base-name ()
- "Get the base name of the mode."
- (s-replace "-mode" "" (symbol-name major-mode)))
-
-(defun dumb-jump-get-language-from-mode ()
- "Extract the language from the 'major-mode' name. Currently just everything before '-mode'."
- (let* ((lookup '(sh "shell" cperl "perl" matlab "matlab" octave "matlab"))
- (m (dumb-jump-get-mode-base-name))
- (result (plist-get lookup (intern m))))
- result))
-
-
-(defun dumb-jump-get-language-by-filename (file)
- "Get the programming language from the FILE."
- (let* ((filename (if (s-ends-with? ".gz" file)
- (file-name-sans-extension file)
- file))
- (result (--filter
- (s-ends-with? (concat "." (plist-get it :ext)) filename)
- dumb-jump-language-file-exts)))
- (when result
- (plist-get (car result) :language))))
-
-(defun dumb-jump-issue-result (issue)
- "Return a result property list with the ISSUE set as :issue property symbol."
- `(:results nil :lang nil :symbol nil :ctx-type nil :file nil :root nil :issue ,(intern issue)))
-
-(defun dumb-jump-get-results (&optional prompt)
- "Run dumb-jump-fetch-results if searcher installed, buffer is saved, and there's a symbol under point."
- (cond
- ((not (or (dumb-jump-ag-installed?)
- (dumb-jump-rg-installed?)
- (dumb-jump-git-grep-installed?)
- (dumb-jump-grep-installed?)))
- (dumb-jump-issue-result "nogrep"))
- ((or (string= (buffer-name) "*shell*")
- (string= (buffer-name) "*eshell*"))
- (dumb-jump-fetch-shell-results prompt))
- ((and (not prompt) (not (region-active-p)) (not (thing-at-point 'symbol)))
- (dumb-jump-issue-result "nosymbol"))
- (t
- (dumb-jump-fetch-file-results prompt))))
-
-(defun dumb-jump-fetch-shell-results (&optional prompt)
- (let* ((cur-file (buffer-name))
- (proj-root (dumb-jump-get-project-root default-directory))
- (proj-config (dumb-jump-get-config proj-root))
- (config (when (s-ends-with? ".dumbjump" proj-config)
- (dumb-jump-read-config proj-root proj-config)))
- (lang (or (plist-get config :language)
- (car (dumb-jump-get-lang-by-shell-contents (buffer-name))))))
- (dumb-jump-fetch-results cur-file proj-root lang config prompt)))
-
-(defun dumb-jump-fetch-file-results (&optional prompt)
- (let* ((cur-file (or (buffer-file-name) ""))
- (proj-root (dumb-jump-get-project-root cur-file))
- (proj-config (dumb-jump-get-config proj-root))
- (config (when (s-ends-with? ".dumbjump" proj-config)
- (dumb-jump-read-config proj-root proj-config)))
- (lang (or (plist-get config :language)
- (dumb-jump-get-language cur-file))))
- (dumb-jump-fetch-results cur-file proj-root lang config prompt)))
-
-(defun dumb-jump-process-symbol-by-lang (lang look-for)
- "Process LANG's LOOK-FOR. For instance, clojure needs namespace part removed."
- (cond
- ((and (string= lang "clojure") (s-contains? "/" look-for))
- (nth 1 (s-split "/" look-for)))
- ((and (string= lang "ruby") (s-contains? "::" look-for))
- (-last-item (s-split "::" look-for)))
- ((and (or (string= lang "ruby") (string= lang "crystal")) (s-starts-with? ":" look-for))
- (s-chop-prefix ":" look-for))
- ((and (string= lang "systemverilog") (s-starts-with? "`" look-for))
- (s-chop-prefix "`" look-for))
- (t
- look-for)))
-
-(defun dumb-jump-get-point-line ()
- "Get line at point."
- (if (version< emacs-version "24.4")
- (thing-at-point 'line)
- (thing-at-point 'line t)))
-
-(defun dumb-jump-get-point-symbol ()
- "Get symbol at point."
- (if (region-active-p)
- (buffer-substring-no-properties (region-beginning) (region-end))
- (if (version< emacs-version "24.4")
- (thing-at-point 'symbol)
- (thing-at-point 'symbol t))))
-
-(defun dumb-jump-get-lang-by-shell-contents (buffer)
- "Return languages in BUFFER by checking if file extension is mentioned."
- (let* ((buffer-contents (with-current-buffer buffer
- (buffer-string)))
-
- (found (--filter (s-match (concat "\\." (plist-get it :ext) "\\b") buffer-contents)
- dumb-jump-language-file-exts)))
- (--map (plist-get it :language) found)))
-
-(defun dumb-jump-fetch-results (cur-file proj-root lang config &optional prompt)
- "Return a list of results based on current file context and calling grep/ag.
-CUR-FILE is the path of the current buffer.
-PROJ-ROOT is that file's root project directory.
-LANG is a string programming language with CONFIG a property list
-of project configuration."
- (let* ((cur-line (if prompt 0 (dumb-jump-get-point-line)))
- (look-for-start (when (not prompt)
- (- (car (bounds-of-thing-at-point 'symbol))
- (point-at-bol))))
- (cur-line-num (line-number-at-pos))
- (proj-config (dumb-jump-get-config proj-root))
- (config (when (s-ends-with? ".dumbjump" proj-config)
- (dumb-jump-read-config proj-root proj-config)))
- (found-symbol (or prompt (dumb-jump-get-point-symbol)))
- (look-for (or prompt (dumb-jump-process-symbol-by-lang lang found-symbol)))
- (pt-ctx (or (and prompt (get-text-property 0 :dumb-jump-ctx prompt))
- (if (and (not prompt) (not (string= cur-line look-for)))
- (dumb-jump-get-point-context cur-line look-for look-for-start)
- nil)))
- (ctx-type
- (dumb-jump-get-ctx-type-by-language lang pt-ctx))
-
- (gen-funcs (dumb-jump-pick-grep-variant proj-root))
- (parse-fn (plist-get gen-funcs :parse))
- (generate-fn (plist-get gen-funcs :generate))
- (searcher (plist-get gen-funcs :searcher))
-
- (regexes (dumb-jump-get-contextual-regexes lang ctx-type searcher))
-
- (exclude-paths (when config (plist-get config :exclude)))
- (include-paths (when config (plist-get config :include)))
- ; we will search proj root and all include paths
- (search-paths (-distinct (-concat (list proj-root) include-paths)))
- ; run command for all
- (raw-results (--mapcat
- ;; TODO: should only pass exclude paths to actual project root
- (dumb-jump-run-command look-for it regexes lang exclude-paths cur-file
- cur-line-num parse-fn generate-fn)
- search-paths))
-
- (results (delete-dups (--map (plist-put it :target look-for) raw-results))))
-
- `(:results ,results :lang ,(if (null lang) "" lang) :symbol ,look-for :ctx-type ,(if (null ctx-type) "" ctx-type) :file ,cur-file :root ,proj-root)))
-
-;;;###autoload
-(defun dumb-jump-back ()
- "Jump back to where the last jump was done."
- (interactive)
- (with-demoted-errors "Error running `dumb-jump-before-jump-hook': %S"
- (run-hooks 'dumb-jump-before-jump-hook))
- (pop-tag-mark)
- (with-demoted-errors "Error running `dumb-jump-after-jump-hook': %S"
- (run-hooks 'dumb-jump-after-jump-hook)))
-
-;;;###autoload
-(defun dumb-jump-quick-look ()
- "Run dumb-jump-go in quick look mode. That is, show a tooltip of where it would jump instead."
- (interactive)
- (dumb-jump-go t))
-
-;;;###autoload
-(defun dumb-jump-go-other-window ()
- "Like 'dumb-jump-go' but use 'find-file-other-window' instead of 'find-file'."
- (interactive)
- (let ((dumb-jump-window 'other))
- (dumb-jump-go)))
-
-;;;###autoload
-(defun dumb-jump-go-current-window ()
- "Like dumb-jump-go but always use 'find-file'."
- (interactive)
- (let ((dumb-jump-window 'current))
- (dumb-jump-go)))
-
-;;;###autoload
-(defun dumb-jump-go-prefer-external ()
- "Like dumb-jump-go but prefer external matches from the current file."
- (interactive)
- (dumb-jump-go nil t))
-
-;;;###autoload
-(defun dumb-jump-go-prompt ()
- "Like dumb-jump-go but prompts for function instead of using under point"
- (interactive)
- (dumb-jump-go nil nil (read-from-minibuffer "Jump to: ")))
-
-;;;###autoload
-(defun dumb-jump-go-prefer-external-other-window ()
- "Like dumb-jump-go-prefer-external but use 'find-file-other-window' instead of 'find-file'."
- (interactive)
- (let ((dumb-jump-window 'other))
- (dumb-jump-go-prefer-external)))
-
-;;;###autoload
-(defun dumb-jump-go (&optional use-tooltip prefer-external prompt)
- "Go to the function/variable declaration for thing at point.
-When USE-TOOLTIP is t a tooltip jump preview will show instead.
-When PREFER-EXTERNAL is t it will sort external matches before
-current file."
- (interactive "P")
- (let* ((start-time (float-time))
- (info (dumb-jump-get-results prompt))
- (end-time (float-time))
- (fetch-time (- end-time start-time))
- (results (plist-get info :results))
- (look-for (or prompt (plist-get info :symbol)))
- (proj-root (plist-get info :root))
- (issue (plist-get info :issue))
- (lang (plist-get info :lang))
- (result-count (length results)))
- (when (> fetch-time dumb-jump-max-find-time)
- (dumb-jump-message
- "Took over %ss to find '%s'. Please install ag or rg, or add a .dumbjump file to '%s' with path exclusions"
- (number-to-string dumb-jump-max-find-time) look-for proj-root))
- (cond
- ((eq issue 'nogrep)
- (dumb-jump-message "Please install ag, rg, git grep or grep!"))
- ((eq issue 'nosymbol)
- (dumb-jump-message "No symbol under point."))
- ((s-ends-with? " file" lang)
- (dumb-jump-message "Could not find rules for '%s'." lang))
- ((= result-count 1)
- (dumb-jump-result-follow (car results) use-tooltip proj-root))
- ((> result-count 1)
- ;; multiple results so let the user pick from a list
- ;; unless the match is in the current file
- (dumb-jump-handle-results results (plist-get info :file) proj-root (plist-get info :ctx-type)
- look-for use-tooltip prefer-external))
- ((= result-count 0)
- (dumb-jump-message "'%s' %s %s declaration not found." look-for (if (s-blank? lang) "with unknown language so" lang) (plist-get info :ctx-type))))))
-
-(defcustom dumb-jump-language-comments
- '((:comment "//" :language "c++")
- (:comment ";" :language "elisp")
- (:comment ";" :language "commonlisp")
- (:comment "//" :language "javascript")
- (:comment "//" :language "typescript")
- (:comment "//" :language "dart")
- (:comment "--" :language "haskell")
- (:comment "--" :language "lua")
- (:comment "//" :language "rust")
- (:comment "#" :language "julia")
- (:comment "//" :language "objc")
- (:comment "//" :language "csharp")
- (:comment "//" :language "java")
- (:comment ";" :language "clojure")
- (:comment "#" :language "coffeescript")
- (:comment "//" :language "faust")
- (:comment "!" :language "fortran")
- (:comment "//" :language "go")
- (:comment "//" :language "zig")
- (:comment "#" :language "perl")
- (:comment "//" :language "php")
- (:comment "#" :language "python")
- (:comment "%" :language "matlab")
- (:comment "#" :language "r")
- (:comment ";" :language "racket")
- (:comment "#" :language "ruby")
- (:comment "#" :language "crystal")
- (:comment "#" :language "nim")
- (:comment "#" :language "nix")
- (:comment "//" :language "scala")
- (:comment ";" :language "scheme")
- (:comment "#" :language "shell")
- (:comment "//" :language "swift")
- (:comment "#" :language "elixir")
- (:comment "%" :language "erlang")
- (:comment "%" :language "tex")
- (:comment "//" :language "systemverilog")
- (:comment "--" :language "vhdl")
- (:comment "//" :language "scss")
- (:comment "//" :language "pascal")
- (:comment "//" :language "protobuf")
- (:comment "#" :language "hcl"))
- "List of one-line comments organized by language."
- :group 'dumb-jump
- :type
- '(repeat
- (plist
- :options ((:comment string)
- (:language string)))))
-
-(defun dumb-jump-get-comment-by-language (lang)
- "Yields the one-line comment for the given LANG."
- (let* ((entries (-distinct
- (--filter (string= (plist-get it :language) lang)
- dumb-jump-language-comments))))
- (if (= 1 (length entries))
- (plist-get (car entries) :comment)
- nil)))
-
-(defun dumb-jump-filter-no-start-comments (results lang)
- "Filter out RESULTS with a :context that starts with a comment
-given the LANG of the current file."
- (let ((comment (dumb-jump-get-comment-by-language lang)))
- (if comment
- (-concat
- (--filter (not (s-starts-with? comment (s-trim (plist-get it :context)))) results))
- results)))
-
-(defun dumb-jump-handle-results
- (results cur-file proj-root ctx-type look-for use-tooltip prefer-external)
- "Handle the searchers results.
-RESULTS is a list of property lists with the searcher's results.
-CUR-FILE is the current file within PROJ-ROOT.
-CTX-TYPE is a string of the current context.
-LOOK-FOR is the symbol we're jumping for.
-USE-TOOLTIP shows a preview instead of jumping.
-PREFER-EXTERNAL will sort current file last."
- (let* ((processed (dumb-jump-process-results results cur-file proj-root ctx-type look-for use-tooltip prefer-external))
- (results (plist-get processed :results))
- (do-var-jump (plist-get processed :do-var-jump))
- (var-to-jump (plist-get processed :var-to-jump))
- (match-cur-file-front (plist-get processed :match-cur-file-front)))
- (dumb-jump-debug-message
- look-for
- ctx-type
- var-to-jump
- (pp-to-string match-cur-file-front)
- (pp-to-string results)
- prefer-external
- proj-root
- cur-file)
- (cond
- (use-tooltip ;; quick-look mode
- (popup-menu* (--map (dumb-jump--format-result proj-root it) results)))
- (do-var-jump
- (dumb-jump-result-follow var-to-jump use-tooltip proj-root))
- (t
- (dumb-jump-prompt-user-for-choice proj-root match-cur-file-front)))))
-
-(defun dumb-jump-process-results
- (results cur-file proj-root ctx-type look-for use-tooltip prefer-external)
- "Process (filter, sort, ...) the searchers results.
-RESULTS is a list of property lists with the searcher's results.
-CUR-FILE is the current file within PROJ-ROOT.
-CTX-TYPE is a string of the current context.
-LOOK-FOR is the symbol we're jumping for.
-USE-TOOLTIP shows a preview instead of jumping.
-PREFER-EXTERNAL will sort current file last."
- "Figure which of the RESULTS to jump to. Favoring the CUR-FILE"
- (let* ((lang (dumb-jump-get-language-by-filename cur-file))
- (match-sorted (-sort (lambda (x y) (< (plist-get x :diff) (plist-get y :diff))) results))
- (match-no-comments (dumb-jump-filter-no-start-comments match-sorted lang))
-
- ;; Find the relative current file path by the project root. In some cases the results will
- ;; not be absolute but relative and the "current file" filters must match in both
- ;; cases. Also works when current file is in an arbitrary sub folder.
- (rel-cur-file
- (cond ((and (s-starts-with? proj-root cur-file)
- (s-starts-with? default-directory cur-file))
- (substring cur-file (length default-directory) (length cur-file)))
-
- ((and (s-starts-with? proj-root cur-file)
- (not (s-starts-with? default-directory cur-file)))
- (substring cur-file (1+ (length proj-root)) (length cur-file)))
-
- (t
- cur-file)))
-
- ;; Moves current file results to the front of the list, unless PREFER-EXTERNAL then put
- ;; them last.
- (match-cur-file-front
- (if (not prefer-external)
- (-concat
- (--filter (and (> (plist-get it :diff) 0)
- (or (string= (plist-get it :path) cur-file)
- (string= (plist-get it :path) rel-cur-file)))
- match-no-comments)
- (--filter (and (<= (plist-get it :diff) 0)
- (or (string= (plist-get it :path) cur-file)
- (string= (plist-get it :path) rel-cur-file)))
- match-no-comments)
-
- ;; Sort non-current files by path length so the nearest file is more likely to be
- ;; sorted higher to the top. Also sorts by line number for sanity.
- (-sort (lambda (x y)
- (and (< (plist-get x :line) (plist-get y :line))
- (< (length (plist-get x :path)) (length (plist-get y :path)))))
- (--filter (not (or (string= (plist-get it :path) cur-file)
- (string= (plist-get it :path) rel-cur-file)))
- match-no-comments)))
- (-concat
- (-sort (lambda (x y)
- (and (< (plist-get x :line) (plist-get y :line))
- (< (length (plist-get x :path)) (length (plist-get y :path)))))
- (--filter (not (or (string= (plist-get it :path) cur-file)
- (string= (plist-get it :path) rel-cur-file)))
- match-no-comments))
- (--filter (or (string= (plist-get it :path) cur-file)
- (string= (plist-get it :path) rel-cur-file))
- match-no-comments))))
-
- (matches
- (if (not prefer-external)
- (-distinct
- (append (dumb-jump-current-file-results cur-file match-cur-file-front)
- (dumb-jump-current-file-results rel-cur-file match-cur-file-front)))
- match-cur-file-front))
-
- (var-to-jump (car matches))
- ;; TODO: handle if ctx-type is null but ALL results are variable
-
- ;; When non-aggressive it should only jump when there is only one match, regardless of
- ;; context.
- (do-var-jump
- (and (or dumb-jump-aggressive
- (= (length match-cur-file-front) 1))
- (or (= (length matches) 1)
- (string= ctx-type "variable")
- (string= ctx-type ""))
- var-to-jump)))
-
- (list :results results
- :do-var-jump do-var-jump
- :var-to-jump var-to-jump
- :match-cur-file-front match-cur-file-front)))
-
-(defun dumb-jump-read-config (root config-file)
- "Load and return options (exclusions, inclusions, etc).
-Ffrom the ROOT project CONFIG-FILE."
- (with-temp-buffer
- (insert-file-contents (expand-file-name config-file root))
- (let ((local-root (if (file-remote-p root)
- (tramp-file-name-localname
- (tramp-dissect-file-name root))
- root))
- include exclude lang)
- (while (not (eobp))
- (cond ((looking-at "^language \\\(.+\\\)")
- (setq lang (match-string 1)))
- ((looking-at "^\\+\\(.+\\)")
- (push (expand-file-name (match-string 1) local-root)
- include))
- ((looking-at "^-/?\\(.+\\)")
- (push (expand-file-name (match-string 1) local-root)
- exclude)))
- (forward-line))
- (list :exclude (nreverse exclude)
- :include (nreverse include)
- :language lang))))
-
-(defun dumb-jump-file-modified-p (path)
- "Check if PATH is currently open in Emacs and has a modified buffer."
- (let ((modified-file-buffers
- (--filter
- (and (buffer-modified-p it)
- (buffer-file-name it)
- (file-exists-p (buffer-file-name it))
- (file-equal-p (buffer-file-name it) path))
- (buffer-list))))))
-
-(defun dumb-jump-result-follow (result &optional use-tooltip proj)
- "Take the RESULT to jump to and record the jump, for jumping back, and then trigger jump. If dumb-jump-confirm-jump-to-modified-file is t, prompt if we should continue if destination has been modified. If it is nil, display a warning."
- (if (dumb-jump-file-modified-p (plist-get result :path))
- (let ((target-file (plist-get result :path)))
- (if dumb-jump-confirm-jump-to-modified-file
- (when (y-or-n-p (concat target-file " has been modified so we may have the wrong location. Continue?"))
- (dumb-jump--result-follow result use-tooltip proj))
- (progn (message
- "Warning: %s has been modified so we may have the wrong location."
- target-file)
- (dumb-jump--result-follow result use-tooltip proj))))
- (dumb-jump--result-follow result use-tooltip proj)))
-
-(defun dumb-jump--result-follow (result &optional use-tooltip proj)
- "Take the RESULT to jump to and record the jump, for jumping back, and then trigger jump."
- (let* ((target-boundary (s-matched-positions-all
- (concat "\\b" (regexp-quote (plist-get result :target)) "\\b")
- (plist-get result :context)))
- ;; column pos is either via tpos from ag or by using the regex above or last using old s-index-of
- (pos (if target-boundary
- (car (car target-boundary))
- (s-index-of (plist-get result :target) (plist-get result :context))))
-
- (result-path (plist-get result :path))
-
- ;; Return value is either a string like "/ssh:user@1.2.3.4:" or nil
- (tramp-path-prefix (file-remote-p default-directory))
-
- ;; If result-path is an absolute path, the prefix is added to the head of it,
- ;; or result-path is added to the end of default-directory
- (path-for-tramp (when (and result-path tramp-path-prefix)
- (if (file-name-absolute-p result-path)
- (concat tramp-path-prefix result-path)
- (concat default-directory result-path))))
-
- (thef (or path-for-tramp result-path))
- (line (plist-get result :line)))
- (when thef
- (if use-tooltip
- (popup-tip (dumb-jump--format-result proj result))
- (dumb-jump-goto-file-line thef line pos)))
- ;; return the file for test
- thef))
-
-
-(defun dumb-jump-goto-file-line (thefile theline pos)
- "Open THEFILE and go line THELINE"
- (if (fboundp 'xref-push-marker-stack)
- (xref-push-marker-stack)
- (ring-insert find-tag-marker-ring (point-marker)))
-
- (with-demoted-errors "Error running `dumb-jump-before-jump-hook': %S"
- (run-hooks 'dumb-jump-before-jump-hook))
-
- (let* ((visible-buffer (find-buffer-visiting thefile))
- (visible-window (when visible-buffer (get-buffer-window visible-buffer))))
- (cond
- ((and visible-window dumb-jump-use-visible-window)
- (select-window visible-window))
- ((eq dumb-jump-window 'other)
- (find-file-other-window thefile))
- (t (find-file thefile))))
-
- (goto-char (point-min))
- (forward-line (1- theline))
- (forward-char pos)
- (with-demoted-errors "Error running `dumb-jump-after-jump-hook': %S"
- (run-hooks 'dumb-jump-after-jump-hook)))
-
-(defun dumb-jump-current-file-results (path results)
- "Return the PATH's RESULTS."
- (let ((matched (--filter (string= path (plist-get it :path)) results)))
- matched))
-
-(defun dumb-jump-generators-by-searcher (searcher)
- "For a SEARCHER it yields a response parser, a command
-generator function, an installed? function, and the corresponding
-searcher symbol."
- (cond ((equal 'git-grep searcher)
- `(:parse ,'dumb-jump-parse-git-grep-response
- :generate ,'dumb-jump-generate-git-grep-command
- :installed ,'dumb-jump-git-grep-installed?
- :searcher ,searcher))
- ((equal 'ag searcher)
- `(:parse ,'dumb-jump-parse-ag-response
- :generate ,'dumb-jump-generate-ag-command
- :installed ,'dumb-jump-ag-installed?
- :searcher ,searcher))
- ((equal 'git-grep-plus-ag searcher)
- `(:parse ,'dumb-jump-parse-ag-response
- :generate ,'dumb-jump-generate-git-grep-plus-ag-command
- :installed ,'dumb-jump-git-grep-plus-ag-installed?
- :searcher ,searcher))
- ((equal 'rg searcher)
- `(:parse ,'dumb-jump-parse-rg-response
- :generate ,'dumb-jump-generate-rg-command
- :installed ,'dumb-jump-rg-installed?
- :searcher ,searcher))
- ((equal 'gnu-grep searcher)
- `(:parse ,'dumb-jump-parse-grep-response
- :generate ,'dumb-jump-generate-gnu-grep-command
- :installed ,'dumb-jump-grep-installed?
- :searcher ,searcher))
- ((equal 'grep searcher)
- `(:parse ,'dumb-jump-parse-grep-response
- :generate ,'dumb-jump-generate-grep-command
- :installed ,'dumb-jump-grep-installed?
- :searcher ,searcher))))
-
-(defun dumb-jump-pick-grep-variant (&optional proj-root)
- (cond
- ;; If `dumb-jump-force-searcher' is not nil then use that searcher.
- (dumb-jump-force-searcher
- (dumb-jump-generators-by-searcher dumb-jump-force-searcher))
-
- ;; If project root has a .git then use git-grep if installed.
- ((and proj-root
- (dumb-jump-git-grep-installed?)
- (file-exists-p (expand-file-name ".git" proj-root)))
- (dumb-jump-generators-by-searcher 'git-grep))
-
- ;; If `dumb-jump-prefer-searcher' is not nil then use if installed.
- ((and dumb-jump-prefer-searcher
- (funcall (plist-get (dumb-jump-generators-by-searcher dumb-jump-prefer-searcher)
- :installed)))
- (dumb-jump-generators-by-searcher dumb-jump-prefer-searcher))
-
- ;; Fallback searcher order.
- ((dumb-jump-ag-installed?)
- (dumb-jump-generators-by-searcher 'ag))
- ((dumb-jump-rg-installed?)
- (dumb-jump-generators-by-searcher 'rg))
- ((eq (dumb-jump-grep-installed?) 'gnu)
- (dumb-jump-generators-by-searcher 'gnu-grep))
- (t
- (dumb-jump-generators-by-searcher 'grep))))
-
-(defun dumb-jump-shell-command-switch ()
- "Yields the shell command switch to use for the current
- `shell-file-name' in order to not load the shell profile/RC for
- speeding up things."
- (let ((base-name (downcase (file-name-base shell-file-name))))
- (cond
- ((or (string-equal "zsh" base-name)
- (string-equal "csh" base-name)
- (string-equal "tcsh" base-name))
- "-icf")
-
- ((string-equal "bash" base-name)
- "-c")
-
- (t
- shell-command-switch))))
-
-;; TODO: rename dumb-jump-run-definition-command
-(defun dumb-jump-run-command
- (look-for proj regexes lang exclude-args cur-file line-num parse-fn generate-fn)
- "Run the grep command based on the needle LOOK-FOR in the directory TOSEARCH"
- (let* ((proj-root (if (file-remote-p proj)
- (directory-file-name
- (tramp-file-name-localname (tramp-dissect-file-name proj)))
- proj))
- (cmd (funcall generate-fn look-for cur-file proj-root regexes lang exclude-args))
- (shell-command-switch (dumb-jump-shell-command-switch))
- (rawresults (shell-command-to-string cmd)))
-
- (dumb-jump-debug-message cmd rawresults)
- (when (and (s-blank? rawresults) dumb-jump-fallback-search)
- (setq regexes (list dumb-jump-fallback-regex))
- (setq cmd (funcall generate-fn look-for cur-file proj-root regexes lang exclude-args))
- (setq rawresults (shell-command-to-string cmd))
- (dumb-jump-debug-message cmd rawresults))
- (unless (s-blank? cmd)
- (let ((results (funcall parse-fn rawresults cur-file line-num)))
- (--filter (s-contains? look-for (plist-get it :context)) results)))))
-
-(defun dumb-jump-parse-response-line (resp-line cur-file)
- "Parse a search program's single RESP-LINE for CUR-FILE into a list of (path line context)."
- (let* ((parts (--remove (string= it "")
- (s-split "\\(?:^\\|:\\)[0-9]+:" resp-line)))
- (line-num-raw (s-match "\\(?:^\\|:\\)\\([0-9]+\\):" resp-line)))
-
- (cond
- ;; fixes rare bug where context is blank but file is defined "/somepath/file.txt:14:"
- ;; OR: (and (= (length parts) 1) (file-name-exists (nth 0 parts)))
- ((s-match ":[0-9]+:$" resp-line)
- nil)
- ((and parts line-num-raw)
- (if (= (length parts) 2)
- (list (let ((path (expand-file-name (nth 0 parts))))
- (if (file-name-absolute-p (nth 0 parts))
- path
- (file-relative-name path)))
- (nth 1 line-num-raw) (nth 1 parts))
- ; this case is when they are searching a particular file...
- (list (let ((path (expand-file-name cur-file)))
- (if (file-name-absolute-p cur-file)
- path
- (file-relative-name path)))
- (nth 1 line-num-raw) (nth 0 parts)))))))
-
-(defun dumb-jump-parse-response-lines (parsed cur-file cur-line-num)
- "Turn PARSED response lines into a list of property lists. Using CUR-FILE and CUR-LINE-NUM to exclude jump origin."
- (let* ((records (--mapcat (when it
- (let* ((line-num (string-to-number (nth 1 it)))
- (diff (- cur-line-num line-num)))
- (list `(:path ,(nth 0 it) :line ,line-num :context ,(nth 2 it) :diff ,diff))))
- parsed))
- (results (-non-nil records)))
- (--filter
- (not (and
- (string= (plist-get it :path) cur-file)
- (= (plist-get it :line) cur-line-num)))
- results)))
-
-(defun dumb-jump-parse-grep-response (resp cur-file cur-line-num)
- "Takes a grep response RESP and parses into a list of plists."
- (let* ((resp-no-warnings (--filter (and (not (s-starts-with? "grep:" it))
- (not (s-contains? "No such file or" it)))
- (s-split "\n" (s-trim resp))))
- (parsed (--map (dumb-jump-parse-response-line it cur-file) resp-no-warnings)))
- (dumb-jump-parse-response-lines parsed cur-file cur-line-num)))
-
-(defun dumb-jump-parse-ag-response (resp cur-file cur-line-num)
- "Takes a ag response RESP and parses into a list of plists."
- (let* ((resp-lines (s-split "\n" (s-trim resp)))
- (parsed (--map (dumb-jump-parse-response-line it cur-file) resp-lines)))
- (dumb-jump-parse-response-lines parsed cur-file cur-line-num)))
-
-(defun dumb-jump-parse-rg-response (resp cur-file cur-line-num)
- "Takes a rg response RESP and parses into a list of plists."
- (let* ((resp-lines (s-split "\n" (s-trim resp)))
- (parsed (--map (dumb-jump-parse-response-line it cur-file) resp-lines)))
- (dumb-jump-parse-response-lines parsed cur-file cur-line-num)))
-
-(defun dumb-jump-parse-git-grep-response (resp cur-file cur-line-num)
- "Takes a git grep response RESP and parses into a list of plists."
- (let* ((resp-lines (s-split "\n" (s-trim resp)))
- (parsed (--map (dumb-jump-parse-response-line it cur-file) resp-lines)))
- (dumb-jump-parse-response-lines parsed cur-file cur-line-num)))
-
-(defun dumb-jump-re-match (re s)
- "Does regular expression RE match string S. If RE is nil return nil."
- (when (and re s)
- (s-match re s)))
-
-(defun dumb-jump-get-ctx-type-by-language (lang pt-ctx)
- "Detect the type of context by the language LANG and its context PT-CTX."
- (let* ((contexts (--filter (string= (plist-get it ':language) lang) dumb-jump-language-contexts))
- (usable-ctxs
- (when (> (length contexts) 0)
- (--filter (and (or (null (plist-get it :left))
- (dumb-jump-re-match (plist-get it :left)
- (plist-get pt-ctx :left)))
- (or (null (plist-get it :right))
- (dumb-jump-re-match (plist-get it :right)
- (plist-get pt-ctx :right))))
- contexts)))
- (use-ctx (= (length (--filter
- (string= (plist-get it ':type)
- (and usable-ctxs (plist-get (car usable-ctxs) :type)))
- usable-ctxs))
- (length usable-ctxs))))
-
- (when (and usable-ctxs use-ctx)
- (plist-get (car usable-ctxs) :type))))
-
-(defun dumb-jump-get-ext-includes (language)
- "Generate the --include grep argument of file extensions by LANGUAGE."
- (let ((exts (dumb-jump-get-file-exts-by-language language)))
- (dumb-jump-arg-joiner
- "--include"
- (--map (format "\\*.%s" it) exts))))
-
-(defun dumb-jump-arg-joiner (prefix values)
- "Helper to generate command arg with its PREFIX for each value in VALUES."
- (let ((args (s-join (format " %s " prefix) values)))
- (if (and args values)
- (format " %s %s " prefix args)
- "")))
-
-(defun dumb-jump-get-contextual-regexes (lang ctx-type searcher)
- "Get list of search regular expressions by LANG and CTX-TYPE (variable, function, etc)."
- (let* ((raw-rules (dumb-jump-get-rules-by-language lang searcher))
- (ctx-type (unless dumb-jump-ignore-context ctx-type))
- (ctx-rules
- (if ctx-type
- (--filter (string= (plist-get it :type) ctx-type) raw-rules)
- raw-rules))
- (rules (or ctx-rules raw-rules))
- (regexes (--map (plist-get it :regex) rules)))
- regexes))
-
-(defun dumb-jump-populate-regex (it look-for variant)
- "Populate IT regex template with LOOK-FOR."
- (let ((boundary (cond ((eq variant 'rg) dumb-jump-rg-word-boundary)
- ((eq variant 'ag) dumb-jump-ag-word-boundary)
- ((eq variant 'git-grep-plus-ag) dumb-jump-ag-word-boundary)
- ((eq variant 'git-grep) dumb-jump-git-grep-word-boundary)
- (t dumb-jump-grep-word-boundary))))
- (let ((text it))
- (setq text (s-replace "\\j" boundary text))
- (when (eq variant 'gnu-grep)
- (setq text (s-replace "\\s" "[[:space:]]" text)))
- (setq text (s-replace "JJJ" (regexp-quote look-for) text))
- (when (and (eq variant 'rg) (string-prefix-p "-" text))
- (setq text (concat "[-]" (substring text 1))))
- text)))
-
-(defun dumb-jump-populate-regexes (look-for regexes variant)
- "Take list of REGEXES and populate the LOOK-FOR target and return that list."
- (--map (dumb-jump-populate-regex it look-for variant) regexes))
-
-(defun dumb-jump-generate-ag-command (look-for cur-file proj regexes lang exclude-paths)
- "Generate the ag response based on the needle LOOK-FOR in the directory PROJ."
- (let* ((filled-regexes (dumb-jump-populate-regexes look-for regexes 'ag))
- (agtypes (dumb-jump-get-ag-type-by-language lang))
- (lang-exts (dumb-jump-get-file-exts-by-language lang))
- (proj-dir (file-name-as-directory proj))
- ;; TODO: --search-zip always? in case the include is the in gz area like emacs lisp code.
- (cmd (concat dumb-jump-ag-cmd
- " --nocolor --nogroup"
- (if (s-ends-with? ".gz" cur-file)
- " --search-zip"
- "")
- (when (not (s-blank? dumb-jump-ag-search-args))
- (concat " " dumb-jump-ag-search-args))
- (if agtypes
- (s-join "" (--map (format " --%s" it) agtypes))
- ;; there can only be one `-G` arg
- (concat " -G '("
- (s-join "|" (--map (format "\\.%s" it) lang-exts))
- ")$'"))))
- (exclude-args (dumb-jump-arg-joiner
- "--ignore-dir" (--map (shell-quote-argument (s-replace proj-dir "" it)) exclude-paths)))
- (regex-args (shell-quote-argument (s-join "|" filled-regexes))))
- (if (= (length regexes) 0)
- ""
- (dumb-jump-concat-command cmd exclude-args regex-args proj))))
-
-(defun dumb-jump-get-git-grep-files-matching-symbol (symbol proj-root)
- "Search for the literal SYMBOL in the PROJ-ROOT via git grep for a list of file matches."
- (let* ((cmd (format "git grep --full-name -F -c %s %s" (shell-quote-argument symbol) proj-root))
- (result (s-trim (shell-command-to-string cmd)))
- (matched-files (--map (first (s-split ":" it))
- (s-split "\n" result))))
- matched-files))
-
-(defun dumb-jump-format-files-as-ag-arg (files proj-root)
- "Take a list of FILES and their PROJ-ROOT and return a `ag -G` argument."
- (format "'(%s)'" (s-join "|" (--map (file-relative-name
- (expand-file-name it proj-root))
- files))))
-
-(defun dumb-jump-get-git-grep-files-matching-symbol-as-ag-arg (symbol proj-root)
- "Get the files matching the SYMBOL via `git grep` in the PROJ-ROOT and return them formatted for `ag -G`."
- (dumb-jump-format-files-as-ag-arg
- (dumb-jump-get-git-grep-files-matching-symbol symbol proj-root)
- proj-root))
-
-;; git-grep plus ag only recommended for huge repos like the linux kernel
-(defun dumb-jump-generate-git-grep-plus-ag-command (look-for cur-file proj regexes lang exclude-paths)
- "Generate the ag response based on the needle LOOK-FOR in the directory PROJ.
-Using ag to search only the files found via git-grep literal symbol search."
- (let* ((filled-regexes (dumb-jump-populate-regexes look-for regexes 'ag))
- (proj-dir (file-name-as-directory proj))
- (ag-files-arg (dumb-jump-get-git-grep-files-matching-symbol-as-ag-arg look-for proj-dir))
- (cmd (concat dumb-jump-ag-cmd
- " --nocolor --nogroup"
- (if (s-ends-with? ".gz" cur-file)
- " --search-zip"
- "")
- " -G " ag-files-arg
- " "))
- (exclude-args (dumb-jump-arg-joiner
- "--ignore-dir" (--map (shell-quote-argument (s-replace proj-dir "" it)) exclude-paths)))
- (regex-args (shell-quote-argument (s-join "|" filled-regexes))))
- (if (= (length regexes) 0)
- ""
- (dumb-jump-concat-command cmd exclude-args regex-args proj))))
-
-(defun dumb-jump-generate-rg-command (look-for cur-file proj regexes lang exclude-paths)
- "Generate the rg response based on the needle LOOK-FOR in the directory PROJ."
- (let* ((filled-regexes (dumb-jump-populate-regexes look-for regexes 'rg))
- (rgtypes (dumb-jump-get-rg-type-by-language lang))
- (proj-dir (file-name-as-directory proj))
- (cmd (concat dumb-jump-rg-cmd
- " --color never --no-heading --line-number -U"
- (when (not (s-blank? dumb-jump-rg-search-args))
- (concat " " dumb-jump-rg-search-args))
- (s-join "" (--map (format " --type %s" it) rgtypes))))
- (exclude-args (dumb-jump-arg-joiner
- "-g" (--map (shell-quote-argument (concat "!" (s-replace proj-dir "" it))) exclude-paths)))
- (regex-args (shell-quote-argument (s-join "|" filled-regexes))))
- (if (= (length regexes) 0)
- ""
- (dumb-jump-concat-command cmd exclude-args regex-args proj))))
-
-(defun dumb-jump-generate-git-grep-command (look-for cur-file proj regexes lang exclude-paths)
- "Generate the git grep response based on the needle LOOK-FOR in the directory PROJ."
- (let* ((filled-regexes (dumb-jump-populate-regexes look-for regexes 'git-grep))
- (ggtypes (when (file-name-extension cur-file) (dumb-jump-get-git-grep-type-by-language lang)))
- (cmd (concat dumb-jump-git-grep-cmd
- " --color=never --line-number"
- (when dumb-jump-git-grep-search-untracked
- " --untracked")
- (when (not (s-blank? dumb-jump-git-grep-search-args))
- (concat " " dumb-jump-git-grep-search-args))
- " -E"))
- (fileexps (s-join " " (--map (shell-quote-argument (format "%s/*.%s" proj it)) ggtypes)))
- (exclude-args (s-join " "
- (--map (shell-quote-argument (concat ":(exclude)" it))
- exclude-paths)))
- (regex-args (shell-quote-argument (s-join "|" filled-regexes))))
- (if (= (length regexes) 0)
- ""
- (dumb-jump-concat-command cmd regex-args "--" fileexps exclude-args))))
-
-(defun dumb-jump-generate-grep-command (look-for cur-file proj regexes lang exclude-paths)
- "Find LOOK-FOR's CUR-FILE in the PROJ with REGEXES for the LANG but not in EXCLUDE-PATHS."
- (let* ((filled-regexes (--map (shell-quote-argument it)
- (dumb-jump-populate-regexes look-for regexes 'grep)))
- (cmd (concat (if (eq system-type 'windows-nt) "" (concat dumb-jump-grep-prefix " "))
- (if (s-ends-with? ".gz" cur-file)
- dumb-jump-zgrep-cmd
- dumb-jump-grep-cmd)))
- (exclude-args (dumb-jump-arg-joiner "--exclude-dir" exclude-paths))
- (include-args (dumb-jump-get-ext-includes lang))
- (regex-args (dumb-jump-arg-joiner "-e" filled-regexes)))
- (if (= (length regexes) 0)
- ""
- (dumb-jump-concat-command cmd dumb-jump-grep-args exclude-args include-args regex-args proj))))
-
-(defun dumb-jump-generate-gnu-grep-command (look-for cur-file proj regexes lang exclude-paths)
- "Find LOOK-FOR's CUR-FILE in the PROJ with REGEXES for the LANG but not in EXCLUDE-PATHS."
- (let* ((filled-regexes (--map (shell-quote-argument it)
- (dumb-jump-populate-regexes look-for regexes 'gnu-grep)))
- (cmd (concat (if (eq system-type 'windows-nt) "" (concat dumb-jump-grep-prefix " "))
- (if (s-ends-with? ".gz" cur-file)
- dumb-jump-zgrep-cmd
- dumb-jump-grep-cmd)))
- ;; TODO: GNU grep doesn't support these, so skip them
- (exclude-args "")
- (include-args "")
- (regex-args (dumb-jump-arg-joiner "-e" filled-regexes)))
- (if (= (length regexes) 0)
- ""
- (dumb-jump-concat-command cmd dumb-jump-gnu-grep-args exclude-args include-args regex-args proj))))
-
-(defun dumb-jump-concat-command (&rest parts)
- "Concat the PARTS of a command if each part has a length."
- (s-join " " (-map #'s-trim (--filter (> (length it) 0) parts))))
-
-(defun dumb-jump-get-file-exts-by-language (language)
- "Return list of file extensions for a LANGUAGE."
- (--map (plist-get it :ext)
- (--filter (string= (plist-get it :language) language)
- dumb-jump-language-file-exts)))
-
-(defun dumb-jump-get-ag-type-by-language (language)
- "Return list of ag type argument for a LANGUAGE."
- (-distinct (--map (plist-get it :agtype)
- (--filter (and
- (plist-get it :agtype)
- (string= (plist-get it :language) language))
- dumb-jump-language-file-exts))))
-
-(defun dumb-jump-get-rg-type-by-language (language)
- "Return list of rg type argument for a LANGUAGE."
- (-distinct (--map (plist-get it :rgtype)
- (--filter (and
- (plist-get it :rgtype)
- (string= (plist-get it :language) language))
- dumb-jump-language-file-exts))))
-
-(defun dumb-jump-get-git-grep-type-by-language (language)
- "Return list of git grep type argument for a LANGUAGE."
- (-distinct (--map (plist-get it :ext)
- (--filter (and
- (plist-get it :ext)
- (string= (plist-get it :language) language))
- dumb-jump-language-file-exts))))
-
-(defun dumb-jump-get-rules-by-language (language searcher)
- "Return a list of rules for the LANGUAGE by SEARCHER."
- (let* ((searcher-str (cond ((eq 'git-grep searcher) "git-grep")
- ((eq 'rg searcher) "rg")
- ((eq 'ag searcher) "ag")
- ((eq 'git-grep-plus-ag searcher) "ag")
- (t "grep")))
- (results (--filter (and
- (string= (plist-get it ':language) language)
- (member searcher-str (plist-get it ':supports)))
- dumb-jump-find-rules)))
- (if dumb-jump-functions-only
- (--filter (string= (plist-get it ':type) "function") results)
- results)))
-
-;;;###autoload
-(define-minor-mode dumb-jump-mode
- "Minor mode for jumping to variable and function definitions"
- :global t
- :keymap dumb-jump-mode-map)
-
-
-;;; Xref Backend
-(when (featurep 'xref)
- (dolist (obsolete
- '(dumb-jump-mode
- dumb-jump-go
- dumb-jump-go-prefer-external-other-window
- dumb-jump-go-prompt
- dumb-jump-quick-look
- dumb-jump-go-other-window
- dumb-jump-go-current-window
- dumb-jump-go-prefer-external
- dumb-jump-go-current-window))
- (make-obsolete
- obsolete
- (format "`%s' has been obsoleted by the xref interface."
- obsolete)
- "2020-06-26"))
- (make-obsolete 'dumb-jump-back
- "`dumb-jump-back' has been obsoleted by `xref-pop-marker-stack'."
- "2020-06-26")
-
- (cl-defmethod xref-backend-identifier-at-point ((_backend (eql dumb-jump)))
- (let ((bounds (bounds-of-thing-at-point 'symbol)))
- (and bounds (let* ((ident (dumb-jump-get-point-symbol))
- (start (car bounds))
- (col (- start (point-at-bol)))
- (line (dumb-jump-get-point-line))
- (ctx (dumb-jump-get-point-context line ident col)))
- (propertize ident :dumb-jump-ctx ctx)))))
-
- (cl-defmethod xref-backend-definitions ((_backend (eql dumb-jump)) prompt)
- (let* ((info (dumb-jump-get-results prompt))
- (results (plist-get info :results))
- (look-for (or prompt (plist-get info :symbol)))
- (proj-root (plist-get info :root))
- (issue (plist-get info :issue))
- (lang (plist-get info :lang))
- (processed (dumb-jump-process-results
- results
- (plist-get info :file)
- proj-root
- (plist-get info :ctx-type)
- look-for
- nil
- nil))
- (results (plist-get processed :results))
- (do-var-jump (plist-get processed :do-var-jump))
- (var-to-jump (plist-get processed :var-to-jump))
- (match-cur-file-front (plist-get processed :match-cur-file-front)))
-
- (dumb-jump-debug-message
- look-for
- ctx-type
- var-to-jump
- (pp-to-string match-cur-file-front)
- (pp-to-string results)
- prefer-external
- match-cur-file-front
- proj-root
- cur-file)
- (cond ((eq issue 'nogrep)
- (dumb-jump-message "Please install ag, rg, git grep or grep!"))
- ((eq issue 'nosymbol)
- (dumb-jump-message "No symbol under point."))
- ((s-ends-with? " file" lang)
- (dumb-jump-message "Could not find rules for '%s'." lang))
- ((= (length results) 0)
- (dumb-jump-message "'%s' %s %s declaration not found." look-for (if (s-blank? lang) "with unknown language so" lang) (plist-get info :ctx-type)))
- (t (mapcar (lambda (res)
- (xref-make
- (plist-get res :context)
- (xref-make-file-location
- (plist-get res :path)
- (plist-get res :line)
- 0)))
- (if do-var-jump
- (list var-to-jump)
- match-cur-file-front))))))
-
- (cl-defmethod xref-backend-apropos ((_backend (eql dumb-jump)) pattern)
- (xref-backend-definitions 'dumb-jump pattern)))
-
-;;;###autoload
-(defun dumb-jump-xref-activate ()
- "Function to activate xref backend.
-Add this function to `xref-backend-functions' to dumb jump to be
-activiated, whenever it finds a project. It is recommended to add
-it to the end, so that it only gets activated when no better
-option is found."
- (and (dumb-jump-get-project-root default-directory)
- 'dumb-jump))
-
-(provide 'dumb-jump)
-;;; dumb-jump.el ends here
diff --git a/elpa/epl-20180205.2049/epl-autoloads.el b/elpa/epl-20180205.2049/epl-autoloads.el
deleted file mode 100644
index c6221c5..0000000
--- a/elpa/epl-20180205.2049/epl-autoloads.el
+++ /dev/null
@@ -1,22 +0,0 @@
-;;; epl-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "epl" "epl.el" (0 0 0 0))
-;;; Generated autoloads from epl.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "epl" '("epl-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; epl-autoloads.el ends here
diff --git a/elpa/epl-20180205.2049/epl-pkg.el b/elpa/epl-20180205.2049/epl-pkg.el
deleted file mode 100644
index a977868..0000000
--- a/elpa/epl-20180205.2049/epl-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "epl" "20180205.2049" "Emacs Package Library" '((cl-lib "0.3")) :commit "78ab7a85c08222cd15582a298a364774e3282ce6" :keywords '("convenience") :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :url "http://github.com/cask/epl")
diff --git a/elpa/epl-20180205.2049/epl.el b/elpa/epl-20180205.2049/epl.el
deleted file mode 100644
index a660ba8..0000000
--- a/elpa/epl-20180205.2049/epl.el
+++ /dev/null
@@ -1,712 +0,0 @@
-;;; epl.el --- Emacs Package Library -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2015 Sebastian Wiesner
-;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2015 Free Software
-
-;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
-;; Maintainer: Johan Andersson <johan.rejeep@gmail.com>
-;; Sebastian Wiesner <swiesner@lunaryorn.com>
-;; Version: 0.10-cvs
-;; Package-Version: 20180205.2049
-;; Package-Commit: 78ab7a85c08222cd15582a298a364774e3282ce6
-;; Package-Requires: ((cl-lib "0.3"))
-;; Keywords: convenience
-;; URL: http://github.com/cask/epl
-
-;; This file is NOT part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; A package management library for Emacs, based on package.el.
-
-;; The purpose of this library is to wrap all the quirks and hassle of
-;; package.el into a sane API.
-
-;; The following functions comprise the public interface of this library:
-
-;;; Package directory selection
-
-;; `epl-package-dir' gets the directory of packages.
-
-;; `epl-default-package-dir' gets the default package directory.
-
-;; `epl-change-package-dir' changes the directory of packages.
-
-;;; Package system management
-
-;; `epl-initialize' initializes the package system and activates all
-;; packages.
-
-;; `epl-reset' resets the package system.
-
-;; `epl-refresh' refreshes all package archives.
-
-;; `epl-add-archive' adds a new package archive.
-
-;;; Package objects
-
-;; Struct `epl-requirement' describes a requirement of a package with `name' and
-;; `version' slots.
-
-;; `epl-requirement-version-string' gets a requirement version as string.
-
-;; Struct `epl-package' describes an installed or installable package with a
-;; `name' and some internal `description'.
-
-;; `epl-package-version' gets the version of a package.
-
-;; `epl-package-version-string' gets the version of a package as string.
-
-;; `epl-package-summary' gets the summary of a package.
-
-;; `epl-package-requirements' gets the requirements of a package.
-
-;; `epl-package-directory' gets the installation directory of a package.
-
-;; `epl-package-from-buffer' creates a package object for the package contained
-;; in the current buffer.
-
-;; `epl-package-from-file' creates a package object for a package file, either
-;; plain lisp or tarball.
-
-;; `epl-package-from-descriptor-file' creates a package object for a package
-;; description (i.e. *-pkg.el) file.
-
-;;; Package database access
-
-;; `epl-package-installed-p' determines whether a package is installed, either
-;; built-in or explicitly installed.
-
-;; `epl-package-outdated-p' determines whether a package is outdated, that is,
-;; whether a package with a higher version number is available.
-
-;; `epl-built-in-packages', `epl-installed-packages', `epl-outdated-packages'
-;; and `epl-available-packages' get all packages built-in, installed, outdated,
-;; or available for installation respectively.
-
-;; `epl-find-built-in-package', `epl-find-installed-packages' and
-;; `epl-find-available-packages' find built-in, installed and available packages
-;; by name.
-
-;; `epl-find-upgrades' finds all upgradable packages.
-
-;; `epl-built-in-p' return true if package is built-in to Emacs.
-
-;;; Package operations
-
-;; `epl-install-file' installs a package file.
-
-;; `epl-package-install' installs a package.
-
-;; `epl-package-delete' deletes a package.
-
-;; `epl-upgrade' upgrades packages.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'package)
-
-
-(unless (fboundp #'define-error)
- ;; `define-error' for 24.3 and earlier, copied from subr.el
- (defun define-error (name message &optional parent)
- "Define NAME as a new error signal.
-MESSAGE is a string that will be output to the echo area if such an error
-is signaled without being caught by a `condition-case'.
-PARENT is either a signal or a list of signals from which it inherits.
-Defaults to `error'."
- (unless parent (setq parent 'error))
- (let ((conditions
- (if (consp parent)
- (apply #'append
- (mapcar (lambda (parent)
- (cons parent
- (or (get parent 'error-conditions)
- (error "Unknown signal `%s'" parent))))
- parent))
- (cons parent (get parent 'error-conditions)))))
- (put name 'error-conditions
- (delete-dups (copy-sequence (cons name conditions))))
- (when message (put name 'error-message message)))))
-
-(defsubst epl--package-desc-p (package)
- "Whether PACKAGE is a `package-desc' object.
-
-Like `package-desc-p', but return nil, if `package-desc-p' is not
-defined as function."
- (and (fboundp 'package-desc-p) (package-desc-p package)))
-
-
-;;; EPL errors
-(define-error 'epl-error "EPL error")
-
-(define-error 'epl-invalid-package "Invalid EPL package" 'epl-error)
-
-(define-error 'epl-invalid-package-file "Invalid EPL package file"
- 'epl-invalid-package)
-
-
-;;; Package directory
-(defun epl-package-dir ()
- "Get the directory of packages."
- package-user-dir)
-
-(defun epl-default-package-dir ()
- "Get the default directory of packages."
- (eval (car (get 'package-user-dir 'standard-value))))
-
-(defun epl-change-package-dir (directory)
- "Change the directory of packages to DIRECTORY."
- (setq package-user-dir directory)
- (epl-initialize))
-
-
-;;; Package system management
-(defvar epl--load-path-before-initialize nil
- "Remember the load path for `epl-reset'.")
-
-(defun epl-initialize (&optional no-activate)
- "Load Emacs Lisp packages and activate them.
-
-With NO-ACTIVATE non-nil, do not activate packages."
- (setq epl--load-path-before-initialize load-path)
- (package-initialize no-activate))
-
-(defalias 'epl-refresh 'package-refresh-contents)
-
-(defun epl-add-archive (name url)
- "Add a package archive with NAME and URL."
- (add-to-list 'package-archives (cons name url)))
-
-(defun epl-reset ()
- "Reset the package system.
-
-Clear the list of installed and available packages, the list of
-package archives and reset the package directory."
- (setq package-alist nil
- package-archives nil
- package-archive-contents nil
- load-path epl--load-path-before-initialize)
- (when (boundp 'package-obsolete-alist) ; Legacy package.el
- (setq package-obsolete-alist nil))
- (epl-change-package-dir (epl-default-package-dir)))
-
-
-;;; Package structures
-(cl-defstruct (epl-requirement
- (:constructor epl-requirement-create))
- "Structure describing a requirement.
-
-Slots:
-
-`name' The name of the required package, as symbol.
-
-`version' The version of the required package, as version list."
- name
- version)
-
-(defun epl-requirement-version-string (requirement)
- "The version of a REQUIREMENT, as string."
- (package-version-join (epl-requirement-version requirement)))
-
-(cl-defstruct (epl-package (:constructor epl-package-create))
- "Structure representing a package.
-
-Slots:
-
-`name' The package name, as symbol.
-
-`description' The package description.
-
-The format package description varies between package.el
-variants. For `package-desc' variants, it is simply the
-corresponding `package-desc' object. For legacy variants, it is
-a vector `[VERSION REQS DOCSTRING]'.
-
-Do not access `description' directly, but instead use the
-`epl-package' accessors."
- name
- description)
-
-(defmacro epl-package-as-description (var &rest body)
- "Cast VAR to a package description in BODY.
-
-VAR is a symbol, bound to an `epl-package' object. This macro
-casts this object to the `description' object, and binds the
-description to VAR in BODY."
- (declare (indent 1))
- (unless (symbolp var)
- (signal 'wrong-type-argument (list #'symbolp var)))
- `(if (epl-package-p ,var)
- (let ((,var (epl-package-description ,var)))
- ,@body)
- (signal 'wrong-type-argument (list #'epl-package-p ,var))))
-
-(defsubst epl-package--package-desc-p (package)
- "Whether the description of PACKAGE is a `package-desc'."
- (epl--package-desc-p (epl-package-description package)))
-
-(defun epl-package-version (package)
- "Get the version of PACKAGE, as version list."
- (epl-package-as-description package
- (cond
- ((fboundp 'package-desc-version) (package-desc-version package))
- ;; Legacy
- ((fboundp 'package-desc-vers)
- (let ((version (package-desc-vers package)))
- (if (listp version) version (version-to-list version))))
- (:else (error "Cannot get version from %S" package)))))
-
-(defun epl-package-version-string (package)
- "Get the version from a PACKAGE, as string."
- (package-version-join (epl-package-version package)))
-
-(defun epl-package-summary (package)
- "Get the summary of PACKAGE, as string."
- (epl-package-as-description package
- (cond
- ((fboundp 'package-desc-summary) (package-desc-summary package))
- ((fboundp 'package-desc-doc) (package-desc-doc package)) ; Legacy
- (:else (error "Cannot get summary from %S" package)))))
-
-(defsubst epl-requirement--from-req (req)
- "Create a `epl-requirement' from a `package-desc' REQ."
- (let ((version (cadr req)))
- (epl-requirement-create :name (car req)
- :version (if (listp version) version
- (version-to-list version)))))
-
-(defun epl-package-requirements (package)
- "Get the requirements of PACKAGE.
-
-The requirements are a list of `epl-requirement' objects."
- (epl-package-as-description package
- (mapcar #'epl-requirement--from-req (package-desc-reqs package))))
-
-(defun epl-package-directory (package)
- "Get the directory PACKAGE is installed to.
-
-Return the absolute path of the installation directory of
-PACKAGE, or nil, if PACKAGE is not installed."
- (cond
- ((fboundp 'package-desc-dir)
- (package-desc-dir (epl-package-description package)))
- ((fboundp 'package--dir)
- (package--dir (symbol-name (epl-package-name package))
- (epl-package-version-string package)))
- (:else (error "Cannot get package directory from %S" package))))
-
-(defun epl-package-->= (pkg1 pkg2)
- "Determine whether PKG1 is before PKG2 by version."
- (not (version-list-< (epl-package-version pkg1)
- (epl-package-version pkg2))))
-
-(defun epl-package--from-package-desc (package-desc)
- "Create an `epl-package' from a PACKAGE-DESC.
-
-PACKAGE-DESC is a `package-desc' object, from recent package.el
-variants."
- (if (and (fboundp 'package-desc-name)
- (epl--package-desc-p package-desc))
- (epl-package-create :name (package-desc-name package-desc)
- :description package-desc)
- (signal 'wrong-type-argument (list 'epl--package-desc-p package-desc))))
-
-(defun epl-package--parse-info (info)
- "Parse a package.el INFO."
- (if (epl--package-desc-p info)
- (epl-package--from-package-desc info)
- ;; For legacy package.el, info is a vector [NAME REQUIRES DESCRIPTION
- ;; VERSION COMMENTARY]. We need to re-shape this vector into the
- ;; `package-alist' format [VERSION REQUIRES DESCRIPTION] to attach it to the
- ;; new `epl-package'.
- (let ((name (intern (aref info 0)))
- (info (vector (aref info 3) (aref info 1) (aref info 2))))
- (epl-package-create :name name :description info))))
-
-(defun epl-package-from-buffer (&optional buffer)
- "Create an `epl-package' object from BUFFER.
-
-BUFFER defaults to the current buffer.
-
-Signal `epl-invalid-package' if the buffer does not contain a
-valid package file."
- (let ((info (with-current-buffer (or buffer (current-buffer))
- (condition-case err
- (package-buffer-info)
- (error (signal 'epl-invalid-package (cdr err)))))))
- (epl-package--parse-info info)))
-
-(defun epl-package-from-lisp-file (file-name)
- "Parse the package headers the file at FILE-NAME.
-
-Return an `epl-package' object with the header metadata."
- (with-temp-buffer
- (insert-file-contents file-name)
- (condition-case err
- (epl-package-from-buffer (current-buffer))
- ;; Attach file names to invalid package errors
- (epl-invalid-package
- (signal 'epl-invalid-package-file (cons file-name (cdr err))))
- ;; Forward other errors
- (error (signal (car err) (cdr err))))))
-
-(defun epl-package-from-tar-file (file-name)
- "Parse the package tarball at FILE-NAME.
-
-Return a `epl-package' object with the meta data of the tarball
-package in FILE-NAME."
- (condition-case nil
- ;; In legacy package.el, `package-tar-file-info' takes the name of the tar
- ;; file to parse as argument. In modern package.el, it has no arguments
- ;; and works on the current buffer. Hence, we just try to call the legacy
- ;; version, and if that fails because of a mismatch between formal and
- ;; actual arguments, we use the modern approach. To avoid spurious
- ;; signature warnings by the byte compiler, we suppress warnings when
- ;; calling the function.
- (epl-package--parse-info (with-no-warnings
- (package-tar-file-info file-name)))
- (wrong-number-of-arguments
- (with-temp-buffer
- (insert-file-contents-literally file-name)
- ;; Switch to `tar-mode' to enable extraction of the file. Modern
- ;; `package-tar-file-info' relies on `tar-mode', and signals an error if
- ;; called in a buffer with a different mode.
- (tar-mode)
- (epl-package--parse-info (with-no-warnings
- (package-tar-file-info)))))))
-
-(defun epl-package-from-file (file-name)
- "Parse the package at FILE-NAME.
-
-Return an `epl-package' object with the meta data of the package
-at FILE-NAME."
- (if (string-match-p (rx ".tar" string-end) file-name)
- (epl-package-from-tar-file file-name)
- (epl-package-from-lisp-file file-name)))
-
-(defun epl-package--parse-descriptor-requirement (requirement)
- "Parse a REQUIREMENT in a package descriptor."
- ;; This function is only called on legacy package.el. On package-desc
- ;; package.el, we just let package.el do the work.
- (cl-destructuring-bind (name version-string) requirement
- (list name (version-to-list version-string))))
-
-(defun epl-package-from-descriptor-file (descriptor-file)
- "Load a `epl-package' from a package DESCRIPTOR-FILE.
-
-A package descriptor is a file defining a new package. Its name
-typically ends with -pkg.el."
- (with-temp-buffer
- (insert-file-contents descriptor-file)
- (goto-char (point-min))
- (let ((sexp (read (current-buffer))))
- (unless (eq (car sexp) 'define-package)
- (error "%S is no valid package descriptor" descriptor-file))
- (if (and (fboundp 'package-desc-from-define)
- (fboundp 'package-desc-name))
- ;; In Emacs snapshot, we can conveniently call a function to parse the
- ;; descriptor
- (let ((desc (apply #'package-desc-from-define (cdr sexp))))
- (epl-package-create :name (package-desc-name desc)
- :description desc))
- ;; In legacy package.el, we must manually deconstruct the descriptor,
- ;; because the load function has eval's the descriptor and has a lot of
- ;; global side-effects.
- (cl-destructuring-bind
- (name version-string summary requirements) (cdr sexp)
- (epl-package-create
- :name (intern name)
- :description
- (vector (version-to-list version-string)
- (mapcar #'epl-package--parse-descriptor-requirement
- ;; Strip the leading `quote' from the package list
- (cadr requirements))
- summary)))))))
-
-
-;;; Package database access
-(defun epl-package-installed-p (package &optional min-version)
- "Determine whether a PACKAGE, of MIN-VERSION or newer, is installed.
-
-PACKAGE is either a package name as symbol, or a package object.
-When a explicit MIN-VERSION is provided it overwrites the version of the PACKAGE object."
- (let ((name (if (epl-package-p package)
- (epl-package-name package)
- package))
- (min-version (or min-version (and (epl-package-p package)
- (epl-package-version package)))))
- (package-installed-p name min-version)))
-
-(defun epl--parse-built-in-entry (entry)
- "Parse an ENTRY from the list of built-in packages.
-
-Return the corresponding `epl-package' object."
- (if (fboundp 'package--from-builtin)
- ;; In package-desc package.el, convert the built-in package to a
- ;; `package-desc' and convert that to an `epl-package'
- (epl-package--from-package-desc (package--from-builtin entry))
- (epl-package-create :name (car entry) :description (cdr entry))))
-
-(defun epl-built-in-packages ()
- "Get all built-in packages.
-
-Return a list of `epl-package' objects."
- ;; This looks mighty strange, but it's the only way to force package.el to
- ;; build the list of built-in packages. Without this, `package--builtins'
- ;; might be empty.
- (package-built-in-p 'foo)
- (mapcar #'epl--parse-built-in-entry package--builtins))
-
-(defun epl-find-built-in-package (name)
- "Find a built-in package with NAME.
-
-NAME is a package name, as symbol.
-
-Return the built-in package as `epl-package' object, or nil if
-there is no built-in package with NAME."
- (when (package-built-in-p name)
- ;; We must call `package-built-in-p' *before* inspecting
- ;; `package--builtins', because otherwise `package--builtins' might be
- ;; empty.
- (epl--parse-built-in-entry (assq name package--builtins))))
-
-(defun epl-package-outdated-p (package)
- "Determine whether a PACKAGE is outdated.
-
-A package is outdated, if there is an available package with a
-higher version.
-
-PACKAGE is either a package name as symbol, or a package object.
-In the former case, test the installed or built-in package with
-the highest version number, in the later case, test the package
-object itself.
-
-Return t, if the package is outdated, or nil otherwise."
- (let* ((package (if (epl-package-p package)
- package
- (or (car (epl-find-installed-packages package))
- (epl-find-built-in-package package))))
- (available (car (epl-find-available-packages
- (epl-package-name package)))))
- (and package available (version-list-< (epl-package-version package)
- (epl-package-version available)))))
-
-(defun epl--parse-package-list-entry (entry)
- "Parse a list of packages from ENTRY.
-
-ENTRY is a single entry in a package list, e.g. `package-alist',
-`package-archive-contents', etc. Typically it is a cons cell,
-but the exact format varies between package.el versions. This
-function tries to parse all known variants.
-
-Return a list of `epl-package' objects parsed from ENTRY."
- (let ((descriptions (cdr entry)))
- (cond
- ((listp descriptions)
- (sort (mapcar #'epl-package--from-package-desc descriptions)
- #'epl-package-->=))
- ;; Legacy package.el has just a single package in an entry, which is a
- ;; standard description vector
- ((vectorp descriptions)
- (list (epl-package-create :name (car entry)
- :description descriptions)))
- (:else (error "Cannot parse entry %S" entry)))))
-
-(defun epl-installed-packages ()
- "Get all installed packages.
-
-Return a list of package objects."
- (apply #'append (mapcar #'epl--parse-package-list-entry package-alist)))
-
-(defsubst epl--filter-outdated-packages (packages)
- "Filter outdated packages from PACKAGES."
- (let (res)
- (dolist (package packages)
- (when (epl-package-outdated-p package)
- (push package res)))
- (nreverse res)))
-
-(defun epl-outdated-packages ()
- "Get all outdated packages, as in `epl-package-outdated-p'.
-
-Return a list of package objects."
- (epl--filter-outdated-packages (epl-installed-packages)))
-
-(defsubst epl--find-package-in-list (name list)
- "Find a package by NAME in a package LIST.
-
-Return a list of corresponding `epl-package' objects."
- (let ((entry (assq name list)))
- (when entry
- (epl--parse-package-list-entry entry))))
-
-(defun epl-find-installed-package (name)
- "Find the latest installed package by NAME.
-
-NAME is a package name, as symbol.
-
-Return the installed package with the highest version number as
-`epl-package' object, or nil, if no package with NAME is
-installed."
- (car (epl-find-installed-packages name)))
-(make-obsolete 'epl-find-installed-package 'epl-find-installed-packages "0.7")
-
-(defun epl-find-installed-packages (name)
- "Find all installed packages by NAME.
-
-NAME is a package name, as symbol.
-
-Return a list of all installed packages with NAME, sorted by
-version number in descending order. Return nil, if there are no
-packages with NAME."
- (epl--find-package-in-list name package-alist))
-
-(defun epl-available-packages ()
- "Get all packages available for installation.
-
-Return a list of package objects."
- (apply #'append (mapcar #'epl--parse-package-list-entry
- package-archive-contents)))
-
-(defun epl-find-available-packages (name)
- "Find available packages for NAME.
-
-NAME is a package name, as symbol.
-
-Return a list of available packages for NAME, sorted by version
-number in descending order. Return nil, if there are no packages
-for NAME."
- (epl--find-package-in-list name package-archive-contents))
-
-(cl-defstruct (epl-upgrade
- (:constructor epl-upgrade-create))
- "Structure describing an upgradable package.
-Slots:
-
-`installed' The installed package
-
-`available' The package available for installation."
- installed
- available)
-
-(defun epl-find-upgrades (&optional packages)
- "Find all upgradable PACKAGES.
-
-PACKAGES is a list of package objects to upgrade, defaulting to
-all installed packages.
-
-Return a list of `epl-upgrade' objects describing all upgradable
-packages."
- (let ((packages (or packages (epl-installed-packages)))
- upgrades)
- (dolist (pkg packages)
- (let* ((version (epl-package-version pkg))
- (name (epl-package-name pkg))
- ;; Find the latest available package for NAME
- (available-pkg (car (epl-find-available-packages name)))
- (available-version (when available-pkg
- (epl-package-version available-pkg))))
- (when (and available-version (version-list-< version available-version))
- (push (epl-upgrade-create :installed pkg
- :available available-pkg)
- upgrades))))
- (nreverse upgrades)))
-
-(defalias 'epl-built-in-p 'package-built-in-p)
-
-
-;;; Package operations
-
-(defun epl-install-file (file)
- "Install a package from FILE, like `package-install-file'."
- (interactive (advice-eval-interactive-spec
- (cadr (interactive-form #'package-install-file))))
- (apply #'package-install-file (list file))
- (let ((package (epl-package-from-file file)))
- (unless (epl-package--package-desc-p package)
- (epl--kill-autoload-buffer package))))
-
-(defun epl--kill-autoload-buffer (package)
- "Kill the buffer associated with autoloads for PACKAGE."
- (let* ((auto-name (format "%s-autoloads.el" (epl-package-name package)))
- (generated-autoload-file (expand-file-name auto-name (epl-package-directory package)))
- (buf (find-buffer-visiting generated-autoload-file)))
- (when buf (kill-buffer buf))))
-
-(defun epl-package-install (package &optional force)
- "Install a PACKAGE.
-
-PACKAGE is a `epl-package' object. If FORCE is given and
-non-nil, install PACKAGE, even if it is already installed."
- (when (or force (not (epl-package-installed-p package)))
- (if (epl-package--package-desc-p package)
- (package-install (epl-package-description package))
- ;; The legacy API installs by name. We have no control over versioning,
- ;; etc.
- (package-install (epl-package-name package))
- (epl--kill-autoload-buffer package))))
-
-(defun epl-package-delete (package)
- "Delete a PACKAGE.
-
-PACKAGE is a `epl-package' object to delete."
- ;; package-delete allows for packages being trashed instead of fully deleted.
- ;; Let's prevent his silly behavior
- (let ((delete-by-moving-to-trash nil))
- ;; The byte compiler will warn us that we are calling `package-delete' with
- ;; the wrong number of arguments, since it can't infer that we guarantee to
- ;; always call the correct version. Thus we suppress all warnings when
- ;; calling `package-delete'. I wish there was a more granular way to
- ;; disable just that specific warning, but it is what it is.
- (if (epl-package--package-desc-p package)
- (with-no-warnings
- (package-delete (epl-package-description package)))
- ;; The legacy API deletes by name (as string!) and version instead by
- ;; descriptor. Hence `package-delete' takes two arguments. For some
- ;; insane reason, the arguments are strings here!
- (let ((name (symbol-name (epl-package-name package)))
- (version (epl-package-version-string package)))
- (with-no-warnings
- (package-delete name version))
- ;; Legacy package.el does not remove the deleted package
- ;; from the `package-alist', so we do it manually here.
- (let ((pkg (assq (epl-package-name package) package-alist)))
- (when pkg
- (setq package-alist (delq pkg package-alist))))))))
-
-(defun epl-upgrade (&optional packages preserve-obsolete)
- "Upgrade PACKAGES.
-
-PACKAGES is a list of package objects to upgrade, defaulting to
-all installed packages.
-
-The old versions of the updated packages are deleted, unless
-PRESERVE-OBSOLETE is non-nil.
-
-Return a list of all performed upgrades, as a list of
-`epl-upgrade' objects."
- (let ((upgrades (epl-find-upgrades packages)))
- (dolist (upgrade upgrades)
- (epl-package-install (epl-upgrade-available upgrade) 'force)
- (unless preserve-obsolete
- (epl-package-delete (epl-upgrade-installed upgrade))))
- upgrades))
-
-(provide 'epl)
-
-;;; epl.el ends here
diff --git a/elpa/evil-20200718.842/dir b/elpa/evil-20200718.842/dir
deleted file mode 100644
index b3717a5..0000000
--- a/elpa/evil-20200718.842/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* evil: (evil.info). Extensible vi layer for Emacs
diff --git a/elpa/evil-20200718.842/evil-autoloads.el b/elpa/evil-20200718.842/evil-autoloads.el
deleted file mode 100644
index 40102e1..0000000
--- a/elpa/evil-20200718.842/evil-autoloads.el
+++ /dev/null
@@ -1,128 +0,0 @@
-;;; evil-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "evil-command-window" "evil-command-window.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from evil-command-window.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-command-window" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-commands" "evil-commands.el" (0 0 0 0))
-;;; Generated autoloads from evil-commands.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-commands" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-common" "evil-common.el" (0 0 0 0))
-;;; Generated autoloads from evil-common.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-common" '("evil-" "forward-evil-" "bounds-of-evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-core" "evil-core.el" (0 0 0 0))
-;;; Generated autoloads from evil-core.el
- (autoload 'evil-mode "evil" nil t)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-core" '("evil-" "turn-o")))
-
-;;;***
-
-;;;### (autoloads nil "evil-digraphs" "evil-digraphs.el" (0 0 0 0))
-;;; Generated autoloads from evil-digraphs.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-digraphs" '("evil-digraph")))
-
-;;;***
-
-;;;### (autoloads nil "evil-ex" "evil-ex.el" (0 0 0 0))
-;;; Generated autoloads from evil-ex.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-ex" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-integration" "evil-integration.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from evil-integration.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-integration" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-jumps" "evil-jumps.el" (0 0 0 0))
-;;; Generated autoloads from evil-jumps.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-jumps" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-macros" "evil-macros.el" (0 0 0 0))
-;;; Generated autoloads from evil-macros.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-macros" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-maps" "evil-maps.el" (0 0 0 0))
-;;; Generated autoloads from evil-maps.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-maps" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-repeat" "evil-repeat.el" (0 0 0 0))
-;;; Generated autoloads from evil-repeat.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-repeat" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-search" "evil-search.el" (0 0 0 0))
-;;; Generated autoloads from evil-search.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-search" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-states" "evil-states.el" (0 0 0 0))
-;;; Generated autoloads from evil-states.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-states" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil "evil-types" "evil-types.el" (0 0 0 0))
-;;; Generated autoloads from evil-types.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-types" '("evil-ex-get-optional-register-and-count")))
-
-;;;***
-
-;;;### (autoloads nil "evil-vars" "evil-vars.el" (0 0 0 0))
-;;; Generated autoloads from evil-vars.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-vars" '("evil-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("evil-development.el" "evil-keybindings.el"
-;;;;;; "evil-pkg.el" "evil.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; evil-autoloads.el ends here
diff --git a/elpa/evil-20200718.842/evil-command-window.el b/elpa/evil-20200718.842/evil-command-window.el
deleted file mode 100644
index 3d3397f..0000000
--- a/elpa/evil-20200718.842/evil-command-window.el
+++ /dev/null
@@ -1,189 +0,0 @@
-;;; evil-command-window.el --- Evil command line window implementation -*- lexical-binding: t -*-
-;; Author: Emanuel Evans <emanuel.evans at gmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This provides an implementation of the vim command line window for
-;; editing and repeating past ex commands and searches.
-
-;;; Code:
-
-(require 'evil-vars)
-(require 'evil-common)
-(require 'evil-search)
-(require 'evil-ex)
-
-(defvar evil-search-module)
-
-(define-derived-mode evil-command-window-mode fundamental-mode "Evil-cmd"
- "Major mode for the Evil command line window."
- (auto-fill-mode 0)
- (setq-local after-change-functions (cons 'evil-command-window-draw-prefix
- after-change-functions)))
-
-(defun evil-command-window (hist cmd-key execute-fn)
- "Open a command line window for HIST with CMD-KEY and EXECUTE-FN.
-HIST should be a list of commands. CMD-KEY should be the string of
-the key whose history is being shown (one of \":\", \"/\", or
-\"?\"). EXECUTE-FN should be a function of one argument to
-execute on the result that the user selects."
- (when (eq major-mode 'evil-command-window-mode)
- (user-error "Cannot recursively open command line window"))
- (dolist (win (window-list))
- (when (equal (buffer-name (window-buffer win))
- "*Command Line*")
- (kill-buffer (window-buffer win))
- (delete-window win)))
- (split-window nil
- (unless (zerop evil-command-window-height)
- evil-command-window-height)
- 'above)
- (setq evil-command-window-current-buffer (current-buffer))
- (ignore-errors (kill-buffer "*Command Line*"))
- (switch-to-buffer "*Command Line*")
- (setq-local evil-command-window-execute-fn execute-fn)
- (setq-local evil-command-window-cmd-key cmd-key)
- (evil-command-window-mode)
- (evil-command-window-insert-commands hist))
-
-(defun evil-command-window-ex (&optional current-command execute-fn)
- "Open a command line window for editing and executing ex commands.
-If CURRENT-COMMAND is present, it will be inserted under the
-cursor as the current command to be edited. If EXECUTE-FN is given,
-it will be used as the function to execute instead of
-`evil-command-window-ex-execute', the default."
- (interactive)
- (evil-command-window (cons (or current-command "") evil-ex-history)
- ":"
- (or execute-fn 'evil-command-window-ex-execute)))
-
-(defun evil-ex-command-window ()
- "Start command window with ex history and current minibuffer content."
- (interactive)
- (let ((current (minibuffer-contents))
- (config (current-window-configuration)))
- (evil-ex-teardown)
- (select-window (minibuffer-selected-window) t)
- (evil-command-window-ex current (apply-partially 'evil-ex-command-window-execute config))))
-
-(defun evil-ex-search-command-window ()
- "Start command window with search history and current minibuffer content."
- (interactive)
- (let ((current (minibuffer-contents))
- (config (current-window-configuration)))
- (select-window (minibuffer-selected-window) t)
- (evil-command-window (cons current evil-ex-search-history)
- (evil-search-prompt (eq evil-ex-search-direction 'forward))
- (apply-partially 'evil-ex-command-window-execute config))))
-
-(defun evil-command-window-execute ()
- "Execute the command under the cursor in the appropriate buffer.
-The local var `evil-command-window-execute-fn' determines which
-function to execute."
- (interactive)
- (let ((result (buffer-substring (line-beginning-position)
- (line-end-position)))
- (execute-fn evil-command-window-execute-fn)
- (command-window (get-buffer-window)))
- (select-window (previous-window))
- (unless (equal evil-command-window-current-buffer (current-buffer))
- (user-error "Originating buffer is no longer active"))
- (kill-buffer "*Command Line*")
- (delete-window command-window)
- (funcall execute-fn result)
- (setq evil-command-window-current-buffer nil)))
-
-(defun evil-command-window-ex-execute (result)
- "Execute RESULT as an ex command in the appropriate buffer."
- (unless (string-match-p "^ *$" result)
- (unless (equal result (car evil-ex-history))
- (setq evil-ex-history (cons result evil-ex-history)))
- (let ((evil-ex-current-buffer evil-command-window-current-buffer))
- (evil-ex-execute result))))
-
-(defun evil-command-window-search-forward ()
- "Open a command line window for forward searches."
- (interactive)
- (evil-command-window (cons ""
- (if (eq evil-search-module 'evil-search)
- evil-ex-search-history
- evil-search-forward-history))
- "/"
- (lambda (result)
- (evil-command-window-search-execute result t))))
-
-(defun evil-command-window-search-backward ()
- "Open a command line window for backward searches."
- (interactive)
- (evil-command-window (cons ""
- (if (eq evil-search-module 'evil-search)
- evil-ex-search-history
- evil-search-backward-history))
- "?"
- (lambda (result)
- (evil-command-window-search-execute result nil))))
-
-(defun evil-command-window-search-execute (result forward)
- "Search for RESULT using FORWARD to determine direction."
- (unless (zerop (length result))
-
- (if (eq evil-search-module 'evil-search)
- (progn
- (setq evil-ex-search-pattern (evil-ex-make-search-pattern result)
- evil-ex-search-direction (if forward 'forward 'backward))
- (unless (equal result (car-safe evil-ex-search-history))
- (push result evil-ex-search-history))
- (evil-ex-search))
- (if forward
- (unless (equal result (car-safe evil-search-forward-history))
- (push result evil-search-forward-history))
- (unless (equal result (car-safe evil-search-backward-history))
- (push result evil-search-backward-history)))
- (evil-search result forward evil-regexp-search))))
-
-(defun evil-command-window-draw-prefix (&rest ignored)
- "Display `evil-command-window-cmd-key' as a prefix to the current line.
-Parameters passed in through IGNORED are ignored."
- (let ((prefix (propertize evil-command-window-cmd-key
- 'font-lock-face 'minibuffer-prompt)))
- (set-text-properties (line-beginning-position) (line-beginning-position 2)
- (list 'line-prefix prefix))))
-
-(defun evil-command-window-insert-commands (hist)
- "Insert the commands in HIST."
- (let ((inhibit-modification-hooks t))
- (mapc #'(lambda (cmd) (insert cmd) (newline)) hist)
- (reverse-region (point-min) (point-max)))
- (let ((prefix (propertize evil-command-window-cmd-key
- 'font-lock-face 'minibuffer-prompt)))
- (set-text-properties (point-min) (point-max) (list 'line-prefix prefix)))
- (goto-char (point-max))
- (when (and (bolp) (not (bobp))) (backward-char))
- (evil-adjust-cursor))
-
-(provide 'evil-command-window)
-
-;;; evil-command-window.el ends here
diff --git a/elpa/evil-20200718.842/evil-commands.el b/elpa/evil-20200718.842/evil-commands.el
deleted file mode 100644
index c1724b6..0000000
--- a/elpa/evil-20200718.842/evil-commands.el
+++ /dev/null
@@ -1,4555 +0,0 @@
-;;; evil-commands.el --- Evil commands and operators -*- lexical-binding: t -*-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-common)
-(require 'evil-digraphs)
-(require 'evil-search)
-(require 'evil-ex)
-(require 'evil-types)
-(require 'evil-command-window)
-(require 'evil-jumps)
-(require 'flyspell)
-(require 'cl-lib)
-(require 'reveal)
-
-(declare-function imenu--in-alist "imenu")
-
-;;; Motions
-
-;; Movement commands, or motions, are defined with the macro
-;; `evil-define-motion'. A motion is a command with an optional
-;; argument COUNT (interactively accessed by the code "<c>").
-;; It may specify the :type command property (e.g., :type line),
-;; which determines how it is handled by an operator command.
-;; Furthermore, the command must have the command properties
-;; :keep-visual t and :repeat motion; these are automatically
-;; set by the `evil-define-motion' macro.
-
-;;; Code:
-
-(evil-define-motion evil-forward-char (count &optional crosslines noerror)
- "Move cursor to the right by COUNT characters.
-Movement is restricted to the current line unless CROSSLINES is non-nil.
-If NOERROR is non-nil, don't signal an error upon reaching the end
-of the line or the buffer; just return nil."
- :type exclusive
- (interactive "<c>" (list evil-cross-lines
- (evil-kbd-macro-suppress-motion-error)))
- (cond
- (noerror
- (condition-case nil
- (evil-forward-char count crosslines nil)
- (error nil)))
- ((not crosslines)
- ;; for efficiency, narrow the buffer to the projected
- ;; movement before determining the current line
- (evil-with-restriction
- (point)
- (save-excursion
- (evil-forward-char (1+ (or count 1)) t t)
- (point))
- (condition-case err
- (evil-narrow-to-line
- (evil-forward-char count t noerror))
- (error
- ;; Restore the previous command (this one never happend).
- ;; Actually, this preserves the current column if the
- ;; previous command was `evil-next-line' or
- ;; `evil-previous-line'.
- (setq this-command last-command)
- (signal (car err) (cdr err))))))
- (t
- (evil-motion-loop (nil (or count 1))
- (forward-char)
- ;; don't put the cursor on a newline
- (when (and (not evil-move-beyond-eol)
- (not (evil-visual-state-p))
- (not (evil-operator-state-p))
- (eolp) (not (eobp)) (not (bolp)))
- (forward-char))))))
-
-(evil-define-motion evil-backward-char (count &optional crosslines noerror)
- "Move cursor to the left by COUNT characters.
-Movement is restricted to the current line unless CROSSLINES is non-nil.
-If NOERROR is non-nil, don't signal an error upon reaching the beginning
-of the line or the buffer; just return nil."
- :type exclusive
- (interactive "<c>" (list evil-cross-lines
- (evil-kbd-macro-suppress-motion-error)))
- (cond
- (noerror
- (condition-case nil
- (evil-backward-char count crosslines nil)
- (error nil)))
- ((not crosslines)
- ;; restrict movement to the current line
- (evil-with-restriction
- (save-excursion
- (evil-backward-char (1+ (or count 1)) t t)
- (point))
- (1+ (point))
- (condition-case err
- (evil-narrow-to-line
- (evil-backward-char count t noerror))
- (error
- ;; Restore the previous command (this one never happened).
- ;; Actually, this preserves the current column if the
- ;; previous command was `evil-next-line' or
- ;; `evil-previous-line'.
- (setq this-command last-command)
- (signal (car err) (cdr err))))))
- (t
- (evil-motion-loop (nil (or count 1))
- (backward-char)
- ;; don't put the cursor on a newline
- (unless (or (evil-visual-state-p) (evil-operator-state-p))
- (evil-adjust-cursor))))))
-
-(evil-define-motion evil-next-line (count)
- "Move the cursor COUNT lines down."
- :type line
- (let (line-move-visual)
- (evil-line-move (or count 1))))
-
-(evil-define-motion evil-previous-line (count)
- "Move the cursor COUNT lines up."
- :type line
- (let (line-move-visual)
- (evil-line-move (- (or count 1)))))
-
-(evil-define-motion evil-next-visual-line (count)
- "Move the cursor COUNT screen lines down."
- :type exclusive
- (let ((line-move-visual t))
- (evil-line-move (or count 1))))
-
-(evil-define-motion evil-previous-visual-line (count)
- "Move the cursor COUNT screen lines up."
- :type exclusive
- (let ((line-move-visual t))
- (evil-line-move (- (or count 1)))))
-
-;; used for repeated commands like "dd"
-(evil-define-motion evil-line (count)
- "Move COUNT - 1 lines down."
- :type line
- (let (line-move-visual)
- ;; Catch bob and eob errors. These are caused when not moving
- ;; point starting in the first or last line, respectively. In this
- ;; case the current line should be selected.
- (condition-case _err
- (evil-line-move (1- (or count 1)))
- ((beginning-of-buffer end-of-buffer)))))
-
-(evil-define-motion evil-line-or-visual-line (count)
- "Move COUNT - 1 lines down."
- :type screen-line
- (let ((line-move-visual (and evil-respect-visual-line-mode
- visual-line-mode)))
- ;; Catch bob and eob errors. These are caused when not moving
- ;; point starting in the first or last line, respectively. In this
- ;; case the current line should be selected.
- (condition-case _err
- (evil-line-move (1- (or count 1)))
- ((beginning-of-buffer end-of-buffer)))))
-
-(evil-define-motion evil-beginning-of-line ()
- "Move the cursor to the beginning of the current line."
- :type exclusive
- (move-beginning-of-line nil))
-
-(evil-define-motion evil-end-of-line (count)
- "Move the cursor to the end of the current line.
-If COUNT is given, move COUNT - 1 lines downward first."
- :type inclusive
- (move-end-of-line count)
- (when evil-track-eol
- (setq temporary-goal-column most-positive-fixnum
- this-command 'next-line))
- (unless (evil-visual-state-p)
- (evil-adjust-cursor)
- (when (eolp)
- ;; prevent "c$" and "d$" from deleting blank lines
- (setq evil-this-type 'exclusive))))
-
-(evil-define-motion evil-beginning-of-visual-line ()
- "Move the cursor to the first character of the current screen line."
- :type exclusive
- (if (fboundp 'beginning-of-visual-line)
- (beginning-of-visual-line)
- (beginning-of-line)))
-
-(evil-define-motion evil-end-of-visual-line (count)
- "Move the cursor to the last character of the current screen line.
-If COUNT is given, move COUNT - 1 screen lines downward first."
- :type inclusive
- (if (fboundp 'end-of-visual-line)
- (end-of-visual-line count)
- (end-of-line count)))
-
-(evil-define-motion evil-end-of-line-or-visual-line (count)
- "Move the cursor to the last character of the current screen
-line if `visual-line-mode' is active and
-`evil-respect-visual-line-mode' is non-nil. If COUNT is given,
-move COUNT - 1 screen lines downward first."
- :type inclusive
- (if (and (fboundp 'end-of-visual-line)
- evil-respect-visual-line-mode
- visual-line-mode)
- (end-of-visual-line count)
- (evil-end-of-line count)))
-
-(evil-define-motion evil-middle-of-visual-line ()
- "Move the cursor to the middle of the current visual line."
- :type exclusive
- (beginning-of-visual-line)
- (evil-with-restriction
- nil
- (save-excursion (end-of-visual-line) (point))
- (move-to-column (+ (current-column)
- -1
- (/ (with-no-warnings (window-body-width)) 2)))))
-
-(evil-define-motion evil-beginning-of-line-or-digit-argument ()
- "Move the cursor to the beginning of the current line.
-This function passes its command to `digit-argument' (usually a 0)
-if it is not the first event."
- :type exclusive
- (cond
- (current-prefix-arg
- (setq this-command #'digit-argument)
- (call-interactively #'digit-argument))
- (t
- (setq this-command #'evil-beginning-of-line)
- (call-interactively #'evil-beginning-of-line))))
-
-(evil-define-motion evil-first-non-blank ()
- "Move the cursor to the first non-blank character of the current line."
- :type exclusive
- (evil-narrow-to-line (back-to-indentation)))
-
-(evil-define-motion evil-last-non-blank (count)
- "Move the cursor to the last non-blank character of the current line.
-If COUNT is given, move COUNT - 1 lines downward first."
- :type inclusive
- (goto-char
- (save-excursion
- (evil-move-beginning-of-line count)
- (if (re-search-forward "[ \t]*$")
- (max (line-beginning-position)
- (1- (match-beginning 0)))
- (line-beginning-position)))))
-
-(evil-define-motion evil-first-non-blank-of-visual-line ()
- "Move the cursor to the first non blank character
-of the current screen line."
- :type exclusive
- (evil-beginning-of-visual-line)
- (skip-chars-forward " \t\r"))
-
-(evil-define-motion evil-next-line-first-non-blank (count)
- "Move the cursor COUNT lines down on the first non-blank character."
- :type line
- (let ((this-command this-command))
- (evil-next-line (or count 1)))
- (evil-first-non-blank))
-
-(evil-define-motion evil-next-line-1-first-non-blank (count)
- "Move the cursor COUNT-1 lines down on the first non-blank character."
- :type line
- (let ((this-command this-command))
- (evil-next-line (1- (or count 1))))
- (evil-first-non-blank))
-
-(evil-define-motion evil-previous-line-first-non-blank (count)
- "Move the cursor COUNT lines up on the first non-blank character."
- :type line
- (let ((this-command this-command))
- (evil-previous-line (or count 1)))
- (evil-first-non-blank))
-
-(evil-define-motion evil-goto-line (count)
- "Go to the first non-blank character of line COUNT.
-By default the last line."
- :jump t
- :type line
- (if (null count)
- (with-no-warnings (end-of-buffer))
- (goto-char (point-min))
- (forward-line (1- count)))
- (evil-first-non-blank))
-
-(evil-define-motion evil-goto-first-line (count)
- "Go to the first non-blank character of line COUNT.
-By default the first line."
- :jump t
- :type line
- (evil-goto-line (or count 1)))
-
-(evil-define-motion evil-forward-word-begin (count &optional bigword)
- "Move the cursor to the beginning of the COUNT-th next word.
-If BIGWORD is non-nil, move by WORDS.
-
-If this command is called in operator-pending state it behaves
-differently. If point reaches the beginning of a word on a new
-line point is moved back to the end of the previous line.
-
-If called after a change operator, i.e. cw or cW,
-`evil-want-change-word-to-end' is non-nil and point is on a word,
-then both behave like ce or cE.
-
-If point is at the end of the buffer and cannot be moved signal
-'end-of-buffer is raised.
-"
- :type exclusive
- (let ((thing (if bigword 'evil-WORD 'evil-word))
- (orig (point))
- (count (or count 1)))
- (evil-signal-at-bob-or-eob count)
- (cond
- ;; default motion, beginning of next word
- ((not (evil-operator-state-p))
- (evil-forward-beginning thing count))
- ;; the evil-change operator, maybe behave like ce or cE
- ((and evil-want-change-word-to-end
- (memq evil-this-operator evil-change-commands)
- (< orig (or (cdr-safe (bounds-of-thing-at-point thing)) orig)))
- ;; forward-thing moves point to the correct position because
- ;; this is an exclusive motion
- (forward-thing thing count))
- ;; operator state
- (t
- (prog1 (evil-forward-beginning thing count)
- ;; if we reached the beginning of a word on a new line in
- ;; Operator-Pending state, go back to the end of the previous
- ;; line
- (when (and (> (line-beginning-position) orig)
- (looking-back "^[[:space:]]*" (line-beginning-position)))
- ;; move cursor back as long as the line contains only
- ;; whitespaces and is non-empty
- (evil-move-end-of-line 0)
- ;; skip non-empty lines containing only spaces
- (while (and (looking-back "^[[:space:]]+$" (line-beginning-position))
- (not (<= (line-beginning-position) orig)))
- (evil-move-end-of-line 0))
- ;; but if the previous line is empty, delete this line
- (when (bolp) (forward-char))))))))
-
-(evil-define-motion evil-forward-word-end (count &optional bigword)
- "Move the cursor to the end of the COUNT-th next word.
-If BIGWORD is non-nil, move by WORDS."
- :type inclusive
- (let ((thing (if bigword 'evil-WORD 'evil-word))
- (count (or count 1)))
- (evil-signal-at-bob-or-eob count)
- ;; Evil special behaviour: e or E on a one-character word in
- ;; operator state does not move point
- (unless (and (evil-operator-state-p)
- (= 1 count)
- (let ((bnd (bounds-of-thing-at-point thing)))
- (and bnd
- (= (car bnd) (point))
- (= (cdr bnd) (1+ (point)))))
- (looking-at "[[:word:]]"))
- (evil-forward-end thing count))))
-
-(evil-define-motion evil-backward-word-begin (count &optional bigword)
- "Move the cursor to the beginning of the COUNT-th previous word.
-If BIGWORD is non-nil, move by WORDS."
- :type exclusive
- (let ((thing (if bigword 'evil-WORD 'evil-word)))
- (evil-signal-at-bob-or-eob (- (or count 1)))
- (evil-backward-beginning thing count)))
-
-(evil-define-motion evil-backward-word-end (count &optional bigword)
- "Move the cursor to the end of the COUNT-th previous word.
-If BIGWORD is non-nil, move by WORDS."
- :type inclusive
- (let ((thing (if bigword 'evil-WORD 'evil-word)))
- (evil-signal-at-bob-or-eob (- (or count 1)))
- (evil-backward-end thing count)))
-
-(evil-define-motion evil-forward-WORD-begin (count)
- "Move the cursor to the beginning of the COUNT-th next WORD."
- :type exclusive
- (evil-forward-word-begin count t))
-
-(evil-define-motion evil-forward-WORD-end (count)
- "Move the cursor to the end of the COUNT-th next WORD."
- :type inclusive
- (evil-forward-word-end count t))
-
-(evil-define-motion evil-backward-WORD-begin (count)
- "Move the cursor to the beginning of the COUNT-th previous WORD."
- :type exclusive
- (evil-backward-word-begin count t))
-
-(evil-define-motion evil-backward-WORD-end (count)
- "Move the cursor to the end of the COUNT-th previous WORD."
- :type inclusive
- (evil-backward-word-end count t))
-
-;; section movement
-(evil-define-motion evil-forward-section-begin (count)
- "Move the cursor to the beginning of the COUNT-th next section."
- :jump t
- :type exclusive
- (evil-signal-at-bob-or-eob count)
- (evil-forward-beginning 'evil-defun count))
-
-(evil-define-motion evil-forward-section-end (count)
- "Move the cursor to the end of the COUNT-th next section."
- :jump t
- :type inclusive
- (evil-signal-at-bob-or-eob count)
- (evil-forward-end 'evil-defun count)
- (unless (eobp) (forward-line)))
-
-(evil-define-motion evil-backward-section-begin (count)
- "Move the cursor to the beginning of the COUNT-th previous section."
- :jump t
- :type exclusive
- (evil-signal-at-bob-or-eob (- (or count 1)))
- (evil-backward-beginning 'evil-defun count))
-
-(evil-define-motion evil-backward-section-end (count)
- "Move the cursor to the end of the COUNT-th previous section."
- :jump t
- :type inclusive
- (evil-signal-at-bob-or-eob (- (or count 1)))
- (end-of-line -1)
- (evil-backward-end 'evil-defun count)
- (unless (eobp) (forward-line)))
-
-(evil-define-motion evil-forward-sentence-begin (count)
- "Move to the next COUNT-th beginning of a sentence or end of a paragraph."
- :jump t
- :type exclusive
- (evil-signal-at-bob-or-eob count)
- (evil-forward-nearest count
- #'(lambda (_cnt)
- (evil-forward-beginning 'evil-sentence))
- #'evil-forward-paragraph))
-
-(evil-define-motion evil-backward-sentence-begin (count)
- "Move to the previous COUNT-th beginning of a sentence or paragraph."
- :jump t
- :type exclusive
- (evil-signal-at-bob-or-eob (- (or count 1)))
- (evil-forward-nearest (- (or count 1))
- #'(lambda (_cnt)
- (evil-backward-beginning 'evil-sentence))
- #'(lambda (_cnt)
- (evil-backward-paragraph))))
-
-(evil-define-motion evil-forward-paragraph (count)
- "Move to the end of the COUNT-th next paragraph."
- :jump t
- :type exclusive
- (evil-signal-at-bob-or-eob count)
- (evil-forward-end 'evil-paragraph count)
- (unless (eobp) (forward-line)))
-
-(evil-define-motion evil-backward-paragraph (count)
- "Move to the beginning of the COUNT-th previous paragraph."
- :jump t
- :type exclusive
- (evil-signal-at-bob-or-eob (- (or count 1)))
- (unless (eobp) (forward-line))
- (evil-backward-beginning 'evil-paragraph count)
- (unless (bobp) (forward-line -1)))
-
-(defvar hif-ifx-else-endif-regexp)
-(evil-define-motion evil-jump-item (count)
- "Find the next item in this line after or under the cursor
-and jump to the corresponding one."
- :jump t
- :type inclusive
- (cond
- ;; COUNT% jumps to a line COUNT percentage down the file
- (count
- (goto-char
- (evil-normalize-position
- (let ((size (- (point-max) (point-min))))
- (+ (point-min)
- (if (> size 80000)
- (* count (/ size 100))
- (/ (* count size) 100))))))
- (back-to-indentation)
- (setq evil-this-type 'line))
- ((and (evil-looking-at-start-comment t)
- (let ((pnt (point)))
- (forward-comment 1)
- (or (not (bolp))
- (prog1 nil (goto-char pnt)))))
- (backward-char))
- ((and (not (eolp)) (evil-looking-at-end-comment t))
- (forward-comment -1))
- ((and
- (memq major-mode '(c-mode c++-mode))
- (require 'hideif nil t)
- (with-no-warnings
- (let* ((hif-else-regexp (concat hif-cpp-prefix "\\(?:else\\|elif[ \t]+\\)"))
- (hif-ifx-else-endif-regexp
- (concat hif-ifx-regexp "\\|" hif-else-regexp "\\|" hif-endif-regexp)))
- (cond
- ((save-excursion (beginning-of-line) (or (hif-looking-at-ifX) (hif-looking-at-else)))
- (hif-find-next-relevant)
- (while (hif-looking-at-ifX)
- (hif-ifdef-to-endif)
- (hif-find-next-relevant))
- t)
- ((save-excursion (beginning-of-line) (hif-looking-at-endif))
- (hif-endif-to-ifdef)
- t))))))
- (t
- (let* ((open (point-max))
- (close (point-max))
- (open-pair (condition-case nil
- (save-excursion
- ;; consider the character right before eol given that
- ;; point may be placed there, e.g. in visual state
- (when (and (eolp) (not (bolp)))
- (backward-char))
- (setq open (1- (scan-lists (point) 1 -1)))
- (when (< open (line-end-position))
- (goto-char open)
- (forward-list)
- (1- (point))))
- (error nil)))
- (close-pair (condition-case nil
- (save-excursion
- ;; consider the character right before eol given that
- ;; point may be placed there, e.g. in visual state
- (when (and (eolp) (not (bolp)))
- (backward-char))
- (setq close (1- (scan-lists (point) 1 1)))
- (when (< close (line-end-position))
- (goto-char (1+ close))
- (backward-list)
- (point)))
- (error nil))))
- (cond
- ((not (or open-pair close-pair))
- ;; nothing found, check if we are inside a string
- (let ((pnt (point))
- (bnd (bounds-of-thing-at-point 'evil-string)))
- (if (not (and bnd (< (point) (cdr bnd))))
- ;; no, then we really failed
- (user-error "No matching item found on the current line")
- ;; yes, go to the end of the string and try again
- (let ((endstr (cdr bnd)))
- (when (or (save-excursion
- (goto-char endstr)
- (let ((b (bounds-of-thing-at-point 'evil-string)))
- (and b (< (point) (cdr b))))) ; not at end of string
- (condition-case nil
- (progn
- (goto-char endstr)
- (evil-jump-item)
- nil)
- (error t)))
- ;; failed again, go back to original point
- (goto-char pnt)
- (user-error "No matching item found on the current line"))))))
- ((< open close) (goto-char open-pair))
- (t (goto-char close-pair)))))))
-
-(defun evil--flyspell-overlays-in-p (beg end)
- (let ((ovs (overlays-in beg end))
- done)
- (while (and ovs (not done))
- (when (flyspell-overlay-p (car ovs))
- (setq done t))
- (setq ovs (cdr ovs)))
- done))
-
-(defun evil--flyspell-overlay-at (pos forwardp)
- (when (not forwardp)
- (setq pos (max (1- pos) (point-min))))
- (let ((ovs (overlays-at pos))
- done)
- (while (and ovs (not done))
- (if (flyspell-overlay-p (car ovs))
- (setq done t)
- (setq ovs (cdr ovs))))
- (when done
- (car ovs))))
-
-(defun evil--flyspell-overlay-after (pos limit forwardp)
- (let (done)
- (while (and (if forwardp
- (< pos limit)
- (> pos limit))
- (not done))
- (let ((ov (evil--flyspell-overlay-at pos forwardp)))
- (when ov
- (setq done ov)))
- (setq pos (if forwardp
- (next-overlay-change pos)
- (previous-overlay-change pos))))
- done))
-
-(defun evil--next-flyspell-error (forwardp)
- (when (evil--flyspell-overlays-in-p (point-min) (point-max))
- (let ((pos (point))
- limit
- ov)
- (when (evil--flyspell-overlay-at pos forwardp)
- (if (/= pos (point-min))
- (setq pos (save-excursion (goto-char pos)
- (forward-word (if forwardp 1 -1))
- (point)))
- (setq pos (point-max))))
- (setq limit (if forwardp (point-max) (point-min))
- ov (evil--flyspell-overlay-after pos limit forwardp))
- (if ov
- (goto-char (overlay-start ov))
- (when evil-search-wrap
- (setq limit pos
- pos (if forwardp (point-min) (point-max))
- ov (evil--flyspell-overlay-after pos limit forwardp))
- (when ov
- (goto-char (overlay-start ov))))))))
-
-(evil-define-motion evil-next-flyspell-error (count)
- "Go to the COUNT'th spelling mistake after point."
- (interactive "p")
- (dotimes (_ count)
- (evil--next-flyspell-error t)))
-
-(evil-define-motion evil-prev-flyspell-error (count)
- "Go to the COUNT'th spelling mistake preceding point."
- (interactive "p")
- (dotimes (_ count)
- (evil--next-flyspell-error nil)))
-
-(evil-define-motion evil-previous-open-paren (count)
- "Go to [count] previous unmatched '('."
- :type exclusive
- (evil-up-paren ?\( ?\) (- (or count 1))))
-
-(evil-define-motion evil-next-close-paren (count)
- "Go to [count] next unmatched ')'."
- :type exclusive
- (forward-char)
- (evil-up-paren ?\( ?\) (or count 1))
- (backward-char))
-
-(evil-define-motion evil-previous-open-brace (count)
- "Go to [count] previous unmatched '{'."
- :type exclusive
- (evil-up-paren ?{ ?} (- (or count 1))))
-
-(evil-define-motion evil-next-close-brace (count)
- "Go to [count] next unmatched '}'."
- :type exclusive
- (forward-char)
- (evil-up-paren ?{ ?} (or count 1))
- (backward-char))
-
-(evil-define-motion evil-find-char (count char)
- "Move to the next COUNT'th occurrence of CHAR.
-Movement is restricted to the current line unless `evil-cross-lines' is non-nil."
- :type inclusive
- (interactive "<c><C>")
- (setq count (or count 1))
- (let ((fwd (> count 0))
- (visual (and evil-respect-visual-line-mode
- visual-line-mode)))
- (setq evil-last-find (list #'evil-find-char char fwd))
- (when fwd (forward-char))
- (let ((case-fold-search nil))
- (unless (prog1
- (search-forward (char-to-string char)
- (cond (evil-cross-lines
- nil)
- ((and fwd visual)
- (save-excursion
- (end-of-visual-line)
- (point)))
- (fwd
- (line-end-position))
- (visual
- (save-excursion
- (beginning-of-visual-line)
- (point)))
- (t
- (line-beginning-position)))
- t count)
- (when fwd (backward-char)))
- (user-error "Can't find %c" char)))))
-
-(evil-define-motion evil-find-char-backward (count char)
- "Move to the previous COUNT'th occurrence of CHAR."
- :type exclusive
- (interactive "<c><C>")
- (evil-find-char (- (or count 1)) char))
-
-(evil-define-motion evil-find-char-to (count char)
- "Move before the next COUNT'th occurrence of CHAR."
- :type inclusive
- (interactive "<c><C>")
- (unwind-protect
- (progn
- (evil-find-char count char)
- (if (> (or count 1) 0)
- (backward-char)
- (forward-char)))
- (setcar evil-last-find #'evil-find-char-to)))
-
-(evil-define-motion evil-find-char-to-backward (count char)
- "Move before the previous COUNT'th occurrence of CHAR."
- :type exclusive
- (interactive "<c><C>")
- (evil-find-char-to (- (or count 1)) char))
-
-(evil-define-motion evil-repeat-find-char (count)
- "Repeat the last find COUNT times."
- :type inclusive
- (setq count (or count 1))
- (if evil-last-find
- (let ((cmd (car evil-last-find))
- (char (nth 1 evil-last-find))
- (fwd (nth 2 evil-last-find))
- evil-last-find)
- ;; ensure count is non-negative
- (when (< count 0)
- (setq count (- count)
- fwd (not fwd)))
- ;; skip next character when repeating t or T
- (and (eq cmd #'evil-find-char-to)
- evil-repeat-find-to-skip-next
- (= count 1)
- (or (and fwd (= (char-after (1+ (point))) char))
- (and (not fwd) (= (char-before) char)))
- (setq count (1+ count)))
- (funcall cmd (if fwd count (- count)) char)
- (unless (nth 2 evil-last-find)
- (setq evil-this-type 'exclusive)))
- (user-error "No previous search")))
-
-(evil-define-motion evil-repeat-find-char-reverse (count)
- "Repeat the last find COUNT times in the opposite direction."
- :type inclusive
- (evil-repeat-find-char (- (or count 1))))
-
-;; ceci n'est pas une pipe
-(evil-define-motion evil-goto-column (count)
- "Go to column COUNT on the current line.
-Columns are counted from zero."
- :type exclusive
- (move-to-column (or count 0)))
-
-(evil-define-command evil-goto-mark (char &optional noerror)
- "Go to the marker specified by CHAR."
- :keep-visual t
- :repeat nil
- :type exclusive
- :jump t
- (interactive (list (read-char)))
- (let ((marker (evil-get-marker char)))
- (cond
- ((markerp marker)
- (switch-to-buffer (marker-buffer marker))
- (goto-char (marker-position marker)))
- ((numberp marker)
- (goto-char marker))
- ((consp marker)
- (when (or (find-buffer-visiting (car marker))
- (and (y-or-n-p (format "Visit file %s again? "
- (car marker)))
- (find-file (car marker))))
- (goto-char (cdr marker))))
- ((not noerror)
- (user-error "Marker `%c' is not set%s" char
- (if (evil-global-marker-p char) ""
- " in this buffer"))))))
-
-(evil-define-command evil-goto-mark-line (char &optional noerror)
- "Go to the line of the marker specified by CHAR."
- :keep-visual t
- :repeat nil
- :type line
- :jump t
- (interactive (list (read-char)))
- (evil-goto-mark char noerror)
- (evil-first-non-blank))
-
-(evil-define-motion evil-jump-backward (count)
- "Go to older position in jump list.
-To go the other way, press \
-\\<evil-motion-state-map>\\[evil-jump-forward]."
- (evil--jump-backward count))
-
-(evil-define-motion evil-jump-forward (count)
- "Go to newer position in jump list.
-To go the other way, press \
-\\<evil-motion-state-map>\\[evil-jump-backward]."
- (evil--jump-forward count))
-
-(evil-define-motion evil-jump-backward-swap (count)
- "Go to the previous position in jump list.
-The current position is placed in the jump list."
- (let ((pnt (point)))
- (evil--jump-backward 1)
- (evil-set-jump pnt)))
-
-(defvar xref-prompt-for-identifier)
-(evil-define-motion evil-jump-to-tag (arg)
- "Jump to tag under point.
-If called with a prefix argument, provide a prompt
-for specifying the tag."
- :jump t
- (interactive "P")
- (cond
- ((fboundp 'xref-find-definitions)
- (let ((xref-prompt-for-identifier arg))
- (call-interactively #'xref-find-definitions)))
- ((fboundp 'find-tag)
- (if arg (call-interactively #'find-tag)
- (let ((tag (funcall (or find-tag-default-function
- (get major-mode 'find-tag-default-function)
- #'find-tag-default))))
- (unless tag (user-error "No tag candidate found around point"))
- (find-tag tag))))))
-
-(evil-define-motion evil-lookup ()
- "Look up the keyword at point.
-Calls `evil-lookup-func'."
- (funcall evil-lookup-func))
-
-(defun evil-ret-gen (count indent?)
- (let* ((field (get-char-property (point) 'field))
- (button (get-char-property (point) 'button))
- (doc (get-char-property (point) 'widget-doc))
- (widget (or field button doc)))
- (cond
- ((and widget
- (fboundp 'widget-type)
- (fboundp 'widget-button-press)
- (or (and (symbolp widget)
- (get widget 'widget-type))
- (and (consp widget)
- (get (widget-type widget) 'widget-type))))
- (when (evil-operator-state-p)
- (setq evil-inhibit-operator t))
- (when (fboundp 'widget-button-press)
- (widget-button-press (point))))
- ((and (fboundp 'button-at)
- (fboundp 'push-button)
- (button-at (point)))
- (when (evil-operator-state-p)
- (setq evil-inhibit-operator t))
- (push-button))
- ((or (evil-emacs-state-p)
- (and (evil-insert-state-p)
- (not buffer-read-only)))
- (if (not indent?)
- (newline count)
- (delete-horizontal-space t)
- (newline count)
- (indent-according-to-mode)))
- (t
- (evil-next-line-first-non-blank count)))))
-
-(evil-define-motion evil-ret (count)
- "Move the cursor COUNT lines down.
-If point is on a widget or a button, click on it.
-In Insert state, insert a newline."
- :type line
- (evil-ret-gen count nil))
-
-(evil-define-motion evil-ret-and-indent (count)
- "Move the cursor COUNT lines down.
-If point is on a widget or a button, click on it.
-In Insert state, insert a newline and indent."
- :type line
- (evil-ret-gen count t))
-
-(evil-define-motion evil-window-top (count)
- "Move the cursor to line COUNT from the top of the window
-on the first non-blank character."
- :jump t
- :type line
- (move-to-window-line (max (or count 0)
- (if (= (point-min) (window-start))
- 0
- scroll-margin)))
- (back-to-indentation))
-
-(evil-define-motion evil-window-middle ()
- "Move the cursor to the middle line in the window
-on the first non-blank character."
- :jump t
- :type line
- (move-to-window-line
- (/ (1+ (save-excursion (move-to-window-line -1))) 2))
- (back-to-indentation))
-
-(evil-define-motion evil-window-bottom (count)
- "Move the cursor to line COUNT from the bottom of the window
-on the first non-blank character."
- :jump t
- :type line
- (move-to-window-line (- (max (or count 1) (1+ scroll-margin))))
- (back-to-indentation))
-
-;; scrolling
-(evil-define-command evil-scroll-line-up (count)
- "Scrolls the window COUNT lines upwards."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (let ((scroll-preserve-screen-position nil))
- (scroll-down count)))
-
-(evil-define-command evil-scroll-line-down (count)
- "Scrolls the window COUNT lines downwards."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (let ((scroll-preserve-screen-position nil))
- (scroll-up count)))
-
-(evil-define-command evil-scroll-count-reset ()
- "Sets `evil-scroll-count' to 0.
-`evil-scroll-up' and `evil-scroll-down' will scroll
-for a half of the screen(default)."
- :repeat nil
- :keep-visual t
- (interactive)
- (setq evil-scroll-count 0))
-
-(evil-define-command evil-scroll-up (count)
- "Scrolls the window and the cursor COUNT lines upwards.
-If COUNT is not specified the function scrolls down
-`evil-scroll-count', which is the last used count.
-If the scroll count is zero the command scrolls half the screen."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (evil-save-column
- (setq count (or count (max 0 evil-scroll-count)))
- (setq evil-scroll-count count)
- (when (= (point-min) (line-beginning-position))
- (signal 'beginning-of-buffer nil))
- (when (zerop count)
- (setq count (/ (window-body-height) 2)))
- (let ((xy (evil-posn-x-y (posn-at-point))))
- (condition-case nil
- (progn
- (scroll-down count)
- (goto-char (posn-point (posn-at-x-y (car xy) (cdr xy)))))
- (beginning-of-buffer
- (condition-case nil
- (with-no-warnings (previous-line count))
- (beginning-of-buffer)))))))
-
-(evil-define-command evil-scroll-down (count)
- "Scrolls the window and the cursor COUNT lines downwards.
-If COUNT is not specified the function scrolls down
-`evil-scroll-count', which is the last used count.
-If the scroll count is zero the command scrolls half the screen."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (evil-save-column
- (setq count (or count (max 0 evil-scroll-count)))
- (setq evil-scroll-count count)
- (when (eobp) (signal 'end-of-buffer nil))
- (when (zerop count)
- (setq count (/ (window-body-height) 2)))
- ;; BUG #660: First check whether the eob is visible.
- ;; In that case we do not scroll but merely move point.
- (if (<= (point-max) (window-end))
- (with-no-warnings (next-line count nil))
- (let ((xy (evil-posn-x-y (posn-at-point))))
- (condition-case nil
- (progn
- (scroll-up count)
- (let* ((wend (window-end nil t))
- (p (posn-at-x-y (car xy) (cdr xy)))
- (margin (max 0 (- scroll-margin
- (cdr (posn-col-row p))))))
- (goto-char (posn-point p))
- ;; ensure point is not within the scroll-margin
- (when (> margin 0)
- (with-no-warnings (next-line margin))
- (recenter scroll-margin))
- (when (<= (point-max) wend)
- (save-excursion
- (goto-char (point-max))
- (recenter (- (max 1 scroll-margin)))))))
- (end-of-buffer
- (goto-char (point-max))
- (recenter (- (max 1 scroll-margin)))))))))
-
-(evil-define-command evil-scroll-page-up (count)
- "Scrolls the window COUNT pages upwards."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (evil-save-column
- (dotimes (i count)
- (condition-case err
- (scroll-down nil)
- (beginning-of-buffer
- (if (and (bobp) (zerop i))
- (signal (car err) (cdr err))
- (goto-char (point-min))))))))
-
-(evil-define-command evil-scroll-page-down (count)
- "Scrolls the window COUNT pages downwards."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (evil-save-column
- (dotimes (i count)
- (condition-case err
- (scroll-up nil)
- (end-of-buffer
- (if (and (eobp) (zerop i))
- (signal (car err) (cdr err))
- (goto-char (point-max))))))))
-
-(evil-define-command evil-scroll-line-to-top (count)
- "Scrolls line number COUNT (or the cursor line) to the top of the window."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (evil-save-column
- (let ((line (or count (line-number-at-pos (point)))))
- (goto-char (point-min))
- (forward-line (1- line)))
- (recenter (1- (max 1 scroll-margin)))))
-
-(evil-define-command evil-scroll-line-to-center (count)
- "Scrolls line number COUNT (or the cursor line) to the center of the window."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (evil-save-column
- (when count
- (goto-char (point-min))
- (forward-line (1- count)))
- (recenter nil)))
-
-(evil-define-command evil-scroll-line-to-bottom (count)
- "Scrolls line number COUNT (or the cursor line) to the bottom of the window."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (evil-save-column
- (let ((line (or count (line-number-at-pos (point)))))
- (goto-char (point-min))
- (forward-line (1- line)))
- (recenter (- (max 1 scroll-margin)))))
-
-(evil-define-command evil-scroll-bottom-line-to-top (count)
- "Scrolls the line right below the window,
-or line COUNT to the top of the window."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (if count
- (progn
- (goto-char (point-min))
- (forward-line (1- count)))
- (goto-char (window-end))
- (evil-move-cursor-back))
- (recenter (1- (max 0 scroll-margin)))
- (evil-first-non-blank))
-
-(evil-define-command evil-scroll-top-line-to-bottom (count)
- "Scrolls the line right below the window,
-or line COUNT to the top of the window."
- :repeat nil
- :keep-visual t
- (interactive "<c>")
- (if count
- (progn
- (goto-char (point-min))
- (forward-line (1- count)))
- (goto-char (window-start)))
- (recenter (- (max 1 scroll-margin)))
- (evil-first-non-blank))
-
-(evil-define-command evil-scroll-left (count)
- "Scrolls the window COUNT half-screenwidths to the left."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (evil-with-hproject-point-on-window
- (scroll-right (* count (/ (window-width) 2)))))
-
-(evil-define-command evil-scroll-right (count)
- "Scrolls the window COUNT half-screenwidths to the right."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (evil-with-hproject-point-on-window
- (scroll-left (* count (/ (window-width) 2)))))
-
-(evil-define-command evil-scroll-column-left (count)
- "Scrolls the window COUNT columns to the left."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (evil-with-hproject-point-on-window
- (scroll-right count)))
-
-(evil-define-command evil-scroll-column-right (count)
- "Scrolls the window COUNT columns to the right."
- :repeat nil
- :keep-visual t
- (interactive "p")
- (evil-with-hproject-point-on-window
- (scroll-left count)))
-
-;;; Text objects
-
-;; Text objects are defined with `evil-define-text-object'. In Visual
-;; state, they modify the current selection; in Operator-Pending
-;; state, they return a pair of buffer positions. Outer text objects
-;; are bound in the keymap `evil-outer-text-objects-map', and inner
-;; text objects are bound in `evil-inner-text-objects-map'.
-;;
-;; Common text objects like words, WORDS, paragraphs and sentences are
-;; defined via a corresponding move-function. This function must have
-;; the following properties:
-;;
-;; 1. Take exactly one argument, the count.
-;; 2. When the count is positive, move point forward to the first
-;; character after the end of the next count-th object.
-;; 3. When the count is negative, move point backward to the first
-;; character of the count-th previous object.
-;; 4. If point is placed on the first character of an object, the
-;; backward motion does NOT count that object.
-;; 5. If point is placed on the last character of an object, the
-;; forward motion DOES count that object.
-;; 6. The return value is "count left", i.e., in forward direction
-;; count is decreased by one for each successful move and in
-;; backward direction count is increased by one for each
-;; successful move, returning the final value of count.
-;; Therefore, if the complete move is successful, the return
-;; value is 0.
-;;
-;; A useful macro in this regard is `evil-motion-loop', which quits
-;; when point does not move further and returns the count difference.
-;; It also provides a "unit value" of 1 or -1 for use in each
-;; iteration. For example, a hypothetical "foo-bar" move could be
-;; written as such:
-;;
-;; (defun foo-bar (count)
-;; (evil-motion-loop (var count)
-;; (forward-foo var) ; `var' is 1 or -1 depending on COUNT
-;; (forward-bar var)))
-;;
-;; If "forward-foo" and "-bar" didn't accept negative arguments,
-;; we could choose their backward equivalents by inspecting `var':
-;;
-;; (defun foo-bar (count)
-;; (evil-motion-loop (var count)
-;; (cond
-;; ((< var 0)
-;; (backward-foo 1)
-;; (backward-bar 1))
-;; (t
-;; (forward-foo 1)
-;; (forward-bar 1)))))
-;;
-;; After a forward motion, point has to be placed on the first
-;; character after some object, unless no motion was possible at all.
-;; Similarly, after a backward motion, point has to be placed on the
-;; first character of some object. This implies that point should
-;; NEVER be moved to eob or bob, unless an object ends or begins at
-;; eob or bob. (Usually, Emacs motions always move as far as possible.
-;; But we want to use the motion-function to identify certain objects
-;; in the buffer, and thus exact movement to object boundaries is
-;; required.)
-
-(evil-define-text-object evil-a-word (count &optional beg end type)
- "Select a word."
- (evil-select-an-object 'evil-word beg end type count))
-
-(evil-define-text-object evil-inner-word (count &optional beg end type)
- "Select inner word."
- (evil-select-inner-object 'evil-word beg end type count))
-
-(evil-define-text-object evil-a-WORD (count &optional beg end type)
- "Select a WORD."
- (evil-select-an-object 'evil-WORD beg end type count))
-
-(evil-define-text-object evil-inner-WORD (count &optional beg end type)
- "Select inner WORD."
- (evil-select-inner-object 'evil-WORD beg end type count))
-
-(evil-define-text-object evil-a-symbol (count &optional beg end type)
- "Select a symbol."
- (evil-select-an-object 'evil-symbol beg end type count))
-
-(evil-define-text-object evil-inner-symbol (count &optional beg end type)
- "Select inner symbol."
- (evil-select-inner-object 'evil-symbol beg end type count))
-
-(evil-define-text-object evil-a-sentence (count &optional beg end type)
- "Select a sentence."
- (evil-select-an-object 'evil-sentence beg end type count))
-
-(evil-define-text-object evil-inner-sentence (count &optional beg end type)
- "Select inner sentence."
- (evil-select-inner-object 'evil-sentence beg end type count))
-
-(evil-define-text-object evil-a-paragraph (count &optional beg end type)
- "Select a paragraph."
- :type line
- (evil-select-an-object 'evil-paragraph beg end type count t))
-
-(evil-define-text-object evil-inner-paragraph (count &optional beg end type)
- "Select inner paragraph."
- :type line
- (evil-select-inner-object 'evil-paragraph beg end type count t))
-
-(evil-define-text-object evil-a-paren (count &optional beg end type)
- "Select a parenthesis."
- :extend-selection nil
- (evil-select-paren ?\( ?\) beg end type count t))
-
-(evil-define-text-object evil-inner-paren (count &optional beg end type)
- "Select inner parenthesis."
- :extend-selection nil
- (evil-select-paren ?\( ?\) beg end type count))
-
-(evil-define-text-object evil-a-bracket (count &optional beg end type)
- "Select a square bracket."
- :extend-selection nil
- (evil-select-paren ?\[ ?\] beg end type count t))
-
-(evil-define-text-object evil-inner-bracket (count &optional beg end type)
- "Select inner square bracket."
- :extend-selection nil
- (evil-select-paren ?\[ ?\] beg end type count))
-
-(evil-define-text-object evil-a-curly (count &optional beg end type)
- "Select a curly bracket (\"brace\")."
- :extend-selection nil
- (evil-select-paren ?{ ?} beg end type count t))
-
-(evil-define-text-object evil-inner-curly (count &optional beg end type)
- "Select inner curly bracket (\"brace\")."
- :extend-selection nil
- (evil-select-paren ?{ ?} beg end type count))
-
-(evil-define-text-object evil-an-angle (count &optional beg end type)
- "Select an angle bracket."
- :extend-selection nil
- (evil-select-paren ?< ?> beg end type count t))
-
-(evil-define-text-object evil-inner-angle (count &optional beg end type)
- "Select inner angle bracket."
- :extend-selection nil
- (evil-select-paren ?< ?> beg end type count))
-
-(evil-define-text-object evil-a-single-quote (count &optional beg end type)
- "Select a single-quoted expression."
- :extend-selection t
- (evil-select-quote ?' beg end type count t))
-
-(evil-define-text-object evil-inner-single-quote (count &optional beg end type)
- "Select inner single-quoted expression."
- :extend-selection nil
- (evil-select-quote ?' beg end type count))
-
-(evil-define-text-object evil-a-double-quote (count &optional beg end type)
- "Select a double-quoted expression."
- :extend-selection t
- (evil-select-quote ?\" beg end type count t))
-
-(evil-define-text-object evil-inner-double-quote (count &optional beg end type)
- "Select inner double-quoted expression."
- :extend-selection nil
- (evil-select-quote ?\" beg end type count))
-
-(evil-define-text-object evil-a-back-quote (count &optional beg end type)
- "Select a back-quoted expression."
- :extend-selection t
- (evil-select-quote ?\` beg end type count t))
-
-(evil-define-text-object evil-inner-back-quote (count &optional beg end type)
- "Select inner back-quoted expression."
- :extend-selection nil
- (evil-select-quote ?\` beg end type count))
-
-(evil-define-text-object evil-a-tag (count &optional beg end type)
- "Select a tag block."
- :extend-selection nil
- (evil-select-xml-tag beg end type count t))
-
-(evil-define-text-object evil-inner-tag (count &optional beg end type)
- "Select inner tag block."
- :extend-selection nil
- (evil-select-xml-tag beg end type count))
-
-(evil-define-text-object evil-next-match (count &optional beg end type)
- "Select next match."
- (unless (and (boundp 'evil-search-module)
- (eq evil-search-module 'evil-search))
- (user-error "next-match text objects only work with Evil search module."))
- (let ((pnt (point)))
- (cond
- ((eq evil-ex-search-direction 'forward)
- (unless (eobp) (forward-char))
- (evil-ex-search-previous 1)
- (when (and (<= evil-ex-search-match-beg pnt)
- (> evil-ex-search-match-end pnt)
- (not (evil-visual-state-p)))
- (setq count (1- count)))
- (if (> count 0) (evil-ex-search-next count)))
- (t
- (unless (eobp) (forward-char))
- (evil-ex-search-next count))))
- ;; active visual state if command is executed in normal state
- (when (evil-normal-state-p)
- (evil-visual-select evil-ex-search-match-beg evil-ex-search-match-end 'inclusive +1 t))
- (list evil-ex-search-match-beg evil-ex-search-match-end))
-
-(evil-define-text-object evil-previous-match (count &optional beg end type)
- "Select next match."
- (unless (and (boundp 'evil-search-module)
- (eq evil-search-module 'evil-search))
- (user-error "previous-match text objects only work with Evil search module."))
- (let ((evil-ex-search-direction
- (if (eq evil-ex-search-direction 'backward)
- 'forward
- 'backward)))
- (evil-next-match count beg end type)))
-
-;;; Operator commands
-
-(evil-define-operator evil-yank (beg end type register yank-handler)
- "Saves the characters in motion into the kill-ring."
- :move-point nil
- :repeat nil
- (interactive "<R><x><y>")
- (let ((evil-was-yanked-without-register
- (and evil-was-yanked-without-register (not register))))
- (cond
- ((and (fboundp 'cua--global-mark-active)
- (fboundp 'cua-copy-region-to-global-mark)
- (cua--global-mark-active))
- (cua-copy-region-to-global-mark beg end))
- ((eq type 'block)
- (evil-yank-rectangle beg end register yank-handler))
- ((memq type '(line screen-line))
- (evil-yank-lines beg end register yank-handler))
- (t
- (evil-yank-characters beg end register yank-handler)))))
-
-(evil-define-operator evil-yank-line (beg end type register)
- "Saves whole lines into the kill-ring."
- :motion evil-line-or-visual-line
- :move-point nil
- (interactive "<R><x>")
- (when (evil-visual-state-p)
- (unless (memq type '(line block screen-line))
- (let ((range (evil-expand beg end
- (if (and evil-respect-visual-line-mode
- visual-line-mode)
- 'screen-line
- 'line))))
- (setq beg (evil-range-beginning range)
- end (evil-range-end range)
- type (evil-type range))))
- (evil-exit-visual-state))
- (evil-yank beg end type register))
-
-(evil-define-operator evil-delete (beg end type register yank-handler)
- "Delete text from BEG to END with TYPE.
-Save in REGISTER or in the kill-ring with YANK-HANDLER."
- (interactive "<R><x><y>")
- (unless register
- (let ((text (filter-buffer-substring beg end)))
- (unless (string-match-p "\n" text)
- ;; set the small delete register
- (evil-set-register ?- text))))
- (let ((evil-was-yanked-without-register nil))
- (evil-yank beg end type register yank-handler))
- (cond
- ((eq type 'block)
- (evil-apply-on-block #'delete-region beg end nil))
- ((and (eq type 'line)
- (= end (point-max))
- (or (= beg end)
- (/= (char-before end) ?\n))
- (/= beg (point-min))
- (= (char-before beg) ?\n))
- (delete-region (1- beg) end))
- (t
- (delete-region beg end)))
- ;; place cursor on beginning of line
- (when (and (called-interactively-p 'any)
- (eq type 'line))
- (evil-first-non-blank)))
-
-(evil-define-operator evil-delete-line (beg end type register yank-handler)
- "Delete to end of line."
- :motion nil
- :keep-visual t
- (interactive "<R><x>")
- ;; act linewise in Visual state
- (let* ((beg (or beg (point)))
- (end (or end beg))
- (visual-line-mode (and evil-respect-visual-line-mode
- visual-line-mode))
- (line-end (if visual-line-mode
- (save-excursion
- (end-of-visual-line)
- (point))
- (line-end-position))))
- (when (evil-visual-state-p)
- (unless (memq type '(line screen-line block))
- (let ((range (evil-expand beg end
- (if visual-line-mode
- 'screen-line
- 'line))))
- (setq beg (evil-range-beginning range)
- end (evil-range-end range)
- type (evil-type range))))
- (evil-exit-visual-state))
- (cond
- ((eq type 'block)
- ;; equivalent to $d, i.e., we use the block-to-eol selection and
- ;; call `evil-delete'. In this case we fake the call to
- ;; `evil-end-of-line' by setting `temporary-goal-column' and
- ;; `last-command' appropriately as `evil-end-of-line' would do.
- (let ((temporary-goal-column most-positive-fixnum)
- (last-command 'next-line))
- (evil-delete beg end 'block register yank-handler)))
- ((memq type '(line screen-line))
- (evil-delete beg end type register yank-handler))
- (t
- (evil-delete beg line-end type register yank-handler)))))
-
-(evil-define-operator evil-delete-whole-line
- (beg end type register yank-handler)
- "Delete whole line."
- :motion evil-line-or-visual-line
- (interactive "<R><x>")
- (evil-delete beg end type register yank-handler))
-
-(evil-define-operator evil-delete-char (beg end type register)
- "Delete next character."
- :motion evil-forward-char
- (interactive "<R><x>")
- (evil-delete beg end type register))
-
-(evil-define-operator evil-delete-backward-char (beg end type register)
- "Delete previous character."
- :motion evil-backward-char
- (interactive "<R><x>")
- (evil-delete beg end type register))
-
-(evil-define-command evil-delete-backward-char-and-join (count)
- "Delete previous character and join lines.
-If point is at the beginning of a line then the current line will
-be joined with the previous line if and only if
-`evil-backspace-join-lines'."
- (interactive "p")
- (if (or evil-backspace-join-lines (not (bolp)))
- (call-interactively 'delete-backward-char)
- (user-error "Beginning of line")))
-
-(evil-define-command evil-delete-backward-word ()
- "Delete previous word."
- (if (and (bolp) (not (bobp)))
- (progn
- (unless evil-backspace-join-lines (user-error "Beginning of line"))
- (delete-char -1))
- (delete-region (max
- (save-excursion
- (evil-backward-word-begin)
- (point))
- (line-beginning-position))
- (point))))
-
-(evil-define-command evil-delete-back-to-indentation ()
- "Delete back to the first non-whitespace character.
-If point is before the first non-whitespace character of a
-current line then delete from the point to the beginning of the
-current line. If point is on the beginning of the line, behave
-according to `evil-backspace-join-lines'."
- (if (bolp)
- (evil-delete-backward-char-and-join 1)
- (delete-region (if (<= (current-column) (current-indentation))
- (line-beginning-position)
- (save-excursion
- (evil-first-non-blank)
- (point)))
- (point))))
-
-(defun evil-ex-delete-or-yank (should-delete beg end type register count yank-handler)
- "Execute evil-delete or evil-yank on the given region.
-If SHOULD-DELETE is t, evil-delete will be executed, otherwise
-evil-yank.
-The region specified by BEG and END will be adjusted if COUNT is
-given."
- (when count
- ;; with COUNT, the command should go the end of the region and delete/yank
- ;; COUNT lines from there
- (setq beg (save-excursion
- (goto-char end)
- (forward-line -1)
- (point))
- end (save-excursion
- (goto-char end)
- (point-at-bol count))
- type 'line))
- (funcall (if should-delete 'evil-delete 'evil-yank) beg end type register yank-handler))
-
-(evil-define-operator evil-ex-delete (beg end type register count yank-handler)
- "The Ex delete command.
-\[BEG,END]delete [REGISTER] [COUNT]"
- (interactive "<R><xc/><y>")
- (evil-ex-delete-or-yank t beg end type register count yank-handler))
-
-(evil-define-operator evil-ex-yank (beg end type register count yank-handler)
- "The Ex yank command.
-\[BEG,END]yank [REGISTER] [COUNT]"
- (interactive "<R><xc/><y>")
- (evil-ex-delete-or-yank nil beg end type register count yank-handler))
-
-(evil-define-operator evil-change
- (beg end type register yank-handler delete-func)
- "Change text from BEG to END with TYPE.
-Save in REGISTER or the kill-ring with YANK-HANDLER.
-DELETE-FUNC is a function for deleting text, default `evil-delete'.
-If TYPE is `line', insertion starts on an empty line.
-If TYPE is `block', the inserted text in inserted at each line
-of the block."
- (interactive "<R><x><y>")
- (let ((delete-func (or delete-func #'evil-delete))
- (nlines (1+ (evil-count-lines beg end)))
- (opoint (save-excursion
- (goto-char beg)
- (line-beginning-position))))
- (unless (eq evil-want-fine-undo t)
- (evil-start-undo-step))
- (funcall delete-func beg end type register yank-handler)
- (cond
- ((eq type 'line)
- (if ( = opoint (point))
- (evil-open-above 1)
- (evil-open-below 1)))
- ((eq type 'block)
- (evil-insert 1 nlines))
- (t
- (evil-insert 1)))))
-
-(evil-define-operator evil-change-line (beg end type register yank-handler)
- "Change to end of line."
- :motion evil-end-of-line-or-visual-line
- (interactive "<R><x><y>")
- (evil-change beg end type register yank-handler #'evil-delete-line))
-
-(evil-define-operator evil-change-whole-line
- (beg end type register yank-handler)
- "Change whole line."
- :motion evil-line-or-visual-line
- (interactive "<R><x>")
- (evil-change beg end type register yank-handler #'evil-delete-whole-line))
-
-(evil-define-command evil-copy (beg end address)
- "Copy lines in BEG END below line given by ADDRESS."
- :motion evil-line-or-visual-line
- (interactive "<r><addr>")
- (goto-char (point-min))
- (forward-line address)
- (let* ((txt (buffer-substring-no-properties beg end))
- (len (length txt)))
- ;; ensure text consists of complete lines
- (when (or (zerop len) (/= (aref txt (1- len)) ?\n))
- (setq txt (concat txt "\n")))
- (when (and (eobp) (not (bolp))) (newline)) ; incomplete last line
- (insert txt)
- (forward-line -1)))
-
-(evil-define-command evil-move (beg end address)
- "Move lines in BEG END below line given by ADDRESS."
- :motion evil-line-or-visual-line
- (interactive "<r><addr>")
- (goto-char (point-min))
- (forward-line address)
- (let* ((m (set-marker (make-marker) (point)))
- (txt (buffer-substring-no-properties beg end))
- (len (length txt)))
- (delete-region beg end)
- (goto-char m)
- (set-marker m nil)
- ;; ensure text consists of complete lines
- (when (or (zerop len) (/= (aref txt (1- len)) ?\n))
- (setq txt (concat txt "\n")))
- (when (and (eobp) (not (bolp))) (newline)) ; incomplete last line
- (when (evil-visual-state-p)
- (move-marker evil-visual-mark (point)))
- (insert txt)
- (forward-line -1)
- (when (evil-visual-state-p)
- (move-marker evil-visual-point (point)))))
-
-(evil-define-operator evil-substitute (beg end type register)
- "Change a character."
- :motion evil-forward-char
- (interactive "<R><x>")
- (evil-change beg end type register))
-
-(evil-define-operator evil-upcase (beg end type)
- "Convert text to upper case."
- (if (eq type 'block)
- (evil-apply-on-block #'evil-upcase beg end nil)
- (upcase-region beg end)))
-
-(evil-define-operator evil-downcase (beg end type)
- "Convert text to lower case."
- (if (eq type 'block)
- (evil-apply-on-block #'evil-downcase beg end nil)
- (downcase-region beg end)))
-
-(evil-define-operator evil-invert-case (beg end type)
- "Invert case of text."
- (let (char)
- (if (eq type 'block)
- (evil-apply-on-block #'evil-invert-case beg end nil)
- (save-excursion
- (goto-char beg)
- (while (< beg end)
- (setq char (following-char))
- (delete-char 1 nil)
- (if (eq (upcase char) char)
- (insert-char (downcase char) 1)
- (insert-char (upcase char) 1))
- (setq beg (1+ beg)))))))
-
-(evil-define-operator evil-invert-char (beg end type)
- "Invert case of character."
- :motion evil-forward-char
- (if (eq type 'block)
- (evil-apply-on-block #'evil-invert-case beg end nil)
- (evil-invert-case beg end)
- (when evil-this-motion
- (goto-char end)
- (when (and evil-cross-lines
- (not evil-move-beyond-eol)
- (not (evil-visual-state-p))
- (not (evil-operator-state-p))
- (eolp) (not (eobp)) (not (bolp)))
- (forward-char)))))
-
-(evil-define-operator evil-rot13 (beg end type)
- "ROT13 encrypt text."
- (if (eq type 'block)
- (evil-apply-on-block #'evil-rot13 beg end nil)
- (rot13-region beg end)))
-
-(evil-define-operator evil-join (beg end)
- "Join the selected lines."
- :motion evil-line
- (let ((count (count-lines beg end)))
- (when (> count 1)
- (setq count (1- count)))
- (goto-char beg)
- (dotimes (_ count)
- (join-line 1))))
-
-(evil-define-operator evil-join-whitespace (beg end)
- "Join the selected lines without changing whitespace.
-\\<evil-normal-state-map>Like \\[evil-join], \
-but doesn't insert or remove any spaces."
- :motion evil-line
- (let ((count (count-lines beg end)))
- (when (> count 1)
- (setq count (1- count)))
- (goto-char beg)
- (dotimes (_ count)
- (evil-move-end-of-line 1)
- (unless (eobp)
- (delete-char 1)))))
-
-(evil-define-operator evil-ex-join (beg end &optional count bang)
- "Join the selected lines with optional COUNT and BANG."
- (interactive "<r><a><!>")
- (if (and count (not (string-match-p "^[1-9][0-9]*$" count)))
- (user-error "Invalid count")
- (let ((join-fn (if bang 'evil-join-whitespace 'evil-join)))
- (cond
- ((not count)
- ;; without count - just join the given region
- (funcall join-fn beg end))
- (t
- ;; emulate vim's :join when count is given - start from the
- ;; end of the region and join COUNT lines from there
- (let* ((count-num (string-to-number count))
- (beg-adjusted (save-excursion
- (goto-char end)
- (forward-line -1)
- (point)))
- (end-adjusted (save-excursion
- (goto-char end)
- (point-at-bol count-num))))
- (funcall join-fn beg-adjusted end-adjusted)))))))
-
-(evil-define-operator evil-fill (beg end)
- "Fill text."
- :move-point nil
- :type line
- (save-excursion
- (condition-case nil
- (fill-region beg end)
- (error nil))))
-
-(evil-define-operator evil-fill-and-move (beg end)
- "Fill text and move point to the end of the filled region."
- :move-point nil
- :type line
- (let ((marker (make-marker)))
- (move-marker marker (1- end))
- (condition-case nil
- (progn
- (fill-region beg end)
- (goto-char marker)
- (evil-first-non-blank))
- (error nil))))
-
-(evil-define-operator evil-indent (beg end)
- "Indent text."
- :move-point nil
- :type line
- (if (and (= beg (line-beginning-position))
- (= end (line-beginning-position 2)))
- ;; since some Emacs modes can only indent one line at a time,
- ;; implement "==" as a call to `indent-according-to-mode'
- (indent-according-to-mode)
- (goto-char beg)
- (indent-region beg end))
- ;; We also need to tabify or untabify the leading white characters
- (when evil-indent-convert-tabs
- (let* ((beg-line (line-number-at-pos beg))
- (end-line (line-number-at-pos end))
- (ln beg-line)
- (convert-white (if indent-tabs-mode 'tabify 'untabify)))
- (save-excursion
- (while (<= ln end-line)
- (goto-char (point-min))
- (forward-line (- ln 1))
- (back-to-indentation)
- ;; Whether tab or space should be used is determined by indent-tabs-mode
- (funcall convert-white (line-beginning-position) (point))
- (setq ln (1+ ln)))))
- (back-to-indentation)))
-
-(evil-define-operator evil-indent-line (beg end)
- "Indent the line."
- :motion evil-line
- (evil-indent beg end))
-
-(evil-define-operator evil-shift-left (beg end &optional count preserve-empty)
- "Shift text from BEG to END to the left.
-The text is shifted to the nearest multiple of `evil-shift-width'
-\(the rounding can be disabled by setting `evil-shift-round').
-If PRESERVE-EMPTY is non-nil, lines that contain only spaces are
-indented, too, otherwise they are ignored. The relative column
-of point is preserved if this function is not called
-interactively. Otherwise, if the function is called as an
-operator, point is moved to the first non-blank character.
-See also `evil-shift-right'."
- :type line
- (interactive "<r><vc>")
- (evil-shift-right beg end (- (or count 1)) preserve-empty))
-
-(evil-define-operator evil-shift-right (beg end &optional count preserve-empty)
- "Shift text from BEG to END to the right.
-The text is shifted to the nearest multiple of `evil-shift-width'
-\(the rounding can be disabled by setting `evil-shift-round').
-If PRESERVE-EMPTY is non-nil, lines that contain only spaces are
-indented, too, otherwise they are ignored. The relative column
-of point is preserved if this function is not called
-interactively. Otherwise, if the function is called as an
-operator, point is moved to the first non-blank character.
-See also `evil-shift-left'."
- :type line
- (interactive "<r><vc>")
- (setq count (or count 1))
- (let ((beg (set-marker (make-marker) beg))
- (end (set-marker (make-marker) end))
- (pnt-indent (current-column))
- first-shift) ; shift of first line
- (save-excursion
- (goto-char beg)
- (while (< (point) end)
- (let* ((indent (current-indentation))
- (new-indent
- (max 0
- (if (not evil-shift-round)
- (+ indent (* count evil-shift-width))
- (* (+ (/ indent evil-shift-width)
- count
- (cond
- ((> count 0) 0)
- ((zerop (mod indent evil-shift-width)) 0)
- (t 1)))
- evil-shift-width)))))
- (unless first-shift
- (setq first-shift (- new-indent indent)))
- (when (or preserve-empty
- (save-excursion
- (skip-chars-forward " \t")
- (not (eolp))))
- (indent-to new-indent 0))
- (delete-region (point) (progn (skip-chars-forward " \t") (point)))
- (forward-line 1))))
- ;; in case we're in an empty buffer first-shift is still unchanged
- (unless first-shift
- (if (< count 0)
- (setq first-shift 0)
- (setq first-shift (* count evil-shift-width))
- (indent-to first-shift)))
- ;; When called from insert state (C-t or C-d) the cursor should shift with the line,
- ;; otherwise (normal state) it should end up on the first non-whitespace character
- (if (evil-insert-state-p)
- (move-to-column (max 0 (+ pnt-indent first-shift)))
- (evil-first-non-blank))))
-
-(evil-define-command evil-shift-right-line (count)
- "Shift the current line COUNT times to the right.
-The text is shifted to the nearest multiple of
-`evil-shift-width'. Like `evil-shift-right' but always works on
-the current line."
- (interactive "<c>")
- (evil-shift-right (line-beginning-position) (line-beginning-position 2) count t))
-
-(evil-define-command evil-shift-left-line (count)
- "Shift the current line COUNT times to the left.
-The text is shifted to the nearest multiple of
-`evil-shift-width'. Like `evil-shift-left' but always works on
-the current line."
- (interactive "<c>")
- (evil-shift-left (line-beginning-position) (line-beginning-position 2) count t))
-
-(evil-define-operator evil-align-left (beg end type &optional width)
- "Right-align lines in the region at WIDTH columns.
-The default for width is the value of `fill-column'."
- :motion evil-line
- :type line
- (interactive "<R><a>")
- (evil-justify-lines beg end 'left (if width
- (string-to-number width)
- 0)))
-
-(evil-define-operator evil-align-right (beg end type &optional width)
- "Right-align lines in the region at WIDTH columns.
-The default for width is the value of `fill-column'."
- :motion evil-line
- :type line
- (interactive "<R><a>")
- (evil-justify-lines beg end 'right (if width
- (string-to-number width)
- fill-column)))
-
-(evil-define-operator evil-align-center (beg end type &optional width)
- "Centers lines in the region between WIDTH columns.
-The default for width is the value of `fill-column'."
- :motion evil-line
- :type line
- (interactive "<R><a>")
- (evil-justify-lines beg end 'center (if width
- (string-to-number width)
- fill-column)))
-
-(evil-define-operator evil-replace (beg end type char)
- "Replace text from BEG to END with CHAR."
- :motion evil-forward-char
- (interactive "<R>"
- (unwind-protect
- (let ((evil-force-cursor 'replace))
- (evil-refresh-cursor)
- (list (evil-read-key)))
- (evil-refresh-cursor)))
- (when char
- (if (eq type 'block)
- (save-excursion
- (evil-apply-on-rectangle
- #'(lambda (begcol endcol char)
- (let ((maxcol (evil-column (line-end-position))))
- (when (< begcol maxcol)
- (setq endcol (min endcol maxcol))
- (let ((beg (evil-move-to-column begcol nil t))
- (end (evil-move-to-column endcol nil t)))
- (delete-region beg end)
- (insert (make-string (- endcol begcol) char))))))
- beg end char))
- (goto-char beg)
- (cond
- ((eq char ?\n)
- (delete-region beg end)
- (newline)
- (when evil-auto-indent
- (indent-according-to-mode)))
- (t
- (while (< (point) end)
- (if (eq (char-after) ?\n)
- (forward-char)
- (delete-char 1)
- (insert-char char 1)))
- (goto-char (max beg (1- end))))))))
-
-(evil-define-command evil-paste-before
- (count &optional register yank-handler)
- "Pastes the latest yanked text before the cursor position.
-The return value is the yanked text."
- :suppress-operator t
- (interactive "*P<x>")
- (setq count (prefix-numeric-value count))
- (if (evil-visual-state-p)
- (evil-visual-paste count register)
- (evil-with-undo
- (let* ((text (if register
- (evil-get-register register)
- (current-kill 0)))
- (yank-handler (or yank-handler
- (when (stringp text)
- (car-safe (get-text-property
- 0 'yank-handler text)))))
- (opoint (point)))
- (when text
- (if (functionp yank-handler)
- (let ((evil-paste-count count)
- ;; for non-interactive use
- (this-command #'evil-paste-before))
- (push-mark opoint t)
- (insert-for-yank text))
- ;; no yank-handler, default
- (when (vectorp text)
- (setq text (evil-vector-to-string text)))
- (set-text-properties 0 (length text) nil text)
- (push-mark opoint t)
- (dotimes (_ (or count 1))
- (insert-for-yank text))
- (setq evil-last-paste
- (list #'evil-paste-before
- count
- opoint
- opoint ; beg
- (point))) ; end
- (evil-set-marker ?\[ opoint)
- (evil-set-marker ?\] (1- (point)))
- (when (and evil-move-cursor-back
- (> (length text) 0))
- (backward-char))))
- ;; no paste-pop after pasting from a register
- (when register
- (setq evil-last-paste nil))
- (and (> (length text) 0) text)))))
-
-(evil-define-command evil-paste-after
- (count &optional register yank-handler)
- "Pastes the latest yanked text behind point.
-The return value is the yanked text."
- :suppress-operator t
- (interactive "*P<x>")
- (setq count (prefix-numeric-value count))
- (if (evil-visual-state-p)
- (evil-visual-paste count register)
- (evil-with-undo
- (let* ((text (if register
- (evil-get-register register)
- (current-kill 0)))
- (yank-handler (or yank-handler
- (when (stringp text)
- (car-safe (get-text-property
- 0 'yank-handler text)))))
- (opoint (point)))
- (when text
- (if (functionp yank-handler)
- (let ((evil-paste-count count)
- ;; for non-interactive use
- (this-command #'evil-paste-after))
- (insert-for-yank text))
- ;; no yank-handler, default
- (when (vectorp text)
- (setq text (evil-vector-to-string text)))
- (set-text-properties 0 (length text) nil text)
- (unless (eolp) (forward-char))
- (push-mark (point) t)
- ;; TODO: Perhaps it is better to collect a list of all
- ;; (point . mark) pairs to undo the yanking for COUNT > 1.
- ;; The reason is that this yanking could very well use
- ;; `yank-handler'.
- (let ((beg (point)))
- (dotimes (_ (or count 1))
- (insert-for-yank text))
- (setq evil-last-paste
- (list #'evil-paste-after
- count
- opoint
- beg ; beg
- (point))) ; end
- (evil-set-marker ?\[ beg)
- (evil-set-marker ?\] (1- (point)))
- (when (evil-normal-state-p)
- (evil-move-cursor-back)))))
- (when register
- (setq evil-last-paste nil))
- (and (> (length text) 0) text)))))
-
-(evil-define-command evil-visual-paste (count &optional register)
- "Paste over Visual selection."
- :suppress-operator t
- (interactive "*P<x>")
- (setq count (prefix-numeric-value count))
- ;; evil-visual-paste is typically called from evil-paste-before or
- ;; evil-paste-after, but we have to mark that the paste was from
- ;; visual state
- (setq this-command 'evil-visual-paste)
- (let* ((text (if register
- (evil-get-register register)
- (current-kill 0)))
- (yank-handler (car-safe (get-text-property
- 0 'yank-handler text)))
- new-kill
- paste-eob)
- (evil-with-undo
- (let ((kill-ring-yank-pointer (list (current-kill 0))))
- (when (evil-visual-state-p)
- (evil-visual-rotate 'upper-left)
- ;; if we replace the last buffer line that does not end in a
- ;; newline, we use `evil-paste-after' because `evil-delete'
- ;; will move point to the line above
- (when (and (= evil-visual-end (point-max))
- (/= (char-before (point-max)) ?\n))
- (setq paste-eob t))
- (evil-delete evil-visual-beginning evil-visual-end
- (evil-visual-type) ?_)
- (when (and (eq yank-handler #'evil-yank-line-handler)
- (not (eq (evil-visual-type) 'line))
- (not (= evil-visual-end (point-max))))
- (insert "\n"))
- (evil-normal-state)
- (current-kill 1))
- (if paste-eob
- (evil-paste-after count register)
- (evil-paste-before count register)))
- (when evil-kill-on-visual-paste
- (current-kill -1))
- ;; mark the last paste as visual-paste
- (setq evil-last-paste
- (list (nth 0 evil-last-paste)
- (nth 1 evil-last-paste)
- (nth 2 evil-last-paste)
- (nth 3 evil-last-paste)
- (nth 4 evil-last-paste)
- t)))))
-
-(defun evil-paste-from-register (register)
- "Paste from REGISTER."
- (interactive
- (let ((overlay (make-overlay (point) (point)))
- (string "\""))
- (unwind-protect
- (progn
- ;; display " in the buffer while reading register
- (put-text-property 0 1 'face 'minibuffer-prompt string)
- (put-text-property 0 1 'cursor t string)
- (overlay-put overlay 'after-string string)
- (list (or evil-this-register (read-char))))
- (delete-overlay overlay))))
- (when (evil-paste-before nil register t)
- ;; go to end of pasted text
- (unless (eobp)
- (forward-char))))
-
-(defun evil-paste-last-insertion ()
- "Paste last insertion."
- (interactive)
- (evil-paste-from-register ?.))
-
-(evil-define-command evil-use-register (register)
- "Use REGISTER for the next command."
- :keep-visual t
- :repeat ignore
- (interactive "<C>")
- (setq evil-this-register register))
-
-(defvar evil-macro-buffer nil
- "The buffer that has been active on macro recording.")
-
-(evil-define-command evil-record-macro (register)
- "Record a keyboard macro into REGISTER.
-If REGISTER is :, /, or ?, the corresponding command line window
-will be opened instead."
- :keep-visual t
- :suppress-operator t
- (interactive
- (list (unless (and evil-this-macro defining-kbd-macro)
- (or evil-this-register (evil-read-key)))))
- (cond
- ((eq register ?\C-g)
- (keyboard-quit))
- ((and evil-this-macro defining-kbd-macro)
- (setq evil-macro-buffer nil)
- (condition-case nil
- (end-kbd-macro)
- (error nil))
- (when last-kbd-macro
- (when (member last-kbd-macro '("" []))
- (setq last-kbd-macro nil))
- (evil-set-register evil-this-macro last-kbd-macro))
- (setq evil-this-macro nil))
- ((eq register ?:)
- (evil-command-window-ex))
- ((eq register ?/)
- (evil-command-window-search-forward))
- ((eq register ??)
- (evil-command-window-search-backward))
- ((or (and (>= register ?0) (<= register ?9))
- (and (>= register ?a) (<= register ?z))
- (and (>= register ?A) (<= register ?Z)))
- (when defining-kbd-macro (end-kbd-macro))
- (setq evil-this-macro register)
- (evil-set-register evil-this-macro nil)
- (start-kbd-macro nil)
- (setq evil-macro-buffer (current-buffer)))
- (t (error "Invalid register"))))
-
-(evil-define-command evil-execute-macro (count macro)
- "Execute keyboard macro MACRO, COUNT times.
-When called with a non-numerical prefix \
-\(such as \\[universal-argument]),
-COUNT is infinite. MACRO is read from a register
-when called interactively."
- :keep-visual t
- :suppress-operator t
- (interactive
- (let (count macro register)
- (setq count (if current-prefix-arg
- (if (numberp current-prefix-arg)
- current-prefix-arg
- 0) 1)
- register (or evil-this-register (read-char)))
- (cond
- ((or (and (eq register ?@) (eq evil-last-register ?:))
- (eq register ?:))
- (setq macro (lambda () (evil-ex-repeat nil))
- evil-last-register ?:))
- ((eq register ?@)
- (unless evil-last-register
- (user-error "No previously executed keyboard macro."))
- (setq macro (evil-get-register evil-last-register t)))
- (t
- (setq macro (evil-get-register register t)
- evil-last-register register)))
- (list count macro)))
- (cond
- ((functionp macro)
- (evil-repeat-abort)
- (dotimes (_ (or count 1))
- (funcall macro)))
- ((or (and (not (stringp macro))
- (not (vectorp macro)))
- (member macro '("" [])))
- ;; allow references to currently empty registers
- ;; when defining macro
- (unless evil-this-macro
- (user-error "No previous macro")))
- (t
- (condition-case err
- (evil-with-single-undo
- (execute-kbd-macro macro count))
- ;; enter Normal state if the macro fails
- (error
- (evil-normal-state)
- (evil-normalize-keymaps)
- (signal (car err) (cdr err)))))))
-
-;;; Visual commands
-
-(evil-define-motion evil-visual-restore ()
- "Restore previous selection."
- (let* ((point (point))
- (mark (or (mark t) point))
- (dir evil-visual-direction)
- (type (evil-visual-type))
- range)
- (unless (evil-visual-state-p)
- (cond
- ;; No previous selection.
- ((or (null evil-visual-selection)
- (null evil-visual-mark)
- (null evil-visual-point)))
- ;; If the type was one-to-one, it is preferable to infer
- ;; point and mark from the selection's boundaries. The reason
- ;; is that a destructive operation may displace the markers
- ;; inside the selection.
- ((evil-type-property type :one-to-one)
- (setq range (evil-contract-range (evil-visual-range))
- mark (evil-range-beginning range)
- point (evil-range-end range))
- (when (< dir 0)
- (evil-swap mark point)))
- ;; If the type wasn't one-to-one, we have to restore the
- ;; selection on the basis of the previous point and mark.
- (t
- (setq mark evil-visual-mark
- point evil-visual-point)))
- (evil-visual-make-selection mark point type t))))
-
-(evil-define-motion evil-visual-exchange-corners ()
- "Rearrange corners in Visual Block mode.
-
- M---+ +---M
- | | <=> | |
- +---P P---+
-
-For example, if mark is in the upper left corner and point
-in the lower right, this function puts mark in the upper right
-corner and point in the lower left."
- (cond
- ((eq evil-visual-selection 'block)
- (let* ((point (point))
- (mark (or (mark t) point))
- (point-col (evil-column point))
- (mark-col (evil-column mark))
- (mark (save-excursion
- (goto-char mark)
- (evil-move-to-column point-col)
- (point)))
- (point (save-excursion
- (goto-char point)
- (evil-move-to-column mark-col)
- (point))))
- (evil-visual-refresh mark point)))
- (t
- (evil-exchange-point-and-mark)
- (evil-visual-refresh))))
-
-(evil-define-command evil-visual-rotate (corner &optional beg end type)
- "In Visual Block selection, put point in CORNER.
-Corner may be one of `upper-left', `upper-right', `lower-left'
-and `lower-right':
-
- upper-left +---+ upper-right
- | |
- lower-left +---+ lower-right
-
-When called interactively, the selection is rotated blockwise."
- :keep-visual t
- (interactive
- (let ((corners '(upper-left upper-right lower-right lower-left)))
- (list (or (cadr (memq (evil-visual-block-corner) corners))
- 'upper-left))))
- (let* ((beg (or beg (point)))
- (end (or end (mark t) beg))
- (type (or type evil-this-type))
- range)
- (cond
- ((memq type '(rectangle block))
- (setq range (evil-block-rotate beg end :corner corner)
- beg (pop range)
- end (pop range))
- (unless (eq corner (evil-visual-block-corner corner beg end))
- (evil-swap beg end))
- (goto-char beg)
- (when (evil-visual-state-p)
- (evil-move-mark end)
- (evil-visual-refresh nil nil nil :corner corner)))
- ((memq corner '(upper-right lower-right))
- (goto-char (max beg end))
- (when (evil-visual-state-p)
- (evil-move-mark (min beg end))))
- (t
- (goto-char (min beg end))
- (when (evil-visual-state-p)
- (evil-move-mark (max beg end)))))))
-
-;;; Insertion commands
-
-(defun evil-insert (count &optional vcount skip-empty-lines)
- "Switch to Insert state just before point.
-The insertion will be repeated COUNT times and repeated once for
-the next VCOUNT - 1 lines starting at the same column.
-If SKIP-EMPTY-LINES is non-nil, the insertion will not be performed
-on lines on which the insertion point would be after the end of the
-lines. This is the default behaviour for Visual-state insertion."
- (interactive
- (list (prefix-numeric-value current-prefix-arg)
- (and (evil-visual-state-p)
- (memq (evil-visual-type) '(line block))
- (save-excursion
- (let ((m (mark)))
- ;; go to upper-left corner temporarily so
- ;; `count-lines' yields accurate results
- (evil-visual-rotate 'upper-left)
- (prog1 (count-lines evil-visual-beginning evil-visual-end)
- (set-mark m)))))
- (evil-visual-state-p)))
- (if (and (called-interactively-p 'any)
- (evil-visual-state-p))
- (cond
- ((eq (evil-visual-type) 'line)
- (evil-visual-rotate 'upper-left)
- (evil-insert-line count vcount))
- ((eq (evil-visual-type) 'block)
- (let ((column (min (evil-column evil-visual-beginning)
- (evil-column evil-visual-end))))
- (evil-visual-rotate 'upper-left)
- (move-to-column column t)
- (evil-insert count vcount skip-empty-lines)))
- (t
- (evil-visual-rotate 'upper-left)
- (evil-insert count vcount skip-empty-lines)))
- (setq evil-insert-count count
- evil-insert-lines nil
- evil-insert-vcount (and vcount
- (> vcount 1)
- (list (line-number-at-pos)
- (current-column)
- vcount))
- evil-insert-skip-empty-lines skip-empty-lines)
- (evil-insert-state 1)))
-
-(defun evil-append (count &optional vcount skip-empty-lines)
- "Switch to Insert state just after point.
-The insertion will be repeated COUNT times and repeated once for
-the next VCOUNT - 1 lines starting at the same column. If
-SKIP-EMPTY-LINES is non-nil, the insertion will not be performed
-on lines on which the insertion point would be after the end of
-the lines."
- (interactive
- (list (prefix-numeric-value current-prefix-arg)
- (and (evil-visual-state-p)
- (memq (evil-visual-type) '(line block))
- (save-excursion
- (let ((m (mark)))
- ;; go to upper-left corner temporarily so
- ;; `count-lines' yields accurate results
- (evil-visual-rotate 'upper-left)
- (prog1 (count-lines evil-visual-beginning evil-visual-end)
- (set-mark m)))))))
- (if (and (called-interactively-p 'any)
- (evil-visual-state-p))
- (cond
- ((or (eq (evil-visual-type) 'line)
- (and (eq (evil-visual-type) 'block)
- (memq last-command '(next-line previous-line))
- (numberp temporary-goal-column)
- (= temporary-goal-column most-positive-fixnum)))
- (evil-visual-rotate 'upper-left)
- (evil-append-line count vcount))
- ((eq (evil-visual-type) 'block)
- (let ((column (max (evil-column evil-visual-beginning)
- (evil-column evil-visual-end))))
- (evil-visual-rotate 'upper-left)
- (move-to-column column t)
- (evil-insert count vcount skip-empty-lines)))
- (t
- (evil-visual-rotate 'lower-right)
- (backward-char)
- (evil-append count)))
- (unless (eolp) (forward-char))
- (evil-insert count vcount skip-empty-lines)
- (add-hook 'post-command-hook #'evil-maybe-remove-spaces)))
-
-(defun evil-insert-resume (count)
- "Switch to Insert state at previous insertion point.
-The insertion will be repeated COUNT times. If called from visual
-state, only place point at the previous insertion position but do not
-switch to insert state."
- (interactive "p")
- (evil-goto-mark ?^ t)
- (unless (evil-visual-state-p)
- (evil-insert count)))
-
-(defun evil-open-above (count)
- "Insert a new line above point and switch to Insert state.
-The insertion will be repeated COUNT times."
- (interactive "p")
- (unless (eq evil-want-fine-undo t)
- (evil-start-undo-step))
- (evil-insert-newline-above)
- (setq evil-insert-count count
- evil-insert-lines t
- evil-insert-vcount nil)
- (evil-insert-state 1)
- (when evil-auto-indent
- (indent-according-to-mode)))
-
-(defun evil-open-below (count)
- "Insert a new line below point and switch to Insert state.
-The insertion will be repeated COUNT times."
- (interactive "p")
- (unless (eq evil-want-fine-undo t)
- (evil-start-undo-step))
- (push (point) buffer-undo-list)
- (evil-insert-newline-below)
- (setq evil-insert-count count
- evil-insert-lines t
- evil-insert-vcount nil)
- (evil-insert-state 1)
- (when evil-auto-indent
- (indent-according-to-mode)))
-
-(defun evil-insert-line (count &optional vcount)
- "Switch to insert state at beginning of current line.
-Point is placed at the first non-blank character on the current
-line. The insertion will be repeated COUNT times. If VCOUNT is
-non nil it should be number > 0. The insertion will be repeated
-in the next VCOUNT - 1 lines below the current one."
- (interactive "p")
- (push (point) buffer-undo-list)
- (if (and visual-line-mode
- evil-respect-visual-line-mode)
- (goto-char
- (max (save-excursion
- (back-to-indentation)
- (point))
- (save-excursion
- (beginning-of-visual-line)
- (point))))
- (back-to-indentation))
- (setq evil-insert-count count
- evil-insert-lines nil
- evil-insert-vcount
- (and vcount
- (> vcount 1)
- (list (line-number-at-pos)
- #'evil-first-non-blank
- vcount)))
- (evil-insert-state 1))
-
-(defun evil-append-line (count &optional vcount)
- "Switch to Insert state at the end of the current line.
-The insertion will be repeated COUNT times. If VCOUNT is non nil
-it should be number > 0. The insertion will be repeated in the
-next VCOUNT - 1 lines below the current one."
- (interactive "p")
- (if (and visual-line-mode
- evil-respect-visual-line-mode)
- (evil-end-of-visual-line)
- (evil-move-end-of-line))
- (setq evil-insert-count count
- evil-insert-lines nil
- evil-insert-vcount
- (and vcount
- (> vcount 1)
- (list (line-number-at-pos)
- #'end-of-line
- vcount)))
- (evil-insert-state 1))
-
-(evil-define-command evil-insert-digraph (count)
- "Insert COUNT digraphs."
- :repeat change
- (interactive "p")
- (let ((digraph (evil-read-digraph-char 0)))
- (insert-char digraph count)))
-
-(evil-define-command evil-ex-show-digraphs ()
- "Shows a list of all available digraphs."
- :repeat nil
- (let ((columns 3))
- (evil-with-view-list
- :name "evil-digraphs"
- :mode-name "Evil Digraphs"
- :format
- (cl-loop repeat columns
- vconcat [("Digraph" 8 nil)
- ("Sequence" 16 nil)])
- :entries
- (let* ((digraphs (mapcar #'(lambda (digraph)
- (cons (cdr digraph)
- (car digraph)))
- (append evil-digraphs-table
- evil-digraphs-table-user)))
- (entries (cl-loop for digraph in digraphs
- collect `(,(concat (char-to-string (nth 1 digraph))
- (char-to-string (nth 2 digraph)))
- ,(char-to-string (nth 0 digraph)))))
- (row)
- (rows)
- (clength (* columns 2)))
- (cl-loop for e in entries
- do
- (push (nth 0 e) row)
- (push (nth 1 e) row)
- (when (eq (length row) clength)
- (push `(nil ,(apply #'vector row)) rows)
- (setq row nil)))
- rows))))
-
-(defun evil--self-insert-string (string)
- "Insert STRING as if typed interactively."
- (let ((chars (append string nil)))
- (dolist (char chars)
- (let ((last-command-event char))
- (self-insert-command 1)))))
-
-(defun evil-copy-from-above (arg)
- "Copy characters from preceding non-blank line.
-The copied text is inserted before point.
-ARG is the number of lines to move backward.
-See also \\<evil-insert-state-map>\\[evil-copy-from-below]."
- (interactive
- (cond
- ;; if a prefix argument was given, repeat it for subsequent calls
- ((and (null current-prefix-arg)
- (eq last-command #'evil-copy-from-above))
- (setq current-prefix-arg last-prefix-arg)
- (list (prefix-numeric-value current-prefix-arg)))
- (t
- (list (prefix-numeric-value current-prefix-arg)))))
- (evil--self-insert-string (evil-copy-chars-from-line arg -1)))
-
-(defun evil-copy-from-below (arg)
- "Copy characters from following non-blank line.
-The copied text is inserted before point.
-ARG is the number of lines to move forward.
-See also \\<evil-insert-state-map>\\[evil-copy-from-above]."
- (interactive
- (cond
- ((and (null current-prefix-arg)
- (eq last-command #'evil-copy-from-below))
- (setq current-prefix-arg last-prefix-arg)
- (list (prefix-numeric-value current-prefix-arg)))
- (t
- (list (prefix-numeric-value current-prefix-arg)))))
- (evil--self-insert-string (evil-copy-chars-from-line arg 1)))
-
-;; adapted from `copy-from-above-command' in misc.el
-(defun evil-copy-chars-from-line (n num &optional col)
- "Return N characters from line NUM, starting at column COL.
-NUM is relative to the current line and can be negative.
-COL defaults to the current column."
- (interactive "p")
- (let ((col (or col (current-column))) prefix)
- (save-excursion
- (forward-line num)
- (when (looking-at "[[:space:]]*$")
- (if (< num 0)
- (skip-chars-backward " \t\n")
- (skip-chars-forward " \t\n")))
- (evil-move-beginning-of-line)
- (move-to-column col)
- ;; if the column winds up in middle of a tab,
- ;; return the appropriate number of spaces
- (when (< col (current-column))
- (if (eq (preceding-char) ?\t)
- (let ((len (min n (- (current-column) col))))
- (setq prefix (make-string len ?\s)
- n (- n len)))
- ;; if in middle of a control char, return the whole char
- (backward-char 1)))
- (concat prefix
- (buffer-substring (point)
- (min (line-end-position)
- (+ n (point))))))))
-
-;; completion
-(evil-define-command evil-complete-next (&optional arg)
- "Complete to the nearest following word.
-Search backward if a match isn't found.
-Calls `evil-complete-next-func'."
- :repeat change
- (interactive "P")
- (if (minibufferp)
- (funcall evil-complete-next-minibuffer-func)
- (funcall evil-complete-next-func arg)))
-
-(evil-define-command evil-complete-previous (&optional arg)
- "Complete to the nearest preceding word.
-Search forward if a match isn't found.
-Calls `evil-complete-previous-func'."
- :repeat change
- (interactive "P")
- (if (minibufferp)
- (funcall evil-complete-previous-minibuffer-func)
- (funcall evil-complete-previous-func arg)))
-
-(evil-define-command evil-complete-next-line (&optional arg)
- "Complete a whole line.
-Calls `evil-complete-next-line-func'."
- :repeat change
- (interactive "P")
- (if (minibufferp)
- (funcall evil-complete-next-minibuffer-func)
- (funcall evil-complete-next-line-func arg)))
-
-(evil-define-command evil-complete-previous-line (&optional arg)
- "Complete a whole line.
-Calls `evil-complete-previous-line-func'."
- :repeat change
- (interactive "P")
- (if (minibufferp)
- (funcall evil-complete-previous-minibuffer-func)
- (funcall evil-complete-previous-line-func arg)))
-
-;;; Search
-
-(defun evil-repeat-search (flag)
- "Called to record a search command.
-FLAG is either 'pre or 'post if the function is called before resp.
-after executing the command."
- (cond
- ((and (evil-operator-state-p) (eq flag 'pre))
- (evil-repeat-record (this-command-keys))
- (evil-clear-command-keys))
- ((and (evil-operator-state-p) (eq flag 'post))
- ;; The value of (this-command-keys) at this point should be the
- ;; key-sequence that called the last command that finished the
- ;; search, usually RET. Therefore this key-sequence will be
- ;; recorded in the post-command of the operator. Alternatively we
- ;; could do it here.
- (evil-repeat-record (if evil-regexp-search
- (car-safe regexp-search-ring)
- (car-safe search-ring))))
- (t (evil-repeat-motion flag))))
-
-(evil-define-motion evil-search-forward ()
- (format "Search forward for user-entered text.
-Searches for regular expression if `evil-regexp-search' is t.%s"
- (if (and (fboundp 'isearch-forward)
- (documentation 'isearch-forward))
- (format "\n\nBelow is the documentation string \
-for `isearch-forward',\nwhich lists available keys:\n\n%s"
- (documentation 'isearch-forward)) ""))
- :jump t
- :type exclusive
- :repeat evil-repeat-search
- (evil-search-incrementally t evil-regexp-search))
-
-(evil-define-motion evil-search-backward ()
- (format "Search backward for user-entered text.
-Searches for regular expression if `evil-regexp-search' is t.%s"
- (if (and (fboundp 'isearch-forward)
- (documentation 'isearch-forward))
- (format "\n\nBelow is the documentation string \
-for `isearch-forward',\nwhich lists available keys:\n\n%s"
- (documentation 'isearch-forward)) ""))
- :jump t
- :type exclusive
- :repeat evil-repeat-search
- (evil-search-incrementally nil evil-regexp-search))
-
-(evil-define-motion evil-search-next (count)
- "Repeat the last search."
- :jump t
- :type exclusive
- (let ((orig (point))
- (search-string (if evil-regexp-search
- (car-safe regexp-search-ring)
- (car-safe search-ring))))
- (goto-char
- ;; Wrap in `save-excursion' so that multiple searches have no visual effect.
- (save-excursion
- (evil-search search-string isearch-forward evil-regexp-search)
- (when (and (> (point) orig)
- (save-excursion
- (evil-adjust-cursor)
- (= (point) orig)))
- ;; Point won't move after first attempt and `evil-adjust-cursor' takes
- ;; effect, so start again.
- (evil-search search-string isearch-forward evil-regexp-search))
- (point)))
- (when (and count (> count 1))
- (dotimes (_ (1- count))
- (evil-search search-string isearch-forward evil-regexp-search)))))
-
-(evil-define-motion evil-search-previous (count)
- "Repeat the last search in the opposite direction."
- :jump t
- :type exclusive
- (dotimes (_ (or count 1))
- (evil-search (if evil-regexp-search
- (car-safe regexp-search-ring)
- (car-safe search-ring))
- (not isearch-forward) evil-regexp-search)))
-
-(evil-define-motion evil-search-word-backward (count &optional symbol)
- "Search backward for symbol under point."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (dotimes (_ (or count 1))
- (evil-search-word nil nil symbol)))
-
-(evil-define-motion evil-search-word-forward (count &optional symbol)
- "Search forward for symbol under point."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (dotimes (_ (or count 1))
- (evil-search-word t nil symbol)))
-
-(evil-define-motion evil-search-unbounded-word-backward (count &optional symbol)
- "Search backward for symbol under point.
-The search is unbounded, i.e., the pattern is not wrapped in
-\\<...\\>."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (dotimes (_ (or count 1))
- (evil-search-word nil t symbol)))
-
-(evil-define-motion evil-search-unbounded-word-forward (count &optional symbol)
- "Search forward for symbol under point.
-The search is unbounded, i.e., the pattern is not wrapped in
-\\<...\\>."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (dotimes (_ (or count 1))
- (evil-search-word t t symbol)))
-
-(defun evil-goto-definition-imenu (string _position)
- "Find definition for STRING with imenu."
- (require 'imenu nil t)
- (let (ientry ipos)
- (when (fboundp 'imenu--make-index-alist)
- (ignore-errors (setq ientry (imenu--make-index-alist)))
- (setq ientry (imenu--in-alist string ientry))
- (setq ipos (cdr ientry))
- (when (and (markerp ipos)
- (eq (marker-buffer ipos) (current-buffer)))
- (setq ipos (marker-position ipos))
- (when (numberp ipos)
- (evil-search (format "\\_<%s\\_>" (regexp-quote string)) t t ipos)
- t)))))
-
-(defun evil-goto-definition-semantic (_string position)
- "Find definition for POSITION with semantic."
- (and (fboundp 'semantic-ia-fast-jump)
- (ignore-errors (semantic-ia-fast-jump position))))
-
-(declare-function xref-backend-identifier-at-point "xref")
-
-(defun evil-goto-definition-xref (_string position)
- "Find definition at POSITION with xref."
- (when (fboundp 'xref-find-definitions)
- (let ((identifier (save-excursion
- (goto-char position)
- (xref-backend-identifier-at-point (xref-find-backend)))))
- (condition-case ()
- (progn
- (xref-find-definitions identifier)
- t)
- (user-error nil)))))
-
-(defun evil-goto-definition-search (string _position)
- "Find definition for STRING with evil-search."
- (evil-search (format "\\_<%s\\_>" (regexp-quote string)) t t (point-min))
- t)
-
-(evil-define-motion evil-goto-definition ()
- "Go to definition or first occurrence of symbol under point.
-See also `evil-goto-definition-functions'."
- :jump t
- :type exclusive
- (let* ((match (evil--find-thing t 'symbol))
- (string (car match))
- (position (cdr match)))
- (if (null string)
- (user-error "No symbol under cursor")
- (setq isearch-forward t)
- (run-hook-with-args-until-success 'evil-goto-definition-functions
- string position))))
-
-;;; Folding
-(defun evil-fold-action (list action)
- "Perform fold ACTION for each matching major or minor mode in LIST.
-
-ACTION will be performed for the first matching handler in LIST. For more
-information on its features and format, see the documentation for
-`evil-fold-list'.
-
-If no matching ACTION is found in LIST, an error will signaled.
-
-Handler errors will be demoted, so a problem in one handler will (hopefully)
-not interfere with another."
- (if (null list)
- (user-error
- "Enable one of the following modes for folding to work: %s"
- (mapconcat 'symbol-name (mapcar 'caar evil-fold-list) ", "))
- (let* ((modes (caar list)))
- (if (evil--mode-p modes)
- (let* ((actions (cdar list))
- (fn (plist-get actions action)))
- (when fn
- (with-demoted-errors (funcall fn))))
- (evil-fold-action (cdr list) action)))))
-
-(defun evil--mode-p (modes)
- "Determines whether any symbol in MODES represents the current
-buffer's major mode or any of its minors."
- (unless (eq modes '())
- (let ((mode (car modes)))
- (or (eq major-mode mode)
- (and (boundp mode) (symbol-value mode))
- (evil--mode-p (cdr modes))))))
-
-(evil-define-command evil-toggle-fold ()
- "Open or close a fold under point.
-See also `evil-open-fold' and `evil-close-fold'."
- (evil-fold-action evil-fold-list :toggle))
-
-(evil-define-command evil-open-folds ()
- "Open all folds.
-See also `evil-close-folds'."
- (evil-fold-action evil-fold-list :open-all))
-
-(evil-define-command evil-close-folds ()
- "Close all folds.
-See also `evil-open-folds'."
- (evil-fold-action evil-fold-list :close-all))
-
-(evil-define-command evil-open-fold ()
- "Open fold at point.
-See also `evil-close-fold'."
- (evil-fold-action evil-fold-list :open))
-
-(evil-define-command evil-open-fold-rec ()
- "Open fold at point recursively.
-See also `evil-open-fold' and `evil-close-fold'."
- (evil-fold-action evil-fold-list :open-rec))
-
-(evil-define-command evil-close-fold ()
- "Close fold at point.
-See also `evil-open-fold'."
- (evil-fold-action evil-fold-list :close))
-
-;;; Ex
-
-(evil-define-operator evil-write (beg end type file-or-append &optional bang)
- "Save the current buffer, from BEG to END, to FILE-OR-APPEND.
-If FILE-OR-APPEND is of the form \">> FILE\", append to FILE
-instead of overwriting. The current buffer's filename is not
-changed unless it has no associated file and no region is
-specified. If the file already exists and the BANG argument is
-non-nil, it is overwritten without confirmation."
- :motion nil
- :move-point nil
- :type line
- :repeat nil
- (interactive "<R><fsh><!>")
- (let* ((append-and-filename (evil-extract-append file-or-append))
- (append (car append-and-filename))
- (filename (cdr append-and-filename))
- (bufname (buffer-file-name (buffer-base-buffer))))
- (when (zerop (length filename))
- (setq filename bufname))
- (cond
- ((zerop (length filename))
- (user-error "Please specify a file name for the buffer"))
- ;; execute command on region
- ((eq (aref filename 0) ?!)
- (shell-command-on-region beg end (substring filename 1)))
- ;; with region or append, always save to file without resetting
- ;; modified flag
- ((or append (and beg end))
- (write-region beg end filename append nil nil (not (or append bang))))
- ;; no current file
- ((null bufname)
- (write-file filename (not bang)))
- ;; save current buffer to its file
- ((string= filename bufname)
- (if (not bang) (save-buffer) (write-file filename)))
- ;; save to another file
- (t
- (write-region nil nil filename
- nil (not bufname) nil
- (not bang))))))
-
-(evil-define-command evil-write-all (bang)
- "Saves all buffers visiting a file.
-If BANG is non nil then read-only buffers are saved, too,
-otherwise they are skipped. "
- :repeat nil
- :move-point nil
- (interactive "<!>")
- (if bang
- (save-some-buffers t)
- ;; save only buffer that are not read-only and
- ;; that are visiting a file
- (save-some-buffers t
- #'(lambda ()
- (and (not buffer-read-only)
- (buffer-file-name))))))
-
-(evil-define-command evil-save (filename &optional bang)
- "Save the current buffer to FILENAME.
-Changes the file name of the current buffer to FILENAME. If no
-FILENAME is given, the current file name is used."
- :repeat nil
- :move-point nil
- (interactive "<f><!>")
- (when (zerop (length filename))
- (setq filename (buffer-file-name (buffer-base-buffer))))
- (write-file filename (not bang)))
-
-(evil-define-command evil-edit (file &optional bang)
- "Open FILE.
-If no FILE is specified, reload the current buffer from disk."
- :repeat nil
- (interactive "<f><!>")
- (if file
- (find-file file)
- (revert-buffer bang (or bang (not (buffer-modified-p))) t)))
-
-(evil-define-command evil-read (count file)
- "Inserts the contents of FILE below the current line or line COUNT."
- :repeat nil
- :move-point nil
- (interactive "P<fsh>")
- (when (and file (not (zerop (length file))))
- (when count (goto-char (point-min)))
- (when (or (not (zerop (forward-line (or count 1))))
- (not (bolp)))
- (insert "\n"))
- (if (/= (aref file 0) ?!)
- (let ((result (insert-file-contents file)))
- (save-excursion
- (forward-char (cadr result))
- (unless (bolp) (insert "\n"))))
- (shell-command (substring file 1) t)
- (save-excursion
- (goto-char (mark))
- (unless (bolp) (insert "\n"))))))
-
-(evil-define-command evil-show-files ()
- "Shows the file-list.
-The same as `buffer-menu', but shows only buffers visiting
-files."
- :repeat nil
- (buffer-menu 1))
-
-(evil-define-command evil-goto-error (count)
- "Go to error number COUNT.
-
-If no COUNT supplied, move to the current error.
-
-Acts like `first-error' other than when given no counts, goes
-to the current error instead of the first, like in Vim's :cc
-command."
- :repeat nil
- (interactive "<c>")
- (if count
- (first-error (if (eql 0 count) 1 count))
- (next-error 0)))
-
-(evil-define-command evil-buffer (buffer)
- "Switches to another buffer."
- :repeat nil
- (interactive "<b>")
- (cond
- ;; no buffer given, switch to "other" buffer
- ((null buffer) (switch-to-buffer (other-buffer)))
- ;; we are given the name of an existing buffer
- ((get-buffer buffer) (switch-to-buffer buffer))
- ;; try to complete the buffer
- ((let ((all-buffers (internal-complete-buffer buffer nil t)))
- (when (= (length all-buffers) 1)
- (switch-to-buffer (car all-buffers)))))
- (t
- (when (y-or-n-p
- (format "No buffer with name \"%s\" exists. Create new buffer? "
- buffer))
- (switch-to-buffer buffer)))))
-
-(evil-define-command evil-next-buffer (&optional count)
- "Goes to the `count'-th next buffer in the buffer list."
- :repeat nil
- (interactive "p")
- (dotimes (_ (or count 1))
- (next-buffer)))
-
-(evil-define-command evil-prev-buffer (&optional count)
- "Goes to the `count'-th prev buffer in the buffer list."
- :repeat nil
- (interactive "p")
- (dotimes (_ (or count 1))
- (previous-buffer)))
-
-(evil-define-command evil-delete-buffer (buffer &optional bang)
- "Deletes a buffer.
-All windows currently showing this buffer will be closed except
-for the last window in each frame."
- (interactive "<b><!>")
- (with-current-buffer (or buffer (current-buffer))
- (when bang
- (set-buffer-modified-p nil)
- (dolist (process (process-list))
- (when (eq (process-buffer process) (current-buffer))
- (set-process-query-on-exit-flag process nil))))
- ;; get all windows that show this buffer
- (let ((wins (get-buffer-window-list (current-buffer) nil t)))
- ;; if the buffer which was initiated by emacsclient,
- ;; call `server-edit' from server.el to avoid
- ;; "Buffer still has clients" message
- (if (and (fboundp 'server-edit)
- (boundp 'server-buffer-clients)
- server-buffer-clients)
- (server-edit)
- (kill-buffer nil))
- ;; close all windows that showed this buffer
- (mapc #'(lambda (w)
- (condition-case nil
- (delete-window w)
- (error nil)))
- wins))))
-
-(evil-define-command evil-quit (&optional force)
- "Closes the current window, current frame, Emacs.
-If the current frame belongs to some client the client connection
-is closed."
- :repeat nil
- (interactive "<!>")
- (condition-case nil
- (delete-window)
- (error
- (if (and (boundp 'server-buffer-clients)
- (fboundp 'server-edit)
- (fboundp 'server-buffer-done)
- server-buffer-clients)
- (if force
- (server-buffer-done (current-buffer))
- (server-edit))
- (condition-case nil
- (delete-frame)
- (error
- (if force
- (kill-emacs)
- (save-buffers-kill-emacs))))))))
-
-(evil-define-command evil-quit-all (&optional bang)
- "Exits Emacs, asking for saving."
- :repeat nil
- (interactive "<!>")
- (if (null bang)
- (save-buffers-kill-terminal)
- (let ((proc (frame-parameter (selected-frame) 'client)))
- (if proc
- (with-no-warnings
- (server-delete-client proc))
- (dolist (process (process-list))
- (set-process-query-on-exit-flag process nil))
- (kill-emacs)))))
-
-(evil-define-command evil-quit-all-with-error-code (&optional force)
- "Exits Emacs without saving, returning an non-zero error code.
-The FORCE argument is only there for compatibility and is ignored.
-This function fails with an error if Emacs is run in server mode."
- :repeat nil
- (interactive "<!>")
- (if (and (boundp 'server-buffer-clients)
- (fboundp 'server-edit)
- (fboundp 'server-buffer-done)
- server-buffer-clients)
- (user-error "Cannot exit client process with error code.")
- (kill-emacs 1)))
-
-(evil-define-command evil-save-and-quit ()
- "Save all buffers and exit Emacs."
- (save-buffers-kill-terminal t))
-
-(evil-define-command evil-save-and-close (file &optional bang)
- "Saves the current buffer and closes the window."
- :repeat nil
- (interactive "<f><!>")
- (evil-write nil nil nil file bang)
- (evil-quit))
-
-(evil-define-command evil-save-modified-and-close (file &optional bang)
- "Saves the current buffer and closes the window."
- :repeat nil
- (interactive "<f><!>")
- (when (buffer-modified-p)
- (evil-write nil nil nil file bang))
- (evil-quit))
-
-(evil-define-operator evil-shell-command
- (beg end type command &optional previous)
- "Execute a shell command.
-If BEG, END and TYPE is specified, COMMAND is executed on the region,
-which is replaced with the command's output. Otherwise, the
-output is displayed in its own buffer. If PREVIOUS is non-nil,
-the previous shell command is executed instead."
- (interactive "<R><sh><!>")
- (if (not (evil-ex-p))
- (let ((evil-ex-initial-input
- (if (and beg
- (not (evil-visual-state-p))
- (not current-prefix-arg))
- (let ((range (evil-range beg end type)))
- (evil-contract-range range)
- ;; TODO: this is not exactly the same as Vim, which
- ;; uses .,+count as range. However, this is easier
- ;; to achieve with the current implementation and
- ;; the very inconvenient range interface.
- ;;
- ;; TODO: the range interface really needs some
- ;; rework!
- (format
- "%d,%d!"
- (line-number-at-pos (evil-range-beginning range))
- (line-number-at-pos (evil-range-end range))))
- "!")))
- (call-interactively 'evil-ex))
- (when command
- (setq command (evil-ex-replace-special-filenames command)))
- (if (zerop (length command))
- (when previous (setq command evil-previous-shell-command))
- (setq evil-previous-shell-command command))
- (cond
- ((zerop (length command))
- (if previous (user-error "No previous shell command")
- (user-error "No shell command")))
- (evil-ex-range
- (if (not evil-display-shell-error-in-message)
- (shell-command-on-region beg end command nil t)
- (let ((output-buffer (generate-new-buffer " *temp*"))
- (error-buffer (generate-new-buffer " *temp*")))
- (unwind-protect
- (if (zerop (shell-command-on-region beg end
- command
- output-buffer nil
- error-buffer))
- (progn
- (delete-region beg end)
- (insert-buffer-substring output-buffer)
- (goto-char beg)
- (evil-first-non-blank))
- (display-message-or-buffer error-buffer))
- (kill-buffer output-buffer)
- (kill-buffer error-buffer)))))
- (t
- (shell-command command)))))
-
-(evil-define-command evil-make (arg)
- "Call a build command in the current directory.
-If ARG is nil this function calls `recompile', otherwise it calls
-`compile' passing ARG as build command."
- (interactive "<sh>")
- (if (and (fboundp 'recompile)
- (not arg))
- (recompile)
- (compile arg)))
-
-;; TODO: escape special characters (currently only \n) ... perhaps
-;; there is some Emacs function doing this?
-(evil-define-command evil-show-registers ()
- "Shows the contents of all registers."
- :repeat nil
- (evil-with-view-list
- :name "evil-registers"
- :mode-name "Evil Registers"
- :format
- [("Register" 10 nil)
- ("Value" 1000 nil)]
- :entries
- (cl-loop for (key . val) in (evil-register-list)
- collect `(nil [,(char-to-string key)
- ,(cond ((stringp val)
- (replace-regexp-in-string "\n" "^J" val))
- ((vectorp val)
- (key-description val))
- (t ""))]))))
-
-(evil-define-command evil-show-marks (mrks)
- "Shows all marks.
-If MRKS is non-nil it should be a string and only registers
-corresponding to the characters of this string are shown."
- :repeat nil
- (interactive "<a>")
- ;; To get markers and positions, we can't rely on 'global-mark-ring'
- ;; provided by Emacs (although it will be much simpler and faster),
- ;; because 'global-mark-ring' does not store mark characters, but
- ;; only buffer name and position. Instead, 'evil-markers-alist' is
- ;; used; this is list maintained by Evil for each buffer.
- (let ((all-markers
- ;; get global and local marks
- (append (cl-remove-if (lambda (m)
- (or (evil-global-marker-p (car m))
- (not (markerp (cdr m)))))
- evil-markers-alist)
- (cl-remove-if (lambda (m)
- (or (not (evil-global-marker-p (car m)))
- (not (markerp (cdr m)))))
- (default-value 'evil-markers-alist)))))
- (when mrks
- (setq mrks (string-to-list mrks))
- (setq all-markers (cl-delete-if (lambda (m)
- (not (member (car m) mrks)))
- all-markers)))
- ;; map marks to list of 4-tuples (char row col file)
- (setq all-markers
- (mapcar (lambda (m)
- (with-current-buffer (marker-buffer (cdr m))
- (save-excursion
- (goto-char (cdr m))
- (list (car m)
- (line-number-at-pos (point))
- (current-column)
- (buffer-name)))))
- all-markers))
- (evil-with-view-list
- :name "evil-marks"
- :mode-name "Evil Marks"
- :format [("Mark" 8 nil)
- ("Line" 8 nil)
- ("Column" 8 nil)
- ("Buffer" 1000 nil)]
- :entries (cl-loop for m in (sort all-markers (lambda (a b) (< (car a) (car b))))
- collect `(nil [,(char-to-string (nth 0 m))
- ,(number-to-string (nth 1 m))
- ,(number-to-string (nth 2 m))
- (,(nth 3 m))]))
- :select-action #'evil--show-marks-select-action)))
-
-(defun evil--show-marks-select-action (entry)
- (kill-buffer)
- (switch-to-buffer (car (elt entry 3)))
- (evil-goto-mark (string-to-char (elt entry 0))))
-
-(evil-define-command evil-delete-marks (marks &optional force)
- "Delete all marks.
-MARKS is a string denoting all marks to be deleted. Mark names are
-either single characters or a range of characters in the form A-Z.
-
-If FORCE is non-nil all local marks except 0-9 are removed.
-"
- (interactive "<a><!>")
- (cond
- ;; delete local marks except 0-9
- (force
- (setq evil-markers-alist
- (cl-delete-if (lambda (m)
- (not (and (>= (car m) ?0) (<= (car m) ?9))))
- evil-markers-alist)))
- (t
- (let ((i 0)
- (n (length marks))
- delmarks)
- (while (< i n)
- (cond
- ;; skip spaces
- ((= (aref marks i) ?\s) (cl-incf i))
- ;; ranges of marks
- ((and (< (+ i 2) n)
- (= (aref marks (1+ i)) ?-)
- (or (and (>= (aref marks i) ?a)
- (<= (aref marks i) ?z)
- (>= (aref marks (+ 2 i)) ?a)
- (<= (aref marks (+ 2 i)) ?z))
- (and (>= (aref marks i) ?A)
- (<= (aref marks i) ?Z)
- (>= (aref marks (+ 2 i)) ?A)
- (<= (aref marks (+ 2 i)) ?Z))))
- (let ((m (aref marks i)))
- (while (<= m (aref marks (+ 2 i)))
- (push m delmarks)
- (cl-incf m)))
- (cl-incf i 2))
- ;; single marks
- (t
- (push (aref marks i) delmarks)
- (cl-incf i))))
- ;; now remove all marks
- (setq evil-markers-alist
- (cl-delete-if (lambda (m) (member (car m) delmarks))
- evil-markers-alist))
- (set-default 'evil-markers-alist
- (cl-delete-if (lambda (m) (member (car m) delmarks))
- (default-value 'evil-markers-alist)))))))
-
-(eval-when-compile (require 'ffap))
-(evil-define-command evil-find-file-at-point-with-line ()
- "Opens the file at point and goes to line-number."
- (require 'ffap)
- (let ((fname (with-no-warnings (ffap-file-at-point))))
- (if fname
- (let ((line
- (save-excursion
- (goto-char (cadr ffap-string-at-point-region))
- (and (re-search-backward ":\\([0-9]+\\)\\="
- (line-beginning-position) t)
- (string-to-number (match-string 1))))))
- (with-no-warnings (ffap-other-window))
- (when line
- (goto-char (point-min))
- (forward-line (1- line))))
- (user-error "File does not exist."))))
-
-(evil-ex-define-argument-type state
- "Defines an argument type which can take state names."
- :collection
- (lambda (arg predicate flag)
- (let ((completions
- (append '("nil")
- (mapcar #'(lambda (state)
- (format "%s" (car state)))
- evil-state-properties))))
- (when arg
- (cond
- ((eq flag nil)
- (try-completion arg completions predicate))
- ((eq flag t)
- (all-completions arg completions predicate))
- ((eq flag 'lambda)
- (test-completion arg completions predicate))
- ((eq (car-safe flag) 'boundaries)
- (cons 'boundaries
- (completion-boundaries arg
- completions
- predicate
- (cdr flag)))))))))
-
-(evil-define-interactive-code "<state>"
- "A valid evil state."
- :ex-arg state
- (list (when (and (evil-ex-p) evil-ex-argument)
- (intern evil-ex-argument))))
-
-;; TODO: should we merge this command with `evil-set-initial-state'?
-(evil-define-command evil-ex-set-initial-state (state)
- "Set the initial state for the current major mode to STATE.
-This is the state the buffer comes up in. See `evil-set-initial-state'."
- :repeat nil
- (interactive "<state>")
- (if (not (or (assq state evil-state-properties)
- (null state)))
- (user-error "State %s cannot be set as initial Evil state" state)
- (let ((current-initial-state (evil-initial-state major-mode)))
- (unless (eq current-initial-state state)
- ;; only if we selected a new mode
- (when (y-or-n-p (format "Major-mode `%s' has initial mode `%s'. \
-Change to `%s'? "
- major-mode
- (or current-initial-state "DEFAULT")
- (or state "DEFAULT")))
- (evil-set-initial-state major-mode state)
- (when (y-or-n-p "Save setting in customization file? ")
- (dolist (s (list current-initial-state state))
- (when s
- (let ((var (intern (format "evil-%s-state-modes" s))))
- (customize-save-variable var (symbol-value var)))))))))))
-
-(evil-define-command evil-force-normal-state ()
- "Switch to normal state without recording current command."
- :repeat abort
- :suppress-operator t
- (evil-normal-state))
-
-(evil-define-motion evil-ex-search-next (count)
- "Goes to the next occurrence."
- :jump t
- :type exclusive
- (evil-ex-search count))
-
-(evil-define-motion evil-ex-search-previous (count)
- "Goes the the previous occurrence."
- :jump t
- :type exclusive
- (let ((evil-ex-search-direction
- (if (eq evil-ex-search-direction 'backward) 'forward 'backward)))
- (evil-ex-search count)))
-
-(defun evil-repeat-ex-search (flag)
- "Called to record a search command.
-FLAG is either 'pre or 'post if the function is called before
-resp. after executing the command."
- (cond
- ((and (evil-operator-state-p) (eq flag 'pre))
- (evil-repeat-record (this-command-keys))
- (evil-clear-command-keys))
- ((and (evil-operator-state-p) (eq flag 'post))
- ;; The value of (this-command-keys) at this point should be the
- ;; key-sequence that called the last command that finished the
- ;; search, usually RET. Therefore this key-sequence will be
- ;; recorded in the post-command of the operator. Alternatively we
- ;; could do it here.
- (evil-repeat-record (evil-ex-pattern-regex evil-ex-search-pattern)))
- (t (evil-repeat-motion flag))))
-
-(evil-define-motion evil-ex-search-forward (count)
- "Starts a forward search."
- :jump t
- :type exclusive
- :repeat evil-repeat-ex-search
- (evil-ex-start-search 'forward count))
-
-(evil-define-motion evil-ex-search-backward (count)
- "Starts a forward search."
- :jump t
- :repeat evil-repeat-ex-search
- (evil-ex-start-search 'backward count))
-
-(evil-define-motion evil-ex-search-word-forward (count &optional symbol)
- "Search for the next occurrence of word under the cursor."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (evil-ex-start-word-search nil 'forward count symbol))
-
-(evil-define-motion evil-ex-search-word-backward (count &optional symbol)
- "Search for the next occurrence of word under the cursor."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (evil-ex-start-word-search nil 'backward count symbol))
-
-(evil-define-motion evil-ex-search-unbounded-word-forward (count &optional symbol)
- "Search for the next occurrence of word under the cursor."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (evil-ex-start-word-search t 'forward count symbol))
-
-(evil-define-motion evil-ex-search-unbounded-word-backward (count &optional symbol)
- "Search for the next occurrence of word under the cursor."
- :jump t
- :type exclusive
- (interactive (list (prefix-numeric-value current-prefix-arg)
- evil-symbol-word-search))
- (evil-ex-start-word-search t 'backward count symbol))
-
-(defun evil-revert-reveal (open-spots)
- "Unconditionally close overlays in OPEN-SPOTS in current window.
-Modified version of `reveal-close-old-overlays' from
-reveal.el. OPEN-SPOTS is a local version of `reveal-open-spots'."
- (dolist (spot open-spots)
- (let ((window (car spot))
- (ol (cdr spot)))
- (unless (eq window (selected-window))
- (error "evil-revert-reveal: slot with wrong window"))
- (let* ((inv (overlay-get ol 'reveal-invisible))
- (open (or (overlay-get ol 'reveal-toggle-invisible)
- (get inv 'reveal-toggle-invisible)
- (overlay-get ol 'isearch-open-invisible-temporary))))
- (if (and (overlay-start ol) ;Check it's still live.
- open)
- (condition-case err
- (funcall open ol t)
- (error (message "!!Reveal-hide (funcall %s %s t): %s !!"
- open ol err)))
- (overlay-put ol 'invisible inv))
- ;; Remove the overlay from the list of open spots.
- (overlay-put ol 'reveal-invisible nil)))))
-
-(evil-define-operator evil-ex-substitute
- (beg end pattern replacement flags)
- "The Ex substitute command.
-\[BEG,END]substitute/PATTERN/REPLACEMENT/FLAGS"
- :repeat nil
- :jump t
- :move-point nil
- :motion evil-line
- (interactive "<r><s/>")
- (evil-ex-nohighlight)
- (unless pattern
- (user-error "No pattern given"))
- (setq replacement (or replacement ""))
- (setq evil-ex-last-was-search nil)
- (let* ((flags (append flags nil))
- (count-only (memq ?n flags))
- (confirm (and (memq ?c flags) (not count-only)))
- (case-fold-search (evil-ex-pattern-ignore-case pattern))
- (case-replace case-fold-search)
- (evil-ex-substitute-regex (evil-ex-pattern-regex pattern))
- (evil-ex-substitute-nreplaced 0)
- (evil-ex-substitute-last-point (point))
- (whole-line (evil-ex-pattern-whole-line pattern))
- (evil-ex-substitute-overlay (make-overlay (point) (point)))
- (orig-point-marker (move-marker (make-marker) (point)))
- (end-marker (move-marker (make-marker) end))
- (use-reveal confirm)
- reveal-open-spots
- zero-length-match
- match-contains-newline
- transient-mark-mode)
- (setq evil-ex-substitute-pattern pattern
- evil-ex-substitute-replacement replacement
- evil-ex-substitute-flags flags
- isearch-string evil-ex-substitute-regex)
- (isearch-update-ring evil-ex-substitute-regex t)
- (unwind-protect
- (progn
- (evil-ex-hl-change 'evil-ex-substitute pattern)
- (overlay-put evil-ex-substitute-overlay 'face 'isearch)
- (overlay-put evil-ex-substitute-overlay 'priority 1001)
- (goto-char beg)
- (catch 'exit-search
- (while (re-search-forward evil-ex-substitute-regex end-marker t)
- (when (not (and query-replace-skip-read-only
- (text-property-any (match-beginning 0) (match-end 0) 'read-only t)))
- (let ((match-str (match-string 0))
- (match-beg (move-marker (make-marker) (match-beginning 0)))
- (match-end (move-marker (make-marker) (match-end 0)))
- (match-data (match-data)))
- (goto-char match-beg)
- (setq match-contains-newline
- (string-match-p "\n" (buffer-substring-no-properties
- match-beg match-end)))
- (setq zero-length-match (= match-beg match-end))
- (when (and (string= "^" evil-ex-substitute-regex)
- (= (point) end-marker))
- ;; The range (beg end) includes the final newline which means
- ;; end-marker is on one line down. With the regex "^" the
- ;; beginning of this last line will be matched which we don't
- ;; want, so we abort here.
- (throw 'exit-search t))
- (setq evil-ex-substitute-last-point match-beg)
- (if confirm
- (let ((prompt
- (format "Replace %s with %s (y/n/a/q/l/^E/^Y)? "
- match-str
- (evil-match-substitute-replacement
- evil-ex-substitute-replacement
- (not case-replace))))
- (search-invisible t)
- response)
- (move-overlay evil-ex-substitute-overlay match-beg match-end)
- ;; Simulate `reveal-mode'. `reveal-mode' uses
- ;; `post-command-hook' but that won't work here.
- (when use-reveal
- (reveal-post-command))
- (catch 'exit-read-char
- (while (setq response (read-char prompt))
- (when (member response '(?y ?a ?l))
- (unless count-only
- (set-match-data match-data)
- (evil-replace-match evil-ex-substitute-replacement
- (not case-replace)))
- (setq evil-ex-substitute-nreplaced
- (1+ evil-ex-substitute-nreplaced))
- (evil-ex-hl-set-region 'evil-ex-substitute
- (save-excursion
- (forward-line)
- (point))
- (evil-ex-hl-get-max
- 'evil-ex-substitute)))
- (cl-case response
- ((?y ?n) (throw 'exit-read-char t))
- (?a (setq confirm nil)
- (throw 'exit-read-char t))
- ((?q ?l ?\C-\[) (throw 'exit-search t))
- (?\C-e (evil-scroll-line-down 1))
- (?\C-y (evil-scroll-line-up 1))))))
- (setq evil-ex-substitute-nreplaced
- (1+ evil-ex-substitute-nreplaced))
- (unless count-only
- (set-match-data match-data)
- (evil-replace-match evil-ex-substitute-replacement
- (not case-replace))))
- (goto-char match-end)
- (cond ((>= (point) end-marker)
- ;; Don't want to perform multiple replacements at the end
- ;; of the search region.
- (throw 'exit-search t))
- ((and (not whole-line)
- (not match-contains-newline))
- (forward-line)
- ;; forward-line just moves to the end of the line on the
- ;; last line of the buffer.
- (when (or (eobp)
- (> (point) end-marker))
- (throw 'exit-search t)))
- ;; For zero-length matches check to see if point won't
- ;; move next time. This is a problem when matching the
- ;; regexp "$" because we can enter an infinite loop,
- ;; repeatedly matching the same character
- ((and zero-length-match
- (let ((pnt (point)))
- (save-excursion
- (and
- (re-search-forward
- evil-ex-substitute-regex end-marker t)
- (= pnt (point))))))
- (if (or (eobp)
- (>= (point) end-marker))
- (throw 'exit-search t)
- (forward-char)))))))))
- (evil-ex-delete-hl 'evil-ex-substitute)
- (delete-overlay evil-ex-substitute-overlay)
-
- (if count-only
- (goto-char orig-point-marker)
- (goto-char evil-ex-substitute-last-point))
-
- (move-marker orig-point-marker nil)
- (move-marker end-marker nil)
-
- (when use-reveal
- (evil-revert-reveal reveal-open-spots)))
-
- (message "%s %d occurrence%s"
- (if count-only "Found" "Replaced")
- evil-ex-substitute-nreplaced
- (if (/= evil-ex-substitute-nreplaced 1) "s" ""))
- (evil-first-non-blank)))
-
-(evil-define-operator evil-ex-repeat-substitute
- (beg end flags)
- "Repeat last substitute command.
-This is the same as :s//~/"
- :repeat nil
- :jump t
- :move-point nil
- :motion evil-line
- (interactive "<r><a>")
- (apply #'evil-ex-substitute beg end
- (evil-ex-get-substitute-info (concat "//~/" flags))))
-
-(evil-define-operator evil-ex-repeat-substitute-with-flags
- (beg end flags)
- "Repeat last substitute command with last flags.
-This is the same as :s//~/&"
- :repeat nil
- :jump t
- :move-point nil
- :motion evil-line
- (interactive "<r><a>")
- (apply #'evil-ex-substitute beg end
- (evil-ex-get-substitute-info (concat "//~/&" flags))))
-
-(evil-define-operator evil-ex-repeat-substitute-with-search
- (beg end flags)
- "Repeat last substitute command with last search pattern.
-This is the same as :s//~/r"
- :repeat nil
- :jump t
- :move-point nil
- :motion evil-line
- (interactive "<r><a>")
- (apply #'evil-ex-substitute beg end
- (evil-ex-get-substitute-info (concat "//~/r" flags))))
-
-(evil-define-operator evil-ex-repeat-substitute-with-search-and-flags
- (beg end flags)
- "Repeat last substitute command with last search pattern and last flags.
-This is the same as :s//~/&r"
- :repeat nil
- :jump t
- :move-point nil
- :motion evil-line
- (interactive "<r><a>")
- (apply #'evil-ex-substitute beg end
- (evil-ex-get-substitute-info (concat "//~/&r" flags))))
-
-(evil-define-operator evil-ex-repeat-global-substitute ()
- "Repeat last substitute command on the whole buffer.
-This is the same as :%s//~/&"
- :repeat nil
- :jump t
- :move-point nil
- :motion evil-line
- (interactive)
- (apply #'evil-ex-substitute (point-min) (point-max)
- (evil-ex-get-substitute-info (concat "//~/&"))))
-
-(evil-define-operator evil-ex-global
- (beg end pattern command &optional invert)
- "The Ex global command.
-\[BEG,END]global[!]/PATTERN/COMMAND"
- :motion mark-whole-buffer
- :move-point nil
- (interactive "<r><g/><!>")
- (unless pattern
- (user-error "No pattern given"))
- (unless command
- (user-error "No command given"))
- ;; TODO: `evil-ex-make-substitute-pattern' should be executed so
- ;; :substitute can re-use :global's pattern depending on its `r'
- ;; flag. This isn't supported currently but should be simple to add
- (evil-with-single-undo
- (let ((case-fold-search
- (eq (evil-ex-regex-case pattern evil-ex-search-case) 'insensitive))
- (command-form (evil-ex-parse command))
- (transient-mark-mode transient-mark-mode)
- (deactivate-mark deactivate-mark)
- match markers)
- (when (and pattern command)
- (setq isearch-string pattern)
- (isearch-update-ring pattern t)
- (goto-char beg)
- (evil-move-beginning-of-line)
- (while (< (point) end)
- (setq match (re-search-forward pattern (line-end-position) t))
- (when (or (and match (not invert))
- (and invert (not match)))
- (push (move-marker (make-marker)
- (or (and match (match-beginning 0))
- (line-beginning-position)))
- markers))
- (forward-line))
- (setq markers (nreverse markers))
- (unwind-protect
- (dolist (marker markers)
- (goto-char marker)
- (eval command-form))
- ;; ensure that all markers are deleted afterwards,
- ;; even in the event of failure
- (dolist (marker markers)
- (set-marker marker nil)))))))
-
-(evil-define-operator evil-ex-global-inverted
- (beg end pattern command &optional invert)
- "The Ex vglobal command.
-\[BEG,END]vglobal/PATTERN/COMMAND"
- :motion mark-whole-buffer
- :move-point nil
- (interactive "<r><g/><!>")
- (evil-ex-global beg end pattern command (not invert)))
-
-(evil-define-operator evil-ex-normal (beg end commands)
- "The Ex normal command.
-Execute the argument as normal command on each line in the
-range. The given argument is passed straight to
-`execute-kbd-macro'. The default is the current line."
- :motion evil-line
- (interactive "<r><a>")
- (evil-with-single-undo
- (let (markers evil-ex-current-buffer prefix-arg current-prefix-arg)
- (goto-char beg)
- (while
- (and (< (point) end)
- (progn
- (push (move-marker (make-marker) (line-beginning-position))
- markers)
- (and (= (forward-line) 0) (bolp)))))
- (setq markers (nreverse markers))
- (deactivate-mark)
- (evil-force-normal-state)
- ;; replace ^[ by escape
- (setq commands
- (vconcat
- (mapcar #'(lambda (ch) (if (equal ch ?) 'escape ch))
- (append commands nil))))
- (dolist (marker markers)
- (goto-char marker)
- (condition-case nil
- (execute-kbd-macro commands)
- (error nil))
- (evil-force-normal-state)
- (set-marker marker nil)))))
-
-(evil-define-command evil-goto-char (position)
- "Go to POSITION in the buffer.
-Default position is the beginning of the buffer."
- (interactive "p")
- (let ((position (evil-normalize-position
- (or position (point-min)))))
- (goto-char position)))
-
-(evil-define-operator evil-ex-line-number (beg end)
- "Print the last line number."
- :motion mark-whole-buffer
- :move-point nil
- (interactive "<r>")
- (message "%d" (count-lines (point-min) end)))
-
-(evil-define-command evil-show-file-info ()
- "Shows basic file information."
- (let* ((nlines (count-lines (point-min) (point-max)))
- (curr (line-number-at-pos (point)))
- (perc (if (> nlines 0)
- (format "%d%%" (* (/ (float curr) (float nlines)) 100.0))
- "No lines in buffer"))
- (file (buffer-file-name (buffer-base-buffer)))
- (writable (and file (file-writable-p file)))
- (readonly (if (and file (not writable)) "[readonly] " "")))
- (if file
- (message "\"%s\" %d %slines --%s--" file nlines readonly perc)
- (message "%d lines --%s--" nlines perc))))
-
-(defvar sort-fold-case)
-(evil-define-operator evil-ex-sort (beg end &optional options reverse)
- "The Ex sort command.
-\[BEG,END]sort[!] [i][u]
-The following additional options are supported:
-
- * i ignore case
- * u remove duplicate lines
-
-The 'bang' argument means to sort in reverse order."
- :motion mark-whole-buffer
- :move-point nil
- (interactive "<r><a><!>")
- (let ((beg (copy-marker beg))
- (end (copy-marker end))
- sort-fold-case uniq)
- (dolist (opt (append options nil))
- (cond
- ((eq opt ?i) (setq sort-fold-case t))
- ((eq opt ?u) (setq uniq t))
- (t (user-error "Unsupported sort option: %c" opt))))
- (sort-lines reverse beg end)
- (when uniq
- (let (line prev-line)
- (goto-char beg)
- (while (and (< (point) end) (not (eobp)))
- (setq line (buffer-substring-no-properties
- (line-beginning-position)
- (line-end-position)))
- (if (and (stringp prev-line)
- (eq t (compare-strings line nil nil
- prev-line nil nil
- sort-fold-case)))
- (delete-region (progn (forward-line 0) (point))
- (progn (forward-line 1) (point)))
- (setq prev-line line)
- (forward-line 1)))))
- (goto-char beg)
- (set-marker beg nil)
- (set-marker end nil)))
-
-;;; Window navigation
-
-(defmacro evil-save-side-windows (&rest body)
- "Toggle side windows, evaluate BODY, restore side windows."
- (declare (indent defun) (debug (&rest form)))
- (let ((sides (make-symbol "sidesvar")))
- `(let ((,sides (and (functionp 'window-toggle-side-windows)
- (window-with-parameter 'window-side))))
- (when ,sides
- (window-toggle-side-windows))
- (unwind-protect
- (progn ,@body)
- (when ,sides
- (window-toggle-side-windows))))))
-
-(defun evil-resize-window (new-size &optional horizontal)
- "Set the current window's width or height to NEW-SIZE.
-If HORIZONTAL is non-nil the width of the window is changed,
-otherwise its height is changed."
- (let ((count (- new-size (if horizontal (window-width) (window-height)))))
- (enlarge-window count horizontal)))
-
-(defun evil-move-window (side)
- "Move the `selected-window' to SIDE.
-The state of the `selected-window' is saved along with the state
-of the window tree consisting of all the other windows. Then, all
-windows are deleted, the remaining window is split according to
-SIDE, the state of the window at SIDE is replaced with the saved
-state of the `selected-window', and, finally, the state of the
-saved window tree is reconstructed on the opposite side.
-
-SIDE has the same meaning as in `split-window'.
-
-Note, this function only operates on the window tree rooted in
-the frame's main window and effectively preserves any side
-windows \(i.e. windows with a valid window-side window
-parameter\)."
- (evil-save-side-windows
- (unless (one-window-p)
- (save-excursion
- (let ((w (window-state-get (selected-window))))
- (delete-window)
- (let ((wtree (window-state-get)))
- (delete-other-windows)
- (let ((subwin (selected-window))
- ;; NOTE: SIDE is new in Emacs 24
- (newwin (split-window nil nil side)))
- (window-state-put wtree subwin)
- (window-state-put w newwin)
- (select-window newwin)))))
- (balance-windows))))
-
-(defun evil-alternate-buffer (&optional window)
- "Return the last buffer WINDOW has displayed other than the
-current one (equivalent to Vim's alternate buffer).
-
-Returns the first item in `window-prev-buffers' that isn't
-`window-buffer' of WINDOW."
- ;; If the last buffer visited has been killed, then `window-prev-buffers'
- ;; returns a list with `current-buffer' at the head, we account for this
- ;; possibility.
- (let* ((prev-buffers (window-prev-buffers))
- (head (car prev-buffers)))
- (if (eq (car head) (window-buffer window))
- (cadr prev-buffers)
- head)))
-
-(evil-define-command evil-switch-to-windows-last-buffer ()
- "Switch to current windows last open buffer."
- :repeat nil
- (let ((previous-place (evil-alternate-buffer)))
- (when previous-place
- (switch-to-buffer (car previous-place))
- (goto-char (car (last previous-place))))))
-
-(evil-define-command evil-window-delete ()
- "Deletes the current window.
-If `evil-auto-balance-windows' is non-nil then all children of
-the deleted window's parent window are rebalanced."
- (let ((p (window-parent)))
- (delete-window)
- (when evil-auto-balance-windows
- ;; balance-windows raises an error if the parent does not have
- ;; any further children (then rebalancing is not necessary anyway)
- (condition-case nil
- (balance-windows p)
- (error)))))
-
-(evil-define-command evil-window-split (&optional count file)
- "Splits the current window horizontally, COUNT lines height,
-editing a certain FILE. The new window will be created below
-when `evil-split-window-below' is non-nil. If COUNT and
-`evil-auto-balance-windows' are both non-nil then all children
-of the parent of the splitted window are rebalanced."
- :repeat nil
- (interactive "P<f>")
- (split-window (selected-window) count
- (if evil-split-window-below 'above 'below))
- (when (and (not count) evil-auto-balance-windows)
- (balance-windows (window-parent)))
- (when file
- (evil-edit file)))
-
-(evil-define-command evil-window-vsplit (&optional count file)
- "Splits the current window vertically, COUNT columns width,
-editing a certain FILE. The new window will be created to the
-right when `evil-vsplit-window-right' is non-nil. If COUNT and
-`evil-auto-balance-windows'are both non-nil then all children
-of the parent of the splitted window are rebalanced."
- :repeat nil
- (interactive "P<f>")
- (split-window (selected-window) count
- (if evil-vsplit-window-right 'left 'right))
- (when (and (not count) evil-auto-balance-windows)
- (balance-windows (window-parent)))
- (when file
- (evil-edit file)))
-
-(evil-define-command evil-split-buffer (buffer)
- "Splits window and switches to another buffer."
- :repeat nil
- (interactive "<b>")
- (evil-window-split)
- (evil-buffer buffer))
-
-(evil-define-command evil-split-next-buffer (&optional count)
- "Splits the window and goes to the COUNT-th next buffer in the buffer list."
- :repeat nil
- (interactive "p")
- (evil-window-split)
- (evil-next-buffer count))
-
-(evil-define-command evil-split-prev-buffer (&optional count)
- "Splits window and goes to the COUNT-th prev buffer in the buffer list."
- :repeat nil
- (interactive "p")
- (evil-window-split)
- (evil-prev-buffer count))
-
-(evil-define-command evil-window-left (count)
- "Move the cursor to new COUNT-th window left of the current one."
- :repeat nil
- (interactive "p")
- (dotimes (_ count)
- (windmove-left)))
-
-(evil-define-command evil-window-right (count)
- "Move the cursor to new COUNT-th window right of the current one."
- :repeat nil
- (interactive "p")
- (dotimes (_ count)
- (windmove-right)))
-
-(evil-define-command evil-window-up (count)
- "Move the cursor to new COUNT-th window above the current one."
- :repeat nil
- (interactive "p")
- (dotimes (_ (or count 1))
- (windmove-up)))
-
-(evil-define-command evil-window-down (count)
- "Move the cursor to new COUNT-th window below the current one."
- :repeat nil
- (interactive "p")
- (dotimes (_ (or count 1))
- (windmove-down)))
-
-(evil-define-command evil-window-bottom-right ()
- "Move the cursor to bottom-right window."
- :repeat nil
- (let ((last-sibling (frame-root-window)))
- (while (and last-sibling (not (window-live-p last-sibling)))
- (setq last-sibling (window-last-child last-sibling)))
- (when last-sibling
- (select-window last-sibling))))
-
-(evil-define-command evil-window-top-left ()
- "Move the cursor to top-left window."
- :repeat nil
- (let ((first-child (window-child (frame-root-window))))
- (while (and first-child (not (window-live-p first-child)))
- (setq first-child (window-child first-child)))
- (when first-child
- (select-window
- first-child))))
-
-(evil-define-command evil-window-mru ()
- "Move the cursor to the previous (last accessed) buffer in another window.
-More precisely, it selects the most recently used buffer that is
-shown in some other window, preferably of the current frame, and
-is different from the current one."
- :repeat nil
- (catch 'done
- (dolist (buf (buffer-list (selected-frame)))
- (let ((win (get-buffer-window buf)))
- (when (and (not (eq buf (current-buffer)))
- win
- (not (eq win (selected-window))))
- (select-window win)
- (throw 'done nil))))))
-
-(evil-define-command evil-window-next (count)
- "Move the cursor to the next window in the cyclic order.
-With COUNT go to the count-th window in the order starting from
-top-left."
- :repeat nil
- (interactive "<c>")
- (if (not count)
- (select-window (next-window))
- (evil-window-top-left)
- (other-window (1- count))))
-
-(evil-define-command evil-window-prev (count)
- "Move the cursor to the previous window in the cyclic order.
-With COUNT go to the count-th window in the order starting from
-top-left."
- :repeat nil
- (interactive "<c>")
- (if (not count)
- (select-window (previous-window))
- (evil-window-top-left)
- (other-window (1- count))))
-
-(evil-define-command evil-window-new (count file)
- "Splits the current window horizontally
-and opens a new buffer or edits a certain FILE."
- :repeat nil
- (interactive "P<f>")
- (let ((new-window (split-window (selected-window) count
- (if evil-split-window-below 'below 'above))))
- (when (and (not count) evil-auto-balance-windows)
- (balance-windows (window-parent)))
- (if file
- (evil-edit file)
- (let ((buffer (generate-new-buffer "*new*")))
- (set-window-buffer new-window buffer)
- (select-window new-window)
- (with-current-buffer buffer
- (funcall (default-value 'major-mode)))))))
-
-(evil-define-command evil-window-vnew (count file)
- "Splits the current window vertically
-and opens a new buffer name or edits a certain FILE."
- :repeat nil
- (interactive "P<f>")
- (let ((new-window (split-window (selected-window) count
- (if evil-vsplit-window-right 'right 'left))))
- (when (and (not count) evil-auto-balance-windows)
- (balance-windows (window-parent)))
- (if file
- (evil-edit file)
- (let ((buffer (generate-new-buffer "*new*")))
- (set-window-buffer new-window buffer)
- (select-window new-window)
- (with-current-buffer buffer
- (funcall (default-value 'major-mode)))))))
-
-(evil-define-command evil-buffer-new (count file)
- "Creates a new buffer replacing the current window, optionally
- editing a certain FILE"
- :repeat nil
- (interactive "P<f>")
- (if file
- (evil-edit file)
- (let ((buffer (generate-new-buffer "*new*")))
- (set-window-buffer nil buffer)
- (with-current-buffer buffer
- (funcall (default-value 'major-mode))))))
-
-(evil-define-command evil-window-increase-height (count)
- "Increase current window height by COUNT."
- :repeat nil
- (interactive "p")
- (evil-resize-window (+ (window-height) count)))
-
-(evil-define-command evil-window-decrease-height (count)
- "Decrease current window height by COUNT."
- :repeat nil
- (interactive "p")
- (evil-resize-window (- (window-height) count)))
-
-(evil-define-command evil-window-increase-width (count)
- "Increase current window width by COUNT."
- :repeat nil
- (interactive "p")
- (evil-resize-window (+ (window-width) count) t))
-
-(evil-define-command evil-window-decrease-width (count)
- "Decrease current window width by COUNT."
- :repeat nil
- (interactive "p")
- (evil-resize-window (- (window-width) count) t))
-
-(evil-define-command evil-window-set-height (count)
- "Sets the height of the current window to COUNT."
- :repeat nil
- (interactive "<c>")
- (evil-resize-window (or count (frame-height)) nil))
-
-(evil-define-command evil-window-set-width (count)
- "Sets the width of the current window to COUNT."
- :repeat nil
- (interactive "<c>")
- (evil-resize-window (or count (frame-width)) t))
-
-(evil-define-command evil-ex-resize (arg)
- "The ex :resize command.
-
-If ARG is a signed positive integer, increase the current window
-height by ARG.
-
-If ARG is a signed negative integer, decrease the current window
-height by ARG.
-
-If ARG is a positive integer without explicit sign, set the current
-window height to ARG.
-
-If ARG is empty, maximize the current window height."
- (interactive "<a>")
- (if (or (not arg) (= 0 (length arg)))
- (evil-window-set-height nil)
- (let ((n (string-to-number arg)))
- (if (> n 0)
- (if (= ?+ (aref arg 0))
- (evil-window-increase-height n)
- (evil-window-set-height n))
- (evil-window-decrease-height (- n))))))
-
-(evil-define-command evil-window-rotate-upwards ()
- "Rotates the windows according to the current cyclic ordering."
- :repeat nil
- (evil-save-side-windows
- (let ((wlist (window-list))
- (slist (mapcar #'window-state-get (window-list))))
- (setq slist (append (cdr slist) (list (car slist))))
- (while (and wlist slist)
- (window-state-put (car slist) (car wlist))
- (setq wlist (cdr wlist)
- slist (cdr slist)))
- (select-window (car (last (window-list)))))))
-
-(evil-define-command evil-window-rotate-downwards ()
- "Rotates the windows according to the current cyclic ordering."
- :repeat nil
- (evil-save-side-windows
- (let ((wlist (window-list))
- (slist (mapcar #'window-state-get (window-list))))
- (setq slist (append (last slist) slist))
- (while (and wlist slist)
- (window-state-put (car slist) (car wlist))
- (setq wlist (cdr wlist)
- slist (cdr slist)))
- (select-window (cadr (window-list))))))
-
-(evil-define-command evil-window-move-very-top ()
- "Closes the current window, splits the upper-left one horizontally
-and redisplays the current buffer there."
- :repeat nil
- (evil-move-window 'above))
-
-(evil-define-command evil-window-move-far-left ()
- "Closes the current window, splits the upper-left one vertically
-and redisplays the current buffer there."
- :repeat nil
- (evil-move-window 'left))
-
-(evil-define-command evil-window-move-far-right ()
- "Closes the current window, splits the lower-right one vertically
-and redisplays the current buffer there."
- :repeat nil
- (evil-move-window 'right))
-
-(evil-define-command evil-window-move-very-bottom ()
- "Closes the current window, splits the lower-right one horizontally
-and redisplays the current buffer there."
- :repeat nil
- (evil-move-window 'below))
-
-;;; Mouse handling
-
-;; Large parts of this code are taken from mouse.el which is
-;; distributed with GNU Emacs
-(defun evil-mouse-drag-region (start-event)
- "Set the region to the text that the mouse is dragged over.
-Highlight the drag area as you move the mouse.
-This must be bound to a button-down mouse event.
-
-If the click is in the echo area, display the `*Messages*' buffer.
-
-START-EVENT should be the event that started the drag."
- (interactive "e")
- ;; Give temporary modes such as isearch a chance to turn off.
- (run-hooks 'mouse-leave-buffer-hook)
- (evil-mouse-drag-track start-event t))
-(evil-set-command-property 'evil-mouse-drag-region :keep-visual t)
-
-(defun evil-mouse-drag-track (start-event &optional
- do-mouse-drag-region-post-process)
- "Track mouse drags by highlighting area between point and cursor.
-The region will be defined with mark and point.
-DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
-`mouse-drag-region'."
- (mouse-minibuffer-check start-event)
- (setq mouse-selection-click-count-buffer (current-buffer))
- (deactivate-mark)
- (let* ((scroll-margin 0) ; Avoid margin scrolling (Bug#9541).
- (original-window (selected-window))
- ;; We've recorded what we needed from the current buffer and
- ;; window, now let's jump to the place of the event, where things
- ;; are happening.
- (_ (mouse-set-point start-event))
- (echo-keystrokes 0)
- (start-posn (event-start start-event))
- (start-point (posn-point start-posn))
- (start-window (posn-window start-posn))
- (start-window-start (window-start start-window))
- (start-hscroll (window-hscroll start-window))
- (bounds (window-edges start-window))
- (make-cursor-line-fully-visible nil)
- (top (nth 1 bounds))
- (bottom (if (or (window-minibuffer-p start-window)
- (not mode-line-format))
- (nth 3 bounds)
- ;; Don't count the mode line.
- (1- (nth 3 bounds))))
- (on-link (and mouse-1-click-follows-link
- (or mouse-1-click-in-non-selected-windows
- (eq start-window original-window))
- ;; Use start-point before the intangibility
- ;; treatment, in case we click on a link inside an
- ;; intangible text.
- (mouse-on-link-p start-posn)))
- (click-count (1- (event-click-count start-event)))
- (remap-double-click (and on-link
- (eq mouse-1-click-follows-link 'double)
- (= click-count 1)))
- ;; Suppress automatic hscrolling, because that is a nuisance
- ;; when setting point near the right fringe (but see below).
- (auto-hscroll-mode-saved auto-hscroll-mode)
- (auto-hscroll-mode nil)
- event end end-point)
-
- (setq mouse-selection-click-count click-count)
- ;; In case the down click is in the middle of some intangible text,
- ;; use the end of that text, and put it in START-POINT.
- (if (< (point) start-point)
- (goto-char start-point))
- (setq start-point (point))
- (if remap-double-click
- (setq click-count 0))
-
- (setq click-count (mod click-count 4))
-
- ;; activate correct visual state
- (let ((range (evil-mouse-start-end start-point start-point click-count)))
- (set-mark (nth 0 range))
- (goto-char (nth 1 range)))
-
- (cond
- ((= click-count 0)
- (when (evil-visual-state-p) (evil-exit-visual-state)))
- ((= click-count 1)
- (evil-visual-char)
- (evil-visual-post-command))
- ((= click-count 2)
- (evil-visual-line)
- (evil-visual-post-command))
- ((= click-count 3)
- (evil-visual-block)
- (evil-visual-post-command)))
-
- ;; Track the mouse until we get a non-movement event.
- (track-mouse
- (while (progn
- (setq event (read-key))
- (or (mouse-movement-p event)
- (memq (car-safe event) '(switch-frame select-window))))
- (unless (evil-visual-state-p)
- (cond
- ((= click-count 0) (evil-visual-char))
- ((= click-count 1) (evil-visual-char))
- ((= click-count 2) (evil-visual-line))
- ((= click-count 3) (evil-visual-block))))
-
- (evil-visual-pre-command)
- (unless (memq (car-safe event) '(switch-frame select-window))
- ;; Automatic hscrolling did not occur during the call to
- ;; `read-event'; but if the user subsequently drags the
- ;; mouse, go ahead and hscroll.
- (let ((auto-hscroll-mode auto-hscroll-mode-saved))
- (redisplay))
- (setq end (event-end event)
- end-point (posn-point end))
- (if (and (eq (posn-window end) start-window)
- (integer-or-marker-p end-point))
- (evil-mouse--drag-set-mark-and-point start-point
- end-point click-count)
- (let ((mouse-row (cdr (cdr (mouse-position)))))
- (cond
- ((null mouse-row))
- ((< mouse-row top)
- (mouse-scroll-subr start-window (- mouse-row top)
- nil start-point))
- ((>= mouse-row bottom)
- (mouse-scroll-subr start-window (1+ (- mouse-row bottom))
- nil start-point))))))
- (evil-visual-post-command)))
-
- ;; Handle the terminating event if possible.
- (when (consp event)
- ;; Ensure that point is on the end of the last event.
- (when (and (setq end-point (posn-point (event-end event)))
- (eq (posn-window end) start-window)
- (integer-or-marker-p end-point)
- (/= start-point end-point))
- (evil-mouse--drag-set-mark-and-point start-point
- end-point click-count))
-
- ;; Find its binding.
- (let* ((fun (key-binding (vector (car event))))
- (do-multi-click (and (> (event-click-count event) 0)
- (functionp fun)
- (not (memq fun '(mouse-set-point
- mouse-set-region))))))
- (if (and (or (/= (mark) (point))
- (= click-count 1) ; word selection
- (and (memq (evil-visual-type) '(line block))))
- (not do-multi-click))
-
- ;; If point has moved, finish the drag.
- (let (last-command this-command)
- (and mouse-drag-copy-region
- do-mouse-drag-region-post-process
- (let (deactivate-mark)
- (evil-visual-expand-region)
- (copy-region-as-kill (mark) (point))
- (evil-visual-contract-region))))
-
- ;; If point hasn't moved, run the binding of the
- ;; terminating up-event.
- (if do-multi-click
- (goto-char start-point)
- (deactivate-mark))
- (when (and (functionp fun)
- (= start-hscroll (window-hscroll start-window))
- ;; Don't run the up-event handler if the window
- ;; start changed in a redisplay after the
- ;; mouse-set-point for the down-mouse event at
- ;; the beginning of this function. When the
- ;; window start has changed, the up-mouse event
- ;; contains a different position due to the new
- ;; window contents, and point is set again.
- (or end-point
- (= (window-start start-window)
- start-window-start)))
- (when (and on-link
- (= start-point (point))
- (evil-mouse--remap-link-click-p start-event event))
- ;; If we rebind to mouse-2, reselect previous selected
- ;; window, so that the mouse-2 event runs in the same
- ;; situation as if user had clicked it directly. Fixes
- ;; the bug reported by juri@jurta.org on 2005-12-27.
- (if (or (vectorp on-link) (stringp on-link))
- (setq event (aref on-link 0))
- (select-window original-window)
- (setcar event 'mouse-2)
- ;; If this mouse click has never been done by the
- ;; user, it doesn't have the necessary property to be
- ;; interpreted correctly.
- (put 'mouse-2 'event-kind 'mouse-click)))
- (push event unread-command-events)))))))
-
-;; This function is a plain copy of `mouse--drag-set-mark-and-point',
-;; which is only available in Emacs 24
-(defun evil-mouse--drag-set-mark-and-point (start click click-count)
- (let* ((range (evil-mouse-start-end start click click-count))
- (beg (nth 0 range))
- (end (nth 1 range)))
- (cond ((eq (mark) beg)
- (goto-char end))
- ((eq (mark) end)
- (goto-char beg))
- ((< click (mark))
- (set-mark end)
- (goto-char beg))
- (t
- (set-mark beg)
- (goto-char end)))))
-
-;; This function is a plain copy of `mouse--remap-link-click-p',
-;; which is only available in Emacs 23
-(defun evil-mouse--remap-link-click-p (start-event end-event)
- (or (and (eq mouse-1-click-follows-link 'double)
- (= (event-click-count start-event) 2))
- (and
- (not (eq mouse-1-click-follows-link 'double))
- (= (event-click-count start-event) 1)
- (= (event-click-count end-event) 1)
- (or (not (integerp mouse-1-click-follows-link))
- (let ((t0 (posn-timestamp (event-start start-event)))
- (t1 (posn-timestamp (event-end end-event))))
- (and (integerp t0) (integerp t1)
- (if (> mouse-1-click-follows-link 0)
- (<= (- t1 t0) mouse-1-click-follows-link)
- (< (- t0 t1) mouse-1-click-follows-link))))))))
-
-(defun evil-mouse-start-end (start end mode)
- "Return a list of region bounds based on START and END according to MODE.
-If MODE is not 1 then set point to (min START END), mark to (max
-START END). If MODE is 1 then set point to start of word at (min
-START END), mark to end of word at (max START END)."
- (evil-sort start end)
- (setq mode (mod mode 4))
- (if (/= mode 1) (list start end)
- (list
- (save-excursion
- (goto-char (min (point-max) (1+ start)))
- (if (zerop (forward-thing evil-mouse-word -1))
- (let ((bpnt (point)))
- (forward-thing evil-mouse-word +1)
- (if (> (point) start) bpnt (point)))
- (point-min)))
- (save-excursion
- (goto-char end)
- (1-
- (if (zerop (forward-thing evil-mouse-word +1))
- (let ((epnt (point)))
- (forward-thing evil-mouse-word -1)
- (if (<= (point) end) epnt (point)))
- (point-max)))))))
-
-;;; State switching
-
-(evil-define-command evil-exit-emacs-state (&optional buffer message)
- "Exit Emacs state.
-Changes the state to the previous state, or to Normal state
-if the previous state was Emacs state."
- :keep-visual t
- :suppress-operator t
- (interactive '(nil t))
- (with-current-buffer (or buffer (current-buffer))
- (when (evil-emacs-state-p)
- (evil-change-to-previous-state buffer message)
- (when (evil-emacs-state-p)
- (evil-normal-state (and message 1))))))
-
-(defun evil-execute-in-normal-state ()
- "Execute the next command in Normal state."
- (interactive)
- (evil-delay '(not (memq this-command
- '(evil-execute-in-normal-state
- evil-use-register
- digit-argument
- negative-argument
- universal-argument
- universal-argument-minus
- universal-argument-more
- universal-argument-other-key)))
- `(progn
- (with-current-buffer ,(current-buffer)
- (evil-change-state ',evil-state)
- (setq evil-move-cursor-back ',evil-move-cursor-back)))
- 'post-command-hook)
- (setq evil-move-cursor-back nil)
- (evil-normal-state)
- (evil-echo "Switched to Normal state for the next command ..."))
-
-(defun evil-stop-execute-in-emacs-state ()
- (when (and (not (eq this-command #'evil-execute-in-emacs-state))
- (not (minibufferp)))
- (remove-hook 'post-command-hook 'evil-stop-execute-in-emacs-state)
- (when (buffer-live-p evil-execute-in-emacs-state-buffer)
- (with-current-buffer evil-execute-in-emacs-state-buffer
- (if (and (eq evil-previous-state 'visual)
- (not (use-region-p)))
- (progn
- (evil-change-to-previous-state)
- (evil-exit-visual-state))
- (evil-change-to-previous-state))))
- (setq evil-execute-in-emacs-state-buffer nil)))
-
-(evil-define-command evil-execute-in-emacs-state ()
- "Execute the next command in Emacs state."
- (add-hook 'post-command-hook #'evil-stop-execute-in-emacs-state t)
- (setq evil-execute-in-emacs-state-buffer (current-buffer))
- (cond
- ((evil-visual-state-p)
- (let ((mrk (mark))
- (pnt (point)))
- (evil-emacs-state)
- (set-mark mrk)
- (goto-char pnt)))
- (t
- (evil-emacs-state)))
- (evil-echo "Switched to Emacs state for the next command ..."))
-
-(defun evil-exit-visual-and-repeat (event)
- "Exit insert state and repeat event.
-This special command should be used if some command called from
-visual state should actually be called in normal-state. The main
-reason for doing this is that the repeat system should *not*
-record the visual state information for some command. This
-command should be bound to exactly the same event in visual state
-as the original command is bound in normal state. EVENT is the
-event that triggered the execution of this command."
- (interactive "e")
- (when (evil-visual-state-p)
- (evil-exit-visual-state)
- (push event unread-command-events)))
-(evil-declare-ignore-repeat 'evil-exit-visual-and-repeat)
-
-(provide 'evil-commands)
-
-;;; evil-commands.el ends here
diff --git a/elpa/evil-20200718.842/evil-common.el b/elpa/evil-20200718.842/evil-common.el
deleted file mode 100644
index 7afa99d..0000000
--- a/elpa/evil-20200718.842/evil-common.el
+++ /dev/null
@@ -1,3952 +0,0 @@
-;;; evil-common.el --- Common functions and utilities -*- lexical-binding: t -*-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-vars)
-(require 'evil-digraphs)
-(require 'rect)
-(require 'thingatpt)
-(require 'cl-lib)
-
-;;; Code:
-
-(declare-function evil-visual-state-p "evil-states")
-(declare-function evil-visual-restore "evil-states")
-(declare-function evil-motion-state "evil-states")
-(declare-function evil-ex-p "evil-ex")
-(declare-function evil-set-jump "evil-jumps")
-
-(condition-case nil
- (require 'windmove)
- (error
- (message "evil: Could not load `windmove', \
-window commands not available.")
- nil))
-
-;;; Compatibility with different Emacs versions
-
-;; x-set-selection and x-get-selection have been deprecated since 25.1
-;; by gui-set-selection and gui-get-selection
-(defalias 'evil-get-selection
- (if (fboundp 'gui-get-selection) 'gui-get-selection 'x-get-selection))
-(defalias 'evil-set-selection
- (if (fboundp 'gui-set-selection) 'gui-set-selection 'x-set-selection))
-
-(defmacro evil-called-interactively-p ()
- "Wrapper for `called-interactively-p'.
-In older versions of Emacs, `called-interactively-p' takes
-no arguments. In Emacs 23.2 and newer, it takes one argument."
- (called-interactively-p 'any))
-(make-obsolete 'evil-called-interactively-p
- "please use (called-interactively-p 'any) instead."
- "Git commit 222b791")
-
-;; macro helper
-(eval-and-compile
- (defun evil-unquote (exp)
- "Return EXP unquoted."
- (while (eq (car-safe exp) 'quote)
- (setq exp (cadr exp)))
- exp))
-
-(defun evil-delay (condition form hook &optional append local name)
- "Execute FORM when CONDITION becomes true, checking with HOOK.
-NAME specifies the name of the entry added to HOOK. If APPEND is
-non-nil, the entry is appended to the hook. If LOCAL is non-nil,
-the buffer-local value of HOOK is modified."
- (if (and (not (booleanp condition)) (eval condition))
- (eval form)
- (let* ((name (or name (format "evil-delay-form-in-%s" hook)))
- (fun (make-symbol name))
- (condition (or condition t)))
- (fset fun `(lambda (&rest args)
- (when ,condition
- (remove-hook ',hook #',fun ',local)
- ,form)))
- (put fun 'permanent-local-hook t)
- (add-hook hook fun append local))))
-(put 'evil-delay 'lisp-indent-function 2)
-
-;;; List functions
-
-(defmacro evil--add-to-alist (list-var &rest elements)
- "Add the assocation of KEY and VAL to the value of LIST-VAR.
-If the list already contains an entry for KEY, update that entry;
-otherwise add at the end of the list.
-
-\(fn LIST-VAR KEY VAL &rest ELEMENTS)"
- (when (eq (car-safe list-var) 'quote)
- (setq list-var (cadr list-var)))
- `(progn
- ,@(if (version< emacs-version "26")
- ;; TODO: Remove this path when support for Emacs 25 is dropped
- (cl-loop for (key val) on elements by #'cddr
- collect `(let* ((key ,key)
- (val ,val)
- (cell (assoc key ,list-var)))
- (if cell
- (setcdr cell val)
- (push (cons key val) ,list-var))))
- (cl-loop for (key val) on elements by #'cddr
- collect `(setf (alist-get ,key ,list-var nil nil #'equal) ,val)))
- ,list-var))
-
-(defun evil-add-to-alist (list-var key val &rest elements)
- "Add the assocation of KEY and VAL to the value of LIST-VAR.
-If the list already contains an entry for KEY, update that entry;
-otherwise add at the end of the list."
- (let ((tail (symbol-value list-var)))
- (while (and tail (not (equal (car-safe (car-safe tail)) key)))
- (setq tail (cdr tail)))
- (if tail
- (setcar tail (cons key val))
- (set list-var (append (symbol-value list-var)
- (list (cons key val)))))
- (if elements
- (apply #'evil-add-to-alist list-var elements)
- (symbol-value list-var))))
-
-(make-obsolete 'evil-add-to-alist
- "use `evil--add-to-alist' instead. You may need to recompile code with evil macros."
- "1.13.1")
-
-;; custom version of `delete-if'
-(defun evil-filter-list (predicate list &optional pointer)
- "Delete by side-effect all items satisfying PREDICATE in LIST.
-Stop when reaching POINTER. If the first item satisfies PREDICATE,
-there is no way to remove it by side-effect; therefore, write
-\(setq foo (evil-filter-list 'predicate foo)) to be sure of
-changing the value of `foo'."
- (let ((tail list) elt head)
- (while (and tail (not (eq tail pointer)))
- (setq elt (car tail))
- (cond
- ((funcall predicate elt)
- (setq tail (cdr tail))
- (if head
- (setcdr head tail)
- (setq list tail)))
- (t
- (setq head tail
- tail (cdr tail)))))
- list))
-
-(defun evil-member-if (predicate list &optional pointer)
- "Find the first item satisfying PREDICATE in LIST.
-Stop when reaching POINTER, which should point at a link
-in the list."
- (let (elt)
- (catch 'done
- (while (and (consp list) (not (eq list pointer)))
- (setq elt (car list))
- (if (funcall predicate elt)
- (throw 'done elt)
- (setq list (cdr list)))))))
-
-(defun evil-member-recursive-if (predicate tree)
- "Find the first item satisfying PREDICATE in TREE."
- (cond
- ((funcall predicate tree)
- tree)
- ((listp tree)
- (catch 'done
- (dolist (elt tree)
- (when (setq elt (evil-member-recursive-if predicate elt))
- (throw 'done elt)))))))
-
-(defun evil-concat-lists (&rest sequences)
- "Concatenate lists, removing duplicates.
-Elements are compared with `eq'."
- (let (result)
- (dolist (sequence sequences)
- (dolist (elt sequence)
- (push elt result)))
- (nreverse (cl-remove-duplicates result :test #'eq))))
-
-(defun evil-concat-alists (&rest sequences)
- "Concatenate association lists, removing duplicates.
-An alist is a list of cons cells (KEY . VALUE) where each key
-may occur only once. Later values overwrite earlier values."
- (let (result)
- (dolist (sequence sequences)
- (dolist (elt sequence)
- (setq result (assq-delete-all (car-safe elt) result))
- (push elt result)))
- (nreverse result)))
-
-(defun evil-concat-plists (&rest sequences)
- "Concatenate property lists, removing duplicates.
-A property list is a list (:KEYWORD1 VALUE1 :KEYWORD2 VALUE2...)
-where each keyword may occur only once. Later values overwrite
-earlier values."
- (let (result)
- (dolist (sequence sequences result)
- (while sequence
- (setq result
- (plist-put result (pop sequence) (pop sequence)))))))
-
-(defun evil-concat-keymap-alists (&rest sequences)
- "Concatenate keymap association lists, removing duplicates.
-A keymap alist is a list of cons cells (VAR . MAP) where each keymap
-may occur only once, but where the variables may be repeated
-\(e.g., (VAR . MAP1) (VAR . MAP2) is allowed). The order matters,
-with the highest priority keymaps being listed first."
- (let (result)
- (dolist (sequence sequences)
- (dolist (elt sequence)
- (unless (rassq (cdr-safe elt) result)
- (push elt result))))
- (nreverse result)))
-
-(defun evil-plist-delete (prop plist)
- "Delete by side effect the property PROP from PLIST.
-If PROP is the first property in PLIST, there is no way
-to remove it by side-effect; therefore, write
-\(setq foo (evil-plist-delete :prop foo)) to be sure of
-changing the value of `foo'."
- (let ((tail plist) elt head)
- (while tail
- (setq elt (car tail))
- (cond
- ((eq elt prop)
- (setq tail (cdr (cdr tail)))
- (if head
- (setcdr (cdr head) tail)
- (setq plist tail)))
- (t
- (setq head tail
- tail (cdr (cdr tail))))))
- plist))
-
-(defun evil-get-property (alist key &optional prop)
- "Return property PROP for KEY in ALIST.
-ALIST is an association list with entries of the form
-\(KEY . PLIST), where PLIST is a property list.
-If PROP is nil, return all properties for KEY.
-If KEY is t, return an association list of keys
-and their PROP values."
- (cond
- ((null prop)
- (cdr (assq key alist)))
- ((eq key t)
- (let (result val)
- (dolist (entry alist result)
- (setq key (car entry)
- val (cdr entry))
- (when (plist-member val prop)
- (setq val (plist-get val prop))
- (push (cons key val) result)))))
- (t
- (plist-get (cdr (assq key alist)) prop))))
-
-(defun evil-put-property (alist-var key prop val &rest properties)
- "Set PROP to VAL for KEY in ALIST-VAR.
-ALIST-VAR points to an association list with entries of the form
-\(KEY . PLIST), where PLIST is a property list storing PROP and VAL."
- (set alist-var
- (let* ((alist (symbol-value alist-var))
- (plist (cdr (assq key alist))))
- (setq plist (plist-put plist prop val))
- (when properties
- (setq plist (evil-concat-plists plist properties)
- val (car (last properties))))
- (setq alist (assq-delete-all key alist))
- (push (cons key plist) alist)))
- val)
-
-(defun evil-state-property (state prop &optional value)
- "Return the value of property PROP for STATE.
-PROP is a keyword as used by `evil-define-state'.
-STATE is the state's symbolic name.
-If VALUE is non-nil and the value is a variable,
-return the value of that variable."
- (let ((val (evil-get-property evil-state-properties state prop)))
- (if (and value (symbolp val) (boundp val))
- (symbol-value val)
- val)))
-
-(defmacro evil-swap (this that &rest vars)
- "Swap the values of variables THIS and THAT.
-If three or more arguments are given, the values are rotated.
-E.g., (evil-swap A B C) sets A to B, B to C, and C to A."
- `(progn
- (setq ,this (prog1 ,that
- (setq ,that ,this)))
- ,@(when vars
- `((evil-swap ,that ,@vars)))))
-
-(defmacro evil-sort (min max &rest vars)
- "Place the smallest value in MIN and the largest in MAX.
-If three or more arguments are given, place the smallest
-value in the first argument and the largest in the last,
-sorting in between."
- (let ((sorted (make-symbol "sortvar")))
- `(let ((,sorted (sort (list ,min ,max ,@vars) '<)))
- (setq ,min (pop ,sorted)
- ,max (pop ,sorted)
- ,@(apply #'append
- (mapcar #'(lambda (var)
- (list var `(pop ,sorted)))
- vars))))))
-
-(defun evil-vector-to-string (vector)
- "Turns vector into a string, changing <escape> to '\\e'"
- (mapconcat (lambda (c)
- (if (equal c 'escape)
- "\e"
- (make-string 1 c)))
- vector
- ""))
-
-;;; Command properties
-
-(defmacro evil-define-command (command &rest body)
- "Define a command COMMAND.
-
-\(fn COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)"
- (declare (indent defun)
- (doc-string 3)
- (debug (&define name
- [&optional lambda-list]
- [&optional stringp]
- [&rest keywordp sexp]
- [&optional ("interactive" [&rest form])]
- def-body)))
- (let ((interactive '(interactive))
- arg args doc doc-form key keys)
- ;; collect arguments
- (when (listp (car-safe body))
- (setq args (pop body)))
- ;; collect docstring
- (when (> (length body) 1)
- (if (eq (car-safe (car-safe body)) 'format)
- (setq doc-form (pop body))
- (when (stringp (car-safe body))
- (setq doc (pop body)))))
- ;; collect keywords
- (setq keys (plist-put keys :repeat t))
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body))
- (unless nil ; TODO: add keyword check
- (setq keys (plist-put keys key arg))))
- ;; collect `interactive' form
- (when (and body (consp (car body))
- (eq (car (car body)) 'interactive))
- (let* ((iform (pop body))
- (result (apply #'evil-interactive-form (cdr iform)))
- (form (car result))
- (attrs (cdr result)))
- (setq interactive `(interactive ,form)
- keys (evil-concat-plists keys attrs))))
- `(progn
- ;; the compiler does not recognize `defun' inside `let'
- ,(when (and command body)
- `(defun ,command ,args
- ,@(when doc `(,doc))
- ,interactive
- (ignore ,@(cl-set-difference args '(&optional &rest)))
- ,@body))
- ,(when (and command doc-form)
- `(put ',command 'function-documentation ,doc-form))
- ;; set command properties for symbol or lambda function
- (let ((func ',(if (and (null command) body)
- `(lambda ,args
- ,interactive
- ,@body)
- command)))
- (apply #'evil-set-command-properties func ',keys)
- func))))
-
-;; If no Evil properties are defined for the command, several parts of
-;; Evil apply certain default rules; e.g., the repeat system decides
-;; whether the command is repeatable by monitoring buffer changes.
-(defun evil-has-command-property-p (command property)
- "Whether COMMAND has Evil PROPERTY.
-See also `evil-has-command-properties-p'."
- (plist-member (evil-get-command-properties command) property))
-
-(defun evil-has-command-properties-p (command)
- "Whether Evil properties are defined for COMMAND.
-See also `evil-has-command-property-p'."
- (and (evil-get-command-properties command) t))
-
-(defun evil-get-command-property (command property &optional default)
- "Return the value of Evil PROPERTY of COMMAND.
-If the command does not have the property, return DEFAULT.
-See also `evil-get-command-properties'."
- (if (evil-has-command-property-p command property)
- (evil-get-property evil-command-properties command property)
- default))
-
-(defun evil-get-command-properties (command)
- "Return all Evil properties of COMMAND.
-See also `evil-get-command-property'."
- (evil-get-property evil-command-properties command))
-
-(defun evil-set-command-property (command property value)
- "Set PROPERTY to VALUE for COMMAND.
-To set multiple properties at once, see
-`evil-set-command-properties' and `evil-add-command-properties'."
- (evil-put-property 'evil-command-properties command property value))
-(defalias 'evil-put-command-property 'evil-set-command-property)
-
-(defun evil-add-command-properties (command &rest properties)
- "Add PROPERTIES to COMMAND.
-PROPERTIES should be a property list.
-To replace all properties at once, use `evil-set-command-properties'."
- (apply #'evil-put-property
- 'evil-command-properties command properties))
-
-(defun evil-set-command-properties (command &rest properties)
- "Replace all of COMMAND's properties with PROPERTIES.
-PROPERTIES should be a property list.
-This erases all previous properties; to only add properties,
-use `evil-set-command-property'."
- (setq evil-command-properties
- (assq-delete-all command evil-command-properties))
- (when properties
- (apply #'evil-add-command-properties command properties)))
-
-(defun evil-remove-command-properties (command &rest properties)
- "Remove PROPERTIES from COMMAND.
-PROPERTIES should be a list of properties (:PROP1 :PROP2 ...).
-If PROPERTIES is the empty list, all properties are removed."
- (let (plist)
- (when properties
- (setq plist (evil-get-command-properties command))
- (dolist (property properties)
- (setq plist (evil-plist-delete property plist))))
- (apply #'evil-set-command-properties command plist)))
-
-(defun evil-yank-handler (&optional motion)
- "Return the yank handler for MOTION.
-MOTION defaults to the current motion."
- (setq motion (or motion evil-this-motion))
- (evil-get-command-property motion :yank-handler))
-
-(defun evil-declare-motion (command)
- "Declare COMMAND to be a movement function.
-This ensures that it behaves correctly in visual state."
- (evil-add-command-properties command :keep-visual t :repeat 'motion))
-
-(defun evil-declare-repeat (command)
- "Declare COMMAND to be repeatable."
- (evil-add-command-properties command :repeat t))
-
-(defun evil-declare-not-repeat (command)
- "Declare COMMAND to be nonrepeatable."
- (evil-add-command-properties command :repeat nil))
-
-(defun evil-declare-ignore-repeat (command)
- "Declare COMMAND to be nonrepeatable."
- (evil-add-command-properties command :repeat 'ignore))
-
-(defun evil-declare-change-repeat (command)
- "Declare COMMAND to be repeatable by buffer changes rather than
-keystrokes."
- (evil-add-command-properties command :repeat 'change))
-
-(defun evil-declare-insert-at-point-repeat (command)
- "Declare COMMAND to be repeatable by buffer changes."
- (evil-add-command-properties command :repeat 'insert-at-point))
-
-(defun evil-declare-abort-repeat (command)
- "Declare COMMAND to be nonrepeatable."
- (evil-add-command-properties command :repeat 'abort))
-
-(defun evil-delimited-arguments (string &optional num)
- "Parse STRING as a sequence of delimited arguments.
-Returns a list of NUM strings, or as many arguments as
-the string contains. The first non-blank character is
-taken to be the delimiter. If some arguments are missing
-from STRING, the resulting list is padded with nil values.
-Two delimiters following directly after each other gives
-an empty string."
- (save-match-data
- (let ((string (or string ""))
- (count (or num -1)) (idx 0)
- argument delim match result)
- (when (string-match "^[[:space:]]*\\([^[:space:]]\\)" string)
- (setq delim (match-string 1 string)
- argument (format "%s\\(\\(?:[\\].\\|[^%s]\\)*\\)"
- (regexp-quote delim)
- delim))
- (while (and (/= count 0) (string-match argument string idx))
- (setq match (match-string 1 string)
- idx (match-end 1)
- count (1- count))
- (when (= count 0)
- (unless (save-match-data
- (string-match
- (format "%s[[:space:]]*$" delim) string idx))
- (setq match (substring string (match-beginning 1)))))
- (unless (and (zerop (length match))
- (zerop (length (substring string idx))))
- (push match result))))
- (when (and num (< (length result) num))
- (dotimes (_ (- num (length result)))
- (push nil result)))
- (nreverse result))))
-
-(defun evil-concat-charsets (&rest sets)
- "Concatenate character sets.
-A character set is the part between [ and ] in a regular expression.
-If any character set is complemented, the result is also complemented."
- (let ((bracket "") (complement "") (hyphen "") result)
- (save-match-data
- (dolist (set sets)
- (when (string-match-p "^\\^" set)
- (setq set (substring set 1)
- complement "^"))
- (when (string-match-p "^]" set)
- (setq set (substring set 1)
- bracket "]"))
- (when (string-match-p "^-" set)
- (setq set (substring set 1)
- hyphen "-"))
- (setq result (concat result set)))
- (format "%s%s%s%s" complement bracket hyphen result))))
-
-;;; Key sequences
-
-(defun evil-keypress-parser (&optional input)
- "Read from keyboard or INPUT and build a command description.
-Returns (CMD COUNT), where COUNT is the numeric prefix argument.
-Both COUNT and CMD may be nil."
- (let (count negative)
- (when input (setq unread-command-events (append input unread-command-events)))
- (catch 'done
- (while t
- (let ((seq (read-key-sequence "")))
- (when seq
- (let ((cmd (key-binding seq)))
- (cond
- ((null cmd) (throw 'done (list nil nil)))
- ((arrayp cmd) ; keyboard macro, recursive call
- (let ((cmd (evil-keypress-parser cmd)))
- (throw 'done
- (list (car cmd)
- (if (or count (cadr cmd))
- (list (car cmd) (* (or count 1)
- (or (cadr cmd) 1))))))))
- ((or (eq cmd #'digit-argument)
- (and (eq cmd 'evil-digit-argument-or-evil-beginning-of-line)
- count))
- (let* ((event (aref seq (- (length seq) 1)))
- (char (or (when (characterp event) event)
- (when (symbolp event)
- (get event 'ascii-character))))
- (digit (if (or (characterp char) (integerp char))
- (- (logand char ?\177) ?0))))
- (setq count (+ (* 10 (or count 0)) digit))))
- ((eq cmd #'negative-argument)
- (setq negative (not negative)))
- (t
- (throw 'done (list cmd
- (and count
- (* count
- (if negative -1 1))))))))))))))
-
-(defun evil-read-key (&optional prompt)
- "Read a key from the keyboard.
-Translates it according to the input method."
- (let ((old-global-map (current-global-map))
- (new-global-map (make-sparse-keymap))
- (overriding-terminal-local-map nil)
- (overriding-local-map evil-read-key-map)
- seq char cmd)
- (unwind-protect
- (condition-case nil
- (progn
- (define-key new-global-map [menu-bar]
- (lookup-key global-map [menu-bar]))
- (define-key new-global-map [tab-bar]
- (lookup-key global-map [tab-bar]))
- (define-key new-global-map [tool-bar]
- (lookup-key global-map [tool-bar]))
- (setq new-global-map
- (append new-global-map
- (list (make-char-table 'display-table
- 'self-insert-command))))
- (use-global-map new-global-map)
- (setq seq (read-key-sequence prompt nil t)
- char (aref seq 0)
- cmd (key-binding seq))
- (while (arrayp cmd)
- (setq char (aref cmd 0)
- cmd (key-binding cmd)))
- (cond
- ((eq cmd 'self-insert-command)
- char)
- (cmd
- (call-interactively cmd))
- (t
- (user-error "No replacement character typed"))))
- (quit
- (when (fboundp 'evil-repeat-abort)
- (evil-repeat-abort))
- (signal 'quit nil)))
- (use-global-map old-global-map))))
-
-(defun evil-read-quoted-char ()
- "Command that calls `read-quoted-char'.
-This command can be used wherever `read-quoted-char' is required
-as a command. Its main use is in the `evil-read-key-map'."
- (interactive)
- (read-quoted-char))
-
-(defun evil-read-digraph-char (&optional hide-chars)
- "Read two keys from keyboard forming a digraph.
-This function creates an overlay at (point), hiding the next
-HIDE-CHARS characters. HIDE-CHARS defaults to 1."
- (interactive)
- (let (char1 char2 string overlay)
- (unwind-protect
- (progn
- (setq overlay (make-overlay (point)
- (min (point-max)
- (+ (or hide-chars 1)
- (point)))))
- (overlay-put overlay 'invisible t)
- ;; create overlay prompt
- (setq string "?")
- (put-text-property 0 1 'face 'minibuffer-prompt string)
- ;; put cursor at (i.e., right before) the prompt
- (put-text-property 0 1 'cursor t string)
- (overlay-put overlay 'after-string string)
- (setq char1 (read-key))
- (setq string (string char1))
- (put-text-property 0 1 'face 'minibuffer-prompt string)
- (put-text-property 0 1 'cursor t string)
- (overlay-put overlay 'after-string string)
- (setq char2 (read-key)))
- (delete-overlay overlay))
- (or (evil-digraph (list char1 char2))
- ;; use the last character if undefined
- char2)))
-
-(defun evil-read-motion (&optional motion count type modifier)
- "Read a MOTION, motion COUNT and motion TYPE from the keyboard.
-The type may be overridden with MODIFIER, which may be a type
-or a Visual selection as defined by `evil-define-visual-selection'.
-Return a list (MOTION COUNT [TYPE])."
- (let (command prefix)
- (setq evil-this-type-modified nil)
- (unless motion
- (while (progn
- (setq command (evil-keypress-parser)
- motion (pop command)
- prefix (pop command))
- (when prefix
- (if count
- (setq count (string-to-number
- (concat (number-to-string count)
- (number-to-string prefix))))
- (setq count prefix)))
- ;; if the command is a type modifier, read more
- (when (rassq motion evil-visual-alist)
- (setq modifier
- (or modifier
- (car (rassq motion evil-visual-alist))))))))
- (when modifier
- (setq type (or type (evil-type motion 'exclusive)))
- (cond
- ((eq modifier 'char)
- ;; TODO: this behavior could be less hard-coded
- (if (eq type 'exclusive)
- (setq type 'inclusive)
- (setq type 'exclusive)))
- (t
- (setq type modifier)))
- (setq evil-this-type-modified type))
- (list motion count type)))
-
-(defun evil-mouse-events-p (keys)
- "Returns non-nil iff KEYS contains a mouse event."
- (catch 'done
- (dotimes (i (length keys))
- (when (or (and (fboundp 'mouse-event-p)
- (mouse-event-p (aref keys i)))
- (mouse-movement-p (aref keys i)))
- (throw 'done t)))
- nil))
-
-(defun evil-extract-count (keys)
- "Splits the key-sequence KEYS into prefix-argument and the rest.
-Returns the list (PREFIX CMD SEQ REST), where PREFIX is the
-prefix count, CMD the command to be executed, SEQ the subsequence
-calling CMD, and REST is all remaining events in the
-key-sequence. PREFIX and REST may be nil if they do not exist.
-If a command is bound to some keyboard macro, it is expanded
-recursively."
- (catch 'done
- (let* ((len (length keys))
- (beg 0)
- (end 1)
- (found-prefix nil))
- (while (and (<= end len))
- (let ((cmd (key-binding (substring keys beg end))))
- (cond
- ((memq cmd '(undefined nil))
- (user-error "No command bound to %s" (substring keys beg end)))
- ((arrayp cmd) ; keyboard macro, replace command with macro
- (setq keys (vconcat (substring keys 0 beg)
- cmd
- (substring keys end))
- end (1+ beg)
- len (length keys)))
- ((functionp cmd)
- (if (or (memq cmd '(digit-argument negative-argument))
- (and found-prefix
- (evil-get-command-property
- cmd :digit-argument-redirection)))
- ;; skip those commands
- (setq found-prefix t ; found at least one prefix argument
- beg end
- end (1+ end))
- ;; a real command, finish
- (throw 'done
- (list (unless (zerop beg)
- (string-to-number
- (concat (substring keys 0 beg))))
- cmd
- (substring keys beg end)
- (when (< end len)
- (substring keys end))))))
- (t ; append a further event
- (setq end (1+ end))))))
- (user-error "Key sequence contains no complete binding"))))
-
-(defmacro evil-redirect-digit-argument (map keys target)
- "Bind a wrapper function calling TARGET or `digit-argument'.
-MAP is a keymap for binding KEYS to the wrapper for TARGET.
-The wrapper only calls `digit-argument' if a prefix-argument
-has already been started; otherwise TARGET is called."
- (let* ((target (eval target))
- (wrapper (intern (format "evil-digit-argument-or-%s"
- target))))
- `(progn
- (define-key ,map ,keys ',wrapper)
- (evil-define-command ,wrapper ()
- :digit-argument-redirection ,target
- :keep-visual t
- :repeat nil
- (interactive)
- (cond
- (current-prefix-arg
- (setq this-command #'digit-argument)
- (call-interactively #'digit-argument))
- (t
- (let ((target (or (command-remapping #',target)
- #',target)))
- (setq this-command target)
- (call-interactively target))))))))
-
-(defun evil-extract-append (file-or-append)
- "Return an (APPEND . FILENAME) pair based on FILE-OR-APPEND.
-FILE-OR-APPEND should either be a filename or a \">> FILE\"
-directive. APPEND will be t if FILE-OR-APPEND is an append
-directive and nil otherwise. FILENAME will be the extracted
-filename."
- (if (and (stringp file-or-append)
- (string-match "\\(>> *\\)" file-or-append))
- (cons t (substring file-or-append(match-end 1)))
- (cons nil file-or-append)))
-
-(defun evil-set-keymap-prompt (map prompt)
- "Set the prompt-string of MAP to PROMPT."
- (delq (keymap-prompt map) map)
- (when prompt
- (setcdr map (cons prompt (cdr map)))))
-
-(defun evil-lookup-key (map key)
- "Returns non-nil value if KEY is bound in MAP."
- (let ((definition (lookup-key map key)))
- (if (numberp definition) ; in-band error
- nil
- definition)))
-
-;;; Display
-
-(defun evil-set-cursor (specs)
- "Change the cursor's apperance according to SPECS.
-SPECS may be a cursor type as per `cursor-type', a color
-string as passed to `set-cursor-color', a zero-argument
-function for changing the cursor, or a list of the above."
- (unless (and (not (functionp specs))
- (listp specs)
- (null (cdr-safe (last specs))))
- (setq specs (list specs)))
- (dolist (spec specs)
- (cond
- ((functionp spec)
- (condition-case nil
- (funcall spec)
- (error nil)))
- ((stringp spec)
- (evil-set-cursor-color spec))
- (t
- (setq cursor-type spec)))))
-
-(defun evil-set-cursor-color (color)
- "Set the cursor color to COLOR."
- (unless (equal (frame-parameter nil 'cursor-color) color)
- ;; `set-cursor-color' forces a redisplay, so only
- ;; call it when the color actually changes
- (set-cursor-color color)))
-
-(defun evil-refresh-cursor (&optional state buffer)
- "Refresh the cursor for STATE in BUFFER.
-BUFFER defaults to the current buffer. If STATE is nil the
-cursor type is either `evil-force-cursor' or the current state."
- (when (and (boundp 'evil-local-mode) evil-local-mode)
- (let* ((state (or state evil-force-cursor evil-state 'normal))
- (default (or evil-default-cursor t))
- (cursor (evil-state-property state :cursor t))
- (color (or (and (stringp cursor) cursor)
- (and (listp cursor)
- (evil-member-if #'stringp cursor))
- (frame-parameter nil 'cursor-color))))
- (with-current-buffer (or buffer (current-buffer))
- ;; if both STATE and `evil-default-cursor'
- ;; specify a color, don't set it twice
- (when (and color (listp default))
- (setq default (evil-filter-list #'stringp default)))
- (evil-set-cursor default)
- (evil-set-cursor cursor)))))
-
-(defmacro evil-save-cursor (&rest body)
- "Save the current cursor; execute BODY; restore the cursor."
- (declare (indent defun)
- (debug t))
- `(let ((cursor cursor-type)
- (color (frame-parameter (selected-frame) 'cursor-color))
- (inhibit-quit t))
- (unwind-protect
- (progn ,@body)
- (evil-set-cursor cursor)
- (evil-set-cursor color))))
-
-(defun evil-echo (string &rest args)
- "Display an unlogged message in the echo area.
-That is, the message is not logged in the *Messages* buffer.
-\(To log the message, just use `message'.)"
- (unless evil-no-display
- (let (message-log-max)
- (apply #'message string args))))
-
-(defun evil-echo-area-save ()
- "Save the current echo area in `evil-echo-area-message'."
- (setq evil-echo-area-message (current-message)))
-
-(defun evil-echo-area-restore ()
- "Restore the echo area from `evil-echo-area-message'.
-Does not restore if `evil-write-echo-area' is non-nil."
- (unless evil-write-echo-area
- (if evil-echo-area-message
- (message "%s" evil-echo-area-message)
- (message nil)))
- (setq evil-echo-area-message nil
- evil-write-echo-area nil))
-
-;; toggleable version of `with-temp-message'
-(defmacro evil-save-echo-area (&rest body)
- "Save the echo area; execute BODY; restore the echo area.
-Intermittent messages are not logged in the *Messages* buffer."
- (declare (indent defun)
- (debug t))
- `(let ((inhibit-quit t)
- evil-echo-area-message
- evil-write-echo-area)
- (unwind-protect
- (progn
- (evil-echo-area-save)
- ,@body)
- (evil-echo-area-restore))))
-
-(defmacro evil-without-display (&rest body)
- "Execute BODY without Evil displays.
-Inhibits echo area messages, mode line updates and cursor changes."
- (declare (indent defun)
- (debug t))
- `(let ((evil-no-display t))
- ,@body))
-
-(defvar evil-cached-header-line-height nil
- "Cached height of the header line.
-Used for fallback implementation on older Emacsen.")
-
-(defun evil-header-line-height ()
- "Return the height of the header line.
-If there is no header line, return 0.
-Used as a fallback implementation of `window-header-line-height' on
-older Emacsen."
- (let ((posn (posn-at-x-y 0 0)))
- (or (when (eq (posn-area posn) 'header-line)
- (cdr (posn-object-width-height posn)))
- 0)))
-
-(defun evil-posn-x-y (position)
- "Return the x and y coordinates in POSITION.
-This function returns y offset from the top of the buffer area including
-the header line.
-
-On Emacs 24 and later versions, the y-offset returned by
-`posn-at-point' is relative to the text area excluding the header
-line, while y offset taken by `posn-at-x-y' is relative to the buffer
-area including the header line. This asymmetry is by design according
-to GNU Emacs team. This function fixes the asymmetry between them.
-
-Learned from mozc.el."
- (let ((xy (posn-x-y position)))
- (when header-line-format
- (setcdr xy (+ (cdr xy)
- (or (and (fboundp 'window-header-line-height)
- (window-header-line-height))
- evil-cached-header-line-height
- (setq evil-cached-header-line-height (evil-header-line-height))))))
- xy))
-
-(defun evil-count-lines (beg end)
- "Return absolute line-number-difference betweeen `beg` and `end`.
-This should give the same results no matter where on the line `beg`
-and `end` are."
- (if (= beg end)
- 0
- (let* ((last (max beg end))
- (end-at-bol (save-excursion (goto-char last)
- (bolp))))
- (if end-at-bol
- (count-lines beg end)
- (1- (count-lines beg end))))))
-
-;;; Movement
-
-(defun evil-normalize-position (pos)
- "Return POS if it does not exceed the buffer boundaries.
-If POS is less than `point-min', return `point-min'.
-Is POS is more than `point-max', return `point-max'.
-If POS is a marker, return its position."
- (cond
- ((not (number-or-marker-p pos))
- pos)
- ((< pos (point-min))
- (point-min))
- ((> pos (point-max))
- (point-max))
- ((markerp pos)
- (marker-position pos))
- (t
- pos)))
-
-(defmacro evil-save-goal-column (&rest body)
- "Restores the goal column after execution of BODY.
-See also `evil-save-column'."
- (declare (indent defun)
- (debug t))
- `(let ((goal-column goal-column)
- (temporary-goal-column temporary-goal-column))
- ,@body))
-
-(defmacro evil-save-column (&rest body)
- "Restores the column after execution of BODY.
-See also `evil-save-goal-column'."
- (declare (indent defun)
- (debug t))
- `(let ((col (current-column)))
- (evil-save-goal-column
- ,@body
- (move-to-column col))))
-
-(defun evil-narrow (beg end)
- "Restrict the buffer to BEG and END.
-BEG or END may be nil, specifying a one-sided restriction including
-`point-min' or `point-max'. See also `evil-with-restriction.'"
- (setq beg (or (evil-normalize-position beg) (point-min)))
- (setq end (or (evil-normalize-position end) (point-max)))
- (narrow-to-region beg end))
-
-(defmacro evil-with-restriction (beg end &rest body)
- "Execute BODY with the buffer narrowed to BEG and END.
-BEG or END may be nil as passed to `evil-narrow'; this creates
-a one-sided restriction."
- (declare (indent 2)
- (debug t))
- `(save-restriction
- (let ((evil-restriction-stack
- (cons (cons (point-min) (point-max)) evil-restriction-stack)))
- (evil-narrow ,beg ,end)
- ,@body)))
-
-(defmacro evil-without-restriction (&rest body)
- "Execute BODY with the top-most narrowing removed.
-This works only if the previous narrowing has been generated by
-`evil-with-restriction'."
- (declare (indent defun)
- (debug t))
- `(save-restriction
- (widen)
- (narrow-to-region (car (car evil-restriction-stack))
- (cdr (car evil-restriction-stack)))
- (let ((evil-restriction-stack (cdr evil-restriction-stack)))
- ,@body)))
-
-(defmacro evil-narrow-to-field (&rest body)
- "Narrow to the current field."
- (declare (indent defun)
- (debug t))
- `(evil-with-restriction (field-beginning) (field-end)
- ,@body))
-
-(defun evil-move-beginning-of-line (&optional arg)
- "Move to the beginning of the line as displayed.
-Like `move-beginning-of-line', but retains the goal column."
- (evil-save-goal-column
- (move-beginning-of-line arg)
- (beginning-of-line)))
-
-(defun evil-move-end-of-line (&optional arg)
- "Move to the end of the line as displayed.
-Like `move-end-of-line', but retains the goal column."
- (evil-save-goal-column
- (move-end-of-line arg)
- (end-of-line)))
-
-(defun evil-adjust-cursor (&optional _)
- "Move point one character back if at the end of a non-empty line.
-This behavior is controled by `evil-move-beyond-eol'."
- (when (and (eolp)
- (not evil-move-beyond-eol)
- (not (bolp))
- (= (point)
- (save-excursion
- (evil-move-end-of-line)
- (point))))
- (evil-move-cursor-back t)))
-
-(defun evil-move-cursor-back (&optional force)
- "Move point one character back within the current line.
-Contingent on the variable `evil-move-cursor-back' or the FORCE
-argument. Honors field boundaries, i.e., constrains the movement
-to the current field as recognized by `line-beginning-position'."
- (when (or evil-move-cursor-back force)
- (unless (or (= (point) (line-beginning-position))
- (and (boundp 'visual-line-mode)
- visual-line-mode
- (= (point) (save-excursion
- (beginning-of-visual-line)
- (point)))))
- (backward-char))))
-
-(defun evil-line-position (line &optional column)
- "Return the position of LINE.
-If COLUMN is specified, return its position on the line.
-A negative number means the end of the line."
- (save-excursion
- (when (fboundp 'evil-goto-line)
- (evil-goto-line line))
- (if (numberp column)
- (if (< column 0)
- (beginning-of-line 2)
- (move-to-column column))
- (beginning-of-line))
- (point)))
-
-(defun evil-column (&optional pos)
- "Return the horizontal position of POS.
-POS defaults to point."
- (save-excursion
- (when pos
- (goto-char pos))
- (current-column)))
-
-(defun evil-move-to-column (column &optional dir force)
- "Move point to column COLUMN in the current line.
-Places point at left of the tab character (at the right if DIR
-is non-nil) and returns point."
- (interactive "p")
- (move-to-column column force)
- (unless force
- (when (or (not dir) (and (numberp dir) (< dir 1)))
- (when (> (current-column) column)
- (evil-move-cursor-back))))
- (point))
-
-(defmacro evil-loop (spec &rest body)
- "Loop with countdown variable.
-Evaluate BODY with VAR counting down from COUNT to 0.
-COUNT can be negative, in which case VAR counts up instead.
-The return value is the value of VAR when the loop
-terminates, which is 0 if the loop completes successfully.
-RESULT specifies a variable for storing this value.
-
-\(fn (VAR COUNT [RESULT]) BODY...)"
- (declare (indent defun)
- (debug dolist))
- (let* ((i (make-symbol "loopvar"))
- (var (pop spec))
- (count (pop spec))
- (result (pop spec)))
- (setq var (or (unless (eq var result) var) i)
- result (or result var))
- `(let ((,var ,count))
- (setq ,result ,var)
- (while (/= ,var 0)
- ,@body
- (if (> ,var 0)
- (setq ,var (1- ,var))
- (setq ,var (1+ ,var)))
- (setq ,result ,var))
- ,var)))
-
-;;; Motions
-
-(defmacro evil-motion-loop (spec &rest body)
- "Loop a certain number of times.
-Evaluate BODY repeatedly COUNT times with VAR bound to 1 or -1,
-depending on the sign of COUNT. RESULT, if specified, holds
-the number of unsuccessful iterations, which is 0 if the loop
-completes successfully. This is also the return value.
-
-Each iteration must move point; if point does not change,
-the loop immediately quits. See also `evil-loop'.
-
-\(fn (VAR COUNT [RESULT]) BODY...)"
- (declare (indent defun)
- (debug ((symbolp form &optional symbolp) body)))
- (let* ((var (or (pop spec) (make-symbol "unitvar")))
- (countval (or (pop spec) 0))
- (result (pop spec))
- (i (make-symbol "loopvar"))
- (count (make-symbol "countvar"))
- (done (make-symbol "donevar"))
- (orig (make-symbol "origvar")))
- `(let* ((,count ,countval)
- (,var (if (< ,count 0) -1 1)))
- (catch ',done
- (evil-loop (,i ,count ,result)
- (let ((,orig (point)))
- ,@body
- (when (= (point) ,orig)
- (throw ',done ,i))))))))
-
-(defmacro evil-signal-without-movement (&rest body)
- "Catches errors provided point moves within this scope."
- (declare (indent defun)
- (debug t))
- `(let ((p (point)))
- (condition-case err
- (progn ,@body)
- (error
- (when (= p (point))
- (signal (car err) (cdr err)))))))
-
-(defun evil-signal-at-bob-or-eob (&optional count)
- "Signals error if `point' is at boundaries.
-If `point' is at bob and COUNT is negative this function signal
-'beginning-of-buffer. If `point' is at eob and COUNT is positive
-this function singal 'end-of-buffer. This function should be used
-in motions. COUNT defaults to 1."
- (setq count (or count 1))
- (cond
- ((< count 0) (evil-signal-at-bob))
- ((> count 0) (evil-signal-at-eob))))
-
-(defun evil-signal-at-bob ()
- "Signals 'beginning-of-buffer if `point' is at bob.
-This function should be used in backward motions. If `point' is at
-bob so that no further backward motion is possible the error
-'beginning-of-buffer is raised."
- (when (bobp) (signal 'beginning-of-buffer nil)))
-
-(defun evil-signal-at-eob ()
- "Signals 'end-of-buffer if `point' is at eob.
-This function should be used in forward motions. If `point' is close
-to eob so that no further forward motion is possible the error
-'end-of-buffer is raised. This is the case if `point' is at
-`point-max' or if is one position before `point-max',
-`evil-move-beyond-eol' is nil and `point' is not at the end
-of a line. The latter is necessary because `point' cannot be
-moved to `point-max' if `evil-move-beyond-eol' is nil and
-the last line in the buffer is not empty."
- (when (or (eobp)
- (and (not (eolp))
- (not evil-move-beyond-eol)
- (save-excursion (forward-char) (eobp))))
- (signal 'end-of-buffer nil)))
-
-(defmacro evil-with-hproject-point-on-window (&rest body)
- "Project point after BODY to current window.
-If point is on a position left or right of the current window
-then it is moved to the left and right boundary of the window,
-respectively. If `auto-hscroll-mode' is non-nil then the left and
-right positions are increased or decreased, respectively, by
-`horizontal-margin' so that no automatic scrolling occurs."
- (declare (indent defun)
- (debug t))
- (let ((diff (make-symbol "diff"))
- (left (make-symbol "left"))
- (right (make-symbol "right")))
- `(let ((,diff (if auto-hscroll-mode (1+ hscroll-margin) 0))
- auto-hscroll-mode)
- ,@body
- (let* ((,left (+ (window-hscroll) ,diff))
- (,right (+ (window-hscroll) (window-width) (- ,diff) -1)))
- (move-to-column (min (max (current-column) ,left) ,right))))))
-
-(defun evil-goto-min (&rest positions)
- "Go to the smallest position in POSITIONS.
-Non-numerical elements are ignored.
-See also `evil-goto-max'."
- (when (setq positions (evil-filter-list
- #'(lambda (elt)
- (not (number-or-marker-p elt)))
- positions))
- (goto-char (apply #'min positions))))
-
-(defun evil-goto-max (&rest positions)
- "Go to the largest position in POSITIONS.
-Non-numerical elements are ignored.
-See also `evil-goto-min'."
- (when (setq positions (evil-filter-list
- #'(lambda (elt)
- (not (number-or-marker-p elt)))
- positions))
- (goto-char (apply #'max positions))))
-
-(defun evil-forward-not-thing (thing &optional count)
- "Move point to the end or beginning of the complement of THING."
- (evil-motion-loop (dir (or count 1))
- (let (bnd)
- (cond
- ((> dir 0)
- (while (and (setq bnd (bounds-of-thing-at-point thing))
- (< (point) (cdr bnd)))
- (goto-char (cdr bnd)))
- ;; no thing at (point)
- (if (zerop (forward-thing thing))
- ;; now at the end of the next thing
- (let ((bnd (bounds-of-thing-at-point thing)))
- (if (or (< (car bnd) (point)) ; end of a thing
- (= (car bnd) (cdr bnd))) ; zero width thing
- (goto-char (car bnd))
- ;; beginning of yet another thing, go back
- (forward-thing thing -1)))
- (goto-char (point-max))))
- (t
- (while (and (not (bobp))
- (or (backward-char) t)
- (setq bnd (bounds-of-thing-at-point thing))
- (< (point) (cdr bnd)))
- (goto-char (car bnd)))
- ;; either bob or no thing at point
- (goto-char
- (if (and (not (bobp))
- (zerop (forward-thing thing -1))
- (setq bnd (bounds-of-thing-at-point thing)))
- (cdr bnd)
- (point-min))))))))
-
-(defun evil-bounds-of-not-thing-at-point (thing &optional which)
- "Returns the bounds of a complement of THING at point.
-If there is a THING at point nil is returned. Otherwise if WHICH
-is nil or 0 a cons cell (BEG . END) is returned. If WHICH is
-negative the beginning is returned. If WHICH is positive the END
-is returned."
- (let ((pnt (point)))
- (let ((beg (save-excursion
- (and (zerop (forward-thing thing -1))
- (forward-thing thing))
- (if (> (point) pnt) (point-min) (point))))
- (end (save-excursion
- (and (zerop (forward-thing thing))
- (forward-thing thing -1))
- (if (< (point) pnt) (point-max) (point)))))
- (when (and (<= beg (point)) (<= (point) end) (< beg end))
- (cond
- ((or (not which) (zerop which)) (cons beg end))
- ((< which 0) beg)
- ((> which 0) end))))))
-
-(defun evil-forward-nearest (count &rest forwards)
- "Moves point forward to the first of several motions.
-FORWARDS is a list of forward motion functions (i.e. each moves
-point forward to the next end of a text object (if passed a +1)
-or backward to the preceeding beginning of a text object (if
-passed a -1)). This function calls each of these functions once
-and moves point to the nearest of the resulting positions. If
-COUNT is positive point is moved forward COUNT times, if negative
-point is moved backward -COUNT times."
- (evil-motion-loop (dir (or count 1))
- (let ((pnt (point))
- (nxt (if (> dir 0) (point-max) (point-min))))
- (dolist (fwd forwards)
- (goto-char pnt)
- (condition-case nil
- (evil-with-restriction
- (and (< dir 0)
- (save-excursion
- (goto-char nxt)
- (line-beginning-position 0)))
- (and (> dir 0)
- (save-excursion
- (goto-char nxt)
- (line-end-position 2)))
- (if (and (zerop (funcall fwd dir))
- (/= (point) pnt)
- (or (and (> dir 0) (< (point) nxt))
- (and (< dir 0) (> (point) nxt))))
- (setq nxt (point))))
- (error)))
- (goto-char nxt))))
-
-(defun bounds-of-evil-string-at-point (&optional state)
- "Return the bounds of a string at point.
-If STATE is given it used a parsing state at point."
- (save-excursion
- (let ((state (or state (syntax-ppss))))
- (and (nth 3 state)
- (cons (nth 8 state)
- (and (parse-partial-sexp (point)
- (point-max)
- nil
- nil
- state
- 'syntax-table)
- (point)))))))
-(put 'evil-string 'bounds-of-thing-at-point #'bounds-of-evil-string-at-point)
-
-(defun bounds-of-evil-comment-at-point ()
- "Return the bounds of a string at point."
- (save-excursion
- (let ((state (syntax-ppss)))
- (and (nth 4 state)
- (cons (nth 8 state)
- (and (parse-partial-sexp (point)
- (point-max)
- nil
- nil
- state
- 'syntax-table)
- (point)))))))
-(put 'evil-comment 'bounds-of-thing-at-point #'bounds-of-evil-comment-at-point)
-
-;; The purpose of this function is the provide line motions which
-;; preserve the column. This is how `previous-line' and `next-line'
-;; work, but unfortunately the behaviour is hard-coded: if and only if
-;; the last command was `previous-line' or `next-line', the column is
-;; preserved. Furthermore, in contrast to Vim, when we cannot go
-;; further, those motions move point to the beginning resp. the end of
-;; the line (we never want point to leave its column). The code here
-;; comes from simple.el, and I hope it will work in future.
-(defun evil-line-move (count &optional noerror)
- "A wrapper for line motions which conserves the column.
-Signals an error at buffer boundaries unless NOERROR is non-nil."
- (cond
- (noerror
- (condition-case nil
- (evil-line-move count)
- (error nil)))
- (t
- (evil-signal-without-movement
- (setq this-command (if (>= count 0)
- #'next-line
- #'previous-line))
- (let ((opoint (point)))
- (condition-case err
- (with-no-warnings
- (funcall this-command (abs count)))
- ((beginning-of-buffer end-of-buffer)
- (let ((col (or goal-column
- (if (consp temporary-goal-column)
- (car temporary-goal-column)
- temporary-goal-column))))
- (if line-move-visual
- (vertical-motion (cons col 0))
- (line-move-finish col opoint (< count 0)))
- ;; Maybe we should just `ding'?
- (signal (car err) (cdr err))))))))))
-
-(defun evil-forward-syntax (syntax &optional count)
- "Move point to the end or beginning of a sequence of characters in
-SYNTAX.
-Stop on reaching a character not in SYNTAX."
- (let ((notsyntax (if (= (aref syntax 0) ?^)
- (substring syntax 1)
- (concat "^" syntax))))
- (evil-motion-loop (dir (or count 1))
- (cond
- ((< dir 0)
- (skip-syntax-backward notsyntax)
- (skip-syntax-backward syntax))
- (t
- (skip-syntax-forward notsyntax)
- (skip-syntax-forward syntax))))))
-
-(defun evil-forward-chars (chars &optional count)
- "Move point to the end or beginning of a sequence of CHARS.
-CHARS is a character set as inside [...] in a regular expression."
- (let ((notchars (if (= (aref chars 0) ?^)
- (substring chars 1)
- (concat "^" chars))))
- (evil-motion-loop (dir (or count 1))
- (cond
- ((< dir 0)
- (skip-chars-backward notchars)
- (skip-chars-backward chars))
- (t
- (skip-chars-forward notchars)
- (skip-chars-forward chars))))))
-
-(defun evil-up-block (beg end &optional count)
- "Move point to the end or beginning of text enclosed by BEG and END.
-BEG and END should be regular expressions matching the opening
-and closing delimiters, respectively. If COUNT is greater than
-zero point is moved forward otherwise it is moved
-backwards. Whenever an opening delimiter is found the COUNT is
-increased by one, if a closing delimiter is found the COUNT is
-decreased by one. The motion stops when COUNT reaches zero. The
-match-data reflects the last successful match (that caused COUNT
-to reach zero). The behaviour of this functions is similar to
-`up-list'."
- (let* ((count (or count 1))
- (forwardp (> count 0))
- (dir (if forwardp +1 -1)))
- (catch 'done
- (while (not (zerop count))
- (let* ((pnt (point))
- (cl (save-excursion
- (and (re-search-forward (if forwardp end beg) nil t dir)
- (or (/= pnt (point))
- (progn
- ;; zero size match, repeat search from
- ;; the next position
- (forward-char dir)
- (re-search-forward (if forwardp end beg) nil t dir)))
- (point))))
- (match (match-data t))
- (op (save-excursion
- (and (not (equal beg end))
- (re-search-forward (if forwardp beg end) cl t dir)
- (or (/= pnt (point))
- (progn
- ;; zero size match, repeat search from
- ;; the next position
- (forward-char dir)
- (re-search-forward (if forwardp beg end) cl t dir)))
- (point)))))
- (cond
- ((not cl)
- (goto-char (if forwardp (point-max) (point-min)))
- (set-match-data nil)
- (throw 'done count))
- (t
- (if op
- (progn
- (setq count (if forwardp (1+ count) (1- count)))
- (goto-char op))
- (setq count (if forwardp (1- count) (1+ count)))
- (if (zerop count) (set-match-data match))
- (goto-char cl))))))
- 0)))
-
-(defun evil-up-paren (open close &optional count)
- "Move point to the end or beginning of balanced parentheses.
-OPEN and CLOSE should be characters identifying the opening and
-closing parenthesis, respectively. If COUNT is greater than zero
-point is moved forward otherwise it is moved backwards. Whenever
-an opening delimiter is found the COUNT is increased by one, if a
-closing delimiter is found the COUNT is decreased by one. The
-motion stops when COUNT reaches zero. The match-data reflects the
-last successful match (that caused COUNT to reach zero)."
- ;; Always use the default `forward-sexp-function'. This is important
- ;; for modes that use a custom one like `python-mode'.
- ;; (addresses #364)
- (let (forward-sexp-function)
- (with-syntax-table (copy-syntax-table (syntax-table))
- (modify-syntax-entry open (format "(%c" close))
- (modify-syntax-entry close (format ")%c" open))
- (let ((rest (evil-motion-loop (dir count)
- (let ((pnt (point)))
- (condition-case nil
- (cond
- ((> dir 0)
- (while (progn
- (up-list dir)
- (/= (char-before) close))))
- (t
- (while (progn
- (up-list dir)
- (/= (char-after) open)))))
- (error (goto-char pnt)))))))
- (cond
- ((= rest count) (set-match-data nil))
- ((> count 0) (set-match-data (list (1- (point)) (point))))
- (t (set-match-data (list (point) (1+ (point))))))
- rest))))
-
-(defun evil-up-xml-tag (&optional count)
- "Move point to the end or beginning of balanced xml tags.
-OPEN and CLOSE should be characters identifying the opening and
-closing parenthesis, respectively. If COUNT is greater than zero
-point is moved forward otherwise it is moved backwards. Whenever
-an opening delimiter is found the COUNT is increased by one, if a
-closing delimiter is found the COUNT is decreased by one. The
-motion stops when COUNT reaches zero. The match-data reflects the
-last successful match (that caused COUNT to reach zero)."
- (let* ((dir (if (> (or count 1) 0) +1 -1))
- (count (abs (or count 1)))
- (op (if (> dir 0) 1 2))
- (cl (if (> dir 0) 2 1))
- (orig (point))
- pnt tags match)
- (catch 'done
- (while (> count 0)
- ;; find the previous opening tag
- (while
- (and (setq match
- (re-search-forward
- "<\\([^/ >]+\\)\\(?:[^\"/>]\\|\"[^\"]*\"\\)*?>\\|</\\([^>]+?\\)>"
- nil t dir))
- (cond
- ((match-beginning op)
- (push (match-string op) tags))
- ((null tags) nil) ; free closing tag
- ((and (< dir 0)
- (string= (car tags) (match-string cl)))
- ;; in backward direction we only accept matching
- ;; tags. If the current tag is a free opener
- ;; without matching closing tag, the subsequents
- ;; test will make us ignore this tag
- (pop tags))
- ((and (> dir 0))
- ;; non matching openers are considered free openers
- (while (and tags
- (not (string= (car tags)
- (match-string cl))))
- (pop tags))
- (pop tags)))))
- (unless (setq match (and match (match-data t)))
- (setq match nil)
- (throw 'done count))
- ;; found closing tag, look for corresponding opening tag
- (cond
- ((> dir 0)
- (setq pnt (match-end 0))
- (goto-char (match-beginning 0)))
- (t
- (setq pnt (match-beginning 0))
- (goto-char (match-end 0))))
- (let* ((tag (match-string cl))
- (refwd (concat "<\\(/\\)?"
- (regexp-quote tag)
- "\\(?:>\\| \\(?:[^\"/>]\\|\"[^\"]*\"\\)*?>\\)"))
- (cnt 1))
- (while (and (> cnt 0) (re-search-backward refwd nil t dir))
- (setq cnt (+ cnt (if (match-beginning 1) dir (- dir)))))
- (if (zerop cnt) (setq count (1- count) tags nil))
- (goto-char pnt)))
- (if (> count 0)
- (set-match-data nil)
- (set-match-data match)
- (goto-char (if (> dir 0) (match-end 0) (match-beginning 0)))))
- ;; if not found, set to point-max/point-min
- (unless (zerop count)
- (set-match-data nil)
- (goto-char (if (> dir 0) (point-max) (point-min)))
- (if (/= (point) orig) (setq count (1- count))))
- (* dir count)))
-
-(defun evil-forward-quote (quote &optional count)
- "Move point to the end or beginning of a string.
-QUOTE is the character delimiting the string. If COUNT is greater
-than zero point is moved forward otherwise it is moved
-backwards."
- (let (reset-parser)
- (with-syntax-table (copy-syntax-table (syntax-table))
- (unless (= (char-syntax quote) ?\")
- (modify-syntax-entry quote "\"")
- (setq reset-parser t))
- ;; global parser state is out of state, use local one
- (let* ((pnt (point))
- (state (save-excursion
- (beginning-of-defun)
- (parse-partial-sexp (point) pnt nil nil (syntax-ppss))))
- (bnd (bounds-of-evil-string-at-point state)))
- (when (and bnd (< (point) (cdr bnd)))
- ;; currently within a string
- (if (> count 0)
- (progn
- (goto-char (cdr bnd))
- (setq count (1- count)))
- (goto-char (car bnd))
- (setq count (1+ count))))
- ;; forward motions work with local parser state
- (cond
- ((> count 0)
- ;; no need to reset global parser state because we only use
- ;; the local one
- (setq reset-parser nil)
- (catch 'done
- (while (and (> count 0) (not (eobp)))
- (setq state (parse-partial-sexp (point) (point-max)
- nil
- nil
- state
- 'syntax-table))
- (cond
- ((nth 3 state)
- (setq bnd (bounds-of-thing-at-point 'evil-string))
- (goto-char (cdr bnd))
- (setq count (1- count)))
- ((eobp) (goto-char pnt) (throw 'done nil))))))
- ((< count 0)
- ;; need to update global cache because of backward motion
- (setq reset-parser (and reset-parser (point)))
- (save-excursion
- (beginning-of-defun)
- (syntax-ppss-flush-cache (point)))
- (catch 'done
- (while (and (< count 0) (not (bobp)))
- (setq pnt (point))
- (while (and (not (bobp))
- (or (eobp) (/= (char-after) quote)))
- (backward-char))
- (cond
- ((setq bnd (bounds-of-thing-at-point 'evil-string))
- (goto-char (car bnd))
- (setq count (1+ count)))
- ((bobp) (goto-char pnt) (throw 'done nil))
- (t (backward-char))))))
- (t (setq reset-parser nil)))))
- (when reset-parser
- ;; reset global cache
- (save-excursion
- (goto-char reset-parser)
- (beginning-of-defun)
- (syntax-ppss-flush-cache (point))))
- count))
-
-;;; Thing-at-point motion functions for Evil text objects and motions
-(defun forward-evil-empty-line (&optional count)
- "Move forward COUNT empty lines."
- (setq count (or count 1))
- (cond
- ((> count 0)
- (while (and (> count 0) (not (eobp)))
- (when (and (bolp) (eolp))
- (setq count (1- count)))
- (forward-line 1)))
- (t
- (while (and (< count 0) (not (bobp))
- (zerop (forward-line -1)))
- (when (and (bolp) (eolp))
- (setq count (1+ count))))))
- count)
-
-(defun forward-evil-space (&optional count)
- "Move forward COUNT whitespace sequences [[:space:]]+."
- (evil-forward-chars "[:space:]" count))
-
-(defun forward-evil-word (&optional count)
- "Move forward COUNT words.
-Moves point COUNT words forward or (- COUNT) words backward if
-COUNT is negative. Point is placed after the end of the word (if
-forward) or at the first character of the word (if backward). A
-word is a sequence of word characters matching
-\[[:word:]] (recognized by `forward-word'), a sequence of
-non-whitespace non-word characters '[^[:word:]\\n\\r\\t\\f ]', or
-an empty line matching ^$."
- (evil-forward-nearest
- count
- #'(lambda (&optional cnt)
- (let ((word-separating-categories evil-cjk-word-separating-categories)
- (word-combining-categories evil-cjk-word-combining-categories)
- (pnt (point)))
- (forward-word cnt)
- (if (= pnt (point)) cnt 0)))
- #'(lambda (&optional cnt)
- (evil-forward-chars "^[:word:]\n\r\t\f " cnt))
- #'forward-evil-empty-line))
-
-(defun forward-evil-WORD (&optional count)
- "Move forward COUNT \"WORDS\".
-Moves point COUNT WORDS forward or (- COUNT) WORDS backward if
-COUNT is negative. Point is placed after the end of the WORD (if
-forward) or at the first character of the WORD (if backward). A
-WORD is a sequence of non-whitespace characters
-'[^\\n\\r\\t\\f ]', or an empty line matching ^$."
- (evil-forward-nearest count
- #'(lambda (&optional cnt)
- (evil-forward-chars "^\n\r\t\f " cnt))
- #'forward-evil-empty-line))
-
-(defun forward-evil-symbol (&optional count)
- "Move forward COUNT symbols.
-Moves point COUNT symbols forward or (- COUNT) symbols backward
-if COUNT is negative. Point is placed after the end of the
-symbol (if forward) or at the first character of the symbol (if
-backward). A symbol is either determined by `forward-symbol', or
-is a sequence of characters not in the word, symbol or whitespace
-syntax classes."
- (evil-forward-nearest
- count
- #'(lambda (&optional cnt)
- (evil-forward-syntax "^w_->" cnt))
- #'(lambda (&optional cnt)
- (let ((pnt (point)))
- (forward-symbol cnt)
- (if (= pnt (point)) cnt 0)))
- #'forward-evil-empty-line))
-
-(defun forward-evil-defun (&optional count)
- "Move forward COUNT defuns.
-Moves point COUNT defuns forward or (- COUNT) defuns backward
-if COUNT is negative. A defun is defined by
-`beginning-of-defun' and `end-of-defun' functions."
- (evil-motion-loop (dir (or count 1))
- (if (> dir 0) (end-of-defun) (beginning-of-defun))))
-
-(defun forward-evil-sentence (&optional count)
- "Move forward COUNT sentences.
-Moves point COUNT sentences forward or (- COUNT) sentences
-backward if COUNT is negative. This function is the same as
-`forward-sentence' but returns the number of sentences that could
-NOT be moved over."
- (evil-motion-loop (dir (or count 1))
- (condition-case nil
- (forward-sentence dir)
- (error))))
-
-(defun forward-evil-paragraph (&optional count)
- "Move forward COUNT paragraphs.
-Moves point COUNT paragraphs forward or (- COUNT) paragraphs backward
-if COUNT is negative. A paragraph is defined by
-`start-of-paragraph-text' and `forward-paragraph' functions."
- (evil-motion-loop (dir (or count 1))
- (cond
- ((> dir 0) (forward-paragraph))
- ((not (bobp)) (start-of-paragraph-text) (beginning-of-line)))))
-
-(defvar evil-forward-quote-char ?\"
- "The character to be used by `forward-evil-quote'.")
-
-(defun forward-evil-quote (&optional count)
- "Move forward COUNT strings.
-The quotation character is specified by the global variable
-`evil-forward-quote-char'. This character is passed to
-`evil-forward-quote'."
- (evil-forward-quote evil-forward-quote-char count))
-
-(defun forward-evil-quote-simple (&optional count)
- "Move forward COUNT strings.
-The quotation character is specified by the global variable
-`evil-forward-quote-char'. This functions uses Vim's rules
-parsing from the beginning of the current line for quotation
-characters. It should only be used when looking for strings
-within comments and buffer *must* be narrowed to the comment."
- (let ((dir (if (> (or count 1) 0) 1 -1))
- (ch evil-forward-quote-char)
- (pnt (point))
- (cnt 0))
- (beginning-of-line)
- ;; count number of quotes before pnt
- (while (< (point) pnt)
- (when (= (char-after) ch)
- (setq cnt (1+ cnt)))
- (forward-char))
- (setq cnt (- (* 2 (abs count)) (mod cnt 2)))
- (cond
- ((> dir 0)
- (while (and (not (eolp)) (not (zerop cnt)))
- (when (= (char-after) ch) (setq cnt (1- cnt)))
- (forward-char))
- (when (not (zerop cnt)) (goto-char (point-max))))
- (t
- (while (and (not (bolp)) (not (zerop cnt)))
- (when (= (char-before) ch) (setq cnt (1- cnt)))
- (forward-char -1))
- (when (not (zerop cnt)) (goto-char (point-min)))))
- (/ cnt 2)))
-
-;;; Motion functions
-(defun evil-forward-beginning (thing &optional count)
- "Move forward to beginning of THING.
-The motion is repeated COUNT times."
- (setq count (or count 1))
- (if (< count 0)
- (forward-thing thing count)
- (let ((bnd (bounds-of-thing-at-point thing))
- rest)
- (when (and bnd (< (point) (cdr bnd)))
- (goto-char (cdr bnd)))
- (condition-case nil
- (when (zerop (setq rest (forward-thing thing count)))
- (when (and (bounds-of-thing-at-point thing)
- (not (bobp))
- ;; handle final empty line
- (not (and (bolp) (eobp))))
- (forward-char -1))
- (beginning-of-thing thing))
- (error))
- rest)))
-
-(defun evil-backward-beginning (thing &optional count)
- "Move backward to beginning of THING.
-The motion is repeated COUNT times. This is the same as calling
-`evil-backward-beginning' with -COUNT."
- (evil-forward-beginning thing (- (or count 1))))
-
-(defun evil-forward-end (thing &optional count)
- "Move forward to end of THING.
-The motion is repeated COUNT times."
- (setq count (or count 1))
- (cond
- ((> count 0)
- (unless (eobp) (forward-char))
- (prog1 (forward-thing thing count)
- (unless (bobp) (forward-char -1))))
- (t
- (let ((bnd (bounds-of-thing-at-point thing))
- rest)
- (when (and bnd (< (point) (cdr bnd) ))
- (goto-char (car bnd)))
- (condition-case nil
- (when (zerop (setq rest (forward-thing thing count)))
- (end-of-thing thing)
- (forward-char -1))
- (error))
- rest))))
-
-(defun evil-backward-end (thing &optional count)
- "Move backward to end of THING.
-The motion is repeated COUNT times. This is the same as calling
-`evil-backward-end' with -COUNT."
- (evil-forward-end thing (- (or count 1))))
-
-(defun evil-forward-word (&optional count)
- "Move by words.
-Moves point COUNT words forward or (- COUNT) words backward if
-COUNT is negative. This function is the same as `forward-word'
-but returns the number of words by which point could *not* be
-moved."
- (setq count (or count 1))
- (let* ((dir (if (>= count 0) +1 -1))
- (count (abs count)))
- (while (and (> count 0)
- (forward-word dir))
- (setq count (1- count)))
- count))
-
-(defun evil-in-comment-p (&optional pos)
- "Checks if POS is within a comment according to current syntax.
-If POS is nil, (point) is used. The return value is the beginning
-position of the comment."
- (setq pos (or pos (point)))
- (let ((chkpos
- (cond
- ((eobp) pos)
- ((= (char-syntax (char-after)) ?<) (1+ pos))
- ((and (not (zerop (logand (car (syntax-after (point)))
- (lsh 1 16))))
- (not (zerop (logand (or (car (syntax-after (1+ (point)))) 0)
- (lsh 1 17)))))
- (+ pos 2))
- ((and (not (zerop (logand (car (syntax-after (point)))
- (lsh 1 17))))
- (not (zerop (logand (or (car (syntax-after (1- (point)))) 0)
- (lsh 1 16)))))
- (1+ pos))
- (t pos))))
- (let ((syn (save-excursion (syntax-ppss chkpos))))
- (and (nth 4 syn) (nth 8 syn)))))
-
-(defun evil-looking-at-start-comment (&optional move)
- "Returns t if point is at the start of a comment.
-point must be on one of the opening characters of a block comment
-according to the current syntax table. Futhermore these
-characters must been parsed as opening characters, i.e. they
-won't be considered as comment starters inside a string or
-possibly another comment. Point is moved to the first character
-of the comment opener if MOVE is non-nil."
- (cond
- ;; one character opener
- ((= (char-syntax (char-after)) ?<)
- (equal (point) (evil-in-comment-p (1+ (point)))))
- ;; two character opener on first char
- ((and (not (zerop (logand (car (syntax-after (point)))
- (lsh 1 16))))
- (not (zerop (logand (or (car (syntax-after (1+ (point)))) 0)
- (lsh 1 17)))))
- (equal (point) (evil-in-comment-p (+ 2 (point)))))
- ;; two character opener on second char
- ((and (not (zerop (logand (car (syntax-after (point)))
- (lsh 1 17))))
- (not (zerop (logand (or (car (syntax-after (1- (point)))) 0)
- (lsh 1 16)))))
- (and (equal (1- (point)) (evil-in-comment-p (1+ (point))))
- (prog1 t (when move (backward-char)))))))
-
-(defun evil-looking-at-end-comment (&optional move)
- "Returns t if point is at the end of a comment.
-point must be on one of the opening characters of a block comment
-according to the current syntax table. Futhermore these
-characters must been parsed as opening characters, i.e. they
-won't be considered as comment starters inside a string or
-possibly another comment. Point is moved right after the comment
-closer if MOVE is non-nil."
- (cond
- ;; one char closer
- ((= (char-syntax (char-after)) ?>)
- (and (evil-in-comment-p) ; in comment
- (not (evil-in-comment-p (1+ (point))))
- (prog1 t (when move (forward-char)))))
- ;; two char closer on first char
- ((and (not (zerop (logand (car (syntax-after (point)))
- (lsh 1 18))))
- (not (zerop (logand (or (car (syntax-after (1+ (point)))) 0)
- (lsh 1 19)))))
- (and (evil-in-comment-p)
- (not (evil-in-comment-p (+ (point) 2)))
- (prog1 t (when move (forward-char 2)))))
- ;; two char closer on second char
- ((and (not (zerop (logand (car (syntax-after (point)))
- (lsh 1 19))))
- (not (zerop (logand (or (car (syntax-after (1- (point)))) 0)
- (lsh 1 18)))))
- (and (evil-in-comment-p)
- (not (evil-in-comment-p (1+ (point))))
- (prog1 t (when move (forward-char)))))))
-
-(defun evil-insert-newline-above ()
- "Inserts a new line above point and places point in that line
-with regard to indentation."
- (evil-narrow-to-field
- (evil-move-beginning-of-line)
- (insert (if use-hard-newlines hard-newline "\n"))
- (forward-line -1)
- (back-to-indentation)))
-
-(defun evil-insert-newline-below ()
- "Inserts a new line below point and places point in that line
-with regard to indentation."
- (evil-narrow-to-field
- (evil-move-end-of-line)
- (insert (if use-hard-newlines hard-newline "\n"))
- (back-to-indentation)))
-
-;;; Markers
-
-(defun evil-global-marker-p (char)
- "Whether CHAR denotes a global marker."
- (or (and (>= char ?A) (<= char ?Z))
- (assq char (default-value 'evil-markers-alist))))
-
-(defun evil-set-marker (char &optional pos advance)
- "Set the marker denoted by CHAR to position POS.
-POS defaults to the current position of point.
-If ADVANCE is t, the marker advances when inserting text at it;
-otherwise, it stays behind."
- (interactive (list (read-char)))
- (catch 'done
- (let ((marker (evil-get-marker char t)) alist)
- (unless (markerp marker)
- (cond
- ((and marker (symbolp marker) (boundp marker))
- (set marker (or (symbol-value marker) (make-marker)))
- (setq marker (symbol-value marker)))
- ((eq marker 'evil-jump-backward-swap)
- (evil-set-jump)
- (throw 'done nil))
- ((functionp marker)
- (user-error "Cannot set special marker `%c'" char))
- ((evil-global-marker-p char)
- (setq alist (default-value 'evil-markers-alist)
- marker (make-marker))
- (evil--add-to-alist 'alist char marker)
- (setq-default evil-markers-alist alist))
- (t
- (setq marker (make-marker))
- (evil--add-to-alist 'evil-markers-alist char marker))))
- (add-hook 'kill-buffer-hook #'evil-swap-out-markers nil t)
- (set-marker-insertion-type marker advance)
- (set-marker marker (or pos (point))))))
-
-(defun evil-get-marker (char &optional raw)
- "Return the marker denoted by CHAR.
-This is either a marker object as returned by `make-marker',
-a number, a cons cell (FILE . POS) with FILE being a string
-and POS a number, or nil. If RAW is non-nil, then the
-return value may also be a variable, a movement function,
-or a marker object pointing nowhere."
- (let ((marker (if (evil-global-marker-p char)
- (cdr-safe (assq char (default-value
- 'evil-markers-alist)))
- (cdr-safe (assq char evil-markers-alist)))))
- (save-excursion
- (if raw
- marker
- (when (and (symbolp marker) (boundp marker))
- (setq marker (symbol-value marker)))
- (when (functionp marker)
- (save-window-excursion
- (funcall marker)
- (setq marker (move-marker (make-marker) (point)))))
- (when (markerp marker)
- (if (eq (marker-buffer marker) (current-buffer))
- (setq marker (marker-position marker))
- (setq marker (and (marker-buffer marker) marker))))
- (when (or (numberp marker)
- (markerp marker)
- (and (consp marker)
- (stringp (car marker))
- (numberp (cdr marker))))
- marker)))))
-
-(defun evil-swap-out-markers ()
- "Turn markers into file references when the buffer is killed."
- (and buffer-file-name
- (dolist (entry evil-markers-alist)
- (and (markerp (cdr entry))
- (eq (marker-buffer (cdr entry)) (current-buffer))
- (setcdr entry (cons buffer-file-name
- (marker-position (cdr entry))))))))
-(put 'evil-swap-out-markers 'permanent-local-hook t)
-
-(defun evil-get-register (register &optional _noerror)
- "Return contents of REGISTER.
-Signal an error if empty, unless NOERROR is non-nil.
-
-The following special registers are supported.
- \" the unnamed register
- * the clipboard contents
- + the clipboard contents
- <C-w> the word at point (ex mode only)
- <C-a> the WORD at point (ex mode only)
- <C-o> the symbol at point (ex mode only)
- <C-f> the current file at point (ex mode only)
- % the current file name (read only)
- # the alternate file name (read only)
- / the last search pattern (read only)
- : the last command line (read only)
- . the last inserted text (read only)
- - the last small (less than a line) delete
- _ the black hole register
- = the expression register (read only)"
- (condition-case err
- (when (characterp register)
- (or (cond
- ((eq register ?\")
- (current-kill 0))
- ((and (<= ?1 register) (<= register ?9))
- (let ((reg (- register ?1)))
- (and (< reg (length kill-ring))
- (current-kill reg t))))
- ((memq register '(?* ?+))
- ;; the following code is modified from
- ;; `x-selection-value-internal'
- (let ((what (if (eq register ?*) 'PRIMARY 'CLIPBOARD))
- (request-type (or (and (boundp 'x-select-request-type)
- x-select-request-type)
- '(UTF8_STRING COMPOUND_TEXT STRING)))
- text)
- (unless (consp request-type)
- (setq request-type (list request-type)))
- (while (and request-type (not text))
- (condition-case nil
- (setq text (evil-get-selection what (pop request-type)))
- (error nil)))
- (when text
- (remove-text-properties 0 (length text) '(foreign-selection nil) text))
- text))
- ((eq register ?\C-W)
- (unless (evil-ex-p)
- (user-error "Register <C-w> only available in ex state"))
- (with-current-buffer evil-ex-current-buffer
- (thing-at-point 'evil-word)))
- ((eq register ?\C-A)
- (unless (evil-ex-p)
- (user-error "Register <C-a> only available in ex state"))
- (with-current-buffer evil-ex-current-buffer
- (thing-at-point 'evil-WORD)))
- ((eq register ?\C-O)
- (unless (evil-ex-p)
- (user-error "Register <C-o> only available in ex state"))
- (with-current-buffer evil-ex-current-buffer
- (thing-at-point 'evil-symbol)))
- ((eq register ?\C-F)
- (unless (evil-ex-p)
- (user-error "Register <C-f> only available in ex state"))
- (with-current-buffer evil-ex-current-buffer
- (thing-at-point 'filename)))
- ((eq register ?%)
- (or (buffer-file-name (and (evil-ex-p)
- (minibufferp)
- evil-ex-current-buffer))
- (user-error "No file name")))
- ((= register ?#)
- (or (with-current-buffer (other-buffer) (buffer-file-name))
- (user-error "No file name")))
- ((eq register ?/)
- (or (car-safe
- (or (and (boundp 'evil-search-module)
- (eq evil-search-module 'evil-search)
- evil-ex-search-history)
- (and isearch-regexp regexp-search-ring)
- search-ring))
- (user-error "No previous regular expression")))
- ((eq register ?:)
- (or (car-safe evil-ex-history)
- (user-error "No previous command line")))
- ((eq register ?.)
- evil-last-insertion)
- ((eq register ?-)
- evil-last-small-deletion)
- ((eq register ?=)
- (let* ((enable-recursive-minibuffers t)
- (result (eval (car (read-from-string (read-string "="))))))
- (cond
- ((or (stringp result)
- (numberp result)
- (symbolp result))
- (prin1-to-string result))
- ((sequencep result)
- (mapconcat #'prin1-to-string result "\n"))
- (t (user-error "Using %s as a string" (type-of result))))))
- ((eq register ?_) ; the black hole register
- "")
- (t
- (setq register (downcase register))
- (get-register register)))
- (user-error "Register `%c' is empty" register)))
- (error (unless err (signal (car err) (cdr err))))))
-
-(defun evil-append-register (register text)
- "Append TEXT to the contents of register REGISTER."
- (let ((content (get-register register)))
- (cond
- ((not content)
- (set-register register text))
- ((or (text-property-not-all 0 (length content)
- 'yank-handler nil
- content)
- (text-property-not-all 0 (length text)
- 'yank-handler nil
- text))
- ;; some non-trivial yank-handler -> always switch to line handler
- ;; ensure complete lines
- (when (and (> (length content) 0)
- (/= (aref content (1- (length content))) ?\n))
- (setq content (concat content "\n")))
- (when (and (> (length text) 0)
- (/= (aref text (1- (length text))) ?\n))
- (setq text (concat text "\n")))
- (setq text (concat content text))
- (remove-list-of-text-properties 0 (length text) '(yank-handler) text)
- (setq text (propertize text 'yank-handler '(evil-yank-line-handler)))
- (set-register register text))
- (t
- (set-register register (concat content text))))))
-
-(defun evil-set-register (register text)
- "Set the contents of register REGISTER to TEXT.
-If REGISTER is an upcase character then text is appended to that
-register instead of replacing its content."
- (cond
- ((not (characterp register))
- (user-error "Invalid register"))
- ;; don't allow modification of read-only registers
- ((member register '(?: ?. ?%))
- (user-error "Can't modify read-only register"))
- ((eq register ?\")
- (kill-new text))
- ((and (<= ?1 register) (<= register ?9))
- (if (null kill-ring)
- (kill-new text)
- (let ((kill-ring-yank-pointer kill-ring-yank-pointer)
- interprogram-paste-function
- interprogram-cut-function)
- (current-kill (- register ?1))
- (setcar kill-ring-yank-pointer text))))
- ((eq register ?*)
- (evil-set-selection 'PRIMARY text))
- ((eq register ?+)
- (evil-set-selection 'CLIPBOARD text))
- ((eq register ?-)
- (setq evil-last-small-deletion text))
- ((eq register ?_) ; the black hole register
- nil)
- ((and (<= ?A register) (<= register ?Z))
- (evil-append-register (downcase register) text))
- (t
- (set-register register text))))
-
-(defun evil-register-list ()
- "Returns an alist of all registers, but only those named
-with number or character. Registers with symbol or string in names are ignored
-to keep Vim compatibility with register jumps."
- (sort (append (mapcar #'(lambda (reg)
- (cons reg (evil-get-register reg t)))
- '(?\" ?* ?+ ?% ?# ?/ ?: ?. ?-
- ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
- (cl-remove-if-not (lambda (reg) (number-or-marker-p (car reg))) register-alist)
- nil)
- #'(lambda (reg1 reg2) (< (car reg1) (car reg2)))))
-
-(defsubst evil-kbd-macro-suppress-motion-error ()
- "Returns non-nil if a motion error should be suppressed.
-Whether the motion error should be suppressed depends on the
-variable `evil-kbd-macro-suppress-motion-error'."
- (or (and defining-kbd-macro
- (memq evil-kbd-macro-suppress-motion-error '(t record)))
- (and executing-kbd-macro
- (memq evil-kbd-macro-suppress-motion-error '(t replay)))))
-
-;;; Region
-
-;; `set-mark' does too much at once
-(defun evil-move-mark (pos)
- "Set buffer's mark to POS.
-If POS is nil, delete the mark."
- (when pos
- (setq pos (evil-normalize-position pos)))
- (set-marker (mark-marker) pos))
-
-(defun evil-save-transient-mark-mode ()
- "Save Transient Mark mode and make it buffer-local.
-Any changes to Transient Mark mode are now local to the current
-buffer, until `evil-restore-transient-mark-mode' is called.
-
-Variables pertaining to Transient Mark mode are listed in
-`evil-transient-vars', and their values are stored in
-`evil-transient-vals'."
- (dolist (var evil-transient-vars)
- (when (and (boundp var)
- (not (assq var evil-transient-vals)))
- (push (list var (symbol-value var)
- (local-variable-p var))
- evil-transient-vals)
- (make-variable-buffer-local var)
- (put var 'permanent-local t))))
-
-(defun evil-restore-transient-mark-mode ()
- "Restore Transient Mark mode.
-This presupposes that `evil-save-transient-mark-mode' has been
-called earlier. If Transient Mark mode was disabled before but
-enabled in the meantime, this function disables it; if it was
-enabled before but disabled in the meantime, this function
-enables it.
-
-The earlier settings of Transient Mark mode are stored in
-`evil-transient-vals'."
- (let (entry local var val)
- (while (setq entry (pop evil-transient-vals))
- (setq var (pop entry)
- val (pop entry)
- local (pop entry))
- (unless local
- (kill-local-variable var))
- (unless (equal (symbol-value var) val)
- (if (fboundp var)
- (funcall var (if val 1 -1))
- (setq var val))))))
-
-(defun evil-save-mark ()
- "Save the current mark, including whether it is transient.
-See also `evil-restore-mark'."
- (unless evil-visual-previous-mark
- (setq evil-visual-previous-mark (mark t))
- (evil-save-transient-mark-mode)))
-
-(defun evil-restore-mark ()
- "Restore the mark, including whether it was transient.
-See also `evil-save-mark'."
- (when evil-visual-previous-mark
- (evil-restore-transient-mark-mode)
- (evil-move-mark evil-visual-previous-mark)
- (setq evil-visual-previous-mark nil)))
-
-;; In theory, an active region implies Transient Mark mode, and
-;; disabling Transient Mark mode implies deactivating the region.
-;; In practice, Emacs never clears `mark-active' except in Transient
-;; Mark mode, so we define our own toggle functions to make things
-;; more predictable.
-(defun evil-transient-mark (&optional arg)
- "Toggle Transient Mark mode.
-Ensure that the region is properly deactivated.
-Enable with positive ARG, disable with negative ARG."
- (unless (numberp arg)
- (setq arg (if transient-mark-mode -1 1)))
- (cond
- ((< arg 1)
- (evil-active-region -1)
- ;; Transient Mark mode cannot be disabled
- ;; while CUA mode is enabled
- (when (fboundp 'cua-mode)
- (cua-mode -1))
- (when transient-mark-mode
- (transient-mark-mode -1)))
- (t
- (unless transient-mark-mode
- (evil-active-region -1)
- (transient-mark-mode 1)))))
-
-(defun evil-active-region (&optional arg)
- "Toggle active region.
-Ensure that Transient Mark mode is properly enabled.
-Enable with positive ARG, disable with negative ARG."
- (unless (numberp arg)
- (setq arg (if (region-active-p) -1 1)))
- (cond
- ((and (< arg 1))
- (when (or transient-mark-mode mark-active)
- (setq mark-active nil
- deactivate-mark nil)
- (when (boundp 'cua--explicit-region-start)
- (setq cua--explicit-region-start nil))
- (run-hooks 'deactivate-mark-hook)))
- (t
- (evil-transient-mark 1)
- (when deactivate-mark
- (setq deactivate-mark nil))
- (unless (mark t)
- (evil-move-mark (point)))
- (unless (region-active-p)
- (set-mark (mark t)))
- (when (boundp 'cua--explicit-region-start)
- (setq cua--explicit-region-start t)))))
-
-(defmacro evil-with-transient-mark-mode (&rest body)
- "Execute BODY with Transient Mark mode.
-Then restore Transient Mark mode to its previous setting."
- (declare (indent defun)
- (debug t))
- `(let ((inhibit-quit t)
- evil-transient-vals)
- (unwind-protect
- (progn
- (evil-save-transient-mark-mode)
- (evil-transient-mark 1)
- ,@body)
- (evil-restore-transient-mark-mode))))
-
-(defmacro evil-with-active-region (beg end &rest body)
- "Execute BODY with an active region from BEG to END."
- (declare (indent 2)
- (debug t))
- `(let ((beg ,beg) (end ,end)
- evil-transient-vals)
- (evil-with-transient-mark-mode
- (save-excursion
- (evil-active-region 1)
- (evil-move-mark beg)
- (goto-char end)
- ,@body))))
-
-(defun evil-exchange-point-and-mark ()
- "Exchange point and mark without activating the region."
- (let* ((point (point))
- (mark (or (mark t) point)))
- (set-marker (mark-marker) point)
- (goto-char mark)))
-
-(defun evil-apply-on-block (func beg end pass-columns &rest args)
- "Call FUNC for each line of a block selection.
-The selection is specified by the region BEG and END. FUNC must
-take at least two arguments, the beginning and end of each
-line. If PASS-COLUMNS is non-nil, these values are the columns,
-otherwise tey are buffer positions. Extra arguments to FUNC may
-be passed via ARGS."
- (let ((eol-col (and (memq last-command '(next-line previous-line))
- (numberp temporary-goal-column)
- temporary-goal-column))
- startcol startpt endcol endpt)
- (save-excursion
- (goto-char beg)
- (setq startcol (current-column))
- (beginning-of-line)
- (setq startpt (point))
- (goto-char end)
- (setq endcol (current-column))
- (forward-line 1)
- (setq endpt (point-marker))
- ;; ensure the start column is the left one.
- (evil-sort startcol endcol)
- ;; maybe find maximal column
- (when eol-col
- (setq eol-col 0)
- (goto-char startpt)
- (while (< (point) endpt)
- (setq eol-col (max eol-col
- (evil-column (line-end-position))))
- (forward-line 1))
- (setq endcol (max endcol
- (min eol-col
- (1+ (min (1- most-positive-fixnum)
- (truncate temporary-goal-column)))))))
- ;; start looping over lines
- (goto-char startpt)
- (while (< (point) endpt)
- (if pass-columns
- (apply func startcol endcol args)
- (apply func
- (save-excursion (evil-move-to-column startcol))
- (save-excursion (evil-move-to-column endcol t))
- args))
- (forward-line 1)))))
-
-(defun evil-apply-on-rectangle (function start end &rest args)
- "Like `apply-on-rectangle' but maybe extends to eol.
-If `temporary-goal-column' is set to a big number, then the
-region of each line is extended to the end of each line. The end
-column is set to the maximal column in all covered lines."
- (apply #'evil-apply-on-block function start end t args))
-
-;;; Insertion
-
-(defun evil-concat-ranges (ranges)
- "Concatenate RANGES.
-RANGES must be a list of ranges. They must be ordered so that
-successive ranges share their boundaries. The return value is a
-single range of disjoint union of the ranges or nil if the
-disjoint union is not a single range."
- (let ((range (car-safe ranges)) (ranges (cdr ranges)) r)
- (while (and range (setq r (car-safe ranges)))
- (setq range
- (cond ((and (= (cdr r) (car range))) (cons (car r) (cdr range)))
- ((and (= (cdr range) (car r))) (cons (car range) (cdr r)))))
- (setq ranges (cdr ranges)))
- range))
-
-(defun evil-track-last-insertion (beg end len)
- "Track the last insertion range and its text.
-The insertion range is stored as a pair of buffer positions in
-`evil-current-insertion'. If a subsequent change is compatible,
-then the current range is modified, otherwise it is replaced by a
-new range. Compatible changes are changes that do not create a
-disjoin range."
- ;; deletion
- (when (> len 0)
- (if (and evil-current-insertion
- (>= beg (car evil-current-insertion))
- (<= (+ beg len) (cdr evil-current-insertion)))
- (setcdr evil-current-insertion
- (- (cdr evil-current-insertion) len))
- (setq evil-current-insertion nil)))
- ;; insertion
- (if (and evil-current-insertion
- (>= beg (car evil-current-insertion))
- (<= beg (cdr evil-current-insertion)))
- (setcdr evil-current-insertion
- (+ (- end beg)
- (cdr evil-current-insertion)))
- (setq evil-current-insertion (cons beg end))))
-(put 'evil-track-last-insertion 'permanent-local-hook t)
-
-(defun evil-start-track-last-insertion ()
- "Start tracking the last insertion."
- (setq evil-current-insertion nil)
- (add-hook 'after-change-functions #'evil-track-last-insertion nil t))
-
-(defun evil-stop-track-last-insertion ()
- "Stop tracking the last insertion.
-The tracked insertion is set to `evil-last-insertion'."
- (setq evil-last-insertion
- (and evil-current-insertion
- ;; Check whether the insertion range is a valid buffer
- ;; range. If a buffer modification is done from within
- ;; another change hook or modification-hook (yasnippet
- ;; does this using overlay modification-hooks), then the
- ;; insertion information may be invalid. There is no way
- ;; to detect this situation, but at least we should
- ;; ensure that no error occurs (see bug #272).
- (>= (car evil-current-insertion) (point-min))
- (<= (cdr evil-current-insertion) (point-max))
- (buffer-substring-no-properties (car evil-current-insertion)
- (cdr evil-current-insertion))))
- (remove-hook 'after-change-functions #'evil-track-last-insertion t))
-
-;;; Paste
-
-(defun evil-yank-characters (beg end &optional register yank-handler)
- "Saves the characters defined by the region BEG and END in the kill-ring."
- (let ((text (filter-buffer-substring beg end)))
- (when yank-handler
- (setq text (propertize text 'yank-handler (list yank-handler))))
- (when register
- (evil-set-register register text))
- (when evil-was-yanked-without-register
- (evil-set-register ?0 text)) ; "0 register contains last yanked text
- (unless (eq register ?_)
- (kill-new text))))
-
-(defun evil-yank-lines (beg end &optional register yank-handler)
- "Saves the lines in the region BEG and END into the kill-ring."
- (let* ((text (filter-buffer-substring beg end))
- (yank-handler (list (or yank-handler
- #'evil-yank-line-handler)
- nil
- t)))
- ;; Ensure the text ends with a newline. This is required
- ;; if the deleted lines were the last lines in the buffer.
- (when (or (zerop (length text))
- (/= (aref text (1- (length text))) ?\n))
- (setq text (concat text "\n")))
- (setq text (propertize text 'yank-handler yank-handler))
- (when register
- (evil-set-register register text))
- (when evil-was-yanked-without-register
- (evil-set-register ?0 text)) ; "0 register contains last yanked text
- (unless (eq register ?_)
- (kill-new text))))
-
-(defun evil-yank-rectangle (beg end &optional register yank-handler)
- "Saves the rectangle defined by region BEG and END into the kill-ring."
- (let ((lines (list nil)))
- (evil-apply-on-rectangle #'extract-rectangle-line beg end lines)
- ;; We remove spaces from the beginning and the end of the next.
- ;; Spaces are inserted explicitly in the yank-handler in order to
- ;; NOT insert lines full of spaces.
- (setq lines (nreverse (cdr lines)))
- ;; `text' is used as default insert text when pasting this rectangle
- ;; in another program, e.g., using the X clipboard.
- (let* ((yank-handler (list (or yank-handler
- #'evil-yank-block-handler)
- lines
- t
- 'evil-delete-yanked-rectangle))
- (text (propertize (mapconcat #'identity lines "\n")
- 'yank-handler yank-handler)))
- (when register
- (evil-set-register register text))
- (when evil-was-yanked-without-register
- (evil-set-register ?0 text)) ; "0 register contains last yanked text
- (unless (eq register ?_)
- (kill-new text)))))
-
-(defun evil-remove-yank-excluded-properties (text)
- "Removes `yank-excluded-properties' from TEXT."
- (if (eq yank-excluded-properties t)
- (set-text-properties 0 (length text) nil text)
- (remove-list-of-text-properties 0 (length text)
- yank-excluded-properties text)))
-
-(defun evil-yank-line-handler (text)
- "Inserts the current text linewise."
- (let ((text (apply #'concat (make-list (or evil-paste-count 1) text)))
- (opoint (point)))
- (evil-remove-yank-excluded-properties text)
- (cond
- ((eq this-command 'evil-paste-before)
- (evil-move-beginning-of-line)
- (evil-move-mark (point))
- (insert text)
- (setq evil-last-paste
- (list 'evil-paste-before
- evil-paste-count
- opoint
- (mark t)
- (point)))
- (evil-set-marker ?\[ (mark))
- (evil-set-marker ?\] (1- (point)))
- (evil-exchange-point-and-mark)
- (back-to-indentation))
- ((eq this-command 'evil-paste-after)
- (evil-move-end-of-line)
- (evil-move-mark (point))
- (insert "\n")
- (insert text)
- (evil-set-marker ?\[ (1+ (mark)))
- (evil-set-marker ?\] (1- (point)))
- (delete-char -1) ; delete the last newline
- (setq evil-last-paste
- (list 'evil-paste-after
- evil-paste-count
- opoint
- (mark t)
- (point)))
- (evil-move-mark (1+ (mark t)))
- (evil-exchange-point-and-mark)
- (back-to-indentation))
- (t
- (insert text)))))
-
-(defun evil-yank-block-handler (lines)
- "Inserts the current text as block."
- (let ((count (or evil-paste-count 1))
- (col (if (eq this-command 'evil-paste-after)
- (1+ (current-column))
- (current-column)))
- (current-line (line-number-at-pos (point)))
- (opoint (point))
- epoint)
- (dolist (line lines)
- ;; concat multiple copies according to count
- (setq line (apply #'concat (make-list count line)))
- ;; strip whitespaces at beginning and end
- (string-match "^ *\\(.*?\\) *$" line)
- (let ((text (match-string 1 line))
- (begextra (match-beginning 1))
- (endextra (- (match-end 0) (match-end 1))))
- ;; maybe we have to insert a new line at eob
- (while (< (line-number-at-pos (point))
- current-line)
- (goto-char (point-max))
- (insert "\n"))
- (setq current-line (1+ current-line))
- ;; insert text unless we insert an empty line behind eol
- (unless (and (< (evil-column (line-end-position)) col)
- (zerop (length text)))
- ;; if we paste behind eol, it may be sufficient to insert tabs
- (if (< (evil-column (line-end-position)) col)
- (move-to-column (+ col begextra) t)
- (move-to-column col t)
- (insert (make-string begextra ?\s)))
- (evil-remove-yank-excluded-properties text)
- (insert text)
- (unless (eolp)
- ;; text follows, so we have to insert spaces
- (insert (make-string endextra ?\s)))
- (setq epoint (point)))
- (forward-line 1)))
- (setq evil-last-paste
- (list this-command
- evil-paste-count
- opoint
- (length lines) ; number of rows
- (* count (length (car lines))))) ; number of colums
- (evil-set-marker ?\[ opoint)
- (evil-set-marker ?\] (1- epoint))
- (goto-char opoint)
- (when (and (eq this-command 'evil-paste-after)
- (not (eolp)))
- (forward-char))))
-
-(defun evil-delete-yanked-rectangle (nrows ncols)
- "Special function to delete the block yanked by a previous paste command."
- (let ((opoint (point))
- (col (if (eq last-command 'evil-paste-after)
- (1+ (current-column))
- (current-column))))
- (dotimes (_ nrows)
- (delete-region (save-excursion
- (move-to-column col)
- (point))
- (save-excursion
- (move-to-column (+ col ncols))
- (point)))
- (unless (eobp) (forward-line)))
- (goto-char opoint)))
-
-;; TODO: if undoing is disabled in the current buffer, paste-pop won't
-;; work. Although this is probably not a big problem, because usually
-;; buffers where `evil-paste-pop' may be useful have undoing enabled.
-;; A solution would be to temporarily enable undo when pasting and
-;; store the undo information in a special variable that does not
-;; interfere with `buffer-undo-list'.
-(defun evil-paste-pop (count)
- "Replace the just-yanked stretch of killed text with a different stretch.
-This command is allowed only immediatly after a `yank',
-`evil-paste-before', `evil-paste-after' or `evil-paste-pop'.
-This command uses the same paste command as before, i.e., when
-used after `evil-paste-after' the new text is also yanked using
-`evil-paste-after', used with the same paste-count argument.
-
-The COUNT argument inserts the COUNTth previous kill. If COUNT
-is negative this is a more recent kill."
- (interactive "p")
- (unless (memq last-command
- '(evil-paste-after
- evil-paste-before
- evil-visual-paste))
- (user-error "Previous command was not an evil-paste: %s" last-command))
- (unless evil-last-paste
- (user-error "Previous paste command used a register"))
- (evil-undo-pop)
- (goto-char (nth 2 evil-last-paste))
- (setq this-command (nth 0 evil-last-paste))
- ;; use temporary kill-ring, so the paste cannot modify it
- (let ((kill-ring (list (current-kill
- (if (and (> count 0) (nth 5 evil-last-paste))
- ;; if was visual paste then skip the
- ;; text that has been replaced
- (1+ count)
- count))))
- (kill-ring-yank-pointer kill-ring))
- (when (eq last-command 'evil-visual-paste)
- (let ((evil-no-display t))
- (evil-visual-restore)))
- (funcall (nth 0 evil-last-paste) (nth 1 evil-last-paste))
- ;; if this was a visual paste, then mark the last paste as NOT
- ;; being the first visual paste
- (when (eq last-command 'evil-visual-paste)
- (setcdr (nthcdr 4 evil-last-paste) nil))))
-
-(defun evil-paste-pop-next (count)
- "Same as `evil-paste-pop' but with negative argument."
- (interactive "p")
- (evil-paste-pop (- count)))
-
-;;; Interactive forms
-
-(defun evil-match-interactive-code (interactive &optional pos)
- "Match an interactive code at position POS in string INTERACTIVE.
-Returns the first matching entry in `evil-interactive-alist', or nil."
- (let ((length (length interactive))
- (pos (or pos 0)))
- (catch 'done
- (dolist (entry evil-interactive-alist)
- (let* ((string (car entry))
- (end (+ (length string) pos)))
- (when (and (<= end length)
- (string= string
- (substring interactive pos end)))
- (throw 'done entry)))))))
-
-(defun evil-concatenate-interactive-forms (&rest forms)
- "Concatenate interactive list expressions FORMS.
-Returns a single expression where successive expressions
-are joined, if possible."
- (let (result)
- (when forms
- (while (cdr forms)
- (cond
- ((null (car forms))
- (pop forms))
- ((and (eq (car (car forms)) 'list)
- (eq (car (cadr forms)) 'list))
- (setq forms (cons (append (car forms)
- (cdr (cadr forms)))
- (cdr (cdr forms)))))
- (t
- (push (pop forms) result))))
- (when (car forms)
- (push (pop forms) result))
- (setq result (nreverse result))
- (cond
- ((null result))
- ((null (cdr result))
- (car result))
- (t
- `(append ,@result))))))
-
-(defun evil-interactive-string (string)
- "Evaluate the interactive string STRING.
-The string may contain extended interactive syntax.
-The return value is a cons cell (FORM . PROPERTIES),
-where FORM is a single list-expression to be passed to
-a standard `interactive' statement, and PROPERTIES is a
-list of command properties as passed to `evil-define-command'."
- (let ((length (length string))
- (pos 0)
- code expr forms match plist prompt properties)
- (while (< pos length)
- (if (eq (aref string pos) ?\n)
- (setq pos (1+ pos))
- (setq match (evil-match-interactive-code string pos))
- (if (null match)
- (user-error "Unknown interactive code: `%s'"
- (substring string pos))
- (setq code (car match)
- expr (car (cdr match))
- plist (cdr (cdr match))
- pos (+ pos (length code)))
- (when (functionp expr)
- (setq prompt
- (substring string pos
- (or (string-match "\n" string pos)
- length))
- pos (+ pos (length prompt))
- expr `(funcall ,expr ,prompt)))
- (setq forms (append forms (list expr))
- properties (append properties plist)))))
- (cons `(append ,@forms) properties)))
-
-(defun evil-interactive-form (&rest args)
- "Evaluate interactive forms ARGS.
-The return value is a cons cell (FORM . PROPERTIES),
-where FORM is a single list-expression to be passed to
-a standard `interactive' statement, and PROPERTIES is a
-list of command properties as passed to `evil-define-command'."
- (let (forms properties)
- (dolist (arg args)
- (if (not (stringp arg))
- (setq forms (append forms (list arg)))
- (setq arg (evil-interactive-string arg)
- forms (append forms (cdr (car arg)))
- properties (append properties (cdr arg)))))
- (cons (apply #'evil-concatenate-interactive-forms forms)
- properties)))
-
-;;; Types
-
-(defun evil-type (object &optional default)
- "Return the type of OBJECT, or DEFAULT if none."
- (let (type)
- (cond
- ((overlayp object)
- (setq type (overlay-get object :type)))
- ((evil-range-p object)
- (setq type (nth 2 object)))
- ((listp object)
- (setq type (plist-get object :type)))
- ((commandp object)
- (setq type (evil-get-command-property object :type)))
- ((symbolp object)
- (setq type (get object 'type))))
- (setq type (or type default))
- (and (evil-type-p type) type)))
-
-(defun evil-set-type (object type)
- "Set the type of OBJECT to TYPE.
-For example, (evil-set-type 'next-line 'line)
-will make `line' the type of the `next-line' command."
- (cond
- ((overlayp object)
- (overlay-put object :type type))
- ((evil-range-p object)
- (evil-set-range-type object type))
- ((listp object)
- (plist-put object :type type))
- ((commandp object)
- (evil-set-command-property object :type type))
- ((symbolp object)
- (put object 'type type)))
- object)
-
-(defun evil-type-property (type prop)
- "Return property PROP for TYPE."
- (evil-get-property evil-type-properties type prop))
-
-(defun evil-type-p (sym)
- "Whether SYM is the name of a type."
- (assq sym evil-type-properties))
-
-(defun evil-expand (beg end type &rest properties)
- "Expand BEG and END as TYPE with PROPERTIES.
-Returns a list (BEG END TYPE PROPERTIES ...), where the tail
-may contain a property list."
- (apply #'evil-transform
- ;; don't expand if already expanded
- (unless (plist-get properties :expanded) :expand)
- beg end type properties))
-
-(defun evil-contract (beg end type &rest properties)
- "Contract BEG and END as TYPE with PROPERTIES.
-Returns a list (BEG END TYPE PROPERTIES ...), where the tail
-may contain a property list."
- (apply #'evil-transform :contract beg end type properties))
-
-(defun evil-normalize (beg end type &rest properties)
- "Normalize BEG and END as TYPE with PROPERTIES.
-Returns a list (BEG END TYPE PROPERTIES ...), where the tail
-may contain a property list."
- (apply #'evil-transform :normalize beg end type properties))
-
-(defun evil-transform (transform beg end type &rest properties)
- "Apply TRANSFORM on BEG and END with PROPERTIES.
-Returns a list (BEG END TYPE PROPERTIES ...), where the tail
-may contain a property list. If TRANSFORM is undefined,
-return positions unchanged."
- (let* ((type (or type (evil-type properties)))
- (transform (when (and type transform)
- (evil-type-property type transform))))
- (if transform
- (apply transform beg end properties)
- (apply #'evil-range beg end type properties))))
-
-(defun evil-describe (beg end type &rest properties)
- "Return description of BEG and END with PROPERTIES.
-If no description is available, return the empty string."
- (let* ((type (or type (evil-type properties)))
- (properties (plist-put properties :type type))
- (describe (evil-type-property type :string)))
- (or (when describe
- (apply describe beg end properties))
- "")))
-
-;;; Ranges
-
-(defun evil-range (beg end &optional type &rest properties)
- "Return a list (BEG END [TYPE] PROPERTIES...).
-BEG and END are buffer positions (numbers or markers),
-TYPE is a type as per `evil-type-p', and PROPERTIES is
-a property list."
- (let ((beg (evil-normalize-position beg))
- (end (evil-normalize-position end)))
- (when (and (numberp beg) (numberp end))
- (append (list (min beg end) (max beg end))
- (when (evil-type-p type)
- (list type))
- properties))))
-
-(defun evil-range-p (object)
- "Whether OBJECT is a range."
- (and (listp object)
- (>= (length object) 2)
- (numberp (nth 0 object))
- (numberp (nth 1 object))))
-
-(defun evil-range-beginning (range)
- "Return beginning of RANGE."
- (when (evil-range-p range)
- (let ((beg (evil-normalize-position (nth 0 range)))
- (end (evil-normalize-position (nth 1 range))))
- (min beg end))))
-
-(defun evil-range-end (range)
- "Return end of RANGE."
- (when (evil-range-p range)
- (let ((beg (evil-normalize-position (nth 0 range)))
- (end (evil-normalize-position (nth 1 range))))
- (max beg end))))
-
-(defun evil-range-properties (range)
- "Return properties of RANGE."
- (when (evil-range-p range)
- (if (evil-type range)
- (nthcdr 3 range)
- (nthcdr 2 range))))
-
-(defun evil-copy-range (range)
- "Return a copy of RANGE."
- (copy-sequence range))
-
-(defun evil-set-range (range &optional beg end type &rest properties)
- "Set RANGE to have beginning BEG and end END.
-The TYPE and additional PROPERTIES may also be specified.
-If an argument is nil, it's not used; the previous value is retained.
-See also `evil-set-range-beginning', `evil-set-range-end',
-`evil-set-range-type' and `evil-set-range-properties'."
- (when (evil-range-p range)
- (let ((beg (or (evil-normalize-position beg)
- (evil-range-beginning range)))
- (end (or (evil-normalize-position end)
- (evil-range-end range)))
- (type (or type (evil-type range)))
- (plist (evil-range-properties range)))
- (evil-sort beg end)
- (setq plist (evil-concat-plists plist properties))
- (evil-set-range-beginning range beg)
- (evil-set-range-end range end)
- (evil-set-range-type range type)
- (evil-set-range-properties range plist)
- range)))
-
-(defun evil-set-range-beginning (range beg &optional copy)
- "Set RANGE's beginning to BEG.
-If COPY is non-nil, return a copy of RANGE."
- (when copy
- (setq range (evil-copy-range range)))
- (setcar range beg)
- range)
-
-(defun evil-set-range-end (range end &optional copy)
- "Set RANGE's end to END.
-If COPY is non-nil, return a copy of RANGE."
- (when copy
- (setq range (evil-copy-range range)))
- (setcar (cdr range) end)
- range)
-
-(defun evil-set-range-type (range type &optional copy)
- "Set RANGE's type to TYPE.
-If COPY is non-nil, return a copy of RANGE."
- (when copy
- (setq range (evil-copy-range range)))
- (if type
- (setcdr (cdr range)
- (cons type (evil-range-properties range)))
- (setcdr (cdr range) (evil-range-properties range)))
- range)
-
-(defun evil-set-range-properties (range properties &optional copy)
- "Set RANGE's properties to PROPERTIES.
-If COPY is non-nil, return a copy of RANGE."
- (when copy
- (setq range (evil-copy-range range)))
- (if (evil-type range)
- (setcdr (cdr (cdr range)) properties)
- (setcdr (cdr range) properties))
- range)
-
-(defun evil-range-union (range1 range2 &optional type)
- "Return the union of the ranges RANGE1 and RANGE2.
-If the ranges have conflicting types, use RANGE1's type.
-This can be overridden with TYPE."
- (when (and (evil-range-p range1)
- (evil-range-p range2))
- (evil-range (min (evil-range-beginning range1)
- (evil-range-beginning range2))
- (max (evil-range-end range1)
- (evil-range-end range2))
- (or type
- (evil-type range1)
- (evil-type range2)))))
-
-(defun evil-subrange-p (range1 range2)
- "Whether RANGE1 is contained within RANGE2."
- (and (evil-range-p range1)
- (evil-range-p range2)
- (<= (evil-range-beginning range2)
- (evil-range-beginning range1))
- (>= (evil-range-end range2)
- (evil-range-end range1))))
-
-(defun evil-select-inner-object (thing beg end type &optional count line)
- "Return an inner text object range of COUNT objects.
-If COUNT is positive, return objects following point; if COUNT is
-negative, return objects preceding point. If one is unspecified,
-the other is used with a negative argument. THING is a symbol
-understood by thing-at-point. BEG, END and TYPE specify the
-current selection. If LINE is non-nil, the text object should be
-linewise, otherwise it is character wise."
- (let* ((count (or count 1))
- (bnd (or (let ((b (bounds-of-thing-at-point thing)))
- (and b (< (point) (cdr b)) b))
- (evil-bounds-of-not-thing-at-point thing))))
- ;; check if current object is selected
- (when (or (not beg) (not end)
- (> beg (car bnd))
- (< end (cdr bnd))
- (and (eq type 'inclusive)
- (= (1+ beg) end))) ; empty region does not count
- (when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd)))
- (when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd)))
- (setq count (if (> count 0) (1- count) (1+ count))))
- (goto-char (if (< count 0) beg end))
- (evil-forward-nearest count
- #'(lambda (cnt) (forward-thing thing cnt))
- #'(lambda (cnt) (evil-forward-not-thing thing cnt)))
- (evil-range (if (>= count 0) beg (point))
- (if (< count 0) end (point))
- (if line 'line type)
- :expanded t)))
-
-(defun evil-select-an-object (thing beg end type count &optional line)
- "Return an outer text object range of COUNT objects.
-If COUNT is positive, return objects following point; if COUNT is
-negative, return objects preceding point. If one is unspecified,
-the other is used with a negative argument. THING is a symbol
-understood by thing-at-point. BEG, END and TYPE specify the
-current selection. If LINE is non-nil, the text object should be
-linewise, otherwise it is character wise."
- (let* ((dir (if (> (or count 1) 0) +1 -1))
- (count (abs (or count 1)))
- (objbnd (let ((b (bounds-of-thing-at-point thing)))
- (and b (< (point) (cdr b)) b)))
- (bnd (or objbnd (evil-bounds-of-not-thing-at-point thing)))
- addcurrent other)
- ;; check if current object is not selected
- (when (or (not beg) (not end)
- (> beg (car bnd))
- (< end (cdr bnd))
- (and (eq type 'inclusive)
- (= (1+ beg) end))) ; empty region does not count
- ;; if not, enlarge selection
- (when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd)))
- (when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd)))
- (if objbnd (setq addcurrent t)))
- ;; make other and (point) reflect the selection
- (cond
- ((> dir 0) (goto-char end) (setq other beg))
- (t (goto-char beg) (setq other end)))
- (cond
- ;; do nothing more than only current is selected
- ((not (and (= beg (car bnd)) (= end (cdr bnd)))))
- ;; current match is thing, add whitespace
- (objbnd
- (let ((wsend (evil-with-restriction
- ;; restrict to current line if we do non-line selection
- (and (not line) (line-beginning-position))
- (and (not line) (line-end-position))
- (evil-bounds-of-not-thing-at-point thing dir))))
- (cond
- (wsend
- ;; add whitespace at end
- (goto-char wsend)
- (setq addcurrent t))
- (t
- ;; no whitespace at end, try beginning
- (save-excursion
- (goto-char other)
- (setq wsend
- (evil-with-restriction
- ;; restrict to current line if we do non-line selection
- (and (not line) (line-beginning-position))
- (and (not line) (line-end-position))
- (evil-bounds-of-not-thing-at-point thing (- dir))))
- (when wsend (setq other wsend addcurrent t)))))))
- ;; current match is whitespace, add thing
- (t
- (forward-thing thing dir)
- (setq addcurrent t)))
- ;; possibly count current object as selection
- (if addcurrent (setq count (1- count)))
- ;; move
- (dotimes (_ count)
- (let ((wsend (evil-bounds-of-not-thing-at-point thing dir)))
- (if (and wsend (/= wsend (point)))
- ;; start with whitespace
- (forward-thing thing dir)
- ;; start with thing
- (forward-thing thing dir)
- (setq wsend (evil-bounds-of-not-thing-at-point thing dir))
- (when wsend (goto-char wsend)))))
- ;; return range
- (evil-range (if (> dir 0) other (point))
- (if (< dir 0) other (point))
- (if line 'line type)
- :expanded t)))
-
-(defun evil--get-block-range (op cl selection-type)
- "Return the exclusive range of a visual selection.
-OP and CL are pairs of buffer positions for the opening and
-closing delimiter of a range. SELECTION-TYPE is the desired type
-of selection. It is a symbol that determines which parts of the
-block are selected. If it is 'inclusive or t the returned range
-is \(cons (car OP) (cdr CL)). If it is 'exclusive or nil the
-returned range is (cons (cdr OP) (car CL)). If it is
-'exclusive-line the returned range will skip whitespace at the
-end of the line of OP and at the beginning of the line of CL."
- (cond
- ((memq selection-type '(inclusive t)) (cons (car op) (cdr cl)))
- ((memq selection-type '(exclusive nil)) (cons (cdr op) (car cl)))
- ((eq selection-type 'exclusive-line)
- (let ((beg (cdr op))
- (end (car cl)))
- (save-excursion
- (goto-char beg)
- (when (and (eolp) (not (eobp)))
- (setq beg (line-beginning-position 2)))
- (goto-char end)
- (skip-chars-backward " \t")
- (when (bolp)
- (setq end (point))
- (goto-char beg)
- (when (and (not (bolp)) (< beg end))
- (setq end (1- end)))))
- (cons beg end)))
- (t
- (user-error "Unknown selection-type %s" selection-type))))
-
-(defun evil-select-block (thing beg end type count
- &optional
- selection-type
- countcurrent
- fixedscan)
- "Return a range (BEG END) of COUNT delimited text objects.
-BEG END TYPE are the currently selected (visual) range. The
-delimited object must be given by THING-up function (see
-`evil-up-block').
-
-SELECTION-TYPE is symbol that determines which parts of the block
-are selected. If it is 'inclusive or t OPEN and CLOSE are
-included in the range. If it is 'exclusive or nil the delimiters
-are not contained. If it is 'exclusive-line the delimiters are
-not included as well as adjacent whitespace until the beginning
-of the next line or the end of the previous line. If the
-resulting selection consists of complete lines only and visual
-state is not active, the returned selection is linewise.
-
-If COUNTCURRENT is non-nil an objected is counted if the current
-selection matches that object exactly.
-
-Usually scanning for the surrounding block starts at (1+ beg)
-and (1- end). If this might fail due to the behavior of THING
-then FIXEDSCAN can be set to t. In this case the scan starts at
-BEG and END. One example where this might fail is if BEG and END
-are the delimiters of a string or comment."
- (save-excursion
- (save-match-data
- (let* ((orig-beg beg)
- (orig-end end)
- (beg (or beg (point)))
- (end (or end (point)))
- (count (abs (or count 1)))
- op cl op-end cl-end)
- ;; We always assume at least one selected character.
- (if (= beg end) (setq end (1+ end)))
- ;; We scan twice: starting at (1+ beg) forward and at (1- end)
- ;; backward. The resulting selection is the smaller one.
- (goto-char (if fixedscan beg (1+ beg)))
- (when (and (zerop (funcall thing +1)) (match-beginning 0))
- (setq cl (cons (match-beginning 0) (match-end 0)))
- (goto-char (car cl))
- (when (and (zerop (funcall thing -1)) (match-beginning 0))
- (setq op (cons (match-beginning 0) (match-end 0)))))
- ;; start scanning from end
- (goto-char (if fixedscan end (1- end)))
- (when (and (zerop (funcall thing -1)) (match-beginning 0))
- (setq op-end (cons (match-beginning 0) (match-end 0)))
- (goto-char (cdr op-end))
- (when (and (zerop (funcall thing +1)) (match-beginning 0))
- (setq cl-end (cons (match-beginning 0) (match-end 0)))))
- ;; Bug #607: use the tightest selection that contains the
- ;; original selection. If non selection contains the original,
- ;; use the larger one.
- (cond
- ((and (not op) (not cl-end))
- (error "No surrounding delimiters found"))
- ((or (not op) ; first not found
- (and cl-end ; second found
- (>= (car op-end) (car op)) ; second smaller
- (<= (cdr cl-end) (cdr cl))
- (<= (car op-end) beg) ; second contains orig
- (>= (cdr cl-end) end)))
- (setq op op-end cl cl-end)))
- (setq op-end op cl-end cl) ; store copy
- ;; if the current selection contains the surrounding
- ;; delimiters, they do not count as new selection
- (let ((cnt (if (and orig-beg orig-end (not countcurrent))
- (let ((sel (evil--get-block-range op cl selection-type)))
- (if (and (<= orig-beg (car sel))
- (>= orig-end (cdr sel)))
- count
- (1- count)))
- (1- count))))
- ;; starting from the innermost surrounding delimiters
- ;; increase selection
- (when (> cnt 0)
- (setq op (progn
- (goto-char (car op-end))
- (funcall thing (- cnt))
- (if (match-beginning 0)
- (cons (match-beginning 0) (match-end 0))
- op))
- cl (progn
- (goto-char (cdr cl-end))
- (funcall thing cnt)
- (if (match-beginning 0)
- (cons (match-beginning 0) (match-end 0))
- cl)))))
- (let ((sel (evil--get-block-range op cl selection-type)))
- (setq op (car sel)
- cl (cdr sel)))
- (cond
- ((and (equal op orig-beg) (equal cl orig-end)
- (or (not countcurrent)
- (and countcurrent (/= count 1))))
- (error "No surrounding delimiters found"))
- ((save-excursion
- (and (not (evil-visual-state-p))
- (eq type 'inclusive)
- (progn (goto-char op) (bolp))
- (progn (goto-char cl) (bolp))))
- (evil-range op cl 'line :expanded t))
- (t
- (evil-range op cl type :expanded t)))))))
-
-(defun evil-select-paren (open close beg end type count &optional inclusive)
- "Return a range (BEG END) of COUNT delimited text objects.
-OPEN and CLOSE specify the opening and closing delimiter,
-respectively. BEG END TYPE are the currently selected (visual)
-range. If INCLUSIVE is non-nil, OPEN and CLOSE are included in
-the range; otherwise they are excluded.
-
-The types of OPEN and CLOSE specify which kind of THING is used
-for parsing with `evil-select-block'. If OPEN and CLOSE are
-characters `evil-up-paren' is used. Otherwise OPEN and CLOSE
-must be regular expressions and `evil-up-block' is used.
-
-If the selection is exclusive, whitespace at the end or at the
-beginning of the selection until the end-of-line or beginning-of-line
-is ignored."
- ;; we need special linewise exclusive selection
- (unless inclusive (setq inclusive 'exclusive-line))
- (cond
- ((and (characterp open) (characterp close))
- (let ((thing #'(lambda (&optional cnt)
- (evil-up-paren open close cnt)))
- (bnd (or (bounds-of-thing-at-point 'evil-string)
- (bounds-of-thing-at-point 'evil-comment)
- ;; If point is at the opening quote of a string,
- ;; this must be handled as if point is within the
- ;; string, i.e. the selection must be extended
- ;; around the string. Otherwise
- ;; `evil-select-block' might do the wrong thing
- ;; because it accidentally moves point inside the
- ;; string (for inclusive selection) when looking
- ;; for the current surrounding block. (re #364)
- (and (= (point) (or beg (point)))
- (save-excursion
- (goto-char (1+ (or beg (point))))
- (or (bounds-of-thing-at-point 'evil-string)
- (bounds-of-thing-at-point 'evil-comment)))))))
- (if (not bnd)
- (evil-select-block thing beg end type count inclusive)
- (or (evil-with-restriction (car bnd) (cdr bnd)
- (condition-case nil
- (evil-select-block thing beg end type count inclusive)
- (error nil)))
- (save-excursion
- (setq beg (or beg (point))
- end (or end (point)))
- (goto-char (car bnd))
- (let ((extbeg (min beg (car bnd)))
- (extend (max end (cdr bnd))))
- (evil-select-block thing
- extbeg extend
- type
- count
- inclusive
- (or (< extbeg beg) (> extend end))
- t)))))))
- (t
- (evil-select-block #'(lambda (&optional cnt)
- (evil-up-block open close cnt))
- beg end type count inclusive))))
-
-(defun evil-select-quote-thing (thing beg end _type count &optional inclusive)
- "Selection THING as if it described a quoted object.
-THING is typically either 'evil-quote or 'evil-chars. This
-function is called from `evil-select-quote'."
- (save-excursion
- (let* ((count (or count 1))
- (dir (if (> count 0) 1 -1))
- (bnd (let ((b (bounds-of-thing-at-point thing)))
- (and b (< (point) (cdr b)) b)))
- addcurrent
- wsboth)
- (if inclusive (setq inclusive t)
- (when (= (abs count) 2)
- (setq count dir)
- (setq inclusive 'quote-only))
- ;; never extend with exclusive selection
- (setq beg nil end nil))
- ;; check if the previously selected range does not contain a
- ;; string
- (unless (and beg end
- (save-excursion
- (goto-char (if (> dir 0) beg end))
- (forward-thing thing dir)
- (and (<= beg (point)) (< (point) end))))
- ;; if so forget the range
- (setq beg nil end nil))
- ;; check if there is a current object, if not fetch one
- (when (not bnd)
- (unless (and (zerop (forward-thing thing dir))
- (setq bnd (bounds-of-thing-at-point thing)))
- (error "No quoted string found"))
- (if (> dir 0)
- (setq end (point))
- (setq beg (point)))
- (setq addcurrent t))
- ;; check if current object is not selected
- (when (or (not beg) (not end) (> beg (car bnd)) (< end (cdr bnd)))
- ;; if not, enlarge selection
- (when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd)))
- (when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd)))
- (setq addcurrent t wsboth t))
- ;; maybe count current element
- (when addcurrent
- (setq count (if (> dir 0) (1- count) (1+ count))))
- ;; enlarge selection
- (goto-char (if (> dir 0) end beg))
- (when (and (not addcurrent)
- (= count (forward-thing thing count)))
- (error "No quoted string found"))
- (if (> dir 0) (setq end (point)) (setq beg (point)))
- ;; add whitespace
- (cond
- ((not inclusive) (setq beg (1+ beg) end (1- end)))
- ((not (eq inclusive 'quote-only))
- ;; try to add whitespace in forward direction
- (goto-char (if (> dir 0) end beg))
- (if (setq bnd (bounds-of-thing-at-point 'evil-space))
- (if (> dir 0) (setq end (cdr bnd)) (setq beg (car bnd)))
- ;; if not found try backward direction
- (goto-char (if (> dir 0) beg end))
- (if (and wsboth (setq bnd (bounds-of-thing-at-point 'evil-space)))
- (if (> dir 0) (setq beg (car bnd)) (setq end (cdr bnd)))))))
- (evil-range beg end
- ;; HACK: fixes #583
- ;; When not in visual state, an empty range is
- ;; possible. However, this cannot be achieved with
- ;; inclusive ranges, hence we use exclusive ranges
- ;; in this case. In visual state the range must be
- ;; inclusive because otherwise the selection would
- ;; be wrong.
- (if (evil-visual-state-p) 'inclusive 'exclusive)
- :expanded t))))
-
-(defun evil-select-quote (quote beg end type count &optional inclusive)
- "Return a range (BEG END) of COUNT quoted text objects.
-QUOTE specifies the quotation delimiter. BEG END TYPE are the
-currently selected (visual) range.
-
-If INCLUSIVE is nil the previous selection is ignore. If there is
-quoted string at point this object will be selected, otherwise
-the following (if (> COUNT 0)) or preceeding object (if (< COUNT
-0)) is selected. If (/= (abs COUNT) 2) the delimiting quotes are not
-contained in the range, otherwise they are contained in the range.
-
-If INCLUSIVE is non-nil the selection depends on the previous
-selection. If the currently selection contains at least one
-character that is contained in a quoted string then the selection
-is extended, otherwise it is thrown away. If there is a
-non-selected object at point then this object is added to the
-selection. Otherwise the selection is extended to the
-following (if (> COUNT 0)) or preceeding object (if (< COUNT
-0)). Any whitespace following (or preceeding if (< COUNT 0)) the
-new selection is added to the selection. If no such whitespace
-exists and the selection contains only one quoted string then the
-preceeding (or following) whitespace is added to the range. "
- (let ((evil-forward-quote-char quote))
- (or (let ((bnd (or (bounds-of-thing-at-point 'evil-comment)
- (bounds-of-thing-at-point 'evil-string))))
- (when (and bnd (< (point) (cdr bnd))
- (/= (char-after (car bnd)) quote)
- (/= (char-before (cdr bnd)) quote))
- (evil-with-restriction (car bnd) (cdr bnd)
- (condition-case nil
- (evil-select-quote-thing 'evil-quote-simple
- beg end type
- count
- inclusive)
- (error nil)))))
- (let ((evil-forward-quote-char quote))
- (evil-select-quote-thing 'evil-quote
- beg end type
- count
- inclusive)))))
-
-(defun evil-select-xml-tag (beg end type &optional count inclusive)
- "Return a range (BEG END) of COUNT matching XML tags.
-If INCLUSIVE is non-nil, the tags themselves are included
-from the range."
- (cond
- ((and (not inclusive) (= (abs (or count 1)) 1))
- (let ((rng (evil-select-block #'evil-up-xml-tag beg end type count nil t)))
- (if (or (and beg (= beg (evil-range-beginning rng))
- end (= end (evil-range-end rng)))
- (= (evil-range-beginning rng) (evil-range-end rng)))
- (evil-select-block #'evil-up-xml-tag beg end type count t)
- rng)))
- (t
- (evil-select-block #'evil-up-xml-tag beg end type count inclusive))))
-
-(defun evil-expand-range (range &optional copy)
- "Expand RANGE according to its type.
-Return a new range if COPY is non-nil."
- (when copy
- (setq range (evil-copy-range range)))
- (unless (plist-get (evil-range-properties range) :expanded)
- (setq range (evil-transform-range :expand range)))
- range)
-
-(defun evil-contract-range (range &optional copy)
- "Contract RANGE according to its type.
-Return a new range if COPY is non-nil."
- (evil-transform-range :contract range copy))
-
-(defun evil-normalize-range (range &optional copy)
- "Normalize RANGE according to its type.
-Return a new range if COPY is non-nil."
- (evil-transform-range :normalize range copy))
-
-(defun evil-transform-range (transform range &optional copy)
- "Apply TRANSFORM to RANGE according to its type.
-Return a new range if COPY is non-nil."
- (when copy
- (setq range (evil-copy-range range)))
- (when (evil-type range)
- (apply #'evil-set-range range
- (apply #'evil-transform transform range)))
- range)
-
-(defun evil-describe-range (range)
- "Return description of RANGE.
-If no description is available, return the empty string."
- (apply #'evil-describe range))
-
-;;; Undo
-
-(defun evil-start-undo-step (&optional continue)
- "Start a undo step.
-All following buffer modifications are grouped together as a
-single action. If CONTINUE is non-nil, preceding modifications
-are included. The step is terminated with `evil-end-undo-step'."
- (when (and (listp buffer-undo-list)
- (not evil-in-single-undo))
- (if evil-undo-list-pointer
- (evil-refresh-undo-step)
- (unless (or continue (null (car-safe buffer-undo-list)))
- (undo-boundary))
- (setq evil-undo-list-pointer (or buffer-undo-list t)))))
-
-(defun evil-end-undo-step (&optional continue)
- "End a undo step started with `evil-start-undo-step'.
-Adds an undo boundary unless CONTINUE is specified."
- (when (and (listp buffer-undo-list)
- evil-undo-list-pointer
- (not evil-in-single-undo))
- (evil-refresh-undo-step)
- (unless (or continue (null (car-safe buffer-undo-list)))
- (undo-boundary))
- (setq evil-undo-list-pointer nil)))
-
-(defun evil-refresh-undo-step ()
- "Refresh `buffer-undo-list' entries for current undo step.
-Undo boundaries until `evil-undo-list-pointer' are removed to
-make the entries undoable as a single action. See
-`evil-start-undo-step'."
- (when evil-undo-list-pointer
- (setq buffer-undo-list
- (evil-filter-list #'null buffer-undo-list evil-undo-list-pointer))
- (setq evil-undo-list-pointer (or buffer-undo-list t))))
-
-(defmacro evil-with-undo (&rest body)
- "Execute BODY with enabled undo.
-If undo is disabled in the current buffer, the undo information
-is stored in `evil-temporary-undo' instead of `buffer-undo-list'."
- (declare (indent defun)
- (debug t))
- `(unwind-protect
- (let (buffer-undo-list)
- (unwind-protect
- (progn ,@body)
- (setq evil-temporary-undo buffer-undo-list)
- ;; ensure evil-temporary-undo starts with exactly one undo
- ;; boundary marker, i.e. nil
- (unless (null (car-safe evil-temporary-undo))
- (push nil evil-temporary-undo))))
- (unless (eq buffer-undo-list t)
- ;; undo is enabled, so update the global buffer undo list
- (setq buffer-undo-list
- ;; prepend new undos (if there are any)
- (if (cdr evil-temporary-undo)
- (nconc evil-temporary-undo buffer-undo-list)
- buffer-undo-list)
- evil-temporary-undo nil))))
-
-(defmacro evil-with-single-undo (&rest body)
- "Execute BODY as a single undo step."
- (declare (indent defun)
- (debug t))
- `(let (evil-undo-list-pointer)
- (evil-with-undo
- (unwind-protect
- (progn
- (evil-start-undo-step)
- (let ((evil-in-single-undo t))
- ,@body))
- (evil-end-undo-step)))))
-
-(defun evil-undo-pop ()
- "Undo the last buffer change.
-Removes the last undo information from `buffer-undo-list'.
-If undo is disabled in the current buffer, use the information
-in `evil-temporary-undo' instead."
- (let ((paste-undo (list nil)))
- (let ((undo-list (if (eq buffer-undo-list t)
- evil-temporary-undo
- buffer-undo-list)))
- (when (or (not undo-list) (car undo-list))
- (user-error "Can't undo previous change"))
- (while (and undo-list (null (car undo-list)))
- (pop undo-list)) ; remove nil
- (while (and undo-list (car undo-list))
- (push (pop undo-list) paste-undo))
- (let ((buffer-undo-list (nreverse paste-undo)))
- (evil-save-echo-area
- (undo)))
- (if (eq buffer-undo-list t)
- (setq evil-temporary-undo nil)
- (setq buffer-undo-list undo-list)))))
-
-;;; Search
-(defun evil-transform-regexp (regexp replacements-alist)
- (replace-regexp-in-string
- "\\\\+[^\\\\]"
- #'(lambda (txt)
- (let* ((b (match-beginning 0))
- (e (match-end 0))
- (ch (aref txt (1- e)))
- (repl (assoc ch replacements-alist)))
- (if (and repl (zerop (mod (length txt) 2)))
- (concat (substring txt b (- e 2))
- (cdr repl))
- txt)))
- regexp nil t))
-
-(defun evil-transform-magic (str magic quote transform &optional _start)
- "Transforms STR with magic characters.
-MAGIC is a regexp that matches all potential magic
-characters. Each occurence of CHAR as magic character within str
-is replaced by the result of calling the associated TRANSFORM
-function. TRANSFORM is a function taking two arguments, the
-character to be transformed and the rest of string after the
-character. The function should return a triple (REPLACEMENT REST
-. STOP) where REPLACEMENT is the replacement and REST is the rest
-of the string that has not been transformed. If STOP is non-nil
-then the substitution stops immediately. The replacement starts
-at position START, everything before that position is returned
-literally. The result is a pair (RESULT . REST). RESULT is a
-list containing the transformed parts in order. If two
-subsequents parts are both strings, they are concatenated. REST
-is the untransformed rest string (usually \"\" but may be more if
-TRANSFORM stopped the substitution). Which characters are
-considered as magic characters (i.e. the transformation happens
-if the character is NOT preceeded by a backslash) is determined
-by `evil-magic'. The special tokens \\v, \\V, \\m and \\M have
-always a special meaning (like in Vim) and should not be
-contained in TRANSFORMS, otherwise their meaning is overwritten.
-
-The parameter QUOTE is a quoting function applied to literal
-transformations, usually `regexp-quote' or `replace-quote'."
- (save-match-data
- (let ((regexp (concat "\\(?:\\`\\|[^\\]\\)\\(\\\\\\(?:\\(" magic "\\)\\|\\(.\\)\\)\\|\\(" magic "\\)\\)"))
- (magic-chars (evil-get-magic evil-magic))
- (evil-magic evil-magic)
- (quote (or quote #'identity))
- result stop)
- (while (and (not stop) str (string-match regexp str))
- (unless (zerop (match-beginning 1))
- (push (substring str 0 (match-beginning 1)) result))
- (let ((char (or (match-string 2 str)
- (match-string 3 str)
- (match-string 4 str)))
- (rest (substring str (match-end 0))))
- (cond
- ((match-beginning 4)
- ;; magic character without backslash
- (if (string-match magic-chars char)
- ;; magic, do transform
- (let ((trans (funcall transform (aref char 0) rest)))
- (push (car trans) result)
- (setq str (cadr trans) stop (nthcdr 2 trans)))
- ;; non-magic, literal transformation
- (push (funcall quote char) result)
- (setq str rest)))
- ((match-beginning 2)
- ;; magic character with backslash
- (if (not (string-match magic-chars char))
- ;; non-magic, do transform
- (let ((trans (funcall transform (aref char 0) rest)))
- (push (car trans) result)
- (setq str (cadr trans) stop (nthcdr 2 trans)))
- ;; magic, literal transformation
- (push (funcall quote char) result)
- (setq str rest)))
- ((memq (aref char 0) '(?m ?M ?v ?V))
- (setq evil-magic (cdr (assq (aref char 0)
- '((?m . t)
- (?M . nil)
- (?v . very-magic)
- (?V . very-nomagic)))))
- (setq magic-chars (evil-get-magic evil-magic))
- (setq str rest))
- (t
- ;; non-magic char with backslash, literal transformation
- (push (funcall quote char) result)
- (setq str rest)))))
- (cond
- ((and str (not stop))
- (push str result)
- (setq str ""))
- ((not str)
- (setq str "")))
- ;; concatenate subsequent strings
- ;; note that result is in reverse order
- (let (repl)
- (while result
- (cond
- ((and (stringp (car result))
- (zerop (length (car result))))
- (pop result))
- ((and (stringp (car result))
- (stringp (cadr result)))
- (setq result (cons (concat (cadr result)
- (car result))
- (nthcdr 2 result))))
- (t
- (push (pop result) repl))))
- (cons repl str)))))
-
-(defconst evil-vim-regexp-replacements
- '((?n . "\n") (?r . "\r")
- (?t . "\t") (?b . "\b")
- (?s . "[[:space:]]") (?S . "[^[:space:]]")
- (?d . "[[:digit:]]") (?D . "[^[:digit:]]")
- (?x . "[[:xdigit:]]") (?X . "[^[:xdigit:]]")
- (?o . "[0-7]") (?O . "[^0-7]")
- (?a . "[[:alpha:]]") (?A . "[^[:alpha:]]")
- (?l . "[a-z]") (?L . "[^a-z]")
- (?u . "[A-Z]") (?U . "[^A-Z]")
- (?y . "\\s") (?Y . "\\S")
- (?\( . "\\(") (?\) . "\\)")
- (?{ . "\\{") (?} . "\\}")
- (?\[ . "[") (?\] . "]")
- (?< . "\\<") (?> . "\\>")
- (?_ . "\\_")
- (?* . "*") (?+ . "+")
- (?? . "?") (?= . "?")
- (?. . ".")
- (?` . "`") (?^ . "^")
- (?$ . "$") (?| . "\\|")))
-
-(defconst evil-regexp-magic "[][(){}<>_dDsSxXoOaAlLuUwWyY.*+?=^$`|nrtb]")
-
-(defun evil-transform-vim-style-regexp (regexp)
- "Transforms vim-style backslash codes to Emacs regexp.
-This includes the backslash codes \\d, \\D, \\s, \\S, \\x, \\X,
-\\o, \\O, \\a, \\A, \\l, \\L, \\u, \\U and \\w, \\W. The new
-codes \\y and \\Y can be used instead of the Emacs code \\s and
-\\S which have a different meaning in Vim-style."
- (car
- (car
- (evil-transform-magic
- regexp evil-regexp-magic #'regexp-quote
- #'(lambda (char rest)
- (let ((repl (assoc char evil-vim-regexp-replacements)))
- (if repl
- (list (cdr repl) rest)
- (list (concat "\\" (char-to-string char)) rest))))))))
-
-;;; Substitute
-
-(defun evil-downcase-first (str)
- "Return STR with the first letter downcased."
- (if (zerop (length str))
- str
- (concat (downcase (substring str 0 1))
- (substring str 1))))
-
-(defun evil-upcase-first (str)
- "Return STR with the first letter upcased."
- (if (zerop (length str))
- str
- (concat (upcase (substring str 0 1))
- (substring str 1))))
-
-(defun evil-get-magic (magic)
- "Returns a regexp matching the magic characters according to MAGIC.
-Depending on the value of MAGIC the following characters are
-considered magic.
- t [][{}*+?.&~$^
- nil [][{}*+?$^
- 'very-magic not 0-9A-Za-z_
- 'very-nomagic empty."
- (cond
- ((eq magic t) "[][}{*+?.&~$^]")
- ((eq magic 'very-magic) "[^0-9A-Za-z_]")
- ((eq magic 'very-nomagic) "\\\\")
- (t "[][}{*+?$^]")))
-
-;; TODO: support magic characters in patterns
-(defconst evil-replacement-magic "[eElLuU0-9&#,rnbt=]"
- "All magic characters in a replacement string")
-
-(defun evil-compile-subreplacement (to &optional start)
- "Convert a regexp replacement TO to Lisp from START until \\e or \\E.
-Returns a pair (RESULT . REST). RESULT is a list suitable for
-`perform-replace' if necessary, the original string if not.
-REST is the unparsed remainder of TO."
- (let ((result
- (evil-transform-magic
- to evil-replacement-magic #'replace-quote
- #'(lambda (char rest)
- (cond
- ((eq char ?#)
- (list '(number-to-string replace-count) rest))
- ((eq char ?r) (list "\r" rest))
- ((eq char ?n) (list "\n" rest))
- ((eq char ?b) (list "\b" rest))
- ((eq char ?t) (list "\t" rest))
- ((memq char '(?e ?E))
- `("" ,rest . t))
- ((memq char '(?l ?L ?u ?U))
- (let ((result (evil-compile-subreplacement rest))
- (func (cdr (assoc char
- '((?l . evil-downcase-first)
- (?L . downcase)
- (?u . evil-upcase-first)
- (?U . upcase))))))
- (list `(,func
- (replace-quote
- (evil-match-substitute-replacement
- ,(car result)
- (not case-replace))))
- (cdr result))))
- ((eq char ?=)
- (when (or (zerop (length rest))
- (not (eq (aref rest 0) ?@)))
- (user-error "Expected @ after \\="))
- (when (< (length rest) 2)
- (user-error "Expected register after \\=@"))
- (list (evil-get-register (aref rest 1))
- (substring rest 2)))
- ((eq char ?,)
- (let* ((obj (read-from-string rest))
- (result `(replace-quote ,(car obj)))
- (end
- ;; swallow a space after a symbol
- (if (and (or (symbolp (car obj))
- ;; swallow a space after 'foo,
- ;; but not after (quote foo)
- (and (eq (car-safe (car obj)) 'quote)
- (not (= ?\( (aref rest 0)))))
- (eq (string-match " " rest (cdr obj))
- (cdr obj)))
- (1+ (cdr obj))
- (cdr obj))))
- (list result (substring rest end))))
- ((eq char ?0)
- (list "\\&" rest))
- (t
- (list (concat "\\" (char-to-string char)) rest))))
- start)))
- (let ((rest (cdr result))
- (result (car result)))
- (replace-match-string-symbols result)
- (cons (if (cdr result)
- (cons 'concat result)
- (or (car result) ""))
- rest))))
-
-(defun evil-compile-replacement (to)
- "Maybe convert a regexp replacement TO to Lisp.
-Returns a list suitable for `perform-replace' if necessary, the
-original string if not. Currently the following magic characters
-in replacements are supported: 0-9&#lLuUrnbt,
-The magic character , (comma) start an Emacs-lisp expression."
- (when (stringp to)
- (save-match-data
- (cons 'replace-eval-replacement
- (car (evil-compile-subreplacement to))))))
-
-(defun evil-replace-match (replacement &optional fixedcase string)
- "Replace text match by last search with REPLACEMENT.
-If REPLACEMENT is an expression it will be evaluated to compute
-the replacement text, otherwise the function behaves as
-`replace-match'."
- (if (stringp replacement)
- (replace-match replacement fixedcase nil string)
- (replace-match (funcall (car replacement)
- (cdr replacement)
- 0)
- fixedcase nil string)))
-
-(defun evil-match-substitute-replacement (replacement &optional fixedcase string)
- "Return REPLACEMENT as it will be inserted by `evil-replace-match'."
- (if (stringp replacement)
- (match-substitute-replacement replacement fixedcase nil string)
- (match-substitute-replacement (funcall (car replacement)
- (cdr replacement)
- 0)
- fixedcase nil string)))
-
-;;; Alignment
-
-(defun evil-justify-lines (beg end justify position)
- "Justifes all lines in a range.
-BEG and END specify the range of those lines to be
-justified. JUSTIFY is either 'left, 'right or 'center according
-to the justification type. POSITION is the maximal text width for
-right and center justification or the column at which the lines
-should be left-aligned for left justification."
- (let ((fill-column position)
- adaptive-fill-mode fill-prefix)
- (evil-with-restriction
- (save-excursion
- (goto-char beg)
- (line-beginning-position))
- (save-excursion
- (goto-char end)
- (if (bolp)
- (line-end-position 0)
- (line-end-position)))
- (goto-char (point-min))
- (while (progn
- (if (eq justify 'left)
- (indent-line-to position)
- (when (re-search-forward "^[[:space:]]*" nil t)
- (delete-region (match-beginning 0)
- (match-end 0)))
- (justify-current-line justify nil t))
- (and (zerop (forward-line)) (bolp))))
- (goto-char (point-min))
- (back-to-indentation))))
-
-;;; View helper
-
-(defvar-local evil-list-view-select-action nil)
-(put 'evil-list-view-select-action 'permanent-local t)
-
-(define-derived-mode evil-list-view-mode tabulated-list-mode
- "Evil List View"
- (tabulated-list-init-header)
- (tabulated-list-print))
-
-(defun evil-list-view-goto-entry ()
- (interactive)
- (when (and evil-list-view-select-action
- (not (eobp)))
- (let* ((line (line-number-at-pos (point)))
- (entry (elt tabulated-list-entries (1- line))))
- (funcall evil-list-view-select-action (nth 1 entry)))))
-
-(defun evil-list-view-quit ()
- (interactive)
- (quit-window 'kill))
-
-(define-key evil-list-view-mode-map (kbd "q") #'evil-list-view-quit)
-(define-key evil-list-view-mode-map [follow-link] nil) ;; allows mouse-1 to be activated
-(define-key evil-list-view-mode-map [mouse-1] #'evil-list-view-goto-entry)
-(define-key evil-list-view-mode-map [return] #'evil-list-view-goto-entry)
-
-(defmacro evil-with-view-list (&rest properties)
- "Opens new list view buffer.
-
-PROPERTIES is a property-list which supports the following properties:
-
-:name (required) The name of the buffer.
-:mode-name (required) The name for the mode line.
-:format (required) The value for `tabulated-list-format'.
-:entries (required) The value for `tabulated-list-entries'.
-:select-action (optional) A function for row selection.
- It takes in a single parameter, which is the selected row's
- vector value that is passed into `:entries'.
-"
- (declare (indent defun) (debug t))
- `(let ((bufname (concat "*" ,(plist-get properties :name) "*"))
- (inhibit-read-only t))
- (and (get-buffer bufname)
- (kill-buffer bufname))
- (let ((buf (get-buffer-create bufname)))
- (with-current-buffer buf
- (setq tabulated-list-format ,(plist-get properties :format))
- (setq tabulated-list-entries ,(plist-get properties :entries))
- (setq evil-list-view-select-action ,(plist-get properties :select-action))
- (evil-list-view-mode)
- (setq mode-name ,(plist-get properties :mode-name))
- (evil-motion-state))
- (switch-to-buffer-other-window buf))))
-
-(provide 'evil-common)
-
-;;; evil-common.el ends here
diff --git a/elpa/evil-20200718.842/evil-core.el b/elpa/evil-20200718.842/evil-core.el
deleted file mode 100644
index 17ee04c..0000000
--- a/elpa/evil-20200718.842/evil-core.el
+++ /dev/null
@@ -1,1392 +0,0 @@
-;;; evil-core.el --- Core functionality -*- lexical-binding: t -*-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Evil is defined as a globalized minor mode, enabled with the toggle
-;; function `evil-mode'. This in turn enables `evil-local-mode' in
-;; every buffer, which sets up the buffer's state.
-;;
-;; Each state has its own keymaps, and these keymaps have status as
-;; "emulation keymaps" with priority over regular keymaps. Emacs
-;; maintains the following keymap hierarchy (highest priority first):
-;;
-;; * Overriding keymaps/overlay keymaps...
-;; * Emulation mode keymaps...
-;; - Evil keymaps...
-;; * Minor mode keymaps...
-;; * Local keymap (`local-set-key')
-;; * Global keymap (`global-set-key')
-;;
-;; Within this hierarchy, Evil arranges the keymaps for the current
-;; state as shown below:
-;;
-;; * Intercept keymaps...
-;; * Local state keymap
-;; * Minor-mode keymaps...
-;; * Auxiliary keymaps...
-;; * Overriding keymaps...
-;; * Global state keymap
-;; * Keymaps for other states...
-;;
-;; These keymaps are listed in `evil-mode-map-alist', which is listed
-;; in `emulation-mode-map-alist'.
-;;
-;; Most of the key bindings for a state are stored in its global
-;; keymap, which has a name such as `evil-normal-state-map'. (See the
-;; file evil-maps.el, which contains all the default key bindings.) A
-;; state also has a local keymap (`evil-normal-state-local-map'),
-;; which may contain user customizations for the current buffer.
-;; Furthermore, any Emacs mode may be assigned state bindings of its
-;; own by passing the mode's keymap to the function `evil-define-key'
-;; or `evil-define-minor-mode-key'. The former uses a specific map to
-;; define the key in while the latter associates the key with a
-;; particular mode. These mode-specific bindings are ultimately stored
-;; in so-called auxiliary and minor-mode keymaps respectively, which
-;; are sandwiched between the local keymap and the global keymap.
-;; Finally, the state may also activate the keymaps of other states
-;; (e.g., Normal state inherits bindings from Motion state).
-;;
-;; For integration purposes, a regular Emacs keymap may be "elevated"
-;; to emulation status by passing it to `evil-make-intercept-map' or
-;; `evil-make-overriding-map'. An "intercept" keymap has priority over
-;; all other Evil keymaps. (Evil uses this facility when debugging and
-;; for handling the "ESC" key in the terminal.) More common is the
-;; "overriding" keymap, which only has priority over the global state
-;; keymap. (This is useful for adapting key-heavy modes such as Dired,
-;; where all but a few keys should be left as-is and should not be
-;; shadowed by Evil's default bindings.)
-;;
-;; States are defined with the macro `evil-define-state', which
-;; creates a command for switching to the state. This command,
-;; for example `evil-normal-state' for Normal state, performs
-;; the following tasks:
-;;
-;; * Setting `evil-state' to the new state.
-;; * Refreshing the keymaps in `evil-mode-map-alist'.
-;; * Updating the mode line.
-;; - Normal state depends on `evil-normal-state-tag'.
-;; * Adjusting the cursor's appearance.
-;; - Normal state depends on `evil-normal-state-cursor'.
-;; * Displaying a message in the echo area.
-;; - Normal state depends on `evil-normal-state-message'.
-;; * Running hooks.
-;; - Normal state runs `evil-normal-state-entry-hook' when
-;; entering, and `evil-normal-state-exit-hook' when exiting.
-;;
-;; The various properties of a state can be accessed through their
-;; respective variables, or by passing a keyword and the state's name
-;; to the `evil-state-property' function. Evil defines the states
-;; Normal state ("normal"), Insert state ("insert"), Visual state
-;; ("visual"), Replace state ("replace"), Operator-Pending state
-;; ("operator"), Motion state ("motion") and Emacs state ("emacs").
-
-(require 'evil-common)
-
-;;; Code:
-
-(declare-function evil-emacs-state-p "evil-states")
-(declare-function evil-ex-p "evil-ex")
-(defvar evil-mode-buffers)
-
-(define-minor-mode evil-local-mode
- "Minor mode for setting up Evil in a single buffer."
- :init-value nil
- (cond
- ((evil-disabled-buffer-p)
- ;; Don't leave the mode variable on in buffers where evil disabled, because
- ;; functions that check this variable will get an incorrect result (e.g.,
- ;; evil-refresh-cursor).
- (setq evil-local-mode nil))
- (evil-local-mode
- (setq emulation-mode-map-alists
- (evil-concat-lists '(evil-mode-map-alist)
- emulation-mode-map-alists))
- (evil-initialize-local-keymaps)
- ;; restore the proper value of `major-mode' in Fundamental buffers
- (when (eq major-mode 'turn-on-evil-mode)
- (setq major-mode 'fundamental-mode))
- (when (minibufferp)
- (setq-local evil-default-state 'insert)
- (setq-local evil-echo-state nil))
- ;; The initial state is usually setup by `evil-initialize' when
- ;; the major-mode in a buffer changes. This preliminary
- ;; initialization is only for the case when `evil-local-mode' is
- ;; called directly for the first time in a buffer.
- (unless evil-state (evil-initialize-state))
- (add-hook 'input-method-activate-hook 'evil-activate-input-method t t)
- (add-hook 'input-method-deactivate-hook 'evil-deactivate-input-method t t)
- (add-hook 'activate-mark-hook 'evil-visual-activate-hook nil t)
- (add-hook 'pre-command-hook 'evil-repeat-pre-hook)
- (add-hook 'post-command-hook 'evil-repeat-post-hook))
- (t
- (evil-refresh-mode-line)
- (remove-hook 'activate-mark-hook 'evil-visual-activate-hook t)
- (remove-hook 'input-method-activate-hook 'evil-activate-input-method t)
- (remove-hook 'input-method-deactivate-hook 'evil-deactivate-input-method t)
- (evil-change-state nil))))
-
-;; Make the variable permanent local. This is particular useful in
-;; conjunction with nXhtml/mumamo because mumamo does not touch these
-;; variables.
-(put 'evil-local-mode 'permanent-local t)
-
-(defun turn-on-evil-mode (&optional arg)
- "Turn on Evil in the current buffer."
- (interactive)
- (evil-local-mode (or arg 1)))
-
-(defun turn-off-evil-mode (&optional arg)
- "Turn off Evil in the current buffer."
- (interactive)
- (evil-local-mode (or arg -1)))
-
-;; The function `evil-initialize' should only be used to initialize
-;; `evil-local-mode' from the globalized minor-mode `evil-mode'. It is
-;; called whenever evil is enabled in a buffer for the first time or
-;; when evil is active and the major-mode of the buffer changes. In
-;; addition to enabling `evil-local-mode' it also sets the initial
-;; evil-state according to the major-mode.
-(defun evil-initialize ()
- "Enable Evil in the current buffer, if appropriate.
-To enable Evil globally, do (evil-mode 1)."
- (unless (and (minibufferp) (not evil-want-minibuffer))
- (evil-local-mode 1)
- (evil-initialize-state)))
-
-;;;###autoload (autoload 'evil-mode "evil" nil t)
-(define-globalized-minor-mode evil-mode
- evil-local-mode evil-initialize)
-
-;; No hooks are run in Fundamental buffers, so other measures are
-;; necessary to initialize Evil in these buffers. When Evil is
-;; enabled globally, the default value of `major-mode' is set to
-;; `turn-on-evil-mode', so that Evil is enabled in Fundamental
-;; buffers as well. Then, the buffer-local value of `major-mode' is
-;; changed back to `fundamental-mode'. (Since the `evil-mode' function
-;; is created by a macro, we use `defadvice' to augment it.)
-(defadvice evil-mode (after start-evil activate)
- "Enable Evil in Fundamental mode."
- (if evil-mode
- (progn
- (when (eq (default-value 'major-mode) 'fundamental-mode)
- ;; changed back by `evil-local-mode'
- (setq-default major-mode 'turn-on-evil-mode))
- (ad-enable-regexp "^evil")
- (ad-activate-regexp "^evil")
- (with-no-warnings (evil-esc-mode 1)))
- (when (eq (default-value 'major-mode) 'turn-on-evil-mode)
- (setq-default major-mode 'fundamental-mode))
- (ad-disable-regexp "^evil")
- (ad-update-regexp "^evil")
- (with-no-warnings (evil-esc-mode -1))))
-
-(defun evil-change-state (state &optional message)
- "Change the state to STATE.
-If STATE is nil, disable all states."
- (let ((func (evil-state-property (or state evil-state) :toggle)))
- (when (and (functionp func)
- (or message (not (eq state evil-state))))
- (funcall func (if state (and message 1) -1)))))
-
-(defmacro evil-save-state (&rest body)
- "Save the current state; execute BODY; restore the state."
- (declare (indent defun)
- (debug t))
- `(let* ((evil-state evil-state)
- (evil-previous-state evil-previous-state)
- (evil-previous-state-alist (copy-tree evil-previous-state-alist))
- (evil-next-state evil-next-state)
- (old-state evil-state)
- (inhibit-quit t)
- (buf (current-buffer)))
- (unwind-protect
- (progn ,@body)
- (when (buffer-live-p buf)
- (with-current-buffer buf
- (evil-change-state old-state))))))
-
-(defmacro evil-with-state (state &rest body)
- "Change to STATE and execute BODY without refreshing the display.
-Restore the previous state afterwards."
- (declare (indent defun)
- (debug t))
- `(evil-without-display
- (evil-save-state
- (evil-change-state ',state)
- ,@body)))
-
-(defun evil-initializing-p (&optional buffer)
- "Whether Evil is in the process of being initialized."
- (memq (or buffer (current-buffer)) evil-mode-buffers))
-
-(defun evil-initialize-state (&optional state buffer)
- "Set up the initial state for BUFFER.
-BUFFER defaults to the current buffer.
-Uses STATE if specified, or calls `evil-initial-state-for-buffer'.
-See also `evil-set-initial-state'."
- (with-current-buffer (or buffer (current-buffer))
- (if state (evil-change-state state)
- (evil-change-to-initial-state buffer))))
-(put 'evil-initialize-state 'permanent-local-hook t)
-
-(defun evil-initial-state-for-buffer-name (&optional name default)
- "Return the initial Evil state to use for a buffer with name NAME.
-Matches the name against the regular expressions in
-`evil-buffer-regexps'. If none matches, returns DEFAULT."
- (let ((name (if (stringp name) name (buffer-name name)))
- regexp state)
- (when (stringp name)
- (catch 'done
- (dolist (entry evil-buffer-regexps default)
- (setq regexp (car entry)
- state (cdr entry))
- (when (string-match regexp name)
- (throw 'done state)))))))
-
-(defun evil-disabled-buffer-p (&optional buffer)
- "Whether Evil should be disabled in BUFFER."
- (null (evil-initial-state-for-buffer-name buffer 'undefined)))
-
-(defun evil-initial-state-for-buffer (&optional buffer default)
- "Return the initial Evil state to use for BUFFER.
-BUFFER defaults to the current buffer. Returns DEFAULT
-if no initial state is associated with BUFFER.
-See also `evil-initial-state'."
- (with-current-buffer (or buffer (current-buffer))
- (or (evil-initial-state-for-buffer-name (buffer-name))
- (catch 'done
- (dolist (mode minor-mode-map-alist)
- (setq mode (car-safe mode))
- (when (and (boundp mode) (symbol-value mode))
- (when (setq mode (evil-initial-state mode))
- (throw 'done mode)))))
- (evil-initial-state major-mode nil t)
- default)))
-
-(defun evil-initial-state (mode &optional default follow-parent checked-modes)
- "Return the Evil state to use for MODE or its alias.
-Returns DEFAULT if no initial state is associated with MODE.
-The initial state for a mode can be set with
-`evil-set-initial-state'.
-
-If FOLLOW-PARENT is non-nil, also check parent modes of MODE and
-its alias. CHECKED-MODES is used internally and should not be set
-initially."
- (cond
- ((and mode (symbolp mode) (memq mode checked-modes))
- (error "Circular reference detected in ancestors of %s\n%s"
- major-mode checked-modes))
- ((and mode (symbolp mode))
- (let ((mode-alias (let ((func (symbol-function mode)))
- (when (symbolp func)
- func)))
- state modes)
- (or
- (catch 'done
- (dolist (entry (evil-state-property t :modes) default)
- (setq state (car entry)
- modes (symbol-value (cdr entry)))
- (when (or (memq mode modes)
- (and mode-alias
- (memq mode-alias modes)))
- (throw 'done state))))
- (when follow-parent
- (evil-initial-state (get mode 'derived-mode-parent)
- nil t (cons mode checked-modes)))
- (when follow-parent
- (evil-initial-state (get mode-alias 'derived-mode-parent)
- nil t (cons mode-alias checked-modes))))))))
-
-(defun evil-set-initial-state (mode state)
- "Set the initial state for major mode MODE to STATE.
-This is the state the buffer comes up in."
- (dolist (modes (evil-state-property t :modes))
- (setq modes (cdr-safe modes))
- (set modes (delq mode (symbol-value modes))))
- (when state
- (add-to-list (evil-state-property state :modes) mode)))
-
-(evil-define-command evil-change-to-initial-state
- (&optional buffer message)
- "Change the state of BUFFER to its initial state.
-This is the state the buffer came up in. If Evil is not activated
-then this function does nothing."
- :keep-visual t
- :suppress-operator t
- (with-current-buffer (or buffer (current-buffer))
- (when evil-local-mode
- (evil-change-state (evil-initial-state-for-buffer
- buffer (or evil-default-state 'normal))
- message))))
-
-(evil-define-command evil-change-to-previous-state
- (&optional buffer message)
- "Change the state of BUFFER to its previous state."
- :keep-visual t
- :repeat abort
- :suppress-operator t
- (with-current-buffer (or buffer (current-buffer))
- (let ((prev-state evil-previous-state)
- (prev-prev-state (cdr-safe (assoc evil-previous-state
- evil-previous-state-alist))))
- (evil-change-state nil)
- (when prev-prev-state
- (setq evil-previous-state prev-prev-state))
- (evil-change-state (or prev-state evil-default-state 'normal)
- message))))
-
-;; When a buffer is created in a low-level way, it is invisible to
-;; Evil (as well as other globalized minor modes) because no hooks are
-;; run. This is appropriate since many buffers are used for throwaway
-;; purposes. Passing the buffer to `set-window-buffer' indicates
-;; otherwise, though, so advise this function to initialize Evil.
-(defadvice set-window-buffer (before evil)
- "Initialize Evil in the displayed buffer."
- (when evil-mode
- (when (get-buffer (ad-get-arg 1))
- (with-current-buffer (ad-get-arg 1)
- (unless evil-local-mode
- (evil-local-mode 1))))))
-
-;; Refresh cursor color.
-;; Cursor color can only be set for each frame but not for each buffer.
-(add-hook 'window-configuration-change-hook 'evil-refresh-cursor)
-(defadvice select-window (after evil activate)
- (evil-refresh-cursor))
-
-(defun evil-generate-mode-line-tag (&optional state)
- "Generate the evil mode-line tag for STATE."
- (let ((tag (evil-state-property state :tag t)))
- (when (functionp tag)
- (setq tag (funcall tag)))
- ;; prepare mode-line: add tooltip
- (if (stringp tag)
- (propertize tag
- 'help-echo (evil-state-property state :name)
- 'mouse-face 'mode-line-highlight)
- tag)))
-
-(defun evil-refresh-mode-line (&optional state)
- "Refresh mode line tag."
- (when (listp mode-line-format)
- (setq evil-mode-line-tag (evil-generate-mode-line-tag state))
- ;; refresh mode line data structure
- ;; first remove evil from mode-line
- (setq mode-line-format (delq 'evil-mode-line-tag mode-line-format))
- (let ((mlpos mode-line-format)
- pred which where)
- ;; determine before/after which symbol the tag should be placed
- (cond
- ((eq evil-mode-line-format 'before)
- (setq where 'after which 'mode-line-position))
- ((eq evil-mode-line-format 'after)
- (setq where 'after which 'mode-line-modes))
- ((consp evil-mode-line-format)
- (setq where (car evil-mode-line-format)
- which (cdr evil-mode-line-format))))
- ;; find the cons-cell of the symbol before/after which the tag
- ;; should be placed
- (while (and mlpos
- (let ((sym (or (car-safe (car mlpos)) (car mlpos))))
- (not (eq which sym))))
- (setq pred mlpos
- mlpos (cdr mlpos)))
- ;; put evil tag at the right position in the mode line
- (cond
- ((not mlpos)) ;; position not found, so do not add the tag
- ((eq where 'before)
- (if pred
- (setcdr pred (cons 'evil-mode-line-tag mlpos))
- (setq mode-line-format
- (cons 'evil-mode-line-tag mode-line-format))))
- ((eq where 'after)
- (setcdr mlpos (cons 'evil-mode-line-tag (cdr mlpos)))))
- (force-mode-line-update))))
-
-;; input methods should be disabled in non-insertion states
-(defun evil-activate-input-method ()
- "Enable input method in states with :input-method non-nil."
- (let (input-method-activate-hook
- input-method-deactivate-hook)
- (when (and evil-local-mode evil-state)
- (setq evil-input-method current-input-method)
- (unless (evil-state-property evil-state :input-method)
- (deactivate-input-method)))))
-(put 'evil-activate-input-method 'permanent-local-hook t)
-
-(defun evil-deactivate-input-method ()
- "Disable input method in all states."
- (let (input-method-activate-hook
- input-method-deactivate-hook)
- (when (and evil-local-mode evil-state)
- (setq evil-input-method nil))))
-(put 'evil-deactivate-input-method 'permanent-local-hook t)
-
-(defmacro evil-without-input-method-hooks (&rest body)
- "Execute body with evil's activate/deactivate-input-method hooks deactivated.
-
-This allows input methods to be used in normal-state."
- `(unwind-protect
- (progn
- (remove-hook 'input-method-activate-hook 'evil-activate-input-method t)
- (remove-hook 'input-method-deactivate-hook
- 'evil-deactivate-input-method t)
- ,@body)
- (progn
- (add-hook 'input-method-activate-hook 'evil-activate-input-method nil t)
- (add-hook 'input-method-deactivate-hook
- 'evil-deactivate-input-method nil t))))
-
-(defadvice toggle-input-method (around evil)
- "Refresh `evil-input-method'."
- (cond
- ((not evil-local-mode)
- ad-do-it)
- ((evil-state-property evil-state :input-method)
- ad-do-it)
- (t
- (let ((current-input-method evil-input-method))
- ad-do-it))))
-
-;; Local keymaps are implemented using buffer-local variables.
-;; However, unless a buffer-local value already exists,
-;; `define-key' acts on the variable's default (global) value.
-;; So we need to initialize the variable whenever we enter a
-;; new buffer or when the buffer-local values are reset.
-(defun evil-initialize-local-keymaps ()
- "Initialize a buffer-local value for local keymaps as necessary.
-The initial value is that of `make-sparse-keymap'."
- (dolist (entry evil-local-keymaps-alist)
- (let ((map (cdr entry)))
- (unless (and (keymapp (symbol-value map))
- (local-variable-p map))
- (set map (make-sparse-keymap))))))
-
-(defun evil-make-overriding-map (keymap &optional state copy)
- "Give KEYMAP precedence over the global keymap of STATE.
-The keymap will have lower precedence than custom STATE bindings.
-If STATE is nil, give it precedence over all states.
-If COPY is t, create a copy of KEYMAP and give that
-higher precedence. See also `evil-make-intercept-map'."
- (let ((key [override-state]))
- (if (not copy)
- (define-key keymap key (or state 'all))
- (unless (keymapp copy)
- (setq copy (assq-delete-all 'menu-bar (copy-keymap keymap))))
- (define-key copy key (or state 'all))
- (define-key keymap key copy))))
-
-(defun evil-make-intercept-map (keymap &optional state aux)
- "Give KEYMAP precedence over all Evil keymaps in STATE.
-If STATE is nil, give it precedence over all states. If AUX is non-nil, make the
-auxiliary keymap corresponding to KEYMAP in STATE an intercept keymap instead of
-KEYMAP itself. See also `evil-make-overriding-map'."
- (let ((key [intercept-state])
- (keymap (if aux
- (evil-get-auxiliary-keymap keymap state t t)
- keymap)))
- (define-key keymap key (or state 'all))))
-
-(defmacro evil-define-keymap (keymap doc &rest body)
- "Define a keymap KEYMAP listed in `evil-mode-map-alist'.
-That means it will have precedence over regular keymaps.
-
-DOC is the documentation for the variable. BODY, if specified,
-is executed after toggling the mode. Optional keyword arguments
-may be specified before the body code:
-
-:mode VAR Mode variable. If unspecified, the variable
- is based on the keymap name.
-:local BOOLEAN Whether the keymap should be buffer-local, that is,
- reinitialized for each buffer.
-:func BOOLEAN Create a toggle function even if BODY is empty.
-
-\(fn KEYMAP DOC [[KEY VAL]...] BODY...)"
- (declare (indent defun)
- (doc-string 2)
- (debug (&define name
- [&optional stringp]
- [&rest [keywordp sexp]]
- def-body)))
- (let ((func t)
- arg intercept key local mode overriding)
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body))
- (cond
- ((eq key :mode)
- (setq mode arg))
- ((eq key :local)
- (setq local arg))
- ((eq key :func)
- (setq func arg))
- ((eq key :intercept)
- (setq intercept arg))
- ((eq key :overriding)
- (setq overriding arg))))
- (setq mode (or mode
- (intern (replace-regexp-in-string
- "\\(?:-\\(?:mode-\\)?\\(?:key\\)?map\\)?$"
- "-mode"
- (symbol-name keymap)))))
- `(progn
- (defvar ,keymap ,(unless local '(make-sparse-keymap)))
- (unless (get ',keymap 'variable-documentation)
- (put ',keymap 'variable-documentation ,doc))
- (defvar ,mode nil)
- (unless (get ',mode 'variable-documentation)
- (put ',mode 'variable-documentation ,doc))
- (make-variable-buffer-local ',mode)
- (put ',mode 'permanent-local t)
- (when ,intercept
- (evil-make-intercept-map ,keymap))
- (when ,overriding
- (evil-make-overriding-map ,keymap))
- ,@(if local
- `((make-variable-buffer-local ',keymap)
- (put ',keymap 'permanent-local t)
- (evil--add-to-alist 'evil-local-keymaps-alist
- ',mode ',keymap))
- `((evil--add-to-alist 'evil-global-keymaps-alist
- ',mode ',keymap)
- (evil--add-to-alist 'evil-mode-map-alist
- ',mode ,keymap)))
- ,(when (or body func)
- `(defun ,mode (&optional arg)
- ,@(when doc `(,doc))
- (interactive)
- (cond
- ((numberp arg)
- (setq ,mode (> arg 0)))
- (t
- (setq ,mode (not ,mode))))
- ,@body))
- ',keymap)))
-
-;; The ESC -> escape translation code has been provided by Stefan
-;; Monnier in the discussion of GNU Emacs bug #13793.
-(defun evil-esc-mode (&optional arg)
- "Toggle interception of \\e (escape).
-Enable with positive ARG and disable with negative ARG.
-
-When enabled, `evil-esc-mode' modifies the entry of \\e in
-`input-decode-map'. If such an event arrives, it is translated to
-a plain 'escape event if no further event occurs within
-`evil-esc-delay' seconds. Otherwise no translation happens and
-the ESC prefix map (i.e. the map originally bound to \\e in
-`input-decode-map`) is returned."
- (cond
- ((or (null arg) (eq arg 0))
- (evil-esc-mode (if evil-esc-mode -1 +1)))
- ((> arg 0)
- (unless evil-esc-mode
- (setq evil-esc-mode t)
- (add-hook 'after-make-frame-functions #'evil-init-esc)
- (mapc #'evil-init-esc (frame-list))))
- ((< arg 0)
- (when evil-esc-mode
- (remove-hook 'after-make-frame-functions #'evil-init-esc)
- (mapc #'evil-deinit-esc (frame-list))
- (setq evil-esc-mode nil)))))
-
-(defun evil-init-esc (frame)
- "Update `input-decode-map' in terminal."
- (with-selected-frame frame
- (let ((term (frame-terminal frame)))
- (when (and
- (or (eq evil-intercept-esc 'always)
- (and evil-intercept-esc
- (eq (terminal-live-p term) t))) ; only patch tty
- (not (terminal-parameter term 'evil-esc-map)))
- (let ((evil-esc-map (lookup-key input-decode-map [?\e])))
- (set-terminal-parameter term 'evil-esc-map evil-esc-map)
- (define-key input-decode-map [?\e]
- `(menu-item "" ,evil-esc-map :filter ,#'evil-esc)))))))
-
-(defun evil-deinit-esc (frame)
- "Restore `input-decode-map' in terminal."
- (with-selected-frame frame
- (let ((term (frame-terminal frame)))
- (when (terminal-live-p term)
- (let ((evil-esc-map (terminal-parameter term 'evil-esc-map)))
- (when evil-esc-map
- (define-key input-decode-map [?\e] evil-esc-map)
- (set-terminal-parameter term 'evil-esc-map nil)))))))
-
-(defun evil-esc (map)
- "Translate \\e to 'escape if no further event arrives.
-This function is used to translate a \\e event either to 'escape
-or to the standard ESC prefix translation map. If \\e arrives,
-this function waits for `evil-esc-delay' seconds for another
-event. If no other event arrives, the event is translated to
-'escape, otherwise it is translated to the standard ESC prefix
-map stored in `input-decode-map'. If `evil-inhibit-esc' is
-non-nil or if evil is in emacs state, the event is always
-translated to the ESC prefix.
-
-The translation to 'escape happens only if the current command
-has indeed been triggered by \\e. In other words, this will only
-happen when the keymap is accessed from `read-key-sequence'. In
-particular, if it is access from `define-key' the returned
-mapping will always be the ESC prefix map."
- (if (and (not evil-inhibit-esc)
- (or evil-local-mode (evil-ex-p)
- (active-minibuffer-window))
- (not (evil-emacs-state-p))
- (let ((keys (this-single-command-keys)))
- (and (> (length keys) 0)
- (= (aref keys (1- (length keys))) ?\e)))
- (sit-for evil-esc-delay))
- (prog1 [escape]
- (when defining-kbd-macro
- (end-kbd-macro)
- (setq last-kbd-macro (vconcat last-kbd-macro [escape]))
- (start-kbd-macro t t)))
- map))
-
-(defun evil-state-p (sym)
- "Whether SYM is the name of a state."
- (assq sym evil-state-properties))
-
-(defun evil-state-keymaps (state &rest excluded)
- "Return a keymap alist of keymaps activated by STATE.
-If STATE references other states in its :enable property,
-these states are recursively processed and added to the list.
-\(The EXCLUDED argument is an internal safeguard against
-infinite recursion, keeping track of processed states.)"
- (let* ((state (or state evil-state))
- (enable (evil-state-property state :enable))
- (map (cons
- (evil-state-property state :mode)
- (evil-state-property state :keymap t)))
- (local-map (cons
- (evil-state-property state :local)
- (evil-state-property state :local-keymap t)))
- (minor-mode-maps (evil-state-minor-mode-keymaps state))
- (aux-maps (evil-state-auxiliary-keymaps state))
- (overriding-maps
- (evil-state-overriding-keymaps state))
- (intercept-maps
- (evil-state-intercept-keymaps state))
- (result `(,intercept-maps))
- (remove-duplicates (null excluded)))
- (unless (memq state enable)
- (setq enable (cons state enable)))
- ;; process STATE's :enable property
- (dolist (entry enable)
- (cond
- ((memq entry excluded))
- ;; the keymaps for STATE
- ((eq entry state)
- (setq result `(,@result
- (,local-map)
- ,minor-mode-maps
- ,aux-maps
- ,overriding-maps
- (,map)))
- (push state excluded))
- ;; the keymaps for another state: call `evil-state-keymaps'
- ;; recursively, but keep track of processed states
- ((evil-state-p entry)
- (setq result `(,@result
- ,(apply #'evil-state-keymaps entry excluded))))
- ;; a single keymap
- ((or (keymapp entry)
- (and (keymapp (symbol-value entry))
- (setq entry (symbol-value entry)))
- (setq entry (evil-keymap-for-mode entry)))
- (setq result `(,@result
- ((,(evil-mode-for-keymap entry t) .
- ,entry)))))))
- ;; postpone the expensive filtering of duplicates to the top level
- (if remove-duplicates
- (apply #'evil-concat-keymap-alists result)
- (apply #'append result))))
-
-(defun evil-normalize-keymaps (&optional state)
- "Create a buffer-local value for `evil-mode-map-alist'.
-This is a keymap alist, determined by the current state
-\(or by STATE if specified)."
- (let ((state (or state evil-state))
- (excluded '(nil t))
- map mode temp)
- ;; initialize buffer-local keymaps as necessary
- (evil-initialize-local-keymaps)
- ;; deactivate keymaps of previous state
- (dolist (entry evil-mode-map-alist)
- (setq mode (car-safe entry)
- map (cdr-safe entry))
- ;; don't deactivate overriding keymaps;
- ;; they are toggled by their associated mode
- (if (or (memq mode excluded)
- (evil-intercept-keymap-p map)
- (evil-overriding-keymap-p map)
- (evil-auxiliary-keymap-p map)
- (evil-minor-mode-keymap-p map))
- (push mode excluded)
- (when (and (fboundp mode) (symbol-value mode))
- (funcall mode -1))
- (set mode nil)))
- (setq evil-mode-map-alist nil)
- ;; activate keymaps of current state
- (when state
- (setq temp (evil-state-keymaps state))
- (dolist (entry temp)
- (setq mode (car entry)
- map (cdr entry))
- (unless (or (and (boundp mode) (symbol-value mode))
- ;; the minor-mode keymaps include modes that are not
- ;; necessarily active
- (evil-minor-mode-keymap-p map))
- (when (fboundp mode)
- (funcall mode 1))
- (set mode t))
- ;; refresh the keymap in case it has changed
- ;; (e.g., `evil-operator-shortcut-map' is
- ;; reset on toggling)
- (if (or (memq mode excluded)
- (evil-intercept-keymap-p map)
- (evil-overriding-keymap-p map)
- (evil-auxiliary-keymap-p map)
- (evil-minor-mode-keymap-p map))
- (push mode excluded)
- (setcdr entry (or (evil-keymap-for-mode mode) map))))
- ;; update `evil-mode-map-alist'
- (setq evil-mode-map-alist temp))))
-
-(defun evil-mode-for-keymap (keymap &optional default)
- "Return the minor mode associated with KEYMAP.
-Returns DEFAULT if no mode is found.
-See also `evil-keymap-for-mode'."
- (let ((map (if (keymapp keymap) keymap (symbol-value keymap)))
- (var (when (symbolp keymap) keymap)))
- ;; Check Evil variables first for speed purposes.
- ;; If all else fails, check `minor-mode-map-alist'.
- (or (when var
- (or (car (rassq var evil-global-keymaps-alist))
- (car (rassq var evil-local-keymaps-alist))))
- (car (rassq map (mapcar #'(lambda (e)
- ;; from (MODE-VAR . MAP-VAR)
- ;; to (MODE-VAR . MAP)
- (cons (car-safe e)
- (symbol-value (cdr-safe e))))
- (append evil-global-keymaps-alist
- evil-local-keymaps-alist))))
- (car (rassq map minor-mode-map-alist))
- default)))
-
-(defun evil-keymap-for-mode (mode &optional variable)
- "Return the keymap associated with MODE.
-Return the keymap variable if VARIABLE is non-nil.
-See also `evil-mode-for-keymap'."
- (let* ((var (or (cdr (assq mode evil-global-keymaps-alist))
- (cdr (assq mode evil-local-keymaps-alist))))
- (map (or (symbol-value var)
- (cdr (assq mode minor-mode-map-alist)))))
- (if variable var map)))
-
-(defun evil-state-auxiliary-keymaps (state)
- "Return a keymap alist of auxiliary keymaps for STATE."
- (let ((state (or state evil-state))
- aux result)
- (dolist (map (current-active-maps) result)
- (when (setq aux (evil-get-auxiliary-keymap map state))
- (push (cons (evil-mode-for-keymap map t) aux) result)))
- (nreverse result)))
-
-(defun evil-state-minor-mode-keymaps (state)
- "Return a keymap alist of minor-mode keymaps for STATE."
- (let* ((state (or state evil-state))
- (state-entry (assq state evil-minor-mode-keymaps-alist)))
- (when state-entry
- (cdr state-entry))))
-
-(defun evil-state-overriding-keymaps (&optional state)
- "Return a keymap alist of overriding keymaps for STATE."
- (let* ((state (or state evil-state))
- result)
- (dolist (map (current-active-maps))
- (when (setq map (evil-overriding-keymap-p map state))
- (push (cons (evil-mode-for-keymap map t) map) result)))
- (nreverse result)))
-
-(defun evil-state-intercept-keymaps (&optional state)
- "Return a keymap alist of intercept keymaps for STATE."
- (let* ((state (or state evil-state))
- result)
- (dolist (map (current-active-maps))
- (when (setq map (or (evil-intercept-keymap-p map state)
- (evil-intercept-keymap-p
- (evil-get-auxiliary-keymap map state) state)))
- (push (cons (evil-mode-for-keymap map t) map) result)))
- (setq result (nreverse result))
- result))
-
-(defun evil-set-auxiliary-keymap (map state &optional aux)
- "Set the auxiliary keymap for MAP in STATE to AUX.
-If AUX is nil, create a new auxiliary keymap."
- (unless (keymapp aux)
- (setq aux (make-sparse-keymap)))
- (unless (evil-auxiliary-keymap-p aux)
- (evil-set-keymap-prompt
- aux (format "Auxiliary keymap for %s"
- (or (evil-state-property state :name)
- (format "%s state" state)))))
- (define-key map
- (vconcat (list (intern (format "%s-state" state)))) aux)
- aux)
-(put 'evil-set-auxiliary-keymap 'lisp-indent-function 'defun)
-
-(defun evil-get-auxiliary-keymap (map state &optional create ignore-parent)
- "Get the auxiliary keymap for MAP in STATE.
-If CREATE is non-nil, create an auxiliary keymap
-if MAP does not have one. If CREATE and
-IGNORE-PARENT are non-nil then a new auxiliary
-keymap is created even if the parent of MAP has
-one already."
- (when state
- (let* ((key (vconcat (list (intern (format "%s-state" state)))))
- (parent-aux (when (and ignore-parent
- (keymap-parent map)
- state)
- (lookup-key (keymap-parent map) key)))
- (aux (if state (lookup-key map key) map)))
- (cond
- ((and ignore-parent
- (equal parent-aux aux)
- create)
- (evil-set-auxiliary-keymap map state))
- ((evil-auxiliary-keymap-p aux)
- aux)
- (create
- (evil-set-auxiliary-keymap map state))))))
-
-(defun evil-get-minor-mode-keymap (state mode)
- "Get the auxiliary keymap for MODE in STATE, creating one if it
-does not already exist."
- (let ((state-entry (assq state evil-minor-mode-keymaps-alist)))
- (if (and state-entry
- (assq mode state-entry))
- (cdr (assq mode state-entry))
- (let ((map (make-sparse-keymap)))
- (evil-set-keymap-prompt
- map (format "Minor-mode keymap for %s in %s"
- (symbol-name mode)
- (or (evil-state-property state :name)
- (format "%s state" state))))
- (if state-entry
- (setcdr state-entry
- (append (list (cons mode map)) (cdr state-entry)))
- (push (cons state (list (cons mode map)))
- evil-minor-mode-keymaps-alist))
- map))))
-
-(defun evil-auxiliary-keymap-p (map)
- "Whether MAP is an auxiliary keymap."
- (and (keymapp map)
- (string-match-p "Auxiliary keymap"
- (or (keymap-prompt map) "")) t))
-
-(defun evil-minor-mode-keymap-p (map)
- "Whether MAP is a minor-mode keymap."
- (and (keymapp map)
- (string-match-p "Minor-mode keymap"
- (or (keymap-prompt map) "")) t))
-
-(defun evil-intercept-keymap-p (map &optional state)
- "Whether MAP is an intercept keymap for STATE.
-If STATE is nil, it means any state."
- (let ((entry (and (keymapp map)
- (lookup-key map [intercept-state]))))
- (cond
- ((null entry)
- nil)
- ((null state)
- map)
- ((eq entry state)
- map)
- ((eq entry 'all)
- map))))
-
-(defun evil-overriding-keymap-p (map &optional state)
- "Whether MAP is an overriding keymap for STATE.
-If STATE is nil, it means any state."
- (let ((entry (and (keymapp map)
- (lookup-key map [override-state]))))
- (cond
- ((null entry)
- nil)
- ((keymapp entry)
- (evil-overriding-keymap-p entry state))
- ((null state)
- map)
- ((eq entry state)
- map)
- ((eq entry 'all)
- map))))
-
-(defun evil-intercept-keymap-state (map)
- "Return the state for the intercept keymap MAP.
-A return value of t means all states."
- (let ((state (lookup-key map [intercept-state] map)))
- (cond
- ((keymapp state)
- (evil-intercept-keymap-state state))
- ((eq state 'all)
- t)
- (t
- state))))
-
-(defun evil-overriding-keymap-state (map)
- "Return the state for the overriding keymap MAP.
-A return value of t means all states."
- (let ((state (lookup-key map [override-state] map)))
- (cond
- ((keymapp state)
- (evil-overriding-keymap-state state))
- ((eq state 'all)
- t)
- (t
- state))))
-
-(defun evil-send-leader ()
- "Put symbol leader in `unread-command-events' to trigger any
-<leader> bindings."
- (interactive)
- (setq prefix-arg current-prefix-arg)
- (push '(t . leader) unread-command-events))
-
-(defun evil-send-localleader ()
- "Put symbol localleader in `unread-command-events' to trigger any
-<localleader> bindings."
- (interactive)
- (setq prefix-arg current-prefix-arg)
- (push '(t . localleader) unread-command-events))
-
-(defun evil-set-leader (state key &optional localleader)
- "Set KEY to trigger leader bindings in STATE.
-KEY should be in the form produced by `kbd'. STATE is one of
-`normal', `insert', `visual', `replace', `operator', `motion',
-`emacs', a list of one or more of these, or `nil', which means
-all of the above. If LOCALLEADER is non-nil, set the local leader
-instead."
- (let* ((all-states '(normal insert visual replace operator motion emacs))
- (states (cond ((listp state) state)
- ((member state all-states) (list state))
- ((null state) all-states)
- ;; Maybe throw error here
- (t (list state))))
- (binding (if localleader 'evil-send-localleader 'evil-send-leader)))
- (dolist (state states)
- (evil-global-set-key state key binding))))
-
-(defmacro evil-define-key (state keymap key def &rest bindings)
- "Create a STATE binding from KEY to DEF for KEYMAP.
-STATE is one of `normal', `insert', `visual', `replace',
-`operator', `motion', `emacs', or a list of one or more of
-these. Omitting a state by using `nil' corresponds to a standard
-Emacs binding using `define-key'. The remaining arguments are
-like those of `define-key'. For example:
-
- (evil-define-key 'normal foo-map \"a\" 'bar)
-
-This creates a binding from `a' to `bar' in normal state, which
-is active whenever `foo-map' is active. Using nil for the state,
-the following lead to identical bindings:
-
- (evil-define-key nil foo-map \"a\" 'bar)
- (define-key foo-map \"a\" 'bar)
-
-It is possible to specify multiple states and/or bindings at
-once:
-
- (evil-define-key '(normal visual) foo-map
- \"a\" 'bar
- \"b\" 'foo)
-
-If `foo-map' has not been initialized yet, this macro adds an
-entry to `after-load-functions', delaying execution as necessary.
-
-KEYMAP may also be a quoted symbol. If the symbol is `global', the
-global evil keymap corresponding to the state(s) is used, meaning
-the following lead to identical bindings:
-
- (evil-define-key 'normal 'global \"a\" 'bar)
- (evil-global-set-key 'normal \"a\" 'bar)
-
-The symbol `local' may also be used, which corresponds to using
-`evil-local-set-key'. If a quoted symbol is used that is not
-`global' or `local', it is assumed to be the name of a minor
-mode, in which case `evil-define-minor-mode-key' is used."
- (declare (indent defun))
- (cond ((member keymap '('global 'local))
- `(evil-define-key* ,state ,keymap ,key ,def ,@bindings))
- ((and (consp keymap) (eq (car keymap) 'quote))
- `(evil-define-minor-mode-key ,state ,keymap ,key ,def ,@bindings))
- (t
- `(evil-delay ',(if (symbolp keymap)
- `(and (boundp ',keymap) (keymapp ,keymap))
- `(keymapp ,keymap))
- '(condition-case-unless-debug err
- (evil-define-key* ,state ,keymap ,key ,def ,@bindings)
- (error
- (message "error in evil-define-key: %s"
- (error-message-string err))))
- 'after-load-functions t nil
- (format "evil-define-key-in-%s"
- ',(if (symbolp keymap) keymap 'keymap))))))
-(defalias 'evil-declare-key 'evil-define-key)
-
-(defun evil-define-key* (state keymap key def &rest bindings)
- "Create a STATE binding from KEY to DEF for KEYMAP.
-STATE is one of normal, insert, visual, replace, operator,
-motion, emacs, or a list of one or more of these. Omitting a
-state by using nil corresponds to a standard Emacs binding using
-`define-key' The remaining arguments are like those of
-`define-key'. For example:
-
- (evil-define-key* 'normal foo-map \"a\" 'bar)
-
-This creates a binding from \"a\" to bar in Normal state, which
-is active whenever foo-map is active. Using nil for the state,
-the following are equivalent:
-
- (evil-define-key* nil foo-map \"a\" 'bar)
-
- (define-key foo-map \"a\" 'bar)
-
- It is possible to specify multiple states and/or bindings at
- once:
-
- (evil-define-key* '(normal visual) foo-map
- \"a\" 'bar
- \"b\" 'foo)
-
-KEYMAP may also be a quoted symbol. If the symbol is global, the
-global evil keymap corresponding to the state(s) is used, meaning
-the following are equivalent:
-
- (evil-define-key* 'normal 'global \"a\" 'bar)
-
- (evil-global-set-key 'normal \"a\" 'bar)
-
-The symbol local may also be used, which corresponds to using
-`evil-local-set-key'.
-
-The use is nearly identical to `evil-define-key' with the
-exception that this is a function and not a macro (and so will
-not be expanded when compiled which can have unintended
-consequences). `evil-define-key*' also does not defer any
-bindings like `evil-define-key' does using `evil-delay'. This
-allows errors in the bindings to be caught immediately, and makes
-its behavior more predictable."
- (let ((maps
- (if state
- (mapcar
- (lambda (st)
- (cond ((eq keymap 'global)
- (evil-state-property st :keymap t))
- ((eq keymap 'local)
- (evil-state-property st :local-keymap t))
- (t
- (evil-get-auxiliary-keymap keymap st t t))))
- (if (listp state) state (list state)))
- (list
- (cond ((eq keymap 'global)
- global-map)
- ((eq keymap 'local)
- ;; see `local-set-key'
- (or (current-local-map)
- (let ((map (make-sparse-keymap)))
- (use-local-map map)
- map)))
- (t
- keymap))))))
- (while key
- (dolist (map maps)
- (define-key map key def))
- (setq key (pop bindings)
- def (pop bindings)))
- ;; ensure the prompt string comes first
- (dolist (map maps)
- (evil-set-keymap-prompt map (keymap-prompt map)))))
-
-(defun evil-define-minor-mode-key (state mode key def &rest bindings)
- "Similar to `evil-define-key' but the bindings are associated
-with the minor-mode symbol MODE instead of a particular map.
-Associating bindings with a mode symbol instead of a map allows
-evil to use Emacs' built-in mechanisms to enable the bindings
-automatically when MODE is active without relying on calling
-`evil-normalize-keymaps'. Another less significant difference is
-that the bindings can be created immediately, because this
-function only uses the symbol MODE and does not rely on its
-value.
-
-See `evil-define-key' for the usage of STATE, KEY, DEF and
-BINDINGS."
- (declare (indent defun))
- (let ((maps (mapcar
- (lambda (st)
- (evil-get-minor-mode-keymap st mode))
- (if (listp state) state (list state)))))
- (while key
- (dolist (map maps)
- (define-key map key def))
- (setq key (pop bindings)
- def (pop bindings)))))
-
-(defmacro evil-add-hjkl-bindings (keymap &optional state &rest bindings)
- "Add \"h\", \"j\", \"k\", \"l\" bindings to KEYMAP in STATE.
-Add additional BINDINGS if specified."
- (declare (indent defun))
- `(evil-define-key ,state ,keymap
- "h" (lookup-key evil-motion-state-map "h")
- "j" (lookup-key evil-motion-state-map "j")
- "k" (lookup-key evil-motion-state-map "k")
- "l" (lookup-key evil-motion-state-map "l")
- ":" (lookup-key evil-motion-state-map ":")
- ,@bindings))
-
-;; may be useful for programmatic purposes
-(defun evil-global-set-key (state key def)
- "Bind KEY to DEF in STATE."
- (define-key (evil-state-property state :keymap t) key def))
-
-(defun evil-local-set-key (state key def)
- "Bind KEY to DEF in STATE in the current buffer."
- (define-key (evil-state-property state :local-keymap t) key def))
-
-;; Advise these functions as they may activate an overriding keymap or
-;; a keymap with state bindings; if so, refresh `evil-mode-map-alist'.
-(defadvice use-global-map (after evil activate)
- "Refresh Evil keymaps."
- (evil-normalize-keymaps))
-
-(defadvice use-local-map (after evil activate)
- "Refresh Evil keymaps."
- (evil-normalize-keymaps))
-
-(defmacro evil-define-state (state doc &rest body)
- "Define an Evil state STATE.
-DOC is a general description and shows up in all docstrings;
-the first line of the string should be the full name of the state.
-
-BODY is executed each time the state is enabled or disabled.
-
-Optional keyword arguments:
-- `:tag' - the mode line indicator, e.g. \"<T>\".
-- `:message' - string shown in the echo area when the state is
- activated.
-- `:cursor' - default cursor specification.
-- `:enable' - list of other state keymaps to enable when in this
- state.
-- `:entry-hook' - list of functions to run when entering this state.
-- `:exit-hook' - list of functions to run when exiting this state.
-- `:suppress-keymap' - if non-nil, effectively disables bindings to
- `self-insert-command' by making `evil-suppress-map' the parent of
- the global state keymap.
-
-The global keymap of this state will be `evil-test-state-map',
-the local keymap will be `evil-test-state-local-map', and so on.
-
-\(fn STATE DOC [[KEY VAL]...] BODY...)"
- (declare (indent defun)
- (doc-string 2)
- (debug (&define name
- [&optional stringp]
- [&rest [keywordp sexp]]
- def-body)))
- (let* ((name (and (string-match "^\\(.+\\)\\(\\(?:.\\|\n\\)*\\)" doc)
- (match-string 1 doc)))
- (doc (match-string 2 doc))
- (name (and (string-match "^\\(.+?\\)\\.?$" name)
- (match-string 1 name)))
- (doc (if (or (null doc) (string= doc "")) ""
- (format "\n%s" doc)))
- (toggle (intern (format "evil-%s-state" state)))
- (mode (intern (format "%s-minor-mode" toggle)))
- (keymap (intern (format "%s-map" toggle)))
- (local (intern (format "%s-local-minor-mode" toggle)))
- (local-keymap (intern (format "%s-local-map" toggle)))
- (tag (intern (format "%s-tag" toggle)))
- (message (intern (format "%s-message" toggle)))
- (cursor (intern (format "%s-cursor" toggle)))
- (entry-hook (intern (format "%s-entry-hook" toggle)))
- (exit-hook (intern (format "%s-exit-hook" toggle)))
- (modes (intern (format "%s-modes" toggle)))
- (predicate (intern (format "%s-p" toggle)))
- arg cursor-value enable entry-hook-value exit-hook-value
- input-method key message-value suppress-keymap tag-value)
- ;; collect keywords
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body))
- (cond
- ((eq key :tag)
- (setq tag-value arg))
- ((eq key :message)
- (setq message-value arg))
- ((eq key :cursor)
- (setq cursor-value arg))
- ((eq key :entry-hook)
- (setq entry-hook-value arg)
- (unless (listp entry-hook-value)
- (setq entry-hook-value (list entry-hook-value))))
- ((eq key :exit-hook)
- (setq exit-hook-value arg)
- (unless (listp exit-hook-value)
- (setq exit-hook-value (list exit-hook-value))))
- ((eq key :enable)
- (setq enable arg))
- ((eq key :input-method)
- (setq input-method arg))
- ((eq key :suppress-keymap)
- (setq suppress-keymap arg))))
-
- ;; macro expansion
- `(progn
- ;; Save the state's properties in `evil-state-properties' for
- ;; runtime lookup. Among other things, this information is used
- ;; to determine what keymaps should be activated by the state
- ;; (and, when processing :enable, what keymaps are activated by
- ;; other states). We cannot know this at compile time because
- ;; it depends on the current buffer and its active keymaps
- ;; (to which we may have assigned state bindings), as well as
- ;; states whose definitions may not have been processed yet.
- (evil-put-property
- 'evil-state-properties ',state
- :name ',name
- :toggle ',toggle
- :mode (defvar ,mode nil
- ,(format "Non-nil if %s is enabled.
-Use the command `%s' to change this variable." name toggle))
- :keymap (defvar ,keymap (make-sparse-keymap)
- ,(format "Keymap for %s." name))
- :local (defvar ,local nil
- ,(format "Non-nil if %s is enabled.
-Use the command `%s' to change this variable." name toggle))
- :local-keymap (defvar ,local-keymap nil
- ,(format "Buffer-local keymap for %s." name))
- :tag (defvar ,tag ,tag-value
- ,(format "Mode line tag for %s." name))
- :message (defvar ,message ,message-value
- ,(format "Echo area message for %s." name))
- :cursor (defvar ,cursor ',cursor-value
- ,(format "Cursor for %s.
-May be a cursor type as per `cursor-type', a color string as passed
-to `set-cursor-color', a zero-argument function for changing the
-cursor, or a list of the above." name))
- :entry-hook (defvar ,entry-hook nil
- ,(format "Hooks to run when entering %s." name))
- :exit-hook (defvar ,exit-hook nil
- ,(format "Hooks to run when exiting %s." name))
- :modes (defvar ,modes nil
- ,(format "Modes that should come up in %s." name))
- :input-method ',input-method
- :predicate ',predicate
- :enable ',enable)
-
- ,@(when suppress-keymap
- `((set-keymap-parent ,keymap evil-suppress-map)))
-
- (dolist (func ',entry-hook-value)
- (add-hook ',entry-hook func))
-
- (dolist (func ',exit-hook-value)
- (add-hook ',exit-hook func))
-
- (defun ,predicate (&optional state)
- ,(format "Whether the current state is %s.
-\(That is, whether `evil-state' is `%s'.)" name state)
- (and evil-local-mode
- (eq (or state evil-state) ',state)))
-
- ;; define state function
- (defun ,toggle (&optional arg)
- ,(format "Enable %s. Disable with negative ARG.
-If ARG is nil, don't display a message in the echo area.%s" name doc)
- (interactive)
- (cond
- ((and (numberp arg) (< arg 1))
- (setq evil-previous-state evil-state
- evil-state nil)
- (let ((evil-state ',state))
- (run-hooks ',exit-hook)
- (setq evil-state nil)
- (evil-normalize-keymaps)
- ,@body))
- (t
- (unless evil-local-mode
- (evil-local-mode 1))
- (let ((evil-next-state ',state)
- input-method-activate-hook
- input-method-deactivate-hook)
- (evil-change-state nil)
- (setq evil-state ',state)
- (evil--add-to-alist 'evil-previous-state-alist
- ',state evil-previous-state)
- (let ((evil-state ',state))
- (evil-normalize-keymaps)
- (if ',input-method
- (activate-input-method evil-input-method)
- ;; BUG #475: Deactivate the current input method only
- ;; if there is a function to deactivate it, otherwise
- ;; an error would be raised. This strange situation
- ;; should not arise in general and there should
- ;; probably be a better way to handle this situation.
- (if deactivate-current-input-method-function
- (deactivate-input-method)))
- (unless evil-no-display
- (evil-refresh-cursor ',state)
- (evil-refresh-mode-line ',state)
- (when (called-interactively-p 'any)
- (redisplay)))
- ,@body
- (run-hooks ',entry-hook)
- (when (and evil-echo-state
- arg (not evil-no-display) ,message)
- (if (functionp ,message)
- (funcall ,message)
- (evil-echo "%s" ,message))))))))
-
- (evil-set-command-property ',toggle :keep-visual t)
- (evil-set-command-property ',toggle :suppress-operator t)
-
- (evil-define-keymap ,keymap nil
- :mode ,mode
- :func nil)
-
- (evil-define-keymap ,local-keymap nil
- :mode ,local
- :local t
- :func nil)
-
- ',state)))
-
-(provide 'evil-core)
-
-;;; evil-core.el ends here
diff --git a/elpa/evil-20200718.842/evil-development.el b/elpa/evil-20200718.842/evil-development.el
deleted file mode 100644
index 1930be7..0000000
--- a/elpa/evil-20200718.842/evil-development.el
+++ /dev/null
@@ -1,50 +0,0 @@
-;;; evil-development.el --- Useful features for Evil developers -*- lexical-binding: t -*-
-
-;; Author: Justin Burkett <justin at burkett dot cc>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Code:
-
-;;; Teach imenu about evil macros
-
-(with-eval-after-load 'lisp-mode
- (when (boundp 'lisp-imenu-generic-expression)
- (dolist (macro '("interactive-code"
- "type"
- "text-object"
- "motion"
- "command"
- "operator"))
- (let ((macro-name (format "evil-%s" macro)))
- (unless (assoc macro-name lisp-imenu-generic-expression)
- (push (list
- macro-name
- (format "^\\s-*(evil-define-%s\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)"
- macro)
- 1)
- lisp-imenu-generic-expression))))))
-
-(provide 'evil-development)
-
-;;; evil-development.el ends here
diff --git a/elpa/evil-20200718.842/evil-digraphs.el b/elpa/evil-20200718.842/evil-digraphs.el
deleted file mode 100644
index 745814e..0000000
--- a/elpa/evil-20200718.842/evil-digraphs.el
+++ /dev/null
@@ -1,1729 +0,0 @@
-;;; evil-digraphs.el --- Digraphs -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-vars)
-
-;;; Code:
-
-(defgroup evil-digraphs nil
- "Digraph support based on RFC 1345."
- :group 'evil
- :prefix "evil-digraph-")
-
-(defcustom evil-digraphs-table-user nil
- "List of user-defined digraphs.
-Entries have the form ((?CHAR1 ?CHAR2) . ?DIGRAPH). That is,
-a cons cell of the digraph and its character replacement,
-where the digraph is a list of two characters.
-See also `evil-digraphs-table'."
- :type '(alist :key-type (list character character)
- :value-type character)
- :require 'evil-digraphs
- :group 'evil-digraphs)
-
-(defconst evil-digraphs-table
- '(((?N ?U) . ?\x00)
- ((?S ?H) . ?\x01)
- ((?S ?X) . ?\x02)
- ((?E ?X) . ?\x03)
- ((?E ?T) . ?\x04)
- ((?E ?Q) . ?\x05)
- ((?A ?K) . ?\x06)
- ((?B ?L) . ?\x07)
- ((?B ?S) . ?\x08)
- ((?H ?T) . ?\x09)
- ((?L ?F) . ?\x0a)
- ((?V ?T) . ?\x0b)
- ((?F ?F) . ?\x0c)
- ((?C ?R) . ?\x0d)
- ((?S ?O) . ?\x0e)
- ((?S ?I) . ?\x0f)
- ((?D ?L) . ?\x10)
- ((?D ?1) . ?\x11)
- ((?D ?2) . ?\x12)
- ((?D ?3) . ?\x13)
- ((?D ?4) . ?\x14)
- ((?N ?K) . ?\x15)
- ((?S ?Y) . ?\x16)
- ((?E ?B) . ?\x17)
- ((?C ?N) . ?\x18)
- ((?E ?M) . ?\x19)
- ((?S ?B) . ?\x1a)
- ((?E ?C) . ?\x1b)
- ((?F ?S) . ?\x1c)
- ((?G ?S) . ?\x1d)
- ((?R ?S) . ?\x1e)
- ((?U ?S) . ?\x1f)
- ((?S ?P) . ?\x20)
- ((?N ?b) . ?\x23)
- ((?D ?O) . ?\x24)
- ((?A ?t) . ?\x40)
- ((?< ?\() . ?\x5b)
- ((?/ ?/) . ?\x5c)
- ((?\) ?>) . ?\x5d)
- ((?' ?>) . ?\x5e)
- ((?' ?!) . ?\x60)
- ((?\( ?!) . ?\x7b)
- ((?! ?!) . ?\x7c)
- ((?! ?\)) . ?\x7d)
- ((?' ??) . ?\x7e)
- ((?D ?T) . ?\x7f)
- ((?P ?A) . ?\x80)
- ((?H ?O) . ?\x81)
- ((?B ?H) . ?\x82)
- ((?N ?H) . ?\x83)
- ((?I ?N) . ?\x84)
- ((?N ?L) . ?\x85)
- ((?S ?A) . ?\x86)
- ((?E ?S) . ?\x87)
- ((?H ?S) . ?\x88)
- ((?H ?J) . ?\x89)
- ((?V ?S) . ?\x8a)
- ((?P ?D) . ?\x8b)
- ((?P ?U) . ?\x8c)
- ((?R ?I) . ?\x8d)
- ((?S ?2) . ?\x8e)
- ((?S ?3) . ?\x8f)
- ((?D ?C) . ?\x90)
- ((?P ?1) . ?\x91)
- ((?P ?2) . ?\x92)
- ((?T ?S) . ?\x93)
- ((?C ?C) . ?\x94)
- ((?M ?W) . ?\x95)
- ((?S ?G) . ?\x96)
- ((?E ?G) . ?\x97)
- ((?S ?S) . ?\x98)
- ((?G ?C) . ?\x99)
- ((?S ?C) . ?\x9a)
- ((?C ?I) . ?\x9b)
- ((?S ?T) . ?\x9c)
- ((?O ?C) . ?\x9d)
- ((?P ?M) . ?\x9e)
- ((?A ?C) . ?\x9f)
- ((?N ?S) . ?\xa0)
- ((?! ?I) . ?\xa1)
- ((?C ?t) . ?\xa2)
- ((?P ?d) . ?\xa3)
- ((?C ?u) . ?\xa4)
- ((?Y ?e) . ?\xa5)
- ((?B ?B) . ?\xa6)
- ((?S ?E) . ?\xa7)
- ((?' ?:) . ?\xa8)
- ((?C ?o) . ?\xa9)
- ((?- ?a) . ?\xaa)
- ((?< ?<) . ?\xab)
- ((?N ?O) . ?\xac)
- ((?- ?-) . ?\xad)
- ((?R ?g) . ?\xae)
- ((?' ?m) . ?\xaf)
- ((?D ?G) . ?\xb0)
- ((?+ ?-) . ?\xb1)
- ((?2 ?S) . ?\xb2)
- ((?3 ?S) . ?\xb3)
- ((?' ?') . ?\xb4)
- ((?M ?y) . ?\xb5)
- ((?P ?I) . ?\xb6)
- ((?. ?M) . ?\xb7)
- ((?' ?,) . ?\xb8)
- ((?1 ?S) . ?\xb9)
- ((?- ?o) . ?\xba)
- ((?> ?>) . ?\xbb)
- ((?1 ?4) . ?\xbc)
- ((?1 ?2) . ?\xbd)
- ((?3 ?4) . ?\xbe)
- ((?? ?I) . ?\xbf)
- ((?A ?!) . ?\xc0)
- ((?A ?') . ?\xc1)
- ((?A ?>) . ?\xc2)
- ((?A ??) . ?\xc3)
- ((?A ?:) . ?\xc4)
- ((?A ?A) . ?\xc5)
- ((?A ?E) . ?\xc6)
- ((?C ?,) . ?\xc7)
- ((?E ?!) . ?\xc8)
- ((?E ?') . ?\xc9)
- ((?E ?>) . ?\xca)
- ((?E ?:) . ?\xcb)
- ((?I ?!) . ?\xcc)
- ((?I ?') . ?\xcd)
- ((?I ?>) . ?\xce)
- ((?I ?:) . ?\xcf)
- ((?D ?-) . ?\xd0)
- ((?N ??) . ?\xd1)
- ((?O ?!) . ?\xd2)
- ((?O ?') . ?\xd3)
- ((?O ?>) . ?\xd4)
- ((?O ??) . ?\xd5)
- ((?O ?:) . ?\xd6)
- ((?* ?X) . ?\xd7)
- ((?O ?/) . ?\xd8)
- ((?U ?!) . ?\xd9)
- ((?U ?') . ?\xda)
- ((?U ?>) . ?\xdb)
- ((?U ?:) . ?\xdc)
- ((?Y ?') . ?\xdd)
- ((?T ?H) . ?\xde)
- ((?s ?s) . ?\xdf)
- ((?a ?!) . ?\xe0)
- ((?a ?') . ?\xe1)
- ((?a ?>) . ?\xe2)
- ((?a ??) . ?\xe3)
- ((?a ?:) . ?\xe4)
- ((?a ?a) . ?\xe5)
- ((?a ?e) . ?\xe6)
- ((?c ?,) . ?\xe7)
- ((?e ?!) . ?\xe8)
- ((?e ?') . ?\xe9)
- ((?e ?>) . ?\xea)
- ((?e ?:) . ?\xeb)
- ((?i ?!) . ?\xec)
- ((?i ?') . ?\xed)
- ((?i ?>) . ?\xee)
- ((?i ?:) . ?\xef)
- ((?d ?-) . ?\xf0)
- ((?n ??) . ?\xf1)
- ((?o ?!) . ?\xf2)
- ((?o ?') . ?\xf3)
- ((?o ?>) . ?\xf4)
- ((?o ??) . ?\xf5)
- ((?o ?:) . ?\xf6)
- ((?- ?:) . ?\xf7)
- ((?o ?/) . ?\xf8)
- ((?u ?!) . ?\xf9)
- ((?u ?') . ?\xfa)
- ((?u ?>) . ?\xfb)
- ((?u ?:) . ?\xfc)
- ((?y ?') . ?\xfd)
- ((?t ?h) . ?\xfe)
- ((?y ?:) . ?\xff)
- ((?A ?-) . ?\x0100)
- ((?a ?-) . ?\x0101)
- ((?A ?\() . ?\x0102)
- ((?a ?\() . ?\x0103)
- ((?A ?\;) . ?\x0104)
- ((?a ?\;) . ?\x0105)
- ((?C ?') . ?\x0106)
- ((?c ?') . ?\x0107)
- ((?C ?>) . ?\x0108)
- ((?c ?>) . ?\x0109)
- ((?C ?.) . ?\x010a)
- ((?c ?.) . ?\x010b)
- ((?C ?<) . ?\x010c)
- ((?c ?<) . ?\x010d)
- ((?D ?<) . ?\x010e)
- ((?d ?<) . ?\x010f)
- ((?D ?/) . ?\x0110)
- ((?d ?/) . ?\x0111)
- ((?E ?-) . ?\x0112)
- ((?e ?-) . ?\x0113)
- ((?E ?\() . ?\x0114)
- ((?e ?\() . ?\x0115)
- ((?E ?.) . ?\x0116)
- ((?e ?.) . ?\x0117)
- ((?E ?\;) . ?\x0118)
- ((?e ?\;) . ?\x0119)
- ((?E ?<) . ?\x011a)
- ((?e ?<) . ?\x011b)
- ((?G ?>) . ?\x011c)
- ((?g ?>) . ?\x011d)
- ((?G ?\() . ?\x011e)
- ((?g ?\() . ?\x011f)
- ((?G ?.) . ?\x0120)
- ((?g ?.) . ?\x0121)
- ((?G ?,) . ?\x0122)
- ((?g ?,) . ?\x0123)
- ((?H ?>) . ?\x0124)
- ((?h ?>) . ?\x0125)
- ((?H ?/) . ?\x0126)
- ((?h ?/) . ?\x0127)
- ((?I ??) . ?\x0128)
- ((?i ??) . ?\x0129)
- ((?I ?-) . ?\x012a)
- ((?i ?-) . ?\x012b)
- ((?I ?\() . ?\x012c)
- ((?i ?\() . ?\x012d)
- ((?I ?\;) . ?\x012e)
- ((?i ?\;) . ?\x012f)
- ((?I ?.) . ?\x0130)
- ((?i ?.) . ?\x0131)
- ((?I ?J) . ?\x0132)
- ((?i ?j) . ?\x0133)
- ((?J ?>) . ?\x0134)
- ((?j ?>) . ?\x0135)
- ((?K ?,) . ?\x0136)
- ((?k ?,) . ?\x0137)
- ((?k ?k) . ?\x0138)
- ((?L ?') . ?\x0139)
- ((?l ?') . ?\x013a)
- ((?L ?,) . ?\x013b)
- ((?l ?,) . ?\x013c)
- ((?L ?<) . ?\x013d)
- ((?l ?<) . ?\x013e)
- ((?L ?.) . ?\x013f)
- ((?l ?.) . ?\x0140)
- ((?L ?/) . ?\x0141)
- ((?l ?/) . ?\x0142)
- ((?N ?') . ?\x0143)
- ((?n ?') . ?\x0144)
- ((?N ?,) . ?\x0145)
- ((?n ?,) . ?\x0146)
- ((?N ?<) . ?\x0147)
- ((?n ?<) . ?\x0148)
- ((?' ?n) . ?\x0149)
- ((?N ?G) . ?\x014a)
- ((?n ?g) . ?\x014b)
- ((?O ?-) . ?\x014c)
- ((?o ?-) . ?\x014d)
- ((?O ?\() . ?\x014e)
- ((?o ?\() . ?\x014f)
- ((?O ?\") . ?\x0150)
- ((?o ?\") . ?\x0151)
- ((?O ?E) . ?\x0152)
- ((?o ?e) . ?\x0153)
- ((?R ?') . ?\x0154)
- ((?r ?') . ?\x0155)
- ((?R ?,) . ?\x0156)
- ((?r ?,) . ?\x0157)
- ((?R ?<) . ?\x0158)
- ((?r ?<) . ?\x0159)
- ((?S ?') . ?\x015a)
- ((?s ?') . ?\x015b)
- ((?S ?>) . ?\x015c)
- ((?s ?>) . ?\x015d)
- ((?S ?,) . ?\x015e)
- ((?s ?,) . ?\x015f)
- ((?S ?<) . ?\x0160)
- ((?s ?<) . ?\x0161)
- ((?T ?,) . ?\x0162)
- ((?t ?,) . ?\x0163)
- ((?T ?<) . ?\x0164)
- ((?t ?<) . ?\x0165)
- ((?T ?/) . ?\x0166)
- ((?t ?/) . ?\x0167)
- ((?U ??) . ?\x0168)
- ((?u ??) . ?\x0169)
- ((?U ?-) . ?\x016a)
- ((?u ?-) . ?\x016b)
- ((?U ?\() . ?\x016c)
- ((?u ?\() . ?\x016d)
- ((?U ?0) . ?\x016e)
- ((?u ?0) . ?\x016f)
- ((?U ?\") . ?\x0170)
- ((?u ?\") . ?\x0171)
- ((?U ?\;) . ?\x0172)
- ((?u ?\;) . ?\x0173)
- ((?W ?>) . ?\x0174)
- ((?w ?>) . ?\x0175)
- ((?Y ?>) . ?\x0176)
- ((?y ?>) . ?\x0177)
- ((?Y ?:) . ?\x0178)
- ((?Z ?') . ?\x0179)
- ((?z ?') . ?\x017a)
- ((?Z ?.) . ?\x017b)
- ((?z ?.) . ?\x017c)
- ((?Z ?<) . ?\x017d)
- ((?z ?<) . ?\x017e)
- ((?O ?9) . ?\x01a0)
- ((?o ?9) . ?\x01a1)
- ((?O ?I) . ?\x01a2)
- ((?o ?i) . ?\x01a3)
- ((?y ?r) . ?\x01a6)
- ((?U ?9) . ?\x01af)
- ((?u ?9) . ?\x01b0)
- ((?Z ?/) . ?\x01b5)
- ((?z ?/) . ?\x01b6)
- ((?E ?D) . ?\x01b7)
- ((?A ?<) . ?\x01cd)
- ((?a ?<) . ?\x01ce)
- ((?I ?<) . ?\x01cf)
- ((?i ?<) . ?\x01d0)
- ((?O ?<) . ?\x01d1)
- ((?o ?<) . ?\x01d2)
- ((?U ?<) . ?\x01d3)
- ((?u ?<) . ?\x01d4)
- ((?A ?1) . ?\x01de)
- ((?a ?1) . ?\x01df)
- ((?A ?7) . ?\x01e0)
- ((?a ?7) . ?\x01e1)
- ((?A ?3) . ?\x01e2)
- ((?a ?3) . ?\x01e3)
- ((?G ?/) . ?\x01e4)
- ((?g ?/) . ?\x01e5)
- ((?G ?<) . ?\x01e6)
- ((?g ?<) . ?\x01e7)
- ((?K ?<) . ?\x01e8)
- ((?k ?<) . ?\x01e9)
- ((?O ?\;) . ?\x01ea)
- ((?o ?\;) . ?\x01eb)
- ((?O ?1) . ?\x01ec)
- ((?o ?1) . ?\x01ed)
- ((?E ?Z) . ?\x01ee)
- ((?e ?z) . ?\x01ef)
- ((?j ?<) . ?\x01f0)
- ((?G ?') . ?\x01f4)
- ((?g ?') . ?\x01f5)
- ((?\; ?S) . ?\x02bf)
- ((?' ?<) . ?\x02c7)
- ((?' ?\() . ?\x02d8)
- ((?' ?.) . ?\x02d9)
- ((?' ?0) . ?\x02da)
- ((?' ?\;) . ?\x02db)
- ((?' ?\") . ?\x02dd)
- ((?A ?%) . ?\x0386)
- ((?E ?%) . ?\x0388)
- ((?Y ?%) . ?\x0389)
- ((?I ?%) . ?\x038a)
- ((?O ?%) . ?\x038c)
- ((?U ?%) . ?\x038e)
- ((?W ?%) . ?\x038f)
- ((?i ?3) . ?\x0390)
- ((?A ?*) . ?\x0391)
- ((?B ?*) . ?\x0392)
- ((?G ?*) . ?\x0393)
- ((?D ?*) . ?\x0394)
- ((?E ?*) . ?\x0395)
- ((?Z ?*) . ?\x0396)
- ((?Y ?*) . ?\x0397)
- ((?H ?*) . ?\x0398)
- ((?I ?*) . ?\x0399)
- ((?K ?*) . ?\x039a)
- ((?L ?*) . ?\x039b)
- ((?M ?*) . ?\x039c)
- ((?N ?*) . ?\x039d)
- ((?C ?*) . ?\x039e)
- ((?O ?*) . ?\x039f)
- ((?P ?*) . ?\x03a0)
- ((?R ?*) . ?\x03a1)
- ((?S ?*) . ?\x03a3)
- ((?T ?*) . ?\x03a4)
- ((?U ?*) . ?\x03a5)
- ((?F ?*) . ?\x03a6)
- ((?X ?*) . ?\x03a7)
- ((?Q ?*) . ?\x03a8)
- ((?W ?*) . ?\x03a9)
- ((?J ?*) . ?\x03aa)
- ((?V ?*) . ?\x03ab)
- ((?a ?%) . ?\x03ac)
- ((?e ?%) . ?\x03ad)
- ((?y ?%) . ?\x03ae)
- ((?i ?%) . ?\x03af)
- ((?u ?3) . ?\x03b0)
- ((?a ?*) . ?\x03b1)
- ((?b ?*) . ?\x03b2)
- ((?g ?*) . ?\x03b3)
- ((?d ?*) . ?\x03b4)
- ((?e ?*) . ?\x03b5)
- ((?z ?*) . ?\x03b6)
- ((?y ?*) . ?\x03b7)
- ((?h ?*) . ?\x03b8)
- ((?i ?*) . ?\x03b9)
- ((?k ?*) . ?\x03ba)
- ((?l ?*) . ?\x03bb)
- ((?m ?*) . ?\x03bc)
- ((?n ?*) . ?\x03bd)
- ((?c ?*) . ?\x03be)
- ((?o ?*) . ?\x03bf)
- ((?p ?*) . ?\x03c0)
- ((?r ?*) . ?\x03c1)
- ((?* ?s) . ?\x03c2)
- ((?s ?*) . ?\x03c3)
- ((?t ?*) . ?\x03c4)
- ((?u ?*) . ?\x03c5)
- ((?f ?*) . ?\x03c6)
- ((?x ?*) . ?\x03c7)
- ((?q ?*) . ?\x03c8)
- ((?w ?*) . ?\x03c9)
- ((?j ?*) . ?\x03ca)
- ((?v ?*) . ?\x03cb)
- ((?o ?%) . ?\x03cc)
- ((?u ?%) . ?\x03cd)
- ((?w ?%) . ?\x03ce)
- ((?' ?G) . ?\x03d8)
- ((?, ?G) . ?\x03d9)
- ((?T ?3) . ?\x03da)
- ((?t ?3) . ?\x03db)
- ((?M ?3) . ?\x03dc)
- ((?m ?3) . ?\x03dd)
- ((?K ?3) . ?\x03de)
- ((?k ?3) . ?\x03df)
- ((?P ?3) . ?\x03e0)
- ((?p ?3) . ?\x03e1)
- ((?' ?%) . ?\x03f4)
- ((?j ?3) . ?\x03f5)
- ((?I ?O) . ?\x0401)
- ((?D ?%) . ?\x0402)
- ((?G ?%) . ?\x0403)
- ((?I ?E) . ?\x0404)
- ((?D ?S) . ?\x0405)
- ((?I ?I) . ?\x0406)
- ((?Y ?I) . ?\x0407)
- ((?J ?%) . ?\x0408)
- ((?L ?J) . ?\x0409)
- ((?N ?J) . ?\x040a)
- ((?T ?s) . ?\x040b)
- ((?K ?J) . ?\x040c)
- ((?V ?%) . ?\x040e)
- ((?D ?Z) . ?\x040f)
- ((?A ?=) . ?\x0410)
- ((?B ?=) . ?\x0411)
- ((?V ?=) . ?\x0412)
- ((?G ?=) . ?\x0413)
- ((?D ?=) . ?\x0414)
- ((?E ?=) . ?\x0415)
- ((?Z ?%) . ?\x0416)
- ((?Z ?=) . ?\x0417)
- ((?I ?=) . ?\x0418)
- ((?J ?=) . ?\x0419)
- ((?K ?=) . ?\x041a)
- ((?L ?=) . ?\x041b)
- ((?M ?=) . ?\x041c)
- ((?N ?=) . ?\x041d)
- ((?O ?=) . ?\x041e)
- ((?P ?=) . ?\x041f)
- ((?R ?=) . ?\x0420)
- ((?S ?=) . ?\x0421)
- ((?T ?=) . ?\x0422)
- ((?U ?=) . ?\x0423)
- ((?F ?=) . ?\x0424)
- ((?H ?=) . ?\x0425)
- ((?C ?=) . ?\x0426)
- ((?C ?%) . ?\x0427)
- ((?S ?%) . ?\x0428)
- ((?S ?c) . ?\x0429)
- ((?= ?\") . ?\x042a)
- ((?Y ?=) . ?\x042b)
- ((?% ?\") . ?\x042c)
- ((?J ?E) . ?\x042d)
- ((?J ?U) . ?\x042e)
- ((?J ?A) . ?\x042f)
- ((?a ?=) . ?\x0430)
- ((?b ?=) . ?\x0431)
- ((?v ?=) . ?\x0432)
- ((?g ?=) . ?\x0433)
- ((?d ?=) . ?\x0434)
- ((?e ?=) . ?\x0435)
- ((?z ?%) . ?\x0436)
- ((?z ?=) . ?\x0437)
- ((?i ?=) . ?\x0438)
- ((?j ?=) . ?\x0439)
- ((?k ?=) . ?\x043a)
- ((?l ?=) . ?\x043b)
- ((?m ?=) . ?\x043c)
- ((?n ?=) . ?\x043d)
- ((?o ?=) . ?\x043e)
- ((?p ?=) . ?\x043f)
- ((?r ?=) . ?\x0440)
- ((?s ?=) . ?\x0441)
- ((?t ?=) . ?\x0442)
- ((?u ?=) . ?\x0443)
- ((?f ?=) . ?\x0444)
- ((?h ?=) . ?\x0445)
- ((?c ?=) . ?\x0446)
- ((?c ?%) . ?\x0447)
- ((?s ?%) . ?\x0448)
- ((?s ?c) . ?\x0449)
- ((?= ?') . ?\x044a)
- ((?y ?=) . ?\x044b)
- ((?% ?') . ?\x044c)
- ((?j ?e) . ?\x044d)
- ((?j ?u) . ?\x044e)
- ((?j ?a) . ?\x044f)
- ((?i ?o) . ?\x0451)
- ((?d ?%) . ?\x0452)
- ((?g ?%) . ?\x0453)
- ((?i ?e) . ?\x0454)
- ((?d ?s) . ?\x0455)
- ((?i ?i) . ?\x0456)
- ((?y ?i) . ?\x0457)
- ((?j ?%) . ?\x0458)
- ((?l ?j) . ?\x0459)
- ((?n ?j) . ?\x045a)
- ((?t ?s) . ?\x045b)
- ((?k ?j) . ?\x045c)
- ((?v ?%) . ?\x045e)
- ((?d ?z) . ?\x045f)
- ((?Y ?3) . ?\x0462)
- ((?y ?3) . ?\x0463)
- ((?O ?3) . ?\x046a)
- ((?o ?3) . ?\x046b)
- ((?F ?3) . ?\x0472)
- ((?f ?3) . ?\x0473)
- ((?V ?3) . ?\x0474)
- ((?v ?3) . ?\x0475)
- ((?C ?3) . ?\x0480)
- ((?c ?3) . ?\x0481)
- ((?G ?3) . ?\x0490)
- ((?g ?3) . ?\x0491)
- ((?A ?+) . ?\x05d0)
- ((?B ?+) . ?\x05d1)
- ((?G ?+) . ?\x05d2)
- ((?D ?+) . ?\x05d3)
- ((?H ?+) . ?\x05d4)
- ((?W ?+) . ?\x05d5)
- ((?Z ?+) . ?\x05d6)
- ((?X ?+) . ?\x05d7)
- ((?T ?j) . ?\x05d8)
- ((?J ?+) . ?\x05d9)
- ((?K ?%) . ?\x05da)
- ((?K ?+) . ?\x05db)
- ((?L ?+) . ?\x05dc)
- ((?M ?%) . ?\x05dd)
- ((?M ?+) . ?\x05de)
- ((?N ?%) . ?\x05df)
- ((?N ?+) . ?\x05e0)
- ((?S ?+) . ?\x05e1)
- ((?E ?+) . ?\x05e2)
- ((?P ?%) . ?\x05e3)
- ((?P ?+) . ?\x05e4)
- ((?Z ?j) . ?\x05e5)
- ((?Z ?J) . ?\x05e6)
- ((?Q ?+) . ?\x05e7)
- ((?R ?+) . ?\x05e8)
- ((?S ?h) . ?\x05e9)
- ((?T ?+) . ?\x05ea)
- ((?, ?+) . ?\x060c)
- ((?\; ?+) . ?\x061b)
- ((?? ?+) . ?\x061f)
- ((?H ?') . ?\x0621)
- ((?a ?M) . ?\x0622)
- ((?a ?H) . ?\x0623)
- ((?w ?H) . ?\x0624)
- ((?a ?h) . ?\x0625)
- ((?y ?H) . ?\x0626)
- ((?a ?+) . ?\x0627)
- ((?b ?+) . ?\x0628)
- ((?t ?m) . ?\x0629)
- ((?t ?+) . ?\x062a)
- ((?t ?k) . ?\x062b)
- ((?g ?+) . ?\x062c)
- ((?h ?k) . ?\x062d)
- ((?x ?+) . ?\x062e)
- ((?d ?+) . ?\x062f)
- ((?d ?k) . ?\x0630)
- ((?r ?+) . ?\x0631)
- ((?z ?+) . ?\x0632)
- ((?s ?+) . ?\x0633)
- ((?s ?n) . ?\x0634)
- ((?c ?+) . ?\x0635)
- ((?d ?d) . ?\x0636)
- ((?t ?j) . ?\x0637)
- ((?z ?H) . ?\x0638)
- ((?e ?+) . ?\x0639)
- ((?i ?+) . ?\x063a)
- ((?+ ?+) . ?\x0640)
- ((?f ?+) . ?\x0641)
- ((?q ?+) . ?\x0642)
- ((?k ?+) . ?\x0643)
- ((?l ?+) . ?\x0644)
- ((?m ?+) . ?\x0645)
- ((?n ?+) . ?\x0646)
- ((?h ?+) . ?\x0647)
- ((?w ?+) . ?\x0648)
- ((?j ?+) . ?\x0649)
- ((?y ?+) . ?\x064a)
- ((?: ?+) . ?\x064b)
- ((?\" ?+) . ?\x064c)
- ((?= ?+) . ?\x064d)
- ((?/ ?+) . ?\x064e)
- ((?' ?+) . ?\x064f)
- ((?1 ?+) . ?\x0650)
- ((?3 ?+) . ?\x0651)
- ((?0 ?+) . ?\x0652)
- ((?a ?S) . ?\x0670)
- ((?p ?+) . ?\x067e)
- ((?v ?+) . ?\x06a4)
- ((?g ?f) . ?\x06af)
- ((?0 ?a) . ?\x06f0)
- ((?1 ?a) . ?\x06f1)
- ((?2 ?a) . ?\x06f2)
- ((?3 ?a) . ?\x06f3)
- ((?4 ?a) . ?\x06f4)
- ((?5 ?a) . ?\x06f5)
- ((?6 ?a) . ?\x06f6)
- ((?7 ?a) . ?\x06f7)
- ((?8 ?a) . ?\x06f8)
- ((?9 ?a) . ?\x06f9)
- ((?B ?.) . ?\x1e02)
- ((?b ?.) . ?\x1e03)
- ((?B ?_) . ?\x1e06)
- ((?b ?_) . ?\x1e07)
- ((?D ?.) . ?\x1e0a)
- ((?d ?.) . ?\x1e0b)
- ((?D ?_) . ?\x1e0e)
- ((?d ?_) . ?\x1e0f)
- ((?D ?,) . ?\x1e10)
- ((?d ?,) . ?\x1e11)
- ((?F ?.) . ?\x1e1e)
- ((?f ?.) . ?\x1e1f)
- ((?G ?-) . ?\x1e20)
- ((?g ?-) . ?\x1e21)
- ((?H ?.) . ?\x1e22)
- ((?h ?.) . ?\x1e23)
- ((?H ?:) . ?\x1e26)
- ((?h ?:) . ?\x1e27)
- ((?H ?,) . ?\x1e28)
- ((?h ?,) . ?\x1e29)
- ((?K ?') . ?\x1e30)
- ((?k ?') . ?\x1e31)
- ((?K ?_) . ?\x1e34)
- ((?k ?_) . ?\x1e35)
- ((?L ?_) . ?\x1e3a)
- ((?l ?_) . ?\x1e3b)
- ((?M ?') . ?\x1e3e)
- ((?m ?') . ?\x1e3f)
- ((?M ?.) . ?\x1e40)
- ((?m ?.) . ?\x1e41)
- ((?N ?.) . ?\x1e44)
- ((?n ?.) . ?\x1e45)
- ((?N ?_) . ?\x1e48)
- ((?n ?_) . ?\x1e49)
- ((?P ?') . ?\x1e54)
- ((?p ?') . ?\x1e55)
- ((?P ?.) . ?\x1e56)
- ((?p ?.) . ?\x1e57)
- ((?R ?.) . ?\x1e58)
- ((?r ?.) . ?\x1e59)
- ((?R ?_) . ?\x1e5e)
- ((?r ?_) . ?\x1e5f)
- ((?S ?.) . ?\x1e60)
- ((?s ?.) . ?\x1e61)
- ((?T ?.) . ?\x1e6a)
- ((?t ?.) . ?\x1e6b)
- ((?T ?_) . ?\x1e6e)
- ((?t ?_) . ?\x1e6f)
- ((?V ??) . ?\x1e7c)
- ((?v ??) . ?\x1e7d)
- ((?W ?!) . ?\x1e80)
- ((?w ?!) . ?\x1e81)
- ((?W ?') . ?\x1e82)
- ((?w ?') . ?\x1e83)
- ((?W ?:) . ?\x1e84)
- ((?w ?:) . ?\x1e85)
- ((?W ?.) . ?\x1e86)
- ((?w ?.) . ?\x1e87)
- ((?X ?.) . ?\x1e8a)
- ((?x ?.) . ?\x1e8b)
- ((?X ?:) . ?\x1e8c)
- ((?x ?:) . ?\x1e8d)
- ((?Y ?.) . ?\x1e8e)
- ((?y ?.) . ?\x1e8f)
- ((?Z ?>) . ?\x1e90)
- ((?z ?>) . ?\x1e91)
- ((?Z ?_) . ?\x1e94)
- ((?z ?_) . ?\x1e95)
- ((?h ?_) . ?\x1e96)
- ((?t ?:) . ?\x1e97)
- ((?w ?0) . ?\x1e98)
- ((?y ?0) . ?\x1e99)
- ((?A ?2) . ?\x1ea2)
- ((?a ?2) . ?\x1ea3)
- ((?E ?2) . ?\x1eba)
- ((?e ?2) . ?\x1ebb)
- ((?E ??) . ?\x1ebc)
- ((?e ??) . ?\x1ebd)
- ((?I ?2) . ?\x1ec8)
- ((?i ?2) . ?\x1ec9)
- ((?O ?2) . ?\x1ece)
- ((?o ?2) . ?\x1ecf)
- ((?U ?2) . ?\x1ee6)
- ((?u ?2) . ?\x1ee7)
- ((?Y ?!) . ?\x1ef2)
- ((?y ?!) . ?\x1ef3)
- ((?Y ?2) . ?\x1ef6)
- ((?y ?2) . ?\x1ef7)
- ((?Y ??) . ?\x1ef8)
- ((?y ??) . ?\x1ef9)
- ((?\; ?') . ?\x1f00)
- ((?, ?') . ?\x1f01)
- ((?\; ?!) . ?\x1f02)
- ((?, ?!) . ?\x1f03)
- ((?? ?\;) . ?\x1f04)
- ((?? ?,) . ?\x1f05)
- ((?! ?:) . ?\x1f06)
- ((?? ?:) . ?\x1f07)
- ((?1 ?N) . ?\x2002)
- ((?1 ?M) . ?\x2003)
- ((?3 ?M) . ?\x2004)
- ((?4 ?M) . ?\x2005)
- ((?6 ?M) . ?\x2006)
- ((?1 ?T) . ?\x2009)
- ((?1 ?H) . ?\x200a)
- ((?- ?1) . ?\x2010)
- ((?- ?N) . ?\x2013)
- ((?- ?M) . ?\x2014)
- ((?- ?3) . ?\x2015)
- ((?! ?2) . ?\x2016)
- ((?= ?2) . ?\x2017)
- ((?' ?6) . ?\x2018)
- ((?' ?9) . ?\x2019)
- ((?. ?9) . ?\x201a)
- ((?9 ?') . ?\x201b)
- ((?\" ?6) . ?\x201c)
- ((?\" ?9) . ?\x201d)
- ((?: ?9) . ?\x201e)
- ((?9 ?\") . ?\x201f)
- ((?/ ?-) . ?\x2020)
- ((?/ ?=) . ?\x2021)
- ((?. ?.) . ?\x2025)
- ((?% ?0) . ?\x2030)
- ((?1 ?') . ?\x2032)
- ((?2 ?') . ?\x2033)
- ((?3 ?') . ?\x2034)
- ((?1 ?\") . ?\x2035)
- ((?2 ?\") . ?\x2036)
- ((?3 ?\") . ?\x2037)
- ((?C ?a) . ?\x2038)
- ((?< ?1) . ?\x2039)
- ((?> ?1) . ?\x203a)
- ((?: ?X) . ?\x203b)
- ((?' ?-) . ?\x203e)
- ((?/ ?f) . ?\x2044)
- ((?0 ?S) . ?\x2070)
- ((?4 ?S) . ?\x2074)
- ((?5 ?S) . ?\x2075)
- ((?6 ?S) . ?\x2076)
- ((?7 ?S) . ?\x2077)
- ((?8 ?S) . ?\x2078)
- ((?9 ?S) . ?\x2079)
- ((?+ ?S) . ?\x207a)
- ((?- ?S) . ?\x207b)
- ((?= ?S) . ?\x207c)
- ((?\( ?S) . ?\x207d)
- ((?\) ?S) . ?\x207e)
- ((?n ?S) . ?\x207f)
- ((?0 ?s) . ?\x2080)
- ((?1 ?s) . ?\x2081)
- ((?2 ?s) . ?\x2082)
- ((?3 ?s) . ?\x2083)
- ((?4 ?s) . ?\x2084)
- ((?5 ?s) . ?\x2085)
- ((?6 ?s) . ?\x2086)
- ((?7 ?s) . ?\x2087)
- ((?8 ?s) . ?\x2088)
- ((?9 ?s) . ?\x2089)
- ((?+ ?s) . ?\x208a)
- ((?- ?s) . ?\x208b)
- ((?= ?s) . ?\x208c)
- ((?\( ?s) . ?\x208d)
- ((?\) ?s) . ?\x208e)
- ((?L ?i) . ?\x20a4)
- ((?P ?t) . ?\x20a7)
- ((?W ?=) . ?\x20a9)
- ((?= ?e) . ?\x20ac)
- ((?E ?u) . ?\x20ac)
- ((?o ?C) . ?\x2103)
- ((?c ?o) . ?\x2105)
- ((?o ?F) . ?\x2109)
- ((?N ?0) . ?\x2116)
- ((?P ?O) . ?\x2117)
- ((?R ?x) . ?\x211e)
- ((?S ?M) . ?\x2120)
- ((?T ?M) . ?\x2122)
- ((?O ?m) . ?\x2126)
- ((?A ?O) . ?\x212b)
- ((?1 ?3) . ?\x2153)
- ((?2 ?3) . ?\x2154)
- ((?1 ?5) . ?\x2155)
- ((?2 ?5) . ?\x2156)
- ((?3 ?5) . ?\x2157)
- ((?4 ?5) . ?\x2158)
- ((?1 ?6) . ?\x2159)
- ((?5 ?6) . ?\x215a)
- ((?1 ?8) . ?\x215b)
- ((?3 ?8) . ?\x215c)
- ((?5 ?8) . ?\x215d)
- ((?7 ?8) . ?\x215e)
- ((?1 ?R) . ?\x2160)
- ((?2 ?R) . ?\x2161)
- ((?3 ?R) . ?\x2162)
- ((?4 ?R) . ?\x2163)
- ((?5 ?R) . ?\x2164)
- ((?6 ?R) . ?\x2165)
- ((?7 ?R) . ?\x2166)
- ((?8 ?R) . ?\x2167)
- ((?9 ?R) . ?\x2168)
- ((?a ?R) . ?\x2169)
- ((?b ?R) . ?\x216a)
- ((?c ?R) . ?\x216b)
- ((?1 ?r) . ?\x2170)
- ((?2 ?r) . ?\x2171)
- ((?3 ?r) . ?\x2172)
- ((?4 ?r) . ?\x2173)
- ((?5 ?r) . ?\x2174)
- ((?6 ?r) . ?\x2175)
- ((?7 ?r) . ?\x2176)
- ((?8 ?r) . ?\x2177)
- ((?9 ?r) . ?\x2178)
- ((?a ?r) . ?\x2179)
- ((?b ?r) . ?\x217a)
- ((?c ?r) . ?\x217b)
- ((?< ?-) . ?\x2190)
- ((?- ?!) . ?\x2191)
- ((?- ?>) . ?\x2192)
- ((?- ?v) . ?\x2193)
- ((?< ?>) . ?\x2194)
- ((?U ?D) . ?\x2195)
- ((?< ?=) . ?\x21d0)
- ((?= ?>) . ?\x21d2)
- ((?= ?=) . ?\x21d4)
- ((?F ?A) . ?\x2200)
- ((?d ?P) . ?\x2202)
- ((?T ?E) . ?\x2203)
- ((?/ ?0) . ?\x2205)
- ((?D ?E) . ?\x2206)
- ((?N ?B) . ?\x2207)
- ((?\( ?-) . ?\x2208)
- ((?- ?\)) . ?\x220b)
- ((?* ?P) . ?\x220f)
- ((?+ ?Z) . ?\x2211)
- ((?- ?2) . ?\x2212)
- ((?- ?+) . ?\x2213)
- ((?* ?-) . ?\x2217)
- ((?O ?b) . ?\x2218)
- ((?S ?b) . ?\x2219)
- ((?R ?T) . ?\x221a)
- ((?0 ?\() . ?\x221d)
- ((?0 ?0) . ?\x221e)
- ((?- ?L) . ?\x221f)
- ((?- ?V) . ?\x2220)
- ((?P ?P) . ?\x2225)
- ((?A ?N) . ?\x2227)
- ((?O ?R) . ?\x2228)
- ((?\( ?U) . ?\x2229)
- ((?\) ?U) . ?\x222a)
- ((?I ?n) . ?\x222b)
- ((?D ?I) . ?\x222c)
- ((?I ?o) . ?\x222e)
- ((?. ?:) . ?\x2234)
- ((?: ?.) . ?\x2235)
- ((?: ?R) . ?\x2236)
- ((?: ?:) . ?\x2237)
- ((?? ?1) . ?\x223c)
- ((?C ?G) . ?\x223e)
- ((?? ?-) . ?\x2243)
- ((?? ?=) . ?\x2245)
- ((?? ?2) . ?\x2248)
- ((?= ??) . ?\x224c)
- ((?H ?I) . ?\x2253)
- ((?! ?=) . ?\x2260)
- ((?= ?3) . ?\x2261)
- ((?= ?<) . ?\x2264)
- ((?> ?=) . ?\x2265)
- ((?< ?*) . ?\x226a)
- ((?* ?>) . ?\x226b)
- ((?! ?<) . ?\x226e)
- ((?! ?>) . ?\x226f)
- ((?\( ?C) . ?\x2282)
- ((?\) ?C) . ?\x2283)
- ((?\( ?_) . ?\x2286)
- ((?\) ?_) . ?\x2287)
- ((?0 ?.) . ?\x2299)
- ((?0 ?2) . ?\x229a)
- ((?- ?T) . ?\x22a5)
- ((?. ?P) . ?\x22c5)
- ((?: ?3) . ?\x22ee)
- ((?. ?3) . ?\x22ef)
- ((?E ?h) . ?\x2302)
- ((?< ?7) . ?\x2308)
- ((?> ?7) . ?\x2309)
- ((?7 ?<) . ?\x230a)
- ((?7 ?>) . ?\x230b)
- ((?N ?I) . ?\x2310)
- ((?\( ?A) . ?\x2312)
- ((?T ?R) . ?\x2315)
- ((?I ?u) . ?\x2320)
- ((?I ?l) . ?\x2321)
- ((?< ?/) . ?\x2329)
- ((?/ ?>) . ?\x232a)
- ((?V ?s) . ?\x2423)
- ((?1 ?h) . ?\x2440)
- ((?3 ?h) . ?\x2441)
- ((?2 ?h) . ?\x2442)
- ((?4 ?h) . ?\x2443)
- ((?1 ?j) . ?\x2446)
- ((?2 ?j) . ?\x2447)
- ((?3 ?j) . ?\x2448)
- ((?4 ?j) . ?\x2449)
- ((?1 ?.) . ?\x2488)
- ((?2 ?.) . ?\x2489)
- ((?3 ?.) . ?\x248a)
- ((?4 ?.) . ?\x248b)
- ((?5 ?.) . ?\x248c)
- ((?6 ?.) . ?\x248d)
- ((?7 ?.) . ?\x248e)
- ((?8 ?.) . ?\x248f)
- ((?9 ?.) . ?\x2490)
- ((?h ?h) . ?\x2500)
- ((?H ?H) . ?\x2501)
- ((?v ?v) . ?\x2502)
- ((?V ?V) . ?\x2503)
- ((?3 ?-) . ?\x2504)
- ((?3 ?_) . ?\x2505)
- ((?3 ?!) . ?\x2506)
- ((?3 ?/) . ?\x2507)
- ((?4 ?-) . ?\x2508)
- ((?4 ?_) . ?\x2509)
- ((?4 ?!) . ?\x250a)
- ((?4 ?/) . ?\x250b)
- ((?d ?r) . ?\x250c)
- ((?d ?R) . ?\x250d)
- ((?D ?r) . ?\x250e)
- ((?D ?R) . ?\x250f)
- ((?d ?l) . ?\x2510)
- ((?d ?L) . ?\x2511)
- ((?D ?l) . ?\x2512)
- ((?L ?D) . ?\x2513)
- ((?u ?r) . ?\x2514)
- ((?u ?R) . ?\x2515)
- ((?U ?r) . ?\x2516)
- ((?U ?R) . ?\x2517)
- ((?u ?l) . ?\x2518)
- ((?u ?L) . ?\x2519)
- ((?U ?l) . ?\x251a)
- ((?U ?L) . ?\x251b)
- ((?v ?r) . ?\x251c)
- ((?v ?R) . ?\x251d)
- ((?V ?r) . ?\x2520)
- ((?V ?R) . ?\x2523)
- ((?v ?l) . ?\x2524)
- ((?v ?L) . ?\x2525)
- ((?V ?l) . ?\x2528)
- ((?V ?L) . ?\x252b)
- ((?d ?h) . ?\x252c)
- ((?d ?H) . ?\x252f)
- ((?D ?h) . ?\x2530)
- ((?D ?H) . ?\x2533)
- ((?u ?h) . ?\x2534)
- ((?u ?H) . ?\x2537)
- ((?U ?h) . ?\x2538)
- ((?U ?H) . ?\x253b)
- ((?v ?h) . ?\x253c)
- ((?v ?H) . ?\x253f)
- ((?V ?h) . ?\x2542)
- ((?V ?H) . ?\x254b)
- ((?F ?D) . ?\x2571)
- ((?B ?D) . ?\x2572)
- ((?T ?B) . ?\x2580)
- ((?L ?B) . ?\x2584)
- ((?F ?B) . ?\x2588)
- ((?l ?B) . ?\x258c)
- ((?R ?B) . ?\x2590)
- ((?. ?S) . ?\x2591)
- ((?: ?S) . ?\x2592)
- ((?? ?S) . ?\x2593)
- ((?f ?S) . ?\x25a0)
- ((?O ?S) . ?\x25a1)
- ((?R ?O) . ?\x25a2)
- ((?R ?r) . ?\x25a3)
- ((?R ?F) . ?\x25a4)
- ((?R ?Y) . ?\x25a5)
- ((?R ?H) . ?\x25a6)
- ((?R ?Z) . ?\x25a7)
- ((?R ?K) . ?\x25a8)
- ((?R ?X) . ?\x25a9)
- ((?s ?B) . ?\x25aa)
- ((?S ?R) . ?\x25ac)
- ((?O ?r) . ?\x25ad)
- ((?U ?T) . ?\x25b2)
- ((?u ?T) . ?\x25b3)
- ((?P ?R) . ?\x25b6)
- ((?T ?r) . ?\x25b7)
- ((?D ?t) . ?\x25bc)
- ((?d ?T) . ?\x25bd)
- ((?P ?L) . ?\x25c0)
- ((?T ?l) . ?\x25c1)
- ((?D ?b) . ?\x25c6)
- ((?D ?w) . ?\x25c7)
- ((?L ?Z) . ?\x25ca)
- ((?0 ?m) . ?\x25cb)
- ((?0 ?o) . ?\x25ce)
- ((?0 ?M) . ?\x25cf)
- ((?0 ?L) . ?\x25d0)
- ((?0 ?R) . ?\x25d1)
- ((?S ?n) . ?\x25d8)
- ((?I ?c) . ?\x25d9)
- ((?F ?d) . ?\x25e2)
- ((?B ?d) . ?\x25e3)
- ((?* ?2) . ?\x2605)
- ((?* ?1) . ?\x2606)
- ((?< ?H) . ?\x261c)
- ((?> ?H) . ?\x261e)
- ((?0 ?u) . ?\x263a)
- ((?0 ?U) . ?\x263b)
- ((?S ?U) . ?\x263c)
- ((?F ?m) . ?\x2640)
- ((?M ?l) . ?\x2642)
- ((?c ?S) . ?\x2660)
- ((?c ?H) . ?\x2661)
- ((?c ?D) . ?\x2662)
- ((?c ?C) . ?\x2663)
- ((?M ?d) . ?\x2669)
- ((?M ?8) . ?\x266a)
- ((?M ?2) . ?\x266b)
- ((?M ?b) . ?\x266d)
- ((?M ?x) . ?\x266e)
- ((?M ?X) . ?\x266f)
- ((?O ?K) . ?\x2713)
- ((?X ?X) . ?\x2717)
- ((?- ?X) . ?\x2720)
- ((?I ?S) . ?\x3000)
- ((?, ?_) . ?\x3001)
- ((?. ?_) . ?\x3002)
- ((?+ ?\") . ?\x3003)
- ((?+ ?_) . ?\x3004)
- ((?* ?_) . ?\x3005)
- ((?\; ?_) . ?\x3006)
- ((?0 ?_) . ?\x3007)
- ((?< ?+) . ?\x300a)
- ((?> ?+) . ?\x300b)
- ((?< ?') . ?\x300c)
- ((?> ?') . ?\x300d)
- ((?< ?\") . ?\x300e)
- ((?> ?\") . ?\x300f)
- ((?\( ?\") . ?\x3010)
- ((?\) ?\") . ?\x3011)
- ((?= ?T) . ?\x3012)
- ((?= ?_) . ?\x3013)
- ((?\( ?') . ?\x3014)
- ((?\) ?') . ?\x3015)
- ((?\( ?I) . ?\x3016)
- ((?\) ?I) . ?\x3017)
- ((?- ??) . ?\x301c)
- ((?A ?5) . ?\x3041)
- ((?a ?5) . ?\x3042)
- ((?I ?5) . ?\x3043)
- ((?i ?5) . ?\x3044)
- ((?U ?5) . ?\x3045)
- ((?u ?5) . ?\x3046)
- ((?E ?5) . ?\x3047)
- ((?e ?5) . ?\x3048)
- ((?O ?5) . ?\x3049)
- ((?o ?5) . ?\x304a)
- ((?k ?a) . ?\x304b)
- ((?g ?a) . ?\x304c)
- ((?k ?i) . ?\x304d)
- ((?g ?i) . ?\x304e)
- ((?k ?u) . ?\x304f)
- ((?g ?u) . ?\x3050)
- ((?k ?e) . ?\x3051)
- ((?g ?e) . ?\x3052)
- ((?k ?o) . ?\x3053)
- ((?g ?o) . ?\x3054)
- ((?s ?a) . ?\x3055)
- ((?z ?a) . ?\x3056)
- ((?s ?i) . ?\x3057)
- ((?z ?i) . ?\x3058)
- ((?s ?u) . ?\x3059)
- ((?z ?u) . ?\x305a)
- ((?s ?e) . ?\x305b)
- ((?z ?e) . ?\x305c)
- ((?s ?o) . ?\x305d)
- ((?z ?o) . ?\x305e)
- ((?t ?a) . ?\x305f)
- ((?d ?a) . ?\x3060)
- ((?t ?i) . ?\x3061)
- ((?d ?i) . ?\x3062)
- ((?t ?U) . ?\x3063)
- ((?t ?u) . ?\x3064)
- ((?d ?u) . ?\x3065)
- ((?t ?e) . ?\x3066)
- ((?d ?e) . ?\x3067)
- ((?t ?o) . ?\x3068)
- ((?d ?o) . ?\x3069)
- ((?n ?a) . ?\x306a)
- ((?n ?i) . ?\x306b)
- ((?n ?u) . ?\x306c)
- ((?n ?e) . ?\x306d)
- ((?n ?o) . ?\x306e)
- ((?h ?a) . ?\x306f)
- ((?b ?a) . ?\x3070)
- ((?p ?a) . ?\x3071)
- ((?h ?i) . ?\x3072)
- ((?b ?i) . ?\x3073)
- ((?p ?i) . ?\x3074)
- ((?h ?u) . ?\x3075)
- ((?b ?u) . ?\x3076)
- ((?p ?u) . ?\x3077)
- ((?h ?e) . ?\x3078)
- ((?b ?e) . ?\x3079)
- ((?p ?e) . ?\x307a)
- ((?h ?o) . ?\x307b)
- ((?b ?o) . ?\x307c)
- ((?p ?o) . ?\x307d)
- ((?m ?a) . ?\x307e)
- ((?m ?i) . ?\x307f)
- ((?m ?u) . ?\x3080)
- ((?m ?e) . ?\x3081)
- ((?m ?o) . ?\x3082)
- ((?y ?A) . ?\x3083)
- ((?y ?a) . ?\x3084)
- ((?y ?U) . ?\x3085)
- ((?y ?u) . ?\x3086)
- ((?y ?O) . ?\x3087)
- ((?y ?o) . ?\x3088)
- ((?r ?a) . ?\x3089)
- ((?r ?i) . ?\x308a)
- ((?r ?u) . ?\x308b)
- ((?r ?e) . ?\x308c)
- ((?r ?o) . ?\x308d)
- ((?w ?A) . ?\x308e)
- ((?w ?a) . ?\x308f)
- ((?w ?i) . ?\x3090)
- ((?w ?e) . ?\x3091)
- ((?w ?o) . ?\x3092)
- ((?n ?5) . ?\x3093)
- ((?v ?u) . ?\x3094)
- ((?\" ?5) . ?\x309b)
- ((?0 ?5) . ?\x309c)
- ((?* ?5) . ?\x309d)
- ((?+ ?5) . ?\x309e)
- ((?a ?6) . ?\x30a1)
- ((?A ?6) . ?\x30a2)
- ((?i ?6) . ?\x30a3)
- ((?I ?6) . ?\x30a4)
- ((?u ?6) . ?\x30a5)
- ((?U ?6) . ?\x30a6)
- ((?e ?6) . ?\x30a7)
- ((?E ?6) . ?\x30a8)
- ((?o ?6) . ?\x30a9)
- ((?O ?6) . ?\x30aa)
- ((?K ?a) . ?\x30ab)
- ((?G ?a) . ?\x30ac)
- ((?K ?i) . ?\x30ad)
- ((?G ?i) . ?\x30ae)
- ((?K ?u) . ?\x30af)
- ((?G ?u) . ?\x30b0)
- ((?K ?e) . ?\x30b1)
- ((?G ?e) . ?\x30b2)
- ((?K ?o) . ?\x30b3)
- ((?G ?o) . ?\x30b4)
- ((?S ?a) . ?\x30b5)
- ((?Z ?a) . ?\x30b6)
- ((?S ?i) . ?\x30b7)
- ((?Z ?i) . ?\x30b8)
- ((?S ?u) . ?\x30b9)
- ((?Z ?u) . ?\x30ba)
- ((?S ?e) . ?\x30bb)
- ((?Z ?e) . ?\x30bc)
- ((?S ?o) . ?\x30bd)
- ((?Z ?o) . ?\x30be)
- ((?T ?a) . ?\x30bf)
- ((?D ?a) . ?\x30c0)
- ((?T ?i) . ?\x30c1)
- ((?D ?i) . ?\x30c2)
- ((?T ?U) . ?\x30c3)
- ((?T ?u) . ?\x30c4)
- ((?D ?u) . ?\x30c5)
- ((?T ?e) . ?\x30c6)
- ((?D ?e) . ?\x30c7)
- ((?T ?o) . ?\x30c8)
- ((?D ?o) . ?\x30c9)
- ((?N ?a) . ?\x30ca)
- ((?N ?i) . ?\x30cb)
- ((?N ?u) . ?\x30cc)
- ((?N ?e) . ?\x30cd)
- ((?N ?o) . ?\x30ce)
- ((?H ?a) . ?\x30cf)
- ((?B ?a) . ?\x30d0)
- ((?P ?a) . ?\x30d1)
- ((?H ?i) . ?\x30d2)
- ((?B ?i) . ?\x30d3)
- ((?P ?i) . ?\x30d4)
- ((?H ?u) . ?\x30d5)
- ((?B ?u) . ?\x30d6)
- ((?P ?u) . ?\x30d7)
- ((?H ?e) . ?\x30d8)
- ((?B ?e) . ?\x30d9)
- ((?P ?e) . ?\x30da)
- ((?H ?o) . ?\x30db)
- ((?B ?o) . ?\x30dc)
- ((?P ?o) . ?\x30dd)
- ((?u ?R) . ?\x2515)
- ((?U ?r) . ?\x2516)
- ((?U ?R) . ?\x2517)
- ((?u ?l) . ?\x2518)
- ((?u ?L) . ?\x2519)
- ((?U ?l) . ?\x251a)
- ((?U ?L) . ?\x251b)
- ((?v ?r) . ?\x251c)
- ((?v ?R) . ?\x251d)
- ((?V ?r) . ?\x2520)
- ((?V ?R) . ?\x2523)
- ((?v ?l) . ?\x2524)
- ((?v ?L) . ?\x2525)
- ((?V ?l) . ?\x2528)
- ((?V ?L) . ?\x252b)
- ((?d ?h) . ?\x252c)
- ((?d ?H) . ?\x252f)
- ((?D ?h) . ?\x2530)
- ((?D ?H) . ?\x2533)
- ((?u ?h) . ?\x2534)
- ((?u ?H) . ?\x2537)
- ((?U ?h) . ?\x2538)
- ((?U ?H) . ?\x253b)
- ((?v ?h) . ?\x253c)
- ((?v ?H) . ?\x253f)
- ((?V ?h) . ?\x2542)
- ((?V ?H) . ?\x254b)
- ((?F ?D) . ?\x2571)
- ((?B ?D) . ?\x2572)
- ((?T ?B) . ?\x2580)
- ((?L ?B) . ?\x2584)
- ((?F ?B) . ?\x2588)
- ((?l ?B) . ?\x258c)
- ((?R ?B) . ?\x2590)
- ((?. ?S) . ?\x2591)
- ((?: ?S) . ?\x2592)
- ((?? ?S) . ?\x2593)
- ((?f ?S) . ?\x25a0)
- ((?O ?S) . ?\x25a1)
- ((?R ?O) . ?\x25a2)
- ((?R ?r) . ?\x25a3)
- ((?R ?F) . ?\x25a4)
- ((?R ?Y) . ?\x25a5)
- ((?R ?H) . ?\x25a6)
- ((?R ?Z) . ?\x25a7)
- ((?R ?K) . ?\x25a8)
- ((?R ?X) . ?\x25a9)
- ((?s ?B) . ?\x25aa)
- ((?S ?R) . ?\x25ac)
- ((?O ?r) . ?\x25ad)
- ((?U ?T) . ?\x25b2)
- ((?u ?T) . ?\x25b3)
- ((?P ?R) . ?\x25b6)
- ((?T ?r) . ?\x25b7)
- ((?D ?t) . ?\x25bc)
- ((?d ?T) . ?\x25bd)
- ((?P ?L) . ?\x25c0)
- ((?T ?l) . ?\x25c1)
- ((?D ?b) . ?\x25c6)
- ((?D ?w) . ?\x25c7)
- ((?L ?Z) . ?\x25ca)
- ((?0 ?m) . ?\x25cb)
- ((?0 ?o) . ?\x25ce)
- ((?0 ?M) . ?\x25cf)
- ((?0 ?L) . ?\x25d0)
- ((?0 ?R) . ?\x25d1)
- ((?S ?n) . ?\x25d8)
- ((?I ?c) . ?\x25d9)
- ((?F ?d) . ?\x25e2)
- ((?B ?d) . ?\x25e3)
- ((?* ?2) . ?\x2605)
- ((?* ?1) . ?\x2606)
- ((?< ?H) . ?\x261c)
- ((?> ?H) . ?\x261e)
- ((?0 ?u) . ?\x263a)
- ((?0 ?U) . ?\x263b)
- ((?S ?U) . ?\x263c)
- ((?F ?m) . ?\x2640)
- ((?M ?l) . ?\x2642)
- ((?c ?S) . ?\x2660)
- ((?c ?H) . ?\x2661)
- ((?c ?D) . ?\x2662)
- ((?c ?C) . ?\x2663)
- ((?M ?d) . ?\x2669)
- ((?M ?8) . ?\x266a)
- ((?M ?2) . ?\x266b)
- ((?M ?b) . ?\x266d)
- ((?M ?x) . ?\x266e)
- ((?M ?X) . ?\x266f)
- ((?O ?K) . ?\x2713)
- ((?X ?X) . ?\x2717)
- ((?- ?X) . ?\x2720)
- ((?I ?S) . ?\x3000)
- ((?, ?_) . ?\x3001)
- ((?. ?_) . ?\x3002)
- ((?+ ?\") . ?\x3003)
- ((?+ ?_) . ?\x3004)
- ((?* ?_) . ?\x3005)
- ((?\; ?_) . ?\x3006)
- ((?0 ?_) . ?\x3007)
- ((?< ?+) . ?\x300a)
- ((?> ?+) . ?\x300b)
- ((?< ?') . ?\x300c)
- ((?> ?') . ?\x300d)
- ((?< ?\") . ?\x300e)
- ((?> ?\") . ?\x300f)
- ((?\( ?\") . ?\x3010)
- ((?\) ?\") . ?\x3011)
- ((?= ?T) . ?\x3012)
- ((?= ?_) . ?\x3013)
- ((?\( ?') . ?\x3014)
- ((?\) ?') . ?\x3015)
- ((?\( ?I) . ?\x3016)
- ((?\) ?I) . ?\x3017)
- ((?- ??) . ?\x301c)
- ((?A ?5) . ?\x3041)
- ((?a ?5) . ?\x3042)
- ((?I ?5) . ?\x3043)
- ((?i ?5) . ?\x3044)
- ((?U ?5) . ?\x3045)
- ((?u ?5) . ?\x3046)
- ((?E ?5) . ?\x3047)
- ((?e ?5) . ?\x3048)
- ((?O ?5) . ?\x3049)
- ((?o ?5) . ?\x304a)
- ((?k ?a) . ?\x304b)
- ((?g ?a) . ?\x304c)
- ((?k ?i) . ?\x304d)
- ((?g ?i) . ?\x304e)
- ((?k ?u) . ?\x304f)
- ((?g ?u) . ?\x3050)
- ((?k ?e) . ?\x3051)
- ((?g ?e) . ?\x3052)
- ((?k ?o) . ?\x3053)
- ((?g ?o) . ?\x3054)
- ((?s ?a) . ?\x3055)
- ((?z ?a) . ?\x3056)
- ((?s ?i) . ?\x3057)
- ((?z ?i) . ?\x3058)
- ((?s ?u) . ?\x3059)
- ((?z ?u) . ?\x305a)
- ((?s ?e) . ?\x305b)
- ((?z ?e) . ?\x305c)
- ((?s ?o) . ?\x305d)
- ((?z ?o) . ?\x305e)
- ((?t ?a) . ?\x305f)
- ((?d ?a) . ?\x3060)
- ((?t ?i) . ?\x3061)
- ((?d ?i) . ?\x3062)
- ((?t ?U) . ?\x3063)
- ((?t ?u) . ?\x3064)
- ((?d ?u) . ?\x3065)
- ((?t ?e) . ?\x3066)
- ((?d ?e) . ?\x3067)
- ((?t ?o) . ?\x3068)
- ((?d ?o) . ?\x3069)
- ((?n ?a) . ?\x306a)
- ((?n ?i) . ?\x306b)
- ((?n ?u) . ?\x306c)
- ((?n ?e) . ?\x306d)
- ((?n ?o) . ?\x306e)
- ((?h ?a) . ?\x306f)
- ((?b ?a) . ?\x3070)
- ((?p ?a) . ?\x3071)
- ((?h ?i) . ?\x3072)
- ((?b ?i) . ?\x3073)
- ((?p ?i) . ?\x3074)
- ((?h ?u) . ?\x3075)
- ((?b ?u) . ?\x3076)
- ((?p ?u) . ?\x3077)
- ((?h ?e) . ?\x3078)
- ((?b ?e) . ?\x3079)
- ((?p ?e) . ?\x307a)
- ((?h ?o) . ?\x307b)
- ((?b ?o) . ?\x307c)
- ((?p ?o) . ?\x307d)
- ((?m ?a) . ?\x307e)
- ((?m ?i) . ?\x307f)
- ((?m ?u) . ?\x3080)
- ((?m ?e) . ?\x3081)
- ((?m ?o) . ?\x3082)
- ((?y ?A) . ?\x3083)
- ((?y ?a) . ?\x3084)
- ((?y ?U) . ?\x3085)
- ((?y ?u) . ?\x3086)
- ((?y ?O) . ?\x3087)
- ((?y ?o) . ?\x3088)
- ((?r ?a) . ?\x3089)
- ((?r ?i) . ?\x308a)
- ((?r ?u) . ?\x308b)
- ((?r ?e) . ?\x308c)
- ((?r ?o) . ?\x308d)
- ((?w ?A) . ?\x308e)
- ((?w ?a) . ?\x308f)
- ((?w ?i) . ?\x3090)
- ((?w ?e) . ?\x3091)
- ((?w ?o) . ?\x3092)
- ((?n ?5) . ?\x3093)
- ((?v ?u) . ?\x3094)
- ((?\" ?5) . ?\x309b)
- ((?0 ?5) . ?\x309c)
- ((?* ?5) . ?\x309d)
- ((?+ ?5) . ?\x309e)
- ((?a ?6) . ?\x30a1)
- ((?A ?6) . ?\x30a2)
- ((?i ?6) . ?\x30a3)
- ((?I ?6) . ?\x30a4)
- ((?u ?6) . ?\x30a5)
- ((?U ?6) . ?\x30a6)
- ((?e ?6) . ?\x30a7)
- ((?E ?6) . ?\x30a8)
- ((?o ?6) . ?\x30a9)
- ((?O ?6) . ?\x30aa)
- ((?K ?a) . ?\x30ab)
- ((?G ?a) . ?\x30ac)
- ((?K ?i) . ?\x30ad)
- ((?G ?i) . ?\x30ae)
- ((?K ?u) . ?\x30af)
- ((?G ?u) . ?\x30b0)
- ((?K ?e) . ?\x30b1)
- ((?G ?e) . ?\x30b2)
- ((?K ?o) . ?\x30b3)
- ((?G ?o) . ?\x30b4)
- ((?S ?a) . ?\x30b5)
- ((?Z ?a) . ?\x30b6)
- ((?S ?i) . ?\x30b7)
- ((?Z ?i) . ?\x30b8)
- ((?S ?u) . ?\x30b9)
- ((?Z ?u) . ?\x30ba)
- ((?S ?e) . ?\x30bb)
- ((?Z ?e) . ?\x30bc)
- ((?S ?o) . ?\x30bd)
- ((?Z ?o) . ?\x30be)
- ((?T ?a) . ?\x30bf)
- ((?D ?a) . ?\x30c0)
- ((?T ?i) . ?\x30c1)
- ((?D ?i) . ?\x30c2)
- ((?T ?U) . ?\x30c3)
- ((?T ?u) . ?\x30c4)
- ((?D ?u) . ?\x30c5)
- ((?T ?e) . ?\x30c6)
- ((?D ?e) . ?\x30c7)
- ((?T ?o) . ?\x30c8)
- ((?D ?o) . ?\x30c9)
- ((?N ?a) . ?\x30ca)
- ((?N ?i) . ?\x30cb)
- ((?N ?u) . ?\x30cc)
- ((?N ?e) . ?\x30cd)
- ((?N ?o) . ?\x30ce)
- ((?H ?a) . ?\x30cf)
- ((?B ?a) . ?\x30d0)
- ((?P ?a) . ?\x30d1)
- ((?H ?i) . ?\x30d2)
- ((?B ?i) . ?\x30d3)
- ((?P ?i) . ?\x30d4)
- ((?H ?u) . ?\x30d5)
- ((?B ?u) . ?\x30d6)
- ((?P ?u) . ?\x30d7)
- ((?H ?e) . ?\x30d8)
- ((?B ?e) . ?\x30d9)
- ((?P ?e) . ?\x30da)
- ((?H ?o) . ?\x30db)
- ((?B ?o) . ?\x30dc)
- ((?P ?o) . ?\x30dd)
- ((?M ?a) . ?\x30de)
- ((?M ?i) . ?\x30df)
- ((?M ?u) . ?\x30e0)
- ((?M ?e) . ?\x30e1)
- ((?M ?o) . ?\x30e2)
- ((?Y ?A) . ?\x30e3)
- ((?Y ?a) . ?\x30e4)
- ((?Y ?U) . ?\x30e5)
- ((?Y ?u) . ?\x30e6)
- ((?Y ?O) . ?\x30e7)
- ((?Y ?o) . ?\x30e8)
- ((?R ?a) . ?\x30e9)
- ((?R ?i) . ?\x30ea)
- ((?R ?u) . ?\x30eb)
- ((?R ?e) . ?\x30ec)
- ((?R ?o) . ?\x30ed)
- ((?W ?A) . ?\x30ee)
- ((?W ?a) . ?\x30ef)
- ((?W ?i) . ?\x30f0)
- ((?W ?e) . ?\x30f1)
- ((?W ?o) . ?\x30f2)
- ((?N ?6) . ?\x30f3)
- ((?V ?u) . ?\x30f4)
- ((?K ?A) . ?\x30f5)
- ((?K ?E) . ?\x30f6)
- ((?V ?a) . ?\x30f7)
- ((?V ?i) . ?\x30f8)
- ((?V ?e) . ?\x30f9)
- ((?V ?o) . ?\x30fa)
- ((?. ?6) . ?\x30fb)
- ((?- ?6) . ?\x30fc)
- ((?* ?6) . ?\x30fd)
- ((?+ ?6) . ?\x30fe)
- ((?b ?4) . ?\x3105)
- ((?p ?4) . ?\x3106)
- ((?m ?4) . ?\x3107)
- ((?f ?4) . ?\x3108)
- ((?d ?4) . ?\x3109)
- ((?t ?4) . ?\x310a)
- ((?n ?4) . ?\x310b)
- ((?l ?4) . ?\x310c)
- ((?g ?4) . ?\x310d)
- ((?k ?4) . ?\x310e)
- ((?h ?4) . ?\x310f)
- ((?j ?4) . ?\x3110)
- ((?q ?4) . ?\x3111)
- ((?x ?4) . ?\x3112)
- ((?z ?h) . ?\x3113)
- ((?c ?h) . ?\x3114)
- ((?s ?h) . ?\x3115)
- ((?r ?4) . ?\x3116)
- ((?z ?4) . ?\x3117)
- ((?c ?4) . ?\x3118)
- ((?s ?4) . ?\x3119)
- ((?a ?4) . ?\x311a)
- ((?o ?4) . ?\x311b)
- ((?e ?4) . ?\x311c)
- ((?a ?i) . ?\x311e)
- ((?e ?i) . ?\x311f)
- ((?a ?u) . ?\x3120)
- ((?o ?u) . ?\x3121)
- ((?a ?n) . ?\x3122)
- ((?e ?n) . ?\x3123)
- ((?a ?N) . ?\x3124)
- ((?e ?N) . ?\x3125)
- ((?e ?r) . ?\x3126)
- ((?i ?4) . ?\x3127)
- ((?u ?4) . ?\x3128)
- ((?i ?u) . ?\x3129)
- ((?v ?4) . ?\x312a)
- ((?n ?G) . ?\x312b)
- ((?g ?n) . ?\x312c)
- ((?1 ?c) . ?\x3220)
- ((?2 ?c) . ?\x3221)
- ((?3 ?c) . ?\x3222)
- ((?4 ?c) . ?\x3223)
- ((?5 ?c) . ?\x3224)
- ((?6 ?c) . ?\x3225)
- ((?7 ?c) . ?\x3226)
- ((?8 ?c) . ?\x3227)
- ((?9 ?c) . ?\x3228)
- ((?\s ?\s) . ?\xe000)
- ((?/ ?c) . ?\xe001)
- ((?U ?A) . ?\xe002)
- ((?U ?B) . ?\xe003)
- ((?\" ?3) . ?\xe004)
- ((?\" ?1) . ?\xe005)
- ((?\" ?!) . ?\xe006)
- ((?\" ?') . ?\xe007)
- ((?\" ?>) . ?\xe008)
- ((?\" ??) . ?\xe009)
- ((?\" ?-) . ?\xe00a)
- ((?\" ?\() . ?\xe00b)
- ((?\" ?.) . ?\xe00c)
- ((?\" ?:) . ?\xe00d)
- ((?\" ?0) . ?\xe00e)
- ((?\" ?\") . ?\xe00f)
- ((?\" ?<) . ?\xe010)
- ((?\" ?,) . ?\xe011)
- ((?\" ?\;) . ?\xe012)
- ((?\" ?_) . ?\xe013)
- ((?\" ?=) . ?\xe014)
- ((?\" ?/) . ?\xe015)
- ((?\" ?i) . ?\xe016)
- ((?\" ?d) . ?\xe017)
- ((?\" ?p) . ?\xe018)
- ((?\; ?\;) . ?\xe019)
- ((?, ?,) . ?\xe01a)
- ((?b ?3) . ?\xe01b)
- ((?C ?i) . ?\xe01c)
- ((?f ?\() . ?\xe01d)
- ((?e ?d) . ?\xe01e)
- ((?a ?m) . ?\xe01f)
- ((?p ?m) . ?\xe020)
- ((?F ?l) . ?\xe023)
- ((?G ?F) . ?\xe024)
- ((?> ?V) . ?\xe025)
- ((?! ?*) . ?\xe026)
- ((?? ?*) . ?\xe027)
- ((?J ?<) . ?\xe028)
- ((?f ?f) . ?\xfb00)
- ((?f ?i) . ?\xfb01)
- ((?f ?l) . ?\xfb02)
- ((?f ?t) . ?\xfb05)
- ((?s ?t) . ?\xfb06)
- ((?~ ?!) . ?\x00a1)
- ((?c ?|) . ?\x00a2)
- ((?$ ?$) . ?\x00a3)
- ((?o ?x) . ?\x00a4)
- ((?Y ?-) . ?\x00a5)
- ((?| ?|) . ?\x00a6)
- ((?c ?O) . ?\x00a9)
- ((?- ?,) . ?\x00ac)
- ((?- ?=) . ?\x00af)
- ((?~ ?o) . ?\x00b0)
- ((?2 ?2) . ?\x00b2)
- ((?3 ?3) . ?\x00b3)
- ((?p ?p) . ?\x00b6)
- ((?~ ?.) . ?\x00b7)
- ((?1 ?1) . ?\x00b9)
- ((?~ ??) . ?\x00bf)
- ((?A ?`) . ?\x00c0)
- ((?A ?^) . ?\x00c2)
- ((?A ?~) . ?\x00c3)
- ((?A ?\") . ?\x00c4)
- ((?A ?@) . ?\x00c5)
- ((?E ?`) . ?\x00c8)
- ((?E ?^) . ?\x00ca)
- ((?E ?\") . ?\x00cb)
- ((?I ?`) . ?\x00cc)
- ((?I ?^) . ?\x00ce)
- ((?I ?\") . ?\x00cf)
- ((?N ?~) . ?\x00d1)
- ((?O ?`) . ?\x00d2)
- ((?O ?^) . ?\x00d4)
- ((?O ?~) . ?\x00d5)
- ((?/ ?\\) . ?\x00d7)
- ((?U ?`) . ?\x00d9)
- ((?U ?^) . ?\x00db)
- ((?I ?p) . ?\x00de)
- ((?a ?`) . ?\x00e0)
- ((?a ?^) . ?\x00e2)
- ((?a ?~) . ?\x00e3)
- ((?a ?\") . ?\x00e4)
- ((?a ?@) . ?\x00e5)
- ((?e ?`) . ?\x00e8)
- ((?e ?^) . ?\x00ea)
- ((?e ?\") . ?\x00eb)
- ((?i ?`) . ?\x00ec)
- ((?i ?^) . ?\x00ee)
- ((?n ?~) . ?\x00f1)
- ((?o ?`) . ?\x00f2)
- ((?o ?^) . ?\x00f4)
- ((?o ?~) . ?\x00f5)
- ((?u ?`) . ?\x00f9)
- ((?u ?^) . ?\x00fb)
- ((?y ?\") . ?\x00ff))
- "Table of default digraphs.
-This includes all digraphs defined in RFC 1345,
-as well as miscellaneous digraphs for multi-byte characters.
-See also `evil-digraphs-table-user'.")
-
-(defun evil-digraph (digraph)
- "Convert DIGRAPH to character or list representation.
-If DIGRAPH is a list (CHAR1 CHAR2), return the corresponding character;
-if DIGRAPH is a character, return the corresponding list.
-Searches in `evil-digraphs-table-user' and `evil-digraphs-table'."
- (if (listp digraph)
- (let* ((char1 (car digraph))
- (char2 (cadr digraph)))
- (or (cdr (assoc (list char1 char2) evil-digraphs-table-user))
- (cdr (assoc (list char1 char2) evil-digraphs-table))
- (unless (eq char1 char2)
- (or (cdr (assoc (list char2 char1) evil-digraphs-table-user))
- (cdr (assoc (list char2 char1) evil-digraphs-table))))))
- (or (car (rassoc digraph evil-digraphs-table-user))
- (car (rassoc digraph evil-digraphs-table)))))
-
-(provide 'evil-digraphs)
-
-;;; evil-digraphs.el ends here
diff --git a/elpa/evil-20200718.842/evil-ex.el b/elpa/evil-20200718.842/evil-ex.el
deleted file mode 100644
index 95902f7..0000000
--- a/elpa/evil-20200718.842/evil-ex.el
+++ /dev/null
@@ -1,1178 +0,0 @@
-;;; evil-ex.el --- Ex-mode -*- lexical-binding: nil -*-
-
-;; Author: Frank Fischer <frank fischer at mathematik.tu-chemnitz.de>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Ex is implemented as an extensible minilanguage, whose grammar
-;; is stored in `evil-ex-grammar'. Ex commands are defined with
-;; `evil-ex-define-cmd', which creates a binding from a string
-;; to an interactive function. It is also possible to define key
-;; sequences which execute a command immediately when entered:
-;; such shortcuts go in `evil-ex-map'.
-;;
-;; To provide buffer and filename completion, as well as interactive
-;; feedback, Ex defines the concept of an argument handler, specified
-;; with `evil-ex-define-argument-type'. In the case of the
-;; substitution command (":s/foo/bar"), the handler incrementally
-;; highlights matches in the buffer as the substitution is typed.
-
-(require 'evil-common)
-(require 'evil-states)
-(require 'shell)
-
-;;; Code:
-
-(defconst evil-ex-grammar
- '((expression
- (count command argument #'evil-ex-call-command)
- ((\? range) command argument #'evil-ex-call-command)
- (line #'evil-goto-line)
- (sexp #'eval-expression))
- (count
- number)
- (command #'evil-ex-parse-command)
- (binding
- "[~&*@<>=:]+\\|[[:alpha:]_]+\\|!")
- (emacs-binding
- "[[:alpha:]-][[:alnum:][:punct:]-]+")
- (bang
- (\? (! space) "!" #'$1))
- (argument
- ((\? space) (\? "\\(?:.\\|\n\\)+") #'$2))
- (range
- ("%" #'(evil-ex-full-range))
- (line ";" line #'(let ((tmp1 $1))
- (save-excursion
- (goto-line tmp1)
- (evil-ex-range tmp1 $3))))
- (line "," line #'(evil-ex-range $1 $3))
- (line #'(evil-ex-range $1 nil))
- ("`" "[-a-zA-Z_<>']" ",`" "[-a-zA-Z_<>']"
- #'(evil-ex-char-marker-range $2 $4)))
- (line
- (base (\? offset) search (\? offset)
- #'(let ((tmp (evil-ex-line $1 $2)))
- (save-excursion
- (goto-line tmp)
- (evil-ex-line $3 $4))))
- ((\? base) offset search (\? offset)
- #'(let ((tmp (evil-ex-line $1 $2)))
- (save-excursion
- (goto-line tmp)
- (evil-ex-line $3 $4))))
- (base (\? offset) #'evil-ex-line)
- ((\? base) offset #'evil-ex-line))
- (base
- number
- marker
- search
- ("\\^" #'(evil-ex-first-line))
- ("\\$" #'(evil-ex-last-line))
- ("\\." #'(evil-ex-current-line)))
- (offset
- (+ signed-number #'+))
- (marker
- ("'" "[-a-zA-Z_<>']" #'(evil-ex-marker $2)))
- (search
- forward
- backward
- next
- prev
- subst)
- (forward
- ("/" "\\(?:[\\].\\|[^/,; ]\\)+" (! "/")
- #'(evil-ex-re-fwd $2))
- ("/" "\\(?:[\\].\\|[^/]\\)+" "/"
- #'(evil-ex-re-fwd $2)))
- (backward
- ("\\?" "\\(?:[\\].\\|[^?,; ]\\)+" (! "\\?")
- #'(evil-ex-re-bwd $2))
- ("\\?" "\\(?:[\\].\\|[^?]\\)+" "\\?"
- #'(evil-ex-re-bwd $2)))
- (next
- "\\\\/" #'(evil-ex-prev-search))
- (prev
- "\\\\\\?" #'(evil-ex-prev-search))
- (subst
- "\\\\&" #'(evil-ex-prev-search))
- (signed-number
- (sign (\? number) #'evil-ex-signed-number))
- (sign
- "\\+\\|-" #'intern)
- (number
- "[0-9]+" #'string-to-number)
- (space
- "[ ]+")
- (sexp
- "(.*)" #'(car-safe (read-from-string $1))))
- "Grammar for Ex.
-An association list of syntactic symbols and their definitions.
-The first entry is the start symbol. A symbol's definition may
-reference other symbols, but the grammar cannot contain
-left recursion. See `evil-parser' for a detailed explanation
-of the syntax.")
-
-(defvar evil-ex-echo-overlay nil
- "Overlay used for displaying info messages during ex.")
-
-(defun evil-ex-p ()
- "Whether Ex is currently active."
- (and evil-ex-current-buffer t))
-
-(evil-define-command evil-ex (&optional initial-input)
- "Enter an Ex command.
-The ex command line is initialized with the value of
-INITIAL-INPUT. If the command is called interactively the initial
-input depends on the current state. If the current state is
-normal state and no count argument is given then the initial
-input is empty. If a prefix count is given the initial input is
-.,.+count. If the current state is visual state then the initial
-input is the visual region '<,'> or `<,`>. If the value of the
-global variable `evil-ex-initial-input' is non-nil, its content
-is appended to the line."
- :keep-visual t
- :repeat abort
- (interactive
- (list
- (let ((s (concat
- (cond
- ((and (evil-visual-state-p)
- evil-ex-visual-char-range
- (memq (evil-visual-type) '(inclusive exclusive)))
- "`<,`>")
- ((evil-visual-state-p)
- "'<,'>")
- (current-prefix-arg
- (let ((arg (prefix-numeric-value current-prefix-arg)))
- (cond ((< arg 0) (setq arg (1+ arg)))
- ((> arg 0) (setq arg (1- arg))))
- (if (= arg 0) "."
- (format ".,.%+d" arg)))))
- evil-ex-initial-input)))
- (and (> (length s) 0) s))))
- (let ((evil-ex-current-buffer (current-buffer))
- (evil-ex-previous-command (unless initial-input
- (car-safe evil-ex-history)))
- evil-ex-argument-handler
- evil-ex-info-string
- result)
- (minibuffer-with-setup-hook
- (if initial-input #'evil-ex-setup-and-update #'evil-ex-setup)
- (setq result
- (read-from-minibuffer
- ":"
- (or initial-input
- (and evil-ex-previous-command
- (propertize evil-ex-previous-command 'face 'shadow)))
- evil-ex-completion-map
- nil
- 'evil-ex-history
- evil-ex-previous-command
- t)))
- (evil-ex-execute result)))
-
-(defun evil-ex-execute (result)
- "Execute RESULT as an ex command on `evil-ex-current-buffer'."
- ;; empty input means repeating the previous command
- (when (zerop (length result))
- (setq result evil-ex-previous-command))
- ;; parse data
- (evil-ex-update nil nil nil result)
- ;; execute command
- (unless (zerop (length result))
- (if evil-ex-expression
- (eval evil-ex-expression)
- (user-error "Ex: syntax error"))))
-
-(defun evil-ex-delete-backward-char ()
- "Close the minibuffer if it is empty.
-Otherwise behaves like `delete-backward-char'."
- (interactive)
- (call-interactively
- (if (zerop (length (minibuffer-contents)))
- #'abort-recursive-edit
- #'delete-backward-char)))
-
-(defun evil-ex-abort ()
- "Cancel ex state when another buffer is selected."
- (unless (minibufferp)
- (abort-recursive-edit)))
-
-(defun evil-ex-command-window-execute (config result)
- (select-window (active-minibuffer-window) t)
- (set-window-configuration config)
- (delete-minibuffer-contents)
- (insert result)
- (exit-minibuffer))
-
-(defun evil-ex-setup ()
- "Initialize Ex minibuffer.
-This function registers several hooks that are used for the
-interactive actions during ex state."
- (add-hook 'post-command-hook #'evil-ex-abort)
- (add-hook 'after-change-functions #'evil-ex-update nil t)
- (add-hook 'minibuffer-exit-hook #'evil-ex-teardown nil t)
- (when evil-ex-previous-command
- (add-hook 'pre-command-hook #'evil-ex-remove-default))
- (remove-hook 'minibuffer-setup-hook #'evil-ex-setup)
- (with-no-warnings
- (make-variable-buffer-local 'completion-at-point-functions))
- (setq completion-at-point-functions
- '(evil-ex-command-completion-at-point
- evil-ex-argument-completion-at-point)))
-(put 'evil-ex-setup 'permanent-local-hook t)
-
-(defun evil-ex-setup-and-update ()
- "Initialize Ex minibuffer with `evil-ex-setup', then call `evil-ex-update'."
- (evil-ex-setup)
- (evil-ex-update))
-
-(defun evil-ex-teardown ()
- "Deinitialize Ex minibuffer.
-Clean up everything set up by `evil-ex-setup'."
- (remove-hook 'post-command-hook #'evil-ex-abort)
- (remove-hook 'minibuffer-exit-hook #'evil-ex-teardown t)
- (remove-hook 'after-change-functions #'evil-ex-update t)
- (when evil-ex-argument-handler
- (let ((runner (evil-ex-argument-handler-runner
- evil-ex-argument-handler)))
- (when runner
- (funcall runner 'stop)))))
-(put 'evil-ex-teardown 'permanent-local-hook t)
-
-(defun evil-ex-remove-default ()
- "Remove the default text shown in the ex minibuffer.
-When ex starts, the previous command is shown enclosed in
-parenthesis. This function removes this text when the first key
-is pressed."
- (when (and (not (eq this-command 'exit-minibuffer))
- (/= (minibuffer-prompt-end) (point-max)))
- (if (eq this-command 'evil-ex-delete-backward-char)
- (setq this-command 'ignore))
- (delete-minibuffer-contents))
- (remove-hook 'pre-command-hook #'evil-ex-remove-default))
-(put 'evil-ex-remove-default 'permanent-local-hook t)
-
-(defun evil-ex-update (&optional beg end len string)
- "Update Ex variables when the minibuffer changes.
-This function is usually called from `after-change-functions'
-hook. If BEG is non-nil (which is the case when called from
-`after-change-functions'), then an error description is shown
-in case of incomplete or unknown commands."
- (let* ((prompt (minibuffer-prompt-end))
- (string (or string (buffer-substring prompt (point-max))))
- arg bang cmd count expr func handler range tree type)
- (cond
- ((and (eq this-command #'self-insert-command)
- (commandp (setq cmd (lookup-key evil-ex-map string))))
- (setq evil-ex-expression `(call-interactively #',cmd))
- (when (minibufferp)
- (exit-minibuffer)))
- (t
- (setq cmd nil)
- ;; store the buffer position of each character
- ;; as the `ex-index' text property
- (dotimes (i (length string))
- (add-text-properties
- i (1+ i) (list 'ex-index (+ i prompt)) string))
- (with-current-buffer evil-ex-current-buffer
- (setq tree (evil-ex-parse string t)
- expr (evil-ex-parse string))
- (when (eq (car-safe expr) 'evil-ex-call-command)
- (setq count (eval (nth 1 expr))
- cmd (eval (nth 2 expr))
- arg (eval (nth 3 expr))
- range (cond
- ((evil-range-p count)
- count)
- ((numberp count)
- (evil-ex-range count count)))
- bang (and (save-match-data (string-match ".!$" cmd)) t))))
- (setq evil-ex-tree tree
- evil-ex-expression expr
- evil-ex-range range
- evil-ex-cmd cmd
- evil-ex-bang bang
- evil-ex-argument arg)
- ;; test the current command
- (when (and cmd (minibufferp))
- (setq func (evil-ex-completed-binding cmd t))
- (cond
- ;; update argument-handler
- (func
- (when (setq type (evil-get-command-property
- func :ex-arg))
- (setq handler (cdr-safe
- (assoc type
- evil-ex-argument-types))))
- (unless (eq handler evil-ex-argument-handler)
- (let ((runner (and evil-ex-argument-handler
- (evil-ex-argument-handler-runner
- evil-ex-argument-handler))))
- (when runner (funcall runner 'stop)))
- (setq evil-ex-argument-handler handler)
- (let ((runner (and evil-ex-argument-handler
- (evil-ex-argument-handler-runner
- evil-ex-argument-handler))))
- (when runner (funcall runner 'start evil-ex-argument))))
- (let ((runner (and evil-ex-argument-handler
- (evil-ex-argument-handler-runner
- evil-ex-argument-handler))))
- (when runner (funcall runner 'update evil-ex-argument))))
- (beg
- ;; show error message only when called from `after-change-functions'
- (let ((n (length (all-completions cmd (evil-ex-completion-table)))))
- (cond
- ((> n 1) (evil-ex-echo "Incomplete command"))
- ((= n 0) (evil-ex-echo "Unknown command")))))))))))
-(put 'evil-ex-update 'permanent-local-hook t)
-
-(defun evil-ex-echo (string &rest args)
- "Display a message after the current Ex command."
- (with-selected-window (minibuffer-window)
- (with-current-buffer (window-buffer (minibuffer-window))
- (unless (or evil-no-display
- (zerop (length string)))
- (let ((string (format " [%s]" (apply #'format string args)))
- (ov (or evil-ex-echo-overlay
- (setq evil-ex-echo-overlay (make-overlay (point-min) (point-max) nil t t))))
- after-change-functions before-change-functions)
- (put-text-property 0 (length string) 'face 'evil-ex-info string)
- ;; The following 'trick' causes point to be shown before the
- ;; message instead behind. It is shamelessly stolen from the
- ;; implementation of `minibuffer-message`.
- (put-text-property 0 1 'cursor t string)
- (move-overlay ov (point-max) (point-max))
- (overlay-put ov 'after-string string)
- (add-hook 'pre-command-hook #'evil--ex-remove-echo-overlay nil t))))))
-
-(defun evil--ex-remove-echo-overlay ()
- "Remove echo overlay from ex minibuffer."
- (when evil-ex-echo-overlay
- (delete-overlay evil-ex-echo-overlay)
- (setq evil-ex-echo-overlay nil))
- (remove-hook 'pre-command-hook 'evil--ex-remove-echo-overlay t))
-
-(defun evil-ex-completion ()
- "Completes the current ex command or argument."
- (interactive)
- (let (after-change-functions)
- (evil-ex-update)
- (completion-at-point)
- (remove-text-properties (minibuffer-prompt-end) (point-max) '(face nil evil))))
-
-(defun evil-ex-command-completion-at-point ()
- (let ((beg (or (get-text-property 0 'ex-index evil-ex-cmd)
- (point)))
- (end (point)))
- (list beg end (evil-ex-completion-table) :exclusive 'no)))
-
-(defun evil-ex-completion-table ()
- (cond
- ((eq evil-ex-complete-emacs-commands nil)
- #'evil-ex-command-collection)
- ((eq evil-ex-complete-emacs-commands 'in-turn)
- (completion-table-in-turn
- #'evil-ex-command-collection
- #'(lambda (str pred flag)
- (completion-table-with-predicate
- obarray #'commandp t str pred flag))))
- (t
- #'(lambda (str pred flag)
- (evil-completion-table-concat
- #'evil-ex-command-collection
- #'(lambda (str pred flag)
- (completion-table-with-predicate
- obarray #'commandp t str pred flag))
- str pred flag)))))
-
-(defun evil-completion-table-concat (table1 table2 string pred flag)
- (cond
- ((eq flag nil)
- (let ((result1 (try-completion string table1 pred))
- (result2 (try-completion string table2 pred)))
- (cond
- ((null result1) result2)
- ((null result2) result1)
- ((and (eq result1 t) (eq result2 t)) t)
- (t result1))))
- ((eq flag t)
- (delete-dups
- (append (all-completions string table1 pred)
- (all-completions string table2 pred))))
- ((eq flag 'lambda)
- (and (or (eq t (test-completion string table1 pred))
- (eq t (test-completion string table2 pred)))
- t))
- ((eq (car-safe flag) 'boundaries)
- (or (completion-boundaries string table1 pred (cdr flag))
- (completion-boundaries string table2 pred (cdr flag))))
- ((eq flag 'metadata)
- '(metadata (display-sort-function . evil-ex-sort-completions)))))
-
-(defun evil-ex-sort-completions (completions)
- (sort completions
- #'(lambda (str1 str2)
- (let ((p1 (eq 'evil-ex-commands (get-text-property 0 'face str1)))
- (p2 (eq 'evil-ex-commands (get-text-property 0 'face str2))))
- (if (equal p1 p2)
- (string< str1 str2)
- p1)))))
-
-(defun evil-ex-command-collection (cmd predicate flag)
- "Called to complete a command."
- (let (commands)
- ;; append ! to all commands that may take a bang argument
- (dolist (cmd (mapcar #'car evil-ex-commands))
- (push cmd commands)
- (if (evil-ex-command-force-p cmd)
- (push (concat cmd "!") commands)))
- (when (eq evil-ex-complete-emacs-commands t)
- (setq commands
- (mapcar #'(lambda (str) (propertize str 'face 'evil-ex-commands))
- commands)))
- (cond
- ((eq flag nil) (try-completion cmd commands predicate))
- ((eq flag t) (all-completions cmd commands predicate))
- ((eq flag 'lambda) (test-completion cmd commands))
- ((eq (car-safe flag) 'boundaries)
- `(boundaries 0 . ,(length (cdr flag)))))))
-
-(defun evil-ex-argument-completion-at-point ()
- (let ((context (evil-ex-syntactic-context (1- (point)))))
- (when (memq 'argument context)
- ;; if it's an autoload, load the function; this allows external
- ;; packages to register autoloaded ex commands which will be
- ;; loaded when ex argument completion is triggered
- (let ((binding-definition (symbol-function (evil-ex-binding evil-ex-cmd))))
- (when (autoloadp binding-definition)
- (autoload-do-load binding-definition)))
-
- (let* ((beg (or (and evil-ex-argument
- (get-text-property 0 'ex-index evil-ex-argument))
- (point)))
- (end (1+ (or (and evil-ex-argument
- (get-text-property (1- (length evil-ex-argument))
- 'ex-index
- evil-ex-argument))
- (1- (point)))))
- (binding (evil-ex-completed-binding evil-ex-cmd))
- (arg-type (evil-get-command-property binding :ex-arg))
- (arg-handler (assoc arg-type evil-ex-argument-types))
- (completer (and arg-handler
- (evil-ex-argument-handler-completer
- (cdr arg-handler)))))
- (when completer
- (if (eq (car completer) 'collection)
- (list beg end (cdr completer))
- (save-restriction
- (narrow-to-region beg (point-max))
- (funcall (cdr completer)))))))))
-
-(defun evil-ex-define-cmd (cmd function)
- "Binds the function FUNCTION to the command CMD."
- (save-match-data
- (if (string-match "^[^][]*\\(\\[\\(.*\\)\\]\\)[^][]*$" cmd)
- (let ((abbrev (replace-match "" nil t cmd 1))
- (full (replace-match "\\2" nil nil cmd 1)))
- (evil--add-to-alist 'evil-ex-commands full function)
- (evil--add-to-alist 'evil-ex-commands abbrev full))
- (evil--add-to-alist 'evil-ex-commands cmd function))))
-
-(defun evil-ex-make-argument-handler (runner completer)
- (list runner completer))
-
-(defun evil-ex-argument-handler-runner (arg-handler)
- (car arg-handler))
-
-(defun evil-ex-argument-handler-completer (arg-handler)
- (cadr arg-handler))
-
-(defmacro evil-ex-define-argument-type (arg-type doc &rest body)
- "Defines a new handler for argument-type ARG-TYPE.
-DOC is the documentation string. It is followed by a list of
-keywords and function:
-
-:collection COLLECTION
-
- A collection for completion as required by `all-completions'.
-
-:completion-at-point FUNC
-
- Function to be called to initialize a potential
- completion. FUNC must match the requirements as described for
- the variable `completion-at-point-functions'. When FUNC is
- called the minibuffer content is narrowed to exactly match the
- argument.
-
-:runner FUNC
-
- Function to be called when the type of the current argument
- changes or when the content of this argument changes. This
- function should take one obligatory argument FLAG followed by
- an optional argument ARG. FLAG is one of three symbol 'start,
- 'stop or 'update. When the argument type is recognized for the
- first time and this handler is started the FLAG is 'start. If
- the argument type changes to something else or ex state
- finished the handler FLAG is 'stop. If the content of the
- argument has changed FLAG is 'update. If FLAG is either 'start
- or 'update then ARG is the current value of this argument. If
- FLAG is 'stop then arg is nil."
- (declare (indent defun)
- (doc-string 2)
- (debug (&define name
- [&optional stringp]
- [&rest [keywordp function-form]])))
- (unless (stringp doc) (push doc body))
- (let (runner completer)
- (while (keywordp (car-safe body))
- (let ((key (pop body))
- (func (pop body)))
- (cond
- ((eq key :runner)
- (setq runner func))
- ((eq key :collection)
- (setq completer (cons 'collection func)))
- ((eq key :completion-at-point)
- (setq completer (cons 'completion-at-point func))))))
- `(eval-and-compile
- (evil--add-to-alist
- 'evil-ex-argument-types
- ',arg-type
- '(,runner ,completer)))))
-
-(evil-ex-define-argument-type file
- "Handles a file argument."
- :collection read-file-name-internal)
-
-(evil-ex-define-argument-type buffer
- "Called to complete a buffer name argument."
- :collection internal-complete-buffer)
-
-(declare-function shell-completion-vars "shell" ())
-
-(defun evil-ex-init-shell-argument-completion (flag &optional arg)
- "Prepares the current minibuffer for completion of shell commands.
-This function must be called from the :runner function of some
-argument handler that requires shell completion."
- (when (and (eq flag 'start)
- (not evil-ex-shell-argument-initialized))
- (set (make-local-variable 'evil-ex-shell-argument-initialized) t)
- (cond
- ;; Emacs 24
- ((fboundp 'comint-completion-at-point)
- (shell-completion-vars))
- (t
- (set (make-local-variable 'minibuffer-default-add-function)
- 'minibuffer-default-add-shell-commands)))
- (setq completion-at-point-functions
- '(evil-ex-command-completion-at-point
- evil-ex-argument-completion-at-point))))
-
-(define-obsolete-function-alias
- 'evil-ex-shell-command-completion-at-point
- 'comint-completion-at-point)
-
-(evil-ex-define-argument-type shell
- "Shell argument type, supports completion."
- :completion-at-point comint-completion-at-point
- :runner evil-ex-init-shell-argument-completion)
-
-(defun evil-ex-file-or-shell-command-completion-at-point ()
- (if (and (< (point-min) (point-max))
- (= (char-after (point-min)) ?!))
- (save-restriction
- (narrow-to-region (1+ (point-min)) (point-max))
- (comint-completion-at-point))
- (list (point-min) (point-max) #'read-file-name-internal)))
-
-(evil-ex-define-argument-type file-or-shell
- "File or shell argument type.
-If the current argument starts with a ! the rest of the argument
-is considered a shell command, otherwise a file-name. Completion
-works accordingly."
- :completion-at-point evil-ex-file-or-shell-command-completion-at-point
- :runner evil-ex-init-shell-argument-completion)
-
-(defun evil-ex-binding (command &optional noerror)
- "Returns the final binding of COMMAND."
- (save-match-data
- (let ((binding command))
- (when binding
- (string-match "^\\(.+?\\)\\!?$" binding)
- (setq binding (match-string 1 binding))
- (while (progn
- (setq binding (cdr (assoc binding evil-ex-commands)))
- (stringp binding)))
- (unless binding
- (setq binding (intern command)))
- (if (commandp binding)
- ;; check for remaps
- (or (command-remapping binding) binding)
- (unless noerror
- (user-error "Unknown command: `%s'" command)))))))
-
-(defun evil-ex-completed-binding (command &optional noerror)
- "Returns the final binding of the completion of COMMAND."
- (let ((completion (try-completion command evil-ex-commands)))
- (evil-ex-binding (if (eq completion t) command
- (or completion command))
- noerror)))
-
-;;; TODO: extensions likes :p :~ <cfile> ...
-(defun evil-ex-replace-special-filenames (file-name)
- "Replace special symbols in FILE-NAME.
-Replaces % by the current file-name,
-Replaces # by the alternate file-name in FILE-NAME."
- (let ((remote (file-remote-p file-name))
- (current-fname (buffer-file-name))
- (alternate-fname (and (other-buffer)
- (buffer-file-name (other-buffer)))))
- (setq file-name (or (file-remote-p file-name 'localname) file-name))
- (when current-fname
- (setq current-fname (or (file-remote-p current-fname 'localname)
- current-fname))
- (setq file-name
- (replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%\\)"
- current-fname file-name
- t t 2)))
- (when alternate-fname
- (setq alternate-fname (or (file-remote-p alternate-fname 'localname)
- alternate-fname))
- (setq file-name
- (replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(#\\)"
- alternate-fname file-name
- t t 2)))
- (setq file-name
- (replace-regexp-in-string "\\\\\\([#%]\\)"
- "\\1" file-name t))
- (setq file-name (concat remote file-name)))
- file-name)
-
-(defun evil-ex-file-arg ()
- "Returns the current Ex argument as a file name.
-This function interprets special file names like # and %."
- (unless (zerop (length evil-ex-argument))
- (evil-ex-replace-special-filenames evil-ex-argument)))
-
-(defun evil-ex-repeat (count)
- "Repeats the last ex command."
- (interactive "P")
- (when count
- (goto-char (point-min))
- (forward-line (1- count)))
- (let ((evil-ex-current-buffer (current-buffer))
- (hist evil-ex-history))
- (while hist
- (let ((evil-ex-last-cmd (pop hist)))
- (when evil-ex-last-cmd
- (evil-ex-update nil nil nil evil-ex-last-cmd)
- (let ((binding (evil-ex-binding evil-ex-cmd)))
- (unless (eq binding #'evil-ex-repeat)
- (setq hist nil)
- (if evil-ex-expression
- (eval evil-ex-expression)
- (user-error "Ex: syntax error")))))))))
-
-(defun evil-ex-call-command (range command argument)
- "Execute the given command COMMAND."
- (let* ((count (when (numberp range) range))
- (range (when (evil-range-p range) range))
- (bang (and (save-match-data (string-match ".!$" command)) t))
- (evil-ex-point (point))
- (evil-ex-range
- (or range (and count (evil-ex-range count count))))
- (evil-ex-command (evil-ex-completed-binding command))
- (evil-ex-bang (and bang t))
- (evil-ex-argument (copy-sequence argument))
- (evil-this-type (evil-type evil-ex-range))
- (current-prefix-arg count)
- (prefix-arg current-prefix-arg))
- (when (stringp evil-ex-argument)
- (set-text-properties
- 0 (length evil-ex-argument) nil evil-ex-argument))
- (let ((buf (current-buffer)))
- (unwind-protect
- (cond
- ((not evil-ex-range)
- (setq this-command evil-ex-command)
- (run-hooks 'pre-command-hook)
- (call-interactively evil-ex-command)
- (run-hooks 'post-command-hook))
- (t
- ;; set visual selection to match the region if an explicit
- ;; range has been specified
- (let ((ex-range (evil-copy-range evil-ex-range))
- beg end)
- (evil-expand-range ex-range)
- (setq beg (evil-range-beginning ex-range)
- end (evil-range-end ex-range))
- (evil-sort beg end)
- (setq this-command evil-ex-command)
- (run-hooks 'pre-command-hook)
- (set-mark end)
- (goto-char beg)
- (activate-mark)
- (call-interactively evil-ex-command)
- (run-hooks 'post-command-hook))))
- (when (buffer-live-p buf)
- (with-current-buffer buf
- (deactivate-mark)))))))
-
-(defun evil-ex-line (base &optional offset)
- "Return the line number of BASE plus OFFSET."
- (+ (or base (line-number-at-pos))
- (or offset 0)))
-
-(defun evil-ex-first-line ()
- "Return the line number of the first line."
- (line-number-at-pos (point-min)))
-
-(defun evil-ex-current-line ()
- "Return the line number of the current line."
- (line-number-at-pos (point)))
-
-(defun evil-ex-last-line ()
- "Return the line number of the last line."
- (save-excursion
- (goto-char (point-max))
- (when (bolp)
- (forward-line -1))
- (line-number-at-pos)))
-
-(defun evil-ex-range (beg-line &optional end-line)
- "Returns the first and last position of the current range."
- (evil-range
- (evil-line-position beg-line)
- (evil-line-position (or end-line beg-line) -1)
- 'line
- :expanded t))
-
-(defun evil-ex-full-range ()
- "Return a range encompassing the whole buffer."
- (evil-range (point-min) (point-max) 'line))
-
-(defun evil-ex-marker (marker)
- "Return MARKER's line number in the current buffer.
-Signal an error if MARKER is in a different buffer."
- (when (stringp marker)
- (setq marker (aref marker 0)))
- (setq marker (evil-get-marker marker))
- (if (numberp marker)
- (line-number-at-pos marker)
- (user-error "Ex does not support markers in other files")))
-
-(defun evil-ex-char-marker-range (beg end)
- (when (stringp beg) (setq beg (aref beg 0)))
- (when (stringp end) (setq end (aref end 0)))
- (setq beg (evil-get-marker beg)
- end (evil-get-marker end))
- (if (and (numberp beg) (numberp end))
- (evil-expand-range
- (evil-range beg end
- (if (evil-visual-state-p)
- (evil-visual-type)
- 'inclusive)))
- (user-error "Ex does not support markers in other files")))
-
-(defun evil-ex-re-fwd (pattern)
- "Search forward for PATTERN.
-Returns the line number of the match."
- (condition-case err
- (save-match-data
- (save-excursion
- (set-text-properties 0 (length pattern) nil pattern)
- (evil-move-end-of-line)
- (and (re-search-forward pattern nil t)
- (line-number-at-pos (1- (match-end 0))))))
- (invalid-regexp
- (evil-ex-echo (cadr err))
- nil)))
-
-(defun evil-ex-re-bwd (pattern)
- "Search backward for PATTERN.
-Returns the line number of the match."
- (condition-case err
- (save-match-data
- (save-excursion
- (set-text-properties 0 (length pattern) nil pattern)
- (evil-move-beginning-of-line)
- (and (re-search-backward pattern nil t)
- (line-number-at-pos (match-beginning 0)))))
- (invalid-regexp
- (evil-ex-echo (cadr err))
- nil)))
-
-(defun evil-ex-prev-search ()
- (error "Previous search not yet implemented"))
-
-(defun evil-ex-signed-number (sign &optional number)
- "Return a signed number like -3 and +1.
-NUMBER defaults to 1."
- (funcall sign (or number 1)))
-
-;; function `evil-ex-eval' has been superseded by `evil-ex-parse' plus `eval'
-(make-obsolete 'evil-ex-eval 'evil-ex-parse "1.2.14")
-
-(defun evil-ex-parse (string &optional syntax start)
- "Parse STRING as an Ex expression and return an evaluation tree.
-If SYNTAX is non-nil, return a syntax tree instead.
-START is the start symbol, which defaults to `expression'."
- (let* ((start (or start (car-safe (car-safe evil-ex-grammar))))
- (match (evil-parser
- string start evil-ex-grammar t syntax)))
- (car-safe match)))
-
-(defun evil-ex-parse-command (string)
- "Parse STRING as an Ex binding."
- (let ((result (evil-parser string 'binding evil-ex-grammar))
- bang command)
- (when result
- (setq command (car-safe result)
- string (cdr-safe result))
- ;; check whether the parsed command is followed by a slash, dash
- ;; or number and either the part before is NOT known to be a binding,
- ;; or the complete string IS known to be a binding
- (when (and (> (length string) 0)
- (string-match-p "^[-/[:digit:]]" string)
- (or (evil-ex-binding (concat command string) t)
- (not (evil-ex-binding command t))))
- (setq result (evil-parser (concat command string)
- 'emacs-binding
- evil-ex-grammar)
- command (car-safe result)
- string (cdr-safe result)))
- ;; parse a following "!" as bang only if
- ;; the command has the property :ex-bang t
- (when (evil-ex-command-force-p command)
- (setq result (evil-parser string 'bang evil-ex-grammar)
- bang (or (car-safe result) "")
- string (cdr-safe result)
- command (concat command bang)))
- (cons command string))))
-
-(defun evil-ex-command-force-p (command)
- "Whether COMMAND accepts the bang argument."
- (let ((binding (evil-ex-completed-binding command t)))
- (when binding
- (evil-get-command-property binding :ex-bang))))
-
-(defun evil-flatten-syntax-tree (tree)
- "Find all paths from the root of TREE to its leaves.
-TREE is a syntax tree, i.e., all its leave nodes are strings.
-The `nth' element in the result is the syntactic context
-for the corresponding string index (counted from zero)."
- (let* ((result nil)
- (traverse nil)
- (traverse
- #'(lambda (tree path)
- (if (stringp tree)
- (dotimes (char (length tree))
- (push path result))
- (let ((path (cons (car tree) path)))
- (dolist (subtree (cdr tree))
- (funcall traverse subtree path)))))))
- (funcall traverse tree nil)
- (nreverse result)))
-
-(defun evil-ex-syntactic-context (&optional pos)
- "Return the syntactical context of the character at POS.
-POS defaults to the current position of point."
- (let* ((contexts (evil-flatten-syntax-tree evil-ex-tree))
- (length (length contexts))
- (pos (- (or pos (point)) (minibuffer-prompt-end))))
- (when (>= pos length)
- (setq pos (1- length)))
- (when (< pos 0)
- (setq pos 0))
- (when contexts
- (nth pos contexts))))
-
-(defun evil-parser--dexp (obj)
- "Parse a numerical dollar-sign symbol.
-Given e.g. $4, return 4."
- (when (symbolp obj)
- (let ((str (symbol-name obj)))
- (save-match-data
- (when (string-match "\\$\\([0-9]+\\)" str)
- (string-to-number (match-string 1 str)))))))
-
-(defun evil-parser--dval (obj result)
- "Substitute all dollar-sign symbols in OBJ.
-Each dollar-sign symbol is replaced with the corresponding
-element in RESULT, so that $1 becomes the first element, etc.
-The special value $0 is substituted with the whole list RESULT.
-If RESULT is not a list, all dollar-sign symbols are substituted with
-RESULT."
- (if (listp obj)
- (mapcar (lambda (obj) (evil-parser--dval obj result)) obj)
- (let ((num (evil-parser--dexp obj)))
- (if num
- (if (not (listp result))
- result
- (if (eq num 0)
- `(list ,@result)
- (nth (1- num) result)))
- obj))))
-
-(defun evil-parser (string symbol grammar &optional greedy syntax)
- "Parse STRING as a SYMBOL in GRAMMAR.
-If GREEDY is non-nil, the whole of STRING must match.
-If the parse succeeds, the return value is a cons cell
-\(RESULT . TAIL), where RESULT is a parse tree and TAIL is
-the remainder of STRING. Otherwise, the return value is nil.
-
-GRAMMAR is an association list of symbols and their definitions.
-A definition is either a list of production rules, which are
-tried in succession, or a #'-quoted function, which is called
-to parse the input.
-
-A production rule can be one of the following:
-
- nil matches the empty string.
- A regular expression matches a substring.
- A symbol matches a production for that symbol.
- (X Y) matches X followed by Y.
- (\\? X) matches zero or one of X.
- (* X) matches zero or more of X.
- (+ X) matches one or more of X.
- (& X) matches X, but does not consume.
- (! X) matches anything but X, but does not consume.
-
-Thus, a simple grammar may look like:
-
- ((plus \"\\\\+\") ; plus <- \"+\"
- (minus \"-\") ; minus <- \"-\"
- (operator plus minus)) ; operator <- plus / minus
-
-All input-consuming rules have a value. A regular expression evaluates
-to the text matched, while a list evaluates to a list of values.
-The value of a list may be overridden with a semantic action, which is
-specified with a #'-quoted expression at the end:
-
- (X Y #'foo)
-
-The value of this rule is the result of calling foo with the values
-of X and Y as arguments. Alternatively, the function call may be
-specified explicitly:
-
- (X Y #'(foo $1 $2))
-
-Here, $1 refers to X and $2 refers to Y. $0 refers to the whole list.
-Dollar expressions can also be used directly:
-
- (X Y #'$1)
-
-This matches X followed by Y, but ignores the value of Y;
-the value of the list is the same as the value of X.
-
-If the SYNTAX argument is non-nil, then all semantic actions
-are ignored, and a syntax tree is constructed instead. The
-syntax tree obeys the property that all the leave nodes are
-parts of the input string. Thus, by traversing the syntax tree,
-one can determine how each character was parsed.
-
-The following symbols have reserved meanings within a grammar:
-`\\?', `*', `+', `&', `!', `function', `alt', `seq' and nil."
- (let ((string (or string ""))
- func pair result rules tail)
- (cond
- ;; epsilon
- ((member symbol '("" nil))
- (setq pair (cons (if syntax "" nil) string)))
- ;; token
- ((stringp symbol)
- (save-match-data
- (when (or (eq (string-match symbol string) 0)
- ;; ignore leading whitespace
- (and (eq (string-match "^[ \f\t\n\r\v]+" string) 0)
- (eq (match-end 0)
- (string-match
- symbol string (match-end 0)))))
- (setq result (match-string 0 string)
- tail (substring string (match-end 0))
- pair (cons result tail))
- (when (and syntax pair)
- (setq result (substring string 0
- (- (length string)
- (length tail))))
- (setcar pair result)))))
- ;; symbol
- ((symbolp symbol)
- (let ((context symbol))
- (setq rules (cdr-safe (assq symbol grammar)))
- (setq pair (evil-parser string `(alt ,@rules)
- grammar greedy syntax))
- (when (and syntax pair)
- (setq result (car pair))
- (if (and (listp result) (sequencep (car result)))
- (setq result `(,symbol ,@result))
- (setq result `(,symbol ,result)))
- (setcar pair result))))
- ;; function
- ((eq (car-safe symbol) 'function)
- (setq symbol (cadr symbol)
- pair (funcall symbol string))
- (when (and syntax pair)
- (setq tail (or (cdr pair) "")
- result (substring string 0
- (- (length string)
- (length tail))))
- (setcar pair result)))
- ;; list
- ((listp symbol)
- (setq rules symbol
- symbol (car-safe rules))
- (if (memq symbol '(& ! \? * + alt seq))
- (setq rules (cdr rules))
- (setq symbol 'seq))
- (when (and (memq symbol '(+ alt seq))
- (> (length rules) 1))
- (setq func (car (last rules)))
- (if (eq (car-safe func) 'function)
- (setq rules (delq func (copy-sequence rules))
- func (cadr func))
- (setq func nil)))
- (cond
- ;; positive lookahead
- ((eq symbol '&)
- (when (evil-parser string rules grammar greedy syntax)
- (setq pair (evil-parser string nil grammar nil syntax))))
- ;; negative lookahead
- ((eq symbol '!)
- (unless (evil-parser string rules grammar greedy syntax)
- (setq pair (evil-parser string nil grammar nil syntax))))
- ;; zero or one
- ((eq symbol '\?)
- (setq rules (if (> (length rules) 1)
- `(alt ,rules nil)
- `(alt ,@rules nil))
- pair (evil-parser string rules grammar greedy syntax)))
- ;; zero or more
- ((eq symbol '*)
- (setq rules `(alt (+ ,@rules) nil)
- pair (evil-parser string rules grammar greedy syntax)))
- ;; one or more
- ((eq symbol '+)
- (let (current results)
- (catch 'done
- (while (setq current (evil-parser
- string rules grammar nil syntax))
- (setq result (car-safe current)
- tail (or (cdr-safe current) "")
- results (append results (if syntax result
- (cdr-safe result))))
- ;; stop if stuck
- (if (equal string tail)
- (throw 'done nil)
- (setq string tail))))
- (when results
- (setq func (or func 'list)
- pair (cons results tail)))))
- ;; alternatives
- ((eq symbol 'alt)
- (catch 'done
- (dolist (rule rules)
- (when (setq pair (evil-parser
- string rule grammar greedy syntax))
- (throw 'done pair)))))
- ;; sequence
- (t
- (setq func (or func 'list))
- (let ((last (car-safe (last rules)))
- current results rule)
- (catch 'done
- (while rules
- (setq rule (pop rules)
- current (evil-parser string rule grammar
- (when greedy
- (null rules))
- syntax))
- (cond
- ((null current)
- (setq results nil)
- (throw 'done nil))
- (t
- (setq result (car-safe current)
- tail (cdr-safe current))
- (unless (memq (car-safe rule) '(& !))
- (if (and syntax
- (or (null result)
- (and (listp result)
- (listp rule)
- ;; splice in single-element
- ;; (\? ...) expressions
- (not (and (eq (car-safe rule) '\?)
- (eq (length rule) 2))))))
- (setq results (append results result))
- (setq results (append results (list result)))))
- (setq string (or tail ""))))))
- (when results
- (setq pair (cons results tail))))))
- ;; semantic action
- (when (and pair func (not syntax))
- (setq result (car pair))
- (cond
- ((null func)
- (setq result nil))
- ;; lambda function
- ((eq (car-safe func) 'lambda)
- (if (memq symbol '(+ seq))
- (setq result `(funcall ,func ,@result))
- (setq result `(funcall ,func ,result))))
- ;; string replacement
- ((or (stringp func) (stringp (car-safe func)))
- (let* ((symbol (or (car-safe (cdr-safe func))
- (and (boundp 'context) context)
- (car-safe (car-safe grammar))))
- (string (if (stringp func) func (car-safe func))))
- (setq result (car-safe (evil-parser string symbol grammar
- greedy syntax)))))
- ;; dollar expression
- ((evil-parser--dexp func)
- (setq result (evil-parser--dval func result)))
- ;; function call
- ((listp func)
- (setq result (evil-parser--dval func result)))
- ;; symbol
- (t
- (if (memq symbol '(+ seq))
- (setq result `(,func ,@result))
- (setq result `(,func ,result)))))
- (setcar pair result))))
- ;; weed out incomplete matches
- (when pair
- (if (not greedy) pair
- (if (null (cdr pair)) pair
- ;; ignore trailing whitespace
- (when (save-match-data (string-match "^[ \f\t\n\r\v]*$" (cdr pair)))
- (unless syntax (setcdr pair nil))
- pair))))))
-
-(provide 'evil-ex)
-
-;;; evil-ex.el ends here
diff --git a/elpa/evil-20200718.842/evil-integration.el b/elpa/evil-20200718.842/evil-integration.el
deleted file mode 100644
index 01bd247..0000000
--- a/elpa/evil-20200718.842/evil-integration.el
+++ /dev/null
@@ -1,533 +0,0 @@
-;;; evil-integration.el --- Integrate Evil with other modules -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This provides evil integration for various emacs modes.
-;; Additional keybindings (or default state) should go into evil-keybindings.el.
-
-;;; Code:
-
-(require 'evil-maps)
-(require 'evil-core)
-(require 'evil-macros)
-(require 'evil-types)
-(require 'evil-repeat)
-
-;;; Evilize some commands
-
-;; unbound keys should be ignored
-(evil-declare-ignore-repeat 'undefined)
-
-(mapc #'(lambda (cmd)
- (evil-set-command-property cmd :keep-visual t)
- (evil-declare-not-repeat cmd))
- '(digit-argument
- negative-argument
- universal-argument
- universal-argument-minus
- universal-argument-more
- universal-argument-other-key))
-(mapc #'evil-declare-not-repeat
- '(what-cursor-position))
-(mapc #'evil-declare-change-repeat
- '(dabbrev-expand
- hippie-expand
- quoted-insert))
-(mapc #'evil-declare-abort-repeat
- '(balance-windows
- eval-expression
- execute-extended-command
- exit-minibuffer
- compile
- delete-window
- delete-other-windows
- find-file-at-point
- ffap-other-window
- recompile
- redo
- save-buffer
- split-window
- split-window-horizontally
- split-window-vertically
- undo
- undo-tree-redo
- undo-tree-undo))
-
-(evil-set-type #'previous-line 'line)
-(evil-set-type #'next-line 'line)
-
-(dolist (cmd '(keyboard-quit keyboard-escape-quit))
- (evil-set-command-property cmd :suppress-operator t))
-
-;;; Mouse
-(evil-declare-insert-at-point-repeat 'mouse-yank-primary)
-(evil-declare-insert-at-point-repeat 'mouse-yank-secondary)
-
-;;; key-binding
-
-;; Calling `keyboard-quit' should cancel repeat
-(defadvice keyboard-quit (before evil activate)
- (when (fboundp 'evil-repeat-abort)
- (evil-repeat-abort)))
-
-(eval-after-load 'wdired
- '(progn
- (add-hook 'wdired-mode-hook #'evil-change-to-initial-state)
- (defadvice wdired-change-to-dired-mode (after evil activate)
- (evil-change-to-initial-state nil t))))
-
-;;; Parentheses
-
-(defadvice show-paren-function (around evil disable)
- "Match parentheses in Normal state."
- (if (if (memq 'not evil-highlight-closing-paren-at-point-states)
- (memq evil-state evil-highlight-closing-paren-at-point-states)
- (not (memq evil-state evil-highlight-closing-paren-at-point-states)))
- ad-do-it
- (let ((pos (point)) syntax narrow)
- (setq pos
- (catch 'end
- (dotimes (var (1+ (* 2 evil-show-paren-range)))
- (if (zerop (mod var 2))
- (setq pos (+ pos var))
- (setq pos (- pos var)))
- (setq syntax (syntax-class (syntax-after pos)))
- (cond
- ((eq syntax 4)
- (setq narrow pos)
- (throw 'end pos))
- ((eq syntax 5)
- (throw 'end (1+ pos)))))))
- (if pos
- (save-excursion
- (goto-char pos)
- (save-restriction
- (when narrow
- (narrow-to-region narrow (point-max)))
- ad-do-it))
- ;; prevent the preceding pair from being highlighted
- (dolist (ov '(show-paren--overlay
- show-paren--overlay-1
- show-paren-overlay
- show-paren-overlay-1))
- (let ((ov (and (boundp ov) (symbol-value ov))))
- (when (overlayp ov) (delete-overlay ov))))))))
-
-;;; Undo tree
-(when (and (require 'undo-tree nil t)
- (fboundp 'global-undo-tree-mode))
- (global-undo-tree-mode 1))
-
-(eval-after-load 'undo-tree
- '(with-no-warnings
- (defun evil-turn-on-undo-tree-mode ()
- "Enable `undo-tree-mode' if evil is enabled.
-This function enables `undo-tree-mode' when Evil is activated in
-some buffer, but only if `global-undo-tree-mode' is also
-activated."
- (when (and (boundp 'global-undo-tree-mode)
- global-undo-tree-mode)
- (turn-on-undo-tree-mode)))
-
- (add-hook 'evil-local-mode-hook #'evil-turn-on-undo-tree-mode)
-
- (defadvice undo-tree-visualize (after evil activate)
- "Initialize Evil in the visualization buffer."
- (when evil-local-mode
- (evil-initialize-state)))
-
- (when (fboundp 'undo-tree-visualize)
- (evil-ex-define-cmd "undol[ist]" 'undo-tree-visualize)
- (evil-ex-define-cmd "ul" 'undo-tree-visualize))
-
- (when (boundp 'undo-tree-visualizer-mode-map)
- (define-key undo-tree-visualizer-mode-map
- [remap evil-backward-char] 'undo-tree-visualize-switch-branch-left)
- (define-key undo-tree-visualizer-mode-map
- [remap evil-forward-char] 'undo-tree-visualize-switch-branch-right)
- (define-key undo-tree-visualizer-mode-map
- [remap evil-next-line] 'undo-tree-visualize-redo)
- (define-key undo-tree-visualizer-mode-map
- [remap evil-previous-line] 'undo-tree-visualize-undo)
- (define-key undo-tree-visualizer-mode-map
- [remap evil-ret] 'undo-tree-visualizer-set))
-
- (when (boundp 'undo-tree-visualizer-selection-mode-map)
- (define-key undo-tree-visualizer-selection-mode-map
- [remap evil-backward-char] 'undo-tree-visualizer-select-left)
- (define-key undo-tree-visualizer-selection-mode-map
- [remap evil-forward-char] 'undo-tree-visualizer-select-right)
- (define-key undo-tree-visualizer-selection-mode-map
- [remap evil-next-line] 'undo-tree-visualizer-select-next)
- (define-key undo-tree-visualizer-selection-mode-map
- [remap evil-previous-line] 'undo-tree-visualizer-select-previous)
- (define-key undo-tree-visualizer-selection-mode-map
- [remap evil-ret] 'undo-tree-visualizer-set))))
-
-;;; Auto-complete
-(eval-after-load 'auto-complete
- '(progn
- (evil-add-command-properties 'auto-complete :repeat 'evil-ac-repeat)
- (evil-add-command-properties 'ac-complete :repeat 'evil-ac-repeat)
- (evil-add-command-properties 'ac-expand :repeat 'evil-ac-repeat)
- (evil-add-command-properties 'ac-next :repeat 'ignore)
- (evil-add-command-properties 'ac-previous :repeat 'ignore)
-
- (defvar evil-ac-prefix-len nil
- "The length of the prefix of the current item to be completed.")
-
- (defvar ac-prefix)
- (defun evil-ac-repeat (flag)
- "Record the changes for auto-completion."
- (cond
- ((eq flag 'pre)
- (setq evil-ac-prefix-len (length ac-prefix))
- (evil-repeat-start-record-changes))
- ((eq flag 'post)
- ;; Add change to remove the prefix
- (evil-repeat-record-change (- evil-ac-prefix-len)
- ""
- evil-ac-prefix-len)
- ;; Add change to insert the full completed text
- (evil-repeat-record-change
- (- evil-ac-prefix-len)
- (buffer-substring-no-properties (- evil-repeat-pos
- evil-ac-prefix-len)
- (point))
- 0)
- ;; Finish repeation
- (evil-repeat-finish-record-changes))))))
-
-;;; Company
-(eval-after-load 'company
- '(progn
- (mapc #'evil-declare-change-repeat
- '(company-complete-mouse
- company-complete-number
- company-complete-selection
- company-complete-common))
-
- (mapc #'evil-declare-ignore-repeat
- '(company-abort
- company-select-next
- company-select-previous
- company-select-next-or-abort
- company-select-previous-or-abort
- company-select-mouse
- company-show-doc-buffer
- company-show-location
- company-search-candidates
- company-filter-candidates))))
-
-;; Eval last sexp
-(cond
- ((version< emacs-version "25")
- (defadvice preceding-sexp (around evil activate)
- "In normal-state or motion-state, last sexp ends at point."
- (if (and (not evil-move-beyond-eol)
- (or (evil-normal-state-p) (evil-motion-state-p)))
- (save-excursion
- (unless (or (eobp) (eolp)) (forward-char))
- ad-do-it)
- ad-do-it))
-
- (defadvice pp-last-sexp (around evil activate)
- "In normal-state or motion-state, last sexp ends at point."
- (if (and (not evil-move-beyond-eol)
- (or (evil-normal-state-p) (evil-motion-state-p)))
- (save-excursion
- (unless (or (eobp) (eolp)) (forward-char))
- ad-do-it)
- ad-do-it)))
- (t
- (defun evil--preceding-sexp (command &rest args)
- "In normal-state or motion-state, last sexp ends at point."
- (if (and (not evil-move-beyond-eol)
- (or (evil-normal-state-p) (evil-motion-state-p)))
- (save-excursion
- (unless (or (eobp) (eolp)) (forward-char))
- (apply command args))
- (apply command args)))
-
- (advice-add 'elisp--preceding-sexp :around 'evil--preceding-sexp '((name . evil)))
- (advice-add 'pp-last-sexp :around 'evil--preceding-sexp '((name . evil)))))
-
-;; Show key
-(defadvice quail-show-key (around evil activate)
- "Temporarily go to Emacs state"
- (evil-with-state emacs ad-do-it))
-
-(defadvice describe-char (around evil activate)
- "Temporarily go to Emacs state"
- (evil-with-state emacs ad-do-it))
-
-;; ace-jump-mode
-(declare-function ace-jump-char-mode "ext:ace-jump-mode")
-(declare-function ace-jump-word-mode "ext:ace-jump-mode")
-(declare-function ace-jump-line-mode "ext:ace-jump-mode")
-(defvar ace-jump-mode-scope)
-
-(defvar evil-ace-jump-active nil)
-
-(defmacro evil-enclose-ace-jump-for-motion (&rest body)
- "Enclose ace-jump to make it suitable for motions.
-This includes restricting `ace-jump-mode' to the current window
-in visual and operator state, deactivating visual updates, saving
-the mark and entering `recursive-edit'."
- (declare (indent defun)
- (debug t))
- `(let ((old-mark (mark))
- (ace-jump-mode-scope
- (if (and (not (memq evil-state '(visual operator)))
- (boundp 'ace-jump-mode-scope))
- ace-jump-mode-scope
- 'window)))
- (remove-hook 'pre-command-hook #'evil-visual-pre-command t)
- (remove-hook 'post-command-hook #'evil-visual-post-command t)
- (unwind-protect
- (let ((evil-ace-jump-active 'prepare))
- (add-hook 'ace-jump-mode-end-hook
- #'evil-ace-jump-exit-recursive-edit)
- ,@body
- (when evil-ace-jump-active
- (setq evil-ace-jump-active t)
- (recursive-edit)))
- (remove-hook 'post-command-hook
- #'evil-ace-jump-exit-recursive-edit)
- (remove-hook 'ace-jump-mode-end-hook
- #'evil-ace-jump-exit-recursive-edit)
- (if (evil-visual-state-p)
- (progn
- (add-hook 'pre-command-hook #'evil-visual-pre-command nil t)
- (add-hook 'post-command-hook #'evil-visual-post-command nil t)
- (set-mark old-mark))
- (push-mark old-mark)))))
-
-(eval-after-load 'ace-jump-mode
- `(defadvice ace-jump-done (after evil activate)
- (when evil-ace-jump-active
- (add-hook 'post-command-hook #'evil-ace-jump-exit-recursive-edit))))
-
-(defun evil-ace-jump-exit-recursive-edit ()
- "Exit a recursive edit caused by an evil jump."
- (cond
- ((eq evil-ace-jump-active 'prepare)
- (setq evil-ace-jump-active nil))
- (evil-ace-jump-active
- (remove-hook 'post-command-hook #'evil-ace-jump-exit-recursive-edit)
- (exit-recursive-edit))))
-
-(evil-define-motion evil-ace-jump-char-mode (count)
- "Jump visually directly to a char using ace-jump."
- :type inclusive
- (evil-without-repeat
- (let ((pnt (point))
- (buf (current-buffer)))
- (evil-enclose-ace-jump-for-motion
- (call-interactively 'ace-jump-char-mode))
- ;; if we jump backwards, motion type is exclusive, analogously
- ;; to `evil-find-char-backward'
- (when (and (equal buf (current-buffer))
- (< (point) pnt))
- (setq evil-this-type
- (cond
- ((eq evil-this-type 'exclusive) 'inclusive)
- ((eq evil-this-type 'inclusive) 'exclusive)))))))
-
-(evil-define-motion evil-ace-jump-char-to-mode (count)
- "Jump visually to the char in front of a char using ace-jump."
- :type inclusive
- (evil-without-repeat
- (let ((pnt (point))
- (buf (current-buffer)))
- (evil-enclose-ace-jump-for-motion
- (call-interactively 'ace-jump-char-mode))
- (if (and (equal buf (current-buffer))
- (< (point) pnt))
- (progn
- (or (eobp) (forward-char))
- (setq evil-this-type
- (cond
- ((eq evil-this-type 'exclusive) 'inclusive)
- ((eq evil-this-type 'inclusive) 'exclusive))))
- (backward-char)))))
-
-(evil-define-motion evil-ace-jump-line-mode (count)
- "Jump visually to the beginning of a line using ace-jump."
- :type line
- :repeat abort
- (evil-without-repeat
- (evil-enclose-ace-jump-for-motion
- (call-interactively 'ace-jump-line-mode))))
-
-(evil-define-motion evil-ace-jump-word-mode (count)
- "Jump visually to the beginning of a word using ace-jump."
- :type exclusive
- :repeat abort
- (evil-without-repeat
- (evil-enclose-ace-jump-for-motion
- (call-interactively 'ace-jump-word-mode))))
-
-(define-key evil-motion-state-map [remap ace-jump-char-mode] #'evil-ace-jump-char-mode)
-(define-key evil-motion-state-map [remap ace-jump-line-mode] #'evil-ace-jump-line-mode)
-(define-key evil-motion-state-map [remap ace-jump-word-mode] #'evil-ace-jump-word-mode)
-
-;;; avy
-(declare-function avy-goto-word-or-subword-1 "ext:avy")
-(declare-function avy-goto-line "ext:avy")
-(declare-function avy-goto-char "ext:avy")
-(declare-function avy-goto-char-2 "ext:avy")
-(declare-function avy-goto-char-2-above "ext:avy")
-(declare-function avy-goto-char-2-below "ext:avy")
-(declare-function avy-goto-char-in-line "ext:avy")
-(declare-function avy-goto-word-0 "ext:avy")
-(declare-function avy-goto-word-1 "ext:avy")
-(declare-function avy-goto-word-1-above "ext:avy")
-(declare-function avy-goto-word-1-below "ext:avy")
-(declare-function avy-goto-subword-0 "ext:avy")
-(declare-function avy-goto-subword-1 "ext:avy")
-(declare-function avy-goto-char-timer "ext:avy")
-(defvar avy-all-windows)
-
-(defmacro evil-enclose-avy-for-motion (&rest body)
- "Enclose avy to make it suitable for motions.
-Based on `evil-enclose-ace-jump-for-motion'."
- (declare (indent defun)
- (debug t))
- `(let ((avy-all-windows
- (if (and (not (memq evil-state '(visual operator)))
- (boundp 'avy-all-windows))
- avy-all-windows
- nil)))
- ,@body))
-
-(defmacro evil-define-avy-motion (command type)
- (declare (indent defun)
- (debug t))
- (let ((name (intern (format "evil-%s" command))))
- `(evil-define-motion ,name (count)
- ,(format "Evil motion for `%s'." command)
- :type ,type
- :jump t
- :repeat abort
- (evil-without-repeat
- (evil-enclose-avy-for-motion
- (call-interactively ',command))))))
-
-;; define evil-avy-* motion commands for avy-* commands
-(evil-define-avy-motion avy-goto-char inclusive)
-(evil-define-avy-motion avy-goto-char-2 inclusive)
-(evil-define-avy-motion avy-goto-char-2-above inclusive)
-(evil-define-avy-motion avy-goto-char-2-below inclusive)
-(evil-define-avy-motion avy-goto-char-in-line inclusive)
-(evil-define-avy-motion avy-goto-char-timer inclusive)
-(evil-define-avy-motion avy-goto-line line)
-(evil-define-avy-motion avy-goto-line-above line)
-(evil-define-avy-motion avy-goto-line-below line)
-(evil-define-avy-motion avy-goto-subword-0 exclusive)
-(evil-define-avy-motion avy-goto-subword-1 exclusive)
-(evil-define-avy-motion avy-goto-symbol-1 exclusive)
-(evil-define-avy-motion avy-goto-symbol-1-above exclusive)
-(evil-define-avy-motion avy-goto-symbol-1-below exclusive)
-(evil-define-avy-motion avy-goto-word-0 exclusive)
-(evil-define-avy-motion avy-goto-word-1 exclusive)
-(evil-define-avy-motion avy-goto-word-1-above exclusive)
-(evil-define-avy-motion avy-goto-word-1-below exclusive)
-(evil-define-avy-motion avy-goto-word-or-subword-1 exclusive)
-
-;; remap avy-* commands to evil-avy-* commands
-(dolist (command '(avy-goto-char
- avy-goto-char-2
- avy-goto-char-2-above
- avy-goto-char-2-below
- avy-goto-char-in-line
- avy-goto-char-timer
- avy-goto-line
- avy-goto-line-above
- avy-goto-line-below
- avy-goto-subword-0
- avy-goto-subword-1
- avy-goto-symbol-1
- avy-goto-symbol-1-above
- avy-goto-symbol-1-below
- avy-goto-word-0
- avy-goto-word-1
- avy-goto-word-1-above
- avy-goto-word-1-below
- avy-goto-word-or-subword-1))
- (define-key evil-motion-state-map
- (vector 'remap command) (intern-soft (format "evil-%s" command))))
-
-;;; nXhtml/mumamo
-;; ensure that mumamo does not toggle evil through its globalized mode
-(eval-after-load 'mumamo
- '(with-no-warnings
- (push 'evil-mode-cmhh mumamo-change-major-mode-no-nos)))
-
-;; visual-line-mode integration
-(when evil-respect-visual-line-mode
- (evil-define-command evil-digit-argument-or-evil-beginning-of-visual-line ()
- :digit-argument-redirection evil-beginning-of-visual-line
- :keep-visual t
- :repeat nil
- (interactive)
- (cond
- (current-prefix-arg
- (setq this-command #'digit-argument)
- (call-interactively #'digit-argument))
- (t
- (setq this-command 'evil-beginning-of-visual-line)
- (call-interactively 'evil-beginning-of-visual-line))))
-
- (evil-define-minor-mode-key 'motion 'visual-line-mode
- "j" 'evil-next-visual-line
- "gj" 'evil-next-line
- "k" 'evil-previous-visual-line
- "gk" 'evil-previous-line
- "0" 'evil-digit-argument-or-evil-beginning-of-visual-line
- "g0" 'evil-beginning-of-line
- "$" 'evil-end-of-visual-line
- "g$" 'evil-end-of-line
- "V" 'evil-visual-screen-line))
-
-;;; abbrev.el
-(defun evil-maybe-expand-abbrev ()
- (when (and abbrev-mode evil-want-abbrev-expand-on-insert-exit)
- (expand-abbrev)))
-
-(eval-after-load 'abbrev
- '(add-hook 'evil-insert-state-exit-hook 'evil-maybe-expand-abbrev))
-
-;;; ElDoc
-(eval-after-load 'eldoc
- '(when (fboundp 'eldoc-add-command-completions)
- (eldoc-add-command-completions "evil-window-")))
-
-(provide 'evil-integration)
-
-;;; evil-integration.el ends here
diff --git a/elpa/evil-20200718.842/evil-jumps.el b/elpa/evil-20200718.842/evil-jumps.el
deleted file mode 100644
index efe031d..0000000
--- a/elpa/evil-20200718.842/evil-jumps.el
+++ /dev/null
@@ -1,314 +0,0 @@
-;;; evil-jumps.el --- Jump list implementation -*- lexical-binding: t -*-
-
-;; Author: Bailey Ling <bling at live.ca>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'cl-lib)
-(require 'evil-core)
-(require 'evil-states)
-
-;;; Code:
-
-(defgroup evil-jumps nil
- "Evil jump list configuration options."
- :prefix "evil-jumps"
- :group 'evil)
-
-(defcustom evil-jumps-cross-buffers t
- "When non-nil, the jump commands can cross borders between buffers, otherwise the jump commands act only within the current buffer."
- :type 'boolean
- :group 'evil-jumps)
-
-(defcustom evil-jumps-max-length 100
- "The maximum number of jumps to keep track of."
- :type 'integer
- :group 'evil-jumps)
-
-(defcustom evil-jumps-pre-jump-hook nil
- "Hooks to run just before jumping to a location in the jump list."
- :type 'hook
- :group 'evil-jumps)
-
-(defcustom evil-jumps-post-jump-hook nil
- "Hooks to run just after jumping to a location in the jump list."
- :type 'hook
- :group 'evil-jumps)
-
-(defcustom evil-jumps-ignored-file-patterns '("COMMIT_EDITMSG$" "TAGS$")
- "A list of pattern regexps to match on the file path to exclude from being included in the jump list."
- :type '(repeat string)
- :group 'evil-jumps)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar savehist-additional-variables)
-
-(defvar evil--jumps-jumping nil)
-
-(eval-when-compile (defvar evil--jumps-debug nil))
-
-(defvar evil--jumps-buffer-targets "\\*\\(new\\|scratch\\)\\*"
- "Regexp to match against `buffer-name' to determine whether it's a valid jump target.")
-
-(defvar evil--jumps-window-jumps (make-hash-table)
- "Hashtable which stores all jumps on a per window basis.")
-
-(defvar evil-jumps-history nil
- "History of `evil-mode' jumps that are persisted with `savehist'.")
-
-(cl-defstruct evil-jumps-struct
- ring
- (idx -1))
-
-(defmacro evil--jumps-message (format &rest args)
- (when evil--jumps-debug
- `(with-current-buffer (get-buffer-create "*evil-jumps*")
- (goto-char (point-max))
- (insert (apply #'format ,format ',args) "\n"))))
-
-(defun evil--jumps-get-current (&optional window)
- (unless window
- (setq window (frame-selected-window)))
- (let* ((jump-struct (gethash window evil--jumps-window-jumps)))
- (unless jump-struct
- (setq jump-struct (make-evil-jumps-struct))
- (puthash window jump-struct evil--jumps-window-jumps))
- jump-struct))
-
-(defun evil--jumps-get-jumps (struct)
- (let ((ring (evil-jumps-struct-ring struct)))
- (unless ring
- (setq ring (make-ring evil-jumps-max-length))
- (setf (evil-jumps-struct-ring struct) ring))
- ring))
-
-(defun evil--jumps-get-window-jump-list ()
- (let ((struct (evil--jumps-get-current)))
- (evil--jumps-get-jumps struct)))
-
-(defun evil--jumps-savehist-load ()
- (add-to-list 'savehist-additional-variables 'evil-jumps-history)
- (let ((ring (make-ring evil-jumps-max-length)))
- (cl-loop for jump in (reverse evil-jumps-history)
- do (ring-insert ring jump))
- (setf (evil-jumps-struct-ring (evil--jumps-get-current)) ring))
- (add-hook 'savehist-save-hook #'evil--jumps-savehist-sync)
- (remove-hook 'savehist-mode-hook #'evil--jumps-savehist-load))
-
-(defun evil--jumps-savehist-sync ()
- "Updates the printable value of window jumps for `savehist'."
- (setq evil-jumps-history
- (cl-remove-if-not #'identity
- (mapcar #'(lambda (jump)
- (let* ((mark (car jump))
- (pos (if (markerp mark)
- (marker-position mark)
- mark))
- (file-name (cadr jump)))
- (if (and (not (file-remote-p file-name))
- (file-exists-p file-name)
- pos)
- (list pos file-name)
- nil)))
- (ring-elements (evil--jumps-get-window-jump-list))))))
-
-(defun evil--jumps-jump (idx shift)
- (let ((target-list (evil--jumps-get-window-jump-list)))
- (evil--jumps-message "jumping from %s by %s" idx shift)
- (evil--jumps-message "target list = %s" target-list)
- (setq idx (+ idx shift))
- (let* ((current-file-name (or (buffer-file-name) (buffer-name)))
- (size (ring-length target-list)))
- (unless evil-jumps-cross-buffers
- ;; skip jump marks pointing to other buffers
- (while (and (< idx size) (>= idx 0)
- (not (string= current-file-name (cadr (ring-ref target-list idx)))))
- (setq idx (+ idx shift))))
- (when (and (< idx size) (>= idx 0))
- ;; actual jump
- (run-hooks 'evil-jumps-pre-jump-hook)
- (let* ((place (ring-ref target-list idx))
- (pos (car place))
- (file-name (cadr place)))
- (setq evil--jumps-jumping t)
- (if (string-match-p evil--jumps-buffer-targets file-name)
- (switch-to-buffer file-name)
- (find-file file-name))
- (setq evil--jumps-jumping nil)
- (goto-char pos)
- (setf (evil-jumps-struct-idx (evil--jumps-get-current)) idx)
- (run-hooks 'evil-jumps-post-jump-hook))))))
-
-(defun evil--jumps-push ()
- "Pushes the current cursor/file position to the jump list."
- (let ((target-list (evil--jumps-get-window-jump-list)))
- (let ((file-name (buffer-file-name))
- (buffer-name (buffer-name))
- (current-pos (point-marker))
- (first-pos nil)
- (first-file-name nil)
- (excluded nil))
- (when (and (not file-name)
- (string-match-p evil--jumps-buffer-targets buffer-name))
- (setq file-name buffer-name))
- (when file-name
- (dolist (pattern evil-jumps-ignored-file-patterns)
- (when (string-match-p pattern file-name)
- (setq excluded t)))
- (unless excluded
- (unless (ring-empty-p target-list)
- (setq first-pos (car (ring-ref target-list 0)))
- (setq first-file-name (car (cdr (ring-ref target-list 0)))))
- (unless (and (equal first-pos current-pos)
- (equal first-file-name file-name))
- (evil--jumps-message "pushing %s on %s" current-pos file-name)
- (ring-insert target-list `(,current-pos ,file-name))))))
- (evil--jumps-message "%s %s"
- (selected-window)
- (and (not (ring-empty-p target-list))
- (ring-ref target-list 0)))))
-
-(evil-define-command evil-show-jumps ()
- "Display the contents of the jump list."
- :repeat nil
- (evil-with-view-list
- :name "evil-jumps"
- :mode "Evil Jump List"
- :format [("Jump" 5 nil)
- ("Marker" 8 nil)
- ("File/text" 1000 t)]
- :entries (let* ((jumps (evil--jumps-savehist-sync))
- (count 0))
- (cl-loop for jump in jumps
- collect `(nil [,(number-to-string (cl-incf count))
- ,(number-to-string (car jump))
- (,(cadr jump))])))
- :select-action #'evil--show-jumps-select-action))
-
-(defun evil--show-jumps-select-action (jump)
- (let ((position (string-to-number (elt jump 1)))
- (file (car (elt jump 2))))
- (kill-buffer)
- (switch-to-buffer (find-file file))
- (goto-char position)))
-
-(defun evil-set-jump (&optional pos)
- "Set jump point at POS.
-POS defaults to point."
- (unless (or (region-active-p) (evil-visual-state-p))
- (push-mark pos t))
-
- (unless evil--jumps-jumping
- ;; clear out intermediary jumps when a new one is set
- (let* ((struct (evil--jumps-get-current))
- (target-list (evil--jumps-get-jumps struct))
- (idx (evil-jumps-struct-idx struct)))
- (cl-loop repeat idx
- do (ring-remove target-list))
- (setf (evil-jumps-struct-idx struct) -1))
- (save-excursion
- (when pos
- (goto-char pos))
- (evil--jumps-push))))
-
-(defun evil--jump-backward (count)
- (let ((count (or count 1)))
- (evil-motion-loop (nil count)
- (let* ((struct (evil--jumps-get-current))
- (idx (evil-jumps-struct-idx struct)))
- (evil--jumps-message "jumping back %s" idx)
- (when (= idx -1)
- (setq idx 0)
- (setf (evil-jumps-struct-idx struct) 0)
- (evil--jumps-push))
- (evil--jumps-jump idx 1)))))
-
-(defun evil--jump-forward (count)
- (let ((count (or count 1)))
- (evil-motion-loop (nil count)
- (let* ((struct (evil--jumps-get-current))
- (idx (evil-jumps-struct-idx struct)))
- (when (= idx -1)
- (setq idx 0)
- (setf (evil-jumps-struct-idx struct) 0)
- (evil--jumps-push))
- (evil--jumps-jump idx -1)))))
-
-(defun evil--jumps-window-configuration-hook (&rest _args)
- (let* ((window-list (window-list-1 nil nil t))
- (existing-window (selected-window))
- (new-window (previous-window)))
- (when (and (not (eq existing-window new-window))
- (> (length window-list) 1))
- (let* ((target-jump-struct (evil--jumps-get-current new-window)))
- (if (not (ring-empty-p (evil--jumps-get-jumps target-jump-struct)))
- (evil--jumps-message "target window %s already has %s jumps" new-window target-jump-count)
- (evil--jumps-message "new target window detected; copying %s to %s" existing-window new-window)
- (let* ((source-jump-struct (evil--jumps-get-current existing-window))
- (source-list (evil--jumps-get-jumps source-jump-struct)))
- (when (= (ring-length (evil--jumps-get-jumps target-jump-struct)) 0)
- (setf (evil-jumps-struct-idx target-jump-struct) (evil-jumps-struct-idx source-jump-struct))
- (setf (evil-jumps-struct-ring target-jump-struct) (ring-copy source-list)))))))
- ;; delete obsolete windows
- (maphash (lambda (key _val)
- (unless (member key window-list)
- (evil--jumps-message "removing %s" key)
- (remhash key evil--jumps-window-jumps)))
- evil--jumps-window-jumps)))
-
-(defun evil--jump-hook (&optional command)
- "Set jump point if COMMAND has a non-nil :jump property."
- (setq command (or command this-command))
- (when (evil-get-command-property command :jump)
- (evil-set-jump)))
-
-(defadvice switch-to-buffer (before evil-jumps activate)
- (evil-set-jump))
-
-(defadvice split-window-internal (before evil-jumps activate)
- (evil-set-jump))
-
-(eval-after-load 'etags
- '(defadvice find-tag-noselect (before evil-jumps activate)
- (evil-set-jump)))
-
-(if (bound-and-true-p savehist-loaded)
- (evil--jumps-savehist-load)
- (add-hook 'savehist-mode-hook #'evil--jumps-savehist-load))
-
-(add-hook 'evil-local-mode-hook
- (lambda ()
- (if evil-local-mode
- (progn
- (add-hook 'pre-command-hook #'evil--jump-hook nil t)
- (add-hook 'next-error-hook #'evil-set-jump nil t)
- (add-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook nil t))
- (progn
- (remove-hook 'pre-command-hook #'evil--jump-hook t)
- (remove-hook 'next-error-hook #'evil-set-jump t)
- (remove-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook t)))))
-
-(provide 'evil-jumps)
-
-;;; evil-jumps.el ends here
diff --git a/elpa/evil-20200718.842/evil-keybindings.el b/elpa/evil-20200718.842/evil-keybindings.el
deleted file mode 100644
index 084a06a..0000000
--- a/elpa/evil-20200718.842/evil-keybindings.el
+++ /dev/null
@@ -1,124 +0,0 @@
-;;; evil-keybindings.el --- Add some Evil keybindings to other modules -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This provides a set of keybindings for other emacs modes. This also includes
-;; setting up the initial evil state of those other modes.
-
-;;; Code:
-
-(require 'evil-maps)
-(require 'evil-core)
-(require 'evil-macros)
-(require 'evil-types)
-(require 'evil-repeat)
-
-;; etags-select
-;; FIXME: probably etags-select should be recomended in docs
-(eval-after-load 'etags-select
- '(progn
- (define-key evil-motion-state-map "g]" 'etags-select-find-tag-at-point)))
-
-;;; Buffer-menu
-
-(evil-add-hjkl-bindings Buffer-menu-mode-map 'motion)
-
-;; dictionary.el
-
-(evil-add-hjkl-bindings dictionary-mode-map 'motion
- "?" 'dictionary-help ; "h"
- "C-o" 'dictionary-previous) ; "l"
-
-;;; Dired
-
-(eval-after-load 'dired
- '(progn
- ;; use the standard Dired bindings as a base
- (defvar dired-mode-map)
- (evil-make-overriding-map dired-mode-map 'normal)
- (evil-add-hjkl-bindings dired-mode-map 'normal
- "J" 'dired-goto-file ; "j"
- "K" 'dired-do-kill-lines ; "k"
- "r" 'dired-do-redisplay ; "l"
- ;; ":d", ":v", ":s", ":e"
- ";" (lookup-key dired-mode-map ":"))))
-
-;;; ERT
-
-(evil-add-hjkl-bindings ert-results-mode-map 'motion)
-
-;;; Info
-
-(evil-add-hjkl-bindings Info-mode-map 'motion
- "0" 'evil-digit-argument-or-evil-beginning-of-line
- (kbd "\M-h") 'Info-help ; "h"
- "\C-t" 'Info-history-back ; "l"
- "\C-o" 'Info-history-back
- " " 'Info-scroll-up
- "\C-]" 'Info-follow-nearest-node
- (kbd "DEL") 'Info-scroll-down)
-
-;;; Speedbar
-
-(evil-add-hjkl-bindings speedbar-key-map 'motion
- "h" 'backward-char
- "j" 'speedbar-next
- "k" 'speedbar-prev
- "l" 'forward-char
- "i" 'speedbar-item-info
- "r" 'speedbar-refresh
- "u" 'speedbar-up-directory
- "o" 'speedbar-toggle-line-expansion
- (kbd "RET") 'speedbar-edit-line)
-
-;; Ibuffer
-(eval-after-load 'ibuffer
- '(progn
- (defvar ibuffer-mode-map)
- (evil-make-overriding-map ibuffer-mode-map 'normal)
- (evil-define-key 'normal ibuffer-mode-map
- "j" 'evil-next-line
- "k" 'evil-previous-line
- "RET" 'ibuffer-visit-buffer)))
-
-;;; ag.el
-(eval-after-load 'ag
- '(progn
- (defvar ag-mode-map)
- (add-to-list 'evil-motion-state-modes 'ag-mode)
- (evil-add-hjkl-bindings ag-mode-map 'motion)))
-
-;;; ELP
-
-(eval-after-load 'elp
- '(defadvice elp-results (after evil activate)
- (evil-motion-state)))
-
-(provide 'evil-keybindings)
-
-;;; evil-keybindings.el ends here
diff --git a/elpa/evil-20200718.842/evil-macros.el b/elpa/evil-20200718.842/evil-macros.el
deleted file mode 100644
index 7331ae2..0000000
--- a/elpa/evil-20200718.842/evil-macros.el
+++ /dev/null
@@ -1,814 +0,0 @@
-;;; evil-macros.el --- Macros -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-common)
-(require 'evil-states)
-(require 'evil-repeat)
-
-;;; Code:
-
-(declare-function evil-ex-p "evil-ex")
-
-;; set some error codes
-(put 'beginning-of-line 'error-conditions '(beginning-of-line error))
-(put 'beginning-of-line 'error-message "Beginning of line")
-(put 'end-of-line 'error-conditions '(end-of-line error))
-(put 'end-of-line 'error-message "End of line")
-
-(defun evil-motion-range (motion &optional count type)
- "Execute a motion and return the buffer positions.
-The return value is a list (BEG END TYPE)."
- (let ((opoint (point))
- (omark (mark t))
- (obuffer (current-buffer))
- (evil-motion-marker (move-marker (make-marker) (point)))
- range)
- (evil-with-transient-mark-mode
- (evil-narrow-to-field
- (unwind-protect
- (let ((current-prefix-arg count)
- ;; Store type in global variable `evil-this-type'.
- ;; If necessary, motions can change their type
- ;; during execution by setting this variable.
- (evil-this-type
- (or type (evil-type motion 'exclusive))))
- (condition-case err
- (let ((repeat-type (evil-repeat-type motion t)))
- (if (functionp repeat-type)
- (funcall repeat-type 'pre))
- (unless (with-local-quit
- (setq range (call-interactively motion))
- t)
- (evil-repeat-abort)
- (setq quit-flag t))
- (if (functionp repeat-type)
- (funcall repeat-type 'post)))
- (error (prog1 nil
- (evil-repeat-abort)
- ;; some operators depend on succeeding
- ;; motions, in particular for
- ;; `evil-forward-char' (e.g., used by
- ;; `evil-substitute'), therefore we let
- ;; end-of-line and end-of-buffer pass
- (if (not (memq (car err) '(end-of-line end-of-buffer)))
- (signal (car err) (cdr err))
- (message (error-message-string err))))))
- (cond
- ;; the motion returned a range
- ((evil-range-p range))
- ;; the motion made a Visual selection
- ((evil-visual-state-p)
- (setq range (evil-visual-range)))
- ;; the motion made an active region
- ((region-active-p)
- (setq range (evil-range (region-beginning)
- (region-end)
- evil-this-type)))
- ;; default: range from previous position to current
- (t
- (setq range (evil-expand-range
- (evil-normalize evil-motion-marker
- (point)
- evil-this-type)))))
- (unless (or (null type) (eq (evil-type range) type))
- (evil-set-type range type)
- (evil-expand-range range))
- (evil-set-range-properties range nil)
- range)
- ;; restore point and mark like `save-excursion',
- ;; but only if the motion hasn't disabled the operator
- (unless evil-inhibit-operator
- (set-buffer obuffer)
- (evil-move-mark omark)
- (goto-char opoint))
- ;; delete marker so it doesn't slow down editing
- (move-marker evil-motion-marker nil))))))
-
-(defmacro evil-define-motion (motion args &rest body)
- "Define a motion command MOTION.
-ARGS is a list of arguments. Motions can have any number of
-arguments, but the first (if any) has the predefined meaning of
-count. BODY must execute the motion by moving point.
-
-Optional keyword arguments are:
-- `:type' - determines how the motion works after an operator (one of
- `inclusive', `line', `block' and `exclusive', or a self-defined
- motion type)
-- `:jump' - if non-nil, the previous position is stored in the jump
- list, so that it can be restored with \
-\\<evil-motion-state-map>\\[evil-jump-backward]
-
-\(fn MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)"
- (declare (indent defun)
- (doc-string 3)
- (debug (&define name lambda-list
- [&optional stringp]
- [&rest keywordp sexp]
- [&optional ("interactive" [&rest form])]
- def-body)))
- (let (arg doc interactive key keys)
- (when args
- (setq args `(&optional ,@(delq '&optional args))
- ;; the count is either numerical or nil
- interactive '("<c>")))
- ;; collect docstring
- (when (and (> (length body) 1)
- (or (eq (car-safe (car-safe body)) 'format)
- (stringp (car-safe body))))
- (setq doc (pop body)))
- ;; collect keywords
- (setq keys (plist-put keys :repeat 'motion))
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body)
- keys (plist-put keys key arg)))
- ;; collect `interactive' specification
- (when (eq (car-safe (car-safe body)) 'interactive)
- (setq interactive (cdr (pop body))))
- ;; macro expansion
- `(progn
- ;; refresh echo area in Eldoc mode
- (when ',motion
- (eval-after-load 'eldoc
- '(and (fboundp 'eldoc-add-command)
- (eldoc-add-command ',motion))))
- (evil-define-command ,motion (,@args)
- ,@(when doc `(,doc)) ; avoid nil before `interactive'
- ,@keys
- :keep-visual t
- (interactive ,@interactive)
- ,@body))))
-
-(defmacro evil-narrow-to-line (&rest body)
- "Narrow BODY to the current line.
-BODY will signal the errors 'beginning-of-line or 'end-of-line
-upon reaching the beginning or end of the current line.
-
-\(fn [[KEY VAL]...] BODY...)"
- (declare (indent defun)
- (debug t))
- `(let* ((range (evil-expand (point) (point) 'line))
- (beg (evil-range-beginning range))
- (end (evil-range-end range))
- (min (point-min))
- (max (point-max)))
- (when (save-excursion (goto-char end) (bolp))
- (setq end (max beg (1- end))))
- ;; don't include the newline in Normal state
- (when (and (not evil-move-beyond-eol)
- (not (evil-visual-state-p))
- (not (evil-operator-state-p)))
- (setq end (max beg (1- end))))
- (evil-with-restriction beg end
- (evil-signal-without-movement
- (condition-case err
- (progn ,@body)
- (beginning-of-buffer
- (if (= beg min)
- (signal (car err) (cdr err))
- (signal 'beginning-of-line nil)))
- (end-of-buffer
- (if (= end max)
- (signal (car err) (cdr err))
- (signal 'end-of-line nil))))))))
-
-;; we don't want line boundaries to trigger the debugger
-;; when `debug-on-error' is t
-(add-to-list 'debug-ignored-errors "^Beginning of line$")
-(add-to-list 'debug-ignored-errors "^End of line$")
-
-(defun evil-eobp (&optional pos)
- "Whether point is at end-of-buffer with regard to end-of-line."
- (save-excursion
- (when pos (goto-char pos))
- (cond
- ((eobp))
- ;; the rest only pertains to Normal state
- ((not (evil-normal-state-p))
- nil)
- ;; at the end of the last line
- ((eolp)
- (forward-char)
- (eobp))
- ;; at the last character of the last line
- (t
- (forward-char)
- (cond
- ((eobp))
- ((eolp)
- (forward-char)
- (eobp)))))))
-
-(defun evil-move-beginning (count forward &optional backward)
- "Move to the beginning of the COUNT next object.
-If COUNT is negative, move to the COUNT previous object.
-FORWARD is a function which moves to the end of the object, and
-BACKWARD is a function which moves to the beginning.
-If one is unspecified, the other is used with a negative argument."
- (let* ((count (or count 1))
- (backward (or backward
- #'(lambda (count)
- (funcall forward (- count)))))
- (forward (or forward
- #'(lambda (count)
- (funcall backward (- count)))))
- (opoint (point)))
- (cond
- ((< count 0)
- (when (bobp)
- (signal 'beginning-of-buffer nil))
- (unwind-protect
- (evil-motion-loop (nil count count)
- (funcall backward 1))
- (unless (zerop count)
- (goto-char (point-min)))))
- ((> count 0)
- (when (evil-eobp)
- (signal 'end-of-buffer nil))
- ;; Do we need to move past the current object?
- (when (<= (save-excursion
- (funcall forward 1)
- (funcall backward 1)
- (point))
- opoint)
- (setq count (1+ count)))
- (unwind-protect
- (evil-motion-loop (nil count count)
- (funcall forward 1))
- (if (zerop count)
- ;; go back to beginning of object
- (funcall backward 1)
- (goto-char (point-max)))))
- (t
- count))))
-
-(defun evil-move-end (count forward &optional backward inclusive)
- "Move to the end of the COUNT next object.
-If COUNT is negative, move to the COUNT previous object.
-FORWARD is a function which moves to the end of the object, and
-BACKWARD is a function which moves to the beginning.
-If one is unspecified, the other is used with a negative argument.
-If INCLUSIVE is non-nil, then point is placed at the last character
-of the object; otherwise it is placed at the end of the object."
- (let* ((count (or count 1))
- (backward (or backward
- #'(lambda (count)
- (funcall forward (- count)))))
- (forward (or forward
- #'(lambda (count)
- (funcall backward (- count)))))
- (opoint (point)))
- (cond
- ((< count 0)
- (when (bobp)
- (signal 'beginning-of-buffer nil))
- ;; Do we need to move past the current object?
- (when (>= (save-excursion
- (funcall backward 1)
- (funcall forward 1)
- (point))
- (if inclusive
- (1+ opoint)
- opoint))
- (setq count (1- count)))
- (unwind-protect
- (evil-motion-loop (nil count count)
- (funcall backward 1))
- (if (not (zerop count))
- (goto-char (point-min))
- ;; go to end of object
- (funcall forward 1)
- (when inclusive
- (unless (bobp) (backward-char)))
- (when (or (evil-normal-state-p)
- (evil-motion-state-p))
- (evil-adjust-cursor)))))
- ((> count 0)
- (when (evil-eobp)
- (signal 'end-of-buffer nil))
- (when inclusive
- (forward-char))
- (unwind-protect
- (evil-motion-loop (nil count count)
- (funcall forward 1))
- (if (not (zerop count))
- (goto-char (point-max))
- (when inclusive
- (unless (bobp) (backward-char)))
- (when (or (evil-normal-state-p)
- (evil-motion-state-p))
- (evil-adjust-cursor)))))
- (t
- count))))
-
-(defun evil-text-object-make-linewise (range)
- "Turn the text object selection RANGE to linewise.
-The selection is adjusted in a sensible way so that the selected
-lines match the user intent. In particular, whitespace-only parts
-at the first and last lines are omitted. This function returns
-the new range."
- ;; Bug #607
- ;; If new type is linewise and the selection of the
- ;; first line consists of whitespace only, the
- ;; beginning is moved to the start of the next line. If
- ;; the selections of the last line consists of
- ;; whitespace only, the end is moved to the end of the
- ;; previous line.
- (if (eq (evil-type range) 'line)
- range
- (let ((expanded (plist-get (evil-range-properties range) :expanded))
- (newrange (evil-expand-range range t)))
- (save-excursion
- ;; skip whitespace at the beginning
- (goto-char (evil-range-beginning newrange))
- (skip-chars-forward " \t")
- (when (and (not (bolp)) (eolp))
- (evil-set-range-beginning newrange (1+ (point))))
- ;; skip whitepsace at the end
- (goto-char (evil-range-end newrange))
- (skip-chars-backward " \t")
- (when (and (not (eolp)) (bolp))
- (evil-set-range-end newrange (1- (point))))
- ;; only modify range if result is not empty
- (if (> (evil-range-beginning newrange)
- (evil-range-end newrange))
- range
- (unless expanded
- (evil-contract-range newrange))
- newrange)))))
-
-(defmacro evil-define-text-object (object args &rest body)
- "Define a text object command OBJECT.
-BODY should return a range (BEG END) to the right of point
-if COUNT is positive, and to the left of it if negative.
-
-Optional keyword arguments:
-- `:type' - determines how the range applies after an operator
- (`inclusive', `line', `block', and `exclusive', or a self-defined
- motion type).
-- `:extend-selection' - if non-nil (default), the text object always
- enlarges the current selection. Otherwise, it replaces the current
- selection.
-
-\(fn OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)"
- (declare (indent defun)
- (doc-string 3)
- (debug (&define name lambda-list
- [&optional stringp]
- [&rest keywordp sexp]
- def-body)))
- (let* ((args (delq '&optional args))
- (count (or (pop args) 'count))
- (args (when args `(&optional ,@args)))
- (interactive '((interactive "<c><v>")))
- arg doc key keys)
- ;; collect docstring
- (when (stringp (car-safe body))
- (setq doc (pop body)))
- ;; collect keywords
- (setq keys (plist-put keys :extend-selection t))
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body)
- keys (plist-put keys key arg)))
- ;; interactive
- (when (eq (car-safe (car-safe body)) 'interactive)
- (setq interactive (list (pop body))))
- ;; macro expansion
- `(evil-define-motion ,object (,count ,@args)
- ,@(when doc `(,doc))
- ,@keys
- ,@interactive
- (setq ,count (or ,count 1))
- (when (/= ,count 0)
- (let ((type (evil-type ',object evil-visual-char))
- (extend (and (evil-visual-state-p)
- (evil-get-command-property
- ',object :extend-selection
- ',(plist-get keys :extend-selection))))
- (dir evil-visual-direction)
- mark point range selection)
- (cond
- ;; Visual state: extend the current selection
- ((and (evil-visual-state-p)
- (called-interactively-p 'any))
- ;; if we are at the beginning of the Visual selection,
- ;; go to the left (negative COUNT); if at the end,
- ;; go to the right (positive COUNT)
- (setq dir evil-visual-direction
- ,count (* ,count dir))
- (setq range (progn ,@body))
- (when (evil-range-p range)
- (setq range (evil-expand-range range))
- (evil-set-type range (evil-type range type))
- (setq range (evil-contract-range range))
- ;; the beginning is mark and the end is point
- ;; unless the selection goes the other way
- (setq mark (evil-range-beginning range)
- point (evil-range-end range)
- type (evil-type
- (if evil-text-object-change-visual-type
- range
- (evil-visual-range))))
- (when (and (eq type 'line)
- (not (eq type (evil-type range))))
- (let ((newrange (evil-text-object-make-linewise range)))
- (setq mark (evil-range-beginning newrange)
- point (evil-range-end newrange))))
- (when (< dir 0)
- (evil-swap mark point))
- ;; select the union
- (evil-visual-make-selection mark point type)))
- ;; not Visual state: return a pair of buffer positions
- (t
- (setq range (progn ,@body))
- (unless (evil-range-p range)
- (setq ,count (- ,count)
- range (progn ,@body)))
- (when (evil-range-p range)
- (setq selection (evil-range (point) (point) type))
- (if extend
- (setq range (evil-range-union range selection))
- (evil-set-type range (evil-type range type)))
- ;; possibly convert to linewise
- (when (eq evil-this-type-modified 'line)
- (setq range (evil-text-object-make-linewise range)))
- (evil-set-range-properties range nil)
- range))))))))
-
-(defmacro evil-define-operator (operator args &rest body)
- "Define an operator command OPERATOR.
-The operator acts on the range of characters BEG through
-END. BODY must execute the operator by potentially manipulating
-the buffer contents, or otherwise causing side effects to happen.
-
-Optional keyword arguments are:
-- `:type' - force the input range to be of a given type (`inclusive',
- `line', `block', and `exclusive', or a self-defined motion type).
-- `:motion' - use a predetermined motion instead of waiting for one
- from the keyboard. This does not affect the behavior in visual
- state, where selection boundaries are always used.
-- `:repeat' - if non-nil (default), then \
- \\<evil-normal-state-map>\\[evil-repeat] will repeat the
- operator.
-- `:move-point' - if non-nil (default), the cursor will be moved to
- the beginning of the range before the body executes
-- `:keep-visual' - if non-nil, the selection is not disabled when the
- operator is executed in visual state. By default, visual state is
- exited automatically.
-
-\(fn OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)"
- (declare (indent defun)
- (doc-string 3)
- (debug (&define name lambda-list
- [&optional stringp]
- [&rest keywordp sexp]
- [&optional ("interactive" [&rest form])]
- def-body)))
- (let* ((args (delq '&optional args))
- (interactive (if (> (length args) 2) '("<R>") '("<r>")))
- (args (if (> (length args) 2)
- `(,(nth 0 args) ,(nth 1 args)
- &optional ,@(nthcdr 2 args))
- args))
- arg doc key keys visual)
- ;; collect docstring
- (when (and (> (length body) 1)
- (or (eq (car-safe (car-safe body)) 'format)
- (stringp (car-safe body))))
- (setq doc (pop body)))
- ;; collect keywords
- (setq keys (plist-put keys :move-point t))
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body))
- (cond
- ((eq key :keep-visual)
- (setq visual arg))
- (t
- (setq keys (plist-put keys key arg)))))
- ;; collect `interactive' specification
- (when (eq (car-safe (car-safe body)) 'interactive)
- (setq interactive (cdr-safe (pop body))))
- ;; transform extended interactive specs
- (setq interactive (apply #'evil-interactive-form interactive))
- (setq keys (evil-concat-plists keys (cdr-safe interactive))
- interactive (car-safe interactive))
- ;; macro expansion
- `(evil-define-command ,operator ,args
- ,@(when doc `(,doc))
- ,@keys
- :keep-visual t
- :suppress-operator t
- (interactive
- (let* ((evil-operator-range-motion
- (when (evil-has-command-property-p ',operator :motion)
- ;; :motion nil is equivalent to :motion undefined
- (or (evil-get-command-property ',operator :motion)
- #'undefined)))
- (evil-operator-range-type
- (evil-get-command-property ',operator :type))
- (orig (point))
- evil-operator-range-beginning
- evil-operator-range-end
- evil-inhibit-operator)
- (setq evil-inhibit-operator-value nil
- evil-this-operator this-command)
- (prog1 ,interactive
- (setq orig (point)
- evil-inhibit-operator-value evil-inhibit-operator)
- (if ,visual
- (when (evil-visual-state-p)
- (evil-visual-expand-region))
- (when (or (evil-visual-state-p) (region-active-p))
- (setq deactivate-mark t)))
- (cond
- ((evil-visual-state-p)
- (evil-visual-rotate 'upper-left))
- ((evil-get-command-property ',operator :move-point)
- (goto-char (or evil-operator-range-beginning orig)))
- (t
- (goto-char orig))))))
- (unwind-protect
- (let ((evil-inhibit-operator evil-inhibit-operator-value))
- (unless (and evil-inhibit-operator
- (called-interactively-p 'any))
- ,@body))
- (setq evil-inhibit-operator-value nil)))))
-
-;; this is used in the `interactive' specification of an operator command
-(defun evil-operator-range (&optional return-type)
- "Read a motion from the keyboard and return its buffer positions.
-The return value is a list (BEG END), or (BEG END TYPE) if
-RETURN-TYPE is non-nil."
- (let* ((evil-ex-p (and (not (minibufferp)) (evil-ex-p)))
- (motion (or evil-operator-range-motion
- (when evil-ex-p 'evil-line)))
- (type evil-operator-range-type)
- (range (evil-range (point) (point)))
- command count)
- (setq evil-this-type-modified nil)
- (evil-save-echo-area
- (cond
- ;; Ex mode
- ((and evil-ex-p evil-ex-range)
- (setq range evil-ex-range))
- ;; Visual selection
- ((and (not evil-ex-p) (evil-visual-state-p))
- (setq range (evil-visual-range)))
- ;; active region
- ((and (not evil-ex-p) (region-active-p))
- (setq range (evil-range (region-beginning)
- (region-end)
- (or evil-this-type 'exclusive))))
- (t
- ;; motion
- (evil-save-state
- (unless motion
- (evil-change-state 'operator)
- ;; Make linewise operator shortcuts. E.g., "d" yields the
- ;; shortcut "dd", and "g?" yields shortcuts "g??" and "g?g?".
- (let ((keys (nth 2 (evil-extract-count (this-command-keys)))))
- (setq keys (listify-key-sequence keys))
- (dotimes (var (length keys))
- (define-key evil-operator-shortcut-map
- (vconcat (nthcdr var keys)) 'evil-line-or-visual-line)))
- ;; read motion from keyboard
- (setq command (evil-read-motion motion)
- motion (nth 0 command)
- count (nth 1 command)
- type (or type (nth 2 command))))
- (cond
- ((eq motion #'undefined)
- (setq range (if return-type '(nil nil nil) '(nil nil))
- motion nil))
- ((or (null motion) ; keyboard-quit
- (evil-get-command-property motion :suppress-operator))
- (when (fboundp 'evil-repeat-abort)
- (evil-repeat-abort))
- (setq quit-flag t
- motion nil))
- (evil-repeat-count
- (setq count evil-repeat-count
- ;; only the first operator's count is overwritten
- evil-repeat-count nil))
- ((or count current-prefix-arg)
- ;; multiply operator count and motion count together
- (setq count
- (* (prefix-numeric-value count)
- (prefix-numeric-value current-prefix-arg)))))
- (when motion
- (let ((evil-state 'operator)
- mark-active)
- ;; calculate motion range
- (setq range (evil-motion-range
- motion
- count
- type))))
- ;; update global variables
- (setq evil-this-motion motion
- evil-this-motion-count count
- type (evil-type range type)
- evil-this-type type))))
- (when (evil-range-p range)
- (unless (or (null type) (eq (evil-type range) type))
- (evil-contract-range range)
- (evil-set-type range type)
- (evil-expand-range range))
- (evil-set-range-properties range nil)
- (unless return-type
- (evil-set-type range nil))
- (setq evil-operator-range-beginning (evil-range-beginning range)
- evil-operator-range-end (evil-range-end range)
- evil-operator-range-type (evil-type range)))
- range)))
-
-(defmacro evil-define-type (type doc &rest body)
- "Define type TYPE.
-DOC is a general description and shows up in all docstrings.
-
-Optional keyword arguments:
-- `:expand' - expansion function. This function should accept two
- positions in the current buffer, BEG and END,and return a pair of
- expanded buffer positions.
-- `:contract' - the opposite of `:expand'. Optional.
-- `:one-to-one' - non-nil if expansion is one-to-one. This means that
- `:expand' followed by `:contract' always return the original range.
-- `:normalize' - normalization function. This function should accept
- two unexpanded positions and adjust them before expansion. May be
- used to deal with buffer boundaries.
-- `:string' - description function. Takes two buffer positions and
- returns a human-readable string. For example \"2 lines\"
-
-If further keywords and functions are specified, they are assumed to
-be transformations on buffer positions, like `:expand' and `:contract'.
-
-\(fn TYPE DOC [[KEY FUNC]...])"
- (declare (indent defun)
- (doc-string 2)
- (debug (&define name
- [&optional stringp]
- [&rest [keywordp function-form]])))
- (let (args defun-forms func key name plist string sym val)
- ;; standard values
- (setq plist (plist-put plist :one-to-one t))
- ;; keywords
- (while (keywordp (car-safe body))
- (setq key (pop body)
- val (pop body))
- (if (plist-member plist key) ; not a function
- (setq plist (plist-put plist key val))
- (setq func val
- sym (intern (replace-regexp-in-string
- "^:" "" (symbol-name key)))
- name (intern (format "evil-%s-%s" type sym))
- args (car (cdr-safe func))
- string (car (cdr (cdr-safe func)))
- string (if (stringp string)
- (format "%s\n\n" string) "")
- plist (plist-put plist key `',name))
- (push
- (cond
- ((eq key :string)
- `(defun ,name (beg end &rest properties)
- ,(format "Return size of %s from BEG to END \
-with PROPERTIES.\n\n%s%s" type string doc)
- (let ((beg (evil-normalize-position beg))
- (end (evil-normalize-position end))
- (type ',type)
- plist range)
- (when (and beg end)
- (save-excursion
- (evil-sort beg end)
- (unless (plist-get properties :expanded)
- (setq range (apply #'evil-expand
- beg end type properties)
- beg (evil-range-beginning range)
- end (evil-range-end range)
- type (evil-type range type)
- plist (evil-range-properties range))
- (setq properties
- (evil-concat-plists properties plist)))
- (or (apply #',func beg end
- (when ,(> (length args) 2)
- properties))
- ""))))))
- (t
- `(defun ,name (beg end &rest properties)
- ,(format "Perform %s transformation on %s from BEG to END \
-with PROPERTIES.\n\n%s%s" sym type string doc)
- (let ((beg (evil-normalize-position beg))
- (end (evil-normalize-position end))
- (type ',type)
- plist range)
- (when (and beg end)
- (save-excursion
- (evil-sort beg end)
- (when (memq ,key '(:expand :contract))
- (setq properties
- (plist-put properties
- :expanded
- ,(eq key :expand))))
- (setq range (or (apply #',func beg end
- (when ,(> (length args) 2)
- properties))
- (apply #'evil-range
- beg end type properties))
- beg (evil-range-beginning range)
- end (evil-range-end range)
- type (evil-type range type)
- plist (evil-range-properties range))
- (setq properties
- (evil-concat-plists properties plist))
- (apply #'evil-range beg end type properties)))))))
- defun-forms)))
- ;; :one-to-one requires both or neither of :expand and :contract
- (when (plist-get plist :expand)
- (setq plist (plist-put plist :one-to-one
- (and (plist-get plist :contract)
- (plist-get plist :one-to-one)))))
- `(progn
- (evil-put-property 'evil-type-properties ',type ,@plist)
- ,@defun-forms
- ',type)))
-
-(defmacro evil-define-interactive-code (code &rest body)
- "Define an interactive code.
-PROMPT, if given, is the remainder of the interactive string
-up to the next newline. Command properties may be specified
-via KEY-VALUE pairs. BODY should evaluate to a list of values.
-
-\(fn CODE (PROMPT) [[KEY VALUE]...] BODY...)"
- (declare (indent defun))
- (let* ((args (when (and (> (length body) 1)
- (listp (car-safe body)))
- (pop body)))
- (doc (when (stringp (car-safe body)) (pop body)))
- func properties)
- (while (keywordp (car-safe body))
- (setq properties
- (append properties (list (pop body) (pop body)))))
- (cond
- (args
- (setq func `(lambda ,args
- ,@(when doc `(,doc))
- ,@body)))
- ((> (length body) 1)
- (setq func `(progn ,@body)))
- (t
- (setq func (car body))))
- `(eval-and-compile
- (let* ((code ,code)
- (entry (assoc code evil-interactive-alist))
- (value (cons ',func ',properties)))
- (if entry
- (setcdr entry value)
- (push (cons code value) evil-interactive-alist))
- code))))
-
-;;; Highlighting
-
-(when (fboundp 'font-lock-add-keywords)
- (font-lock-add-keywords
- 'emacs-lisp-mode
- ;; Match all `evil-define-' forms except `evil-define-key'.
- ;; (In the interests of speed, this expression is incomplete
- ;; and does not match all three-letter words.)
- '(("(\\(evil-\\(?:ex-\\)?define-\
-\\(?:[^ k][^ e][^ y]\\|[-[:word:]]\\{4,\\}\\)\\)\
-\\>[ \f\t\n\r\v]*\\(\\(?:\\sw\\|\\s_\\)+\\)?"
- (1 font-lock-keyword-face)
- (2 font-lock-function-name-face nil t))
- ("(\\(evil-\\(?:delay\\|narrow\\|signal\\|save\\|with\\(?:out\\)?\\)\
-\\(?:-[-[:word:]]+\\)?\\)\\>\[ \f\t\n\r\v]+"
- 1 font-lock-keyword-face)
- ("(\\(evil-\\(?:[-[:word:]]\\)*loop\\)\\>[ \f\t\n\r\v]+"
- 1 font-lock-keyword-face))))
-
-(provide 'evil-macros)
-
-;;; evil-macros.el ends here
diff --git a/elpa/evil-20200718.842/evil-maps.el b/elpa/evil-20200718.842/evil-maps.el
deleted file mode 100644
index 079b9f6..0000000
--- a/elpa/evil-20200718.842/evil-maps.el
+++ /dev/null
@@ -1,579 +0,0 @@
-;;; evil-maps.el --- Default keymaps -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-states)
-(require 'evil-ex)
-(require 'evil-commands)
-(require 'evil-command-window)
-(require 'evil-common)
-
-;;; Code:
-
-;;; Normal state
-
-(define-key evil-normal-state-map "a" 'evil-append)
-(define-key evil-normal-state-map "A" 'evil-append-line)
-(define-key evil-normal-state-map "c" 'evil-change)
-(define-key evil-normal-state-map "C" 'evil-change-line)
-(define-key evil-normal-state-map "d" 'evil-delete)
-(define-key evil-normal-state-map "D" 'evil-delete-line)
-(define-key evil-normal-state-map "i" 'evil-insert)
-(define-key evil-normal-state-map (kbd "<insert>") 'evil-insert)
-(define-key evil-normal-state-map (kbd "<insertchar>") 'evil-insert)
-(define-key evil-normal-state-map "I" 'evil-insert-line)
-(define-key evil-normal-state-map "J" 'evil-join)
-(define-key evil-normal-state-map "m" 'evil-set-marker)
-(define-key evil-normal-state-map "o" 'evil-open-below)
-(define-key evil-normal-state-map "O" 'evil-open-above)
-(define-key evil-normal-state-map "p" 'evil-paste-after)
-(define-key evil-normal-state-map "P" 'evil-paste-before)
-(define-key evil-normal-state-map "q" 'evil-record-macro)
-(define-key evil-normal-state-map "r" 'evil-replace)
-(define-key evil-normal-state-map "R" 'evil-replace-state)
-(define-key evil-normal-state-map "s" 'evil-substitute)
-(define-key evil-normal-state-map "S" 'evil-change-whole-line)
-(define-key evil-normal-state-map "x" 'evil-delete-char)
-(define-key evil-normal-state-map "X" 'evil-delete-backward-char)
-(define-key evil-normal-state-map [deletechar] 'evil-delete-char)
-(define-key evil-normal-state-map "y" 'evil-yank)
-(define-key evil-normal-state-map "Y" 'evil-yank-line)
-(define-key evil-normal-state-map "&" 'evil-ex-repeat-substitute)
-(define-key evil-normal-state-map "g&" 'evil-ex-repeat-global-substitute)
-(define-key evil-normal-state-map "g8" 'what-cursor-position)
-(define-key evil-normal-state-map "ga" 'what-cursor-position)
-(define-key evil-normal-state-map "gi" 'evil-insert-resume)
-(define-key evil-normal-state-map "gJ" 'evil-join-whitespace)
-(define-key evil-normal-state-map "gq" 'evil-fill-and-move)
-(define-key evil-normal-state-map "gw" 'evil-fill)
-(define-key evil-normal-state-map "gu" 'evil-downcase)
-(define-key evil-normal-state-map "gU" 'evil-upcase)
-(define-key evil-normal-state-map "gf" 'find-file-at-point)
-(define-key evil-normal-state-map "gF" 'evil-find-file-at-point-with-line)
-(define-key evil-normal-state-map "gx" 'browse-url-at-point)
-(define-key evil-normal-state-map "g?" 'evil-rot13)
-(define-key evil-normal-state-map "g~" 'evil-invert-case)
-(define-key evil-normal-state-map "zo" 'evil-open-fold)
-(define-key evil-normal-state-map "zO" 'evil-open-fold-rec)
-(define-key evil-normal-state-map "zc" 'evil-close-fold)
-(define-key evil-normal-state-map "za" 'evil-toggle-fold)
-(define-key evil-normal-state-map "zr" 'evil-open-folds)
-(define-key evil-normal-state-map "zm" 'evil-close-folds)
-(define-key evil-normal-state-map "z=" 'ispell-word)
-(define-key evil-normal-state-map "\C-n" 'evil-paste-pop-next)
-(define-key evil-normal-state-map "\C-p" 'evil-paste-pop)
-(define-key evil-normal-state-map "\C-t" 'pop-tag-mark)
-(define-key evil-normal-state-map (kbd "C-.") 'evil-repeat-pop)
-(define-key evil-normal-state-map (kbd "M-.") 'evil-repeat-pop-next)
-(define-key evil-normal-state-map "." 'evil-repeat)
-(define-key evil-normal-state-map "@" 'evil-execute-macro)
-(define-key evil-normal-state-map "\"" 'evil-use-register)
-(define-key evil-normal-state-map "~" 'evil-invert-char)
-(define-key evil-normal-state-map "=" 'evil-indent)
-(define-key evil-normal-state-map "<" 'evil-shift-left)
-(define-key evil-normal-state-map ">" 'evil-shift-right)
-(define-key evil-normal-state-map "ZZ" 'evil-save-modified-and-close)
-(define-key evil-normal-state-map "ZQ" 'evil-quit)
-(define-key evil-normal-state-map (kbd "DEL") 'evil-backward-char)
-(define-key evil-normal-state-map [escape] 'evil-force-normal-state)
-(define-key evil-normal-state-map [remap cua-paste-pop] 'evil-paste-pop)
-(define-key evil-normal-state-map [remap yank-pop] 'evil-paste-pop)
-
-(when (featurep 'tab-bar)
- (define-key evil-normal-state-map "gt" 'tab-bar-switch-to-next-tab)
- (define-key evil-normal-state-map "gT" 'tab-bar-switch-to-prev-tab))
-
-;; go to last change
-(define-key evil-normal-state-map "g;" 'goto-last-change)
-(define-key evil-normal-state-map "g," 'goto-last-change-reverse)
-
-;; undo
-(define-key evil-normal-state-map "u" 'undo)
-(define-key evil-normal-state-map "\C-r" 'redo)
-
-;; window commands
-(define-prefix-command 'evil-window-map)
-(define-key evil-window-map "b" 'evil-window-bottom-right)
-(define-key evil-window-map "c" 'evil-window-delete)
-(define-key evil-window-map "h" 'evil-window-left)
-(define-key evil-window-map "H" 'evil-window-move-far-left)
-(define-key evil-window-map "j" 'evil-window-down)
-(define-key evil-window-map "J" 'evil-window-move-very-bottom)
-(define-key evil-window-map "k" 'evil-window-up)
-(define-key evil-window-map "K" 'evil-window-move-very-top)
-(define-key evil-window-map "l" 'evil-window-right)
-(define-key evil-window-map "L" 'evil-window-move-far-right)
-(define-key evil-window-map "n" 'evil-window-new)
-(define-key evil-window-map "o" 'delete-other-windows)
-(define-key evil-window-map "p" 'evil-window-mru)
-(define-key evil-window-map "q" 'evil-quit)
-(define-key evil-window-map "r" 'evil-window-rotate-downwards)
-(define-key evil-window-map "R" 'evil-window-rotate-upwards)
-(define-key evil-window-map "s" 'evil-window-split)
-(define-key evil-window-map "S" 'evil-window-split)
-(define-key evil-window-map "t" 'evil-window-top-left)
-(define-key evil-window-map "v" 'evil-window-vsplit)
-(define-key evil-window-map "w" 'evil-window-next)
-(define-key evil-window-map "W" 'evil-window-prev)
-(define-key evil-window-map "+" 'evil-window-increase-height)
-(define-key evil-window-map "-" 'evil-window-decrease-height)
-(define-key evil-window-map "_" 'evil-window-set-height)
-(define-key evil-window-map "<" 'evil-window-decrease-width)
-(define-key evil-window-map ">" 'evil-window-increase-width)
-(define-key evil-window-map "=" 'balance-windows)
-(define-key evil-window-map "|" 'evil-window-set-width)
-(define-key evil-window-map "\C-b" 'evil-window-bottom-right)
-(define-key evil-window-map "\C-c" 'evil-window-delete)
-(define-key evil-window-map (kbd "C-S-h") 'evil-window-move-far-left)
-(define-key evil-window-map (kbd "C-S-j") 'evil-window-move-very-bottom)
-(define-key evil-window-map (kbd "C-S-k") 'evil-window-move-very-top)
-(define-key evil-window-map (kbd "C-S-l") 'evil-window-move-far-right)
-(define-key evil-window-map "\C-n" 'evil-window-new)
-(define-key evil-window-map "\C-o" 'delete-other-windows)
-(define-key evil-window-map "\C-p" 'evil-window-mru)
-(define-key evil-window-map "\C-r" 'evil-window-rotate-downwards)
-(define-key evil-window-map (kbd "C-S-r") 'evil-window-rotate-upwards)
-(define-key evil-window-map "\C-s" 'evil-window-split)
-(define-key evil-window-map (kbd "C-S-s") 'evil-window-split)
-(define-key evil-window-map "\C-t" 'evil-window-top-left)
-(define-key evil-window-map "\C-v" 'evil-window-vsplit)
-(define-key evil-window-map "\C-w" 'evil-window-next)
-(define-key evil-window-map (kbd "C-S-W") 'evil-window-prev)
-(define-key evil-window-map "\C-_" 'evil-window-set-height)
-(define-key evil-window-map "\C-f" 'ffap-other-window)
-
-;;; Motion state
-
-;; "0" is a special command when called first
-(evil-redirect-digit-argument evil-motion-state-map "0" 'evil-beginning-of-line)
-(define-key evil-motion-state-map "1" 'digit-argument)
-(define-key evil-motion-state-map "2" 'digit-argument)
-(define-key evil-motion-state-map "3" 'digit-argument)
-(define-key evil-motion-state-map "4" 'digit-argument)
-(define-key evil-motion-state-map "5" 'digit-argument)
-(define-key evil-motion-state-map "6" 'digit-argument)
-(define-key evil-motion-state-map "7" 'digit-argument)
-(define-key evil-motion-state-map "8" 'digit-argument)
-(define-key evil-motion-state-map "9" 'digit-argument)
-(define-key evil-motion-state-map "b" 'evil-backward-word-begin)
-(define-key evil-motion-state-map "B" 'evil-backward-WORD-begin)
-(define-key evil-motion-state-map "e" 'evil-forward-word-end)
-(define-key evil-motion-state-map "E" 'evil-forward-WORD-end)
-(define-key evil-motion-state-map "f" 'evil-find-char)
-(define-key evil-motion-state-map "F" 'evil-find-char-backward)
-(define-key evil-motion-state-map "G" 'evil-goto-line)
-(define-key evil-motion-state-map "h" 'evil-backward-char)
-(define-key evil-motion-state-map "H" 'evil-window-top)
-(define-key evil-motion-state-map "j" 'evil-next-line)
-(define-key evil-motion-state-map "k" 'evil-previous-line)
-(define-key evil-motion-state-map "l" 'evil-forward-char)
-(define-key evil-motion-state-map " " 'evil-forward-char)
-(define-key evil-motion-state-map "K" 'evil-lookup)
-(define-key evil-motion-state-map "L" 'evil-window-bottom)
-(define-key evil-motion-state-map "M" 'evil-window-middle)
-(define-key evil-motion-state-map "n" 'evil-search-next)
-(define-key evil-motion-state-map "N" 'evil-search-previous)
-(define-key evil-motion-state-map "t" 'evil-find-char-to)
-(define-key evil-motion-state-map "T" 'evil-find-char-to-backward)
-(define-key evil-motion-state-map "w" 'evil-forward-word-begin)
-(define-key evil-motion-state-map "W" 'evil-forward-WORD-begin)
-(define-key evil-motion-state-map "y" 'evil-yank)
-(define-key evil-motion-state-map "Y" 'evil-yank-line)
-(define-key evil-motion-state-map "gd" 'evil-goto-definition)
-(define-key evil-motion-state-map "ge" 'evil-backward-word-end)
-(define-key evil-motion-state-map "gE" 'evil-backward-WORD-end)
-(define-key evil-motion-state-map "gg" 'evil-goto-first-line)
-(define-key evil-motion-state-map "gj" 'evil-next-visual-line)
-(define-key evil-motion-state-map "gk" 'evil-previous-visual-line)
-(define-key evil-motion-state-map "g0" 'evil-beginning-of-visual-line)
-(define-key evil-motion-state-map "g_" 'evil-last-non-blank)
-(define-key evil-motion-state-map "g^" 'evil-first-non-blank-of-visual-line)
-(define-key evil-motion-state-map "gm" 'evil-middle-of-visual-line)
-(define-key evil-motion-state-map "g$" 'evil-end-of-visual-line)
-(define-key evil-motion-state-map "g\C-]" 'evil-jump-to-tag)
-(define-key evil-motion-state-map "{" 'evil-backward-paragraph)
-(define-key evil-motion-state-map "}" 'evil-forward-paragraph)
-(define-key evil-motion-state-map "#" 'evil-search-word-backward)
-(define-key evil-motion-state-map "g#" 'evil-search-unbounded-word-backward)
-(define-key evil-motion-state-map "$" 'evil-end-of-line)
-(define-key evil-motion-state-map "%" 'evil-jump-item)
-(define-key evil-motion-state-map "`" 'evil-goto-mark)
-(define-key evil-motion-state-map "'" 'evil-goto-mark-line)
-(define-key evil-motion-state-map "(" 'evil-backward-sentence-begin)
-(define-key evil-motion-state-map ")" 'evil-forward-sentence-begin)
-(define-key evil-motion-state-map "]]" 'evil-forward-section-begin)
-(define-key evil-motion-state-map "][" 'evil-forward-section-end)
-(define-key evil-motion-state-map "[[" 'evil-backward-section-begin)
-(define-key evil-motion-state-map "[]" 'evil-backward-section-end)
-(define-key evil-motion-state-map "[(" 'evil-previous-open-paren)
-(define-key evil-motion-state-map "])" 'evil-next-close-paren)
-(define-key evil-motion-state-map "[{" 'evil-previous-open-brace)
-(define-key evil-motion-state-map "]}" 'evil-next-close-brace)
-(define-key evil-motion-state-map "]s" 'evil-next-flyspell-error)
-(define-key evil-motion-state-map "[s" 'evil-prev-flyspell-error)
-(define-key evil-motion-state-map "*" 'evil-search-word-forward)
-(define-key evil-motion-state-map "g*" 'evil-search-unbounded-word-forward)
-(define-key evil-motion-state-map "," 'evil-repeat-find-char-reverse)
-(define-key evil-motion-state-map "/" 'evil-search-forward)
-(define-key evil-motion-state-map ";" 'evil-repeat-find-char)
-(define-key evil-motion-state-map "?" 'evil-search-backward)
-(define-key evil-motion-state-map "|" 'evil-goto-column)
-(define-key evil-motion-state-map "^" 'evil-first-non-blank)
-(define-key evil-motion-state-map "+" 'evil-next-line-first-non-blank)
-(define-key evil-motion-state-map "_" 'evil-next-line-1-first-non-blank)
-(define-key evil-motion-state-map "-" 'evil-previous-line-first-non-blank)
-(define-key evil-motion-state-map "\C-w" 'evil-window-map)
-(define-key evil-motion-state-map (kbd "C-6") 'evil-switch-to-windows-last-buffer)
-(define-key evil-motion-state-map "\C-]" 'evil-jump-to-tag)
-(define-key evil-motion-state-map (kbd "C-b") 'evil-scroll-page-up)
-(define-key evil-motion-state-map (kbd "C-e") 'evil-scroll-line-down)
-(define-key evil-motion-state-map (kbd "C-f") 'evil-scroll-page-down)
-(define-key evil-motion-state-map (kbd "C-o") 'evil-jump-backward)
-(define-key evil-motion-state-map (kbd "C-y") 'evil-scroll-line-up)
-(define-key evil-motion-state-map (kbd "RET") 'evil-ret)
-(define-key evil-motion-state-map "\\" 'evil-execute-in-emacs-state)
-(define-key evil-motion-state-map "z^" 'evil-scroll-top-line-to-bottom)
-(define-key evil-motion-state-map "z+" 'evil-scroll-bottom-line-to-top)
-(define-key evil-motion-state-map "zt" 'evil-scroll-line-to-top)
-;; TODO: z RET has an advanced form taking an count before the RET
-;; but this requires again a special state with a single command
-;; bound to RET
-(define-key evil-motion-state-map (vconcat "z" [return]) "zt^")
-(define-key evil-motion-state-map (kbd "z RET") (vconcat "z" [return]))
-(define-key evil-motion-state-map "zz" 'evil-scroll-line-to-center)
-(define-key evil-motion-state-map "z." "zz^")
-(define-key evil-motion-state-map "zb" 'evil-scroll-line-to-bottom)
-(define-key evil-motion-state-map "z-" "zb^")
-(define-key evil-motion-state-map "v" 'evil-visual-char)
-(define-key evil-motion-state-map "V" 'evil-visual-line)
-(define-key evil-motion-state-map "\C-v" 'evil-visual-block)
-(define-key evil-motion-state-map "gv" 'evil-visual-restore)
-(define-key evil-motion-state-map (kbd "C-^") 'evil-buffer)
-(define-key evil-motion-state-map [left] 'evil-backward-char)
-(define-key evil-motion-state-map [right] 'evil-forward-char)
-(define-key evil-motion-state-map [up] 'evil-previous-line)
-(define-key evil-motion-state-map [down] 'evil-next-line)
-(define-key evil-motion-state-map "zl" 'evil-scroll-column-right)
-(define-key evil-motion-state-map [?z right] "zl")
-(define-key evil-motion-state-map "zh" 'evil-scroll-column-left)
-(define-key evil-motion-state-map [?z left] "zh")
-(define-key evil-motion-state-map "zL" 'evil-scroll-right)
-(define-key evil-motion-state-map "zH" 'evil-scroll-left)
-(define-key evil-motion-state-map
- (read-kbd-macro evil-toggle-key) 'evil-emacs-state)
-
-;; text objects
-(define-key evil-outer-text-objects-map "w" 'evil-a-word)
-(define-key evil-outer-text-objects-map "W" 'evil-a-WORD)
-(define-key evil-outer-text-objects-map "s" 'evil-a-sentence)
-(define-key evil-outer-text-objects-map "p" 'evil-a-paragraph)
-(define-key evil-outer-text-objects-map "b" 'evil-a-paren)
-(define-key evil-outer-text-objects-map "(" 'evil-a-paren)
-(define-key evil-outer-text-objects-map ")" 'evil-a-paren)
-(define-key evil-outer-text-objects-map "[" 'evil-a-bracket)
-(define-key evil-outer-text-objects-map "]" 'evil-a-bracket)
-(define-key evil-outer-text-objects-map "B" 'evil-a-curly)
-(define-key evil-outer-text-objects-map "{" 'evil-a-curly)
-(define-key evil-outer-text-objects-map "}" 'evil-a-curly)
-(define-key evil-outer-text-objects-map "<" 'evil-an-angle)
-(define-key evil-outer-text-objects-map ">" 'evil-an-angle)
-(define-key evil-outer-text-objects-map "'" 'evil-a-single-quote)
-(define-key evil-outer-text-objects-map "\"" 'evil-a-double-quote)
-(define-key evil-outer-text-objects-map "`" 'evil-a-back-quote)
-(define-key evil-outer-text-objects-map "t" 'evil-a-tag)
-(define-key evil-outer-text-objects-map "o" 'evil-a-symbol)
-(define-key evil-inner-text-objects-map "w" 'evil-inner-word)
-(define-key evil-inner-text-objects-map "W" 'evil-inner-WORD)
-(define-key evil-inner-text-objects-map "s" 'evil-inner-sentence)
-(define-key evil-inner-text-objects-map "p" 'evil-inner-paragraph)
-(define-key evil-inner-text-objects-map "b" 'evil-inner-paren)
-(define-key evil-inner-text-objects-map "(" 'evil-inner-paren)
-(define-key evil-inner-text-objects-map ")" 'evil-inner-paren)
-(define-key evil-inner-text-objects-map "[" 'evil-inner-bracket)
-(define-key evil-inner-text-objects-map "]" 'evil-inner-bracket)
-(define-key evil-inner-text-objects-map "B" 'evil-inner-curly)
-(define-key evil-inner-text-objects-map "{" 'evil-inner-curly)
-(define-key evil-inner-text-objects-map "}" 'evil-inner-curly)
-(define-key evil-inner-text-objects-map "<" 'evil-inner-angle)
-(define-key evil-inner-text-objects-map ">" 'evil-inner-angle)
-(define-key evil-inner-text-objects-map "'" 'evil-inner-single-quote)
-(define-key evil-inner-text-objects-map "\"" 'evil-inner-double-quote)
-(define-key evil-inner-text-objects-map "`" 'evil-inner-back-quote)
-(define-key evil-inner-text-objects-map "t" 'evil-inner-tag)
-(define-key evil-inner-text-objects-map "o" 'evil-inner-symbol)
-(define-key evil-motion-state-map "gn" 'evil-next-match)
-(define-key evil-motion-state-map "gN" 'evil-previous-match)
-
-(when evil-want-C-i-jump
- (define-key evil-motion-state-map (kbd "C-i") 'evil-jump-forward))
-
-(when evil-want-C-u-scroll
- (define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up))
-
-(when evil-want-C-d-scroll
- (define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down))
-
-(when evil-want-C-g-bindings
- (define-key evil-motion-state-map "g\C-g" 'count-words))
-
-;;; Visual state
-
-(define-key evil-visual-state-map "A" 'evil-append)
-(define-key evil-visual-state-map "I" 'evil-insert)
-(define-key evil-visual-state-map "o" 'exchange-point-and-mark)
-(define-key evil-visual-state-map "O" 'evil-visual-exchange-corners)
-(define-key evil-visual-state-map "R" 'evil-change)
-(define-key evil-visual-state-map "u" 'evil-downcase)
-(define-key evil-visual-state-map "U" 'evil-upcase)
-(define-key evil-visual-state-map "z=" 'ispell-word)
-(define-key evil-visual-state-map "a" evil-outer-text-objects-map)
-(define-key evil-visual-state-map "i" evil-inner-text-objects-map)
-(define-key evil-visual-state-map (kbd "<insert>") 'undefined)
-(define-key evil-visual-state-map (kbd "<insertchar>") 'undefined)
-(define-key evil-visual-state-map [remap evil-repeat] 'undefined)
-(define-key evil-visual-state-map [escape] 'evil-exit-visual-state)
-
-;;; Operator-Pending state
-
-(define-key evil-operator-state-map "a" evil-outer-text-objects-map)
-(define-key evil-operator-state-map "i" evil-inner-text-objects-map)
-;; (define-key evil-operator-state-map [escape] 'keyboard-quit)
-
-;;; Insert state
-
-(defvar evil-insert-state-bindings
- `(("\C-v" . quoted-insert)
- ("\C-k" . evil-insert-digraph)
- ("\C-o" . evil-execute-in-normal-state)
- ("\C-r" . evil-paste-from-register)
- ("\C-y" . evil-copy-from-above)
- ("\C-e" . evil-copy-from-below)
- ("\C-n" . evil-complete-next)
- ("\C-p" . evil-complete-previous)
- ("\C-x\C-n" . evil-complete-next-line)
- ("\C-x\C-p" . evil-complete-previous-line)
- ("\C-t" . evil-shift-right-line)
- ("\C-d" . evil-shift-left-line)
- ("\C-a" . evil-paste-last-insertion)
- ([remap delete-backward-char] . evil-delete-backward-char-and-join)
- ,(if evil-want-C-w-delete
- '("\C-w" . evil-delete-backward-word)
- '("\C-w" . evil-window-map))
- ,@(when evil-want-C-u-delete
- '(("\C-u" . evil-delete-back-to-indentation)))
- ([mouse-2] . mouse-yank-primary))
- "Evil's bindings for insert state (for
-`evil-insert-state-map'), excluding <delete>, <escape>, and
-`evil-toggle-key'.")
-
-(defun evil-update-insert-state-bindings (&optional _option-name remove force)
- "Update bindings in `evil-insert-state-map'.
-If no arguments are given add the bindings specified in
-`evil-insert-state-bindings'. If REMOVE is non nil, remove only
-these bindings. Unless FORCE is non nil, this will not
-overwriting existing bindings, which means bindings will not be
-added if one already exists for a key and only default bindings
-are removed.
-
-Note that <delete>, <escape> and `evil-toggle-key' are not
-included in `evil-insert-state-bindings' by default."
- (interactive)
- (dolist (binding evil-insert-state-bindings)
- (cond
- ((and remove
- (or force
- ;; Only remove if the default binding has not changed
- (eq (evil-lookup-key evil-insert-state-map (car binding))
- (cdr binding))))
- (define-key evil-insert-state-map (car binding) nil))
- ((and (null remove)
- (or force
- ;; Check to see that nothing is bound here before adding
- (not (evil-lookup-key evil-insert-state-map (car binding)))))
- (define-key evil-insert-state-map (car binding) (cdr binding))))))
-
-(define-key evil-insert-state-map [delete] 'delete-char)
-(define-key evil-insert-state-map [escape] 'evil-normal-state)
-(define-key evil-insert-state-map
- (read-kbd-macro evil-toggle-key) 'evil-emacs-state)
-
-;;; Replace state
-
-(define-key evil-replace-state-map (kbd "DEL") 'evil-replace-backspace)
-(define-key evil-replace-state-map [escape] 'evil-normal-state)
-
-;;; Emacs state
-
-(define-key evil-emacs-state-map
- (read-kbd-macro evil-toggle-key) 'evil-exit-emacs-state)
-
-(when evil-want-C-w-in-emacs-state
- (define-key evil-emacs-state-map "\C-w" 'evil-window-map))
-
-;;; Mouse
-(define-key evil-motion-state-map [down-mouse-1] 'evil-mouse-drag-region)
-(define-key evil-visual-state-map [mouse-2] 'evil-exit-visual-and-repeat)
-(define-key evil-normal-state-map [mouse-2] 'mouse-yank-primary)
-
-;; Ex
-(define-key evil-motion-state-map ":" 'evil-ex)
-(define-key evil-motion-state-map "!" 'evil-shell-command)
-
-(evil-ex-define-cmd "e[dit]" 'evil-edit)
-(evil-ex-define-cmd "w[rite]" 'evil-write)
-(evil-ex-define-cmd "wa[ll]" 'evil-write-all)
-(evil-ex-define-cmd "sav[eas]" 'evil-save)
-(evil-ex-define-cmd "r[ead]" 'evil-read)
-(evil-ex-define-cmd "b[uffer]" 'evil-buffer)
-(evil-ex-define-cmd "bn[ext]" 'evil-next-buffer)
-(evil-ex-define-cmd "bp[revious]" 'evil-prev-buffer)
-(evil-ex-define-cmd "bN[ext]" "bprevious")
-(evil-ex-define-cmd "sb[uffer]" 'evil-split-buffer)
-(evil-ex-define-cmd "sbn[ext]" 'evil-split-next-buffer)
-(evil-ex-define-cmd "sbp[revious]" 'evil-split-prev-buffer)
-(evil-ex-define-cmd "sbN[ext]" "sbprevious")
-(evil-ex-define-cmd "buffers" 'buffer-menu)
-(evil-ex-define-cmd "files" 'evil-show-files)
-(evil-ex-define-cmd "ls" "buffers")
-
-(evil-ex-define-cmd "c[hange]" 'evil-change)
-(evil-ex-define-cmd "co[py]" 'evil-copy)
-(evil-ex-define-cmd "t" "copy")
-(evil-ex-define-cmd "m[ove]" 'evil-move)
-(evil-ex-define-cmd "d[elete]" 'evil-ex-delete)
-(evil-ex-define-cmd "y[ank]" 'evil-ex-yank)
-(evil-ex-define-cmd "go[to]" 'evil-goto-char)
-(evil-ex-define-cmd "j[oin]" 'evil-ex-join)
-(evil-ex-define-cmd "le[ft]" 'evil-align-left)
-(evil-ex-define-cmd "ri[ght]" 'evil-align-right)
-(evil-ex-define-cmd "ce[nter]" 'evil-align-center)
-(evil-ex-define-cmd "sp[lit]" 'evil-window-split)
-(evil-ex-define-cmd "vs[plit]" 'evil-window-vsplit)
-(evil-ex-define-cmd "new" 'evil-window-new)
-(evil-ex-define-cmd "ene[w]" 'evil-buffer-new)
-(evil-ex-define-cmd "vne[w]" 'evil-window-vnew)
-(evil-ex-define-cmd "clo[se]" 'evil-window-delete)
-(evil-ex-define-cmd "on[ly]" 'delete-other-windows)
-(evil-ex-define-cmd "q[uit]" 'evil-quit)
-(evil-ex-define-cmd "wq" 'evil-save-and-close)
-(evil-ex-define-cmd "quita[ll]" 'evil-quit-all)
-(evil-ex-define-cmd "qa[ll]" "quitall")
-(evil-ex-define-cmd "cq[uit]" 'evil-quit-all-with-error-code)
-(evil-ex-define-cmd "wqa[ll]" 'evil-save-and-quit)
-(evil-ex-define-cmd "xa[ll]" "wqall")
-(evil-ex-define-cmd "x[it]" 'evil-save-modified-and-close)
-(evil-ex-define-cmd "exi[t]" 'evil-save-modified-and-close)
-(evil-ex-define-cmd "bd[elete]" 'evil-delete-buffer)
-(evil-ex-define-cmd "bw[ipeout]" 'evil-delete-buffer)
-(evil-ex-define-cmd "g[lobal]" 'evil-ex-global)
-(evil-ex-define-cmd "v[global]" 'evil-ex-global-inverted)
-(evil-ex-define-cmd "norm[al]" 'evil-ex-normal)
-(evil-ex-define-cmd "s[ubstitute]" 'evil-ex-substitute)
-(evil-ex-define-cmd "&" 'evil-ex-repeat-substitute)
-(evil-ex-define-cmd "&&" 'evil-ex-repeat-substitute-with-flags)
-(evil-ex-define-cmd "~" 'evil-ex-repeat-substitute-with-search)
-(evil-ex-define-cmd "~&" 'evil-ex-repeat-substitute-with-search-and-flags)
-(evil-ex-define-cmd "registers" 'evil-show-registers)
-(evil-ex-define-cmd "marks" 'evil-show-marks)
-(evil-ex-define-cmd "delm[arks]" 'evil-delete-marks)
-(evil-ex-define-cmd "ju[mps]" 'evil-show-jumps)
-(evil-ex-define-cmd "noh[lsearch]" 'evil-ex-nohighlight)
-(evil-ex-define-cmd "f[ile]" 'evil-show-file-info)
-(evil-ex-define-cmd "<" 'evil-shift-left)
-(evil-ex-define-cmd ">" 'evil-shift-right)
-(evil-ex-define-cmd "=" 'evil-ex-line-number)
-(evil-ex-define-cmd "!" 'evil-shell-command)
-(evil-ex-define-cmd "@:" 'evil-ex-repeat)
-(evil-ex-define-cmd "mak[e]" 'evil-make)
-(evil-ex-define-cmd "cc" 'evil-goto-error)
-(evil-ex-define-cmd "cfir[st]" 'first-error)
-(evil-ex-define-cmd "cr[ewind]" 'first-error)
-(evil-ex-define-cmd "cn[ext]" 'next-error)
-(evil-ex-define-cmd "cp[revious]" 'previous-error)
-(evil-ex-define-cmd "set-initial-state" 'evil-ex-set-initial-state)
-(evil-ex-define-cmd "show-digraphs" 'evil-ex-show-digraphs)
-(evil-ex-define-cmd "sor[t]" 'evil-ex-sort)
-(evil-ex-define-cmd "res[ize]" 'evil-ex-resize)
-
-(when (featurep 'tab-bar)
- (evil-ex-define-cmd "tabnew" 'tab-bar-new-tab)
- (evil-ex-define-cmd "tabn[ext]" 'tab-bar-switch-to-next-tab)
- (evil-ex-define-cmd "tabp[revious]" 'tab-bar-switch-to-prev-tab))
-
-;; search command line
-(define-key evil-ex-search-keymap "\d" #'evil-ex-delete-backward-char)
-(define-key evil-ex-search-keymap "\C-f" 'evil-ex-search-command-window)
-(define-key evil-ex-search-keymap "\C-r" 'evil-paste-from-register)
-(define-key evil-ex-search-keymap "\C-n" 'next-history-element)
-(define-key evil-ex-search-keymap "\C-p" 'previous-history-element)
-
-;; ex command line
-(define-key evil-ex-completion-map "\d" #'evil-ex-delete-backward-char)
-(define-key evil-ex-completion-map "\t" #'evil-ex-completion)
-(define-key evil-ex-completion-map [tab] #'evil-ex-completion)
-(define-key evil-ex-completion-map [remap completion-at-point] #'evil-ex-completion)
-(define-key evil-ex-completion-map "\C-a" 'evil-ex-completion)
-(define-key evil-ex-completion-map "\C-b" 'move-beginning-of-line)
-(define-key evil-ex-completion-map "\C-c" 'abort-recursive-edit)
-(define-key evil-ex-completion-map "\C-d" 'evil-ex-completion)
-(define-key evil-ex-completion-map "\C-f" 'evil-ex-command-window)
-(define-key evil-ex-completion-map "\C-g" 'abort-recursive-edit)
-(define-key evil-ex-completion-map "\C-k" 'evil-insert-digraph)
-(define-key evil-ex-completion-map "\C-l" 'evil-ex-completion)
-(define-key evil-ex-completion-map "\C-p" #'previous-complete-history-element)
-(define-key evil-ex-completion-map "\C-r" 'evil-paste-from-register)
-(define-key evil-ex-completion-map "\C-n" #'next-complete-history-element)
-(define-key evil-ex-completion-map "\C-u" 'evil-delete-whole-line)
-(define-key evil-ex-completion-map "\C-v" #'quoted-insert)
-(define-key evil-ex-completion-map "\C-w" 'backward-kill-word)
-(define-key evil-ex-completion-map [escape] 'abort-recursive-edit)
-(define-key evil-ex-completion-map [S-left] 'backward-word)
-(define-key evil-ex-completion-map [S-right] 'forward-word)
-(define-key evil-ex-completion-map [up] 'previous-complete-history-element)
-(define-key evil-ex-completion-map [down] 'next-complete-history-element)
-(define-key evil-ex-completion-map [prior] 'previous-history-element)
-(define-key evil-ex-completion-map [next] 'next-history-element)
-(define-key evil-ex-completion-map [return] 'exit-minibuffer)
-(define-key evil-ex-completion-map (kbd "RET") 'exit-minibuffer)
-
-;; evil-read-key
-(define-key evil-read-key-map (kbd "ESC") #'keyboard-quit)
-(define-key evil-read-key-map (kbd "C-]") #'keyboard-quit)
-(define-key evil-read-key-map (kbd "C-g") #'keyboard-quit)
-(define-key evil-read-key-map (kbd "C-q") #'evil-read-quoted-char)
-(define-key evil-read-key-map (kbd "C-v") #'evil-read-quoted-char)
-(define-key evil-read-key-map (kbd "C-k") #'evil-read-digraph-char)
-(define-key evil-read-key-map "\r" "\n")
-
-;; command line window
-(evil-define-key 'normal
- evil-command-window-mode-map (kbd "RET") 'evil-command-window-execute)
-(evil-define-key 'insert
- evil-command-window-mode-map (kbd "RET") 'evil-command-window-execute)
-
-(provide 'evil-maps)
-
-;;; evil-maps.el ends here
diff --git a/elpa/evil-20200718.842/evil-pkg.el b/elpa/evil-20200718.842/evil-pkg.el
deleted file mode 100644
index 76fe74c..0000000
--- a/elpa/evil-20200718.842/evil-pkg.el
+++ /dev/null
@@ -1,9 +0,0 @@
-(define-package "evil" "20200718.842" "Extensible Vi layer for Emacs."
- '((emacs "24.1")
- (undo-tree "0.7.4")
- (goto-chg "1.6")
- (cl-lib "0.5"))
- :commit "2bc6ca3587502fde67b93e411e329fc8224c916a")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/evil-20200718.842/evil-repeat.el b/elpa/evil-20200718.842/evil-repeat.el
deleted file mode 100644
index 2764b8c..0000000
--- a/elpa/evil-20200718.842/evil-repeat.el
+++ /dev/null
@@ -1,639 +0,0 @@
-;;; evil-repeat.el --- Repeat system -*- lexical-binding: t -*-
-
-;; Author: Frank Fischer <frank.fischer at mathematik.tu-chemnitz.de>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; A repeat begins when leaving Normal state; it ends when re-entering
-;; Normal state. The diagram below shows possible routes between
-;; Normal state (N), Insert state (I), Visual state (V),
-;; Operator-Pending state (O) and Replace state (R). (Emacs state
-;; is an exception: nothing is repeated in that state.)
-;; ___
-;; / \
-;; | R |
-;; \___/
-;; ^ |
-;; | |
-;; ___ |___V ___
-;; / \ <------- / \ -------> / \
-;; | V | | N | | O |
-;; \___/ -------> \___/ <------- \___/
-;; | | ^ |
-;; | | | |
-;; | V___| |
-;; | / \ |
-;; +--------> | I | <--------+
-;; \___/
-;;
-;; The recording of a repeat is started in one of two cases: Either a
-;; command is about being executed (in pre-command-hook) or normal
-;; state is exited. The recording is stopped whenever a command has
-;; being completed and evil is in normal state afterwards. Therefore,
-;; a non-inserting command in normal-state is recorded as a single
-;; repeat unit. In contrast, if the command leaves normal state and
-;; starts insert-state, all commands that are executed until
-;; insert-state is left and normal state is reactivated are recorded
-;; together in one repeat unit. In other words, a repeat unit consists
-;; of all commands that are executed starting and ending in normal
-;; state.
-;;
-;; Not all commands are recorded. There are several commands that are
-;; completely ignored and other commands that even abort the currently
-;; active recording, e.g., commands that change the current buffer.
-;;
-;; During recording the repeat information is appended to the variable
-;; `evil-repeat-info', which is cleared when the recording
-;; starts. This accumulated repeat information is put into the
-;; `evil-repeat-ring' when the recording is finished. The dot command,
-;; `\[evil-repeat]' (`evil-repeat') replays the most recent entry in
-;; the ring, preceeding repeats can be replayed using
-;; `\[evil-repeat-pop]' (`evil-repeat-pop').
-;;
-;; Repeat information can be stored in almost arbitrary form. How the
-;; repeat information for each single command is recored is determined
-;; by the :repeat property of the command. This property has the
-;; following interpretation:
-;;
-;; t record commands by storing the key-sequence that invoked it
-;; nil ignore this command completely
-;; ignore synonym to nil
-;; motion command is recorded by storing the key-sequence but only in
-;; insert state, otherwise it is ignored.
-;; abort stop recording of repeat information immediately
-;; change record commands by storing buffer changes
-;; SYMBOL if SYMBOL is contained as key in `evil-repeat-types'
-;; call the corresponding (function-)value, otherwise
-;; call the function associated with SYMBOL. In both
-;; cases the function should take exactly one argument
-;; which is either 'pre or 'post depending on whether
-;; the function is called before or after the execution
-;; of the command.
-;;
-;; Therefore, using a certain SYMBOL one can write specific repeation
-;; functions for each command.
-;;
-;; Each value of ring `evil-repeat-info', i.e., each single repeat
-;; information must be one of the following two possibilities:
-;; If element is a sequence, it is regarded as a key-sequence to
-;; be repeated. Otherwise the element must be a list
-;; (FUNCTION PARAMS ...) which will be called using
-;; (apply FUNCTION PARAMS) whenever this repeat is being executed.
-;;
-;; A user supplied repeat function can use the functions
-;; `evil-record-repeat' to append further repeat-information of the
-;; form described above to `evil-repeat-info'. See the implementation
-;; of `evil-repeat-keystrokes' and `evil-repeat-changes' for examples.
-;; Those functions are called in different situations before and after
-;; the execution of a command. Each function should take one argument
-;; which can be either 'pre, 'post, 'pre-operator or 'post-operator
-;; specifying when the repeat function has been called. If the command
-;; is a usual command the function is called with 'pre before the
-;; command is executed and with 'post after the command has been
-;; executed.
-;;
-;; The repeat information is executed with `evil-execute-repeat-info',
-;; which passes key-sequence elements to `execute-kbd-macro' and
-;; executes other elements as defined above. A special version is
-;; `evil-execute-repeat-info-with-count'. This function works as
-;; `evil-execute-repeat-info', but replaces the count of the first
-;; command. This is done by parsing the key-sequence, ignoring all
-;; calls to `digit-prefix-argument' and `negative-argument', and
-;; prepending the count as a string to the vector of the remaining
-;; key-sequence.
-
-(require 'evil-states)
-
-;;; Code:
-
-(declare-function evil-visual-state-p "evil-visual")
-(declare-function evil-visual-range "evil-visual")
-(declare-function evil-visual-char "evil-visual")
-(declare-function evil-visual-line "evil-visual")
-(declare-function evil-visual-block "evil-visual")
-
-(defmacro evil-without-repeat (&rest body)
- (declare (indent defun)
- (debug t))
- `(let ((pre-command-hook (remq 'evil-repeat-pre-hook pre-command-hook))
- (post-command-hook (remq 'evil-repeat-post-hook post-command-hook)))
- ,@body
- (evil-repeat-abort)))
-
-(defsubst evil-repeat-recording-p ()
- "Returns non-nil iff a recording is in progress."
- (eq evil-recording-repeat t))
-
-(defun evil-repeat-start ()
- "Start recording a new repeat into `evil-repeat-info'."
- (evil-repeat-reset t)
- (evil-repeat-record-buffer)
- (when (evil-visual-state-p)
- (let* ((range (evil-visual-range))
- (beg (evil-range-beginning range))
- (end (1- (evil-range-end range)))
- (nfwdlines (evil-count-lines beg end)))
- (evil-repeat-record
- (cond
- ((eq evil-visual-selection 'char)
- (list #'evil-repeat-visual-char
- nfwdlines
- (- end
- (if (zerop nfwdlines)
- beg
- (save-excursion
- (goto-char end)
- (line-beginning-position))))))
- ((eq evil-visual-selection 'line)
- (list #'evil-repeat-visual-line nfwdlines))
- ((eq evil-visual-selection 'block)
- (list #'evil-repeat-visual-block
- nfwdlines
- (abs (- (evil-column beg) (evil-column end))))))))))
-
-(defun evil-repeat-stop ()
- "Stop recording a repeat.
-Update `evil-repeat-ring' with the accumulated changes
-in `evil-repeat-info' and clear variables."
- (unwind-protect
- (when (evil-repeat-recording-p)
- (setq evil-repeat-info
- (evil-normalize-repeat-info evil-repeat-info))
- (when (and evil-repeat-info evil-repeat-ring)
- (ring-insert evil-repeat-ring evil-repeat-info)))
- (evil-repeat-reset nil)))
-
-(defun evil-repeat-abort ()
- "Abort current repeation."
- (evil-repeat-reset 'abort))
-
-(defun evil-repeat-reset (flag)
- "Clear all repeat recording variables.
-Set `evil-recording-repeat' to FLAG."
- (setq evil-recording-repeat flag
- evil-repeat-info nil
- evil-repeat-buffer nil))
-
-(defsubst evil-repeat-record-position (&optional pos)
- "Set `evil-repeat-pos' to POS or point."
- (setq evil-repeat-pos (or pos (point))))
-
-(defun evil-repeat-record-buffer ()
- "Set `evil-repeat-buffer' to the current buffer."
- (unless (minibufferp)
- (setq evil-repeat-buffer (current-buffer))))
-
-(defmacro evil-save-repeat-info (&rest body)
- "Execute BODY, protecting the values of repeat variables."
- (declare (indent defun)
- (debug t))
- `(let (evil-repeat-ring
- evil-recording-repeat
- evil-recording-current-command
- evil-repeat-info
- evil-repeat-changes
- evil-repeat-pos
- evil-repeat-keys
- evil-repeat-buffer
- this-command
- last-command)
- ,@body))
-
-(defun evil-repeat-different-buffer-p (&optional strict)
- "Whether the buffer has changed in a repeat.
-If STRICT is non-nil, returns t if the previous buffer
-is unknown; otherwise returns t only if the previous
-buffer is known and different from the current buffer."
- (and (or (buffer-live-p evil-repeat-buffer) strict)
- (not (minibufferp))
- (not (eq (current-buffer) evil-repeat-buffer))))
-
-(defun evil-repeat-type (command &optional default)
- "Return the :repeat property of COMMAND.
-If COMMAND doesn't have this property, return DEFAULT."
- (when (functionp command) ; ignore keyboard macros
- (let* ((type (evil-get-command-property command :repeat default))
- (repeat-type (assq type evil-repeat-types)))
- (if repeat-type (cdr repeat-type) type))))
-
-(defun evil-repeat-force-abort-p (repeat-type)
- "Returns non-nil iff the current command should abort the recording of repeat information."
- (or (evil-repeat-different-buffer-p) ; ... buffer changed
- (eq repeat-type 'abort) ; ... explicitely forced
- (eq evil-recording-repeat 'abort) ; ... already aborted
- (evil-emacs-state-p) ; ... in Emacs state
- (and (evil-mouse-events-p (this-command-keys)) ; ... mouse events
- (eq repeat-type nil))
- (minibufferp))) ; ... minibuffer activated
-
-(defun evil-repeat-record (info)
- "Add INFO to the end of `evil-repeat-info'."
- (when (evil-repeat-recording-p)
- (setq evil-repeat-info (nconc evil-repeat-info (list info)))))
-
-;; called from `evil-normal-state-exit-hook'
-(defun evil-repeat-start-hook ()
- "Record a new repeat when exiting Normal state.
-Does not record in Emacs state or if the current command
-has :repeat nil."
- (when (and (eq (evil-repeat-type this-command t) t)
- (not (evil-emacs-state-p)))
- (evil-repeat-start)))
-
-;; called from `pre-command-hook'
-(defun evil-repeat-pre-hook ()
- "Prepare the current command for recording the repeation."
- (when evil-local-mode
- (let ((repeat-type (evil-repeat-type this-command t)))
- (cond
- ;; abort the repeat
- ((evil-repeat-force-abort-p repeat-type)
- ;; We mark the current record as being aborted, because there
- ;; may be further pre-hooks following before the post-hook is
- ;; called.
- (evil-repeat-abort))
- ;; ignore those commands completely
- ((or (null repeat-type)
- (evil-mouse-events-p (this-command-keys))))
- ;; record command
- (t
- ;; In normal-state or visual state, each command is a single
- ;; repeation, therefore start a new repeation.
- (when (or (evil-normal-state-p)
- (evil-visual-state-p))
- (evil-repeat-start))
- (setq evil-recording-current-command t)
- (funcall repeat-type 'pre))))))
-(put 'evil-repeat-pre-hook 'permanent-local-hook t)
-
-;; called from `post-command-hook'
-(defun evil-repeat-post-hook ()
- "Finish recording of repeat-information for the current-command."
- (when (and evil-local-mode evil-recording-repeat)
- (let ((repeat-type (evil-repeat-type this-command t)))
- (cond
- ;; abort the repeat
- ((evil-repeat-force-abort-p repeat-type)
- ;; The command has been aborted but is complete, so just reset
- ;; the recording state.
- (evil-repeat-reset nil))
- ;; ignore if command should not be recorded or the current
- ;; command is not being recorded
- ((or (null repeat-type)
- (not evil-recording-current-command)))
- ;; record command
- (t
- (funcall repeat-type 'post)
- ;; In normal state, the repeat sequence is complete, so record it.
- (when (evil-normal-state-p)
- (evil-repeat-stop)))))
- ;; done with recording the current command
- (setq evil-recording-current-command nil)))
-(put 'evil-repeat-post-hook 'permanent-local-hook t)
-
-(defun evil-clear-command-keys ()
- "Clear `this-command-keys' and all information about the current command keys.
-Calling this function prevents further recording of the keys that
-invoked the current command"
- (clear-this-command-keys t)
- (setq evil-repeat-keys ""))
-
-(defun evil-this-command-keys (&optional post-cmd)
- "Version of `this-command-keys' with finer control over prefix args."
- (let ((arg (if post-cmd current-prefix-arg prefix-arg)))
- (vconcat
- (when (and (numberp arg)
- ;; Only add prefix if no repeat info recorded yet
- (null evil-repeat-info))
- (string-to-vector (number-to-string arg)))
- (this-single-command-keys))))
-
-(defun evil-repeat-keystrokes (flag)
- "Repeation recording function for commands that are repeated by keystrokes."
- (cond
- ((eq flag 'pre)
- (when evil-this-register
- (evil-repeat-record
- `(set evil-this-register ,evil-this-register)))
- (setq evil-repeat-keys (evil-this-command-keys)))
- ((eq flag 'post)
- (evil-repeat-record (if (zerop (length (evil-this-command-keys t)))
- evil-repeat-keys
- (evil-this-command-keys t)))
- ;; erase commands keys to prevent double recording
- (evil-clear-command-keys))))
-
-(defun evil-repeat-motion (flag)
- "Repeation for motions. Motions are recorded by keystroke but only in insert state."
- (when (memq evil-state '(insert replace))
- (evil-repeat-keystrokes flag)))
-
-(defun evil-repeat-changes (flag)
- "Repeation recording function for commands that are repeated by buffer changes."
- (cond
- ((eq flag 'pre)
- (add-hook 'after-change-functions #'evil-repeat-change-hook nil t)
- (evil-repeat-start-record-changes))
- ((eq flag 'post)
- (remove-hook 'after-change-functions #'evil-repeat-change-hook t)
- (evil-repeat-finish-record-changes))))
-
-;; called from the `after-change-functions' hook
-(defun evil-repeat-change-hook (beg end length)
- "Record change information for current command."
- (let ((repeat-type (evil-repeat-type this-command t)))
- (when (and (evil-repeat-recording-p)
- (eq repeat-type 'evil-repeat-changes)
- (not (evil-emacs-state-p))
- (not (evil-repeat-different-buffer-p t))
- evil-state)
- (unless (evil-repeat-recording-p)
- (evil-repeat-start))
- (evil-repeat-record-change (- beg evil-repeat-pos)
- (buffer-substring beg end)
- length))))
-(put 'evil-repeat-change-hook 'permanent-local-hook t)
-
-(defun evil-repeat-record-change (relpos ins ndel)
- "Record the current buffer changes during a repeat.
-If CHANGE is specified, it is added to `evil-repeat-changes'."
- (when (evil-repeat-recording-p)
- (setq evil-repeat-changes
- (nconc evil-repeat-changes (list (list relpos ins ndel))))))
-
-(defun evil-repeat-start-record-changes ()
- "Starts the recording of a new set of buffer changes."
- (setq evil-repeat-changes nil)
- (evil-repeat-record-position))
-
-(defun evil-repeat-finish-record-changes ()
- "Finishes the recording of buffer changes and records them as repeat."
- (when (evil-repeat-recording-p)
- (evil-repeat-record `(evil-execute-change
- ,evil-repeat-changes
- ,(- (point) evil-repeat-pos)))
- (setq evil-repeat-changes nil)))
-
-(defun evil-repeat-insert-at-point (flag)
- "Repeation recording function for commands that insert text in region.
-This records text insertion when a command inserts some text in a
-buffer between (point) and (mark)."
- (cond
- ((eq flag 'pre)
- (add-hook 'after-change-functions #'evil-repeat-insert-at-point-hook nil t))
- ((eq flag 'post)
- (remove-hook 'after-change-functions #'evil-repeat-insert-at-point-hook t))))
-
-(defun evil-repeat-insert-at-point-hook (beg end _length)
- (let ((repeat-type (evil-repeat-type this-command t)))
- (when (and (evil-repeat-recording-p)
- (eq repeat-type 'evil-repeat-insert-at-point)
- (not (evil-emacs-state-p))
- (not (evil-repeat-different-buffer-p t))
- evil-state)
- (setq evil-repeat-pos beg)
- (evil-repeat-record (list 'insert (buffer-substring beg end))))))
-(put 'evil-repeat-insert-at-point-hook 'permanent-local-hook t)
-
-(defun evil-normalize-repeat-info (repeat-info)
- "Concatenate consecutive arrays in REPEAT-INFO.
-Returns a single array."
- (let* ((result (cons nil nil))
- (result-last result)
- cur cur-last)
- (dolist (rep repeat-info)
- (cond
- ((null rep))
- ((arrayp rep)
- (setq rep (listify-key-sequence rep))
- (cond
- (cur
- (setcdr cur-last (cons rep nil))
- (setq cur-last (cdr cur-last)))
- (t
- (setq cur (cons rep nil))
- (setq cur-last cur))))
- (t
- (when cur
- (setcdr result-last (cons (apply #'vconcat cur) nil))
- (setq result-last (cdr result-last))
- (setq cur nil))
- (setcdr result-last (cons rep nil))
- (setq result-last (cdr result-last)))))
- (when cur
- (setcdr result-last (cons (apply #'vconcat cur) nil)))
- (cdr result)))
-
-(defun evil-repeat-visual-char (nfwdlines nfwdchars)
- "Restores a character visual selection.
-If the selection is in a single line, the restored visual
-selection covers the same number of characters. If the selection
-covers several lines, the restored selection covers the same
-number of lines and the same number of characters in the last
-line as the original selection."
- (evil-visual-char)
- (when (> nfwdlines 0)
- (forward-line nfwdlines))
- (forward-char nfwdchars))
-
-(defun evil-repeat-visual-line (nfwdlines)
- "Restores a character visual selection.
-If the selection is in a single line, the restored visual
-selection covers the same number of characters. If the selection
-covers several lines, the restored selection covers the same
-number of lines and the same number of characters in the last
-line as the original selection."
- (evil-visual-line)
- (forward-line nfwdlines))
-
-(defun evil-repeat-visual-block (nfwdlines nfwdchars)
- "Restores a character visual selection.
-If the selection is in a single line, the restored visual
-selection covers the same number of characters. If the selection
-covers several lines, the restored selection covers the same
-number of lines and the same number of characters in the last
-line as the original selection."
- (evil-visual-block)
- (let ((col (current-column)))
- (forward-line nfwdlines)
- (move-to-column (+ col nfwdchars) t)))
-
-(defun evil-execute-change (changes rel-point)
- "Executes as list of changes.
-
-CHANGES is a list of triples (REL-BEG INSERT-TEXT NDEL).
-REL-BEG is the relative position (to point) where the change
-takes place. INSERT-TEXT is the text to be inserted at that
-position and NDEL the number of characters to be deleted at that
-position before insertion.
-
-REL-POINT is the relative position to point before the changed
-where point should be placed after all changes."
- (evil-save-repeat-info
- (let ((point (point)))
- (dolist (change changes)
- (goto-char (+ point (nth 0 change)))
- (delete-char (nth 2 change))
- (insert (nth 1 change)))
- (goto-char (+ point rel-point)))))
-
-(defun evil-execute-repeat-info (repeat-info)
- "Executes a repeat-information REPEAT-INFO."
- (evil-save-repeat-info
- (dolist (rep repeat-info)
- (cond
- ((or (arrayp rep) (stringp rep))
- (let ((input-method current-input-method)
- (evil-input-method nil))
- (deactivate-input-method)
- (unwind-protect
- (execute-kbd-macro rep)
- (activate-input-method input-method))))
- ((consp rep)
- (when (and (= 3 (length rep))
- (eq (nth 0 rep) 'set)
- (eq (nth 1 rep) 'evil-this-register)
- (>= (nth 2 rep) ?0)
- (< (nth 2 rep) ?9))
- (setcar (nthcdr 2 rep) (1+ (nth 2 rep))))
- (apply (car rep) (cdr rep)))
- (t
- (error "Unexpected repeat-info: %S" rep))))))
-
-;; TODO: currently we prepend the replacing count before the
-;; key-sequence that calls the command. Can we use direct
-;; modification of prefix-arg instead? Does it work in
-;; conjunction with `execute-kbd-macro'?
-(defun evil-execute-repeat-info-with-count (count repeat-info)
- "Repeat the repeat-information REPEAT-INFO with the count of
-the first command replaced by COUNT. The count is replaced if
-and only if COUNT is non-nil."
- (evil-save-repeat-info
- (cond
- ;; do nothing (zero repeating)
- ((and count (zerop count)))
- ;; replace count
- (count
- (let ((evil-repeat-count count)
- done)
- (while (and repeat-info
- (arrayp (car repeat-info))
- (not done))
- (let* ((count-and-cmd (evil-extract-count (pop repeat-info))))
- (push (vconcat (number-to-string count)
- (nth 2 count-and-cmd)
- (nth 3 count-and-cmd))
- repeat-info)
- (setq done t)))
- (evil-execute-repeat-info repeat-info)))
- ;; repeat with original count
- (t
- (evil-execute-repeat-info repeat-info)))))
-
-(evil-define-command evil-repeat (count &optional save-point)
- "Repeat the last editing command with count replaced by COUNT.
-If SAVE-POINT is non-nil, do not move point."
- :repeat ignore
- :suppress-operator t
- (interactive (list current-prefix-arg
- (not evil-repeat-move-cursor)))
- (cond
- ((null evil-repeat-ring)
- (error "Already executing repeat"))
- (save-point
- (save-excursion
- (evil-repeat count)))
- (t
- (unwind-protect
- (let ((confirm-kill-emacs t)
- (kill-buffer-hook
- (cons #'(lambda ()
- (user-error "Cannot delete buffer in repeat command"))
- kill-buffer-hook))
- (undo-pointer buffer-undo-list))
- (evil-with-single-undo
- (setq evil-last-repeat (list (point) count undo-pointer))
- (evil-execute-repeat-info-with-count
- count (ring-ref evil-repeat-ring 0))))
- (evil-normal-state)))))
-
-;; TODO: the same issue concering disabled undos as for `evil-paste-pop'
-(evil-define-command evil-repeat-pop (count &optional save-point)
- "Replace the just repeated command with a previously executed command.
-Only allowed after `evil-repeat', `evil-repeat-pop' or
-`evil-repeat-pop-next'. Uses the same repeat count that
-was used for the first repeat.
-
-The COUNT argument inserts the COUNT-th previous kill.
-If COUNT is negative, this is a more recent kill."
- :repeat nil
- :suppress-operator t
- (interactive (list (prefix-numeric-value current-prefix-arg)
- (not evil-repeat-move-cursor)))
- (cond
- ((not (and (eq last-command #'evil-repeat)
- evil-last-repeat))
- (user-error "Previous command was not evil-repeat: %s" last-command))
- (save-point
- (save-excursion
- (evil-repeat-pop count)))
- (t
- (unless (eq buffer-undo-list (nth 2 evil-last-repeat))
- (evil-undo-pop))
- (goto-char (car evil-last-repeat))
- ;; rotate the repeat-ring
- (while (> count 0)
- (when evil-repeat-ring
- (ring-insert-at-beginning evil-repeat-ring
- (ring-remove evil-repeat-ring 0)))
- (setq count (1- count)))
- (while (< count 0)
- (when evil-repeat-ring
- (ring-insert evil-repeat-ring
- (ring-remove evil-repeat-ring)))
- (setq count (1+ count)))
- (setq this-command #'evil-repeat)
- (evil-repeat (cadr evil-last-repeat)))))
-
-(evil-define-command evil-repeat-pop-next (count &optional save-point)
- "Same as `evil-repeat-pop', but with negative COUNT."
- :repeat nil
- :suppress-operator t
- (interactive (list (prefix-numeric-value current-prefix-arg)
- (not evil-repeat-move-cursor)))
- (evil-repeat-pop (- count) save-point))
-
-(defadvice read-key-sequence (before evil activate)
- "Record `this-command-keys' before it is reset."
- (when (and (evil-repeat-recording-p)
- evil-recording-current-command)
- (let ((repeat-type (evil-repeat-type this-command t)))
- (if (functionp repeat-type)
- (funcall repeat-type 'post)))))
-
-(provide 'evil-repeat)
-
-;;; evil-repeat.el ends here
diff --git a/elpa/evil-20200718.842/evil-search.el b/elpa/evil-20200718.842/evil-search.el
deleted file mode 100644
index 546b206..0000000
--- a/elpa/evil-20200718.842/evil-search.el
+++ /dev/null
@@ -1,1314 +0,0 @@
-;;; evil-search.el --- Search and substitute -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-core)
-(require 'evil-common)
-(require 'evil-ex)
-
-;;; Code:
-
-(defun evil-select-search-module (option module)
- "Change the search module according to MODULE.
-If MODULE is `isearch', then Emacs' isearch module is used.
-If MODULE is `evil-search', then Evil's own interactive
-search module is used."
- (let ((search-functions
- '(forward
- backward
- word-forward
- word-backward
- unbounded-word-forward
- unbounded-word-backward
- next
- previous)))
- (dolist (fun search-functions)
- (let ((isearch (intern (format "evil-search-%s" fun)))
- (evil-search (intern (format "evil-ex-search-%s" fun))))
- (if (eq module 'isearch)
- (substitute-key-definition
- evil-search isearch evil-motion-state-map)
- (substitute-key-definition
- isearch evil-search evil-motion-state-map)))))
- (set-default option module))
-
-;; this customization is here because it requires
-;; the knowledge of `evil-select-search-mode'
-(defcustom evil-search-module 'isearch
- "The search module to be used."
- :type '(radio (const :tag "Emacs built-in isearch." :value isearch)
- (const :tag "Evil interactive search." :value evil-search))
- :group 'evil
- :set 'evil-select-search-module
- :initialize 'evil-custom-initialize-pending-reset)
-
-(defun evil-push-search-history (string forward)
- "Push STRING into the appropriate search history (determined by FORWARD)."
- (let* ((history-var (if forward
- 'evil-search-forward-history
- 'evil-search-backward-history))
- (history (symbol-value history-var)))
- (unless (equal (car-safe history) string)
- (set history-var (cons string history)))))
-
-(defun evil-search-incrementally (forward regexp-p)
- "Search incrementally for user-entered text."
- (let ((evil-search-prompt (evil-search-prompt forward))
- (isearch-search-fun-function 'evil-isearch-function)
- (point (point))
- search-nonincremental-instead)
- (setq isearch-forward forward)
- (evil-save-echo-area
- (evil-without-input-method-hooks
- ;; set the input method locally rather than globally to ensure that
- ;; isearch clears the input method when it's finished
- (setq current-input-method evil-input-method)
- (if forward
- (isearch-forward regexp-p)
- (isearch-backward regexp-p))
- (evil-push-search-history isearch-string forward)
- (setq current-input-method nil))
- (when (/= (point) point)
- ;; position the point at beginning of the match only if the call to
- ;; `isearch' has really moved the point. `isearch' doesn't move the
- ;; point only if "C-g" is hit twice to exit the search, in which case we
- ;; shouldn't move the point either.
- (when (and forward isearch-other-end)
- (goto-char isearch-other-end))
- (when (and (eq point (point))
- (not (string= isearch-string "")))
- (if forward
- (isearch-repeat-forward)
- (isearch-repeat-backward))
- (isearch-exit)
- (when (and forward isearch-other-end)
- (goto-char isearch-other-end)))
- (evil-flash-search-pattern
- (evil-search-message isearch-string forward))))))
-
-(defun evil-flash-search-pattern (string &optional all)
- "Flash last search matches for duration of `evil-flash-delay'.
-If ALL is non-nil, flash all matches. STRING is a message
-to display in the echo area."
- (let ((lazy-highlight-initial-delay 0)
- (isearch-search-fun-function 'evil-isearch-function)
- (isearch-case-fold-search case-fold-search)
- (disable #'(lambda (&optional _arg) (evil-flash-hook t))))
- (when evil-flash-timer
- (cancel-timer evil-flash-timer))
- (unless (or (null string)
- (string= string ""))
- (evil-echo-area-save)
- (evil-echo "%s" string)
- (isearch-highlight (match-beginning 0) (match-end 0))
- (when all
- (setq isearch-lazy-highlight-wrapped nil
- isearch-lazy-highlight-start (point)
- isearch-lazy-highlight-end (point))
- (isearch-lazy-highlight-new-loop)
- (unless isearch-lazy-highlight-overlays
- (isearch-lazy-highlight-update)))
- (add-hook 'pre-command-hook #'evil-flash-hook nil t)
- (add-hook 'evil-operator-state-exit-hook #'evil-flash-hook nil t)
- (add-hook 'pre-command-hook #'evil-clean-isearch-overlays nil t)
- (setq evil-flash-timer
- (run-at-time evil-flash-delay nil disable)))))
-
-(defun evil-clean-isearch-overlays ()
- "Clean isearch overlays unless `this-command' is search."
- (remove-hook 'pre-command-hook #'evil-clean-isearch-overlays t)
- (unless (memq this-command
- '(evil-search-backward
- evil-search-forward
- evil-search-next
- evil-search-previous
- evil-search-word-backward
- evil-search-word-forward))
- (isearch-clean-overlays)))
-(put 'evil-clean-isearch-overlays 'permanent-local-hook t)
-
-(defun evil-flash-hook (&optional force)
- "Disable hightlighting if `this-command' is not search.
-Disable anyway if FORCE is t."
- (when (or force
- ;; to avoid flicker, don't disable highlighting
- ;; if the next command is also a search command
- (not (memq this-command
- '(evil-search-backward
- evil-search-forward
- evil-search-next
- evil-search-previous
- evil-search-word-backward
- evil-search-word-forward))))
- (evil-echo-area-restore)
- (isearch-dehighlight)
- (setq isearch-lazy-highlight-last-string nil)
- (lazy-highlight-cleanup t)
- (when evil-flash-timer
- (cancel-timer evil-flash-timer)))
- (remove-hook 'pre-command-hook #'evil-flash-hook t)
- (remove-hook 'evil-operator-state-exit-hook #'evil-flash-hook t))
-(put 'evil-flash-hook 'permanent-local-hook t)
-
-(defun evil-search-with-predicate (search-fun pred string bound noerror count)
- "Execute a search with a predicate function.
-SEARCH-FUN is a search function (e.g. `re-search-forward') and
-PREDICATE is a two-argument function satisfying the interface of
-`isearch-filter-predicate', or `nil'. STRING, BOUND, NOERROR and
-COUNT are passed unchanged to SEARCH-FUN. The first match
-satisfying the predicate (or `nil') is returned."
- (catch 'done
- (while t
- (let ((result (funcall search-fun string bound noerror count)))
- (cond
- ((not result) (throw 'done nil))
- ((not pred) (throw 'done result))
- ((funcall pred (match-beginning 0) (match-end 0)) (throw 'done result)))))))
-
-(defun evil-search-function (&optional forward regexp-p wrap predicate)
- "Return a search function.
-If FORWARD is nil, search backward, otherwise forward.
-If REGEXP-P is non-nil, the input is a regular expression.
-If WRAP is non-nil, the search wraps around the top or bottom
-of the buffer.
-If PREDICATE is non-nil, it must be a function accepting two
-arguments: the bounds of a match, returning non-nil if that match is
-acceptable."
- `(lambda (string &optional bound noerror count)
- (let ((start (point))
- (search-fun ',(if regexp-p
- (if forward
- 're-search-forward
- 're-search-backward)
- (if forward
- 'search-forward
- 'search-backward)))
- result)
- (setq result (evil-search-with-predicate
- search-fun ,predicate string
- bound ,(if wrap t 'noerror) count))
- (when (and ,wrap (null result))
- (goto-char ,(if forward '(point-min) '(point-max)))
- (unwind-protect
- (setq result (evil-search-with-predicate
- search-fun ,predicate string bound noerror count))
- (unless result
- (goto-char start))))
- result)))
-
-(defun evil-isearch-function ()
- "Return a search function for use with isearch.
-Based on `isearch-regexp' and `isearch-forward'."
- (evil-search-function isearch-forward evil-regexp-search evil-search-wrap 'isearch-filter-predicate))
-
-(defun evil-search (string forward &optional regexp-p start)
- "Search for STRING and highlight matches.
-If FORWARD is nil, search backward, otherwise forward.
-If REGEXP-P is non-nil, STRING is taken to be a regular expression.
-START is the position to search from; if unspecified, it is
-one more than the current position."
- (when (and (stringp string)
- (not (string= string "")))
- (let* ((orig (point))
- (start (or start
- (if forward
- (min (point-max) (1+ orig))
- orig)))
- (isearch-regexp regexp-p)
- (isearch-forward forward)
- (case-fold-search
- (unless (and search-upper-case
- (not (isearch-no-upper-case-p string nil)))
- case-fold-search))
- (search-func (evil-search-function
- forward regexp-p evil-search-wrap 'isearch-filter-predicate)))
- ;; no text properties, thank you very much
- (set-text-properties 0 (length string) nil string)
- ;; position to search from
- (goto-char start)
- (setq isearch-string string)
- (isearch-update-ring string regexp-p)
- (condition-case nil
- (funcall search-func string)
- (search-failed
- (goto-char orig)
- (user-error "\"%s\": %s not found"
- string (if regexp-p "pattern" "string"))))
- ;; always position point at the beginning of the match
- (goto-char (match-beginning 0))
- ;; determine message for echo area
- (cond
- ((and forward (< (point) start))
- (setq string "Search wrapped around BOTTOM of buffer"))
- ((and (not forward) (> (point) start))
- (setq string "Search wrapped around TOP of buffer"))
- (t
- (setq string (evil-search-message string forward))))
- (evil-flash-search-pattern string t))))
-
-(defun evil-search-word (forward unbounded symbol)
- "Search for word near point.
-If FORWARD is nil, search backward, otherwise forward. If SYMBOL
-is non-nil then the functions searches for the symbol at point,
-otherwise for the word at point."
- (let ((string (car-safe regexp-search-ring)))
- (setq isearch-forward forward)
- (cond
- ((and (memq last-command
- '(evil-search-word-forward
- evil-search-word-backward))
- (stringp string)
- (not (string= string "")))
- (evil-search string forward t))
- (t
- (setq string (evil-find-thing forward (if symbol 'symbol 'evil-word)))
- (cond
- ((null string)
- (user-error "No word under point"))
- (unbounded
- (setq string (regexp-quote string)))
- (t
- (setq string
- (format (if symbol "\\_<%s\\_>" "\\<%s\\>")
- (regexp-quote string)))))
- (evil-push-search-history string forward)
- (evil-search string forward t)))))
-
-(defun evil--find-thing (forward thing)
- "Return a cons of THING near point as a string and its position.
-THING should be a symbol understood by `thing-at-point',
-e.g. 'symbol or 'word. If FORWARD is nil, search backward,
-otherwise forward. Returns nil if nothing is found."
- (let ((move (if forward #'forward-char #'backward-char))
- (end (if forward #'eobp #'bobp))
- string)
- (save-excursion
- (setq string (thing-at-point thing))
- ;; if there's nothing under point, go forwards
- ;; (or backwards) to find it
- (while (and (null string) (not (funcall end)))
- (funcall move)
- (setq string (thing-at-point thing)))
- (when (stringp string)
- (set-text-properties 0 (length string) nil string))
- (when (> (length string) 0)
- (cons string (point))))))
-
-(defun evil-find-thing (forward thing)
- "Return a THING near point as a string.
-THING should be a symbol understood by `thing-at-point',
-e.g. 'symbol or 'word. If FORWARD is nil, search backward,
-otherwise forward. Returns nil if nothing is found."
- (car (evil--find-thing forward thing)))
-
-(defun evil-find-word (forward)
- "Return word near point as a string.
-If FORWARD is nil, search backward, otherwise forward. Returns
-nil if nothing is found."
- (evil-find-thing forward 'word))
-
-(defun evil-find-symbol (forward)
- "Return word near point as a string.
-If FORWARD is nil, search backward, otherwise forward. Returns
-nil if nothing is found."
- (evil-find-thing forward 'symbol))
-
-(defun evil-search-prompt (forward)
- "Return the search prompt for the given direction."
- (if forward "/" "?"))
-
-(defun evil-search-message (string forward)
- "Prefix STRING with the search prompt."
- (format "%s%s" (evil-search-prompt forward) string))
-
-(defadvice isearch-message-prefix (around evil activate)
- "Use `evil-search-prompt'."
- (if evil-search-prompt
- (setq ad-return-value evil-search-prompt)
- ad-do-it))
-
-(defadvice isearch-delete-char (around evil activate)
- "Exit search if no search string."
- (cond
- ((and evil-search-prompt (string= isearch-string ""))
- (let (search-nonincremental-instead)
- (setq isearch-success nil)
- (isearch-exit)))
- (t
- ad-do-it)))
-
-(defadvice isearch-lazy-highlight-search (around evil activate)
- "Never wrap the search in this context."
- (let (evil-search-wrap)
- ad-do-it))
-
-;;; Ex search
-
-(defun evil-ex-regex-without-case (re)
- "Return the regular expression without all occurrences of \\c and \\C."
- (evil-transform-regexp re '((?c . "") (?C . ""))))
-
-(defun evil-ex-regex-case (re default-case)
- "Return the case as implied by \\c or \\C in regular expression RE.
-If \\c appears anywhere in the pattern, the pattern is case
-insensitive. If \\C appears, the pattern is case sensitive.
-Only the first occurrence of \\c or \\C is used, all others are
-ignored. If neither \\c nor \\C appears in the pattern, the case
-specified by DEFAULT-CASE is used. DEFAULT-CASE should be either
-`sensitive', `insensitive' or `smart'. In the latter case, the pattern
-will be case-sensitive if and only if it contains an upper-case
-letter, otherwise it will be case-insensitive."
- (cond
- ((string-match "\\(?:^\\|[^\\\\]\\)\\(?:\\\\\\\\\\)*\\\\\\([cC]\\)" re)
- (if (eq (aref (match-string 1 re) 0) ?c) 'insensitive 'sensitive))
- ((eq default-case 'smart)
- (if (isearch-no-upper-case-p re t)
- 'insensitive
- 'sensitive))
- (t default-case)))
-
-;; a pattern
-(defun evil-ex-make-substitute-pattern (regexp flags)
- "Creates a PATTERN for substitution with FLAGS.
-This function respects the values of `evil-ex-substitute-case'
-and `evil-ex-substitute-global'."
- (evil-ex-make-pattern regexp
- (cond
- ((memq ?i flags) 'insensitive)
- ((memq ?I flags) 'sensitive)
- ((not evil-ex-substitute-case)
- evil-ex-search-case)
- (t evil-ex-substitute-case))
- (or (and evil-ex-substitute-global
- (not (memq ?g flags)))
- (and (not evil-ex-substitute-global)
- (memq ?g flags)))))
-
-(defun evil-ex-make-search-pattern (regexp)
- "Creates a PATTERN for search.
-This function respects the values of `evil-ex-search-case'."
- (evil-ex-make-pattern regexp evil-ex-search-case t))
-
-(defun evil-ex-make-pattern (regexp case whole-line)
- "Create a new search pattern.
-REGEXP is the regular expression to be searched for. CASE should
-be either 'sensitive, 'insensitive for case-sensitive and
-case-insensitive search, respectively, or anything else. In the
-latter case the pattern is smart-case, i.e. it is automatically
-sensitive of the pattern contains one upper case letter,
-otherwise it is insensitive. The input REGEXP is considered a
-Vim-style regular expression if `evil-ex-search-vim-style-regexp'
-is non-nil, in which case it is transformed to an Emacs style
-regular expression (i.e. certain backslash-codes are
-transformed. Otherwise REGEXP must be an Emacs style regular
-expression and is not transformed."
- (let ((re (evil-ex-regex-without-case regexp))
- (ignore-case (eq (evil-ex-regex-case regexp case) 'insensitive)))
- ;; possibly transform regular expression from vim-style to
- ;; Emacs-style.
- (if evil-ex-search-vim-style-regexp
- (setq re (evil-transform-vim-style-regexp re))
- ;; Even for Emacs regular expressions we translate certain
- ;; whitespace sequences
- (setq re (evil-transform-regexp re
- '((?t . "\t")
- (?n . "\n")
- (?r . "\r")))))
- (list re ignore-case whole-line)))
-
-(defun evil-ex-pattern-regex (pattern)
- "Return the regular expression of a search PATTERN."
- (nth 0 pattern))
-
-(defun evil-ex-pattern-ignore-case (pattern)
- "Return t if and only if PATTERN should ignore case."
- (nth 1 pattern))
-
-(defun evil-ex-pattern-whole-line (pattern)
- "Return t if and only if PATTERN should match all occurences of a line.
-Otherwise PATTERN matches only the first occurence."
- (nth 2 pattern))
-
-;; Highlight
-(defun evil-ex-make-hl (name &rest args)
- "Create a new highlight object with name NAME and properties ARGS.
-The following properties are supported:
-:face The face to be used for the highlighting overlays.
-:win The window in which the highlighting should be shown.
- Note that the highlight will be visible in all windows showing
- the corresponding buffer, but only the matches visible in the
- specified window will actually be highlighted. If :win is nil,
- the matches in all windows will be highlighted.
-:min The minimal buffer position for highlighted matches.
-:max The maximal buffer position for highlighted matches.
-:match-hook A hook to be called once for each highlight.
- The hook must take two arguments, the highlight and
- the overlay for that highlight.
-:update-hook A hook called once after updating the highlighting
- with two arguments, the highlight and a message string
- describing the current match status."
- (unless (symbolp name)
- (user-error "Expected symbol as name of highlight"))
- (let ((face 'evil-ex-lazy-highlight)
- (win (selected-window))
- min max match-hook update-hook)
- (while args
- (let ((key (pop args))
- (val (pop args)))
- (cond
- ((eq key :face) (setq face val))
- ((eq key :win) (setq win val))
- ((eq key :min) (setq min val))
- ((eq key :max) (setq max val))
- ((eq key :match-hook) (setq match-hook val))
- ((eq key :update-hook) (setq update-hook val))
- (t (user-error "Unexpected keyword: %s" key)))))
- (when (assoc name evil-ex-active-highlights-alist)
- (evil-ex-delete-hl name))
- (when (null evil-ex-active-highlights-alist)
- (add-hook 'window-scroll-functions
- #'evil-ex-hl-update-highlights-scroll nil t)
- (add-hook 'window-size-change-functions
- #'evil-ex-hl-update-highlights-resize nil))
- (push (cons name (vector name
- nil
- face
- win
- min
- max
- match-hook
- update-hook
- nil))
- evil-ex-active-highlights-alist)))
-
-(defun evil-ex-hl-name (hl)
- "Return the name of the highlight HL."
- (aref hl 0))
-
-(defun evil-ex-hl-pattern (hl)
- "Return the pattern of the highlight HL."
- (aref hl 1))
-
-(defun evil-ex-hl-set-pattern (hl pattern)
- "Set the pattern of the highlight HL to PATTERN."
- (aset hl 1 pattern))
-
-(defun evil-ex-hl-face (hl)
- "Return the face of the highlight HL."
- (aref hl 2))
-
-(defun evil-ex-hl-window (hl)
- "Return the window of the highlight HL."
- (aref hl 3))
-
-(defun evil-ex-hl-min (hl)
- "Return the minimal buffer position of the highlight HL."
- (aref hl 4))
-
-(defun evil-ex-hl-set-min (hl min)
- "Set the minimal buffer position of the highlight HL to MIN."
- (aset hl 4 min))
-
-(defun evil-ex-hl-max (hl)
- "Return the maximal buffer position of the highlight HL."
- (aref hl 5))
-
-(defun evil-ex-hl-set-max (hl max)
- "Set the minimal buffer position of the highlight HL to MAX."
- (aset hl 5 max))
-
-(defun evil-ex-hl-match-hook (hl)
- "Return the match-hook of the highlight HL."
- (aref hl 6))
-
-(defun evil-ex-hl-update-hook (hl)
- "Return the update-hook of the highlight HL."
- (aref hl 7))
-
-(defun evil-ex-hl-overlays (hl)
- "Return the list of active overlays of the highlight HL."
- (aref hl 8))
-
-(defun evil-ex-hl-set-overlays (hl overlays)
- "Set the list of active overlays of the highlight HL to OVERLAYS."
- (aset hl 8 overlays))
-
-(defun evil-ex-delete-hl (name)
- "Remove the highlighting object with a certain NAME."
- (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist))))
- (when hl
- (mapc #'delete-overlay (evil-ex-hl-overlays hl))
- (setq evil-ex-active-highlights-alist
- (assq-delete-all name evil-ex-active-highlights-alist))
- (evil-ex-hl-update-highlights))
- (when (null evil-ex-active-highlights-alist)
- (remove-hook 'window-scroll-functions
- #'evil-ex-hl-update-highlights-scroll t)
- (remove-hook 'window-size-change-functions
- #'evil-ex-hl-update-highlights-resize))))
-
-(defun evil-ex-hl-active-p (name)
- "Whether the highlight with a certain NAME is active."
- (and (assoc name evil-ex-active-highlights-alist) t))
-
-(defun evil-ex-hl-change (name pattern)
- "Set the regular expression of highlight NAME to PATTERN."
- (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist))))
- (when hl
- (evil-ex-hl-set-pattern hl
- (if (zerop (length pattern))
- nil
- pattern))
- (evil-ex-hl-idle-update))))
-
-(defun evil-ex-hl-set-region (name beg end &optional _type)
- "Set minimal and maximal position of highlight NAME to BEG and END."
- (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist))))
- (when hl
- (evil-ex-hl-set-min hl beg)
- (evil-ex-hl-set-max hl end)
- (evil-ex-hl-idle-update))))
-
-(defun evil-ex-hl-get-max (name)
- "Return the maximal position of the highlight with name NAME."
- (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist))))
- (and hl (evil-ex-hl-max hl))))
-
-(defun evil-ex-hl-update-highlights ()
- "Update the overlays of all active highlights."
- (dolist (hl (mapcar #'cdr evil-ex-active-highlights-alist))
- (let* ((old-ovs (evil-ex-hl-overlays hl))
- new-ovs
- (pattern (evil-ex-hl-pattern hl))
- (case-fold-search (evil-ex-pattern-ignore-case pattern))
- (case-replace case-fold-search)
- (face (evil-ex-hl-face hl))
- (match-hook (evil-ex-hl-match-hook hl))
- result)
- (if pattern
- ;; collect all visible ranges
- (let (ranges sranges)
- (dolist (win (if (eq evil-ex-interactive-search-highlight
- 'all-windows)
- (get-buffer-window-list (current-buffer) nil t)
- (list (evil-ex-hl-window hl))))
- (when (window-live-p win)
- (let ((beg (max (window-start win)
- (or (evil-ex-hl-min hl) (point-min))))
- (end (min (window-end win)
- (or (evil-ex-hl-max hl) (point-max)))))
- (when (< beg end)
- (push (cons beg end) ranges)))))
- (setq ranges
- (sort ranges #'(lambda (r1 r2) (< (car r1) (car r2)))))
- (while ranges
- (let ((r1 (pop ranges))
- (r2 (pop ranges)))
- (cond
- ;; last range
- ((null r2)
- (push r1 sranges))
- ;; ranges overlap, union
- ((>= (cdr r1) (car r2))
- (push (cons (car r1)
- (max (cdr r1) (cdr r2)))
- ranges))
- ;; ranges distinct
- (t
- (push r1 sranges)
- (push r2 ranges)))))
-
- ;; run through all ranges
- (condition-case lossage
- (save-match-data
- (dolist (r sranges)
- (let ((beg (car r))
- (end (cdr r)))
- (save-excursion
- (goto-char beg)
- ;; set the overlays for the current highlight,
- ;; reusing old overlays (if possible)
- (while (and (not (eobp))
- (evil-ex-search-find-next-pattern pattern)
- (<= (match-end 0) end)
- (not (and (= (match-end 0) end)
- (string= (evil-ex-pattern-regex pattern)
- "^"))))
- (let ((ov (or (pop old-ovs) (make-overlay 0 0))))
- (move-overlay ov (match-beginning 0) (match-end 0))
- (overlay-put ov 'face face)
- (overlay-put ov 'evil-ex-hl (evil-ex-hl-name hl))
- (overlay-put ov 'priority 1000)
- (push ov new-ovs)
- (when match-hook (funcall match-hook hl ov)))
- (cond
- ((and (not (evil-ex-pattern-whole-line pattern))
- (not (string-match-p "\n" (buffer-substring-no-properties
- (match-beginning 0)
- (match-end 0)))))
- (forward-line))
- ((= (match-beginning 0) (match-end 0))
- (forward-char))
- (t (goto-char (match-end 0))))))))
- (mapc #'delete-overlay old-ovs)
- (evil-ex-hl-set-overlays hl new-ovs)
- (if (or (null pattern) new-ovs)
- (setq result t)
- ;; Maybe the match could just not be found somewhere else?
- (save-excursion
- (goto-char (or (evil-ex-hl-min hl) (point-min)))
- (if (and (evil-ex-search-find-next-pattern pattern)
- (< (match-end 0) (or (evil-ex-hl-max hl)
- (point-max))))
- (setq result (format "Match in line %d"
- (line-number-at-pos
- (match-beginning 0))))
- (setq result "No match")))))
-
- (invalid-regexp
- (setq result (cadr lossage)))
-
- (search-failed
- (setq result (nth 2 lossage)))
-
- (error
- (setq result (format "%s" (cadr lossage))))
-
- (user-error
- (setq result (format "%s" (cadr lossage))))))
- ;; no pattern, remove all highlights
- (mapc #'delete-overlay old-ovs)
- (evil-ex-hl-set-overlays hl new-ovs))
- (when (evil-ex-hl-update-hook hl)
- (funcall (evil-ex-hl-update-hook hl) hl result)))))
-
-(defun evil-ex-search-find-next-pattern (pattern &optional direction)
- "Look for the next occurrence of PATTERN in a certain DIRECTION.
-Note that this function ignores the whole-line property of PATTERN."
- (setq direction (or direction 'forward))
- (let ((case-fold-search (evil-ex-pattern-ignore-case pattern)))
- (cond
- ((eq direction 'forward)
- (re-search-forward (evil-ex-pattern-regex pattern) nil t))
- ((eq direction 'backward)
- (let* ((pnt (point))
- (ret (re-search-backward (evil-ex-pattern-regex pattern) nil t))
- (m (and ret (match-data))))
- (if ret
- (forward-char)
- (goto-char (point-min)))
- (let ((fwdret
- (re-search-forward (evil-ex-pattern-regex pattern) nil t)))
- (cond
- ((and fwdret (< (match-beginning 0) pnt))
- (setq ret fwdret)
- (goto-char (match-beginning 0)))
- (ret
- (set-match-data m)
- (goto-char (match-beginning 0)))
- (t
- (goto-char pnt)
- ret)))))
- (t
- (user-error "Unknown search direction: %s" direction)))))
-
-(defun evil-ex-hl-idle-update ()
- "Triggers the timer to update the highlights in the current buffer."
- (when (and evil-ex-interactive-search-highlight
- evil-ex-active-highlights-alist)
- (when evil-ex-hl-update-timer
- (cancel-timer evil-ex-hl-update-timer))
- (setq evil-ex-hl-update-timer
- (run-at-time evil-ex-hl-update-delay nil
- #'evil-ex-hl-do-update-highlight
- (current-buffer)))))
-
-(defun evil-ex-hl-do-update-highlight (&optional buffer)
- "Timer function for updating the highlights."
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (evil-ex-hl-update-highlights)))
- (setq evil-ex-hl-update-timer nil))
-
-(defun evil-ex-hl-update-highlights-scroll (win _beg)
- "Update highlights after scrolling in some window."
- (with-current-buffer (window-buffer win)
- (evil-ex-hl-idle-update)))
-(put 'evil-ex-hl-update-highlights-scroll 'permanent-local-hook t)
-
-(defun evil-ex-hl-update-highlights-resize (frame)
- "Update highlights after resizing a window."
- (let ((buffers (delete-dups (mapcar #'window-buffer (window-list frame)))))
- (dolist (buf buffers)
- (with-current-buffer buf
- (evil-ex-hl-idle-update)))))
-(put 'evil-ex-hl-update-highlights-resize 'permanent-local-hook t)
-
-;; interactive search
-(defun evil-ex-search-activate-highlight (pattern)
- "Activate highlighting of the search pattern set to PATTERN.
-This function does nothing if `evil-ex-search-interactive' or
-`evil-ex-search-highlight-all' is nil. "
- (when (and evil-ex-search-interactive evil-ex-search-highlight-all)
- (with-current-buffer (or evil-ex-current-buffer (current-buffer))
- (unless (evil-ex-hl-active-p 'evil-ex-search)
- (evil-ex-make-hl 'evil-ex-search
- :win (or (minibuffer-selected-window) (selected-window))))
- (if pattern
- (evil-ex-hl-change 'evil-ex-search pattern)))))
-
-(defun evil-ex-search (&optional count)
- "Search forward or backward COUNT times for the current ex search pattern.
-The search pattern is determined by `evil-ex-search-pattern' and
-the direcion is determined by `evil-ex-search-direction'."
- (setq evil-ex-search-start-point (point)
- evil-ex-last-was-search t
- count (or count 1))
- (let ((orig (point))
- wrapped)
- (dotimes (_ (or count 1))
- (when (eq evil-ex-search-direction 'forward)
- (unless (eobp) (forward-char))
- ;; maybe skip end-of-line
- (when (and (not evil-move-beyond-eol) (eolp) (not (eobp)))
- (forward-char)))
- (let ((res (evil-ex-find-next nil nil (not evil-search-wrap))))
- (cond
- ((not res)
- (goto-char orig)
- (signal 'search-failed
- (list (evil-ex-pattern-regex evil-ex-search-pattern))))
- ((eq res 'wrapped) (setq wrapped t)))))
- (if wrapped
- (let (message-log-max)
- (message "Search wrapped")))
- (goto-char (match-beginning 0))
- (setq evil-ex-search-match-beg (match-beginning 0)
- evil-ex-search-match-end (match-end 0))
- (evil-ex-search-goto-offset evil-ex-search-offset)
- (evil-ex-search-activate-highlight evil-ex-search-pattern)))
-
-(defun evil-ex-find-next (&optional pattern direction nowrap)
- "Search for the next occurrence of the PATTERN in DIRECTION.
-PATTERN must be created using `evil-ex-make-pattern', DIRECTION
-is either 'forward or 'backward. If NOWRAP is non nil, the search
-does not wrap at buffer boundaries. Furthermore this function
-only searches invisible text if `search-invisible' is t. If
-PATTERN is not specified the current global pattern
-`evil-ex-search-pattern' and if DIRECTION is not specified the
-current global direction `evil-ex-search-direction' is used.
-This function returns t if the search was successful, nil if it
-was unsuccessful and 'wrapped if the search was successful but
-has been wrapped at the buffer boundaries."
- (setq pattern (or pattern evil-ex-search-pattern)
- direction (or direction evil-ex-search-direction))
- (unless (and pattern (evil-ex-pattern-regex pattern))
- (signal 'search-failed (list "No search pattern")))
- (catch 'done
- (let (wrapped)
- (while t
- (let ((search-result (evil-ex-search-find-next-pattern pattern
- direction)))
- (cond
- ((and search-result
- (or (eq search-invisible t)
- (not (isearch-range-invisible
- (match-beginning 0) (match-end 0)))))
- ;; successful search and not invisible
- (throw 'done (if wrapped 'wrapped t)))
- ((not search-result)
- ;; unsuccessful search
- (if nowrap
- (throw 'done nil)
- (setq nowrap t
- wrapped t)
- (goto-char (if (eq direction 'forward)
- (point-min)
- (point-max)))))))))))
-
-(defun evil-ex-search-update (pattern offset beg end message)
- "Update the highlighting and info-message for the search pattern.
-PATTERN is the search pattern and OFFSET the associated offset.
-BEG and END specifiy the current match, MESSAGE is the info
-message to be shown. This function does nothing if
-`evil-ex-search-interactive' is nil."
- (when evil-ex-search-interactive
- (cond
- ((and beg end)
- ;; update overlay
- (if evil-ex-search-overlay
- (move-overlay evil-ex-search-overlay beg end)
- (setq evil-ex-search-overlay
- (make-overlay beg end))
- (overlay-put evil-ex-search-overlay 'priority 1001)
- (overlay-put evil-ex-search-overlay 'face 'evil-ex-search))
- ;; move point
- (goto-char beg)
- (evil-ex-search-goto-offset offset)
- ;; update highlights
- (when evil-ex-search-highlight-all
- (evil-ex-hl-change 'evil-ex-search pattern)))
- (t
- ;; no match
- (when evil-ex-search-overlay
- ;; remove overlay
- (delete-overlay evil-ex-search-overlay)
- (setq evil-ex-search-overlay nil))
- ;; no highlights
- (when evil-ex-search-highlight-all
- (evil-ex-hl-change 'evil-ex-search nil))
- ;; and go to initial position
- (goto-char evil-ex-search-start-point)))
- (when (stringp message)
- (evil-ex-echo "%s" message))))
-
-(defun evil-ex-search-start-session ()
- "Initialize Ex for interactive search."
- (remove-hook 'minibuffer-setup-hook #'evil-ex-search-start-session)
- (add-hook 'after-change-functions #'evil-ex-search-update-pattern nil t)
- (add-hook 'minibuffer-exit-hook #'evil-ex-search-stop-session)
- (evil-ex-search-activate-highlight nil))
-(put 'evil-ex-search-start-session 'permanent-local-hook t)
-
-(defun evil-ex-search-stop-session ()
- "Stop interactive search."
- (with-current-buffer evil-ex-current-buffer
- ;; TODO: This is a bad fix to remove duplicates. The duplicates
- ;; exist because `isearch-range-invisible' may add a single
- ;; overlay multiple times if we are in an unlucky situation
- ;; of overlapping overlays. This happens in our case because
- ;; of the overlays that are used for (lazy) highlighting.
- ;; Perhaps it would be better to disable those overlays
- ;; temporarily before calling `isearch-range-invisible'.
- (setq isearch-opened-overlays (delete-dups isearch-opened-overlays))
- (isearch-clean-overlays))
- (remove-hook 'minibuffer-exit-hook #'evil-ex-search-stop-session)
- (remove-hook 'after-change-functions #'evil-ex-search-update-pattern t)
- (when evil-ex-search-overlay
- (delete-overlay evil-ex-search-overlay)
- (setq evil-ex-search-overlay nil)))
-(put 'evil-ex-search-stop-session 'permanent-local-hook t)
-
-(defun evil-ex-split-search-pattern (pattern direction)
- "Split PATTERN in regexp, offset and next-pattern parts.
-Returns a triple (regexp offset next-search)."
- (save-match-data
- (if (or (and (eq direction 'forward)
- (string-match "\\(?:^\\|[^\\\\]\\)\\(?:\\\\\\\\\\)*\\(/\\([^;]*\\)\\(?:;\\([/?].*\\)?\\)?\\)?$"
- pattern))
- (and (eq direction 'backward)
- (string-match "\\(?:^\\|[^\\\\]\\)\\(?:\\\\\\\\\\)*\\(\\?\\([^;]*\\)\\(?:;\\([/?].*\\)?\\)?\\)?$"
- pattern)))
- (list (substring pattern 0 (match-beginning 1))
- (match-string 2 pattern)
- (match-string 3 pattern))
- (list pattern nil nil))))
-
-(defun evil-ex-search-full-pattern (pattern-string count direction)
- "Search for a full search pattern PATTERN-STRING in DIRECTION.
-This function split PATTERN-STRING in
-pattern/offset/;next-pattern parts and performs the search in
-DIRECTION which must be either 'forward or 'backward. The first
-search is repeated COUNT times. If the pattern part of
-PATTERN-STRING is empty, the last global pattern stored in
-`evil-ex-search-pattern' is used instead if in addition the
-offset part is nil (i.e. no pattern/offset separator), the last
-global offset stored in `evil-ex-search-offset' is used as
-offset. The current match data will correspond to the last
-successful match. This function returns a triple (RESULT PATTERN
-OFFSET) where RESULT is
-
- t the search has been successful without wrap
- 'wrap the search has been successful with wrap
- 'empty-pattern the last pattern has been empty
- nil the search has not been successful
-
-and PATTERN and OFFSET are the last pattern and offset this
-function searched for. Note that this function does not handle
-any error conditions."
- (setq count (or count 1))
- (catch 'done
- (while t
- (let* ((res (evil-ex-split-search-pattern pattern-string direction))
- (pat (pop res))
- (offset (pop res))
- (next-pat (pop res)))
- ;; use last pattern of no new pattern has been specified
- (if (not (zerop (length pat)))
- (setq pat (evil-ex-make-search-pattern pat))
- (setq pat evil-ex-search-pattern
- offset (or offset evil-ex-search-offset)))
- (when (zerop (length pat))
- (throw 'done (list 'empty-pattern pat offset)))
- (let (search-result)
- (while (> count 0)
- (let ((result (evil-ex-find-next pat direction
- (not evil-search-wrap))))
- (if (not result) (setq search-result nil count 0)
- (setq search-result
- (if (or (eq result 'wrap)
- (eq search-result 'wrap))
- 'wrap t)
- count (1- count)))))
- (cond
- ;; search failed
- ((not search-result) (throw 'done (list nil pat offset)))
- ;; no next pattern, search complete
- ((zerop (length next-pat))
- (evil-ex-search-goto-offset offset)
- (throw 'done (list search-result pat offset)))
- ;; next pattern but empty
- ((= 1 (length next-pat))
- (evil-ex-search-goto-offset offset)
- (throw 'done (list 'empty-pattern pat offset)))
- ;; next non-empty pattern, next search iteration
- (t
- (evil-ex-search-goto-offset offset)
- (setq count 1
- pattern-string (substring next-pat 1)
- direction (if (= (aref next-pat 0) ?/)
- 'forward
- 'backward)))))))))
-
-(defun evil-ex-search-update-pattern (_beg _end _range)
- "Update the current search pattern."
- (save-match-data
- (let ((pattern-string (minibuffer-contents)))
- (with-current-buffer evil-ex-current-buffer
- (with-selected-window (minibuffer-selected-window)
- (goto-char (1+ evil-ex-search-start-point))
- (condition-case err
- (let* ((result (evil-ex-search-full-pattern pattern-string
- (or evil-ex-search-count 1)
- evil-ex-search-direction))
- (success (pop result))
- (pattern (pop result))
- (offset (pop result)))
- (cond
- ((eq success 'wrap)
- (evil-ex-search-update pattern offset
- (match-beginning 0) (match-end 0)
- "Wrapped"))
- ((eq success 'empty-pattern)
- (evil-ex-search-update nil nil nil nil nil))
- (success
- (evil-ex-search-update pattern offset
- (match-beginning 0) (match-end 0)
- nil))
- (t
- (evil-ex-search-update nil nil
- nil nil
- "search failed"))))
- (invalid-regexp
- (evil-ex-search-update nil nil nil nil (cadr err)))
- (error
- (evil-ex-search-update nil nil nil nil (format "%s" err)))))))))
-(put 'evil-ex-search-update-pattern 'permanent-local-hook t)
-
-(defun evil-ex-search-exit ()
- "Exit interactive search, keeping lazy highlighting active."
- (interactive)
- (evil-ex-search-stop-session)
- (exit-minibuffer))
-
-(defun evil-ex-search-abort ()
- "Abort interactive search, disabling lazy highlighting."
- (interactive)
- (evil-ex-search-stop-session)
- (evil-ex-delete-hl 'evil-ex-search)
- (abort-recursive-edit))
-
-(defun evil-ex-search-goto-offset (offset)
- "Move point according to search OFFSET and set `evil-this-type' accordingly.
-This function assumes that the current match data represents the
-current search result."
- (unless (zerop (length offset))
- (let ((beg (match-beginning 0))
- (end (match-end 0)))
- (save-match-data
- (unless
- (string-match
- "^\\([esb]\\)?\\(\\([-+]\\)?\\([0-9]*\\)\\)$"
- offset)
- (user-error "Invalid search offset: %s" offset))
- (let ((count (if (= (match-beginning 4) (match-end 4))
- (cond
- ((not (match-beginning 3)) 0)
- ((= (aref offset (match-beginning 3)) ?+) +1)
- (t -1))
- (string-to-number (match-string 2 offset)))))
- (cond
- ((not (match-beginning 1))
- (setq evil-this-type 'line)
- (forward-line count))
- ((= (aref offset (match-beginning 1)) ?e)
- (goto-char (+ end count -1))
- (setq evil-this-type 'inclusive))
- ((memq (aref offset (match-beginning 1)) '(?s ?b))
- (goto-char (+ beg count))
- (setq evil-this-type 'inclusive))))))))
-
-(defun evil-ex-search-setup ()
- "Hook to initialize the minibuffer for ex search."
- (add-hook 'pre-command-hook #'evil-ex-remove-default))
-
-(defun evil-ex-start-search (direction count)
- "Start a new search in a certain DIRECTION."
- ;; store buffer and window where the search started
- (let ((evil-ex-current-buffer (current-buffer)))
- (setq evil-ex-search-count count
- evil-ex-search-direction direction
- evil-ex-search-start-point (point)
- evil-ex-last-was-search t)
- (progn
- ;; ensure minibuffer is initialized accordingly
- (add-hook 'minibuffer-setup-hook #'evil-ex-search-start-session)
- ;; read the search string
- (let* ((minibuffer-local-map evil-ex-search-keymap)
- (search-string
- (condition-case err
- (minibuffer-with-setup-hook
- #'evil-ex-search-setup
- (read-string (if (eq evil-ex-search-direction 'forward)
- "/" "?")
- (and evil-ex-search-history
- (propertize
- (car evil-ex-search-history)
- 'face 'shadow))
- 'evil-ex-search-history))
- (quit
- (evil-ex-search-stop-session)
- (evil-ex-delete-hl 'evil-ex-search)
- (goto-char evil-ex-search-start-point)
- (signal (car err) (cdr err))))))
- ;; pattern entered successful
- (goto-char (1+ evil-ex-search-start-point))
- (let* ((result
- (evil-ex-search-full-pattern search-string
- evil-ex-search-count
- evil-ex-search-direction))
- (success (pop result))
- (pattern (pop result))
- (offset (pop result)))
- (setq evil-ex-search-pattern pattern
- evil-ex-search-offset offset)
- (cond
- ((memq success '(t wrap))
- (goto-char (match-beginning 0))
- (setq evil-ex-search-match-beg (match-beginning 0)
- evil-ex-search-match-end (match-end 0))
- (evil-ex-search-goto-offset offset)
- (evil-push-search-history search-string (eq direction 'forward))
- (unless evil-ex-search-persistent-highlight
- (evil-ex-delete-hl 'evil-ex-search)))
- (t
- (goto-char evil-ex-search-start-point)
- (evil-ex-delete-hl 'evil-ex-search)
- (signal 'search-failed (list search-string)))))))))
-
-(defun evil-ex-start-word-search (unbounded direction count &optional symbol)
- "Search for the symbol under point.
-The search matches the COUNT-th occurrence of the word. If the
-UNBOUNDED argument is nil, the search matches only at symbol
-boundaries, otherwise it matches anywhere. The DIRECTION
-argument should be either `forward' or `backward', determining
-the search direction. If SYMBOL is non-nil then the functions
-searches for the symbol at point, otherwise for the word at
-point."
- (let ((string (evil-find-thing (eq direction 'forward)
- (if symbol 'symbol 'word))))
- (if (null string)
- (user-error "No word under point")
- (let ((regex (if unbounded
- (regexp-quote string)
- (format (if symbol "\\_<%s\\_>" "\\<%s\\>")
- (regexp-quote string)))))
- (setq evil-ex-search-count count
- evil-ex-search-direction direction
- evil-ex-search-pattern
- (evil-ex-make-search-pattern regex)
- evil-ex-search-offset nil
- evil-ex-last-was-search t)
- ;; update search history unless this pattern equals the
- ;; previous pattern
- (unless (equal (car-safe evil-ex-search-history) regex)
- (push regex evil-ex-search-history))
- (evil-push-search-history regex (eq direction 'forward)))
- (evil-ex-delete-hl 'evil-ex-search)
- (when (fboundp 'evil-ex-search-next)
- (evil-ex-search-next count)))))
-
-;; substitute
-(evil-ex-define-argument-type substitution
- "A substitution pattern argument /pattern/replacement/flags.
-This handler highlights the pattern of the current substitution."
- :runner
- (lambda (flag &optional arg)
- (with-selected-window (minibuffer-selected-window)
- (with-current-buffer evil-ex-current-buffer
- (cond
- ((eq flag 'start)
- (evil-ex-make-hl
- 'evil-ex-substitute
- :face 'evil-ex-substitute-matches
- :update-hook #'evil-ex-pattern-update-ex-info
- :match-hook (and evil-ex-substitute-interactive-replace
- #'evil-ex-pattern-update-replacement))
- (setq flag 'update))
-
- ((eq flag 'stop)
- (evil-ex-delete-hl 'evil-ex-substitute))))
-
- (when (and (eq flag 'update)
- evil-ex-substitute-highlight-all
- (not (zerop (length arg))))
- (condition-case lossage
- (let* ((result (evil-ex-get-substitute-info arg t))
- (pattern (pop result))
- (replacement (pop result))
- (range (or (evil-copy-range evil-ex-range)
- (evil-range (line-beginning-position)
- (line-end-position)
- 'line
- :expanded t))))
- (setq evil-ex-substitute-current-replacement replacement)
- (evil-expand-range range)
- (evil-ex-hl-set-region 'evil-ex-substitute
- (evil-range-beginning range)
- (evil-range-end range))
- (evil-ex-hl-change 'evil-ex-substitute pattern))
- (end-of-file
- (evil-ex-pattern-update-ex-info nil
- "incomplete replacement"))
- (user-error
- (evil-ex-pattern-update-ex-info nil
- (format "%s" lossage))))))))
-
-(defun evil-ex-pattern-update-ex-info (_hl result)
- "Update the Ex info string."
- (when (stringp result)
- (evil-ex-echo "%s" result)))
-
-(defun evil-ex-pattern-update-replacement (_hl overlay)
- "Update the replacement display."
- (when (fboundp 'match-substitute-replacement)
- (let ((fixedcase (not case-replace))
- repl)
- (setq repl (if evil-ex-substitute-current-replacement
- (evil-match-substitute-replacement
- evil-ex-substitute-current-replacement
- fixedcase)
- ""))
- (put-text-property 0 (length repl)
- 'face 'evil-ex-substitute-replacement
- repl)
- (overlay-put overlay 'after-string repl))))
-
-(defun evil-ex-parse-global (string)
- "Parse STRING as a global argument."
- (let* ((pattern (nth 0 (evil-delimited-arguments string 2)))
- (command (and pattern
- (>= (- (length string) (length pattern)) 2)
- (substring string (+ (length pattern) 2)))))
- ;; use last pattern if none given
- (when (zerop (length pattern))
- (setq pattern
- (cond
- ((and (eq evil-search-module 'evil-search) evil-ex-search-pattern)
- (evil-ex-pattern-regex evil-ex-search-pattern))
- ((and (eq evil-search-module 'isearch) (not (zerop (length isearch-string))))
- isearch-string)
- (t (user-error "No previous pattern")))))
- (list pattern command)))
-
-(defun evil-ex-get-substitute-info (string &optional implicit-r)
- "Returns the substitution info of command line STRING.
-This function returns a three-element list \(PATTERN REPLACEMENT
-FLAGS) consisting of the substitution parts of STRING. PATTERN is
-a ex-pattern (see `evil-ex-make-pattern') and REPLACEMENT in a
-compiled replacement expression (see `evil-compile-replacement').
-The information returned is the actual substitution information
-w.r.t. to special situations like empty patterns or repetition of
-previous substitution commands. If IMPLICIT-R is non-nil, then
-the flag 'r' is assumed, i.e. in the case of an empty pattern the
-last search pattern is used. This will be used when called from
-a :substitute command with arguments."
- (let (pattern replacement flags)
- (cond
- ((or (null string) (string-match "^[a-zA-Z]" string))
- ;; starts with letter so there is no pattern because the
- ;; separator must not be a letter repeat last substitute
- (setq replacement evil-ex-substitute-replacement)
- ;; flags are everything that is not a white space
- (when (and string (string-match "[^[:space:]]+" string))
- (setq flags (match-string 0 string))))
- (t
- (let ((args (evil-delimited-arguments string 3)))
- (setq pattern (pop args)
- replacement (pop args)
- flags (pop args))
- ;; if replacment equals "~" use previous replacement
- (if (equal replacement "~")
- (setq replacement evil-ex-substitute-replacement)
- (setq replacement (evil-compile-replacement replacement)))
- ;; append implicit "r" flag if required
- (when (and implicit-r (not (memq ?r (append flags nil))))
- (setq flags (concat flags "r"))))))
- ;; if flags equals "&" add previous flags
- (if (and (not (zerop (length flags)))
- (= (aref flags 0) ?&))
- (setq flags (append (substring flags 1)
- evil-ex-substitute-flags))
- (setq flags (append flags nil)))
- ;; if no pattern, use previous pattern, either search or
- ;; substitute pattern depending on `evil-ex-last-was-search' and
- ;; the r flag
- (when (zerop (length pattern))
- (setq pattern
- (if (eq evil-search-module 'evil-search)
- (if (and evil-ex-last-was-search (memq ?r flags))
- (and evil-ex-search-pattern
- (evil-ex-pattern-regex evil-ex-search-pattern))
- (and evil-ex-substitute-pattern
- (evil-ex-pattern-regex evil-ex-substitute-pattern)))
- (if (eq case-fold-search t)
- isearch-string
- (concat isearch-string "\\C")))
- flags (remq ?r flags)))
- ;; generate pattern
- (when pattern
- (setq pattern (evil-ex-make-substitute-pattern pattern flags)))
- (list pattern replacement flags)))
-
-(defun evil-ex-nohighlight ()
- "Disable the active search highlightings."
- (interactive)
- (evil-ex-delete-hl 'evil-ex-substitute)
- (evil-ex-delete-hl 'evil-ex-search))
-
-(provide 'evil-search)
-
-;;; evil-search.el ends here
diff --git a/elpa/evil-20200718.842/evil-states.el b/elpa/evil-20200718.842/evil-states.el
deleted file mode 100644
index 68b2726..0000000
--- a/elpa/evil-20200718.842/evil-states.el
+++ /dev/null
@@ -1,924 +0,0 @@
-;;; evil-states.el --- States -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-(require 'evil-core)
-
-;;; Code:
-
-;;; Normal state
-
-(evil-define-state normal
- "Normal state.
-AKA \"Command\" state."
- :tag " <N> "
- :enable (motion)
- :exit-hook (evil-repeat-start-hook)
- (cond
- ((evil-normal-state-p)
- (overwrite-mode -1)
- (add-hook 'post-command-hook #'evil-normal-post-command nil t))
- (t
- (remove-hook 'post-command-hook #'evil-normal-post-command t))))
-
-(defun evil-normal-post-command (&optional command)
- "Reset command loop variables in Normal state.
-Also prevent point from reaching the end of the line.
-If the region is activated, enter Visual state."
- (unless (or (evil-initializing-p)
- (null this-command))
- (setq command (or command this-command))
- (when (evil-normal-state-p)
- (setq evil-this-type nil
- evil-this-operator nil
- evil-this-motion nil
- evil-this-motion-count nil
- evil-inhibit-operator nil
- evil-inhibit-operator-value nil)
- (unless (memq command '(evil-use-register
- digit-argument
- negative-argument
- universal-argument
- universal-argument-minus
- universal-argument-more
- universal-argument-other-key))
- (setq evil-this-register nil))
- (evil-adjust-cursor))))
-(put 'evil-normal-post-command 'permanent-local-hook t)
-
-;;; Insert state
-
-(defun evil-maybe-remove-spaces (&optional do-remove)
- "Remove space from newly opened empty line.
-This function removes (indentation) spaces that have been
-inserted by opening a new empty line. The behavior depends on the
-variable `evil-maybe-remove-spaces'. If this variable is nil the
-function does nothing. Otherwise the behavior depends on
-DO-REMOVE. If DO-REMOVE is non-nil the spaces are
-removed. Otherwise `evil-maybe-remove-spaces' is set to nil
-unless the last command opened yet another new line.
-
-This function should be added as a post-command-hook to track
-commands opening a new line."
- (cond
- ((not evil-maybe-remove-spaces)
- (remove-hook 'post-command-hook #'evil-maybe-remove-spaces))
- (do-remove
- (when (save-excursion
- (beginning-of-line)
- (looking-at "^\\s-*$"))
- (delete-region (line-beginning-position)
- (line-end-position)))
- (setq evil-maybe-remove-spaces nil)
- (remove-hook 'post-command-hook #'evil-maybe-remove-spaces))
- ((not (memq this-command
- '(evil-open-above
- evil-open-below
- evil-append
- evil-append-line
- newline
- newline-and-indent
- indent-and-newline)))
- (setq evil-maybe-remove-spaces nil)
- (remove-hook 'post-command-hook #'evil-maybe-remove-spaces))))
-
-(evil-define-state insert
- "Insert state."
- :tag " <I> "
- :cursor (bar . 2)
- :message "-- INSERT --"
- :entry-hook (evil-start-track-last-insertion)
- :exit-hook (evil-cleanup-insert-state evil-stop-track-last-insertion)
- :input-method t
- (cond
- ((evil-insert-state-p)
- (add-hook 'post-command-hook #'evil-maybe-remove-spaces)
- (add-hook 'pre-command-hook #'evil-insert-repeat-hook)
- (setq evil-maybe-remove-spaces t)
- (unless (eq evil-want-fine-undo t)
- (evil-start-undo-step)))
- (t
- (remove-hook 'post-command-hook #'evil-maybe-remove-spaces)
- (remove-hook 'pre-command-hook #'evil-insert-repeat-hook)
- (evil-maybe-remove-spaces t)
- (setq evil-insert-repeat-info evil-repeat-info)
- (evil-set-marker ?^ nil t)
- (unless (eq evil-want-fine-undo t)
- (evil-end-undo-step))
- (when (or (evil-normal-state-p evil-next-state)
- (evil-motion-state-p evil-next-state))
- (evil-move-cursor-back
- (and (eolp) (not evil-move-beyond-eol)))))))
-
-(defun evil-insert-repeat-hook ()
- "Record insertion keys in `evil-insert-repeat-info'."
- (setq evil-insert-repeat-info (last evil-repeat-info))
- (remove-hook 'pre-command-hook #'evil-insert-repeat-hook))
-(put 'evil-insert-repeat-hook 'permanent-local-hook t)
-
-(defun evil-cleanup-insert-state ()
- "Called when Insert state is about to be exited.
-Handles the repeat-count of the insertion command."
- (when evil-insert-count
- (dotimes (_ (1- evil-insert-count))
- (when evil-insert-lines
- (evil-insert-newline-below)
- (when evil-auto-indent
- (indent-according-to-mode)))
- (when (fboundp 'evil-execute-repeat-info)
- (evil-execute-repeat-info
- (cdr evil-insert-repeat-info)))))
- (when evil-insert-vcount
- (let ((buffer-invisibility-spec buffer-invisibility-spec))
- ;; make all lines hidden by hideshow temporarily visible
- (when (listp buffer-invisibility-spec)
- (setq buffer-invisibility-spec
- (evil-filter-list
- #'(lambda (x)
- (or (eq x 'hs)
- (eq (car-safe x) 'hs)))
- buffer-invisibility-spec)))
- (let ((line (nth 0 evil-insert-vcount))
- (col (nth 1 evil-insert-vcount))
- (vcount (nth 2 evil-insert-vcount)))
- (save-excursion
- (dotimes (v (1- vcount))
- (goto-char (point-min))
- (forward-line (+ line v))
- (when (or (not evil-insert-skip-empty-lines)
- (not (integerp col))
- (save-excursion
- (evil-move-end-of-line)
- (>= (current-column) col)))
- (if (integerp col)
- (move-to-column col t)
- (funcall col))
- (dotimes (_ (or evil-insert-count 1))
- (when (fboundp 'evil-execute-repeat-info)
- (evil-execute-repeat-info
- (cdr evil-insert-repeat-info)))))))))))
-
-;;; Visual state
-
-;; Visual selections are implemented in terms of types, and are
-;; compatible with the Emacs region. This is achieved by "translating"
-;; the region to the selected text right before a command is executed.
-;; If the command is a motion, the translation is postponed until a
-;; non-motion command is invoked (distinguished by the :keep-visual
-;; command property).
-;;
-;; Visual state activates the region, enabling Transient Mark mode if
-;; not already enabled. This is only temporay: if Transient Mark mode
-;; was disabled before entering Visual state, it is disabled when
-;; exiting Visual state. This allows Visual state to harness the
-;; "transient" behavior of many commands without overriding the user's
-;; preferences in other states.
-
-(defmacro evil-define-visual-selection (selection doc &rest body)
- "Define a Visual selection SELECTION.
-Creates a command evil-visual-SELECTION for enabling the selection.
-DOC is the function's documentation string. The following keywords
-may be specified in BODY:
-
-:message STRING Status message when enabling the selection.
-:type TYPE Type to use (defaults to SELECTION).
-
-Following the keywords is optional code which is executed each time
-the selection is enabled.
-
-\(fn SELECTION DOC [[KEY VAL]...] BODY...)"
- (declare (indent defun)
- (doc-string 2)
- (debug (&define name stringp
- [&rest keywordp sexp]
- def-body)))
- (let* ((name (intern (format "evil-visual-%s" selection)))
- (message (intern (format "%s-message" name)))
- (tagvar (intern (format "%s-tag" name)))
- (type selection)
- (tag " <V> ")
- arg key string)
- ;; collect keywords
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body))
- (cond
- ((eq key :message)
- (setq string arg))
- ((eq key :type)
- (setq type arg))
- ((eq key :tag)
- (setq tag arg))))
- ;; macro expansion
- `(progn
- (add-to-list 'evil-visual-alist (cons ',selection ',name))
- (defvar ,name ',type ,(format "*%s" doc))
- (defvar ,message ,string ,doc)
- (defvar ,tagvar ,tag ,doc)
- (evil-define-command ,name (&optional mark point type message)
- ,@(when doc `(,doc))
- :keep-visual t
- :repeat nil
- (interactive
- (list nil nil
- (if (and (evil-visual-state-p)
- (eq evil-visual-selection ',selection))
- 'exit ,name) t))
- (if (eq type 'exit)
- (evil-exit-visual-state)
- (setq type (or type ,name)
- evil-visual-selection ',selection)
- (evil-visual-make-region mark point type message)
- ,@body))
- ',selection)))
-
-(evil-define-visual-selection char
- "Characterwise selection."
- :type inclusive
- :message "-- VISUAL --"
- :tag " <V> ")
-
-(evil-define-visual-selection line
- "Linewise selection."
- :message "-- VISUAL LINE --"
- :tag " <Vl> ")
-
-(evil-define-visual-selection screen-line
- "Linewise selection in `visual-line-mode'."
- :message "-- SCREEN LINE --"
- :tag " <Vs> ")
-
-(evil-define-visual-selection block
- "Blockwise selection."
- :message "-- VISUAL BLOCK --"
- :tag " <Vb> "
- (evil-transient-mark -1)
- ;; refresh the :corner property
- (setq evil-visual-properties
- (plist-put evil-visual-properties :corner
- (evil-visual-block-corner 'upper-left))))
-
-(evil-define-state visual
- "Visual state."
- :tag 'evil-visual-tag
- :enable (motion normal)
- :message 'evil-visual-message
- (cond
- ((evil-visual-state-p)
- (evil-save-transient-mark-mode)
- (setq select-active-regions nil)
- (cond
- ((region-active-p)
- (if (< (evil-visual-direction) 0)
- (evil-visual-select (region-beginning) (region-end)
- evil-visual-char
- (evil-visual-direction))
- (evil-visual-make-selection (mark t) (point)
- evil-visual-char))
- (evil-visual-highlight))
- (t
- (evil-visual-make-region (point) (point) evil-visual-char)))
- (add-hook 'pre-command-hook #'evil-visual-pre-command nil t)
- (add-hook 'post-command-hook #'evil-visual-post-command nil t)
- (add-hook 'deactivate-mark-hook #'evil-visual-deactivate-hook nil t))
- (t
- ;; Postpone deactivation of region if next state is Insert.
- ;; This gives certain insertion commands (auto-pairing characters,
- ;; for example) an opportunity to access the region.
- (if (and (eq evil-next-state 'insert)
- (eq evil-visual-selection 'char))
- (add-hook 'evil-normal-state-entry-hook
- #'evil-visual-deactivate-hook nil t)
- (evil-visual-deactivate-hook))
- (setq evil-visual-region-expanded nil)
- (remove-hook 'pre-command-hook #'evil-visual-pre-command t)
- (remove-hook 'post-command-hook #'evil-visual-post-command t)
- (remove-hook 'deactivate-mark-hook #'evil-visual-deactivate-hook t)
- (evil-visual-highlight -1))))
-
-(defun evil-visual-pre-command (&optional command)
- "Run before each COMMAND in Visual state.
-Expand the region to the selection unless COMMAND is a motion."
- (when (evil-visual-state-p)
- (setq command (or command this-command))
- (when evil-visual-x-select-timer
- (cancel-timer evil-visual-x-select-timer))
- (unless (evil-get-command-property command :keep-visual)
- (evil-visual-update-x-selection)
- (evil-visual-expand-region
- ;; exclude final newline from linewise selection
- ;; unless the command has real need of it
- (and (eq (evil-visual-type) 'line)
- (evil-get-command-property command :exclude-newline))))))
-
-(put 'evil-visual-pre-command 'permanent-local-hook t)
-
-(defun evil-visual-post-command (&optional command)
- "Run after each COMMAND in Visual state.
-If COMMAND is a motion, refresh the selection;
-otherwise exit Visual state."
- (when (evil-visual-state-p)
- (setq command (or command this-command))
- (if (or quit-flag
- (eq command #'keyboard-quit)
- ;; Is `mark-active' nil for an unexpanded region?
- deactivate-mark
- (and (not evil-visual-region-expanded)
- (not (region-active-p))
- (not (eq evil-visual-selection 'block))))
- (progn
- (evil-exit-visual-state)
- (evil-adjust-cursor))
- (if evil-visual-region-expanded
- (evil-visual-contract-region)
- (evil-visual-refresh))
- (setq evil-visual-x-select-timer
- (run-with-idle-timer evil-visual-x-select-timeout nil
- #'evil-visual-update-x-selection
- (current-buffer)))
- (evil-visual-highlight))))
-(put 'evil-visual-post-command 'permanent-local-hook t)
-
-(defun evil-visual-update-x-selection (&optional buffer)
- "Update the X selection with the current visual region."
- (let ((buf (or buffer (current-buffer))))
- (when (buffer-live-p buf)
- (with-current-buffer buf
- (when (and (evil-visual-state-p)
- (display-selections-p)
- (not (eq evil-visual-selection 'block)))
- (evil-set-selection 'PRIMARY (buffer-substring-no-properties
- evil-visual-beginning
- evil-visual-end)))))))
-
-(defun evil-visual-activate-hook (&optional _command)
- "Enable Visual state if the region is activated."
- (unless (evil-visual-state-p)
- (evil-delay nil
- ;; the activation may only be momentary, so re-check
- ;; in `post-command-hook' before entering Visual state
- '(unless (or (evil-visual-state-p)
- (evil-insert-state-p)
- (evil-emacs-state-p))
- (when (and (region-active-p)
- (not deactivate-mark))
- (evil-visual-state)))
- 'post-command-hook nil t
- "evil-activate-visual-state")))
-(put 'evil-visual-activate-hook 'permanent-local-hook t)
-
-(defun evil-visual-deactivate-hook (&optional command)
- "Deactivate the region and restore Transient Mark mode."
- (setq command (or command this-command))
- (remove-hook 'deactivate-mark-hook
- #'evil-visual-deactivate-hook t)
- (remove-hook 'evil-normal-state-entry-hook
- #'evil-visual-deactivate-hook t)
- (cond
- ((and (evil-visual-state-p) command
- (not (evil-get-command-property command :keep-visual)))
- (setq evil-visual-region-expanded nil)
- (evil-exit-visual-state))
- ((not (evil-visual-state-p))
- (evil-active-region -1)
- (evil-restore-transient-mark-mode))))
-(put 'evil-visual-deactivate-hook 'permanent-local-hook t)
-
-(evil-define-command evil-exit-visual-state (&optional later buffer)
- "Exit from Visual state to the previous state.
-If LATER is non-nil, exit after the current command."
- :keep-visual t
- :repeat abort
- (with-current-buffer (or buffer (current-buffer))
- (when (evil-visual-state-p)
- (if later
- (setq deactivate-mark t)
- (when evil-visual-region-expanded
- (evil-visual-contract-region))
- (evil-change-to-previous-state)))))
-
-(defun evil-visual-tag (&optional selection)
- "Return a mode-line tag for SELECTION.
-SELECTION is a kind of selection as defined by
-`evil-define-visual-selection', such as `char', `line'
-or `block'."
- (setq selection (or selection evil-visual-selection))
- (when selection
- (symbol-value (intern (format "evil-visual-%s-tag" selection)))))
-
-(defun evil-visual-message (&optional selection)
- "Create an echo area message for SELECTION.
-SELECTION is a kind of selection as defined by
-`evil-define-visual-selection', such as `char', `line'
-or `block'."
- (let (message)
- (setq selection (or selection evil-visual-selection))
- (when selection
- (setq message
- (symbol-value (intern (format "evil-visual-%s-message"
- selection))))
- (cond
- ((functionp message)
- (funcall message))
- ((stringp message)
- (evil-echo "%s" message))))))
-
-(defun evil-visual-select (beg end &optional type dir message)
- "Create a Visual selection of type TYPE from BEG to END.
-Point and mark are positioned so that the resulting selection
-has the specified boundaries. If DIR is negative, point precedes mark,
-otherwise it succedes it. To specify point and mark directly,
-use `evil-visual-make-selection'."
- (let* ((range (evil-contract beg end type))
- (mark (evil-range-beginning range))
- (point (evil-range-end range))
- (dir (or dir 1)))
- (when (< dir 0)
- (evil-swap mark point))
- (evil-visual-make-selection mark point type message)))
-
-(defun evil-visual-make-selection (mark point &optional type message)
- "Create a Visual selection with point at POINT and mark at MARK.
-The boundaries of the selection are inferred from these
-and the current TYPE. To specify the boundaries and infer
-mark and point, use `evil-visual-select' instead."
- (let* ((selection (evil-visual-selection-for-type type))
- (func (evil-visual-selection-function selection))
- (prev (and (evil-visual-state-p) evil-visual-selection))
- (mark (evil-normalize-position mark))
- (point (evil-normalize-position point))
- (state evil-state))
- (unless (evil-visual-state-p)
- (evil-visual-state))
- (setq evil-visual-selection selection)
- (funcall func mark point type
- ;; signal a message when changing the selection
- (when (or (not (evil-visual-state-p state))
- (not (eq selection prev)))
- message))))
-
-(defun evil-visual-make-region (mark point &optional type message)
- "Create an active region from MARK to POINT.
-If TYPE is given, also set the Visual type.
-If MESSAGE is given, display it in the echo area."
- (interactive)
- (let* ((point (evil-normalize-position
- (or point (point))))
- (mark (evil-normalize-position
- (or mark
- (when (or (evil-visual-state-p)
- (region-active-p))
- (mark t))
- point))))
- (unless (evil-visual-state-p)
- (evil-visual-state))
- (evil-active-region 1)
- (setq evil-visual-region-expanded nil)
- (evil-visual-refresh mark point type)
- (cond
- ((null evil-echo-state))
- ((stringp message)
- (evil-echo "%s" message))
- (message
- (cond
- ((stringp evil-visual-state-message)
- (evil-echo "%s" evil-visual-state-message))
- ((functionp evil-visual-state-message)
- (funcall evil-visual-state-message)))))))
-
-(defun evil-visual-expand-region (&optional exclude-newline)
- "Expand the region to the Visual selection.
-If EXCLUDE-NEWLINE is non-nil and the selection ends with a newline,
-exclude that newline from the region."
- (when (and (evil-visual-state-p)
- (not evil-visual-region-expanded))
- (let ((mark evil-visual-beginning)
- (point evil-visual-end))
- (when (< evil-visual-direction 0)
- (evil-swap mark point))
- (setq evil-visual-region-expanded t)
- (evil-visual-refresh mark point)
- (when (and exclude-newline
- (save-excursion
- (goto-char evil-visual-end)
- (and (bolp) (not (bobp)))))
- (if (< evil-visual-direction 0)
- (evil-move-mark (max point (1- (mark))))
- (goto-char (max mark (1- (point)))))))))
-
-(defun evil-visual-contract-region ()
- "The inverse of `evil-visual-expand-region'.
-Create a Visual selection that expands to the current region."
- (evil-visual-refresh)
- (setq evil-visual-region-expanded nil)
- (evil-visual-refresh evil-visual-mark evil-visual-point))
-
-(defun evil-visual-refresh (&optional mark point type &rest properties)
- "Refresh point, mark and Visual variables.
-Refreshes `evil-visual-beginning', `evil-visual-end',
-`evil-visual-mark', `evil-visual-point', `evil-visual-selection',
-`evil-visual-direction', `evil-visual-properties' and `evil-this-type'."
- (let* ((point (or point (point)))
- (mark (or mark (mark t) point))
- (dir (evil-visual-direction))
- (type (or type (evil-visual-type evil-visual-selection)
- (evil-visual-type)))
- range)
- (evil-move-mark mark)
- (goto-char point)
- (setq evil-visual-beginning
- (or evil-visual-beginning
- (let ((marker (make-marker)))
- (move-marker marker (min point mark))))
- evil-visual-end
- (or evil-visual-end
- (let ((marker (make-marker)))
- (set-marker-insertion-type marker t)
- (move-marker marker (max point mark))))
- evil-visual-mark
- (or evil-visual-mark
- (let ((marker (make-marker)))
- (move-marker marker mark)))
- evil-visual-point
- (or evil-visual-point
- (let ((marker (make-marker)))
- (move-marker marker point))))
- (setq evil-visual-properties
- (evil-concat-plists evil-visual-properties properties))
- (cond
- (evil-visual-region-expanded
- (setq type (or (evil-visual-type) type))
- (move-marker evil-visual-beginning (min point mark))
- (move-marker evil-visual-end (max point mark))
- ;; if the type is one-to-one, we can safely refresh
- ;; the unexpanded positions as well
- (when (evil-type-property type :one-to-one)
- (setq range (apply #'evil-contract point mark type
- evil-visual-properties)
- mark (evil-range-beginning range)
- point (evil-range-end range))
- (when (< dir 0)
- (evil-swap mark point))
- (move-marker evil-visual-mark mark)
- (move-marker evil-visual-point point)))
- (t
- (setq range (apply #'evil-expand point mark type
- evil-visual-properties)
- type (evil-type range type))
- (move-marker evil-visual-beginning (evil-range-beginning range))
- (move-marker evil-visual-end (evil-range-end range))
- (move-marker evil-visual-mark mark)
- (move-marker evil-visual-point point)))
- (setq evil-visual-direction dir
- evil-this-type type)))
-
-(defun evil-visual-highlight (&optional arg)
- "Highlight Visual selection, depending on the Visual type.
-With negative ARG, disable highlighting."
- (cond
- ((and (numberp arg) (< arg 1))
- (when evil-visual-overlay
- (delete-overlay evil-visual-overlay)
- (setq evil-visual-overlay nil))
- (when evil-visual-block-overlays
- (mapc #'delete-overlay evil-visual-block-overlays)
- (setq evil-visual-block-overlays nil)))
- ((eq evil-visual-selection 'block)
- (when evil-visual-overlay
- (evil-visual-highlight -1))
- (evil-visual-highlight-block
- evil-visual-beginning
- evil-visual-end))
- (t
- (when evil-visual-block-overlays
- (evil-visual-highlight -1))
- (if evil-visual-overlay
- (move-overlay evil-visual-overlay
- evil-visual-beginning evil-visual-end)
- (setq evil-visual-overlay
- (make-overlay evil-visual-beginning evil-visual-end)))
- (overlay-put evil-visual-overlay 'face 'region)
- (overlay-put evil-visual-overlay 'priority 99))))
-
-(defun evil-visual-highlight-block (beg end &optional overlays)
- "Highlight rectangular region from BEG to END.
-Do this by putting an overlay on each line within the rectangle.
-Each overlay extends across all the columns of the rectangle.
-Reuse overlays where possible to prevent flicker."
- (let* ((point (point))
- (overlays (or overlays 'evil-visual-block-overlays))
- (old (symbol-value overlays))
- (eol-col (and (memq this-command '(next-line previous-line))
- (numberp temporary-goal-column)
- (1+ (min (round temporary-goal-column)
- (1- most-positive-fixnum)))))
- beg-col end-col new nlines overlay window-beg window-end)
- (save-excursion
- ;; calculate the rectangular region represented by BEG and END,
- ;; but put BEG in the upper-left corner and END in the
- ;; lower-right if not already there
- (setq beg-col (evil-column beg)
- end-col (evil-column end))
- (when (>= beg-col end-col)
- (if (= beg-col end-col)
- (setq end-col (1+ end-col))
- (evil-sort beg-col end-col))
- (setq beg (save-excursion
- (goto-char beg)
- (evil-move-to-column beg-col))
- end (save-excursion
- (goto-char end)
- (evil-move-to-column end-col 1))))
- ;; update end column with eol-col (extension to eol).
- (when (and eol-col (> eol-col end-col))
- (setq end-col eol-col))
- ;; force a redisplay so we can do reliable window
- ;; BEG/END calculations
- (sit-for 0)
- (setq window-beg (max (window-start) beg)
- window-end (min (window-end) (1+ end))
- nlines (count-lines window-beg
- (min window-end (point-max))))
- ;; iterate over those lines of the rectangle which are
- ;; visible in the currently selected window
- (goto-char window-beg)
- (dotimes (_ nlines)
- (let (before after row-beg row-end)
- ;; beginning of row
- (evil-move-to-column beg-col)
- (when (< (current-column) beg-col)
- ;; prepend overlay with virtual spaces if unable to
- ;; move directly to the first column
- (setq before
- (propertize
- (make-string
- (- beg-col (current-column)) ?\s)
- 'face
- (or (get-text-property (1- (point)) 'face)
- 'default))))
- (setq row-beg (point))
- ;; end of row
- (evil-move-to-column end-col)
- (when (and (not (eolp))
- (< (current-column) end-col))
- ;; append overlay with virtual spaces if unable to
- ;; move directly to the last column
- (setq after
- (propertize
- (make-string
- (if (= (point) row-beg)
- (- end-col beg-col)
- (- end-col (current-column)))
- ?\s) 'face 'region))
- ;; place cursor on one of the virtual spaces
- (if (= point row-beg)
- (put-text-property
- 0 (min (length after) 1)
- 'cursor t after)
- (put-text-property
- (max 0 (1- (length after))) (length after)
- 'cursor t after)))
- (setq row-end (min (point) (line-end-position)))
- ;; trim old leading overlays
- (while (and old
- (setq overlay (car old))
- (< (overlay-start overlay) row-beg)
- (/= (overlay-end overlay) row-end))
- (delete-overlay overlay)
- (setq old (cdr old)))
- ;; reuse an overlay if possible, otherwise create one
- (cond
- ((and old (setq overlay (car old))
- (or (= (overlay-start overlay) row-beg)
- (= (overlay-end overlay) row-end)))
- (move-overlay overlay row-beg row-end)
- (overlay-put overlay 'before-string before)
- (overlay-put overlay 'after-string after)
- (setq new (cons overlay new)
- old (cdr old)))
- (t
- (setq overlay (make-overlay row-beg row-end))
- (overlay-put overlay 'before-string before)
- (overlay-put overlay 'after-string after)
- (setq new (cons overlay new)))))
- (forward-line 1))
- ;; display overlays
- (dolist (overlay new)
- (overlay-put overlay 'face 'region)
- (overlay-put overlay 'priority 99))
- ;; trim old overlays
- (dolist (overlay old)
- (delete-overlay overlay))
- (set overlays (nreverse new)))))
-
-(defun evil-visual-range ()
- "Return the Visual selection as a range.
-This is a list (BEG END TYPE PROPERTIES...), where BEG is the
-beginning of the selection, END is the end of the selection,
-TYPE is the selection's type, and PROPERTIES is a property list
-of miscellaneous selection attributes."
- (apply #'evil-range
- evil-visual-beginning evil-visual-end
- (evil-visual-type)
- :expanded t
- evil-visual-properties))
-
-(defun evil-visual-direction ()
- "Return direction of Visual selection.
-The direction is -1 if point precedes mark and 1 otherwise.
-See also the variable `evil-visual-direction', which holds
-the direction of the last selection."
- (let* ((point (point))
- (mark (or (mark t) point)))
- (if (< point mark) -1 1)))
-
-(defun evil-visual-type (&optional selection)
- "Return the type of the Visual selection.
-If SELECTION is specified, return the type of that instead."
- (if (and (null selection) (evil-visual-state-p))
- (or evil-this-type (evil-visual-type evil-visual-selection))
- (setq selection (or selection evil-visual-selection))
- (symbol-value (cdr-safe (assq selection evil-visual-alist)))))
-
-(defun evil-visual-goto-end ()
- "Go to the last line of the Visual selection.
-This position may differ from `evil-visual-end' depending on
-the selection type, and is contained in the selection."
- (let ((range (evil-contract-range (evil-visual-range))))
- (goto-char (evil-range-end range))))
-
-(defun evil-visual-alist ()
- "Return an association list from types to selection symbols."
- (mapcar #'(lambda (e)
- (cons (symbol-value (cdr-safe e)) (cdr-safe e)))
- evil-visual-alist))
-
-(defun evil-visual-selection-function (selection)
- "Return a selection function for TYPE.
-Default to `evil-visual-make-region'."
- (or (cdr-safe (assq selection evil-visual-alist))
- ;; generic selection function
- 'evil-visual-make-region))
-
-(defun evil-visual-selection-for-type (type)
- "Return a Visual selection for TYPE."
- (catch 'done
- (dolist (selection evil-visual-alist)
- (when (eq (symbol-value (cdr selection)) type)
- (throw 'done (car selection))))))
-
-(defun evil-visual-block-corner (&optional corner point mark)
- "Block corner corresponding to POINT, with MARK in opposite corner.
-Depending on POINT and MARK, the return value is `upper-left',
-`upper-right', `lower-left' or `lower-right':
-
- upper-left +---+ upper-right
- | |
- lower-left +---+ lower-right
-
-One-column or one-row blocks are ambiguous. In such cases,
-the horizontal or vertical component of CORNER is used.
-CORNER defaults to `upper-left'."
- (let* ((point (or point (point)))
- (mark (or mark (mark t)))
- (corner (symbol-name
- (or corner
- (and (overlayp evil-visual-overlay)
- (overlay-get evil-visual-overlay
- :corner))
- 'upper-left)))
- (point-col (evil-column point))
- (mark-col (evil-column mark))
- horizontal vertical)
- (cond
- ((= point-col mark-col)
- (setq horizontal
- (or (and (string-match "left\\|right" corner)
- (match-string 0 corner))
- "left")))
- ((< point-col mark-col)
- (setq horizontal "left"))
- ((> point-col mark-col)
- (setq horizontal "right")))
- (cond
- ((= (line-number-at-pos point)
- (line-number-at-pos mark))
- (setq vertical
- (or (and (string-match "upper\\|lower" corner)
- (match-string 0 corner))
- "upper")))
- ((< point mark)
- (setq vertical "upper"))
- ((> point mark)
- (setq vertical "lower")))
- (intern (format "%s-%s" vertical horizontal))))
-
-;;; Operator-Pending state
-
-(evil-define-state operator
- "Operator-Pending state."
- :tag " <O> "
- :cursor evil-half-cursor
- :enable (evil-operator-shortcut-map operator motion normal))
-
-(evil-define-keymap evil-operator-shortcut-map
- "Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\"."
- :local t
- (setq evil-operator-shortcut-map (make-sparse-keymap))
- (evil-initialize-local-keymaps))
-
-;; the half-height "Operator-Pending cursor" cannot be specified
-;; as a static `cursor-type' value, since its height depends on
-;; the current font size
-(defun evil-half-cursor ()
- "Change cursor to a half-height box.
-\(This is really just a thick horizontal bar.)"
- (let ((height (/ (window-pixel-height) (* (window-height) 2))))
- (setq cursor-type (cons 'hbar height))))
-
-;;; Replace state
-
-(evil-define-state replace
- "Replace state."
- :tag " <R> "
- :cursor hbar
- :message "-- REPLACE --"
- :input-method t
- (cond
- ((evil-replace-state-p)
- (overwrite-mode 1)
- (add-hook 'pre-command-hook #'evil-replace-pre-command nil t)
- (unless (eq evil-want-fine-undo t)
- (evil-start-undo-step)))
- (t
- (overwrite-mode -1)
- (remove-hook 'pre-command-hook #'evil-replace-pre-command t)
- (unless (eq evil-want-fine-undo t)
- (evil-end-undo-step))
- (evil-move-cursor-back)))
- (setq evil-replace-alist nil))
-
-(defun evil-replace-pre-command ()
- "Remember the character under point."
- (when (evil-replace-state-p)
- (unless (assq (point) evil-replace-alist)
- (add-to-list 'evil-replace-alist
- (cons (point)
- (unless (eolp)
- (char-after)))))))
-(put 'evil-replace-pre-command 'permanent-local-hook t)
-
-(defun evil-replace-backspace ()
- "Restore character under cursor."
- (interactive)
- (let (char)
- (backward-char)
- (when (assq (point) evil-replace-alist)
- (setq char (cdr (assq (point) evil-replace-alist)))
- (save-excursion
- (delete-char 1)
- (when char
- (insert char))))))
-
-;;; Motion state
-
-(evil-define-state motion
- "Motion state."
- :tag " <M> "
- :suppress-keymap t)
-
-;;; Emacs state
-
-(evil-define-state emacs
- "Emacs state."
- :tag " <E> "
- :message "-- EMACS --"
- :input-method t
- :intercept-esc nil)
-
-(provide 'evil-states)
-
-;;; evil-states.el ends here
diff --git a/elpa/evil-20200718.842/evil-types.el b/elpa/evil-20200718.842/evil-types.el
deleted file mode 100644
index d72466e..0000000
--- a/elpa/evil-20200718.842/evil-types.el
+++ /dev/null
@@ -1,454 +0,0 @@
-;;; evil-types.el --- Type system -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; A type defines a transformation on a pair of buffer positions.
-;; Types are used by Visual state (character/line/block selection)
-;; and Operator-Pending state (character/line/block motions).
-;;
-;; The basic transformation is "expansion". For example, the `line'
-;; type "expands" a pair of positions to whole lines by moving the
-;; first position to the beginning of the line and the last position
-;; to the end of the line. That expanded selection is what the rest
-;; of Emacs sees and acts on.
-;;
-;; An optional transformation is "contraction", which is the opposite
-;; of expansion. If the transformation is one-to-one, expansion
-;; followed by contraction always returns the original range.
-;; (The `line' type is not one-to-one, as it may expand multiple
-;; positions to the same lines.)
-;;
-;; Another optional transformation is "normalization", which takes
-;; two unexpanded positions and adjusts them before expansion.
-;; This is useful for cleaning up "invalid" positions.
-;;
-;; Types are defined at the end of this file using the macro
-;; `evil-define-type'.
-
-(require 'evil-common)
-(require 'evil-macros)
-
-;;; Code:
-
-;;; Type definitions
-
-(evil-define-type exclusive
- "Return the positions unchanged, with some exceptions.
-If the end position is at the beginning of a line, then:
-
-* If the beginning position is at or before the first non-blank
- character on the line, return `line' (expanded).
-
-* Otherwise, move the end position to the end of the previous
- line and return `inclusive' (expanded)."
- :normalize (lambda (beg end)
- (cond
- ((progn
- (goto-char end)
- (and (/= beg end) (bolp)))
- (setq end (max beg (1- end)))
- (cond
- ((progn
- (goto-char beg)
- (looking-back "^[ \f\t\v]*" (line-beginning-position)))
- (evil-expand beg end 'line))
- (t
- (unless evil-cross-lines
- (setq end (max beg (1- end))))
- (evil-expand beg end 'inclusive))))
- (t
- (evil-range beg end))))
- :string (lambda (beg end)
- (let ((width (- end beg)))
- (format "%s character%s" width
- (if (= width 1) "" "s")))))
-
-(evil-define-type inclusive
- "Include the character under point.
-If the end position is at the beginning of a line or the end of a
-line and `evil-want-visual-char-semi-exclusive', then:
-
-* If in visual state return `exclusive' (expanded)."
- :expand (lambda (beg end)
- (if (and evil-want-visual-char-semi-exclusive
- (evil-visual-state-p)
- (< beg end)
- (save-excursion
- (goto-char end)
- (or (bolp) (eolp))))
- (evil-range beg end 'exclusive)
- (evil-range beg (1+ end))))
- :contract (lambda (beg end)
- (evil-range beg (max beg (1- end))))
- :normalize (lambda (beg end)
- (goto-char end)
- (when (eq (char-after) ?\n)
- (setq end (max beg (1- end))))
- (evil-range beg end))
- :string (lambda (beg end)
- (let ((width (- end beg)))
- (format "%s character%s" width
- (if (= width 1) "" "s")))))
-
-(evil-define-type line
- "Include whole lines."
- :one-to-one nil
- :expand (lambda (beg end)
- (evil-range
- (progn
- (goto-char beg)
- (min (line-beginning-position)
- (progn
- ;; move to beginning of line as displayed
- (evil-move-beginning-of-line)
- (line-beginning-position))))
- (progn
- (goto-char end)
- (max (line-beginning-position 2)
- (progn
- ;; move to end of line as displayed
- (evil-move-end-of-line)
- (line-beginning-position 2))))))
- :contract (lambda (beg end)
- (evil-range beg (max beg (1- end))))
- :string (lambda (beg end)
- (let ((height (count-lines beg end)))
- (format "%s line%s" height
- (if (= height 1) "" "s")))))
-
-(evil-define-type screen-line
- "Include whole lines, being aware of `visual-line-mode'
-when `evil-respect-visual-line-mode' is non-nil."
- :one-to-one nil
- :expand (lambda (beg end)
- (if (or (not evil-respect-visual-line-mode)
- (not visual-line-mode))
- (evil-line-expand beg end)
- (evil-range
- (progn
- (goto-char beg)
- (save-excursion
- (beginning-of-visual-line)))
- (progn
- (goto-char end)
- (save-excursion
- ;; `beginning-of-visual-line' reverts to the beginning of the
- ;; last visual line if the end of the last line is the end of
- ;; the buffer. This would prevent selecting the last screen
- ;; line.
- (if (= (line-beginning-position 2) (point-max))
- (point-max)
- (beginning-of-visual-line 2)))))))
- :contract (lambda (beg end)
- (evil-range beg (max beg (1- end))))
- :string (lambda (beg end)
- (let ((height (count-screen-lines beg end)))
- (format "%s screen line%s" height
- (if (= height 1) "" "s")))))
-
-(evil-define-type block
- "Like `inclusive', but for rectangles:
-the last column is included."
- :expand (lambda (beg end &rest properties)
- (let ((beg-col (evil-column beg))
- (end-col (evil-column end))
- (corner (plist-get properties :corner)))
- ;; Since blocks are implemented as a pair of buffer
- ;; positions, expansion is restricted to what the buffer
- ;; allows. In the case of a one-column block, there are
- ;; two ways to expand it (either move the upper corner
- ;; beyond the lower corner, or the lower beyond the
- ;; upper), so try out both possibilities when
- ;; encountering the end of the line.
- (cond
- ((= beg-col end-col)
- (goto-char end)
- (cond
- ((eolp)
- (goto-char beg)
- (if (eolp)
- (evil-range beg end)
- (evil-range (1+ beg) end)))
- ((memq corner '(lower-right upper-right right))
- (evil-range (1+ beg) end))
- (t
- (evil-range beg (1+ end)))))
- ((< beg-col end-col)
- (goto-char end)
- (if (eolp)
- (evil-range beg end)
- (evil-range beg (1+ end))))
- (t
- (goto-char beg)
- (if (eolp)
- (evil-range beg end)
- (evil-range (1+ beg) end))))))
- :contract (lambda (beg end)
- (let ((beg-col (evil-column beg))
- (end-col (evil-column end)))
- (if (> beg-col end-col)
- (evil-range (1- beg) end)
- (evil-range beg (max beg (1- end))))))
- :string (lambda (beg end)
- (let ((height (count-lines
- beg
- (progn
- (goto-char end)
- (if (and (bolp) (not (eobp)))
- (1+ end)
- end))))
- (width (abs (- (evil-column beg)
- (evil-column end)))))
- (format "%s row%s and %s column%s"
- height
- (if (= height 1) "" "s")
- width
- (if (= width 1) "" "s"))))
- :rotate (lambda (beg end &rest properties)
- "Rotate block according to :corner property.
-:corner can be one of `upper-left',``upper-right', `lower-left'
-and `lower-right'."
- (let ((left (evil-column beg))
- (right (evil-column end))
- (corner (or (plist-get properties :corner)
- 'upper-left)))
- (evil-sort left right)
- (goto-char beg)
- (if (memq corner '(upper-right lower-left))
- (move-to-column right)
- (move-to-column left))
- (setq beg (point))
- (goto-char end)
- (if (memq corner '(upper-right lower-left))
- (move-to-column left)
- (move-to-column right))
- (setq end (point))
- (setq properties (plist-put properties
- :corner corner))
- (apply #'evil-range beg end properties))))
-
-(evil-define-type rectangle
- "Like `exclusive', but for rectangles:
-the last column is excluded."
- :expand (lambda (beg end)
- ;; select at least one column
- (if (= (evil-column beg) (evil-column end))
- (evil-expand beg end 'block)
- (evil-range beg end 'block))))
-
-;;; Standard interactive codes
-
-(evil-define-interactive-code "*"
- "Signal error if the buffer is read-only."
- (when buffer-read-only
- (signal 'buffer-read-only nil)))
-
-(evil-define-interactive-code "b" (prompt)
- "Name of existing buffer."
- (list (read-buffer prompt (current-buffer) t)))
-
-(evil-define-interactive-code "c"
- "Read character."
- (list (read-char)))
-
-(evil-define-interactive-code "p"
- "Prefix argument converted to number."
- (list (prefix-numeric-value current-prefix-arg)))
-
-(evil-define-interactive-code "P"
- "Prefix argument in raw form."
- (list current-prefix-arg))
-
-;;; Custom interactive codes
-
-(evil-define-interactive-code "<c>"
- "Count."
- (list (when current-prefix-arg
- (prefix-numeric-value
- current-prefix-arg))))
-
-(evil-define-interactive-code "<vc>"
- "Count, but only in visual state.
-This should be used by an operator taking a count. In normal
-state the count should not be handled by the operator but by the
-motion that defines the operator's range. In visual state the
-range is specified by the visual region and the count is not used
-at all. Thus in the case the operator may use the count
-directly."
- (list (when (and (evil-visual-state-p) current-prefix-arg)
- (prefix-numeric-value
- current-prefix-arg))))
-
-(evil-define-interactive-code "<C>"
- "Character read through `evil-read-key'."
- (list
- (if (evil-operator-state-p)
- (evil-without-restriction (evil-read-key))
- (evil-read-key))))
-
-(evil-define-interactive-code "<r>"
- "Untyped motion range (BEG END)."
- (evil-operator-range))
-
-(evil-define-interactive-code "<R>"
- "Typed motion range (BEG END TYPE)."
- (evil-operator-range t))
-
-(evil-define-interactive-code "<v>"
- "Typed motion range of visual range(BEG END TYPE).
-If visual state is inactive then those values are nil."
- (if (evil-visual-state-p)
- (let ((range (evil-visual-range)))
- (list (car range)
- (cadr range)
- (evil-type range)))
- (list nil nil nil)))
-
-(evil-define-interactive-code "<x>"
- "Current register."
- (list evil-this-register))
-
-(evil-define-interactive-code "<y>"
- "Current yank-handler."
- (list (evil-yank-handler)))
-
-(evil-define-interactive-code "<a>"
- "Ex argument."
- :ex-arg t
- (list (when (evil-ex-p) evil-ex-argument)))
-
-(evil-define-interactive-code "<f>"
- "Ex file argument."
- :ex-arg file
- (list (when (evil-ex-p) (evil-ex-file-arg))))
-
-(evil-define-interactive-code "<b>"
- "Ex buffer argument."
- :ex-arg buffer
- (list (when (evil-ex-p) evil-ex-argument)))
-
-(evil-define-interactive-code "<sh>"
- "Ex shell command argument."
- :ex-arg shell
- (list (when (evil-ex-p) evil-ex-argument)))
-
-(evil-define-interactive-code "<fsh>"
- "Ex file or shell command argument."
- :ex-arg file-or-shell
- (list (when (evil-ex-p) evil-ex-argument)))
-
-(evil-define-interactive-code "<sym>"
- "Ex symbolic argument."
- :ex-arg sym
- (list (when (and (evil-ex-p) evil-ex-argument)
- (intern evil-ex-argument))))
-
-(evil-define-interactive-code "<addr>"
- "Ex line number."
- (list
- (and (evil-ex-p)
- (let ((expr (evil-ex-parse evil-ex-argument)))
- (if (eq (car expr) 'evil-goto-line)
- (save-excursion
- (goto-char evil-ex-point)
- (eval (cadr expr)))
- (user-error "Invalid address"))))))
-
-(evil-define-interactive-code "<!>"
- "Ex bang argument."
- :ex-bang t
- (list (when (evil-ex-p) evil-ex-bang)))
-
-(evil-define-interactive-code "</>"
- "Ex delimited argument."
- (when (evil-ex-p)
- (evil-delimited-arguments evil-ex-argument)))
-
-(evil-define-interactive-code "<g/>"
- "Ex global argument."
- (when (evil-ex-p)
- (evil-ex-parse-global evil-ex-argument)))
-
-(evil-define-interactive-code "<s/>"
- "Ex substitution argument."
- :ex-arg substitution
- (when (evil-ex-p)
- (evil-ex-get-substitute-info evil-ex-argument t)))
-
-(evil-define-interactive-code "<xc/>"
- "Ex register and count argument, both optional.
-Can be used for commands such as :delete [REGISTER] [COUNT] where the
-command can be called with either zero, one or two arguments. When the
-argument is one, if it's numeric it's treated as a COUNT, otherwise -
-REGISTER"
- (when (evil-ex-p)
- (evil-ex-get-optional-register-and-count evil-ex-argument)))
-
-(defun evil-ex-get-optional-register-and-count (string)
- "Parse STRING as an ex arg with both optional REGISTER and COUNT.
-Returns a list (REGISTER COUNT)."
- (let* ((split-args (split-string (or string "")))
- (arg-count (length split-args))
- (arg0 (car split-args))
- (arg1 (cadr split-args))
- (number-regex "^-?[1-9][0-9]*$")
- (register nil)
- (count nil))
- (cond
- ;; :command REGISTER or :command COUNT
- ((= arg-count 1)
- (if (string-match-p number-regex arg0)
- (setq count arg0)
- (setq register arg0)))
- ;; :command REGISTER COUNT
- ((eq arg-count 2)
- (setq register arg0
- count arg1))
- ;; more than 2 args aren't allowed
- ((> arg-count 2)
- (user-error "Invalid use")))
-
- ;; if register is given, check it's valid
- (when register
- (unless (= (length register) 1)
- (user-error "Invalid register"))
- (setq register (string-to-char register)))
-
- ;; if count is given, check it's valid
- (when count
- (unless (string-match-p number-regex count)
- (user-error "Invalid count"))
- (setq count (string-to-number count))
- (unless (> count 0)
- (user-error "Invalid count")))
-
- (list register count)))
-
-(provide 'evil-types)
-
-;;; evil-types.el ends here
diff --git a/elpa/evil-20200718.842/evil-vars.el b/elpa/evil-20200718.842/evil-vars.el
deleted file mode 100644
index 07f478b..0000000
--- a/elpa/evil-20200718.842/evil-vars.el
+++ /dev/null
@@ -1,1980 +0,0 @@
-;;; evil-vars.el --- Settings and variables -*- lexical-binding: t -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.14.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Code:
-
-(declare-function evil-add-command-properties "evil-common"
- (command &rest properties))
-(declare-function evil-update-insert-state-bindings "evil-maps"
- (&optional _option-name remove force))
-
-;;; Hooks
-
-(defvar evil-after-load-hook nil
- "Functions to be run when loading of Evil is finished.
-This hook can be used the execute some initialization routines
-when Evil is completely loaded.")
-
-(defcustom evil-goto-definition-functions
- '(evil-goto-definition-imenu
- evil-goto-definition-semantic
- evil-goto-definition-xref
- evil-goto-definition-search)
- "List of functions run until success by `evil-goto-definition'."
- :type 'hook
- :group 'evil)
-
-;;; Initialization
-
-(defvar evil-pending-custom-initialize nil
- "A list of pending initializations for custom variables.
-Each element is a triple (FUNC VAR VALUE). When Evil is
-completely loaded then the functions (funcall FUNC VAR VALUE) is
-called for each element. FUNC should be a function suitable for
-the :initialize property of `defcustom'.")
-
-(defun evil-custom-initialize-pending-reset (var value)
- "Add a pending customization with `custom-initialize-reset'."
- (push (list 'custom-initialize-reset var value)
- evil-pending-custom-initialize))
-
-(defun evil-run-pending-custom-initialize ()
- "Executes the pending initializations.
-See `evil-pending-custom-initialize'."
- (dolist (init evil-pending-custom-initialize)
- (apply (car init) (cdr init)))
- (remove-hook 'evil-after-load-hook 'evil-run-pending-custom-initialize))
-(add-hook 'evil-after-load-hook 'evil-run-pending-custom-initialize)
-
-;;; Setters
-
-(defun evil-set-toggle-key (key)
- "Set `evil-toggle-key' to KEY.
-KEY must be readable by `read-kbd-macro'."
- (let ((old-key (read-kbd-macro
- (if (boundp 'evil-toggle-key)
- evil-toggle-key
- "C-z")))
- (key (read-kbd-macro key)))
- (with-no-warnings
- (dolist (pair '((evil-motion-state-map evil-emacs-state)
- (evil-insert-state-map evil-emacs-state)
- (evil-emacs-state-map evil-exit-emacs-state)))
- (when (boundp (car pair))
- (let ((map (symbol-value (car pair)))
- (fun (cadr pair)))
- (when (keymapp map)
- (define-key map key fun)
- (define-key map old-key nil))))))))
-
-(defun evil-set-custom-state-maps (var pending-var key _make newlist)
- "Changes the list of special keymaps.
-VAR is the variable containing the list of keymaps.
-PENDING-VAR is the variable containing the list of the currently pending
- keymaps.
-KEY the special symbol to be stored in the keymaps.
-MAKE the creation function of the special keymaps.
-NEWLIST the list of new special keymaps."
- (set-default pending-var newlist)
- (when (default-boundp var)
- (dolist (map (default-value var))
- (when (and (boundp (car map))
- (keymapp (default-value (car map))))
- (define-key (default-value (car map)) (vector key) nil))))
- (set-default var newlist)
- (evil-update-pending-maps))
-
-(defun evil-update-pending-maps (&optional _file)
- "Tries to set pending special keymaps.
-This function should be called from an `after-load-functions'
-hook."
- (let ((maps '((evil-make-overriding-map . evil-pending-overriding-maps)
- (evil-make-intercept-map . evil-pending-intercept-maps))))
- (while maps
- (let* ((map (pop maps))
- (make (car map))
- (pending-var (cdr map))
- (pending (symbol-value pending-var))
- newlist)
- (while pending
- (let* ((map (pop pending))
- (kmap (and (boundp (car map))
- (keymapp (symbol-value (car map)))
- (symbol-value (car map))))
- (state (cdr map)))
- (if kmap
- (funcall make kmap state)
- (push map newlist))))
- (set-default pending-var newlist)))))
-
-(defun evil-set-visual-newline-commands (var value)
- "Set the value of `evil-visual-newline-commands'.
-Setting this variable changes the properties of the appropriate
-commands."
- (with-no-warnings
- (when (default-boundp var)
- (dolist (cmd (default-value var))
- (evil-set-command-property cmd :exclude-newline nil)))
- (set-default var value)
- (dolist (cmd (default-value var))
- (evil-set-command-property cmd :exclude-newline t))))
-
-(defun evil-set-custom-motions (var values)
- "Sets the list of motion commands."
- (with-no-warnings
- (when (default-boundp var)
- (dolist (motion (default-value var))
- (evil-add-command-properties motion :keep-visual nil :repeat nil)))
- (set-default var values)
- (mapc #'evil-declare-motion (default-value var))))
-
-;;; Customization group
-
-(defgroup evil nil
- "Extensible vi layer."
- :group 'emulations
- :prefix 'evil-)
-
-(defcustom evil-auto-indent t
- "\\<evil-normal-state-map>
-Whether to auto-indent when opening lines with \\[evil-open-below] \
-and \\[evil-open-above]."
- :type 'boolean
- :group 'evil)
-(make-variable-buffer-local 'evil-auto-indent)
-
-(defcustom evil-shift-width 4
- "\\<evil-normal-state-map>
-The number of columns by which a line is shifted.
-This applies to the shifting operators \\[evil-shift-right] and \
-\\[evil-shift-left]."
- :type 'integer
- :group 'evil)
-(make-variable-buffer-local 'evil-shift-width)
-
-(defcustom evil-shift-round t
- "\\<evil-normal-state-map>
-Whether shifting rounds to the nearest multiple.
-If non-nil, \\[evil-shift-right] and \\[evil-shift-left] adjust line
-indentation to the nearest multiple of `evil-shift-width'."
- :type 'boolean
- :group 'evil)
-(make-variable-buffer-local 'evil-shift-round)
-
-(defcustom evil-indent-convert-tabs t
- "\\<evil-normal-state-map>
-If non-nil, the \\[evil-indent] operator converts between leading tabs and spaces.
-Whether tabs are converted to spaces or vice versa depends on the
-value of `indent-tabs-mode'."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-default-cursor t
- "The default cursor.
-May be a cursor type as per `cursor-type', a color string as passed
-to `set-cursor-color', a zero-argument function for changing the
-cursor, or a list of the above."
- :type '(set symbol (cons symbol symbol) string function)
- :group 'evil)
-
-(defvar evil-force-cursor nil
- "Overwrite the current states default cursor.")
-
-(defcustom evil-repeat-move-cursor t
- "\\<evil-normal-state-map>
-Whether repeating commands with \\[evil-repeat] may move the cursor.
-If nil, the original cursor position is preserved, even if the command
-normally would have moved the cursor."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-cross-lines nil
- "\\<evil-motion-state-map>
-Whether horizontal motions may move to other lines. If non-nil,
-certain motions that conventionally operate in a single line may move
-the cursor to other lines. Otherwise, they are restricted to the
-current line. This applies to \\[evil-backward-char], \
-\\[evil-forward-char], \\[evil-find-char], \
-\\[evil-find-char-backward], \\[evil-find-char-to], \
-\\[evil-find-char-to-backward], \
-\\<evil-normal-state-map>\\[evil-invert-char]."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-backspace-join-lines t
- "Whether backward delete in insert state may join lines."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-move-cursor-back t
- "Whether the cursor is moved backwards when exiting insert state.
-If non-nil, the cursor moves \"backwards\" when exiting insert state,
-so that it ends up on the character to the left. Otherwise it remains
-in place, on the character to the right."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-move-beyond-eol nil
- "Whether the cursor can move past the end of the line.
-If non-nil, the cursor is allowed to move one character past the
-end of the line, as in Emacs."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-respect-visual-line-mode nil
- "\\<evil-motion-state-map>
-Whether movement commands respect `visual-line-mode'.
-If non-nil, `visual-line-mode' is generally respected when it is
-on. In this case, motions such as \\[evil-next-line] and
-\\[evil-previous-line] navigate by visual lines (on the screen) rather
-than \"physical\" lines (defined by newline characters). If nil,
-the setting of `visual-line-mode' is ignored.
-
-This variable must be set before Evil is loaded."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-repeat-find-to-skip-next t
- "Whether a repeat of t or T should skip an adjacent character."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-kbd-macro-suppress-motion-error nil
- "\\<evil-motion-state-map>
-Whether left/right motions signal errors in keyboard macros.
-This variable only affects beginning-of-line or end-of-line errors
-regarding the motions \\[evil-backward-char] and \\[evil-forward-char]
-respectively. This may be desired since such errors cause macro
-definition or execution to be terminated. There are four
-possibilities:
-
-- `record': errors are suppressed when recording macros, but not when
- replaying them.
-- `replay': errors are suppressed when replaying macros, but not when
- recording them.
-- `t': errors are suppressed in both cases.
-- `nil': errors are never suppressed."
- :type '(radio (const :tag "No" :value nil)
- (const :tag "Record" :value record)
- (const :tag "Replay" :value replay)
- (const :tag "Both" :value t))
- :group 'evil)
-
-(defcustom evil-track-eol t
- "\\<evil-motion-state-map>
-Whether \\[evil-end-of-line] \"sticks\" the cursor to the end of the line.
-If non-nil, vertical motions after \\[evil-end-of-line] maintain the cursor at the
-end of the line, even if the target line is longer. This is analogous
-to `track-eol', but respects Evil's interpretation of end-of-line."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-mode-line-format 'before
- "The position of the state tag in the mode line.
-If set to `before' or `after', the tag is placed at the beginning
-or the end of the mode-line, respectively. If nil, there is no
-tag. Otherwise it should be a cons cell (WHERE . WHICH), where
-WHERE is either `before' or `after', and WHICH is a symbol in
-`mode-line-format'. The tag is then placed before or after that
-symbol, respectively."
- :type '(radio :value 'before
- (const before)
- (const after)
- (cons :tag "Next to symbol"
- (choice :value after
- (const before)
- (const after))
- symbol))
- :group 'evil)
-
-(defcustom evil-mouse-word 'evil-word
- "The thing-at-point symbol for double click selection.
-The double-click starts visual state in a special word selection
-mode. This symbol is used to determine the words to be
-selected. Possible values are `evil-word' or `evil-WORD'."
- :type 'symbol
- :group 'evil)
-
-(defcustom evil-bigword "^ \t\r\n"
- "The set of characters to be interpreted as WORD boundaries.
-This is enclosed with square brackets and used as a regular
-expression. By default, whitespace characters are considered
-WORD boundaries."
- :type 'string
- :group 'evil)
-(make-variable-buffer-local 'evil-bigword)
-
-(defcustom evil-want-fine-undo nil
- "Whether actions are undone in several steps.
-There are two possible choices: nil (\"no\") means that all
-changes made during insert state, including a possible delete
-after a change operation, are collected in a single undo step.
-Non-nil (\"yes\") means that undo steps are determined according
-to Emacs heuristics, and no attempt is made to aggregate changes.
-
-For backward compatibility purposes, the value `fine' is
-interpreted as `nil'. This option was removed because it did not
-work consistently."
- :type '(radio (const :tag "No" :value nil)
- (const :tag "Fine (obsolete)" :value fine)
- (const :tag "Yes" :value t))
- :group 'evil)
-
-(defcustom evil-regexp-search t
- "\\<evil-motion-state-map>
-Whether to use regular expressions for searching in \
-\\[evil-search-forward] and \\[evil-search-backward]."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-search-wrap t
- "\\<evil-motion-state-map>
-Whether search with \\[evil-search-forward] and \
-\\[evil-search-backward] wraps around the buffer.
-If this is non-nil, search stops at the buffer boundaries."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-flash-delay 2
- "\\<evil-motion-state-map>
-Time in seconds to flash search matches after \\[evil-search-next] and \
-\\[evil-search-previous]."
- :type 'number
- :group 'evil)
-
-(defcustom evil-auto-balance-windows t
- "If non-nil window creation and deletion trigger rebalancing."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-split-window-below nil
- "If non-nil split windows are created below."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-vsplit-window-right nil
- "If non-nil vertically split windows with are created to the right."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-esc-delay 0.01
- "The time, in seconds, to wait for another key after escape.
-If no further event arrives during this time, the event is
-translated to `ESC'. Otherwise, it is translated according to
-`input-decode-map'. This does not apply in Emacs state, and may
-also be inhibited by setting `evil-inhibit-esc'."
- :type 'number
- :group 'evil)
-
-(defvar evil-esc-mode nil
- "Non-nil if `evil-esc-mode' is enabled.")
-
-(defvar evil-esc-map nil
- "Original ESC prefix map in `input-decode-map'.
-Used by `evil-esc-mode'.")
-
-(defvar evil-inhibit-esc nil
- "If non-nil, the \\e event will never be translated to 'escape.")
-
-(defcustom evil-intercept-esc 'always
- "Whether Evil should intercept the escape key.
-In the terminal, escape and a meta key sequence both generate the
-same event. In order to distingush these, Evil uses
-`input-decode-map'. It is not necessary to do this in a graphical
-Emacs session. However, if you prefer to use `C-[' as escape (which
-is identical to the terminal escape key code), this interception must
-also happen in graphical Emacs sessions. Set this variable to
-`always', t (only in the terminal) or nil (never intercept)."
- :type '(radio (const :tag "Never" :value nil)
- (const :tag "In terminal only" :value t)
- (const :tag "Always" :value always))
- :group 'evil)
-
-(defcustom evil-show-paren-range 0
- "The minimal distance between point and a parenthesis
-which causes the parenthesis to be highlighted."
- :type 'integer
- :group 'evil)
-
-(defcustom evil-ex-hl-update-delay 0.02
- "Time in seconds of idle before updating search highlighting.
-Setting this to a period shorter than that of keyboard's repeat
-rate allows highlights to update while scrolling."
- :type 'number
- :group 'evil)
-
-(defcustom evil-highlight-closing-paren-at-point-states
- '(not emacs insert replace)
- "The states in which the closing parenthesis at point should be highlighted.
-All states listed here highlight the closing parenthesis at
-point (which is Vim's default behavior). All others highlight the
-parenthesis before point (which is Emacs default behavior). If
-this list contains the symbol `not' then its meaning is inverted,
-i.e. all states listed here highlight the closing parenthesis
-before point."
- :type '(repeat symbol)
- :group 'evil)
-
-(defcustom evil-kill-on-visual-paste t
- "Whether pasting in visual state adds the replaced text to the
-kill ring, making it the default for the next paste. The default,
-replicates the default Vim behavior."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-want-C-i-jump t
- "Whether `C-i' jumps forward in the jump list (like Vim).
-Otherwise, `C-i' inserts a tab character."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (when (boundp 'evil-motion-state-map)
- (cond
- ((and (not value)
- (eq (lookup-key evil-motion-state-map (kbd "C-i"))
- 'evil-jump-forward))
- (define-key evil-motion-state-map (kbd "C-i") nil))
- ((and value
- (not (lookup-key evil-motion-state-map (kbd "C-i"))))
- (define-key evil-motion-state-map (kbd "C-i") 'evil-jump-forward))))))
-
-(defcustom evil-want-C-u-scroll nil
- "Whether `C-u' scrolls up (like Vim).
-Otherwise, `C-u' applies a prefix argument. The binding of
-`C-u' mirrors Emacs behaviour by default due to the relative
-ubiquity of prefix arguments."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (when (boundp 'evil-motion-state-map)
- (cond
- ((and (not value)
- (eq (lookup-key evil-motion-state-map (kbd "C-u"))
- 'evil-scroll-up))
- (define-key evil-motion-state-map (kbd "C-u") nil))
- ((and value
- (not (lookup-key evil-motion-state-map (kbd "C-u"))))
- (define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up))))))
-
-(defcustom evil-want-C-d-scroll t
- "Whether `C-d' scrolls down (like Vim)."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (when (boundp 'evil-motion-state-map)
- (cond
- ((and (not value)
- (eq (lookup-key evil-motion-state-map (kbd "C-d"))
- 'evil-scroll-down))
- (define-key evil-motion-state-map (kbd "C-d") nil))
- ((and value
- (not (lookup-key evil-motion-state-map (kbd "C-d"))))
- (define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down))))))
-
-(defcustom evil-want-C-u-delete nil
- "Whether `C-u' deletes back to indentation in insert state.
-Otherwise, `C-u' applies a prefix argument. The binding of
-`C-u' mirrors Emacs behaviour by default due to the relative
-ubiquity of prefix arguments."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (when (boundp 'evil-insert-state-map)
- (cond
- ((and (not value)
- (eq (lookup-key evil-insert-state-map (kbd "C-u"))
- 'evil-delete-back-to-indentation))
- (define-key evil-insert-state-map (kbd "C-u") nil))
- ((and value
- (not (lookup-key evil-insert-state-map (kbd "C-u"))))
- (define-key evil-insert-state-map (kbd "C-u") 'evil-delete-back-to-indentation))))))
-
-(defcustom evil-want-C-w-delete t
- "Whether `C-w' deletes a word in Insert state."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (when (boundp 'evil-insert-state-map)
- (cond
- ((and (not value)
- (eq (lookup-key evil-insert-state-map (kbd "C-w"))
- 'evil-delete-backward-word))
- (define-key evil-insert-state-map (kbd "C-w") 'evil-window-map))
- ((and value
- (eq (lookup-key evil-insert-state-map (kbd "C-w"))
- 'evil-window-map))
- (define-key evil-insert-state-map (kbd "C-w") 'evil-delete-backward-word))))))
-
-(defcustom evil-want-C-g-bindings nil
- "Whether `C-g' postfix can be used in bindings."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-want-C-w-in-emacs-state nil
- "Whether `C-w' prefixes windows commands in Emacs state."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (when (boundp 'evil-emacs-state-map)
- (cond
- ((and (not value)
- (eq (lookup-key evil-emacs-state-map (kbd "C-w"))
- 'evil-window-map))
- (define-key evil-emacs-state-map (kbd "C-w") nil))
- ((and value
- (not (lookup-key evil-emacs-state-map (kbd "C-w"))))
- (define-key evil-emacs-state-map (kbd "C-w") 'evil-window-map))))))
-
-(defcustom evil-want-change-word-to-end t
- "Whether `cw' behaves like `ce'."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-want-Y-yank-to-eol nil
- "Whether `Y' yanks to the end of the line.
-The default behavior is to yank the whole line, like Vim."
- :group 'evil
- :type 'boolean
- :initialize #'evil-custom-initialize-pending-reset
- :set #'(lambda (sym value)
- (set-default sym value)
- (evil-add-command-properties
- 'evil-yank-line
- :motion (if value
- 'evil-end-of-line-or-visual-line
- 'evil-line-or-visual-line))))
-
-(defcustom evil-disable-insert-state-bindings nil
- "Whether insert state bindings should be used.
-Bindings for escape, delete and `evil-toggle-key' are always
-available. If this is non-nil, default Emacs bindings are by and
-large accessible in insert state."
- :group 'evil
- :type 'boolean
- :initialize #'evil-custom-initialize-pending-reset
- :set #'(lambda (sym value)
- (set-default sym value)
- (evil-update-insert-state-bindings sym value)))
-
-(defcustom evil-echo-state t
- "Whether to signal the current state in the echo area."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-complete-all-buffers t
- "\\<evil-insert-state-map>
-Whether completion looks for matches in all buffers.
-This applies to \\[evil-complete-next] and \\[evil-complete-previous] \
-in insert state."
- :type 'boolean
- :group 'evil)
-
-(defvar dabbrev-search-these-buffers-only)
-(defvar dabbrev-case-distinction)
-(defcustom evil-complete-next-func
- #'(lambda (arg)
- (require 'dabbrev)
- (let ((dabbrev-search-these-buffers-only
- (unless evil-complete-all-buffers
- (list (current-buffer))))
- dabbrev-case-distinction)
- (condition-case nil
- (if (eq last-command this-command)
- (dabbrev-expand nil)
- (dabbrev-expand (- (abs (or arg 1)))))
- (error (dabbrev-expand nil)))))
- "Completion function used by \
-\\<evil-insert-state-map>\\[evil-complete-next]."
- :type 'function
- :group 'evil)
-
-(defcustom evil-complete-previous-func
- #'(lambda (arg)
- (require 'dabbrev)
- (let ((dabbrev-search-these-buffers-only
- (unless evil-complete-all-buffers
- (list (current-buffer))))
- dabbrev-case-distinction)
- (dabbrev-expand arg)))
- "Completion function used by \
-\\<evil-insert-state-map>\\[evil-complete-previous]."
- :type 'function
- :group 'evil)
-
-(defcustom evil-complete-next-minibuffer-func 'minibuffer-complete
- "Minibuffer completion function used by \
-\\<evil-insert-state-map>\\[evil-complete-next]."
- :type 'function
- :group 'evil)
-
-(defcustom evil-complete-previous-minibuffer-func 'minibuffer-complete
- "Minibuffer completion function used by \
-\\<evil-insert-state-map>\\[evil-complete-previous]."
- :type 'function
- :group 'evil)
-
-(defcustom evil-complete-next-line-func
- #'(lambda (arg)
- (let ((hippie-expand-try-functions-list
- '(try-expand-line
- try-expand-line-all-buffers)))
- (hippie-expand arg)))
- "Minibuffer completion function used by \
-\\<evil-insert-state-map>\\[evil-complete-next-line]."
- :type 'function
- :group 'evil)
-
-(defcustom evil-complete-previous-line-func
- evil-complete-next-line-func
- "Minibuffer completion function used by \
-\\<evil-insert-state-map>\\[evil-complete-previous-line]."
- :type 'function
- :group 'evil)
-
-(defcustom evil-lookup-func #'woman
- "Lookup function used by \
-\"\\<evil-motion-state-map>\\[evil-lookup]\"."
- :type 'function
- :group 'evil)
-
-(defcustom evil-toggle-key "C-z"
- "The key used to change to and from Emacs state.
-Must be readable by `read-kbd-macro'. For example: \"C-z\"."
- :type 'string
- :group 'evil
- :set #'(lambda (sym value)
- (evil-set-toggle-key value)
- (set-default sym value)))
-
-(defcustom evil-default-state 'normal
- "The default Evil state.
-This is the state a buffer starts in when it is not otherwise
-configured (see `evil-set-initial-state' and
-`evil-buffer-regexps'). The value may be one of `normal',
-`insert', `visual', `replace', `operator', `motion' and `emacs'."
- :type 'symbol
- :group 'evil)
-
-(defcustom evil-buffer-regexps
- '(("^ \\*load\\*" . nil))
- "Regular expressions determining the initial state for a buffer.
-Entries have the form (REGEXP . STATE), where REGEXP is a regular
-expression matching the buffer's name and STATE is one of `normal',
-`insert', `visual', `replace', `operator', `motion', `emacs' and
-`nil'. If STATE is `nil', Evil is disabled in the buffer."
- :type '(alist :key-type string :value-type symbol)
- :group 'evil)
-
-(defcustom evil-emacs-state-modes
- '(5x5-mode
- archive-mode
- bbdb-mode
- biblio-selection-mode
- blackbox-mode
- bookmark-bmenu-mode
- bookmark-edit-annotation-mode
- browse-kill-ring-mode
- bubbles-mode
- bzr-annotate-mode
- calc-mode
- cfw:calendar-mode
- completion-list-mode
- Custom-mode
- custom-theme-choose-mode
- debugger-mode
- delicious-search-mode
- desktop-menu-blist-mode
- desktop-menu-mode
- doc-view-mode
- dun-mode
- dvc-bookmarks-mode
- dvc-diff-mode
- dvc-info-buffer-mode
- dvc-log-buffer-mode
- dvc-revlist-mode
- dvc-revlog-mode
- dvc-status-mode
- dvc-tips-mode
- ediff-mode
- ediff-meta-mode
- efs-mode
- Electric-buffer-menu-mode
- emms-browser-mode
- emms-mark-mode
- emms-metaplaylist-mode
- emms-playlist-mode
- ess-help-mode
- etags-select-mode
- fj-mode
- gc-issues-mode
- gdb-breakpoints-mode
- gdb-disassembly-mode
- gdb-frames-mode
- gdb-locals-mode
- gdb-memory-mode
- gdb-registers-mode
- gdb-threads-mode
- gist-list-mode
- git-rebase-mode
- gnus-article-mode
- gnus-browse-mode
- gnus-group-mode
- gnus-server-mode
- gnus-summary-mode
- gomoku-mode
- google-maps-static-mode
- ibuffer-mode
- jde-javadoc-checker-report-mode
- magit-cherry-mode
- magit-diff-mode
- magit-log-mode
- magit-log-select-mode
- magit-popup-mode
- magit-popup-sequence-mode
- magit-process-mode
- magit-reflog-mode
- magit-refs-mode
- magit-revision-mode
- magit-stash-mode
- magit-stashes-mode
- magit-status-mode
- mh-folder-mode
- monky-mode
- mpuz-mode
- mu4e-main-mode
- mu4e-headers-mode
- mu4e-view-mode
- notmuch-hello-mode
- notmuch-search-mode
- notmuch-show-mode
- notmuch-tree-mode
- occur-mode
- org-agenda-mode
- package-menu-mode
- pdf-outline-buffer-mode
- pdf-view-mode
- proced-mode
- rcirc-mode
- rebase-mode
- recentf-dialog-mode
- reftex-select-bib-mode
- reftex-select-label-mode
- reftex-toc-mode
- sldb-mode
- slime-inspector-mode
- slime-thread-control-mode
- slime-xref-mode
- snake-mode
- solitaire-mode
- sr-buttons-mode
- sr-mode
- sr-tree-mode
- sr-virtual-mode
- tar-mode
- tetris-mode
- tla-annotate-mode
- tla-archive-list-mode
- tla-bconfig-mode
- tla-bookmarks-mode
- tla-branch-list-mode
- tla-browse-mode
- tla-category-list-mode
- tla-changelog-mode
- tla-follow-symlinks-mode
- tla-inventory-file-mode
- tla-inventory-mode
- tla-lint-mode
- tla-logs-mode
- tla-revision-list-mode
- tla-revlog-mode
- tla-tree-lint-mode
- tla-version-list-mode
- twittering-mode
- urlview-mode
- vc-annotate-mode
- vc-dir-mode
- vc-git-log-view-mode
- vc-hg-log-view-mode
- vc-svn-log-view-mode
- vm-mode
- vm-summary-mode
- w3m-mode
- wab-compilation-mode
- xgit-annotate-mode
- xgit-changelog-mode
- xgit-diff-mode
- xgit-revlog-mode
- xhg-annotate-mode
- xhg-log-mode
- xhg-mode
- xhg-mq-mode
- xhg-mq-sub-mode
- xhg-status-extra-mode)
- "Modes that should come up in Emacs state."
- :type '(repeat symbol)
- :group 'evil)
-
-(defcustom evil-insert-state-modes
- '(comint-mode
- erc-mode
- eshell-mode
- geiser-repl-mode
- gud-mode
- inferior-apl-mode
- inferior-caml-mode
- inferior-emacs-lisp-mode
- inferior-j-mode
- inferior-python-mode
- inferior-scheme-mode
- inferior-sml-mode
- internal-ange-ftp-mode
- prolog-inferior-mode
- reb-mode
- shell-mode
- slime-repl-mode
- term-mode
- wdired-mode)
- "Modes that should come up in Insert state."
- :type '(repeat symbol)
- :group 'evil)
-
-(defcustom evil-motion-state-modes
- '(apropos-mode
- Buffer-menu-mode
- calendar-mode
- color-theme-mode
- command-history-mode
- compilation-mode
- dictionary-mode
- ert-results-mode
- help-mode
- Info-mode
- Man-mode
- speedbar-mode
- undo-tree-visualizer-mode
- woman-mode)
- "Modes that should come up in Motion state."
- :type '(repeat symbol)
- :group 'evil)
-
-(defvar evil-pending-overriding-maps nil
- "An alist of pending overriding maps.")
-
-(defvar evil-pending-intercept-maps nil
- "An alist of pending intercept maps.")
-
-(defcustom evil-overriding-maps
- '((Buffer-menu-mode-map . nil)
- (color-theme-mode-map . nil)
- (comint-mode-map . nil)
- (compilation-mode-map . nil)
- (grep-mode-map . nil)
- (dictionary-mode-map . nil)
- (ert-results-mode-map . motion)
- (Info-mode-map . motion)
- (speedbar-key-map . nil)
- (speedbar-file-key-map . nil)
- (speedbar-buffers-key-map . nil))
- "Keymaps that should override Evil maps.
-Entries have the form (MAP-VAR . STATE), where MAP-VAR is
-a keymap variable and STATE is the state whose bindings
-should be overridden. If STATE is nil, all states are
-overridden."
- :type '(alist :key-type symbol :value-type symbol)
- :group 'evil
- :set #'(lambda (var values)
- (set-default var values)
- (evil-set-custom-state-maps 'evil-overriding-maps
- 'evil-pending-overriding-maps
- 'override-state
- 'evil-make-overriding-map
- values))
- :initialize 'evil-custom-initialize-pending-reset)
-
-(add-hook 'after-load-functions #'evil-update-pending-maps)
-
-(defcustom evil-intercept-maps
- '((edebug-mode-map . nil))
- "Keymaps that should intercept Evil maps.
-Entries have the form (MAP-VAR . STATE), where MAP-VAR is
-a keymap variable and STATE is the state whose bindings
-should be intercepted. If STATE is nil, all states are
-intercepted."
- :type '(alist :key-type symbol :value-type symbol)
- :group 'evil
- :set #'(lambda (var values)
- (set-default var values)
- (evil-set-custom-state-maps 'evil-intercept-maps
- 'evil-pending-intercept-maps
- 'intercept-state
- 'evil-make-intercept-map
- values))
- :initialize 'evil-custom-initialize-pending-reset)
-
-(defcustom evil-motions
- '(back-to-indentation
- backward-char
- backward-list
- backward-paragraph
- backward-sentence
- backward-sexp
- backward-up-list
- backward-word
- beginning-of-buffer
- beginning-of-defun
- beginning-of-line
- beginning-of-visual-line
- c-beginning-of-defun
- c-end-of-defun
- diff-file-next
- diff-file-prev
- diff-hunk-next
- diff-hunk-prev
- down-list
- end-of-buffer
- end-of-defun
- end-of-line
- end-of-visual-line
- exchange-point-and-mark
- forward-char
- forward-list
- forward-paragraph
- forward-sentence
- forward-sexp
- forward-word
- goto-last-change
- ibuffer-backward-line
- ibuffer-forward-line
- isearch-abort
- isearch-cancel
- isearch-complete
- isearch-del-char
- isearch-delete-char
- isearch-edit-string
- isearch-exit
- isearch-highlight-regexp
- isearch-occur
- isearch-other-control-char
- isearch-other-meta-char
- isearch-printing-char
- isearch-query-replace
- isearch-query-replace-regexp
- isearch-quote-char
- isearch-repeat-backward
- isearch-repeat-forward
- isearch-ring-advance
- isearch-ring-retreat
- isearch-toggle-case-fold
- isearch-toggle-input-method
- isearch-toggle-regexp
- isearch-toggle-specified-input-method
- isearch-toggle-word
- isearch-yank-char
- isearch-yank-kill
- isearch-yank-line
- isearch-yank-word-or-char
- keyboard-quit
- left-char
- left-word
- mouse-drag-region
- mouse-save-then-kill
- mouse-set-point
- mouse-set-region
- mwheel-scroll
- move-beginning-of-line
- move-end-of-line
- next-error
- next-line
- paredit-backward
- paredit-backward-down
- paredit-backward-up
- paredit-forward
- paredit-forward-down
- paredit-forward-up
- pop-global-mark
- pop-tag-mark
- pop-to-mark-command
- previous-error
- previous-line
- right-char
- right-word
- scroll-down
- scroll-down-command
- scroll-up
- scroll-up-command
- sgml-skip-tag-backward
- sgml-skip-tag-forward
- up-list)
- "Non-Evil commands to initialize to motions."
- :type '(repeat symbol)
- :group 'evil
- :set 'evil-set-custom-motions
- :initialize 'evil-custom-initialize-pending-reset)
-
-(defcustom evil-visual-newline-commands
- '(LaTeX-section
- TeX-font)
- "Commands excluding the trailing newline of a Visual Line selection.
-These commands work better without this newline."
- :type '(repeat symbol)
- :group 'evil
- :set 'evil-set-visual-newline-commands
- :initialize 'evil-custom-initialize-pending-reset)
-
-(defcustom evil-want-visual-char-semi-exclusive nil
- "Visual character selection to beginning/end of line is exclusive.
-If non nil then an inclusive visual character selection which
-ends at the beginning or end of a line is turned into an
-exclusive selection. Thus if the selected (inclusive) range ends
-at the beginning of a line it is changed to not include the first
-character of that line, and if the selected range ends at the end
-of a line it is changed to not include the newline character of
-that line."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-text-object-change-visual-type t
- "Text objects change the current visual state type.
-If non-nil then a text-object changes the type of the visual state to
-its default selection type (e.g. a word object always changes to
-charwise visual state). Otherwise the current visual state type is
-preserved."
- :type 'boolean
- :group 'evil)
-
-(defgroup evil-cjk nil
- "CJK support"
- :prefix "evil-cjk-"
- :group 'evil)
-
-(defcustom evil-cjk-emacs-word-boundary nil
- "Determine word boundary exactly the same way as Emacs does."
- :type 'boolean
- :group 'evil-cjk)
-
-(defcustom evil-cjk-word-separating-categories
- '(;; Kanji
- (?C . ?H) (?C . ?K) (?C . ?k) (?C . ?A) (?C . ?G)
- ;; Hiragana
- (?H . ?C) (?H . ?K) (?H . ?k) (?H . ?A) (?H . ?G)
- ;; Katakana
- (?K . ?C) (?K . ?H) (?K . ?k) (?K . ?A) (?K . ?G)
- ;; half-width Katakana
- (?k . ?C) (?k . ?H) (?k . ?K) ; (?k . ?A) (?k . ?G)
- ;; full-width alphanumeric
- (?A . ?C) (?A . ?H) (?A . ?K) ; (?A . ?k) (?A . ?G)
- ;; full-width Greek
- (?G . ?C) (?G . ?H) (?G . ?K) ; (?G . ?k) (?G . ?A)
- )
- "List of pair (cons) of categories to determine word boundary
-used in `evil-cjk-word-boundary-p'. See the documentation of
-`word-separating-categories'. Use `describe-categories' to see
-the list of categories."
- :type '(alist :key-type (choice character (const nil))
- :value-type (choice character (const nil)))
- :group 'evil-cjk)
-
-(defcustom evil-cjk-word-combining-categories
- '(;; default value in word-combining-categories
- (nil . ?^) (?^ . nil)
- ;; Roman
- (?r . ?k) (?r . ?A) (?r . ?G)
- ;; half-width Katakana
- (?k . ?r) (?k . ?A) (?k . ?G)
- ;; full-width alphanumeric
- (?A . ?r) (?A . ?k) (?A . ?G)
- ;; full-width Greek
- (?G . ?r) (?G . ?k) (?G . ?A)
- )
- "List of pair (cons) of categories to determine word boundary
-used in `evil-cjk-word-boundary-p'. See the documentation of
-`word-combining-categories'. Use `describe-categories' to see the
-list of categories."
- :type '(alist :key-type (choice character (const nil))
- :value-type (choice character (const nil)))
- :group 'evil-cjk)
-
-(defcustom evil-ex-complete-emacs-commands 'in-turn
- "TAB-completion for Emacs commands in ex command line.
-This variable determines when Emacs commands are considered for
-completion, always, never, or only if no Evil ex command is
-available for completion."
- :group 'evil
- :type '(radio (const :tag "Only if no ex-command." :value in-turn)
- (const :tag "Never" :value nil)
- (const :tag "Always" :value t)))
-
-(defface evil-ex-commands '(( nil
- :underline t
- :slant italic))
- "Face for the Evil command in completion in ex mode."
- :group 'evil)
-
-(defface evil-ex-info '(( ((supports :slant))
- :slant italic
- :foreground "red"))
- "Face for the info message in ex mode."
- :group 'evil)
-
-(defcustom evil-ex-visual-char-range nil
- "Type of default ex range in visual char state.
-If non-nil the default range when starting an ex command from
-character visual state is `<,`> otherwise it is '<,'>. In the
-first case the ex command will be passed a region covering only
-the visual selection. In the second case the passed region will
-be extended to contain full lines."
- :group 'evil
- :type 'boolean)
-
-;; Searching
-(defcustom evil-symbol-word-search nil
- "If nil then * and # search for words otherwise for symbols."
- :group 'evil
- :type 'boolean)
-(make-variable-buffer-local 'evil-symbol-word-search)
-
-(defcustom evil-magic t
- "Meaning which characters in a pattern are magic.
-The meaning of those values is the same as in Vim. Note that it
-only has influence if the Evil search module is chosen in
-`evil-search-module'."
- :group 'evil
- :type '(radio (const :tag "Very magic." :value very-magic)
- (const :tag "Magic" :value t)
- (const :tag "Nomagic" :value nil)
- (const :tag "Very nomagic" :value very-nomagic)))
-
-(defcustom evil-ex-search-vim-style-regexp nil
- "If non-nil Vim-style backslash codes are supported in search patterns.
-See `evil-transform-vim-style-regexp' for the supported backslash
-codes. Note that this only affects the search command if
-`evil-search-module' is set to 'evil-search. The isearch module
-always uses plain Emacs regular expressions."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-ex-interactive-search-highlight 'all-windows
- "Determine in which windows the interactive highlighting should be shown."
- :type '(radio (const :tag "All windows." all-windows)
- (const :tag "Selected window." selected-window)
- (const :tag "Disable highlighting." nil))
- :group 'evil)
-
-(defcustom evil-ex-search-persistent-highlight t
- "If non-nil matches remain highlighted when the search ends."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-ex-search-case 'smart
- "The case behaviour of the search command.
-Smart case means that the pattern is case sensitive if and only
-if it contains an upper case letter, otherwise it is case
-insensitive."
- :type '(radio (const :tag "Case sensitive." sensitive)
- (const :tag "Case insensitive." insensitive)
- (const :tag "Smart case." smart))
- :group 'evil)
-
-(defcustom evil-ex-substitute-case nil
- "The case behaviour of the search command.
-Smart case means that the pattern is case sensitive if and only
-if it contains an upper case letter, otherwise it is case
-insensitive. If nil then the setting of `evil-ex-search-case' is
-used."
- :type '(radio (const :tag "Same as interactive search." nil)
- (const :tag "Case sensitive." sensitive)
- (const :tag "Case insensitive." insensitive)
- (const :tag "Smart case." smart))
- :group 'evil)
-
-(defcustom evil-ex-search-interactive t
- "If t search is interactive."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-ex-search-highlight-all t
- "If t and interactive search is enabled, all matches are
-highlighted."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-ex-substitute-highlight-all t
- "If t all matches for the substitute pattern are highlighted."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-ex-substitute-interactive-replace t
- "If t and substitute patterns are highlighted,
-the replacement is shown interactively."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-ex-substitute-global nil
- "If non-nil substitute patterns are global by default.
-Usually (if this variable is nil) a substitution works only on
-the first match of a pattern in a line unless the 'g' flag is
-given, in which case the substitution happens on all matches in a
-line. If this option is non-nil, this behaviour is reversed: the
-substitution works on all matches unless the 'g' pattern is
-specified, then is works only on the first match."
- :type 'boolean
- :group 'evil)
-
-(defface evil-ex-search '((t :inherit isearch))
- "Face for interactive search."
- :group 'evil)
-
-(defface evil-ex-lazy-highlight '((t :inherit lazy-highlight))
- "Face for highlighting all matches in interactive search."
- :group 'evil)
-
-(defface evil-ex-substitute-matches '((t :inherit lazy-highlight))
- "Face for interactive substitute matches."
- :group 'evil)
-
-(defface evil-ex-substitute-replacement '((((supports :underline))
- :underline t
- :foreground "red"))
- "Face for interactive replacement text."
- :group 'evil)
-
-(defcustom evil-command-window-height 8
- "Height (in lines) of the command line window.
-Set to 0 to use the default height for `split-window'."
- :type 'integer
- :group 'evil)
-
-(defcustom evil-display-shell-error-in-message nil
- "Show error output of a shell command in the error buffer.
-If this variable is non-nil the error output of a shell command
-goes to the messages buffer instead of being mixed with the
-regular output. This happens only if the exit status of the
-command is non-zero."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-want-abbrev-expand-on-insert-exit t
- "If non-nil abbrevs will be expanded when leaving insert state
-like in Vim, if `abbrev-mode' is on."
- :type 'boolean
- :group 'evil)
-
-;;; Variables
-
-(defmacro evil-define-local-var (symbol &optional initvalue docstring)
- "Define SYMBOL as permanent buffer local variable, and return SYMBOL.
-The parameters are the same as for `defvar', but the variable
-SYMBOL is made permanent buffer local."
- (declare (indent defun)
- (doc-string 3)
- (debug (symbolp &optional form stringp)))
- `(progn
- (defvar ,symbol ,initvalue ,docstring)
- (make-variable-buffer-local ',symbol)
- (put ',symbol 'permanent-local t)))
-
-(evil-define-local-var evil-scroll-count 0
- "Holds last used prefix for `evil-scroll-up'
-and `evil-scroll-down'.
-Determines how many lines should be scrolled.
-Default value is 0 - scroll half the screen.")
-
-(evil-define-local-var evil-state nil
- "The current Evil state.
-To change the state, use `evil-change-state'
-or call the state function (e.g., `evil-normal-state').")
-
-;; these may be used inside `evil-define-state'
-(evil-define-local-var evil-next-state nil
- "The Evil state being switched to.")
-
-(evil-define-local-var evil-previous-state-alist nil
- "For Each evil state the Evil state being switched from.")
-
-(evil-define-local-var evil-previous-state nil
- "The Evil state being switched from.")
-
-(defvar evil-execute-in-emacs-state-buffer nil
- "The buffer of the latest `evil-execute-in-emacs-state'.
-When this command is being executed the current buffer is stored
-in this variable. This is necessary in case the Emacs-command to
-be called changes the current buffer.")
-
-(evil-define-local-var evil-mode-line-tag nil
- "Mode-Line indicator for the current state.")
-(put 'evil-mode-line-tag 'risky-local-variable t)
-
-(defvar evil-global-keymaps-alist nil
- "Association list of keymap variables.
-Entries have the form (MODE . KEYMAP), where KEYMAP
-is the variable containing the keymap for MODE.")
-
-(defvar evil-local-keymaps-alist nil
- "Association list of keymap variables that must be
-reinitialized in each buffer. Entries have the form
-\(MODE . KEYMAP), where KEYMAP is the variable containing
-the keymap for MODE.")
-
-(defvar evil-minor-mode-keymaps-alist nil
- "Association list of Evil states to minor-mode keymap alists.
-Entries have the form (STATE . MODE-MAP-ALIST), where
-MODE-MAP-ALIST is an alist taking the form of
-`minor-mode-map-alist'.")
-
-(defvar evil-state-properties nil
- "Specifications made by `evil-define-state'.
-Entries have the form (STATE . PLIST), where PLIST is a property
-list specifying various aspects of the state. To access a property,
-use `evil-state-property'.")
-
-(evil-define-local-var evil-mode-map-alist nil
- "Association list of keymaps to use for Evil modes.
-Elements have the form (MODE . KEYMAP), with the first keymaps
-having higher priority.")
-
-(defvar evil-command-properties nil
- "Specifications made by `evil-define-command'.")
-
-(defvar evil-change-commands '(evil-change)
- "Commands that wrap or replace `evil-change'.
-This list exists to apply an inconsistency with vim's change command
-to commands that wrap or redefine it. See emacs-evil/evil#916.")
-
-(defvar evil-transient-vars '(cua-mode transient-mark-mode select-active-regions)
- "List of variables pertaining to Transient Mark mode.")
-
-(defvar evil-transient-vals nil
- "Association list of old values for Transient Mark mode variables.
-Entries have the form (VARIABLE VALUE LOCAL), where LOCAL is
-whether the variable was previously buffer-local.")
-
-(evil-define-local-var evil-no-display nil
- "If non-nil, various Evil displays are inhibited.
-Use the macro `evil-without-display' to set this variable.")
-
-(defvar evil-type-properties nil
- "Specifications made by `evil-define-type'.
-Entries have the form (TYPE . PLIST), where PLIST is a property
-list specifying functions for handling the type: expanding it,
-describing it, etc.")
-
-(defvar evil-interactive-alist nil
- "Association list of Evil-specific interactive codes.")
-
-(evil-define-local-var evil-motion-marker nil
- "Marker for storing the starting position of a motion.")
-
-(evil-define-local-var evil-this-type nil
- "Current motion type.")
-
-(evil-define-local-var evil-this-type-modified nil
- "Non-nil iff current motion type has been modified by the user.
-If the type has been modified, this variable contains the new
-type.")
-
-(evil-define-local-var evil-this-register nil
- "Current register.")
-
-(defvar evil-this-macro nil
- "Current macro register.")
-
-(evil-define-local-var evil-this-operator nil
- "Current operator.")
-
-(evil-define-local-var evil-this-motion nil
- "Current motion.")
-
-(evil-define-local-var evil-this-motion-count nil
- "Current motion count.")
-
-(defvar evil-last-register nil
- "The last executed register.")
-
-(defvar evil-inhibit-operator nil
- "Inhibit current operator.
-If an operator calls a motion and the motion sets this variable
-to t, the operator code is not executed.")
-
-(defvar evil-inhibit-operator-value nil
- "This variable is used to transfer the value
-of `evil-inhibit-operator' from one local scope to another.")
-
-;; used by `evil-define-operator'
-(defvar evil-operator-range-beginning nil
- "Beginning of `evil-operator-range'.")
-
-(defvar evil-operator-range-end nil
- "End of `evil-operator-range'.")
-
-(defvar evil-operator-range-type nil
- "Type of `evil-operator-range'.")
-
-(defvar evil-operator-range-motion nil
- "Motion of `evil-operator-range'.")
-
-(defvar evil-restriction-stack nil
- "List of previous restrictions.
-Using `evil-with-restriction' stores the previous values of
-`point-min' and `point-max' as a pair in this list.")
-
-(evil-define-local-var evil-markers-alist
- '((?\( . evil-backward-sentence)
- (?\) . evil-forward-sentence)
- (?{ . evil-backward-paragraph)
- (?} . evil-forward-paragraph)
- (?' . evil-jump-backward-swap)
- (?` . evil-jump-backward-swap)
- (?< . evil-visual-beginning)
- (?> . evil-visual-goto-end)
- (?. . (lambda ()
- (let (last-command)
- (goto-last-change nil)))))
- "Association list for markers.
-Entries have the form (CHAR . DATA), where CHAR is the marker's
-name and DATA is either a marker object as returned by `make-marker',
-a variable, a movement function, or a cons cell (STRING NUMBER),
-where STRING is a file path and NUMBER is a buffer position.
-The global value of this variable holds markers available from
-every buffer, while the buffer-local value holds markers available
-only in the current buffer.")
-
-(defconst evil-suppress-map (make-keymap)
- "Full keymap disabling default bindings to `self-insert-command'.")
-(suppress-keymap evil-suppress-map t)
-
-(defvar evil-read-key-map (make-sparse-keymap)
- "Keymap active during `evil-read-key'.
-This keymap can be used to bind some commands during the
-execution of `evil-read-key' which is usually used to read a
-character argument for some commands, e.g. `evil-replace'.")
-
-;; TODO: customize size of ring
-(defvar evil-repeat-ring (make-ring 10)
- "A ring of repeat-informations to repeat the last command.")
-
-(defvar evil-repeat-types
- '((t . evil-repeat-keystrokes)
- (change . evil-repeat-changes)
- (motion . evil-repeat-motion)
- (insert-at-point . evil-repeat-insert-at-point)
- (ignore . nil))
- "An alist of defined repeat-types.")
-
-(defvar evil-recording-repeat nil
- "Whether we are recording a repeat.")
-
-(defvar evil-recording-current-command nil
- "Whether we are recording the current command for repeat.")
-
-(defvar evil-repeat-changes nil
- "Accumulated buffer changes for changed-based commands.")
-
-(defvar evil-repeat-info nil
- "Information accumulated during current repeat.")
-
-(defvar evil-repeat-buffer nil
- "The buffer in which the repeat started.
-If the buffer is changed, the repeat is cancelled.")
-
-(defvar evil-repeat-pos nil
- "The position of point at the beginning of an change-tracking
- editing command.")
-
-(defvar evil-repeat-keys nil
- "The keys that invoked the current command.")
-
-(defvar evil-last-repeat nil
- "Information about the latest repeat command.
-This is a list of three elements (POINT COUNT UNDO-POINTER),
-where POINT is the position of point before the latest repeat,
-COUNT the count-argument of the latest repeat command and
-UNDO-POINTER the head of the undo-list before the last command
-has been repeated.")
-
-(defvar evil-repeat-count nil
- "The explicit count when repeating a command.")
-
-(defvar evil-maybe-remove-spaces nil
- "Flag to determine if newly inserted spaces should be removed.
-See the function `evil-maybe-remove-spaces'.")
-
-(evil-define-local-var evil-insert-count nil
- "The explicit count passed to an command starting Insert state.")
-
-(evil-define-local-var evil-insert-vcount nil
- "The information about the number of following lines the
-insertion should be repeated. This is list (LINE COLUMN COUNT)
-where LINE is the line-number where the original insertion
-started and COLUMN is either a number or function determining the
-column where the repeated insertions should take place. COUNT is
-number of repeats (including the original insertion).")
-
-(defvar evil-insert-skip-empty-lines nil
- "Non-nil of the current insertion should not take place on
- lines at which the insertion point is behind the end of the
- line.")
-
-(evil-define-local-var evil-insert-lines nil
- "Non-nil if the current insertion command is a line-insertion
-command o or O.")
-
-(evil-define-local-var evil-insert-repeat-info nil
- "Repeat information accumulated during an insertion.")
-
-(evil-define-local-var evil-replace-alist nil
- "Association list of characters overwritten in Replace state.
-The format is (POS . CHAR).")
-
-(evil-define-local-var evil-echo-area-message nil
- "Previous value of `current-message'.")
-
-(defvar evil-write-echo-area nil
- "If set to t inside `evil-save-echo-area', then the echo area
-is not restored.")
-
-(defvar evil-last-find nil
- "A pair (FUNCTION . CHAR) describing the lastest character
- search command.")
-
-(defvar evil-last-paste nil
- "Information about the latest paste.
-This should be a list (CMD COUNT POINT BEG END FIRSTVISUAL) where
-CMD is the last paste-command (`evil-paste-before',
-`evil-paste-after' or `evil-visual-paste'), COUNT is the repeat
-count of the paste, POINT is the position of point before the
-paste, BEG end END are the region of the inserted
-text. FIRSTVISUAL is t if and only if the previous command was
-the first visual paste (i.e. before any paste-pop).")
-
-(evil-define-local-var evil-last-undo-entry nil
- "Information about the latest undo entry in the buffer.
-This should be a pair (OBJ . CONS) where OBJ is the entry as an
-object, and CONS is a copy of the entry.")
-
-(evil-define-local-var evil-current-insertion nil
- "Information about the latest insertion in insert state.
-This should be a pair (BEG . END) that describes the
-buffer-region of the newly inserted text.")
-
-(defvar evil-last-insertion nil
- "The last piece of inserted text.")
-
-(defvar evil-last-small-deletion nil
- "The last piece of deleted text.
-The text should be less than a line.")
-
-(defvar evil-was-yanked-without-register t
- "Whether text being saved to the numbered-register ring was
-not deleted and not yanked to a specific register.")
-
-(defvar evil-paste-count nil
- "The count argument of the current paste command.")
-
-(defvar evil-temporary-undo nil
- "When undo is disabled in current buffer.
-Certain commands depending on undo use this variable
-instead of `buffer-undo-list'.")
-
-(evil-define-local-var evil-undo-list-pointer nil
- "Everything up to this mark is united in the undo-list.")
-
-(defvar evil-in-single-undo nil
- "Set to non-nil if the current undo steps are connected.")
-
-(defvar evil-flash-timer nil
- "Timer for flashing search results.")
-
-(defvar evil-search-prompt nil
- "String to use for search prompt.")
-
-(defvar evil-search-forward-history nil
- "History of forward searches.")
-
-(defvar evil-search-backward-history nil
- "History of backward searches.")
-
-(defvar evil-inner-text-objects-map (make-sparse-keymap)
- "Keymap for inner text objects.")
-
-(defvar evil-outer-text-objects-map (make-sparse-keymap)
- "Keymap for outer text objects.")
-
-(defvar evil-window-map (make-sparse-keymap)
- "Keymap for window-related commands.")
-
-(evil-define-local-var evil-input-method nil
- "Input method used in Insert state and Emacs state.")
-
-;;; Visual state
-
-(evil-define-local-var evil-visual-beginning nil
- "The beginning of the Visual selection, a marker.")
-
-(evil-define-local-var evil-visual-end nil
- "The end of the Visual selection, a marker.")
-
-(evil-define-local-var evil-visual-point nil
- "The position of point in Visual state, a marker.")
-
-(evil-define-local-var evil-visual-mark nil
- "The position of mark in Visual state, a marker.")
-
-(evil-define-local-var evil-visual-previous-mark nil
- "The position of mark before Visual state, a marker.")
-
-(evil-define-local-var evil-visual-selection nil
- "The kind of Visual selection.
-This is a selection as defined by `evil-define-visual-selection'.")
-
-;; we could infer the direction by comparing `evil-visual-mark'
-;; and `evil-visual-point', but destructive operations may
-;; displace the markers
-(evil-define-local-var evil-visual-direction 0
- "Whether point follows mark in Visual state.
-Negative if point precedes mark, otherwise positive.
-See also the function `evil-visual-direction'.")
-
-(evil-define-local-var evil-visual-properties nil
- "Property list of miscellaneous Visual properties.")
-
-(evil-define-local-var evil-visual-region-expanded nil
- "Whether the region matches the Visual selection.
-That is, whether the positions of point and mark have been
-expanded to coincide with the selection's boundaries.
-This makes the selection available to functions acting
-on Emacs' region.")
-
-(evil-define-local-var evil-visual-overlay nil
- "Overlay for highlighting the Visual selection.
-Not used for blockwise selections, in which case
-see `evil-visual-block-overlays'.")
-
-(evil-define-local-var evil-visual-block-overlays nil
- "Overlays for Visual Block selection, one for each line.
-They are reused to minimize flicker.")
-
-(defvar evil-visual-alist nil
- "Association list of Visual selection functions.
-Elements have the form (NAME . FUNCTION).")
-
-(evil-define-local-var evil-visual-x-select-timer nil
- "Timer for updating the X selection in visual state.")
-
-(defvar evil-visual-x-select-timeout 0.1
- "Time in seconds for the update of the X selection.")
-
-(declare-function origami-open-all-nodes "ext:origami.el")
-(declare-function origami-close-all-nodes "ext:origami.el")
-(declare-function origami-toggle-node "ext:origami.el")
-(declare-function origami-open-node "ext:origami.el")
-(declare-function origami-open-node-recursively "ext:origami.el")
-(declare-function origami-close-node "ext:origami.el")
-
-(defvar evil-fold-list
- `(((vdiff-mode)
- :open-all vdiff-open-all-folds
- :close-all vdiff-close-all-folds
- :toggle ,(lambda () (call-interactively 'vdiff-toggle-fold))
- :open ,(lambda () (call-interactively 'vdiff-open-fold))
- :open-rec ,(lambda () (call-interactively 'vdiff-open-fold))
- :close ,(lambda () (call-interactively 'vdiff-close-fold)))
- ((vdiff-3way-mode)
- :open-all vdiff-open-all-folds
- :close-all vdiff-close-all-folds
- :toggle ,(lambda () (call-interactively 'vdiff-toggle-fold))
- :open ,(lambda () (call-interactively 'vdiff-open-fold))
- :open-rec ,(lambda () (call-interactively 'vdiff-open-fold))
- :close ,(lambda () (call-interactively 'vdiff-close-fold)))
- ((hs-minor-mode)
- :open-all hs-show-all
- :close-all hs-hide-all
- :toggle hs-toggle-hiding
- :open hs-show-block
- :open-rec nil
- :close hs-hide-block)
- ((hide-ifdef-mode)
- :open-all show-ifdefs
- :close-all hide-ifdefs
- :toggle nil
- :open show-ifdef-block
- :open-rec nil
- :close hide-ifdef-block)
- ((outline-mode
- outline-minor-mode
- org-mode
- markdown-mode)
- :open-all show-all
- :close-all ,(lambda ()
- (with-no-warnings (hide-sublevels 1)))
- :toggle outline-toggle-children
- :open ,(lambda ()
- (with-no-warnings
- (show-entry)
- (show-children)))
- :open-rec show-subtree
- :close hide-subtree)
- ((origami-mode)
- :open-all ,(lambda () (origami-open-all-nodes (current-buffer)))
- :close-all ,(lambda () (origami-close-all-nodes (current-buffer)))
- :toggle ,(lambda () (origami-toggle-node (current-buffer) (point)))
- :open ,(lambda () (origami-open-node (current-buffer) (point)))
- :open-rec ,(lambda () (origami-open-node-recursively (current-buffer) (point)))
- :close ,(lambda () (origami-close-node (current-buffer) (point)))))
- "Actions to be performed for various folding operations.
-
-The value should be a list of fold handlers, were a fold handler has
-the format:
-
- ((MODES) PROPERTIES)
-
-MODES acts as a predicate, containing the symbols of all major or
-minor modes for which the handler should match. For example:
-
- '((outline-minor-mode org-mode) ...)
-
-would match for either outline-minor-mode or org-mode, even though the
-former is a minor mode and the latter is a major.
-
-PROPERTIES specifies possible folding actions and the functions to be
-applied in the event of a match on one (or more) of the MODES; the
-supported properties are:
-
- - `:open-all'
- Open all folds.
- - `:close-all'
- Close all folds.
- - `:toggle'
- Toggle the display of the fold at point.
- - `:open'
- Open the fold at point.
- - `:open-rec'
- Open the fold at point recursively.
- - `:close'
- Close the fold at point.
-
-Each value must be a function. A value of `nil' will cause the action
-to be ignored for that respective handler. For example:
-
- `((org-mode)
- :close-all nil
- :open ,(lambda ()
- (show-entry)
- (show-children))
- :close hide-subtree)
-
-would ignore `:close-all' actions and invoke the provided functions on
-`:open' or `:close'.")
-
-;;; Ex
-
-(defvar evil-ex-map (make-sparse-keymap)
- "Keymap for Ex.
-Key sequences bound in this map are immediately executed.")
-
-(defvar evil-ex-completion-map (make-sparse-keymap)
- "Completion keymap for Ex.")
-
-(defvar evil-ex-initial-input nil
- "Additional initial content of the ex command line.
-This content of this variable is appended to the ex command line
-if ex is started interactively.")
-
-(defvar evil-ex-shell-argument-initialized nil
- "This variable is set to t if shell command completion has been initialized.
-See `evil-ex-init-shell-argument-completion'.")
-
-(defvar evil-ex-commands nil
- "Association list of command bindings and functions.")
-
-(defvar evil-ex-history nil
- "History of Ex commands.")
-
-(defvar evil-ex-current-buffer nil
- "The buffer from which Ex was started.")
-
-(defvar evil-ex-expression nil
- "The evaluation tree.")
-
-(defvar evil-ex-tree nil
- "The syntax tree.")
-
-(defvar evil-ex-command nil
- "The current Ex command.")
-
-(defvar evil-ex-previous-command nil
- "The previously executed Ex command.")
-
-(defvar evil-ex-cmd nil
- "The current Ex command string.")
-
-(defvar evil-ex-point nil
- "The position of `point' when the ex command has been called.")
-
-(defvar evil-ex-range nil
- "The current range of the Ex command.")
-
-(defvar evil-ex-bang nil
- "The \"!\" argument of the current Ex command.")
-
-(defvar evil-ex-argument nil
- "The current argument of the Ex command.")
-
-(defvar evil-ex-argument-handler nil
- "The argument handler for the current Ex command.")
-
-(defvar evil-ex-argument-types nil
- "Association list of argument handlers.")
-
-(defvar evil-previous-shell-command nil
- "The last shell command.")
-
-;; Searching
-(defvar evil-ex-search-history nil
- "The history for the search command.")
-
-(defvar evil-ex-search-direction nil
- "The direction of the current search, either 'forward or 'backward.")
-
-(defvar evil-ex-search-count nil
- "The count if the current search.")
-
-(defvar evil-ex-search-start-point nil
- "The point where the search started.")
-
-(defvar evil-ex-search-overlay nil
- "The overlay for the current search result.")
-
-(defvar evil-ex-search-pattern nil
- "The last search pattern.")
-
-(defvar evil-ex-search-offset nil
- "The last search offset.")
-
-(defvar evil-ex-search-match-beg nil
- "The beginning position of the last match.")
-
-(defvar evil-ex-search-match-end nil
- "The end position of the last match.")
-
-(defvar evil-ex-substitute-pattern nil
- "The last substitute pattern.")
-
-(defvar evil-ex-substitute-replacement nil
- "The last substitute replacement.")
-
-(defvar evil-ex-substitute-flags nil
- "The last substitute flags.")
-
-(defvar evil-ex-substitute-current-replacement nil
- "The actual replacement.")
-
-(defvar evil-ex-last-was-search nil
- "Non-nil if the previous was a search.
-Otherwise the previous command is assumed as substitute.")
-
-;;; Command line window
-
-(defvar evil-command-window-current-buffer nil
- "The buffer from which the command line window was called.")
-
-(evil-define-local-var evil-command-window-execute-fn nil
- "The command to execute when exiting the command line window.")
-
-(evil-define-local-var evil-command-window-cmd-key nil
- "The key for the command that opened the command line window (:, /, or ?).")
-
-;; The lazy-highlighting framework.
-(evil-define-local-var evil-ex-active-highlights-alist nil
- "An alist of currently active highlights.")
-
-(evil-define-local-var evil-ex-hl-update-timer nil
- "Time used for updating highlights.")
-
-(defvar evil-ex-search-keymap (make-sparse-keymap)
- "Keymap used in ex-search-mode.")
-(define-key evil-ex-search-keymap [escape] 'abort-recursive-edit)
-(set-keymap-parent evil-ex-search-keymap minibuffer-local-map)
-
-(defconst evil-version
- (eval-when-compile
- (with-temp-buffer
- (let ((dir (file-name-directory (or load-file-name
- byte-compile-current-file))))
- ;; git repository
- (if (and (file-exists-p (concat dir "/.git"))
- (ignore-errors
- (zerop (call-process "git" nil '(t nil) nil
- "rev-parse"
- "--short" "HEAD"))))
- (progn
- (goto-char (point-min))
- (concat "evil-git-"
- (buffer-substring (point-min)
- (line-end-position))))
- ;; no repo, use plain version
- "1.14.0"))))
- "The current version of Evil")
-
-(defcustom evil-want-integration t
- "Whether to load evil-integration.el.
-This variable must be set before Evil is loaded."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-want-keybinding t
- "Whether to load evil-keybindings.el.
-
-This loads a set of keybindings for evil in other modes as well as
-setting the initial evil state in those modes.
-
-This variable must be set before evil is loaded."
- :type 'boolean
- :group 'evil)
-
-(defcustom evil-want-minibuffer nil
- "Whether to enable Evil in minibuffer(s)."
- :type 'boolean
- :group 'evil
- :set #'(lambda (sym value)
- (set-default sym value)
- (if value
- (add-hook 'minibuffer-setup-hook 'evil-initialize)
- (remove-hook 'minibuffer-setup-hook 'evil-initialize))))
-
-(defun evil-version ()
- (interactive)
- (message "Evil version %s" evil-version))
-
-(provide 'evil-vars)
-
-;;; evil-vars.el ends here
diff --git a/elpa/evil-20200718.842/evil.el b/elpa/evil-20200718.842/evil.el
deleted file mode 100644
index 14d2b81..0000000
--- a/elpa/evil-20200718.842/evil.el
+++ /dev/null
@@ -1,151 +0,0 @@
-;;; evil.el --- extensible vi layer
-
-;; The following list of authors was kept up to date until the beginning of
-;; 2017, when evil moved under new maintainers. For authors since then, please
-;; consult the git logs.
-
-;; Alessandro Piras <laynor at gmail.com>
-;; Alexander Baier <alexander.baier at mailbox.org>
-;; Antono Vasiljev <antono.vasiljev at gmail.com>
-;; Bailey Ling <bling at live.ca>
-;; Barry O'Reilly <gundaetiapo at gmail.com>
-;; Christoph Lange <langec at web.de>
-;; Daniel Reiter <danieltreiter at gmail.com>
-;; Eivind Fonn <evfonn at gmail.com>
-;; Emanuel Evans <emanuel.evans at gmail.com>
-;; Eric Siegel <siegel.eric at gmail.com>
-;; Eugene Yaremenko <w3techplayground at gmail.com>
-;; Frank Fischer <frank-fischer at shadow-soft.de>
-;; Frank Terbeck <ft at bewatermyfriend.org>
-;; Gordon Gustafson <gordon3.14 at gmail.com>
-;; Herbert Jones <jones.herbert at gmail.com>
-;; Jonas Bernoulli <jonas at bernoul.li>
-;; Jonathan Claggett <jclaggett at lonocloud.com>
-;; José A. Romero L. <escherdragon at gmail.com>
-;; Justin Burkett <justin at burkett.cc>
-;; Lars Andersen <expez at expez.com>
-;; Lintaro Ina <tarao.gnn at gmail.com>
-;; Lukasz Wrzosek <wrzoski at mail.com>
-;; Marian Schubert <maio at netsafe.cz>
-;; Matthew Malcomson <>
-;; Michael Markert <markert.michael at googlemail.com>
-;; Mike Gerwitz <mikegerwitz at gnu.org>
-;; Nikolai Weibull <now at bitwi.se>
-;; phaebz <phaebz at gmail.com>
-;; ralesi <scio62 at gmail.com>
-;; Rodrigo Setti <rodrigosetti at gmail.com>
-;; Sanel Zukan <sanelz at gmail.com>
-;; Sarah Brofeldt <sarah at thinkmonster.(none)>
-;; Simon Hafner <hafnersimon at gmail.com>
-;; Stefan Wehr <mail at stefanwehr.de>
-;; Sune Simonsen <sune.simonsen at jayway.com>
-;; Thomas Hisch <thomas at opentech.at>
-;; Tim Harper <timcharper at gmail.com>
-;; Tom Willemse <tom at ryuslash.org>
-;; Trevor Murphy <trevor.m.murphy at gmail.com>
-;; Ulrich Müller <ulm at gentoo.org>
-;; Vasilij Schneidermann <v.schneidermann at gmail.com>
-;; Vegard Øye <vegard_oye at hotmail.com>
-;; Winfred Lu <winfred.lu at gmail.com>
-;; Wolfgang Jenkner <wjenkner at inode.at>
-;; Xiao Hanyu <xiaohanyu1988 at gmail.com>
-;; York Zhao <yzhao at telecor.com>
-
-;; Maintainers: The emacs-evil team. <https://github.com/orgs/emacs-evil/people>
-;; To get in touch, please use the bug tracker or the
-;; mailing list (see below).
-;; Created: 2011-03-01
-;; Version: 1.14.0
-;; Keywords: emulation, vim
-;; URL: https://github.com/emacs-evil/evil
-;; Repository: https://github.com/emacs-evil/evil.git
-;; EmacsWiki: http://www.emacswiki.org/emacs/Evil
-;; Bug tracker: https://github.com/emacs-evil/evil/issues
-;; If you have bug reports, suggestions or patches, please
-;; create an issue at the bug tracker (open for everyone).
-;; Other discussions (tips, extensions) go to the mailing list.
-;; Mailing list: <implementations-list at lists.ourproject.org>
-;; Subscribe: http://tinyurl.com/implementations-list
-;; Newsgroup: nntp://news.gmane.org/gmane.emacs.vim-emulation
-;; Archives: http://dir.gmane.org/gmane.emacs.vim-emulation
-;; You don't have to subscribe to post; we usually reply
-;; within a few days and CC our replies back to you.
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Evil is an extensible vi layer for Emacs. It emulates the main
-;; features of Vim, and provides facilities for writing custom
-;; extensions.
-;;
-;; Evil lives in a Git repository. To obtain Evil, do
-;;
-;; git clone git://github.com/emacs-evil/evil.git
-;;
-;; Move Evil to ~/.emacs.d/evil (or somewhere else in the `load-path').
-;; Then add the following lines to ~/.emacs:
-;;
-;; (add-to-list 'load-path "~/.emacs.d/evil")
-;; (require 'evil)
-;; (evil-mode 1)
-;;
-;; Evil requires undo-tree.el for linear undo and undo branches:
-;;
-;; http://www.emacswiki.org/emacs/UndoTree
-;;
-;; Otherwise, Evil uses regular Emacs undo.
-;;
-;; Evil requires `goto-last-change' and `goto-last-change-reverse'
-;; function for the corresponding motions g; g, as well as the
-;; last-change-register `.'. One package providing these functions is
-;; goto-chg.el:
-;;
-;; http://www.emacswiki.org/emacs/GotoChg
-;;
-;; Without this package the corresponding motions will raise an error.
-
-;;; Code:
-
-(require 'evil-vars)
-(require 'evil-common)
-(require 'evil-core)
-(require 'evil-states)
-(require 'evil-repeat)
-(require 'evil-macros)
-(require 'evil-search)
-(require 'evil-ex)
-(require 'evil-digraphs)
-(require 'evil-types)
-(require 'evil-commands)
-(require 'evil-jumps)
-(require 'evil-maps)
-
-(when evil-want-integration
- (require 'evil-integration))
-
-(when evil-want-keybinding
- (require 'evil-keybindings))
-
-(run-hooks 'evil-after-load-hook)
-
-(provide 'evil)
-
-;;; evil.el ends here
diff --git a/elpa/evil-20200718.842/evil.info b/elpa/evil-20200718.842/evil.info
deleted file mode 100644
index 3b8b1b5..0000000
--- a/elpa/evil-20200718.842/evil.info
+++ /dev/null
@@ -1,2168 +0,0 @@
-This is evil.info, produced by makeinfo version 6.5 from evil.texi.
-
- Evil 1.14.0, Mar 04, 2020
-
- Eivind Fonn, Frank Fischer, Vegard Øye
-
- Copyright © 2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* evil: (evil.info). Extensible vi layer for Emacs
-END-INFO-DIR-ENTRY
-
-
- Generated by Sphinx 2.4.3.
-
-
-File: evil.info, Node: Top, Next: Overview, Up: (dir)
-
-Evil documentation
-******************
-
- Evil 1.14.0, Mar 04, 2020
-
- Eivind Fonn, Frank Fischer, Vegard Øye
-
- Copyright © 2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye
-
-* Menu:
-
-* Overview::
-* Settings::
-* Keymaps::
-* Hooks::
-* Extension::
-* Frequently Asked Questions::
-* Internals::
-* The GNU Free Documentation License::
-* Emacs lisp functions and variables::
-
- — The Detailed Node Listing —
-
-Overview
-
-* Installation via package.el: Installation via package el.
-* Manual installation::
-* Modes and states::
-
-Settings
-
-* The initial state::
-* Keybindings and other behaviour::
-* Search::
-* Indentation::
-* Cursor movement::
-* Cursor display::
-* Window management::
-* Parenthesis highlighting::
-* Miscellaneous::
-
-Keymaps
-
-* evil-define-key::
-* Leader keys::
-
-Extension
-
-* Motions::
-* Operators::
-* Text objects::
-* Range types::
-* States::
-
-Frequently Asked Questions
-
-* Problems with the escape key in the terminal::
-* Underscore is not a word character::
-
-Internals
-
-* Command properties::
-
-
-
-File: evil.info, Node: Overview, Next: Settings, Prev: Top, Up: Top
-
-1 Overview
-**********
-
-Evil is an extensible vi layer for Emacs. It emulates the main features
-of Vim, (1) turning Emacs into a modal editor. Like Emacs in general,
-Evil is extensible in Emacs Lisp.
-
-* Menu:
-
-* Installation via package.el: Installation via package el.
-* Manual installation::
-* Modes and states::
-
- ---------- Footnotes ----------
-
- (1) (1) Vim is the most popular version of `vi', a modal text editor
-with many implementations. Vim also adds some functions of its own,
-like visual selection and text objects. For more information see the
-official Vim website (https://vim.org).
-
-
-File: evil.info, Node: Installation via package el, Next: Manual installation, Up: Overview
-
-1.1 Installation via package.el
-===============================
-
-Evil is available as a package from MELPA stable and MELPA unstable.
-This is the recommended way of installing Evil.
-
-To set up ‘package.el’ to work with one of these repositories, you can
-follow the instructions on melpa.org(1).
-
-Once that is done, you can execute the following commands:
-
- M-x package-refresh-contents
- M-x package-install RET evil RET
-
-Finally, add the following lines to your Emacs init file:
-
- (require 'evil)
- (evil-mode 1)
-
- ---------- Footnotes ----------
-
- (1) https://melpa.org/#/getting-started
-
-
-File: evil.info, Node: Manual installation, Next: Modes and states, Prev: Installation via package el, Up: Overview
-
-1.2 Manual installation
-=======================
-
-First, install ‘undo-tree’, ‘goto-chg’ and ‘cl-lib’. If you have an
-Emacs version of 24.3 or newer, you should already have ‘cl-lib’.
-
-Evil lives in a git repository. To download Evil, do:
-
- git clone --depth 1 https://github.com/emacs-evil/evil.git
-
-Then add the following lines to your Emacs init file:
-
- (add-to-list 'load-path "path/to/evil")
- (require 'evil)
- (evil-mode 1)
-
-Ensure that your replace ‘path/to/evil’ with the actual path to where
-you cloned Evil.
-
-
-File: evil.info, Node: Modes and states, Prev: Manual installation, Up: Overview
-
-1.3 Modes and states
-====================
-
-The next time Emacs is started, it will come up in `normal state',
-denoted by ‘<N>’ in the mode line. This is where the main vi bindings
-are defined. Note that you can always disable normal state with ‘C-z’,
-which switches to an “Emacs state” (denoted by ‘<E>’) in which vi keys
-are completely disabled. Press ‘C-z’ again to switch back to normal
-state.
-
-state
-
- Evil uses the term `state' for what is called a “mode” in regular
- vi usage, because `modes' are understood in Emacs terms to mean
- something else.
-
-Evil defines a number of states by default:
-
-normal state (‘<N>’)
-
- This is the default “resting state” of Evil, in which the main body
- of vi bindings are defined.
-
-insert state (‘<I>’)
-
- This is the state for insertion of text, where non-modified keys
- will insert the corresponding character in the buffer.
-
-visual state (‘<V>’)
-
- A state for selecting text regions. Motions are available for
- modifying the selected region, and operators are available for
- acting on it.
-
-replace state (‘<R>’)
-
- A special state mostly similar to insert state, except it replaces
- text instead of inserting.
-
-operator-pending state (‘<O>’)
-
- A special state entered after launching an operator, but before
- specifying the corresponding motion or text object.
-
-motion state (‘<M>’)
-
- A special state useful for buffers that are read-only, where
- motions are available but editing operations are not.
-
-Emacs state (‘<E>’)
-
- A state that as closely as possible mimics default Emacs behaviour,
- by eliminating all vi bindings, except for ‘C-z’, to re-enter
- normal state.
-
-
-File: evil.info, Node: Settings, Next: Keymaps, Prev: Overview, Up: Top
-
-2 Settings
-**********
-
-Evil’s behaviour can be adjusted by setting some variables. The list of
-all available variables and their current values can be inspected by
-doing:
-
- M-x customize-group RET evil RET
-
-To change the value of a variable, you can use this interface, or add a
-‘setq’ form to your Emacs init file, preferably before Evil is loaded.
-(1)
-
- (setq evil-shift-width 0)
- ;; Load Evil
- (require 'evil)
-
-What follows is a non-exhaustive list of the most relevant customization
-options.
-
-* Menu:
-
-* The initial state::
-* Keybindings and other behaviour::
-* Search::
-* Indentation::
-* Cursor movement::
-* Cursor display::
-* Window management::
-* Parenthesis highlighting::
-* Miscellaneous::
-
- ---------- Footnotes ----------
-
- (1) (1) Strictly speaking, the order only matters if the variable
-affects the way Evil is loaded. This is the case with some variables.
-
-
-File: evil.info, Node: The initial state, Next: Keybindings and other behaviour, Up: Settings
-
-2.1 The initial state
-=====================
-
-The initial state of a buffer is determined by its major mode. Evil
-maintains an association between major modes and their corresponding
-states, which is most easily modified using the function *note
-evil-set-initial-state: 2f.
-
- -- Emacs Lisp Autofunction: (evil-set-initial-state MODE STATE)
-
- Set the initial state for major mode `MODE' to `STATE'. This is the
- state the buffer comes up in.
-
-If no state can be found, Evil uses the default initial state.
-
- -- Emacs Lisp Autovariable: evil-default-state
-
- The default Evil state. This is the state a buffer starts in when
- it is not otherwise configured (see *note evil-set-initial-state:
- 2f. and *note evil-buffer-regexps: 5.). The value may be one of
- ‘normal’, ‘insert’, ‘visual’, ‘replace’, ‘operator’, ‘motion’ and
- ‘emacs’.
-
- Default: ‘normal’
-
-Alternatively, it is possible to select the initial state based on the
-buffer `name' rather than its major mode. This is checked first, so it
-takes precedence over the other methods for setting the state.
-
- -- Emacs Lisp Autovariable: evil-buffer-regexps
-
- Regular expressions determining the initial state for a buffer.
- Entries have the form ‘(REGEXP . STATE)’, where `REGEXP' is a
- regular expression matching the buffer’s name and `STATE' is one of
- ‘normal’, ‘insert’, ‘visual’, ‘replace’, ‘operator’, ‘motion’,
- ‘emacs’ and ‘nil’. If `STATE' is ‘nil’, Evil is disabled in the
- buffer.
-
- Default: ‘(("^ \\*load\\*"))’
-
-
-File: evil.info, Node: Keybindings and other behaviour, Next: Search, Prev: The initial state, Up: Settings
-
-2.2 Keybindings and other behaviour
-===================================
-
-Evil comes with a rich system for modifying its key bindings *note
-Keymaps: 4b. For the most common tweaks, the following variables are
-available.
-
- -- Emacs Lisp Autovariable: evil-toggle-key
-
- The key used to change to and from Emacs state. Must be readable
- by ‘read-kbd-macro’. For example: “C-z”.
-
- Default: ‘"C-z"’
-
- -- Emacs Lisp Autovariable: evil-want-C-i-jump
-
- Whether ‘C-i’ jumps forward in the jump list (like Vim).
- Otherwise, ‘C-i’ inserts a tab character.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-want-C-u-delete
-
- Whether ‘C-u’ deletes back to indentation in insert state.
- Otherwise, ‘C-u’ applies a prefix argument. The binding of ‘C-u’
- mirrors Emacs behaviour by default due to the relative ubiquity of
- prefix arguments.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-want-C-u-scroll
-
- Whether ‘C-u’ scrolls up (like Vim). Otherwise, ‘C-u’ applies a
- prefix argument. The binding of ‘C-u’ mirrors Emacs behaviour by
- default due to the relative ubiquity of prefix arguments.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-want-C-d-scroll
-
- Whether ‘C-d’ scrolls down (like Vim).
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-want-C-w-delete
-
- Whether ‘C-w’ deletes a word in Insert state.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-want-C-w-in-emacs-state
-
- Whether ‘C-w’ prefixes windows commands in Emacs state.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-want-Y-yank-to-eol
-
- Whether ‘Y’ yanks to the end of the line. The default behavior is
- to yank the whole line, like Vim.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-disable-insert-state-bindings
-
- Whether insert state bindings should be used. Bindings for escape,
- delete and *note evil-toggle-key: 35. are always available. If
- this is non-nil, default Emacs bindings are by and large accessible
- in insert state.
-
- Default: ‘nil’
-
-
-File: evil.info, Node: Search, Next: Indentation, Prev: Keybindings and other behaviour, Up: Settings
-
-2.3 Search
-==========
-
- -- Emacs Lisp Autovariable: evil-regexp-search
-
- Whether to use regular expressions for searching in ‘/’ and ‘?’.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-search-wrap
-
- Whether search with ‘/’ and ‘?’ wraps around the buffer. If this
- is non-nil, search stops at the buffer boundaries.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-flash-delay
-
- Time in seconds to flash search matches after ‘n’ and ‘N’.
-
- Default: ‘2’
-
- -- Emacs Lisp Autovariable: evil-ex-hl-update-delay
-
- Time in seconds of idle before updating search highlighting.
- Setting this to a period shorter than that of keyboard’s repeat
- rate allows highlights to update while scrolling.
-
- Default: ‘0.02’
-
-
-File: evil.info, Node: Indentation, Next: Cursor movement, Prev: Search, Up: Settings
-
-2.4 Indentation
-===============
-
- -- Emacs Lisp Autovariable: evil-auto-indent
-
- Whether to auto-indent when opening lines with ‘o’ and ‘O’.
-
- Default: ‘t’, buffer-local
-
- -- Emacs Lisp Autovariable: evil-shift-width
-
- The number of columns by which a line is shifted. This applies to
- the shifting operators ‘>’ and ‘<’.
-
- Default: ‘4’, buffer-local
-
- -- Emacs Lisp Autovariable: evil-shift-round
-
- Whether shifting rounds to the nearest multiple. If non-nil, ‘>’
- and ‘<’ adjust line indentation to the nearest multiple of *note
- evil-shift-width: 32.
-
- Default: ‘t’, buffer-local
-
- -- Emacs Lisp Autovariable: evil-indent-convert-tabs
-
- If non-nil, the ‘=’ operator converts between leading tabs and
- spaces. Whether tabs are converted to spaces or vice versa depends
- on the value of ‘indent-tabs-mode’.
-
- Default: ‘t’
-
-
-File: evil.info, Node: Cursor movement, Next: Cursor display, Prev: Indentation, Up: Settings
-
-2.5 Cursor movement
-===================
-
-In standard Emacs terms, the cursor is generally understood to be
-located between two characters. In Vim, and therefore also Evil, this
-is the case in insert state, but in other states the cursor is
-understood to be `on' a character, and that this character is not a
-newline.
-
-Forcing this behaviour in Emacs is the source of some potentially
-surprising results (especially for traditional Emacs users—users used to
-Vim may find the default behavior to their satisfaction). Many of them
-can be tweaked using the following variables.
-
- -- Emacs Lisp Autovariable: evil-repeat-move-cursor
-
- Whether repeating commands with ‘.’ may move the cursor. If nil,
- the original cursor position is preserved, even if the command
- normally would have moved the cursor.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-move-cursor-back
-
- Whether the cursor is moved backwards when exiting insert state.
- If non-nil, the cursor moves “backwards” when exiting insert state,
- so that it ends up on the character to the left. Otherwise it
- remains in place, on the character to the right.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-move-beyond-eol
-
- Whether the cursor can move past the end of the line. If non-nil,
- the cursor is allowed to move one character past the end of the
- line, as in Emacs.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-cross-lines
-
- Whether horizontal motions may move to other lines. If non-nil,
- certain motions that conventionally operate in a single line may
- move the cursor to other lines. Otherwise, they are restricted to
- the current line. This applies to ‘h’, ‘SPC’, ‘f’, ‘F’, ‘t’, ‘T’,
- ‘~’.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-respect-visual-line-mode
-
- Whether movement commands respect ‘visual-line-mode’. If non-nil,
- ‘visual-line-mode’ is generally respected when it is on. In this
- case, motions such as ‘j’ and ‘k’ navigate by visual lines (on the
- screen) rather than “physical” lines (defined by newline
- characters). If nil, the setting of ‘visual-line-mode’ is ignored.
-
- This variable must be set before Evil is loaded.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-track-eol
-
- Whether ‘$’ “sticks” the cursor to the end of the line. If
- non-nil, vertical motions after ‘$’ maintain the cursor at the end
- of the line, even if the target line is longer. This is analogous
- to ‘track-eol’, but respects Evil’s interpretation of end-of-line.
-
- Default: ‘t’
-
-
-File: evil.info, Node: Cursor display, Next: Window management, Prev: Cursor movement, Up: Settings
-
-2.6 Cursor display
-==================
-
-A state may change the appearance of the cursor. Use the variable *note
-evil-default-cursor: c. to set the default cursor, and the variables
-‘evil-normal-state-cursor’, ‘evil-insert-state-cursor’ etc. to set the
-cursors for specific states. The acceptable values for all of them are
-the same.
-
- -- Emacs Lisp Autovariable: evil-default-cursor
-
- The default cursor. May be a cursor type as per ‘cursor-type’, a
- color string as passed to ‘set-cursor-color’, a zero-argument
- function for changing the cursor, or a list of the above.
-
- Default: ‘t’
-
-
-File: evil.info, Node: Window management, Next: Parenthesis highlighting, Prev: Cursor display, Up: Settings
-
-2.7 Window management
-=====================
-
- -- Emacs Lisp Autovariable: evil-auto-balance-windows
-
- If non-nil window creation and deletion trigger rebalancing.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-split-window-below
-
- If non-nil split windows are created below.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-vsplit-window-right
-
- If non-nil vertically split windows with are created to the right.
-
- Default: ‘nil’
-
-
-File: evil.info, Node: Parenthesis highlighting, Next: Miscellaneous, Prev: Window management, Up: Settings
-
-2.8 Parenthesis highlighting
-============================
-
-These settings concern the integration between Evil and
-‘show-paren-mode’. They take no effect if this mode is not enabled.
-
- -- Emacs Lisp Autovariable: evil-show-paren-range
-
- The minimal distance between point and a parenthesis which causes
- the parenthesis to be highlighted.
-
- Default: ‘0’
-
- -- Emacs Lisp Autovariable:
- evil-highlight-closing-paren-at-point-states
-
- The states in which the closing parenthesis at point should be
- highlighted. All states listed here highlight the closing
- parenthesis at point (which is Vim’s default behavior). All others
- highlight the parenthesis before point (which is Emacs default
- behavior). If this list contains the symbol ‘not’ then its meaning
- is inverted, i.e. all states listed here highlight the closing
- parenthesis before point.
-
- Default: ‘(not emacs insert replace)’
-
-
-File: evil.info, Node: Miscellaneous, Prev: Parenthesis highlighting, Up: Settings
-
-2.9 Miscellaneous
-=================
-
- -- Emacs Lisp Autovariable: evil-want-fine-undo
-
- Whether actions are undone in several steps. There are two
- possible choices: nil (“no”) means that all changes made during
- insert state, including a possible delete after a change operation,
- are collected in a single undo step. Non-nil (“yes”) means that
- undo steps are determined according to Emacs heuristics, and no
- attempt is made to aggregate changes.
-
- For backward compatibility purposes, the value ‘fine’ is
- interpreted as ‘nil’. This option was removed because it did not
- work consistently.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-backspace-join-lines
-
- Whether backward delete in insert state may join lines.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-kbd-macro-suppress-motion-error
-
- Whether left/right motions signal errors in keyboard macros. This
- variable only affects beginning-of-line or end-of-line errors
- regarding the motions ‘h’ and ‘SPC’ respectively. This may be
- desired since such errors cause macro definition or execution to be
- terminated. There are four possibilities:
-
- - ‘record’: errors are suppressed when recording macros, but not
- when replaying them.
-
- - ‘replay’: errors are suppressed when replaying macros, but not
- when recording them.
-
- - ‘t’: errors are suppressed in both cases.
-
- - ‘nil’: errors are never suppressed.
-
- Default: ‘nil’
-
- -- Emacs Lisp Autovariable: evil-mode-line-format
-
- The position of the state tag in the mode line. If set to ‘before’
- or ‘after’, the tag is placed at the beginning or the end of the
- mode-line, respectively. If nil, there is no tag. Otherwise it
- should be a cons cell ‘(WHERE . WHICH)’, where `WHERE' is either
- ‘before’ or ‘after’, and `WHICH' is a symbol in ‘mode-line-format’.
- The tag is then placed before or after that symbol, respectively.
-
- Default: ‘before’
-
- -- Emacs Lisp Autovariable: evil-mouse-word
-
- The `thing-at-point' symbol for double click selection. The
- double-click starts visual state in a special word selection mode.
- This symbol is used to determine the words to be selected.
- Possible values are ‘evil-word’ or ‘evil-WORD’.
-
- Default: ‘evil-word’
-
- -- Emacs Lisp Autovariable: evil-bigword
-
- The set of characters to be interpreted as WORD boundaries. This
- is enclosed with square brackets and used as a regular expression.
- By default, whitespace characters are considered WORD boundaries.
-
- Default: ‘"^ \t\r\n"’, buffer-local
-
- -- Emacs Lisp Autovariable: evil-esc-delay
-
- The time, in seconds, to wait for another key after escape. If no
- further event arrives during this time, the event is translated to
- ‘ESC’. Otherwise, it is translated according to
- ‘input-decode-map’. This does not apply in Emacs state, and may
- also be inhibited by setting ‘evil-inhibit-esc’.
-
- Default: ‘0.01’
-
- -- Emacs Lisp Autovariable: evil-intercept-esc
-
- Whether Evil should intercept the escape key. In the terminal,
- escape and a meta key sequence both generate the same event. In
- order to distingush these, Evil uses ‘input-decode-map’. It is not
- necessary to do this in a graphical Emacs session. However, if you
- prefer to use ‘C-[’ as escape (which is identical to the terminal
- escape key code), this interception must also happen in graphical
- Emacs sessions. Set this variable to ‘always’, t (only in the
- terminal) or nil (never intercept).
-
- Default: ‘always’
-
- -- Emacs Lisp Autovariable: evil-kill-on-visual-paste
-
- Whether pasting in visual state adds the replaced text to the kill
- ring, making it the default for the next paste. The default,
- replicates the default Vim behavior.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-echo-state
-
- Whether to signal the current state in the echo area.
-
- Default: ‘t’
-
- -- Emacs Lisp Autovariable: evil-complete-all-buffers
-
- Whether completion looks for matches in all buffers. This applies
- to ‘C-n’ and ‘C-p’ in insert state.
-
- Default: ‘t’
-
-
-File: evil.info, Node: Keymaps, Next: Hooks, Prev: Settings, Up: Top
-
-3 Keymaps
-*********
-
-Evil’s key bindings are stored in a number of different keymaps. Each
-state has a `global keymap', where the default bindings for that state
-are stored. They are named ‘evil-normal-state-map’,
-‘evil-insert-state-map’, and so on. The bindings in these maps are
-visible in all buffers currently in the corresponding state.
-
-These keymaps function like ordinary Emacs keymaps and may be modified
-using the Emacs function ‘define-key’:
-
- (define-key evil-normal-state-map (kbd "w") 'some-function)
-
-This binds the key ‘w’ to the command ‘some-function’ in normal state.
-The use of ‘kbd’ is optional for simple key sequences, like this one,
-but recommended in general.
-
-Most of Evil’s bindings are defined in the file ‘evil-maps.el’.
-
-To facilitate shared keybindings between states, some states may
-activate keybindings from other states as well. For example, motion
-state bindings are visible in normal and visual state, and normal state
-bindings are also visible in visual state.
-
-Each state also has a `buffer-local keymap' which is specific to the
-current buffer, and which takes precedence over the global keymap.
-These maps are most suitably modified by a mode hook. They are named
-‘evil-normal-state-local-map’, ‘evil-insert-state-local-map’, and so on.
-
- (add-hook 'some-mode-hook
- (lambda ()
- (define-key evil-normal-state-local-map
- (kbd "w") 'some-function)))
-
-For convenience, the functions *note evil-global-set-key: 1c. and *note
-evil-local-set-key: 22. are available for setting global and local state
-keys.
-
- -- Emacs Lisp Autofunction: (evil-global-set-key STATE KEY DEF)
-
- Bind `KEY' to `DEF' in `STATE'.
-
- -- Emacs Lisp Autofunction: (evil-local-set-key STATE KEY DEF)
-
- Bind `KEY' to `DEF' in `STATE' in the current buffer.
-
-The above examples could therefore have been written as follows:
-
- (evil-global-set-key 'normal (kbd "w") 'some-function)
-
- (add-hook 'some-mode-hook
- (lambda ()
- (evil-local-set-key 'normal (kbd "w") 'some-function)))
-
-* Menu:
-
-* evil-define-key::
-* Leader keys::
-
-
-File: evil.info, Node: evil-define-key, Next: Leader keys, Up: Keymaps
-
-3.1 evil-define-key
-===================
-
-Evil provides the macro *note evil-define-key: f. for adding state
-bindings to ordinary keymaps. It is quite powerful, and is the
-preferred method for fine-tuning bindings to activate in specific
-circumstances.
-
- -- Emacs Lisp Autofunction: (evil-define-key STATE KEYMAP KEY DEF
- [BINDINGS...])
-
- Create a `STATE' binding from `KEY' to `DEF' for `KEYMAP'. `STATE'
- is one of ‘normal’, ‘insert’, ‘visual’, ‘replace’, ‘operator’,
- ‘motion’, ‘emacs’, or a list of one or more of these. Omitting a
- state by using ‘nil’ corresponds to a standard Emacs binding using
- ‘define-key’. The remaining arguments are like those of
- ‘define-key’. For example:
-
- (evil-define-key 'normal foo-map "a" 'bar)
-
- This creates a binding from ‘a’ to ‘bar’ in normal state, which is
- active whenever ‘foo-map’ is active. Using nil for the state, the
- following lead to identical bindings:
-
- (evil-define-key nil foo-map "a" 'bar)
- (define-key foo-map "a" 'bar)
-
- It is possible to specify multiple states and/or bindings at once:
-
- (evil-define-key '(normal visual) foo-map
- "a" 'bar
- "b" 'foo)
-
- If ‘foo-map’ has not been initialized yet, this macro adds an entry
- to ‘after-load-functions’, delaying execution as necessary.
-
- `KEYMAP' may also be a quoted symbol. If the symbol is ‘global’,
- the global evil keymap corresponding to the state(s) is used,
- meaning the following lead to identical bindings:
-
- (evil-define-key 'normal 'global "a" 'bar)
- (evil-global-set-key 'normal "a" 'bar)
-
- The symbol ‘local’ may also be used, which corresponds to using
- *note evil-local-set-key: 22. If a quoted symbol is used that is
- not ‘global’ or ‘local’, it is assumed to be the name of a minor
- mode, in which case ‘evil-define-minor-mode-key’ is used.
-
-There follows a brief overview of the main functions of this macro.
-
- - Define a binding in a given state
-
- (evil-define-key 'state 'global (kbd "key") 'target)
-
- - Define a binding in a given state in the current buffer
-
- (evil-define-key 'state 'local (kbd "key") 'target)
-
- - Define a binding in a given state under the `foo-mode' major mode.
-
- (evil-define-key 'state foo-mode-map (kbd "key") 'target)
-
- Note that ‘foo-mode-map’ is unquoted, and that this form is safe
- before ‘foo-mode-map’ is loaded.
-
- - Define a binding in a given state under the `bar-mode' minor mode.
-
- (evil-define-key 'state 'bar-mode (kbd "key") 'target)
-
- Note that ‘bar-mode’ is quoted, and that this form is safe before
- ‘bar-mode’ is loaded.
-
-The macro *note evil-define-key: f. can be used to augment existing
-modes with state bindings, as well as creating packages with custom
-bindings. For example, the following will create a minor mode
-‘foo-mode’ with normal state bindings for the keys ‘w’ and ‘e’:
-
- (define-minor-mode foo-mode
- "Foo mode."
- :keymap (make-sparse-keymap))
-
- (evil-define-key 'normal 'foo-mode "w" 'bar)
- (evil-define-key 'normal 'foo-mode "e" 'baz)
-
-This minor mode can then be enabled in any buffers where the custom
-bindings are desired:
-
- (add-hook 'text-mode-hook 'foo-mode) ; enable alongside text-mode
-
-
-File: evil.info, Node: Leader keys, Prev: evil-define-key, Up: Keymaps
-
-3.2 Leader keys
-===============
-
-Evil supports a simple implementation of Vim’s `leader' keys. To bind a
-function to a leader key you can use the expression ‘<leader>’ in a key
-mapping, e.g.
-
- (evil-define-key 'normal 'global (kbd "<leader>fs") 'save-buffer)
-
-Likewise, you can use the expression ‘<localleader>’ to mimic Vim’s
-local leader, which is designed for mode-specific key bindings.
-
-You can use the function *note evil-set-leader: 30. to designate which
-key acts as the leader and the local leader.
-
- -- Emacs Lisp Autofunction: (evil-set-leader STATE KEY [LOCALLEADER])
-
- Set `KEY' to trigger leader bindings in `STATE'. `KEY' should be in
- the form produced by ‘kbd’. `STATE' is one of ‘normal’, ‘insert’,
- ‘visual’, ‘replace’, ‘operator’, ‘motion’, ‘emacs’, a list of one
- or more of these, or ‘nil’, which means all of the above. If
- `LOCALLEADER' is non-nil, set the local leader instead.
-
-
-File: evil.info, Node: Hooks, Next: Extension, Prev: Keymaps, Up: Top
-
-4 Hooks
-*******
-
-A `hook' is a list of functions that are executed when certain events
-happen. Hooks are modified with the Emacs function ‘add-hook’. Evil
-provides entry and exit hooks for all its states. For example, when
-switching from normal state to insert state, all functions in
-‘evil-normal-state-exit-hook’ and ‘evil-insert-state-entry-hook’ are
-executed.
-
-It is guaranteed that the exit hook will be executed before the entry
-hook on all state switches.
-
-During the hook execution, the variables ‘evil-next-state’ and
-‘evil-previous-state’ contain information about the states being
-switched to and from, respectively.
-
-
-File: evil.info, Node: Extension, Next: Frequently Asked Questions, Prev: Hooks, Up: Top
-
-5 Extension
-***********
-
-The main functionality of Evil is implemented in terms of reusable
-macros. Package writers can use these to define new commands.
-
-* Menu:
-
-* Motions::
-* Operators::
-* Text objects::
-* Range types::
-* States::
-
-
-File: evil.info, Node: Motions, Next: Operators, Up: Extension
-
-5.1 Motions
-===========
-
-A `motion' is a command which moves the cursor, such as ‘w’ or ‘e’.
-Motions are defined with the macro *note evil-define-motion: 10.
-Motions not defined in this way should be declared with *note
-evil-declare-motion: 9.
-
- -- Emacs Lisp Autofunction: (evil-declare-motion COMMAND)
-
- Declare `COMMAND' to be a movement function. This ensures that it
- behaves correctly in visual state.
-
- -- Emacs Lisp Autofunction: (evil-define-motion MOTION (COUNT ARGS...)
- DOC [[KEY VALUE]...] BODY...)
-
- Define a motion command `MOTION'. `ARGS' is a list of arguments.
- Motions can have any number of arguments, but the first (if any)
- has the predefined meaning of count. `BODY' must execute the
- motion by moving point.
-
- Optional keyword arguments are:
-
- - ‘:type’ - determines how the motion works after an operator
- (one of ‘inclusive’, ‘line’, ‘block’ and ‘exclusive’, or a
- self-defined motion type)
-
- - ‘:jump’ - if non-nil, the previous position is stored in the
- jump list, so that it can be restored with ‘C-o’
-
-For example, this is a motion that moves the cursor forward by a number
-of characters:
-
- (evil-define-motion foo-forward (count)
- "Move to the right by COUNT characters."
- :type inclusive
- (forward-char (or count 1)))
-
-The `type' of a motion determines how it works when used together with
-an operator. Inclusive motions include the endpoint in the range being
-operated on, while exclusive motions do not. Line motions extend the
-whole range to linewise positions, effectively behaving as if the
-endpoint were really at the end of the line. Blockwise ranges behave as
-a “rectangle” on screen rather than a contiguous range of characters.
-
-
-File: evil.info, Node: Operators, Next: Text objects, Prev: Motions, Up: Extension
-
-5.2 Operators
-=============
-
-An operator is a command that acts on the text moved over by a motion,
-such as ‘c’ (change), ‘d’ (delete) or ‘y’ (yank or copy, not to be
-confused with “yank” in Emacs terminology which means `paste').
-
- -- Emacs Lisp Autofunction: (evil-define-operator OPERATOR (BEG END
- ARGS...) DOC [[KEY VALUE]...] BODY...)
-
- Define an operator command `OPERATOR'. The operator acts on the
- range of characters `BEG' through `END'. `BODY' must execute the
- operator by potentially manipulating the buffer contents, or
- otherwise causing side effects to happen.
-
- Optional keyword arguments are:
-
- - ‘:type’ - force the input range to be of a given type
- (‘inclusive’, ‘line’, ‘block’, and ‘exclusive’, or a
- self-defined motion type).
-
- - ‘:motion’ - use a predetermined motion instead of waiting for
- one from the keyboard. This does not affect the behavior in
- visual state, where selection boundaries are always used.
-
- - ‘:repeat’ - if non-nil (default), then ‘.’ will repeat the
- operator.
-
- - ‘:move-point’ - if non-nil (default), the cursor will be moved
- to the beginning of the range before the body executes
-
- - ‘:keep-visual’ - if non-nil, the selection is not disabled
- when the operator is executed in visual state. By default,
- visual state is exited automatically.
-
-For example, this is an operator that performs ROT13 encryption on the
-text under consideration:
-
- (evil-define-operator evil-rot13 (beg end)
- "ROT13 encrypt text."
- (rot13-region beg end))
-
-Binding this to ‘g?’ (where it is by default) will cause a key sequence
-such as ‘g?w’ to encrypt from the current cursor to the end of the word.
-
-
-File: evil.info, Node: Text objects, Next: Range types, Prev: Operators, Up: Extension
-
-5.3 Text objects
-================
-
-Text objects are like motions in that they define a range over which an
-operator may act. Unlike motions, text objects can set both a beginning
-and an endpoint. In visual state, text objects alter both ends of the
-selection.
-
-Text objects are not directly usable in normal state. Instead, they are
-bound in the two keymaps ‘evil-inner-text-ojects-map’ and
-‘evil-outer-text-objects-map’, which are available in visual and
-operator-pending state under the keys ‘i’ and ‘a’ respectively.
-
- -- Emacs Lisp Autofunction: (evil-define-text-object OBJECT (COUNT) DOC
- [[KEY VALUE]...] BODY...)
-
- Define a text object command `OBJECT'. `BODY' should return a range
- ‘(BEG END)’ to the right of point if `COUNT' is positive, and to
- the left of it if negative.
-
- Optional keyword arguments:
-
- - ‘:type’ - determines how the range applies after an operator
- (‘inclusive’, ‘line’, ‘block’, and ‘exclusive’, or a
- self-defined motion type).
-
- - ‘:extend-selection’ - if non-nil (default), the text object
- always enlarges the current selection. Otherwise, it replaces
- the current selection.
-
-For eample, this is a text object which selects the next three
-characters after the current location:
-
- (evil-define-text-object foo (count)
- "Select three characters."
- (list (point) (+ 3 (point))))
-
-For convenience, Evil provides several functions returning a list of
-positions which can be used for defining text objects. All of them
-follow the convention that a positive `count' selects text after the
-current location, while negative `count' selects text before it.
-
- Note: The `thingatpt' library is used quite extensively in Evil to
- define text objects, and this dependency leaks through in the
- following functions. A `thing' in this context is any symbol for
- which there is a function called ‘forward-THING’ (1) which moves
- past a number of `things'.
-
- -- Emacs Lisp Autofunction: (evil-select-inner-object THING BEG END
- TYPE [COUNT LINE])
-
- Return an inner text object range of `COUNT' objects. If `COUNT'
- is positive, return objects following point; if `COUNT' is
- negative, return objects preceding point. If one is unspecified,
- the other is used with a negative argument. `THING' is a symbol
- understood by `thing-at-point'. `BEG', `END' and `TYPE' specify
- the current selection. If `LINE' is non-nil, the text object
- should be linewise, otherwise it is character wise.
-
- -- Emacs Lisp Autofunction: (evil-select-an-object THING BEG END TYPE
- COUNT [LINE])
-
- Return an outer text object range of `COUNT' objects. If `COUNT'
- is positive, return objects following point; if `COUNT' is
- negative, return objects preceding point. If one is unspecified,
- the other is used with a negative argument. `THING' is a symbol
- understood by `thing-at-point'. `BEG', `END' and `TYPE' specify
- the current selection. If `LINE' is non-nil, the text object
- should be linewise, otherwise it is character wise.
-
- -- Emacs Lisp Autofunction: (evil-select-paren OPEN CLOSE BEG END TYPE
- COUNT [INCLUSIVE])
-
- Return a range ‘(BEG END)’ of `COUNT' delimited text objects.
- `OPEN' and `CLOSE' specify the opening and closing delimiter,
- respectively. `BEG' `END' `TYPE' are the currently selected
- (visual) range. If `INCLUSIVE' is non-nil, `OPEN' and `CLOSE' are
- included in the range; otherwise they are excluded.
-
- The types of `OPEN' and `CLOSE' specify which kind of THING is used
- for parsing with ‘evil-select-block’. If `OPEN' and `CLOSE' are
- characters ‘evil-up-paren’ is used. Otherwise `OPEN' and `CLOSE'
- must be regular expressions and ‘evil-up-block’ is used.
-
- If the selection is exclusive, whitespace at the end or at the
- beginning of the selection until the end-of-line or
- beginning-of-line is ignored.
-
- ---------- Footnotes ----------
-
- (1) (1) There are many more ways that a `thing' can be defined, but
-the definition of ‘forward-THING’ is perhaps the most straightforward
-way to go about it.
-
-
-File: evil.info, Node: Range types, Next: States, Prev: Text objects, Up: Extension
-
-5.4 Range types
-===============
-
-A `type' is a transformation acting on a pair of buffer positions. Evil
-defines the types ‘inclusive’, ‘line’, ‘block’ and ‘exclusive’, which
-are used for motion ranges and visual selection. New types may be
-defined with the macro `evil-define-type'.
-
- -- Emacs Lisp Autofunction: (evil-define-type TYPE DOC [[KEY FUNC]...])
-
- Define type `TYPE'. `DOC' is a general description and shows up in
- all docstrings.
-
- Optional keyword arguments:
-
- - ‘:expand’ - expansion function. This function should accept
- two positions in the current buffer, BEG and END,and return a
- pair of expanded buffer positions.
-
- - ‘:contract’ - the opposite of ‘:expand’. Optional.
-
- - ‘:one-to-one’ - non-nil if expansion is one-to-one. This
- means that ‘:expand’ followed by ‘:contract’ always return the
- original range.
-
- - ‘:normalize’ - normalization function. This function should
- accept two unexpanded positions and adjust them before
- expansion. May be used to deal with buffer boundaries.
-
- - ‘:string’ - description function. Takes two buffer positions
- and returns a human-readable string. For example “2 lines”
-
- If further keywords and functions are specified, they are assumed
- to be transformations on buffer positions, like ‘:expand’ and
- ‘:contract’.
-
-
-File: evil.info, Node: States, Prev: Range types, Up: Extension
-
-5.5 States
-==========
-
-States are defined with the macro *note evil-define-state: 12, which
-takes care to define the necessary hooks, keymaps and variables, as well
-as a toggle function ‘evil-NAME-state’ and a predicate function
-‘evil-NAME-state-p’ for checking whether the state is active.
-
- -- Emacs Lisp Autofunction: (evil-define-state STATE DOC [[KEY VAL]...]
- BODY...)
-
- Define an Evil state `STATE'. `DOC' is a general description and
- shows up in all docstrings; the first line of the string should be
- the full name of the state.
-
- `BODY' is executed each time the state is enabled or disabled.
-
- Optional keyword arguments:
-
- - ‘:tag’ - the mode line indicator, e.g. “<T>”.
-
- - ‘:message’ - string shown in the echo area when the state is
- activated.
-
- - ‘:cursor’ - default cursor specification.
-
- - ‘:enable’ - list of other state keymaps to enable when in this
- state.
-
- - ‘:entry-hook’ - list of functions to run when entering this
- state.
-
- - ‘:exit-hook’ - list of functions to run when exiting this
- state.
-
- - ‘:suppress-keymap’ - if non-nil, effectively disables bindings
- to ‘self-insert-command’ by making ‘evil-suppress-map’ the
- parent of the global state keymap.
-
- The global keymap of this state will be ‘evil-test-state-map’, the
- local keymap will be ‘evil-test-state-local-map’, and so on.
-
-For example:
-
- (evil-define-state test
- "Test state."
- :tag " <T> "
- (message (if (evil-test-state-p)
- "Enabling test state."
- "Disabling test state.")))
-
-
-File: evil.info, Node: Frequently Asked Questions, Next: Internals, Prev: Extension, Up: Top
-
-6 Frequently Asked Questions
-****************************
-
-* Menu:
-
-* Problems with the escape key in the terminal::
-* Underscore is not a word character::
-
-
-File: evil.info, Node: Problems with the escape key in the terminal, Next: Underscore is not a word character, Up: Frequently Asked Questions
-
-6.1 Problems with the escape key in the terminal
-================================================
-
-A common problem when using Evil in terminal mode is a certain delay
-after pressing the escape key. Even more, when pressing the escape key
-followed quickly by another key the command is recognized as ‘M-<key>’
-instead of two separate keys: ‘ESC’ followed by ‘<key>’. In fact, it is
-perfectly valid to simulate ‘M-<key>’ by pressing ‘ESC <key>’ quickly
-(but see below).
-
-The reason for this is that in terminal mode a key sequence involving
-the meta key (or alt key) always generates a so called “escape
-sequence”, i.e. a sequence of two events sent to Emacs, the first being
-‘ESC’ and the second the key pressed simultaneously. The problem is
-that pressing the escape key itself also generates the ‘ESC’ event.
-Thus, if Emacs (and therefore Evil) receives an ‘ESC’ event there is no
-way to tell whether the escape key has been pressed (and no further
-event will arrive) or a ‘M-<key>’ combination has been pressed (and the
-‘<key>’ event will arrive soon). In order to distinguish both
-situations Evil does the following. After receiving an ‘ESC’ event Evil
-waits for a short time period (specified by the variable *note
-evil-esc-delay: 17. which defaults to 0.01 seconds) for another event.
-If no other event arrives Evil assumes that the plain escape key has
-been pressed, otherwise it assumes a ‘M-<key>’ combination has been
-pressed and combines the ‘ESC’ event with the second one. Because a
-‘M-<key>’ sequence usually generates both events in very quick
-succession, 0.01 seconds are usually enough and the delay is hardly
-noticeable by the user.
-
-If you use a terminal multiplexer like `tmux' or `screen' the situation
-may be worse. These multiplexers have exactly the same problem
-recognizing ‘M-<key>’ sequences and often introduce their own delay for
-the ‘ESC’ key. There is no way for Evil to influence this delay. In
-order to reduce it you must reconfigure your terminal multiplexer.
-
-Note that this problem should not arise when using Evil in graphical
-mode. The reason is that in this case the escape key itself generates a
-different command, namely ‘escape’ (a symbol) and hence Evil can
-distinguish whether the escape key or a ‘M-<key>’ combination has been
-pressed. But this also implies that pressing ‘ESC’ followed by <key>
-cannot be used to simulate ‘M-<key>’ in graphical mode!
-
-
-File: evil.info, Node: Underscore is not a word character, Prev: Problems with the escape key in the terminal, Up: Frequently Asked Questions
-
-6.2 Underscore is not a word character
-======================================
-
-An underscore ‘_’ is a word character in Vim. This means that word
-motions like ‘w’ skip over underlines in a sequence of letters as if it
-was a letter itself. In contrast, in Evil the underscore is often a
-non-word character like operators, e.g. ‘+’.
-
-The reason is that Evil uses Emacs’ definition of a word and this
-definition does often not include the underscore. In Emacs word
-characters are determined by the syntax-class of the buffer. The
-syntax-class usually depends on the major-mode of this buffer. This has
-the advantage that the definition of a “word” may be adapted to the
-particular type of document being edited. Evil uses Emacs’ definition
-and does not simply use Vim’s definition in order to be consistent with
-other Emacs functions. For example, word characters are exactly those
-characters that are matched by the regular expression character class
-‘[:word:]’.
-
-If you want the underscore to be recognised as word character, you can
-modify its entry in the syntax-table:
-
- (modify-syntax-entry ?_ "w")
-
-This gives the underscore the ‘word’ syntax class. You can use a
-mode-hook to modify the syntax-table in all buffers of some mode, e.g.:
-
- (add-hook 'c-mode-common-hook
- (lambda () (modify-syntax-entry ?_ "w")))
-
-This gives the underscore the word syntax-class in all C-like buffers.
-
-Alternatively, many find that motion by `symbols' is more convenient
-than motion by `words'. One way to make word motions operate as symbol
-motions is to alias the ‘evil-word’ `thing' (1) to the ‘evil-symbol’
-thing:
-
- (defalias 'forward-evil-word 'forward-evil-symbol)
-
- ---------- Footnotes ----------
-
- (1) (1) Many of Evil’s text objects and motions are defined in terms
-of the `thingatpt' library, which in this case are defined entirely in
-terms of ‘forward-THING’ functions. Thus aliasing one to another should
-make all motions and text objects implemented in terms of that `thing'
-behave the same.
-
-
-File: evil.info, Node: Internals, Next: The GNU Free Documentation License, Prev: Frequently Asked Questions, Up: Top
-
-7 Internals
-***********
-
-* Menu:
-
-* Command properties::
-
-
-File: evil.info, Node: Command properties, Up: Internals
-
-7.1 Command properties
-======================
-
-Evil defines `command properties' to store information about commands
-(1), such as whether they should be repeated. A command property is a
-‘:keyword’ with an associated value, e.g. ‘:repeat nil’.
-
- -- Emacs Lisp Autofunction: (evil-add-command-properties COMMAND
- [PROPERTIES...])
-
- Add `PROPERTIES' to `COMMAND'. `PROPERTIES' should be a property
- list. To replace all properties at once, use *note
- evil-set-command-properties: 2e.
-
- -- Emacs Lisp Autofunction: (evil-set-command-properties COMMAND
- [PROPERTIES...])
-
- Replace all of `COMMAND'’s properties with `PROPERTIES'.
- `PROPERTIES' should be a property list. This erases all previous
- properties; to only add properties, use
- ‘evil-set-command-property’.
-
- -- Emacs Lisp Autofunction: (evil-get-command-properties COMMAND)
-
- Return all Evil properties of `COMMAND'. See also *note
- evil-get-command-property: 1b.
-
- -- Emacs Lisp Autofunction: (evil-get-command-property COMMAND PROPERTY
- [DEFAULT])
-
- Return the value of Evil `PROPERTY' of `COMMAND'. If the command
- does not have the property, return `DEFAULT'. See also *note
- evil-get-command-properties: 1a.
-
- -- Emacs Lisp Autofunction: (evil-define-command COMMAND (ARGS...) DOC
- [[KEY VALUE]...] BODY...)
-
- Define a command `COMMAND'.
-
-For setting repeat properties, use the following functions:
-
- -- Emacs Lisp Autofunction: (evil-declare-repeat COMMAND)
-
- Declare `COMMAND' to be repeatable.
-
- -- Emacs Lisp Autofunction: (evil-declare-not-repeat COMMAND)
-
- Declare `COMMAND' to be nonrepeatable.
-
- -- Emacs Lisp Autofunction: (evil-declare-change-repeat COMMAND)
-
- Declare `COMMAND' to be repeatable by buffer changes rather than
- keystrokes.
-
- ---------- Footnotes ----------
-
- (1) (1) In this context, a `command' may mean any Evil motion, text
-object, operator or indeed other Emacs commands, which have not been
-defined through the Evil machinery.
-
-
-File: evil.info, Node: The GNU Free Documentation License, Next: Emacs lisp functions and variables, Prev: Internals, Up: Top
-
-8 The GNU Free Documentation License
-************************************
-
-Version 1.3, 3 November 2008
-
- Copyright (c) 2000, 2001, 2002, 2007, 2008 Free Software
- Foundation, Inc. ‘http://fsf.org/’
-
- Everyone is permitted to copy and distribute verbatim copies of
- this license document, but changing it is not allowed.
-
- 0. PREAMBLE
-
- The purpose of this License is to make a manual, textbook, or other
- functional and useful document `free' in the sense of freedom: to
- assure everyone the effective freedom to copy and redistribute it,
- with or without modifying it, either commercially or
- noncommercially. Secondarily, this License preserves for the
- author and publisher a way to get credit for their work, while not
- being considered responsible for modifications made by others.
-
- This License is a kind of “copyleft”, which means that derivative
- works of the document must themselves be free in the same sense.
- It complements the GNU General Public License, which is a copyleft
- license designed for free software.
-
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same freedoms
- that the software does. But this License is not limited to
- software manuals; it can be used for any textual work, regardless
- of subject matter or whether it is published as a printed book. We
- recommend this License principally for works whose purpose is
- instruction or reference.
-
- 1. APPLICABILITY AND DEFINITIONS
-
- This License applies to any manual or other work, in any medium,
- that contains a notice placed by the copyright holder saying it can
- be distributed under the terms of this License. Such a notice
- grants a world-wide, royalty-free license, unlimited in duration,
- to use that work under the conditions stated herein. The
- “Document”, below, refers to any such manual or work. Any member
- of the public is a licensee, and is addressed as “you”. You accept
- the license if you copy, modify or distribute the work in a way
- requiring permission under copyright law.
-
- A “Modified Version” of the Document means any work containing the
- Document or a portion of it, either copied verbatim, or with
- modifications and/or translated into another language.
-
- A “Secondary Section” is a named appendix or a front-matter section
- of the Document that deals exclusively with the relationship of the
- publishers or authors of the Document to the Document’s overall
- subject (or to related matters) and contains nothing that could
- fall directly within that overall subject. (Thus, if the Document
- is in part a textbook of mathematics, a Secondary Section may not
- explain any mathematics.) The relationship could be a matter of
- historical connection with the subject or with related matters, or
- of legal, commercial, philosophical, ethical or political position
- regarding them.
-
- The “Invariant Sections” are certain Secondary Sections whose
- titles are designated, as being those of Invariant Sections, in the
- notice that says that the Document is released under this License.
- If a section does not fit the above definition of Secondary then it
- is not allowed to be designated as Invariant. The Document may
- contain zero Invariant Sections. If the Document does not identify
- any Invariant Sections then there are none.
-
- The “Cover Texts” are certain short passages of text that are
- listed, as Front-Cover Texts or Back-Cover Texts, in the notice
- that says that the Document is released under this License. A
- Front-Cover Text may be at most 5 words, and a Back-Cover Text may
- be at most 25 words.
-
- A “Transparent” copy of the Document means a machine-readable copy,
- represented in a format whose specification is available to the
- general public, that is suitable for revising the document
- straightforwardly with generic text editors or (for images composed
- of pixels) generic paint programs or (for drawings) some widely
- available drawing editor, and that is suitable for input to text
- formatters or for automatic translation to a variety of formats
- suitable for input to text formatters. A copy made in an otherwise
- Transparent file format whose markup, or absence of markup, has
- been arranged to thwart or discourage subsequent modification by
- readers is not Transparent. An image format is not Transparent if
- used for any substantial amount of text. A copy that is not
- “Transparent” is called “Opaque”.
-
- Examples of suitable formats for Transparent copies include plain
- ASCII without markup, Texinfo input format, LaTeX input format,
- SGML or XML using a publicly available DTD, and standard-conforming
- simple HTML, PostScript or PDF designed for human modification.
- Examples of transparent image formats include PNG, XCF and JPG.
- Opaque formats include proprietary formats that can be read and
- edited only by proprietary word processors, SGML or XML for which
- the DTD and/or processing tools are not generally available, and
- the machine-generated HTML, PostScript or PDF produced by some word
- processors for output purposes only.
-
- The “Title Page” means, for a printed book, the title page itself,
- plus such following pages as are needed to hold, legibly, the
- material this License requires to appear in the title page. For
- works in formats which do not have any title page as such, “Title
- Page” means the text near the most prominent appearance of the
- work’s title, preceding the beginning of the body of the text.
-
- The “publisher” means any person or entity that distributes copies
- of the Document to the public.
-
- A section “Entitled XYZ” means a named subunit of the Document
- whose title either is precisely XYZ or contains XYZ in parentheses
- following text that translates XYZ in another language. (Here XYZ
- stands for a specific section name mentioned below, such as
- “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.)
- To “Preserve the Title” of such a section when you modify the
- Document means that it remains a section “Entitled XYZ” according
- to this definition.
-
- The Document may include Warranty Disclaimers next to the notice
- which states that this License applies to the Document. These
- Warranty Disclaimers are considered to be included by reference in
- this License, but only as regards disclaiming warranties: any other
- implication that these Warranty Disclaimers may have is void and
- has no effect on the meaning of this License.
-
- 2. VERBATIM COPYING
-
- You may copy and distribute the Document in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that you
- add no other conditions whatsoever to those of this License. You
- may not use technical measures to obstruct or control the reading
- or further copying of the copies you make or distribute. However,
- you may accept compensation in exchange for copies. If you
- distribute a large enough number of copies you must also follow the
- conditions in section 3.
-
- You may also lend copies, under the same conditions stated above,
- and you may publicly display copies.
-
- 3. COPYING IN QUANTITY
-
- If you publish printed copies (or copies in media that commonly
- have printed covers) of the Document, numbering more than 100, and
- the Document’s license notice requires Cover Texts, you must
- enclose the copies in covers that carry, clearly and legibly, all
- these Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also clearly
- and legibly identify you as the publisher of these copies. The
- front cover must present the full title with all words of the title
- equally prominent and visible. You may add other material on the
- covers in addition. Copying with changes limited to the covers, as
- long as they preserve the title of the Document and satisfy these
- conditions, can be treated as verbatim copying in other respects.
-
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
-
- If you publish or distribute Opaque copies of the Document
- numbering more than 100, you must either include a machine-readable
- Transparent copy along with each Opaque copy, or state in or with
- each Opaque copy a computer-network location from which the general
- network-using public has access to download using public-standard
- network protocols a complete Transparent copy of the Document, free
- of added material. If you use the latter option, you must take
- reasonably prudent steps, when you begin distribution of Opaque
- copies in quantity, to ensure that this Transparent copy will
- remain thus accessible at the stated location until at least one
- year after the last time you distribute an Opaque copy (directly or
- through your agents or retailers) of that edition to the public.
-
- It is requested, but not required, that you contact the authors of
- the Document well before redistributing any large number of copies,
- to give them a chance to provide you with an updated version of the
- Document.
-
- 4. MODIFICATIONS
-
- You may copy and distribute a Modified Version of the Document
- under the conditions of sections 2 and 3 above, provided that you
- release the Modified Version under precisely this License, with the
- Modified Version filling the role of the Document, thus licensing
- distribution and modification of the Modified Version to whoever
- possesses a copy of it. In addition, you must do these things in
- the Modified Version:
-
- A. Use in the Title Page (and on the covers, if any) a title
- distinct from that of the Document, and from those of previous
- versions (which should, if there were any, be listed in the
- History section of the Document). You may use the same title
- as a previous version if the original publisher of that
- version gives permission.
-
- B. List on the Title Page, as authors, one or more persons or
- entities responsible for authorship of the modifications in
- the Modified Version, together with at least five of the
- principal authors of the Document (all of its principal
- authors, if it has fewer than five), unless they release you
- from this requirement.
-
- C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-
- D. Preserve all the copyright notices of the Document.
-
- E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-
- F. Include, immediately after the copyright notices, a license
- notice giving the public permission to use the Modified
- Version under the terms of this License, in the form shown in
- the Addendum below.
-
- G. Preserve in that license notice the full lists of Invariant
- Sections and required Cover Texts given in the Document’s
- license notice.
-
- H. Include an unaltered copy of this License.
-
- I. Preserve the section Entitled “History”, Preserve its Title,
- and add to it an item stating at least the title, year, new
- authors, and publisher of the Modified Version as given on the
- Title Page. If there is no section Entitled “History” in the
- Document, create one stating the title, year, authors, and
- publisher of the Document as given on its Title Page, then add
- an item describing the Modified Version as stated in the
- previous sentence.
-
- J. Preserve the network location, if any, given in the Document
- for public access to a Transparent copy of the Document, and
- likewise the network locations given in the Document for
- previous versions it was based on. These may be placed in the
- “History” section. You may omit a network location for a work
- that was published at least four years before the Document
- itself, or if the original publisher of the version it refers
- to gives permission.
-
- K. For any section Entitled “Acknowledgements” or “Dedications”,
- Preserve the Title of the section, and preserve in the section
- all the substance and tone of each of the contributor
- acknowledgements and/or dedications given therein.
-
- L. Preserve all the Invariant Sections of the Document, unaltered
- in their text and in their titles. Section numbers or the
- equivalent are not considered part of the section titles.
-
- M. Delete any section Entitled “Endorsements”. Such a section
- may not be included in the Modified Version.
-
- N. Do not retitle any existing section to be Entitled
- “Endorsements” or to conflict in title with any Invariant
- Section.
-
- O. Preserve any Warranty Disclaimers.
-
- If the Modified Version includes new front-matter sections or
- appendices that qualify as Secondary Sections and contain no
- material copied from the Document, you may at your option designate
- some or all of these sections as invariant. To do this, add their
- titles to the list of Invariant Sections in the Modified Version’s
- license notice. These titles must be distinct from any other
- section titles.
-
- You may add a section Entitled “Endorsements”, provided it contains
- nothing but endorsements of your Modified Version by various
- parties—for example, statements of peer review or that the text has
- been approved by an organization as the authoritative definition of
- a standard.
-
- You may add a passage of up to five words as a Front-Cover Text,
- and a passage of up to 25 words as a Back-Cover Text, to the end of
- the list of Cover Texts in the Modified Version. Only one passage
- of Front-Cover Text and one of Back-Cover Text may be added by (or
- through arrangements made by) any one entity. If the Document
- already includes a cover text for the same cover, previously added
- by you or by arrangement made by the same entity you are acting on
- behalf of, you may not add another; but you may replace the old
- one, on explicit permission from the previous publisher that added
- the old one.
-
- The author(s) and publisher(s) of the Document do not by this
- License give permission to use their names for publicity for or to
- assert or imply endorsement of any Modified Version.
-
- 5. COMBINING DOCUMENTS
-
- You may combine the Document with other documents released under
- this License, under the terms defined in section 4 above for
- modified versions, provided that you include in the combination all
- of the Invariant Sections of all of the original documents,
- unmodified, and list them all as Invariant Sections of your
- combined work in its license notice, and that you preserve all
- their Warranty Disclaimers.
-
- The combined work need only contain one copy of this License, and
- multiple identical Invariant Sections may be replaced with a single
- copy. If there are multiple Invariant Sections with the same name
- but different contents, make the title of each such section unique
- by adding at the end of it, in parentheses, the name of the
- original author or publisher of that section if known, or else a
- unique number. Make the same adjustment to the section titles in
- the list of Invariant Sections in the license notice of the
- combined work.
-
- In the combination, you must combine any sections Entitled
- “History” in the various original documents, forming one section
- Entitled “History”; likewise combine any sections Entitled
- “Acknowledgements”, and any sections Entitled “Dedications”. You
- must delete all sections Entitled “Endorsements.”
-
- 6. COLLECTIONS OF DOCUMENTS
-
- You may make a collection consisting of the Document and other
- documents released under this License, and replace the individual
- copies of this License in the various documents with a single copy
- that is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the documents
- in all other respects.
-
- You may extract a single document from such a collection, and
- distribute it individually under this License, provided you insert
- a copy of this License into the extracted document, and follow this
- License in all other respects regarding verbatim copying of that
- document.
-
- 7. AGGREGATION WITH INDEPENDENT WORKS
-
- A compilation of the Document or its derivatives with other
- separate and independent documents or works, in or on a volume of a
- storage or distribution medium, is called an “aggregate” if the
- copyright resulting from the compilation is not used to limit the
- legal rights of the compilation’s users beyond what the individual
- works permit. When the Document is included in an aggregate, this
- License does not apply to the other works in the aggregate which
- are not themselves derivative works of the Document.
-
- If the Cover Text requirement of section 3 is applicable to these
- copies of the Document, then if the Document is less than one half
- of the entire aggregate, the Document’s Cover Texts may be placed
- on covers that bracket the Document within the aggregate, or the
- electronic equivalent of covers if the Document is in electronic
- form. Otherwise they must appear on printed covers that bracket
- the whole aggregate.
-
- 8. TRANSLATION
-
- Translation is considered a kind of modification, so you may
- distribute translations of the Document under the terms of section
- 4. Replacing Invariant Sections with translations requires special
- permission from their copyright holders, but you may include
- translations of some or all Invariant Sections in addition to the
- original versions of these Invariant Sections. You may include a
- translation of this License, and all the license notices in the
- Document, and any Warranty Disclaimers, provided that you also
- include the original English version of this License and the
- original versions of those notices and disclaimers. In case of a
- disagreement between the translation and the original version of
- this License or a notice or disclaimer, the original version will
- prevail.
-
- If a section in the Document is Entitled “Acknowledgements”,
- “Dedications”, or “History”, the requirement (section 4) to
- Preserve its Title (section 1) will typically require changing the
- actual title.
-
- 9. TERMINATION
-
- You may not copy, modify, sublicense, or distribute the Document
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense, or distribute it is void,
- and will automatically terminate your rights under this License.
-
- However, if you cease all violation of this License, then your
- license from a particular copyright holder is reinstated (a)
- provisionally, unless and until the copyright holder explicitly and
- finally terminates your license, and (b) permanently, if the
- copyright holder fails to notify you of the violation by some
- reasonable means prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
- reinstated permanently if the copyright holder notifies you of the
- violation by some reasonable means, this is the first time you have
- received notice of violation of this License (for any work) from
- that copyright holder, and you cure the violation prior to 30 days
- after your receipt of the notice.
-
- Termination of your rights under this section does not terminate
- the licenses of parties who have received copies or rights from you
- under this License. If your rights have been terminated and not
- permanently reinstated, receipt of a copy of some or all of the
- same material does not give you any rights to use it.
-
- 10. FUTURE REVISIONS OF THIS LICENSE
-
- The Free Software Foundation may publish new, revised versions of
- the GNU Free Documentation License from time to time. Such new
- versions will be similar in spirit to the present version, but may
- differ in detail to address new problems or concerns. See
- ‘http://www.gnu.org/copyleft’.
-
- Each version of the License is given a distinguishing version
- number. If the Document specifies that a particular numbered
- version of this License “or any later version” applies to it, you
- have the option of following the terms and conditions either of
- that specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If the
- Document does not specify a version number of this License, you may
- choose any version ever published (not as a draft) by the Free
- Software Foundation. If the Document specifies that a proxy can
- decide which future versions of this License can be used, that
- proxy’s public statement of acceptance of a version permanently
- authorizes you to choose that version for the Document.
-
- 11. RELICENSING
-
- “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any
- World Wide Web server that publishes copyrightable works and also
- provides prominent facilities for anybody to edit those works. A
- public wiki that anybody can edit is an example of such a server.
- A “Massive Multiauthor Collaboration” (or “MMC”) contained in the
- site means any set of copyrightable works thus published on the MMC
- site.
-
- “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0
- license published by Creative Commons Corporation, a not-for-profit
- corporation with a principal place of business in San Francisco,
- California, as well as future copyleft versions of that license
- published by that same organization.
-
- “Incorporate” means to publish or republish a Document, in whole or
- in part, as part of another Document.
-
- An MMC is “eligible for relicensing” if it is licensed under this
- License, and if all works that were first published under this
- License somewhere other than this MMC, and subsequently
- incorporated in whole or in part into the MMC, (1) had no cover
- texts or invariant sections, and (2) were thus incorporated prior
- to November 1, 2008.
-
- The operator of an MMC Site may republish an MMC contained in the
- site under CC-BY-SA on the same site at any time before August 1,
- 2009, provided the MMC is eligible for relicensing.
-
-
-File: evil.info, Node: Emacs lisp functions and variables, Prev: The GNU Free Documentation License, Up: Top
-
-Emacs lisp functions and variables
-**********************************
-
-* Menu:
-
-* evil-add-command-properties: 0.
-* evil-auto-balance-windows: 1.
-* evil-auto-indent: 2.
-* evil-backspace-join-lines: 3.
-* evil-bigword: 4.
-* evil-buffer-regexps: 5.
-* evil-complete-all-buffers: 6.
-* evil-cross-lines: 7.
-* evil-declare-change-repeat: 8.
-* evil-declare-motion: 9.
-* evil-declare-not-repeat: a.
-* evil-declare-repeat: b.
-* evil-default-cursor: c.
-* evil-default-state: d.
-* evil-define-command: e.
-* evil-define-key: f.
-* evil-define-motion: 10.
-* evil-define-operator: 11.
-* evil-define-state: 12.
-* evil-define-text-object: 13.
-* evil-define-type: 14.
-* evil-disable-insert-state-bindings: 15.
-* evil-echo-state: 16.
-* evil-esc-delay: 17.
-* evil-ex-hl-update-delay: 18.
-* evil-flash-delay: 19.
-* evil-get-command-properties: 1a.
-* evil-get-command-property: 1b.
-* evil-global-set-key: 1c.
-* evil-highlight-closing-paren-at-point-states: 1d.
-* evil-indent-convert-tabs: 1e.
-* evil-intercept-esc: 1f.
-* evil-kbd-macro-suppress-motion-error: 20.
-* evil-kill-on-visual-paste: 21.
-* evil-local-set-key: 22.
-* evil-mode-line-format: 23.
-* evil-mouse-word: 24.
-* evil-move-beyond-eol: 25.
-* evil-move-cursor-back: 26.
-* evil-regexp-search: 27.
-* evil-repeat-move-cursor: 28.
-* evil-respect-visual-line-mode: 29.
-* evil-search-wrap: 2a.
-* evil-select-an-object: 2b.
-* evil-select-inner-object: 2c.
-* evil-select-paren: 2d.
-* evil-set-command-properties: 2e.
-* evil-set-initial-state: 2f.
-* evil-set-leader: 30.
-* evil-shift-round: 31.
-* evil-shift-width: 32.
-* evil-show-paren-range: 33.
-* evil-split-window-below: 34.
-* evil-toggle-key: 35.
-* evil-track-eol: 36.
-* evil-vsplit-window-right: 37.
-* evil-want-C-d-scroll: 38.
-* evil-want-C-i-jump: 39.
-* evil-want-C-u-delete: 3a.
-* evil-want-C-u-scroll: 3b.
-* evil-want-C-w-delete: 3c.
-* evil-want-C-w-in-emacs-state: 3d.
-* evil-want-fine-undo: 3e.
-* evil-want-Y-yank-to-eol: 3f.
-
-
-
-Tag Table:
-Node: Top364
-Ref: index doc611
-Ref: 40611
-Node: Overview1443
-Ref: overview doc1518
-Ref: 411518
-Ref: overview evil1518
-Ref: 421518
-Ref: overview overview1518
-Ref: 431518
-Ref: Overview-Footnote-11871
-Node: Installation via package el2123
-Ref: overview installation-via-package-el2221
-Ref: 442221
-Ref: Installation via package el-Footnote-12790
-Node: Manual installation2834
-Ref: overview manual-installation2957
-Ref: 452957
-Node: Modes and states3512
-Ref: overview modes-and-states3599
-Ref: 463599
-Node: Settings5350
-Ref: settings doc5429
-Ref: 475429
-Ref: settings settings5429
-Ref: 485429
-Ref: Settings-Footnote-16188
-Node: The initial state6329
-Ref: settings the-initial-state6429
-Ref: 496429
-Ref: settings elispobj-evil-set-initial-state6704
-Ref: 2f6704
-Ref: settings elispobj-evil-default-state6943
-Ref: d6943
-Ref: settings elispobj-evil-buffer-regexps7554
-Ref: 57554
-Node: Keybindings and other behaviour8047
-Ref: settings keybindings-and-other-behaviour8162
-Ref: 4a8162
-Ref: settings elispobj-evil-toggle-key8384
-Ref: 358384
-Ref: settings elispobj-evil-want-C-i-jump8584
-Ref: 398584
-Ref: settings elispobj-evil-want-C-u-delete8774
-Ref: 3a8774
-Ref: settings elispobj-evil-want-C-u-scroll9093
-Ref: 3b9093
-Ref: settings elispobj-evil-want-C-d-scroll9386
-Ref: 389386
-Ref: settings elispobj-evil-want-C-w-delete9509
-Ref: 3c9509
-Ref: settings elispobj-evil-want-C-w-in-emacs-state9639
-Ref: 3d9639
-Ref: settings elispobj-evil-want-Y-yank-to-eol9789
-Ref: 3f9789
-Ref: settings elispobj-evil-disable-insert-state-bindings9984
-Ref: 159984
-Node: Search10312
-Ref: settings search10421
-Ref: 4c10421
-Ref: settings elispobj-evil-regexp-search10444
-Ref: 2710444
-Ref: settings elispobj-evil-search-wrap10595
-Ref: 2a10595
-Ref: settings elispobj-evil-flash-delay10801
-Ref: 1910801
-Ref: settings elispobj-evil-ex-hl-update-delay10944
-Ref: 1810944
-Node: Indentation11217
-Ref: settings indentation11310
-Ref: 4d11310
-Ref: settings elispobj-evil-auto-indent11343
-Ref: 211343
-Ref: settings elispobj-evil-shift-width11501
-Ref: 3211501
-Ref: settings elispobj-evil-shift-round11707
-Ref: 3111707
-Ref: settings elispobj-evil-indent-convert-tabs11968
-Ref: 1e11968
-Node: Cursor movement12237
-Ref: settings cursor-movement12338
-Ref: 4e12338
-Ref: settings elispobj-evil-repeat-move-cursor12917
-Ref: 2812917
-Ref: settings elispobj-evil-move-cursor-back13181
-Ref: 2613181
-Ref: settings elispobj-evil-move-beyond-eol13526
-Ref: 2513526
-Ref: settings elispobj-evil-cross-lines13768
-Ref: 713768
-Ref: settings elispobj-evil-respect-visual-line-mode14163
-Ref: 2914163
-Ref: settings elispobj-evil-track-eol14678
-Ref: 3614678
-Node: Cursor display15046
-Ref: settings cursor-display15153
-Ref: 4f15153
-Ref: settings elispobj-evil-default-cursor15497
-Ref: c15497
-Node: Window management15780
-Ref: settings window-management15896
-Ref: 5015896
-Ref: settings elispobj-evil-auto-balance-windows15941
-Ref: 115941
-Ref: settings elispobj-evil-split-window-below16087
-Ref: 3416087
-Ref: settings elispobj-evil-vsplit-window-right16216
-Ref: 3716216
-Node: Parenthesis highlighting16369
-Ref: settings parenthesis-highlighting16484
-Ref: 5116484
-Ref: settings elispobj-evil-show-paren-range16673
-Ref: 3316673
-Ref: settings elispobj-evil-highlight-closing-paren-at-point-states16860
-Ref: 1d16860
-Node: Miscellaneous17446
-Ref: settings miscellaneous17535
-Ref: 5217535
-Ref: settings elispobj-evil-want-fine-undo17572
-Ref: 3e17572
-Ref: settings elispobj-evil-backspace-join-lines18211
-Ref: 318211
-Ref: settings elispobj-evil-kbd-macro-suppress-motion-error18352
-Ref: 2018352
-Ref: settings elispobj-evil-mode-line-format19107
-Ref: 2319107
-Ref: settings elispobj-evil-mouse-word19639
-Ref: 2419639
-Ref: settings elispobj-evil-bigword19980
-Ref: 419980
-Ref: settings elispobj-evil-esc-delay20284
-Ref: 1720284
-Ref: settings elispobj-evil-intercept-esc20690
-Ref: 1f20690
-Ref: settings elispobj-evil-kill-on-visual-paste21316
-Ref: 2121316
-Ref: settings elispobj-evil-echo-state21577
-Ref: 1621577
-Ref: settings elispobj-evil-complete-all-buffers21706
-Ref: 621706
-Node: Keymaps21907
-Ref: keymaps doc21983
-Ref: 5321983
-Ref: keymaps chapter-keymaps21983
-Ref: 4b21983
-Ref: keymaps keymaps21983
-Ref: 5421983
-Ref: keymaps elispobj-evil-global-set-key23635
-Ref: 1c23635
-Ref: keymaps elispobj-evil-local-set-key23739
-Ref: 2223739
-Node: evil-define-key24168
-Ref: keymaps evil-define-key24245
-Ref: 5524245
-Ref: keymaps elispobj-evil-define-key24499
-Ref: f24499
-Node: Leader keys27696
-Ref: keymaps leader-keys27773
-Ref: 5627773
-Ref: keymaps elispobj-evil-set-leader28300
-Ref: 3028300
-Node: Hooks28753
-Ref: hooks doc28830
-Ref: 5728830
-Ref: hooks hooks28830
-Ref: 5828830
-Node: Extension29482
-Ref: extension doc29578
-Ref: 5929578
-Ref: extension extension29578
-Ref: 5a29578
-Node: Motions29814
-Ref: extension motions29883
-Ref: 5b29883
-Ref: extension elispobj-evil-declare-motion30136
-Ref: 930136
-Ref: extension elispobj-evil-define-motion30309
-Ref: 1030309
-Node: Operators31700
-Ref: extension operators31790
-Ref: 5c31790
-Ref: extension elispobj-evil-define-operator32038
-Ref: 1132038
-Node: Text objects33643
-Ref: extension text-objects33737
-Ref: 5d33737
-Ref: extension elispobj-evil-define-text-object34277
-Ref: 1334277
-Ref: extension elispobj-evil-select-inner-object35781
-Ref: 2c35781
-Ref: extension elispobj-evil-select-an-object36351
-Ref: 2b36351
-Ref: extension elispobj-evil-select-paren36918
-Ref: 2d36918
-Ref: Text objects-Footnote-137840
-Node: Range types38006
-Ref: extension range-types38097
-Ref: 5e38097
-Ref: extension elispobj-evil-define-type38400
-Ref: 1438400
-Node: States39569
-Ref: extension states39639
-Ref: 5f39639
-Ref: extension elispobj-evil-define-state39939
-Ref: 1239939
-Node: Frequently Asked Questions41368
-Ref: faq doc41468
-Ref: 6041468
-Ref: faq frequently-asked-questions41468
-Ref: 6141468
-Node: Problems with the escape key in the terminal41625
-Ref: faq problems-with-the-escape-key-in-the-terminal41773
-Ref: 6241773
-Node: Underscore is not a word character44267
-Ref: faq underscore-is-not-a-word-character44415
-Ref: 6344415
-Ref: Underscore is not a word character-Footnote-146183
-Node: Internals46494
-Ref: internals doc46619
-Ref: 6446619
-Ref: internals internals46619
-Ref: 6546619
-Node: Command properties46677
-Ref: internals command-properties46739
-Ref: 6646739
-Ref: internals elispobj-evil-add-command-properties46994
-Ref: 046994
-Ref: internals elispobj-evil-set-command-properties47254
-Ref: 2e47254
-Ref: internals elispobj-evil-get-command-properties47567
-Ref: 1a47567
-Ref: internals elispobj-evil-get-command-property47733
-Ref: 1b47733
-Ref: internals elispobj-evil-define-command48003
-Ref: e48003
-Ref: internals elispobj-evil-declare-repeat48207
-Ref: b48207
-Ref: internals elispobj-evil-declare-not-repeat48309
-Ref: a48309
-Ref: internals elispobj-evil-declare-change-repeat48418
-Ref: 848418
-Ref: Command properties-Footnote-148609
-Node: The GNU Free Documentation License48786
-Ref: license doc48919
-Ref: 6748919
-Ref: license the-gnu-free-documentation-license48919
-Ref: 6848919
-Node: Emacs lisp functions and variables72727
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/flycheck-20200610.1809/flycheck-autoloads.el b/elpa/flycheck-20200610.1809/flycheck-autoloads.el
deleted file mode 100644
index 42ff96d..0000000
--- a/elpa/flycheck-20200610.1809/flycheck-autoloads.el
+++ /dev/null
@@ -1,306 +0,0 @@
-;;; flycheck-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "flycheck" "flycheck.el" (0 0 0 0))
-;;; Generated autoloads from flycheck.el
-
-(autoload 'flycheck-manual "flycheck" "\
-Open the Flycheck manual.
-
-\(fn)" t nil)
-
-(autoload 'flycheck-mode "flycheck" "\
-Flycheck is a minor mode for on-the-fly syntax checking.
-
-In `flycheck-mode' the buffer is automatically syntax-checked
-using the first suitable syntax checker from `flycheck-checkers'.
-Use `flycheck-select-checker' to select a checker for the current
-buffer manually.
-
-If you run into issues, use `\\[flycheck-verify-setup]' to get help.
-
-Flycheck supports many languages out of the box, and many
-additional ones are available on MELPA. Adding new ones is very
-easy. Complete documentation is available online at URL
-`https://www.flycheck.org/en/latest/'. Please report issues and
-request features at URL `https://github.com/flycheck/flycheck'.
-
-Flycheck displays its status in the mode line. In the default
-configuration, it looks like this:
-
-`FlyC' This buffer has not been checked yet.
-`FlyC-' Flycheck doesn't have a checker for this buffer.
-`FlyC*' Flycheck is running. Expect results soon!
-`FlyC:3|2' This buffer contains three warnings and two errors.
- Use `\\[flycheck-list-errors]' to see the list.
-
-You may also see the following icons:
-`FlyC!' The checker crashed.
-`FlyC.' The last syntax check was manually interrupted.
-`FlyC?' The checker did something unexpected, like exiting with 1
- but returning no errors.
-
-The following keybindings are available in `flycheck-mode':
-
-\\{flycheck-mode-map}
-\(you can change the prefix by customizing
-`flycheck-keymap-prefix')
-
-If called interactively, enable Flycheck mode if ARG is positive,
-and disable it if ARG is zero or negative. If called from Lisp,
-also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is ‘toggle’; disable the mode otherwise.
-
-\(fn &optional ARG)" t nil)
-
-(defvar global-flycheck-mode nil "\
-Non-nil if Global Flycheck mode is enabled.
-See the `global-flycheck-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `global-flycheck-mode'.")
-
-(custom-autoload 'global-flycheck-mode "flycheck" nil)
-
-(autoload 'global-flycheck-mode "flycheck" "\
-Toggle Flycheck mode in all buffers.
-With prefix ARG, enable Global Flycheck mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Flycheck mode is enabled in all buffers where
-`flycheck-mode-on-safe' would do it.
-See `flycheck-mode' for more information on Flycheck mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'flycheck-define-error-level "flycheck" "\
-Define a new error LEVEL with PROPERTIES.
-
-The following PROPERTIES constitute an error level:
-
-`:severity SEVERITY'
- A number denoting the severity of this level. The higher
- the number, the more severe is this level compared to other
- levels. Defaults to 0; info is -10, warning is 10, and
- error is 100.
-
- The severity is used by `flycheck-error-level-<' to
- determine the ordering of errors according to their levels.
-
-`:compilation-level LEVEL'
-
- A number indicating the broad class of messages that errors
- at this level belong to: one of 0 (info), 1 (warning), or
- 2 or nil (error). Defaults to nil.
-
- This is used by `flycheck-checker-pattern-to-error-regexp'
- to map error levels into `compilation-mode''s hierarchy and
- to get proper highlighting of errors in `compilation-mode'.
-
-`:overlay-category CATEGORY'
- A symbol denoting the overlay category to use for error
- highlight overlays for this level. See Info
- node `(elisp)Overlay Properties' for more information about
- overlay categories.
-
- A category for an error level overlay should at least define
- the `face' property, for error highlighting. Another useful
- property for error level categories is `priority', to
- influence the stacking of multiple error level overlays.
-
-`:fringe-bitmap BITMAPS'
- A fringe bitmap symbol denoting the bitmap to use for fringe
- indicators for this level, or a cons of two bitmaps (one for
- narrow fringes and one for wide fringes). See Info node
- `(elisp)Fringe Bitmaps' for more information about fringe
- bitmaps, including a list of built-in fringe bitmaps.
-
-`:fringe-face FACE'
- A face symbol denoting the face to use for fringe indicators
- for this level.
-
-`:margin-spec SPEC'
- A display specification indicating what to display in the
- margin when `flycheck-indication-mode' is `left-margin' or
- `right-margin'. See Info node `(elisp)Displaying in the
- Margins'. If omitted, Flycheck generates an image spec from
- the fringe bitmap.
-
-`:error-list-face FACE'
- A face symbol denoting the face to use for messages of this
- level in the error list. See `flycheck-list-errors'.
-
-\(fn LEVEL &rest PROPERTIES)" nil nil)
-
-(function-put 'flycheck-define-error-level 'lisp-indent-function '1)
-
-(autoload 'flycheck-define-command-checker "flycheck" "\
-Define SYMBOL as syntax checker to run a command.
-
-Define SYMBOL as generic syntax checker via
-`flycheck-define-generic-checker', which uses an external command
-to check the buffer. SYMBOL and DOCSTRING are the same as for
-`flycheck-define-generic-checker'.
-
-In addition to the properties understood by
-`flycheck-define-generic-checker', the following PROPERTIES
-constitute a command syntax checker. Unless otherwise noted, all
-properties are mandatory. Note that the default `:error-filter'
-of command checkers is `flycheck-sanitize-errors'.
-
-`:command COMMAND'
- The command to run for syntax checking.
-
- COMMAND is a list of the form `(EXECUTABLE [ARG ...])'.
-
- EXECUTABLE is a string with the executable of this syntax
- checker. It can be overridden with the variable
- `flycheck-SYMBOL-executable'. Note that this variable is
- NOT implicitly defined by this function. Use
- `flycheck-def-executable-var' to define this variable.
-
- Each ARG is an argument to the executable, either as string,
- or as special symbol or form for
- `flycheck-substitute-argument', which see.
-
-`:error-patterns PATTERNS'
- A list of patterns to parse the output of the `:command'.
-
- Each ITEM in PATTERNS is a list `(LEVEL SEXP ...)', where
- LEVEL is a Flycheck error level (see
- `flycheck-define-error-level'), followed by one or more RX
- `SEXP's which parse an error of that level and extract line,
- column, file name and the message.
-
- See `rx' for general information about RX, and
- `flycheck-rx-to-string' for some special RX forms provided
- by Flycheck.
-
- All patterns are applied in the order of declaration to the
- whole output of the syntax checker. Output already matched
- by a pattern will not be matched by subsequent patterns. In
- other words, the first pattern wins.
-
- This property is optional. If omitted, however, an
- `:error-parser' is mandatory.
-
-`:error-parser FUNCTION'
- A function to parse errors with.
-
- The function shall accept three arguments OUTPUT CHECKER
- BUFFER. OUTPUT is the syntax checker output as string,
- CHECKER the syntax checker that was used, and BUFFER a
- buffer object representing the checked buffer. The function
- must return a list of `flycheck-error' objects parsed from
- OUTPUT.
-
- This property is optional. If omitted, it defaults to
- `flycheck-parse-with-patterns'. In this case,
- `:error-patterns' is mandatory.
-
-`:standard-input t'
- Whether to send the buffer contents on standard input.
-
- If this property is given and has a non-nil value, send the
- contents of the buffer on standard input.
-
- Defaults to nil.
-
-Note that you may not give `:start', `:interrupt', and
-`:print-doc' for a command checker. You can give a custom
-`:verify' function, though, whose results will be appended to the
-default `:verify' function of command checkers.
-
-\(fn SYMBOL DOCSTRING &rest PROPERTIES)" nil nil)
-
-(function-put 'flycheck-define-command-checker 'lisp-indent-function '1)
-
-(function-put 'flycheck-define-command-checker 'doc-string-elt '2)
-
-(autoload 'flycheck-def-config-file-var "flycheck" "\
-Define SYMBOL as config file variable for CHECKER, with default FILE-NAME.
-
-SYMBOL is declared as customizable variable using `defcustom', to
-provide configuration files for the given syntax CHECKER.
-CUSTOM-ARGS are forwarded to `defcustom'.
-
-FILE-NAME is the initial value of the new variable. If omitted,
-the default value is nil. It can be either a string or a list of
-strings.
-
-Use this together with the `config-file' form in the `:command'
-argument to `flycheck-define-checker'.
-
-\(fn SYMBOL CHECKER &optional FILE-NAME &rest CUSTOM-ARGS)" nil t)
-
-(function-put 'flycheck-def-config-file-var 'lisp-indent-function '3)
-
-(autoload 'flycheck-def-option-var "flycheck" "\
-Define SYMBOL as option variable with INIT-VALUE for CHECKER.
-
-SYMBOL is declared as customizable variable using `defcustom', to
-provide an option for the given syntax CHECKERS (a checker or a
-list of checkers). INIT-VALUE is the initial value of the
-variable, and DOCSTRING is its docstring. CUSTOM-ARGS are
-forwarded to `defcustom'.
-
-Use this together with the `option', `option-list' and
-`option-flag' forms in the `:command' argument to
-`flycheck-define-checker'.
-
-\(fn SYMBOL INIT-VALUE CHECKERS DOCSTRING &rest CUSTOM-ARGS)" nil t)
-
-(function-put 'flycheck-def-option-var 'lisp-indent-function '3)
-
-(function-put 'flycheck-def-option-var 'doc-string-elt '4)
-
-(autoload 'flycheck-define-checker "flycheck" "\
-Define SYMBOL as command syntax checker with DOCSTRING and PROPERTIES.
-
-Like `flycheck-define-command-checker', but PROPERTIES must not
-be quoted. Also, implicitly define the executable variable for
-SYMBOL with `flycheck-def-executable-var'.
-
-\(fn SYMBOL DOCSTRING &rest PROPERTIES)" nil t)
-
-(function-put 'flycheck-define-checker 'lisp-indent-function '1)
-
-(function-put 'flycheck-define-checker 'doc-string-elt '2)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck" '("flycheck-" "list-flycheck-errors" "help-flycheck-checker-d")))
-
-;;;***
-
-;;;### (autoloads nil "flycheck-buttercup" "flycheck-buttercup.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from flycheck-buttercup.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-buttercup" '("flycheck-buttercup-format-error-list")))
-
-;;;***
-
-;;;### (autoloads nil "flycheck-ert" "flycheck-ert.el" (0 0 0 0))
-;;; Generated autoloads from flycheck-ert.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-ert" '("flycheck-er")))
-
-;;;***
-
-;;;### (autoloads nil nil ("flycheck-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; flycheck-autoloads.el ends here
diff --git a/elpa/flycheck-20200610.1809/flycheck-buttercup.el b/elpa/flycheck-20200610.1809/flycheck-buttercup.el
deleted file mode 100644
index 9802265..0000000
--- a/elpa/flycheck-20200610.1809/flycheck-buttercup.el
+++ /dev/null
@@ -1,157 +0,0 @@
-;;; flycheck-buttercup.el --- Flycheck: Extensions to Buttercup -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Flycheck contributors
-;; Copyright (C) 2016 Sebastian Wiesner and Flycheck contributors
-
-;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
-;; Maintainer: Clément Pit-Claudel <clement.pitclaudel@live.com>
-;; fmdkdd <fmdkdd@gmail.com>
-;; Keywords: lisp, tools
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Extensions to Buttercup to write BDD tests for Flycheck.
-;;
-;; Buttercup is a BDD testing framework for Emacs, see URL
-;; `https://github.com/jorgenschaefer/emacs-buttercup/'. Flycheck uses
-;; Buttercup extensively for new tests.
-;;
-;; This library provides extensions to Buttercup to write Specs for Flycheck.
-;;
-;; * Custom matchers
-;;
-;; (expect 'foo :to-be-local) - Is `foo' a local variable in the current buffer?
-
-;;; Code:
-
-(require 'buttercup)
-(require 'flycheck)
-(require 'seq)
-
-
-;;; Buttercup helpers
-
-(defun flycheck-buttercup-format-error-list (errors)
- "Format ERRORS into a human-readable string."
- (mapconcat (lambda (e) (flycheck-error-format e 'with-file-name))
- errors "\n"))
-
-
-;;; Data matchers
-
-(buttercup-define-matcher :to-be-empty-string (s)
- (let ((s (funcall s)))
- (if (equal s "")
- (cons t (format "Expected %S not be an empty string" s))
- (cons nil (format "Expected %S to be an empty string" s)))))
-
-(buttercup-define-matcher :to-match-with-group (re s index match)
- (let* ((re (funcall re))
- (s (funcall s))
- (index (funcall index))
- (match (funcall match))
- (matches? (string-match re s))
- (result (and matches? (match-string index s))))
- (if (and matches? (equal result match))
- (cons t (format "Expected %S not to match %S with %S in group %s"
- re s match index))
-
- (cons nil (format "Expected %S to match %S with %S in group %s, %s"
- re s match index
- (if matches?
- (format "but got %S" result)
- "but did not match"))))))
-
-
-;;; Emacs feature matchers
-
-(buttercup-define-matcher :to-be-live (buffer)
- (let ((buffer (get-buffer (funcall buffer))))
- (if (buffer-live-p buffer)
- (cons t (format "Expected %S not to be a live buffer, but it is"
- buffer))
- (cons nil (format "Expected %S to be a live buffer, but it is not"
- buffer)))))
-
-(buttercup-define-matcher :to-be-visible (buffer)
- (let ((buffer (get-buffer (funcall buffer))))
- (cond
- ((and buffer (get-buffer-window buffer))
- (cons t (format "Expected %S not to be a visible buffer, but it is"
- buffer)))
- ((not (bufferp buffer))
- (cons nil
- (format "Expected %S to be a visible buffer, but it is not a buffer"
- buffer)))
- (t (cons
- nil
- (format "Expected %S to be a visible buffer, but it is not visible"
- buffer))))))
-
-(buttercup-define-matcher :to-be-local (symbol)
- (let ((symbol (funcall symbol)))
- (if (local-variable-p symbol)
- (cons t (format "Expected %S not to be a local variable, but it is"
- symbol))
- (cons nil (format "Expected %S to be a local variable, but it is not"
- symbol)))))
-
-(buttercup-define-matcher :to-contain-match (buffer re)
- (let ((buffer (funcall buffer))
- (re (funcall re)))
- (if (not (get-buffer buffer))
- (cons nil (format "Expected %S to contain a match of %s, \
-but is not a buffer" buffer re))
- (with-current-buffer buffer
- (save-excursion
- (goto-char (point-min))
- (if (re-search-forward re nil 'noerror)
- (cons t (format "Expected %S to contain a match \
-for %s, but it did not" buffer re))
- (cons nil (format "Expected %S not to contain a match for \
-%s but it did not." buffer re))))))))
-
-
-;;; Flycheck matchers
-
-(buttercup-define-matcher :to-be-equal-flycheck-errors (a b)
- (let* ((a (funcall a))
- (b (funcall b))
- (a-formatted (flycheck-buttercup-format-error-list a))
- (b-formatted (flycheck-buttercup-format-error-list b)))
- (if (equal a b)
- (cons t (format "Expected
-%s
-not to be equal to
-%s" a-formatted b-formatted))
- (cons nil (format "Expected
-%s
-to be equal to
-%s" a-formatted b-formatted)))))
-
-(provide 'flycheck-buttercup)
-
-;; Disable byte compilation for this library, to prevent package.el choking on a
-;; missing `buttercup' library. See
-;; https://github.com/flycheck/flycheck/issues/860
-
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
-;;; flycheck-buttercup.el ends here
diff --git a/elpa/flycheck-20200610.1809/flycheck-ert.el b/elpa/flycheck-20200610.1809/flycheck-ert.el
deleted file mode 100644
index 4d64a73..0000000
--- a/elpa/flycheck-20200610.1809/flycheck-ert.el
+++ /dev/null
@@ -1,507 +0,0 @@
-;;; flycheck-ert.el --- Flycheck: ERT extensions -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017-2018 Flycheck contributors
-;; Copyright (C) 2013-2016 Sebastian Wiesner and Flycheck contributors
-
-;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
-;; Maintainer: Clément Pit-Claudel <clement.pitclaudel@live.com>
-;; fmdkdd <fmdkdd@gmail.com>
-;; URL: https://github.com/flycheck/flycheck
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Unit testing library for Flycheck, the modern on-the-fly syntax checking
-;; extension for GNU Emacs.
-
-;; Provide various utility functions and unit test helpers to test Flycheck and
-;; Flycheck extensions.
-
-;;; Code:
-
-(require 'flycheck)
-(require 'ert)
-(require 'macroexp) ; For macro utilities
-
-
-;;; Compatibility
-
-(eval-and-compile
- ;; Provide `ert-skip' and friends for Emacs 24.3
- (defconst flycheck-ert-ert-can-skip (fboundp 'ert-skip)
- "Whether ERT supports test skipping.")
-
- (unless (fboundp 'define-error)
- ;; from Emacs `subr.el'
- (defun define-error (name message &optional parent)
- "Define NAME as a new error signal.
-MESSAGE is a string that will be output to the echo area if such an error
-is signaled without being caught by a `condition-case'.
-PARENT is either a signal or a list of signals from which it inherits.
-Defaults to `error'."
- (unless parent (setq parent 'error))
- (let ((conditions
- (if (consp parent)
- (apply #'append
- (mapcar
- (lambda (parent)
- (cons parent
- (or (get parent 'error-conditions)
- (error "Unknown signal `%s'" parent))))
- parent))
- (cons parent (get parent 'error-conditions)))))
- (put name 'error-conditions
- (delete-dups (copy-sequence (cons name conditions))))
- (when message (put name 'error-message message)))))
-
- (unless flycheck-ert-ert-can-skip
- ;; Fake skipping
-
- (define-error 'flycheck-ert-skipped "Test skipped")
-
- (defun ert-skip (data)
- (signal 'flycheck-ert-skipped data))
-
- (defmacro skip-unless (form)
- `(unless (ignore-errors ,form)
- (signal 'flycheck-ert-skipped ',form)))
-
- (defun ert-test-skipped-p (result)
- (and (ert-test-failed-p result)
- (eq (car (ert-test-failed-condition result))
- 'flycheck-ert-skipped)))))
-
-
-;;; Internal variables
-
-(defvar flycheck-ert--resource-directory nil
- "The directory to get resources from in this test suite.")
-
-
-;;; Resource management macros
-
-(defmacro flycheck-ert-with-temp-buffer (&rest body)
- "Eval BODY within a temporary buffer.
-
-Like `with-temp-buffer', but resets the modification state of the
-temporary buffer to make sure that it is properly killed even if
-it has a backing file and is modified."
- (declare (indent 0) (debug t))
- `(with-temp-buffer
- (unwind-protect
- ,(macroexp-progn body)
- ;; Reset modification state of the buffer, and unlink it from its backing
- ;; file, if any, because Emacs refuses to kill modified buffers with
- ;; backing files, even if they are temporary.
- (set-buffer-modified-p nil)
- (set-visited-file-name nil 'no-query))))
-
-(defmacro flycheck-ert-with-file-buffer (file-name &rest body)
- "Create a buffer from FILE-NAME and eval BODY.
-
-BODY is evaluated with `current-buffer' being a buffer with the
-contents FILE-NAME."
- (declare (indent 1) (debug t))
- `(let ((file-name ,file-name))
- (unless (file-exists-p file-name)
- (error "%s does not exist" file-name))
- (flycheck-ert-with-temp-buffer
- (insert-file-contents file-name 'visit)
- (set-visited-file-name file-name 'no-query)
- (cd (file-name-directory file-name))
- ;; Mark the buffer as not modified, because we just loaded the file up to
- ;; now.
- (set-buffer-modified-p nil)
- ,@body)))
-
-(defmacro flycheck-ert-with-help-buffer (&rest body)
- "Execute BODY and kill the help buffer afterwards.
-
-Use this macro to test functions that create a Help buffer."
- (declare (indent 0))
- `(unwind-protect
- ,(macroexp-progn body)
- (when (buffer-live-p (get-buffer (help-buffer)))
- (kill-buffer (help-buffer)))))
-
-(defmacro flycheck-ert-with-global-mode (&rest body)
- "Execute BODY with Global Flycheck Mode enabled.
-
-After BODY, restore the old state of Global Flycheck Mode."
- (declare (indent 0))
- `(let ((old-state global-flycheck-mode))
- (unwind-protect
- (progn
- (global-flycheck-mode 1)
- ,@body)
- (global-flycheck-mode (if old-state 1 -1)))))
-
-(defmacro flycheck-ert-with-env (env &rest body)
- "Add ENV to `process-environment' in BODY.
-
-Execute BODY with a `process-environment' which contains all
-variables from ENV added.
-
-ENV is an alist, where each cons cell `(VAR . VALUE)' is a
-environment variable VAR to be added to `process-environment'
-with VALUE."
- (declare (indent 1))
- `(let ((process-environment (copy-sequence process-environment)))
- (pcase-dolist (`(,var . ,value) ,env)
- (setenv var value))
- ,@body))
-
-
-;;; Test resources
-(defun flycheck-ert-resource-filename (resource-file)
- "Determine the absolute file name of a RESOURCE-FILE.
-
-Relative file names are expanded against
-`flycheck-ert--resource-directory'."
- (expand-file-name resource-file flycheck-ert--resource-directory))
-
-(defmacro flycheck-ert-with-resource-buffer (resource-file &rest body)
- "Create a temp buffer from a RESOURCE-FILE and execute BODY.
-
-The absolute file name of RESOURCE-FILE is determined with
-`flycheck-ert-resource-filename'."
- (declare (indent 1))
- `(flycheck-ert-with-file-buffer
- (flycheck-ert-resource-filename ,resource-file)
- ,@body))
-
-
-;;; Test suite initialization
-
-(defun flycheck-ert-initialize (resource-dir)
- "Initialize a test suite with RESOURCE-DIR.
-
-RESOURCE-DIR is the directory, `flycheck-ert-resource-filename'
-should use to lookup resource files."
- (when flycheck-ert--resource-directory
- (error "Test suite already initialized"))
- (let ((tests (ert-select-tests t t)))
- ;; Select all tests
- (unless tests
- (error "No tests defined. \
-Call `flycheck-ert-initialize' after defining all tests!"))
-
- (setq flycheck-ert--resource-directory resource-dir)
-
- ;; Emacs 24.3 don't support skipped tests, so we add poor man's test
- ;; skipping: We mark skipped tests as expected failures by adjusting the
- ;; expected result of all test cases. Not particularly pretty, but works :)
- (unless flycheck-ert-ert-can-skip
- (dolist (test tests)
- (let ((result (ert-test-expected-result-type test)))
- (setf (ert-test-expected-result-type test)
- `(or ,result (satisfies ert-test-skipped-p))))))))
-
-
-;;; Test case definitions
-(defmacro flycheck-ert-def-checker-test (checker language name
- &rest keys-and-body)
- "Define a test case for a syntax CHECKER for LANGUAGE.
-
-CHECKER is a symbol or a list of symbols denoting syntax checkers
-being tested by the test. The test case is skipped, if any of
-these checkers cannot be used. LANGUAGE is a symbol or a list of
-symbols denoting the programming languages supported by the
-syntax checkers. This is currently only used for tagging the
-test appropriately.
-
-NAME is a symbol denoting the local name of the test. The test
-itself is ultimately named
-`flycheck-define-checker/CHECKER/NAME'. If CHECKER is a list,
-the first checker in the list is used for naming the test.
-
-Optionally, the keyword arguments `:tags' and `:expected-result'
-may be given. They have the same meaning as in `ert-deftest.',
-and are added to the tags and result expectations set up by this
-macro.
-
-The remaining forms KEYS-AND-BODY denote the body of the test
-case, including assertions and setup code."
- (declare (indent 3))
- (unless checker
- (error "No syntax checkers specified"))
- (unless language
- (error "No languages specified"))
- (let* ((checkers (if (symbolp checker) (list checker) checker))
- (checker (car checkers))
- (languages (if (symbolp language) (list language) language))
- (language-tags (mapcar (lambda (l) (intern (format "language-%s" l)))
- languages))
- (checker-tags (mapcar (lambda (c) (intern (format "checker-%s" c)))
- checkers))
- (local-name (or name 'default))
- (full-name (intern (format "flycheck-define-checker/%s/%s"
- checker local-name)))
- (keys-and-body (ert--parse-keys-and-body keys-and-body))
- (body (cadr keys-and-body))
- (keys (car keys-and-body))
- (default-tags '(syntax-checker external-tool)))
- `(ert-deftest ,full-name ()
- :expected-result ,(or (plist-get keys :expected-result) :passed)
- :tags (append ',(append default-tags language-tags checker-tags)
- ,(plist-get keys :tags))
- ,@(mapcar (lambda (c)
- `(skip-unless
- ;; Ignore non-command checkers
- (or (not (flycheck-checker-get ',c 'command))
- (executable-find (flycheck-checker-executable ',c)))))
- checkers)
- ,@body)))
-
-
-;;; Test case results
-
-(defun flycheck-ert-syntax-check-timed-out-p (result)
- "Whether RESULT denotes a timed-out test.
-
-RESULT is an ERT test result object."
- (and (ert-test-failed-p result)
- (eq (car (ert-test-failed-condition result))
- 'flycheck-ert-syntax-check-timed-out)))
-
-
-;;; Syntax checking in tests
-
-(defvar-local flycheck-ert-syntax-checker-finished nil
- "Non-nil if the current checker has finished.")
-
-(add-hook 'flycheck-after-syntax-check-hook
- (lambda () (setq flycheck-ert-syntax-checker-finished t)))
-
-(defconst flycheck-ert-checker-wait-time 10
- "Time to wait until a checker is finished in seconds.
-
-After this time has elapsed, the checker is considered to have
-failed, and the test aborted with failure.")
-
-(define-error 'flycheck-ert-syntax-check-timed-out "Syntax check timed out.")
-
-(defun flycheck-ert-wait-for-syntax-checker ()
- "Wait until the syntax check in the current buffer is finished."
- (let ((starttime (float-time)))
- (while (and (not flycheck-ert-syntax-checker-finished)
- (< (- (float-time) starttime) flycheck-ert-checker-wait-time))
- (accept-process-output nil 0.02))
- (unless (< (- (float-time) starttime) flycheck-ert-checker-wait-time)
- (flycheck-stop)
- (signal 'flycheck-ert-syntax-check-timed-out nil)))
- (setq flycheck-ert-syntax-checker-finished nil))
-
-(defun flycheck-ert-buffer-sync ()
- "Like `flycheck-buffer', but synchronously."
- (setq flycheck-ert-syntax-checker-finished nil)
- (should (not (flycheck-running-p)))
- (flycheck-mode) ;; This will only start a deferred check,
- (should (flycheck-get-checker-for-buffer))
- (flycheck-buffer) ;; …so we need an explicit manual check
- ;; After starting the check, the checker should either be running now, or
- ;; already be finished (if it was fast).
- (should (or flycheck-current-syntax-check
- flycheck-ert-syntax-checker-finished))
- ;; Also there should be no deferred check pending anymore
- (should-not (flycheck-deferred-check-p))
- (flycheck-ert-wait-for-syntax-checker))
-
-(defun flycheck-ert-ensure-clear ()
- "Clear the current buffer.
-
-Raise an assertion error if the buffer is not clear afterwards."
- (flycheck-clear)
- (should (not flycheck-current-errors))
- (should (not (-any? (lambda (ov) (overlay-get ov 'flycheck-overlay))
- (overlays-in (point-min) (point-max))))))
-
-
-;;; Test assertions
-
-(defun flycheck-error-without-group (err)
- "Return a copy ERR with the `group' property set to nil."
- (let ((copy (copy-flycheck-error err)))
- (setf (flycheck-error-group copy) nil)
- copy))
-
-(defun flycheck-ert-should-overlay (error)
- "Test that ERROR has a proper overlay in the current buffer.
-
-ERROR is a Flycheck error object."
- (let* ((overlay (-first (lambda (ov)
- (equal (flycheck-error-without-group
- (overlay-get ov 'flycheck-error))
- (flycheck-error-without-group error)))
- (flycheck-overlays-in 0 (+ 1 (buffer-size)))))
- (region
- ;; Overlays of errors from other files are on the first line
- (if (flycheck-relevant-error-other-file-p error)
- (cons (point-min)
- (save-excursion (goto-char (point-min)) (point-at-eol)))
- (flycheck-error-region-for-mode error 'symbols)))
- (level (flycheck-error-level error))
- (category (flycheck-error-level-overlay-category level))
- (face (get category 'face))
- (fringe-bitmap (flycheck-error-level-fringe-bitmap level))
- (fringe-face (flycheck-error-level-fringe-face level))
- (fringe-icon (list 'left-fringe fringe-bitmap fringe-face)))
- (should overlay)
- (should (overlay-get overlay 'flycheck-overlay))
- (should (= (overlay-start overlay) (car region)))
- (should (= (overlay-end overlay) (cdr region)))
- (should (eq (overlay-get overlay 'face) face))
- (should (equal (get-char-property 0 'display
- (overlay-get overlay 'before-string))
- fringe-icon))
- (should (eq (overlay-get overlay 'category) category))
- (should (equal (flycheck-error-without-group (overlay-get overlay
- 'flycheck-error))
- (flycheck-error-without-group error)))))
-
-(defun flycheck-ert-sort-errors (errors)
- "Sort ERRORS by `flycheck-error-<'."
- (seq-sort #'flycheck-error-< errors))
-
-(defun flycheck-ert-should-errors (&rest errors)
- "Test that the current buffers has ERRORS.
-
-ERRORS is a list of errors expected to be present in the current
-buffer. Each error is given as a list of arguments to
-`flycheck-error-new-at'.
-
-If ERRORS are omitted, test that there are no errors at all in
-the current buffer.
-
-With ERRORS, test that each error in ERRORS is present in the
-current buffer, and that the number of errors in the current
-buffer is equal to the number of given ERRORS. In other words,
-check that the buffer has all ERRORS, and no other errors."
- (let ((expected (flycheck-ert-sort-errors
- (mapcar (apply-partially #'apply #'flycheck-error-new-at)
- errors)))
- (current (flycheck-ert-sort-errors flycheck-current-errors)))
- (should (equal (mapcar #'flycheck-error-without-group expected)
- (mapcar #'flycheck-error-without-group current)))
- ;; Check that related errors are the same
- (cl-mapcar
- (lambda (err1 err2)
- (should (equal (flycheck-ert-sort-errors
- (mapcar #'flycheck-error-without-group
- (flycheck-related-errors err1 expected)))
- (flycheck-ert-sort-errors
- (mapcar #'flycheck-error-without-group
- (flycheck-related-errors err2))))))
- expected current)
- (mapc #'flycheck-ert-should-overlay expected))
- (should (= (length errors)
- (length (flycheck-overlays-in (point-min) (point-max))))))
-
-(define-error 'flycheck-ert-suspicious-checker "Suspicious state from checker")
-
-(defun flycheck-ert-should-syntax-check-in-buffer (&rest errors)
- "Test a syntax check in BUFFER, expecting ERRORS.
-
-This is like `flycheck-ert-should-syntax-check', but with a
-buffer in the right mode instead of a file."
- ;; Load safe file-local variables because some tests depend on them
- (let ((enable-local-variables :safe)
- ;; Disable all hooks at this place, to prevent 3rd party packages
- ;; from interfering
- (hack-local-variables-hook))
- (hack-local-variables))
- ;; Configure config file locating for unit tests
- (let ((process-hook-called 0)
- (suspicious nil))
- (add-hook 'flycheck-process-error-functions
- (lambda (_err)
- (setq process-hook-called (1+ process-hook-called))
- nil)
- nil :local)
- (add-hook 'flycheck-status-changed-functions
- (lambda (status)
- (when (eq status 'suspicious)
- (setq suspicious t)))
- nil :local)
- (flycheck-ert-buffer-sync)
- (when suspicious
- (signal 'flycheck-ert-suspicious-checker nil))
- (apply #'flycheck-ert-should-errors errors)
- (should (= process-hook-called (length errors))))
- (flycheck-ert-ensure-clear))
-
-(defun flycheck-ert-should-syntax-check (resource-file modes &rest errors)
- "Test a syntax check in RESOURCE-FILE with MODES.
-
-RESOURCE-FILE is the file to check. MODES is a single major mode
-symbol or a list thereof, specifying the major modes to syntax
-check with. If more than one major mode is specified, the test
-is run for each mode separately, so if you give three major
-modes, the entire test will run three times. ERRORS is the list
-of expected errors, as in `flycheck-ert-should-errors'. If
-omitted, the syntax check must not emit any errors. The errors
-are cleared after each test.
-
-The syntax checker is selected via standard syntax checker
-selection. To test a specific checker, you need to set
-`flycheck-checker' or `flycheck-disabled-checkers' accordingly
-before using this predicate, depending on whether you want to use
-manual or automatic checker selection.
-
-During the syntax check, configuration files of syntax checkers
-are also searched in the `config-files' sub-directory of the
-resource directory."
- (when (symbolp modes)
- (setq modes (list modes)))
- (dolist (mode modes)
- (unless (fboundp mode)
- (ert-skip (format "%S missing" mode)))
- (flycheck-ert-with-resource-buffer resource-file
- (funcall mode)
- (apply #'flycheck-ert-should-syntax-check-in-buffer errors))))
-
-(defun flycheck-ert-at-nth-error (n)
- "Determine whether point is at the N'th Flycheck error.
-
-Return non-nil if the point is at the N'th Flycheck error in the
-current buffer. Otherwise return nil."
- (let* ((error (nth (1- n) flycheck-current-errors))
- (mode flycheck-highlighting-mode)
- (region (flycheck-error-region-for-mode error mode)))
- (and (member error (flycheck-overlay-errors-at (point)))
- (= (point) (car region)))))
-
-(defun flycheck-ert-explain--at-nth-error (n)
- "Explain a failed at-nth-error predicate at N."
- (let ((errors (flycheck-overlay-errors-at (point))))
- (if (null errors)
- (format "Expected to be at error %s, but no error at point %s"
- n (point))
- (let ((pos (cl-position (car errors) flycheck-current-errors)))
- (format "Expected to be at point %s and error %s, \
-but point %s is at error %s"
- (car (flycheck-error-region-for-mode
- (nth (1- n) flycheck-current-errors)
- flycheck-highlighting-mode))
- n (point) (1+ pos))))))
-
-(put 'flycheck-ert-at-nth-error 'ert-explainer
- 'flycheck-ert-explain--at-nth-error)
-
-(provide 'flycheck-ert)
-
-;;; flycheck-ert.el ends here
diff --git a/elpa/flycheck-20200610.1809/flycheck-pkg.el b/elpa/flycheck-20200610.1809/flycheck-pkg.el
deleted file mode 100644
index c7ba932..0000000
--- a/elpa/flycheck-20200610.1809/flycheck-pkg.el
+++ /dev/null
@@ -1,16 +0,0 @@
-(define-package "flycheck" "20200610.1809" "On-the-fly syntax checking"
- '((dash "2.12.1")
- (pkg-info "0.4")
- (let-alist "1.0.4")
- (seq "1.11")
- (emacs "24.3"))
- :commit "c02cd773dded0215f9417ec04dfe8dabda63ef43" :keywords
- '("convenience" "languages" "tools")
- :authors
- '(("Sebastian Wiesner" . "swiesner@lunaryorn.com"))
- :maintainer
- '("Clément Pit-Claudel" . "clement.pitclaudel@live.com")
- :url "http://www.flycheck.org")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/flycheck-20200610.1809/flycheck.el b/elpa/flycheck-20200610.1809/flycheck.el
deleted file mode 100644
index 3943f0e..0000000
--- a/elpa/flycheck-20200610.1809/flycheck.el
+++ /dev/null
@@ -1,12332 +0,0 @@
-;;; flycheck.el --- On-the-fly syntax checking -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017-2019 Flycheck contributors
-;; Copyright (C) 2012-2016 Sebastian Wiesner and Flycheck contributors
-;; Copyright (C) 2013, 2014 Free Software Foundation, Inc.
-;;
-;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
-;; Maintainer: Clément Pit-Claudel <clement.pitclaudel@live.com>
-;; fmdkdd <fmdkdd@gmail.com>
-;; URL: http://www.flycheck.org
-;; Keywords: convenience, languages, tools
-;; Version: 32-cvs
-;; Package-Requires: ((dash "2.12.1") (pkg-info "0.4") (let-alist "1.0.4") (seq "1.11") (emacs "24.3"))
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; On-the-fly syntax checking for GNU Emacs 24.
-;;
-;; Flycheck is a modern on-the-fly syntax checking extension for GNU Emacs,
-;; intended as replacement for the older Flymake extension which is part of GNU
-;; Emacs.
-;;
-;; Flycheck automatically checks buffers for errors while you type, and reports
-;; warnings and errors directly in the buffer and in an optional IDE-like error
-;; list.
-;;
-;; It comes with a rich interface for custom syntax checkers and other
-;; extensions, and has already many 3rd party extensions adding new features.
-;;
-;; Please read the online manual at http://www.flycheck.org for more
-;; information. You can open the manual directly from Emacs with `M-x
-;; flycheck-manual'.
-;;
-;; # Setup
-;;
-;; Flycheck works best on Unix systems. It does not officially support Windows,
-;; but tries to maintain Windows compatibility and should generally work fine on
-;; Windows, too.
-;;
-;; To enable Flycheck add the following to your init file:
-;;
-;; (add-hook 'after-init-hook #'global-flycheck-mode)
-;;
-;; Flycheck will then automatically check buffers in supported languages, as
-;; long as all necessary tools are present. Use `flycheck-verify-setup' to
-;; troubleshoot your Flycheck setup.
-
-;;; Code:
-
-(eval-when-compile
- (require 'let-alist) ; `let-alist'
- (require 'compile) ; Compile Mode integration
- (require 'jka-compr) ; To inhibit compression of temp files
- (require 'pcase) ; `pcase-dolist' (`pcase' itself is autoloaded)
- )
-
-(require 'dash)
-
-(require 'seq) ; Sequence functions
-(require 'subr-x nil 'no-error) ; Additional utilities, Emacs 24.4 and upwards
-(require 'cl-lib) ; `cl-defstruct' and CL utilities
-(require 'tabulated-list) ; To list errors
-(require 'easymenu) ; Flycheck Mode menu definition
-(require 'rx) ; Regexp fanciness in `flycheck-define-checker'
-(require 'help-mode) ; `define-button-type'
-(require 'find-func) ; `find-function-regexp-alist'
-(require 'json) ; `flycheck-parse-tslint'
-(require 'ansi-color) ; `flycheck-parse-with-patterns-without-color'
-
-
-;; Declare a bunch of dynamic variables that we need from other modes
-(defvar sh-shell) ; For shell script checker predicates
-(defvar ess-language) ; For r-lintr predicate
-(defvar markdown-hide-markup) ;
-(defvar markdown-fontify-code-block-default-mode) ; For rust-error-explainer
-(defvar markdown-fontify-code-blocks-natively) ;
-
-;; Tell the byte compiler about autoloaded functions from packages
-(declare-function pkg-info-version-info "pkg-info" (package))
-
-
-;;; Compatibility
-(eval-and-compile
- (unless (fboundp 'string-suffix-p)
- ;; TODO: Remove when dropping support for Emacs 24.3 and earlier
- (defun string-suffix-p (suffix string &optional ignore-case)
- "Return non-nil if SUFFIX is a suffix of STRING.
-If IGNORE-CASE is non-nil, the comparison is done without paying
-attention to case differences."
- (let ((start-pos (- (length string) (length suffix))))
- (and (>= start-pos 0)
- (eq t (compare-strings suffix nil nil
- string start-pos nil ignore-case))))))
-
- (defalias 'flycheck--format-message
- (if (fboundp 'format-message) #'format-message #'format))
-
- ;; TODO: Remove when dropping support for Emacs 24.3 and earlier
- (unless (featurep 'subr-x)
- ;; `subr-x' function for Emacs 24.3 and below
- (defsubst string-join (strings &optional separator)
- "Join all STRINGS using SEPARATOR."
- (mapconcat 'identity strings separator))
-
- (defsubst string-trim-left (string)
- "Remove leading whitespace from STRING."
- (if (string-match "\\`[ \t\n\r]+" string)
- (replace-match "" t t string)
- string))
-
- (defsubst string-trim-right (string)
- "Remove trailing whitespace from STRING."
- (if (string-match "[ \t\n\r]+\\'" string)
- (replace-match "" t t string)
- string))
-
- (defsubst string-trim (string)
- "Remove leading and trailing whitespace from STRING."
- (string-trim-left (string-trim-right string)))
-
- (defsubst string-empty-p (string)
- "Check whether STRING is empty."
- (string= string ""))))
-
-
-;;; Customization
-(defgroup flycheck nil
- "Modern on-the-fly syntax checking for GNU Emacs."
- :prefix "flycheck-"
- :group 'tools
- :link '(url-link :tag "Website" "http://www.flycheck.org")
- :link '(url-link :tag "Github" "https://github.com/flycheck/flycheck"))
-
-(defgroup flycheck-config-files nil
- "Configuration files for on-the-fly syntax checkers."
- :prefix "flycheck-"
- :group 'flycheck)
-
-(defgroup flycheck-options nil
- "Options for on-the-fly syntax checkers."
- :prefix "flycheck-"
- :group 'flycheck)
-
-(defgroup flycheck-executables nil
- "Executables of syntax checkers."
- :prefix "flycheck-"
- :group 'flycheck)
-
-(defgroup flycheck-faces nil
- "Faces used by on-the-fly syntax checking."
- :prefix "flycheck-"
- :group 'flycheck)
-
-(defcustom flycheck-checkers
- '(ada-gnat
- asciidoctor
- asciidoc
- awk-gawk
- bazel-buildifier
- c/c++-clang
- c/c++-gcc
- c/c++-cppcheck
- cfengine
- chef-foodcritic
- coffee
- coffee-coffeelint
- coq
- css-csslint
- css-stylelint
- cuda-nvcc
- cwl
- d-dmd
- dockerfile-hadolint
- elixir-credo
- emacs-lisp
- emacs-lisp-checkdoc
- ember-template
- erlang-rebar3
- erlang
- eruby-erubis
- eruby-ruumba
- fortran-gfortran
- go-gofmt
- go-golint
- go-vet
- go-build
- go-test
- go-errcheck
- go-unconvert
- go-staticcheck
- groovy
- haml
- handlebars
- haskell-stack-ghc
- haskell-ghc
- haskell-hlint
- html-tidy
- javascript-eslint
- javascript-jshint
- javascript-standard
- json-jsonlint
- json-python-json
- json-jq
- jsonnet
- less
- less-stylelint
- llvm-llc
- lua-luacheck
- lua
- markdown-markdownlint-cli
- markdown-mdl
- nix
- nix-linter
- opam
- perl
- perl-perlcritic
- php
- php-phpmd
- php-phpcs
- processing
- proselint
- protobuf-protoc
- protobuf-prototool
- pug
- puppet-parser
- puppet-lint
- python-flake8
- python-pylint
- python-pycompile
- python-mypy
- r-lintr
- racket
- rpm-rpmlint
- rst-sphinx
- rst
- ruby-rubocop
- ruby-standard
- ruby-reek
- ruby-rubylint
- ruby
- ruby-jruby
- rust-cargo
- rust
- rust-clippy
- scala
- scala-scalastyle
- scheme-chicken
- scss-lint
- scss-stylelint
- sass/scss-sass-lint
- sass
- scss
- sh-bash
- sh-posix-dash
- sh-posix-bash
- sh-zsh
- sh-shellcheck
- slim
- slim-lint
- sql-sqlint
- systemd-analyze
- tcl-nagelfar
- terraform
- terraform-tflint
- tex-chktex
- tex-lacheck
- texinfo
- textlint
- typescript-tslint
- verilog-verilator
- vhdl-ghdl
- xml-xmlstarlet
- xml-xmllint
- yaml-jsyaml
- yaml-ruby
- yaml-yamllint)
- "Syntax checkers available for automatic selection.
-
-A list of Flycheck syntax checkers to choose from when syntax
-checking a buffer. Flycheck will automatically select a suitable
-syntax checker from this list, unless `flycheck-checker' is set,
-either directly or with `flycheck-select-checker'.
-
-You should not need to change this variable normally. In order
-to disable syntax checkers, please use
-`flycheck-disabled-checkers'. This variable is intended for 3rd
-party extensions to tell Flycheck about new syntax checkers.
-
-Syntax checkers in this list must be defined with
-`flycheck-define-checker'."
- :group 'flycheck
- :type '(repeat (symbol :tag "Checker"))
- :risky t)
-
-(defcustom flycheck-disabled-checkers nil
- "Syntax checkers excluded from automatic selection.
-
-A list of Flycheck syntax checkers to exclude from automatic
-selection. Flycheck will never automatically select a syntax
-checker in this list, regardless of the value of
-`flycheck-checkers'.
-
-However, syntax checkers in this list are still available for
-manual selection with `flycheck-select-checker'.
-
-Use this variable to disable syntax checkers, instead of removing
-the syntax checkers from `flycheck-checkers'. You may also use
-this option as a file or directory local variable to disable
-specific checkers in individual files and directories
-respectively."
- :group 'flycheck
- :type '(repeat (symbol :tag "Checker"))
- :package-version '(flycheck . "0.16")
- :safe #'flycheck-symbol-list-p)
-(make-variable-buffer-local 'flycheck-disabled-checkers)
-
-(defvar-local flycheck--automatically-disabled-checkers nil
- "List of syntax checkers automatically disabled for this buffer.
-
-A checker can be automatically disabled in two cases:
-
-1. Its `:enabled' predicate returned false.
-2. It returned too many errors (see `flycheck-checker-error-threshold').
-
-To trigger a reverification from Emacs Lisp code, do not modify
-this variable: use `flycheck-reset-enabled-checker'.")
-
-(defvar-local flycheck-checker nil
- "Syntax checker to use for the current buffer.
-
-If unset or nil, automatically select a suitable syntax checker
-from `flycheck-checkers' on every syntax check.
-
-If set to a syntax checker only use this syntax checker and never
-select one from `flycheck-checkers' automatically. The syntax
-checker is used regardless of whether it is contained in
-`flycheck-checkers' or `flycheck-disabled-checkers'. If the
-syntax checker is unusable in the current buffer an error is
-signaled.
-
-A syntax checker assigned to this variable must be defined with
-`flycheck-define-checker'.
-
-Use the command `flycheck-select-checker' to select a syntax
-checker for the current buffer, or set this variable as file
-local variable to always use a specific syntax checker for a
-file. See Info Node `(emacs)Specifying File Variables' for more
-information about file variables.")
-(put 'flycheck-checker 'safe-local-variable 'flycheck-registered-checker-p)
-
-(defcustom flycheck-locate-config-file-functions nil
- "Functions to locate syntax checker configuration files.
-
-Each function in this hook must accept two arguments: The value
-of the configuration file variable, and the syntax checker
-symbol. It must return either a string with an absolute path to
-the configuration file, or nil, if it cannot locate the
-configuration file.
-
-The functions in this hook are called in order of appearance, until a
-function returns non-nil. The configuration file returned by that
-function is then given to the syntax checker if it exists.
-
-This variable is an abnormal hook. See Info
-node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :risky t)
-
-(defcustom flycheck-checker-error-threshold 400
- "Maximum errors allowed per syntax checker.
-
-The value of this variable is either an integer denoting the
-maximum number of errors per syntax checker and buffer, or nil to
-not limit the errors reported from a syntax checker.
-
-If this variable is a number and a syntax checker reports more
-errors than the value of this variable, its errors are not
-discarded, and not highlighted in the buffer or available in the
-error list. The affected syntax checker is also disabled for
-future syntax checks of the buffer."
- :group 'flycheck
- :type '(choice (const :tag "Do not limit reported errors" nil)
- (integer :tag "Maximum number of errors"))
- :risky t
- :package-version '(flycheck . "0.22"))
-
-(defcustom flycheck-process-error-functions nil
- "Functions to process errors.
-
-Each function in this hook must accept a single argument: A
-Flycheck error to process.
-
-All functions in this hook are called in order of appearance,
-until a function returns non-nil. Thus, a function in this hook
-may return nil, to allow for further processing of the error, or
-any non-nil value, to indicate that the error was fully processed
-and inhibit any further processing.
-
-The functions are called for each newly parsed error immediately
-after the corresponding syntax checker finished. At this stage,
-the overlays from the previous syntax checks are still present,
-and there may be further syntax checkers in the chain.
-
-This variable is an abnormal hook. See Info
-node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :package-version '(flycheck . "0.13")
- :risky t)
-
-(defcustom flycheck-display-errors-delay 0.9
- "Delay in seconds before displaying errors at point.
-
-Use floating point numbers to express fractions of seconds."
- :group 'flycheck
- :type 'number
- :package-version '(flycheck . "0.15")
- :safe #'numberp)
-
-(defcustom flycheck-display-errors-function #'flycheck-display-error-messages
- "Function to display error messages.
-
-If set to a function, call the function with the list of errors
-to display as single argument. Each error is an instance of the
-`flycheck-error' struct.
-
-If set to nil, do not display errors at all."
- :group 'flycheck
- :type '(choice (const :tag "Display error messages"
- flycheck-display-error-messages)
- (const :tag "Display error messages only if no error list"
- flycheck-display-error-messages-unless-error-list)
- (function :tag "Error display function"))
- :package-version '(flycheck . "0.13")
- :risky t)
-
-(defcustom flycheck-help-echo-function #'flycheck-help-echo-all-error-messages
- "Function to compute the contents of the error tooltips.
-
-If set to a function, call the function with the list of errors
-to display as single argument. Each error is an instance of the
-`flycheck-error' struct. The function is used to set the
-help-echo property of flycheck error overlays. It should return
-a string, which is displayed when the user hovers over an error
-or presses \\[display-local-help].
-
-If set to nil, do not show error tooltips."
- :group 'flycheck
- :type '(choice (const :tag "Concatenate error messages to form a tooltip"
- flycheck-help-echo-all-error-messages)
- (function :tag "Help echo function"))
- :package-version '(flycheck . "0.25")
- :risky t)
-
-(defcustom flycheck-command-wrapper-function #'identity
- "Function to modify checker commands before execution.
-
-The value of this option is a function which is given a list
-containing the full command of a syntax checker after
-substitution through `flycheck-substitute-argument' but before
-execution. The function may return a new command for Flycheck to
-execute.
-
-The default value is `identity' which does not change the
-command. You may provide your own function to run Flycheck
-commands through `bundle exec', `nix-shell' or similar wrappers."
- :group 'flycheck
- :type '(choice (const :tag "Do not modify commands" identity)
- (function :tag "Modify command with a custom function"))
- :package-version '(flycheck . "0.25")
- :risky t)
-
-(defcustom flycheck-executable-find #'flycheck-default-executable-find
- "Function to search for executables.
-
-The value of this option is a function which is given the name or
-path of an executable and shall return the full path to the
-executable, or nil if the executable does not exit.
-
-The default is `flycheck-default-executable-find', which searches
-variable `exec-path' when given a command name, and resolves
-paths to absolute ones. You can customize this option to search
-for checkers in other environments such as bundle or NixOS
-sandboxes."
- :group 'flycheck
- :type '(choice
- (const :tag "Search executables in `exec-path'"
- flycheck-default-executable-find)
- (function :tag "Search executables with a custom function"))
- :package-version '(flycheck . "32")
- :risky t)
-
-(defun flycheck-default-executable-find (executable)
- "Resolve EXECUTABLE to a full path.
-
-Like `executable-find', but supports relative paths.
-
-Attempts invoking `executable-find' first; if that returns nil,
-and EXECUTABLE contains a directory component, expands to a full
-path and tries invoking `executable-find' again."
- ;; file-name-directory returns non-nil iff the given path has a
- ;; directory component.
- (or
- (executable-find executable)
- (when (file-name-directory executable)
- (executable-find (expand-file-name executable)))))
-
-(defcustom flycheck-indication-mode 'left-fringe
- "The indication mode for Flycheck errors.
-
-This variable controls how Flycheck indicates errors in buffers.
-May be `left-fringe', `right-fringe', `left-margin',
-`right-margin', or nil.
-
-If set to `left-fringe' or `right-fringe', indicate errors via
-icons in the left and right fringe respectively. If set to
-`left-margin' or `right-margin', use the margins instead.
-
-If set to nil, do not indicate errors and warnings, but just
-highlight them according to `flycheck-highlighting-mode'."
- :group 'flycheck
- :type '(choice (const :tag "Indicate in the left fringe" left-fringe)
- (const :tag "Indicate in the right fringe" right-fringe)
- (const :tag "Indicate in the left margin" left-margin)
- (const :tag "Indicate in the right margin" right-margin)
- (const :tag "Do not indicate" nil))
- :safe #'symbolp)
-
-(defcustom flycheck-highlighting-mode 'symbols
- "The highlighting mode for Flycheck errors and warnings.
-
-The highlighting mode controls how Flycheck highlights errors in
-buffers when a checker only reports the starting position of an
-error. The following modes are known:
-
-`columns'
- Highlight a single character. If the error does not have a column,
- highlight the whole line.
-
-`symbols'
- Highlight a full symbol if there is any, otherwise behave like `columns'.
- This is the default.
-
-`sexps'
- Highlight a full expression, if there is any, otherwise behave like
- `columns'. Note that this mode can be *very* slow in some major modes.
-
-`lines'
- Highlight the whole line.
-
-nil
- Do not highlight errors at all. However, errors will still
- be reported in the mode line and in error message popups,
- and indicated according to `flycheck-indication-mode'."
- :group 'flycheck
- :type '(choice (const :tag "Highlight columns only" columns)
- (const :tag "Highlight symbols" symbols)
- (const :tag "Highlight expressions" sexps)
- (const :tag "Highlight whole lines" lines)
- (const :tag "Do not highlight errors" nil))
- :package-version '(flycheck . "0.14")
- :safe #'symbolp)
-
-(defvar flycheck-current-errors)
-(defun flycheck-refresh-fringes-and-margins ()
- "Refresh fringes and margins of all windows displaying the current buffer.
-
-If any errors are currently shown, launch a new check, to adjust
-to a potential new indication mode."
- (dolist (win (get-buffer-window-list))
- (set-window-margins win left-margin-width right-margin-width)
- (set-window-fringes win left-fringe-width right-fringe-width))
- (when flycheck-current-errors
- (flycheck-buffer)))
-
-(defun flycheck-set-indication-mode (&optional mode)
- "Set `flycheck-indication-mode' to MODE and adjust margins and fringes.
-
-When MODE is nil, adjust window parameters without changing the
-mode. This function can be useful as a `flycheck-mode-hook',
-especially if you use margins only in Flycheck buffers.
-
-When MODE is `left-margin', the left fringe is reduced to 1 pixel
-to save space."
- (interactive (list (intern (completing-read
- "Mode: " '("left-fringe" "right-fringe"
- "left-margin" "right-margin")
- nil t nil nil
- (prin1-to-string flycheck-indication-mode)))))
- (setq mode (or mode flycheck-indication-mode))
- (pcase mode
- ((or `left-fringe `right-fringe)
- (setq left-fringe-width 8 right-fringe-width 8
- left-margin-width 0 right-margin-width 0))
- (`left-margin
- (setq left-fringe-width 1 right-fringe-width 8
- left-margin-width 1 right-margin-width 0))
- (`right-margin
- (setq left-fringe-width 8 right-fringe-width 8
- left-margin-width 0 right-margin-width 1))
- (_ (user-error "Invalid indication mode")))
- (setq-local flycheck-indication-mode mode)
- (flycheck-refresh-fringes-and-margins))
-
-(define-widget 'flycheck-highlighting-style 'lazy
- "A value for `flycheck-highlighting-style'."
- :offset 2
- :format "%t: Use %v"
- :type '(choice
- :format "%[Value Menu%] %v"
- (const :tag "no highlighting" nil)
- (const :tag "a face indicating the error level" level-face)
- (list :tag "a pair of delimiters"
- (const :format "" delimiters)
- (string :tag "Before")
- (string :tag "After"))
- (list :tag "a conditional mix of styles"
- (const :format "" conditional)
- (integer :tag "Up to this many lines")
- (flycheck-highlighting-style :format "Use %v")
- (flycheck-highlighting-style :format "Otherwise, use %v"))))
-
-(defun flycheck--make-highlighting-delimiter (char)
- "Make a highlighting bracket symbol by repeating CHAR twice."
- (compose-chars ?\s
- ;; '(Bl . Br) ?\s
- '(Bc Br 30 0) char
- '(Bc Bl -30 0) char))
-
-(defcustom flycheck-highlighting-style
- `(conditional 4 level-face (delimiters "" ""))
- "The highlighting style for Flycheck errors and warnings.
-
-The highlighting style controls how Flycheck highlights error
-regions in buffers. The following styles are supported:
-
-nil
- Do not highlight errors. Same as setting
- `flycheck-highlighting-mode' to nil.
-
-`level-face'
- Chose a face depending on the severity of the error, and
- apply it to the whole error text. See also the
- `flycheck-define-error-level' and `flycheck-error',
- `flycheck-warning', and `flycheck-info' faces.
-
-\(`delimiters' BEFORE AFTER)
- Draw delimiters on each side of the error. BEFORE and AFTER
- indicate which delimiters to use. If they are strings, they
- are used as-is. If they are characters, they are repeated
- twice and composed into a single character. Delimiters use
- the fringe face corresponding to the severity of each error,
- as well as the `flycheck-error-delimiter' face. Delimited
- text has the `flycheck-delimited-error' face.
-
-\(`conditional' NLINES S1 S2)
- Use style S1 for errors spanning up to NLINES lines, and
- style S2 otherwise.
-
-See also `flycheck-highlighting-mode' and
-`flycheck-indication-mode'."
- :group 'flycheck
- :type 'flycheck-highlighting-style
- :package-version '(flycheck . "32")
- :safe t)
-
-(defcustom flycheck-check-syntax-automatically '(save
- idle-change
- new-line
- mode-enabled)
- "When Flycheck should check syntax automatically.
-
-This variable is a list of events that may trigger syntax checks.
-The following events are known:
-
-`save'
- Check syntax immediately after the buffer was saved.
-
-`idle-change'
- Check syntax a short time (see `flycheck-idle-change-delay')
- after the last change to the buffer.
-
-`idle-buffer-switch'
- Check syntax a short time (see `flycheck-idle-buffer-switch-delay')
- after the user switches to a buffer.
-
-`new-line'
- Check syntax immediately after a new line was inserted into
- the buffer.
-
-`mode-enabled'
- Check syntax immediately when variable `flycheck-mode' is
- non-nil.
-
-Flycheck performs a syntax checks only on events, which are
-contained in this list. For instance, if the value of this
-variable is `(mode-enabled save)', Flycheck will only check if
-the mode is enabled or the buffer was saved, but never after
-changes to the buffer contents.
-
-If nil, never check syntax automatically. In this case, use
-`flycheck-buffer' to start a syntax check manually."
- :group 'flycheck
- :type '(set (const :tag "After the buffer was saved" save)
- (const :tag "After the buffer was changed and idle" idle-change)
- (const
- :tag "After switching the current buffer" idle-buffer-switch)
- (const :tag "After a new line was inserted" new-line)
- (const :tag "After `flycheck-mode' was enabled" mode-enabled))
- :package-version '(flycheck . "0.12")
- :safe #'flycheck-symbol-list-p)
-
-(defcustom flycheck-idle-change-delay 0.5
- "How many seconds to wait after a change before checking syntax.
-
-After the buffer was changed, Flycheck will wait as many seconds
-as the value of this variable before starting a syntax check. If
-the buffer is modified during this time, Flycheck will wait
-again.
-
-This variable has no effect, if `idle-change' is not contained in
-`flycheck-check-syntax-automatically'."
- :group 'flycheck
- :type 'number
- :package-version '(flycheck . "0.13")
- :safe #'numberp)
-
-(defcustom flycheck-idle-buffer-switch-delay 0.5
- "How many seconds to wait after switching buffers before checking syntax.
-
-After the user switches to a new buffer, Flycheck will wait as
-many seconds as the value of this variable before starting a
-syntax check. If the user switches to another buffer during this
-time, whether a syntax check is still performed depends on the
-value of `flycheck-buffer-switch-check-intermediate-buffers'.
-
-This variable has no effect if `idle-buffer-switch' is not
-contained in `flycheck-check-syntax-automatically'."
- :group 'flycheck
- :type 'number
- :package-version '(flycheck . "32")
- :safe #'numberp)
-
-(defcustom flycheck-buffer-switch-check-intermediate-buffers nil
- "Whether to check syntax in a buffer you only visit briefly.
-
-If nil, then when you switch to a buffer but switch to another
-buffer before the syntax check is performed, then the check is
-canceled. If non-nil, then syntax checks due to switching
-buffers are always performed. This only affects buffer switches
-that happen less than `flycheck-idle-buffer-switch-delay' seconds
-apart.
-
-This variable has no effect if `idle-buffer-switch' is not
-contained in `flycheck-check-syntax-automatically'."
- :group 'flycheck
- :type 'boolean
- :package-version '(flycheck . "32")
- :safe #'booleanp)
-
-(defcustom flycheck-standard-error-navigation t
- "Whether to support error navigation with `next-error'.
-
-If non-nil, enable navigation of Flycheck errors with
-`next-error', `previous-error' and `first-error'. Otherwise,
-these functions just navigate errors from compilation modes.
-
-Flycheck error navigation with `flycheck-next-error',
-`flycheck-previous-error' and `flycheck-first-error' is always
-enabled, regardless of the value of this variable.
-
-Note that this setting only takes effect when variable
-`flycheck-mode' is non-nil. Changing it will not affect buffers
-where variable `flycheck-mode' is already non-nil."
- :group 'flycheck
- :type 'boolean
- :package-version '(flycheck . "0.15")
- :safe #'booleanp)
-
-(define-widget 'flycheck-minimum-level 'lazy
- "A radio-type choice of minimum error levels.
-
-See `flycheck-navigation-minimum-level' and
-`flycheck-error-list-minimum-level'."
- :type '(radio (const :tag "All locations" nil)
- (const :tag "Informational messages" info)
- (const :tag "Warnings" warning)
- (const :tag "Errors" error)
- (symbol :tag "Custom error level")))
-
-(defcustom flycheck-navigation-minimum-level nil
- "The minimum level of errors to navigate.
-
-If set to an error level, only navigate errors whose error level
-is at least as severe as this one. If nil, navigate all errors."
- :group 'flycheck
- :type 'flycheck-minimum-level
- :safe #'flycheck-error-level-p
- :package-version '(flycheck . "0.21"))
-
-(defcustom flycheck-error-list-minimum-level nil
- "The minimum level of errors to display in the error list.
-
-If set to an error level, only display errors whose error level
-is at least as severe as this one in the error list. If nil,
-display all errors.
-
-This is the default level, used when the error list is opened.
-You can temporarily change the level using
-\\[flycheck-error-list-set-filter], or reset it to this value
-using \\[flycheck-error-list-reset-filter]."
- :group 'flycheck
- :type 'flycheck-minimum-level
- :safe #'flycheck-error-level-p
- :package-version '(flycheck . "0.24"))
-
-(defcustom flycheck-relevant-error-other-file-minimum-level 'error
- "The minimum level of errors from other files to display in this buffer.
-
-If set to an error level, only display errors from other files
-whose error level is at least as severe as this one. If nil,
-display all errors from other files."
- :group 'flycheck
- :type 'flycheck-minimum-level
- :safe #'flycheck-error-level-p
- :package-version '(flycheck . "32"))
-
-(defcustom flycheck-relevant-error-other-file-show t
- "Whether to show errors from other files."
- :group 'flycheck
- :type 'boolean
- :package-version '(flycheck . "32")
- :safe #'booleanp)
-
-(defcustom flycheck-completing-read-function #'completing-read
- "Function to read from minibuffer with completion.
-
-The function must be compatible to the built-in `completing-read'
-function."
- :group 'flycheck
- :type '(choice (const :tag "Default" completing-read)
- (const :tag "IDO" ido-completing-read)
- (function :tag "Custom function"))
- :risky t
- :package-version '(flycheck . "26"))
-
-(defcustom flycheck-temp-prefix "flycheck"
- "Prefix for temporary files created by Flycheck."
- :group 'flycheck
- :type 'string
- :package-version '(flycheck . "0.19")
- :risky t)
-
-(defcustom flycheck-mode-hook nil
- "Hooks to run after command `flycheck-mode' is toggled."
- :group 'flycheck
- :type 'hook
- :risky t)
-
-(defcustom flycheck-after-syntax-check-hook nil
- "Functions to run after each syntax check.
-
-This hook is run after a syntax check was finished.
-
-At this point, *all* chained checkers were run, and all errors
-were parsed, highlighted and reported. The variable
-`flycheck-current-errors' contains all errors from all syntax
-checkers run during the syntax check, so you can apply any error
-analysis functions.
-
-Note that this hook does *not* run after each individual syntax
-checker in the syntax checker chain, but only after the *last
-checker*.
-
-This variable is a normal hook. See Info node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :risky t)
-
-(defcustom flycheck-before-syntax-check-hook nil
- "Functions to run before each syntax check.
-
-This hook is run right before a syntax check starts.
-
-Error information from the previous syntax check is *not*
-cleared before this hook runs.
-
-Note that this hook does *not* run before each individual syntax
-checker in the syntax checker chain, but only before the *first
-checker*.
-
-This variable is a normal hook. See Info node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :risky t)
-
-(defcustom flycheck-syntax-check-failed-hook nil
- "Functions to run if a syntax check failed.
-
-This hook is run whenever an error occurs during Flycheck's
-internal processing. No information about the error is given to
-this hook.
-
-You should use this hook to conduct additional cleanup actions
-when Flycheck failed.
-
-This variable is a normal hook. See Info node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :risky t)
-
-(defcustom flycheck-status-changed-functions nil
- "Functions to run if the Flycheck status changed.
-
-This hook is run whenever the status of Flycheck changes. Each
-hook function takes the status symbol as single argument, as
-given to `flycheck-report-status', which see.
-
-This variable is an abnormal hook. See Info
-node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :risky t
- :package-version '(flycheck . "0.20"))
-
-(defcustom flycheck-error-list-after-refresh-hook nil
- "Functions to run after the error list was refreshed.
-
-This hook is run whenever the error list is refreshed.
-
-This variable is a normal hook. See Info node `(elisp)Hooks'."
- :group 'flycheck
- :type 'hook
- :risky t
- :package-version '(flycheck . "0.21"))
-
-(defface flycheck-error-delimiter
- `((t))
- "Flycheck face for errors spanning multiple lines.
-
-See `flycheck-highlighting-style' for details on when this face
-is used."
- :package-version '(flycheck . "32")
- :group 'flycheck-faces)
-
-(defface flycheck-delimited-error
- `((t))
- "Flycheck face for errors spanning multiple lines.
-
-See `flycheck-highlighting-style' for details on when this face
-is used."
- :package-version '(flycheck . "32")
- :group 'flycheck-faces)
-
-(defface flycheck-error
- '((((supports :underline (:style wave)))
- :underline (:style wave :color "Red1"))
- (t
- :underline t :inherit error))
- "Flycheck face for errors."
- :package-version '(flycheck . "0.13")
- :group 'flycheck-faces)
-
-(defface flycheck-warning
- '((((supports :underline (:style wave)))
- :underline (:style wave :color "DarkOrange"))
- (t
- :underline t :inherit warning))
- "Flycheck face for warnings."
- :package-version '(flycheck . "0.13")
- :group 'flycheck-faces)
-
-(defface flycheck-info
- '((((supports :underline (:style wave)))
- :underline (:style wave :color "ForestGreen"))
- (t
- :underline t :inherit success))
- "Flycheck face for informational messages."
- :package-version '(flycheck . "0.15")
- :group 'flycheck-faces)
-
-(defface flycheck-fringe-error
- '((t :inherit error))
- "Flycheck face for fringe error indicators."
- :package-version '(flycheck . "0.13")
- :group 'flycheck-faces)
-
-(defface flycheck-fringe-warning
- '((t :inherit warning))
- "Flycheck face for fringe warning indicators."
- :package-version '(flycheck . "0.13")
- :group 'flycheck-faces)
-
-(defface flycheck-fringe-info
- ;; Semantically `success' is probably not the right face, but it looks nice as
- ;; a base face
- '((t :inherit success))
- "Flycheck face for fringe info indicators."
- :package-version '(flycheck . "0.15")
- :group 'flycheck-faces)
-
-(defface flycheck-error-list-error
- '((t :inherit error))
- "Flycheck face for error messages in the error list."
- :package-version '(flycheck . "0.16")
- :group 'flycheck-faces)
-
-(defface flycheck-error-list-warning
- '((t :inherit warning))
- "Flycheck face for warning messages in the error list."
- :package-version '(flycheck . "0.16")
- :group 'flycheck-faces)
-
-(defface flycheck-error-list-info
- '((t :inherit success))
- "Flycheck face for info messages in the error list."
- :package-version '(flycheck . "0.16")
- :group 'flycheck-faces)
-
-(defface flycheck-error-list-line-number
- '((t))
- "Face for line numbers in the error list."
- :group 'flycheck-faces
- :package-version '(flycheck . "0.16"))
-
-(defface flycheck-error-list-column-number
- '((t))
- "Face for line numbers in the error list."
- :group 'flycheck-faces
- :package-version '(flycheck . "0.16"))
-
-(defface flycheck-error-list-filename
- '((t :inherit mode-line-buffer-id :bold nil))
- "Face for filenames in the error list."
- :group 'flycheck-faces
- :package-version '(flycheck . "32"))
-
-(defface flycheck-error-list-id
- '((t :inherit font-lock-type-face))
- "Face for the error ID in the error list."
- :group 'flycheck-faces
- :package-version '(flycheck . "0.22"))
-
-(defface flycheck-error-list-id-with-explainer
- '((t :inherit flycheck-error-list-id
- :box (:style released-button)))
- "Face for the error ID in the error list, for errors that have an explainer."
- :group 'flycheck-faces
- :package-version '(flycheck . "30"))
-
-(defface flycheck-error-list-checker-name
- '((t :inherit font-lock-function-name-face))
- "Face for the syntax checker name in the error list."
- :group 'flycheck-faces
- :package-version '(flycheck . "0.21"))
-
-(defface flycheck-error-list-error-message
- '((t))
- "Face for the error message in the error list."
- :group 'flycheck-faces
- :package-version '(flycheck . "33"))
-
-(defface flycheck-error-list-highlight
- '((t :bold t))
- "Flycheck face to highlight errors in the error list."
- :package-version '(flycheck . "0.15")
- :group 'flycheck-faces)
-
-(defface flycheck-verify-select-checker
- '((t :box (:style released-button)))
- "Flycheck face for the 'select' button in the verify setup buffer."
- :package-version '(flycheck . "32")
- :group 'flycheck-faces)
-
-(defvar flycheck-command-map
- (let ((map (make-sparse-keymap)))
- (define-key map "c" #'flycheck-buffer)
- (define-key map "C" #'flycheck-clear)
- (define-key map (kbd "C-c") #'flycheck-compile)
- (define-key map "n" #'flycheck-next-error)
- (define-key map "p" #'flycheck-previous-error)
- (define-key map "l" #'flycheck-list-errors)
- (define-key map (kbd "C-w") #'flycheck-copy-errors-as-kill)
- (define-key map "s" #'flycheck-select-checker)
- (define-key map "?" #'flycheck-describe-checker)
- (define-key map "h" #'flycheck-display-error-at-point)
- (define-key map "e" #'flycheck-explain-error-at-point)
- (define-key map "H" #'display-local-help)
- (define-key map "i" #'flycheck-manual)
- (define-key map "V" #'flycheck-version)
- (define-key map "v" #'flycheck-verify-setup)
- (define-key map "x" #'flycheck-disable-checker)
- map)
- "Keymap of Flycheck interactive commands.")
-
-(defcustom flycheck-keymap-prefix (kbd "C-c !")
- "Prefix for key bindings of Flycheck.
-
-Changing this variable outside Customize does not have any
-effect. To change the keymap prefix from Lisp, you need to
-explicitly re-define the prefix key:
-
- (define-key flycheck-mode-map flycheck-keymap-prefix nil)
- (setq flycheck-keymap-prefix (kbd \"C-c f\"))
- (define-key flycheck-mode-map flycheck-keymap-prefix
- flycheck-command-map)
-
-Please note that Flycheck's manual documents the default
-keybindings. Changing this variable is at your own risk."
- :group 'flycheck
- :package-version '(flycheck . "0.19")
- :type 'string
- :risky t
- :set
- (lambda (variable key)
- (when (and (boundp variable) (boundp 'flycheck-mode-map))
- (define-key flycheck-mode-map (symbol-value variable) nil)
- (define-key flycheck-mode-map key flycheck-command-map))
- (set-default variable key)))
-
-(defcustom flycheck-mode-line '(:eval (flycheck-mode-line-status-text))
- "Mode line lighter for Flycheck.
-
-The value of this variable is a mode line template as in
-`mode-line-format'. See Info Node `(elisp)Mode Line Format' for
-more information. Note that it should contain a _single_ mode
-line construct only.
-
-Customize this variable to change how Flycheck reports its status
-in the mode line. You may use `flycheck-mode-line-status-text'
-to obtain a human-readable status text, including an
-error/warning count.
-
-You may also assemble your own status text. The current status
-of Flycheck is available in `flycheck-last-status-change'. The
-errors in the current buffer are stored in
-`flycheck-current-errors', and the function
-`flycheck-count-errors' may be used to obtain the number of
-errors grouped by error level.
-
-Set this variable to nil to disable the mode line completely."
- :group 'flycheck
- :type 'sexp
- :risky t
- :package-version '(flycheck . "0.20"))
-
-(defcustom flycheck-mode-line-prefix "FlyC"
- "Base mode line lighter for Flycheck.
-
-This will have an effect only with the default
-`flycheck-mode-line'.
-
-If you've customized `flycheck-mode-line' then the customized
-function must be updated to use this variable."
- :group 'flycheck
- :type 'string
- :package-version '(flycheck . "26"))
-
-(defcustom flycheck-error-list-mode-line
- `(,(propertized-buffer-identification "%12b")
- " for buffer "
- (:eval (flycheck-error-list-propertized-source-name))
- (:eval (flycheck-error-list-mode-line-filter-indicator)))
- "Mode line construct for Flycheck error list.
-
-The value of this variable is a mode line template as in
-`mode-line-format', to be used as
-`mode-line-buffer-identification' in `flycheck-error-list-mode'.
-See Info Node `(elisp)Mode Line Format' for more information.
-
-Customize this variable to change how the error list appears in
-the mode line. The default shows the name of the buffer and the
-name of the source buffer, i.e. the buffer whose errors are
-currently listed."
- :group 'flycheck
- :type 'sexp
- :risky t
- :package-version '(flycheck . "0.20"))
-
-(defcustom flycheck-global-modes t
- "Modes for which option `flycheck-mode' is turned on.
-
-If t, Flycheck Mode is turned on for all major modes. If a list,
-Flycheck Mode is turned on for all `major-mode' symbols in that
-list. If the `car' of the list is `not', Flycheck Mode is turned
-on for all `major-mode' symbols _not_ in that list. If nil,
-Flycheck Mode is never turned on by command
-`global-flycheck-mode'.
-
-Note that Flycheck is never turned on for modes whose
-`mode-class' property is `special' (see Info node `(elisp)Major
-Mode Conventions'), regardless of the value of this option.
-
-Only has effect when variable `global-flycheck-mode' is non-nil."
- :group 'flycheck
- :type '(choice (const :tag "none" nil)
- (const :tag "all" t)
- (set :menu-tag "mode specific" :tag "modes"
- :value (not)
- (const :tag "Except" not)
- (repeat :inline t (symbol :tag "mode"))))
- :risky t
- :package-version '(flycheck . "0.23"))
-
-;; Add built-in functions to our hooks, via `add-hook', to make sure that our
-;; functions are really present, even if the variable was implicitly defined by
-;; another call to `add-hook' that occurred before Flycheck was loaded. See
-;; http://lists.gnu.org/archive/html/emacs-devel/2015-02/msg01271.html for why
-;; we don't initialize the hook variables right away. We append our own
-;; functions, because a user likely expects that their functions come first,
-;; even if they added them before Flycheck was loaded.
-(dolist (hook (list #'flycheck-locate-config-file-by-path
- #'flycheck-locate-config-file-ancestor-directories
- #'flycheck-locate-config-file-home))
- (add-hook 'flycheck-locate-config-file-functions hook 'append))
-
-(add-hook 'flycheck-process-error-functions #'flycheck-add-overlay 'append)
-
-
-;;; Global Flycheck menu
-(defvar flycheck-mode-menu-map
- (easy-menu-create-menu
- "Syntax Checking"
- '(["Enable on-the-fly syntax checking" flycheck-mode
- :style toggle :selected flycheck-mode
- :enable (or flycheck-mode
- ;; Don't let users toggle the mode if there is no syntax
- ;; checker for this buffer
- (seq-find #'flycheck-checker-supports-major-mode-p
- flycheck-checkers))]
- ["Check current buffer" flycheck-buffer flycheck-mode]
- ["Clear errors in buffer" flycheck-clear t]
- "---"
- ["Go to next error" flycheck-next-error flycheck-mode]
- ["Go to previous error" flycheck-previous-error flycheck-mode]
- ["Show all errors" flycheck-list-errors flycheck-mode]
- "---"
- ["Copy messages at point" flycheck-copy-errors-as-kill
- (flycheck-overlays-at (point))]
- ["Explain error at point" flycheck-explain-error-at-point]
- "---"
- ["Select syntax checker" flycheck-select-checker flycheck-mode]
- ["Disable syntax checker" flycheck-disable-checker flycheck-mode]
- ["Set executable of syntax checker" flycheck-set-checker-executable
- flycheck-mode]
- "---"
- ["Describe syntax checker" flycheck-describe-checker t]
- ["Verify setup" flycheck-verify-setup t]
- ["Show Flycheck version" flycheck-version t]
- ["Read the Flycheck manual" flycheck-info t]))
- "Menu of command `flycheck-mode'.")
-
-(easy-menu-add-item nil '("Tools") flycheck-mode-menu-map "Spell Checking")
-
-
-;;; Version information, manual and loading of Flycheck
-(defun flycheck-version (&optional show-version)
- "Get the Flycheck version as string.
-
-If called interactively or if SHOW-VERSION is non-nil, show the
-version in the echo area and the messages buffer.
-
-The returned string includes both, the version from package.el
-and the library version, if both a present and different.
-
-If the version number could not be determined, signal an error,
-if called interactively, or if SHOW-VERSION is non-nil, otherwise
-just return nil."
- (interactive (list t))
- (let ((version (pkg-info-version-info 'flycheck)))
- (when show-version
- (message "Flycheck version: %s" version))
- version))
-
-(defun flycheck-unload-function ()
- "Unload function for Flycheck."
- (global-flycheck-mode -1)
- (easy-menu-remove-item nil '("Tools") (cadr flycheck-mode-menu-map))
- (remove-hook 'kill-emacs-hook #'flycheck-global-teardown)
- (setq find-function-regexp-alist
- (assq-delete-all 'flycheck-checker find-function-regexp-alist)))
-
-;;;###autoload
-(defun flycheck-manual ()
- "Open the Flycheck manual."
- (interactive)
- (browse-url "http://www.flycheck.org"))
-
-(define-obsolete-function-alias 'flycheck-info
- 'flycheck-manual "Flycheck 26" "Open the Flycheck manual.")
-
-
-;;; Utility functions
-(defun flycheck-sexp-to-string (sexp)
- "Convert SEXP to a string.
-
-Like `prin1-to-string' but ensure that the returned string
-is loadable."
- (let ((print-quoted t)
- (print-length nil)
- (print-level nil))
- (prin1-to-string sexp)))
-
-(defun flycheck-string-to-number-safe (string)
- "Safely convert STRING to a number.
-
-If STRING is of string type and a numeric string, convert STRING
-to a number and return it. Otherwise return nil."
- (let ((number-re (rx string-start (one-or-more (any digit)) string-end)))
- (when (and (stringp string) (string-match-p number-re string))
- (string-to-number string))))
-
-(defun flycheck-string-or-nil-p (obj)
- "Determine if OBJ is a string or nil."
- (or (null obj) (stringp obj)))
-
-(defun flycheck-string-list-p (obj)
- "Determine if OBJ is a list of strings."
- (and (listp obj) (seq-every-p #'stringp obj)))
-
-(defun flycheck-string-or-string-list-p (obj)
- "Determine if OBJ is a string or a list of strings."
- (or (stringp obj) (flycheck-string-list-p obj)))
-
-(defun flycheck-symbol-list-p (obj)
- "Determine if OBJ is a list of symbols."
- (and (listp obj) (seq-every-p #'symbolp obj)))
-
-(defvar-local flycheck--file-truename-cache nil)
-
-(defun flycheck--file-truename (file)
- "Memoize the result of `file-truename' on (directory-file-name FILE)."
- ;; `file-truename' is slow, but alternatives are incomplete, so memoizing is
- ;; our best bet. See https://github.com/flycheck/flycheck/pull/1698.
- (unless flycheck--file-truename-cache
- (setq-local flycheck--file-truename-cache (make-hash-table :test 'equal)))
- (or (gethash file flycheck--file-truename-cache)
- (puthash file (file-truename (directory-file-name file))
- flycheck--file-truename-cache)))
-
-(defun flycheck-same-files-p (file-a file-b)
- "Determine whether FILE-A and FILE-B refer to the same file.
-
-Files are the same if (in the order checked) they are equal, or
-if they resolve to the same canonical paths."
- (or (string= file-a file-b)
- (string= (flycheck--file-truename file-a)
- (flycheck--file-truename file-b))))
-
-(defvar-local flycheck-temporaries nil
- "Temporary files and directories created by Flycheck.")
-
-(defun flycheck-temp-dir-system ()
- "Create a unique temporary directory.
-
-Use `flycheck-temp-prefix' as prefix, and add the directory to
-`flycheck-temporaries'.
-
-Return the path of the directory"
- (let* ((tempdir (make-temp-file flycheck-temp-prefix 'directory)))
- (push tempdir flycheck-temporaries)
- tempdir))
-
-(defun flycheck-temp-file-system (filename &optional suffix)
- "Create a temporary file named after FILENAME.
-
-If FILENAME is non-nil, this function creates a temporary
-directory with `flycheck-temp-dir-system', and creates a file
-with the same name as FILENAME in this directory.
-
-Otherwise this function creates a temporary file starting with
-`flycheck-temp-prefix'. If present, SUFFIX is appended;
-otherwise, a random suffix is used. The path of the file is
-added to `flycheck-temporaries'.
-
-Return the path of the file."
- (let ((tempfile (convert-standard-filename
- (if filename
- (expand-file-name (file-name-nondirectory filename)
- (flycheck-temp-dir-system))
- (make-temp-file flycheck-temp-prefix nil suffix)))))
- (push tempfile flycheck-temporaries)
- tempfile))
-
-(defun flycheck-temp-file-inplace (filename &optional suffix)
- "Create an in-place copy of FILENAME.
-
-Prefix the file with `flycheck-temp-prefix' and add the path of
-the file to `flycheck-temporaries'.
-
-If FILENAME is nil, fall back to `flycheck-temp-file-system' with
-the specified SUFFIX.
-
-Return the path of the file."
- (if filename
- (let* ((tempname (format "%s_%s"
- flycheck-temp-prefix
- (file-name-nondirectory filename)))
- (tempfile (convert-standard-filename
- (expand-file-name tempname
- (file-name-directory filename)))))
- (push tempfile flycheck-temporaries)
- tempfile)
- (flycheck-temp-file-system filename suffix)))
-
-(defun flycheck-temp-directory (checker)
- "Return the directory where CHECKER writes temporary files.
-
-Return nil if the CHECKER does not write temporary files."
- (let ((args (flycheck-checker-arguments checker)))
- (cond
- ((memq 'source args) temporary-file-directory)
- ((memq 'source-inplace args)
- (if buffer-file-name (file-name-directory buffer-file-name)
- temporary-file-directory))
- (t nil))))
-
-(defun flycheck-temp-files-writable-p (checker)
- "Whether CHECKER can write temporary files.
-
-If CHECKER has `source' or `source-inplace' in its `:command',
-return whether flycheck has the permissions to create the
-respective temporary files.
-
-Return t if CHECKER does not use temporary files."
- (let ((dir (flycheck-temp-directory checker)))
- (or (not dir) (file-writable-p dir))))
-
-(defun flycheck-save-buffer-to-file (file-name)
- "Save the contents of the current buffer to FILE-NAME."
- (make-directory (file-name-directory file-name) t)
- (let ((jka-compr-inhibit t))
- (write-region nil nil file-name nil 0)))
-
-(defun flycheck-save-buffer-to-temp (temp-file-fn)
- "Save buffer to temp file returned by TEMP-FILE-FN.
-
-Return the name of the temporary file."
- (let ((filename (funcall temp-file-fn (buffer-file-name))))
- ;; Do not flush short-lived temporary files onto disk
- (let ((write-region-inhibit-fsync t))
- (flycheck-save-buffer-to-file filename))
- filename))
-
-(defun flycheck-prepend-with-option (option items &optional prepend-fn)
- "Prepend OPTION to each item in ITEMS, using PREPEND-FN.
-
-Prepend OPTION to each item in ITEMS.
-
-ITEMS is a list of strings to pass to the syntax checker. OPTION
-is the option, as string. PREPEND-FN is a function called to
-prepend OPTION to each item in ITEMS. It receives the option and
-a single item from ITEMS as argument, and must return a string or
-a list of strings with OPTION prepended to the item. If
-PREPEND-FN is nil or omitted, use `list'.
-
-Return a list of strings where OPTION is prepended to each item
-in ITEMS using PREPEND-FN. If PREPEND-FN returns a list, it is
-spliced into the resulting list."
- (unless (stringp option)
- (error "Option %S is not a string" option))
- (unless prepend-fn
- (setq prepend-fn #'list))
- (let ((prepend
- (lambda (item)
- (let ((result (funcall prepend-fn option item)))
- (cond
- ((and (listp result) (seq-every-p #'stringp result)) result)
- ((stringp result) (list result))
- (t (error "Invalid result type for option: %S" result)))))))
- (apply #'append (seq-map prepend items))))
-
-(defun flycheck-find-in-buffer (pattern)
- "Find PATTERN in the current buffer.
-
-Return the result of the first matching group of PATTERN, or nil,
-if PATTERN did not match."
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-min))
- (when (re-search-forward pattern nil 'no-error)
- (match-string-no-properties 1)))))
-
-(defun flycheck-buffer-empty-p (&optional buffer)
- "Check whether a BUFFER is empty, defaulting to the current one."
- (= (buffer-size buffer) 0))
-
-(defun flycheck-buffer-nonempty-p (&optional buffer)
- "Check whether a BUFFER is nonempty, defaulting to the current one."
- (> (buffer-size buffer) 0))
-
-(defun flycheck-ephemeral-buffer-p ()
- "Determine whether the current buffer is an ephemeral buffer.
-
-See Info node `(elisp)Buffer Names' for information about
-ephemeral buffers."
- (string-prefix-p " " (buffer-name)))
-
-(defun flycheck-encrypted-buffer-p ()
- "Determine whether the current buffer is an encrypted file.
-
-See Info node `(epa)Top' for Emacs' interface to encrypted
-files."
- ;; The EPA file handler sets this variable locally to remember the recipients
- ;; of the encrypted file for re-encryption. Hence, a local binding of this
- ;; variable is a good indication that the buffer is encrypted. I haven't
- ;; found any better indicator anyway.
- (local-variable-p 'epa-file-encrypt-to))
-
-(defun flycheck-autoloads-file-p ()
- "Determine whether the current buffer is an autoloads file.
-
-Autoloads are generated by package.el during installation."
- (string-suffix-p "-autoloads.el" (buffer-name)))
-
-(defun flycheck-in-user-emacs-directory-p (filename)
- "Whether FILENAME is in `user-emacs-directory'."
- (string-prefix-p (file-name-as-directory
- (flycheck--file-truename user-emacs-directory))
- (flycheck--file-truename filename)))
-
-(defun flycheck-safe-delete (file-or-dir)
- "Safely delete FILE-OR-DIR."
- (ignore-errors
- (if (file-directory-p file-or-dir)
- (delete-directory file-or-dir 'recursive)
- (delete-file file-or-dir))))
-
-(defun flycheck-safe-delete-temporaries ()
- "Safely delete all temp files and directories of Flycheck.
-
-Safely delete all files and directories listed in
-`flycheck-temporaries' and set the variable's value to nil."
- (seq-do #'flycheck-safe-delete flycheck-temporaries)
- (setq flycheck-temporaries nil))
-
-(defun flycheck-rx-file-name (form)
- "Translate the `(file-name)' FORM into a regular expression."
- (let ((body (or (cdr form) '((minimal-match
- (one-or-more not-newline))))))
- (rx-to-string `(group-n 1 ,@body) t)))
-
-(defun flycheck-rx-message (form)
- "Translate the `(message)' FORM into a regular expression."
- (let ((body (or (cdr form) '((one-or-more not-newline)))))
- (rx-to-string `(group-n 4 ,@body) t)))
-
-(defun flycheck-rx-id (form)
- "Translate the `(id)' FORM into a regular expression."
- (rx-to-string `(group-n 5 ,@(cdr form)) t))
-
-(defun flycheck-rx-to-string (form &optional no-group)
- "Like `rx-to-string' for FORM, but with special keywords:
-
-`line'
- matches the initial line number.
-
-`column'
- matches the initial column number.
-
-`end-line'
- matches the final line number.
-
-`end-column'
- matches the final column number (exclusive).
-
-
-`(file-name SEXP ...)'
- matches the file name. SEXP describes the file name. If no
- SEXP is given, use a default body of `(minimal-match
- (one-or-more not-newline))'.
-
-`(message SEXP ...)'
- matches the message. SEXP constitutes the body of the
- message. If no SEXP is given, use a default body
- of `(one-or-more not-newline)'.
-
-`(id SEXP ...)'
- matches an error ID. SEXP describes the ID.
-
-NO-GROUP is passed to `rx-to-string'.
-
-See `rx' for a complete list of all built-in `rx' forms."
- (let ((rx-constituents
- (append
- `((file-name flycheck-rx-file-name 0 nil) ;; group 1
- (line . ,(rx (group-n 2 (one-or-more digit))))
- (column . ,(rx (group-n 3 (one-or-more digit))))
- (message flycheck-rx-message 0 nil) ;; group 4
- (id flycheck-rx-id 0 nil) ;; group 5
- (end-line . ,(rx (group-n 6 (one-or-more digit))))
- (end-column . ,(rx (group-n 7 (one-or-more digit)))))
- rx-constituents nil)))
- (rx-to-string form no-group)))
-
-(defun flycheck-current-load-file ()
- "Get the source file currently being loaded.
-
-Always return the name of the corresponding source file, never
-any byte-compiled file.
-
-Return nil, if the currently loaded file cannot be determined."
- (-when-let* ((this-file (cond
- (load-in-progress load-file-name)
- ((bound-and-true-p byte-compile-current-file))
- (t (buffer-file-name))))
- ;; A best guess for the source file of a compiled library. Works
- ;; well in most cases, and especially for ELPA packages
- (source-file (concat (file-name-sans-extension this-file)
- ".el")))
- (when (file-exists-p source-file)
- source-file)))
-
-(defun flycheck-module-root-directory (module &optional file-name)
- "Get the root directory for a MODULE in FILE-NAME.
-
-MODULE is a qualified module name, either a string with
-components separated by a dot, or as list of components.
-FILE-NAME is the name of the file or directory containing the
-module as string. When nil or omitted, defaults to the return
-value of function `buffer-file-name'.
-
-Return the root directory of the module, that is, the directory,
-from which FILE-NAME can be reached by descending directories
-along each part of MODULE.
-
-If the MODULE name does not match the directory hierarchy upwards
-from FILE-NAME, return the directory containing FILE-NAME. When
-FILE-NAME is nil, return `default-directory'."
- (let ((file-name (or file-name (buffer-file-name)))
- (module-components (if (stringp module)
- (split-string module (rx "."))
- (copy-sequence module))))
- (if (and module-components file-name)
- (let ((parts (nreverse module-components))
- (base-directory (directory-file-name
- (file-name-sans-extension file-name))))
- (while (and parts
- (string= (file-name-nondirectory base-directory)
- (car parts)))
- (pop parts)
- (setq base-directory (directory-file-name
- (file-name-directory base-directory))))
- (file-name-as-directory base-directory))
- (if file-name
- (file-name-directory file-name)
- (expand-file-name default-directory)))))
-
-(cl-defstruct (flycheck-line-cache
- (:constructor flycheck-line-cache-new))
- "Cache structure used to speed up `flycheck-goto-line'."
- tick point line)
-
-(defvar-local flycheck--line-cache nil
- "Cache used to speed ip `flycheck-goto-line'.")
-
-(defsubst flycheck--init-line-cache ()
- "Initialize or reinitialize `flycheck--line-cache'."
- (let ((tick (buffer-modified-tick)))
- (if flycheck--line-cache
- (unless (= (flycheck-line-cache-tick flycheck--line-cache) tick)
- (setf (flycheck-line-cache-tick flycheck--line-cache) tick
- (flycheck-line-cache-point flycheck--line-cache) 1
- (flycheck-line-cache-line flycheck--line-cache) 1))
- (setq-local flycheck--line-cache
- (flycheck-line-cache-new :tick tick :point 1 :line 1)))))
-
-(defun flycheck-goto-line (line)
- "Move point to beginning of line number LINE.
-
-This function assumes that the current buffer is not narrowed."
- (flycheck--init-line-cache)
- (goto-char (flycheck-line-cache-point flycheck--line-cache))
- (let ((delta (- line (flycheck-line-cache-line flycheck--line-cache))))
- (when (= 0 (forward-line delta))
- (setf (flycheck-line-cache-point flycheck--line-cache) (point))
- (setf (flycheck-line-cache-line flycheck--line-cache) line))))
-
-(defun flycheck-line-column-to-position (line column)
- "Return the point closest to LINE, COLUMN on line LINE.
-
-COLUMN is one-based."
- (save-excursion
- (flycheck-goto-line line)
- (min (+ (point) (1- column)) (line-end-position))))
-
-(defun flycheck-line-column-at-point ()
- "Return the line and column number at point."
- (cons (line-number-at-pos) (1+ (- (point) (line-beginning-position)))))
-
-(defun flycheck-line-column-at-pos (pos)
- "Return the line and column number at position POS.
-
-COLUMN is one-based."
- (let ((inhibit-field-text-motion t))
- (save-excursion
- (goto-char pos)
- (flycheck-line-column-at-point))))
-
-
-;;; Minibuffer tools
-(defvar flycheck-read-checker-history nil
- "`completing-read' history of `flycheck-read-checker'.")
-
-(defun flycheck-completing-read (prompt candidates default &optional history)
- "Read a value from the minibuffer.
-
-Use `flycheck-completing-read-function' to read input from the
-minibuffer with completion.
-
-Show PROMPT and read one of CANDIDATES, defaulting to DEFAULT.
-HISTORY is passed to `flycheck-completing-read-function'.
-
-Note that `flycheck-completing-read-function' may return an empty
-string instead of nil, even when \"\" isn't among the candidates.
-See `completing-read' for more details."
- (funcall flycheck-completing-read-function
- prompt candidates nil 'require-match nil history default))
-
-(defun flycheck-read-checker (prompt &optional default property candidates)
- "Read a flycheck checker from minibuffer with PROMPT and DEFAULT.
-
-PROMPT is a string to show in the minibuffer as prompt. It
-should end with a single space. DEFAULT is a symbol denoting the
-default checker to use, if the user did not select any checker.
-PROPERTY is a symbol denoting a syntax checker property. If
-non-nil, only complete syntax checkers which have a non-nil value
-for PROPERTY. CANDIDATES is an optional list of all syntax
-checkers available for completion, defaulting to all defined
-checkers. If given, PROPERTY is ignored.
-
-Return the checker as symbol, or DEFAULT if no checker was
-chosen. If DEFAULT is nil and no checker was chosen, signal a
-`user-error' if the underlying completion system does not provide
-a default on its own."
- (when (and default (not (flycheck-valid-checker-p default)))
- (error "%S is no valid Flycheck checker" default))
- (let* ((candidates (seq-map #'symbol-name
- (or candidates
- (flycheck-defined-checkers property))))
- (default (and default (symbol-name default)))
- (input (flycheck-completing-read
- prompt candidates default
- 'flycheck-read-checker-history)))
- (when (string-empty-p input)
- (unless default
- (user-error "No syntax checker selected"))
- (setq input default))
- (let ((checker (intern input)))
- (unless (flycheck-valid-checker-p checker)
- (error "%S is not a valid Flycheck syntax checker" checker))
- checker)))
-
-(defun flycheck-read-error-level (prompt)
- "Read an error level from the user with PROMPT.
-
-Only offers level for which errors currently exist, in addition
-to the default levels."
- (let* ((levels (seq-map #'flycheck-error-level
- (flycheck-error-list-current-errors)))
- (levels-with-defaults (append '(info warning error) levels))
- (uniq-levels (seq-uniq levels-with-defaults))
- (level (flycheck-completing-read prompt uniq-levels nil)))
- (when (string-empty-p level) (setq level nil))
- (and level (intern level))))
-
-
-;;; Checker API
-(defun flycheck-defined-checkers (&optional property)
- "Find all defined syntax checkers, optionally with PROPERTY.
-
-PROPERTY is a symbol. If given, only return syntax checkers with
-a non-nil value for PROPERTY.
-
-The returned list is sorted alphapetically by the symbol name of
-the syntax checkers."
- (let (defined-checkers)
- (mapatoms (lambda (symbol)
- (when (and (flycheck-valid-checker-p symbol)
- (or (null property)
- (flycheck-checker-get symbol property)))
- (push symbol defined-checkers))))
- (sort defined-checkers #'string<)))
-
-(defun flycheck-registered-checker-p (checker)
- "Determine whether CHECKER is registered.
-
-A checker is registered if it is contained in
-`flycheck-checkers'."
- (and (flycheck-valid-checker-p checker)
- (memq checker flycheck-checkers)))
-
-(defun flycheck-disabled-checker-p (checker)
- "Determine whether CHECKER is disabled, manually or automatically."
- (or (flycheck-manually-disabled-checker-p checker)
- (flycheck-automatically-disabled-checker-p checker)))
-
-(defun flycheck-manually-disabled-checker-p (checker)
- "Determine whether CHECKER has been manually disabled.
-
-A checker has been manually disabled if it is contained in
-`flycheck-disabled-checkers'."
- (memq checker flycheck-disabled-checkers))
-
-(defun flycheck-automatically-disabled-checker-p (checker)
- "Determine whether CHECKER has been automatically disabled.
-
-A checker has been automatically disabled if it is contained in
-`flycheck--automatically-disabled-checkers'."
- (memq checker flycheck--automatically-disabled-checkers))
-
-
-;;; Generic syntax checkers
-(defconst flycheck-generic-checker-version 2
- "The internal version of generic syntax checker declarations.
-
-Flycheck will not use syntax checkers whose generic version is
-less than this constant.")
-
-(defsubst flycheck--checker-property-name (property)
- "Return the SYMBOL property for checker PROPERTY."
- (intern (concat "flycheck-" (symbol-name property))))
-
-(defun flycheck-checker-get (checker property)
- "Get the value of CHECKER's PROPERTY."
- (get checker (flycheck--checker-property-name property)))
-
-(gv-define-setter flycheck-checker-get (value checker property)
- `(setf (get ,checker (flycheck--checker-property-name ,property)) ,value))
-
-(defun flycheck-validate-next-checker (next &optional strict)
- "Validate NEXT checker.
-
-With STRICT non-nil, also check whether the syntax checker and
-the error level in NEXT are valid. Otherwise just check whether
-these are symbols.
-
-Signal an error if NEXT is not a valid entry for
-`:next-checkers'."
- (when (symbolp next)
- (setq next (cons t next)))
- (pcase next
- (`(,level . ,checker)
- (if strict
- (progn
- (unless (or (eq level t) (flycheck-error-level-p level))
- (error "%S is not a valid Flycheck error level" level))
- (unless (flycheck-valid-checker-p checker)
- (error "%s is not a valid Flycheck syntax checker" checker)))
- (unless (symbolp level)
- (error "Error level %S must be a symbol" level))
- (unless (symbolp checker)
- (error "Checker %S must be a symbol" checker))))
- (_ (error "%S must be a symbol or cons cell" next)))
- t)
-
-(defun flycheck-define-generic-checker (symbol docstring &rest properties)
- "Define SYMBOL as generic syntax checker.
-
-Any syntax checker defined with this macro is eligible for manual
-syntax checker selection with `flycheck-select-checker'. To make
-the new syntax checker available for automatic selection, it must
-be registered in `flycheck-checkers'.
-
-DOCSTRING is the documentation of the syntax checker, for
-`flycheck-describe-checker'. The following PROPERTIES constitute
-a generic syntax checker. Unless otherwise noted, all properties
-are mandatory.
-
-`:start FUNCTION'
- A function to start the syntax checker.
-
- FUNCTION shall take two arguments and return a context
- object if the checker is started successfully. Otherwise it
- shall signal an error.
-
- The first argument is the syntax checker being started. The
- second is a callback function to report state changes to
- Flycheck. The callback takes two arguments STATUS DATA,
- where STATUS is a symbol denoting the syntax checker status
- and DATA an optional argument with additional data for the
- status report. See `flycheck-report-buffer-checker-status'
- for more information about STATUS and DATA.
-
- FUNCTION may be synchronous or asynchronous, i.e. it may
- call the given callback either immediately, or at some later
- point (e.g. from a process sentinel).
-
- A syntax checker _must_ call CALLBACK at least once with a
- STATUS that finishes the current syntax checker. Otherwise
- Flycheck gets stuck at the current syntax check with this
- syntax checker.
-
- The context object returned by FUNCTION is passed to
- `:interrupt'.
-
-`:interrupt FUNCTION'
- A function to interrupt the syntax check.
-
- FUNCTION is called with the syntax checker and the context
- object returned by the `:start' function and shall try to
- interrupt the syntax check. The context may be nil, if the
- syntax check is interrupted before actually started.
- FUNCTION should handle this situation.
-
- If it cannot interrupt the syntax check, it may either
- signal an error or silently ignore the attempt to interrupt
- the syntax checker, depending on the severity of the
- situation.
-
- If interrupting the syntax check failed, Flycheck will let
- the syntax check continue, but ignore any status reports.
- Notably, it won't highlight any errors reported by the
- syntax check in the buffer.
-
- This property is optional. If omitted, Flycheck won't
- attempt to interrupt syntax checks with this syntax checker,
- and simply ignore their results.
-
-`:print-doc FUNCTION'
- A function to print additional documentation into the Help
- buffer of this checker.
-
- FUNCTION is called when creating the Help buffer for the
- syntax checker, with the syntax checker as single argument,
- after printing the name of the syntax checker and its modes
- and predicate, but before printing DOCSTRING. It may insert
- additional documentation into the current buffer.
-
- The call occurs within `with-help-window'. Hence
- `standard-output' points to the current buffer, so you may
- use `princ' and friends to add content. Also, the current
- buffer is put into Help mode afterwards, which automatically
- turns symbols into references, if possible.
-
- This property is optional. If omitted, no additional
- documentation is printed for this syntax checker.
-
-:verify FUNCTION
- A function to verify the checker for the current buffer.
-
- FUNCTION is called with the syntax checker as single
- argument, and shall return a list of
- `flycheck-verification-result' objects indicating whether
- the syntax checker could be used in the current buffer, and
- highlighting potential setup problems.
-
- This property is optional. If omitted, no additional
- verification occurs for this syntax checker. It is however
- absolutely recommended that you add a `:verify' function to
- your syntax checker, because it will help users to spot
- potential setup problems.
-
-`:modes MODES'
- A major mode symbol or a list thereof, denoting major modes
- to use this syntax checker in.
-
- This syntax checker will only be used in buffers whose
- `major-mode' is contained in MODES.
-
- If `:predicate' is also given the syntax checker will only
- be used in buffers for which the `:predicate' returns
- non-nil.
-
-`:predicate FUNCTION'
- A function to determine whether to use the syntax checker in
- the current buffer.
-
- FUNCTION is called without arguments and shall return
- non-nil if this syntax checker shall be used to check the
- current buffer. Otherwise it shall return nil.
-
- If this checker has a `:working-directory' FUNCTION is
- called with `default-directory' bound to the checker's
- working directory.
-
- FUNCTION is only called in matching major modes.
-
- This property is optional.
-
-`:enabled FUNCTION'
- A function to determine whether to use the syntax checker in
- the current buffer.
-
- This property behaves as `:predicate', except that it's only
- called the first time a syntax checker is to be used in a buffer.
-
- FUNCTION is called without arguments and shall return
- non-nil if this syntax checker shall be used to check the
- current buffer. Otherwise it shall return nil.
-
- If FUNCTION returns a non-nil value the checker is put in a
- whitelist in `flycheck--automatically-enabled-checkers' to
- prevent further invocations of `:enabled'. Otherwise it is
- disabled via `flycheck--automatically-disabled-checkers' to
- prevent any further use of it.
-
- If this checker has a `:working-directory' FUNCTION is
- called with `default-directory' bound to the checker's
- working directory.
-
- FUNCTION is only called in matching major modes.
-
- This property is optional.
-
-`:error-filter FUNCTION'
- A function to filter the errors returned by this checker.
-
- FUNCTION is called with the list of `flycheck-error' objects
- returned by the syntax checker and shall return another list
- of `flycheck-error' objects, which is considered the final
- result of this syntax checker.
-
- FUNCTION is free to add, remove or modify errors, whether in
- place or by copying.
-
- This property is optional. The default filter is
- `identity'.
-
-`:error-explainer FUNCTION'
- A function to return an explanation text for errors
- generated by this checker.
-
- FUNCTION is called with a `flycheck-error' object, in the
- buffer of that error. It shall return an explanation
- message for the error.
-
- The message can take any of the following forms:
- - A string, which will be displayed to the user
- - A function (likely a closure), which will be called with
- `standard-output' set to a `flycheck-explain-error-mode'
- buffer, and should write to it.
- - A cons `(url . ,URL), indicating that the explanation can
- be found online at URL.
- - nil if there is no explanation for this error.
-
- This property is optional.
-
-`:next-checkers NEXT-CHECKERS'
- A list denoting syntax checkers to apply after this syntax
- checker, in what we call \"chaining\" of syntax checkers.
-
- Each ITEM is a cons cell `(LEVEL . CHECKER)'. CHECKER is a
- syntax checker to run after this syntax checker. LEVEL is
- an error level. CHECKER will only be used if there are no
- current errors of at least LEVEL. LEVEL may also be t, in
- which case CHECKER is used regardless of the current errors.
-
- ITEM may also be a syntax checker symbol, which is
- equivalent to `(t . ITEM)'.
-
- Flycheck tries all items in order of declaration, and uses
- the first whose LEVEL matches and whose CHECKER is
- registered and can be used for the current buffer.
-
- This feature is typically used to apply more than one syntax
- checker to a buffer. For instance, you might first use a
- compiler to check a buffer for syntax and type errors, and
- then run a linting tool that checks for insecure code, or
- questionable style.
-
- This property is optional. If omitted, it defaults to the
- nil, i.e. no other syntax checkers are applied after this
- syntax checker.
-
-`:working-directory FUNCTION'
- The value of `default-directory' when invoking `:start'.
-
- FUNCTION is a function taking the syntax checker as sole
- argument. It shall return the absolute path to an existing
- directory to use as `default-directory' for `:start' or
- nil to fall back to the `default-directory' of the current
- buffer.
-
- This property is optional. If omitted, invoke `:start'
- from the `default-directory' of the buffer being checked.
-
-Signal an error, if any property has an invalid value."
- (declare (indent 1)
- (doc-string 2))
- (let ((start (plist-get properties :start))
- (interrupt (plist-get properties :interrupt))
- (print-doc (plist-get properties :print-doc))
- (modes (plist-get properties :modes))
- (predicate (plist-get properties :predicate))
- (verify (plist-get properties :verify))
- (enabled (plist-get properties :enabled))
- (filter (or (plist-get properties :error-filter) #'identity))
- (explainer (plist-get properties :error-explainer))
- (next-checkers (plist-get properties :next-checkers))
- (file (flycheck-current-load-file))
- (working-directory (plist-get properties :working-directory)))
-
- (unless (listp modes)
- (setq modes (list modes)))
-
- (unless (functionp start)
- (error ":start %S of syntax checker %s is not a function" start symbol))
- (unless (or (null interrupt) (functionp interrupt))
- (error ":interrupt %S of syntax checker %s is not a function"
- interrupt symbol))
- (unless (or (null print-doc) (functionp print-doc))
- (error ":print-doc %S of syntax checker %s is not a function"
- print-doc symbol))
- (unless (or (null verify) (functionp verify))
- (error ":verify %S of syntax checker %S is not a function"
- verify symbol))
- (unless (or (null enabled) (functionp enabled))
- (error ":enabled %S of syntax checker %S is not a function"
- enabled symbol))
- (unless modes
- (error "Missing :modes in syntax checker %s" symbol))
- (dolist (mode modes)
- (unless (symbolp mode)
- (error "Invalid :modes %s in syntax checker %s, %s must be a symbol"
- modes symbol mode)))
- (unless (or (null predicate) (functionp predicate))
- (error ":predicate %S of syntax checker %s is not a function"
- predicate symbol))
- (unless (functionp filter)
- (error ":error-filter %S of syntax checker %s is not a function"
- filter symbol))
- (unless (or (null explainer) (functionp explainer))
- (error ":error-explainer %S of syntax checker %S is not a function"
- explainer symbol))
- (dolist (checker next-checkers)
- (flycheck-validate-next-checker checker))
-
- (let ((real-predicate
- (and predicate
- (lambda ()
- ;; Run predicate in the checker's default directory
- (let ((default-directory
- (flycheck-compute-working-directory symbol)))
- (funcall predicate)))))
- (real-enabled
- (lambda ()
- (if (flycheck-valid-checker-p symbol)
- (or (null enabled)
- ;; Run enabled in the checker's default directory
- (let ((default-directory
- (flycheck-compute-working-directory symbol)))
- (funcall enabled)))
- (lwarn 'flycheck
- :warning "%S is no valid Flycheck syntax checker.
-Try to reinstall the package defining this syntax checker." symbol)
- nil))))
- (pcase-dolist (`(,prop . ,value)
- `((start . ,start)
- (interrupt . ,interrupt)
- (print-doc . ,print-doc)
- (modes . ,modes)
- (predicate . ,real-predicate)
- (verify . ,verify)
- (enabled . ,real-enabled)
- (error-filter . ,filter)
- (error-explainer . ,explainer)
- (next-checkers . ,next-checkers)
- (documentation . ,docstring)
- (file . ,file)
- (working-directory . ,working-directory)))
- (setf (flycheck-checker-get symbol prop) value)))
-
- ;; Track the version, to avoid breakage if the internal format changes
- (setf (flycheck-checker-get symbol 'generic-checker-version)
- flycheck-generic-checker-version)))
-
-(defun flycheck-valid-checker-p (checker)
- "Check whether a CHECKER is valid.
-
-A valid checker is a symbol defined as syntax checker with
-`flycheck-define-checker'."
- (and (symbolp checker)
- (= (or (get checker 'flycheck-generic-checker-version) 0)
- flycheck-generic-checker-version)))
-
-(defun flycheck-checker-supports-major-mode-p (checker &optional mode)
- "Whether CHECKER supports the given major MODE.
-
-CHECKER is a syntax checker symbol and MODE a major mode symbol.
-Look at the `modes' property of CHECKER to determine whether
-CHECKER supports buffers in the given major MODE.
-
-MODE defaults to the value of `major-mode' if omitted or nil.
-
-Return non-nil if CHECKER supports MODE and nil otherwise."
- (let ((mode (or mode major-mode)))
- (memq mode (flycheck-checker-get checker 'modes))))
-
-(define-obsolete-variable-alias 'flycheck-enabled-checkers
- 'flycheck--automatically-enabled-checkers "32")
-
-(defvar flycheck--automatically-enabled-checkers nil
- "Syntax checkers included in automatic selection.
-
-A list of Flycheck syntax checkers included in automatic
-selection for the current buffer.")
-(make-variable-buffer-local 'flycheck--automatically-enabled-checkers)
-
-(defun flycheck-may-enable-checker (checker)
- "Whether a generic CHECKER may be enabled for current buffer.
-
-Return non-nil if CHECKER may be used for the current buffer, and
-nil otherwise. The result of the `:enabled' check, if any, is
-cached."
- (and
- ;; Don't run the :enabled check if the checker is already disabled…
- (not (flycheck-disabled-checker-p checker))
- (or
- ;; …or if we've already cached the result
- (memq checker flycheck--automatically-enabled-checkers)
- (let* ((enabled (flycheck-checker-get checker 'enabled))
- (may-enable (or (null enabled) (funcall enabled))))
- ;; Cache the result
- (if may-enable
- (cl-pushnew checker flycheck--automatically-enabled-checkers)
- (cl-pushnew checker flycheck--automatically-disabled-checkers))
- may-enable))))
-
-(defun flycheck-reset-enabled-checker (checker)
- "Reset the `:enabled' test of CHECKER.
-
-Forget that CHECKER has been enabled or automatically disabled
-from a previous `:enabled' test. The result of the `:enabled'
-test is cached in `flycheck-may-enable-checker': if you wish to
-test the `:enabled' predicate again, you must first reset its
-state using this function."
- (when (memq checker flycheck--automatically-disabled-checkers)
- (setq flycheck--automatically-disabled-checkers
- (remq checker flycheck--automatically-disabled-checkers)))
- (when (memq checker flycheck--automatically-enabled-checkers)
- (setq flycheck--automatically-enabled-checkers
- (remq checker flycheck--automatically-enabled-checkers)))
- (flycheck-buffer))
-
-(defun flycheck-may-use-checker (checker)
- "Whether a generic CHECKER may be used.
-
-Return non-nil if CHECKER may be used for the current buffer, and
-nil otherwise."
- (let ((predicate (flycheck-checker-get checker 'predicate)))
- (and (flycheck-valid-checker-p checker)
- (flycheck-checker-supports-major-mode-p checker)
- (flycheck-may-enable-checker checker)
- (or (null predicate) (funcall predicate)))))
-
-(defun flycheck-may-use-next-checker (next-checker)
- "Determine whether NEXT-CHECKER may be used."
- (when (symbolp next-checker)
- (push t next-checker))
- (let ((level (car next-checker))
- (next-checker (cdr next-checker)))
- (and (or (eq level t)
- (flycheck-has-max-current-errors-p level))
- (flycheck-registered-checker-p next-checker)
- (flycheck-may-use-checker next-checker))))
-
-
-;;; Help for generic syntax checkers
-(define-button-type 'help-flycheck-checker-def
- :supertype 'help-xref
- 'help-function #'flycheck-goto-checker-definition
- 'help-echo "mouse-1, RET: find Flycheck checker definition")
-
-(defconst flycheck-find-checker-regexp
- (rx line-start (zero-or-more (syntax whitespace))
- "(" symbol-start
- (or "flycheck-define-checker" "flycheck-define-command-checker")
- symbol-end
- (eval (list 'regexp find-function-space-re))
- (? "'")
- symbol-start "%s" symbol-end
- (or (syntax whitespace) line-end))
- "Regular expression to find a checker definition.")
-
-(add-to-list 'find-function-regexp-alist
- '(flycheck-checker . flycheck-find-checker-regexp))
-
-(defun flycheck-goto-checker-definition (checker file)
- "Go to to the definition of CHECKER in FILE."
- (let ((location (find-function-search-for-symbol
- checker 'flycheck-checker file)))
- (pop-to-buffer (car location))
- (if (cdr location)
- (goto-char (cdr location))
- (message "Unable to find checker location in file"))))
-
-(defun flycheck-checker-at-point ()
- "Return the Flycheck checker found at or before point.
-
-Return nil if there is no checker."
- (let ((symbol (variable-at-point 'any-symbol)))
- (when (flycheck-valid-checker-p symbol)
- symbol)))
-
-(defun flycheck-describe-checker (checker)
- "Display the documentation of CHECKER.
-
-CHECKER is a checker symbol.
-
-Pop up a help buffer with the documentation of CHECKER."
- (interactive
- (let* ((enable-recursive-minibuffers t)
- (default (or (flycheck-checker-at-point)
- (ignore-errors (flycheck-get-checker-for-buffer))))
- (prompt (if default
- (format "Describe syntax checker (default %s): " default)
- "Describe syntax checker: ")))
- (list (flycheck-read-checker prompt default))))
- (unless (flycheck-valid-checker-p checker)
- (user-error "You didn't specify a Flycheck syntax checker"))
- (let ((filename (flycheck-checker-get checker 'file))
- (modes (flycheck-checker-get checker 'modes))
- (predicate (flycheck-checker-get checker 'predicate))
- (print-doc (flycheck-checker-get checker 'print-doc))
- (next-checkers (flycheck-checker-get checker 'next-checkers))
- (help-xref-following
- ;; Ensure that we don't reuse buffers like `flycheck-verify-checker',
- ;; and that we don't error out if a `help-flycheck-checker-doc' button
- ;; is added outside of a documentation window.
- (and help-xref-following (eq major-mode 'help-mode))))
- (help-setup-xref (list #'flycheck-describe-checker checker)
- (called-interactively-p 'interactive))
- (save-excursion
- (with-help-window (help-buffer)
- (princ (format "%s is a Flycheck syntax checker" checker))
- (when filename
- (princ (format " in `%s'" (file-name-nondirectory filename)))
- (with-current-buffer standard-output
- (save-excursion
- (re-search-backward "`\\([^`']+\\)'" nil t)
- (help-xref-button 1 'help-flycheck-checker-def
- checker filename))))
- (princ ".\n\n")
-
- (let ((modes-start (with-current-buffer standard-output (point-max))))
- ;; Track the start of the modes documentation, to properly re-fill
- ;; it later
- (princ " This syntax checker checks syntax in the major mode(s) ")
- (princ (string-join
- (seq-map (apply-partially #'format "`%s'") modes)
- ", "))
- (when predicate
- (princ ", and uses a custom predicate"))
- (princ ".")
- (when next-checkers
- (princ " It runs the following checkers afterwards:"))
- (with-current-buffer standard-output
- (save-excursion
- (fill-region-as-paragraph modes-start (point-max))))
- (princ "\n")
-
- ;; Print the list of next checkers
- (when next-checkers
- (princ "\n")
- (let ((beg-checker-list (with-current-buffer standard-output
- (point))))
- (dolist (next-checker next-checkers)
- (if (symbolp next-checker)
- (princ (format " * `%s'\n" next-checker))
- (princ (format " * `%s' (maximum level `%s')\n"
- (cdr next-checker) (car next-checker)))))
- ;;
- (with-current-buffer standard-output
- (save-excursion
- (while (re-search-backward "`\\([^`']+\\)'"
- beg-checker-list t)
- (let ((checker (intern-soft (match-string 1))))
- (when (flycheck-valid-checker-p checker)
- (help-xref-button 1 'help-flycheck-checker-doc
- checker)))))))))
- ;; Call the custom print-doc function of the checker, if present
- (when print-doc
- (funcall print-doc checker))
- ;; Ultimately, print the docstring
- (princ "\nDocumentation:\n")
- (princ (flycheck-checker-get checker 'documentation))))))
-
-
-;;; Syntax checker verification
-(cl-defstruct (flycheck-verification-result
- (:constructor flycheck-verification-result-new))
- "Structure for storing a single verification result.
-
-Slots:
-
-`label'
- A label for this result, as string
-
-`message'
- A message for this result, as string
-
-`face'
- The face to use for the `message'.
-
- You can either use a face symbol, or a list of face symbols."
- label message face)
-
-(defun flycheck-verify-generic-checker (checker)
- "Verify a generic CHECKER in the current buffer.
-
-Return a list of `flycheck-verification-result' objects."
- (let (results
- (predicate (flycheck-checker-get checker 'predicate))
- (enabled (flycheck-checker-get checker 'enabled))
- (verify (flycheck-checker-get checker 'verify)))
- (when enabled
- (let ((result (funcall enabled)))
- (push (flycheck-verification-result-new
- :label (propertize "may enable" 'help-echo ":enable")
- :message (if result "yes" "no")
- :face (if result 'success '(bold warning)))
- results)))
- (when predicate
- (let ((result (funcall predicate)))
- (push (flycheck-verification-result-new
- :label (propertize "may run" 'help-echo ":predicate")
- :message (prin1-to-string (not (null result)))
- :face (if result 'success '(bold warning)))
- results)))
- (append (nreverse results)
- (and verify (funcall verify checker)))))
-
-(define-button-type 'help-flycheck-checker-doc
- :supertype 'help-xref
- 'help-function #'flycheck-describe-checker
- 'help-echo "mouse-1, RET: describe Flycheck checker")
-
-(define-button-type 'flycheck-button
- 'follow-link t
- 'action (lambda (pos)
- (apply (get-text-property pos 'flycheck-action)
- (get-text-property pos 'flycheck-data))
- ;; Revert the verify-setup buffer since it is now stale
- (revert-buffer))
- 'face 'flycheck-verify-select-checker)
-
-(define-button-type 'flycheck-checker-select
- :supertype 'flycheck-button
- 'flycheck-action (lambda (buffer checker)
- (with-current-buffer buffer
- (flycheck-select-checker checker)))
- 'help-echo "mouse-1, RET: select this checker")
-
-(define-button-type 'flycheck-checker-enable
- :supertype 'flycheck-button
- 'flycheck-action (lambda (buffer checker)
- (with-current-buffer buffer
- (flycheck-disable-checker checker t)))
- 'help-echo "mouse-1, RET: re-enable this checker in this buffer")
-
-(define-button-type 'flycheck-checker-reset-enabled
- :supertype 'flycheck-button
- 'flycheck-action (lambda (buffer checker)
- (with-current-buffer buffer
- (flycheck-reset-enabled-checker checker)))
- 'help-echo "mouse-1, RET: try to re-enable this checker")
-
-(defun flycheck--verify-princ-checker (checker buffer
- &optional with-mm with-select)
- "Print verification result of CHECKER for BUFFER.
-
-When WITH-MM is given and non-nil, also include the major mode
-into the verification results.
-
-When WITH-SELECT is non-nil, add a button to select this checker."
- (princ " ")
- (insert-button (symbol-name checker)
- 'type 'help-flycheck-checker-doc
- 'help-args (list checker))
- (cond
- ((with-current-buffer buffer
- (flycheck-manually-disabled-checker-p checker))
- (insert (propertize " (manually disabled) " 'face '(bold error)))
- (insert-text-button "enable"
- 'type 'flycheck-checker-enable
- 'flycheck-data (list buffer checker)))
- ((with-current-buffer buffer
- (flycheck-automatically-disabled-checker-p checker))
- (insert (propertize " (automatically disabled) " 'face '(bold error)))
- (insert-text-button "reset"
- 'type 'flycheck-checker-reset-enabled
- 'flycheck-data (list buffer checker))))
- (when (eq checker (buffer-local-value 'flycheck-checker buffer))
- (insert (propertize " (explicitly selected)" 'face 'bold)))
- (when with-select
- (princ " ")
- (insert-text-button "select"
- 'type 'flycheck-checker-select
- 'flycheck-data (list buffer checker)))
- (princ "\n")
- (let ((results (with-current-buffer buffer
- (append (flycheck-verify-generic-checker checker)
- (flycheck--verify-next-checkers checker)))))
- (when with-mm
- (with-current-buffer buffer
- (let ((message-and-face
- (if (flycheck-checker-supports-major-mode-p checker)
- (cons (format "`%s' supported" major-mode) 'success)
- (cons (format "`%s' not supported" major-mode) 'error))))
- (push (flycheck-verification-result-new
- :label "major mode"
- :message (car message-and-face)
- :face (cdr message-and-face))
- results))))
- (let* ((label-length
- (seq-max (mapcar
- (lambda (res)
- (length (flycheck-verification-result-label res)))
- results)))
- (message-column (+ 8 label-length)))
- (dolist (result results)
- (princ " - ")
- (princ (flycheck-verification-result-label result))
- (princ ": ")
- (princ (make-string (- message-column (current-column)) ?\ ))
- (let ((message (flycheck-verification-result-message result))
- (face (flycheck-verification-result-face result)))
- ;; If face is nil, using propertize erases the face already contained
- ;; by the message. We don't want that, since this would remove the
- ;; button face from the checker chain result.
- (insert (if face (propertize message 'face face) message)))
- (princ "\n"))))
- (princ "\n"))
-
-(defun flycheck--get-next-checker-symbol (next)
- "Get the checker symmbol of NEXT checker.
-
-NEXT should be either a cons (NEXT-CHECKER . LEVEL) or a
-symbol."
- (if (consp next) (cdr next) next))
-
-(defun flycheck-get-next-checkers (checker)
- "Return the immediate next checkers of CHECKER.
-
-This is a list of checker symbols. The error levels of the
-`:next-checker' property are ignored."
- (mapcar #'flycheck--get-next-checker-symbol
- (flycheck-checker-get checker 'next-checkers)))
-
-(defun flycheck-all-next-checkers (checker)
- "Return all checkers that may follow CHECKER.
-
-Return the transitive closure of the next-checker relation. The
-return value is a list of checkers, not including CHECKER."
- (let ((next-checkers)
- (visited)
- (queue (list checker)))
- (while queue
- (let ((c (pop queue)))
- (push c visited)
- (dolist (n (flycheck-get-next-checkers c))
- (push n next-checkers)
- (unless (memq n visited)
- (cl-pushnew n queue)))))
- (seq-uniq next-checkers)))
-
-(defun flycheck--verify-next-checkers (checker)
- "Return a verification result for the next checkers of CHECKER."
- (-when-let (next (flycheck-get-next-checkers checker))
- (list
- (flycheck-verification-result-new
- :label "next checkers"
- ;; We use `make-text-button' to preserve the button properties in the
- ;; string
- :message (mapconcat
- (lambda (checker)
- (make-text-button (symbol-name checker) nil
- 'type 'help-flycheck-checker-doc
- 'help-args (list checker)))
- next
- ", ")))))
-
-(defun flycheck--verify-print-header (desc buffer)
- "Print a title with DESC for BUFFER in the current buffer.
-
-DESC is an arbitrary string containing a description, and BUFFER
-is the buffer being verified. The name and the major mode mode
-of BUFFER are printed.
-
-DESC and information about BUFFER are printed in the current
-buffer."
- (princ desc)
- (insert (propertize (buffer-name buffer) 'face 'bold))
- (princ " in ")
- (let ((mode (buffer-local-value 'major-mode buffer)))
- (insert-button (symbol-name mode)
- 'type 'help-function
- 'help-args (list mode)))
- (princ ":\n\n"))
-
-(defun flycheck--verify-print-footer (buffer)
- "Print a footer for BUFFER in the current buffer.
-
-BUFFER is the buffer being verified."
- (princ "Flycheck Mode is ")
- (let ((enabled (buffer-local-value 'flycheck-mode buffer)))
- (insert (propertize (if enabled "enabled" "disabled")
- 'face (if enabled 'success '(warning bold)))))
- (princ
- (with-current-buffer buffer
- ;; Use key binding state in the verified buffer to print the help.
- (substitute-command-keys
- ". Use \\[universal-argument] \\[flycheck-disable-checker] \
-to enable disabled checkers.")))
- (save-excursion
- (let ((end (point)))
- (backward-paragraph)
- (fill-region-as-paragraph (point) end)))
-
- (princ "\n\n--------------------\n\n")
- (princ (format "Flycheck version: %s\n" (flycheck-version)))
- (princ (format "Emacs version: %s\n" emacs-version))
- (princ (format "System: %s\n" system-configuration))
- (princ (format "Window system: %S\n" window-system)))
-
-(define-derived-mode flycheck-verify-mode help-mode
- "Flycheck verification"
- "Major mode to display Flycheck verification results."
- ;; `help-mode-finish' will restore `buffer-read-only'
- (setq buffer-read-only nil))
-
-(defun flycheck-verify-checker (checker)
- "Check whether a CHECKER can be used in this buffer.
-
-Show a buffer listing possible problems that prevent CHECKER from
-being used for the current buffer.
-
-Note: Do not use this function to check whether a syntax checker
-is applicable from Emacs Lisp code. Use
-`flycheck-may-use-checker' instead."
- (interactive (list (flycheck-read-checker "Checker to verify: ")))
- (unless (flycheck-valid-checker-p checker)
- (user-error "%s is not a syntax checker" checker))
-
- ;; Save the buffer to make sure that all predicates are good
- ;; FIXME: this may be surprising to users, with unintended side-effects.
- (when (and (buffer-file-name) (buffer-modified-p))
- (save-buffer))
-
- (let ((buffer (current-buffer)))
- (with-help-window "*Flycheck checker*"
- (with-current-buffer standard-output
- (flycheck-verify-mode)
- (flycheck--verify-print-header "Syntax checker in buffer " buffer)
- (flycheck--verify-princ-checker checker buffer 'with-mm)
- (if (with-current-buffer buffer (flycheck-may-use-checker checker))
- (insert (propertize
- "Flycheck can use this syntax checker for this buffer.\n"
- 'face 'success))
- (insert (propertize
- "Flycheck cannot use this syntax checker for this buffer.\n"
- 'face 'error)))
- (insert "\n")
- (flycheck--verify-print-footer buffer)))))
-
-(defun flycheck-verify-setup ()
- "Check whether Flycheck can be used in this buffer.
-
-Display a new buffer listing all syntax checkers that could be
-applicable in the current buffer. For each syntax checkers,
-possible problems are shown."
- (interactive)
- ;; Save to make sure checkers that only work on saved buffers will pass the
- ;; verification
- (when (and (buffer-file-name) (buffer-modified-p))
- (save-buffer))
-
- (let* ((buffer (current-buffer))
- (first-checker (flycheck-get-checker-for-buffer))
- (valid-checkers
- (remq first-checker
- (seq-filter #'flycheck-may-use-checker flycheck-checkers)))
- (valid-next-checkers
- (when first-checker
- (seq-intersection valid-checkers
- (flycheck-all-next-checkers first-checker))))
- (valid-remaining (seq-difference valid-checkers valid-next-checkers))
- (other-checkers
- (seq-difference (seq-filter #'flycheck-checker-supports-major-mode-p
- flycheck-checkers)
- (cons first-checker valid-checkers))))
-
- ;; Print all applicable checkers for this buffer
- (with-help-window "*Flycheck checkers*"
- (with-current-buffer standard-output
- (flycheck-verify-mode)
-
- (flycheck--verify-print-header "Syntax checkers for buffer " buffer)
-
- (if first-checker
- (progn
- (princ "First checker to run:\n\n")
- (flycheck--verify-princ-checker first-checker buffer))
- (insert (propertize
- "No checker to run in this buffer.\n\n"
- 'face '(bold error))))
-
- (when valid-next-checkers
- (princ
- "Checkers that may run as part of the first checker's chain:\n\n")
- (dolist (checker valid-next-checkers)
- (flycheck--verify-princ-checker checker buffer)))
-
- (when valid-remaining
- (princ "Checkers that could run if selected:\n\n")
- (dolist (checker valid-remaining)
- (flycheck--verify-princ-checker checker buffer nil 'with-select)))
-
- (when other-checkers
- (princ
- "Checkers that are compatible with this mode, \
-but will not run until properly configured:\n\n")
- (dolist (checker other-checkers)
- (flycheck--verify-princ-checker checker buffer)))
-
- ;; If we have no checkers at all, that's worth mentioning
- (unless (or first-checker valid-checkers other-checkers)
- (insert (propertize
- "No checkers are available for this buffer.\n\n"
- 'face '(bold error))))
-
- (let ((unregistered-checkers
- (seq-difference (flycheck-defined-checkers) flycheck-checkers)))
- (when unregistered-checkers
- (insert (propertize
- "The following syntax checkers are not registered:\n"
- 'face '(bold warning)))
- (dolist (checker unregistered-checkers)
- (princ " - ")
- (princ checker)
- (princ "\n"))
- (princ
- "Try adding these syntax checkers to `flycheck-checkers'.\n\n")))
-
- (flycheck--verify-print-footer buffer)
-
- (setq-local revert-buffer-function
- (lambda (_ignore-auto _noconfirm)
- (with-current-buffer buffer (flycheck-verify-setup))))))))
-
-
-;;; Predicates for generic syntax checkers
-(defun flycheck-buffer-saved-p (&optional buffer)
- "Determine whether BUFFER is saved to a file.
-
-BUFFER is the buffer to check. If omitted or nil, use the
-current buffer as BUFFER.
-
-Return non-nil if the BUFFER is backed by a file, and not
-modified, or nil otherwise."
- (let ((file-name (buffer-file-name buffer)))
- (and file-name (file-exists-p file-name) (not (buffer-modified-p buffer)))))
-
-
-;;; Extending generic checkers
-(defun flycheck-remove-next-checker (checker next)
- "After CHECKER remove a NEXT checker.
-
-CHECKER is a syntax checker symbol, from which to remove NEXT
-checker.
-
-NEXT is a cons or a symbol, as documented in
-`flycheck-add-next-checker'."
- (unless (flycheck-valid-checker-p checker)
- (error "%s is not a valid syntax checker" checker))
- (let* ((next-symbol (flycheck--get-next-checker-symbol next)))
- (setf
- (flycheck-checker-get checker 'next-checkers)
- (seq-remove
- (lambda (next) (eq (flycheck--get-next-checker-symbol next) next-symbol))
- (flycheck-checker-get checker 'next-checkers)))))
-
-(defun flycheck-add-next-checker (checker next &optional append)
- "After CHECKER add a NEXT checker.
-
-CHECKER is a syntax checker symbol, to which to add NEXT checker.
-
-NEXT is a cons cell `(LEVEL . NEXT-CHECKER)'. NEXT-CHECKER is a
-symbol denoting the syntax checker to run after CHECKER. LEVEL
-is an error level. NEXT-CHECKER will only be used if there is no
-current error whose level is more severe than LEVEL. LEVEL may
-also be t, in which case NEXT-CHECKER is used regardless of the
-current errors.
-
-NEXT can also be a syntax checker symbol only, which is
-equivalent to `(t . NEXT)'.
-
-NEXT-CHECKER is prepended before other next checkers, unless
-APPEND is non-nil."
- (unless (flycheck-valid-checker-p checker)
- (error "%s is not a valid syntax checker" checker))
- (flycheck-validate-next-checker next 'strict)
- (flycheck-remove-next-checker checker next)
- (let ((next-checkers (flycheck-checker-get checker 'next-checkers)))
- (setf (flycheck-checker-get checker 'next-checkers)
- (if append (append next-checkers (list next))
- (cons next next-checkers)))))
-
-(defun flycheck-add-mode (checker mode)
- "To CHECKER add a new major MODE.
-
-CHECKER and MODE are symbols denoting a syntax checker and a
-major mode respectively.
-
-Add MODE to the `:modes' property of CHECKER, so that CHECKER
-will be used in buffers with MODE."
- (unless (flycheck-valid-checker-p checker)
- (error "%s is not a valid syntax checker" checker))
- (unless (symbolp mode)
- (error "%s is not a symbol" mode))
- (push mode (flycheck-checker-get checker 'modes)))
-
-
-;;; Generic syntax checks
-(cl-defstruct (flycheck-syntax-check
- (:constructor flycheck-syntax-check-new))
- "Structure for storing syntax check state.
-
-Slots:
-
-`buffer'
- The buffer being checked.
-
-`checker'
- The syntax checker being used.
-
-`context'
- The context object.
-
-`working-directory'
- Working directory for the syntax checker. Serve as a value for
- `default-directory' for a checker."
- buffer checker context working-directory)
-
-(defun flycheck-syntax-check-start (syntax-check callback)
- "Start a SYNTAX-CHECK with CALLBACK."
- (let ((checker (flycheck-syntax-check-checker syntax-check))
- (default-directory
- (flycheck-syntax-check-working-directory syntax-check)))
- (setf (flycheck-syntax-check-context syntax-check)
- (funcall (flycheck-checker-get checker 'start) checker callback))))
-
-(defun flycheck-syntax-check-interrupt (syntax-check)
- "Interrupt a SYNTAX-CHECK."
- (let* ((checker (flycheck-syntax-check-checker syntax-check))
- (interrupt-fn (flycheck-checker-get checker 'interrupt))
- (context (flycheck-syntax-check-context syntax-check)))
- (when interrupt-fn
- (funcall interrupt-fn checker context))))
-
-
-;;; Syntax checking mode
-
-(defvar flycheck-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map flycheck-keymap-prefix flycheck-command-map)
- ;; We place the menu under a custom menu key. Since this menu key is not
- ;; present in the menu of the global map, no top-level menu entry is added
- ;; to the global menu bar. However, it still appears on the mode line
- ;; lighter.
- (define-key map [menu-bar flycheck] flycheck-mode-menu-map)
- map)
- "Keymap of command `flycheck-mode'.")
-
-(defvar-local flycheck-old-next-error-function nil
- "Remember the old `next-error-function'.")
-
-(defconst flycheck-hooks-alist
- '(
- ;; Handle events that may start automatic syntax checks
- (after-save-hook . flycheck-handle-save)
- (after-change-functions . flycheck-handle-change)
- ;; Handle events that may triggered pending deferred checks
- (window-configuration-change-hook . flycheck-perform-deferred-syntax-check)
- (post-command-hook . flycheck-perform-deferred-syntax-check)
- ;; Teardown Flycheck whenever the buffer state is about to get lost, to
- ;; clean up temporary files and directories.
- (kill-buffer-hook . flycheck-teardown)
- (change-major-mode-hook . flycheck-teardown)
- (before-revert-hook . flycheck-teardown)
- ;; Update the error list if necessary
- (post-command-hook . flycheck-error-list-update-source)
- (post-command-hook . flycheck-error-list-highlight-errors)
- ;; Display errors. Show errors at point after commands (like movements) and
- ;; when Emacs gets focus. Cancel the display timer when Emacs looses focus
- ;; (as there's no need to display errors if the user can't see them), and
- ;; hide the error buffer (for large error messages) if necessary. Note that
- ;; the focus hooks only work on Emacs 24.4 and upwards, but since undefined
- ;; hooks are perfectly ok we don't need a version guard here. They'll just
- ;; not work silently.
- (post-command-hook . flycheck-maybe-display-error-at-point-soon)
- (focus-in-hook . flycheck-display-error-at-point-soon)
- (focus-out-hook . flycheck-cancel-error-display-error-at-point-timer)
- (post-command-hook . flycheck-hide-error-buffer)
- ;; Immediately show error popups when navigating to an error
- (next-error-hook . flycheck-display-error-at-point))
- "Hooks which Flycheck needs to hook in.
-
-The `car' of each pair is a hook variable, the `cdr' a function
-to be added or removed from the hook variable if Flycheck mode is
-enabled and disabled respectively.")
-
-;;;###autoload
-(define-minor-mode flycheck-mode
- "Flycheck is a minor mode for on-the-fly syntax checking.
-
-In `flycheck-mode' the buffer is automatically syntax-checked
-using the first suitable syntax checker from `flycheck-checkers'.
-Use `flycheck-select-checker' to select a checker for the current
-buffer manually.
-
-If you run into issues, use `\\[flycheck-verify-setup]' to get help.
-
-Flycheck supports many languages out of the box, and many
-additional ones are available on MELPA. Adding new ones is very
-easy. Complete documentation is available online at URL
-`https://www.flycheck.org/en/latest/'. Please report issues and
-request features at URL `https://github.com/flycheck/flycheck'.
-
-Flycheck displays its status in the mode line. In the default
-configuration, it looks like this:
-
-`FlyC' This buffer has not been checked yet.
-`FlyC-' Flycheck doesn't have a checker for this buffer.
-`FlyC*' Flycheck is running. Expect results soon!
-`FlyC:3|2' This buffer contains three warnings and two errors.
- Use `\\[flycheck-list-errors]' to see the list.
-
-You may also see the following icons:
-`FlyC!' The checker crashed.
-`FlyC.' The last syntax check was manually interrupted.
-`FlyC?' The checker did something unexpected, like exiting with 1
- but returning no errors.
-
-The following keybindings are available in `flycheck-mode':
-
-\\{flycheck-mode-map}
-\(you can change the prefix by customizing
-`flycheck-keymap-prefix')
-
-If called interactively, enable Flycheck mode if ARG is positive,
-and disable it if ARG is zero or negative. If called from Lisp,
-also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is ‘toggle’; disable the mode otherwise."
- :init-value nil
- :keymap flycheck-mode-map
- :lighter flycheck-mode-line
- :after-hook (flycheck-buffer-automatically 'mode-enabled 'force-deferred)
- (cond
- (flycheck-mode
- (flycheck-clear)
-
- (pcase-dolist (`(,hook . ,fn) (reverse flycheck-hooks-alist))
- (add-hook hook fn nil 'local))
-
- (setq flycheck-old-next-error-function
- (if flycheck-standard-error-navigation
- next-error-function
- :unset))
- (when flycheck-standard-error-navigation
- (setq next-error-function #'flycheck-next-error-function))
-
- ;; This hook must be added globally since otherwise we cannot
- ;; detect a change from a buffer where Flycheck is enabled to a
- ;; buffer where Flycheck is not enabled, and therefore cannot
- ;; notice that there has been any change when the user switches
- ;; back to the buffer where Flycheck is enabled.
- (add-hook 'buffer-list-update-hook #'flycheck-handle-buffer-switch))
- (t
- (unless (eq flycheck-old-next-error-function :unset)
- (setq next-error-function flycheck-old-next-error-function))
-
- (pcase-dolist (`(,hook . ,fn) flycheck-hooks-alist)
- (remove-hook hook fn 'local))
-
- (flycheck-teardown))))
-
-
-;;; Syntax checker selection for the current buffer
-(defun flycheck-get-checker-for-buffer ()
- "Find the checker for the current buffer.
-
-Use the selected checker for the current buffer, if any,
-otherwise search for the best checker from `flycheck-checkers'.
-
-Return checker if there is a checker for the current buffer, or
-nil otherwise."
- (if flycheck-checker
- (when (flycheck-may-use-checker flycheck-checker)
- flycheck-checker)
- (seq-find #'flycheck-may-use-checker flycheck-checkers)))
-
-(defun flycheck-get-next-checker-for-buffer (checker)
- "Get the checker to run after CHECKER for the current buffer."
- (let ((next (seq-find #'flycheck-may-use-next-checker
- (flycheck-checker-get checker 'next-checkers))))
- (when next
- (if (symbolp next) next (cdr next)))))
-
-(defun flycheck-select-checker (checker)
- "Select CHECKER for the current buffer.
-
-CHECKER is a syntax checker symbol (see `flycheck-checkers') or
-nil. In the former case, use CHECKER for the current buffer,
-otherwise deselect the current syntax checker (if any) and use
-automatic checker selection via `flycheck-checkers'.
-
-If called interactively prompt for CHECKER. With prefix arg
-deselect the current syntax checker and enable automatic
-selection again.
-
-Set `flycheck-checker' to CHECKER and automatically start a new
-syntax check if the syntax checker changed.
-
-CHECKER will be used, even if it is not contained in
-`flycheck-checkers', or if it is disabled via
-`flycheck-disabled-checkers'."
- (interactive
- (if current-prefix-arg
- (list nil)
- (list (flycheck-read-checker "Select checker: "
- (flycheck-get-checker-for-buffer)))))
- (when (not (eq checker flycheck-checker))
- (unless (or (not checker) (flycheck-may-use-checker checker))
- (flycheck-verify-checker checker)
- (user-error "Can't use syntax checker %S in this buffer" checker))
- (setq flycheck-checker checker)
- (when flycheck-mode
- (flycheck-buffer))))
-
-(defun flycheck-disable-checker (checker &optional enable)
- "Interactively disable CHECKER for the current buffer.
-
-Interactively, prompt for a syntax checker to disable, and add
-the syntax checker to the buffer-local value of
-`flycheck-disabled-checkers'.
-
-With non-nil ENABLE or with prefix arg, prompt for a disabled
-syntax checker and re-enable it by removing it from the
-buffer-local value of `flycheck-disabled-checkers'."
- (declare
- (interactive-only "Directly set `flycheck-disabled-checkers' instead"))
- (interactive
- (let* ((enable current-prefix-arg)
- (candidates (if enable
- (append flycheck-disabled-checkers
- flycheck--automatically-disabled-checkers)
- flycheck-checkers))
- (prompt (if enable "Enable syntax checker: "
- "Disable syntax checker: ")))
- (when (and enable (not candidates))
- (user-error "No syntax checkers disabled in this buffer"))
- (list (flycheck-read-checker prompt nil nil candidates) enable)))
- (unless checker
- (user-error "No syntax checker given"))
- (if enable
- ;; We must use `remq' instead of `delq', because we must _not_ modify the
- ;; list. Otherwise we could potentially modify the global default value,
- ;; in case the list is the global default.
- (progn
- (when (memq checker flycheck-disabled-checkers)
- (setq flycheck-disabled-checkers
- (remq checker flycheck-disabled-checkers))
- (flycheck-buffer))
- (when (memq checker flycheck--automatically-disabled-checkers)
- (setq flycheck--automatically-disabled-checkers
- (remq checker flycheck--automatically-disabled-checkers))
- (flycheck-buffer)))
- (unless (memq checker flycheck-disabled-checkers)
- (push checker flycheck-disabled-checkers)
- (flycheck-buffer))))
-
-
-;;; Syntax checks for the current buffer
-(defvar-local flycheck-current-syntax-check nil
- "The current syntax check in the this buffer.")
-(put 'flycheck-current-syntax-check 'permanent-local t)
-
-(defun flycheck-start-current-syntax-check (checker)
- "Start a syntax check in the current buffer with CHECKER.
-
-Set `flycheck-current-syntax-check' accordingly."
- ;; Allocate the current syntax check *before* starting it. This allows for
- ;; synchronous checks, which call the status callback immediately in their
- ;; start function.
- (let* ((check
- (flycheck-syntax-check-new
- :buffer (current-buffer)
- :checker checker
- :context nil
- :working-directory (flycheck-compute-working-directory checker)))
- (callback (flycheck-buffer-status-callback check)))
- (setq flycheck-current-syntax-check check)
- (flycheck-report-status 'running)
- (flycheck-syntax-check-start check callback)))
-
-(defun flycheck-running-p ()
- "Determine whether a syntax check is running in the current buffer."
- (not (null flycheck-current-syntax-check)))
-
-(defun flycheck-stop ()
- "Stop any ongoing syntax check in the current buffer."
- (when (flycheck-running-p)
- (flycheck-syntax-check-interrupt flycheck-current-syntax-check)
- ;; Remove the current syntax check, to reset Flycheck into a non-running
- ;; state, and to make `flycheck-report-buffer-checker-status' ignore any
- ;; status reports from the current syntax check.
- (setq flycheck-current-syntax-check nil)
- (flycheck-report-status 'interrupted)))
-
-(defun flycheck-buffer-status-callback (syntax-check)
- "Create a status callback for SYNTAX-CHECK in the current buffer."
- (lambda (&rest args)
- (apply #'flycheck-report-buffer-checker-status
- syntax-check args)))
-
-(defun flycheck-buffer ()
- "Start checking syntax in the current buffer.
-
-Get a syntax checker for the current buffer with
-`flycheck-get-checker-for-buffer', and start it."
- (interactive)
- (flycheck-clean-deferred-check)
- (if flycheck-mode
- (unless (flycheck-running-p)
- ;; Clear error list and mark all overlays for deletion. We do not
- ;; delete all overlays immediately to avoid excessive re-displays and
- ;; flickering, if the same errors gets highlighted again after the check
- ;; completed.
- (run-hooks 'flycheck-before-syntax-check-hook)
- (flycheck-clear-errors)
- (flycheck-mark-all-overlays-for-deletion)
- (condition-case err
- (let* ((checker (flycheck-get-checker-for-buffer)))
- (if checker
- (flycheck-start-current-syntax-check checker)
- (flycheck-clear)
- (flycheck-report-status 'no-checker)))
- (error
- (flycheck-report-failed-syntax-check)
- (signal (car err) (cdr err)))))
- (user-error "Flycheck mode disabled")))
-
-(defun flycheck-report-buffer-checker-status
- (syntax-check status &optional data)
- "In BUFFER, report a SYNTAX-CHECK STATUS with DATA.
-
-SYNTAX-CHECK is the `flycheck-syntax-check' which reported
-STATUS. STATUS denotes the status of CHECKER, with an optional
-DATA. STATUS may be one of the following symbols:
-
-`errored'
- The syntax checker has errored. DATA is an optional error
- message.
-
- This report finishes the current syntax check.
-
-`interrupted'
- The syntax checker was interrupted. DATA is ignored.
-
- This report finishes the current syntax check.
-
-`finished'
- The syntax checker has finished with a proper error report
- for the current buffer. DATA is the (potentially empty)
- list of `flycheck-error' objects reported by the syntax
- check.
-
- This report finishes the current syntax check.
-
-`suspicious'
- The syntax checker encountered a suspicious state, which the
- user needs to be informed about. DATA is an optional
- message.
-
-A syntax checker _must_ report a status at least once with any
-symbol that finishes the current syntax checker. Otherwise
-Flycheck gets stuck with the current syntax check.
-
-If CHECKER is not the currently used syntax checker in
-`flycheck-current-syntax-check', the status report is largely
-ignored. Notably, any errors reported by the checker are
-discarded."
- (let ((buffer (flycheck-syntax-check-buffer syntax-check)))
- ;; Ignore the status report if the buffer is gone, or if this syntax check
- ;; isn't the current one in buffer (which can happen if this is an old
- ;; report of an interrupted syntax check, and a new syntax check was started
- ;; since this check was interrupted)
- (when (and (buffer-live-p buffer)
- (eq syntax-check
- (buffer-local-value 'flycheck-current-syntax-check buffer)))
- (with-current-buffer buffer
- (let ((checker (flycheck-syntax-check-checker syntax-check)))
- (pcase status
- ((or `errored `interrupted)
- (flycheck-report-failed-syntax-check status)
- (when (eq status 'errored)
- ;; In case of error, show the error message
- (message "Error from syntax checker %s: %s"
- checker (or data "UNKNOWN!"))))
- (`suspicious
- (when flycheck-mode
- (message "Suspicious state from syntax checker %s: %s"
- checker (or data "UNKNOWN!")))
- (flycheck-report-status 'suspicious))
- (`finished
- (when flycheck-mode
- ;; Only report errors from the checker if Flycheck Mode is
- ;; still enabled.
- (flycheck-finish-current-syntax-check
- data
- (flycheck-syntax-check-working-directory syntax-check))))
- (_
- (error "Unknown status %s from syntax checker %s"
- status checker))))))))
-
-(defun flycheck-finish-current-syntax-check (errors working-dir)
- "Finish the current syntax-check in the current buffer with ERRORS.
-
-ERRORS is a list of `flycheck-error' objects reported by the
-current syntax check in `flycheck-current-syntax-check'.
-
-Report all ERRORS and potentially start any next syntax checkers.
-
-If the current syntax checker reported excessive errors, it is
-disabled via `flycheck-disable-excessive-checker' for subsequent
-syntax checks.
-
-Relative file names in ERRORS will be expanded relative to
-WORKING-DIR."
- (let* ((syntax-check flycheck-current-syntax-check)
- (checker (flycheck-syntax-check-checker syntax-check))
- (errors (flycheck-relevant-errors
- (flycheck-fill-and-expand-error-file-names
- (flycheck-filter-errors
- (flycheck-assert-error-list-p errors) checker)
- working-dir))))
- (unless (flycheck-disable-excessive-checker checker errors)
- (flycheck-report-current-errors errors))
- (let ((next-checker (flycheck-get-next-checker-for-buffer checker)))
- (if next-checker
- (flycheck-start-current-syntax-check next-checker)
- (setq flycheck-current-syntax-check nil)
- (flycheck-report-status 'finished)
- ;; Delete overlays only after the very last checker has run, to avoid
- ;; flickering on intermediate re-displays
- (flycheck-delete-marked-overlays)
- (flycheck-error-list-refresh)
- (run-hooks 'flycheck-after-syntax-check-hook)
- (when (eq (current-buffer) (window-buffer))
- (flycheck-display-error-at-point))
- ;; Immediately try to run any pending deferred syntax check, which
- ;; were triggered by intermediate automatic check event, to make sure
- ;; that we quickly refine outdated error information
- (flycheck-perform-deferred-syntax-check)))))
-
-(defun flycheck-disable-excessive-checker (checker errors)
- "Disable CHECKER if it reported excessive ERRORS.
-
-If ERRORS has more items than `flycheck-checker-error-threshold',
-add CHECKER to `flycheck--automatically-disabled-checkers', and
-show a warning.
-
-Return t when CHECKER was disabled, or nil otherwise."
- (when (and flycheck-checker-error-threshold
- (> (length errors) flycheck-checker-error-threshold))
- ;; Disable CHECKER for this buffer
- ;; (`flycheck--automatically-disabled-checkers' is a local variable).
- (lwarn '(flycheck syntax-checker) :warning
- (substitute-command-keys
- "Syntax checker %s reported too many errors (%s) and is disabled.
-Use `\\[customize-variable] RET flycheck-checker-error-threshold' to
-change the threshold or `\\[universal-argument] \
-\\[flycheck-disable-checker]' to re-enable the checker.")
- checker (length errors))
- (push checker flycheck--automatically-disabled-checkers)
- t))
-
-(defun flycheck-clear (&optional shall-interrupt)
- "Clear all errors in the current buffer.
-
-With prefix arg or SHALL-INTERRUPT non-nil, also interrupt the
-current syntax check."
- (interactive "P")
- (when shall-interrupt
- (flycheck-stop))
- (flycheck-delete-all-overlays)
- (flycheck-clear-errors)
- (flycheck-error-list-refresh)
- (flycheck-hide-error-buffer))
-
-(defun flycheck--empty-variables ()
- "Empty variables used by Flycheck."
- (kill-local-variable 'flycheck--file-truename-cache)
- (kill-local-variable 'flycheck--idle-trigger-timer)
- (kill-local-variable 'flycheck--idle-trigger-conditions)
- (kill-local-variable 'flycheck--last-error-display-tick))
-
-(defun flycheck-teardown (&optional ignore-global)
- "Teardown Flycheck in the current buffer.
-
-Completely clear the whole Flycheck state. Remove overlays, kill
-running checks, and empty all variables used by Flycheck.
-
-Unless optional argument IGNORE-GLOBAL is non-nil, check to see
-if no more Flycheck buffers remain (aside from the current
-buffer), and if so then clean up global hooks."
- (flycheck-safe-delete-temporaries)
- (flycheck-stop)
- (flycheck-clean-deferred-check)
- (flycheck-clear)
- (flycheck-cancel-error-display-error-at-point-timer)
- (flycheck--clear-idle-trigger-timer)
- (flycheck--empty-variables)
- (unless (or ignore-global
- (seq-some (lambda (buf)
- (and (not (equal buf (current-buffer)))
- (buffer-local-value 'flycheck-mode buf)))
- (buffer-list)))
- (flycheck-global-teardown 'ignore-local)))
-
-
-;;; Automatic syntax checking in a buffer
-(defun flycheck-may-check-automatically (&rest conditions)
- "Determine whether the buffer may be checked under one of CONDITIONS.
-
-Read-only buffers may never be checked automatically.
-
-If CONDITIONS are given, determine whether syntax may be checked
-under at least one of them, according to
-`flycheck-check-syntax-automatically'."
- (and (not (or buffer-read-only (flycheck-ephemeral-buffer-p)))
- (file-exists-p default-directory)
- (or (not conditions)
- (seq-some
- (lambda (condition)
- (memq condition flycheck-check-syntax-automatically))
- conditions))))
-
-(defvar-local flycheck--idle-trigger-timer nil
- "Timer used to trigger a syntax check after an idle delay.")
-
-(defvar-local flycheck--idle-trigger-conditions nil
- "List of conditions under which an idle syntax check will be triggered.
-This will be some subset of the allowable values for
-`flycheck-check-syntax-automatically'.
-
-For example, if the user switches to a buffer and then makes an
-edit, this list will have the values `idle-change' and
-`idle-buffer-switch' in it, at least until the idle timer
-expires.")
-
-(defun flycheck-buffer-automatically (&optional condition force-deferred)
- "Automatically check syntax at CONDITION.
-
-Syntax is not checked if `flycheck-may-check-automatically'
-returns nil for CONDITION. (CONDITION may be a single condition
-or a list of them.)
-
-The syntax check is deferred if FORCE-DEFERRED is non-nil, or if
-`flycheck-must-defer-check' returns t."
- (when (and flycheck-mode (if (listp condition)
- (apply #'flycheck-may-check-automatically
- condition)
- (flycheck-may-check-automatically condition)))
- (flycheck--clear-idle-trigger-timer)
- (setq flycheck--idle-trigger-conditions nil)
- (if (or force-deferred (flycheck-must-defer-check))
- (flycheck-buffer-deferred)
- (with-demoted-errors "Error while checking syntax automatically: %S"
- (flycheck-buffer)))))
-
-(defun flycheck--clear-idle-trigger-timer ()
- "Clear the idle trigger timer."
- (when flycheck--idle-trigger-timer
- (cancel-timer flycheck--idle-trigger-timer)
- (setq flycheck--idle-trigger-timer nil)))
-
-(defun flycheck--handle-idle-trigger (buffer)
- "Run a syntax check in BUFFER if appropriate.
-This function is called by `flycheck--idle-trigger-timer'."
- (let ((current-buffer (current-buffer)))
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (unless (or flycheck-buffer-switch-check-intermediate-buffers
- (eq buffer current-buffer))
- (setq flycheck--idle-trigger-conditions
- (delq 'idle-buffer-switch
- flycheck--idle-trigger-conditions)))
- (when flycheck--idle-trigger-conditions
- (flycheck-buffer-automatically flycheck--idle-trigger-conditions)
- (setq flycheck--idle-trigger-conditions nil))))))
-
-(defun flycheck-handle-change (beg end _len)
- "Handle a buffer change between BEG and END.
-
-BEG and END mark the beginning and end of the change text. _LEN
-is ignored.
-
-Start a syntax check if a new line has been inserted into the
-buffer."
- ;; Save and restore the match data, as recommended in (elisp)Change Hooks
- (save-match-data
- (when flycheck-mode
- (if (string-match-p (rx "\n") (buffer-substring beg end))
- (flycheck-buffer-automatically 'new-line 'force-deferred)
- (when (memq 'idle-change flycheck-check-syntax-automatically)
- (flycheck--clear-idle-trigger-timer)
- (cl-pushnew 'idle-change flycheck--idle-trigger-conditions)
- (setq flycheck--idle-trigger-timer
- (run-at-time flycheck-idle-change-delay nil
- #'flycheck--handle-idle-trigger
- (current-buffer))))))))
-
-(defvar flycheck--last-buffer (current-buffer)
- "The current buffer or the buffer that was previously current.
-This is usually equal to the current buffer, unless the user just
-switched buffers. After a buffer switch, it is the previous
-buffer.")
-
-(defun flycheck-handle-buffer-switch ()
- "Handle a possible switch to another buffer.
-
-If a buffer switch actually happened, schedule a syntax check."
- ;; Switching buffers here is weird, but unfortunately necessary. It
- ;; turns out that `with-temp-buffer' triggers
- ;; `buffer-list-update-hook' twice, and the value of
- ;; `current-buffer' is bogus in one of those triggers (the one just
- ;; after the temp buffer is killed). If we rely on the bogus value,
- ;; Flycheck will think that the user is switching back and forth
- ;; between different buffers during the `with-temp-buffer' call
- ;; (note: two different normal buffers, not the current buffer and
- ;; the temp buffer!), and that would trigger spurious syntax checks.
- ;; It seems that reading (window-buffer) gets us the correct current
- ;; buffer in all important real-life situations (although it doesn't
- ;; necessarily catch uses of `set-buffer').
- (with-current-buffer (window-buffer)
- (unless (or (equal flycheck--last-buffer (current-buffer))
- ;; Don't bother keeping track of changes to and from
- ;; the minibuffer, as they will never require us to
- ;; run a syntax check.
- (minibufferp))
- (setq flycheck--last-buffer (current-buffer))
- (when (and flycheck-mode
- (memq 'idle-buffer-switch flycheck-check-syntax-automatically))
- (flycheck--clear-idle-trigger-timer)
- (cl-pushnew 'idle-buffer-switch flycheck--idle-trigger-conditions)
- (setq flycheck--idle-trigger-timer
- (run-at-time flycheck-idle-buffer-switch-delay nil
- #'flycheck--handle-idle-trigger
- (current-buffer)))))))
-
-(defun flycheck-handle-save ()
- "Handle a save of the buffer."
- (flycheck-buffer-automatically 'save))
-
-
-;;; Deferred syntax checking
-(defvar-local flycheck-deferred-syntax-check nil
- "If non-nil, a deferred syntax check is pending.")
-
-(defun flycheck-must-defer-check ()
- "Determine whether the syntax check has to be deferred.
-
-A check has to be deferred if the buffer is not visible, or if the buffer is
-currently being reverted.
-
-Return t if the check is to be deferred, or nil otherwise."
- (or (not (get-buffer-window))
- ;; We defer the syntax check if Flycheck is already running, to
- ;; immediately start a new syntax check after the current one finished,
- ;; because the result of the current check will most likely be outdated by
- ;; the time it is finished.
- (flycheck-running-p)
- ;; We must defer checks while a buffer is being reverted, to avoid race
- ;; conditions while the buffer contents are being restored.
- revert-buffer-in-progress-p))
-
-(defun flycheck-deferred-check-p ()
- "Determine whether the current buffer has a deferred check.
-
-Return t if so, or nil otherwise."
- flycheck-deferred-syntax-check)
-
-(defun flycheck-buffer-deferred ()
- "Defer syntax check for the current buffer."
- (setq flycheck-deferred-syntax-check t))
-
-(defun flycheck-clean-deferred-check ()
- "Clean a deferred syntax checking state."
- (setq flycheck-deferred-syntax-check nil))
-
-(defun flycheck-perform-deferred-syntax-check ()
- "Perform the deferred syntax check."
- (when (flycheck-deferred-check-p)
- (flycheck-clean-deferred-check)
- (flycheck-buffer-automatically)))
-
-
-;;; Syntax checking in all buffers
-(defun flycheck-may-enable-mode ()
- "Determine whether Flycheck mode may be enabled.
-
-Flycheck mode is not enabled for
-
-- the minibuffer,
-- `fundamental-mode'
-- major modes whose `mode-class' property is `special',
-- ephemeral buffers (see `flycheck-ephemeral-buffer-p'),
-- encrypted buffers (see `flycheck-encrypted-buffer-p'),
-- remote files (see `file-remote-p'),
-- and major modes excluded by `flycheck-global-modes'.
-
-Return non-nil if Flycheck mode may be enabled, and nil
-otherwise."
- (and (pcase flycheck-global-modes
- ;; Whether `major-mode' is disallowed by `flycheck-global-modes'
- (`t t)
- (`(not . ,modes) (not (memq major-mode modes)))
- (modes (memq major-mode modes)))
- (not (or (minibufferp)
- (eq major-mode 'fundamental-mode)
- (eq (get major-mode 'mode-class) 'special)
- (flycheck-ephemeral-buffer-p)
- (flycheck-encrypted-buffer-p)
- (and (buffer-file-name)
- (file-remote-p (buffer-file-name) 'method))))))
-
-(defun flycheck-mode-on-safe ()
- "Enable command `flycheck-mode' if it is safe to do so.
-
-Command `flycheck-mode' is only enabled if
-`flycheck-may-enable-mode' returns a non-nil result."
- (when (flycheck-may-enable-mode)
- (flycheck-mode)))
-
-;;;###autoload
-(define-globalized-minor-mode global-flycheck-mode flycheck-mode
- flycheck-mode-on-safe
- :init-value nil
- ;; Do not expose Global Flycheck Mode on customize interface, because the
- ;; interaction between package.el and customize is currently broken. See
- ;; https://github.com/flycheck/flycheck/issues/595
-
- ;; :require 'flycheck :group
- ;; 'flycheck
- )
-
-(defun flycheck-global-teardown (&optional ignore-local)
- "Teardown Flycheck in all buffers.
-
-Completely clear the whole Flycheck state in all buffers, stop
-all running checks, remove all temporary files, and empty all
-variables of Flycheck.
-
-Also remove global hooks. (If optional argument IGNORE-LOCAL is
-non-nil, then only do this and skip per-buffer teardown.)"
- (unless ignore-local
- (dolist (buffer (buffer-list))
- (with-current-buffer buffer
- (when flycheck-mode
- (flycheck-teardown 'ignore-global)))))
- (remove-hook 'buffer-list-update-hook #'flycheck-handle-buffer-switch))
-
-;; Clean up the entire state of Flycheck when Emacs is killed, to get rid of any
-;; pending temporary files.
-(add-hook 'kill-emacs-hook #'flycheck-global-teardown)
-
-
-;;; Errors from syntax checks
-(cl-defstruct (flycheck-error
- (:constructor nil)
- (:constructor
- flycheck-error-new
- (&key
- line column end-line end-column
- buffer checker filename message level id group
- &aux (-end-line end-line) (-end-column end-column)))
- (:constructor
- flycheck-error-new-at
- (line
- column
- &optional level message
- &key end-line end-column checker id group
- (filename (buffer-file-name)) (buffer (current-buffer))
- &aux (-end-line end-line) (-end-column end-column)))
- (:constructor
- flycheck-error-new-at-pos
- (pos
- &optional level message
- &key end-pos checker id group
- (filename (buffer-file-name)) (buffer (current-buffer))
- &aux
- ((line . column)
- (if pos (flycheck-line-column-at-pos pos)
- '(nil . nil)))
- ((-end-line . -end-column)
- (if end-pos (flycheck-line-column-at-pos end-pos)
- '(nil . nil))))))
- "Structure representing an error reported by a syntax checker.
-Slots:
-
-`buffer'
- The buffer that the error was reported for, as buffer object.
-
-`checker'
- The syntax checker which reported this error, as symbol.
-
-`filename'
- The file name the error refers to, as string.
-
-`line'
- The line on which the error starts, as number.
-
-`column' (optional)
- The column at which the error starts, as number.
-
- For compatibility with external tools and unlike Emacs
- itself (e.g. in Compile Mode) Flycheck uses _1-based_
- columns: The first character on a line is column 1.
-
- Occasionally some tools try to proactively adapt to Emacs
- and emit 0-based columns automatically. In these cases, the
- columns must be adjusted for Flycheck, see
- `flycheck-increment-error-columns'.
-
- If nil, the whole line is highlighted.
-
-`end-line' (optional)
- The line on which the error ends. If nil, this is computed according to
- `flycheck-highlighting-mode'.
-
-`end-column'
- The column at which the error ends. If nil, this is computed according to
- `flycheck-highlighting-mode'. Error intervals are right-open: the
- end-column points to the first character not included in the error. For
- example, 1:1 is an empty range. and in \"line-number-at-pos\", the range
- 6:12 covers the word \"number\".
-
-`message' (optional)
- The error message as a string, if any.
-
-`level'
- The error level, as either `info', `warning' or `error'.
-
-`id' (optional)
- An ID identifying the kind of error.
-
-`group' (optional)
- A symbol identifying the group the error belongs to.
-
- Some tools will emit multiple errors that relate to the same
- issue (e.g., lifetime errors in Rust). All related errors
- collected by a checker should have the same `group` value,
- in order to be able to present them to the user.
-
- See `flycheck-related-errors`."
- buffer checker filename line column message level id group
- ;; The fields below are at the end of the record to preserve backwards
- ;; compatibility; see https://github.com/flycheck/flycheck/pull/1400 and
- ;; https://lists.gnu.org/archive/html/emacs-devel/2018-07/msg00436.html
- -end-line -end-column)
-
-;; These accessors are defined for backwards compatibility
-;; FIXME: Clean up once package.el learns how to recompile dependencies.
-
-(defun flycheck-error-end-line (err)
- "Return the end line of a Flycheck error ERR."
- (condition-case nil (flycheck-error--end-line err)
- (args-out-of-range nil)))
-
-(defun flycheck-error-end-column (err)
- "Return the end column of a Flycheck error ERR."
- (condition-case nil (flycheck-error--end-column err)
- (args-out-of-range nil)))
-
-(defun flycheck-error--set-end-line (err line)
- "Set the end line of a Flycheck error ERR to LINE."
- (condition-case nil (setf (flycheck-error--end-line err) line)
- (args-out-of-range nil)))
-
-(defun flycheck-error--set-end-column (err column)
- "Set the end column of a Flycheck error ERR to COLUMN."
- (condition-case nil (setf (flycheck-error--end-column err) column)
- (args-out-of-range nil)))
-
-(gv-define-simple-setter flycheck-error-end-line
- flycheck-error--set-end-line)
-(gv-define-simple-setter flycheck-error-end-column
- flycheck-error--set-end-column)
-
-(defmacro flycheck-error-with-buffer (err &rest forms)
- "Switch to the buffer of ERR and evaluate FORMS.
-
-If the buffer of ERR is not live, FORMS are not evaluated."
- (declare (indent 1) (debug t))
- `(when (buffer-live-p (flycheck-error-buffer ,err))
- (with-current-buffer (flycheck-error-buffer ,err)
- ,@forms)))
-
-(defun flycheck--exact-region (err)
- "Get the region of ERR, if ERR specifies a range.
-
-Return a cons cell `(BEG . END)'. If the input range is empty,
-it is expanded to cover at least one character so that END is
-always greater than BEG. If ERR doesn't specify an end-column
-return nil."
- (-if-let* ((line (flycheck-error-line err))
- (column (flycheck-error-column err))
- (end-line (or (flycheck-error-end-line err) line))
- (end-column (flycheck-error-end-column err)))
- ;; Ignoring fields speeds up calls to `line-end-position'.
- (let* ((inhibit-field-text-motion t)
- (beg (flycheck-line-column-to-position line column))
- (end (flycheck-line-column-to-position end-line end-column)))
- (cond
- ((< beg end) (cons beg end))
- ((= end (point-max)) (cons (1- end) end))
- (t (cons end (1+ end)))))))
-
-(defun flycheck--line-region (pos)
- "Get the line region of position POS.
-
-Return a cons cell `(BEG . END)' where BEG is the first
-non-whitespace character on the line ERR refers to, and END the
-end of the line."
- (save-excursion
- (goto-char pos)
- (forward-line 0)
- (let ((bol (point))
- (end (line-end-position)))
- ;; Move to the beginning of this line's indentation, similar to
- ;; `back-to-indentation'
- (skip-syntax-forward " " end)
- (backward-prefix-chars)
- ;; If the current line is blank, highlight it in full; if it's
- ;; empty, include the previous line break character(s) to have
- ;; any region at all (when called with 0, `line-end-position'
- ;; gives us the end of the previous line).
- (cons (if (eolp) (if (= bol end) (line-end-position 0) bol) (point))
- end))))
-
-(defun flycheck--column-region (pos)
- "Get the column region of position POS.
-
-Return a cons cell `(BEG . END)' where BEG is the character
-before the column, and END the actual column."
- (save-excursion
- (goto-char pos)
- ;; (eobp): No enough lines in the buffer
- (if (eobp) (cons (1- (point-max)) (point-max))
- (cons pos (1+ pos)))))
-
-(defun flycheck-bounds-of-thing-at-point (thing pos)
- "Get the region of THING at position POS.
-
-THING is a understood by `thing-at-point'.
-
-Return a cons cell `(BEG . END)' where BEG is the beginning of
-the THING at the column, and END the end of the THING."
- (save-excursion
- (goto-char pos)
- (bounds-of-thing-at-point thing)))
-
-(defun flycheck--approximate-region (err mode)
- "Compute the region of ERR based on MODE and ERR's line and column."
- ;; Ignoring fields speeds up calls to `line-end-position'.
- (let* ((inhibit-field-text-motion t)
- (line (flycheck-error-line err))
- (column (flycheck-error-column err))
- (beg (flycheck-line-column-to-position line (or column 1))))
- (if (or (null column)
- (eq mode 'lines))
- (flycheck--line-region beg)
- (or (pcase mode
- (`symbols
- ;; Ensure that we're on a word or symbol. See
- ;; https://github.com/flycheck/flycheck/issues/1519
- (and (< beg (point-max))
- (memq (char-syntax (char-after beg)) '(?w ?_))
- (flycheck-bounds-of-thing-at-point 'symbol beg)))
- (`sexps
- (flycheck-bounds-of-thing-at-point 'sexp beg)))
- (flycheck--column-region beg)))))
-
-(defun flycheck-error-region-for-mode (err mode)
- "Get the region of ERR for the highlighting MODE.
-
-ERR is a Flycheck error. If its position is fully specified, use
-that to compute a region; otherwise, use MODE, as documented in
-`flycheck-highlighting-mode'. If MODE is nil, signal an error."
- (flycheck-error-with-buffer err
- (save-restriction
- (widen)
- (or (flycheck--exact-region err)
- (flycheck--approximate-region err mode)))))
-
-(defun flycheck-error-pos (err)
- "Get the buffer position of ERR.
-
-ERR is a Flycheck error whose position to get.
-
-The error position is the error column, or the first
-non-whitespace character of the error line, if ERR has no error column."
- (car (flycheck-error-region-for-mode
- err flycheck-highlighting-mode)))
-
-(defun flycheck-error-format-snippet (err &optional max-length)
- "Extract the text that ERR refers to from the buffer.
-
-Newlines and blanks are replaced by single spaces. If ERR
-doesn't include an end-position, return nil.
-
-MAX-LENGTH is how many characters to read from the buffer, at
-most. It defaults to 20."
- (flycheck-error-with-buffer err
- (save-restriction
- (widen)
- (pcase (flycheck--exact-region err)
- (`(,beg . ,end)
- (truncate-string-to-width
- (replace-regexp-in-string
- "\\s-+" " " (buffer-substring beg (min end (point-max))))
- (or max-length 20) nil nil t))))))
-
-(defun flycheck-error-format-message-and-id (err &optional include-snippet)
- "Format the message and id of ERR as human-readable string.
-
-If INCLUDE-SNIPPET is non-nil, prepend the message with a snippet
-of the text that the error applies to (such text can only be
-determined if the error contains a full span, not just a
-beginning position)."
- (let* ((id (flycheck-error-id err))
- (fname (flycheck-error-filename err))
- (other-file-p (and fname (not (equal fname (buffer-file-name))))))
- (concat (and other-file-p (format "In %S:\n" (file-relative-name fname)))
- (and include-snippet
- (-when-let* ((snippet (flycheck-error-format-snippet err)))
- (flycheck--format-message "`%s': " snippet)))
- (or (flycheck-error-message err)
- (format "Unknown %S" (flycheck-error-level err)))
- (and id (format " [%s]" id)))))
-
-(defun flycheck-error-format-position (err)
- "Format the position of ERR as a human-readable string."
- (let ((line (flycheck-error-line err))
- (column (flycheck-error-column err))
- (end-line (flycheck-error-end-line err))
- (end-column (flycheck-error-end-column err)))
- (if (and line column)
- (if (or (null end-line) (equal line end-line))
- (if (or (null end-column) (equal column (1- end-column)))
- (format "%d:%d" line column)
- (format "%d:%d-%d" line column end-column))
- (format "(%d:%d)-(%d:%d)" line column end-line end-column))
- (if (or (null end-line) (equal line end-line))
- (format "%d" line)
- (format "%d-%d" line end-line)))))
-
-(defun flycheck-error-format (err &optional with-file-name)
- "Format ERR as human-readable string, optionally WITH-FILE-NAME.
-
-Return a string that represents the given ERR. If WITH-FILE-NAME
-is given and non-nil, include the file-name as well, otherwise
-omit it."
- (let* ((level (symbol-name (flycheck-error-level err)))
- (checker (symbol-name (flycheck-error-checker err)))
- (format `(,@(when with-file-name
- (list (flycheck-error-filename err) ":"))
- ,(flycheck-error-format-position err) ":"
- ,level ": "
- ,(flycheck-error-format-message-and-id err)
- " (" ,checker ")")))
- (apply #'concat format)))
-
-(defun flycheck-error-< (err1 err2)
- "Determine whether ERR1 is less than ERR2 by location."
- (let ((l1 (flycheck-error-line err1))
- (l2 (flycheck-error-line err2)))
- (if (/= l1 l2)
- (< l1 l2)
- (let ((c1 (or (flycheck-error-column err1) 1))
- (c2 (or (flycheck-error-column err2) 1)))
- (if (/= c1 c2)
- (< c1 c2)
- (let ((el1 (or (flycheck-error-end-line err1) l1))
- (el2 (or (flycheck-error-end-line err2) l2)))
- (if (/= el1 el2)
- (< el1 el2)
- (let ((cl1 (or (flycheck-error-end-column err1) 1))
- (cl2 (or (flycheck-error-end-column err2) 1)))
- (< cl1 cl2)))))))))
-
-(defun flycheck-error-level-< (err1 err2)
- "Determine whether ERR1 is less than ERR2 by error level.
-
-Like `flycheck-error-<', but compares by error level severity
-first. Levels of the same severity are compared by name."
- (let* ((level1 (flycheck-error-level err1))
- (level2 (flycheck-error-level err2))
- (severity1 (flycheck-error-level-severity level1))
- (severity2 (flycheck-error-level-severity level2)))
- (cond
- ((= severity1 severity2)
- (if (string= level1 level2)
- (flycheck-error-< err1 err2)
- (string< level1 level2)))
- (t (< severity1 severity2)))))
-
-(defun flycheck-assert-error-list-p (errors)
- "Assert that all items in ERRORS are of `flycheck-error' type.
-
-Signal an error if any item in ERRORS is not a `flycheck-error'
-object, as by `flycheck-error-p'. Otherwise return ERRORS
-again."
- (unless (listp errors)
- (signal 'wrong-type-argument (list 'listp errors)))
- (dolist (err errors)
- (unless (flycheck-error-p err)
- (signal 'wrong-type-argument (list 'flycheck-error-p err))))
- errors)
-
-
-;;; Errors in the current buffer
-(defvar-local flycheck-current-errors nil
- "A list of all errors and warnings in the current buffer.")
-
-(defun flycheck-report-current-errors (errors)
- "Report ERRORS in the current buffer.
-
-Add ERRORS to `flycheck-current-errors' and process each error
-with `flycheck-process-error-functions'."
- (setq flycheck-current-errors (append errors flycheck-current-errors))
- (overlay-recenter (point-max))
- ;; We can't use `seq-sort-by' because it's not in Emacs 25's built-in `seq',
- ;; and installing an updated version doesn't help (this is a package.el bug;
- ;; see https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg01974.html).
- (seq-do (lambda (err)
- (run-hook-with-args-until-success 'flycheck-process-error-functions
- err))
- (seq-sort (lambda (e1 e2)
- (< (flycheck-error-line e1) (flycheck-error-line e2)))
- errors)))
-
-(defun flycheck-clear-errors ()
- "Remove all error information from the current buffer."
- (setq flycheck-current-errors nil)
- (flycheck-report-status 'not-checked))
-
-(defun flycheck-fill-and-expand-error-file-names (errors directory)
- "Fill and expand file names in ERRORS relative to DIRECTORY.
-
-Expand all file names of ERRORS against DIRECTORY. If the file
-name of an error is nil fill in the result of function
-`buffer-file-name' in the current buffer.
-
-Return ERRORS, modified in-place."
- (seq-do (lambda (err)
- (setf (flycheck-error-filename err)
- (-if-let (filename (flycheck-error-filename err))
- (expand-file-name filename directory)
- (buffer-file-name))))
- errors)
- errors)
-
-(defun flycheck-relevant-error-other-file-p (err)
- "Determine whether ERR is a relevant error for another file."
- (let ((file-name (flycheck-error-filename err)))
- (and file-name
- flycheck-relevant-error-other-file-show
- (or (null buffer-file-name)
- (not (flycheck-same-files-p buffer-file-name file-name)))
- (<= (flycheck-error-level-severity
- flycheck-relevant-error-other-file-minimum-level)
- (flycheck-error-level-severity (flycheck-error-level err))))))
-
-(defun flycheck-relevant-error-p (err)
- "Determine whether ERR is relevant for the current buffer.
-
-Return t if ERR may be shown for the current buffer, or nil
-otherwise."
- (flycheck-error-with-buffer err
- (let ((file-name (flycheck-error-filename err))
- (message (flycheck-error-message err)))
- (and
- (or
- ;; Neither the error nor buffer have a file name
- (and (not file-name) (not buffer-file-name))
- ;; Both have files, and they match
- (and buffer-file-name file-name
- (flycheck-same-files-p file-name buffer-file-name))
- ;; This is a significant error from another file
- (flycheck-relevant-error-other-file-p err))
- message
- (not (string-empty-p message))
- ;; Errors without line numbers are discarded. If a linter
- ;; reports relevant errors without line numbers, use
- ;; `flycheck-fill-empty-line-numbers' as the checker's
- ;; `:error-filter' to set them to line 0.
- (flycheck-error-line err)))))
-
-(defun flycheck-relevant-errors (errors)
- "Filter the relevant errors from ERRORS.
-
-Return a list of all errors that are relevant for their
-corresponding buffer."
- (seq-filter #'flycheck-relevant-error-p errors))
-
-(defun flycheck-related-errors (err &optional error-set)
- "Get all the errors that are in the same group as ERR.
-
-Return a list of all errors (from ERROR-SET) that have the same
-`flycheck-error-group' as ERR, including ERR itself.
-
-If ERROR-SET is nil, `flycheck-current-errors' is used instead."
- (let ((group (flycheck-error-group err))
- (checker (flycheck-error-checker err)))
- (if group
- (seq-filter (lambda (e)
- (and (eq (flycheck-error-checker e) checker)
- (eq (flycheck-error-group e) group)))
- (or error-set flycheck-current-errors))
- (list err))))
-
-
-;;; Status reporting for the current buffer
-(defvar-local flycheck-last-status-change 'not-checked
- "The last status change in the current buffer.")
-
-(defun flycheck-report-failed-syntax-check (&optional status)
- "Report a failed Flycheck syntax check with STATUS.
-
-STATUS is a status symbol for `flycheck-report-status',
-defaulting to `errored'.
-
-Clear Flycheck state, run `flycheck-syntax-check-failed-hook' and
-report an error STATUS."
- (flycheck-clear)
- (setq flycheck-current-syntax-check nil)
- (run-hooks 'flycheck-syntax-check-failed-hook)
- (flycheck-report-status (or status 'errored)))
-
-(defun flycheck-report-status (status)
- "Report Flycheck STATUS.
-
-STATUS is one of the following symbols:
-
-`not-checked'
- The current buffer was not checked.
-
-`no-checker'
- Automatic syntax checker selection did not find a suitable
- syntax checker.
-
-`running'
- A syntax check is now running in the current buffer.
-
-`errored'
- The current syntax check has errored.
-
-`finished'
- The current syntax check was finished normally.
-
-`interrupted'
- The current syntax check was interrupted.
-
-`suspicious'
- The last syntax check had a suspicious result.
-
-Set `flycheck-last-status-change' and call
-`flycheck-status-changed-functions' with STATUS. Afterwards
-refresh the mode line."
- (setq flycheck-last-status-change status)
- (run-hook-with-args 'flycheck-status-changed-functions status)
- (force-mode-line-update))
-
-(defun flycheck-mode-line-status-text (&optional status)
- "Get a text describing STATUS for use in the mode line.
-
-STATUS defaults to `flycheck-last-status-change' if omitted or
-nil."
- (let ((text (pcase (or status flycheck-last-status-change)
- (`not-checked "")
- (`no-checker "-")
- (`running "*")
- (`errored "!")
- (`finished
- (let-alist (flycheck-count-errors flycheck-current-errors)
- (if (or .error .warning)
- (format ":%s|%s" (or .error 0) (or .warning 0))
- "")))
- (`interrupted ".")
- (`suspicious "?"))))
- (concat " " flycheck-mode-line-prefix text)))
-
-
-;;; Error levels
-(defun flycheck-make-margin-spec (margin-str face)
- "Make a display spec to indicate errors in the margins.
-
-Returns MARGIN-STR with FACE applied."
- (propertize margin-str 'face `(,face default)))
-
-(defconst flycheck-default-margin-str "»"
- "String used to indicate errors in the margins.")
-
-(defconst flycheck-default-margin-continuation-str "⋮"
- "String used to indicate continuation lines in the margins.")
-
-;;;###autoload
-(defun flycheck-define-error-level (level &rest properties)
- "Define a new error LEVEL with PROPERTIES.
-
-The following PROPERTIES constitute an error level:
-
-`:severity SEVERITY'
- A number denoting the severity of this level. The higher
- the number, the more severe is this level compared to other
- levels. Defaults to 0; info is -10, warning is 10, and
- error is 100.
-
- The severity is used by `flycheck-error-level-<' to
- determine the ordering of errors according to their levels.
-
-`:compilation-level LEVEL'
-
- A number indicating the broad class of messages that errors
- at this level belong to: one of 0 (info), 1 (warning), or
- 2 or nil (error). Defaults to nil.
-
- This is used by `flycheck-checker-pattern-to-error-regexp'
- to map error levels into `compilation-mode''s hierarchy and
- to get proper highlighting of errors in `compilation-mode'.
-
-`:overlay-category CATEGORY'
- A symbol denoting the overlay category to use for error
- highlight overlays for this level. See Info
- node `(elisp)Overlay Properties' for more information about
- overlay categories.
-
- A category for an error level overlay should at least define
- the `face' property, for error highlighting. Another useful
- property for error level categories is `priority', to
- influence the stacking of multiple error level overlays.
-
-`:fringe-bitmap BITMAPS'
- A fringe bitmap symbol denoting the bitmap to use for fringe
- indicators for this level, or a cons of two bitmaps (one for
- narrow fringes and one for wide fringes). See Info node
- `(elisp)Fringe Bitmaps' for more information about fringe
- bitmaps, including a list of built-in fringe bitmaps.
-
-`:fringe-face FACE'
- A face symbol denoting the face to use for fringe indicators
- for this level.
-
-`:margin-spec SPEC'
- A display specification indicating what to display in the
- margin when `flycheck-indication-mode' is `left-margin' or
- `right-margin'. See Info node `(elisp)Displaying in the
- Margins'. If omitted, Flycheck generates an image spec from
- the fringe bitmap.
-
-`:error-list-face FACE'
- A face symbol denoting the face to use for messages of this
- level in the error list. See `flycheck-list-errors'."
- (declare (indent 1))
- (setf (get level 'flycheck-error-level) t)
- (setf (get level 'flycheck-error-severity)
- (or (plist-get properties :severity) 0))
- (setf (get level 'flycheck-compilation-level)
- (plist-get properties :compilation-level))
- (setf (get level 'flycheck-overlay-category)
- (plist-get properties :overlay-category))
- (setf (get level 'flycheck-fringe-bitmaps)
- (let ((bitmap (plist-get properties :fringe-bitmap)))
- (if (consp bitmap) bitmap (cons bitmap bitmap))))
- ;; Kept for compatibility
- (setf (get level 'flycheck-fringe-bitmap-double-arrow)
- (car (get level 'flycheck-fringe-bitmaps)))
- (setf (get level 'flycheck-fringe-face)
- (plist-get properties :fringe-face))
- (setf (get level 'flycheck-margin-spec)
- (or (plist-get properties :margin-spec)
- (flycheck-make-margin-spec
- flycheck-default-margin-str
- (or (get level 'flycheck-fringe-face) 'default))))
- (setf (get level 'flycheck-margin-continuation)
- (flycheck-make-margin-spec
- flycheck-default-margin-continuation-str
- (or (get level 'flycheck-fringe-face) 'default)))
- (setf (get level 'flycheck-error-list-face)
- (plist-get properties :error-list-face)))
-
-(defun flycheck-error-level-p (level)
- "Determine whether LEVEL is a Flycheck error level."
- (get level 'flycheck-error-level))
-
-(defun flycheck-error-level-severity (level)
- "Get the numeric severity of LEVEL."
- (or (get level 'flycheck-error-severity) 0))
-
-(defun flycheck-error-level-compilation-level (level)
- "Get the compilation level for LEVEL."
- (get level 'flycheck-compilation-level))
-
-(defun flycheck-error-level-overlay-category (level)
- "Get the overlay category for LEVEL."
- (get level 'flycheck-overlay-category))
-
-(defun flycheck-error-level-margin-spec (level)
- "Get the margin spec for LEVEL."
- (get level 'flycheck-margin-spec))
-
-(defun flycheck-error-level-margin-continuation-spec (level)
- "Get the margin continuation spec for LEVEL."
- (get level 'flycheck-margin-continuation))
-
-(defun flycheck-error-level-fringe-bitmap (level &optional hi-res)
- "Get the fringe bitmap for LEVEL.
-
-Optional argument HI-RES non-nil means that the returned bitmap
-will be the high resolution version."
- (let ((bitmaps (get level 'flycheck-fringe-bitmaps)))
- (if hi-res (cdr bitmaps) (car bitmaps))))
-
-(defun flycheck-error-level-fringe-face (level)
- "Get the fringe face for LEVEL."
- (get level 'flycheck-fringe-face))
-
-(defun flycheck-error-level-error-list-face (level)
- "Get the error list face for LEVEL."
- (get level 'flycheck-error-list-face))
-
-(defun flycheck-error-level-make-indicator (level side &optional continuation)
- "Create the fringe or margin icon for LEVEL at SIDE.
-
-Return a propertized string that shows an indicator according
-to LEVEL and the given fringe or margin SIDE.
-
-LEVEL is a Flycheck error level defined with
-`flycheck-define-error-level', and SIDE is either `left-fringe',
-`right-fringe', `left-margin', or `right-margin'.
-
-CONTINUATION indicates which fringe bitmap or margin spec to use:
-either the `:fringe-bitmap' and `:margin-spec' properties of
-LEVEL when CONTINUATION is nil or omitted, or bitmaps and specs
-indicating an error spanning more than one line.
-
-Return a propertized string representing the fringe icon,
-intended for use as `before-string' of an overlay to actually
-show the indicator."
- (propertize
- "!" 'display
- (pcase side
- ((or `left-fringe `right-fringe)
- (list side
- (if continuation 'flycheck-fringe-bitmap-continuation
- (let* ((fringe-width
- (pcase side
- (`left-fringe (car (window-fringes)))
- (`right-fringe (cadr (window-fringes)))))
- (high-res (>= fringe-width 16)))
- (flycheck-error-level-fringe-bitmap level high-res)))
- (flycheck-error-level-fringe-face level)))
- ((or `left-margin `right-margin)
- `((margin ,side)
- ,(or (if continuation
- (flycheck-error-level-margin-continuation-spec level)
- (flycheck-error-level-margin-spec level))
- "")))
- (_ (error "Invalid fringe side: %S" side)))))
-
-(define-obsolete-function-alias
- 'flycheck-error-level-make-fringe-icon
- 'flycheck-error-level-make-indicator
- "33")
-
-
-;;; Built-in error levels
-(defconst flycheck-fringe-bitmap-double-arrow
- [#b11011000
- #b01101100
- #b00110110
- #b00011011
- #b00110110
- #b01101100
- #b11011000]
- "Bitmaps used to indicate errors in the fringes.")
-
-(defconst flycheck-fringe-bitmap-double-arrow-hi-res
- [#b1111001111000000
- #b0111100111100000
- #b0011110011110000
- #b0001111001111000
- #b0000111100111100
- #b0000011110011110
- #b0000011110011110
- #b0000111100111100
- #b0001111001111000
- #b0011110011110000
- #b0111100111100000
- #b1111001111000000]
- "High-resolution bitmap used to indicate errors in the fringes.")
-
-(defconst flycheck-fringe-bitmap-continuation
- [#b1000000010000000
- #b0010000000100000
- #b0000100000001000
- #b0000001000000010]
- "Bitmap used to indicate continuation lines in the fringes.")
-
-(when (fboundp 'define-fringe-bitmap) ;; #ifdef HAVE_WINDOW_SYSTEM
- (define-fringe-bitmap
- 'flycheck-fringe-bitmap-double-arrow
- flycheck-fringe-bitmap-double-arrow)
- (define-fringe-bitmap
- 'flycheck-fringe-bitmap-double-arrow-hi-res
- flycheck-fringe-bitmap-double-arrow-hi-res
- nil 16)
- (define-fringe-bitmap
- 'flycheck-fringe-bitmap-continuation
- flycheck-fringe-bitmap-continuation
- nil 16 '(top repeat)))
-
-(defun flycheck-redefine-standard-error-levels
- (&optional margin-str fringe-bitmap)
- "Redefine Flycheck's standard error levels.
-
-This is useful to change the character drawn in the
-margins (MARGIN-STR, a string) or the bitmap drawn in the
-fringes (FRINGE-BITMAP, a fringe bitmap symbol or a cons of such
-symbols, as in `flycheck-define-error-level')."
- (unless margin-str
- (setq margin-str flycheck-default-margin-str))
-
- (unless fringe-bitmap
- (setq fringe-bitmap
- (cons 'flycheck-fringe-bitmap-double-arrow
- 'flycheck-fringe-bitmap-double-arrow-hi-res)))
-
- (setf (get 'flycheck-error-overlay 'face) 'flycheck-error)
- (setf (get 'flycheck-error-overlay 'priority) 110)
-
- (flycheck-define-error-level 'error
- :severity 100
- :compilation-level 2
- :overlay-category 'flycheck-error-overlay
- :margin-spec (flycheck-make-margin-spec margin-str 'flycheck-fringe-error)
- :fringe-bitmap fringe-bitmap
- :fringe-face 'flycheck-fringe-error
- :error-list-face 'flycheck-error-list-error)
-
- (setf (get 'flycheck-warning-overlay 'face) 'flycheck-warning)
- (setf (get 'flycheck-warning-overlay 'priority) 100)
-
- (flycheck-define-error-level 'warning
- :severity 10
- :compilation-level 1
- :overlay-category 'flycheck-warning-overlay
- :margin-spec (flycheck-make-margin-spec margin-str 'flycheck-fringe-warning)
- :fringe-bitmap fringe-bitmap
- :fringe-face 'flycheck-fringe-warning
- :error-list-face 'flycheck-error-list-warning)
-
- (setf (get 'flycheck-info-overlay 'face) 'flycheck-info)
- (setf (get 'flycheck-info-overlay 'priority) 90)
-
- (flycheck-define-error-level 'info
- :severity -10
- :compilation-level 0
- :overlay-category 'flycheck-info-overlay
- :margin-spec (flycheck-make-margin-spec margin-str 'flycheck-fringe-info)
- :fringe-bitmap fringe-bitmap
- :fringe-face 'flycheck-fringe-info
- :error-list-face 'flycheck-error-list-info))
-
-(flycheck-redefine-standard-error-levels)
-
-
-;;; Error filtering
-(defun flycheck-filter-errors (errors checker)
- "Filter ERRORS from CHECKER.
-
-Apply the error filter of CHECKER to ERRORs and return the
-result. If CHECKER has no error filter, fall back to
-`flycheck-sanitize-errors'."
- (let ((filter (or (flycheck-checker-get checker 'error-filter)
- #'flycheck-sanitize-errors)))
- (funcall filter errors)))
-
-(defun flycheck-sanitize-errors (errors)
- "Sanitize ERRORS.
-
-Sanitize ERRORS by trimming leading and trailing whitespace in
-all error messages, and by replacing 0 columns and empty error
-messages with nil.
-
-Returns sanitized ERRORS."
- (dolist (err errors)
- (flycheck-error-with-buffer err
- (let ((message (flycheck-error-message err))
- (id (flycheck-error-id err)))
- (when message
- (setq message (string-trim message))
- (setf (flycheck-error-message err)
- (if (string-empty-p message) nil message)))
- (when (and id (string-empty-p id))
- (setf (flycheck-error-id err) nil))
- (when (eq (flycheck-error-column err) 0)
- (setf (flycheck-error-column err) nil))
- (when (eq (flycheck-error-end-column err) 0)
- (setf (flycheck-error-end-column err) nil)))))
- errors)
-
-(defun flycheck-remove-error-file-names (file-name errors)
- "Remove matching FILE-NAME from ERRORS.
-
-Use as `:error-filter' for syntax checkers that output faulty
-filenames. Flycheck will later fill in the buffer file name.
-
-Return ERRORS."
- (seq-do (lambda (err)
- (when (and (flycheck-error-filename err)
- (string= (flycheck-error-filename err) file-name))
- (setf (flycheck-error-filename err) nil)))
- errors)
- errors)
-
-(defun flycheck-increment-error-columns (errors &optional offset)
- "Increment all columns of ERRORS by OFFSET (default: 1).
-
- Use this as `:error-filter' if a syntax checker outputs 0-based
- columns."
- (setq offset (or offset 1)) ;; Emacs bug #31715
- (seq-do (lambda (err)
- (when (flycheck-error-column err)
- (cl-incf (flycheck-error-column err) offset))
- (when (flycheck-error-end-column err)
- (cl-incf (flycheck-error-end-column err) offset)))
- errors)
- errors)
-
-(defun flycheck-collapse-error-message-whitespace (errors)
- "Collapse whitespace in all messages of ERRORS.
-
-Return ERRORS."
- (dolist (err errors)
- (-when-let (message (flycheck-error-message err))
- (setf (flycheck-error-message err)
- (replace-regexp-in-string (rx (one-or-more (any space "\n" "\r")))
- " " message 'fixed-case 'literal))))
- errors)
-
-(defun flycheck-dedent-error-messages (errors)
- "Dedent all messages of ERRORS.
-
-For each error in ERRORS, determine the indentation offset from
-the leading whitespace of the first line, and dedent all further
-lines accordingly.
-
-Return ERRORS, with in-place modifications."
- (dolist (err errors)
- (-when-let (message (flycheck-error-message err))
- (with-temp-buffer
- (insert message)
- ;; Determine the indentation offset
- (goto-char (point-min))
- (back-to-indentation)
- (let* ((indent-offset (- (point) (point-min))))
- ;; Now iterate over all lines and dedent each according to
- ;; `indent-offset'
- (while (not (eobp))
- (back-to-indentation)
- ;; If the current line starts with sufficient whitespace, delete the
- ;; indentation offset. Otherwise keep the line intact, as we might
- ;; loose valuable information
- (when (>= (- (point) (line-beginning-position)) indent-offset)
- (delete-char (- indent-offset)))
- (forward-line 1)))
- (delete-trailing-whitespace (point-min) (point-max))
- (setf (flycheck-error-message err)
- (buffer-substring-no-properties (point-min) (point-max))))))
- errors)
-
-(defun flycheck-fold-include-levels (errors sentinel-message)
- "Fold levels of ERRORS from included files.
-
-ERRORS is a list of `flycheck-error' objects. SENTINEL-MESSAGE
-is a regular expression matched against the error message to
-determine whether the error denotes errors from an included
-file. Alternatively, it is a function that is given an error and
-shall return non-nil, if the error denotes errors from an
-included file."
- (unless (or (stringp sentinel-message) (functionp sentinel-message))
- (error "Sentinel must be string or function: %S" sentinel-message))
- (let ((sentinel (if (functionp sentinel-message)
- sentinel-message
- (lambda (err)
- (string-match-p sentinel-message
- (flycheck-error-message err)))))
- (remaining-errors errors))
- (while remaining-errors
- (let* ((current-error (pop remaining-errors)))
- (when (funcall sentinel current-error)
- ;; We found an error denoting errors in the included file:
- ;; 1. process all subsequent errors until faulty include file is found
- ;; 2. process again all subsequent errors until an error has the
- ;; current file name again
- ;; 3. find the most severe error level
- (let ((current-filename (flycheck-error-filename current-error))
- (current-level nil)
- (faulty-include-filename nil)
- (filename nil)
- (done (null remaining-errors)))
-
- (while (not done)
- (setq filename (flycheck-error-filename (car remaining-errors)))
- (unless faulty-include-filename
- (unless (string= filename current-filename)
- (setq faulty-include-filename filename)))
-
- (let* ((error-in-include (pop remaining-errors))
- (in-include-level (flycheck-error-level error-in-include)))
- (unless (funcall sentinel error-in-include)
- ;; Ignore nested "included file" errors, we are only
- ;; interested in real errors because these define our level
- (when (or (not current-level)
- (> (flycheck-error-level-severity in-include-level)
- (flycheck-error-level-severity current-level)))
- (setq current-level in-include-level))))
-
- (setq done (or (null remaining-errors)
- (and faulty-include-filename
- (string= filename current-filename)))))
-
- (setf (flycheck-error-level current-error) current-level
- (flycheck-error-message current-error)
- (format "In include %s" faulty-include-filename))))))
- errors))
-
-(defun flycheck-dequalify-error-ids (errors)
- "De-qualify error ids in ERRORS.
-
-Remove all qualifications from error ids in ERRORS, by stripping
-all leading dotted components from error IDs. For instance, if
-the error ID is com.foo.E100, replace it with E100.
-
-This error filter is mainly useful to simplify error IDs obtained
-from parsing Checkstyle XML, which frequently has very verbose
-IDs, that include the name of the tool."
- (seq-do (lambda (err)
- (let ((id (flycheck-error-id err)))
- (when id
- (setf (flycheck-error-id err)
- (replace-regexp-in-string
- (rx string-start
- (group
- (optional (zero-or-more not-newline) "."))
- (one-or-more (not (any ".")))
- string-end)
- "" id 'fixedcase 'literal 1)))))
- errors)
- errors)
-
-(defun flycheck-remove-error-ids (errors)
- "Remove all error ids from ERRORS."
- (seq-do (lambda (err) (setf (flycheck-error-id err) nil)) errors)
- errors)
-
-(defun flycheck-fill-empty-line-numbers (errors)
- "Set ERRORS without lines to line 0.
-
-Use as `:error-filter' for syntax checkers that output errors
-without line numbers.
-
-Return ERRORS."
- (seq-do (lambda (err)
- (unless (flycheck-error-line err)
- (setf (flycheck-error-line err) 0)))
- errors)
- errors)
-
-
-;;; Error analysis
-(defun flycheck-count-errors (errors)
- "Count the number of ERRORS, grouped by level.
-
-Return an alist, where each ITEM is a cons cell whose `car' is an
-error level, and whose `cdr' is the number of errors of that
-level."
- (let (counts-by-level)
- (dolist (err errors)
- (let* ((level (flycheck-error-level err))
- (item (assq level counts-by-level)))
- (if item
- (cl-incf (cdr item))
- (push (cons level 1) counts-by-level))))
- counts-by-level))
-
-(defun flycheck-has-max-errors-p (errors level)
- "Check if there is no error in ERRORS more severe than LEVEL."
- (let ((severity (flycheck-error-level-severity level)))
- (seq-every-p (lambda (e) (<= (flycheck-error-level-severity
- (flycheck-error-level e))
- severity))
- errors)))
-
-(defun flycheck-has-max-current-errors-p (level)
- "Check if there is no current error more severe than LEVEL."
- (flycheck-has-max-errors-p flycheck-current-errors level))
-
-(defun flycheck-has-errors-p (errors level)
- "Determine if there are any ERRORS with LEVEL."
- (seq-some (lambda (e) (eq (flycheck-error-level e) level)) errors))
-
-(defun flycheck-has-current-errors-p (&optional level)
- "Determine if the current buffer has errors with LEVEL.
-
-If LEVEL is omitted if the current buffer has any errors at all."
- (if level
- (flycheck-has-errors-p flycheck-current-errors level)
- (and flycheck-current-errors t)))
-
-
-;;; Error overlays in the current buffer
-(defvar-local flycheck--last-overlay-index 0
- "Last index given to a Flycheck overlay.
-
-These indices are used to preserve error order (Emacs doesn't
-preserve overlay order when calling `overlays-at').")
-
-(defun flycheck--next-overlay-index ()
- "Compute the index to assign to a new Flycheck overlay."
- (cl-incf flycheck--last-overlay-index))
-
-(defun flycheck--highlighting-style (err)
- "Determine the highlighting style to apply to ERR.
-
-Styles are documented in `flycheck-highlighting-style'; this
-functions resolves `conditional' style specifications."
- (let* ((style flycheck-highlighting-style)
- (first-line (flycheck-error-line err))
- (end-line (or (flycheck-error-end-line err) first-line))
- (nlines (- end-line first-line)))
- (while (eq (car-safe style) 'conditional)
- (pcase-let ((`(,threshold ,s1 ,s2) (cdr style)))
- (setq style (if (< nlines threshold) s1 s2))))
- (pcase style
- (`(delimiters ,before ,after)
- (when (characterp before)
- (setq before (flycheck--make-highlighting-delimiter before)))
- (when (characterp after)
- (setq after (flycheck--make-highlighting-delimiter after)))
- (setq style `(delimiters ,before ,after))))
- style))
-
-(defun flycheck--setup-highlighting (err overlay)
- "Apply properties to OVERLAY to highlight ERR."
- (let ((level (flycheck-error-level err)))
- (unless flycheck-highlighting-mode
- ;; Erase the highlighting from the overlay if requested by the user
- (setf (overlay-get overlay 'face) nil))
- (when flycheck-indication-mode
- (setf (overlay-get overlay 'before-string)
- (flycheck-error-level-make-indicator
- level flycheck-indication-mode))
- (setf (overlay-get overlay 'line-prefix)
- (flycheck-error-level-make-indicator
- level flycheck-indication-mode t)))
- (pcase (flycheck--highlighting-style err)
- ((or `nil (guard (null flycheck-highlighting-mode)))
- ;; Erase the highlighting
- (setf (overlay-get overlay 'face) nil))
- (`level-face)
- (`(delimiters ,before ,after)
- ;; Replace the highlighting with delimiters
- (let* ((fringe-face (flycheck-error-level-fringe-face level))
- (delim-face `(flycheck-error-delimiter ,fringe-face)))
- (setf (overlay-get overlay 'face) 'flycheck-delimited-error)
- (setf (overlay-get overlay 'before-string)
- (concat (propertize before 'face delim-face)
- (or (overlay-get overlay 'before-string) "")))
- (setf (overlay-get overlay 'after-string)
- (propertize after 'face delim-face))))
- (other (error "Unsupported highlighting style: %S" other)))))
-
-(defun flycheck-add-overlay (err)
- "Add overlay for ERR.
-
-Return the created overlay."
- ;; We must have a proper error region for the sake of fringe indication,
- ;; error display and error navigation, even if the highlighting is disabled.
- ;; We erase the highlighting later on in this case
- (pcase-let* ((`(,beg . ,end)
- (if (flycheck-relevant-error-other-file-p err)
- ;; Display overlays for other-file errors on the first line
- (cons (point-min)
- (save-excursion (goto-char (point-min))
- (point-at-eol)))
- (flycheck-error-region-for-mode
- err (or flycheck-highlighting-mode 'lines))))
- (overlay (make-overlay beg end))
- (level (flycheck-error-level err))
- (category (flycheck-error-level-overlay-category level))
- (index (flycheck--next-overlay-index)))
- (unless (flycheck-error-level-p level)
- (error "Undefined error level: %S" level))
- (setf (overlay-get overlay 'flycheck-error-index) index)
- (setf (overlay-get overlay 'flycheck-overlay) t)
- (setf (overlay-get overlay 'flycheck-error) err)
- (setf (overlay-get overlay 'category) category)
- (setf (overlay-get overlay 'help-echo) #'flycheck-help-echo)
- (flycheck--setup-highlighting err overlay)
- overlay))
-
-(defun flycheck-help-echo (_window object pos)
- "Construct a tooltip message.
-
-Most of the actual work is done by calling
-`flycheck-help-echo-function' with the appropriate list of
-errors. Arguments WINDOW, OBJECT and POS are as described in
-info node `(elisp)Special properties', as this function is
-intended to be used as the 'help-echo property of flycheck error
-overlays."
- (-when-let (buf (cond ((bufferp object) object)
- ((overlayp object) (overlay-buffer object))))
- (with-current-buffer buf
- (-when-let* ((fn flycheck-help-echo-function)
- (errs (flycheck-overlay-errors-at pos)))
- (propertize (funcall fn errs) 'help-echo-inhibit-substitution t)))))
-
-(defun flycheck-help-echo-all-error-messages (errs)
- "Concatenate error messages and ids from ERRS."
- (pcase (delq nil errs) ;; FIXME why would errors be nil here?
- (`(,err) ;; A single error
- (flycheck-error-format-message-and-id err))
- (_ ;; Zero or multiple errors
- (mapconcat
- (lambda (err)
- (flycheck-error-format-message-and-id err 'include-snippet))
- errs "\n"))))
-
-(defun flycheck-filter-overlays (overlays)
- "Get all Flycheck overlays from OVERLAYS, in original order."
- ;; The order of errors returned from overlays is not stable, so we sort
- ;; them again using the internal index to guarantee errors are always
- ;; displayed in the same order.
- (seq-sort
- ;; We can't use `seq-sort-by' here; see above
- (lambda (o1 o2) (< (overlay-get o1 'flycheck-error-index)
- (overlay-get o2 'flycheck-error-index)))
- (seq-filter (lambda (o) (overlay-get o 'flycheck-overlay)) overlays)))
-
-(defun flycheck-overlays-at (pos)
- "Get all Flycheck overlays at POS."
- (flycheck-filter-overlays (overlays-at pos)))
-
-(defun flycheck-overlays-in (beg end)
- "Get all Flycheck overlays between BEG and END."
- (flycheck-filter-overlays (overlays-in beg end)))
-
-(defun flycheck-overlay-errors-at (pos)
- "Return a list of all flycheck errors overlaid at POS."
- (seq-map (lambda (o) (overlay-get o 'flycheck-error))
- (flycheck-overlays-at pos)))
-
-(defun flycheck-overlay-errors-in (beg end)
- "Return a list of all flycheck errors overlaid between BEG and END."
- (seq-map (lambda (o) (overlay-get o 'flycheck-error))
- (flycheck-overlays-in beg end)))
-
-(defvar-local flycheck-overlays-to-delete nil
- "Overlays mark for deletion after all syntax checks completed.")
-(put 'flycheck-overlays-to-delete 'permanent-local t)
-
-(defun flycheck-delete-all-overlays ()
- "Remove all flycheck overlays in the current buffer."
- (overlay-recenter (point-max))
- (flycheck-delete-marked-overlays)
- (setq flycheck--last-overlay-index 0)
- (save-restriction
- (widen)
- (seq-do #'delete-overlay (flycheck-overlays-in (point-min) (point-max)))))
-
-(defun flycheck-mark-all-overlays-for-deletion ()
- "Mark all current overlays for deletion."
- (setq flycheck-overlays-to-delete
- (append (flycheck-overlays-in (point-min) (point-max))
- flycheck-overlays-to-delete)))
-
-(defun flycheck-delete-marked-overlays ()
- "Delete all overlays marked for deletion."
- (overlay-recenter (point-max))
- (seq-do #'delete-overlay flycheck-overlays-to-delete)
- (setq flycheck-overlays-to-delete nil))
-
-
-;;; Error navigation in the current buffer
-(defun flycheck-error-level-interesting-at-pos-p (pos)
- "Check if error severity at POS passes `flycheck-error-level-interesting-p'."
- (flycheck-error-level-interesting-p (get-char-property pos 'flycheck-error)))
-
-(defun flycheck-error-level-interesting-p (err)
- "Check if ERR severity is >= `flycheck-navigation-minimum-level'.
-
-ERR is also interesting (the function returns true) if there are
-no errors as or more severe than `flycheck-navigation-minimum-level'."
- (when (flycheck-error-p err)
- (-if-let (min-level flycheck-navigation-minimum-level)
- (or (<= (flycheck-error-level-severity min-level)
- (flycheck-error-level-severity (flycheck-error-level err)))
- (not (flycheck-has-current-errors-p min-level)))
- t)))
-
-(defun flycheck-next-error-pos (n &optional reset)
- "Get the position of the N-th next error.
-
-With negative N, get the position of the (-N)-th previous error
-instead. With non-nil RESET, search from `point-min', otherwise
-search from the current point.
-
-Return the position of the next or previous error, or nil if
-there is none. If N is zero, return `point', or `point-min' if
-RESET is non-nil."
- (let ((n (or n 1))
- (pos (if reset (point-min) (point))))
- (if (>= n 0)
- ;; Search forwards
- (while (and pos (> n 0))
- (setq n (1- n))
- (when (get-char-property pos 'flycheck-error)
- ;; Move beyond from the current error if any
- (setq pos (next-single-char-property-change pos 'flycheck-error)))
- (while (not (or (= pos (point-max))
- (flycheck-error-level-interesting-at-pos-p pos)))
- ;; Scan for the next error
- (setq pos (next-single-char-property-change pos 'flycheck-error)))
- (when (and (= pos (point-max))
- (not (flycheck-error-level-interesting-at-pos-p pos)))
- ;; If we reached the end of the buffer, but no error, we didn't find
- ;; any
- (setq pos nil)))
- ;; Search backwards
- (while (and pos (< n 0))
- (setq n (1+ n))
- ;; Loop until we find an error. We need to check the position *before*
- ;; the current one, because `previous-single-char-property-change'
- ;; always moves to the position *of* the change.
- (while (not (or (= pos (point-min))
- (flycheck-error-level-interesting-at-pos-p (1- pos))))
- (setq pos (previous-single-char-property-change pos 'flycheck-error)))
- (when (and (= pos (point-min))
- (not (flycheck-error-level-interesting-at-pos-p pos)))
- ;; We didn't find any error.
- (setq pos nil))
- (when pos
- ;; We found an error, so move to its beginning
- (setq pos (previous-single-char-property-change pos
- 'flycheck-error)))))
- pos))
-
-(defun flycheck-next-error-function (n reset)
- "Visit the N-th error from the current point.
-
-N is the number of errors to advance by, where a negative N
-advances backwards. With non-nil RESET, advance from the
-beginning of the buffer, otherwise advance from the current
-position.
-
-Intended for use with `next-error-function'."
- (-if-let* ((pos (flycheck-next-error-pos n reset))
- (err (get-char-property pos 'flycheck-error)))
- (flycheck-jump-to-error err)
- (user-error "No more Flycheck errors")))
-
-(defun flycheck-next-error (&optional n reset)
- "Visit the N-th error from the current point.
-
-N is the number of errors to advance by, where a negative N
-advances backwards. With non-nil RESET, advance from the
-beginning of the buffer, otherwise advance from the current
-position."
- (interactive "P")
- (when (consp n)
- ;; Universal prefix argument means reset
- (setq reset t n nil))
- (flycheck-next-error-function n reset)
- (flycheck-display-error-at-point))
-
-(defun flycheck-previous-error (&optional n)
- "Visit the N-th previous error.
-
-If given, N specifies the number of errors to move backwards by.
-If N is negative, move forwards instead."
- (interactive "P")
- (flycheck-next-error (- (or n 1))))
-
-(defun flycheck-first-error (&optional n)
- "Visit the N-th error from beginning of the buffer.
-
-If given, N specifies the number of errors to move forward from
-the beginning of the buffer."
- (interactive "P")
- (flycheck-next-error n 'reset))
-
-
-;;; Listing errors in buffers
-(defconst flycheck-error-list-buffer "*Flycheck errors*"
- "The name of the buffer to show error lists.")
-
-(defmacro flycheck-error-list-with-buffer (&rest body)
- "Evaluate BODY in flycheck-error-list-buffer, if it exists."
- (declare (indent 0) (debug t))
- `(when (get-buffer flycheck-error-list-buffer)
- (with-current-buffer flycheck-error-list-buffer
- ,@body)))
-
-(defvar flycheck-error-list-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "f") #'flycheck-error-list-set-filter)
- (define-key map (kbd "F") #'flycheck-error-list-reset-filter)
- (define-key map (kbd "n") #'flycheck-error-list-next-error)
- (define-key map (kbd "p") #'flycheck-error-list-previous-error)
- (define-key map (kbd "g") #'flycheck-error-list-check-source)
- (define-key map (kbd "e") #'flycheck-error-list-explain-error)
- (define-key map (kbd "RET") #'flycheck-error-list-goto-error)
- map)
- "The keymap of `flycheck-error-list-mode'.")
-
-(defun flycheck-error-list-make-last-column (message checker)
- "Compute contents of the last error list cell.
-
-MESSAGE and CHECKER are displayed in a single column to allow the
-message to stretch arbitrarily far."
- (let ((checker-name (propertize (symbol-name checker)
- 'face 'flycheck-error-list-checker-name))
- (message (propertize message
- 'face 'flycheck-error-list-error-message)))
- (format "%s (%s)" message checker-name)))
-
-(defconst flycheck-error-list-format
- `[("File" 6)
- ("Line" 5 flycheck-error-list-entry-< :right-align t)
- ("Col" 3 nil :right-align t)
- ("Level" 8 flycheck-error-list-entry-level-<)
- ("ID" 6 t)
- (,(flycheck-error-list-make-last-column "Message" 'Checker) 0 t)]
- "Table format for the error list.")
-
-(defconst flycheck-error-list-padding 1
- "Padding used in error list.")
-
-(defconst flycheck--error-list-msg-offset
- (seq-reduce
- (lambda (offset fmt)
- (pcase-let* ((`(,_ ,width ,_ . ,props) fmt)
- (padding (or (plist-get props :pad-right) 1)))
- (+ offset width padding)))
- (seq-subseq flycheck-error-list-format 0 -1)
- flycheck-error-list-padding)
- "Amount of space to use in `flycheck-flush-multiline-message'.")
-
-(define-derived-mode flycheck-error-list-mode tabulated-list-mode
- "Flycheck errors"
- "Major mode for listing Flycheck errors.
-
-\\{flycheck-error-list-mode-map}"
- (setq tabulated-list-format flycheck-error-list-format
- ;; Sort by location initially
- tabulated-list-sort-key (cons "Line" nil)
- tabulated-list-padding flycheck-error-list-padding
- tabulated-list-entries #'flycheck-error-list-entries
- ;; `revert-buffer' updates the mode line for us, so all we need to do is
- ;; set the corresponding mode line construct.
- mode-line-buffer-identification flycheck-error-list-mode-line)
- ;; Guard `truncate-string-ellipsis' for Emacs 24.
- ;; TODO: Remove when dropping Emacs 24 compatibility
- (when (boundp 'truncate-string-ellipsis)
- ;; See https://github.com/flycheck/flycheck/issues/1101
- (setq-local truncate-string-ellipsis "…"))
- (tabulated-list-init-header))
-
-(defvar-local flycheck-error-list-source-buffer nil
- "The current source buffer of the error list.")
-;; Needs to permanently local to preserve the source buffer across buffer
-;; reversions
-(put 'flycheck-error-list-source-buffer 'permanent-local t)
-
-(defun flycheck-error-list-set-source (buffer)
- "Set BUFFER as the source buffer of the error list."
- (flycheck-error-list-with-buffer
- (setq flycheck-error-list-source-buffer buffer)
- (flycheck-error-list-refresh)))
-
-(defun flycheck-error-list-update-source ()
- "Make the error list display errors from the current buffer.
-
-The update is skipped if the current buffer is the error list or
-if the error list is already pointing to the current buffer."
- (unless (memq (current-buffer)
- (list (get-buffer flycheck-error-list-buffer)
- (flycheck-error-list-with-buffer
- flycheck-error-list-source-buffer)))
- (flycheck-error-list-set-source (current-buffer))))
-
-(defun flycheck-error-list-check-source ()
- "Trigger a syntax check in the source buffer of the error list."
- (interactive)
- (let ((buffer (get-buffer flycheck-error-list-source-buffer)))
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (flycheck-buffer)))))
-
-(define-button-type 'flycheck-error-list
- 'action #'flycheck-error-list-goto-error
- 'help-echo "mouse-1, RET: goto error"
- 'face nil)
-
-(define-button-type 'flycheck-error-list-explain-error
- 'action #'flycheck-error-list-explain-error
- 'help-echo "mouse-1, RET: explain error")
-
-(defsubst flycheck-error-list-make-cell (text &optional face help-echo type)
- "Make an error list cell with TEXT and FACE.
-
-If FACE is nil don't set a FACE on TEXT. If TEXT already has
-face properties, do not specify a FACE. Note though, that if
-TEXT gets truncated it will not inherit any previous face
-properties. If you expect TEXT to be truncated in the error
-list, do specify a FACE explicitly!
-
-If HELP-ECHO is non-nil, set a help-echo property on TEXT, with
-value HELP-ECHO. This is convenient if you expect TEXT to be
-truncated.
-
-The cell will have the type TYPE unless TYPE is nil, and the
-default type `flycheck-error-list' will be used instead."
- (append (list text 'type (if type type
- 'flycheck-error-list))
- (and face (list 'face face))
- (and help-echo (list 'help-echo help-echo))))
-
-(defsubst flycheck-error-list-make-number-cell (number face)
- "Make a table cell for a NUMBER with FACE.
-
-Convert NUMBER to string, fontify it with FACE and return the
-string with attached text properties."
- (flycheck-error-list-make-cell
- (if (numberp number) (number-to-string number) "")
- face))
-
-(defun flycheck-error-list-make-entry (error)
- "Make a table cell for the given ERROR.
-
-Return a list with the contents of the table cell."
- (let* ((level (flycheck-error-level error))
- (level-face (flycheck-error-level-error-list-face level))
- (filename (flycheck-error-filename error))
- (line (flycheck-error-line error))
- (column (flycheck-error-column error))
- (message (or (flycheck-error-message error)
- (format "Unknown %S" level)))
- (flushed-msg (flycheck-flush-multiline-message message))
- (id (flycheck-error-id error))
- (id-str (if id (format "%s" id) ""))
- (checker (flycheck-error-checker error))
- (msg-and-checker
- (flycheck-error-list-make-last-column flushed-msg checker))
- (explainer (flycheck-checker-get checker 'error-explainer)))
- (list error
- (vector (flycheck-error-list-make-cell
- (if filename
- (file-name-nondirectory filename)
- "")
- 'flycheck-error-list-filename)
- (flycheck-error-list-make-number-cell
- line 'flycheck-error-list-line-number)
- (flycheck-error-list-make-number-cell
- column 'flycheck-error-list-column-number)
- (flycheck-error-list-make-cell
- (symbol-name (flycheck-error-level error)) level-face)
- ;; Error ID use a different face when an error-explainer is
- ;; present
- (flycheck-error-list-make-cell
- id-str (if explainer 'flycheck-error-list-id-with-explainer
- 'flycheck-error-list-id)
- id-str 'flycheck-error-list-explain-error)
- (flycheck-error-list-make-cell
- msg-and-checker nil msg-and-checker)))))
-
-(defun flycheck-flush-multiline-message (msg)
- "Prepare error message MSG for display in the error list.
-
-Prepend all lines of MSG except the first with enough space to
-ensure that they line up properly once the message is displayed."
- (let* ((spc-spec `(space . (:width ,flycheck--error-list-msg-offset)))
- (spc (propertize " " 'display spc-spec))
- (rep (concat "\\1" spc "\\2")))
- (replace-regexp-in-string "\\([\r\n]+\\)\\(.\\)" rep msg)))
-
-(defun flycheck-error-list-current-errors ()
- "Read the list of errors in `flycheck-error-list-source-buffer'."
- (when (buffer-live-p flycheck-error-list-source-buffer)
- (buffer-local-value 'flycheck-current-errors
- flycheck-error-list-source-buffer)))
-
-(defun flycheck-error-list-entries ()
- "Create the entries for the error list."
- (-when-let* ((errors (flycheck-error-list-current-errors))
- (filtered (flycheck-error-list-apply-filter errors)))
- (seq-map #'flycheck-error-list-make-entry filtered)))
-
-(defun flycheck-error-list-entry-< (entry1 entry2)
- "Determine whether ENTRY1 is before ENTRY2 by location.
-
-See `flycheck-error-<'."
- (flycheck-error-< (car entry1) (car entry2)))
-
-(defun flycheck-error-list-entry-level-< (entry1 entry2)
- "Determine whether ENTRY1 is before ENTRY2 by level.
-
-See `flycheck-error-level-<'."
- (not (flycheck-error-level-< (car entry1) (car entry2))))
-
-(defvar flycheck-error-list-mode-line-map
- (let ((map (make-sparse-keymap)))
- (define-key map [mode-line mouse-1]
- #'flycheck-error-list-mouse-switch-to-source)
- map)
- "Keymap for error list mode line.")
-
-(defun flycheck-error-list-propertized-source-name ()
- "Get the name of the current source buffer for the mode line.
-
-Propertize the name of the current source buffer for use in the
-mode line indication of `flycheck-error-list-mode'."
- (let ((name (replace-regexp-in-string
- (rx "%") "%%"
- (buffer-name flycheck-error-list-source-buffer)
- 'fixed-case 'literal)))
- (propertize name 'face 'mode-line-buffer-id
- 'mouse-face 'mode-line-highlight
- 'help-echo "mouse-1: switch to source"
- 'local-map flycheck-error-list-mode-line-map)))
-
-(defun flycheck-error-list-mouse-switch-to-source (event)
- "Switch to the error list source buffer of the EVENT window."
- (interactive "e")
- (save-selected-window
- (when (eventp event)
- (select-window (posn-window (event-start event))))
- (when (buffer-live-p flycheck-error-list-source-buffer)
- (switch-to-buffer flycheck-error-list-source-buffer))))
-
-(defun flycheck-get-error-list-window-list (&optional all-frames)
- "Get all windows displaying the error list.
-
-ALL-FRAMES specifies the frames to consider, as in
-`get-buffer-window-list'."
- (-when-let (buf (get-buffer flycheck-error-list-buffer))
- (get-buffer-window-list buf nil all-frames)))
-
-(defun flycheck-get-error-list-window (&optional all-frames)
- "Get a window displaying the error list, or nil if none.
-
-ALL-FRAMES specifies the frames to consider, as in
-`get-buffer-window'."
- (-when-let (buf (get-buffer flycheck-error-list-buffer))
- (get-buffer-window buf all-frames)))
-
-(defun flycheck-error-list-recenter-at (pos)
- "Recenter the error list at POS."
- (dolist (window (flycheck-get-error-list-window-list t))
- (with-selected-window window
- (goto-char pos)
- (let ((recenter-redisplay nil))
- (recenter)))))
-
-(defun flycheck-error-list-refresh ()
- "Refresh the current error list.
-
-Add all errors currently reported for the current
-`flycheck-error-list-source-buffer', and recenter the error
-list."
- ;; We only refresh the error list, when it is visible in a window, and we
- ;; select this window while reverting, because Tabulated List mode attempts to
- ;; recenter the error at the old location, so it must have the proper window
- ;; selected.
- (-when-let (window (flycheck-get-error-list-window t))
- (with-selected-window window
- (revert-buffer))
- (run-hooks 'flycheck-error-list-after-refresh-hook)
- (let ((preserve-pos (eq (current-buffer)
- (get-buffer flycheck-error-list-buffer))))
- ;; If the error list is the current buffer, don't recenter when
- ;; highlighting
- (flycheck-error-list-highlight-errors preserve-pos))))
-
-(defun flycheck-error-list-mode-line-filter-indicator ()
- "Create a string representing the current error list filter."
- (if flycheck-error-list-minimum-level
- (format " [>= %s]" flycheck-error-list-minimum-level)
- ""))
-
-(defun flycheck-error-list-set-filter (level)
- "Restrict the error list to errors at level LEVEL or higher.
-
-LEVEL is either an error level symbol, or nil, to remove the filter."
- (interactive
- (list (flycheck-read-error-level
- "Minimum error level (errors at lower levels will be hidden): ")))
- (when (and level (not (flycheck-error-level-p level)))
- (user-error "Invalid level: %s" level))
- (flycheck-error-list-with-buffer
- (setq-local flycheck-error-list-minimum-level level)
- (force-mode-line-update)
- (flycheck-error-list-refresh)
- (flycheck-error-list-recenter-at (point-min))))
-
-(defun flycheck-error-list-reset-filter (&optional refresh)
- "Remove local error filters and reset to the default filter.
-
-Interactively, or with non-nil REFRESH, refresh the error list."
- (interactive '(t))
- (flycheck-error-list-with-buffer
- (kill-local-variable 'flycheck-error-list-minimum-level)
- (when refresh
- (flycheck-error-list-refresh)
- (flycheck-error-list-recenter-at (point-min))
- (force-mode-line-update))))
-
-(defun flycheck-error-list-apply-filter (errors)
- "Filter ERRORS according to `flycheck-error-list-minimum-level'."
- (-if-let* ((min-level flycheck-error-list-minimum-level)
- (min-severity (flycheck-error-level-severity min-level)))
- (seq-filter (lambda (err) (>= (flycheck-error-level-severity
- (flycheck-error-level err))
- min-severity))
- errors)
- errors))
-
-(defun flycheck-error-list-goto-error (&optional pos)
- "Go to the location of the error at POS in the error list.
-
-POS defaults to `point'."
- (interactive)
- (-when-let* ((error (tabulated-list-get-id pos)))
- (flycheck-jump-to-error error)))
-
-(defun flycheck-jump-to-error (error)
- "Go to the location of ERROR."
- (let* ((error-copy (copy-flycheck-error error))
- (filename (flycheck-error-filename error))
- (other-file-error (flycheck-relevant-error-other-file-p error))
- (buffer (if filename
- (find-file-noselect filename)
- (flycheck-error-buffer error))))
- (when (buffer-live-p buffer)
- (setf (flycheck-error-buffer error-copy) buffer)
- (flycheck-jump-in-buffer buffer error-copy)
- ;; When jumping to an error in another file, it may not have
- ;; this error available for highlighting yet, so we trigger a check
- ;; if necessary.
- (when other-file-error
- (with-current-buffer buffer
- ;; `seq-contains-p' is only in seq >= 2.21
- (unless (with-no-warnings
- (seq-contains flycheck-current-errors error-copy 'equal))
- (when flycheck-mode
- (flycheck-buffer))))))))
-
-(defun flycheck-jump-in-buffer (buffer error)
- "In BUFFER, jump to ERROR."
- ;; FIXME: we assume BUFFER and the buffer of ERROR are the same. We don't
- ;; need the first argument then.
- (if (eq (window-buffer) (get-buffer flycheck-error-list-buffer))
- ;; When called from within the error list, keep the error list,
- ;; otherwise replace the current buffer.
- (pop-to-buffer buffer 'other-window)
- (switch-to-buffer buffer))
- (let ((pos (flycheck-error-pos error)))
- (unless (eq (goto-char pos) (point))
- ;; If widening gets in the way of moving to the right place, remove it
- ;; and try again
- (widen)
- (goto-char pos)))
- ;; Re-highlight the errors. We have post-command-hook for that, but calls to
- ;; `flycheck-jump-in-buffer' that come from other buffers (e.g. from the error
- ;; list) won't trigger it.
- (flycheck-error-list-highlight-errors 'preserve-pos))
-
-(defun flycheck-error-list-explain-error (&optional pos)
- "Explain the error at POS in the error list.
-
-POS defaults to `point'."
- (interactive)
- (-when-let* ((error (tabulated-list-get-id pos))
- (explainer (flycheck-checker-get (flycheck-error-checker error)
- 'error-explainer)))
- (flycheck-error-with-buffer error
- (-when-let (explanation (funcall explainer error))
- (flycheck-display-error-explanation explanation)))))
-
-(defun flycheck-error-list-next-error-pos (pos &optional n)
- "Starting from POS get the N'th next error in the error list.
-
-N defaults to 1. If N is negative, search for the previous error
-instead.
-
-Get the beginning position of the N'th next error from POS, or
-nil, if there is no next error."
- (let ((n (or n 1)))
- (if (>= n 0)
- ;; Search forward
- (while (and pos (/= n 0))
- (setq n (1- n))
- (setq pos (next-single-property-change pos 'tabulated-list-id)))
- ;; Search backwards
- (while (/= n 0)
- (setq n (1+ n))
- ;; We explicitly give the limit here to explicitly have the minimum
- ;; point returned, to be able to move to the first error (which starts
- ;; at `point-min')
- (setq pos (previous-single-property-change pos 'tabulated-list-id
- nil (point-min)))))
- pos))
-
-(defun flycheck-error-list-previous-error (n)
- "Go to the N'th previous error in the error list."
- (interactive "P")
- (flycheck-error-list-next-error (- (or n 1))))
-
-(defun flycheck-error-list-next-error (n)
- "Go to the N'th next error in the error list."
- (interactive "P")
- (let ((pos (flycheck-error-list-next-error-pos (point) n)))
- (when (and pos (/= pos (point)))
- (goto-char pos)
- (save-selected-window
- ;; Keep the error list selected, so that the user can navigate errors by
- ;; repeatedly pressing n/p, without having to re-select the error list
- ;; window.
- (flycheck-error-list-goto-error)))))
-
-(defvar-local flycheck-error-list-highlight-overlays nil
- "Error highlight overlays in the error list buffer.")
-(put 'flycheck-error-list-highlight-overlays 'permanent-local t)
-
-(defun flycheck-error-list-highlight-errors (&optional preserve-pos)
- "Highlight errors in the error list.
-
-Highlight all errors in the error list that are at point in the
-source buffer, and on the same line as point. Then recenter the
-error list to the highlighted error, unless PRESERVE-POS is
-non-nil."
- (when (get-buffer flycheck-error-list-buffer)
- (with-current-buffer flycheck-error-list-buffer
- (let ((current-errors
- (when (buffer-live-p flycheck-error-list-source-buffer)
- (with-current-buffer flycheck-error-list-source-buffer
- (flycheck-overlay-errors-in (line-beginning-position)
- (line-end-position))))))
- (let ((old-overlays flycheck-error-list-highlight-overlays)
- (min-point (point-max))
- (max-point (point-min)))
- ;; Display the new overlays first, to avoid re-display flickering
- (setq flycheck-error-list-highlight-overlays nil)
- (when current-errors
- (let ((next-error-pos (point-min)))
- (while next-error-pos
- (let* ((beg next-error-pos)
- (end (flycheck-error-list-next-error-pos beg))
- (err (tabulated-list-get-id beg)))
- (when (member err current-errors)
- (setq min-point (min min-point beg)
- max-point (max max-point beg))
- (let ((ov (make-overlay beg
- ;; Extend overlay to the beginning
- ;; of the next line, to highlight
- ;; the whole line
- (or end (point-max)))))
- (push ov flycheck-error-list-highlight-overlays)
- (setf (overlay-get ov 'flycheck-error-highlight-overlay)
- t)
- (setf (overlay-get ov 'face)
- 'flycheck-error-list-highlight)))
- (setq next-error-pos end)))))
- ;; Delete the old overlays
- (seq-do #'delete-overlay old-overlays)
- (when (and (not preserve-pos) current-errors)
- ;; Move point to the middle error
- (goto-char (+ min-point (/ (- max-point min-point) 2)))
- (beginning-of-line)
- ;; And recenter the error list at this position
- (flycheck-error-list-recenter-at (point))))))))
-
-(defun flycheck-list-errors ()
- "Show the error list for the current buffer."
- (interactive)
- (unless flycheck-mode
- (user-error "Flycheck mode not enabled"))
- ;; Create and initialize the error list
- (unless (get-buffer flycheck-error-list-buffer)
- (with-current-buffer (get-buffer-create flycheck-error-list-buffer)
- (flycheck-error-list-mode)))
- ;; Reset the error filter
- (flycheck-error-list-reset-filter)
- (let ((source (current-buffer)))
- ;; Show the error list in a side window. Under some configurations of
- ;; `display-buffer', this may select `flycheck-error-list-buffer' (see URL
- ;; `https://github.com/flycheck/flycheck/issues/1776').
- (display-buffer flycheck-error-list-buffer)
- ;; Adjust the source, causing a refresh
- (flycheck-error-list-set-source source)))
-
-(defalias 'list-flycheck-errors 'flycheck-list-errors)
-
-
-;;; Displaying errors in the current buffer
-(defun flycheck-display-errors (errors)
- "Display ERRORS using `flycheck-display-errors-function'."
- (when flycheck-display-errors-function
- (funcall flycheck-display-errors-function errors)))
-
-(defvar-local flycheck-display-error-at-point-timer nil
- "Timer to automatically show errors.")
-
-(defun flycheck-cancel-error-display-error-at-point-timer ()
- "Cancel the error display timer for the current buffer."
- (when flycheck-display-error-at-point-timer
- (cancel-timer flycheck-display-error-at-point-timer)
- (setq flycheck-display-error-at-point-timer nil)))
-
-(defun flycheck--error-display-tick ()
- "Return point and tick counter of current buffer."
- (cons (point) (buffer-modified-tick)))
-
-(defvar-local flycheck--last-error-display-tick nil
- "Value of `flycheck--error-display-tick' when errors were last displayed.")
-
-(defun flycheck-display-error-at-point ()
- "Display all the error messages at point."
- (interactive)
- ;; This function runs from a timer, so we must take care to not ignore any
- ;; errors
- (with-demoted-errors "Flycheck error display error: %s"
- (flycheck-cancel-error-display-error-at-point-timer)
- (setq flycheck--last-error-display-tick (flycheck--error-display-tick))
- (when flycheck-mode
- (-when-let (errors (flycheck-overlay-errors-at (point)))
- (flycheck-display-errors errors)))))
-
-(defun flycheck-display-error-at-point-soon ()
- "Display error messages at point, with a delay."
- (setq flycheck--last-error-display-tick nil)
- (flycheck-maybe-display-error-at-point-soon))
-
-(defun flycheck-maybe-display-error-at-point-soon ()
- "Display error message at point with a delay, unless already displayed."
- (flycheck-cancel-error-display-error-at-point-timer)
- (when (and (not (equal flycheck--last-error-display-tick
- (setq flycheck--last-error-display-tick
- (flycheck--error-display-tick))))
- (flycheck-overlays-at (point)))
- (setq flycheck-display-error-at-point-timer
- (run-at-time flycheck-display-errors-delay nil
- 'flycheck-display-error-at-point))))
-
-
-;;; Functions to display errors
-(defconst flycheck-error-message-buffer "*Flycheck error messages*"
- "The name of the buffer to show long error messages in.")
-
-(defun flycheck-error-message-buffer ()
- "Get the buffer object to show long error messages in.
-
-Get the buffer named by variable `flycheck-error-message-buffer',
-or nil if the buffer does not exist."
- (get-buffer flycheck-error-message-buffer))
-
-(defun flycheck-may-use-echo-area-p ()
- "Determine whether the echo area may be used.
-
-The echo area may be used if the cursor is not in the echo area,
-and if the echo area is not occupied by minibuffer input."
- (not (or cursor-in-echo-area (active-minibuffer-window))))
-
-(define-derived-mode flycheck-error-message-mode text-mode
- "Flycheck error messages"
- "Major mode for extended error messages.")
-
-(defun flycheck-display-error-messages (errors)
- "Display the messages of ERRORS.
-
-Concatenate all non-nil messages of ERRORS as with
-`flycheck-help-echo-all-error-messages', and display them with
-`display-message-or-buffer', which shows the messages either in
-the echo area or in a separate buffer, depending on the number of
-lines. See Info node `(elisp)Displaying Messages' for more
-information.
-
-In the latter case, show messages in the buffer denoted by
-variable `flycheck-error-message-buffer'."
- (when (and errors (flycheck-may-use-echo-area-p))
- (let ((message (flycheck-help-echo-all-error-messages errors)))
- (display-message-or-buffer
- message flycheck-error-message-buffer 'not-this-window)
- ;; We cannot rely on `display-message-or-buffer' returning the right
- ;; window. See URL `https://github.com/flycheck/flycheck/issues/1643'.
- (-when-let (buf (get-buffer flycheck-error-message-buffer))
- (with-current-buffer buf
- (unless (derived-mode-p 'flycheck-error-message-mode)
- (flycheck-error-message-mode)))))))
-
-(defun flycheck-display-error-messages-unless-error-list (errors)
- "Show messages of ERRORS unless the error list is visible.
-
-Like `flycheck-display-error-messages', but only if the error
-list (see `flycheck-list-errors') is not visible in any window in
-the current frame."
- (unless (flycheck-get-error-list-window 'current-frame)
- (flycheck-display-error-messages errors)))
-
-(defun flycheck-hide-error-buffer ()
- "Hide the Flycheck error buffer if necessary.
-
-Hide the error buffer if there is no error under point."
- (-when-let* ((buffer (flycheck-error-message-buffer))
- (window (get-buffer-window buffer)))
- (unless (flycheck-overlays-at (point))
- ;; save-selected-window prevents `quit-window' from changing the current
- ;; buffer (see https://github.com/flycheck/flycheck/issues/648).
- (save-selected-window
- (quit-window nil window)))))
-
-
-;;; Working with errors
-(defun flycheck-copy-errors-as-kill (pos &optional formatter)
- "Copy each error at POS into kill ring, using FORMATTER.
-
-FORMATTER is a function to turn an error into a string,
-defaulting to `flycheck-error-message'.
-
-Interactively, use `flycheck-error-format-message-and-id' as
-FORMATTER with universal prefix arg, and `flycheck-error-id' with
-normal prefix arg, i.e. copy the message and the ID with
-universal prefix arg, and only the id with normal prefix arg."
- (interactive (list (point)
- (pcase current-prefix-arg
- ((pred not) #'flycheck-error-message)
- ((pred consp) #'flycheck-error-format-message-and-id)
- (_ #'flycheck-error-id))))
- (let ((messages (delq nil (seq-map (or formatter #'flycheck-error-message)
- (flycheck-overlay-errors-at pos)))))
- (when messages
- (seq-do #'kill-new (reverse messages))
- (message (string-join messages "\n")))))
-
-(defun flycheck-explain-error-at-point ()
- "Display an explanation for the first explainable error at point.
-
-The first explainable error at point is the first error at point
-with a non-nil `:error-explainer' function defined in its
-checker. The `:error-explainer' function is then called with
-this error to produce the explanation to display."
- (interactive)
- (-when-let* ((first-error
- ;; Get the first error at point that has an `error-explainer'.
- (seq-find (lambda (error)
- (flycheck-checker-get
- (flycheck-error-checker error) 'error-explainer))
- (flycheck-overlay-errors-at (point))))
- (explainer
- (flycheck-checker-get (flycheck-error-checker first-error)
- 'error-explainer))
- (explanation (funcall explainer first-error)))
- (flycheck-display-error-explanation explanation)))
-
-(defconst flycheck-explain-error-buffer "*Flycheck error explanation*"
- "The name of the buffer to show error explanations.")
-
-(define-derived-mode flycheck-explain-error-mode help-mode
- "Error explanation"
- "Major mode for displaying error explanations."
- (setq buffer-read-only t))
-
-(defun flycheck-display-error-explanation (explanation)
- "Display the EXPLANATION for an error."
- (pcase explanation
- (`nil)
- (`(url . ,url) (browse-url url))
- (_ (let ((inhibit-read-only t)
- (standard-output (temp-buffer-window-setup
- flycheck-explain-error-buffer)))
- (with-current-buffer standard-output
- (flycheck-explain-error-mode))
- (cond
- ((functionp explanation) (funcall explanation))
- ((stringp explanation) (insert explanation))
- (t (error "Unsupported error explanation: %S" explanation)))
- (display-message-or-buffer standard-output nil 'not-this-window)))))
-
-
-;;; Syntax checkers using external commands
-(defun flycheck-command-argument-p (arg)
- "Check whether ARG is a valid command argument."
- (pcase arg
- ((pred stringp) t)
- ((or `source `source-inplace `source-original) t)
- (`(,(or `source `source-inplace) ,suffix)
- (stringp suffix))
- ((or `temporary-directory `temporary-file-name) t)
- (`null-device t)
- (`(config-file ,option-name ,config-file-var)
- (and (stringp option-name)
- (symbolp config-file-var)))
- (`(config-file ,option-name ,config-file-var ,prepender)
- (and (stringp option-name)
- (symbolp config-file-var)
- (symbolp prepender)))
- (`(,(or `option `option-list) ,option-name ,option-var)
- (and (stringp option-name)
- (symbolp option-var)))
- (`(,(or `option `option-list) ,option-name ,option-var ,prepender)
- (and (stringp option-name)
- (symbolp option-var)
- (symbolp prepender)))
- (`(,(or `option `option-list) ,option-name ,option-var ,prepender ,filter)
- (and (stringp option-name)
- (symbolp option-var)
- (symbolp prepender)
- (symbolp filter)))
- (`(option-flag ,option-name ,option-var)
- (and (stringp option-name)
- (symbolp option-var)))
- (`(eval ,_) t)
- (_ nil)))
-
-(defun flycheck-compute-working-directory (checker)
- "Get the default working directory for CHECKER.
-
-Compute the value of `default-directory' for the invocation of
-the syntax checker command, by calling the function in the
-`working-directory' property of CHECKER, with CHECKER as sole
-argument, and returning its value. Signal an error if the
-function returns a non-existing working directory.
-
-If the property is undefined or if the function returns nil
-return the `default-directory' of the current buffer."
- (let* ((def-directory-fn (flycheck-checker-get checker 'working-directory))
- (directory (or (and def-directory-fn
- (funcall def-directory-fn checker))
- ;; Default to the `default-directory' of the current
- ;; buffer
- default-directory)))
- (unless (file-exists-p directory)
- (error ":working-directory %s of syntax checker %S does not exist"
- directory checker))
- directory))
-
-;;;###autoload
-(defun flycheck-define-command-checker (symbol docstring &rest properties)
- "Define SYMBOL as syntax checker to run a command.
-
-Define SYMBOL as generic syntax checker via
-`flycheck-define-generic-checker', which uses an external command
-to check the buffer. SYMBOL and DOCSTRING are the same as for
-`flycheck-define-generic-checker'.
-
-In addition to the properties understood by
-`flycheck-define-generic-checker', the following PROPERTIES
-constitute a command syntax checker. Unless otherwise noted, all
-properties are mandatory. Note that the default `:error-filter'
-of command checkers is `flycheck-sanitize-errors'.
-
-`:command COMMAND'
- The command to run for syntax checking.
-
- COMMAND is a list of the form `(EXECUTABLE [ARG ...])'.
-
- EXECUTABLE is a string with the executable of this syntax
- checker. It can be overridden with the variable
- `flycheck-SYMBOL-executable'. Note that this variable is
- NOT implicitly defined by this function. Use
- `flycheck-def-executable-var' to define this variable.
-
- Each ARG is an argument to the executable, either as string,
- or as special symbol or form for
- `flycheck-substitute-argument', which see.
-
-`:error-patterns PATTERNS'
- A list of patterns to parse the output of the `:command'.
-
- Each ITEM in PATTERNS is a list `(LEVEL SEXP ...)', where
- LEVEL is a Flycheck error level (see
- `flycheck-define-error-level'), followed by one or more RX
- `SEXP's which parse an error of that level and extract line,
- column, file name and the message.
-
- See `rx' for general information about RX, and
- `flycheck-rx-to-string' for some special RX forms provided
- by Flycheck.
-
- All patterns are applied in the order of declaration to the
- whole output of the syntax checker. Output already matched
- by a pattern will not be matched by subsequent patterns. In
- other words, the first pattern wins.
-
- This property is optional. If omitted, however, an
- `:error-parser' is mandatory.
-
-`:error-parser FUNCTION'
- A function to parse errors with.
-
- The function shall accept three arguments OUTPUT CHECKER
- BUFFER. OUTPUT is the syntax checker output as string,
- CHECKER the syntax checker that was used, and BUFFER a
- buffer object representing the checked buffer. The function
- must return a list of `flycheck-error' objects parsed from
- OUTPUT.
-
- This property is optional. If omitted, it defaults to
- `flycheck-parse-with-patterns'. In this case,
- `:error-patterns' is mandatory.
-
-`:standard-input t'
- Whether to send the buffer contents on standard input.
-
- If this property is given and has a non-nil value, send the
- contents of the buffer on standard input.
-
- Defaults to nil.
-
-Note that you may not give `:start', `:interrupt', and
-`:print-doc' for a command checker. You can give a custom
-`:verify' function, though, whose results will be appended to the
-default `:verify' function of command checkers."
- (declare (indent 1)
- (doc-string 2))
- (dolist (prop '(:start :interrupt :print-doc))
- (when (plist-get properties prop)
- (error "%s not allowed in definition of command syntax checker %s"
- prop symbol)))
-
- (unless (plist-get properties :error-filter)
- ;; Default to `flycheck-sanitize-errors' as error filter
- (setq properties (plist-put properties :error-filter
- #'flycheck-sanitize-errors)))
- (let ((verify-fn (plist-get properties :verify)))
- (setq properties
- (plist-put properties :verify
- (lambda (checker)
- (append (flycheck-verify-command-checker checker)
- (and verify-fn
- (funcall verify-fn checker)))))))
-
- (let ((command (plist-get properties :command))
- (patterns (plist-get properties :error-patterns))
- (parser (or (plist-get properties :error-parser)
- #'flycheck-parse-with-patterns))
- (enabled (plist-get properties :enabled))
- (standard-input (plist-get properties :standard-input)))
- (unless command
- (error "Missing :command in syntax checker %s" symbol))
- (unless (stringp (car command))
- (error "Command executable for syntax checker %s must be a string: %S"
- symbol (car command)))
- (dolist (arg (cdr command))
- (unless (flycheck-command-argument-p arg)
- (error "Invalid command argument %S in syntax checker %s" arg symbol)))
- (when (and (eq parser 'flycheck-parse-with-patterns)
- (not patterns))
- (error "Missing :error-patterns in syntax checker %s" symbol))
-
- (setq properties
- ;; Automatically disable command checkers if the executable does not
- ;; exist.
- (plist-put properties :enabled
- (lambda ()
- (and (flycheck-find-checker-executable symbol)
- (flycheck-temp-files-writable-p symbol)
- (or (not enabled) (funcall enabled))))))
-
- (apply #'flycheck-define-generic-checker symbol docstring
- :start #'flycheck-start-command-checker
- :interrupt #'flycheck-interrupt-command-checker
- :print-doc #'flycheck-command-checker-print-doc
- properties)
-
- ;; Pre-compile all errors patterns into strings, so that we don't need to do
- ;; that on each error parse
- (let ((patterns (seq-map (lambda (p)
- (cons (flycheck-rx-to-string `(and ,@(cdr p))
- 'no-group)
- (car p)))
- patterns)))
- (pcase-dolist (`(,prop . ,value)
- `((command . ,command)
- (error-parser . ,parser)
- (error-patterns . ,patterns)
- (standard-input . ,standard-input)))
- (setf (flycheck-checker-get symbol prop) value)))))
-
-(eval-and-compile
- ;; Make this function available during byte-compilation, since we need it
- ;; at macro expansion of `flycheck-def-executable-var'.
- (defun flycheck-checker-executable-variable (checker)
- "Get the executable variable of CHECKER.
-
-The executable variable is named `flycheck-CHECKER-executable'."
- (intern (format "flycheck-%s-executable" checker))))
-
-(defun flycheck-checker-default-executable (checker)
- "Get the default executable of CHECKER."
- (car (flycheck-checker-get checker 'command)))
-
-(defun flycheck-checker-executable (checker)
- "Get the command executable of CHECKER.
-
-The executable is either the value of the variable
-`flycheck-CHECKER-executable', or the default executable given in
-the syntax checker definition, if the variable is nil."
- (let ((var (flycheck-checker-executable-variable checker)))
- (or (and (boundp var) (symbol-value var))
- (flycheck-checker-default-executable checker))))
-
-(defun flycheck-find-checker-executable (checker)
- "Get the full path of the executable of CHECKER.
-
-Return the full absolute path to the executable of CHECKER, or
-nil if the executable does not exist."
- (funcall flycheck-executable-find (flycheck-checker-executable checker)))
-
-(defun flycheck-call-checker-process
- (checker infile destination error &rest args)
- "Call CHECKER's executable with ARGS.
-
-Return nil (or raise an error if ERROR is non-nil) when CHECKER's
-executable cannot be found, and return a numeric exit status or a
-signal description string otherwise. CHECKER's input is taken
-from INFILE, and its output is sent to DESTINATION, as in
-`call-process'."
- (-if-let (executable (flycheck-find-checker-executable checker))
- (condition-case err
- (apply #'call-process executable infile destination nil args)
- (error (when error (signal (car err) (cdr err)))))
- (when error
- (user-error "Cannot find `%s' using `flycheck-executable-find'"
- (flycheck-checker-executable checker)))))
-
-(defun flycheck-call-checker-process-for-output
- (checker infile error &rest args)
- "Call CHECKER's executable with ARGS and return its output.
-
-Call `flycheck-call-checker-process' with INFILE, ERROR, and
-ARGS. If it returns 0, return the process' output. Otherwise,
-return nil or throw an error.
-
-This function is similar to `flycheck-call-checker-process'
-called in a `with-output-to-string' block, but it takes care of
-the error checking automatically."
- (let ((temp (generate-new-buffer " *temp*")))
- (unwind-protect
- ;; We need to call the checker process in the right buffer, so that it
- ;; uses the right exec-path, checker executable, etc. See URL
- ;; `https://github.com/flycheck/flycheck/issues/1770'.
- (let ((exit-code (apply #'flycheck-call-checker-process
- checker infile temp error args))
- (output (with-current-buffer temp (buffer-string))))
- (if (eql 0 exit-code) output
- (when error
- (error "Process %s failed with %S (%s)"
- checker exit-code output))))
- (kill-buffer temp))))
-
-(defun flycheck-checker-arguments (checker)
- "Get the command arguments of CHECKER."
- (cdr (flycheck-checker-get checker 'command)))
-
-(defun flycheck-substitute-argument (arg checker)
- "Substitute ARG for CHECKER.
-
-Return a list of real arguments for the executable of CHECKER,
-substituted for the symbolic argument ARG. Single arguments,
-e.g. if ARG is a literal strings, are wrapped in a list.
-
-ARG may be one of the following forms:
-
-STRING
- Return ARG unchanged.
-
-`source', `source-inplace'
- Create a temporary file to check and return its path. With
- `source-inplace' create the temporary file in the same
- directory as the original file. The value of
- `flycheck-temp-prefix' is used as prefix of the file name.
-
- With `source', try to retain the non-directory component of
- the buffer's file name in the temporary file.
-
- `source' is the preferred way to pass the input file to a
- syntax checker. `source-inplace' should only be used if the
- syntax checker needs other files from the source directory,
- such as include files in C.
-
-`(source SUFFIX)', `(source-inplace SUFFIX)'
- Like `source' and `source-inplace', but ensure generated
- file names end with the given suffix. Use this when the
- checker requires that file names on its command line have a
- certain suffix (file extension).
-
-`source-original'
- Return the path of the actual file to check, or an empty
- string if the buffer has no file name.
-
- Note that the contents of the file may not be up to date
- with the contents of the buffer to check. Do not use this
- as primary input to a checker, unless absolutely necessary.
-
- When using this symbol as primary input to the syntax
- checker, add `flycheck-buffer-saved-p' to the `:predicate'.
-
-`temporary-directory'
- Create a unique temporary directory and return its path.
-
-`temporary-file-name'
- Return a unique temporary filename. The file is *not*
- created.
-
- To ignore the output of syntax checkers, try `null-device'
- first.
-
-`null-device'
- Return the value of `null-device', i.e the system null
- device.
-
- Use this option to ignore the output of a syntax checker.
- If the syntax checker cannot handle the null device, or
- won't write to an existing file, try `temporary-file-name'
- instead.
-
-`(config-file OPTION VARIABLE [PREPEND-FN])'
- Search the configuration file bound to VARIABLE with
- `flycheck-locate-config-file' and return a list of arguments
- that pass this configuration file to the syntax checker, or
- nil if the configuration file was not found.
-
- PREPEND-FN is called with the OPTION and the located
- configuration file, and should return OPTION prepended
- before the file, either a string or as list. If omitted,
- PREPEND-FN defaults to `list'.
-
-`(option OPTION VARIABLE [PREPEND-FN [FILTER]])'
- Retrieve the value of VARIABLE and return a list of
- arguments that pass this value as value for OPTION to the
- syntax checker.
-
- PREPEND-FN is called with the OPTION and the value of
- VARIABLE, and should return OPTION prepended before the
- file, either a string or as list. If omitted, PREPEND-FN
- defaults to `list'.
-
- FILTER is an optional function to be applied to the value of
- VARIABLE before prepending. This function must return nil
- or a string. In the former case, return nil. In the latter
- case, return a list of arguments as described above.
-
-`(option-list OPTION VARIABLE [PREPEND-FN [FILTER]])'
- Retrieve the value of VARIABLE, which must be a list,
- and prepend OPTION before each item in this list, using
- PREPEND-FN.
-
- PREPEND-FN is called with the OPTION and each item of the
- list as second argument, and should return OPTION prepended
- before the item, either as string or as list. If omitted,
- PREPEND-FN defaults to `list'.
-
- FILTER is an optional function to be applied to each item in
- the list before prepending OPTION. It shall return the
- option value for each item as string, or nil, if the item is
- to be ignored.
-
-`(option-flag OPTION VARIABLE)'
- Retrieve the value of VARIABLE and return OPTION, if the
- value is non-nil. Otherwise return nil.
-
-`(eval FORM)'
- Return the result of evaluating FORM in the buffer to be
- checked. FORM must either return a string or a list of
- strings, or nil to indicate that nothing should be
- substituted for CELL. For all other return types, signal an
- error
-
- _No_ further substitutions are performed, neither in FORM
- before it is evaluated, nor in the result of evaluating
- FORM.
-
-In all other cases, signal an error.
-
-Note that substitution is *not* recursive. No symbols or cells
-are substituted within the body of cells!"
- (pcase arg
- ((pred stringp) (list arg))
- (`source
- (list (flycheck-save-buffer-to-temp #'flycheck-temp-file-system)))
- (`source-inplace
- (list (flycheck-save-buffer-to-temp #'flycheck-temp-file-inplace)))
- (`(source ,suffix)
- (list (flycheck-save-buffer-to-temp
- (lambda (filename) (flycheck-temp-file-system filename suffix)))))
- (`(source-inplace ,suffix)
- (list (flycheck-save-buffer-to-temp
- (lambda (filename) (flycheck-temp-file-inplace filename suffix)))))
- (`source-original (list (or (buffer-file-name) "")))
- (`temporary-directory (list (flycheck-temp-dir-system)))
- (`temporary-file-name
- (let ((directory (flycheck-temp-dir-system)))
- (list (make-temp-name (expand-file-name "flycheck" directory)))))
- (`null-device (list null-device))
- (`(config-file ,option-name ,file-name-var)
- (-when-let* ((value (symbol-value file-name-var))
- (file-name (flycheck-locate-config-file value checker)))
- (flycheck-prepend-with-option option-name (list file-name))))
- (`(config-file ,option-name ,file-name-var ,prepend-fn)
- (-when-let* ((value (symbol-value file-name-var))
- (file-name (flycheck-locate-config-file value checker)))
- (flycheck-prepend-with-option option-name (list file-name) prepend-fn)))
- (`(option ,option-name ,variable)
- (-when-let (value (symbol-value variable))
- (unless (stringp value)
- (error "Value %S of %S for option %s is not a string"
- value variable option-name))
- (flycheck-prepend-with-option option-name (list value))))
- (`(option ,option-name ,variable ,prepend-fn)
- (-when-let (value (symbol-value variable))
- (unless (stringp value)
- (error "Value %S of %S for option %s is not a string"
- value variable option-name))
- (flycheck-prepend-with-option option-name (list value) prepend-fn)))
- (`(option ,option-name ,variable ,prepend-fn ,filter)
- (-when-let (value (funcall filter (symbol-value variable)))
- (unless (stringp value)
- (error "Value %S of %S (filter: %S) for option %s is not a string"
- value variable filter option-name))
- (flycheck-prepend-with-option option-name (list value) prepend-fn)))
- (`(option-list ,option-name ,variable)
- (let ((value (symbol-value variable)))
- (unless (and (listp value) (seq-every-p #'stringp value))
- (error "Value %S of %S for option %S is not a list of strings"
- value variable option-name))
- (flycheck-prepend-with-option option-name value)))
- (`(option-list ,option-name ,variable ,prepend-fn)
- (let ((value (symbol-value variable)))
- (unless (and (listp value) (seq-every-p #'stringp value))
- (error "Value %S of %S for option %S is not a list of strings"
- value variable option-name))
- (flycheck-prepend-with-option option-name value prepend-fn)))
- (`(option-list ,option-name ,variable ,prepend-fn ,filter)
- (let ((value (delq nil (seq-map filter (symbol-value variable)))))
- (unless (and (listp value) (seq-every-p #'stringp value))
- (error "Value %S of %S for option %S is not a list of strings"
- value variable option-name))
- (flycheck-prepend-with-option option-name value prepend-fn)))
- (`(option-flag ,option-name ,variable)
- (when (symbol-value variable)
- (list option-name)))
- (`(eval ,form)
- (let ((result (eval form)))
- (cond
- ((and (listp result) (seq-every-p #'stringp result)) result)
- ((stringp result) (list result))
- (t (error "Invalid result from evaluation of %S: %S" form result)))))
- (_ (error "Unsupported argument %S" arg))))
-
-(defun flycheck-checker-substituted-arguments (checker)
- "Get the substituted arguments of a CHECKER.
-
-Substitute each argument of CHECKER using
-`flycheck-substitute-argument'. This replaces any special
-symbols in the command."
- (apply #'append
- (seq-map (lambda (arg) (flycheck-substitute-argument arg checker))
- (flycheck-checker-arguments checker))))
-
-(defun flycheck--process-send-buffer-contents-chunked (process)
- "Send contents of current buffer to PROCESS in small batches.
-
-Send the entire buffer to the standard input of PROCESS in chunks
-of 4096 characters. Chunking is done in Emacs Lisp, hence this
-function is probably far less efficient than
-`send-process-region'. Use only when required."
- (let ((from (point-min)))
- (while (< from (point-max))
- (let ((to (min (+ from 4096) (point-max))))
- (process-send-region process from to)
- (setq from to)))))
-
-(defvar flycheck-chunked-process-input
- ;; Chunk process output on Windows to work around
- ;; https://github.com/flycheck/flycheck/issues/794 and
- ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22344. The presence of
- ;; `w32-pipe-buffer-size' denotes an Emacs version (> Emacs 25.1) where pipe
- ;; writes on Windows are fixed.
- ;;
- ;; TODO: Remove option and chunking when dropping Emacs 24 support, see
- ;; https://github.com/flycheck/flycheck/issues/856
- (and (eq system-type 'windows-nt) (not (boundp 'w32-pipe-buffer-size)))
- "If non-nil send process input in small chunks.
-
-If this variable is non-nil `flycheck-process-send-buffer' sends
-buffer contents in small chunks.
-
-Defaults to nil, except on Windows to work around Emacs bug
-#22344.")
-
-(defun flycheck-process-send-buffer (process)
- "Send all contents of current buffer to PROCESS.
-
-Sends all contents of the current buffer to the standard input of
-PROCESS, and terminates standard input with EOF.
-
-If `flycheck-chunked-process-input' is non-nil, send buffer
-contents in chunks via
-`flycheck--process-send-buffer-contents-chunked', which see.
-Otherwise use `process-send-region' to send all contents at once
-and rely on Emacs' own buffering and chunking."
- (save-restriction
- (widen)
- (if flycheck-chunked-process-input
- (flycheck--process-send-buffer-contents-chunked process)
- (process-send-region process (point-min) (point-max))))
- (process-send-eof process))
-
-(defun flycheck--wrap-command (prog args)
- "Wrap PROG and ARGS using `flycheck-command-wrapper-function'."
- ;; We don't call `flycheck-executable-find' on the output of the wrapper
- ;; function, since it might not expect it (an executable-find function
- ;; designed to find binaries in a sandbox could get confused if we asked it
- ;; about the sandboxing program itself).
- (funcall flycheck-command-wrapper-function (cons prog args)))
-
-(defun flycheck-start-command-checker (checker callback)
- "Start a command CHECKER with CALLBACK."
- (let (process)
- (condition-case err
- (let* ((program (flycheck-find-checker-executable checker))
- (args (flycheck-checker-substituted-arguments checker))
- (command (flycheck--wrap-command program args))
- (sentinel-events nil)
- ;; Use pipes to receive output from the syntax checker. They are
- ;; more efficient and more robust than PTYs, which Emacs uses by
- ;; default, and since we don't need any job control features, we
- ;; can easily use pipes.
- (process-connection-type nil))
- ;; We pass do not associate the process with any buffer, by
- ;; passing nil for the BUFFER argument of `start-process'.
- ;; Instead, we just remember the buffer being checked in a
- ;; process property (see below). This neatly avoids all
- ;; side-effects implied by attached a process to a buffer, which
- ;; may cause conflicts with other packages.
- ;;
- ;; See https://github.com/flycheck/flycheck/issues/298 for an
- ;; example for such a conflict.
- (setq process (apply 'start-process (format "flycheck-%s" checker)
- nil command))
- ;; Process sentinels can be called while sending input to the process.
- ;; We want to record errors raised by process-send before calling
- ;; `flycheck-handle-signal', so initially just accumulate events.
- (setf (process-sentinel process)
- (lambda (_ event) (push event sentinel-events)))
- (setf (process-filter process) #'flycheck-receive-checker-output)
- (set-process-query-on-exit-flag process nil)
- ;; Remember the syntax checker, the buffer and the callback
- (process-put process 'flycheck-checker checker)
- (process-put process 'flycheck-callback callback)
- (process-put process 'flycheck-buffer (current-buffer))
- ;; The default directory is bound in the `flycheck-syntax-check-start'
- ;; function.
- (process-put process 'flycheck-working-directory default-directory)
- ;; Track the temporaries created by argument substitution in the
- ;; process itself, to get rid of the global state ASAP.
- (process-put process 'flycheck-temporaries flycheck-temporaries)
- (setq flycheck-temporaries nil)
- ;; Send the buffer to the process on standard input, if enabled.
- (when (flycheck-checker-get checker 'standard-input)
- (condition-case err
- (flycheck-process-send-buffer process)
- ;; Some checkers exit before reading all input, causing errors
- ;; such as a `file-error' for a closed pipe, or a plain “no longer
- ;; connected to pipe; closed it” error for a disconnection. We
- ;; report them if needed in `flycheck-finish-checker-process' (see
- ;; `https://github.com/flycheck/flycheck/issues/1278').
- (error (process-put process 'flycheck-error err))))
- ;; Set the actual sentinel and process any events that might have
- ;; happened while we were sending input.
- (setf (process-sentinel process) #'flycheck-handle-signal)
- (dolist (event (nreverse sentinel-events))
- (flycheck-handle-signal process event))
- ;; Return the process.
- process)
- (error
- ;; In case of error, clean up our resources, and report the error back to
- ;; Flycheck.
- (flycheck-safe-delete-temporaries)
- (when process
- ;; No need to explicitly delete the temporary files of the process,
- ;; because deleting runs the sentinel, which will delete them anyway.
- (delete-process process))
- (signal (car err) (cdr err))))))
-
-(defun flycheck-interrupt-command-checker (_checker process)
- "Interrupt a PROCESS."
- ;; Deleting the process always triggers the sentinel, which does the cleanup
- (when process
- (delete-process process)))
-
-(defun flycheck-command-checker-print-doc (checker)
- "Print additional documentation for a command CHECKER."
- (let ((executable (flycheck-checker-default-executable checker))
- (config-file-var (flycheck-checker-get checker 'config-file-var))
- (option-vars (seq-sort #'string<
- (flycheck-checker-get checker 'option-vars))))
- (princ "\n")
-
- (let ((doc-start (with-current-buffer standard-output (point-max))))
- ;; Track the start of our documentation so that we can re-indent it
- ;; properly
- (princ " This syntax checker executes \"")
- (princ executable)
- (princ "\"")
- (when config-file-var
- (princ ", using a configuration file from `")
- (princ (symbol-name config-file-var))
- (princ "'"))
- (princ ". The executable can be overridden with `")
- (princ (symbol-name (flycheck-checker-executable-variable checker)))
- (princ "'.")
-
- (with-current-buffer standard-output
- (save-excursion
- (fill-region-as-paragraph doc-start (point-max)))))
- (princ "\n")
- (when option-vars
- (princ
- "\n This syntax checker can be configured with these options:\n\n")
- (dolist (var option-vars)
- (princ (format " * `%s'\n" var))))))
-
-(defun flycheck-verify-command-checker (checker)
- "Verify a command CHECKER in the current buffer.
-
-Return a list of `flycheck-verification-result' objects for
-CHECKER."
- (let ((executable (flycheck-find-checker-executable checker))
- (config-file-var (flycheck-checker-get checker 'config-file-var)))
- `(
- ,(flycheck-verification-result-new
- :label "executable"
- :message (if executable (format "Found at %s" executable) "Not found")
- :face (if executable 'success '(bold error)))
- ,@(when config-file-var
- (let* ((value (symbol-value config-file-var))
- (path (and value (flycheck-locate-config-file value checker))))
- (list (flycheck-verification-result-new
- :label "configuration file"
- :message (if path (format "Found at %S" path) "Not found")
- :face (if path 'success 'warning)))))
- ,@(when (not (flycheck-temp-files-writable-p checker))
- (list (flycheck-verification-result-new
- :label "temp directory"
- :message (format "%s is not writable"
- (flycheck-temp-directory checker))
- :face 'error))))))
-
-
-;;; Process management for command syntax checkers
-(defun flycheck-receive-checker-output (process output)
- "Receive a syntax checking PROCESS OUTPUT."
- (push output (process-get process 'flycheck-pending-output)))
-
-(defun flycheck-get-output (process)
- "Get the complete output of PROCESS."
- (with-demoted-errors "Error while retrieving process output: %S"
- (let ((pending-output (process-get process 'flycheck-pending-output)))
- (apply #'concat (nreverse pending-output)))))
-
-(defun flycheck-handle-signal (process _event)
- "Handle a signal from the syntax checking PROCESS.
-
-_EVENT is ignored."
- (when (memq (process-status process) '(signal exit))
- (let ((files (process-get process 'flycheck-temporaries))
- (buffer (process-get process 'flycheck-buffer))
- (callback (process-get process 'flycheck-callback))
- (cwd (process-get process 'flycheck-working-directory))
- (err (process-get process 'flycheck-error)))
- ;; Delete the temporary files
- (seq-do #'flycheck-safe-delete files)
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (condition-case err
- (pcase (process-status process)
- (`signal
- (funcall callback 'interrupted))
- (`exit
- (flycheck-finish-checker-process
- (process-get process 'flycheck-checker)
- (or err (process-exit-status process))
- files
- (flycheck-get-output process) callback cwd)))
- ((debug error)
- (funcall callback 'errored (error-message-string err)))))))))
-
-(defun flycheck-finish-checker-process
- (checker exit-status files output callback cwd)
- "Finish a checker process from CHECKER with EXIT-STATUS.
-
-EXIT-STATUS can be a number or an arbitrary form (if it is not 0,
-a `suspicious' status is reported to CALLBACK).
-
-FILES is a list of files given as input to the checker. OUTPUT
-is the output of the syntax checker. CALLBACK is the status
-callback to use for reporting.
-
-Parse the OUTPUT and report an appropriate error status.
-
-Resolve all errors in OUTPUT using CWD as working directory."
- (let ((errors (flycheck-parse-output output checker (current-buffer))))
- (when (and (not (equal exit-status 0)) (null errors))
- ;; Warn about a suspicious result from the syntax checker. We do right
- ;; after parsing the errors, before filtering, because a syntax checker
- ;; might report errors from other files (e.g. includes) even if there
- ;; are no errors in the file being checked.
- (funcall callback 'suspicious
- (format "Flycheck checker %S returned %S, but \
-its output contained no errors: %s\nTry installing a more \
-recent version of %S, and please open a bug report if the issue \
-persists in the latest release. Thanks!" checker exit-status
-output checker)))
- (funcall callback 'finished
- ;; Fix error file names, by substituting them backwards from the
- ;; temporaries.
- (seq-map (lambda (e) (flycheck-fix-error-filename e files cwd))
- errors))))
-
-
-;;; Executables of command checkers.
-(defmacro flycheck-def-executable-var (checker default-executable)
- "Define the executable variable for CHECKER.
-
-DEFAULT-EXECUTABLE is the default executable. It is only used in
-the docstring of the variable.
-
-The variable is defined with `defcustom' in the
-`flycheck-executables' group. It's also defined to be risky as
-file-local variable, to avoid arbitrary executables being used
-for syntax checking."
- (let ((executable-var (flycheck-checker-executable-variable checker)))
- `(progn
- (defcustom ,executable-var nil
- ,(format "The executable of the %s syntax checker.
-
-Either a string containing the name or the path of the
-executable, or nil to use the default executable from the syntax
-checker declaration.
-
-The default executable is %S." checker default-executable)
- :type '(choice (const :tag "Default executable" nil)
- (string :tag "Name or path"))
- :group 'flycheck-executables
- :risky t))))
-
-(defun flycheck-set-checker-executable (checker &optional executable)
- "Set the executable of CHECKER in the current buffer.
-
-CHECKER is a syntax checker symbol. EXECUTABLE is a string with
-the name of an executable or the path to an executable file, which
-is to be used as executable for CHECKER. If omitted or nil,
-reset the executable of CHECKER.
-
-Interactively, prompt for a syntax checker and an executable
-file, and set the executable of the selected syntax checker.
-With prefix arg, prompt for a syntax checker only, and reset the
-executable of the select checker to the default.
-
-Set the executable variable of CHECKER, that is,
-`flycheck-CHECKER-executable' to EXECUTABLE. Signal
-`user-error', if EXECUTABLE does not denote a command or an
-executable file.
-
-This command is intended for interactive use only. In Lisp, just
-`let'-bind the corresponding variable, or set it directly. Use
-`flycheck-checker-executable-variable' to obtain the executable
-variable symbol for a syntax checker."
- (declare (interactive-only "Set the executable variable directly instead"))
- (interactive
- (let* ((checker (flycheck-read-checker "Syntax checker: "))
- (default-executable (flycheck-checker-default-executable checker))
- (executable (if current-prefix-arg
- nil
- (read-file-name "Executable: " nil default-executable
- nil nil flycheck-executable-find))))
- (list checker executable)))
- (when (and executable (not (funcall flycheck-executable-find executable)))
- (user-error "%s is no executable" executable))
- (let ((variable (flycheck-checker-executable-variable checker)))
- (set (make-local-variable variable) executable)))
-
-
-;;; Configuration files and options for command checkers
-(defun flycheck-register-config-file-var (var checkers)
- "Register VAR as config file var for CHECKERS.
-
-CHECKERS is a single syntax checker or a list thereof."
- (when (symbolp checkers)
- (setq checkers (list checkers)))
- (dolist (checker checkers)
- (setf (flycheck-checker-get checker 'config-file-var) var)))
-
-;;;###autoload
-(defmacro flycheck-def-config-file-var (symbol checker &optional file-name
- &rest custom-args)
- "Define SYMBOL as config file variable for CHECKER, with default FILE-NAME.
-
-SYMBOL is declared as customizable variable using `defcustom', to
-provide configuration files for the given syntax CHECKER.
-CUSTOM-ARGS are forwarded to `defcustom'.
-
-FILE-NAME is the initial value of the new variable. If omitted,
-the default value is nil. It can be either a string or a list of
-strings.
-
-Use this together with the `config-file' form in the `:command'
-argument to `flycheck-define-checker'."
- (declare (indent 3))
- `(progn
- (defcustom ,symbol ,file-name
- ,(format "Configuration file for `%s'.
-
-If set to a string, locate the configuration file using the
-functions from `flycheck-locate-config-file-functions'. If the
-file is found pass it to the syntax checker as configuration
-file.
-
-If no configuration file is found, or if this variable is set to
-nil, invoke the syntax checker without a configuration file.
-
-Use this variable as file-local variable if you need a specific
-configuration file for a buffer." checker)
- :type '(choice (const :tag "No configuration file" nil)
- (string :tag "File name or path")
- (repeat :tag "File names or paths" string))
- :safe #'flycheck-string-or-string-list-p
- :group 'flycheck-config-files
- ,@custom-args)
- (flycheck-register-config-file-var ',symbol ',checker)))
-
-(defun flycheck-locate-config-file (filenames checker)
- "Locate the configuration file for CHECKER, based on FILENAMES.
-
-FILENAMES can be either a single file, or a list. Each filename
-is passed to all `flycheck-locate-config-file-functions', until
-one returns non-nil.
-
-Return the absolute path of the configuration file, or nil if no
-configuration file was found."
- (when (stringp filenames)
- (setq filenames (list filenames)))
- (let ((config-file nil))
- (while (and filenames (null config-file))
- (setq config-file (run-hook-with-args-until-success
- 'flycheck-locate-config-file-functions
- (pop filenames) checker)))
- (when (and config-file (file-exists-p config-file))
- config-file)))
-
-(defun flycheck-locate-config-file-by-path (filepath _checker)
- "Locate a configuration file by a FILEPATH.
-
-If FILEPATH is a contains a path separator, expand it against the
-default directory and return it if it points to an existing file.
-Otherwise return nil.
-
-_CHECKER is ignored."
- ;; If the path is just a plain file name, skip it.
- (unless (string= (file-name-nondirectory filepath) filepath)
- (let ((file-name (expand-file-name filepath)))
- (and (file-exists-p file-name) file-name))))
-
-(defun flycheck-locate-config-file-ancestor-directories (filename _checker)
- "Locate a configuration FILENAME in ancestor directories.
-
-If the current buffer has a file name, search FILENAME in the
-directory of the current buffer and all ancestors thereof (see
-`locate-dominating-file'). If the file is found, return its
-absolute path. Otherwise return nil.
-
-_CHECKER is ignored."
- (-when-let* ((basefile (buffer-file-name))
- (directory (locate-dominating-file basefile filename)))
- (expand-file-name filename directory)))
-
-(defun flycheck-locate-config-file-home (filename _checker)
- "Locate a configuration FILENAME in the home directory.
-
-Return the absolute path, if FILENAME exists in the user's home
-directory, or nil otherwise."
- (let ((path (expand-file-name filename "~")))
- (when (file-exists-p path)
- path)))
-
-(seq-do (apply-partially #'custom-add-frequent-value
- 'flycheck-locate-config-file-functions)
- '(flycheck-locate-config-file-by-path
- flycheck-locate-config-file-ancestor-directories
- flycheck-locate-config-file-home))
-
-(defun flycheck-register-option-var (var checkers)
- "Register an option VAR with CHECKERS.
-
-VAR is an option symbol, and CHECKERS a syntax checker symbol or
-a list thereof. Register VAR with all CHECKERS so that it
-appears in the help output."
- (when (symbolp checkers)
- (setq checkers (list checkers)))
- (dolist (checker checkers)
- (cl-pushnew var (flycheck-checker-get checker 'option-vars))))
-
-;;;###autoload
-(defmacro flycheck-def-option-var (symbol init-value checkers docstring
- &rest custom-args)
- "Define SYMBOL as option variable with INIT-VALUE for CHECKER.
-
-SYMBOL is declared as customizable variable using `defcustom', to
-provide an option for the given syntax CHECKERS (a checker or a
-list of checkers). INIT-VALUE is the initial value of the
-variable, and DOCSTRING is its docstring. CUSTOM-ARGS are
-forwarded to `defcustom'.
-
-Use this together with the `option', `option-list' and
-`option-flag' forms in the `:command' argument to
-`flycheck-define-checker'."
- (declare (indent 3)
- (doc-string 4))
- `(progn
- (defcustom ,symbol ,init-value
- ,(concat docstring "
-
-This variable is an option for the following syntax checkers:
-
-"
- (mapconcat (lambda (c) (format " - `%s'" c))
- (if (symbolp checkers) (list checkers) checkers)
- "\n"))
- :group 'flycheck-options
- ,@custom-args)
- (flycheck-register-option-var ',symbol ',checkers)))
-
-(defun flycheck-option-int (value)
- "Convert an integral option VALUE to a string.
-
-If VALUE is nil, return nil. Otherwise return VALUE converted to
-a string."
- (and value (number-to-string value)))
-
-(defun flycheck-option-symbol (value)
- "Convert a symbol option VALUE to string.
-
-If VALUE is nil return nil. Otherwise return VALUE converted to
-a string."
- (and value (symbol-name value)))
-
-(defun flycheck-option-comma-separated-list (value &optional separator filter)
- "Convert VALUE into a list separated by SEPARATOR.
-
-SEPARATOR is a string to separate items in VALUE, defaulting to
-\",\". FILTER is an optional function, which takes a single
-argument and returns either a string or nil.
-
-If VALUE is a list, apply FILTER to each item in VALUE, remove
-all nil items, and return a single string of all remaining items
-separated by SEPARATOR.
-
-Otherwise, apply FILTER to VALUE and return the result.
-SEPARATOR is ignored in this case."
- (let ((filter (or filter #'identity))
- (separator (or separator ",")))
- (if (listp value)
- (-when-let (value (delq nil (seq-map filter value)))
- (string-join value separator))
- (funcall filter value))))
-
-(defmacro flycheck-def-args-var (symbol checkers &rest custom-args)
- "Define SYMBOL as argument variable for CHECKERS.
-
-SYMBOL is declared as customizable, risky and buffer-local
-variable using `defcustom' to provide an option for arbitrary
-arguments for the given syntax CHECKERS (either a single checker
-or a list of checkers). CUSTOM-ARGS is forwarded to `defcustom'.
-
-Use the `eval' form to splice this variable into the
-`:command'."
- (declare (indent 2))
- `(flycheck-def-option-var ,symbol nil ,checkers
- "A list of additional command line arguments.
-
-The value of this variable is a list of strings with additional
-command line arguments."
- :risky t
- :type '(repeat (string :tag "Argument"))
- ,@custom-args))
-
-
-;;; Command syntax checkers as compile commands
-(defun flycheck-checker-pattern-to-error-regexp (pattern)
- "Convert PATTERN into an error regexp for compile.el.
-
-Return a list representing PATTERN, suitable as element in
-`compilation-error-regexp-alist'."
- (let* ((regexp (car pattern))
- (level (cdr pattern))
- (level-no (flycheck-error-level-compilation-level level)))
- `(,regexp 1 (2 . 6) (3 . 7) ,level-no)))
-
-(defun flycheck-checker-compilation-error-regexp-alist (checker)
- "Convert error patterns of CHECKER for use with compile.el.
-
-Return an alist of all error patterns of CHECKER, suitable for
-use with `compilation-error-regexp-alist'."
- (seq-map #'flycheck-checker-pattern-to-error-regexp
- (flycheck-checker-get checker 'error-patterns)))
-
-(defun flycheck--substitute-shell-command-argument (arg checker)
- "Substitute ARG for CHECKER.
-
-Like `flycheck-substitute-argument', except for source,
-source-inplace, and source-original."
- (if (memq arg '(source source-inplace source-original))
- (list buffer-file-name)
- (flycheck-substitute-argument arg checker)))
-
-(defun flycheck--checker-substituted-shell-command-arguments (checker)
- "Get the substituted arguments of a CHECKER to run as a shell command.
-
-Substitute each argument of CHECKER using
-`flycheck-substitute-shell-command-argument'."
- (apply #'append
- (seq-map (lambda (arg)
- (flycheck--substitute-shell-command-argument arg checker))
- (flycheck-checker-arguments checker))))
-
-(defun flycheck-checker-shell-command (checker)
- "Get a shell command for CHECKER.
-
-Perform substitution in the arguments of CHECKER, but with
-`flycheck--substitute-shell-command-argument'.
-
-Return the command of CHECKER as single string, suitable for
-shell execution."
- ;; Note: Do NOT use `combine-and-quote-strings' here. Despite it's name it
- ;; does not properly quote shell arguments, and actually breaks for special
- ;; characters. See https://github.com/flycheck/flycheck/pull/522
- (let* ((args (flycheck--checker-substituted-shell-command-arguments checker))
- (program
- (or (flycheck-find-checker-executable checker)
- (user-error "Cannot find `%s' using `flycheck-executable-find'"
- (flycheck-checker-executable checker))))
- (wrapped (flycheck--wrap-command program args))
- (abs-prog
- ;; The executable path returned by `flycheck-command-wrapper-function'
- ;; may not be absolute, so expand it here. See URL
- ;; `https://github.com/flycheck/flycheck/issues/1461'.
- (or (executable-find (car wrapped))
- (user-error "Cannot find `%s' using `executable-find'"
- (car wrapped))))
- (command (mapconcat #'shell-quote-argument
- (cons abs-prog (cdr wrapped)) " ")))
- (if (flycheck-checker-get checker 'standard-input)
- ;; If the syntax checker expects the source from standard input add an
- ;; appropriate shell redirection
- (concat command " < " (shell-quote-argument (buffer-file-name)))
- command)))
-
-(defun flycheck-compile-name (_name)
- "Get a name for a Flycheck compilation buffer.
-
-_NAME is ignored."
- (format "*Flycheck %s*" (buffer-file-name)))
-
-(defun flycheck-compile (checker)
- "Run CHECKER via `compile'.
-
-CHECKER must be a valid syntax checker. Interactively, prompt
-for a syntax checker to run.
-
-Instead of highlighting errors in the buffer, this command pops
-up a separate buffer with the entire output of the syntax checker
-tool, just like `compile' (\\[compile])."
- (interactive
- (let ((default (flycheck-get-checker-for-buffer)))
- (list (flycheck-read-checker "Run syntax checker as compile command: "
- (when (flycheck-checker-get default 'command)
- default)
- 'command))))
- (unless (flycheck-valid-checker-p checker)
- (user-error "%S is not a valid syntax checker" checker))
- (unless (buffer-file-name)
- (user-error "Cannot compile a buffer without a backing file"))
- (unless (flycheck-may-use-checker checker)
- (user-error "Cannot use syntax checker %S in this buffer" checker))
- (unless (flycheck-checker-executable checker)
- (user-error "Cannot run checker %S as shell command" checker))
- (save-some-buffers)
- (let* ((default-directory (flycheck-compute-working-directory checker))
- (command (flycheck-checker-shell-command checker))
- (buffer (compilation-start command nil #'flycheck-compile-name)))
- (with-current-buffer buffer
- (setq-local compilation-error-regexp-alist
- (flycheck-checker-compilation-error-regexp-alist checker)))))
-
-
-;;; General error parsing for command checkers
-(defun flycheck-parse-output (output checker buffer)
- "Parse OUTPUT from CHECKER in BUFFER.
-
-OUTPUT is a string with the output from the checker symbol
-CHECKER. BUFFER is the buffer which was checked.
-
-Return the errors parsed with the error patterns of CHECKER."
- (funcall (flycheck-checker-get checker 'error-parser) output checker buffer))
-
-(defun flycheck-fix-error-filename (err buffer-files cwd)
- "Fix the file name of ERR from BUFFER-FILES.
-
-Resolves error file names relative to CWD directory.
-
-Make the file name of ERR absolute. If the absolute file name of
-ERR is in BUFFER-FILES, replace it with the value of variable
-`buffer-file-name'."
- (flycheck-error-with-buffer err
- (-when-let (filename (flycheck-error-filename err))
- (when (seq-some (apply-partially #'flycheck-same-files-p
- (expand-file-name filename cwd))
- buffer-files)
- (setf (flycheck-error-filename err) buffer-file-name)
- (when (and buffer-file-name (flycheck-error-message err))
- (setf (flycheck-error-message err)
- (replace-regexp-in-string
- (regexp-quote filename) buffer-file-name
- (flycheck-error-message err) 'fixed-case 'literal))))))
- err)
-
-
-;;; Error parsers for command syntax checkers
-(defun flycheck-parse-xml-region (beg end)
- "Parse the xml region between BEG and END.
-
-Wrapper around `xml-parse-region' which transforms the return
-value of this function into one compatible to
-`libxml-parse-xml-region' by simply returning the first element
-from the node list."
- (ignore-errors (car (xml-parse-region beg end))))
-
-(defun flycheck-parse-xml-region-with-fallback (beg end)
- "Parse the xml region between BEG and END.
-
-Try parsing with libxml first; if that fails, revert to
-`flycheck-parse-xml-region'. Failures can be caused by incorrect
-XML (see URL `https://github.com/flycheck/flycheck/issues/1298'),
-or on Windows by a missing libxml DLL with a libxml-enabled Emacs
-\(see URL `https://github.com/flycheck/flycheck/issues/1330')."
- ;; FIXME use `libxml-available-p' when it gets implemented.
- (or (and (fboundp 'libxml-parse-xml-region)
- (libxml-parse-xml-region beg end))
- (flycheck-parse-xml-region beg end)))
-
-(defvar flycheck-xml-parser 'flycheck-parse-xml-region-with-fallback
- "Function used to parse an xml string from a region.
-
-The default uses libxml if available, and falls back to
-`flycheck-parse-xml-region' otherwise.")
-
-(defun flycheck-parse-xml-string (xml)
- "Parse an XML string.
-
-Return the document tree parsed from XML in the form `(ROOT ATTRS
-BODY...)'. ROOT is a symbol identifying the name of the root
-element. ATTRS is an alist of the attributes of the root node.
-BODY is zero or more body elements, either as strings (in case of
-text nodes) or as XML nodes, in the same for as the root node."
- (with-temp-buffer
- (insert xml)
- (funcall flycheck-xml-parser (point-min) (point-max))))
-
-(defun flycheck-parse-checkstyle (output checker buffer)
- "Parse Checkstyle errors from OUTPUT.
-
-Parse Checkstyle-like XML output. Use this error parser for
-checkers that have an option to output errors in this format.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `http://checkstyle.sourceforge.net/' for information
-about Checkstyle."
- (pcase (flycheck-parse-xml-string output)
- (`(checkstyle ,_ . ,file-nodes)
- (let (errors)
- (dolist (node file-nodes)
- (pcase node
- (`(file ,file-attrs . ,error-nodes)
- (dolist (node error-nodes)
- (pcase node
- (`(error ,error-attrs . ,_)
- (let-alist error-attrs
- (push (flycheck-error-new-at
- (flycheck-string-to-number-safe .line)
- (flycheck-string-to-number-safe .column)
- (pcase .severity
- (`"error" 'error)
- (`"warning" 'warning)
- (`"info" 'info)
- ;; Default to error for unknown .severity
- (_ 'error))
- .message
- :checker checker :id .source
- :buffer buffer
- :filename (cdr (assq 'name file-attrs)))
- errors))))))))
- (nreverse errors)))))
-
-(defun flycheck-parse-cppcheck (output checker buffer)
- "Parse Cppcheck errors from OUTPUT.
-
-Parse Cppcheck XML v2 output.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `http://cppcheck.sourceforge.net/' for more information
-about Cppcheck."
- (pcase (flycheck-parse-xml-string output)
- (`(results ,_ . ,body)
- (let (errors)
- (dolist (node body)
- (pcase node
- (`(errors ,_ . ,error-nodes)
- (dolist (node error-nodes)
- (pcase node
- (`(error ,error-attrs . ,loc-nodes)
- (let ((id (cdr (assq 'id error-attrs)))
- (message (cdr (assq 'verbose error-attrs)))
- (level (pcase (cdr (assq 'severity error-attrs))
- (`"error" 'error)
- (`"style" 'info)
- (`"information" 'info)
- (_ 'warning))))
- (dolist (node loc-nodes)
- (pcase node
- (`(location ,loc-attrs . ,_)
- (let-alist loc-attrs
- (push (flycheck-error-new-at
- (flycheck-string-to-number-safe .line)
- nil
- level
- ;; cppcheck return newline characters as "\012"
- (replace-regexp-in-string "\\\\012" "\n"
- message)
- :id id
- :checker checker
- :buffer buffer
- :filename .file)
- errors))))))))))))
- (nreverse errors)))))
-
-(defun flycheck-parse-phpmd (output checker buffer)
- "Parse phpmd errors from OUTPUT.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `http://phpmd.org/' for more information about phpmd."
- (pcase (flycheck-parse-xml-string output)
- (`(pmd ,_ . ,body)
- (let (errors)
- (dolist (node body)
- (pcase node
- (`(file ,file-attrs . ,violation-nodes)
- (let ((filename (cdr (assq 'name file-attrs))))
- (dolist (node violation-nodes)
- (pcase node
- (`(violation ,vio-attrs ,(and message (pred stringp)))
- (let-alist vio-attrs
- (push
- (flycheck-error-new-at
- (flycheck-string-to-number-safe .beginline)
- nil
- 'warning (string-trim message)
- ;; Ignore .endline (phpmd marks giant spans as errors)
- ;; :end-line (flycheck-string-to-number-safe .endline)
- :id .rule
- :checker checker
- :buffer buffer
- :filename filename)
- errors)))))))))
- (nreverse errors)))))
-
-(defun flycheck-parse-reek (output checker buffer)
- "Parse Reek warnings from JSON OUTPUT.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `https://github.com/troessner/reek' for more information
-about Reek."
- (let ((errors nil))
- (dolist (message (car (flycheck-parse-json output)))
- (let-alist message
- (dolist (line (delete-dups .lines))
- (push
- (flycheck-error-new-at
- line
- nil
- 'warning (concat .context " " .message)
- :id .smell_type
- :checker checker
- :buffer buffer
- :filename .source)
- errors))))
- (nreverse errors)))
-
-(defun flycheck-parse-go-staticcheck (output checker buffer)
- "Parse staticheck warnings from JSON OUTPUT.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `https://staticcheck.io/docs/formatters' for more
-information about staticheck."
- (let ((errors nil))
- (dolist (msg (flycheck-parse-json output))
- (let-alist msg
- (push
- (flycheck-error-new-at
- .location.line
- .location.column
- (pcase .severity
- (`"error" 'error)
- (`"warning" 'warning)
- (`"ignored" 'info)
- ;; Default to warning for unknown .severity
- (_ 'warning))
- .message
- :id .code
- :checker checker
- :buffer buffer
- :filename .location.file)
- errors)))
- (nreverse errors)))
-
-(defun flycheck-parse-tslint (output checker buffer)
- "Parse TSLint errors from JSON OUTPUT.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `https://palantir.github.io/tslint/' for more information
-about TSLint."
- (seq-map (lambda (message)
- (let-alist message
- (flycheck-error-new-at
- (+ 1 .startPosition.line)
- (+ 1 .startPosition.character)
- (pcase .ruleSeverity
- ("ERROR" 'error)
- ("WARNING" 'warning)
- (_ 'warning))
- .failure
- :id .ruleName
- :checker checker
- :buffer buffer
- :filename .name
- :end-line (+ 1 .endPosition.line)
- :end-column (+ 1 .endPosition.character))))
- (car (flycheck-parse-json output))))
-
-(defun flycheck-parse-rust-collect-spans (span)
- "Return a list of spans contained in a SPAN object."
- (let ((spans))
- (let-alist span
- ;; With macro expansion errors, some spans will point to phony file names
- ;; to indicate an error inside the std rust lib. We skip these spans as
- ;; they won't appear in flycheck anyway.
- (unless (string= .file_name "<std macros>")
- (push span spans))
-
- ;; Macro expansion errors will have a span in the 'expansion' field, so we
- ;; recursively collect it.
- (if .expansion.span
- (append (flycheck-parse-rust-collect-spans .expansion.span)
- spans)
- spans))))
-
-(defun flycheck-parse-rustc-diagnostic (diagnostic checker buffer)
- "Turn a rustc DIAGNOSTIC into a `flycheck-error'.
-
-CHECKER and BUFFER denote the CHECKER that returned DIAGNOSTIC
-and the BUFFER that was checked respectively.
-
-DIAGNOSTIC should be a parsed JSON object describing a rustc
-diagnostic, following the format described there:
-
-https://github.com/rust-lang/rust/blob/master/src/librustc_errors/json.rs#L154"
- (let ((error-message)
- (error-level)
- (error-code)
- (primary-filename)
- (primary-line)
- (primary-column)
- (primary-end-line)
- (primary-end-column)
- (group (make-symbol "group"))
- (spans)
- (children)
- (errors))
- ;; The diagnostic format is described in the link above. The gist of it is
- ;; that a diagnostic can have several causes in the source text; these
- ;; causes are represented by spans. The diagnostic has a message and a
- ;; level (error, warning), while the spans have a filename, line, column,
- ;; and an optional label. The primary span points to the root cause of the
- ;; error in the source text, while non-primary spans point to related
- ;; causes. Spans may have an 'expansion' field for macro expansion errors;
- ;; these expansion fields will contain another span (and so on). In
- ;; addition, a diagnostic can also have children diagnostics that are used
- ;; to provide additional information through their message field, but do not
- ;; seem to contain any spans (yet).
- ;;
- ;; We first gather spans in order to turn every span into a flycheck error
- ;; object, that we collect into the `errors' list.
-
- ;; Nested `let-alist' cause compilation warnings, hence we `setq' all
- ;; these values here first to avoid nesting.
- (let-alist diagnostic
- (setq error-message .message
- error-level (pcase .level
- (`"error" 'error)
- (`"warning" 'warning)
- (`"note" 'info)
- (_ 'error))
- ;; The 'code' field of the diagnostic contains the actual error
- ;; code and an optional explanation that we ignore
- error-code .code.code
- ;; Collect all spans recursively
- spans (seq-mapcat #'flycheck-parse-rust-collect-spans .spans)
- children .children))
-
- ;; Turn each span into a flycheck error
- (dolist (span spans)
- (let-alist span
- ;; Children may not have filename/line/column information, so we use
- ;; those from the primary span
- (when .is_primary
- (setq primary-filename .file_name
- primary-line .line_start
- primary-column .column_start
- primary-end-line .line_end
- primary-end-column .column_end))
- (push
- (flycheck-error-new-at
- .line_start
- .column_start
- ;; Non-primary spans are used for notes
- (if .is_primary error-level 'info)
- (if .is_primary
- ;; Primary spans may have labels with additional information
- (concat error-message (when .label
- (format " (%s)" .label)))
- ;; If the label is empty, fallback on the error message,
- ;; otherwise we won't be able to display anything
- (or .label error-message))
- :id error-code
- :checker checker
- :buffer buffer
- :filename .file_name
- :group group
- :end-line .line_end
- :end-column .column_end)
- errors)))
-
- ;; Then we turn children messages into flycheck errors pointing to the
- ;; location of the primary span.
- (dolist (child children)
- (let ((message (let-alist child .message)))
- (let-alist (car (let-alist child .spans))
- (push
- (flycheck-error-new-at
- ;; Use the line/column from the first span if there is one, or
- ;; fallback to the line/column information from the primary span of
- ;; the diagnostic.
- (or .line_start primary-line)
- (or .column_start primary-column)
- 'info
- ;; Messages from `cargo clippy' may suggest replacement code. In
- ;; these cases, the `message' field itself is an unhelpful `try' or
- ;; `change this to'. We add the `suggested_replacement' field in
- ;; these cases.
- (if .suggested_replacement
- (format "%s: `%s`" message .suggested_replacement)
- message)
- :id error-code
- :checker checker
- :buffer buffer
- :filename primary-filename
- :group group
- :end-line (or .line_end primary-end-line)
- :end-column (or .column_end primary-end-column))
- errors))))
-
- ;; If there are no spans, the error is not associated with a specific
- ;; file but with the project as a whole. We still need to report it to
- ;; the user by emitting a corresponding flycheck-error object.
- (unless spans
- (push (flycheck-error-new-at
- ;; We have no specific position to attach the error to, so
- ;; let's use the top of the file.
- 1 1
- error-level
- error-message
- :id error-code
- :checker checker
- :buffer buffer
- :group group)
- errors))
- (nreverse errors)))
-
-(defconst flycheck--json-parser
- (if (and (functionp 'json-parse-buffer)
- ;; json-parse-buffer only supports keyword arguments in Emacs 27+
- (>= emacs-major-version 27))
- (lambda ()
- (json-parse-buffer
- :object-type 'alist :array-type 'list
- :null-object nil :false-object nil))
- #'json-read)
- "Function to use to parse JSON strings.")
-
-(defun flycheck-parse-json (output)
- "Return parsed JSON data from OUTPUT.
-
-OUTPUT is a string that contains JSON data. Each line of OUTPUT
-may be either plain text, a JSON array (starting with `['), or a
-JSON object (starting with `{').
-
-This function ignores the plain text lines, parses the JSON
-lines, and returns the parsed JSON lines in a list."
- (let ((objects nil)
- (json-array-type 'list)
- (json-false nil))
- (with-temp-buffer
- (insert output)
- (goto-char (point-min))
- (while (not (eobp))
- (when (memq (char-after) '(?\{ ?\[))
- (push (funcall flycheck--json-parser) objects))
- (forward-line)))
- (nreverse objects)))
-
-(defun flycheck-parse-rustc (output checker buffer)
- "Parse rustc errors from OUTPUT and return a list of `flycheck-error'.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-The expected format for OUTPUT is a mix of plain text lines and
-JSON lines. This function ignores the plain text lines and
-parses only JSON lines. Each JSON line is expected to be a JSON
-object that corresponds to a diagnostic from the compiler. The
-expected diagnostic format is described there:
-
-https://github.com/rust-lang/rust/blob/master/src/libsyntax/json.rs#L67-L139"
- (seq-mapcat (lambda (msg)
- (flycheck-parse-rustc-diagnostic msg checker buffer))
- (flycheck-parse-json output)))
-
-(defun flycheck-parse-cargo-rustc (output checker buffer)
- "Parse Cargo errors from OUTPUT and return a list of `flycheck-error'.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-The expected format for OUTPUT is a mix of plain text lines and
-JSON lines. This function ignores the plain text lines and
-parses only JSON lines. Each JSON line is expected to be a JSON
-object that represents a message from Cargo. The format of
-messages emitted by Cargo is described in cargo's
-machine_message.rs at URL `https://git.io/vh24R'."
- (let ((errors))
- (dolist (msg (flycheck-parse-json output))
- (let-alist msg
- ;; Errors and warnings from rustc are wrapped by cargo, so we filter and
- ;; unwrap them, and delegate the actual construction of `flycheck-error'
- ;; objects to `flycheck-parse-rustc-diagnostic'.
- (when (string= .reason "compiler-message")
- (push (flycheck-parse-rustc-diagnostic .message checker buffer)
- errors))))
- (apply #'nconc errors)))
-
-;; Some checkers output ANSI terminal colors, which don't match up
-;; with :error-patterns, so we strip those color codes from the output
-;; here before passing it along to the default behavior. This is
-;; originally only used in the rebar3 checker, but the systemd checker
-;; now also makes use of it.
-;;
-;; The relevant discussion can be found at
-;; https://github.com/flycheck/flycheck/pull/1144
-(defun flycheck-parse-with-patterns-without-color (output checker buffer)
- "Strip color codes from OUTPUT before passing it to the default behavior.
-
-CHECKER and BUFFER are passed along as well."
- (flycheck-parse-with-patterns
- (and (fboundp 'ansi-color-filter-apply) (ansi-color-filter-apply output))
- checker buffer))
-
-
-;;; Error parsing with regular expressions
-(defun flycheck-get-regexp (patterns)
- "Create a single regular expression from PATTERNS."
- (rx-to-string `(or ,@(seq-map (lambda (p) (list 'regexp (car p))) patterns))
- 'no-group))
-
-(defun flycheck-tokenize-output-with-patterns (output patterns)
- "Tokenize OUTPUT with PATTERNS.
-
-Split the output into error tokens, using all regular expressions
-from the error PATTERNS. An error token is simply a string
-containing a single error from OUTPUT. Such a token can then be
-parsed into a structured error by applying the PATTERNS again,
-see `flycheck-parse-errors-with-patterns'.
-
-Return a list of error tokens."
- (let ((regexp (flycheck-get-regexp patterns))
- (last-match 0)
- errors)
- (while (string-match regexp output last-match)
- (push (match-string 0 output) errors)
- (setq last-match (match-end 0)))
- (reverse errors)))
-
-(defun flycheck-try-parse-error-with-pattern (err pattern checker)
- "Try to parse a single ERR with a PATTERN for CHECKER.
-
-Return the parsed error if PATTERN matched ERR, or nil
-otherwise.
-
-`end-line' defaults to the value of `line' when `end-column' is
-set, since checkers often omit redundant end lines (as in
-<file>:<line>:<column>-<end-column>)."
- (let ((regexp (car pattern))
- (level (cdr pattern)))
- (when (string-match regexp err)
- (let ((filename (match-string 1 err))
- (line (flycheck-string-to-number-safe (match-string 2 err)))
- (column (flycheck-string-to-number-safe (match-string 3 err)))
- (message (match-string 4 err))
- (id (match-string 5 err))
- (end-line (flycheck-string-to-number-safe (match-string 6 err)))
- (end-column (flycheck-string-to-number-safe (match-string 7 err))))
- (flycheck-error-new-at
- line
- column
- level
- (unless (string-empty-p message) message)
- :id (unless (string-empty-p id) id)
- :checker checker
- :filename (if (or (null filename) (string-empty-p filename))
- (buffer-file-name)
- filename)
- :end-line (or end-line (and end-column line))
- :end-column end-column)))))
-
-(defun flycheck-parse-error-with-patterns (err patterns checker)
- "Parse a single ERR with error PATTERNS for CHECKER.
-
-Apply each pattern in PATTERNS to ERR, in the given order, and
-return the first parsed error."
- ;; Try to parse patterns in the order of declaration to make sure that the
- ;; first match wins.
- (let (parsed-error)
- (while (and patterns
- (not (setq parsed-error
- (flycheck-try-parse-error-with-pattern
- err (car patterns) checker))))
- (setq patterns (cdr patterns)))
- parsed-error))
-
-(defun flycheck-parse-with-patterns (output checker buffer)
- "Parse OUTPUT from CHECKER with error patterns.
-
-Uses the error patterns of CHECKER to tokenize the output and
-tries to parse each error token with all patterns, in the order
-of declaration. Hence an error is never matched twice by two
-different patterns. The pattern declared first always wins.
-
-_BUFFER is ignored.
-
-Return a list of parsed errors and warnings (as `flycheck-error'
-objects)."
- (with-current-buffer buffer
- (let ((patterns (flycheck-checker-get checker 'error-patterns)))
- (seq-map (lambda (err)
- (flycheck-parse-error-with-patterns err patterns checker))
- (flycheck-tokenize-output-with-patterns output patterns)))))
-
-
-;;; Convenience definition of command-syntax checkers
-
-;; This macro is autoloaded to prevent `with-eval-after-load' from expanding its
-;; arguments. See https://github.com/flycheck/flycheck/issues/1398.
-;;;###autoload
-(defmacro flycheck-define-checker (symbol docstring &rest properties)
- "Define SYMBOL as command syntax checker with DOCSTRING and PROPERTIES.
-
-Like `flycheck-define-command-checker', but PROPERTIES must not
-be quoted. Also, implicitly define the executable variable for
-SYMBOL with `flycheck-def-executable-var'."
- (declare (indent 1)
- (doc-string 2))
- (let ((command (plist-get properties :command))
- (parser (plist-get properties :error-parser))
- (filter (plist-get properties :error-filter))
- (explainer (plist-get properties :error-explainer))
- (predicate (plist-get properties :predicate))
- (enabled-fn (plist-get properties :enabled))
- (verify-fn (plist-get properties :verify)))
-
- `(progn
- (flycheck-def-executable-var ,symbol ,(car command))
-
- (flycheck-define-command-checker ',symbol
- ,docstring
- :command ',command
- ,@(when parser
- `(:error-parser #',parser))
- :error-patterns ',(plist-get properties :error-patterns)
- ,@(when filter
- `(:error-filter #',filter))
- ,@(when explainer
- `(:error-explainer #',explainer))
- :modes ',(plist-get properties :modes)
- ,@(when predicate
- `(:predicate #',predicate))
- :next-checkers ',(plist-get properties :next-checkers)
- ,@(when enabled-fn
- `(:enabled #',enabled-fn))
- ,@(when verify-fn
- `(:verify #',verify-fn))
- :standard-input ',(plist-get properties :standard-input)
- :working-directory ',(plist-get properties :working-directory)))))
-
-
-;;; Built-in checkers
-(flycheck-def-args-var flycheck-gnat-args ada-gnat
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gnat-include-path nil ada-gnat
- "A list of include directories for GNAT.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of gcc.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gnat-language-standard "2012" ada-gnat
- "The language standard to use in GNAT.
-
-The value of this variable is either a string denoting a language
-standard, or nil, to use the default standard. When non-nil, pass
-the language standard via the `-std' option."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Language standard"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gnat-warnings
- '("wa") ada-gnat
- "A list of additional Ada warnings to enable in GNAT.
-
-The value of this variable is a list of strings, where each
-string is the name of a warning category to enable. By default,
-most optional warnings are recommended, as in `-gnata'.
-
-Refer to Info Node `(gnat_ugn_unw)Warning Message Control' for
-more information about GNAT warnings."
- :type '(repeat :tag "Warnings" (string :tag "Warning name"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-define-checker ada-gnat
- "An Ada syntax checker using GNAT.
-
-Uses the GNAT compiler from GCC. See URL
-`https://www.adacore.com/community/'."
- :command ("gnatmake"
- "-c" ; Just compile, don't bind
- "-f" ; Force re-compilation
- "-u" ; Compile the main file only
- "-gnatf" ; Full error information
- "-gnatef" ; Full source file name
- "-D" temporary-directory
- (option-list "-gnat" flycheck-gnat-warnings concat)
- (option-list "-I" flycheck-gnat-include-path concat)
- (option "-gnat" flycheck-gnat-language-standard concat)
- (eval flycheck-gnat-args)
- source)
- :error-patterns
- ((error line-start
- (message "In file included from") " " (file-name) ":" line ":"
- column ":"
- line-end)
- (info line-start (file-name) ":" line ":" column
- ": note: " (message) line-end)
- (warning line-start (file-name) ":" line ":" column
- ": warning: " (message) line-end)
- ;; no specific error prefix in Ada
- (error line-start (file-name) ":" line ":" column
- ": " (message) line-end))
- :modes ada-mode)
-
-(flycheck-define-checker asciidoc
- "A AsciiDoc syntax checker using the AsciiDoc compiler.
-
-See URL `http://www.methods.co.nz/asciidoc'."
- :command ("asciidoc" "-o" null-device "-")
- :standard-input t
- :error-patterns
- ((error line-start
- "asciidoc: ERROR: <stdin>: Line " line ": " (message)
- line-end)
- (warning line-start
- "asciidoc: WARNING: <stdin>: Line " line ": " (message)
- line-end)
- (info line-start
- "asciidoc: DEPRECATED: <stdin>: Line " line ": " (message)
- line-end))
- :modes adoc-mode)
-
-(flycheck-define-checker asciidoctor
- "An AsciiDoc syntax checker using the Asciidoctor compiler.
-
-See URL `http://asciidoctor.org'."
- :command ("asciidoctor" "-o" null-device "-")
- :standard-input t
- :error-patterns
- ((error line-start
- "asciidoctor: ERROR: <stdin>: Line " line ": " (message)
- line-end)
- (warning line-start
- "asciidoctor: WARNING: <stdin>: Line " line ": " (message)
- line-end))
- :modes adoc-mode)
-
-(defun flycheck-awk-gawk-fix-message (err)
- "Remove the repeated file-name/line from the error message of ERR."
- (setf (flycheck-error-message err)
- (replace-regexp-in-string
- (rx line-start
- (group (zero-or-more (any " " "\t")))
- (group (zero-or-more nonl) "\n")
- (backref 1))
- "\\2"
- (replace-regexp-in-string
- (rx "\ngawk: " (zero-or-more (not (any " "))) ":")
- "\n"
- (flycheck-error-message err))))
- err)
-
-(defun flycheck-awk-gawk-error-filter (errors)
- "Remove repeated file-name/line from ERRORS."
- (seq-do #'flycheck-awk-gawk-fix-message errors)
- errors)
-
-(flycheck-define-checker awk-gawk
- "GNU awk's built-in --lint checker."
- :command ("gawk"
- ;; Avoid code execution. See https://github.com/w0rp/ale/pull/1411
- "--source" "'BEGIN{exit} END{exit 1}'"
- "-f" source
- "--lint"
- "/dev/null")
- :standard-input nil
- :error-patterns
- ((warning line-start
- "gawk: "
- (file-name) ":" line ":" (optional column ":")
- (message (one-or-more not-newline)
- (optional "\n"
- (one-or-more not-newline)
- " ^ "
- (one-or-more not-newline)))
- line-end))
- :error-filter flycheck-awk-gawk-error-filter
- :modes awk-mode)
-
-(flycheck-define-checker bazel-buildifier
- "An Bazel checker using the buildifier.
-
-See URL `https://github.com/bazelbuild/buildtools/blob/master/buildifier'."
- :command ("buildifier" "-lint=warn")
- :standard-input t
- :error-patterns
- ((error line-start
- "<stdin>:" line ":" column ": " (message)
- line-end)
- (warning line-start
- "<stdin>:" line ": " (id (one-or-more (in word "-"))) ": " (message)
- line-end))
- :modes bazel-mode)
-
-(flycheck-def-args-var flycheck-clang-args c/c++-clang
- :package-version '(flycheck . "0.22"))
-
-(flycheck-def-option-var flycheck-clang-blocks nil c/c++-clang
- "Enable blocks in Clang.
-
-When non-nil, enable blocks in Clang with `-fblocks'. See URL
-`http://clang.llvm.org/docs/BlockLanguageSpec.html' for more
-information about blocks."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-clang-definitions nil c/c++-clang
- "Additional preprocessor definitions for Clang.
-
-The value of this variable is a list of strings, where each
-string is an additional definition to pass to Clang, via the `-D'
-option."
- :type '(repeat (string :tag "Definition"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.15"))
-
-(flycheck-def-option-var flycheck-clang-include-path nil c/c++-clang
- "A list of include directories for Clang.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of Clang.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.14"))
-
-(flycheck-def-option-var flycheck-clang-includes nil c/c++-clang
- "A list of additional include files for Clang.
-
-The value of this variable is a list of strings, where each
-string is a file to include before syntax checking. Relative
-paths are relative to the file being checked."
- :type '(repeat (file :tag "Include file"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.15"))
-
-(flycheck-def-option-var flycheck-clang-language-standard nil c/c++-clang
- "The language standard to use in Clang.
-
-The value of this variable is either a string denoting a language
-standard, or nil, to use the default standard. When non-nil,
-pass the language standard via the `-std' option."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Language standard"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "0.15"))
-(make-variable-buffer-local 'flycheck-clang-language-standard)
-
-(flycheck-def-option-var flycheck-clang-ms-extensions nil c/c++-clang
- "Whether to enable Microsoft extensions to C/C++ in Clang.
-
-When non-nil, enable Microsoft extensions to C/C++ via
-`-fms-extensions'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.16"))
-
-(flycheck-def-option-var flycheck-clang-no-exceptions nil c/c++-clang
- "Whether to disable exceptions in Clang.
-
-When non-nil, disable exceptions for syntax checks, via
-`-fno-exceptions'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-clang-no-rtti nil c/c++-clang
- "Whether to disable RTTI in Clang.
-
-When non-nil, disable RTTI for syntax checks, via `-fno-rtti'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.15"))
-
-(flycheck-def-option-var flycheck-clang-pedantic nil c/c++-clang
- "Whether to warn about language extensions in Clang.
-
-For ISO C, follows the version specified by any -std option used.
-When non-nil, disable non-ISO extensions to C/C++ via
-`-pedantic'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.23"))
-
-(flycheck-def-option-var flycheck-clang-pedantic-errors nil c/c++-clang
- "Whether to error on language extensions in Clang.
-
-For ISO C, follows the version specified by any -std option used.
-When non-nil, disable non-ISO extensions to C/C++ via
-`-pedantic-errors'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.23"))
-
-(flycheck-def-option-var flycheck-clang-standard-library nil c/c++-clang
- "The standard library to use for Clang.
-
-The value of this variable is the name of a standard library as
-string, or nil to use the default standard library.
-
-Refer to the Clang manual at URL
-`http://clang.llvm.org/docs/UsersManual.html' for more
-information about the standard library."
- :type '(choice (const :tag "Default standard library" nil)
- (const "libc++")
- (const :tag "GNU libstdc++" "libstdc++")
- (string :tag "Library name"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "0.15"))
-
-(flycheck-def-option-var flycheck-clang-warnings '("all" "extra") c/c++-clang
- "A list of additional warnings to enable in Clang.
-
-The value of this variable is a list of strings, where each string
-is the name of a warning category to enable. By default, all
-recommended warnings and some extra warnings are enabled (as by
-`-Wall' and `-Wextra' respectively).
-
-Refer to the Clang manual at URL
-`http://clang.llvm.org/docs/UsersManual.html' for more
-information about warnings."
- :type '(choice (const :tag "No additional warnings" nil)
- (repeat :tag "Additional warnings"
- (string :tag "Warning name")))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.14"))
-
-(defun flycheck-c/c++-quoted-include-directory ()
- "Get the directory for quoted includes.
-
-C/C++ compilers typically look up includes with quotation marks
-in the directory of the file being compiled. However, since
-Flycheck uses temporary copies for syntax checking, it needs to
-explicitly determine the directory for quoted includes.
-
-This function determines the directory by looking at function
-`buffer-file-name', or if that is nil, at `default-directory'."
- (-if-let (fn (buffer-file-name))
- (file-name-directory fn)
- ;; If the buffer has no file name, fall back to its default directory
- default-directory))
-
-(flycheck-define-checker c/c++-clang
- "A C/C++ syntax checker using Clang.
-
-See URL `http://clang.llvm.org/'."
- :command ("clang"
- "-fsyntax-only"
- "-fno-color-diagnostics" ; Do not include color codes in output
- "-fno-caret-diagnostics" ; Do not visually indicate the source
- ; location
- "-fno-diagnostics-show-option" ; Do not show the corresponding
- ; warning group
- "-iquote" (eval (flycheck-c/c++-quoted-include-directory))
- (option "-std=" flycheck-clang-language-standard concat)
- (option-flag "-pedantic" flycheck-clang-pedantic)
- (option-flag "-pedantic-errors" flycheck-clang-pedantic-errors)
- (option "-stdlib=" flycheck-clang-standard-library concat)
- (option-flag "-fms-extensions" flycheck-clang-ms-extensions)
- (option-flag "-fno-exceptions" flycheck-clang-no-exceptions)
- (option-flag "-fno-rtti" flycheck-clang-no-rtti)
- (option-flag "-fblocks" flycheck-clang-blocks)
- (option-list "-include" flycheck-clang-includes)
- (option-list "-W" flycheck-clang-warnings concat)
- (option-list "-D" flycheck-clang-definitions concat)
- (option-list "-I" flycheck-clang-include-path)
- (eval flycheck-clang-args)
- "-x" (eval
- (pcase major-mode
- (`c++-mode "c++")
- (`c-mode "c")))
- ;; Read from standard input
- "-")
- :standard-input t
- :error-patterns
- ((info line-start (or "<stdin>" (file-name)) ":" line ":" column
- ": note: " (optional (message)) line-end)
- (warning line-start (or "<stdin>" (file-name)) ":" line ":" column
- ": warning: " (optional (message)) line-end)
- (error line-start (or "<stdin>" (file-name)) ":" line ":" column
- ": " (or "fatal error" "error") ": " (optional (message)) line-end))
- :error-filter
- (lambda (errors)
- (let ((errors (flycheck-sanitize-errors errors)))
- (dolist (err errors)
- ;; Clang will output empty messages for #error/#warning pragmas without
- ;; messages. We fill these empty errors with a dummy message to get
- ;; them past our error filtering
- (setf (flycheck-error-message err)
- (or (flycheck-error-message err) "no message")))
- errors))
- :modes (c-mode c++-mode)
- :next-checkers ((warning . c/c++-cppcheck)))
-
-(flycheck-def-args-var flycheck-gcc-args c/c++-gcc
- :package-version '(flycheck . "0.22"))
-
-(flycheck-def-option-var flycheck-gcc-definitions nil c/c++-gcc
- "Additional preprocessor definitions for GCC.
-
-The value of this variable is a list of strings, where each
-string is an additional definition to pass to GCC, via the `-D'
-option."
- :type '(repeat (string :tag "Definition"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gcc-include-path nil c/c++-gcc
- "A list of include directories for GCC.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of gcc.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gcc-includes nil c/c++-gcc
- "A list of additional include files for GCC.
-
-The value of this variable is a list of strings, where each
-string is a file to include before syntax checking. Relative
-paths are relative to the file being checked."
- :type '(repeat (file :tag "Include file"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gcc-language-standard nil c/c++-gcc
- "The language standard to use in GCC.
-
-The value of this variable is either a string denoting a language
-standard, or nil, to use the default standard. When non-nil,
-pass the language standard via the `-std' option."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Language standard"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "0.20"))
-(make-variable-buffer-local 'flycheck-gcc-language-standard)
-
-(flycheck-def-option-var flycheck-gcc-no-exceptions nil c/c++-gcc
- "Whether to disable exceptions in GCC.
-
-When non-nil, disable exceptions for syntax checks, via
-`-fno-exceptions'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gcc-no-rtti nil c/c++-gcc
- "Whether to disable RTTI in GCC.
-
-When non-nil, disable RTTI for syntax checks, via `-fno-rtti'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gcc-openmp nil c/c++-gcc
- "Whether to enable OpenMP in GCC.
-
-When non-nil, enable OpenMP for syntax checkers, via
-`-fopenmp'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.21"))
-
-(flycheck-def-option-var flycheck-gcc-pedantic nil c/c++-gcc
- "Whether to warn about language extensions in GCC.
-
-For ISO C, follows the version specified by any -std option used.
-When non-nil, disable non-ISO extensions to C/C++ via
-`-pedantic'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.23"))
-
-(flycheck-def-option-var flycheck-gcc-pedantic-errors nil c/c++-gcc
- "Whether to error on language extensions in GCC.
-
-For ISO C, follows the version specified by any -std option used.
-When non-nil, disable non-ISO extensions to C/C++ via
-`-pedantic-errors'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.23"))
-
-(flycheck-def-option-var flycheck-gcc-warnings '("all" "extra") c/c++-gcc
- "A list of additional warnings to enable in GCC.
-
-The value of this variable is a list of strings, where each string
-is the name of a warning category to enable. By default, all
-recommended warnings and some extra warnings are enabled (as by
-`-Wall' and `-Wextra' respectively).
-
-Refer to the gcc manual at URL
-`https://gcc.gnu.org/onlinedocs/gcc/' for more information about
-warnings."
- :type '(choice (const :tag "No additional warnings" nil)
- (repeat :tag "Additional warnings"
- (string :tag "Warning name")))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-define-checker c/c++-gcc
- "A C/C++ syntax checker using GCC.
-
-Requires GCC 4.4 or newer. See URL `https://gcc.gnu.org/'."
- :command ("gcc"
- "-fshow-column"
- "-iquote" (eval (flycheck-c/c++-quoted-include-directory))
- (option "-std=" flycheck-gcc-language-standard concat)
- (option-flag "-pedantic" flycheck-gcc-pedantic)
- (option-flag "-pedantic-errors" flycheck-gcc-pedantic-errors)
- (option-flag "-fno-exceptions" flycheck-gcc-no-exceptions)
- (option-flag "-fno-rtti" flycheck-gcc-no-rtti)
- (option-flag "-fopenmp" flycheck-gcc-openmp)
- (option-list "-include" flycheck-gcc-includes)
- (option-list "-W" flycheck-gcc-warnings concat)
- (option-list "-D" flycheck-gcc-definitions concat)
- (option-list "-I" flycheck-gcc-include-path)
- (eval flycheck-gcc-args)
- "-x" (eval
- (pcase major-mode
- (`c++-mode "c++")
- (`c-mode "c")))
- ;; GCC performs full checking only when actually compiling, so
- ;; `-fsyntax-only' is not enough. Just let it generate assembly
- ;; code.
- "-S" "-o" null-device
- ;; Read from standard input
- "-")
- :standard-input t
- :error-patterns
- ((info line-start (or "<stdin>" (file-name))
- ":" line (optional ":" column)
- ": note: " (message) line-end)
- (warning line-start (or "<stdin>" (file-name))
- ":" line (optional ":" column)
- ": warning: " (message (one-or-more (not (any "\n["))))
- (optional "[" (id (one-or-more not-newline)) "]") line-end)
- (error line-start (or "<stdin>" (file-name))
- ":" line (optional ":" column)
- ": " (or "fatal error" "error") ": " (message) line-end))
- :modes (c-mode c++-mode)
- :next-checkers ((warning . c/c++-cppcheck)))
-
-(flycheck-def-option-var flycheck-cppcheck-checks '("style") c/c++-cppcheck
- "Enabled checks for Cppcheck.
-
-The value of this variable is a list of strings, where each
-string is the name of an additional check to enable. By default,
-all coding style checks are enabled.
-
-See section \"Enable message\" in the Cppcheck manual at URL
-`http://cppcheck.sourceforge.net/manual.pdf', and the
-documentation of the `--enable' option for more information,
-including a list of supported checks."
- :type '(repeat :tag "Additional checks"
- (string :tag "Check name"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.14"))
-
-(flycheck-def-option-var flycheck-cppcheck-standards nil c/c++-cppcheck
- "The standards to use in cppcheck.
-
-The value of this variable is either a list of strings denoting
-the standards to use, or nil to pass nothing to cppcheck. When
-non-nil, pass the standards via one or more `--std=' options."
- :type '(choice (const :tag "Default" nil)
- (repeat :tag "Custom standards"
- (string :tag "Standard name")))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "28"))
-(make-variable-buffer-local 'flycheck-cppcheck-standards)
-
-(flycheck-def-option-var flycheck-cppcheck-suppressions-file nil c/c++-cppcheck
- "The suppressions file to use in cppcheck.
-
-The value of this variable is a file with the suppressions to
-use, or nil to pass nothing to cppcheck. When non-nil, pass the
-suppressions file via the `--suppressions-list=' option."
- :type '(choice (const :tag "Default" nil)
- (file :tag "Suppressions file"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-(make-variable-buffer-local 'flycheck-cppcheck-suppressions-file)
-
-(flycheck-def-option-var flycheck-cppcheck-suppressions nil c/c++-cppcheck
- "The suppressions to use in cppcheck.
-
-The value of this variable is either a list of strings denoting
-the suppressions to use, or nil to pass nothing to cppcheck.
-When non-nil, pass the suppressions via one or more `--suppress='
-options."
- :type '(choice (const :tag "Default" nil)
- (repeat :tag "Additional suppressions"
- (string :tag "Suppression")))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "28"))
-
-(flycheck-def-option-var flycheck-cppcheck-inconclusive nil c/c++-cppcheck
- "Whether to enable Cppcheck inconclusive checks.
-
-When non-nil, enable Cppcheck inconclusive checks. This allows Cppcheck to
-report warnings it's not certain of, but it may result in false positives.
-
-This will have no effect when using Cppcheck 1.53 and older."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.19"))
-
-(flycheck-def-option-var flycheck-cppcheck-include-path nil c/c++-cppcheck
- "A list of include directories for cppcheck.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of cppcheck.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-define-checker c/c++-cppcheck
- "A C/C++ checker using cppcheck.
-
-See URL `http://cppcheck.sourceforge.net/'."
- :command ("cppcheck" "--quiet" "--xml-version=2" "--inline-suppr"
- (option "--enable=" flycheck-cppcheck-checks concat
- flycheck-option-comma-separated-list)
- (option-flag "--inconclusive" flycheck-cppcheck-inconclusive)
- (option-list "-I" flycheck-cppcheck-include-path)
- (option-list "--std=" flycheck-cppcheck-standards concat)
- (option-list "--suppress=" flycheck-cppcheck-suppressions concat)
- (option "--suppressions-list="
- flycheck-cppcheck-suppressions-file concat)
- "-x" (eval
- (pcase major-mode
- (`c++-mode "c++")
- (`c-mode "c")))
- source)
- :error-parser flycheck-parse-cppcheck
- :modes (c-mode c++-mode))
-
-(flycheck-define-checker cfengine
- "A CFEngine syntax checker using cf-promises.
-
-See URL `https://cfengine.com/'."
- :command ("cf-promises" "-Wall" "-f"
- ;; We must stay in the same directory to resolve @include
- source-inplace)
- :error-patterns
- ((warning line-start (file-name) ":" line ":" column
- ": warning: " (message) line-end)
- (error line-start (file-name) ":" line ":" column
- ": error: " (message) line-end))
- :modes (cfengine-mode cfengine3-mode))
-
-(flycheck-def-option-var flycheck-foodcritic-tags nil chef-foodcritic
- "A list of tags to select for Foodcritic.
-
-The value of this variable is a list of strings where each string
-is a tag expression describing Foodcritic rules to enable or
-disable, via the `--tags' option. To disable a tag, prefix it
-with `~'."
- :type '(repeat :tag "Tags" (string :tag "Tag expression"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.23"))
-
-(flycheck-define-checker chef-foodcritic
- "A Chef cookbooks syntax checker using Foodcritic.
-
-See URL `http://www.foodcritic.io'."
- ;; Use `source-inplace' to allow resource discovery with relative paths.
- ;; foodcritic interprets these as relative to the source file, so we need to
- ;; stay within the source tree. See
- ;; https://github.com/flycheck/flycheck/pull/556
- :command ("foodcritic"
- (option-list "--tags" flycheck-foodcritic-tags)
- source-inplace)
- :error-patterns
- ((error line-start (id (one-or-more alnum)) ": "
- (message) ": " (file-name) ":" line line-end))
- :modes (enh-ruby-mode ruby-mode)
- :predicate
- (lambda ()
- (let ((parent-dir (file-name-directory
- (directory-file-name
- (expand-file-name default-directory)))))
- (or
- ;; Chef CookBook
- ;; http://docs.opscode.com/chef/knife.html#id38
- (locate-dominating-file parent-dir "recipes")
- ;; Knife Solo
- ;; http://matschaffer.github.io/knife-solo/#label-Init+command
- (locate-dominating-file parent-dir "cookbooks")))))
-
-(flycheck-define-checker coffee
- "A CoffeeScript syntax checker using coffee.
-
-See URL `https://coffeescript.org/'."
- ;; --print suppresses generation of compiled .js files
- :command ("coffee" "--compile" "--print" "--stdio")
- :standard-input t
- :error-patterns
- ((error line-start "[stdin]:" line ":" column
- ": error: " (message) line-end))
- :modes coffee-mode
- :next-checkers ((warning . coffee-coffeelint)))
-
-(flycheck-def-config-file-var flycheck-coffeelintrc coffee-coffeelint
- ".coffeelint.json")
-
-(flycheck-define-checker coffee-coffeelint
- "A CoffeeScript style checker using coffeelint.
-
-See URL `http://www.coffeelint.org/'."
- :command
- ("coffeelint"
- (config-file "--file" flycheck-coffeelintrc)
- "--stdin" "--reporter" "checkstyle")
- :standard-input t
- :error-parser flycheck-parse-checkstyle
- :error-filter (lambda (errors)
- (flycheck-remove-error-file-names
- "stdin" (flycheck-remove-error-ids
- (flycheck-sanitize-errors errors))))
- :modes coffee-mode)
-
-(defun flycheck-coq-error-filter (errors)
- "Sanitize Coq ERRORS and compute end-lines and end-columns."
- (flycheck-increment-error-columns errors)
- (dolist (err errors)
- (setf (flycheck-error-message err)
- (replace-regexp-in-string (rx (1+ (syntax whitespace)) line-end)
- "" (flycheck-error-message err)
- 'fixedcase 'literal))
- (-when-let* ((end-col (flycheck-error-end-column err)))
- ;; Coq reports an offset (potentially past eol), not an end column
- (let* ((line (flycheck-error-line err))
- (end-lc (save-excursion
- (flycheck-goto-line line)
- (goto-char (+ (point) (1- end-col)))
- (flycheck-line-column-at-point))))
- (setf (flycheck-error-end-line err) (car end-lc))
- (setf (flycheck-error-end-column err) (cdr end-lc)))))
- (flycheck-sanitize-errors errors))
-
-(flycheck-define-checker coq
- "A Coq syntax checker using the Coq compiler.
-
-See URL `https://coq.inria.fr/'."
- ;; We use coqtop in batch mode, because coqc is picky about file names.
- :command ("coqtop" "-batch" "-load-vernac-source" source)
- :error-patterns
- ((error line-start "File \"" (file-name) "\", line " line
- ", characters " column "-" end-column ":\n"
- (or "Syntax error:" "Error:")
- ;; Most Coq error messages span multiple lines, and end with a dot.
- ;; There are simple one-line messages, too, though.
- (message (or (and (one-or-more (or not-newline "\n")) ".")
- (one-or-more not-newline)))
- line-end))
- :error-filter flycheck-coq-error-filter
- :modes coq-mode)
-
-(flycheck-define-checker css-csslint
- "A CSS syntax and style checker using csslint.
-
-See URL `https://github.com/CSSLint/csslint'."
- :command ("csslint" "--format=checkstyle-xml" source)
- :error-parser flycheck-parse-checkstyle
- :error-filter flycheck-dequalify-error-ids
- :modes css-mode)
-
-(defconst flycheck-stylelint-args '("--formatter" "json")
- "Common arguments to stylelint invocations.")
-
-(flycheck-def-config-file-var flycheck-stylelintrc
- (css-stylelint scss-stylelint less-stylelint) nil)
-
-(flycheck-def-option-var flycheck-stylelint-quiet
- nil (css-stylelint scss-stylelint less-stylelint)
- "Whether to run stylelint in quiet mode.
-
-When non-nil, enable quiet mode, via `--quiet'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . 26))
-
-(defconst flycheck-stylelint-error-re
- (flycheck-rx-to-string
- '(: line-start (id (one-or-more word)) ": " (message) line-end)))
-
-(defun flycheck-parse-stylelint (output checker buffer)
- "Parse stylelint errors from OUTPUT.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-The CHECKER usually returns the errors as JSON.
-
-If the CHECKER throws an Error it returns an Error message with a stacktrace."
- (condition-case nil
- (flycheck-parse-stylelint-json output checker buffer)
-
- ;; The output could not be parsed as JSON
- (json-error
-
- ;; Extract a flycheck error from the output (with a regular expression)
- ;; For match-string 4/5 see flycheck-rx-message/flycheck-rx-id
- (when (string-match flycheck-stylelint-error-re output)
- (list (flycheck-error-new-at
- 1 nil 'error
- (match-string 4 output)
- :id (match-string 5 output)
- :checker checker
- :buffer buffer
- :filename (buffer-file-name buffer)))))))
-
-(defun flycheck-parse-stylelint-json (output checker buffer)
- "Parse stylelint JSON errors from OUTPUT.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `http://stylelint.io/developer-guide/formatters/' for information
-about the JSON format of stylelint."
- (let ((json-object-type 'plist))
-
- ;; stylelint returns a vector of result objects
- ;; Since we only passed one file, the first element is enough
- (let* ((stylelint-output (elt (json-read-from-string output) 0))
- (filename (buffer-file-name buffer))
-
- ;; Turn all deprecations into warnings
- (deprecations
- (mapcar (lambda (d)
- (flycheck-error-new-at
- 1 nil 'warning
- (plist-get d :text)
- :id "Deprecation Warning"
- :checker checker
- :buffer buffer
- :filename filename))
- (plist-get stylelint-output :deprecations)))
-
- ;; Turn all invalid options into errors
- (invalid-options
- (mapcar (lambda (io)
- (flycheck-error-new-at
- 1 nil 'error
- (plist-get io :text)
- :id "Invalid Option"
- :checker checker
- :buffer buffer
- :filename filename))
- (plist-get stylelint-output :invalidOptionWarnings)))
-
- ;; Read all linting warnings
- (warnings
- (mapcar (lambda (w)
- (flycheck-error-new-at
- (plist-get w :line) (plist-get w :column)
- (pcase (plist-get w :severity)
- (`"error" 'error)
- (`"warning" 'warning)
- ;; Default to info for unknown .severity
- (_ 'info))
- (plist-get w :text)
- :id (plist-get w :rule)
- :checker checker
- :buffer buffer
- :filename filename))
- (plist-get stylelint-output :warnings))))
-
- ;; Return the combined errors (deprecations, invalid options, warnings)
- (append deprecations invalid-options warnings))))
-
-(flycheck-define-checker css-stylelint
- "A CSS syntax and style checker using stylelint.
-
-See URL `http://stylelint.io/'."
- :command ("stylelint"
- (eval flycheck-stylelint-args)
- (option-flag "--quiet" flycheck-stylelint-quiet)
- (config-file "--config" flycheck-stylelintrc)
- "--stdin-filename" (eval (or (buffer-file-name) "style.css")))
- :standard-input t
- :error-parser flycheck-parse-stylelint
- :predicate flycheck-buffer-nonempty-p
- :modes (css-mode))
-
-(flycheck-def-option-var flycheck-cuda-language-standard nil cuda-nvcc
- "Our CUDA Language Standard."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Language standard"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-(make-variable-buffer-local 'flycheck-cuda-language-standard)
-
-(flycheck-def-option-var flycheck-cuda-includes nil cuda-nvcc
- "Our include directories to pass to nvcc."
- :type '(repeat (file :tag "Include file"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-
-(flycheck-def-option-var flycheck-cuda-definitions nil cuda-nvcc
- "Additional preprocessor definitions for nvcc.
-A list of strings to pass to cuda, a la flycheck-clang"
- :type '(repeat (string :tag "Definitions"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-
-(flycheck-def-option-var flycheck-cuda-include-path nil cuda-nvcc
- "A list of include directories for nvcc."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker cuda-nvcc
- "A CUDA C/C++ syntax checker using nvcc.
-
-See URL `https://developer.nvidia.com/cuda-llvm-compiler'."
- :command ("nvcc"
- "-c" ;; Compile Only
- "--output-file" "/dev/null" ;; avoid creating output .o
- "--x=cu" ;; explicitly specify it's a CUDA language file
- (option "-std=" flycheck-cuda-language-standard concat)
- (option-list "-include" flycheck-cuda-includes)
- (option-list "-D" flycheck-cuda-definitions concat)
- (option-list "-I" flycheck-cuda-include-path)
- source)
- :error-patterns
- ((error line-start
- (message "In file included from")
- " " (or "<stdin>" (file-name))
- ":" line ":" line-end)
- (error line-start (or "<stdin>" (file-name))
- "(" line "): error: " (message) line-end)
- (error line-start (or "<stdin>" (file-name))
- ":" line ":" column
- ": fatal error: " (optional (message)) line-end)
- (warning line-start (or "<stdin>" (file-name))
- "(" line "): warning: " (message) line-end))
- :modes cuda-mode)
-
-
-(flycheck-def-option-var flycheck-cwl-schema-path nil cwl
- "A path for the schema file for Common Workflow Language.
-
-The value of this variable is a string that denotes a path for
-the schema file of Common Workflow Language."
- :type '(choice (const :tag "None" nil)
- (file :tag "Schema file"))
- :safe #'flycheck-string-or-nil-p)
-
-(flycheck-define-checker cwl
- "A CWL syntax checker using Schema Salad validator.
-
-Requires Schema Salad 2.6.20171101113912 or newer.
-See URL `https://www.commonwl.org/v1.0/SchemaSalad.html'."
- :command ("schema-salad-tool"
- "--quiet"
- "--print-oneline"
- (eval flycheck-cwl-schema-path)
- source-inplace)
- :error-patterns
- ((error line-start
- (file-name) ":" line ":" column ":" (zero-or-more blank)
- (message (one-or-more not-newline))
- line-end))
- :modes cwl-mode)
-
-(defconst flycheck-d-module-re
- (rx "module" (one-or-more (syntax whitespace))
- (group (one-or-more (not (syntax whitespace))))
- (zero-or-more (syntax whitespace))
- ";")
- "Regular expression to match a D module declaration.")
-
-(defun flycheck-d-base-directory ()
- "Get the relative base directory path for this module."
- (let* ((file-name (buffer-file-name))
- (module-file (if (and file-name
- (string= (file-name-nondirectory file-name)
- "package.d"))
- (directory-file-name (file-name-directory file-name))
- file-name)))
- (flycheck-module-root-directory
- (flycheck-find-in-buffer flycheck-d-module-re)
- module-file)))
-
-(flycheck-def-option-var flycheck-dmd-include-path nil d-dmd
- "A list of include directories for dmd.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of dmd.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.18"))
-
-(flycheck-def-args-var flycheck-dmd-args d-dmd
- :package-version '(flycheck . "0.24"))
-
-(flycheck-define-checker d-dmd
- "A D syntax checker using the DMD compiler.
-
-Requires DMD 2.066 or newer. See URL `https://dlang.org/'."
- :command ("dmd"
- "-debug" ; Compile in debug mode
- "-o-" ; Don't generate an object file
- "-vcolumns" ; Add columns in output
- "-wi" ; Compilation will continue even if there are warnings
- (eval (concat "-I" (flycheck-d-base-directory)))
- (option-list "-I" flycheck-dmd-include-path concat)
- (eval flycheck-dmd-args)
- (source ".d"))
- :error-patterns
- ((error line-start
- (file-name) "(" line "," column "): Error: " (message)
- line-end)
- (warning line-start (file-name) "(" line "," column "): "
- (or "Warning" "Deprecation") ": " (message) line-end)
- (info line-start (file-name) "(" line "," column "): "
- (one-or-more " ") (message) line-end))
- :modes d-mode)
-
-(flycheck-define-checker dockerfile-hadolint
- "A Dockerfile syntax checker using the hadolint.
-
-See URL `http://github.com/hadolint/hadolint/'."
- :command ("hadolint" "-")
- :standard-input t
- :error-patterns
- ((error line-start
- (file-name) ":" line ":" column " " (message)
- line-end)
- (warning line-start
- (file-name) ":" line " " (id (one-or-more alnum)) " " (message)
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-remove-error-file-names "/dev/stdin" errors)))
- :modes dockerfile-mode)
-
-(defun flycheck-credo--working-directory (&rest _ignored)
- "Check if `credo' is installed as dependency in the application."
- (and buffer-file-name
- (locate-dominating-file buffer-file-name "deps/credo")))
-
-(flycheck-def-option-var flycheck-elixir-credo-strict nil elixir-credo
- "Enable strict mode in `credo'.
-
-When non-nil, pass the `--strict' flag to credo."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker elixir-credo
- "An Elixir checker for static code analysis using Credo.
-
-See `http://credo-ci.org/'."
- :command ("mix" "credo"
- (option-flag "--strict" flycheck-elixir-credo-strict)
- "--format" "flycheck"
- "--read-from-stdin" source-original)
- :standard-input t
- :working-directory flycheck-credo--working-directory
- :enabled flycheck-credo--working-directory
- :error-patterns
- ((info line-start
- (file-name) ":" line (optional ":" column) ": "
- (or "F" "R" "C") ": " (message) line-end)
- (warning line-start
- (file-name) ":" line (optional ":" column) ": "
- (or "D" "W") ": " (message) line-end))
- :modes elixir-mode)
-
-(defconst flycheck-this-emacs-executable
- (concat invocation-directory invocation-name)
- "The path to the currently running Emacs executable.")
-
-(defconst flycheck-emacs-args '("-Q" "--batch")
- "Common arguments to Emacs invocations.")
-
-(defmacro flycheck-prepare-emacs-lisp-form (&rest body)
- "Prepare BODY for use as check form in a subprocess."
- (declare (indent 0))
- `(flycheck-sexp-to-string
- '(progn
- (defvar jka-compr-inhibit)
- (unwind-protect
- ;; Flycheck inhibits compression of temporary files, thus we
- ;; must not attempt to decompress.
- (let ((jka-compr-inhibit t))
- ;; Strip option-argument separator from arguments, if present
- (when (equal (car command-line-args-left) "--")
- (setq command-line-args-left (cdr command-line-args-left)))
- ,@body)
- ;; Prevent Emacs from processing the arguments on its own, see
- ;; https://github.com/flycheck/flycheck/issues/319
- (setq command-line-args-left nil)))))
-
-(defun flycheck-emacs-lisp-bytecomp-config-form ()
- "Prepare an Emacs Lisp form to set byte-compiler variables."
- (flycheck-sexp-to-string
- `(progn
- (require 'bytecomp)
- (setq byte-compile-root-dir
- ,(if buffer-file-name
- (file-name-directory buffer-file-name)
- default-directory)))))
-
-(defconst flycheck-emacs-lisp-check-form
- (flycheck-prepare-emacs-lisp-form
- ;; Keep track of the generated bytecode files, to delete them after byte
- ;; compilation.
- (require 'bytecomp)
- (defvar flycheck-byte-compiled-files nil)
- (let ((byte-compile-dest-file-function
- (lambda (source)
- (let ((temp-file (make-temp-file (file-name-nondirectory source))))
- (push temp-file flycheck-byte-compiled-files)
- temp-file))))
- (unwind-protect
- (byte-compile-file (car command-line-args-left))
- (mapc (lambda (f) (ignore-errors (delete-file f)))
- flycheck-byte-compiled-files))
- (when (bound-and-true-p flycheck-emacs-lisp-check-declare)
- (check-declare-file (car command-line-args-left))))))
-
-(flycheck-def-option-var flycheck-emacs-lisp-load-path nil emacs-lisp
- "Load path to use in the Emacs Lisp syntax checker.
-
-When set to `inherit', use the `load-path' of the current Emacs
-session during syntax checking.
-
-When set to a list of strings, add each directory in this list to
-the `load-path' before invoking the byte compiler. Relative
-paths in this list are expanded against the `default-directory'
-of the buffer to check.
-
-When nil, do not explicitly set the `load-path' during syntax
-checking. The syntax check only uses the built-in `load-path' of
-Emacs in this case.
-
-Note that changing this variable can lead to wrong results of the
-syntax check, e.g. if an unexpected version of a required library
-is used."
- :type '(choice (const :tag "Inherit current `load-path'" inherit)
- (repeat :tag "Load path" directory))
- :risky t
- :package-version '(flycheck . "0.14"))
-
-(flycheck-def-option-var flycheck-emacs-lisp-initialize-packages
- 'auto emacs-lisp
- "Whether to initialize packages in the Emacs Lisp syntax checker.
-
-When nil, never initialize packages. When `auto', initialize
-packages only when checking `user-init-file' or files from
-`user-emacs-directory'. For any other non-nil value, always
-initialize packages.
-
-When initializing packages is enabled the `emacs-lisp' syntax
-checker calls `package-initialize' before byte-compiling the file
-to be checked. It also sets `package-user-dir' according to
-`flycheck-emacs-lisp-package-user-dir'."
- :type '(choice (const :tag "Do not initialize packages" nil)
- (const :tag "Initialize packages for configuration only" auto)
- (const :tag "Always initialize packages" t))
- :risky t
- :package-version '(flycheck . "0.14"))
-
-(defconst flycheck-emacs-lisp-package-initialize-form
- (flycheck-sexp-to-string
- '(with-demoted-errors "Error during package initialization: %S"
- (package-initialize)))
- "Form used to initialize packages.")
-
-(defun flycheck-option-emacs-lisp-package-initialize (value)
- "Option VALUE filter for `flycheck-emacs-lisp-initialize-packages'."
- (let ((shall-initialize
- (if (eq value 'auto)
- (or (flycheck-in-user-emacs-directory-p
- (or buffer-file-name default-directory))
- ;; `user-init-file' is nil in non-interactive sessions. Now,
- ;; no user would possibly use Flycheck in a non-interactive
- ;; session, but our unit tests run non-interactively, so we
- ;; have to handle this case anyway
- (and user-init-file buffer-file-name
- (flycheck-same-files-p buffer-file-name user-init-file)))
- value)))
- (when shall-initialize
- ;; If packages shall be initialized, return the corresponding form,
- ;; otherwise make Flycheck ignore the option by returning nil.
- flycheck-emacs-lisp-package-initialize-form)))
-
-(flycheck-def-option-var flycheck-emacs-lisp-package-user-dir nil emacs-lisp
- "Package directory for the Emacs Lisp syntax checker.
-
-If set to a string set `package-user-dir' to the value of this
-variable before initializing packages. If set to nil just inherit
-the value of `package-user-dir' from the running Emacs session.
-
-This variable has no effect, if
-`flycheck-emacs-lisp-initialize-packages' is nil."
- :type '(choice (const :tag "Default package directory" nil)
- (directory :tag "Custom package directory"))
- :risky t
- :package-version '(flycheck . "0.14"))
-
-(defun flycheck-option-emacs-lisp-package-user-dir (value)
- "Option VALUE filter for `flycheck-emacs-lisp-package-user-dir'."
- ;; Inherit the package directory from our Emacs session
- (let ((value (or value (bound-and-true-p package-user-dir))))
- (when value
- (flycheck-sexp-to-string `(setq package-user-dir ,value)))))
-
-(flycheck-def-option-var flycheck-emacs-lisp-check-declare nil emacs-lisp
- "If non-nil, check ‘declare-function’ forms using ‘check-declare-file’."
- :type '(choice (const :tag "Do not check declare forms" nil)
- (const :tag "Check declare forms" t))
- :risky t
- :package-version '(flycheck . "31"))
-
-(defun flycheck-option-emacs-lisp-check-declare (value)
- "Option VALUE filter for `flycheck-emacs-lisp-check-declare'."
- (when value
- (flycheck-sexp-to-string
- `(progn
- (defvar flycheck-emacs-lisp-check-declare)
- (setq flycheck-emacs-lisp-check-declare ,value)))))
-
-(defun flycheck--emacs-lisp-enabled-p ()
- "Check whether to enable Emacs Lisp checkers in the current buffer."
- (not
- (or
- ;; Do not check buffers used for autoloads generation during package
- ;; installation. These buffers are too short-lived for being checked, and
- ;; doing so causes spurious errors. See
- ;; https://github.com/flycheck/flycheck/issues/45 and
- ;; https://github.com/bbatsov/prelude/issues/248. We must also not check
- ;; compilation buffers, but as these are ephemeral, Flycheck won't check
- ;; them anyway.
- (flycheck-autoloads-file-p)
- ;; Cask/Carton and dir-locals files contain data, not code, and don't need
- ;; to follow Checkdoc conventions either.
- (and (buffer-file-name)
- (member (file-name-nondirectory (buffer-file-name))
- '("Cask" "Carton" ".dir-locals.el" ".dir-locals-2.el"))))))
-
-(flycheck-define-checker emacs-lisp
- "An Emacs Lisp syntax checker using the Emacs Lisp Byte compiler.
-
-See Info Node `(elisp)Byte Compilation'."
- :command ("emacs" (eval flycheck-emacs-args)
- (eval
- (let ((path (pcase flycheck-emacs-lisp-load-path
- (`inherit load-path)
- (p (seq-map #'expand-file-name p)))))
- (flycheck-prepend-with-option "--directory" path)))
- (option "--eval" flycheck-emacs-lisp-package-user-dir nil
- flycheck-option-emacs-lisp-package-user-dir)
- (option "--eval" flycheck-emacs-lisp-initialize-packages nil
- flycheck-option-emacs-lisp-package-initialize)
- (option "--eval" flycheck-emacs-lisp-check-declare nil
- flycheck-option-emacs-lisp-check-declare)
- "--eval" (eval (flycheck-emacs-lisp-bytecomp-config-form))
- "--eval" (eval flycheck-emacs-lisp-check-form)
- "--"
- source-inplace)
- :error-patterns
- ((error line-start (file-name) ":" line ":" column ":"
- (zero-or-more whitespace) "Error:" (zero-or-more whitespace)
- (message (zero-or-more not-newline)
- (zero-or-more "\n " (zero-or-more not-newline)))
- line-end)
- (warning line-start (file-name) ":" line ":" column ":"
- (zero-or-more whitespace) "Warning:" (zero-or-more whitespace)
- (message (zero-or-more not-newline)
- (zero-or-more "\n " (zero-or-more not-newline)))
- line-end)
- (warning line-start (file-name) ":" line (optional ":" column) ":"
- (zero-or-more whitespace) "Warning (check-declare): said\n"
- (message (zero-or-more " " (zero-or-more not-newline))
- (zero-or-more "\n " (zero-or-more not-newline)))
- line-end)
- ;; The following is for Emacs 24 ‘check-declare-file’, which uses a
- ;; less informative format.
- (warning line-start "Warning (check-declare): " (file-name) " said "
- (message (zero-or-more not-newline))
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-fill-empty-line-numbers
- (flycheck-collapse-error-message-whitespace
- (flycheck-sanitize-errors errors))))
- :modes (emacs-lisp-mode lisp-interaction-mode)
- :enabled flycheck--emacs-lisp-enabled-p
- :predicate
- (lambda ()
- ;; Do not check buffers that should not be byte-compiled. The checker
- ;; process will refuse to compile these, which would confuse Flycheck
- (not (bound-and-true-p no-byte-compile)))
- :next-checkers (emacs-lisp-checkdoc))
-
-(defconst flycheck-emacs-lisp-checkdoc-form
- (flycheck-prepare-emacs-lisp-form
- (unless (require 'elisp-mode nil 'no-error)
- ;; TODO: Fallback for Emacs 24, remove when dropping support for 24
- (require 'lisp-mode))
- (require 'checkdoc)
-
- (let ((source (car command-line-args-left))
- ;; Remember the default directory of the process
- (process-default-directory default-directory))
- ;; Note that we deliberately use our custom approach even despite of
- ;; `checkdoc-file' which was added to Emacs 25.1. While it's conceptually
- ;; the better thing, its implementation has too many flaws to be of use
- ;; for us.
- (with-temp-buffer
- (insert-file-contents source 'visit)
- (setq buffer-file-name source)
- ;; And change back to the process default directory to make file-name
- ;; back-substutition work
- (setq default-directory process-default-directory)
- (with-demoted-errors "Error in checkdoc: %S"
- ;; Checkdoc needs the Emacs Lisp syntax table and comment syntax to
- ;; parse sexps and identify docstrings correctly; see
- ;; https://github.com/flycheck/flycheck/issues/833
- (delay-mode-hooks (emacs-lisp-mode))
- (setq delayed-mode-hooks nil)
- (checkdoc-current-buffer t)
- (with-current-buffer checkdoc-diagnostic-buffer
- (princ (buffer-substring-no-properties (point-min) (point-max)))
- (kill-buffer)))))))
-
-(defconst flycheck-emacs-lisp-checkdoc-variables
- '(checkdoc-symbol-words
- checkdoc-arguments-in-order-flag
- checkdoc-force-history-flag
- checkdoc-permit-comma-termination-flag
- checkdoc-force-docstrings-flag
- checkdoc-package-keywords-flag
- checkdoc-spellcheck-documentation-flag
- checkdoc-verb-check-experimental-flag
- checkdoc-max-keyref-before-warn
- sentence-end-double-space)
- "Variables inherited by the checkdoc subprocess.")
-
-(defun flycheck-emacs-lisp-checkdoc-variables-form ()
- "Make a sexp to pass relevant variables to a checkdoc subprocess.
-
-Variables are taken from `flycheck-emacs-lisp-checkdoc-variables'."
- `(progn
- ,@(seq-map (lambda (opt) `(setq-default ,opt ',(symbol-value opt)))
- (seq-filter #'boundp flycheck-emacs-lisp-checkdoc-variables))))
-
-(flycheck-define-checker emacs-lisp-checkdoc
- "An Emacs Lisp style checker using CheckDoc.
-
-The checker runs `checkdoc-current-buffer'."
- :command ("emacs" (eval flycheck-emacs-args)
- "--eval" (eval (flycheck-sexp-to-string
- (flycheck-emacs-lisp-checkdoc-variables-form)))
- "--eval" (eval flycheck-emacs-lisp-checkdoc-form)
- "--" source)
- :error-patterns
- ((info line-start (file-name) ":" line ": " (message) line-end))
- :modes (emacs-lisp-mode)
- :enabled flycheck--emacs-lisp-enabled-p)
-
-(dolist (checker '(emacs-lisp emacs-lisp-checkdoc))
- (setf (car (flycheck-checker-get checker 'command))
- flycheck-this-emacs-executable))
-
-(defun flycheck-ember-template--check-for-config (&rest _ignored)
- "Check the required config file is available up the file system."
- (and buffer-file-name
- (locate-dominating-file buffer-file-name ".template-lintrc.js")))
-
-(defun flycheck-ember-template--parse-error (output checker buffer)
- "Parse Ember-template-lint errors/warnings from JSON OUTPUT.
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively."
- (mapcar (lambda (err)
- (let-alist err
- (flycheck-error-new-at
- .line
- .column
- (pcase .severity
- (2 'error)
- (1 'warning)
- (_ 'warning))
- .message
- :id .rule
- :checker checker
- :buffer buffer
- :filename (buffer-file-name buffer))))
- (cdr (car (car (flycheck-parse-json output))))))
-
-(flycheck-def-config-file-var flycheck-ember-template-lintrc
- ember-template
- ".template-lintrc.js")
-
-(flycheck-define-checker ember-template
- "An Ember template checker using ember-template-lint."
- :command ("ember-template-lint"
- (config-file "--config-path" flycheck-ember-template-lintrc)
- "--filename" source-original
- "--json")
- :standard-input t
- :error-parser flycheck-ember-template--parse-error
- :modes web-mode
- :enabled flycheck-ember-template--check-for-config
- :working-directory flycheck-ember-template--check-for-config)
-
-(flycheck-def-option-var flycheck-erlang-include-path nil erlang
- "A list of include directories for Erlang.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of erlc.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-def-option-var flycheck-erlang-library-path nil erlang
- "A list of library directories for Erlang.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the library path of erlc.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Library directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-define-checker erlang
- "An Erlang syntax checker using the Erlang interpreter.
-
-See URL `http://www.erlang.org/'."
- :command ("erlc"
- "-o" temporary-directory
- (option-list "-I" flycheck-erlang-include-path)
- (option-list "-pa" flycheck-erlang-library-path)
- "-Wall"
- source)
- :error-patterns
- ((warning line-start (file-name) ":" line ": Warning:" (message) line-end)
- (error line-start (file-name) ":" line ": " (message) line-end))
- :modes erlang-mode
- :enabled (lambda () (string-suffix-p ".erl" (buffer-file-name))))
-
-(defun flycheck--contains-rebar-config (dir-name)
- "Return DIR-NAME if rebar config file exists in DIR-NAME, nil otherwise."
- (when (or (file-exists-p (expand-file-name "rebar.config" dir-name))
- (file-exists-p (expand-file-name "rebar.config.script" dir-name)))
- dir-name))
-
-(defun flycheck--locate-rebar3-project-root
- (file-name &optional prev-file-name acc)
- "Find the top-most rebar project root for source FILE-NAME.
-
-A project root directory is any directory containing a
-rebar.config file. Find the top-most directory to move out of any
-nested dependencies.
-
-FILE-NAME is a source file for which to find the project.
-
-PREV-FILE-NAME helps us prevent infinite looping
-
-ACC is an accumulator that keeps the list of results, the first
-non-nil of which will be our project root.
-
-Return the absolute path to the directory"
- (if (string= file-name prev-file-name)
- (car (remove nil acc))
- (let ((current-dir (file-name-directory file-name)))
- (flycheck--locate-rebar3-project-root
- (directory-file-name current-dir)
- file-name
- (cons (flycheck--contains-rebar-config current-dir) acc)))))
-
-(defun flycheck-rebar3-project-root (&optional _checker)
- "Return directory where rebar.config is located."
- (flycheck--locate-rebar3-project-root buffer-file-name))
-
-(flycheck-def-option-var flycheck-erlang-rebar3-profile nil erlang-rebar3
- "The rebar3 profile to use.
-
-The profile used when compiling, if VALUE is nil \"test\" will be used
-when the file is located in test directory, otherwise \"default\" will be
-used as profile."
- :type '(choice (const :tag "Automatic" nil)
- (string :tag "Profile"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-
-(defun flycheck-erlang-rebar3-get-profile ()
- "Return rebar3 profile.
-
-Use flycheck-erlang-rebar3-profile if set, otherwise use test or eqc profile if
-directory name is \"test\" or \"eqc\", or else \"default\"."
- (or
- flycheck-erlang-rebar3-profile
- (with-no-warnings
- ;; `seq-contains-p' is only in seq >= 2.21
- (seq-contains '("test" "eqc")
- (and buffer-file-name
- (file-name-base
- (directory-file-name
- (file-name-directory buffer-file-name))))))
- "default"))
-
-(flycheck-define-checker erlang-rebar3
- "An Erlang syntax checker using the rebar3 build tool."
- :command ("rebar3" "as" (eval (flycheck-erlang-rebar3-get-profile)) "compile")
- :error-parser flycheck-parse-with-patterns-without-color
- :error-patterns
- ((warning line-start
- (file-name) ":" line ": Warning:" (message) line-end)
- (error line-start
- (file-name) ":" line ": " (message) line-end))
- :modes erlang-mode
- :enabled flycheck-rebar3-project-root
- :predicate flycheck-buffer-saved-p
- :working-directory flycheck-rebar3-project-root)
-
-(flycheck-define-checker eruby-erubis
- "An eRuby syntax checker using the `erubis' command.
-
-See URL `http://www.kuwata-lab.com/erubis/'."
- :command ("erubis" "-z" source)
- :error-patterns
- ((error line-start (file-name) ":" line ": " (message) line-end))
- :modes (html-erb-mode rhtml-mode)
- :next-checkers ((warning . eruby-ruumba)))
-
-(flycheck-def-config-file-var flycheck-ruumbarc eruby-ruumba ".ruumba.yml")
-
-(flycheck-def-option-var flycheck-ruumba-lint-only nil eruby-ruumba
- "Whether to only report code issues in Ruumba.
-
-When non-nil, only report code issues in Ruumba, via `--lint'.
-Otherwise report style issues as well."
- :safe #'booleanp
- :type 'boolean
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker eruby-ruumba
- "An eRuby syntax and style checker using the Ruumba tool.
-
-You need at least Ruumba 0.1.7 for this syntax checker.
-
-See URL `https://github.com/ericqweinstein/ruumba'."
- :command ("ruumba"
- "--display-cop-names"
- "--force-exclusion"
- "--format" "emacs"
- "--cache" "false"
- (config-file "--config" flycheck-ruumbarc)
- (option-flag "--lint" flycheck-ruumba-lint-only)
- ;; Ruumba takes the original file name as argument when reading
- ;; from standard input
- "--stdin" source-original)
- :standard-input t
- :working-directory flycheck-ruby--find-project-root
- :error-patterns
- ((info line-start (file-name) ":" line ":" column ": C: "
- (optional (id (one-or-more (not (any ":")))) ": ") (message) line-end)
- (warning line-start (file-name) ":" line ":" column ": W: "
- (optional (id (one-or-more (not (any ":")))) ": ") (message)
- line-end)
- (error line-start (file-name) ":" line ":" column ": " (or "E" "F") ": "
- (optional (id (one-or-more (not (any ":")))) ": ") (message)
- line-end))
- :modes (html-erb-mode rhtml-mode))
-
-(flycheck-def-args-var flycheck-gfortran-args fortran-gfortran
- :package-version '(flycheck . "0.22"))
-
-(flycheck-def-option-var flycheck-gfortran-include-path nil fortran-gfortran
- "A list of include directories for GCC Fortran.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of gcc.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gfortran-language-standard "f95"
- fortran-gfortran
- "The language standard to use in GFortran.
-
-The value of this variable is either a string denoting a language
-standard, or nil, to use the default standard. When non-nil,
-pass the language standard via the `-std' option."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Language standard"))
- :package-version '(flycheck . "0.20"))
-
-(flycheck-def-option-var flycheck-gfortran-layout nil fortran-gfortran
- "The source code layout to use in GFortran.
-
-The value of this variable is one of the following symbols:
-
-nil
- Let gfortran determine the layout from the extension
-
-`free'
- Use free form layout
-
-
-`fixed'
- Use fixed form layout
-
-In any other case, an error is signaled."
- :type '(choice (const :tag "Guess layout from extension" nil)
- (const :tag "Free form layout" free)
- (const :tag "Fixed form layout" fixed))
- :safe (lambda (value) (or (not value) (memq value '(free fixed))))
- :package-version '(flycheck . "0.20"))
-
-(defun flycheck-option-gfortran-layout (value)
- "Option VALUE filter for `flycheck-gfortran-layout'."
- (pcase value
- (`nil nil)
- (`free "free-form")
- (`fixed "fixed-form")
- (_ (error "Invalid value for flycheck-gfortran-layout: %S" value))))
-
-(flycheck-def-option-var flycheck-gfortran-warnings '("all" "extra")
- fortran-gfortran
- "A list of warnings for GCC Fortran.
-
-The value of this variable is a list of strings, where each string
-is the name of a warning category to enable. By default, all
-recommended warnings and some extra warnings are enabled (as by
-`-Wall' and `-Wextra' respectively).
-
-Refer to the gfortran manual at URL
-`https://gcc.gnu.org/onlinedocs/gfortran/' for more information
-about warnings"
- :type '(choice (const :tag "No additional warnings" nil)
- (repeat :tag "Additional warnings"
- (string :tag "Warning name")))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.20"))
-
-(flycheck-define-checker fortran-gfortran
- "An Fortran syntax checker using GCC.
-
-Uses GCC's Fortran compiler gfortran. See URL
-`https://gcc.gnu.org/onlinedocs/gfortran/'."
- :command ("gfortran"
- "-fsyntax-only"
- "-fshow-column"
- ;; Do not visually indicate the source location
- "-fno-diagnostics-show-caret"
- ;; Do not show the corresponding warning group
- "-fno-diagnostics-show-option"
- ;; Fortran has similar include processing as C/C++
- "-iquote" (eval (flycheck-c/c++-quoted-include-directory))
- (option "-std=" flycheck-gfortran-language-standard concat)
- (option "-f" flycheck-gfortran-layout concat
- flycheck-option-gfortran-layout)
- (option-list "-W" flycheck-gfortran-warnings concat)
- (option-list "-I" flycheck-gfortran-include-path concat)
- (eval flycheck-gfortran-args)
- source)
- :error-patterns
- ((error line-start (file-name) ":" line (or ":" ".") column (or ": " ":\n")
- (or (= 3 (zero-or-more not-newline) "\n") "")
- (or "Error" "Fatal Error") ": "
- (message) line-end)
- (warning line-start (file-name) ":" line (or ":" ".") column (or ": " ":\n")
- (or (= 3 (zero-or-more not-newline) "\n") "")
- "Warning: " (message) line-end))
- :modes (fortran-mode f90-mode))
-
-(flycheck-define-checker go-gofmt
- "A Go syntax and style checker using the gofmt utility.
-
-See URL `https://golang.org/cmd/gofmt/'."
- :command ("gofmt")
- :standard-input t
- :error-patterns
- ((error line-start "<standard input>:" line ":" column ": "
- (message) line-end))
- :modes go-mode
- :next-checkers ((warning . go-golint)
- ;; Fall back, if go-golint doesn't exist
- (warning . go-vet)
- ;; Fall back, if go-vet doesn't exist
- (warning . go-build) (warning . go-test)
- (warning . go-errcheck)
- (warning . go-unconvert)
- (warning . go-staticcheck)))
-
-(flycheck-define-checker go-golint
- "A Go style checker using Golint.
-
-See URL `https://github.com/golang/lint'."
- :command ("golint" source)
- :error-patterns
- ((warning line-start (file-name) ":" line ":" column ": " (message) line-end))
- :modes go-mode
- :next-checkers (go-vet
- ;; Fall back, if go-vet doesn't exist
- go-build go-test go-errcheck go-unconvert))
-
-(flycheck-def-option-var flycheck-go-vet-print-functions nil go-vet
- "A list of print-like functions for `go vet'.
-
-Go vet will check these functions for format string problems and
-issues, such as a mismatch between the number of formats used,
-and the number of arguments given.
-
-Each entry is in the form Name:N where N is the zero-based
-argument position of the first argument involved in the print:
-either the format or the first print argument for non-formatted
-prints. For example, if you have Warn and Warnf functions that
-take an io.Writer as their first argument, like Fprintf,
--printfuncs=Warn:1,Warnf:1 "
- :type '(repeat :tag "print-like functions"
- (string :tag "function"))
- :safe #'flycheck-string-list-p)
-
-(flycheck-define-checker go-vet
- "A Go syntax checker using the `go vet' command.
-
-See URL `https://golang.org/cmd/go/' and URL
-`https://golang.org/cmd/vet/'."
- :command ("go" "vet"
- (option "-printf.funcs=" flycheck-go-vet-print-functions concat
- flycheck-option-comma-separated-list)
- (source ".go"))
- :error-patterns
- ((warning line-start (file-name) ":" line ": " (message) line-end))
- :modes go-mode
- :next-checkers (go-build
- go-test
- ;; Fall back if `go build' or `go test' can be used
- go-errcheck
- go-unconvert
- go-staticcheck)
- :verify (lambda (_)
- (let* ((go (flycheck-checker-executable 'go-vet))
- (have-vet (member "vet" (ignore-errors
- (process-lines go "tool")))))
- (list
- (flycheck-verification-result-new
- :label "go tool vet"
- :message (if have-vet "present" "missing")
- :face (if have-vet 'success '(bold error)))))))
-
-(flycheck-def-option-var flycheck-go-build-install-deps nil (go-build go-test)
- "Whether to install dependencies in `go build' and `go test'.
-
-If non-nil automatically install dependencies with `go build'
-while syntax checking."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.25"))
-
-(flycheck-def-option-var flycheck-go-build-tags nil
- (go-build go-test go-errcheck go-staticcheck)
- "A list of tags for `go build'.
-
-Each item is a string with a tag to be given to `go build'."
- :type '(repeat (string :tag "Tag"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.25"))
-
-
-(flycheck-def-option-var flycheck-go-version nil go-staticcheck
- "The version of go that should be targeted by `staticcheck'.
-
-Should be a string representing a version, like 1.6 or 1.11.4.
-See `https://staticcheck.io/docs/#targeting-go-versions' for
-details."
- :type '(choice (const :tag "Unspecified" nil)
- (string :tag "Version"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "0.32"))
-
-(flycheck-define-checker go-build
- "A Go syntax and type checker using the `go build' command.
-
-Requires Go 1.6 or newer. See URL `https://golang.org/cmd/go'."
- :command ("go" "build"
- (option-flag "-i" flycheck-go-build-install-deps)
- ;; multiple tags are listed as "dev debug ..."
- (option-list "-tags=" flycheck-go-build-tags concat)
- "-o" null-device)
- :error-patterns
- ((error line-start (file-name) ":" line ":"
- (optional column ":") " "
- (message (one-or-more not-newline)
- (zero-or-more "\n\t" (one-or-more not-newline)))
- line-end)
- ;; Catch error message about multiple packages in a directory, which doesn't
- ;; follow the standard error message format.
- (info line-start
- (message "can't load package: package "
- (one-or-more (not (any ?: ?\n)))
- ": found packages "
- (one-or-more not-newline))
- line-end))
- :error-filter
- (lambda (errors)
- (dolist (error errors)
- (unless (flycheck-error-line error)
- ;; Flycheck ignores errors without line numbers, but the error
- ;; message about multiple packages in a directory doesn't come with a
- ;; line number, so inject a fake one.
- (setf (flycheck-error-line error) 1)))
- errors)
- :modes go-mode
- :predicate (lambda ()
- (and (flycheck-buffer-saved-p)
- (not (string-suffix-p "_test.go" (buffer-file-name)))))
- :next-checkers ((warning . go-errcheck)
- (warning . go-unconvert)
- (warning . go-staticcheck)))
-
-(flycheck-define-checker go-test
- "A Go syntax and type checker using the `go test' command.
-
-Requires Go 1.6 or newer. See URL `https://golang.org/cmd/go'."
- :command ("go" "test"
- (option-flag "-i" flycheck-go-build-install-deps)
- (option-list "-tags=" flycheck-go-build-tags concat)
- "-c" "-o" null-device)
- :error-patterns
- ((error line-start (file-name) ":" line ":"
- (optional column ":") " "
- (message (one-or-more not-newline)
- (zero-or-more "\n\t" (one-or-more not-newline)))
- line-end))
- :modes go-mode
- :predicate
- (lambda () (and (flycheck-buffer-saved-p)
- (string-suffix-p "_test.go" (buffer-file-name))))
- :next-checkers ((warning . go-errcheck)
- (warning . go-unconvert)
- (warning . go-staticcheck)))
-
-(flycheck-define-checker go-errcheck
- "A Go checker for unchecked errors.
-
-Requires errcheck newer than commit 8515d34 (Aug 28th, 2015).
-
-See URL `https://github.com/kisielk/errcheck'."
- :command ("errcheck"
- "-abspath"
- (option-list "-tags=" flycheck-go-build-tags concat)
- ".")
- :error-patterns
- ((warning line-start
- (file-name) ":" line ":" column (or (one-or-more "\t") ": " ":\t")
- (message)
- line-end))
- :error-filter
- (lambda (errors)
- (let ((errors (flycheck-sanitize-errors errors)))
- (dolist (err errors)
- (-when-let (message (flycheck-error-message err))
- ;; Improve the messages reported by errcheck to make them more clear.
- (setf (flycheck-error-message err)
- (format "Ignored `error` returned from `%s`" message)))))
- errors)
- :modes go-mode
- :predicate (lambda () (flycheck-buffer-saved-p))
- :next-checkers ((warning . go-unconvert)
- (warning . go-staticcheck)))
-
-(flycheck-define-checker go-unconvert
- "A Go checker looking for unnecessary type conversions.
-
-See URL `https://github.com/mdempsky/unconvert'."
- :command ("unconvert" ".")
- :error-patterns
- ((warning line-start (file-name) ":" line ":" column ": " (message) line-end))
- :modes go-mode
- :predicate (lambda () (flycheck-buffer-saved-p)))
-
-(flycheck-define-checker go-staticcheck
- "A Go checker that performs static analysis and linting using
-the `staticcheck' command.
-
-`staticcheck' is explicitly fully compatible with \"the last two
-versions of go\". `staticheck' can target earlier versions (with
-limited features) if `flycheck-go-version' is set. See URL
-`https://staticcheck.io/'."
- :command ("staticcheck" "-f" "json"
- (option-list "-tags" flycheck-go-build-tags concat)
- (option "-go" flycheck-go-version))
-
- :error-parser flycheck-parse-go-staticcheck
- :modes go-mode)
-
-(flycheck-define-checker groovy
- "A groovy syntax checker using groovy compiler API.
-
-See URL `http://www.groovy-lang.org'."
- :command ("groovy" "-e"
- "import org.codehaus.groovy.control.*
-
-unit = new CompilationUnit()
-unit.addSource(\"input\", System.in)
-
-try {
- unit.compile(Phases.CONVERSION)
-} catch (MultipleCompilationErrorsException e) {
- e.errorCollector.write(new PrintWriter(System.out, true), null)
-}")
- :standard-input t
- :error-patterns
- ((error line-start "input: " line ":" (message)
- " @ line " line ", column " column "." line-end))
- :modes groovy-mode)
-
-(flycheck-define-checker haml
- "A Haml syntax checker using the Haml compiler.
-
-See URL `http://haml.info'."
- :command ("haml" "-c" "--stdin")
- :standard-input t
- :error-patterns
- ((error line-start "Syntax error on line " line ": " (message) line-end)
- (error line-start ":" line ": syntax error, " (message) line-end))
- :modes haml-mode)
-
-(flycheck-define-checker handlebars
- "A Handlebars syntax checker using the Handlebars compiler.
-
-See URL `http://handlebarsjs.com/'."
- :command ("handlebars" "-i-")
- :standard-input t
- :error-patterns
- ((error line-start
- "Error: Parse error on line " line ":" (optional "\r") "\n"
- (zero-or-more not-newline) "\n" (zero-or-more not-newline) "\n"
- (message) line-end))
- :modes (handlebars-mode handlebars-sgml-mode web-mode)
- :predicate
- (lambda ()
- (if (eq major-mode 'web-mode)
- ;; Check if this is a handlebars file since web-mode does not store the
- ;; non-canonical engine name
- (let* ((regexp-alist (bound-and-true-p web-mode-engine-file-regexps))
- (pattern (cdr (assoc "handlebars" regexp-alist))))
- (and pattern (buffer-file-name)
- (string-match-p pattern (buffer-file-name))))
- t)))
-
-(defconst flycheck-haskell-module-re
- (rx line-start (zero-or-more (or "\n" (any space)))
- "module" (one-or-more (or "\n" (any space)))
- (group (one-or-more (not (any space "(" "\n")))))
- "Regular expression for a Haskell module name.")
-
-(flycheck-def-args-var flycheck-ghc-args (haskell-stack-ghc haskell-ghc)
- :package-version '(flycheck . "0.22"))
-
-(flycheck-def-option-var flycheck-ghc-stack-use-nix nil haskell-stack-ghc
- "Whether to enable nix support in stack.
-
-When non-nil, stack will append '--nix' flag to any call."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "26"))
-
-(flycheck-def-option-var flycheck-ghc-stack-project-file nil haskell-stack-ghc
- "Override project stack.yaml file.
-
-The value of this variable is a file path that refers to a yaml
-file for the current stack project. Relative file paths are
-resolved against the checker's working directory. When non-nil,
-stack will get overridden value via `--stack-yaml'."
- :type '(choice (const :tag "Unspecified" nil)
- (file :tag "Project file"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-
-(flycheck-def-option-var flycheck-ghc-no-user-package-database nil haskell-ghc
- "Whether to disable the user package database in GHC.
-
-When non-nil, disable the user package database in GHC, via
-`-no-user-package-db'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.16"))
-
-(flycheck-def-option-var flycheck-ghc-package-databases nil haskell-ghc
- "Additional module databases for GHC.
-
-The value of this variable is a list of strings, where each
-string is a directory of a package database. Each package
-database is given to GHC via `-package-db'."
- :type '(repeat (directory :tag "Package database"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.16"))
-
-(flycheck-def-option-var flycheck-ghc-search-path nil
- (haskell-stack-ghc haskell-ghc)
- "Module search path for (Stack) GHC.
-
-The value of this variable is a list of strings, where each
-string is a directory containing Haskell modules. Each directory
-is added to the GHC search path via `-i'."
- :type '(repeat (directory :tag "Module directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.16"))
-
-(flycheck-def-option-var flycheck-ghc-language-extensions nil
- (haskell-stack-ghc haskell-ghc)
- "Language extensions for (Stack) GHC.
-
-The value of this variable is a list of strings, where each
-string is a Haskell language extension, as in the LANGUAGE
-pragma. Each extension is enabled via `-X'."
- :type '(repeat (string :tag "Language extension"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.19"))
-
-(defvar flycheck-haskell-ghc-cache-directory nil
- "The cache directory for `ghc' output.")
-
-(defun flycheck-haskell-ghc-cache-directory ()
- "Get the cache location for `ghc' output.
-
-If no cache directory exists yet, create one and return it.
-Otherwise return the previously used cache directory."
- (setq flycheck-haskell-ghc-cache-directory
- (or flycheck-haskell-ghc-cache-directory
- (make-temp-file "flycheck-haskell-ghc-cache" 'directory))))
-
-(defun flycheck--locate-dominating-file-matching (directory regexp)
- "Search for a file in directory hierarchy starting at DIRECTORY.
-
-Look up the directory hierarchy from DIRECTORY for a directory
-containing a file that matches REGEXP."
- (locate-dominating-file
- directory
- (lambda (dir)
- (directory-files dir nil regexp t))))
-
-(defun flycheck-haskell--find-stack-default-directory ()
- "Find a directory to run haskell-stack-ghc.
-
-Return a parent directory with a stack*.y[a]ml file, or the
-directory returned by \"stack path --project-root\"."
- (or
- (when (buffer-file-name)
- (flycheck--locate-dominating-file-matching
- (file-name-directory (buffer-file-name))
- (rx "stack" (* any) "." (or "yml" "yaml") eos)))
- (-when-let* ((stack (funcall flycheck-executable-find "stack"))
- (output (ignore-errors
- (process-lines stack
- "--no-install-ghc"
- "path" "--project-root")))
- (stack-dir (car output)))
- (and (file-directory-p stack-dir) stack-dir))))
-
-(defun flycheck-haskell--ghc-find-default-directory (_checker)
- "Find a parent directory containing a cabal or package.yaml file."
- (when (buffer-file-name)
- (flycheck--locate-dominating-file-matching
- (file-name-directory (buffer-file-name))
- "\\.cabal\\'\\|\\`package\\.yaml\\'")))
-
-(flycheck-define-checker haskell-stack-ghc
- "A Haskell syntax and type checker using `stack ghc'.
-
-See URL `https://github.com/commercialhaskell/stack'."
- :command ("stack"
- "--no-install-ghc"
- (option "--stack-yaml" flycheck-ghc-stack-project-file)
- (option-flag "--nix" flycheck-ghc-stack-use-nix)
- "ghc" "--" "-Wall" "-no-link"
- "-outputdir" (eval (flycheck-haskell-ghc-cache-directory))
- (option-list "-X" flycheck-ghc-language-extensions concat)
- (option-list "-i" flycheck-ghc-search-path concat)
- (eval (concat
- "-i"
- (flycheck-module-root-directory
- (flycheck-find-in-buffer flycheck-haskell-module-re))))
- (eval flycheck-ghc-args)
- "-x" (eval
- (pcase major-mode
- (`haskell-mode "hs")
- (`haskell-literate-mode "lhs")))
- source)
- :error-patterns
- ((warning line-start (file-name) ":" line ":" column ":"
- (or " " "\n ") (in "Ww") "arning:"
- (optional " " "[" (id (one-or-more not-newline)) "]")
- (optional "\n")
- (message
- (one-or-more " ") (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more (not (any ?\n ?|)))))
- line-end)
- (error line-start (file-name) ":" line ":" column ":" (optional " error:")
- (or (message (one-or-more not-newline))
- (and "\n"
- (message
- (one-or-more " ") (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more (not (any ?\n ?|)))))))
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors (flycheck-dedent-error-messages errors)))
- :modes (haskell-mode haskell-literate-mode)
- :next-checkers ((warning . haskell-hlint))
- :working-directory (lambda (_)
- (flycheck-haskell--find-stack-default-directory))
- :enabled flycheck-haskell--find-stack-default-directory
- :verify (lambda (_)
- (let* ((stack (flycheck-haskell--find-stack-default-directory)))
- (list
- (flycheck-verification-result-new
- :label "stack config"
- :message (or stack "Not found")
- :face (if stack 'success '(bold error)))))))
-
-(flycheck-define-checker haskell-ghc
- "A Haskell syntax and type checker using ghc.
-
-See URL `https://www.haskell.org/ghc/'."
- :command ("ghc" "-Wall" "-no-link"
- "-outputdir" (eval (flycheck-haskell-ghc-cache-directory))
- (option-flag "-no-user-package-db"
- flycheck-ghc-no-user-package-database)
- (option-list "-package-db" flycheck-ghc-package-databases)
- (option-list "-i" flycheck-ghc-search-path concat)
- ;; Include the parent directory of the current module tree, to
- ;; properly resolve local imports
- (eval (concat
- "-i"
- (flycheck-module-root-directory
- (flycheck-find-in-buffer flycheck-haskell-module-re))))
- (option-list "-X" flycheck-ghc-language-extensions concat)
- (eval flycheck-ghc-args)
- "-x" (eval
- (pcase major-mode
- (`haskell-mode "hs")
- (`haskell-literate-mode "lhs")))
- source)
- :error-patterns
- ((warning line-start (file-name) ":" line ":" column ":"
- (or " " "\n ") (in "Ww") "arning:"
- (optional " " "[" (id (one-or-more not-newline)) "]")
- (optional "\n")
- (message
- (one-or-more " ") (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more (not (any ?\n ?|)))))
- line-end)
- (error line-start (file-name) ":" line ":" column ":" (optional " error:")
- (or (message (one-or-more not-newline))
- (and "\n"
- (message
- (one-or-more " ") (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more (not (any ?\n ?|)))))))
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors (flycheck-dedent-error-messages errors)))
- :modes (haskell-mode haskell-literate-mode)
- :next-checkers ((warning . haskell-hlint))
- :working-directory flycheck-haskell--ghc-find-default-directory)
-
-(flycheck-def-config-file-var flycheck-hlintrc haskell-hlint "HLint.hs")
-
-(flycheck-def-args-var flycheck-hlint-args haskell-hlint
- :package-version '(flycheck . "0.25"))
-
-(flycheck-def-option-var flycheck-hlint-language-extensions
- nil haskell-hlint
- "Extensions list to enable for hlint.
-
-The value of this variable is a list of strings, where each
-string is a name of extension to enable in
-hlint (e.g. \"QuasiQuotes\")."
- :type '(repeat :tag "Extensions" (string :tag "Extension"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-def-option-var flycheck-hlint-ignore-rules
- nil haskell-hlint
- "Ignore rules list for hlint checks.
-
-The value of this variable is a list of strings, where each
-string is an ignore rule (e.g. \"Use fmap\")."
- :type '(repeat :tag "Ignore rules" (string :tag "Ignore rule"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-def-option-var flycheck-hlint-hint-packages
- nil haskell-hlint
- "Hint packages to include for hlint checks.
-
-The value of this variable is a list of strings, where each
-string is a default hint package (e.g. (\"Generalise\"
-\"Default\" \"Dollar\"))."
- :type '(repeat :tag "Hint packages" (string :tag "Hint package"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-define-checker haskell-hlint
- "A Haskell style checker using hlint.
-
-See URL `https://github.com/ndmitchell/hlint'."
- :command ("hlint"
- (option-list "-X" flycheck-hlint-language-extensions concat)
- (option-list "-i=" flycheck-hlint-ignore-rules concat)
- (option-list "-h" flycheck-hlint-hint-packages concat)
- (config-file "-h" flycheck-hlintrc)
- (eval flycheck-hlint-args)
- source-inplace)
- :error-patterns
- ((info line-start
- (file-name) ":" line ":" column (optional "-" end-column)
- ": Suggestion: "
- (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n)))
- line-end)
- (warning line-start
- (file-name) ":" line ":" column (optional "-" end-column)
- ": Warning: "
- (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n)))
- line-end)
- (error line-start
- (file-name) ":" line ":" column (optional "-" end-column)
- ": Error: "
- (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n)))
- line-end))
- :modes (haskell-mode haskell-literate-mode))
-
-(flycheck-def-config-file-var flycheck-tidyrc html-tidy ".tidyrc")
-
-(flycheck-define-checker html-tidy
- "A HTML syntax and style checker using Tidy.
-
-See URL `https://github.com/htacg/tidy-html5'."
- :command ("tidy" (config-file "-config" flycheck-tidyrc)
- "-lang" "en"
- "-e" "-q")
- :standard-input t
- :error-patterns
- ((error line-start
- "line " line
- " column " column
- " - Error: " (message) line-end)
- (warning line-start
- "line " line
- " column " column
- " - Warning: " (message) line-end))
- :modes (html-mode mhtml-mode nxhtml-mode))
-
-(flycheck-def-config-file-var flycheck-jshintrc javascript-jshint ".jshintrc")
-
-(flycheck-def-option-var flycheck-jshint-extract-javascript nil
- javascript-jshint
- "Whether jshint should extract Javascript from HTML.
-
-If nil no extract rule is given to jshint. If `auto' only
-extract Javascript if a HTML file is detected. If `always' or
-`never' extract Javascript always or never respectively.
-
-Refer to the jshint manual at the URL
-`http://jshint.com/docs/cli/#flags' for more information."
- :type
- '(choice (const :tag "No extraction rule" nil)
- (const :tag "Try to extract Javascript when detecting HTML files"
- auto)
- (const :tag "Always try to extract Javascript" always)
- (const :tag "Never try to extract Javascript" never))
- :safe #'symbolp
- :package-version '(flycheck . "26"))
-
-(flycheck-define-checker javascript-jshint
- "A Javascript syntax and style checker using jshint.
-
-See URL `http://www.jshint.com'."
- :command ("jshint" "--reporter=checkstyle"
- "--filename" source-original
- (config-file "--config" flycheck-jshintrc)
- (option "--extract=" flycheck-jshint-extract-javascript
- concat flycheck-option-symbol)
- "-")
- :standard-input t
- :error-parser flycheck-parse-checkstyle
- :error-filter
- (lambda (errors)
- (flycheck-remove-error-file-names
- "stdin" (flycheck-dequalify-error-ids errors)))
- :modes (js-mode js2-mode js3-mode rjsx-mode))
-
-(flycheck-def-args-var flycheck-eslint-args javascript-eslint
- :package-version '(flycheck . "32"))
-
-(flycheck-def-option-var flycheck-eslint-rules-directories nil javascript-eslint
- "A list of directories with custom rules for ESLint.
-
-The value of this variable is a list of strings, where each
-string is a directory with custom rules for ESLint.
-
-Refer to the ESLint manual at URL
-`http://eslint.org/docs/user-guide/command-line-interface#--rulesdir'
-for more information about the custom directories."
- :type '(repeat (directory :tag "Custom rules directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "29"))
-
-(defun flycheck-eslint-config-exists-p ()
- "Whether there is a valid eslint config for the current buffer."
- (eql 0 (flycheck-call-checker-process
- 'javascript-eslint nil nil nil
- "--print-config" (or buffer-file-name "index.js"))))
-
-(defun flycheck-parse-eslint (output checker buffer)
- "Parse ESLint errors/warnings from JSON OUTPUT.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `https://eslint.org' for more information about ESLint."
- (mapcar (lambda (err)
- (let-alist err
- (flycheck-error-new-at
- .line
- .column
- (pcase .severity
- (2 'error)
- (1 'warning)
- (_ 'warning))
- .message
- :id .ruleId
- :checker checker
- :buffer buffer
- :filename (buffer-file-name buffer)
- :end-line .endLine
- :end-column .endColumn)))
- (let-alist (caar (flycheck-parse-json output))
- .messages)))
-
-(defun flycheck-eslint--find-working-directory (_checker)
- "Look for a working directory to run ESLint CHECKER in.
-
-This will be the directory that contains the `node_modules'
-directory. If no such directory is found in the directory
-hierarchy, it looks first for `.eslintignore' and then for
-`.eslintrc' files to detect the project root."
- (let* ((regex-config (concat "\\`\\.eslintrc"
- "\\(\\.\\(js\\|ya?ml\\|json\\)\\)?\\'")))
- (when buffer-file-name
- (or (locate-dominating-file buffer-file-name "node_modules")
- (locate-dominating-file buffer-file-name ".eslintignore")
- (locate-dominating-file
- (file-name-directory buffer-file-name)
- (lambda (directory)
- (> (length (directory-files directory nil regex-config t)) 0)))))))
-
-(flycheck-define-checker javascript-eslint
- "A Javascript syntax and style checker using eslint.
-
-See URL `https://eslint.org/'."
- :command ("eslint" "--format=json"
- (option-list "--rulesdir" flycheck-eslint-rules-directories)
- (eval flycheck-eslint-args)
- "--stdin" "--stdin-filename" source-original)
- :standard-input t
- :error-parser flycheck-parse-eslint
- :enabled (lambda () (flycheck-eslint-config-exists-p))
- :modes (js-mode js-jsx-mode js2-mode js2-jsx-mode js3-mode rjsx-mode
- typescript-mode)
- :working-directory flycheck-eslint--find-working-directory
- :verify
- (lambda (_)
- (let* ((default-directory
- (flycheck-compute-working-directory 'javascript-eslint))
- (have-config (flycheck-eslint-config-exists-p)))
- (list
- (flycheck-verification-result-new
- :label "config file"
- :message (if have-config "found" "missing or incorrect")
- :face (if have-config 'success '(bold error))))))
- :error-explainer
- (lambda (err)
- (let ((error-code (flycheck-error-id err))
- (url "https://eslint.org/docs/rules/%s"))
- (and error-code
- ;; skip non-builtin rules
- (not ;; `seq-contains-p' is only in seq >= 2.21
- (with-no-warnings (seq-contains error-code ?/)))
- `(url . ,(format url error-code))))))
-
-(flycheck-define-checker javascript-standard
- "A Javascript code and style checker for the (Semi-)Standard Style.
-
-This checker works with `standard' and `semistandard', defaulting
-to the former. To use it with the latter, set
-`flycheck-javascript-standard-executable' to `semistandard'.
-
-See URL `https://github.com/standard/standard' and URL
-`https://github.com/Flet/semistandard'."
- :command ("standard" "--stdin")
- :standard-input t
- :error-patterns
- ((error line-start " <text>:" line ":" column ":" (message) line-end))
- :modes (js-mode js-jsx-mode js2-mode js2-jsx-mode js3-mode rjsx-mode))
-
-(flycheck-define-checker json-jsonlint
- "A JSON syntax and style checker using jsonlint.
-
-See URL `https://github.com/zaach/jsonlint'."
- ;; We can't use standard input for jsonlint, because it doesn't output errors
- ;; anymore when using -c -q with standard input :/
- :command ("jsonlint" "-c" "-q" source)
- :error-patterns
- ((error line-start
- (file-name)
- ": line " line
- ", col " column ", "
- (message) line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors (flycheck-increment-error-columns errors)))
- :modes json-mode)
-
-(flycheck-define-checker json-python-json
- "A JSON syntax checker using Python json.tool module.
-
-See URL `https://docs.python.org/3.5/library/json.html#command-line-interface'."
- :command ("python3" "-m" "json.tool" source
- ;; Send the pretty-printed output to the null device
- null-device)
- :error-patterns
- ((error line-start
- (message) ": line " line " column " column
- ;; Ignore the rest of the line which shows the char position.
- (one-or-more not-newline)
- line-end))
- :modes json-mode
- ;; The JSON parser chokes if the buffer is empty and has no JSON inside
- :predicate flycheck-buffer-nonempty-p)
-
-(flycheck-define-checker json-jq
- "JSON checker using the jq tool.
-
-This checker accepts multiple consecutive JSON values in a
-single input, which is useful for jsonlines data.
-
-See URL `https://stedolan.github.io/jq/'."
- :command ("jq" "." source null-device)
- ;; Example error message:
- ;; parse error: Expected another key-value pair at line 3, column 1
- :error-patterns
- ((error line-start
- (optional "parse error: ")
- (message) "at line " line ", column " column
- (zero-or-more not-newline) line-end))
- :modes json-mode)
-
-(flycheck-define-checker jsonnet
- "A Jsonnet syntax checker using the jsonnet binary.
-
-See URL `https://jsonnet.org'."
- :command ("jsonnet" source-inplace)
- :error-patterns
- ((error line-start "STATIC ERROR: " (file-name) ":"
- (or (seq line ":" column (zero-or-one (seq "-" end-column)))
- (seq "(" line ":" column ")" "-"
- "(" end-line ":" end-column ")"))
- ": " (message) line-end)
- (error line-start "RUNTIME ERROR: " (message) "\n"
- (? "\t" (file-name) ":" ;; first line of the backtrace
- (or (seq line ":" column (zero-or-one (seq "-" end-column)))
- (seq "(" line ":" column ")" "-"
- "(" end-line ":" end-column ")")))))
- :error-filter
- (lambda (errs)
- ;; Some errors are missing line numbers. See URL
- ;; `https://github.com/google/jsonnet/issues/786'.
- (dolist (err errs)
- (unless (flycheck-error-line err)
- (setf (flycheck-error-line err) 1)))
- (flycheck-sanitize-errors errs))
- :modes jsonnet-mode)
-
-(flycheck-define-checker less
- "A LESS syntax checker using lessc.
-
-Requires lessc 1.4 or newer.
-
-See URL `http://lesscss.org'."
- :command ("lessc" "--lint" "--no-color"
- "-")
- :standard-input t
- :error-patterns
- ((error line-start (one-or-more word) ":"
- (message)
- " in - on line " line
- ", column " column ":"
- line-end))
- :modes less-css-mode)
-
-(flycheck-define-checker less-stylelint
- "A LESS syntax and style checker using stylelint.
-
-See URL `http://stylelint.io/'."
- :command ("stylelint"
- (eval flycheck-stylelint-args)
- "--syntax" "less"
- (option-flag "--quiet" flycheck-stylelint-quiet)
- (config-file "--config" flycheck-stylelintrc))
- :standard-input t
- :error-parser flycheck-parse-stylelint
- :predicate flycheck-buffer-nonempty-p
- :modes (less-css-mode))
-
-(flycheck-define-checker llvm-llc
- "Flycheck LLVM IR checker using llc.
-
-See URL `http://llvm.org/docs/CommandGuide/llc.html'."
- :command ("llc" "-o" null-device source)
- :error-patterns
- ((error line-start
- ;; llc prints the executable path
- (zero-or-one (minimal-match (one-or-more not-newline)) ": ")
- (file-name) ":" line ":" column ": error: " (message)
- line-end))
- :error-filter
- (lambda (errors)
- ;; sanitize errors occurring in inline assembly
- (flycheck-sanitize-errors
- (flycheck-remove-error-file-names "<inline asm>" errors)))
- :modes llvm-mode)
-
-(flycheck-def-config-file-var flycheck-luacheckrc lua-luacheck ".luacheckrc")
-
-(flycheck-def-option-var flycheck-luacheck-standards nil lua-luacheck
- "The standards to use in luacheck.
-
-The value of this variable is either a list of strings denoting
-the standards to use, or nil to pass nothing to luacheck. When
-non-nil, pass the standards via one or more `--std' options."
- :type '(choice (const :tag "Default" nil)
- (repeat :tag "Custom standards"
- (string :tag "Standard name")))
- :safe #'flycheck-string-list-p)
-(make-variable-buffer-local 'flycheck-luacheck-standards)
-
-(flycheck-define-checker lua-luacheck
- "A Lua syntax checker using luacheck.
-
-See URL `https://github.com/mpeterv/luacheck'."
- :command ("luacheck"
- "--formatter" "plain"
- "--codes" ; Show warning codes
- "--no-color"
- (option-list "--std" flycheck-luacheck-standards)
- (config-file "--config" flycheck-luacheckrc)
- "--filename" source-original
- ;; Read from standard input
- "-")
- :standard-input t
- :error-patterns
- ((warning line-start
- (optional (file-name))
- ":" line ":" column
- ": (" (id "W" (one-or-more digit)) ") "
- (message) line-end)
- (error line-start
- (optional (file-name))
- ":" line ":" column ":"
- ;; `luacheck' before 0.11.0 did not output codes for errors, hence
- ;; the ID is optional here
- (optional " (" (id "E" (one-or-more digit)) ") ")
- (message) line-end))
- :modes lua-mode)
-
-(flycheck-define-checker lua
- "A Lua syntax checker using the Lua compiler.
-
-See URL `http://www.lua.org/'."
- :command ("luac" "-p" "-")
- :standard-input t
- :error-patterns
- ((error line-start
- ;; Skip the name of the luac executable.
- (minimal-match (zero-or-more not-newline))
- ": stdin:" line ": " (message) line-end))
- :modes lua-mode)
-
-(flycheck-define-checker opam
- "A Opam syntax and style checker using opam lint.
-
-See URL `https://opam.ocaml.org/doc/man/opam-lint.html'."
- :command ("opam" "lint" "-")
- :standard-input t
- :error-patterns
- ((error line-start ; syntax error
- (one-or-more space) "error " (id ?2)
- ": File format error"
- (or (and " at line " line ", column " column ": " (message))
- (and ": " (message)))
- line-end)
- (error line-start
- (one-or-more space) "error " (id ?3)
- (minimal-match (zero-or-more not-newline))
- "at line " line ", column " column ": " (message)
- line-end)
- (error line-start
- (one-or-more space) "error " (id (one-or-more num))
- ": " (message (one-or-more not-newline))
- line-end)
- (warning line-start
- (one-or-more space) "warning " (id (one-or-more num))
- ": " (message)
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-increment-error-columns
- (flycheck-fill-empty-line-numbers errors)))
- :modes tuareg-opam-mode)
-
-(flycheck-def-option-var flycheck-perl-include-path nil perl
- "A list of include directories for Perl.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of Perl.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-def-option-var flycheck-perl-module-list nil perl
- "A list of modules to use for Perl.
-
-The value of this variable is a list of strings, where each
-string is a module to 'use' in Perl."
- :type '(repeat :tag "Module")
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker perl
- "A Perl syntax checker using the Perl interpreter.
-
-See URL `https://www.perl.org'."
- :command ("perl" "-w" "-c"
- (option-list "-I" flycheck-perl-include-path)
- (option-list "-M" flycheck-perl-module-list concat))
- :standard-input t
- :error-patterns
- ((error line-start (minimal-match (message))
- " at - line " line
- (or "." (and ", " (zero-or-more not-newline))) line-end))
- :modes (perl-mode cperl-mode)
- :next-checkers (perl-perlcritic))
-
-(flycheck-def-option-var flycheck-perlcritic-severity nil perl-perlcritic
- "The message severity for Perl Critic.
-
-The value of this variable is a severity level as integer, for
-the `--severity' option to Perl Critic."
- :type '(integer :tag "Severity level")
- :safe #'integerp
- :package-version '(flycheck . "0.18"))
-
-(flycheck-def-option-var flycheck-perlcritic-theme nil perl-perlcritic
- "The theme expression for Perl Critic.
-
-The value of this variable is passed as the `--theme' option to
-`Perl::Critic'. See the documentation of `Perl::Critic' for
-details."
- :type '(choice (const :tag "None" nil)
- (string :tag "Theme expression"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32-csv"))
-
-(flycheck-def-config-file-var flycheck-perlcriticrc perl-perlcritic
- ".perlcriticrc"
- :package-version '(flycheck . "26"))
-
-(flycheck-define-checker perl-perlcritic
- "A Perl syntax checker using Perl::Critic.
-
-See URL `https://metacpan.org/pod/Perl::Critic'."
- :command ("perlcritic" "--no-color" "--verbose" "%f/%l/%c/%s/%p/%m (%e)\n"
- (config-file "--profile" flycheck-perlcriticrc)
- (option "--severity" flycheck-perlcritic-severity nil
- flycheck-option-int)
- (option "--theme" flycheck-perlcritic-theme))
- :standard-input t
- :error-patterns
- ((info line-start
- "STDIN/" line "/" column "/" (any "1") "/"
- (id (one-or-more (not (any "/")))) "/" (message)
- line-end)
- (warning line-start
- "STDIN/" line "/" column "/" (any "234") "/"
- (id (one-or-more (not (any "/")))) "/" (message)
- line-end)
- (error line-start
- "STDIN/" line "/" column "/" (any "5") "/"
- (id (one-or-more (not (any "/")))) "/" (message)
- line-end))
- :modes (cperl-mode perl-mode))
-
-(flycheck-define-checker php
- "A PHP syntax checker using the PHP command line interpreter.
-
-See URL `http://php.net/manual/en/features.commandline.php'."
- :command ("php" "-l" "-d" "error_reporting=E_ALL" "-d" "display_errors=1"
- "-d" "log_errors=0" source)
- :error-patterns
- ((error line-start (or "Parse" "Fatal" "syntax") " error" (any ":" ",") " "
- (message) " in " (file-name) " on line " line line-end))
- :modes (php-mode php+-mode)
- :next-checkers ((warning . php-phpmd)
- (warning . php-phpcs)))
-
-(flycheck-def-option-var flycheck-phpmd-rulesets
- '("cleancode" "codesize" "controversial" "design" "naming" "unusedcode")
- php-phpmd
- "The rule sets for PHP Mess Detector.
-
-Set default rule sets and custom rule set files.
-
-See section \"Using multiple rule sets\" in the PHP Mess Detector
-manual at URL `https://phpmd.org/documentation/index.html'."
- :type '(repeat :tag "rule sets"
- (string :tag "A filename or rule set"))
- :safe #'flycheck-string-list-p)
-
-(flycheck-define-checker php-phpmd
- "A PHP style checker using PHP Mess Detector.
-
-See URL `https://phpmd.org/'."
- :command ("phpmd" source "xml"
- (eval (flycheck-option-comma-separated-list
- flycheck-phpmd-rulesets)))
- :error-parser flycheck-parse-phpmd
- :modes (php-mode php+-mode)
- :next-checkers (php-phpcs))
-
-(flycheck-def-option-var flycheck-phpcs-standard nil php-phpcs
- "The coding standard for PHP CodeSniffer.
-
-When nil, use the default standard from the global PHP
-CodeSniffer configuration. When set to a string, pass the string
-to PHP CodeSniffer which will interpret it as name as a standard,
-or as path to a standard specification."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Standard name or file"))
- :safe #'flycheck-string-or-nil-p)
-
-(flycheck-define-checker php-phpcs
- "A PHP style checker using PHP Code Sniffer.
-
-Needs PHP Code Sniffer 2.6 or newer.
-
-See URL `http://pear.php.net/package/PHP_CodeSniffer/'."
- :command ("phpcs" "--report=checkstyle"
- ;; Use -q flag to force quiet mode
- ;; Quiet mode prevents errors from extra output when phpcs has
- ;; been configured with show_progress enabled
- "-q"
- (option "--standard=" flycheck-phpcs-standard concat)
- ;; Some files are not detected correctly
- ;; so it is necessary to pass the extension.
- (eval
- (-when-let* ((fname buffer-file-name)
- (ext (file-name-extension fname)))
- (concat "--extensions=" ext)))
-
- ;; Pass original file name to phpcs. We need to concat explicitly
- ;; here, because phpcs really insists to get option and argument as
- ;; a single command line argument :|
- (eval (when (buffer-file-name)
- (concat "--stdin-path=" (buffer-file-name))))
- ;; Read from standard input
- "-")
- :standard-input t
- :error-parser flycheck-parse-checkstyle
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-remove-error-file-names "STDIN" errors)))
- :modes (php-mode php+-mode)
- ;; phpcs seems to choke on empty standard input, hence skip phpcs if the
- ;; buffer is empty, see https://github.com/flycheck/flycheck/issues/907
- :predicate flycheck-buffer-nonempty-p)
-
-(flycheck-define-checker processing
- "Processing command line tool.
-
-See https://github.com/processing/processing/wiki/Command-Line"
- :command ("processing-java" "--force"
- ;; Don't change the order of these arguments, processing is pretty
- ;; picky
- (eval (concat "--sketch=" (file-name-directory (buffer-file-name))))
- (eval (concat "--output=" (flycheck-temp-dir-system)))
- "--build")
- :error-patterns
- ((error line-start (file-name) ":" line ":" column
- (zero-or-more (or digit ":")) (message) line-end))
- :modes processing-mode
- ;; This syntax checker needs a file name
- :predicate (lambda () (buffer-file-name)))
-
-(defun flycheck-proselint-parse-errors (output checker buffer)
- "Parse proselint json output errors from OUTPUT.
-
-CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `http://proselint.com/' for more information about proselint."
- (mapcar (lambda (err)
- (let-alist err
- (flycheck-error-new-at-pos
- .start
- (pcase .severity
- (`"suggestion" 'info)
- (`"warning" 'warning)
- (`"error" 'error)
- ;; Default to error
- (_ 'error))
- .message
- :id .check
- :buffer buffer
- :checker checker
- ;; See https://github.com/amperser/proselint/issues/1048
- :end-pos .end)))
- (let-alist (car (flycheck-parse-json output))
- .data.errors)))
-
-(flycheck-define-checker proselint
- "Flycheck checker using Proselint.
-
-See URL `http://proselint.com/'."
- :command ("proselint" "--json" "-")
- :standard-input t
- :error-parser flycheck-proselint-parse-errors
- :modes (text-mode markdown-mode gfm-mode message-mode org-mode))
-
-(flycheck-def-option-var flycheck-protoc-import-path nil protobuf-protoc
- "A list of directories to resolve import directives.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the import path. Relative paths
-are relative to the file being checked."
- :type '(repeat (directory :tag "Import directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker protobuf-protoc
- "A protobuf syntax checker using the protoc compiler.
-
-See URL `https://developers.google.com/protocol-buffers/'."
- :command ("protoc" "--error_format" "gcc"
- (eval (concat "--java_out=" (flycheck-temp-dir-system)))
- ;; Add the current directory to resolve imports
- (eval (concat "--proto_path="
- (file-name-directory (buffer-file-name))))
- ;; Add other import paths; this needs to be after the current
- ;; directory to produce the right output. See URL
- ;; `https://github.com/flycheck/flycheck/pull/1655'
- (option-list "--proto_path=" flycheck-protoc-import-path concat)
- source-inplace)
- :error-patterns
- ((info line-start (file-name) ":" line ":" column
- ": note: " (message) line-end)
- (error line-start (file-name) ":" line ":" column
- ": " (message) line-end)
- (error line-start
- (message "In file included from") " " (file-name) ":" line ":"
- column ":" line-end))
- :modes protobuf-mode
- :predicate (lambda () (buffer-file-name)))
-
-(defun flycheck-prototool-project-root (&optional _checker)
- "Return the nearest directory holding the prototool.yaml configuration."
- (and buffer-file-name
- (locate-dominating-file buffer-file-name "prototool.yaml")))
-
-(flycheck-define-checker protobuf-prototool
- "A protobuf syntax checker using prototool.
-
-See URL `https://github.com/uber/prototool'."
- :command ("prototool" "lint" source-original)
- :error-patterns
- ((warning line-start (file-name) ":" line ":" column ":" (message) line-end))
- :modes protobuf-mode
- :enabled flycheck-prototool-project-root
- :predicate flycheck-buffer-saved-p)
-
-(flycheck-define-checker pug
- "A Pug syntax checker using the pug compiler.
-
-See URL `https://pugjs.org/'."
- :command ("pug" "-p" (eval (expand-file-name (buffer-file-name))))
- :standard-input t
- :error-patterns
- ;; errors with includes/extends (e.g. missing files)
- ((error "Error: " (message) (zero-or-more not-newline) "\n"
- (zero-or-more not-newline) "at "
- (zero-or-more not-newline) " line " line)
- ;; error when placing anything other than a mixin or
- ;; block at the top-level of an extended template
- ;; also unknown filters
- (error line-start "Error: " (file-name) ":"
- line ":" column "\n\n" (message) line-end)
- ;; syntax/runtime errors (e.g. type errors, bad indentation, etc.)
- (error line-start
- (optional "Type") "Error: " (file-name) ":"
- line (optional ":" column)
- (zero-or-more not-newline) "\n"
- (one-or-more (or (zero-or-more not-newline) "|"
- (zero-or-more not-newline) "\n")
- (zero-or-more "-") (zero-or-more not-newline) "|"
- (zero-or-more not-newline) "\n")
- (zero-or-more not-newline) "\n"
- (one-or-more
- (zero-or-more not-newline) "|"
- (zero-or-more not-newline) "\n")
- (zero-or-more not-newline) "\n"
- (message)
- line-end))
- :modes pug-mode)
-
-(flycheck-define-checker puppet-parser
- "A Puppet DSL syntax checker using puppet's own parser.
-
-See URL `https://puppet.com/'."
- :command ("puppet" "parser" "validate" "--color=false")
- :standard-input t
- :error-patterns
- (
- ;; Patterns for Puppet 4
- (error line-start "Error: Could not parse for environment "
- (one-or-more (in "a-z" "0-9" "_")) ":"
- (message) "(line: " line ", column: " column ")" line-end)
- ;; Errors from Puppet < 4
- (error line-start "Error: Could not parse for environment "
- (one-or-more (in "a-z" "0-9" "_")) ":"
- (message (minimal-match (one-or-more anything)))
- " at line " line line-end)
- (error line-start
- ;; Skip over the path of the Puppet executable
- (minimal-match (zero-or-more not-newline))
- ": Could not parse for environment " (one-or-more word)
- ": " (message (minimal-match (zero-or-more anything)))
- " at " (file-name "/" (zero-or-more not-newline)) ":" line line-end))
- :modes puppet-mode
- :next-checkers ((warning . puppet-lint)))
-
-(flycheck-def-config-file-var flycheck-puppet-lint-rc puppet-lint
- ".puppet-lint.rc"
- :package-version '(flycheck . "26"))
-
-(flycheck-def-option-var flycheck-puppet-lint-disabled-checks nil puppet-lint
- "Disabled checkers for `puppet-lint'.
-
-The value of this variable is a list of strings, where each
-string is the name of a check to disable (e.g. \"80chars\" or
-\"double_quoted_strings\").
-
-See URL `http://puppet-lint.com/checks/' for a list of all checks
-and their names."
- :type '(repeat (string :tag "Check Name"))
- :package-version '(flycheck . "26"))
-
-(defun flycheck-puppet-lint-disabled-arg-name (check)
- "Create an argument to disable a puppetlint CHECK."
- (concat "--no-" check "-check"))
-
-(flycheck-define-checker puppet-lint
- "A Puppet DSL style checker using puppet-lint.
-
-See URL `http://puppet-lint.com/'."
- ;; We must check the original file, because Puppetlint is quite picky on the
- ;; names of files and there place in the directory structure, to comply with
- ;; Puppet's autoload directory layout. For instance, a class foo::bar is
- ;; required to be in a file foo/bar.pp. Any other place, such as a Flycheck
- ;; temporary file will cause an error.
- :command ("puppet-lint"
- (config-file "--config" flycheck-puppet-lint-rc)
- "--log-format"
- "%{path}:%{line}:%{kind}: %{message} (%{check})"
- (option-list "" flycheck-puppet-lint-disabled-checks concat
- flycheck-puppet-lint-disabled-arg-name)
- source-original)
- :error-patterns
- ((warning line-start (file-name) ":" line ":warning: " (message) line-end)
- (error line-start (file-name) ":" line ":error: " (message) line-end))
- :modes puppet-mode
- ;; Since we check the original file, we can only use this syntax checker if
- ;; the buffer is actually linked to a file, and if it is not modified.
- :predicate flycheck-buffer-saved-p)
-
-(defun flycheck-python-run-snippet (checker snippet)
- "Run a python SNIPPET and return the output.
-
-CHECKER's executable is assumed to be a Python REPL."
- (-when-let (output (flycheck-call-checker-process-for-output
- checker nil nil "-c" snippet))
- (string-trim output)))
-
-(defun flycheck-python-get-path (checker)
- "Compute the current Python path (CHECKER is a Python REPL) ."
- (flycheck-python-run-snippet checker "import sys; print(sys.path[1:])"))
-
-(defun flycheck-python-find-module (checker module)
- "Check if a Python MODULE is available (CHECKER is a Python REPL)."
- (flycheck-python-run-snippet
- checker (concat "import sys; sys.path.pop(0);"
- (format "import %s; print(%s.__file__)" module module))))
-
-(defun flycheck-python-needs-module-p (checker)
- "Determines whether CHECKER needs to be invoked through Python.
-
-Previous versions of Flycheck called pylint and flake8 directly,
-while new version call them through `python -c'. This check
-ensures that we don't break existing code; it also allows people
-who use virtualenvs to run globally-installed checkers."
- (not (string-match-p (rx (or "pylint" "pylint3" "flake8")
- (or "-script.pyw" ".exe" ".bat" "")
- eos)
- (flycheck-checker-executable checker))))
-
-(defun flycheck-python-verify-module (checker module)
- "Verify that a Python MODULE is available.
-
-Return nil if CHECKER's executable is not a Python REPL. This
-function's is suitable for a checker's :verify."
- (when (flycheck-python-needs-module-p checker)
- (let ((mod-path (flycheck-python-find-module checker module)))
- (list (flycheck-verification-result-new
- :label (format "`%s' module" module)
- :message (if mod-path (format "Found at %S" mod-path)
- (format "Missing; sys.path is %s"
- (flycheck-python-get-path checker)))
- :face (if mod-path 'success '(bold error)))))))
-
-(defun flycheck-python-module-args (checker module-name)
- "Compute arguments to pass to CHECKER's executable to run MODULE-NAME.
-
-Return nil if CHECKER's executable is not a Python REPL.
-Otherwise, return a list starting with -c (-m is not enough
-because it adds the current directory to Python's path)."
- (when (flycheck-python-needs-module-p checker)
- `("-c" ,(concat "import sys;sys.path.pop(0);import runpy;"
- (format "runpy.run_module(%S)" module-name)))))
-
-(flycheck-def-config-file-var flycheck-flake8rc python-flake8 ".flake8rc")
-
-(flycheck-def-option-var flycheck-flake8-error-level-alist
- '(("^E9.*$" . error) ; Syntax errors from pep8
- ("^F82.*$" . error) ; undefined variables from pyflakes
- ("^F83.*$" . error) ; Duplicate arguments from flake8
- ("^D.*$" . info) ; Docstring issues from flake8-pep257
- ("^N.*$" . info) ; Naming issues from pep8-naming
- )
- python-flake8
- "An alist mapping flake8 error IDs to Flycheck error levels.
-
-Each item in this list is a cons cell `(PATTERN . LEVEL)' where
-PATTERN is a regular expression matched against the error ID, and
-LEVEL is a Flycheck error level symbol.
-
-Each PATTERN is matched in the order of appearance in this list
-against the error ID. If it matches the ID, the level of the
-corresponding error is set to LEVEL. An error that is not
-matched by any PATTERN defaults to warning level.
-
-The default value of this option matches errors from flake8
-itself and from the following flake8 plugins:
-
-- pep8-naming
-- flake8-pep257
-
-You may add your own mappings to this option in order to support
-further flake8 plugins."
- :type '(repeat (cons (regexp :tag "Error ID pattern")
- (symbol :tag "Error level")))
- :package-version '(flycheck . "0.22"))
-
-(flycheck-def-option-var flycheck-flake8-maximum-complexity nil python-flake8
- "The maximum McCabe complexity of methods.
-
-If nil, do not check the complexity of methods. If set to an
-integer, report any complexity greater than the value of this
-variable as warning.
-
-If set to an integer, this variable overrules any similar setting
-in the configuration file denoted by `flycheck-flake8rc'."
- :type '(choice (const :tag "Do not check McCabe complexity" nil)
- (integer :tag "Maximum complexity"))
- :safe #'integerp)
-
-(flycheck-def-option-var flycheck-flake8-maximum-line-length nil python-flake8
- "The maximum length of lines.
-
-If set to an integer, the value of this variable denotes the
-maximum length of lines, overruling any similar setting in the
-configuration file denoted by `flycheck-flake8rc'. An error will
-be reported for any line longer than the value of this variable.
-
-If set to nil, use the maximum line length from the configuration
-file denoted by `flycheck-flake8rc', or the PEP 8 recommendation
-of 79 characters if there is no configuration with this setting."
- :type '(choice (const :tag "Default value")
- (integer :tag "Maximum line length in characters"))
- :safe #'integerp)
-
-(defun flycheck-flake8-fix-error-level (err)
- "Fix the error level of ERR.
-
-Update the error level of ERR according to
-`flycheck-flake8-error-level-alist'."
- (pcase-dolist (`(,pattern . ,level) flycheck-flake8-error-level-alist)
- (when (string-match-p pattern (flycheck-error-id err))
- (setf (flycheck-error-level err) level)))
- err)
-
-(defun flycheck-flake8--find-project-root (_checker)
- "Find setup.cfg in a parent directory of the current buffer."
- ;; This is a workaround for `https://gitlab.com/pycqa/flake8/issues/517'; see
- ;; also `https://github.com/flycheck/flycheck/issues/1722'
- (locate-dominating-file (or buffer-file-name default-directory) "setup.cfg"))
-
-(flycheck-define-checker python-flake8
- "A Python syntax and style checker using Flake8.
-
-Requires Flake8 3.0 or newer. See URL
-`https://flake8.readthedocs.io/'."
- ;; Not calling flake8 directly makes it easier to switch between different
- ;; Python versions; see https://github.com/flycheck/flycheck/issues/1055.
- :command ("python3"
- (eval (flycheck-python-module-args 'python-flake8 "flake8"))
- "--format=default"
- (config-file "--append-config" flycheck-flake8rc)
- (option "--max-complexity" flycheck-flake8-maximum-complexity nil
- flycheck-option-int)
- (option "--max-line-length" flycheck-flake8-maximum-line-length nil
- flycheck-option-int)
- (eval (when buffer-file-name
- (concat "--stdin-display-name=" buffer-file-name)))
- "-")
- :standard-input t
- :working-directory flycheck-flake8--find-project-root
- :error-filter (lambda (errors)
- (let ((errors (flycheck-sanitize-errors errors)))
- (seq-map #'flycheck-flake8-fix-error-level errors)))
- :error-patterns
- ((warning line-start
- (file-name) ":" line ":" (optional column ":") " "
- (id (one-or-more (any alpha)) (one-or-more digit)) " "
- (message (one-or-more not-newline))
- line-end))
- :enabled (lambda ()
- (or (not (flycheck-python-needs-module-p 'python-flake8))
- (flycheck-python-find-module 'python-flake8 "flake8")))
- :verify (lambda (_) (flycheck-python-verify-module 'python-flake8 "flake8"))
- :modes python-mode
- :next-checkers ((warning . python-pylint)
- (warning . python-mypy)))
-
-(flycheck-def-config-file-var flycheck-pylintrc python-pylint ".pylintrc")
-
-(flycheck-def-option-var flycheck-pylint-use-symbolic-id t python-pylint
- "Whether to use pylint message symbols or message codes.
-
-A pylint message has both an opaque identifying code (such as `F0401') and a
-more meaningful symbolic code (such as `import-error'). This option governs
-which should be used and reported to the user."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.25"))
-
-(defun flycheck-parse-pylint (output checker buffer)
- "Parse JSON OUTPUT of CHECKER on BUFFER as Pylint errors."
- (mapcar (lambda (err)
- (let-alist err
- ;; Pylint can return -1 as a line or a column, hence the call to
- ;; `max'. See `https://github.com/flycheck/flycheck/issues/1383'.
- (flycheck-error-new-at
- (and .line (max .line 1))
- (and .column (max (1+ .column) 1))
- (pcase .type
- ;; See "pylint/utils.py"
- ((or "fatal" "error") 'error)
- ((or "info" "convention") 'info)
- ((or "warning" "refactor" _) 'warning))
- ;; Drop lines showing the error in context
- (and (string-match (rx (*? nonl) eol) .message)
- (match-string 0 .message))
- :id (if flycheck-pylint-use-symbolic-id .symbol .message-id)
- :checker checker
- :buffer buffer
- :filename .path)))
- (car (flycheck-parse-json output))))
-
-(flycheck-define-checker python-pylint
- "A Python syntax and style checker using Pylint.
-
-This syntax checker requires Pylint 1.0 or newer.
-
-See URL `https://www.pylint.org/'."
- ;; --reports=n disables the scoring report.
- ;; Not calling pylint directly makes it easier to switch between different
- ;; Python versions; see https://github.com/flycheck/flycheck/issues/1055.
- :command ("python3"
- (eval (flycheck-python-module-args 'python-pylint "pylint"))
- "--reports=n"
- "--output-format=json"
- (config-file "--rcfile=" flycheck-pylintrc concat)
- ;; Need `source-inplace' for relative imports (e.g. `from .foo
- ;; import bar'), see https://github.com/flycheck/flycheck/issues/280
- source-inplace)
- :error-parser flycheck-parse-pylint
- :enabled (lambda ()
- (or (not (flycheck-python-needs-module-p 'python-pylint))
- (flycheck-python-find-module 'python-pylint "pylint")))
- :verify (lambda (_) (flycheck-python-verify-module 'python-pylint "pylint"))
- :error-explainer (lambda (err)
- (-when-let (id (flycheck-error-id err))
- (apply
- #'flycheck-call-checker-process-for-output
- 'python-pylint nil t
- (append
- (flycheck-python-module-args 'python-pylint "pylint")
- (list (format "--help-msg=%s" id))))))
- :modes python-mode
- :next-checkers ((warning . python-mypy)))
-
-(flycheck-define-checker python-pycompile
- "A Python syntax checker using Python's builtin compiler.
-
-See URL `https://docs.python.org/3.4/library/py_compile.html'."
- :command ("python3" "-m" "py_compile" source)
- :error-patterns
- ;; Python 2.7
- ((error line-start " File \"" (file-name) "\", line " line "\n"
- (>= 2 (zero-or-more not-newline) "\n")
- "SyntaxError: " (message) line-end)
- (error line-start "Sorry: IndentationError: "
- (message) "(" (file-name) ", line " line ")"
- line-end)
- ;; 2.6
- (error line-start "SyntaxError: ('" (message (one-or-more (not (any "'"))))
- "', ('" (file-name (one-or-more (not (any "'")))) "', "
- line ", " column ", " (one-or-more not-newline) line-end))
- :modes python-mode
- :next-checkers ((warning . python-mypy)))
-
-(define-obsolete-variable-alias 'flycheck-python-mypy-ini
- 'flycheck-python-mypy-config "32")
-
-(flycheck-def-config-file-var flycheck-python-mypy-config python-mypy
- '("mypy.ini" "setup.cfg"))
-
-(flycheck-def-option-var flycheck-python-mypy-cache-dir nil python-mypy
- "Directory used to write .mypy_cache directories."
- :type '(choice
- (const :tag "Write to the working directory" nil)
- (const :tag "Never write .mypy_cache directories" null-device)
- (string :tag "Path"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker python-mypy
- "Mypy syntax and type checker. Requires mypy>=0.580.
-
-See URL `http://mypy-lang.org/'."
- :command ("mypy"
- "--show-column-numbers"
- (config-file "--config-file" flycheck-python-mypy-config)
- (option "--cache-dir" flycheck-python-mypy-cache-dir)
- source-original)
- :error-patterns
- ((error line-start (file-name) ":" line (optional ":" column)
- ": error:" (message) line-end)
- (warning line-start (file-name) ":" line (optional ":" column)
- ": warning:" (message) line-end)
- (info line-start (file-name) ":" line (optional ":" column)
- ": note:" (message) line-end))
- :modes python-mode
- ;; Ensure the file is saved, to work around
- ;; https://github.com/python/mypy/issues/4746.
- :predicate flycheck-buffer-saved-p)
-
-(flycheck-def-option-var flycheck-lintr-caching t r-lintr
- "Whether to enable caching in lintr.
-
-By default, lintr caches all expressions in a file and re-checks
-only those that have changed. Setting this option to nil
-disables caching in case there are problems."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.23"))
-
-(flycheck-def-option-var flycheck-lintr-linters "default_linters" r-lintr
- "Linters to use with lintr.
-
-The value of this variable is a string containing an R
-expression, which selects linters for lintr."
- :type 'string
- :risky t
- :package-version '(flycheck . "0.23"))
-
-(defun flycheck-r-has-lintr (checker)
- "Whether CHECKER (R) has installed the `lintr' library."
- (eql 0 (flycheck-call-checker-process
- checker nil nil nil
- "--slave" "--restore" "--no-save" "-e"
- "library('lintr')")))
-
-(flycheck-define-checker r-lintr
- "An R style and syntax checker using the lintr package.
-
-See URL `https://github.com/jimhester/lintr'."
- :command ("R" "--slave" "--restore" "--no-save" "-e"
- (eval (concat
- "library(lintr);"
- "try(lint(commandArgs(TRUE)"
- ", cache=" (if flycheck-lintr-caching "TRUE" "FALSE")
- ", " flycheck-lintr-linters
- "))"))
- "--args" source)
- :error-patterns
- ((info line-start (file-name) ":" line ":" column ": style: " (message)
- line-end)
- (warning line-start (file-name) ":" line ":" column ": warning: " (message)
- line-end)
- (error line-start (file-name) ":" line ":" column ": error: " (message)
- line-end))
- :modes (ess-mode ess-r-mode)
- :predicate
- ;; Don't check ESS files which do not contain R, and make sure that lintr is
- ;; actually available
- (lambda ()
- (and (equal ess-language "S")
- (flycheck-r-has-lintr 'r-lintr)))
- :verify (lambda (checker)
- (let ((has-lintr (flycheck-r-has-lintr checker)))
- (list
- (flycheck-verification-result-new
- :label "lintr library"
- :message (if has-lintr "present" "missing")
- :face (if has-lintr 'success '(bold error)))))))
-
-(defun flycheck-racket-has-expand-p (checker)
- "Whether the executable of CHECKER provides the `expand' command."
- (eql 0 (flycheck-call-checker-process checker nil t nil "expand")))
-
-(flycheck-define-checker racket
- "A Racket syntax checker with `raco expand'.
-
-The `compiler-lib' racket package is required for this syntax
-checker.
-
-See URL `https://racket-lang.org/'."
- :command ("raco" "expand" source-inplace)
- :predicate
- (lambda ()
- (and (or (not (eq major-mode 'scheme-mode))
- ;; In `scheme-mode' we must check the current Scheme implementation
- ;; being used
- (and (boundp 'geiser-impl--implementation)
- (eq geiser-impl--implementation 'racket)))
- (flycheck-racket-has-expand-p 'racket)))
- :verify
- (lambda (checker)
- (let ((has-expand (flycheck-racket-has-expand-p checker))
- (in-scheme-mode (eq major-mode 'scheme-mode))
- (geiser-impl (bound-and-true-p geiser-impl--implementation)))
- (list
- (flycheck-verification-result-new
- :label "compiler-lib package"
- :message (if has-expand "present" "missing")
- :face (if has-expand 'success '(bold error)))
- (flycheck-verification-result-new
- :label "Geiser Implementation"
- :message (cond
- ((not in-scheme-mode) "Using Racket Mode")
- ((eq geiser-impl 'racket) "Racket")
- (geiser-impl (format "Other: %s" geiser-impl))
- (t "Geiser not active"))
- :face (cond
- ((or (not in-scheme-mode) (eq geiser-impl 'racket)) 'success)
- (t '(bold error)))))))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-increment-error-columns
- (seq-remove
- (lambda (err)
- (string-suffix-p
- "/share/racket/pkgs/compiler-lib/compiler/commands/expand.rkt"
- (flycheck-error-filename err)))
- errors))))
- :error-patterns
- ((error line-start (zero-or-more space)
- (file-name) ":" line ":" column ":" (message) line-end))
- :modes (racket-mode scheme-mode))
-
-(flycheck-define-checker rpm-rpmlint
- "A RPM SPEC file syntax checker using rpmlint.
-
-See URL `https://sourceforge.net/projects/rpmlint/'."
- :command ("rpmlint" source)
- :error-patterns
- ((error line-start
- (file-name) ":" (optional line ":") " E: " (message)
- line-end)
- (warning line-start
- (file-name) ":" (optional line ":") " W: " (message)
- line-end))
- :error-filter
- ;; Add fake line numbers if they are missing in the lint output
- (lambda (errors)
- (dolist (err errors)
- (unless (flycheck-error-line err)
- (setf (flycheck-error-line err) 1)))
- errors)
- :error-explainer
- (lambda (error)
- (-when-let* ((error-message (flycheck-error-message error))
- (message-id (save-match-data
- (string-match "\\([^ ]+\\)" error-message)
- (match-string 1 error-message))))
- (flycheck-call-checker-process-for-output
- 'rpm-rpmlint nil t "-I" message-id)))
- :modes (sh-mode rpm-spec-mode)
- :predicate (lambda () (or (not (eq major-mode 'sh-mode))
- ;; In `sh-mode', we need the proper shell
- (eq sh-shell 'rpm))))
-
-(flycheck-def-config-file-var flycheck-markdown-markdownlint-cli-config
- markdown-markdownlint-cli nil
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker markdown-markdownlint-cli
- "Markdown checker using markdownlint-cli.
-
-See URL `https://github.com/igorshubovych/markdownlint-cli'."
- :command ("markdownlint"
- (config-file "--config" flycheck-markdown-markdownlint-cli-config)
- source)
- :error-patterns
- ((error line-start
- (file-name) ":" line " " (id (one-or-more (not (any space))))
- " " (message) line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-remove-error-file-names "(string)" errors)))
- :modes (markdown-mode gfm-mode))
-
-(flycheck-def-option-var flycheck-markdown-mdl-rules nil markdown-mdl
- "Rules to enable for mdl.
-
-The value of this variable is a list of strings each of which is
-the name of a rule to enable.
-
-By default all rules are enabled.
-
-See URL `https://git.io/vhi2t'."
- :type '(repeat :tag "Enabled rules"
- (string :tag "rule name"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "27"))
-
-(flycheck-def-option-var flycheck-markdown-mdl-tags nil markdown-mdl
- "Rule tags to enable for mdl.
-
-The value of this variable is a list of strings each of which is
-the name of a rule tag. Only rules with these tags are enabled.
-
-By default all rules are enabled.
-
-See URL `https://git.io/vhi2t'."
- :type '(repeat :tag "Enabled tags"
- (string :tag "tag name"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "27"))
-
-(flycheck-def-config-file-var flycheck-markdown-mdl-style markdown-mdl nil
- :package-version '(flycheck . "27"))
-
-(flycheck-define-checker markdown-mdl
- "Markdown checker using mdl.
-
-See URL `https://github.com/markdownlint/markdownlint'."
- :command ("mdl"
- (config-file "--style" flycheck-markdown-mdl-style)
- (option "--tags=" flycheck-markdown-mdl-rules concat
- flycheck-option-comma-separated-list)
- (option "--rules=" flycheck-markdown-mdl-rules concat
- flycheck-option-comma-separated-list))
- :standard-input t
- :error-patterns
- ((error line-start
- (file-name) ":" line ": " (id (one-or-more alnum)) " " (message)
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-remove-error-file-names "(stdin)" errors)))
- :modes (markdown-mode gfm-mode))
-
-(flycheck-define-checker nix
- "Nix checker using nix-instantiate.
-
-See URL `https://nixos.org/nix/manual/#sec-nix-instantiate'."
- :command ("nix-instantiate" "--parse" "-")
- :standard-input t
- :error-patterns
- ((error line-start
- "error: " (message) " at " (file-name) ":" line ":" column
- line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-remove-error-file-names "(string)" errors)))
- :next-checkers ((warning . nix-linter))
- :modes nix-mode)
-
-(defun flycheck-parse-nix-linter (output checker buffer)
- "Parse nix-linter warnings from JSON OUTPUT.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `https://github.com/Synthetica9/nix-linter' for more
-information about nix-linter."
- (mapcar (lambda (err)
- (let-alist err
- (flycheck-error-new-at
- .pos.spanBegin.sourceLine
- .pos.spanBegin.sourceColumn
- 'warning
- .description
- :id .offense
- :checker checker
- :buffer buffer
- :filename (buffer-file-name buffer)
- :end-line .pos.spanEnd.sourceLine
- :end-column .pos.spanEnd.sourceColumn)))
- (flycheck-parse-json output)))
-
-(flycheck-define-checker nix-linter
- "Nix checker using nix-linter.
-
-See URL `https://github.com/Synthetica9/nix-linter'."
- :command ("nix-linter" "--json-stream" "-")
- :standard-input t
- :error-parser flycheck-parse-nix-linter
- :error-explainer
- (lambda (error)
- (-when-let (error-code (flycheck-error-id error))
- (flycheck-call-checker-process-for-output
- 'nix-linter nil t "--help-for" error-code)))
- :modes nix-mode)
-
-(defun flycheck-locate-sphinx-source-directory ()
- "Locate the Sphinx source directory for the current buffer.
-
-Return the source directory, or nil, if the current buffer is not
-part of a Sphinx project."
- (-when-let* ((filename (buffer-file-name))
- (dir (locate-dominating-file filename "conf.py")))
- (expand-file-name dir)))
-
-(flycheck-define-checker rst
- "A ReStructuredText (RST) syntax checker using Docutils.
-
-See URL `http://docutils.sourceforge.net/'."
- ;; include:: directives
- :command ("rst2pseudoxml.py" "--report=2" "--halt=5"
- ;; Read from standard input and throw output away
- "-" null-device)
- :standard-input t
- :error-patterns
- ((warning line-start "<stdin>:" line ": (WARNING/2) " (message) line-end)
- (error line-start "<stdin>:" line
- ": (" (or "ERROR/3" "SEVERE/4") ") "
- (message) line-end))
- :modes rst-mode)
-
-(flycheck-def-option-var flycheck-sphinx-warn-on-missing-references t rst-sphinx
- "Whether to warn about missing references in Sphinx.
-
-When non-nil (the default), warn about all missing references in
-Sphinx via `-n'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.17"))
-
-(flycheck-define-checker rst-sphinx
- "A ReStructuredText (RST) syntax checker using Sphinx.
-
-Requires Sphinx 1.2 or newer. See URL `http://sphinx-doc.org'."
- :command ("sphinx-build" "-b" "pseudoxml"
- "-q" "-N" ; Reduced output and no colors
- (option-flag "-n" flycheck-sphinx-warn-on-missing-references)
- (eval (flycheck-locate-sphinx-source-directory))
- temporary-directory ; Redirect the output to a temporary
- ; directory
- source-original) ; Sphinx needs the original document
- :error-patterns
- ((warning line-start (file-name) ":" line ": WARNING: " (message) line-end)
- (error line-start
- (file-name) ":" line
- ": " (or "ERROR" "SEVERE") ": "
- (message) line-end))
- :modes rst-mode
- :predicate (lambda () (and (flycheck-buffer-saved-p)
- (flycheck-locate-sphinx-source-directory))))
-
-(defun flycheck-ruby--find-project-root (_checker)
- "Compute an appropriate working-directory for flycheck-ruby.
-
-This is either a parent directory containing a Gemfile, or nil."
- (and
- buffer-file-name
- (locate-dominating-file buffer-file-name "Gemfile")))
-
-(flycheck-def-config-file-var flycheck-rubocoprc ruby-rubocop ".rubocop.yml")
-
-(flycheck-def-option-var flycheck-rubocop-lint-only nil
- (ruby-rubocop ruby-standard)
- "Whether to only report code issues in Rubocop and Standard.
-
-When non-nil, only report code issues, via `--lint'. Otherwise
-report style issues as well."
- :safe #'booleanp
- :type 'boolean
- :package-version '(flycheck . "0.16"))
-
-(defconst flycheck-ruby-rubocop-error-patterns
- '((info line-start (file-name) ":" line ":" column ": C: "
- (optional (id (one-or-more (not (any ":")))) ": ") (message) line-end)
- (warning line-start (file-name) ":" line ":" column ": W: "
- (optional (id (one-or-more (not (any ":")))) ": ") (message)
- line-end)
- (error line-start (file-name) ":" line ":" column ": " (or "E" "F") ": "
- (optional (id (one-or-more (not (any ":")))) ": ") (message)
- line-end)))
-
-(flycheck-def-executable-var ruby-rubocop "rubocop")
-(flycheck-define-command-checker 'ruby-rubocop
- "A Ruby syntax and style checker using the RuboCop tool.
-
-You need at least RuboCop 0.34 for this syntax checker.
-
-See URL `http://batsov.com/rubocop/'."
- ;; ruby-standard is defined based on this checker
- :command '("rubocop"
- "--display-cop-names"
- "--force-exclusion"
- "--format" "emacs"
- ;; Explicitly disable caching to prevent Rubocop 0.35.1 and earlier
- ;; from caching standard input. Later versions of Rubocop
- ;; automatically disable caching with --stdin, see
- ;; https://github.com/flycheck/flycheck/issues/844 and
- ;; https://github.com/bbatsov/rubocop/issues/2576
- "--cache" "false"
- (config-file "--config" flycheck-rubocoprc)
- (option-flag "--lint" flycheck-rubocop-lint-only)
- ;; Rubocop takes the original file name as argument when reading
- ;; from standard input
- "--stdin" source-original)
- :standard-input t
- :working-directory #'flycheck-ruby--find-project-root
- :error-patterns flycheck-ruby-rubocop-error-patterns
- :modes '(enh-ruby-mode ruby-mode)
- :next-checkers '((warning . ruby-reek)
- (warning . ruby-rubylint)))
-
-(flycheck-def-config-file-var flycheck-ruby-standardrc ruby-standard
- ".standard.yml")
-
-(flycheck-def-executable-var ruby-standard "standardrb")
-(flycheck-define-command-checker 'ruby-standard
- "A Ruby syntax and style checker using the StandardRB gem.
-
-See URL `https://github.com/testdouble/standard' for more information."
- ;; This checker is derived from ruby-rubocop; see above
- :command '("standardrb"
- "--display-cop-names"
- "--force-exclusion"
- "--format" "emacs"
- "--cache" "false"
- (config-file "--config" flycheck-ruby-standardrc)
- (option-flag "--lint" flycheck-rubocop-lint-only)
- "--stdin" source-original)
- :standard-input t
- :working-directory #'flycheck-ruby--find-project-root
- :error-patterns flycheck-ruby-rubocop-error-patterns
- :modes '(enh-ruby-mode ruby-mode)
- :next-checkers '((warning . ruby-reek)
- (warning . ruby-rubylint)))
-
-;; Default to `nil' to let Reek find its configuration file by itself
-(flycheck-def-config-file-var flycheck-reekrc ruby-reek nil
- :safe #'string-or-null-p
- :package-version '(flycheck . "30"))
-
-(flycheck-define-checker ruby-reek
- "A Ruby smell checker using reek.
-
-See URL `https://github.com/troessner/reek'."
- :command ("reek" "--format" "json"
- (config-file "--config" flycheck-reekrc)
- source)
- :error-parser flycheck-parse-reek
- :modes (enh-ruby-mode ruby-mode)
- :next-checkers ((warning . ruby-rubylint)))
-
-;; Default to `nil' to let Rubylint find its configuration file by itself, and
-;; to maintain backwards compatibility with older Rubylint and Flycheck releases
-(flycheck-def-config-file-var flycheck-rubylintrc ruby-rubylint nil)
-
-(flycheck-define-checker ruby-rubylint
- "A Ruby syntax and code analysis checker using ruby-lint.
-
-Requires ruby-lint 2.0.2 or newer. See URL
-`https://github.com/YorickPeterse/ruby-lint'."
- :command ("ruby-lint" "--presenter=syntastic"
- (config-file "--config" flycheck-rubylintrc)
- source)
- ;; Ruby Lint can't read from standard input
- :error-patterns
- ((info line-start
- (file-name) ":I:" line ":" column ": " (message) line-end)
- (warning line-start
- (file-name) ":W:" line ":" column ": " (message) line-end)
- (error line-start
- (file-name) ":E:" line ":" column ": " (message) line-end))
- :modes (enh-ruby-mode ruby-mode))
-
-(flycheck-define-checker ruby
- "A Ruby syntax checker using the standard Ruby interpreter.
-
-Please note that the output of different Ruby versions and
-implementations varies wildly. This syntax checker supports
-current versions of MRI and JRuby, but may break when used with
-other implementations or future versions of these
-implementations.
-
-Please consider using `ruby-rubocop' or `ruby-reek' instead.
-
-See URL `https://www.ruby-lang.org/'."
- :command ("ruby" "-w" "-c")
- :standard-input t
- :error-patterns
- ;; These patterns support output from JRuby, too, to deal with RVM or Rbenv
- ((error line-start "SyntaxError in -:" line ": " (message) line-end)
- (warning line-start "-:" line ":" (optional column ":")
- " warning: " (message) line-end)
- (error line-start "-:" line ": " (message) line-end))
- :modes (enh-ruby-mode ruby-mode)
- :next-checkers ((warning . ruby-rubylint)))
-
-(flycheck-define-checker ruby-jruby
- "A Ruby syntax checker using the JRuby interpreter.
-
-This syntax checker is very primitive, and may break on future
-versions of JRuby.
-
-Please consider using `ruby-rubocop' or `ruby-rubylint' instead.
-
-See URL `http://jruby.org/'."
- :command ("jruby" "-w" "-c")
- :standard-input t
- :error-patterns
- ((error line-start "SyntaxError in -:" line ": " (message) line-end)
- (warning line-start "-:" line ": warning: " (message) line-end)
- (error line-start "-:" line ": " (message) line-end))
- :modes (enh-ruby-mode ruby-mode)
- :next-checkers ((warning . ruby-rubylint)))
-
-(flycheck-def-args-var flycheck-cargo-check-args (rust-cargo)
- :package-version '(flycheck . "32"))
-
-(flycheck-def-args-var flycheck-rust-args (rust)
- :package-version '(flycheck . "0.24"))
-
-(flycheck-def-option-var flycheck-rust-check-tests t (rust-cargo rust)
- "Whether to check test code in Rust.
-
-For the `rust' checker: When non-nil, `rustc' is passed the
-`--test' flag, which will check any code marked with the
-`#[cfg(test)]' attribute and any functions marked with
-`#[test]'. Otherwise, `rustc' is not passed `--test' and test
-code will not be checked. Skipping `--test' is necessary when
-using `#![no_std]', because compiling the test runner requires
-`std'.
-
-For the `rust-cargo' checker: When non-nil, calls `cargo test
---no-run' instead of `cargo check'."
- :type 'boolean
- :safe #'booleanp
- :package-version '("flycheck" . "0.19"))
-
-(flycheck-def-option-var flycheck-rust-crate-root nil rust
- "A path to the crate root for the current buffer.
-
-The value of this variable is either a string with the path to
-the crate root for the current buffer, or nil if the current buffer
-is a crate. A relative path is relative to the current buffer.
-
-If this variable is non nil the current buffer will only be checked
-if it is not modified, i.e. after it has been saved."
- :type '(choice (const :tag "Unspecified" nil)
- (file :tag "Root"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "0.20"))
-(make-variable-buffer-local 'flycheck-rust-crate-root)
-
-(flycheck-def-option-var flycheck-rust-crate-type "lib" (rust-cargo rust)
- "The type of the Rust Crate to check.
-
-For `rust-cargo', the value should be a string denoting the
-target type passed to Cargo. See
-`flycheck-rust-valid-crate-type-p' for the list of allowed
-values.
-
-For `rust', the value should be a string denoting the crate type
-for the `--crate-type' flag of rustc."
- :type '(choice (const :tag "nil (rust/rust-cargo)" nil)
- (const :tag "lib (rust/rust-cargo)" "lib")
- (const :tag "bin (rust/rust-cargo)" "bin")
- (const :tag "example (rust-cargo)" "example")
- (const :tag "test (rust-cargo)" "test")
- (const :tag "bench (rust-cargo)" "bench")
- (const :tag "rlib (rust)" "rlib")
- (const :tag "dylib (rust)" "dylib")
- (const :tag "cdylib (rust)" "cdylib")
- (const :tag "staticlib (rust)" "staticlib")
- (const :tag "metadata (rust)" "metadata"))
- :safe #'stringp
- :package-version '(flycheck . "0.20"))
-(make-variable-buffer-local 'flycheck-rust-crate-type)
-
-(flycheck-def-option-var flycheck-rust-binary-name nil rust-cargo
- "The name of the binary to pass to `cargo check --CRATE-TYPE'.
-
-The value of this variable is a string denoting the name of the
-target to check: usually the name of the crate, or the name of
-one of the files under `src/bin', `tests', `examples' or
-`benches'.
-
-This always requires a non-nil value, unless
-`flycheck-rust-crate-type' is `lib' or nil, in which case it is
-ignored."
- :type '(choice (const :tag "Unspecified" nil)
- (string :tag "Binary name"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "28"))
-(make-variable-buffer-local 'flycheck-rust-binary-name)
-
-(flycheck-def-option-var flycheck-rust-features nil rust-cargo
- "List of features to activate during build or check.
-
-The value of this variable is a list of strings denoting features
-that will be activated to build the target to check. Features will
-be passed to `cargo check --features=FEATURES'."
- :type '(repeat :tag "Features to activate"
- (string :tag "Feature"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-(make-variable-buffer-local 'flycheck-rust-features)
-
-(flycheck-def-option-var flycheck-rust-library-path nil rust
- "A list of library directories for Rust.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the library path of Rust.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Library directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.18"))
-
-(defun flycheck--fontify-as-markdown ()
- "Place current buffer in `markdown-view-mode' and fontify it."
- (when (fboundp 'markdown-view-mode)
- (let ((markdown-fontify-code-block-default-mode 'rust-mode)
- (markdown-fontify-code-blocks-natively t)
- (markdown-hide-markup t))
- (markdown-view-mode)
- (font-lock-flush)
- (font-lock-ensure))))
-
-(defun flycheck-rust-error-explainer (error)
- "Return an explanation for the given `flycheck-error' ERROR."
- (-when-let (error-code (flycheck-error-id error))
- (lambda ()
- (flycheck-call-checker-process
- 'rust nil standard-output t "--explain" error-code)
- (with-current-buffer standard-output
- (flycheck--fontify-as-markdown)))))
-
-(defun flycheck-rust-error-filter (errors)
- "Filter ERRORS from rustc output that have no explanatory value."
- (seq-remove
- (lambda (err)
- (or
- ;; Macro errors emit a diagnostic in a phony file,
- ;; e.g. "<println macros>".
- (-when-let (filename (flycheck-error-filename err))
- (string-match-p (rx "macros>" line-end) filename))
- ;; Redundant message giving the number of failed errors
- (-when-let (msg (flycheck-error-message err))
- (string-match-p
- (rx
- (or (: "aborting due to " (optional (one-or-more num) " ")
- "previous error")
- (: "For more information about this error, try `rustc --explain "
- (one-or-more alnum) "`.")))
- msg))))
- errors))
-
-(defun flycheck-rust-manifest-directory ()
- "Return the nearest directory holding the Cargo manifest.
-
-Return the nearest directory containing the `Cargo.toml' manifest
-file, starting from the current buffer and using
-`locate-dominating-file'. Return nil if there is no such file,
-or if the current buffer has no file name."
- (and buffer-file-name
- (locate-dominating-file buffer-file-name "Cargo.toml")))
-
-(defun flycheck-rust-cargo-metadata ()
- "Run 'cargo metadata' and return the result as parsed JSON object."
- (car (flycheck-parse-json
- (flycheck-call-checker-process-for-output
- 'rust-cargo nil t
- "metadata" "--no-deps" "--format-version" "1"))))
-
-(defun flycheck-rust-cargo-workspace-root ()
- "Return the path to the workspace root of a Rust Cargo project.
-
-Return nil if the workspace root does not exist (for Rust
-versions inferior to 1.25)."
- (let-alist (flycheck-rust-cargo-metadata)
- .workspace_root))
-
-(defun flycheck-rust-cargo-has-command-p (command)
- "Whether Cargo has COMMAND in its list of commands.
-
-Execute `cargo --list' to find out whether COMMAND is present."
- (let ((cargo (funcall flycheck-executable-find "cargo")))
- (member command (mapcar #'string-trim-left
- (ignore-errors (process-lines cargo "--list"))))))
-
-(defun flycheck-rust-valid-crate-type-p (crate-type)
- "Whether CRATE-TYPE is a valid target type for Cargo.
-
-A valid Cargo target type is one of `lib', `bin', `example',
-`test' or `bench'."
- (member crate-type '(nil "lib" "bin" "example" "test" "bench")))
-
-(flycheck-define-checker rust-cargo
- "A Rust syntax checker using Cargo.
-
-This syntax checker requires Rust 1.17 or newer. See URL
-`https://www.rust-lang.org'."
- :command ("cargo"
- (eval (if flycheck-rust-check-tests
- "test"
- "check"))
- (eval (when flycheck-rust-check-tests
- "--no-run"))
- (eval (when flycheck-rust-crate-type
- (concat "--" flycheck-rust-crate-type)))
- ;; All crate targets except "lib" need a binary name
- (eval (when (and flycheck-rust-crate-type
- (not (string= flycheck-rust-crate-type "lib")))
- flycheck-rust-binary-name))
- (option "--features=" flycheck-rust-features concat
- flycheck-option-comma-separated-list)
- (eval flycheck-cargo-check-args)
- "--message-format=json")
- :error-parser flycheck-parse-cargo-rustc
- :error-filter (lambda (errors)
- ;; In Rust 1.25+, filenames are relative to the workspace
- ;; root.
- (let ((root (flycheck-rust-cargo-workspace-root)))
- (seq-do (lambda (err)
- ;; Some errors are crate level and do not have a
- ;; filename
- (when (flycheck-error-filename err)
- (setf (flycheck-error-filename err)
- (expand-file-name
- (flycheck-error-filename err) root))))
- (flycheck-rust-error-filter errors))))
- :error-explainer flycheck-rust-error-explainer
- :modes rust-mode
- :predicate flycheck-buffer-saved-p
- :enabled flycheck-rust-manifest-directory
- :working-directory (lambda (_) (flycheck-rust-manifest-directory))
- :verify
- (lambda (_)
- (and buffer-file-name
- (let* ((has-toml (flycheck-rust-manifest-directory))
- (valid-crate-type (flycheck-rust-valid-crate-type-p
- flycheck-rust-crate-type))
- (need-binary-name
- (and flycheck-rust-crate-type
- (not (string= flycheck-rust-crate-type "lib")))))
- (list
- (flycheck-verification-result-new
- :label "Cargo.toml"
- :message (if has-toml "Found" "Missing")
- :face (if has-toml 'success '(bold warning)))
- (flycheck-verification-result-new
- :label "Crate type"
- :message (if valid-crate-type
- (format "%s" flycheck-rust-crate-type)
- (format "%s (invalid, should be one of 'lib', 'bin', \
-'test', 'example' or 'bench')"
- flycheck-rust-crate-type))
- :face (if valid-crate-type 'success '(bold error)))
- (flycheck-verification-result-new
- :label "Binary name"
- :message (cond
- ((not need-binary-name) "Not required")
- ((not flycheck-rust-binary-name) "Required")
- (t (format "%s" flycheck-rust-binary-name)))
- :face (cond
- ((not need-binary-name) 'success)
- ((not flycheck-rust-binary-name) '(bold error))
- (t 'success))))))))
-
-(flycheck-define-checker rust
- "A Rust syntax checker using Rust compiler.
-
-This syntax checker needs Rust 1.18 or newer. See URL
-`https://www.rust-lang.org'."
- :command ("rustc"
- (option "--crate-type" flycheck-rust-crate-type)
- "--emit=mir" "-o" "/dev/null" ; avoid creating binaries
- "--error-format=json"
- (option-flag "--test" flycheck-rust-check-tests)
- (option-list "-L" flycheck-rust-library-path concat)
- (eval flycheck-rust-args)
- (eval (or flycheck-rust-crate-root
- (flycheck-substitute-argument 'source-original 'rust))))
- :error-parser flycheck-parse-rustc
- :error-filter flycheck-rust-error-filter
- :error-explainer flycheck-rust-error-explainer
- :modes rust-mode
- :predicate flycheck-buffer-saved-p)
-
-(flycheck-define-checker rust-clippy
- "A Rust syntax checker using clippy.
-
-See URL `https://github.com/rust-lang-nursery/rust-clippy'."
- :command ("cargo" "clippy" "--message-format=json")
- :error-parser flycheck-parse-cargo-rustc
- :error-filter flycheck-rust-error-filter
- :error-explainer flycheck-rust-error-explainer
- :modes rust-mode
- :predicate flycheck-buffer-saved-p
- :enabled (lambda ()
- (and (flycheck-rust-cargo-has-command-p "clippy")
- (flycheck-rust-manifest-directory)))
- :working-directory (lambda (_) (flycheck-rust-manifest-directory))
- :verify
- (lambda (_)
- (and buffer-file-name
- (let ((has-toml (flycheck-rust-manifest-directory))
- (has-clippy (flycheck-rust-cargo-has-command-p "clippy")))
- (list
- (flycheck-verification-result-new
- :label "Clippy"
- :message (if has-clippy "Found"
- "Cannot find the `cargo clippy' command")
- :face (if has-clippy 'success '(bold warning)))
- (flycheck-verification-result-new
- :label "Cargo.toml"
- :message (if has-toml "Found" "Missing")
- :face (if has-toml 'success '(bold warning))))))))
-
-(defvar flycheck-sass-scss-cache-directory nil
- "The cache directory for `sass' and `scss'.")
-
-(defun flycheck-sass-scss-cache-location ()
- "Get the cache location for `sass' and `scss'.
-
-If no cache directory exists yet, create one and return it.
-Otherwise return the previously used cache directory."
- (setq flycheck-sass-scss-cache-directory
- (or flycheck-sass-scss-cache-directory
- (make-temp-file "flycheck-sass-scss-cache" 'directory))))
-
-(flycheck-def-option-var flycheck-sass-compass nil sass
- "Whether to enable the Compass CSS framework.
-
-When non-nil, enable the Compass CSS framework, via `--compass'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.16"))
-
-(flycheck-define-checker sass
- "A Sass syntax checker using the Sass compiler.
-
-See URL `http://sass-lang.com'."
- :command ("sass"
- "--cache-location" (eval (flycheck-sass-scss-cache-location))
- (option-flag "--compass" flycheck-sass-compass)
- "--check" "--stdin")
- :standard-input t
- :error-patterns
- ((error line-start
- (or "Syntax error: " "Error: ")
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more not-newline)))
- (optional "\r") "\n" (one-or-more " ") "on line " line
- " of standard input"
- line-end)
- (warning line-start
- "WARNING: "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more not-newline)))
- (optional "\r") "\n" (one-or-more " ") "on line " line
- " of " (one-or-more not-newline)
- line-end))
- :modes sass-mode)
-
-(flycheck-def-config-file-var flycheck-sass-lintrc sass/scss-sass-lint
- ".sass-lint.yml"
- :package-version '(flycheck . "30"))
-
-(flycheck-define-checker sass/scss-sass-lint
- "A SASS/SCSS syntax checker using sass-Lint.
-
-See URL `https://github.com/sasstools/sass-lint'."
- :command ("sass-lint"
- "--verbose"
- "--no-exit"
- "--format" "Checkstyle"
- (config-file "--config" flycheck-sass-lintrc)
- source)
- :error-parser flycheck-parse-checkstyle
- :modes (sass-mode scss-mode))
-
-(flycheck-define-checker scala
- "A Scala syntax checker using the Scala compiler.
-
-See URL `https://www.scala-lang.org/'."
- :command ("scalac" "-Ystop-after:parser" source)
- :error-patterns
- ((error line-start (file-name) ":" line ": error: " (message) line-end))
- :modes scala-mode
- :next-checkers ((warning . scala-scalastyle)))
-
-(flycheck-def-config-file-var flycheck-scalastylerc scala-scalastyle nil
- :package-version '(flycheck . "0.20"))
-
-(flycheck-define-checker scala-scalastyle
- "A Scala style checker using scalastyle.
-
-Note that this syntax checker is not used if
-`flycheck-scalastylerc' is nil or refers to a non-existing file.
-
-See URL `http://www.scalastyle.org'."
- :command ("scalastyle"
- (config-file "-c" flycheck-scalastylerc)
- source)
- :error-patterns
- ((error line-start "error file=" (file-name) " message="
- (message) " line=" line (optional " column=" column) line-end)
- (warning line-start "warning file=" (file-name) " message="
- (message) " line=" line (optional " column=" column) line-end))
- :error-filter (lambda (errors)
- (flycheck-sanitize-errors
- (flycheck-increment-error-columns errors)))
- :modes scala-mode
- :predicate
- ;; Inhibit this syntax checker if the JAR or the configuration are unset or
- ;; missing
- (lambda () (and flycheck-scalastylerc
- (flycheck-locate-config-file flycheck-scalastylerc
- 'scala-scalastyle)))
- :verify (lambda (checker)
- (let ((config-file (and flycheck-scalastylerc
- (flycheck-locate-config-file
- flycheck-scalastylerc checker))))
- (list
- (flycheck-verification-result-new
- :label "Configuration file"
- :message (cond
- ((not flycheck-scalastylerc)
- "`flycheck-scalastyletrc' not set")
- ((not config-file)
- (format "file %s not found" flycheck-scalastylerc))
- (t (format "found at %s" config-file)))
- :face (cond
- ((not flycheck-scalastylerc) '(bold warning))
- ((not config-file) '(bold error))
- (t 'success)))))))
-
-(flycheck-def-args-var flycheck-scheme-chicken-args scheme-chicken
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker scheme-chicken
- "A CHICKEN Scheme syntax checker using the CHICKEN compiler `csc'.
-
-See URL `http://call-cc.org/'."
- :command ("csc" "-analyze-only" "-local"
- (eval flycheck-scheme-chicken-args)
- source)
- :error-patterns
- ((info line-start
- "Note: " (zero-or-more not-newline) ":\n"
- (one-or-more (any space)) "(" (file-name) ":" line ") " (message)
- line-end)
- (warning line-start
- "Warning: " (zero-or-more not-newline) ",\n"
- (one-or-more (any space)) (zero-or-more not-newline) ":\n"
- (one-or-more (any space)) "(" (file-name) ":" line ") " (message)
- line-end)
- (warning line-start
- "Warning: " (zero-or-more not-newline) ":\n"
- (one-or-more (any space)) "(" (file-name) ":" line ") " (message)
- line-end)
- (error line-start "Error: (line " line ") " (message) line-end)
- (error line-start "Syntax error: (" (file-name) ":" line ")"
- (zero-or-more not-newline) " - "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (zero-or-more space)
- (zero-or-more not-newline))
- (one-or-more space) "<--")
- line-end)
- ;; A of version 4.12.0, the chicken compiler doesn't provide a
- ;; line number for this error.
- (error line-start "Syntax error: "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (zero-or-more space)
- (zero-or-more not-newline))
- (one-or-more space) "<--")
- line-end)
- (error line-start
- "Error: " (zero-or-more not-newline) ":\n"
- (one-or-more (any space)) "(" (file-name) ":" line ") " (message)
- line-end)
- ;; A of version 4.12.0, the chicken compiler doesn't provide a
- ;; line number for this error.
- (error line-start "Error: "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (zero-or-more space)
- (zero-or-more not-newline))
- (one-or-more space) "<--")))
- :error-filter flycheck-fill-empty-line-numbers
- :predicate
- (lambda ()
- ;; In `scheme-mode' we must check the current Scheme implementation
- ;; being used
- (and (boundp 'geiser-impl--implementation)
- (eq geiser-impl--implementation 'chicken)))
- :verify
- (lambda (_checker)
- (let ((geiser-impl (bound-and-true-p geiser-impl--implementation)))
- (list
- (flycheck-verification-result-new
- :label "Geiser Implementation"
- :message (cond
- ((eq geiser-impl 'chicken) "Chicken Scheme")
- (geiser-impl (format "Other: %s" geiser-impl))
- (t "Geiser not active"))
- :face (cond
- ((eq geiser-impl 'chicken) 'success)
- (t '(bold error)))))))
- :modes scheme-mode)
-
-(defconst flycheck-scss-lint-checkstyle-re
- (rx "cannot load such file" (1+ not-newline) "scss_lint_reporter_checkstyle")
- "Regular expression to parse missing checkstyle error.")
-
-(defun flycheck-parse-scss-lint (output checker buffer)
- "Parse SCSS-Lint OUTPUT from CHECKER and BUFFER.
-
-Like `flycheck-parse-checkstyle', but catches errors about
-missing checkstyle reporter from SCSS-Lint."
- (if (string-match-p flycheck-scss-lint-checkstyle-re output)
- (list (flycheck-error-new-at
- 1 nil 'error "Checkstyle reporter for SCSS-Lint missing.
-Please run gem install scss_lint_reporter_checkstyle"
- :checker checker
- :buffer buffer
- :filename (buffer-file-name buffer)))
- (flycheck-parse-checkstyle output checker buffer)))
-
-(flycheck-def-config-file-var flycheck-scss-lintrc scss-lint ".scss-lint.yml"
- :package-version '(flycheck . "0.23"))
-
-(flycheck-define-checker scss-lint
- "A SCSS syntax checker using SCSS-Lint.
-
-Needs SCSS-Lint 0.43.2 or newer.
-
-See URL `https://github.com/brigade/scss-lint'."
- :command ("scss-lint"
- "--require=scss_lint_reporter_checkstyle"
- "--format=Checkstyle"
- (config-file "--config" flycheck-scss-lintrc)
- "--stdin-file-path" source-original "-")
- :standard-input t
- ;; We cannot directly parse Checkstyle XML, since for some mysterious reason
- ;; SCSS-Lint doesn't have a built-in Checkstyle reporter, and instead ships it
- ;; as an addon which might not be installed. We use a custom error parser to
- ;; check whether the addon is missing and turn that into a special kind of
- ;; Flycheck error.
- :error-parser flycheck-parse-scss-lint
- :modes scss-mode
- :verify
- (lambda (checker)
- (-when-let
- (output (flycheck-call-checker-process-for-output
- checker nil nil "--require=scss_lint_reporter_checkstyle"))
- (let ((reporter-missing
- (string-match-p flycheck-scss-lint-checkstyle-re output)))
- (list
- (flycheck-verification-result-new
- :label "checkstyle reporter"
- :message (if reporter-missing
- "scss_lint_reporter_checkstyle plugin missing"
- "present")
- :face (if reporter-missing
- '(bold error)
- 'success)))))))
-
-(flycheck-define-checker scss-stylelint
- "A SCSS syntax and style checker using stylelint.
-
-See URL `http://stylelint.io/'."
- :command ("stylelint"
- (eval flycheck-stylelint-args)
- "--syntax" "scss"
- (option-flag "--quiet" flycheck-stylelint-quiet)
- (config-file "--config" flycheck-stylelintrc))
- :standard-input t
- :error-parser flycheck-parse-stylelint
- :predicate flycheck-buffer-nonempty-p
- :modes (scss-mode))
-
-(flycheck-def-option-var flycheck-scss-compass nil scss
- "Whether to enable the Compass CSS framework.
-
-When non-nil, enable the Compass CSS framework, via `--compass'."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "0.16"))
-
-(flycheck-define-checker scss
- "A SCSS syntax checker using the SCSS compiler.
-
-See URL `http://sass-lang.com'."
- :command ("scss"
- "--cache-location" (eval (flycheck-sass-scss-cache-location))
- (option-flag "--compass" flycheck-scss-compass)
- "--check" "--stdin")
- :standard-input t
- :error-patterns
- ((error line-start
- (or "Syntax error: " "Error: ")
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more not-newline)))
- (optional "\r") "\n" (one-or-more " ") "on line " line
- " of standard input"
- line-end)
- (warning line-start
- "WARNING: "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more not-newline)))
- (optional "\r") "\n" (one-or-more " ") "on line " line
- " of an unknown file"
- line-end))
- :modes scss-mode)
-
-(flycheck-def-args-var flycheck-sh-bash-args (sh-bash)
- :package-version '(flycheck . "32"))
-
-(flycheck-define-checker sh-bash
- "A Bash syntax checker using the Bash shell.
-
-See URL `http://www.gnu.org/software/bash/'."
- :command ("bash" "--norc" "-n"
- (eval flycheck-sh-bash-args)
- "--")
- :standard-input t
- :error-patterns
- ((error line-start
- ;; The name/path of the bash executable
- (one-or-more (not (any ":"))) ":"
- ;; A label "line", possibly localized
- (one-or-more (not (any digit)))
- line (zero-or-more " ") ":" (zero-or-more " ")
- (message) line-end))
- :modes sh-mode
- :predicate (lambda () (eq sh-shell 'bash))
- :next-checkers ((warning . sh-shellcheck)))
-
-(flycheck-define-checker sh-posix-dash
- "A POSIX Shell syntax checker using the Dash shell.
-
-See URL `http://gondor.apana.org.au/~herbert/dash/'."
- :command ("dash" "-n")
- :standard-input t
- :error-patterns
- ((error line-start (one-or-more (not (any ":"))) ": " line ": " (message)))
- :modes sh-mode
- :predicate (lambda () (eq sh-shell 'sh))
- :next-checkers ((warning . sh-shellcheck)))
-
-(flycheck-define-checker sh-posix-bash
- "A POSIX Shell syntax checker using the Bash shell.
-
-See URL `http://www.gnu.org/software/bash/'."
- :command ("bash" "--posix" "--norc" "-n" "--")
- :standard-input t
- :error-patterns
- ((error line-start
- ;; The name/path of the bash executable
- (one-or-more (not (any ":"))) ":"
- ;; A label "line", possibly localized
- (one-or-more (not (any digit)))
- line (zero-or-more " ") ":" (zero-or-more " ")
- (message) line-end))
- :modes sh-mode
- :predicate (lambda () (eq sh-shell 'sh))
- :next-checkers ((warning . sh-shellcheck)))
-
-(flycheck-define-checker sh-zsh
- "A Zsh syntax checker using the Zsh shell.
-
-See URL `http://www.zsh.org/'."
- :command ("zsh" "--no-exec" "--no-globalrcs" "--no-rcs" source)
- :error-patterns
- ((error line-start (file-name) ":" line ": " (message) line-end))
- :modes sh-mode
- :predicate (lambda () (eq sh-shell 'zsh))
- :next-checkers ((warning . sh-shellcheck)))
-
-(defconst flycheck-shellcheck-supported-shells '(bash ksh88 sh)
- "Shells supported by ShellCheck.")
-
-(flycheck-def-option-var flycheck-shellcheck-excluded-warnings nil sh-shellcheck
- "A list of excluded warnings for ShellCheck.
-
-The value of this variable is a list of strings, where each
-string is a warning code to be excluded from ShellCheck reports.
-By default, no warnings are excluded."
- :type '(repeat :tag "Excluded warnings"
- (string :tag "Warning code"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.21"))
-
-(flycheck-def-option-var flycheck-shellcheck-follow-sources t sh-shellcheck
- "Whether to follow external sourced files in scripts.
-
-Shellcheck will follow and parse sourced files so long as a
-pre-runtime resolvable path to the file is present. This can
-either be part of the source command itself:
- source /full/path/to/file.txt
-or added as a shellcheck directive before the source command:
- # shellcheck source=/full/path/to/file.txt."
- :type 'boolean
- :safe #'booleanp
- :package-version '(flycheck . "31"))
-
-(flycheck-define-checker sh-shellcheck
- "A shell script syntax and style checker using Shellcheck.
-
-See URL `https://github.com/koalaman/shellcheck/'."
- :command ("shellcheck"
- "--format" "checkstyle"
- "--shell" (eval (symbol-name sh-shell))
- (option-flag "--external-sources"
- flycheck-shellcheck-follow-sources)
- (option "--exclude" flycheck-shellcheck-excluded-warnings list
- flycheck-option-comma-separated-list)
- "-")
- :standard-input t
- :error-parser flycheck-parse-checkstyle
- :error-filter
- (lambda (errors)
- (flycheck-remove-error-file-names
- "-" (flycheck-dequalify-error-ids errors)))
- :modes sh-mode
- :predicate (lambda () (memq sh-shell flycheck-shellcheck-supported-shells))
- :verify (lambda (_)
- (let ((supports-shell (memq sh-shell
- flycheck-shellcheck-supported-shells)))
- (list
- (flycheck-verification-result-new
- :label (format "Shell %s supported" sh-shell)
- :message (if supports-shell "yes" "no")
- :face (if supports-shell 'success '(bold warning))))))
- :error-explainer
- (lambda (err)
- (let ((error-code (flycheck-error-id err))
- (url "https://github.com/koalaman/shellcheck/wiki/%S"))
- (and error-code `(url . ,(format url error-code))))))
-
-(flycheck-define-checker slim
- "A Slim syntax checker using the Slim compiler.
-
-See URL `http://slim-lang.com'."
- :command ("slimrb" "--compile")
- :standard-input t
- :error-patterns
- ((error line-start
- "Slim::Parser::SyntaxError:" (message) (optional "\r") "\n "
- "STDIN, Line " line (optional ", Column " column)
- line-end))
- :modes slim-mode
- :next-checkers ((warning . slim-lint)))
-
-(flycheck-define-checker slim-lint
- "A Slim linter.
-
-See URL `https://github.com/sds/slim-lint'."
- :command ("slim-lint" "--reporter=checkstyle" source)
- :error-parser flycheck-parse-checkstyle
- :modes slim-mode)
-
-(flycheck-define-checker sql-sqlint
- "A SQL syntax checker using the sqlint tool.
-
-See URL `https://github.com/purcell/sqlint'."
- :command ("sqlint")
- :standard-input t
- :error-patterns
- ((warning line-start "stdin:" line ":" column ":WARNING "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more not-newline)))
- line-end)
- (error line-start "stdin:" line ":" column ":ERROR "
- (message (one-or-more not-newline)
- (zero-or-more "\n"
- (one-or-more " ")
- (one-or-more not-newline)))
- line-end))
- :modes (sql-mode))
-
-(flycheck-define-checker systemd-analyze
- "A systemd unit checker using systemd-analyze(1).
-
-See URL
-`https://www.freedesktop.org/software/systemd/man/systemd-analyze.html'."
- :command ("systemd-analyze" "verify" source)
- :error-parser flycheck-parse-with-patterns-without-color
- :error-patterns
- ((error line-start (file-name) ":" (optional line ":") (message) line-end)
- (error line-start "[" (file-name) ":" line "]" (message) line-end))
- :error-filter flycheck-fill-empty-line-numbers
- :modes (systemd-mode))
-
-(flycheck-def-config-file-var flycheck-chktexrc tex-chktex ".chktexrc")
-
-(flycheck-define-checker tcl-nagelfar
- "An extensible tcl syntax checker
-
-See URL `http://nagelfar.sourceforge.net/'."
- :command ("nagelfar" "-H" source)
- :error-patterns
- ;; foo.tcl: 29: E Wrong number of arguments (4) to "set"
- ;; foo.tcl: 29: W Expr without braces
- ((info line-start (file-name) ": " line ": N " (message) line-end)
- (warning line-start (file-name) ": " line ": W " (message) line-end)
- (error line-start (file-name) ": " line ": E " (message) line-end))
- :modes tcl-mode)
-
-(flycheck-define-checker terraform
- "A Terraform syntax checker with `terraform fmt'.
-
-See URL `https://www.terraform.io/docs/commands/fmt.html'."
- :command ("terraform" "fmt" "-no-color" "-")
- :standard-input t
- :error-patterns
- ((error line-start "Error: " (one-or-more not-newline)
- "\n\n on <stdin> line " line ":\n (source code not available)\n\n"
- (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n)))
- line-end))
- :next-checkers ((warning . terraform-tflint))
- :modes terraform-mode)
-
-(flycheck-def-option-var flycheck-tflint-variable-files nil terraform-tflint
- "A list of files to resolve terraform variables.
-
-The value of this variable is a list of strings, where each
-string is a file to add to the terraform variables files.
-Relative files are relative to the file being checked."
- :type '(repeat (directory :tag "Variable file"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "32"))
-
-(defun flycheck-parse-tflint-linter (output checker buffer)
- "Parse tflint warnings from JSON OUTPUT.
-
-CHECKER and BUFFER denote the CHECKER that returned OUTPUT and
-the BUFFER that was checked respectively.
-
-See URL `https://github.com/wata727/tflint' for more
-information about tflint."
- (mapcar (lambda (err)
- (let-alist err
- (flycheck-error-new-at
- .range.start.line
- .range.start.column
- (pcase .rule.severity
- ("error" 'error)
- ("warning" 'warning)
- (_ 'error))
- .message
- :end-line .range.end.line
- :end-column .range.end.column
- :id .rule.name
- :checker checker
- :buffer buffer
- :filename (buffer-file-name buffer))))
- (cdr (assq 'issues (car (flycheck-parse-json output))))))
-
-(flycheck-define-checker terraform-tflint
- "A Terraform checker using tflint.
-
-See URL `https://github.com/wata727/tflint'."
- :command ("tflint" "--format=json"
- (option-list "--var-file=" flycheck-tflint-variable-files concat)
- source-original)
- :error-parser flycheck-parse-tflint-linter
- :predicate flycheck-buffer-saved-p
- :modes terraform-mode)
-
-(flycheck-define-checker tex-chktex
- "A TeX and LaTeX syntax and style checker using chktex.
-
-See URL `http://www.nongnu.org/chktex/'."
- :command ("chktex"
- (config-file "--localrc" flycheck-chktexrc)
- ;; Compact error messages, and no version information, and execute
- ;; \input statements
- "--verbosity=0" "--quiet" "--inputfiles")
- :standard-input t
- :error-patterns
- ((warning line-start "stdin:" line ":" column ":"
- (id (one-or-more digit)) ":" (message) line-end))
- :error-filter
- (lambda (errors)
- (flycheck-sanitize-errors (flycheck-increment-error-columns errors)))
- :modes (latex-mode plain-tex-mode))
-
-(flycheck-define-checker tex-lacheck
- "A LaTeX syntax and style checker using lacheck.
-
-See URL `http://www.ctan.org/pkg/lacheck'."
- :command ("lacheck" source-inplace)
- :error-patterns
- ((warning line-start
- "\"" (file-name) "\", line " line ": " (message)
- line-end))
- :modes latex-mode)
-
-(flycheck-define-checker texinfo
- "A Texinfo syntax checker using makeinfo.
-
-See URL `http://www.gnu.org/software/texinfo/'."
- :command ("makeinfo" "-o" null-device "-")
- :standard-input t
- :error-patterns
- ((warning line-start
- "-:" line (optional ":" column) ": " "warning: " (message)
- line-end)
- (error line-start
- "-:" line (optional ":" column) ": " (message)
- line-end))
- :modes texinfo-mode)
-
-(flycheck-def-config-file-var flycheck-textlint-config
- textlint "textlintrc.json")
-
-;; This needs to be set because textlint plugins are installed separately,
-;; and there is no way to check their installation status -- textlint simply
-;; prints a backtrace.
-(flycheck-def-option-var flycheck-textlint-plugin-alist
- '((markdown-mode . "@textlint/markdown")
- (gfm-mode . "@textlint/markdown")
- (t . "@textlint/text"))
- textlint
- "An alist mapping major modes to textlint plugins.
-
-Each item is a cons cell `(MAJOR-MODE . PLUGIN)', where MAJOR-MODE is a mode
-`flycheck-textlint' supports and PLUGIN is a textlint plugin. As a catch-all,
-when MAJOR-MODE is t, that PLUGIN will be used for any supported mode that
-isn't specified.
-
-See URL `https://npms.io/search?q=textlint-plugin' for all textlint plugins
-published on NPM."
- :type '(repeat (choice (cons symbol string)
- (cons (const t) string))))
-
-(defun flycheck--textlint-get-plugin ()
- "Return the textlint plugin for the current mode."
- (cdr (-first
- (lambda (arg)
- (pcase-let ((`(,mode . _) arg))
- (or (and (booleanp mode) mode) ; mode is t
- (derived-mode-p mode))))
- flycheck-textlint-plugin-alist)))
-
-(flycheck-define-checker textlint
- "A text prose linter using textlint.
-
-See URL `https://textlint.github.io/'."
- :command ("textlint"
- (config-file "--config" flycheck-textlint-config)
- "--format" "json"
- ;; get the first matching plugin from plugin-alist
- "--plugin"
- (eval (flycheck--textlint-get-plugin))
- source)
- ;; textlint seems to say that its json output is compatible with ESLint.
- ;; https://textlint.github.io/docs/formatter.html
- :error-parser flycheck-parse-eslint
- ;; textlint can support different formats with textlint plugins, but
- ;; only text and markdown formats are installed by default. Ask the
- ;; user to add mode->plugin mappings manually in
- ;; `flycheck-textlint-plugin-alist'.
- :modes
- (text-mode markdown-mode gfm-mode message-mode adoc-mode
- mhtml-mode latex-mode org-mode rst-mode)
- :enabled
- (lambda () (flycheck--textlint-get-plugin))
- :verify
- (lambda (_)
- (let ((plugin (flycheck--textlint-get-plugin)))
- (list
- (flycheck-verification-result-new
- :label "textlint plugin"
- :message plugin
- :face 'success)))))
-
-(flycheck-def-config-file-var flycheck-typescript-tslint-config
- typescript-tslint "tslint.json"
- :package-version '(flycheck . "27"))
-
-(flycheck-def-option-var flycheck-typescript-tslint-rulesdir
- nil typescript-tslint
- "The directory of custom rules for TSLint.
-
-The value of this variable is either a string containing the path
-to a directory with custom rules, or nil, to not give any custom
-rules to TSLint.
-
-Refer to the TSLint manual at URL
-`http://palantir.github.io/tslint/usage/cli/'
-for more information about the custom directory."
- :type '(choice (const :tag "No custom rules directory" nil)
- (directory :tag "Custom rules directory"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "27"))
-
-(flycheck-def-args-var flycheck-tslint-args (typescript-tslint)
- :package-version '(flycheck . "31"))
-
-(flycheck-define-checker typescript-tslint
- "TypeScript style checker using TSLint.
-
-Note that this syntax checker is not used if
-`flycheck-typescript-tslint-config' is nil or refers to a
-non-existing file.
-
-See URL `https://github.com/palantir/tslint'."
- :command ("tslint" "--format" "json"
- (config-file "--config" flycheck-typescript-tslint-config)
- (option "--rules-dir" flycheck-typescript-tslint-rulesdir)
- (eval flycheck-tslint-args)
- source-inplace)
- :error-parser flycheck-parse-tslint
- :modes (typescript-mode))
-
-(flycheck-def-option-var flycheck-verilator-include-path nil verilog-verilator
- "A list of include directories for Verilator.
-
-The value of this variable is a list of strings, where each
-string is a directory to add to the include path of Verilator.
-Relative paths are relative to the file being checked."
- :type '(repeat (directory :tag "Include directory"))
- :safe #'flycheck-string-list-p
- :package-version '(flycheck . "0.24"))
-
-(flycheck-define-checker verilog-verilator
- "A Verilog syntax checker using the Verilator Verilog HDL simulator.
-
-See URL `https://www.veripool.org/wiki/verilator'."
- :command ("verilator" "--lint-only" "-Wall"
- (option-list "-I" flycheck-verilator-include-path concat)
- source)
- :error-patterns
- ((warning line-start "%Warning-" (zero-or-more not-newline) ": "
- (file-name) ":" line ": " (message) line-end)
- (error line-start "%Error: " (file-name) ":"
- line ": " (message) line-end))
- :modes verilog-mode)
-
-(flycheck-def-option-var flycheck-ghdl-language-standard nil vhdl-ghdl
- "The language standard to use in GHDL.
-
-The value of this variable is either a string denoting a language
-standard, or nil, to use the default standard. When non-nil,
-pass the language standard via the `--std' option."
- :type '(choice (const :tag "Default standard" nil)
- (string :tag "Language standard"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-(make-variable-buffer-local 'flycheck-ghdl-language-standard)
-
-(flycheck-def-option-var flycheck-ghdl-workdir nil vhdl-ghdl
- "The directory to use for the file library.
-
-The value of this variable is either a string with the directory
-to use for the file library, or nil, to use the default value.
-When non-nil, pass the directory via the `--workdir' option."
- :type '(choice (const :tag "Default directory" nil)
- (string :tag "Directory for the file library"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-(make-variable-buffer-local 'flycheck-ghdl-workdir)
-
-(flycheck-def-option-var flycheck-ghdl-ieee-library nil vhdl-ghdl
- "The standard to use for the IEEE library.
-
-The value of this variable is either a string denoting an ieee library
-standard, or nil, to use the default standard. When non-nil,
-pass the ieee library standard via the `--ieee' option."
- :type '(choice (const :tag "Default standard" nil)
- (const :tag "No IEEE Library" "none")
- (const :tag "IEEE standard" "standard")
- (const :tag "Synopsys standard" "synopsys")
- (const :tag "Mentor standard" "mentor"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "32"))
-(make-variable-buffer-local 'flycheck-ghdl-ieee-library)
-
-(flycheck-define-checker vhdl-ghdl
- "A VHDL syntax checker using GHDL.
-
-See URL `https://github.com/ghdl/ghdl'."
- :command ("ghdl"
- "-s" ; only do the syntax checking
- (option "--std=" flycheck-ghdl-language-standard concat)
- (option "--workdir=" flycheck-ghdl-workdir concat)
- (option "--ieee=" flycheck-ghdl-ieee-library concat)
- source)
- :error-patterns
- ((error line-start (file-name) ":" line ":" column ": " (message) line-end))
- :modes vhdl-mode)
-
-(flycheck-def-option-var flycheck-xml-xmlstarlet-xsd-path nil xml-xmlstarlet
- "An XSD schema to validate against."
- :type '(choice (const :tag "None" nil)
- (file :tag "XSD schema"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "31"))
-
-(flycheck-define-checker xml-xmlstarlet
- "A XML syntax checker and validator using the xmlstarlet utility.
-
-See URL `http://xmlstar.sourceforge.net/'."
- ;; Validate standard input with verbose error messages, and do not dump
- ;; contents to standard output
- :command ("xmlstarlet" "val" "--err" "--quiet"
- (option "--xsd" flycheck-xml-xmlstarlet-xsd-path)
- "-")
- :standard-input t
- :error-patterns
- ((error line-start "-:" line "." column ": " (message) line-end))
- :modes (xml-mode nxml-mode))
-
-(flycheck-def-option-var flycheck-xml-xmllint-xsd-path nil xml-xmllint
- "An XSD schema to validate against."
- :type '(choice (const :tag "None" nil)
- (file :tag "XSD schema"))
- :safe #'flycheck-string-or-nil-p
- :package-version '(flycheck . "31"))
-
-(flycheck-define-checker xml-xmllint
- "A XML syntax checker and validator using the xmllint utility.
-
-The xmllint is part of libxml2, see URL
-`http://www.xmlsoft.org/'."
- :command ("xmllint" "--noout"
- (option "--schema" flycheck-xml-xmllint-xsd-path)
- "-")
- :standard-input t
- :error-patterns
- ((error line-start "-:" line ": " (message) line-end))
- :modes (xml-mode nxml-mode))
-
-(flycheck-define-checker yaml-jsyaml
- "A YAML syntax checker using JS-YAML.
-
-See URL `https://github.com/nodeca/js-yaml'."
- :command ("js-yaml")
- :standard-input t
- :error-patterns
- ((error line-start
- (or "JS-YAML" "YAMLException") ": "
- (message) " at line " line ", column " column ":"
- line-end))
- :modes yaml-mode
- :next-checkers ((warning . cwl)))
-
-(flycheck-define-checker yaml-ruby
- "A YAML syntax checker using Ruby's YAML parser.
-
-This syntax checker uses the YAML parser from Ruby's standard
-library.
-
-See URL `http://www.ruby-doc.org/stdlib-2.0.0/libdoc/yaml/rdoc/YAML.html'."
- :command ("ruby" "-ryaml" "-e" "begin;
- YAML.load(STDIN); \
- rescue Exception => e; \
- STDERR.puts \"stdin:#{e}\"; \
- end")
- :standard-input t
- :error-patterns
- ((error line-start "stdin:" (zero-or-more not-newline) ":" (message)
- "at line " line " column " column line-end))
- :modes yaml-mode
- :next-checkers ((warning . cwl)))
-
-(flycheck-def-config-file-var flycheck-yamllintrc yaml-yamllint ".yamllint")
-
-(flycheck-define-checker yaml-yamllint
- "A YAML syntax checker using YAMLLint.
-See URL `https://github.com/adrienverge/yamllint'."
- :standard-input t
- :command ("yamllint" "-f" "parsable" "-"
- (config-file "-c" flycheck-yamllintrc))
- :error-patterns
- ((error line-start
- "stdin:" line ":" column ": [error] " (message) line-end)
- (warning line-start
- "stdin:" line ":" column ": [warning] " (message) line-end))
- :modes yaml-mode)
-
-(provide 'flycheck)
-
-;; Local Variables:
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; flycheck.el ends here
diff --git a/elpa/git-commit-20200701.2112/git-commit-autoloads.el b/elpa/git-commit-20200701.2112/git-commit-autoloads.el
deleted file mode 100644
index 9d01c3c..0000000
--- a/elpa/git-commit-20200701.2112/git-commit-autoloads.el
+++ /dev/null
@@ -1,53 +0,0 @@
-;;; git-commit-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "git-commit" "git-commit.el" (0 0 0 0))
-;;; Generated autoloads from git-commit.el
-
-(defvar global-git-commit-mode t "\
-Non-nil if Global Git-Commit mode is enabled.
-See the `global-git-commit-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `global-git-commit-mode'.")
-
-(custom-autoload 'global-git-commit-mode "git-commit" nil)
-
-(autoload 'global-git-commit-mode "git-commit" "\
-Edit Git commit messages.
-This global mode arranges for `git-commit-setup' to be called
-when a Git commit message file is opened. That usually happens
-when Git uses the Emacsclient as $GIT_EDITOR to have the user
-provide such a commit message.
-
-\(fn &optional ARG)" t nil)
-
-(defconst git-commit-filename-regexp "/\\(\\(\\(COMMIT\\|NOTES\\|PULLREQ\\|MERGEREQ\\|TAG\\)_EDIT\\|MERGE_\\|\\)MSG\\|\\(BRANCH\\|EDIT\\)_DESCRIPTION\\)\\'")
-
-(autoload 'git-commit-setup-check-buffer "git-commit" "\
-
-
-\(fn)" nil nil)
-
-(autoload 'git-commit-setup "git-commit" "\
-
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "git-commit" '("git-commit-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; git-commit-autoloads.el ends here
diff --git a/elpa/git-commit-20200701.2112/git-commit-pkg.el b/elpa/git-commit-20200701.2112/git-commit-pkg.el
deleted file mode 100644
index 536da8e..0000000
--- a/elpa/git-commit-20200701.2112/git-commit-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "git-commit" "20200701.2112" "Edit Git commit messages" '((emacs "25.1") (dash "20200524") (transient "20200601") (with-editor "20200522")) :commit "9ef75c1098a525a0c817a164516e67c8a13cfca7" :keywords '("git" "tools" "vc") :maintainer '("Jonas Bernoulli" . "jonas@bernoul.li") :url "https://github.com/magit/magit")
diff --git a/elpa/git-commit-20200701.2112/git-commit.el b/elpa/git-commit-20200701.2112/git-commit.el
deleted file mode 100644
index 24718c1..0000000
--- a/elpa/git-commit-20200701.2112/git-commit.el
+++ /dev/null
@@ -1,1018 +0,0 @@
-;;; git-commit.el --- Edit Git commit messages -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Authors: Jonas Bernoulli <jonas@bernoul.li>
-;; Sebastian Wiesner <lunaryorn@gmail.com>
-;; Florian Ragwitz <rafl@debian.org>
-;; Marius Vollmer <marius.vollmer@gmail.com>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Package-Requires: ((emacs "25.1") (dash "20200524") (transient "20200601") (with-editor "20200522"))
-;; Package-Version: 20200701.2112
-;; Package-Commit: 9ef75c1098a525a0c817a164516e67c8a13cfca7
-;; Keywords: git tools vc
-;; Homepage: https://github.com/magit/magit
-
-;; This file is not part of GNU Emacs.
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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 this file. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package assists the user in writing good Git commit messages.
-
-;; While Git allows for the message to be provided on the command
-;; line, it is preferable to tell Git to create the commit without
-;; actually passing it a message. Git then invokes the `$GIT_EDITOR'
-;; (or if that is undefined `$EDITOR') asking the user to provide the
-;; message by editing the file ".git/COMMIT_EDITMSG" (or another file
-;; in that directory, e.g. ".git/MERGE_MSG" for merge commits).
-
-;; When `global-git-commit-mode' is enabled, which it is by default,
-;; then opening such a file causes the features described below, to
-;; be enabled in that buffer. Normally this would be done using a
-;; major-mode but to allow the use of any major-mode, as the user sees
-;; fit, it is done here by running a setup function, which among other
-;; things turns on the preferred major-mode, by default `text-mode'.
-
-;; Git waits for the `$EDITOR' to finish and then either creates the
-;; commit using the contents of the file as commit message, or, if the
-;; editor process exited with a non-zero exit status, aborts without
-;; creating a commit. Unfortunately Emacsclient (which is what Emacs
-;; users should be using as `$EDITOR' or at least as `$GIT_EDITOR')
-;; does not differentiate between "successfully" editing a file and
-;; aborting; not out of the box that is.
-
-;; By making use of the `with-editor' package this package provides
-;; both ways of finish an editing session. In either case the file
-;; is saved, but Emacseditor's exit code differs.
-;;
-;; C-c C-c Finish the editing session successfully by returning
-;; with exit code 0. Git then creates the commit using
-;; the message it finds in the file.
-;;
-;; C-c C-k Aborts the edit editing session by returning with exit
-;; code 1. Git then aborts the commit.
-
-;; Aborting the commit does not cause the message to be lost, but
-;; relying solely on the file not being tampered with is risky. This
-;; package additionally stores all aborted messages for the duration
-;; of the current session (i.e. until you close Emacs). To get back
-;; an aborted message use M-p and M-n while editing a message.
-;;
-;; M-p Replace the buffer contents with the previous message
-;; from the message ring. Of course only after storing
-;; the current content there too.
-;;
-;; M-n Replace the buffer contents with the next message from
-;; the message ring, after storing the current content.
-
-;; Some support for pseudo headers as used in some projects is
-;; provided by these commands:
-;;
-;; C-c C-s Insert a Signed-off-by header.
-;; C-c C-a Insert a Acked-by header.
-;; C-c C-m Insert a Modified-by header.
-;; C-c C-t Insert a Tested-by header.
-;; C-c C-r Insert a Reviewed-by header.
-;; C-c C-o Insert a Cc header.
-;; C-c C-p Insert a Reported-by header.
-;; C-c C-i Insert a Suggested-by header.
-
-;; When Git requests a commit message from the user, it does so by
-;; having her edit a file which initially contains some comments,
-;; instructing her what to do, and providing useful information, such
-;; as which files were modified. These comments, even when left
-;; intact by the user, do not become part of the commit message. This
-;; package ensures these comments are propertizes as such and further
-;; prettifies them by using different faces for various parts, such as
-;; files.
-
-;; Finally this package highlights style errors, like lines that are
-;; too long, or when the second line is not empty. It may even nag
-;; you when you attempt to finish the commit without having fixed
-;; these issues. The style checks and many other settings can easily
-;; be configured:
-;;
-;; M-x customize-group RET git-commit RET
-
-;;; Code:
-;;;; Dependencies
-
-(require 'dash)
-(require 'log-edit)
-(require 'magit-git nil t)
-(require 'magit-utils nil t)
-(require 'ring)
-(require 'server)
-(require 'transient)
-(require 'with-editor)
-
-(eval-when-compile
- (require 'recentf)
- (require 'subr-x))
-
-;;;; Declarations
-
-(defvar diff-default-read-only)
-(defvar flyspell-generic-check-word-predicate)
-(defvar font-lock-beg)
-(defvar font-lock-end)
-
-(declare-function magit-completing-read "magit-utils"
- (prompt collection &optional predicate require-match
- initial-input hist def fallback))
-(declare-function magit-expand-git-file-name "magit-git" (filename))
-(declare-function magit-git-lines "magit-git" (&rest args))
-(declare-function magit-list-local-branch-names "magit-git" ())
-(declare-function magit-list-remote-branch-names "magit-git"
- (&optional remote relative))
-
-;;; Options
-;;;; Variables
-
-(defgroup git-commit nil
- "Edit Git commit messages."
- :prefix "git-commit-"
- :link '(info-link "(magit)Editing Commit Messages")
- :group 'tools)
-
-;;;###autoload
-(define-minor-mode global-git-commit-mode
- "Edit Git commit messages.
-This global mode arranges for `git-commit-setup' to be called
-when a Git commit message file is opened. That usually happens
-when Git uses the Emacsclient as $GIT_EDITOR to have the user
-provide such a commit message."
- :group 'git-commit
- :type 'boolean
- :global t
- :init-value t
- :initialize (lambda (symbol exp)
- (custom-initialize-default symbol exp)
- (when global-git-commit-mode
- (add-hook 'find-file-hook 'git-commit-setup-check-buffer)))
- (if global-git-commit-mode
- (add-hook 'find-file-hook 'git-commit-setup-check-buffer)
- (remove-hook 'find-file-hook 'git-commit-setup-check-buffer)))
-
-(defcustom git-commit-major-mode 'text-mode
- "Major mode used to edit Git commit messages.
-The major mode configured here is turned on by the minor mode
-`git-commit-mode'."
- :group 'git-commit
- :type '(choice (function-item text-mode)
- (function-item markdown-mode)
- (function-item org-mode)
- (function :tag "Another mode")
- (const :tag "No major mode")))
-
-(defcustom git-commit-setup-hook
- '(git-commit-save-message
- git-commit-setup-changelog-support
- git-commit-turn-on-auto-fill
- git-commit-propertize-diff
- bug-reference-mode
- with-editor-usage-message)
- "Hook run at the end of `git-commit-setup'."
- :group 'git-commit
- :type 'hook
- :get (and (featurep 'magit-utils) 'magit-hook-custom-get)
- :options '(git-commit-save-message
- git-commit-setup-changelog-support
- git-commit-turn-on-auto-fill
- git-commit-turn-on-flyspell
- git-commit-propertize-diff
- bug-reference-mode
- with-editor-usage-message))
-
-(defcustom git-commit-post-finish-hook nil
- "Hook run after the user finished writing a commit message.
-
-\\<with-editor-mode-map>\
-This hook is only run after pressing \\[with-editor-finish] in a buffer used
-to edit a commit message. If a commit is created without the
-user typing a message into a buffer, then this hook is not run.
-
-This hook is not run until the new commit has been created. If
-doing so takes Git longer than one second, then this hook isn't
-run at all. For certain commands such as `magit-rebase-continue'
-this hook is never run because doing so would lead to a race
-condition.
-
-This hook is only run if `magit' is available.
-
-Also see `magit-post-commit-hook'."
- :group 'git-commit
- :type 'hook
- :get (and (featurep 'magit-utils) 'magit-hook-custom-get))
-
-(defcustom git-commit-finish-query-functions
- '(git-commit-check-style-conventions)
- "List of functions called to query before performing commit.
-
-The commit message buffer is current while the functions are
-called. If any of them returns nil, then the commit is not
-performed and the buffer is not killed. The user should then
-fix the issue and try again.
-
-The functions are called with one argument. If it is non-nil,
-then that indicates that the user used a prefix argument to
-force finishing the session despite issues. Functions should
-usually honor this wish and return non-nil."
- :options '(git-commit-check-style-conventions)
- :type 'hook
- :group 'git-commit)
-
-(defcustom git-commit-style-convention-checks '(non-empty-second-line)
- "List of checks performed by `git-commit-check-style-conventions'.
-Valid members are `non-empty-second-line' and `overlong-summary-line'.
-That function is a member of `git-commit-finish-query-functions'."
- :options '(non-empty-second-line overlong-summary-line)
- :type '(list :convert-widget custom-hook-convert-widget)
- :group 'git-commit)
-
-(defcustom git-commit-summary-max-length 68
- "Column beyond which characters in the summary lines are highlighted.
-
-The highlighting indicates that the summary is getting too long
-by some standards. It does in no way imply that going over the
-limit a few characters or in some cases even many characters is
-anything that deserves shaming. It's just a friendly reminder
-that if you can make the summary shorter, then you might want
-to consider doing so."
- :group 'git-commit
- :safe 'numberp
- :type 'number)
-
-(defcustom git-commit-fill-column nil
- "Override `fill-column' in commit message buffers.
-
-If this is non-nil, then it should be an integer. If that is the
-case and the buffer-local value of `fill-column' is not already
-set by the time `git-commit-turn-on-auto-fill' is called as a
-member of `git-commit-setup-hook', then that function sets the
-buffer-local value of `fill-column' to the value of this option.
-
-This option exists mostly for historic reasons. If you are not
-already using it, then you probably shouldn't start doing so."
- :group 'git-commit
- :safe 'numberp
- :type '(choice (const :tag "use regular fill-column")
- number))
-
-(make-obsolete-variable 'git-commit-fill-column 'fill-column
- "Magit 2.11.0" 'set)
-
-(defcustom git-commit-known-pseudo-headers
- '("Signed-off-by" "Acked-by" "Modified-by" "Cc"
- "Suggested-by" "Reported-by" "Tested-by" "Reviewed-by"
- "Co-authored-by")
- "A list of Git pseudo headers to be highlighted."
- :group 'git-commit
- :safe (lambda (val) (and (listp val) (-all-p 'stringp val)))
- :type '(repeat string))
-
-;;;; Faces
-
-(defgroup git-commit-faces nil
- "Faces used for highlighting Git commit messages."
- :prefix "git-commit-"
- :group 'git-commit
- :group 'faces)
-
-(defface git-commit-summary
- '((t :inherit font-lock-type-face))
- "Face used for the summary in commit messages."
- :group 'git-commit-faces)
-
-(defface git-commit-overlong-summary
- '((t :inherit font-lock-warning-face))
- "Face used for the tail of overlong commit message summaries."
- :group 'git-commit-faces)
-
-(defface git-commit-nonempty-second-line
- '((t :inherit font-lock-warning-face))
- "Face used for non-whitespace on the second line of commit messages."
- :group 'git-commit-faces)
-
-(defface git-commit-keyword
- '((t :inherit font-lock-string-face))
- "Face used for keywords in commit messages.
-In this context a \"keyword\" is text surrounded be brackets."
- :group 'git-commit-faces)
-
-(define-obsolete-face-alias 'git-commit-note
- 'git-commit-keyword "Git-Commit 3.0.0")
-
-(defface git-commit-pseudo-header
- '((t :inherit font-lock-string-face))
- "Face used for pseudo headers in commit messages."
- :group 'git-commit-faces)
-
-(defface git-commit-known-pseudo-header
- '((t :inherit font-lock-keyword-face))
- "Face used for the keywords of known pseudo headers in commit messages."
- :group 'git-commit-faces)
-
-(defface git-commit-comment-branch-local
- (if (featurep 'magit)
- '((t :inherit magit-branch-local))
- '((t :inherit font-lock-variable-name-face)))
- "Face used for names of local branches in commit message comments."
- :group 'git-commit-faces)
-
-(define-obsolete-face-alias 'git-commit-comment-branch
- 'git-commit-comment-branch-local "Git-Commit 2.12.0")
-
-(defface git-commit-comment-branch-remote
- (if (featurep 'magit)
- '((t :inherit magit-branch-remote))
- '((t :inherit font-lock-variable-name-face)))
- "Face used for names of remote branches in commit message comments.
-This is only used if Magit is available."
- :group 'git-commit-faces)
-
-(defface git-commit-comment-detached
- '((t :inherit git-commit-comment-branch-local))
- "Face used for detached `HEAD' in commit message comments."
- :group 'git-commit-faces)
-
-(defface git-commit-comment-heading
- '((t :inherit git-commit-known-pseudo-header))
- "Face used for headings in commit message comments."
- :group 'git-commit-faces)
-
-(defface git-commit-comment-file
- '((t :inherit git-commit-pseudo-header))
- "Face used for file names in commit message comments."
- :group 'git-commit-faces)
-
-(defface git-commit-comment-action
- '((t :inherit bold))
- "Face used for actions in commit message comments."
- :group 'git-commit-faces)
-
-;;; Keymap
-
-(defvar git-commit-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "M-p") 'git-commit-prev-message)
- (define-key map (kbd "M-n") 'git-commit-next-message)
- (define-key map (kbd "C-c C-i") 'git-commit-insert-pseudo-header)
- (define-key map (kbd "C-c C-a") 'git-commit-ack)
- (define-key map (kbd "C-c M-i") 'git-commit-suggested)
- (define-key map (kbd "C-c C-m") 'git-commit-modified)
- (define-key map (kbd "C-c C-o") 'git-commit-cc)
- (define-key map (kbd "C-c C-p") 'git-commit-reported)
- (define-key map (kbd "C-c C-r") 'git-commit-review)
- (define-key map (kbd "C-c C-s") 'git-commit-signoff)
- (define-key map (kbd "C-c C-t") 'git-commit-test)
- (define-key map (kbd "C-c M-s") 'git-commit-save-message)
- map)
- "Key map used by `git-commit-mode'.")
-
-;;; Menu
-
-(require 'easymenu)
-(easy-menu-define git-commit-mode-menu git-commit-mode-map
- "Git Commit Mode Menu"
- '("Commit"
- ["Previous" git-commit-prev-message t]
- ["Next" git-commit-next-message t]
- "-"
- ["Ack" git-commit-ack :active t
- :help "Insert an 'Acked-by' header"]
- ["Sign-Off" git-commit-signoff :active t
- :help "Insert a 'Signed-off-by' header"]
- ["Modified-by" git-commit-modified :active t
- :help "Insert a 'Modified-by' header"]
- ["Tested-by" git-commit-test :active t
- :help "Insert a 'Tested-by' header"]
- ["Reviewed-by" git-commit-review :active t
- :help "Insert a 'Reviewed-by' header"]
- ["CC" git-commit-cc t
- :help "Insert a 'Cc' header"]
- ["Reported" git-commit-reported :active t
- :help "Insert a 'Reported-by' header"]
- ["Suggested" git-commit-suggested t
- :help "Insert a 'Suggested-by' header"]
- ["Co-authored-by" git-commit-co-authored t
- :help "Insert a 'Co-authored-by' header"]
- "-"
- ["Save" git-commit-save-message t]
- ["Cancel" with-editor-cancel t]
- ["Commit" with-editor-finish t]))
-
-;;; Hooks
-
-;;;###autoload
-(defconst git-commit-filename-regexp "/\\(\
-\\(\\(COMMIT\\|NOTES\\|PULLREQ\\|MERGEREQ\\|TAG\\)_EDIT\\|MERGE_\\|\\)MSG\
-\\|\\(BRANCH\\|EDIT\\)_DESCRIPTION\\)\\'")
-
-(eval-after-load 'recentf
- '(add-to-list 'recentf-exclude git-commit-filename-regexp))
-
-(add-to-list 'with-editor-file-name-history-exclude git-commit-filename-regexp)
-
-(defun git-commit-setup-font-lock-in-buffer ()
- (and buffer-file-name
- (string-match-p git-commit-filename-regexp buffer-file-name)
- (git-commit-setup-font-lock)))
-
-(add-hook 'after-change-major-mode-hook 'git-commit-setup-font-lock-in-buffer)
-
-;;;###autoload
-(defun git-commit-setup-check-buffer ()
- (and buffer-file-name
- (string-match-p git-commit-filename-regexp buffer-file-name)
- (git-commit-setup)))
-
-(defvar git-commit-mode)
-
-(defun git-commit-file-not-found ()
- ;; cygwin git will pass a cygwin path (/cygdrive/c/foo/.git/...),
- ;; try to handle this in window-nt Emacs.
- (--when-let
- (and (or (string-match-p git-commit-filename-regexp buffer-file-name)
- (and (boundp 'git-rebase-filename-regexp)
- (string-match-p git-rebase-filename-regexp
- buffer-file-name)))
- (not (file-accessible-directory-p
- (file-name-directory buffer-file-name)))
- (if (require 'magit-git nil t)
- ;; Emacs prepends a "c:".
- (magit-expand-git-file-name (substring buffer-file-name 2))
- ;; Fallback if we can't load `magit-git'.
- (and (string-match "\\`[a-z]:/\\(cygdrive/\\)?\\([a-z]\\)/\\(.*\\)"
- buffer-file-name)
- (concat (match-string 2 buffer-file-name) ":/"
- (match-string 3 buffer-file-name)))))
- (when (file-accessible-directory-p (file-name-directory it))
- (let ((inhibit-read-only t))
- (insert-file-contents it t)
- t))))
-
-(when (eq system-type 'windows-nt)
- (add-hook 'find-file-not-found-functions #'git-commit-file-not-found))
-
-(defconst git-commit-usage-message "\
-Type \\[with-editor-finish] to finish, \
-\\[with-editor-cancel] to cancel, and \
-\\[git-commit-prev-message] and \\[git-commit-next-message] \
-to recover older messages")
-
-;;;###autoload
-(defun git-commit-setup ()
- (when (fboundp 'magit-toplevel)
- ;; `magit-toplevel' is autoloaded and defined in magit-git.el,
- ;; That library declares this functions without loading
- ;; magit-process.el, which defines it.
- (require 'magit-process nil t))
- ;; Pretend that git-commit-mode is a major-mode,
- ;; so that directory-local settings can be used.
- (let ((default-directory
- (or (and (not (file-exists-p ".dir-locals.el"))
- ;; When $GIT_DIR/.dir-locals.el doesn't exist,
- ;; fallback to $GIT_WORK_TREE/.dir-locals.el,
- ;; because the maintainer can use the latter
- ;; to enforce conventions, while s/he has no
- ;; control over the former.
- (fboundp 'magit-toplevel) ; silence byte-compiler
- (magit-toplevel))
- default-directory)))
- (let ((buffer-file-name nil) ; trick hack-dir-local-variables
- (major-mode 'git-commit-mode)) ; trick dir-locals-collect-variables
- (hack-dir-local-variables)
- (hack-local-variables-apply)))
- (when git-commit-major-mode
- (let ((auto-mode-alist (list (cons (concat "\\`"
- (regexp-quote buffer-file-name)
- "\\'")
- git-commit-major-mode)))
- ;; The major-mode hook might want to consult these minor
- ;; modes, while the minor-mode hooks might want to consider
- ;; the major mode.
- (git-commit-mode t)
- (with-editor-mode t))
- (normal-mode t)))
- ;; Show our own message using our hook.
- (setq with-editor-show-usage nil)
- (setq with-editor-usage-message git-commit-usage-message)
- (unless with-editor-mode
- ;; Maybe already enabled when using `shell-command' or an Emacs shell.
- (with-editor-mode 1))
- (add-hook 'with-editor-finish-query-functions
- 'git-commit-finish-query-functions nil t)
- (add-hook 'with-editor-pre-finish-hook
- 'git-commit-save-message nil t)
- (add-hook 'with-editor-pre-cancel-hook
- 'git-commit-save-message nil t)
- (when (and (fboundp 'magit-rev-parse)
- (not (memq last-command
- '(magit-sequencer-continue
- magit-sequencer-skip
- magit-am-continue
- magit-am-skip
- magit-rebase-continue
- magit-rebase-skip))))
- (add-hook 'with-editor-post-finish-hook
- (apply-partially 'git-commit-run-post-finish-hook
- (magit-rev-parse "HEAD"))
- nil t)
- (when (fboundp 'magit-wip-maybe-add-commit-hook)
- (magit-wip-maybe-add-commit-hook)))
- (setq with-editor-cancel-message
- 'git-commit-cancel-message)
- (make-local-variable 'log-edit-comment-ring-index)
- (git-commit-mode 1)
- (git-commit-setup-font-lock)
- (when (boundp 'save-place)
- (setq save-place nil))
- (save-excursion
- (goto-char (point-min))
- (when (looking-at "\\`\\(\\'\\|\n[^\n]\\)")
- (open-line 1)))
- (with-demoted-errors "Error running git-commit-setup-hook: %S"
- (run-hooks 'git-commit-setup-hook))
- (set-buffer-modified-p nil))
-
-(defun git-commit-run-post-finish-hook (previous)
- (when (and git-commit-post-finish-hook
- (require 'magit nil t)
- (fboundp 'magit-rev-parse))
- (cl-block nil
- (let ((break (time-add (current-time)
- (seconds-to-time 1))))
- (while (equal (magit-rev-parse "HEAD") previous)
- (if (time-less-p (current-time) break)
- (sit-for 0.01)
- (message "No commit created after 1 second. Not running %s."
- 'git-commit-post-finish-hook)
- (cl-return))))
- (run-hooks 'git-commit-post-finish-hook))))
-
-(define-minor-mode git-commit-mode
- "Auxiliary minor mode used when editing Git commit messages.
-This mode is only responsible for setting up some key bindings.
-Don't use it directly, instead enable `global-git-commit-mode'."
- :lighter "")
-
-(put 'git-commit-mode 'permanent-local t)
-
-(defun git-commit-setup-changelog-support ()
- "Treat ChangeLog entries as unindented paragraphs."
- (setq-local fill-indent-according-to-mode t)
- (setq-local paragraph-start (concat paragraph-start "\\|\\*\\|(")))
-
-(defun git-commit-turn-on-auto-fill ()
- "Unconditionally turn on Auto Fill mode.
-If `git-commit-fill-column' is non-nil, and `fill-column'
-doesn't already have a buffer-local value, then set that
-to `git-commit-fill-column'."
- (when (and (numberp git-commit-fill-column)
- (not (local-variable-p 'fill-column)))
- (setq fill-column git-commit-fill-column))
- (setq-local comment-auto-fill-only-comments nil)
- (turn-on-auto-fill))
-
-(defun git-commit-turn-on-flyspell ()
- "Unconditionally turn on Flyspell mode.
-Also prevent comments from being checked and
-finally check current non-comment text."
- (require 'flyspell)
- (turn-on-flyspell)
- (setq flyspell-generic-check-word-predicate
- 'git-commit-flyspell-verify)
- (let ((end)
- (comment-start-regex (format "^\\(%s\\|$\\)" comment-start)))
- (save-excursion
- (goto-char (point-max))
- (while (and (not (bobp)) (looking-at comment-start-regex))
- (forward-line -1))
- (unless (looking-at comment-start-regex)
- (forward-line))
- (setq end (point)))
- (flyspell-region (point-min) end)))
-
-(defun git-commit-flyspell-verify ()
- (not (= (char-after (line-beginning-position))
- (aref comment-start 0))))
-
-(defun git-commit-finish-query-functions (force)
- (run-hook-with-args-until-failure
- 'git-commit-finish-query-functions force))
-
-(defun git-commit-check-style-conventions (force)
- "Check for violations of certain basic style conventions.
-
-For each violation ask the user if she wants to proceed anyway.
-Option `git-commit-check-style-conventions' controls which
-conventions are checked."
- (or force
- (save-excursion
- (goto-char (point-min))
- (re-search-forward (git-commit-summary-regexp) nil t)
- (if (equal (match-string 1) "")
- t ; Just try; we don't know whether --allow-empty-message was used.
- (and (or (not (memq 'overlong-summary-line
- git-commit-style-convention-checks))
- (equal (match-string 2) "")
- (y-or-n-p "Summary line is too long. Commit anyway? "))
- (or (not (memq 'non-empty-second-line
- git-commit-style-convention-checks))
- (not (match-string 3))
- (y-or-n-p "Second line is not empty. Commit anyway? ")))))))
-
-(defun git-commit-cancel-message ()
- (message
- (concat "Commit canceled"
- (and (memq 'git-commit-save-message with-editor-pre-cancel-hook)
- ". Message saved to `log-edit-comment-ring'"))))
-
-;;; History
-
-(defun git-commit-prev-message (arg)
- "Cycle backward through message history, after saving current message.
-With a numeric prefix ARG, go back ARG comments."
- (interactive "*p")
- (when (and (git-commit-save-message) (> arg 0))
- (setq log-edit-comment-ring-index
- (log-edit-new-comment-index
- arg (ring-length log-edit-comment-ring))))
- (save-restriction
- (goto-char (point-min))
- (narrow-to-region (point)
- (if (re-search-forward (concat "^" comment-start) nil t)
- (max 1 (- (point) 2))
- (point-max)))
- (log-edit-previous-comment arg)))
-
-(defun git-commit-next-message (arg)
- "Cycle forward through message history, after saving current message.
-With a numeric prefix ARG, go forward ARG comments."
- (interactive "*p")
- (git-commit-prev-message (- arg)))
-
-(defun git-commit-save-message ()
- "Save current message to `log-edit-comment-ring'."
- (interactive)
- (when-let ((message (git-commit-buffer-message)))
- (when-let ((index (ring-member log-edit-comment-ring message)))
- (ring-remove log-edit-comment-ring index))
- (ring-insert log-edit-comment-ring message)))
-
-(defun git-commit-buffer-message ()
- (let ((flush (concat "^" comment-start))
- (str (buffer-substring-no-properties (point-min) (point-max))))
- (with-temp-buffer
- (insert str)
- (goto-char (point-min))
- (when (re-search-forward (concat flush " -+ >8 -+$") nil t)
- (delete-region (point-at-bol) (point-max)))
- (goto-char (point-min))
- (flush-lines flush)
- (goto-char (point-max))
- (unless (eq (char-before) ?\n)
- (insert ?\n))
- (setq str (buffer-string)))
- (unless (string-match "\\`[ \t\n\r]*\\'" str)
- (when (string-match "\\`\n\\{2,\\}" str)
- (setq str (replace-match "\n" t t str)))
- (when (string-match "\n\\{2,\\}\\'" str)
- (setq str (replace-match "\n" t t str)))
- str)))
-
-;;; Headers
-
-(transient-define-prefix git-commit-insert-pseudo-header ()
- "Insert a commit message pseudo header."
- [["Insert ... by yourself"
- ("a" "Ack" git-commit-ack)
- ("m" "Modified" git-commit-modified)
- ("r" "Reviewed" git-commit-review)
- ("s" "Signed-off" git-commit-signoff)
- ("t" "Tested" git-commit-test)]
- ["Insert ... by someone"
- ("C-c" "Cc" git-commit-cc)
- ("C-r" "Reported" git-commit-reported)
- ("C-i" "Suggested" git-commit-suggested)
- ("C-a" "Co-authored" git-commit-co-authored)]])
-
-(defun git-commit-ack (name mail)
- "Insert a header acknowledging that you have looked at the commit."
- (interactive (git-commit-self-ident))
- (git-commit-insert-header "Acked-by" name mail))
-
-(defun git-commit-modified (name mail)
- "Insert a header to signal that you have modified the commit."
- (interactive (git-commit-self-ident))
- (git-commit-insert-header "Modified-by" name mail))
-
-(defun git-commit-review (name mail)
- "Insert a header acknowledging that you have reviewed the commit."
- (interactive (git-commit-self-ident))
- (git-commit-insert-header "Reviewed-by" name mail))
-
-(defun git-commit-signoff (name mail)
- "Insert a header to sign off the commit."
- (interactive (git-commit-self-ident))
- (git-commit-insert-header "Signed-off-by" name mail))
-
-(defun git-commit-test (name mail)
- "Insert a header acknowledging that you have tested the commit."
- (interactive (git-commit-self-ident))
- (git-commit-insert-header "Tested-by" name mail))
-
-(defun git-commit-cc (name mail)
- "Insert a header mentioning someone who might be interested."
- (interactive (git-commit-read-ident "Cc"))
- (git-commit-insert-header "Cc" name mail))
-
-(defun git-commit-reported (name mail)
- "Insert a header mentioning the person who reported the issue."
- (interactive (git-commit-read-ident "Reported-by"))
- (git-commit-insert-header "Reported-by" name mail))
-
-(defun git-commit-suggested (name mail)
- "Insert a header mentioning the person who suggested the change."
- (interactive (git-commit-read-ident "Suggested-by"))
- (git-commit-insert-header "Suggested-by" name mail))
-
-(defun git-commit-co-authored (name mail)
- "Insert a header mentioning the person who co-authored the commit."
- (interactive (git-commit-read-ident "Co-authored-by"))
- (git-commit-insert-header "Co-authored-by" name mail))
-
-(defun git-commit-self-ident ()
- (list (or (getenv "GIT_AUTHOR_NAME")
- (getenv "GIT_COMMITTER_NAME")
- (ignore-errors (car (process-lines "git" "config" "user.name")))
- user-full-name
- (read-string "Name: "))
- (or (getenv "GIT_AUTHOR_EMAIL")
- (getenv "GIT_COMMITTER_EMAIL")
- (getenv "EMAIL")
- (ignore-errors (car (process-lines "git" "config" "user.email")))
- (read-string "Email: "))))
-
-(defvar git-commit-read-ident-history nil)
-
-(defun git-commit-read-ident (prompt)
- (if (require 'magit-git nil t)
- (let ((str (magit-completing-read
- prompt
- (sort (delete-dups
- (magit-git-lines "log" "-n9999" "--format=%aN <%ae>"))
- 'string<)
- nil nil nil 'git-commit-read-ident-history)))
- (save-match-data
- (if (string-match "\\`\\([^<]+\\) *<\\([^>]+\\)>\\'" str)
- (list (save-match-data (string-trim (match-string 1 str)))
- (string-trim (match-string 2 str)))
- (user-error "Invalid input"))))
- (list (read-string "Name: ")
- (read-string "Email: "))))
-
-(defun git-commit-insert-header (header name email)
- (setq header (format "%s: %s <%s>" header name email))
- (save-excursion
- (goto-char (point-max))
- (cond ((re-search-backward "^[-a-zA-Z]+: [^<]+? <[^>]+>" nil t)
- (end-of-line)
- (insert ?\n header)
- (unless (= (char-after) ?\n)
- (insert ?\n)))
- (t
- (while (re-search-backward (concat "^" comment-start) nil t))
- (unless (looking-back "\n\n" nil)
- (insert ?\n))
- (insert header ?\n)))
- (unless (or (eobp) (= (char-after) ?\n))
- (insert ?\n))))
-
-;;; Font-Lock
-
-(defvar-local git-commit-need-summary-line t
- "Whether the text should have a heading that is separated from the body.
-
-For commit messages that is a convention that should not
-be violated. For notes it is up to the user. If you do
-not want to insist on an empty second line here, then use
-something like:
-
- (add-hook \\='git-commit-setup-hook
- (lambda ()
- (when (equal (file-name-nondirectory (buffer-file-name))
- \"NOTES_EDITMSG\")
- (setq git-commit-need-summary-line nil))))")
-
-(defun git-commit-summary-regexp ()
- (if git-commit-need-summary-line
- (concat
- ;; Leading empty lines and comments
- (format "\\`\\(?:^\\(?:\\s-*\\|%s.*\\)\n\\)*" comment-start)
- ;; Summary line
- (format "\\(.\\{0,%d\\}\\)\\(.*\\)" git-commit-summary-max-length)
- ;; Non-empty non-comment second line
- (format "\\(?:\n%s\\|\n\\(.+\\)\\)?" comment-start))
- "\\(EASTER\\) \\(EGG\\)"))
-
-(defun git-commit-extend-region-summary-line ()
- "Identify the multiline summary-regexp construct.
-Added to `font-lock-extend-region-functions'."
- (save-excursion
- (save-match-data
- (goto-char (point-min))
- (when (looking-at (git-commit-summary-regexp))
- (let ((summary-beg (match-beginning 0))
- (summary-end (match-end 0)))
- (when (or (< summary-beg font-lock-beg summary-end)
- (< summary-beg font-lock-end summary-end))
- (setq font-lock-beg (min font-lock-beg summary-beg))
- (setq font-lock-end (max font-lock-end summary-end))))))))
-
-(defvar-local git-commit--branch-name-regexp nil)
-
-(defconst git-commit-comment-headings
- '("Changes to be committed:"
- "Untracked files:"
- "Changed but not updated:"
- "Changes not staged for commit:"
- "Unmerged paths:"
- "Author:"
- "Date:"))
-
-(defconst git-commit-font-lock-keywords-1
- '(;; Pseudo headers
- (eval . `(,(format "^\\(%s:\\)\\( .*\\)"
- (regexp-opt git-commit-known-pseudo-headers))
- (1 'git-commit-known-pseudo-header)
- (2 'git-commit-pseudo-header)))
- ("^[-a-zA-Z]+: [^<]+? <[^>]+>"
- (0 'git-commit-pseudo-header))
- ;; Summary
- (eval . `(,(git-commit-summary-regexp)
- (1 'git-commit-summary)))
- ;; - Keyword [aka "text in brackets"] (overrides summary)
- ("\\[.+?\\]"
- (0 'git-commit-keyword t))
- ;; - Non-empty second line (overrides summary and note)
- (eval . `(,(git-commit-summary-regexp)
- (2 'git-commit-overlong-summary t t)
- (3 'git-commit-nonempty-second-line t t)))))
-
-(defconst git-commit-font-lock-keywords-2
- `(,@git-commit-font-lock-keywords-1
- ;; Comments
- (eval . `(,(format "^%s.*" comment-start)
- (0 'font-lock-comment-face append)))
- (eval . `(,(format "^%s On branch \\(.*\\)" comment-start)
- (1 'git-commit-comment-branch-local t)))
- (eval . `(,(format "^%s \\(HEAD\\) detached at" comment-start)
- (1 'git-commit-comment-detached t)))
- (eval . `(,(format "^%s %s" comment-start
- (regexp-opt git-commit-comment-headings t))
- (1 'git-commit-comment-heading t)))
- (eval . `(,(format "^%s\t\\(?:\\([^:\n]+\\):\\s-+\\)?\\(.*\\)" comment-start)
- (1 'git-commit-comment-action t t)
- (2 'git-commit-comment-file t)))))
-
-(defconst git-commit-font-lock-keywords-3
- `(,@git-commit-font-lock-keywords-2
- ;; More comments
- (eval
- ;; Your branch is ahead of 'master' by 3 commits.
- ;; Your branch is behind 'master' by 2 commits, and can be fast-forwarded.
- . `(,(format
- "^%s Your branch is \\(?:ahead\\|behind\\) of '%s' by \\([0-9]*\\)"
- comment-start git-commit--branch-name-regexp)
- (1 'git-commit-comment-branch-local t)
- (2 'git-commit-comment-branch-remote t)
- (3 'bold t)))
- (eval
- ;; Your branch is up to date with 'master'.
- ;; Your branch and 'master' have diverged,
- . `(,(format
- "^%s Your branch \\(?:is up-to-date with\\|and\\) '%s'"
- comment-start git-commit--branch-name-regexp)
- (1 'git-commit-comment-branch-local t)
- (2 'git-commit-comment-branch-remote t)))
- (eval
- ;; and have 1 and 2 different commits each, respectively.
- . `(,(format
- "^%s and have \\([0-9]*\\) and \\([0-9]*\\) commits each"
- comment-start)
- (1 'bold t)
- (2 'bold t)))))
-
-(defvar git-commit-font-lock-keywords git-commit-font-lock-keywords-2
- "Font-Lock keywords for Git-Commit mode.")
-
-(defun git-commit-setup-font-lock ()
- (let ((table (make-syntax-table (syntax-table))))
- (when comment-start
- (modify-syntax-entry (string-to-char comment-start) "." table))
- (modify-syntax-entry ?# "." table)
- (modify-syntax-entry ?\" "." table)
- (modify-syntax-entry ?\' "." table)
- (modify-syntax-entry ?` "." table)
- (set-syntax-table table))
- (setq-local comment-start
- (or (ignore-errors
- (car (process-lines "git" "config" "core.commentchar")))
- "#"))
- (setq-local comment-start-skip (format "^%s+[\s\t]*" comment-start))
- (setq-local comment-end-skip "\n")
- (setq-local comment-use-syntax nil)
- (setq-local git-commit--branch-name-regexp
- (if (and (featurep 'magit-git)
- ;; When using cygwin git, we may end up in a
- ;; non-existing directory, which would cause
- ;; any git calls to signal an error.
- (file-accessible-directory-p default-directory))
- (progn
- ;; Make sure the below functions are available.
- (require 'magit)
- ;; Font-Lock wants every submatch to succeed,
- ;; so also match the empty string. Do not use
- ;; `regexp-quote' because that is slow if there
- ;; are thousands of branches outweighing the
- ;; benefit of an efficient regep.
- (format "\\(\\(?:%s\\)\\|\\)\\(\\(?:%s\\)\\|\\)"
- (mapconcat #'identity
- (magit-list-local-branch-names)
- "\\|")
- (mapconcat #'identity
- (magit-list-remote-branch-names)
- "\\|")))
- "\\([^']*\\)"))
- (setq-local font-lock-multiline t)
- (add-hook 'font-lock-extend-region-functions
- #'git-commit-extend-region-summary-line
- t t)
- (font-lock-add-keywords nil git-commit-font-lock-keywords))
-
-(defun git-commit-propertize-diff ()
- (require 'diff-mode)
- (save-excursion
- (goto-char (point-min))
- (when (re-search-forward "^diff --git" nil t)
- (beginning-of-line)
- (let ((buffer (current-buffer)))
- (insert
- (with-temp-buffer
- (insert
- (with-current-buffer buffer
- (prog1 (buffer-substring-no-properties (point) (point-max))
- (delete-region (point) (point-max)))))
- (let ((diff-default-read-only nil))
- (diff-mode))
- (let (font-lock-verbose font-lock-support-mode)
- (if (fboundp 'font-lock-ensure)
- (font-lock-ensure)
- (with-no-warnings
- (font-lock-fontify-buffer))))
- (let (next (pos (point-min)))
- (while (setq next (next-single-property-change pos 'face))
- (put-text-property pos next 'font-lock-face
- (get-text-property pos 'face))
- (setq pos next))
- (put-text-property pos (point-max) 'font-lock-face
- (get-text-property pos 'face)))
- (buffer-string)))))))
-
-;;; Elisp Text Mode
-
-(define-derived-mode git-commit-elisp-text-mode text-mode "ElText"
- "Major mode for editing commit messages of elisp projects.
-This is intended for use as `git-commit-major-mode' for projects
-that expect `symbols' to look like this. I.e. like they look in
-Elisp doc-strings, including this one. Unlike in doc-strings,
-\"strings\" also look different than the other text."
- (setq font-lock-defaults '(git-commit-elisp-text-mode-keywords)))
-
-(defvar git-commit-elisp-text-mode-keywords
- `((,(concat "[`‘]\\(" lisp-mode-symbol-regexp "\\)['’]")
- (1 font-lock-constant-face prepend))
- ("\"[^\"]*\"" (0 font-lock-string-face prepend))))
-
-;;; _
-(provide 'git-commit)
-;;; git-commit.el ends here
diff --git a/elpa/gnupg/pubring.kbx b/elpa/gnupg/pubring.kbx
deleted file mode 100644
index 6f3259b..0000000
--- a/elpa/gnupg/pubring.kbx
+++ /dev/null
Binary files differ
diff --git a/elpa/gnupg/pubring.kbx~ b/elpa/gnupg/pubring.kbx~
deleted file mode 100644
index f627eb3..0000000
--- a/elpa/gnupg/pubring.kbx~
+++ /dev/null
Binary files differ
diff --git a/elpa/gnupg/trustdb.gpg b/elpa/gnupg/trustdb.gpg
deleted file mode 100644
index 0fda93c..0000000
--- a/elpa/gnupg/trustdb.gpg
+++ /dev/null
Binary files differ
diff --git a/elpa/gnuplot-20200322.53/gnuplot-autoloads.el b/elpa/gnuplot-20200322.53/gnuplot-autoloads.el
deleted file mode 100644
index b205de4..0000000
--- a/elpa/gnuplot-20200322.53/gnuplot-autoloads.el
+++ /dev/null
@@ -1,115 +0,0 @@
-;;; gnuplot-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "gnuplot" "gnuplot.el" (0 0 0 0))
-;;; Generated autoloads from gnuplot.el
-
-(autoload 'gnuplot-mode "gnuplot" "\
-Major mode for editing and executing GNUPLOT scripts.
-This was written with version 4.6 of gnuplot in mind, but should
-work with newer and older versions.
-
-Report bugs at https://github.com/emacsorphanage/gnuplot/issues
-
- ------O------
-
-Gnuplot-mode includes two different systems for keyword
-completion and documentation lookup: a newer one,
-`gnuplot-context-sensitive-mode' (enabled by default), and a
-older one which extracts keywords from gnuplot's Info file. Both
-systems allow looking up documentation in the Info file. The
-older system also depends having the info file properly installed
-to make a list of keywords.
-
-The info file should be installed by default with the Gnuplot
-distribution, or is available at the `gnuplot-mode' web page:
-https://github.com/emacsorphanage/gnuplot/
-
-With the new context-sensitive mode active, gnuplot-mode can also
-provide function/`eldoc-mode' syntax hints as you type. This requires a
-separate file of strings, `gnuplot-eldoc.el', which is also
-provided by recent Gnuplot distributions.
-
- ------O------
-
-There are several known shortcomings of `gnuplot-mode', version 0.5g
-and up. Many of the shortcomings involve the graphical interface
-\(refered to as the GUI) to setting arguments to plot options. Here is
-a list:
-
- 1. Currently there is no way for `gnuplot-mode' to know if information
- sent to gnuplot was correctly plotted.
- 2. \"plot\", \"splot\", and \"fit\" are handled in the GUI, but are
- a bit flaky. Their arguments may not be read correctly from
- existing text, and continuation lines (common for plot and splot)
- are not supported.
- 3. The GUI does not know how to read from continuation lines.
- 4. Comma separated position arguments to plot options are
- unsupported in the GUI. Colon separated datafile modifiers (used
- for plot, splot, and fit) are not supported either. Arguments
- not yet supported by the GUI generate messages printed in grey
- text.
- 5. The GUI handling of \"hidden3d\" is flaky and \"cntrparam\" is
- unsupported.
-
- ------O------
-
- Key bindings:
- \\{gnuplot-mode-map}
-
-\(fn)" t nil)
-
-(autoload 'gnuplot-make-buffer "gnuplot" "\
-Open a new buffer in `gnuplot-mode'.
-When invoked, it switches to a new, empty buffer visiting no file
-and then starts `gnuplot-mode'.
-
-It is convenient to bind this function to a global key sequence. For
-example, to make the F10 key open a gnuplot script buffer, put the
-following in your .emacs file:
- (autoload 'gnuplot-make-buffer \"gnuplot\"
- \"open a buffer in gnuplot mode\" t)
- (global-set-key [(f10)] 'gnuplot-make-buffer)
-
-\(fn)" t nil)
-
-(autoload 'run-gnuplot "gnuplot" "\
-Run an inferior Gnuplot process.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "gnuplot" '("gnuplot-")))
-
-;;;***
-
-;;;### (autoloads nil "gnuplot-context" "gnuplot-context.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from gnuplot-context.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "gnuplot-context" '("gnuplot-")))
-
-;;;***
-
-;;;### (autoloads nil "gnuplot-gui" "gnuplot-gui.el" (0 0 0 0))
-;;; Generated autoloads from gnuplot-gui.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "gnuplot-gui" '("gnuplot-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("gnuplot-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; gnuplot-autoloads.el ends here
diff --git a/elpa/gnuplot-20200322.53/gnuplot-context.el b/elpa/gnuplot-20200322.53/gnuplot-context.el
deleted file mode 100644
index 7b067b7..0000000
--- a/elpa/gnuplot-20200322.53/gnuplot-context.el
+++ /dev/null
@@ -1,2216 +0,0 @@
-;;; gnuplot-context.el -- context-sensitive help and completion for gnuplot
-
-;; Copyright (C) 2012-2013 Jon Oddie <jonxfield@gmail.com>
-
-;; Author: Jon Oddie <jonxfield@gmail.com>
-;; URL: https://github.com/emacsorphanage/gnuplot
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;
-;; This file enhances gnuplot-mode with context-sensitive completion,
-;; ElDoc support, and info page lookup for gnuplot script and shell
-;; buffers.
-;;
-;; Usage
-;; =====
-;;
-;; Make sure to byte-compile this file, or things will be noticeably
-;; slow.
-;;
-;; Summary of key bindings:
-;; C-c C-d read info page for construction at point
-;; C-u C-c C-d prompt for info page to read
-;; C-c M-h, C-c C-/ pop up multi-line ElDoc string for construction
-;; at point
-;;
-;; Gnuplot's context sensitive mode is best controlled using Customize
-;; (M-x customize-group gnuplot): simply enable the
-;; `gnuplot-context-sensitive-mode' setting. On recent Emacs (>= 23),
-;; you may also want to turn on `gnuplot-tab-completion' so that the
-;; TAB key does auto-completion on lines which are already
-;; indented. (This just sets the Emacs variable `tab-always-indent' to
-;; `complete' in Gnuplot buffers).
-;;
-;; If you need to turn context sensitivity on or off from Lisp code
-;; for some reason, call the function
-;; `gnuplot-context-sensitive-mode', which behaves like a minor mode.
-;;
-;; With `eldoc-mode' support, gnuplot-mode will show one-line syntax
-;; hints automatically in the echo area. Whether eldoc-mode is active
-;; or not, you can always pop up a longer description of syntax using
-;; `gnuplot-help-function' (C-c C-/ or C-c M-h). ElDoc support also
-;; requires an additional file of help strings, `gnuplot-eldoc.el',
-;; which should be included in recent Gnuplot releases. If it didn't
-;; come with your Gnuplot installation, you'll need to grab a recent
-;; source distribution of Gnuplot from http://gnuplot.info, and use
-;; the `doc2texi.el' program in the docs/ directory to create it. So
-;; long as the file is on your Emacs load path somewhere it will be
-;; loaded automatically when needed.
-;;
-;; You can customize gnuplot-mode to turn on eldoc mode automatically
-;; using variable `gnuplot-eldoc-mode'. Simply calling `eldoc-mode'
-;; will also work.
-;;
-;; Internal details
-;; ================
-;;
-;; Gnuplot's command language has a fair amount of syntactic
-;; complexity, and the only way I could think of to support these
-;; features was to do a complete parse of the command line. So that's
-;; what this package does. Instead of building a parse tree, it
-;; matches up until the token at point, and then either makes a list
-;; of possible completions, or sets the variables `gnuplot-eldoc' and
-;; `gnuplot-info-at-point' based on where it is in the grammar at that
-;; point.
-;;
-;; The parsing/matching process happens in two phases: tokenizing
-;; (`gnuplot-tokenize') and matching (`gnuplot-match-pattern'). In
-;; order to be able to construct a full list of possible completions
-;; via backtracking, the matching algorithm simulates a simple stack
-;; machine with continuations. At byte-compile time, the PEG-like
-;; grammar in S-expression notation (`gnuplot-grammar') is compiled
-;; down into a vector of "machine code" for the parsing machine (see
-;; `gnuplot-compile-pattern', `gnuplot-compile-grammar' and
-;; `gnuplot-compiled-grammar'). This is complicated, but it seems to
-;; work well enough, and it saves on the Emacs call stack.
-;;
-;; Compiling the grammar does require increasing `max-lisp-eval-depth'
-;; modestly. This shouldn't cause any problems on modern machines, and
-;; it only needs to be done once, at byte-compilation time.
-;;
-;; The parsing machine and compiler are partially based on the
-;; description in Medeiros and Ierusalimschy 2008, "A Parsing Machine
-;; for PEGs" (http://dl.acm.org/citation.cfm?doid=1408681.1408683).
-;;
-;; The pattern-matching language
-;; =============================
-;;
-;; The gnuplot-mode grammar (see `gnuplot-compiled-grammar') is a list
-;; of rules (RULE PATTERN), with each pattern written in S-expression
-;; notation as follows:
-;;
-;; any
-;; Match any token
-;;
-;; name, number, string, separator
-;; Match a token of the given type. "Separator" is semicolon, the
-;; statement separator.
-;;
-;; Any other symbol
-;; Match another named rule in the grammar. May be recursive.
-;;
-;; "STRING"
-;; Match literally: a token with exactly the text "STRING".
-;;
-;; (kw KEYWORD ALIASES ...)
-;; Match abbreviated Gnuplot keywords. KEYWORD can be a string or
-;; a cons (PREFIX . SUFFIX). In the latter case, this pattern
-;; will match PREFIX plus any number of characters from the
-;; beginning of SUFFIX. Any literal string from ALIASES will
-;; also match. The token-id of the matching token is mutated to
-;; the canonical value of KEYWORD.
-;; Example:
-;; (kw ("linew" ."idth") "lw") matches "linew", "linewi",
-;; ... "linewidth" as well as "lw". Any of these tokens will
-;; appear as "linewidth" in subsequent processing. (This is
-;; important for the "info-keyword" form, see below).
-;;
-;; The other pattern forms combine simpler patterns, much like regular
-;; expressions or PEGs (parsing expression grammars):
-;;
-;; (sequence { (:eldoc "eldoc string") }
-;; { (:info "info page") }
-;; { (:no-info) }
-;; PATTERN PATTERN... )
-;; Match all the PATTERNs in sequence or fail. Sequences can also
-;; have optional ElDoc strings and info pages associated with
-;; them; the innermost ElDoc or info page around point is the one
-;; shown to the user. Alternatively, either property may be a
-;; symbol, which should be a function to be called to get the
-;; real value. Finally, if no ElDoc string is specified but the
-;; variable `gnuplot-eldoc-hash' contains a value for the name of
-;; the info page at point, that value is used as the ElDoc string
-;; instead.
-;;
-;; For better readability, sequence forms can also be written as
-;; a vector, omitting the `sequence': [PATTERN PATTERN ...]
-;;
-;; (either PATTERN PATTERN...)
-;; Match the first PATTERN to succeed, or fail if none
-;; matches. Like regexp `|'.
-;;
-;; (many PATTERN)
-;; Match PATTERN zero or more times, greedily; like regexp
-;; `*'. Unlike a regular expression matcher, the parsing machine
-;; will not backtrack and try to match fewer times if a later
-;; part of the pattern fails. This applies equally to the other
-;; non-deterministic forms "either" and "maybe".
-;;
-;; (maybe PATTERN)
-;; Match PATTERN zero or one times, like regexp `?'.
-;;
-;; (capture NAME PATTERN)
-;; Match PATTERN, capturing the tokens in a capture group named
-;; NAME. Capture groups are stored in `gnuplot-captures'
-;; and can be retrieved using `gnuplot-capture-group'. This is
-;; used to store the plotting style, which we need in order to
-;; give the correct ElDoc string for "using" clauses, and for
-;; info keywords (see below)
-;;
-;; (info-keyword PATTERN)
-;; Match PATTERN, and use whatever the value of the first token
-;; it matches is to look up info pages for this pattern. Most
-;; Gnuplot info pages have the same name as the keyword they
-;; document, so by using this we only have to put :info
-;; properties on the few that don't, such as "set".
-;;
-;; For convenience, "many", "maybe", "capture" and "info-keyword"
-;; wrap the rest of their arguments in an implicit "sequence" form,
-;; so we can write (maybe "," expression) instead of
-;; (maybe (sequence "," expression))
-;;
-;; (delimited-list PATTERN SEPARATOR)
-;; Match a list of PATTERNs separated by SEPARATOR. Sugar for:
-;; (sequence PATTERN (many (sequence SEPARATOR PATTERN)))
-;;
-;; (assert LISP-FORM)
-;; Evaluate LISP-FORM and fail if it returns NIL. We need this in
-;; the patterns for "plot" and "splot" to check whether the
-;; command at point should be parsed in parametric mode or
-;; not. See `gnuplot-guess-parametric-p'.
-;;
-;;
-;; Bugs, TODOs, etc.
-;; =======================
-;;
-;; It would be useful to complete on user-defined functions and
-;; variables as well as built-ins.
-;;
-;; Completion probably will not work in continuation lines entered
-;; into the gnuplot interaction buffer.
-;;
-;; It would be better to pop up longer syntax descriptions in a
-;; temporary window, rather than making the echo area grow to fit
-;; many lines.
-;;
-;; In ElDoc mode, we parse the whole line every time the user stops
-;; typing. This is wasteful; should cache things in text properties
-;; instead.
-;;
-;; The pattern matching engine uses backtracking, which can take
-;; exponential time. So far it seems "fast enough" in actual use.
-;;
-;; The patterns don't really distinguish between "plot" and "splot"
-;; for things like plot styles, binary arguments, etc.
-;;
-;; Some other the patterns are probably not quite right, especially for
-;; things like abbreviated keywords, and features that I don't use
-;; myself like "fit". Hopefully anyone bothered by this will submit
-;; patches ;-)
-;;
-;; It would be possible to provide more helpful ElDoc strings for
-;; sub-parts of complicated options like "cntrparam". This is a time
-;; and maintenance issue rather than a technical one.
-
-;;; Code:
-
-
-;; Library dependencies
-(eval-when-compile
- (require 'cl)
-
- ;; Prevent compiler warnings about undefined functions
- (require 'gnuplot))
-
-;; We need ElDoc support
-(require 'eldoc)
-
-;; Compatibility for Emacs version < 23
-(eval-when-compile
- (when (not (fboundp 'string-match-p))
- (defmacro string-match-p (&rest args)
- `(save-match-data (string-match ,@args)))))
-
-
-;;;; The tokenizer.
-
-(defstruct gnuplot-token
- start ; Buffer start position
- end ; Buffer end position
- id ; Text
- type) ; a symbol: name, number, string, operator, separator
-
-(defvar gnuplot-operator-regexp
- (eval-when-compile
- (regexp-opt
- '("(" ")" "(" ")" "{" "," "}" "[" ":" "]" "!" "**" "-" "+" "~" "!" "*" "/"
- "%" "+" "-" "." "<" "<=" ">" ">=" "==" "!=" "eq" "ne" "&" "^" "|" "&&" "||"
- "?" ":" "=" "$")))
- "Regexp to match Gnuplot operators for tokenizing.")
-
-(eval-when-compile
- (defmacro gnuplot-tokenize-by-regexps (&rest rules)
- `(cond ,@(mapcar
- (lambda (rule)
- (let ((regexp (car rule))
- (token-type (cadr rule)))
- `((looking-at ,regexp)
- (let ((str (match-string-no-properties 0)))
- (forward-char (length str))
- (make-gnuplot-token :id str
- :type ',token-type
- :start (match-beginning 0)
- :end (match-end 0))))))
- rules))))
-
-(defun gnuplot-tokenize (&optional completing-p)
- "Tokenize the Gnuplot command at point.
-Return a list of `gnuplot-token' objects.
-
-If COMPLETING-P is non-nil, omits the token at point if it is a
-name; otherwise continues tokenizing up to the token at point. FIXME."
- (let ((tokens '())
- (stop-point (min (point)
- (gnuplot-point-at-end-of-command))))
- (save-excursion
- (if (save-excursion ; HACK FIXME
- (gnuplot-beginning-of-continuation)
- (looking-at "\\s-*if\\s-*("))
- (gnuplot-beginning-of-continuation)
- (gnuplot-beginning-of-command))
- (while
- ;; Skip whitespace and continuation lines
- (progn
- (skip-syntax-forward "-" stop-point)
- (while (looking-at "\\\\\n")
- (forward-line)
- (skip-syntax-forward "-" stop-point))
- ;; Don't tokenize anything starting after point
- (and (not (looking-at "#"))
- (< (point) stop-point)))
- (let* ((from (point))
- (token
- (cond
- ((gnuplot-tokenize-by-regexps
- ("[A-Za-z_][A-Za-z0-9_]*" name)
- ("[0-9]+\\(\\.[0-9]*\\)?\\([eE][+-]?[0-9]+\\)?\\|\\.[0-9]+\\([eE][+-]?[0-9]+\\)?" number)
- (gnuplot-operator-regexp operator)
- (";" separator)))
-
- ((looking-at "['\"]")
- (let* ((bounds (bounds-of-thing-at-point 'sexp))
- (to (or (cdr bounds) stop-point)))
- (goto-char to)
- (make-gnuplot-token
- :id (buffer-substring-no-properties from to)
- :type 'string
- :start from :end to)))
-
- (t (error
- "Gnuplot-tokenize: bad token beginning %s"
- (buffer-substring-no-properties (point) stop-point))))))
-
- (push token tokens))))
-
- ;; If we are looking for completions, AND if the last token
- ;; read is a name, AND if point is within the bounds of the
- ;; last token, then discard it. The matching function
- ;; generates a list of all possible tokens that could appear
- ;; in that position for completion.
- (if (and completing-p
- tokens
- (eq (gnuplot-token-type (car tokens)) 'name)
- (<= (point) (gnuplot-token-end (car tokens))))
- (pop tokens))
-
- (nreverse tokens)))
-
-
-
-;;;; The pattern and grammar compiler
-;;
-;; These functions compile the source S-expression grammar into a
-;; vector of instructions for the parsing machine,
-;; `gnuplot-match-pattern'. Its state consists of a program counter
-;; (PC), a position in the list of tokens, a call stack, and a second
-;; stack of backtracking entries (continuations). Its "machine
-;; instructions" are the following:
-;;
-;; (any)
-;; Match any token (fails only at end of command).
-;;
-;; (literal LITERAL NO-COMPLETE)
-;; Match token with `gnuplot-token-id' LITERAL or fail. If we
-;; have reached the token before point, include LITERAL in the
-;; completion list unless NO-COMPLETE is non-`nil'.
-;;
-;; (token-type TYPE)
-;; Match a token with `gnuplot-token-type' TYPE, or fail.
-;;
-;; (keyword REGEXP NAME)
-;; Match any token whose `gnuplot-token-id' matches REGEXP. Use
-;; NAME for the completion list.
-;;
-;; (jump OFFSET FIXED)
-;; Jump to (set PC to) OFFSET if FIXED is non-nil, otherwise to
-;; PC + OFFSET
-;;
-;; (call OFFSET FIXED)
-;; Like "jump", but push a return address onto the stack for
-;; (return). (The compiler adds the name of the rule being called
-;; as a fourth element on the end of the list, but this is just a
-;; comment for debugging purposes).
-;;
-;; (return)
-;; Return to the PC address on top of the stack, or finish
-;; matching if stack is empty. (Usually this doesn't happen,
-;; because the machine stops as soon as it gets to the token at
-;; point).
-;;
-;; (choice OFFSET)
-;; Push a backtracking entry for location PC + OFFSET onto the
-;; backtracking stack. Backtracking entries save the contents of
-;; the call stack, position in the token list, the values of
-;; capture groups, and the record of loop progress (see below).
-;;
-;; (check-progress)
-;; Break out of infinite loops, like (many (many ...)). Checks
-;; an alist of conses (pc . tokens) for the position in the token
-;; stream the last time this instruction was reached, and breaks
-;; out of the loop if stuck in the same place; otherwise pushes a
-;; new entry onto the list.
-;;
-;; (fail)
-;; Pop the most recent backtracking entry and continue from
-;; there, or fail the whole match if out of backtrack
-;; points. Failing to match returns the remainder of the token
-;; list, although we don't currently use this for anything.
-;;
-;; (commit OFFSET)
-;; Discard one backtracking point and jump to PC + OFFSET. This
-;; is used to make the (either) form non-deterministic.
-;;
-;; (push TYPE VALUE)
-;; Push an entry for an eldoc or info string (specified by TYPE)
-;; onto the stack.
-;;
-;; (pop TYPE)
-;; Pop something off the stack; checks that it has the expected
-;; TYPE, for safety.
-;;
-;; (save-start NAME)
-;; Open a capture group named NAME. Pushes an entry onto
-;; `gnuplot-captures' with current position in token list as the
-;; start of the group.
-;;
-;; (save-end NAME)
-;; Close the capture group named NAME. Finds the topmost entry in
-;; `gnuplot-captures' with this name and sets its endpoint to the
-;; current position in token list. Error if no group with that
-;; name is found.
-;;
-;; (label NAME)
-;; This should never be reached and will cause an error. The
-;; compiler inserts it at the beginning of compiled rules only
-;; for debugging purposes.
-;;
-
-
-(eval-and-compile
- ;; Compile a single pattern into a list of instructions. Leaves
- ;; calls to other rules as symbolic instructions (call SYMBOL) and
- ;; jumps, commits etc. as relative offsets; these are resolved into
- ;; absolute locations by `gnuplot-compile-grammar', below.
- (defun gnuplot-compile-pattern (pat)
- (cond
- ;; Strings match a single token literally
- ((stringp pat)
- ;; Don't add non-words to completion lists
- (let ((wordp (string-match-p "^\\sw\\(\\sw\\|\\s_\\)*$" pat)))
- `((literal ,pat ,(not wordp)))))
-
- ;; Symbols match token types or calls to other patterns
- ((symbolp pat)
- (case pat
- ((any) `((any)))
- ((name number string separator) `((token-type ,pat)))
- (t `((call ,pat)))))
-
- ;; Syntactic sugar: write sequences (sequence ...) as vectors [...]
- ((vectorp pat)
- (gnuplot-compile-pattern
- (append '(sequence) pat '())))
-
- ;; Other forms combine simpler patterns
- (t
- (let ((type (car pat)))
- (case type
- ;; (sequence...): concatenate patterns, with optional eldoc
- ;; and info strings
- ((sequence)
- (destructuring-bind
- (subpats eldoc info)
- (gnuplot-filter-arg-list (cdr pat))
- (let ((eldoc-push '()) (eldoc-pop '())
- (info-push '()) (info-pop '())
- (compiled
- (mapcar 'gnuplot-compile-pattern subpats)))
- (if eldoc
- (setq eldoc-push `((push eldoc ,eldoc))
- eldoc-pop `((pop eldoc))))
- (if info
- (if (eq info :no-info)
- (setq info-push '((push no-scan t))
- info-pop '((pop no-scan)))
- (setq info-push `((push info ,info))
- info-pop `((pop info)))))
- (apply 'append
- `(,info-push
- ,eldoc-push
- ,@compiled
- ,eldoc-pop
- ,info-pop)))))
-
- ;; (either...): choose between patterns
- ((either)
- (cond
- ((= (length pat) 2) ; trivial case
- (gnuplot-compile-pattern (cadr pat)))
-
- ((> (length pat) 3) ; could be more efficient...
- (gnuplot-compile-pattern (gnuplot-either-helper pat)))
-
- (t ; two patterns
- (let* ((pat1 (cadr pat))
- (pat2 (caddr pat))
- (pat1-c (gnuplot-compile-pattern pat1))
- (pat2-c (gnuplot-compile-pattern pat2))
- (pat1-l (length pat1-c))
- (pat2-l (length pat2-c)))
- `((choice ,(+ pat1-l 2))
- ,@pat1-c
- (commit ,(+ pat2-l 1))
- ,@pat2-c)))))
-
- ;; Repetition (*)
- ((many)
- (let* ((pat1 (cons 'sequence (cdr pat)))
- (pat1-c (gnuplot-compile-pattern pat1))
- (pat1-l (length pat1-c)))
- `((choice ,(+ pat1-l 3))
- (check-progress) ; bail out of infinite loops
- ,@pat1-c
- (commit ,(- (+ pat1-l 2))))))
-
- ;; Repetition (+)
- ((many1)
- (let* ((pat1 (cdr pat)))
- (gnuplot-compile-pattern
- `(sequence ,@pat1 (many ,@pat1)))))
-
-
- ;; Optional (?)
- ((maybe)
- (let* ((pat1 (cons 'sequence (cdr pat)))
- (pat1-c (gnuplot-compile-pattern pat1))
- (pat1-l (length pat1-c)))
- `((choice ,(+ pat1-l 1))
- ,@pat1-c)))
-
- ;; Syntactic sugar for delimited lists
- ((delimited-list)
- (let* ((item (cadr pat))
- (sep (caddr pat)))
- (gnuplot-compile-pattern
- `(sequence ,item (many (sequence ,sep ,item))))))
-
- ;; keywords
- ((kw)
- (destructuring-bind (regex name)
- (gnuplot-keyword-helper (cdr pat))
- `((keyword ,regex ,name))))
-
- ;; Capturing groups
- ((capture)
- (let* ((name (cadr pat))
- (pat1 (cons 'sequence (cddr pat)))
- (pat1-c (gnuplot-compile-pattern pat1)))
- `((save-start ,name)
- ,@pat1-c
- (save-end ,name))))
-
- ;; Use the first token as an info keyword
- ((info-keyword)
- (let* ((pat1 (cons 'sequence (cdr pat)))
- (pat1-c (gnuplot-compile-pattern pat1)))
- `((push info first-token)
- ,@pat1-c
- (pop info))))
-
- ;; Assertions
- ((assert)
- (let* ((form (cadr pat)))
- `((assert ,form))))
-
- (t
- (error "Gnuplot-compile-pattern: bad pattern form %s" pat)))))))
-
- ;; Helper function for destructuring (sequence ...) forms in patterns
- ;; Takes the cdr of the sequence form, returns a list (PATTERNS ELDOC
- ;; INFO).
- (defun gnuplot-filter-arg-list (args)
- (let ((accum '())
- (eldoc nil) (info nil))
- (dolist (item args)
- (let ((type (car-safe item)))
- (case type
- ((:eldoc) (setq eldoc (cadr item)))
- ((:no-info) (setq info :no-info)) ; inhibit stack scanning
- ((:info) (setq info (cadr item)))
- (t (push item accum)))))
- (list (reverse accum) eldoc info)))
-
- ;; Helper function for compiling (kw...) patterns
- ;; Takes the cdr of the kw form, returns a list (REGEXP KEYWORD)
- (defun gnuplot-keyword-helper (args)
- (let ((keyword (car args)) (aliases (cdr args)))
- (when (consp keyword)
- (let ((pre (car keyword)) (suf (cdr keyword)))
- (setq keyword (concat pre suf))
- (while (progn
- (push pre aliases)
- (not (zerop (length suf))))
- (setq pre (concat pre (substring suf 0 1))
- suf (substring suf 1)))))
- (let ((regex
- (concat "^"
- (regexp-opt (cons keyword aliases))
- "$")))
- (list regex keyword))))
-
- ;; Helper function for compiling (either ...) patterns. Rewrites
- ;; alternates (either A B C) into (either A (either B (either C D)))
- (defun gnuplot-either-helper (pat)
- (if (= (length pat) 3)
- pat
- `(either ,(cadr pat)
- ,(gnuplot-either-helper
- (cons 'either (cddr pat))))))
-
- ;; Compile the grammar (a list of rule-pattern pairs (RULE PATTERN))
- ;; into a single vector of matching-machine instructions. Compiles
- ;; each pattern individually, then "links" them into one vector,
- ;; converting symbolic (call ...) instructions into numeric offsets
- (defun gnuplot-compile-grammar (grammar start-symbol)
- (let ((compiled-pats '()) ; Alist of (name . instructions)
- ;; Reserve space for a jump to the start symbol
- (code-length 1))
-
- ;; Compile each rule and find the total number of instructions
- (dolist (item grammar)
- (let* ((name (car item))
- (pat (cadr item))
- (code (gnuplot-compile-pattern pat)))
- (push (cons name code) compiled-pats)
- ;; Reserve space for a label at the beginning and (return) at
- ;; the end
- (setq code-length (+ code-length 2 (length code)))))
-
- ;; Copy instructions into a single vector
- (let ((object-code (make-vector code-length nil))
- (name->offset (make-hash-table))
- (i 1))
- (setf (aref object-code 0) `(jump ,start-symbol))
- (dolist (chunk compiled-pats)
- (let ((name (car chunk))
- (code (cdr chunk)))
- (setf (aref object-code i) `(label ,name))
- (incf i)
- (puthash name i name->offset)
- (while code
- (setf (aref object-code i) (car code)
- code (cdr code)
- i (1+ i)))
- (setf (aref object-code i) '(return)
- i (1+ i))))
-
- ;; Resolve symbolic and relative jumps
- (let ((pattern-name nil))
- (dotimes (i (length object-code))
- (let ((inst (aref object-code i)))
- (case (car inst)
- ((label)
- (setq pattern-name (cadr inst)))
-
- ((jump call choice commit)
- (cond
- ((symbolp (cadr inst))
- (let* ((name (cadr inst))
- (location (gethash name name->offset)))
- (if (not location)
- (error
- (concat "gnuplot-compile-grammar: "
- "No rule found for symbol `%s' in pattern `%s'")
- name pattern-name))
- (setcdr inst `(,location ,name))))
-
- ((numberp (cadr inst))
- (let* ((offset (cadr inst))
- (location (+ offset i)))
- (setcdr inst `(,location))))
-
- (t
- (error "Gnuplot-compile-grammar: bad instruction %s" inst))))))))
- object-code))))
-
-;;; The grammar.
-(defvar gnuplot-compiled-grammar
- (eval-when-compile
- (let ((max-lisp-eval-depth 600))
- (gnuplot-compile-grammar
- '((expression
- [infix-expression (maybe "?" expression ":" expression)])
-
- (prefix-operator
- (either "!" "~" "-" "+"))
-
- (infix-operator
- (either "**" "*" "/" "%" "+" "-" "." "<" "<=" ">" ">=" "==" "!=" "eq" "ne"
- "&" "^" "|" "&&" "||"))
-
- (infix-expression
- [(many prefix-operator)
- primary-expression
- (many infix-operator expression)])
-
- (primary-expression
- [(either number string parenthesized-expression
- column-ref complex-number function-call name)
- (many "!")
- (maybe "**" infix-expression)
- (maybe substring-range)])
-
- (function-call
- (either
- (info-keyword
- [(either "abs" "acos" "acosh" "arg" "asin" "asinh" "atan" "atan2" "atanh"
- "besj0" "besj1" "besy0" "besy1" "ceil" "column" "columnhead"
- "cos" "cosh" "defined" "erf" "erfc" "exists" "exp" "floor"
- "gamma" "gprintf" "ibeta" "igamma" "imag" "int" "inverf"
- "invnorm" "lambertw" "lgamma" "log" "log10" "norm" "real"
- "sgn" "sin" "sinh" "sprintf" "sqrt" "strftime" "stringcolumn"
- "strlen" "strptime" "strstrt" "substr" "tan" "tanh" "timecolumn"
- "tm_hour" "tm_mday" "tm_min" "tm_mon" "tm_sec" "tm_wday"
- "tm_yday" "tm_year" "valid" "value" "word" "words" "rand")
- parenthesized-expression])
- [(:info "elliptic_integrals")
- (either "EllipticK" "EllipticE" "EllipticPi")
- parenthesized-expression]
- [name
- parenthesized-expression]))
-
- (parenthesized-expression
- ["(" comma-list ")"])
-
- (complex-number
- ["{" (maybe "-") number "," (maybe "-") number "}"])
-
- (column-ref
- ["$" number])
-
- (substring-range-component
- (maybe (either "*" expression)))
-
- (substring-range
- ["[" (delimited-list substring-range-component ":" 2 2) "]"])
-
-;;; Assignments
- (lhs
- [name (maybe "(" (delimited-list name "," 1) ")")])
-
- (assignment
- [lhs "=" (either assignment expression)])
-
-;;; Lists of expressions
- (comma-list
- (delimited-list (either assignment expression) ","))
-
- (colon-list
- (delimited-list expression ":"))
-
- (tuple
- ["(" (delimited-list expression "," 2 3) ")"])
-
-;;; Commands
- (command
- (info-keyword
- (either plot-command splot-command replot-command fit-command print-command
- set-command cd-command call-command simple-command
- eval-command load-command lower-raise-command pause-command
- save-command system-command test-command undefine-command
- update-command assignment if-command new-if-command do-command)))
-
- (command-list
- (delimited-list command separator))
-
- (block ["{" command-list (maybe separator) "}"])
-
-;;; old-style one-line if(..) command
- (if-command
- (info-keyword
- "if" parenthesized-expression command-list
- (maybe separator "else" command-list)))
-
-;;; new-style block-structured if
- (new-if-command
- (info-keyword
- "if" parenthesized-expression block
- (maybe "else" block)))
-
-;;; block-structured "do"
- (do-command
- (info-keyword "do" iteration-spec block))
-
-;;; PLOT, SPLOT commands
- (plot-command
- [(kw ("pl" . "ot"))
-
- (either
- ;; Parametric ranges
- [(assert (gnuplot-guess-parametric-p))
- (maybe t-axis-range) (maybe x-axis-range) (maybe y-axis-range)]
-
- ;; Non-parametric ranges
- [(maybe x-axis-range) (maybe y-axis-range)])
-
- plot-body])
-
- (splot-command
- [ ;; This capturing group lets `gnuplot-find-using-eldoc' know
- ;; that this is an splot command
- (capture :splot-command (kw ("spl" . "ot")))
-
- (either
- ;; Parametric ranges
- [(assert (gnuplot-guess-parametric-p))
- (maybe u-axis-range) (maybe v-axis-range)
- (maybe x-axis-range) (maybe y-axis-range) (maybe z-axis-range)]
-
- ;; Non-parametric ranges
- [(maybe x-axis-range) (maybe y-axis-range) (maybe z-axis-range)])
-
- plot-body])
-
- (replot-command [(kw "replot") plot-body])
-
- ;; Axis ranges
- (axis-range-component
- (maybe (either "*" expression)))
-
- (axis-range-body
- (delimited-list axis-range-component ":" 2 3))
-
- (axis-range
- [(:info "ranges")
- "[" (maybe (maybe name "=") axis-range-body) "]"])
-
- (x-axis-range [(:eldoc "X RANGE: [{<dummy>=}<min>:<max>]") axis-range])
- (y-axis-range [(:eldoc "Y RANGE: [{<dummy>=}<min>:<max>]") axis-range])
- (z-axis-range [(:eldoc "Z RANGE: [{<dummy>=}<min>:<max>]") axis-range])
- (t-axis-range [(:eldoc "T RANGE: [{<dummy>=}<min>:<max>]") axis-range])
- (u-axis-range [(:eldoc "U RANGE: [{<dummy>=}<min>:<max>]") axis-range])
- (v-axis-range [(:eldoc "V RANGE: [{<dummy>=}<min>:<max>]") axis-range])
-
- ;; Body of a plot/splot command. Should really be different for
- ;; parametric vs non-parametric, but that's too hard.
- (plot-body
- (delimited-list
- [(maybe iteration-spec) plot-expression plot-modifiers]
- ","))
-
- ;; Iteration: for [... ]
- (iteration-spec
- [(:info "iteration")
- (many1
- "for" "[" name
- (either ["=" (delimited-list expression ":")]
- ["in" expression])
- "]")])
-
- ;; Expressions to plot can be preceded by any number of
- ;; assignments, with or without commas
- (plot-expression
- [(many [(:no-info) assignment (maybe ",")])
- expression])
-
-;;; Plot/splot modifiers
- ;; These should probably be more different for plot and splot ...
- (plot-modifiers (many (either plot-modifier datafile-modifier)))
-
- (plot-modifier
- (info-keyword
- (either
- ;; simple one-word modifiers
- (kw "nohidden3d") (kw "nocontours") (kw "nosurface")
-
- ;; word followed by expression
- [(either
- (kw ("lines" . "tyle") "ls")
- (kw ("linet" . "ype") "lt")
- (kw ("linew" . "idth") "lw")
- (kw ("pointt" . "ype") "pt")
- (kw ("points" . "ize") "ps")
- (kw ("pointi" . "nterval") "pi"))
- expression]
-
- ;; others defined below
- title-modifier notitle-modifier axes-modifier with-modifier
- linecolor-modifier fillstyle-modifier)))
-
- (title-modifier
- [(kw ("t" . "itle")) expression])
-
- (notitle-modifier
- [(:info "title")
- (kw ("not" . "itle"))
- (maybe string)])
-
- (axes-modifier
- [(kw ("ax" . "es")) (either "x1y1" "x1y2" "x2y1" "x2y2")])
-
- (linecolor-modifier
- [(kw ("linec" . "olor") "lc") color-spec])
-
- (fillstyle-modifier
- [(kw "fillstyle" "fs")
- ;; fill-style also used by "set style fill"
- fill-style])
-
- (fill-style
- [(either
- "empty"
- [(maybe "transparent")
- (either "pattern" "solid")
- (maybe (either fill-style-border-clause expression))])
- (maybe fill-style-border-clause)])
-
- (fill-style-border-clause
- (either "noborder" [(kw ("bo" . "rder")) expression]))
-
- (color-spec
- [(:info "colorspec")
- (either
- (kw ("var" . "iable"))
-
- [(kw ("pal" . "ette"))
- (either "z"
- [(either "frac" "cb") expression])]
-
- [(kw ("rgb" . "color"))
- (either (kw ("var" . "iable")) string)])])
-
- (with-modifier
- [(:info "plotting_styles")
- (kw ("w" . "ith"))
-
- ;; plotting-style also used for "set style data"
- (capture :with-style plotting-style)])
-
- (plotting-style
- (info-keyword
- (either
- ;; Simple styles that take no arguments
- (kw ("l" . "ines")) (kw ("i" . "mpulses")) (kw ("p" . "oints"))
- (kw ("linesp" . "oints") "lp") (kw ("d" . "ots")) (kw ("yerrorl" . "ines"))
- (kw ("errorl" . "ines")) (kw ("xerrorl" . "ines")) (kw ("xyerrorl" . "ines"))
- (kw ("ye" . "rrorbars")) (kw ("e" . "rrorbars")) (kw ("xe" . "rrorbars"))
- (kw ("xye" . "rrorbars")) (kw "boxes") (kw ("hist" . "ograms"))
- (kw ("boxer" . "rorbars")) (kw ("boxx" . "yerrorbars")) (kw ("st" . "eps"))
- (kw ("fs" . "teps")) (kw ("his" . "teps")) (kw ("fin" . "ancebars"))
- (kw ("can" . "dlesticks")) (kw ("pm" . "3d"))
- (kw ("cir" . "cles"))
-
- ;; Image styles all use the same info page
- [(:info "image")
- (either (kw ("ima" . "ge"))
- (kw ("rgbima" . "ge"))
- (kw ("rgba" . "lpha")))]
-
- ;; More complicated styles defined below
- labels-style-clause
- filledcurves-style-clause
- vectors-style-clause)))
-
- (labels-style-clause
- [(kw "labels")
- (maybe textcolor-spec)])
-
- (filledcurves-style-clause
- [(kw ("filledc" . "urves"))
- (maybe
- (either
- "closed"
-
- ["xy" "=" expression "," expression]
-
- [(maybe (either "above" "below"))
- (maybe [(either "x1" "x2" "y1" "y2")
- (maybe "=" expression)])]))])
-
- (vectors-style-clause
- [(kw ("vec" . "tors"))
- (many
- (either
- "nohead" "head" "heads" "filled" "empty" "nofilled" "front" "back"
- [(kw "arrowstyle" "as") expression]
- ["size" (delimited-list expression ",")]
- linestyle-spec))])
-
-;;; Various style specifiers, used in different places
- (linestyle-spec
- (many1
- (either
- [(kw ("lines" . "tyle") "ls") expression]
- [(kw ("linet" . "ype") "lt") expression]
- [(kw ("linew" . "idth") "lw") expression])))
-
- (textcolor-spec
- [(kw "textcolor" "tc")
- (either "default"
- ["lt" expression]
- color-spec)])
-
- (pointsize-spec [(kw "pointsize" "ps") expression])
-
-;;; Datafile modifiers
- (datafile-modifier
- (info-keyword
- (either binary-modifier
- [(maybe "nonuniform") (kw ("mat" . "rix"))]
- index-modifier every-modifier
- thru-modifier using-modifier
- smooth-modifier
- "volatile" "noautoscale")))
-
- (index-modifier
- [(kw ("i" . "ndex"))
- (either string (delimited-list expression ":" 0 2))])
-
- (every-modifier
- [(kw ("ev" . "ery")) (delimited-list (maybe expression) ":")])
-
- (thru-modifier
- [(kw "thru") expression])
-
- (using-modifier
- [(:eldoc gnuplot-find-using-eldoc)
- (kw ("u" . "sing"))
- (either
- string
- [colon-list (maybe string)])])
-
- (smooth-modifier
- [(kw ("s" . "mooth"))
- (either (kw ("a" . "csplines")) (kw ("b" . "ezier")) (kw ("c" . "splines"))
- (kw ("s" . "bezier")) (kw ("u" . "nique")) (kw ("f" . "requency"))
- (kw ("cum" . "ulative")) (kw ("k" . "density")))])
-
-;;; Binary datafile modifiers
- (binary-modifier
- ["binary" (many binary-keyword)])
-
- (binary-keyword
- (either
- ;; All of these binary keywords are described on the same
- ;; info page
- [(:info "keywords")
- (either
- "transpose" "flipx" "flipy" "flipz"
- ["flip" "=" (either "x" "y" "z")]
- ["scan" "=" name]
- [(either "dx" "dy" "dz") "=" number]
- [(either "origin" "center" "perpendicular") "="
- (delimited-list tuple ":")]
- [(kw ("rot" . "ate") "rotation") "="
- (sequence expression (maybe (kw ("d" . "eg")) (kw ("p" . "i"))))])]
-
- ;; remaining binary keywords have their own info pages
- (info-keyword
- (either
- [(either "array" "record")
- "="
- (delimited-list expression ":")]
-
- [(either "skip")
- "="
- (delimited-list expression ":")]
-
- [(either "format" "endian" "filetype")
- "="
- expression]))))
-
-;;; "fit" command
- (fit-command
- [(:info "fit")
- (kw "fit")
- (many axis-range)
- expression
- string
- (many plot-modifier)
- (kw "via")
- (either string (delimited-list name ","))])
-
-;;; print command
- (print-command
- [(kw ("pr" . "int")) (delimited-list expression ",")])
-
-;;; set commands
- (set-command
- [(:eldoc "set ...")
- (:info "set-show")
- (either (kw "set") (kw "unset") (kw "show"))
- (maybe iteration-spec)
- (info-keyword
- (either set-angles-clause set-arrow-clause
- set-autoscale-clause set-bars-clause
- set-border-clause set-boxwidth-clause
- set-clabel-clause set-clip-clause
- set-cntrparam-clause set-colorbox-clause
- set-contour-clause set-datafile-clause
- set-decimalsign-clause set-dgrid3d-clause
- set-dummy-clause set-encoding-clause
- set-fit-clause set-fontpath-clause
- set-format-clause set-grid-clause
- set-hidden3d-clause set-historysize-clause
- set-isosamples-clause set-key-clause
- set-label-clause set-loadpath-clause
- set-locale-clause set-logscale-clause
- set-mapping-clause set-margin-clause
- set-multiplot-clause set-mxtics-clause
- set-object-clause set-offsets-clause
- set-origin-clause set-output-clause
- set-parametric-clause set-pm3d-clause
- set-palette-clause set-pointsize-clause
- set-polar-clause set-print-clause
- set-samples-clause set-size-clause
- set-style-clause
- set-surface-clause set-table-clause
- set-terminal-clause set-termoption-clause
- set-tics-clause set-tics-clause-2
- set-xtics-clause
- set-timestamp-clause set-timefmt-clause
- set-title-clause set-view-clause
- set-data-clause set-dtics-clause
- set-xlabel-clause
- set-mtics-clause set-range-clause
- set-xyplane-clause set-zero-clause
- set-zeroaxis-clause))])
-
-;;; positions and coordinate systems for set options
- (position-system
- (either "first" "second" "graph" "screen" "character"))
-
- (dimension [(maybe position-system) expression])
-
- (position
- [dimension "," dimension (maybe "," dimension)])
-
- (to (either "to" "rto"))
-
-;;; all the different "set ... " options
- (set-angles-clause
- ["angles" (either "degrees" "radians")])
-
- (set-arrow-clause
- ["arrow" (maybe number)
- (many
- (either ["from" position] [to position]
- [(kw "arrowstyle" "as") expression]
- "nohead" "head" "backhead" "heads"
- ["size" dimension "," expression (maybe "," expression)]
- "filled" "empty" "nofilled" "front" "back"
- linecolor-modifier linestyle-spec))])
-
- (set-autoscale-clause
- ["autoscale"
- (either "fix"
- "keepfix"
- "x" "y" "z" "cb" "x2" "y2" "xy"
- "xmin" "ymin" "zmin" "cbmin" "x2min" "y2min"
- "xmax" "ymax" "zmax" "cbmax" "x2max" "y2max"
- "xfix" "yfix" "zfix" "cbfix" "x2fix" "y2fix"
- "xfixmax" "yfixmax" "zfixmax" "cbfixmax" "x2fixmax" "y2fixmax"
- "xfixmin" "yfixmin" "zfixmin" "cbfixmin" "x2fixmin" "y2fixmin")])
-
- (set-bars-clause
- ["bars"
- (either expression "small" "large" "fullwidth")
- (either "front" "back")])
-
- (set-border-clause
- ["border"
- (maybe number)
- (maybe (either "front" "back"))
- (maybe (kw "linewidth" "lw") expression)
- (maybe
- (either (kw "linestyle" "ls") (kw "linetype" "lt"))
- expression)])
-
- (set-boxwidth-clause
- ["boxwidth"
- (maybe expression)
- (maybe (either (kw ("abs" . "olute")) "relative"))])
-
- (set-clabel-clause
- ["clabel" (maybe string)])
-
- (set-clip-clause
- ["clip" (maybe (either "points" "one" "two"))])
-
- (set-cntrparam-clause
- [(kw "cntrparam")
- (either
- "linear" "cubicspline" "bspline"
-
- [(either "points" "order") number]
-
- [(kw "levels")
- (either
- number
- (sequence (kw "auto") (maybe number))
- (sequence
- (kw "discrete") comma-list)
- (sequence
- (kw "incremental") (delimited-list expression "," 2 3)))])])
-
- (set-colorbox-clause
- [(:info "color_box")
- (kw ("colorb" . "ox"))
- (many
- (either
- (kw ("vert" . "ical")) (kw ("horiz" . "ontal"))
- "default" "user"
- ["origin" expression "," expression]
- ["size" expression "," expression]
- "front" "back"
- "noborder" "bdefault"
- ["border" expression]))])
-
- (set-contour-clause
- ["contour" (either "base" "surface" "both")])
-
- (set-datafile-clause
- ["datafile"
- (either [(:info "set_datafile_fortran")
- "fortran"]
- [(:info "set_datafile_nofpe_trap")
- "nofpe_trap"]
- [(:info "set_datafile_missing")
- "missing" (maybe string)]
- [(:info "set_datafile_separator")
- "separator" (either "whitespace" string)]
- [(:info "set_datafile_commentschars")
- "commentschars" (maybe string)]
- [(:info "set_datafile_binary")
- "binary" (many binary-keyword)])])
-
- (set-decimalsign-clause
- ["decimalsign"
- (either string ["locale" (maybe string)])])
-
- (set-dgrid3d-clause
- ["dgrid3d"
- (maybe expression) ; fixme
- (maybe "," expression)
- (either
- "splines"
- ["qnorm" expression]
- [(either "gauss" "cauchy" "exp" "box" "hann")
- (maybe expression)
- (maybe "," expression)])])
-
- (set-dummy-clause
- ["dummy"
- name (maybe "," name)])
-
- (set-encoding-clause
- ["encoding"
- (either "default" "iso_8859_1" "iso_8859_15" "iso_8859_2" "iso_8859_9"
- "koi8r" "koi8u" "cp437" "cp850" "cp852" "cp1250" "cp1251" "cp1254"
- "utf8" "locale")])
-
- (set-fit-clause
- [(:info "fit_")
- "fit"
- (either
- ["logfile" string]
- "errorvariables" "noerrorvariables")])
-
- (set-fontpath-clause
- ["fontpath" (many string)])
-
- (set-format-clause
- [(:info "format_")
- "format"
- (maybe (either "x" "y" "xy" "x2" "y2" "z" "cb"))
- string])
-
- (set-grid-clause
- ["grid"
- (either "nomxtics" "mxtics" "noxtics" "xtics" "nomytics" "mytics"
- "noytics" "ytics" "nomztics" "mztics" "noztics" "ztics"
- "nomx2tics" "mx2tics" "nox2tics" "x2tics" "nomy2tics"
- "my2tics" "noy2tics" "y2tics" "nomcbtics" "mcbtics"
- "nocbtics" "cbtics" "layerdefault" "front" "back"
- [linestyle-spec (maybe "," linestyle-spec)])])
-
- (set-hidden3d-clause
- [(kw ("hidden" . "3d"))
- (many
- (either
- "defaults" "front" "back"
- ["offset" expression] "nooffset"
- ["trianglepattern"
- (either "0" "1" "2" "3" "4" "5" "6" "7")]
- ["undefined" (either "1" "2" "3")]
- ["noundefined"]
- "altdiagonal" "noaltdiagonal"
- "bentover" "nobentover"))])
-
- (set-historysize-clause
- ["historysize" number])
-
- (set-isosamples-clause
- [(kw ("isosam" . "ples")) number (maybe "," number)])
-
- (set-key-clause
- ["key"
- (many
- (either "on" "off" "default"
- [(either "inside" "outside")
- (either "lmargin" "rmargin" "tmargin" "bmargin")]
- ["at" expression "," expression]
- "left" "right" "center" "top" "bottom" "vertical"
- "horizontal" "Left" "Right" "reverse" "noreverse" "invert"
- "noinvert" "above" "over" "below" "under"
- ["samplen" number]
- ["spacing" number]
- ["width" number]
- [(either "autotitle" "noautotitle") (maybe "columnheader")]
- ["title" expression] "enhanced" "noenhanced" ["font" string]
- textcolor-spec
- [(either "box" "nobox") linestyle-spec]
- ["maxcols" (either expression "auto")]
- ["maxrows" (either expression "auto")]))])
-
- (set-label-clause
- ["label"
- (maybe expression)
- (either label-clause-component expression)
- (many label-clause-component)])
-
- (label-clause-component
- (either
- ["at" position]
- "left" "center" "right"
- (either "norotate" ["rotate" "by" expression])
- ["font" string]
- "noenhanced"
- "front" "back"
- textcolor-spec
- "nopoint" ["point" (many (either pointsize-spec linestyle-spec))]
- ["offset" position]))
-
- (set-loadpath-clause
- ["loadpath" (many string)])
-
- (set-locale-clause
- ["locale" (maybe string)])
-
- (set-logscale-clause
- ["logscale"
- (either "x" "y" "xy" "x2" "y2" "z" "cb" name)])
-
- (set-mapping-clause
- ["mapping" (either "cartesian" "spherical" "cylindrical")])
-
- (set-margin-clause
- [(either "bmargin" "lmargin" "rmargin" "tmargin")
- (maybe "at" "screen") expression])
-
- ;; TODO: set-mouse-clause
-
- (set-multiplot-clause
- ["multiplot"
- (maybe
- ["layout" number "," number
- (maybe (either "rowsfirst" "columnsfirst"))
- (maybe (either "downwards" "upwards"))
- (maybe "title" string)
- (maybe "scale" number (maybe "," number))
- (maybe "offset" number (maybe "," number))])])
-
- (set-mxtics-clause
- [(:info "mxtics")
- (either "mxtics" "mytics" "mztics" "mx2tics" "my2tics" "mcbtics")
- (either "default" number)])
-
- ;; "set object", objects, dimensions, positions
- (set-object-clause
- ["object"
- (maybe number)
- (info-keyword
- (either rectangle-object ellipse-object circle-object polygon-object))
- (maybe (either "front" "back" "behind"))
- (maybe (kw "fillcolor" "fc") color-spec)
- (maybe "fs" expression)
- (maybe "default")
- (maybe (kw "linewidth" "lw") expression)])
-
- (rectangle-object
- [(kw ("rect" . "angle"))
- (maybe
- (either
- ["from" position (either "to" "rto") position]
- ["center" position "size" dimension "," dimension]
- ["at" position "size" dimension "," dimension]))])
-
- (ellipse-object
- ["ellipse"
- (either "at" "center") position
- "size" dimension "," dimension
- (maybe "angle" number)])
-
- (circle-object
- ["circle"
- (either "at" "center") position
- "size" dimension
- (maybe "arc" "[" number ":" number "]")])
-
- (polygon-object
- ["polygon"
- "from" position (many (either "to" "rto") position)])
-
- ;; "set offsets"
- (set-offsets-clause
- ["offsets"
- (delimited-list [(maybe "graph") expression] "," 4 4)])
-
- (set-origin-clause
- ["origin" expression "," expression])
-
- (set-output-clause
- ["output" (maybe string)])
-
- (set-parametric-clause
- [(:info "parametric_")
- (kw ("param" . "etric"))])
-
- (set-pm3d-clause
- ["pm3d"
- (many
- (either
- ["at" name]
- ["interpolate" number "," number]
- (either "scansautomatic" "scansforward" "scansbackward" "depthorder")
- ["flush" (either "begin" "center" "end")]
- (either "ftriangles" "noftriangles")
- (either "clip1in" "clip4in")
- ["corners2color"
- (either "mean" "geomean" "median" "min" "max" "c1" "c2" "c3" "c4")]
- ["hidden3d" number]
- "nohidden3d"
- "implicit" "explicit" "map"))])
-
- (set-palette-clause
- ["palette"
- (many
- (either
- "gray" "color"
- ["gamma" number]
- ["rgbformulae" number "," number "," number]
- "defined" ; not complete
- ["functions" expression "," expression "," expression]
- ["file" string (many datafile-modifier)]
- "RGB" "HSV" "CMY" "YIQ" "XYZ"
- "positive" "negative"
- "nops_allcF" "ps_allcF"
- ["maxcolors" number]))])
-
- (set-pointsize-clause pointsize-spec)
-
- (set-polar-clause "polar")
-
- (set-print-clause
- [(:info "print_")
- "print"
- (maybe string)])
-
- (set-samples-clause
- ["samples" expression (maybe "," expression)])
-
- (set-size-clause
- ["size"
- (either
- "square" "nosquare"
- ["ratio" expression]
- "noratio"
- [expression "," expression])])
-
- (set-style-clause
- ["style"
- (either style-arrow-clause style-data-clause style-fill-clause
- style-function-clause style-increment-clause
- style-line-clause style-circle-clause style-rectangle-clause)])
-
- ;; begin subclauses of "set style ..."
- (style-arrow-clause
- [(:info "set_style_arrow")
- "arrow"
- number
- (either
- "default"
- (many
- (either "nohead" "head" "heads"
- "filled" "empty" "nofilled"
- "front" "back"
- ["size" dimension "," number (maybe "," number)]
- linestyle-spec)))])
-
- (style-data-clause
- [(:info "set_style_data")
- "data" plotting-style])
-
- (style-fill-clause
- [(:info "set_style_fill")
- "fill" fill-style])
-
- (style-function-clause
- [(:info "set_style_function")
- "function" plotting-style])
-
- (style-increment-clause
- [(:info "set_style_increment")
- "increment"
- (either (kw ("d" . "efault")) (kw ("u" . "serstyles")))])
-
- (style-line-clause
- [(:info "set_style_line")
- "line"
- expression
- (either
- "default"
- (many
- (either
- "palette"
- [(kw ("linet" . "ype") "lt")
- (either expression color-spec)]
- [(kw ("linec" . "olor") "lc") color-spec]
- [(either (kw ("linew" . "idth") "lw")
- (kw ("pointt" . "ype") "pt")
- (kw ("points" . "ize") "ps")
- (kw ("pointi" . "nterval") "pi"))
- expression])))])
-
- (style-circle-clause
- [(:info "set_style_circle")
- "circle" "radius" dimension])
-
- (style-rectangle-clause
- [(:info "set_style_rectangle")
- "rectangle"
- (many
- (either
- "front" "back"
- [(kw ("linew" . "idth") "lw") expression]
- [(kw "fillcolor" "fc") color-spec]
- ["fs" expression]))])
- ;; end of "set style ..." clauses
-
- (set-surface-clause "surface")
-
- (set-table-clause ["table" (maybe string)])
-
- (set-terminal-clause ; not sure how to do this...
- ["terminal" (maybe (either "push" "pop"))])
-
- (set-termoption-clause
- ["termoption"
- (either
- "enhanced" "noenhanced"
- ["font" string]
- "solid" "dashed"
- [(kw "linewidth" "lw") expression])])
-
- (set-tics-clause
- ["tics"
- (many
- (either
- "axis" "border" "mirror" "nomirror" "in" "out"
- ["scale" (either "default" [expression (maybe "," expression)])]
- [(either "rotate" "norotate") (maybe "by" expression)]
- ["offset" expression] "nooffset"
- ["format" string]
- ["font" string]
- textcolor-spec))])
-
- (set-tics-clause-2
- ["tics" (either "front" "back")])
-
- (set-xtics-clause
- [(:info "xtics")
- (either "xtics" "ytics" "ztics" "x2tics" "y2tics" "cbtics")
- (many
- (either
- "axis" "border" "mirror" "nomirror" "in" "out"
- ["scale" (either "default" [expression (maybe "," expression)])]
- [(either "rotate" "norotate") (maybe "by" expression)]
- ["offset" position] "nooffset"
- "add" "autofreq"
- ["(" (delimited-list [(maybe string) expression (maybe number)] ",") ")"]
- ["format" string]
- ["font" string]
- "rangelimited"
- textcolor-spec
- (delimited-list expression ",")))])
-
- (set-timestamp-clause
- ["timestamp"
- (maybe string)
- (maybe (either "top" "bottom"))
- (maybe (either "rotate" "norotate"))
- (maybe "offset" position)
- (maybe "font" string)])
-
- (set-timefmt-clause
- ["timefmt" string])
-
- (set-title-clause
- [(:info "title_")
- "title"
- (maybe expression)
- (many
- (either
- ["offset" position]
- ["font" string]
- textcolor-spec
- "enhanced" "noenhanced"))])
-
- (set-view-clause
- ["view"
- (either
- "map"
- [(either "equal" "noequal") (maybe (either "xy" "xyz"))]
- (delimited-list (maybe expression) ","))])
-
- (set-data-clause
- [(:info "xdata")
- (either "xdata" "ydata" "zdata" "x2data" "y2data" "cbdata")
- (maybe (either "time" "geographic"))])
-
- (set-dtics-clause
- [(:info "xdtics")
- (either "xdtics" "ydtics" "zdtics" "x2dtics" "y2dtics" "cbdtics")])
-
- (set-xlabel-clause
- [(:info "xlabel")
- (either (kw ("xlab" . "el")) (kw ("ylab" . "el"))
- (kw ("zlab" . "el")) (kw ("x2lab" . "el"))
- (kw ("y2lab" . "el")) (kw ("cblab" . "el")))
- (maybe expression)
- (many
- (either
- ["offset" position]
- ["font" string]
- textcolor-spec
- "enhanced" "noenhanced"))])
-
- (set-mtics-clause
- [(:info "xmtics")
- (either "xmtics" "ymtics" "zmtics" "x2mtics" "y2mtics" "cbmtics")])
-
- (set-range-clause
- [(:info "xrange")
- (either (kw ("xr" . "ange")) (kw ("yr" . "ange"))
- (kw ("x2r" . "ange")) (kw ("y2r" . "ange"))
- (kw ("zr" . "ange")) (kw ("tr" . "ange"))
- (kw ("ur" . "ange")) (kw ("vr" . "ange"))
- (kw ("rr" . "ange")) (kw ("cbr" . "ange")))
- (either
- "restore"
- ["[" (maybe
- [(maybe axis-range-component) ":"
- (maybe axis-range-component)])
- "]"
- (many (either "reverse" "noreverse" "writeback" "nowriteback"))])])
-
- (set-xyplane-clause
- ["xyplane" (either "at" "relative") expression])
-
- (set-zero-clause
- ["zero" expression])
-
- (set-zeroaxis-clause
- [(:info "zeroaxis")
- (either "zeroaxis" "xzeroaxis" "x2zeroaxis" "yzeroaxis" "y2zeroaxis"
- "zzeroaxis")
- (maybe linestyle-spec)])
-
-
-;;; Other commands
- (cd-command
- ["cd" string])
-
- (call-command
- ["call" string (many expression)])
-
- (simple-command
- (either "clear" "exit" "quit" "pwd" "refresh" "reread" "reset"
- "shell"))
-
- (eval-command
- ["eval" expression])
-
- (load-command
- ["load" string])
-
- (lower-raise-command [(either "lower" "raise") number])
-
- (pause-command
- ["pause"
- (either
- expression
- ["mouse" (maybe endcondition (maybe "," endcondition))])
- string])
-
- (endcondition (either "keypress" "button1" "button2" "button3" "close" "any"))
-
- (save-command
- ["save"
- (either "functions" "variables" "terminal" "set")
- string])
-
- (system-command
- ["system" string])
-
- (test-command
- ["test"
- (either
- "terminal"
- ["palette"
- (maybe
- (either "rgb" "rbg" "grb" "gbr" "brg" "bgr"))])])
-
- (undefine-command
- ["undefine" (many name)])
-
- (update-command
- ["update" string (maybe string)]))
-
- ;; This is the start symbol
- 'command))))
-
-
-;; The following macros are used for debugging; load
-;; gnuplot-debug-context.el and then re-load this file to enable
-;; them. For normal use, they compile to no-ops.
-(eval-when-compile
- (when (not (featurep 'gnuplot-debug-context))
- (defmacro with-gnuplot-trace-buffer (&rest args) "No-op." '(progn nil))
- (defmacro gnuplot-trace (&rest args) "No-op." '(progn nil))
- (defmacro gnuplot-debug (&rest args) "No-op." '(progn nil))))
-
-
-
-;;;; Variables to be set via pattern matching
-(defvar gnuplot-completions nil
- "List of possible gnuplot-mode completions at point.
-This is filled in by `gnuplot-match-pattern' when it reaches the
-token before point.")
-
-(defvar gnuplot-info-at-point nil
- "Relevant page of the Gnuplot info manual for the construction at point.
-
-Set by `gnuplot-match-pattern' using information from
-`gnuplot-compiled-grammar'. `gnuplot-match-pattern' pushes ElDoc
-and info strings onto the stack as it runs, and scans the stack
-for the topmost entry when it reaches the token at point.")
-
-(defvar gnuplot-eldoc nil
- "ElDoc documentation string for the Gnuplot construction at point.
-
-Set by `gnuplot-match-pattern'. See also `gnuplot-info-at-point'.")
-
-(defvar gnuplot-captures nil
- "Alist of named capture groups for gnuplot-mode completion code.
-
-Each entry is of the form (NAME BEGIN END), where NAME is the
-name specified in the (capture NAME PATTERN) form in the
-`gnuplot-compiled-grammar' source, BEGIN is the tail of the token
-list beginning the capture group, and END is the tail of the
-token list just after the end of the capture group.")
-
-
-;;;; The pattern matching machine
-(defun gnuplot-match-pattern (instructions tokens completing-p
- &optional start-symbol)
- "Parse TOKENS, setting completions, info and ElDoc information.
-
-This function parses TOKENS by simulating a stack machine with
-unlimited backtracking. If COMPLETING-P is non-nil, it stops
-before the token at point and collects a list of the next tokens
-that it would accept in `gnuplot-completions'. If COMPLETING-P is
-nil, it parses up to the token at point and sets `gnuplot-eldoc'
-and `gnuplot-info-at-point' based on the contents of the stack
-there."
- (catch 'return
- (let ((pc 0) ; Program counter
- ;; Stack of return addresses (return PC), eldoc strings
- ;; (eldoc STRING) and info pages (info STRING)
- (stack '())
- ;; Stack of backtracking records:
- ;; ((STACK TOKENS RESUME-PC CAPTURES PROGRESS) ...)
- (backtrack '())
- ;; Match failure flag, set to `t' to cause backtracking
- (fail nil)
- ;; Flag set by JUMP and CALL instructions to stop PC advance
- (jump nil)
- ;; Record of progress made within (many ...) loops, an alist
- ;; of conses (pc . tokens)
- (progress '()))
-
- (with-gnuplot-trace-buffer (erase-buffer))
-
- (when start-symbol ; HACK FIXME
- (let ((look-for `(label ,start-symbol)))
- (while (not (equal (aref instructions pc) look-for))
- (incf pc))
- (incf pc)))
-
- (setq gnuplot-completions nil
- gnuplot-eldoc nil
- gnuplot-info-at-point nil
- gnuplot-captures nil)
-
- (flet ((advance
- ()
- (pop tokens)
- (if (and (null tokens) (not completing-p))
- (gnuplot-scan-stack stack tokens)))
- (fail () (setq fail t)))
-
- ;; Main loop
- (while t
- (let* ((inst (aref instructions pc))
- (opcode (car inst))
- (token (car tokens))
- (end-of-tokens (null tokens)))
- (gnuplot-trace "%s\t%s\t%s\n" pc inst (and token (gnuplot-token-id token)))
-
- (case opcode
- ;; (literal LITERAL NO-COMPLETE)
- ((literal)
- (let ((expect (cadr inst))
- (no-complete (caddr inst)))
- (cond (end-of-tokens
- (unless no-complete
- (gnuplot-trace "\tpushing \"%s\" to completions\n" expect)
- (push expect gnuplot-completions))
- (fail))
-
- ((not (equal (gnuplot-token-id token) expect))
- (fail))
-
- ;; otherwise succeed
- (t (advance)))))
-
- ;; (token-type TYPE)
- ((token-type)
- (let ((expect (cadr inst)))
- (if (or end-of-tokens
- (not (eq (gnuplot-token-type token) expect)))
- (fail)
- (advance))))
-
- ;; (keyword REGEXP NAME): match any token whose ID
- ;; regexp-matches REGEXP, use NAME for completions
- ((keyword)
- (let ((regexp (cadr inst))
- (name (caddr inst)))
- (cond (end-of-tokens
- (gnuplot-trace "\tpushing \"%s\" to completions\n" name)
- (push name gnuplot-completions)
- (fail))
-
- ((not (string-match-p regexp (gnuplot-token-id token)))
- (fail))
-
- ;; otherwise succeed
- (t
- (setf (gnuplot-token-id token) name)
- (advance)))))
-
- ;; (any): match any token
- ((any)
- (if end-of-tokens
- (fail)
- (advance)))
-
- ;; (jump LOCATION): jump to instruction at LOCATION
- ((jump)
- (let ((location (cadr inst)))
- (setq jump location)))
-
- ;; (call LOCATION): push the next instruction as a
- ;; return location and jump
- ((call)
- (let ((location (cadr inst)))
- (push `(return ,(+ pc 1)) stack)
- (setq jump location)))
-
- ;; (return): return to address at topmost RETURN record on
- ;; stack, or stop matching and return if stack is empty
- ((return)
- (while (and stack
- (not (eq (caar stack) 'return)))
- (pop stack))
- (if (not stack)
- ;; Successful match
- (throw 'return (list tokens))
- ;; Otherwise, return to caller
- (let* ((r (pop stack))
- (r-pc (cadr r)))
- (setq jump r-pc))))
-
- ;; (choice LOCATION): push LOCATION onto the stack of
- ;; backtracking points and continue at next instruction
- ((choice)
- (let ((location (cadr inst)))
- (push `(,stack ,tokens ,location ,gnuplot-captures
- ,progress)
- backtrack)))
-
- ;; (commit LOCATION): discard most recent backtrack point
- ;; and jump to LOCATION
- ((commit)
- (let ((location (cadr inst)))
- (if (not backtrack)
- (error "No more backtrack points in commit"))
- (pop backtrack)
- (setq jump location)))
-
- ;; (fail): force this match to fail, going back to most
- ;; recent backtrack point
- ((fail)
- (fail))
-
- ;; (assert): run Lisp code and fail if it returns NIL
- ((assert)
- (let ((form (cadr inst)))
- (if (not (eval form)) (fail))))
-
- ;; (push TYPE VALUE): push an info page or eldoc string
- ;; onto the stack
- ((push)
- (let* ((type (cadr inst))
- (value (caddr inst)))
- (push `(,type ,value ,tokens) stack)))
-
- ;; (pop TYPE): pop something off the stack
- ((pop)
- (let ((type (cadr inst)))
- (if (not (and stack
- (eq (caar stack) type)))
- (error "Expected a %s on the stack but found %s" type stack))
- (pop stack)))
-
- ;; (save-start NAME): save current token pointer as
- ;; beginning of capture group NAME
- ((save-start)
- (let ((name (cadr inst)))
- (push `(,name ,tokens nil) gnuplot-captures)))
-
- ;; (save-end NAME): save current token pointer as end of
- ;; capture group NAME
- ((save-end)
- (let* ((name (cadr inst))
- (record (assoc name gnuplot-captures)))
- (if (not record)
- (error "Gnuplot-match-tokens: no open capture group named %s" name)
- (setf (caddr record) tokens)
- (gnuplot-debug (gnuplot-dump-captures)))))
-
- ;; (check-progress): make sure not stuck in an infinite loop
- ((check-progress)
- (let ((prev-progress (cdr (assoc pc progress))))
- (if (and prev-progress (eq prev-progress tokens))
- (fail)
- (push (cons pc tokens) progress))))
-
- (t
- (error "Bad instruction: %s" inst)))
-
- ;; Increment PC or jump
- (setq pc (or jump (1+ pc))
- jump nil)
-
- ;; Backtrack on failure
- (when fail
- (if (not backtrack) ; Out of backtracking stack: failed match
- (throw 'return nil)
- (gnuplot-trace "\t*fail*\t%s\n" (length backtrack))
- (gnuplot-debug (gnuplot-dump-backtrack backtrack))
- ;; If we got as far as token-at-point before failing,
- ;; scan the stack for eldoc and info strings
- (when (and end-of-tokens (not completing-p))
- (gnuplot-scan-stack stack tokens))
-
- (destructuring-bind
- (bt-stack bt-tokens bt-pc bt-captures bt-progress)
- (pop backtrack)
- (setq stack bt-stack
- tokens bt-tokens
- pc bt-pc
- gnuplot-captures bt-captures
- progress bt-progress
- fail nil)
- (gnuplot-debug (gnuplot-dump-progress progress)))))))))))
-
-(defun gnuplot-scan-stack (stack tokens)
- "Scan STACK for the most recently pushed eldoc and info strings."
- (gnuplot-trace "\t* scanning stack *\n")
- (gnuplot-debug (gnuplot-backtrace))
- (gnuplot-debug (gnuplot-dump-captures))
-
- (catch 'no-scan
- (while (and stack
- (not (and gnuplot-info-at-point gnuplot-eldoc)))
- (let* ((item (car stack))
- (type (car item))
- (position (caddr item))) ; must progress by at least one token
- (if (and (memq type '(info eldoc no-scan))
- (not (eq position tokens)))
- (case type
- ((no-scan)
- (throw 'no-scan nil))
-
- ((info)
- (when (not gnuplot-info-at-point)
- (let ((info (cadr item)))
- (setq gnuplot-info-at-point
- (cond
- ((eq info 'first-token)
- (gnuplot-token-id (car position)))
- ((functionp info) (funcall info))
- (t info)))
- (when gnuplot-info-at-point
- (gnuplot-trace "\tset info to \"%s\"\n" gnuplot-info-at-point)
- (when (and (not gnuplot-eldoc) gnuplot-eldoc-hash)
- (let ((eldoc
- (car (gethash gnuplot-info-at-point gnuplot-eldoc-hash))))
- (when eldoc
- (setq gnuplot-eldoc eldoc)
- (gnuplot-trace "\tand set eldoc to \"%s\"\n" eldoc))))))))
-
- ((eldoc)
- (when (not gnuplot-eldoc)
- (let ((eldoc (cadr item)))
- (setq gnuplot-eldoc
- (if (functionp eldoc) (funcall eldoc) eldoc))
- (gnuplot-trace "\tset eldoc to \"%s\"\n" gnuplot-eldoc)))))))
- (pop stack))))
-
-(defun gnuplot-capture-group (name)
- "Return capture group NAME from the most recent parse, as a list of tokens."
- (let ((record (assoc name gnuplot-captures)))
- (if (not record) nil
- (let ((begin (cadr record))
- (end (caddr record))
- (accum '()))
- (while (and begin (not (eq begin end)))
- (push (pop begin) accum))
- (nreverse accum)))))
-
-(defun gnuplot-capture-group->string (name)
- (let ((tokens (gnuplot-capture-group name)))
- (and tokens
- (mapconcat 'gnuplot-token-id tokens " "))))
-
-
-;;; Interface to the matching machine
-(defun gnuplot-parse-at-point (completing-p)
- (let ((tokens (gnuplot-tokenize completing-p)))
- (gnuplot-match-pattern gnuplot-compiled-grammar tokens completing-p)))
-
-;; Completions
-(defun gnuplot-completions ()
- (gnuplot-parse-at-point t)
- (if (featurep 'xemacs) ; Need an alist
- (mapcar (lambda (s) (cons s nil)) gnuplot-completions)
- gnuplot-completions))
-
-(defun gnuplot-context-completion-at-point ()
- "Return completions of keyword preceding point, using context."
- (let* ((end (point))
- (beg
- (save-excursion
- (skip-syntax-backward "w_" (gnuplot-point-at-beginning-of-command))
- (point)))
- (word nil)
- (completions (gnuplot-completions)))
-
- (setq word (buffer-substring beg end)
- completions (all-completions word completions))
-
- (if completions
- (list beg end completions)
- (if (not (equal "" word))
- (message "No gnuplot keywords complete '%s'" word)
- (message "No completions at point"))
- nil)))
-
-;; Eldoc help
-(defun gnuplot-eldoc-function ()
- "Return the ElDoc string for the Gnuplot construction at point."
- (gnuplot-parse-at-point nil)
- gnuplot-eldoc)
-
-(defun gnuplot-help-function ()
- "Pop up the extended documentation for the construction at point."
- (interactive)
- (gnuplot-parse-at-point nil)
- (if (and gnuplot-info-at-point gnuplot-eldoc-hash)
- (let ((eldoc
- (cadr (gethash gnuplot-info-at-point gnuplot-eldoc-hash))))
- (if eldoc (message eldoc)))))
-
-;; Info lookup
-(defun gnuplot-info-at-point (&optional query)
- "Open the relevant gnuplot info page for the construction at point."
- (interactive "P")
- (setq gnuplot-info-at-point nil)
- (unless query
- (gnuplot-parse-at-point nil))
- (if (or query (not gnuplot-info-at-point))
- (let ((info
- (info-lookup-interactive-arguments 'symbol)))
- (setq gnuplot-info-at-point (car info))))
- (when gnuplot-info-at-point
- (gnuplot--find-info-node gnuplot-info-at-point)))
-
-(defun gnuplot--find-info-node (node)
- (save-window-excursion
- (if (>= emacs-major-version 23)
- (info (format "(gnuplot)%s" node))
- (info)
- (Info-find-node "gnuplot" node)))
- (gnuplot--adjust-info-display))
-
-
-;;; Some context-sensitive hacks
-
-;; ElDoc strings for "using" specs, which depend on other information
-;; from the parsed command
-
-(defvar gnuplot-using-eldoc
- '(("boxerrorbars" . "x:y:ydelta{:xdelta} | x:y:ylow:yhigh{:xdelta}")
- ("boxes" . "x:y{:x_width}")
- ("boxxyerrorbars" . "x:y:xdelta:ydelta | x:y:xlow:xhigh:ylow:yhigh")
- ("candlesticks" . "x:box_min:whisker_min:whisker_high:box_high | date:open:low:high:close")
- ("circles" . "x:y:radius")
- ("dots" . "x{:y{:z}}")
- ("filledcurves" . "x:y | x:y1:y2")
- ("financebars" . "date:open:low:high:close")
- ("fsteps" . "y | x:y")
- ("histeps" . "y | x:y")
- ("histograms" . "y:yerr | y:ymin:ymax")
- ("image" . "x:y:value")
- ("rgbimage" . "x:y:r:g:b")
- ("rgbalpha" . "x:y:r:g:b:a")
- ("impulses" . "x{:y{:z}}")
- ("labels" . "x:y:string")
- ("lines" . "y | x:y")
- ("steps" . "y | x:y")
- ("vectors" . "x:y:xdelta:ydelta")
- ("xerrorbars" . "x:y:xdelta | x:y:xlow:xhigh")
- ("xyerrorbars" . "x:y:xdelta:ydelta | x:y:xlow:xhigh:ylow:yhigh")
- ("yerrorbars" . "x:y:ydelta | x:y:ylow:yhigh")
- ("yerrorlines" . "x:y:ydelta | x:y:ylow:yhigh")
- ("xerrorlines" "x:y:xdelta | x:y:xlow:xhigh")
- ("xyerrorlines" . "x:y:xdelta:ydelta | x:y:xlow:xhigh:ylow:yhigh"))
- "Alist of ElDoc strings for Gnuplot \"using\" clauses in \"plot\" commands.")
-
-(defvar gnuplot-using-3d-eldoc
- (append
- '(("fsteps" . "z | x:y:z")
- ("histeps" . "z | x:y:z")
- ("histograms" . "y:yerr | y:ymin:ymax")
- ("image" . "x:y:z:value")
- ("rgbimage" . "x:y:z:r:g:b")
- ("rgbalpha" . "x:y:z:r:g:b:a")
- ("labels" . "x:y:z:string")
- ("lines" . "z | x:y:z")
- ("steps" . "z | x:y:z")
- ("vectors" . "x:y:z:xdelta:ydelta:zdelta"))
- gnuplot-using-eldoc)
- "Alist of ElDoc strings for Gnuplot \"using\" clauses in \"splot\" commands.")
-
-(defun gnuplot-find-using-eldoc ()
- "Return ElDoc string for a Gnuplot \"using\" clause, based on plotting style.
-
-This will fail if the \"using\" clause comes before the \"with\"
-clause."
- (let ((with-style (gnuplot-capture-group :with-style))
- (3d-p (gnuplot-capture-group :splot-command))
- (column-description nil))
- (if with-style
- (let ((with-style-string (gnuplot-token-id (car with-style))))
- (setq column-description
- (or (and 3d-p
- (cdr (assoc with-style-string gnuplot-using-3d-eldoc)))
- (cdr (assoc with-style-string gnuplot-using-eldoc))
- "<columns>"))))
- (format "using %s {'format'}" column-description)))
-
-;;; Needed for correctly parsing plot commands
-(defun gnuplot-guess-parametric-p (&optional start)
- "Guess whether the command beginning at START is in parametric mode.
-
-Searches backward in current buffer for an \"(un)set parametric\"
-command."
- (save-excursion
- (and start (goto-char start))
- (catch 'result
- (while
- (search-backward-regexp "reset\\|set\\s-+parametric" (point-min) t)
- (gnuplot-beginning-of-command)
- (cond ((looking-at "reset\\|unset\\s-+parametric") (throw 'result nil))
- ((looking-at "set\\s-+parametric") (throw 'result t))))
- nil)))
-
-
-
-;;; All done!
-(provide 'gnuplot-context)
-
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-
-;;; gnuplot-context.el ends here
diff --git a/elpa/gnuplot-20200322.53/gnuplot-gui.el b/elpa/gnuplot-20200322.53/gnuplot-gui.el
deleted file mode 100644
index a3eb4e0..0000000
--- a/elpa/gnuplot-20200322.53/gnuplot-gui.el
+++ /dev/null
@@ -1,1733 +0,0 @@
-;;;; gnuplot-gui.el -- GUI interface to setting options in gnuplot-mode
-
-;; Copyright (C) 1998-2000 Bruce Ravel
-
-;; Author: Bruce Ravel <ravel@phys.washington.edu>
-;; URL: https://github.com/emacsorphanage/gnuplot
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; This file provides a graphical user interface to setting arguments
-;; to gnuplot commands. Positioning point near a command and invoking
-;; `gnuplot-gui-set-options-and-insert' (C-c C-c or shift-mouse-2)
-;; will pop open a frame with widgets for setting the various
-;; arguments appropriate the the item that was near point. The goal
-;; is to provide point-and-click functionality to gnuplot-mode.
-;;
-;; gnuplot-gui is designed for gnuplot 3.7, but since much of 3.7 is
-;; backward compatible to 3.5, it will work well for that version
-;; also.
-;;
-;; gnuplot-gui.el was developed using Emacs 19.34 and is known to work
-;; on Emacs 20.x and XEmacs 20.x. I do not know what is the earliest
-;; version for which it will work, but I make no guarantees for
-;; versions before 19.34. Note that this makes heavy use of the
-;; widget package, so this will not work on Emacs 19.34 unless you
-;; install the widget package separately.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; To do:
-;;
-;; Widgets I need:
-;; -- 'position: two or three comma separated numbers used to denote a
-;; position or a tic start/end/increment (see arrow,
-;; need a prefix)
-;; -- 'modifier: colon separated fields used for datafile modifiers
-;;
-;; command types which are currently unsupported or contain mistakes
-;; -- unsupported: cntrparam
-;; -- plot, splot, fit: rather lame
-;; -- label: position information missing
-;; -- label: font string handled in overly simple manner
-;; -- hidden3d: not really suited to 'list, but all options are exclusive...
-;; -- pointstyle argument to "set label"
-;;
-;; overall:
-;; -- continuation lines (ugh!)
-;; -- multiple frames end up displaying same window after setting options
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Code:
-
-(require 'gnuplot)
-(eval-and-compile
- (condition-case ()
- (progn
- (require 'widget)
- (require 'wid-edit))
- (error nil)))
-(require 'cl)
-(eval-when-compile ; suppress some compiler warnings
- (defvar gnuplot-xemacs-p nil)
- (defvar gnuplot-quote-character nil)
- (defvar gnuplot-info-display nil)
- (defvar gnuplot-mode-map nil))
-
-;; (eval-when-compile
-;; (require 'wid-edit))
-
-(eval-and-compile ; I need this!
- (if (fboundp 'split-string)
- ()
- (defun split-string (string &optional pattern)
- "Return a list of substrings of STRING which are separated by PATTERN.
-If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
- (or pattern
- (setq pattern "[ \f\t\n\r\v]+"))
- ;; The FSF version of this function takes care not to cons in case
- ;; of infloop. Maybe we should synch?
- (let (parts (start 0))
- (while (string-match pattern string start)
- (setq parts (cons (substring string start (match-beginning 0)) parts)
- start (match-end 0)))
- (nreverse (cons (substring string start) parts)))) ))
-
-
-
-;;; customizable variables
-
-(defgroup gnuplot-gui nil
- "Graphical interface to setting arguments in gnuplot scrips."
- :prefix "gnuplot-gui-"
- :group 'gnuplot)
-
-(defcustom gnuplot-gui-popup-flag nil
- "Non-nil means to open arguments pop-ups automatically.
-This would be done after menu insertion of Gnuplot commands."
- :group 'gnuplot-gui
- :type 'boolean)
-
-(defvar gnuplot-gui-frame nil
- "Frame used to hold the buffer for setting options.")
-(defcustom gnuplot-gui-frame-plist
- '(height 18 width 65 border-width 0
- user-position t top 150 left 150
- internal-border-width 0 unsplittable t
- default-toolbar-visible-p nil has-modeline-p nil
- menubar-visible-p nil)
- "Frame plist for the input run-time display frame in XEmacs."
- :type '(repeat (group :inline t
- (symbol :tag "Property")
- (sexp :tag "Value")))
- :group 'gnuplot-gui)
-(defcustom gnuplot-gui-frame-parameters
- '((height . 18)
- (width . 65)
- (user-position . t)
- (top . 150)
- (left . 150)
- (border-width . 0)
- (menu-bar-lines . 0)
- (unsplittable . t))
- "Frame parameters for the input run-time display frame in Emacs."
- :group 'gnuplot-gui
- :type '(repeat (sexp :tag "Parameter:")))
-
-(defcustom gnuplot-gui-fontname-list
- '(" " "\"Helvetica\"" "\"Times-Roman\"")
- "List of known font names.
-These *must* be quoted, like so \"\\\"Helvetica\\\"\". This allows
-for fonts with names like \"\\\"Arial Bold Italic\\\"\" to be treated
-as single entries in the menu-buttons. And it is really important that
-the first entry in the list be a blank string."
- :group 'gnuplot-gui
- :type '(repeat (string :tag "Font name:")))
-
-;; some global variables
-(defvar gnuplot-current-frame nil)
-(defvar gnuplot-current-buffer nil)
-(defvar gnuplot-current-buffer-point nil)
-(defvar gnuplot-gui-alist nil)
-(defvar gnuplot-gui-current-string nil)
-
-
-;;; various tools for handling data structures and text in the buffer
-
-;; tools for accessing the elements of the lists in `gnuplot-gui-all-types'
-(defsubst gnuplot-gui-type-tag (obj) (elt obj 0))
-(defsubst gnuplot-gui-type-symbol (obj) (elt obj 1))
-(defsubst gnuplot-gui-type-default (obj) (elt obj 2))
-(defsubst gnuplot-gui-type-prefix (obj) (elt obj 3)) ; also 'range seperator
-(defsubst gnuplot-gui-type-fourth (obj) (elt obj 4))
-(defsubst gnuplot-gui-type-list (obj) (cddr obj))
-
-(defun gnuplot-this-word ()
- "Return the word under point."
- (let ((begin (save-excursion (beginning-of-line) (point-marker)))
- (end (save-excursion (end-of-line) (point-marker))))
- (save-excursion
- (or (looking-at "\\<") (= (current-column) 0) (forward-word -1))
- (if (> (point) begin) (setq begin (point-marker)))
- (forward-word 1)
- (if (> (point) end) (goto-char end))
- (buffer-substring-no-properties begin (point)))))
-
-
-
-;;; data structures containing regarding options in Gnuplot 3.7
-
-;; various constants used for options that take the same sorts of arguments
-(defconst gnuplot-gui-mtics-list
- '(("FREQUENCY" 'number " ")
- ("DEFAULT" 'list " " "default")))
-(defconst gnuplot-gui-data-list
- '(("DATA TYPE" 'list " " "time")))
-(defconst gnuplot-gui-label-list
- '(("LABEL" 'string " ")
- ("POSITION" 'position " " "" 2)
- ("FONTNAME" 'list " " gnuplot-gui-fontname-list)
- ("FONTSIZE" 'fontsize " ")))
-(defconst gnuplot-gui-range-list
- '(("RANGE" 'range (" " . " ") ":")
- ("REVERSE" 'list " " "reverse" "noreverse")
- ("WRITEBACK" 'list " " "writeback" "nowriteback")))
-(defconst gnuplot-gui-tics-list
- '(("WHERE" 'list " " "axis" "border")
- ("MIRROR" 'list " " "mirror" "nomirror")
- ("ROTATE" 'list " " "rotate" "norotate")
- ("SERIES" 'position " " "" 3)
- ("LABEL ARRAY" 'labels () )))
-(defconst gnuplot-gui-zeroaxis-list
- '(("LINETYPE" 'number " ")))
-
-(defvar gnuplot-gui-terminal-types nil
- "Associated list of terminal descriptions.
-See the doc-string for `gnuplot-gui-all-types'.")
-(setq gnuplot-gui-terminal-types
- (list (cons "aifm"
- '(("COLOR" 'list " " "monochrome" "gray" "color")
- ("FONTNAME" 'list " " gnuplot-gui-fontname-list)
- ("FONTSIZE" 'fontsize " ")))
- (cons "cgm"
- '(("MODE" 'list " " "landscape" "portrait" "default")
- ("COLOR" 'list " " "color" "monochrome")
- ("ROTATION" 'list " " "rotate" "norotate")
- ("WIDTH" 'number " " "width")
- ("LINEWIDTH" 'number " " "linewidth")
- ("FONTNAME" 'list " " "\"Arial\"" "\"Arial Italic\""
- "\"Arial Bold\"" "\"Arial Bold Italic\""
- "\"Times Roman\"" "\"Times Roman Italic\""
- "\"Times Roman Bold\"" "\"Times Roman Bold Italic\""
- "\"Helvetica\"" "\"Roman\"")
- ("FONTSIZE" 'fontsize " ")))
- (cons "corel"
- '(("COLOR" 'list " " "default" "color" "monochrome")
- ("FONTNAME" 'list " " "\"SwitzerlandLight\""
- "\"Helvetica\"" "\"Times-Roman\"")
- ("FONTSIZE " 'number " ")
- ("X-SIZE " 'number " ")
- ("Y-SIZE " 'number " ")
- ("LINEWIDTH" 'number " ")))
- (cons "dumb"
- '(("LINEFEED" 'list " " "feed" "nofeed")
- ("X-SIZE" 'number " ")
- ("Y-SIZE" 'number " ")))
- (cons "emf"
- '(("COLOR" 'list " " "color" "monochrome")
- ("LINE" 'list " " "solid" "dashed")
- ("FONTNAME" 'string " ")
- ("FONTSIZE" 'number " ")))
- (cons "emtex"
- '(("FONTNAME" 'list " " "courier" "roman")
- ("FONTSIZE" 'fontsize " ")))
- (cons "fig"
- '(("COLOR" 'list " " "color" "monochrome")
- ("FRAMESIZE" 'list " " "small" "big")
- ("POINTSMAX" 'number " " "pointsmax")
- ("ORIENTATION" 'list " " "landscape" "portrait")
- ("UNITS" 'list " " "metric" "inches")
- ("FONT SIZE" 'number " " "fontsize")
- ("SIZE" 'pair (" " . " ") "size")
- ("LINE THICKNESS" 'number " " "thickness")
- ("LAYER DEPTH" 'number " " "depth")))
- (cons "hp500c"
- '(("RESOLUTION" 'list " " "75" "100" "150" "300")
- ("COMPRESSION" 'list " " "rle" "tiff")))
- (cons "hpgl"
- '(("PENS" 'number " ")
- ("EJECT" 'list " " "eject")))
- (cons "hpdj"
- '(("RESOLUTION" 'list " " "75" "100" "150" "300")))
- (cons "hpljii"
- '(("RESOLUTION" 'list " " "75" "100" "150" "300")))
- (cons "hppj"
- '(("FONT" 'list " " "FNT9X17" "FNT5X9" "FNT13X25")))
- (cons "imagen"
- '(("FONT SIZE" 'number " ")
- ("LAYOUT" 'list " " "portrait" "landscape")
- ("NUMBER OF GRAPHS" 'range (" " . " ") ",")))
- (cons "gpic"
- '(("X ORIGIN" 'number " ")
- ("Y ORIGIN" 'number " " ",")))
- (cons "latex"
- '(("FONTNAME" 'list " " "courier" "roman")
- ("FONTSIZE" 'fontsize " ")))
- (cons "mif"
- '(("COLOUR" 'list " " "colour" "monochrome")
- ("LINETYPE" 'list " " "polyline" "vectors")))
- (cons "nec-cp6"
- '(("MODE" 'list " " "monochrome" "colour" "draft")))
- (cons "pbm"
- '(("SIZE" 'list " " "small" "medium" "large")
- ("COLOR" 'list " " "monochrome" "gray" "color")))
- (cons "pcl5L"
- '(("MODE" 'list " " "landscape" "portrait")
- ("FONTNAME" 'list " " "stick" "univers" "cg_times")
- ("FONTSIZE" 'fontsize " ")))
- (cons "png"
- '(("SIZE" 'list " " "small" "medium" "large")
- ("COLOR" 'list " " "monochrome" "gray" "color")))
- (cons "postscript"
- '(("MODE" 'list " " "landscape" "portrait" "eps" "default")
- ("ENHANCED" 'list " " "enhanced" "noenhanced")
- ("COLOR" 'list " " "color" "monochrome")
- ("SOLID" 'list " " "solid" "dashed")
- ("DUPLEXING" 'list " " "defaultplex" "simplex" "duplex")
- ("FONTNAME" 'list " " gnuplot-gui-fontname-list)
- ("FONTSIZE" 'fontsize " ")))
- (cons "pslatex"
- '(("COLOR" 'list " " "monochrome" "color")
- ("DASHED" 'list " " "dashed")
- ("ROTATION" 'list " " "rotate" "norotate")
- ("AUXFILE" 'list " " "auxfile")))
- (cons "pstex"
- '(("COLOR" 'list " " "monochrome" "color")
- ("DASHED" 'list " " "dashed")
- ("ROTATION" 'list " " "rotate" "norotate")
- ("AUXFILE" 'list " " "auxfile")))
- (cons "pstricks"
- '(("HACK TEXT" 'list " " "hacktext" "nohacktext")
- ("PLOT SCALING" 'list " " "nounit" "unit")))
- (cons "regis"
- '(("COLOR DEPTH" 'list "4" "16")))
- (cons "tgif"
- '(("LAYOUT" 'list " " "portrait" "landscape")
- ("NUMBER OF GRAPHS" 'range (" " . " ") ",")
- ("LINE TYPE" 'list " " "solid" "dashed")
- ("FONTNAME" 'list " " gnuplot-gui-fontname-list)
- ("FONTSIZE" 'fontsize " ")))
- (cons "tpic"
- '(("POINTSIZE" 'number " ")
- ("LINEWIDTH" 'number " ")
- ("INTERVAL " 'number " ")))
- (cons "vgagl" ; for pm3d patch (also persist, raise in x11) <MT>
- '(("BACKGROUND" 'position " " "background" 3)
- ("INTERPOLATION" 'list " " "uniform" "interpolate")
- ("DUMP" 'file " ")
- ("MODE" 'string " " "")))
- (cons "x11"
- '(("RESET" 'list " " "reset")
- ("TERMINAL NUMBER" 'number " ")
- ("PERSIST" 'list " " "persist" "nopersist")
- ("RAISE" 'list " " "raise" "noraise"))) ))
-
-(defvar gnuplot-gui-terminal-list nil)
-(setq gnuplot-gui-terminal-list
- (append (list " ") (mapcar 'car gnuplot-gui-terminal-types)))
-
-(defvar gnuplot-gui-set-types nil
- "Associated list of set option descriptions.
-See the doc-string for `gnuplot-gui-all-types'.")
-(setq gnuplot-gui-set-types
- (list (cons "angles"
- '(("UNITS" 'list " " "degrees" "radians")))
- (cons "arrow"
- '(("TAG" 'tag " ")
- ("FROM" 'position " " "from" 3)
- ("TO" 'position " " "to" 3)
- ("HEAD" 'list " " "head" "nohead")
- ("LINESTYLE" 'number " " "ls")
- ("LINETYPE " 'number " " "lt")
- ("LINEWIDTH" 'number " " "lw")))
- (cons "noarrow"
- '(("TAG" 'tag " ")))
- (cons "autoscale"
- '(("AXIS" 'list " " "x" "y" "z" "x2" "y2" "xy"
- "xmin" "ymin" "zmin" "x2min" "y2min" "xymin"
- "xmax" "ymax" "zmax" "x2max" "y2max" "xymax")))
- (cons "noautoscale"
- '(("AXIS" 'list " " "x" "y" "z" "x2" "y2" "xy"
- "xmin" "ymin" "zmin" "x2min" "y2min" "xymin"
- "xmax" "ymax" "zmax" "x2max" "y2max" "xymax")))
- (cons "bar"
- '(("SIZE" 'list " " "small" "large")))
- (cons "border"
- '(("BORDER CODE" 'number " ")
- ("LINE STYLE" 'list " " "lines"
- "dots" "points" "linespoints")
- ("LINESTYLE" 'number " " "ls")
- ("LINETYPE" 'number " " "lt")
- ("LINEWIDTH" 'number " " "lw")))
- (cons "boxwidth"
- '(("WIDTH" 'number " ")))
- (cons "clabel"
- '(("FORMAT" 'format " ")))
- (cons "clip"
- '(("CLIP TYPE" 'list " " "points" "one" "two")))
- (cons "noclip"
- '(("CLIP TYPE" 'list " " "points" "one" "two")))
- ;;(cons "cntrparam"
- ;; '(("INTERPOLATION" 'list " " "linear" "cubicspline" "bspline")
- ;; ("POINTS" 'number " " "points")
- ;; ("ORDER" 'number " " "order")))
- (cons "contour"
- '(("WHERE" 'list " " "base" "surface" "both")))
- (cons "dgrid3d"
- '(("ROW,COLUMN,NORM" 'position " " "" 3)))
- (cons "encoding"
- '(("ENCODING" 'list " " "default" "iso_8859_1"
- "cp850" "cp437")))
- (cons "format"
- '(("AXIS" 'list " " "x" "y" "z" "xy" "x2" "y2")
- ("FORMAT" 'format " ")))
- (cons "dummy"
- '(("VAR 1" 'string " " "")
- ("VAR 2" 'string " " ",")))
- (cons "grid"
- '(("XTICS" 'list " " "xtics" "mxtics" "noxtics" "nomxtics")
- ("YTICS" 'list " " "ytics" "mytics" "noytics" "nomytics")
- ("ZTICS" 'list " " "ztics" "mztics" "noztics" "nomztics")
- ("X2TICS" 'list " " "x2tics" "mx2tics" "nox2tics" "nomx2tics")
- ("Y2TICS" 'list " " "y2tics" "my2tics" "noy2tics" "nomy2tics")
- ("POLAR" 'number " " "polar")
- ("MAJOR LINETYPE" 'number " ")
- ("MINOR LINETYPE" 'number " ")))
- (cons "hidden3d"
- '(("ALGORITHM" 'list " " "defaults"
- "offset"
- "nooffset"
- ;;"trianglepattern # bitpattern between 0 and 7"
- "trianglepattern 0" "trianglepattern 1"
- "trianglepattern 2" "trianglepattern 3"
- "trianglepattern 4" "trianglepattern 5"
- "trianglepattern 6" "trianglepattern 7"
- ;;"undefined # level between 0 and 3"
- "undefined 0" "undefined 1" "undefined 2" "undefined 3"
- "noundefined" "altdiagonal" "noaltdiagonal"
- "bentover" "nobentover")))
- (cons "historysize"
- '(("SIZE" 'number " ")))
- (cons "isosamples"
- '(("ISO_U LINES" 'number " ")
- ("ISO_V LINES" 'number " " ",")))
- (cons "key"
- '(("LOCATION" 'list " " "left" "right" "top" "bottom"
- "outside" "below")
- ("POSITION" 'position " " "" 3)
- ("JUSTIFICATION" 'list " " "Left" "Right")
- ("REVERSE" 'list " " "reverse" "noreverse")
- ("SAMPLE LENGTH" 'number " " "samplen")
- ("SPACING" 'number " " "spacing")
- ("WIDTH" 'number " " "width")
- ("TITLE" 'string " " "title ")
- ("BOX LINETYPE" 'number " " "box") ;; linetype data
- ("NOBOX" 'list " " "nobox")))
- (cons "label"
- '(("TAG" 'tag " ")
- ("LABEL TEXT" 'string " ")
- ("POSITION" 'position " " "at" 3)
- ;; first, second, graph, screen
- ("JUSTIFICATION" 'list " " "left" "right" "center")
- ("ROTATE" 'list " " "rotate" "norotate")
- ("FONT" 'string " " "font"))) ;; font "name,size"
- (cons "nolabel"
- '(("TAG" 'tag " ")))
- (cons "linestyle"
- '(("TAG " 'tag " ")
- ("LINE STYLE" 'list " " "boxerrorbars" "boxes"
- "boxxyerrorbars" "candlesticks" "dots"
- "financebars" "fsteps" "histeps" "impulses"
- "lines" "linespoints" "points" "steps" "vector"
- "xerrorbars" "xyerrorbars" "yerrorbars")
- ("LINETYPE " 'number " " "lt")
- ("LINEWIDTH" 'number " " "lw")
- ("POINTTYPE" 'number " " "pt")
- ("POINTSIZE" 'number " " "ps")))
- (cons "locale"
- '(("LOCALE" 'string " ")))
- (cons "logscale"
- '(("AXIS" 'list " " "x" "y" "z" "xy" "xz" "yz" "xyz"
- "x2" "y2")
- ("BASE" 'number " ")))
- (cons "nologscale"
- '(("AXIS" 'list " " "x" "y" "z" "xy" "xz" "yz" "xyz"
- "x2" "y2")))
- (cons "mapping"
- '(("COORDINATE SYSTEM" 'list " " "cartesian" "spherical"
- "cylindrical")))
- ; _margin
- (cons "bmargin"
- '(("BOTTOM MARGIN" 'number " ")))
- (cons "lmargin"
- '(("LEFT MARGIN" 'number " ")))
- (cons "rmargin"
- '(("RIGHT MARGIN" 'number " ")))
- (cons "tmargin"
- '(("TOP MARGIN" 'number " ")))
-
- (cons "missing"
- '(("CHARACTER" 'string " " 1)))
- ; m_tics
- (cons "mxtics" gnuplot-gui-mtics-list)
- (cons "mytics" gnuplot-gui-mtics-list)
- (cons "mztics" gnuplot-gui-mtics-list)
- (cons "mx2tics" gnuplot-gui-mtics-list)
- (cons "my2tics" gnuplot-gui-mtics-list)
-
- ; pm3d additions <MT>
- (cons "mouse"
- '(("DOUBLECLICK" 'number " " "doubleclick")
- ("ZOOM" 'list " " "zoomcoordinates" "nozoomcoordinates")
- ("POLAR" 'list " " "polarcoordinates" "nopolarcoordinates")
- ("FORMAT" 'string " " "format")
- ("CLIPBOARDFORMAT" 'string " " "clipboardformat")
- ("MOUSEFORMAT" 'string " " "mouseformat")
- ("LABELS" 'list " " "labels" "nolabels")
- ("LABELOPTIONS" 'string " " "labeloptions")
- ("ZOOMJUMP" 'list " " "zoomjump" "nozoomjump")
- ("VERBOSE" 'list " " "verbose" "noverbose")))
- (cons "palette"
- '(("COLOR" 'list " " "gray" "color")
- ("RGBFORMULAE" 'position " " "rgbformulae" 3)
- ("PARITY" 'list " " "positive" "negative")
- ("FORMULAE" 'list " " "nops_allcF" "ps_allcF")
- ("MAXCOLORS" 'number " ")
- ("COLOR_BOX" 'list " " "nocb" "cbdefault" "cbuser")
- ("ORIENTATION" 'list " " "cbvertical" "cbhorizontal")
- ("ORIGIN" 'position " " "origin" 2)
- ("SIZE" 'position " " "size" 2)
- ("BORDER" 'number " ")
- ("NOBORDER" 'list " " "bdefault" "noborder")))
- (cons "pm3d"
- '(("AT" 'list* " " "b" "s" "t" "bs" "bt" "st" "bst")
- ("SCANS" 'list " " "scansautomatic" "scansforward" "scansbackward")
- ("FLUSH" 'list* " " "begin" "center" "end")
- ("CLIP" 'list " " "clip1in" "clip4in")
- ("ZRANGE" 'range (" " . " ") ":")
- ("HIDDEN3D" 'number " ")
- ("NOHIDDEN3D" 'list " " "nohidden3d")
- ("FILLING" 'list " " "transparent" "solid")
- ("MAP" 'list " " "map")))
-
- (cons "offsets"
- '(("LEFT " 'number " ")
- ("RIGHT " 'number " " ",")
- ("TOP " 'number " " ",")
- ("BOTTOM" 'number " " ",")))
- (cons "origin"
- '(("X ORIGIN" 'number " ")
- ("Y ORIGIN" 'number " " ",")))
- (cons "output"
- '(("FILENAME" 'file " ")))
- (cons "pointsize"
- '(("MULTIPLIER" 'number " ")))
- (cons "samples"
- '(("2D PLOT" 'number " ")
- ("3D PLOT" 'number " " ",")))
- (cons "size"
- '(("ASPECT" 'list " " "square" "nosquare"
- "ratio" "noratio")
- ("X-SCALE OR RATIO" 'number " ")
- ("Y-SCALE" 'number " " ",")))
- (cons "style"
- '(("DATA TYPE" 'list " " "data" "function")
- ("PLOT STYLE" 'list " " "boxerrorbars" "boxes"
- "boxxyerrorbars" "candlesticks" "dots"
- "financebars" "fsteps" "histeps" "impulses"
- "lines" "linespoints" "points" "steps" "vector"
- "xerrorbars" "xyerrorbars" "yerrorbars")))
- (cons "terminal"
- '(("TERMINAL TYPE" 'list " " gnuplot-gui-terminal-list)))
- (cons "tics"
- '(("DIRECTION" 'list " " "in" "out")))
- (cons "ticslevel"
- '(("RELATIVE HEIGHT" 'number " ")))
- (cons "ticscale"
- '(("MAJOR" 'number " ")
- ("MINOR" 'number " ")))
- (cons "timestamp"
- '(("FORMAT STRING" 'format " ")
- ("WHERE" 'list " " "top" "bottom")
- ("ROTATE" 'list " " "rotate" "norotate")
- ("X-OFFSET" 'number " ")
- ("Y-OFFSET" 'number " " ",")
- ("FONTNAME" 'list " " gnuplot-gui-fontname-list)))
- (cons "timefmt"
- '(("FORMAT STRING" 'string " ")))
- (cons "title"
- '(("TITLE" 'string " ")))
- (cons "view"
- '(("X-ROTATION" 'number " ")
- ("Z-ROTATION" 'number " " ",")
- ("SCALE" 'number " " ",")
- ("Z-SCALE" 'number " " ",")))
- ;; ("SCALE" 'position " " "," 4)
- ; _data
- (cons "xdata" gnuplot-gui-data-list)
- (cons "ydata" gnuplot-gui-data-list)
- (cons "zdata" gnuplot-gui-data-list)
- (cons "x2data" gnuplot-gui-data-list)
- (cons "y2data" gnuplot-gui-data-list)
- ; _label
- (cons "xlabel" gnuplot-gui-label-list)
- (cons "ylabel" gnuplot-gui-label-list)
- (cons "zlabel" gnuplot-gui-label-list)
- (cons "x2label" gnuplot-gui-label-list)
- (cons "y2label" gnuplot-gui-label-list)
- ; _range, note that the [] syntax for
- ; the writeback argument is
- ; not properly supported
- (cons "xrange" gnuplot-gui-range-list)
- (cons "yrange" gnuplot-gui-range-list)
- (cons "zrange" gnuplot-gui-range-list)
- (cons "x2range" gnuplot-gui-range-list)
- (cons "y2range" gnuplot-gui-range-list)
- (cons "trange" gnuplot-gui-range-list)
- (cons "rrange" gnuplot-gui-range-list)
- (cons "urange" gnuplot-gui-range-list)
- (cons "vrange" gnuplot-gui-range-list)
- ; _tics
- (cons "xtics" gnuplot-gui-tics-list)
- (cons "ytics" gnuplot-gui-tics-list)
- (cons "ztics" gnuplot-gui-tics-list)
- (cons "x2tics" gnuplot-gui-tics-list)
- (cons "y2tics" gnuplot-gui-tics-list)
- ; zeroaxis
- (cons "zeroaxis" gnuplot-gui-zeroaxis-list)
- (cons "xzeroaxis" gnuplot-gui-zeroaxis-list)
- (cons "yzeroaxis" gnuplot-gui-zeroaxis-list)
- (cons "y2zeroaxis" gnuplot-gui-zeroaxis-list)
- (cons "x2zeroaxis" gnuplot-gui-zeroaxis-list)
-
- (cons "zero"
- '(("THRESHOLD" 'number " ")))))
-
-(defvar gnuplot-gui-command-types nil
- "Associated list of command descriptions.
-See the doc-string for `gnuplot-gui-all-types'.")
-(setq gnuplot-gui-command-types
- (list (cons "cd"
- '(("FILENAME" 'file " ")))
- (cons "call"
- '(("INPUT FILE" 'file " ")
- ("PARAMETER LIST" 'string " ")))
- (cons "load"
- '(("INPUT FILE" 'file " ")))
- (cons "pause"
- '(("TIME" 'number " ")
- ("MESSAGE" 'string " ")))
- (cons "print"
- '(("EXPRESSION" 'string " ")))
- (cons "save"
- '(("SAVE" 'list " " "functions" "variables" "set")
- ("FILE" 'file " ")))
- (cons "update"
- '(("INITIAL FILE" 'file " " t)
- ("UPDATED FILE" 'file " " t))) ))
-
-
-(defcustom gnuplot-gui-plot-splot-fit-style 'simple
- "Control the complexity of the GUI display for plot, splot, and fit.
-The values are 'simple, which causes a limited set of plot, splot, or
-fit options to be displayed, and 'complete, which attempts to display
-all options. The 'complete setting is prone to making errors when
-parsing values already in the script buffer."
- :group 'gnuplot-gui
- :type '(radio (const :tag "Simple listing" simple)
- (const :tag "Complete listing" complete)))
-
-
-(defconst gnuplot-gui-plot-simple-list
- '(("X RANGE" 'range (" " . " ") ":")
- ("Y RANGE" 'range (" " . " ") ":")
- ("DATA FILE" 'file " ")
- ("THRU" 'string* " " "thru")
- ("USING" 'modifier " ")
- ("TITLE" 'string " ")
- ("WITH" 'list* " " "boxerrorbars" "boxes"
- "boxxyerrorbars" "candlesticks" "dots" "financebars"
- "fsteps" "histeps" "impulses" "lines" "linespoints"
- "points" "steps" "vector" "xerrorbars" "xyerrorbars"
- "yerrorbars")))
-(defconst gnuplot-gui-plot-full-list
- '(;;("T RANGE" 'range (" " . " ") ":")
- ("X RANGE" 'range (" " . " ") ":")
- ("Y RANGE" 'range (" " . " ") ":")
- ("xa" 'text "\t---------------------")
- ("FUNCTION" 'string " ")
- ("xc" 'text " or")
- ("DATA FILE" 'file " ")
- ("INDEX" 'modifier " ")
- ("EVERY" 'modifier " ")
- ("THRU" 'string* " " "thru")
- ("USING" 'modifier " ")
- ("SMOOTH" 'list* " " "unique" "csplines" "acsplines"
- "bezier" "sbezier")
- ;; datafile modifiers
- ("AXES" 'list* " " "x1y1" "x2y2" "x1y2" "x2y1")
- ("TITLE" 'string " ")
- ("NOTITLE" 'list " " "notitle")
- ("xf" 'text "\t---------------------")
- ("xi" 'text "Select a standard plotting style")
- ("WITH" 'list* " " "boxerrorbars" "boxes"
- "boxxyerrorbars" "candlesticks" "dots" "financebars"
- "fsteps" "histeps" "impulses" "lines" "linespoints"
- "points" "steps" "vector" "xerrorbars" "xyerrorbars"
- "yerrorbars")
- ("xo" 'text " or a previously defined style")
- ("LINE STYLE " 'number " " "ls")
- ("xr" 'text " or specify a style in-line")
- ("LINE TYPE " 'number " " "lt")
- ("LINE WIDTH " 'number " " "lw")
- ("POINT TYPE " 'number " " "pt")
- ("POINT STYLE" 'number " " "ps")))
-(defconst gnuplot-gui-splot-simple-list
- '(("DATA FILE" 'file " ")
- ("TITLE" 'string " ")
- ("WITH" 'list* " " "lines" "linespoints" "points" "dots" "impulses")))
-(defconst gnuplot-gui-splot-full-list
- '(;;("U RANGE" 'range (" " . " ") ":")
- ;;("V RANGE" 'range (" " . " ") ":")
- ("X RANGE" 'range (" " . " ") ":")
- ("Y RANGE" 'range (" " . " ") ":")
- ("Z RANGE" 'range (" " . " ") ":")
- ("xa" 'text "\t---------------------")
- ("FUNCTION" 'string " ")
- ("xc" 'text " or")
- ("DATA FILE" 'file " ")
- ("INDEX" 'modifier " ")
- ("EVERY" 'modifier " ")
- ("THRU" 'string* " " "thru")
- ("USING" 'modifier " ")
- ("SMOOTH" 'list* " " "unique" "csplines" "acsplines"
- "bezier" "sbezier")
- ("TITLE" 'string " ")
- ("NOTITLE" 'list " " "notitle")
- ("WITH" 'list* " " "lines" "linespoints" "points" "dots" "impulses")))
-(defconst gnuplot-gui-fit-simple-list
- '(("FUNCTION" 'string* " " "")
- ("DATA FILE" 'file " ")
- ("VIA (params)" 'string* " " "via") ))
-(defconst gnuplot-gui-fit-full-list
- '(("X RANGE" 'range (" " . " ") ":")
- ("Y RANGE" 'range (" " . " ") ":")
- ("xa" 'text "----- fitting functionn and file --------")
- ("FUNCTION" 'string* " " "")
- ("DATA FILE" 'file " ")
- ("xb" 'text "----- datafile modifiers ----------------")
- ("INDEX" 'modifier " ")
- ("EVERY" 'modifier " ")
- ("THRU" 'string* " " "thru")
- ("USING" 'modifier " ")
- ("SMOOTH" 'list* " " "unique" "csplines" "acsplines"
- "bezier" "sbezier")
- ("xc" 'text "----- parameters (file or parameters) ---")
- ("VIA (file)" 'string " " "via")
- ("VIA (params)" 'string* " " "via") ))
-
-(defvar gnuplot-gui-plot-splot-fit nil
- "Associated list of plot, splot, and fit descriptions.
-See the doc-string for `gnuplot-gui-all-types'.")
-(setq gnuplot-gui-plot-splot-fit
- (list (cons "plot" (if (equal gnuplot-gui-plot-splot-fit-style 'complete)
- gnuplot-gui-plot-full-list
- gnuplot-gui-plot-simple-list))
- (cons "splot" (if (equal gnuplot-gui-plot-splot-fit-style 'complete)
- gnuplot-gui-splot-full-list
- gnuplot-gui-splot-simple-list))
- (cons "fit" (if (equal gnuplot-gui-plot-splot-fit-style 'complete)
- gnuplot-gui-fit-full-list
- gnuplot-gui-fit-simple-list))) )
-
-
-(defvar gnuplot-gui-test-type nil)
-(setq gnuplot-gui-test-type
- (list (cons "test"
- '(("TAG" 'tag " ")
- ("LIST" 'list " " "1" "2" "3")
- ("LIST*" 'list* " " "1" "2" "3")
- ("NUMBER" 'number " " "number")
- ("RANGE" 'range (" " . " ") ":")
- ("PAIR" 'pair (" " . " ") "pair")
- ("LABELS" 'labels ())
- ("FILE" 'file " ")
- ("TEXT" 'text "this is text")
- ("STRING" 'string " ")
- ("STRING*" 'string* " " "string*")
- ("FORMAT" 'format " ")
- ("POSITION" 'position " " "at" 3)
- ("FONTSIZE" 'fontsize " ") ))))
-
-(defvar gnuplot-gui-all-types nil
- "Associated list of terminal, set option, and command arguments.
-
-Each entry in the list is a cons cell of the form
- (OPTION . ALIST)
-where OPTION is one of the recognized options in Gnuplot, either a
-command, something that is set, or a terminal type. Only those
-commands, set options, and terminal types that actually take arguments
-are in this associated list.
-
-ALIST is itself an associated list where each entry is of the form:
-
- (TAG TYPE DEFAULT REST)
-
-TAG is the name used on the widget and indicates one of the options
-for this command, set option, or terminal type.
-
-TYPE is one of
- 'list a menu-list of strings
- 'list* a menu-list of strings with a prefix
- 'number a number with an optional prefix
- 'tag like number but must be the first argument
- 'fontsize like number but must be the last argument
- 'range a pair of numbers like [#,#] or [#:#]
- 'pair a pair of numbers with no punctuation and a prefix
- 'file a quoted string and a file browser
- 'string a quoted string with an optional prefix
- 'string* an unquoted string with a prefix
- 'format a quoted string and an info-link to (gnuplot)format
- 'labels an array as needed for xtics, ytics, etc
- 'position 2 or 3 comma separated numbers with an optional prefix
-
-DEFAULT is the default value for this option. Note that the default
-for 'range and 'pair is a cons cell and the default for 'labels is a
-list. For most things, the best choice of DEFAULT is a string of
-white space or a cons cell of two strings of white space. Strings of
-white space are better defaults than empty strings or nil.
-
-The value of REST depends upon TYPE:
-
- For 'list & REST is the list of options that will go into the
- 'list* menu-button. This can also be a symbol which
- evaluates to a list containing the options to go into
- the menu-button. This list variable must contain the
- DEFAULT.
- For 'number REST is the prefix string (if it exists) for that number.
- For 'range REST is the separator, \":\" for plot ranges and
- \",\" for plot dimensions (see for example the tgif
- terminal type)
- For 'string & REST may a number denoting the width of the editable-text
- 'string* field or it may be a string denoting a prefix. By
- default, the width is half the width of the frame
- and there is no prefix. It may be useful to
- specify \"1\" when the input is a single character
- as in 'set missing'.
- For 'file REST determines the label placed before the file insertion
- field. If non-nil, then TAG is used. If nil, then
- the default \"File\" is used.
- For 'position REST is the prefix and the number of comma separated numbers
- For others REST is not used.
-
-Here is an example entry for the png terminal type:
-
- (cons \"png\"
- '((\"SIZE\" 'list \" \" \"small\" \"medium\" \"large\")
- (\"COLOR\" 'list \" \" \"monochrome\" \"gray\" \"color\")))
-
-This alist is formed at load time by appending together
-`gnuplot-gui-terminal-types', `gnuplot-gui-set-types' and
-`gnuplot-gui-command-types'.")
-
-(setq gnuplot-gui-all-types (append gnuplot-gui-terminal-types
- gnuplot-gui-set-types
- gnuplot-gui-command-types
- gnuplot-gui-plot-splot-fit
- gnuplot-gui-test-type))
-
-
-(defun gnuplot-gui-swap-simple-complete ()
- (interactive)
- (setq gnuplot-gui-plot-splot-fit-style
- (if (equal gnuplot-gui-plot-splot-fit-style 'complete)
- 'simple 'complete))
- (if (equal gnuplot-gui-plot-splot-fit-style 'complete)
- (progn
- (setcdr (assoc "plot" gnuplot-gui-all-types) gnuplot-gui-plot-full-list)
- (setcdr (assoc "splot" gnuplot-gui-all-types) gnuplot-gui-splot-full-list)
- (setcdr (assoc "fit" gnuplot-gui-all-types) gnuplot-gui-fit-full-list))
- (setcdr (assoc "plot" gnuplot-gui-all-types) gnuplot-gui-plot-simple-list)
- (setcdr (assoc "splot" gnuplot-gui-all-types) gnuplot-gui-splot-simple-list)
- (setcdr (assoc "fit" gnuplot-gui-all-types) gnuplot-gui-fit-simple-list))
- (message "Using %s lists for plot, splot, and fit."
- gnuplot-gui-plot-splot-fit-style) )
-
-
-
-
-;;; user interface to the widget-y stuff
-
-(defun gnuplot-gui-mouse-set (event)
- "Use the mouse to begin setting options using a GUI interface.
-EVENT is a mouse event. Bound to \\[gnuplot-gui-mouse-set]
-Note that \"plot\", \"splot\", \"fit\", and \"cntrparam\" are not
-currently supported."
- (interactive "@e")
- (when (fboundp 'widget-create)
- (save-excursion
- (mouse-set-point event)
- (gnuplot-gui-set-options-and-insert))))
-
-(defun gnuplot-gui-get-frame-param (param)
- (if gnuplot-xemacs-p
- (plist-get gnuplot-gui-frame-plist param)
- (cdr (assoc param gnuplot-gui-frame-parameters))))
-(defun gnuplot-gui-set-frame-param (param value)
- (if gnuplot-xemacs-p
- (plist-put gnuplot-gui-frame-plist param value)
- (setcdr (assoc param gnuplot-gui-frame-parameters) value)))
-
-(defun gnuplot-gui-set-options-and-insert ()
- "Insert arguments using a GUI interface.
-Determine contents of current line and set up the appropriate GUI
-frame. Bound to \\[gnuplot-gui-set-options-and-insert]
-Note that \"cntrparam\" is not currently supported."
- (interactive)
- (when (fboundp 'widget-create)
- (let ((begin (gnuplot-point-at-beginning-of-command))
- (end (save-excursion (end-of-line) (point-marker)))
- (termin (concat "\\(,\\s-*" (regexp-quote "\\") "\\|;\\)"))
- (set nil) (term nil))
- (save-excursion
- ;; there can be more then one command per line
- (if (re-search-forward termin end "to_limit")
- (progn (backward-char (length (match-string 1)))
- (setq end (point-marker))))
- (goto-char begin)
- (skip-syntax-forward "-" end)
- ;; various constructions are recognized here. at the end of this
- ;; cond, point should be just after the word whose arguments are
- ;; to be set
- (cond ((looking-at "set\\s-+")
- (setq set t)
- (goto-char (match-end 0))
- (if (looking-at "\\sw+") (goto-char (match-end 0)))
- (when (string-match "^ter" (gnuplot-this-word)) ; terminal?
- (setq term t)
- (forward-word 1))
- (when (string-match "^\\(da\\|fu\\)" (gnuplot-this-word))
- (unless (looking-at "\\s-+st")
- (insert " style") (forward-word 1))
- (forward-word 1)))
- ((looking-at (concat "\\(cd\\|ca\\|lo\\|pa\\|pr\\|sa\\|u\\)"
- "\\w*"
- "[\\s-\\']"))
- (forward-word 1))
- ;;(goto-char (match-end 0)))
- (t
- (forward-word 1)))
- (if (> (point) end) (goto-char end))
- (let* ((w (gnuplot-this-word))
- (wd (try-completion w gnuplot-gui-all-types))
- (word "") wrd list)
- (cond ((equal wd t) (setq word w))
- ((equal wd nil) (setq word w))
- ((assoc wd gnuplot-gui-all-types) (setq word wd))
- (t (setq wd nil)))
- (cond ((equal (string-match "^\\s-*$" w) 0)
- (message "Blank line"))
- ((and wd (stringp word))
- (gnuplot-gui-correct-command word set term begin)
- (setq gnuplot-gui-alist nil
- gnuplot-gui-current-string
- (buffer-substring-no-properties (point) end))
- (gnuplot-gui-set-alist word gnuplot-gui-current-string)
- (let* ((old-height (gnuplot-gui-get-frame-param 'height))
- (old-top (gnuplot-gui-get-frame-param 'top)))
- (when (or
- (and (equal gnuplot-gui-plot-splot-fit-style 'complete)
- (member* word '("plot" "splot" "fit")
- :test 'string=))
- (equal word "test"))
- (gnuplot-gui-set-frame-param 'height 32)
- (gnuplot-gui-set-frame-param 'top 50))
- (gnuplot-gui-prompt-for-frame word)
- (when (or
- (and (equal gnuplot-gui-plot-splot-fit-style 'complete)
- (member* word '("plot" "splot" "fit")
- :test 'string=))
- (equal word "test"))
- (gnuplot-gui-set-frame-param 'height old-height)
- (gnuplot-gui-set-frame-param 'top old-top)) ))
- ((setq wrd (car (all-completions w '(("cntrparam")))))
- (message
- "Setting arguments for %S is currently unsuported in gnuplot-mode"
- wrd))
- ((setq list (all-completions w gnuplot-gui-all-types))
- (message "%S could be one of %S" w list))
- (t
- (message
- "%S is not a gnuplot command which takes options" w)))) ))))
-
-(defun gnuplot-gui-toggle-popup ()
- (interactive)
- (setq gnuplot-gui-popup-flag (not gnuplot-gui-popup-flag))
- (message (if gnuplot-gui-popup-flag
- "Argument popup will appear after insertions."
- "Argument popup will no longer appear after insertions.")))
-
-
-(defun gnuplot-gui-y-n (foo))
-(if gnuplot-xemacs-p
- (defalias 'gnuplot-gui-y-n 'y-or-n-p-maybe-dialog-box)
- (defalias 'gnuplot-gui-y-n 'y-or-n-p))
-
-(defun gnuplot-gui-correct-command (word set term begin)
- "Check syntax of set command and terminal specifications.
-WORD is the item being set. SET and TERM are non-nil if the words
-\"set\" and \"terminal\" were found preceding WORD in the buffer.
-BEGIN is the beginning of the command."
- (save-excursion
- (cond ((assoc word gnuplot-gui-terminal-types)
- (when (and (not (and set term))
- (gnuplot-gui-y-n
- (format
- "%S must be preceded by \"set terminal\". Add it? "
- word)))
- (backward-word 1)
- (let ((e (point-marker)))
- (goto-char begin)
- (skip-syntax-forward "-" e)
- (delete-region (point) e)
- (insert "set terminal "))))
- ((assoc word gnuplot-gui-set-types)
- (when (and (not set)
- (gnuplot-gui-y-n
- (format
- "%S must be preceded by \"set\". Add \"set\"? " word)))
- (backward-word 1)
- (let ((e (point-marker)))
- (goto-char begin)
- (skip-syntax-forward "-" e)
- (delete-region (point) e)
- (insert "set "))))))
- (message nil))
-
-
-
-;;; handle the actual arguments
-
-(defun gnuplot-gui-fix-arg-list (list)
- "Correct the result of splitting `gnuplot-gui-current-string'.
-LIST is the split string. This removes empty and all-blank strings
-from the list and concatenates the strings that are part of a quoted
-argument, for example an axis label or a font name. It also replaces
-bounding single quotes with double quotes, since double quotes are
-used in `gnuplot-gui-all-types'."
- (let (fixed-list quote quoted) ; remove blanks
- (setq list (remove* "\\s-+" list :test 'string-match)
- list (remove* "" list :test 'string=))
- (while list ; concatinate parts of quoted string
- (if (not (string-match "^\\([\]\[()'\"]\\)" (car list)))
- (setq fixed-list (append fixed-list (list (car list))))
- (setq quote (match-string 1 (car list))
- quoted (car list))
- (if (string= quote "[") (setq quote "]"))
- (if (string= quote "(") (setq quote ")"))
- (while (and list
- (or (equal (length quoted) 1)
- (not (string-match (concat (regexp-quote quote) "$")
- quoted))))
- (setq quoted (concat quoted " " (cadr list))
- list (cdr list)))
- (if (string= quote "'")
- (setq quoted (concat "\"" (substring quoted 1))
- quoted (concat (substring quoted 0 -1) "\"")))
- (setq fixed-list (append fixed-list (list quoted))))
- (setq list (cdr list)) )
- fixed-list))
-
-(defun gnuplot-gui-set-alist (word string)
- "Set defaults for arguments, using text from buffer if appropriate.
-WORD is the Gnuplot expression whose arguments are being set. STRING
-is text from the buffer containing the previous values for WORD's
-arguments."
- (let ((alist (cdr (assoc word gnuplot-gui-all-types)))
- (arg-list (gnuplot-gui-fix-arg-list (split-string string)) ))
- ;; arg-list contains the arguments taken from the buffer
- (setq gnuplot-gui-alist nil)
- (while alist
- (let* ((list (car alist))
- (tag (gnuplot-gui-type-tag list))
- (symbol (eval (gnuplot-gui-type-symbol list)))
- (default (gnuplot-gui-type-default list))
- (prefix (gnuplot-gui-type-prefix list))
- (values (gnuplot-gui-type-list list))
- (this-cons (cond ((stringp default) (cons tag default))
- ((consp default) ; set cons valued default w/care
- (cons tag (cons (car default) (cdr default))))
- (t (cons tag default))))
- (temp-list arg-list) )
- ;;(message "%S" temp-list) ; want to lop values off arg-list
- ; as they are found
- (if (symbolp (cadr values))
- (setq values (symbol-value (cadr values))))
- ;; check if an argument of this type is in arg-list
- ;; set the current cons cell if it is
- (while temp-list
- (cond
- ;; ---------------------------- list
- ((member* symbol '(list list*) :test 'equal)
- (let* ((case-fold-search nil)
- (match-cons (member* (concat "^" (car temp-list))
- values :test 'string-match)))
- (if (and (car match-cons) ; " " may be first elem. of list
- (not (string= " " (car match-cons))))
- (setq this-cons (cons tag (car match-cons))
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil)
- (setq temp-list (cdr temp-list)))))
- ;; ---------------------------- tag (first number in list)
- ((equal symbol 'tag)
- (if (string-match "^[-0-9.]+$" (car arg-list))
- (setq this-cons (cons tag (car arg-list))
- temp-list nil)
- (setq temp-list (cdr temp-list))) )
- ;; ---------------------------- fontsize (last number in list)
- ((equal symbol 'fontsize)
- (if (string-match "^[-0-9.]+$" (car (last arg-list)))
- (setq this-cons (cons tag (car (last arg-list)))
- temp-list nil)
- (setq temp-list (cdr temp-list))) )
- ;; ---------------------------- number with prefix
- ((equal symbol 'number)
- (cond ((and (string= prefix (car temp-list))
- (string-match "^[-0-9.]+$" (cadr temp-list)))
- (setq this-cons (cons tag (cadr temp-list))
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- arg-list (remove* (cadr temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil))
- ;; --------------------- number without prefix
- ((and (not prefix)
- (string-match "^[-0-9.]+$" (car temp-list)))
- (setq this-cons (cons tag (car temp-list))
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil))
- (t
- (setq temp-list (cdr temp-list)))))
- ;; ---------------------------- pair with prefix
- ((equal symbol 'pair)
- (if (and (string= prefix (car temp-list))
- (string-match "^[-0-9.]+$" (cadr temp-list)))
- (let ((this-car (cadr temp-list))
- (this-cdr (if (string-match "^[-0-9.]+$" (caddr temp-list))
- (caddr temp-list) "")))
- (setq this-cons (cons tag (cons this-car this-cdr))
- temp-list nil))
- (setq temp-list (cdr temp-list))))
- ;; ---------------------------- range
- ((equal symbol 'range)
- (if (string-match (concat "\\[\\s-*" ; opening bracket
- "\\([^:, \t]*\\)" ; first argument
- "\\s-*[:,]\\s-*" ; separator
- "\\([^\] \t]*\\)" ; second argument
- "\\s-*\\]") ; closing bracket
- (car temp-list))
- (setq this-cons
- (cons tag (cons (match-string 1 (car temp-list))
- (match-string 2 (car temp-list))))
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil)
- (setq temp-list (cdr temp-list)) ))
- ;; ---------------------------- labels
- ((equal symbol 'labels)
- (if (string-match (concat "(" ; opening paren
- "\\([^\)]*\\)" ; string
- ")") ; closing paren
- (car temp-list))
- (let* ((list (split-string (car temp-list) "[ \t(),]+"))
- (list (remove* "" list :test 'string=))
- (return ()))
- (while list
- (if (string-match "['\"]\\([^'\"]*\\)['\"]" (car list))
- (setq return (append return
- (list (match-string 1 (car list))))
- list (cdr list)
- return (append return (list (car list))) )
- (setq return (append return (list "" (car list)))))
- (setq list (cdr list)) )
- (setq this-cons (cons tag return)
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil))
- (setq temp-list (cdr temp-list))) )
- ;; ---------------------------- string, file, format
- ((member* symbol '(string file format) :test 'equal)
- (if (string-match (concat "['\"]" ; opening quote
- "\\([^'\"]*\\)" ; string
- "['\"]") ; closing quote
- (car temp-list))
- (setq this-cons (cons tag (match-string 0 (car temp-list)))
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil)
- (setq temp-list (cdr temp-list)) ))
- ;; ---------------------------- string*
- ((equal symbol 'string*)
- (if (string= prefix (car temp-list))
- (setq this-cons (cons tag (cadr temp-list))
- arg-list (remove* (car temp-list) arg-list
- :test 'string= :count 1)
- arg-list (remove* (cadr temp-list) arg-list
- :test 'string= :count 1)
- temp-list nil)
- (setq temp-list (cdr temp-list)) ) )
- ;; ---------------------------- other or unknown
- (t
- (setq temp-list nil))))
- (setq gnuplot-gui-alist
- (append gnuplot-gui-alist (list this-cons))))
- (setq alist (cdr alist))) ))
-
-
-(defun gnuplot-gui-post-process-alist (type)
- "A few types need some additional processing.
-'range, 'pair, and 'labels are cons or list valued and need to b made
-into strings. This is called right before inserting the arguments
-into the buffer. TYPE is the object whose arguments are being set."
- (let ((alist gnuplot-gui-alist)
- (types (cdr (assoc type gnuplot-gui-all-types))) )
- (while alist ;; loop thru alist looking for tyeps needing post-processing
- (let* ((list (assoc (caar alist) types))
- (value (cdr (assoc (caar alist) gnuplot-gui-alist)))
- (prefix (gnuplot-gui-type-prefix list))
- (symb (gnuplot-gui-type-symbol list)) )
- (cond
- ;;-------------------------- flat text
- ((equal (eval symb) 'text)
- (setcdr (assoc (caar alist) gnuplot-gui-alist) ""))
- ;;-------------------------- range [#:#] or [#,#]
- ((equal (eval symb) 'range)
- (if (and (string-match "^\\s-*$" (car value))
- (string-match "^\\s-*$" (cdr value)))
- (setcdr (assoc (caar alist) gnuplot-gui-alist) "")
- (setcdr (assoc (caar alist) gnuplot-gui-alist)
- (concat "[" (car value) prefix (cdr value) "]")) ) )
- ;;-------------------------- pair
- ((equal (eval symb) 'pair)
- (if (and (string-match "^\\s-*$" (car value))
- (string-match "^\\s-*$" (cdr value)))
- (setcdr (assoc (caar alist) gnuplot-gui-alist) "")
- (setcdr (assoc (caar alist) gnuplot-gui-alist)
- (concat prefix " " (car value) " " (cdr value) )) ) )
- ;;-------------------------- labels
- ((equal (eval symb) 'labels)
- (if (consp value)
- (let ((word "") (list value))
- (while list
- (if (string-match "^\\s-*$" (car list))
- (setq word (concat word (format "%s, " (cadr list))))
- (setq word (concat word (format "%S %s, " (car list)
- (cadr list)))))
- (setq list (cddr list)) )
- (setq value (concat "(" (substring word 0 -2) ")")))
- (setq value "") )
- (setcdr (assoc (caar alist) gnuplot-gui-alist) value) ))
-
- (setq alist (cdr alist))) )))
-
-
-;;; GUI frames
-
-(defun gnuplot-gui-prompt-for-frame (&optional option save-frame)
- (setq option (or option (completing-read "Option: " gnuplot-gui-all-types
- nil t nil t)))
- (gnuplot-gui-make-frame
- option (cdr (assoc option gnuplot-gui-all-types)) save-frame) )
-
-
-(defface gnuplot-gui-error-face '((((class color) (background light))
- (:foreground "grey30"))
- (((class color) (background dark))
- (:foreground "grey70")))
- "Face used to display message about unknown widget types."
- :group 'gnuplot-faces)
-
-(defface gnuplot-gui-flat-text-face '((((class color) (background light))
- (:foreground "MediumBlue"))
- (((class color) (background dark))
- (:foreground "LightSteelBlue")))
- "Face used to display message about unknown widget types."
- :group 'gnuplot-faces)
-
-(defun gnuplot-gui-make-frame (item alist &optional save-frame)
- "Open the frame and populate it with widgets.
-ITEM is the object for which arguments are being set. ALIST is
-the alist of arguments for ITEM taken from `gnuplot-gui-all-types'.
-SAVE-FRAME is non-nil when the widgets are being reset."
- (unless save-frame
- (setq gnuplot-current-frame (selected-frame)
- gnuplot-current-buffer (current-buffer)
- gnuplot-current-buffer-point (point-marker))
- (unless (and gnuplot-gui-frame (frame-live-p gnuplot-gui-frame))
- (setq gnuplot-gui-frame (if gnuplot-xemacs-p
- (make-frame gnuplot-gui-frame-plist)
- (make-frame gnuplot-gui-frame-parameters))))
- (select-frame gnuplot-gui-frame)
- ;;(set-frame-position gnuplot-gui-frame 150 150) ;; so herky-jerky
- (if gnuplot-xemacs-p
- (set-mouse-position (selected-window) 0 0)
- (set-mouse-position gnuplot-gui-frame 0 0)))
- (kill-buffer (get-buffer-create "*Gnuplot GUI*"))
- (switch-to-buffer (get-buffer-create "*Gnuplot GUI*"))
- (kill-all-local-variables)
- (if gnuplot-xemacs-p
- (progn
- (set (make-local-variable 'frame-title-format)
- "Set Gnuplot Options")
- (set (make-local-variable 'frame-icon-title-format)
- "Set Gnuplot Options"))
- (modify-frame-parameters (selected-frame)
- '((title . "Set Gnuplot Options"))) )
- (widget-insert "\nSet options for \"" item "\" ")
- (let (tag help val)
- (cond ((string-match "^[xyz]2?tics" item)
- (setq tag "info on tic labels"
- help "Open a frame displaying the info entry for tic labels"
- val "xtics"))
- ((string-match "^no" item)
- (setq tag (concat "info on " (substring item 2))
- help (format "Open a frame displaying the info entry for %S"
- item)
- val item))
- (t
- (setq tag (concat "info on " item)
- help (format "Open a frame displaying the info entry for %S"
- item)
- val item)))
- (widget-create 'gnuplot-gui-info-link :tag tag :help-echo help :value val))
-
- (widget-insert "\n\n")
- (while alist
- (let* ((this (car alist))
- (tag (gnuplot-gui-type-tag this))
- (wtype (gnuplot-gui-type-symbol this))
- (prefix (gnuplot-gui-type-prefix this))
- (default (cdr (assoc tag gnuplot-gui-alist)))
- (list (gnuplot-gui-type-list this)))
- (if (symbolp (cadr list))
- (setq list (symbol-value (cadr list))))
- (widget-insert "\t") ; insert the appropriate widget
- (cond
- ;;------------------------------ list, list* ------------
- ((member* (eval wtype) '(list list*) :test 'equal)
- (let ((starred (if (equal (eval wtype) 'list*) t nil)))
- (gnuplot-gui-menu-choice tag default list starred)))
- ;;------------------------------ number, tag, fontsize --
- ((member* (eval wtype) '(number tag fontsize) :test 'equal)
- (gnuplot-gui-number tag default prefix))
- ;;------------------------------ position ---------------
- ;;------------------------------ range, pair ------------
- ((member* (eval wtype) '(range pair) :test 'equal)
- (let ((is-range (equal (eval wtype) 'range)))
- (gnuplot-gui-range tag default prefix is-range)))
- ;;------------------------------ string, string* --------
- ((member* (eval wtype) '(string string*) :test 'equal)
- (let ((starred (if (equal (eval wtype) 'string) nil t)))
- (gnuplot-gui-string tag default prefix starred)))
- ;;------------------------------ format -----------------
- ((equal (eval wtype) 'format)
- (gnuplot-gui-format tag default))
- ;;------------------------------ file -------------------
- ((equal (eval wtype) 'file)
- (gnuplot-gui-file tag default prefix))
- ;;------------------------------ labels -----------------
- ((equal (eval wtype) 'labels)
- (gnuplot-gui-labels tag default))
- ;;------------------------------ text -------------------
- ((equal (eval wtype) 'text)
- (let ((str (gnuplot-gui-type-default this)))
- (put-text-property 0 (length str) 'face 'gnuplot-gui-flat-text-face str)
- (widget-insert str "\n")))
- ;;------------------------------ unknown ----------------
- (t
- (let ((str (concat "<" (downcase tag) "> ('"
- (symbol-name (eval wtype))
- " arguments are not yet supported)\n")))
- (put-text-property 0 (length str) 'face 'gnuplot-gui-error-face str)
- (widget-insert str)) )))
- (setq alist (cdr alist)))
- ;; insert control buttons: [Set options] [Reset] [Clear] [Cancel]
- (widget-insert "\n\t")
- (widget-create 'push-button
- :value "Set options"
- :doc item
- :button-face 'gnuplot-gui-button-face
- :help-echo "Push this button to set options"
- :notify
- (lambda (widget &rest ignore)
- (kill-buffer (get-buffer-create "*Gnuplot GUI*"))
- (delete-frame)
- (select-frame gnuplot-current-frame)
- (switch-to-buffer gnuplot-current-buffer)
- (goto-char gnuplot-current-buffer-point)
- (gnuplot-gui-post-process-alist
- (widget-get widget :doc))
- (let ((alist gnuplot-gui-alist) marker
- (eol (save-excursion (end-of-line) (point-marker) )) )
- (if (re-search-forward ";" eol "to_limit")
- (backward-char 1))
- (delete-region gnuplot-current-buffer-point (point-marker))
- (delete-horizontal-space)
- (setq marker (point-marker))
- (while alist
- (let ((val (cdar alist)))
- (if (string-match "^\\s-+$" val) ()
- (if (string-match "^['\"]\\(.*\\)['\"]$" val)
- (setq val (concat gnuplot-quote-character
- (match-string 1 val)
- gnuplot-quote-character)))
- (insert (format " %s" val))))
- (setq alist (cdr alist)))
- (setq eol (point-marker))
- (goto-char marker)
- (while (< (point) eol) ; a few odd cases
- (unless (looking-at (concat "[" (regexp-quote "(")
- (regexp-quote "*") ",]"))
- (just-one-space))
- (forward-sexp)))
- (delete-horizontal-space)
- (if (string= "terminal" (widget-get widget :doc))
- (gnuplot-gui-set-options-and-insert)) ))
- (widget-insert " ")
- (widget-create 'push-button :value "Reset"
- :help-echo "Push this button to reset all values"
- :button-face 'gnuplot-gui-button-face
- :doc item
- :notify
- (lambda (widget &rest ignore)
- (let ((word (widget-get widget :doc)))
- (gnuplot-gui-set-alist word gnuplot-gui-current-string)
- (gnuplot-gui-prompt-for-frame word t))))
- (widget-insert " ")
- (widget-create 'push-button :value "Clear"
- :help-echo "Push this button to clear all values"
- :button-face 'gnuplot-gui-button-face
- :doc item
- :notify
- (lambda (widget &rest ignore)
- (let* ((word (widget-get widget :doc))
- (alist (cdr (assoc word gnuplot-gui-all-types))))
- (while alist
- (setcdr (assoc (gnuplot-gui-type-tag (car alist))
- gnuplot-gui-alist)
- (gnuplot-gui-type-default (car alist)))
- (setq alist (cdr alist)))
- (gnuplot-gui-prompt-for-frame word t))) )
- (widget-insert " ")
- (widget-create 'push-button :value "Cancel"
- :help-echo "Quit setting options and dismiss frame"
- :button-face 'gnuplot-gui-button-face
- :notify (lambda (widget &rest ignore)
- (kill-buffer (get-buffer-create "*Gnuplot GUI*"))
- (setq gnuplot-gui-alist nil
- gnuplot-gui-current-string nil)
- (delete-frame)
- (select-frame gnuplot-current-frame)))
- (goto-char (point-min))
- (use-local-map widget-keymap)
- (widget-setup))
-
-
-;;; widgets
-
-(defface gnuplot-gui-menu-face '((((class color) (background light))
- (:bold t :foreground "darkolivegreen"))
- (((class color) (background dark))
- (:bold t :foreground "seagreen"))
- (t
- (:italic t)))
- "Face used for menu-buttons."
- :group 'gnuplot-faces)
-(defface gnuplot-gui-button-face '((((class color) (background light))
- (:bold t :foreground "sienna"))
- (((class color) (background dark))
- (:bold t :foreground "tan"))
- (t
- (:italic t)))
- "Face used for push-buttons.
-Only used in Emacs. XEmacs displays push-buttons with a pixmap."
- :group 'gnuplot-faces)
-(defface gnuplot-gui-labels-face '((((class color) (background light))
- (:bold t :foreground "darkslateblue"))
- (((class color) (background dark))
- (:bold t :foreground "lightslateblue"))
- (t
- (:italic t)))
- "Face used for insert and delete button in the labels widget."
- :group 'gnuplot-faces)
-
-(defun gnuplot-gui-menu-choice (item default list &optional starred)
- "Create a menu widget for the Gnuplot GUI.
-ITEM is the object whose arguments are set by this widget, DEFAULT
-is the default argument value, LIST contains the items for the pop-up
-menu. STARRED is true if this a 'list* widget."
- (let ((widget
- (apply 'widget-create
- 'menu-choice :value default :tag item :doc starred
- :button-face 'gnuplot-gui-menu-face
- :button-prefix "[" :button-suffix "]"
- :help-echo (format "Mouse-2 to view the %S menu" (downcase item))
- :notify
- (lambda (widget &rest ignore)
- (let ((lab (if (widget-get widget :doc)
- (concat (downcase (widget-get widget :tag)) " ")
- "" )))
- (setcdr (assoc (widget-get widget :tag) gnuplot-gui-alist)
- (if (string= (widget-value widget) " ") ""
- (format "%s%s" lab (widget-value widget))) )))
- (mapcar (lambda (x) (list 'item :value x))
- list))))
- (widget-value-set widget default)
- (if (and starred (not (string-match "^\\s-*$" default)))
- (setcdr (assoc item gnuplot-gui-alist)
- (format "%s %s" (downcase item) default)))
- widget))
-
-(defun gnuplot-gui-number (item default &optional prefix)
- "Create a number widget for the Gnuplot GUI.
-ITEM is the object whose arguments are set by this widget, DEFAULT
-is the default value for the widget, PREFIX is a text string preceding
-the numerical argument."
- (let ((help-label (or prefix (downcase item))))
- (widget-insert (capitalize item) ": ")
- (widget-create 'editable-field
- :size 2 :tag item :value default :doc prefix
- :help-echo (format "Insert new value of %S here" help-label)
- :notify (lambda (widget &rest ignore)
- (let ((val (widget-value widget))
- (pre (concat (widget-get widget :doc) " ")))
- (setcdr (assoc (widget-get widget :tag)
- gnuplot-gui-alist)
- (if (string-match
- "^\\s-*[-0-9.*]+\\s-*$" val)
- (format "%s%s" pre val) "") )))))
- (unless (string-match "^\\s-*$" default)
- (setcdr (assoc item gnuplot-gui-alist) (format "%s %s" prefix default)))
- (widget-insert " " (make-string (- 40 (current-column)) ?.)
- " (numeric value)\n"))
-
-(defun gnuplot-gui-string (item default &optional width_or_prefix starred)
- "Create a string widget for the Gnuplot GUI.
-ITEM is the object whose arguments are set by this widget, DEFAULT is
-the default value for the widget, and WIDTH_OR_PREFIX is the width of
-the text entry field (which defaults to half the frame width) or the
-prefix for the string. STARRED is t if quotes are not to be used."
- (let ((help-label (downcase item)) width (prefix "") (pp ""))
- (cond ((stringp width_or_prefix)
- (setq prefix width_or_prefix
- pp prefix)
- (if starred (setq prefix (concat prefix "_star"))) )
- ((numberp width_or_prefix)
- (setq width width_or_prefix)))
- (setq width (or width (/ (frame-width) 2)))
- (if (string-match "^['\"]" default)
- (setq default (replace-match "" nil nil default)))
- (if (string-match "['\"]$" default)
- (setq default (replace-match "" nil nil default)))
- (widget-insert (capitalize item) ": ")
- (widget-create
- 'editable-field
- :size width :tag item :doc prefix :value default
- :help-echo (format "Insert new value of %S here" help-label)
- :notify (lambda (widget &rest ignore)
- (let ((val (widget-value widget))
- (q gnuplot-quote-character)
- (p (widget-get widget :doc)) )
- (setcdr (assoc (widget-get widget :tag) gnuplot-gui-alist)
- (if (string-match "^\\s-*$" val)
- ""
- (progn
- (if (string-match "_star$" p)
- (setq p (concat (substring p 0 -5) " ")
- q ""))
- (if (string-match "^\\s-+" val)
- (setq val (replace-match "" nil nil val)))
- (if (string-match "\\s-+$" val)
- (setq val (replace-match "" nil nil val)))
- (format "%s%s%s%s" p q val q)))))))
- (unless (string-match "^\\s-*$" default)
- (setcdr (assoc item gnuplot-gui-alist) (format "%s %s" pp default)))
- (widget-insert "\n")))
-
-(defun gnuplot-gui-format (item default)
- "Create a string widget for the Gnuplot GUI.
-ITEM is the object whose arguments are set by this widget, DEFAULT is
-the default value for the widget, and WIDTH_OR_PREFIX is the width of
-the text entry field (which defaults to half the frame width) or the
-prefix for the string."
- (if (string-match "^['\"]" default)
- (setq default (replace-match "" nil nil default)))
- (if (string-match "['\"]$" default)
- (setq default (replace-match "" nil nil default)))
- (widget-insert (capitalize item) ": ")
- (widget-create 'editable-field
- :size (/ (frame-width) 3) :tag item :value default
- :help-echo (format "Insert new format string here")
- :notify (lambda (widget &rest ignore)
- (let ((val (widget-value widget)))
- (setcdr (assoc (widget-get widget :tag)
- gnuplot-gui-alist)
- (format "%s%s%s"
- gnuplot-quote-character
- val
- gnuplot-quote-character)))))
- (widget-insert " ")
- (widget-create 'gnuplot-gui-info-link
- :tag (concat "info on format")
- :help-echo "Open a frame displaying the info entry for format"
- :value "format")
- (widget-insert "\n"))
-
-
-;; swiped from widget-color-complete
-(defun gnuplot-gui-file-completion (widget)
- "Complete the filename in WIDGET."
- (let* ((str (buffer-substring-no-properties (widget-field-start widget)
- (point)))
- (file (or (file-name-nondirectory str) ""))
- (dir (or (file-name-directory str) "./"))
- (val (file-name-completion file dir)) )
- (cond ((eq val t)
- (message "Exact match"))
- ((null val)
- (error "Can't find completion for \"%s\"" str))
- ((not (string-equal str val))
- (insert (substring val (length file))))
- (t
- (message "Making completion list...")
- (let ((list (file-name-all-completions file dir)))
- (with-output-to-temp-buffer "*Completions*"
- (display-completion-list list)))
- (message "Making completion list...done")))))
-
-(defun gnuplot-gui-file (item default &optional tag)
- "Create a file widget for the Gnuplot GUI.
-ITEM is the object whose arguments is set by this widget, DEFAULT is
-the default value for the argument. TAG is non-nil if ITEM rather than
-\"File:\" is to be used as the tag."
- (setq tag (if tag (capitalize item) "File"))
- (if (string-match "^['\"]" default)
- (setq default (replace-match "" nil nil default)))
- (if (string-match "['\"]$" default)
- (setq default (replace-match "" nil nil default)))
- (let ((widg (widget-create
- 'file
- :value default :tag tag
- :size (- (/ (frame-width) 2) 3)
- :doc item :help-echo "Insert a filename here"
- :complete 'gnuplot-gui-file-completion
- :notify
- (lambda (widget &rest ignore)
- (setcdr (assoc (widget-get widget :doc) gnuplot-gui-alist)
- (format "%s%s%s" gnuplot-quote-character
- (widget-value widget)
- gnuplot-quote-character)) )) ))
- (widget-insert " ")
- (widget-create
- 'push-button :value "Browse"
- :doc item :help-echo "Browse directories for a filename."
- :parent widg
- :notify (lambda (widget &rest ignore)
- (let ((fname (file-relative-name (read-file-name "File: ")
- default-directory))
- (q gnuplot-quote-character))
- (widget-value-set (widget-get widget :parent) fname)
- (setcdr (assoc (widget-get widget :doc) gnuplot-gui-alist)
- (format "%s%s%s" q fname q))
- (widget-setup))))
- (widget-insert "\n")))
-
-(defun gnuplot-gui-labels (item default)
- "Create a labels widget for the Gnuplot GUI.
-ITEM is the object whose arguments is set by this widget, DEFAULT is
-the default value for the argument."
- (widget-create
- '(editable-list
- (list :inline t :tag "Tic label"
- (string :tag "label" :size 10
- :help-echo "Enter the tic label here" )
- (string :tag " position" :size 10
- :help-echo "Enter an expression for the tic location here" )))
- :tag (capitalize item)
- :value default
- :format "%{%t%}:\n%v\t %i\n"
- :entry-format "\t %i %d %v\n"
- :button-face 'gnuplot-gui-labels-face
- :notify (lambda (widget &rest ignore)
- (setcdr (assoc (upcase (widget-get widget :tag))
- gnuplot-gui-alist)
- (widget-value widget)))))
-
-(defun gnuplot-gui-range (item default separator is-range)
- "Create a range or pair widget for the Gnuplot GUI.
-ITEM is the object whose arguments are set by this widget, DEFAULT is
-the default value for the widget, SEPARATOR is a text string preceding
-the numerical argument, or the prefix for a pair operator. IS-RANGE
-is non-nil if this is a 'range widget."
- (widget-insert (capitalize item) ": ")
- (if is-range (widget-insert "["))
- (widget-create 'editable-field
- :size 4 :tag item :value (car default)
- :help-echo (format "Insert the first value of the %S here"
- (downcase item))
- :notify (lambda (widget &rest ignore)
- (setcar (cdr (assoc (widget-get widget :tag)
- gnuplot-gui-alist))
- (format "%s" (widget-value widget)))))
- (if is-range (widget-insert separator) (widget-insert " "))
- (widget-create 'editable-field
- :size 4 :tag item :value (cdr default)
- :help-echo (format "Insert the second value of the %S here"
- (downcase item))
- :notify (lambda (widget &rest ignore)
- (setcdr (cdr (assoc (widget-get widget :tag)
- gnuplot-gui-alist))
- (format "%s" (widget-value widget)))))
- (if is-range (widget-insert "]"))
- (widget-insert " " (make-string (- 39 (current-column)) ?.)
- " (numeric values)\n"))
-
-
-;; suppress compiler warning
-;;(eval-when-compile (defun gnuplot-info-lookup-symbol (sym mode)))
-(define-widget 'gnuplot-gui-info-link 'info-link
- "A link to an info file for the Gnuplot GUI."
- :action '(lambda (widget &optional event)
- (let ((gnuplot-info-display 'frame))
- (if gnuplot-keywords-pending ; <HW>
- (gnuplot-setup-info-look))
- (gnuplot-info-lookup-symbol (widget-value widget)
- 'gnuplot-mode))))
-
-
-;;; just about done
-
-(provide 'gnuplot-gui)
-
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-
-;;; gnuplot-gui.el ends here
diff --git a/elpa/gnuplot-20200322.53/gnuplot-pkg.el b/elpa/gnuplot-20200322.53/gnuplot-pkg.el
deleted file mode 100644
index 807f2e2..0000000
--- a/elpa/gnuplot-20200322.53/gnuplot-pkg.el
+++ /dev/null
@@ -1,14 +0,0 @@
-(define-package "gnuplot" "20200322.53" "Major-mode and interactive frontend for gnuplot"
- '((emacs "24.1"))
- :commit "f0001c30010b2899e36d7d89046322467e923088" :keywords
- '("data" "gnuplot" "plotting")
- :authors
- '(("Jon Oddie")
- ("Bruce Ravel")
- ("Phil Type"))
- :maintainer
- '("Bruce Ravel" . "bruceravel1@gmail.com")
- :url "https://github.com/emacsorphanage/gnuplot")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/gnuplot-20200322.53/gnuplot.el b/elpa/gnuplot-20200322.53/gnuplot.el
deleted file mode 100644
index b6fe49e..0000000
--- a/elpa/gnuplot-20200322.53/gnuplot.el
+++ /dev/null
@@ -1,3265 +0,0 @@
-;;; gnuplot.el --- Major-mode and interactive frontend for gnuplot
-
-;; Copyright (C) 1998, 2011 Phil Type and Bruce Ravel, 1999-2012 Bruce Ravel
-
-;; Author: Jon Oddie
-;; Bruce Ravel
-;; Phil Type
-;; Maintainer: Bruce Ravel <bruceravel1@gmail.com>
-;; Created: June 28 1998
-;; Version: 0.7.0
-;; Keywords: data gnuplot plotting
-;; URL: https://github.com/emacsorphanage/gnuplot
-;; Package-Requires: ((emacs "24.1"))
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This is a major mode for composing gnuplot scripts and displaying
-;; their results using gnuplot. It supports features of recent
-;; Gnuplot versions (4.4 and up), but should also work fine with older
-;; versions.
-;;
-;; This version of gnuplot-mode has been tested mostly on GNU Emacs 23
-;; and 24, but should also work with older GNU Emacs versions back to
-;; Emacs 21, and XEmacs 21.
-;;
-;; This mode offers several tools to help you compose your scripts,
-;; including font-lock syntax colorization, a syntax table appropriate
-;; to gnuplot, key bindings, pull-down menus, indentation, keyword
-;; completions and variable customization using the Custom package.
-;; Once the script is composed, there are several function for sending
-;; some or all of the script to gnuplot. The interaction with the
-;; gnuplot process is within a comint buffer. Plots can optionally be
-;; displayed within Emacs.
-;;
-;; C-c C-l send current line to gnuplot
-;; C-c C-v send current line to gnuplot and move forward 1 line
-;; C-c C-r send current region to gnuplot
-;; C-c C-b send entire buffer to gnuplot
-;; C-c C-f send a file to gnuplot
-;; C-c C-i insert filename at point
-;; C-c C-n negate set option on current line
-;; C-c C-c comment region
-;; C-c C-o set arguments for command at point
-;; S-mouse-2 set arguments for command under mouse cursor
-;; C-c C-d read the gnuplot info file
-;; C-c C-e show-gnuplot-buffer
-;; C-c C-k kill gnuplot process
-;; C-c C-u submit a bug report about gnuplot-mode
-;; C-c C-z customize gnuplot-mode
-;; M-tab or M-ret complete keyword before point
-;; ret newline and indent
-;; tab indent current line
-;; C-c M-i toggle inline plot display in comint buffer
-;;
-;; With the exception of the commands for sending commands to Gnuplot,
-;; most of the above commands also work in the Gnuplot comint buffer,
-;; in addition to the following:
-;; M-C-p plot the most recent script buffer line-by-line
-;; M-C-f save the current script buffer and load that file
-;; C-c C-e pop back to most recent script buffer
-;;
-;; These two functions are useful for starting up gnuplot-mode:
-;;
-;; M-x gnuplot-mode
-;; start gnuplot-mode in the current buffer
-;;
-;; M-x gnuplot-make-buffer
-;; open a new buffer (which is not visiting a file) and start
-;; gnuplot-mode in that buffer
-;;
-;; Gnuplot-mode now includes context-sensitive support for keyword
-;; completion and, optionally, eldoc-mode help text. See the
-;; commentary in gnuplot-context.el for more information. If you
-;; don't find it useful, it can be turned off by customizing
-;; `gnuplot-context-sensitive-mode'.
-;;
-;;
-;; ---------------------------------------------------------------------
-;;
-;; Other Lisp files used by gnuplot.el
-;;
-;; gnuplot-gui.el (written by Bruce):
-;; Defines the GUI interface for setting setting arguments to
-;; gnuplot options. This uses the widget package extensively.
-;;
-;; gnuplot-context.el (written by Jonathan, j.j.oddie@gmail.com)
-;; Context-sensitive completion, help lookup and eldoc
-;; strings for gnuplot buffers. Should be byte-compiled before
-;; using.
-;;
-;; ---------------------------------------------------------------------
-;;
-;; This mode was inspired by the original gnu-plot-mode by Gershon
-;; Elber, which is distributed with gnuplot itself and which dates
-;; back to the early 90's. Although this mode encompasses the
-;; functionality of the original, the two share no code and the
-;; current implementation takes advantage of many features of modern
-;; versions of Emacs and adheres (or so I intend) to the major mode
-;; conventions described in the emacs-lisp reference for version 19
-;; and later.
-;;
-;; ---------------------------------------------------------------------
-;;
-;; Installation
-;; ============
-;;
-;; A recent version of this file can be found at
-;; https://github.com/emacsorphanage/gnuplot/
-;;
-;; To autoload gnuplot-mode on any file with gp extension, put this in
-;; your .emacs file
-;; (autoload 'gnuplot-mode "gnuplot" "gnuplot major mode" t)
-;; (autoload 'gnuplot-make-buffer "gnuplot" "open a buffer in gnuplot-mode" t)
-;;
-;; Something like
-;; (setq auto-mode-alist (append '(("\\.gp$" . gnuplot-mode))
-;; auto-mode-alist))
-;; is useful for having files ending in .gp start up in gnuplot-mode.
-;;
-;; Something like
-;; (global-set-key [(f9)] 'gnuplot-make-buffer)
-;; may be useful. This binds f9 to the function that opens a scratch
-;; buffer (i.e. one that is not visiting a file) in gnuplot-mode.
-;; This is handy for your quick 'n' dirty plotting chores.
-;;
-;; To use the `gnuplot-info-lookup-symbol' function, the file
-;; gnuplot.info MUST be installed somewhere that info can find it.
-;; This means you must either:
-;; 1. Copy gnuplot.info to the normal info directory or
-;; 2. Make sure info can find gnuplot.info by putting this in your
-;; .emacs file:
-;; (setenv "INFOPATH"
-;; (concat (getenv "INFOPATH") ":"
-;; (expand-file-name "/path/to/file")))
-;; where "/path/to/file" is the location of gnuplot.info
-;;
-;; This mode has been tested extensively with GNU Emacs 23 and 24, and
-;; in a limited manner with GNU Emacs 22 and XEmacs 21.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; History:
-
-;;
-;; 0.1 Jun 25 1998 Finished with initial release.
-;; 0.2 Sep 4 1998 Added filename insertion, indentation, and
-;; colorization/completion in comint buffer. <BR>
-;; 0.2a Sep 11 1998 made `indent-line-function' buffer-local (whoops!)
-;; and fixed some stuff in the installation script <BR>
-;; 0.3 Sep 12 1998 include insertions menu <BR>
-;; 0.3a Sep 14 1998 fixed bug finding info file if missing, fixed bug
-;; starting font-lock, fixed bug re overwriting files in
-;; installation script <BR>
-;; 0.3b Sep 15 1998 Added (require 'info) to `(eval-and-compile'
-;; clause, Added (kill-all-local-variables) to `gnuplot-mode',
-;; altered order of:-
-;; (provide 'gnuplot)
-;; (run-hooks 'gnuplot-load-hook)
-;; at the end of the file in case something in the load hook
-;; requires gnuplot (oh not that old one again...), added
-;; `gnuplot-comint-setup-hook', corrected `gnuplot-mark-active'
-;; which caused an error to be raised by (mark) when the mark
-;; was inactive <DB> Some changes to font-lock rules <LB>&<BR>
-;; 0.4 Nov 14 1998 <BR> Use info-look for info interface. No
-;; change to gnuplot-mode user interface, but cleaner code.
-;; With info-look, the help funcion works regardless of the
-;; version number of gnuplot. Also, `gnuplot-keywords' (used
-;; for help, keyword-completion, and hilit19 highlighting) is
-;; now generated automatically.
-;; 0.4a Nov 18 1998 <BR> info-look leaves a couple of really useless
-;; buffers lying around so I cleaned them up. Also fixed
-;; font-lock rules so that things in quotes get highlighted
-;; correctly and the surrounding text is unhighlighted. Fixed
-;; up font-lock rules for plot and splot. Added
-;; `gnuplot-send-line-and-forward' as suggested by <MD>.
-;; 0.4b Nov 21 1998 <BR> added toolbar for xemacs -- see file
-;; gnuplot-toolbar.el. fixed error message in plot line
-;; function when line is empty. option added to display the
-;; comint buffer showing the gnuplot process in a separate
-;; frame
-;; 0.4c Minor stuff: Nov 30 1998 <BR> fixed highlighting in comint
-;; buffer. fixed frame behavior. added "[:]" to range
-;; insertions. added :link to defgroup. Dec 1 1998 <BR> fixed
-;; some mismatched defcustoms. added a few lines to suppress
-;; some compile-time warnings. Dec 3 1998 <BR> Fixed behavior
-;; of filename insertion function. Added more :links to
-;; defgroup.
-;; 0.4d Dec 6 1998 <BR> Added function gnuplot-setup-info-look and
-;; variable gnuplot-info-hook to handle various versions of the
-;; gnuplot info file.
-;; 0.4e Dec 12 1998 <BR> Split up gnuplot-insertions-menu for ease of
-;; custimization, put menubar initialization in a function.
-;; 0.4f Dec 14 1998 <BR> defcustom the insertions submenus, add
-;; gnuplot-insertion-menu-flag, intelligent Makefile knows
-;; which info-look to compile
-;; 0.5 Dec 27 1998 <BR> wrote initial draft of gnuplot-gui.el,
-;; included it in insertions menu and in `gnuplot-insert'.
-;; Negate option function, bound to C-c C-n. Dec 29 1998 <BR>
-;; C-c C-h with no response goes to Commands menu. Transparent
-;; toolbar icons. Replace kw-compl with a simple completion
-;; function. Put gnuplot-toolbar code in gnuplot.el.
-;; 0.5a Jan 23 1999 <BR> send file uses the load command. add
-;; gnuplot-plot-from-comint and
-;; gnuplot-save-and-plot-from-comint and keybindings in the
-;; comint buffer. do (process-kill-without-query
-;; gnuplot-process nil). `gnuplot-negate-option' checks if set
-;; option has a negated form.
-;; 0.5b `gnuplot-kill-gnuplot-buffer' made more robust. fixed a bug
-;; in `gnuplot-plot-from-comint'. fixed description of
-;; gnuplot-faces group.
-;; 0.5c update copyright information, update gpelcard
-;; 0.5d Mar 20 1999 <BR> adopt installation materials from <LH>. Add
-;; some support for hidden3d. Use constants in types alists in
-;; gui. Various other minor improvements to the types alists.
-;; 0.5e Apr 6 1999 <BR> at the suggestion of <SE> I did away with the
-;; gnuplot-which-highlight variable and revamped how
-;; colorization gets turned on. This is a bit tricky since I
-;; want it to work with font-lock under emacs and xemacs and
-;; with hilit19. Apr 11 1999 <BR> insert space at end of
-;; unique completion. add a few GUI types, rewrite some stuff
-;; in the GUI interface. primitive support for plot, splot,
-;; and fit. Fixed completion in file widget.
-;; 0.5f May 15 1999 <BR> Add pgnuplot.c and Win9x install instructions
-;; to the distribution. Fixed a defface bug. Added
-;; `gnuplot-keywords-when' allowing deferral of parsing the
-;; info file.
-;; 0.5g May 27 1999 <BR> Fixed font-locking of strings and
-;; comments. Figure out gnuplot-version number from startup
-;; message and set `gnuplot-echo-command-line-flag'
-;; accordingly. Added `gnuplot-program-version' variable.
-;; Check that font-lock is actually a feature, as suggested by
-;; <KL>
-;; 0.5h Aug 15 1999 <BR> Added `gnuplot-determine-gnuplot-version' so
-;; that the gnuplot version number and `comint-process-echos'
-;; actually get set correctly. Actually, the first time
-;; something is plotted, the echoing might not work, but the
-;; second time it will.
-;; 0.5i Sep 2 1999 <BR> Once again changed how
-;; `comint-process-echos' gets set. Maybe I got it right this
-;; time? Also fixed certain situations where the info file
-;; did notget properly loaded (insertion with info toggle on
-;; and info button in GUI).
-;; 0.5j Sep 9 1999 <BR> Do a more robust check for the gnuplot
-;; process before killing the gnuplot buffer, as suggested by
-;; <SE>.
-;; 0.5k Sep 22 1999 <BR> make `gnuplot-send-line-and-forward' skip
-;; over blank and comment lines as suggested by <SE>. Jan 10
-;; 2000 Bound C-c C-j to `gnuplot-forward-script-line'.
-;; 0.5l Nov 16 2000 <BR> support for pm3d in gnuplot-gui and in plot
-;; options insertions menu. mentioned pm3d in gpelcard. gui
-;; support for x11 pm3d and vgagl terms.
-;; `gnuplot-negate-option' works with new syntax.
-;; 0.5m Nov 17 2000 <BR> add colorization and gui support for new
-;; commands in 3.8. gui support for emf term. gui support for
-;; new "set style" syntax. much better scheme for determining
-;; gnuplot version number + make better use of it.
-;; 0.5n Jan 4 2001 <BR> corrected a serious problem interacting with
-;; speedbar
-;; 0.5o skipped
-;; 0.5p Mar 14 2001 <BR> fixed problem with toolbar creation and
-;; speedbar clicking
-;; 0.5q May 30 2001 <BR> added font-lock bindings for words associated
-;; with plotting
-;; 0.5r Oct 17 2001 <BR> Incorporate two suggestions by <RF>, bind
-;; C-c C-c to comment-region and C-c C-o to the GUI, also make
-;; C-c C-l respect continuation lines
-;; April 12, 2002 <BR> added feature to trim length of gnuplot
-;; process buffer
-;; 0.5s Jun 7 2002 <BR> Yet again changed how `comint-process-echos'
-;; gets set. It really needs to be nil on NTEmacs 21.1 or
-;; comint gets stuck in an infinate loop.
-;; 0.5t Sep 16 2002 <BR> Fixed a problem with C-c C-v jumping
-;; forward 2 lines at a time
-;; 0.6.0 Dec 13 2002 <BR> Changed numbering scheme to accommodate
-;; gnuplot packaging requirements
-;; 0.6.1 Sep 13 2011 <BR> Moved to github, updated contact info
-;; 0.7.0 Oct 20 2012 <jjo> Contextual completion & help, inline plots,
-;; some other stuff
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Acknowledgements:
-;; David Batty <DB> (numerous corrections)
-;; Laurent Bonnaud <LB> (suggestions regarding font-lock rules)
-;; Markus Dickebohm <MD> (suggested `gnuplot-send-line-and-forward')
-;; Stephen Eglan <SE> (suggested the use of info-look,
-;; contributed a bug fix regarding shutting
-;; down the gnuplot process, improvement to
-;; `gnuplot-send-line-and-forward')
-;; Robert Fenk <RF> (suggested respecting continuation lines)
-;; Michael Karbach <MK> (suggested trimming the gnuplot process buffer)
-;; Alex Chan Libchen <AL> (suggested font-lock for plotting words)
-;; Kuang-Yu Liu <KL> (pointed out buggy dependence on font-lock)
-;; Hrvoje Niksic <HN> (help with defcustom arguments for insertions)
-;; Andreas Rechtsteiner <AR> (pointed out problem with C-c C-v)
-;; Michael Sanders <MS> (help with the info-look interface)
-;; Jinwei Shen <JS> (suggested functionality in comint buffer)
-;; Michael M. Tung <MT> (prompted me to add pm3d support)
-;; Holger Wenzel <HW> (suggested using `gnuplot-keywords-when')
-;; Wolfgang Zocher <WZ> (pointed out problem with gnuplot-mode + speedbar)
-;; Jon Oddie <jjo> (indentation, inline images, context mode)
-;;
-;; and especially to Lars Hecking <LH> for including gnuplot-mode
-;; with the gnuplot 3.7-beta distribution and for providing me with
-;; installation materials
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; To Do:
-;;
-;; 1. Since `gnuplot-display-process' can be nil, it would be
-;; handy to have a function to put on
-;; `gnuplot-after-plot-buffer-hook' to check and see if the script
-;; executed properly. Alas I am not sure how gnuplot signals its
-;; errors.
-;; 2. improve plot, splot, fit in GUI
-;; 3. interface to setting bind command using `read-key-sequence'.
-;; this is a pain because the nomenclature is really different in
-;; gnuplot than in `read-key-sequence'
-;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; Code:
-
-(require 'comint)
-(require 'easymenu)
-(eval-when-compile (require 'cl))
-
-(declare-function 'eldoc-add-command "eldoc")
-
-
-;;; --- variable definitions + eval-and-compile clauses
-
-;; We no longer hack around ancient versions of Customize with macros
-(require 'custom)
-
-(eval-and-compile ;; <DB>
- (require 'info))
-
-(eval-and-compile
- (condition-case ()
- (require 'info-look)
- (error nil)))
-
-;; Workaround missing `completion-at-point' in (X)Emacs < 22
-(if (not (fboundp 'completion-at-point))
- (defun gnuplot-xemacs-completion-at-point ()
- "Perform completion on keyword preceding point.
-
-This binds `comint-dynamic-complete-functions' to
-`gnuplot-comint-complete' and uses `comint-dynamic-complete' to do the
-real work."
- (interactive)
- (let ((comint-dynamic-complete-functions
- '(gnuplot-comint-complete)))
- (completion-at-point))))
-
-;; Work around missing `window-full-height-p'
-(if (fboundp 'window-full-height-p)
- (defalias 'gnuplot-window-full-height-p 'window-full-height-p)
- ;; The below is taken from window.el in GNU Emacs
- (defun gnuplot-window-full-height-p (&optional window)
- (unless window
- (setq window (selected-window)))
- (= (window-height window)
- (window-height (frame-root-window (window-frame window))))))
-
-;; Workaround obsolete `process-kill-without-query'
-(if (fboundp 'set-process-query-on-exit-flag)
- (defalias 'gnuplot-set-process-query-on-exit-flag 'set-process-query-on-exit-flag)
- (defalias 'gnuplot-set-process-query-on-exit-flag 'process-kill-without-query))
-
-;; Workaround for missing syntax-ppss in XEmacs
-(if (fboundp 'syntax-ppss)
- (defalias 'gnuplot-syntax-ppss 'syntax-ppss)
- (defun gnuplot-syntax-ppss (&optional pos)
- (save-excursion
- (unless pos (setq pos (point)))
- (let ((begin
- (save-excursion
- (goto-char pos)
- (gnuplot-point-at-beginning-of-continuation))))
- (parse-partial-sexp begin pos)))))
-
-
-;;;;
-(defconst gnuplot-xemacs-p (string-match "XEmacs" (emacs-version)))
-(defconst gnuplot-ntemacs-p (string-match "msvc" (emacs-version)))
-(defvar gnuplot-three-eight-p "")
-
-(defconst gnuplot-maintainer "Jon Oddie")
-(defconst gnuplot-maintainer-url
- "https://github.com/emacsorphanage/gnuplot/")
-(defconst gnuplot-version "0.7-beta")
-
-(defgroup gnuplot nil
- "Gnuplot-mode for Emacs."
- :prefix "gnuplot-"
- :group 'processes
- :group 'applications
- :group 'local
- :link '(emacs-library-link :tag "Lisp File" "gnuplot.el")
- :link '(url-link :tag "Homepage"
- "https://github.com/emacsorphanage/gnuplot/")
- :link '(custom-manual "(gnuplot)Top")
- :link '(emacs-commentary-link :tag "Commentary" "gnuplot.el"))
-(defgroup gnuplot-insertions nil
- "Insert commands into gnuplot-scripts from a pull-down menu."
- :prefix "gnuplot-insertions-"
- :group 'gnuplot)
-(defgroup gnuplot-hooks nil
- "Hook variables used by `gnuplot-mode'."
- :prefix "gnuplot-"
- :group 'gnuplot)
-
-(defcustom gnuplot-mode-hook nil
- "Hook run when `gnuplot-mode' is entered."
- :group 'gnuplot-hooks
- :type 'hook)
-(defcustom gnuplot-load-hook nil
- "Hook run when gnuplot.el is first loaded."
- :group 'gnuplot-hooks
- :type 'hook)
-(defcustom gnuplot-after-plot-hook nil
- "Hook run after gnuplot plots something.
-This is the last thing done by the functions for plotting a line, a
-region, a buffer, or a file."
- :group 'gnuplot-hooks
- :type 'hook)
-
-
-(defcustom gnuplot-info-hook nil
- "Hook run before setting up the info-look interface.
-This hook is necessary to handle inconsistencies in versions of and
-sources of the gnuplot info file. If Gnuplot-mode can find the info
-file generated from the 3.6beta patchlevel 347 (or later) release of
-Gnuplot, then this hook probably is not necessary. Some versions of
-the info file may have a General Index session, which can be used by
-info-look. In that case the following (or something similar with the
-value of `info-lookup-symbol-alist' altered appropriately) should be
-placed in the .emacs file.
-
-Emacs version 20.2 ships with a different version of info-look that
-does 20.3. If you use any version of Emacs 19, you must use the
-version from 20.2. Any version of XEmacs 20 or 21 should use the
-version from 20.3 but can use either. XEmacs 19 should use the
-version 20.2.
-
-For the newer version of info-look, do this:
-
- (add-hook \'gnuplot-info-hook
- \'(lambda ()
- (let ((elem (assoc \'gnuplot-mode info-lookup-alist)))
- (delete elem info-lookup-alist)
- (info-lookup-maybe-add-help
- :mode 'gnuplot-mode :topic 'symbol
- :regexp \"[a-zA-Z][_a-zA-Z0-9]*\"
- :doc-spec '((\"(gnuplot)General Index\" nil
- \"[_a-zA-Z0-9]+\"))))))
-
-For the older version of info-look, do this:
-
- (add-hook \'gnuplot-info-hook
- \'(lambda ()
- (let ((elem (assoc \'gnuplot-mode info-lookup-alist)))
- (delete elem info-lookup-alist)
- (setq info-lookup-alist
- (append info-lookup-alist
- \'((gnuplot-mode
- \"[a-zA-Z][_a-zA-Z0-9]*\" nil
- ((\"(gnuplot)General Index\" nil
- \"[_a-zA-Z0-9]+\" )))))))))"
- :group 'gnuplot-hooks
- :type 'hook)
-
-;; comint hook suggested by <DB>
-(defcustom gnuplot-comint-setup-hook nil
- "Hook run after setting up the gnuplot buffer in comint mode.
-So the configuration can be customised by the user."
- :group 'gnuplot-hooks
- :type 'hook)
-
-(defcustom gnuplot-comint-mode-hook nil
- "Hook run after setting up the gnuplot buffer in gnuplot-comint-mode.
-By default this runs the hook named `gnuplot-comint-setup-hook',
-for backward compatibility."
- :group 'gnuplot-hooks
- :type 'hook)
-
-(defvar gnuplot-recently-sent nil
- "This is a record of the most recent kind of text sent to gnuplot.
-It takes as its value nil, 'line, 'region, 'buffer, or 'file. It is
-useful for functions included in `gnuplot-after-plot-hook'.")
-(make-variable-buffer-local 'gnuplot-recently-sent)
-
-(defcustom gnuplot-program "gnuplot"
- "The name of the gnuplot executable."
- :group 'gnuplot
- :type 'string)
-(defvar gnuplot-program-version nil
- "Version number of gnuplot.
-This is using `gnuplot-fetch-version-number'.")
-(defvar gnuplot-program-major-version nil
- "Major version number of gnuplot.
-This is found using `gnuplot-fetch-version-number'.")
-(defvar gnuplot-program-minor-version nil
- "Minor version number of gnuplot.
-This is found using `gnuplot-fetch-version-number'.")
-
-(defcustom gnuplot-process-name "gnuplot"
- "Name given to the gnuplot buffer and process."
- :group 'gnuplot
- :type 'string)
-(defvar gnuplot-buffer nil
- "The name of the buffer displaying the gnuplot process.")
-(defvar gnuplot-process nil
- "Variable holding the process handle.")
-(defvar gnuplot-process-frame nil
- "The frame for displaying the gnuplot process.
-This is used when `gnuplot-display-process' is equal to 'frame.")
-(defvar gnuplot-comint-recent-buffer nil
- "The most recently plotted gnuplot script buffer.
-This is used by the function that plot from the comint buffer. It is
-reset every time something is plotted from a script buffer.")
-
-(defcustom gnuplot-gnuplot-buffer "plot.gp"
- "The name of the gnuplot scratch buffer opened by 'gnuplot-make-buffer'."
- :group 'gnuplot
- :type 'string)
-
-(defcustom gnuplot-display-process 'window
- "This controls how the gnuplot process buffer is displayed.
-The values are
- 'frame display gnuplot process in a separate frame
- 'window display gnuplot process in this frame but in another window
- nil `gnuplot-process' is in the current frame but not displayed"
- :group 'gnuplot
- :type '(radio (const :tag "Separate frame" frame)
- (const :tag "Separate window" window)
- (const :tag "Not displayed" nil)))
-(defcustom gnuplot-info-display 'window
- "Determines how `gnuplot-info-lookup-symbol' displays the info file.
-The values are
- 'frame display info file in a separate frame
- 'window display info file in another window
- nil display info file in the current window"
- :group 'gnuplot
- :type '(radio (const :tag "Separate frame" frame)
- (const :tag "Separate window" window)
- (const :tag "This window" nil)))
-
-(defcustom gnuplot-echo-command-line-flag (not gnuplot-ntemacs-p)
- "Non-nil means the gnuplot subprocess echoes any input.
-This sets the fall-back value of `comint-process-echoes'.
-If `gnuplot-mode' cannot figure out what version number of gnuplot
-this is, then the value of this variable will be used for
-`comint-process-echos'. It seems that gnuplot 3.5 wants this to be
-nil and 3.7 wants it to be t. If lines that you send to gnuplot from
-the `gnuplot-mode' buffer are not appearing at the gnuplot prompt in
-the process buffer, try toggling it. Also see the document string for
-`comint-process-echos'. If you change this, kill the gnuplot process
-and start it again."
- :group 'gnuplot
- :type 'boolean)
-(defcustom gnuplot-insertions-show-help-flag nil
- "Non-nil means to display certain help messages automatically.
-These messages are shown after menu insertion of gnuplot commands."
- :group 'gnuplot-insertions
- :type 'boolean)
-
-(defcustom gnuplot-delay 0.01
- "Amount of time to delay before sending a new line to gnuplot.
-This is needed so that the the line is not written in the gnuplot
-buffer in advance of its prompt. Increase this number if the
-prompts and lines are displayed out of order."
- :group 'gnuplot
- :type 'number)
-(defcustom gnuplot-buffer-max-size 1000
- "The maximum size in lines of the gnuplot process buffer.
-Each time text is written in the gnuplot process buffer, lines are
-trimmed from the beginning of the buffer so that the buffer is this
-many lines long. The lines are deleted after the most recent lines
-were interpretted by gnuplot. Setting to 0 turns off this feature."
- :group 'gnuplot
- :type 'integer)
-(defcustom gnuplot-quote-character "\'"
- "Quotation character used for inserting quoted strings.
-Gnuplot can use single or double quotes. If you prefer to have the
-filename insertion function never insert quotes for you, set this
-to the empty string."
- :group 'gnuplot
- :type '(radio (const :tag "double quote" "\"")
- (const :tag "single quote" "\'")
- (const :tag "none" "" )))
-(defcustom gnuplot-basic-offset 4
- "Number of columns to indent lines inside a do- or if-else-block.
-
-This applies only to new-style do- and if-statements using
-braces. Commands continued over a linebreak using a backslash
-are always indented to line up with the second word on the line
-beginning the continued command."
- :group 'gnuplot
- :type 'integer)
-
-;; (defcustom gnuplot-gnuplot-version nil
-;; "Force gnuplot-mode to behave for this version of gnuplot."
-;; :group 'gnuplot
-;; :type '(radio (const :tag "unspecified" nil)
-;; (const :tag "3.8 or newer" "3.8")
-;; (const :tag "3.7 or older" "3.7")))
-
-(defvar gnuplot-info-frame nil)
-(defvar gnuplot-info-nodes '())
-
-(defvar gnuplot-first-call t)
-
-;; with info-look, there is no need to carry this list around -- it
-;; can be generated on the fly appropriate to the currently installed
-;; version of gnuplot.info
-(defvar gnuplot-keywords nil
- "A list of keywords used in GNUPLOT.
-These are set by `gnuplot-set-keywords-list' from the values in
-`info-lookup-cache'.")
-(defvar gnuplot-keywords-alist nil) ;; For all-completions
-(defvar gnuplot-keywords-pending t ;; <HW>
- "A boolean which gets toggled when the info file is probed.")
-(defcustom gnuplot-keywords-when 'deferred ;; 'immediately
- "This variable controls when the info file is parsed.
-The choices are immediately upon starting gnuplot-mode or the first
-time that data is needed."
- :group 'gnuplot
- :type
- '(radio (const :tag "Parse info file when gnuplot-mode starts" immediately)
- (const :tag "Parse info file the first time it is needed" deferred)))
-
-(defcustom gnuplot-use-context-sensitive-completion t
- "Non-nil if `gnuplot-context-sensitive-mode' should be enabled by default.
-
-In context-sensitive mode, gnuplot-mode parses the current
-command line to provide smarter completion and documentation
-suggestions."
- :group 'gnuplot
- :type 'boolean
- :initialize 'custom-set-default
- :set (lambda (sym value)
- (dolist (buffer (buffer-list))
- (with-current-buffer buffer
- (when (derived-mode-p 'gnuplot-mode 'gnuplot-comint-mode)
- (gnuplot-context-sensitive-mode
- (if value 1 0))))))
- :link '(emacs-commentary-link "gnuplot-context"))
-
-(defcustom gnuplot-eldoc-mode nil
- "Non-nil if ElDoc mode should be enabled by default in Gnuplot buffers.
-ElDoc support requires `gnuplot-context-sensitive-mode' to be
-on."
- :group 'gnuplot
- :type 'boolean)
-
-(defcustom gnuplot-tab-completion nil
- "Non-nil if TAB should perform completion in gnuplot-mode buffers.
-
-Setting this to non-nil sets the `tab-always-indent' variable to the
-symbol `complete' in gnuplot-mode buffers."
- :group 'gnuplot
- :type 'boolean)
-
-(defun gnuplot-set-display-mode (variable value &rest args)
- "Customize :set function for `gnuplot-inline-image-mode'.
-Set VARIABLE to VALUE. ARGS is optional args."
- (if (and (eq variable 'gnuplot-inline-image-mode)
- value
- (not (gnuplot-display-images-p)))
- (progn
- (message "Displaying images is not supported.")
- (set variable nil))
- (set variable value))
- (gnuplot-setup-comint-for-image-mode))
-
-(defcustom gnuplot-inline-image-mode nil
- "Whether to display Gnuplot output in Emacs.
-
-Possible values are nil, `inline' and `dedicated'.
-
-When this is nil, Gnuplot output is handled outside of Emacs in
-the normal way. Otherwise, Emacs attempts to capture Gnuplot's
-output and display it in a buffer. Output is inserted inline in
-the Gnuplot interaction buffer it this is `inline', in a
-separate dedicated buffer if it is `dedicated'.
-
-Use Customize to set this variable, or the commands
-`gnuplot-external-display-mode', `gnuplot-inline-display-mode',
-and `gnuplot-dedicated-display-mode'."
- :group 'gnuplot
- :type '(radio
- (const :tag "No" nil)
- (const :tag "In Comint buffer" inline)
- (const :tag "In dedicated buffer" dedicated))
- :initialize 'custom-initialize-default
- :set 'gnuplot-set-display-mode)
-
-(defcustom gnuplot-image-format "png"
- "Image format to use for displaying images within Emacs.
-
-This will be sent directly to Gnuplot as a command of the form
-\"set terminal <FORMAT>\". Common values are \"png\" and
-\"svg\".
-
-This only has an effect when `gnuplot-inline-image-mode' is
-non-nil."
- :group 'gnuplot
- :type 'string
- :initialize 'custom-initialize-default
- :set 'gnuplot-set-display-mode)
-
-(defgroup gnuplot-faces nil
- "Text faces used by gnuplot-mode."
- :prefix "gnuplot-"
- :group 'gnuplot)
-
-(defface gnuplot-prompt-face '((((class color))
- (:foreground "firebrick"))
- (t
- (:bold t :underline t)))
- "Face used for the prompt in the gnuplot process buffer."
- :group 'gnuplot-faces)
-
-
-;;; --- key bindings and menus
-
-(defvar gnuplot-mode-map
- (let ((map (make-sparse-keymap))
- (completion-function
- (if (fboundp 'completion-at-point)
- 'completion-at-point
- 'gnuplot-xemacs-completion-at-point)))
- (define-key map "\C-c\C-b" 'gnuplot-send-buffer-to-gnuplot)
- (define-key map "\C-c\C-c" 'comment-region) ; <RF>
- (define-key map "\C-c\C-o" 'gnuplot-gui-set-options-and-insert)
- (define-key map "\C-c\C-w" 'gnuplot-show-version)
- (define-key map "\C-c\C-e" 'gnuplot-show-gnuplot-buffer)
- (define-key map "\C-c\C-f" 'gnuplot-send-file-to-gnuplot)
- (define-key map "\C-c\C-d" 'gnuplot-info-lookup-symbol)
- (define-key map "\C-c\C-i" 'gnuplot-insert-filename)
- (define-key map "\C-c\C-j" 'gnuplot-forward-script-line)
- (define-key map "\C-c\C-k" 'gnuplot-kill-gnuplot-buffer)
- (define-key map "\C-c\C-l" 'gnuplot-send-line-to-gnuplot)
- (define-key map "\C-c\C-n" 'gnuplot-negate-option)
- (define-key map "\C-c\C-p" 'gnuplot-show-gnuplot-version)
- (define-key map "\C-c\C-r" 'gnuplot-send-region-to-gnuplot)
- (define-key map (kbd "C-M-x") 'gnuplot-send-line-to-gnuplot)
- (define-key map "\C-c\C-v" 'gnuplot-send-line-and-forward)
- (define-key map "\C-c\C-z" 'gnuplot-customize)
- (define-key map "\C-i" 'indent-for-tab-command)
- (define-key map "\C-m" 'newline-and-indent)
- (define-key map "\C-c\M-i" 'gnuplot-inline-image-mode)
- (define-key map (kbd "}") 'gnuplot-electric-insert)
- (define-key map "\M-\r" completion-function)
- (define-key map "\M-\t" completion-function)
-
- (if gnuplot-xemacs-p
- (define-key map '(shift button2) 'gnuplot-gui-mouse-set)
- (define-key map [S-mouse-2] 'gnuplot-gui-mouse-set))
-
- map))
-
-(defvar gnuplot-mode-menu nil)
-
-(defvar gnuplot-display-options-menu
- (flet ((make-image-setter (type)
- `[,(concat (upcase type) " images")
- (lambda () (interactive) (gnuplot-set-image-format ,type))
- :style toggle
- :selected (eq gnuplot-image-format ,type)]))
- `("Display plot output"
- ["Externally" gnuplot-external-display-mode
- :style toggle
- :selected (null gnuplot-inline-image-mode)]
- ["In Comint buffer" gnuplot-inline-display-mode
- :active (gnuplot-display-images-p)
- :style toggle
- :selected (eq gnuplot-inline-image-mode 'comint)]
- ["In dedicated buffer" gnuplot-dedicated-display-mode
- :style toggle
- :selected (eq gnuplot-inline-image-mode 'dedicated)]
- "---"
- ,@(mapcar #'make-image-setter (list "png" "jpeg" "svg"))
- ["Other image type..." gnuplot-set-image-format])))
-
-(defvar gnuplot-menu
- `("Gnuplot"
- ["Send line to gnuplot" gnuplot-send-line-to-gnuplot t]
- ["Send line & move forward" gnuplot-send-line-and-forward (not (eobp))]
- ["Send region to gnuplot" gnuplot-send-region-to-gnuplot
- (gnuplot-mark-active)]
- ["Send buffer to gnuplot" gnuplot-send-buffer-to-gnuplot t]
- ["Send file to gnuplot" gnuplot-send-file-to-gnuplot t]
- "---"
- ,gnuplot-display-options-menu
- ["Contextual completion and help" gnuplot-context-sensitive-mode
- :style toggle
- :selected gnuplot-context-sensitive-mode]
- ["Echo area help (eldoc-mode)" eldoc-mode
- :active gnuplot-context-sensitive-mode
- :style toggle
- :selected eldoc-mode]
- "---"
- ["Insert filename at point" gnuplot-insert-filename t]
- ["Negate set option" gnuplot-negate-option t]
- ;;["Set key binding" gnuplot-set-binding gnuplot-three-eight-p]
- ["Keyword help" gnuplot-info-lookup-symbol
- (or gnuplot-keywords gnuplot-keywords-pending)]
- ["Quick help for thing at point" gnuplot-help-function
- gnuplot-context-sensitive-mode]
- ["Info documentation on thing at point"
- gnuplot-info-at-point
- gnuplot-context-sensitive-mode]
- ["Show gnuplot process buffer" gnuplot-show-gnuplot-buffer t]
- ["Set arguments at point" gnuplot-gui-set-options-and-insert
- (fboundp 'gnuplot-gui-set-options-and-insert)]
- ["Swap plot/splot/fit lists in GUI" gnuplot-gui-swap-simple-complete
- (fboundp 'gnuplot-gui-swap-simple-complete)]
- "---"
- ["Customize gnuplot" gnuplot-customize t]
- ["Show gnuplot-mode version" gnuplot-show-version t]
- ["Show gnuplot version" gnuplot-show-gnuplot-version t]
- "---"
- ["Kill gnuplot" gnuplot-kill-gnuplot-buffer t])
- "Menu for `gnuplot-mode'.")
-
-
-
-;;; --- insertions variables and menus
-
-;;(load-library "gnuplot-insertions")
-(defvar gnuplot-mode-insertions-menu nil)
-(defvar gnuplot-insertions-menu nil
- "Menu for insertions in `gnuplot-mode'.
-
-The insertions menu is composed of several sub-menus. The variables
-describing the sub-menus are:
- `gnuplot-insertions-adornments'
- `gnuplot-insertions-plot-options'
- `gnuplot-insertions-terminal'
- `gnuplot-insertions-x-axis'
- `gnuplot-insertions-y-axis'
- `gnuplot-insertions-z-axis'
- `gnuplot-insertions-x2-axis'
- `gnuplot-insertions-y2-axis'
- `gnuplot-insertions-parametric-plots'
- `gnuplot-insertions-polar-plots'
- `gnuplot-insertions-surface-plots'
-These variables can be customized by the user. For example, there are
-many terminal types which are not in the terminal submenu but which
-may be compiled into a user's copy of gnuplot.
-
-Each of these variables is a list whose first element is a string and
-all the rest are vectors as described in the document string for
-`easy-menu-define'. The callback used throughout these menus is
-`gnuplot-insert' which inserts the appropriate set expression and,
-optionally, looks up that item in the gnuplot info file.
-
-The easiest way to customize the submenus is to use the custom
-package. Just type \\[gnuplot-customize] and follow your nose.
-
-You can also add new items to any of these sub-menus by adding to the
-`gnuplot-load-hook' in your .emacs file. Here is an example of adding
-the \"regis\" terminal type to the terminal sub-menu:
-
- (add-hook
- 'gnuplot-load-hook
- '(lambda ()
- (setq gnuplot-insertions-terminal
- (append gnuplot-insertions-terminal
- (list
- [\"regis\"
- (gnuplot-insert \"set terminal regis\")
- t])))))")
-
-(defvar gnuplot-insertions-top ()
- "Top part of insertions menu.
-See the document string for `gnuplot-insertions-menu'")
-
-(defcustom gnuplot-insertions-menu-flag t
- "Non-nil means to place the insertion menu in the menubar.
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type 'boolean)
-
-(defcustom gnuplot-insertions-adornments ; this is icky...
- (if gnuplot-three-eight-p
- '("adornments"
- ["arrow" (gnuplot-insert "set arrow ") t]
- ["bar" (gnuplot-insert "set bar") t]
- ["border" (gnuplot-insert "set border") t]
- ["boxwidth" (gnuplot-insert "set boxwidth ") t]
- ["format" (gnuplot-insert "set format ") t]
- ["grid" (gnuplot-insert "set grid") t]
- ["key" (gnuplot-insert "set key ") t]
- ["label" (gnuplot-insert "set label ") t]
- ["pointsize" (gnuplot-insert "set pointsize ") t]
- ["samples" (gnuplot-insert "set samples ") t]
- ["size" (gnuplot-insert "set size ") t]
- ["style" (gnuplot-insert "set style ") t]
- ["tics" (gnuplot-insert "set tics ") t]
- ["timefmt" (gnuplot-insert "set timefmt ") t]
- ["timestamp" (gnuplot-insert "set timestamp ") t]
- ["title" (gnuplot-insert "set title ") t]
- ["zeroaxis" (gnuplot-insert "set zeroaxis") t])
- '("adornments"
- ["data style" (gnuplot-insert "set data style ") t]
- ["function style" (gnuplot-insert "set function style ") t]
- ["arrow" (gnuplot-insert "set arrow ") t]
- ["bar" (gnuplot-insert "set bar") t]
- ["border" (gnuplot-insert "set border") t]
- ["boxwidth" (gnuplot-insert "set boxwidth ") t]
- ["format" (gnuplot-insert "set format ") t]
- ["grid" (gnuplot-insert "set grid") t]
- ["key" (gnuplot-insert "set key ") t]
- ["label" (gnuplot-insert "set label ") t]
- ["pointsize" (gnuplot-insert "set pointsize ") t]
- ["samples" (gnuplot-insert "set samples ") t]
- ["size" (gnuplot-insert "set size ") t]
- ["tics" (gnuplot-insert "set tics ") t]
- ["timefmt" (gnuplot-insert "set timefmt ") t]
- ["timestamp" (gnuplot-insert "set timestamp ") t]
- ["title" (gnuplot-insert "set title ") t]
- ["zeroaxis" (gnuplot-insert "set zeroaxis") t]))
- "Adornments submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-
-(defcustom gnuplot-insertions-plot-options
- '("plot options"
- ["autoscale" (gnuplot-insert "set autoscale ") t]
- ["clip" (gnuplot-insert "set clip ") t]
- ["encoding" (gnuplot-insert "set encoding ") t]
- ["locale" (gnuplot-insert "set locale ") t]
- ["logscale" (gnuplot-insert "set logscale ") t]
- ["multiplot" (gnuplot-insert "set multiplot") t]
- ["missing" (gnuplot-insert "set missing \"\"") t]
- ["palette" (gnuplot-insert "set palette ") t] ; <MT>
- ["pm3d" (gnuplot-insert "set pm3d ") t]
- ["offsets" (gnuplot-insert "set offsets ") t]
- ["output" (gnuplot-insert "set output ") t]
- ["zero" (gnuplot-insert "set zero ") t])
- "Plot options submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-terminal
- '("terminal"
- ["eepic" (gnuplot-insert "set terminal eepic") t]
- ["fig" (gnuplot-insert "set terminal fig") t]
- ["gpic" (gnuplot-insert "set terminal gpic") t]
- ["latex" (gnuplot-insert "set terminal latex") t]
- ["linux" (gnuplot-insert "set terminal linux") t]
- ["pbm" (gnuplot-insert "set terminal pbm") t]
- ["png" (gnuplot-insert "set terminal png") t]
- ["postscript" (gnuplot-insert "set terminal postscript") t]
- ["pslatex" (gnuplot-insert "set terminal pslatex") t]
- ["table" (gnuplot-insert "set terminal table") t]
- ["tek40xx" (gnuplot-insert "set terminal tek40xx") t]
- ["tkcanvas" (gnuplot-insert "set terminal tkcanvas") t]
- ["tpic" (gnuplot-insert "set terminal tpic") t]
- ["vgagl" (gnuplot-insert "set terminal vgagl") t] ; for pm3d patch
- ["vttek" (gnuplot-insert "set terminal vttek") t]
- ["x11" (gnuplot-insert "set terminal x11") t])
- "Terminal submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-x-axis
- '("x-axis"
- ["xdata" (gnuplot-insert "set xdata ") t]
- ["xlabel" (gnuplot-insert "set xlabel ") t]
- ["xrange" (gnuplot-insert "set xrange [:]") t]
- ["xtics" (gnuplot-insert "set xtics ") t]
- ["mxtics" (gnuplot-insert "set mxtics ") t]
- ["xzeroaxis" (gnuplot-insert "set xzeroaxis ") t]
- ["xdtics" (gnuplot-insert "set xdtics ") t]
- ["xmtics" (gnuplot-insert "set xmtics ") t])
- "X-axis submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-x2-axis
- '("x2-axis"
- ["x2data" (gnuplot-insert "set xdata ") t]
- ["x2label" (gnuplot-insert "set xlabel ") t]
- ["x2range" (gnuplot-insert "set xrange [:]") t]
- ["x2tics" (gnuplot-insert "set xtics ") t]
- ["mx2tics" (gnuplot-insert "set mxtics ") t]
- ["x2zeroaxis" (gnuplot-insert "set xzeroaxis ") t]
- ["x2dtics" (gnuplot-insert "set xdtics ") t]
- ["x2mtics" (gnuplot-insert "set xmtics ") t])
- "X2-axis submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-y-axis
- '("y-axis"
- ["ydata" (gnuplot-insert "set ydata ") t]
- ["ylabel" (gnuplot-insert "set ylabel ") t]
- ["ymtics" (gnuplot-insert "set ymtics ") t]
- ["yrange" (gnuplot-insert "set yrange [:]") t]
- ["ytics" (gnuplot-insert "set ytics ") t]
- ["yzeroaxis" (gnuplot-insert "set yzeroaxis ") t]
- ["ydtics" (gnuplot-insert "set ydtics ") t]
- ["mytics" (gnuplot-insert "set mytics ") t])
- "Y-axis submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-(defcustom gnuplot-insertions-y2-axis
- '("y2-axis"
- ["y2data" (gnuplot-insert "set ydata ") t]
- ["y2label" (gnuplot-insert "set ylabel ") t]
- ["y2range" (gnuplot-insert "set yrange [:]") t]
- ["y2tics" (gnuplot-insert "set ytics ") t]
- ["my2tics" (gnuplot-insert "set mytics ") t]
- ["y2zeroaxis" (gnuplot-insert "set yzeroaxis ") t]
- ["y2mtics" (gnuplot-insert "set ymtics ") t]
- ["y2dtics" (gnuplot-insert "set ydtics ") t])
- "Y2-axis submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-
-(defcustom gnuplot-insertions-z-axis
- '("z-axis"
- ["zdata" (gnuplot-insert "set zdata ") t]
- ["zlabel" (gnuplot-insert "set zlabel ") t]
- ["zrange" (gnuplot-insert "set zrange [:]") t]
- ["ztics" (gnuplot-insert "set ztics ") t]
- ["mztics" (gnuplot-insert "set mztics ") t]
- ["zdtics" (gnuplot-insert "set zdtics ") t]
- ["zmtics" (gnuplot-insert "set zmtics ") t])
- "Z-axis submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-parametric-plots
- '("parametric plots"
- ["parametric" (gnuplot-insert "set parametric") t]
- ["isosamples" (gnuplot-insert "set isosamples ") t]
- ["dummy" (gnuplot-insert "set dummy ") t]
- ["trange" (gnuplot-insert "set trange [:]") t]
- ["urange" (gnuplot-insert "set urange [:]") t]
- ["vrange" (gnuplot-insert "set vrange [:]") t])
- "Parametric plots submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-polar-plots
- '("polar plots"
- ["polar" (gnuplot-insert "set polar") t]
- ["angles" (gnuplot-insert "set angles ") t]
- ["rrange" (gnuplot-insert "set rrange [:]") t])
- "Polar plots submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defcustom gnuplot-insertions-surface-plots
- '("surface plots"
- ["clabel" (gnuplot-insert "set clabel ") t]
- ["cntrparam" (gnuplot-insert "set cntrparam ") t]
- ["contour" (gnuplot-insert "set contour") t]
- ["dgrid3d" (gnuplot-insert "set dgrid3d ") t]
- ["hidden3d" (gnuplot-insert "set hidden3d ") t]
- ["mapping" (gnuplot-insert "set mapping ") t]
- ["surface" (gnuplot-insert "set surface ") t]
- ["view" (gnuplot-insert "set view ") t])
- "Surface plots submenu in the insertions menu.
-See the document string for `gnuplot-insertions-menu'
-Changing this will not effect a change in any currently existing
-`gnuplot-mode' buffer. You will see the change the next time you
-create a `gnuplot-mode' buffer."
- :group 'gnuplot-insertions
- :type '(list (string :tag "Title")
- (repeat :inline t
- (vector (string :tag "Name")
- (function :tag "Callback")
- (boolean :tag "Enabled" t)))))
-
-
-(defvar gnuplot-gui-popup-flag)
-(defvar gnuplot-insertions-bottom ()
- "Bottom part of the insertions menu.
-This part contains the toggle buttons for displaying info or
-opening an argument-setting popup.")
-(setq gnuplot-insertions-bottom
- '("---"
- ["Display of info with insertion" gnuplot-toggle-info-display
- :style toggle :selected gnuplot-insertions-show-help-flag]
- ["Display GUI popup with insertion" gnuplot-gui-toggle-popup
- :active (fboundp 'gnuplot-gui-toggle-popup)
- :style toggle :selected (and (fboundp 'gnuplot-gui-toggle-popup)
- gnuplot-gui-popup-flag)]))
-
-
-;; Regarding a comment by <DB>:
-;;
-;; This is from the header in easymenu.el distributed with XEmacs:
-;;
-;; ;; - Function: easy-menu-add MENU [ MAP ]
-;; ;; Add MENU to the current menubar in MAP.
-;; ;;
-;; ;; - Function: easy-menu-remove MENU
-;; ;; Remove MENU from the current menubar.
-;; ;;
-;; ;; Emacs 19 never uses `easy-menu-add' or `easy-menu-remove', menus
-;; ;; automatically appear and disappear when the keymaps specified by
-;; ;; the MAPS argument to `easy-menu-define' are activated.
-;; ;;
-;; ;; XEmacs will bind the map to button3 in each MAPS, but you must
-;; ;; explicitly call `easy-menu-add' and `easy-menu-remove' to add and
-;; ;; remove menus from the menu bar.
-;;
-;; in Emacs, easy-menu-add is defined like this:
-;; (defun easy-menu-add (menu &optional map))
-
-(defun gnuplot-setup-menubar ()
- "Initial setup of gnuplot and insertions menus."
- (if gnuplot-insertions-menu-flag ; set up insertions menu
- (progn
- (if gnuplot-xemacs-p
- (setq gnuplot-insertions-top
- '("insert set expression" "--:doubleLine"))
- (setq gnuplot-insertions-top
- '("insert set expression" "---")))
- (setq gnuplot-insertions-menu
- (append (list "Insertions")
- gnuplot-insertions-top
- (list gnuplot-insertions-adornments)
- (list gnuplot-insertions-plot-options)
- (list gnuplot-insertions-terminal)
- (list gnuplot-insertions-x-axis)
- (list gnuplot-insertions-y-axis)
- (list gnuplot-insertions-z-axis)
- (list gnuplot-insertions-x2-axis)
- (list gnuplot-insertions-y2-axis)
- (list gnuplot-insertions-parametric-plots)
- (list gnuplot-insertions-polar-plots)
- (list gnuplot-insertions-surface-plots)
- gnuplot-insertions-bottom))
- (easy-menu-define gnuplot-mode-insertions-menu gnuplot-mode-map
- "Insertions menu used in Gnuplot-mode"
- gnuplot-insertions-menu)
- (easy-menu-add gnuplot-mode-insertions-menu gnuplot-mode-map)))
- (easy-menu-define ; set up gnuplot menu
- gnuplot-mode-menu gnuplot-mode-map "Menu used in gnuplot-mode"
- gnuplot-menu)
- (easy-menu-add gnuplot-mode-menu gnuplot-mode-map))
-
-;; There is no `mark-active' variable in XEmacs. Hassle! This is not
-;; only replicates mark-active, but it only returns true if the region
-;; is of non-zero width.
-;; Error checking suggested by <DB>
-(defun gnuplot-mark-active ()
- "Return non-nil if the mark is active and it is not equal to point."
- (condition-case nil
- (and (mark) (/= (mark) (point)))
- (error nil)))
-
-
-;;; --- XEmacs toolbar
-
-(defgroup gnuplot-toolbar nil
- "Toolbar used by XEmacs."
- :prefix "gnuplot-toolbar-"
- :group 'gnuplot)
-
-(defcustom gnuplot-toolbar-display-flag gnuplot-xemacs-p
- "Non-nil means to display display a toolbar in XEmacs."
- :group 'gnuplot-toolbar
- :type 'boolean)
-
-(defcustom gnuplot-toolbar-use-toolbar (if (featurep 'toolbar) 'left-toolbar nil)
- "If nil, do not use a toolbar.
-If it is non-nil, it must be a toolbar. The five legal values are
-`default-toolbar', `top-toolbar', `bottom-toolbar', `right-toolbar',
-and `left-toolbar', although choosing `default-toolbar' or
-`top-toolbar' may be a bad idea since either will make the GNUPLOT
-toolbar replace the standard toolbar. Changing this will not change
-the toolbar in a currently existing buffer, but it will take effect
-the next time you use `gnuplot-mode' and Emacs.
-
-This is only used if a toolbar can be displayed, thus this is used in
-XEmacs and ignored in FSF Emacs."
- :type '(choice (const default-toolbar)
- (const top-toolbar)
- (const bottom-toolbar)
- (const left-toolbar)
- (const right-toolbar)
- (const :tag "No toolbar" nil))
- :group 'gnuplot-toolbar)
-
-(defvar gnuplot-toolbar-location "")
-
-(defun gnuplot-toolbar-setup-toolbar (toolbar)
- "Setup function for the `gnuplot-mode' toolbar.
-TOOLBAR contains the toolbar specification.
-This is basically swiped from VM."
- (let ((width 46) (height 46)
- (buffer (current-buffer))
- (frame (selected-frame))
- (tag-set '(win)))
- (cond
- ((eq (symbol-value gnuplot-toolbar-use-toolbar) right-toolbar)
- (setq gnuplot-toolbar-location "right")
- (set-specifier right-toolbar toolbar buffer)
- (set-specifier right-toolbar-width width frame tag-set))
- ((eq (symbol-value gnuplot-toolbar-use-toolbar) left-toolbar)
- (setq gnuplot-toolbar-location "left")
- (set-specifier left-toolbar toolbar buffer)
- (set-specifier left-toolbar-width width frame tag-set))
- ((eq (symbol-value gnuplot-toolbar-use-toolbar) bottom-toolbar)
- (setq gnuplot-toolbar-location "bottom")
- (set-specifier bottom-toolbar toolbar buffer)
- (set-specifier bottom-toolbar-height height frame tag-set))
- ((eq (symbol-value gnuplot-toolbar-use-toolbar) top-toolbar)
- (setq gnuplot-toolbar-location "top")
- (set-specifier top-toolbar toolbar buffer)
- (set-specifier top-toolbar-height height frame tag-set)))))
-
-(defvar gnuplot-line-xpm
- (if (and (featurep 'xpm) (fboundp 'toolbar-make-button-list))
- (toolbar-make-button-list
- "/* XPM */
-static char *line[] = {
-/* width height num_colors chars_per_pixel */
-\" 40 40 5 1\",
-/* colors */
-\". c #000000\",
-\"a c #bebebe s backgroundToolBarColor\",
-\"b c #2f4f4f\",
-\"c c #ff6347\",
-\"d c #0000ff\",
-/* pixels */
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaa..a..aaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaa..a..a....aaa...aaaaaaaaaaaa\",
-\"aaaaaaaaaaaa..a..a..a..a..a..aaaaaaaaaaa\",
-\"aaaaaaaaaaaa..a..a.aa..a.....aaaaaaaaaaa\",
-\"aaaaaaaaaaa..a..a..a..a..aaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaa..a..a..a..a..a..aaaaaaaaaaaa\",
-\"aaaaaaaaaaa..a..a..a..aa...aaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaadaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaadaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaadaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaadaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaacaaaadaadaaaaaaaaaaaa\",
-\"aaaaaaaa.caaadaaaccaccadaddaaaaaccaaaaaa\",
-\"aaaaaaa..accdaddcaaaaaccaaaaaaccaaaaaaaa\",
-\"aaaaaaaa.aadcaccdaaaadaaccaaccaaaaaaaaaa\",
-\"aaaaaaaa.adaacaaaddadaaaaaccaaaaaaaaaaaa\",
-\"aaaaaaaa.daaaaaaaaadaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaa............................aaaaaa\",
-\"aaaaaaaa.aaaa.aaaa.aaaa.aaaa.aaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
- "XPM format image used for the \"plot line\" button"))
-
-(defvar gnuplot-region-xpm
- (if (and (featurep 'xpm) (fboundp 'toolbar-make-button-list))
- (toolbar-make-button-list
- "/* XPM */
-static char *region[] = {
-/* width height num_colors chars_per_pixel */
-\" 40 40 5 1\",
-/* colors */
-\". c #000000\",
-\"a c #bebebe s backgroundToolBarColor\",
-\"b c #2f4f4f\",
-\"c c #ff6347\",
-\"d c #0000ff\",
-/* pixels */
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaa.a..a...aaa....a..aa...aa....aaaaa\",
-\"aaaaaa...a..a..a..a..a..a..a..a..a..aaaa\",
-\"aaaaaa..aa.....a.aa..a....aa..a.aa..aaaa\",
-\"aaaaa..a...aaaa..aa.a..a..aa....a..aaaaa\",
-\"aaaaa..a...a..a..a..a..a..a..a..a..aaaaa\",
-\"aaaa..aaaa...aaa....a..aa...aa..a..aaaaa\",
-\"aaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaadaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaadaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaadaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaadaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaacaaaadaadaaaaaaaaaaaa\",
-\"aaaaaaaa.caaadaaaccaccadaddaaaaaccaaaaaa\",
-\"aaaaaaa..accdaddcaaaaaccaaaaaaccaaaaaaaa\",
-\"aaaaaaaa.aadcaccdaaaadaaccaaccaaaaaaaaaa\",
-\"aaaaaaaa.adaacaaaddadaaaaaccaaaaaaaaaaaa\",
-\"aaaaaaaa.daaaaaaaaadaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaa............................aaaaaa\",
-\"aaaaaaaa.aaaa.aaaa.aaaa.aaaa.aaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
- "XPM format image used for the \"plot region\" button"))
-
-(defvar gnuplot-buffer-xpm
- (if (and (featurep 'xpm) (fboundp 'toolbar-make-button-list))
- (toolbar-make-button-list
- "/* XPM */
-static char *buffer[] = {
-/* width height num_colors chars_per_pixel */
-\" 40 40 5 1\",
-/* colors */
-\". c #000000\",
-\"a c #bebebe s backgroundToolBarColor\",
-\"b c #2f4f4f\",
-\"c c #ff6347\",
-\"d c #0000ff\",
-/* pixels */
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa..aaaaaaaaaa......aaaaaaaaaaaaaa\",
-\"aaaaaaaa..aaaaaaaaa..a..aaaaaaaaaaaaaaaa\",
-\"aaaaaaa....aa..a.........a...aa.a.aaaaaa\",
-\"aaaaaaa..a..a..a..a..a..a..a..a...aaaaaa\",
-\"aaaaaaa.aa....aa..a..a..a.....a..aaaaaaa\",
-\"aaaaaa...a.a..a..a..a..a..aaaa..aaaaaaaa\",
-\"aaaaaa.....a..a..a..a..a..a..a..aaaaaaaa\",
-\"aaaaaa....aaa..a.a..a..aa...aa..aaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaadaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaadaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaadaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaadaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaacaaaadaadaaaaaaaaaaaa\",
-\"aaaaaaaa.caaadaaaccaccadaddaaaaaccaaaaaa\",
-\"aaaaaaa..accdaddcaaaaaccaaaaaaccaaaaaaaa\",
-\"aaaaaaaa.aadcaccdaaaadaaccaaccaaaaaaaaaa\",
-\"aaaaaaaa.adaacaaaddadaaaaaccaaaaaaaaaaaa\",
-\"aaaaaaaa.daaaaaaaaadaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaa............................aaaaaa\",
-\"aaaaaaaa.aaaa.aaaa.aaaa.aaaa.aaaaaaaaaaa\",
-\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
- "XPM format image used for the \"plot buffer\" button"))
-
-(defvar gnuplot-doc-xpm
- (if (and (featurep 'xpm) (fboundp 'toolbar-make-button-list))
- (toolbar-make-button-list
- "/* XPM */
-static char *book_index[] = {
-/* width height num_colors chars_per_pixel */
-\" 40 40 6 1\",
-/* colors */
-\". c #000000\",
-\"a c #bebebe s backgroundToolBarColor\",
-\"b c #2f4f4f\",
-\"c c #ff0000\",
-\"d c #ffffff\",
-\"e c #708090\",
-/* pixels */
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaa.........bbeaaaebb..........aaaaaa\",
-\"aaaaaa.ddddddddaaebebeaaddddddddd.aaaaaa\",
-\"aaaa...dab.bddeebadbdaeebedeeeeed...aaaa\",
-\"aaaa.c.dbaddddebeedbdeebeedebebed.c.aaaa\",
-\"aaaa.c.d.de.edeebeabdbbeeddebbbed.c.aaaa\",
-\"aaaa.c.dbad.ddebeadbdeeebeddeeeed.c.aaaa\",
-\"aaaa.c.dab..ddeeeedbdebeeedebebed.c.aaaa\",
-\"aaaa.c.dddddddeebeabdebebedeebedd.c.aaaa\",
-\"aaaa.c.debebedebeedbdbebeedbeeeeb.c.aaaa\",
-\"aaaa.c.debeeedeeeaabdaaddddebedbb.c.aaaa\",
-\"aaaa.c.deebeddbebedbdbaa.adeeedeb.c.aaaa\",
-\"aaaa.c.ddeebedeeebaba.dd.dddeeedd.c.aaaa\",
-\"aaaa.c.debeebdbeeedbd....ddeebeed.c.aaaa\",
-\"aaaa.c.deebeedeebadbd.dd.ddeeeedd.c.aaaa\",
-\"aaaa.c.dbbebddeeeeabd.aa.adebebbd.c.aaaa\",
-\"aaaa.c.deeeeedeebeabaedddddeeeedd.c.aaaa\",
-\"aaaa.c.dbebbbdebeadbdaeeeedebeeed.c.aaaa\",
-\"aaaa.c.deeebddeeebdbdeebeedeebeed.c.aaaa\",
-\"aaaa.c.debeeedebeeabdebebedebeebd.c.aaaa\",
-\"aaaa.c.deebbedeeeedbdeeeeddeeeeed.c.aaaa\",
-\"aaaa.c.dddddddddaadbdaddddddddddd.c.aaaa\",
-\"aaaa.c..........beabaeb...........c.aaaa\",
-\"aaaa.c.bbbbbbbbbb.bbbbbbbbbbbbbbb.c.aaaa\",
-\"aaaa.c.bbbbbbbbbb..e.bbbbbbbbbbbb.c.aaaa\",
-\"aaaa.c.bbbbbbbbbb.b.bbbbbbbbbbbbb.c.aaaa\",
-\"aaaa.c............e.e.............c.aaaa\",
-\"aaaa.cccccccccccc.a.a.ccccccccccccc.aaaa\",
-\"aaaa................................aaaa\",
-\"aaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
- "XPM format image used for the \"document\" button"))
-
-(defvar gnuplot-help-xpm
- (if (and (featurep 'xpm) (fboundp 'toolbar-make-button-list))
- (toolbar-make-button-list
- "/* XPM */
-static char *help_btn[] = {
-/* width height num_colors chars_per_pixel */
-\" 40 40 3 1\",
-/* colors */
-\"a c #bebebe s backgroundToolBarColor\",
-\"b c #000000\",
-\"c c #ff0000\",
-/* pixels */
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabbbbbbbbaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaabbbccccccccbbbaaaaaaaaaaaaa\",
-\"aaaaaaaaaaabbccccccccccccccbbaaaaaaaaaaa\",
-\"aaaaaaaaaabccccccccccccccccccbaaaaaaaaaa\",
-\"aaaaaaaaabccccccccccccccccccccbaaaaaaaaa\",
-\"aaaaaaaabcccccccbbbbbbbbcccccccbaaaaaaaa\",
-\"aaaaaaaabccccbbbaaaaaaaabbbccccbaaaaaaaa\",
-\"aaaaaaabccccbaaaaaaaaaaaaaabccccbaaaaaaa\",
-\"aaaaaaabcccbaaaaaaaaaaaaaaaabcccbaaaaaaa\",
-\"aaaaaaabcccbaaaaaaaaaaaaaaaabcccbaaaaaaa\",
-\"aaaaaaabcccbaaaaaaaaaaaaaaaabcccbaaaaaaa\",
-\"aaaaaaabbbbbaaaaaaaaaaaaaaabccccbaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaabbbccccbaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabbbbbbbbcccccccbaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabcccccccccccccbaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccccccccccbaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccccccccbbaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccbbbbbbaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
-\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
- "XPM format image used for the \"help\" button"))
-
-(defvar gnuplot-toolbar
- '([gnuplot-line-xpm
- gnuplot-line-fn t "Plot the line under point"]
- [gnuplot-region-xpm
- gnuplot-region-fn t "Plot the selected region"]
- [gnuplot-buffer-xpm
- gnuplot-buffer-fn t "Plot the entire buffer"]
- [:style 3d :size 8]
- [gnuplot-help-xpm
- gnuplot-help-fn t "Look at the gnuplot process buffer"]
- [gnuplot-doc-xpm
- gnuplot-doc-fn t "Look at the gnuplot document"])
- "The gnuplot toolbar.")
-
-(fset 'gnuplot-line-fn 'gnuplot-send-line-and-forward)
-(fset 'gnuplot-region-fn 'gnuplot-send-region-to-gnuplot)
-(fset 'gnuplot-buffer-fn 'gnuplot-send-buffer-to-gnuplot)
-(fset 'gnuplot-help-fn 'gnuplot-show-gnuplot-buffer)
-(fset 'gnuplot-doc-fn 'gnuplot-info-lookup-symbol)
-
-(defvar gnuplot-all-buttons-defined
- (and (listp gnuplot-line-xpm) (listp gnuplot-region-xpm)
- (listp gnuplot-buffer-xpm) (listp gnuplot-doc-xpm)
- (listp gnuplot-help-xpm)))
-
-
-(defun gnuplot-make-toolbar-function ()
- "Make toolbar."
- (if (and gnuplot-xemacs-p gnuplot-all-buttons-defined)
- (progn
- ;;(remove-specifier gnuplot-toolbar-use-toolbar (current-buffer))
- (gnuplot-toolbar-setup-toolbar gnuplot-toolbar)
- (add-spec-to-specifier (symbol-value gnuplot-toolbar-use-toolbar)
- gnuplot-toolbar
- (current-buffer)))))
-
-;;(defalias 'gnuplot-make-toolbar 'gnuplot-make-toolbar-function)
-
-
-
-;;; --- syntax colorization, syntax table
-
-(defvar gnuplot-mode-syntax-table
- (let ((table (make-syntax-table)))
- (modify-syntax-entry ?* "." table)
- (modify-syntax-entry ?+ "." table)
- (modify-syntax-entry ?- "." table)
- (modify-syntax-entry ?/ "." table)
- (modify-syntax-entry ?% "." table)
- (modify-syntax-entry ?= "." table)
- (modify-syntax-entry ?: "." table)
- (modify-syntax-entry ?& "." table ) ; rarely used
- (modify-syntax-entry ?^ "." table ) ; operators
- (modify-syntax-entry ?| "." table ) ; in gnuplot,
- (modify-syntax-entry ?& "." table ) ; (by me,
- (modify-syntax-entry ?? "." table ) ; anyway...)
- (modify-syntax-entry ?~ "." table ) ;
-
- (modify-syntax-entry ?_ "w" table )
-
- ;; In GNU Emacs >=24 we can use `syntax-propertize-function' to
- ;; accurately scan for strings and comments (see
- ;; `gnuplot-syntax-propertize'). If there's no
- ;; `syntax-propertize', fall back to using the built-in parser and
- ;; making ", ', and # string or comment delimiters as normal.
- (if (not (boundp 'syntax-propertize-function))
- (progn
- (modify-syntax-entry ?\' "\"" table)
- (modify-syntax-entry ?# "<" table)
- (modify-syntax-entry ?\n ">" table)
- (modify-syntax-entry ?\\ "\\" table))
-
- ;; When syntax-propertize is available, ", ', and # should be
- ;; punctuation so that the built-in parser doesn't interfere
- ;; with the syntax-propertize search.
- (modify-syntax-entry ?\" "." table)
- (modify-syntax-entry ?\' "." table)
- (modify-syntax-entry ?` "." table)
- (modify-syntax-entry ?\\ "." table))
-
- table)
-
- "Syntax table in use in `gnuplot-mode' buffers.
-This is the same as the standard syntax table except that ` and _
-are word characters, and math operators are punctuation
-characters.")
-
-;; Macro to generate efficient regexps for keyword matching
-;;
-;; These regular expressions treat the gnuplot vocabulary as complete
-;; words. Although gnuplot will recognise unique abbreviations, these
-;; regular expressions will not.
-(defmacro gnuplot-make-regexp (list)
- "Macro to generate efficient regexps for keyword matching from LIST."
- `(regexp-opt ,list 'words))
-
-;; Lists of gnuplot keywords for syntax coloring etc.
-(defvar gnuplot-keywords-builtin-functions
- '("abs" "acosh" "acos" "arg" "asinh" "asin" "atan" "atanh" "atan2" "besj1"
- "besj0" "besy1" "besy0" "ceil" "column" "cosh" "cos" "erfc" "erf" "exp"
- "floor" "gamma" "ibeta" "igamma" "imag" "int" "inverf" "invnorm" "lgamma"
- "log" "log10" "norm" "rand" "real" "sgn" "sinh" "sin" "sqrt" "tanh" "tan"
- "tm_hour" "tm_mday" "tm_min" "tm_mon" "tm_sec" "tm_wday" "tm_yday" "tm_year"
- "valid" "EllipticPi" "EllipticE" "EllipticK" "words" "word" "value"
- "timecolumn" "substr" "strstrt" "strptime" "strlen" "stringcolumn"
- "strftime" "sprintf" "lambertw" "gprintf" "exists" "defined" "columnhead")
-
- "List of GNUPLOT built-in functions, as strings.
-
-These are highlighted using `font-lock-function-name-face'.")
-
-(defvar gnuplot-keywords-plotting
- '("axes" "every" "index" "lw" "lt" "ls" "linestyle" "linetype" "linewidth"
- "notitle" "pt" "ps" "pointsize" "pointtype" "smooth" "thru" "title" "using"
- "with" "noautoscale" "volatile" "matrix" "nonuniform" "binary" "fillstyle"
- "linecolor" "pointinterval" "nosurface" "nocontours" "nohidden3d")
- "List of GNUPLOT keywords associated with plotting, as strings.
-
-These are highlighted using `font-lock-type-face'.
-This list does not include plotting styles -- for that, see
-`gnuplot-keywords-plotting-styles'")
-
-(defvar gnuplot-keywords-plotting-styles
- '("boxerrorbars" "boxes" "boxxyerrorbars" "candlesticks" "dots" "errorbars"
- "financebars" "fsteps" "histeps" "impulses" "lines" "linespoints" "points"
- "steps" "vector" "xerrorbars" "xyerrorbars" "yerrorbars" "vectors"
- "filledcurves" "labels" "rgbalpha" "rgbimage" "image" "circles" "pm3d"
- "histograms" "xyerrorlines" "xerrorlines" "errorlines" "yerrorlines")
-
- "List of GNUPLOT plotting styles, as strings.
-
-These are highlighted using `font-lock-function-name-face'.")
-
-(defvar gnuplot-keywords-misc
- '("bind" "cd" "clear" "exit" "fit" "help" "history" "load" "pause" "print"
- "pwd" "quit" "replot" "save" "set" "show" "unset" "if" "else" "do" "update"
- "undefine" "test" "system" "raise" "lower" "eval" "shell" "reset" "reread"
- "refresh" "call")
- "List of GNUPLOT miscellaneous commands, as strings.
-
-These are highlighted using `font-lock-constant-face'.")
-
-(defvar gnuplot-keywords-negatable-options
- '("arrow" "autoscale" "border" "clabel" "clip" "contour" "dgrid3d" "grid"
- "hidden3d" "historysize" "key" "label" "linestyle" "logscale" "mouse"
- "multiplot" "mx2tics" "mxtics" "my2tics" "mytics" "mztics" "offsets" "polar"
- "surface" "timestamp" "title" "x2dtics" "x2mtics" "x2tics" "x2zeroaxis"
- "xdtics" "xmtics" "xtics" "xzeroaxis" "y2dtics" "y2mtics" "y2tics"
- "y2zeroaxis" "ydtics" "ymtics" "ytics" "yzeroaxis" "zdtics" "zmtics" "ztics"
- "zzeroaxis")
-
- "List of gnuplot options which can be negated using `gnuplot-negate-option'.")
-
-(defvar gnuplot-negatable-options-regexp
- (gnuplot-make-regexp gnuplot-keywords-negatable-options))
-
-;; Set up colorization for gnuplot.
-;; This handles font-lock for emacs and xemacs.
-(defvar gnuplot-font-lock-keywords nil)
-(defvar gnuplot-font-lock-syntactic-keywords nil)
-(defvar gnuplot-font-lock-defaults nil)
-
-(when (featurep 'font-lock) ; <KL>
- (setq gnuplot-font-lock-keywords
- (list
- ;; stuff in brackets, sugg. by <LB>
- '("\\[\\([^]]+\\)\\]" 1 font-lock-constant-face)
-
- ;; variable/function definitions
- '("\\(\\(\\sw\\|\\s_\\)+\\s-*\\((\\s-*\\(\\sw\\|\\s_\\)*\\s-*\\(,\\s-*\\sw*\\)*\\s-*)\\)?\\s-*=\\)[^=]"
- 1 font-lock-variable-name-face)
-
- ;; built-in function names
- (cons (gnuplot-make-regexp gnuplot-keywords-builtin-functions)
- font-lock-function-name-face)
-
- ;; reserved words associated with plotting <AL>
- (cons (gnuplot-make-regexp gnuplot-keywords-plotting)
- font-lock-type-face)
- (cons (gnuplot-make-regexp gnuplot-keywords-plotting-styles)
- font-lock-function-name-face)
-
- ;; (s)plot -- also thing (s)plotted
- '("\\<s?plot\\>" . font-lock-keyword-face)
- ;; '("\\<s?plot\\s-+\\([^'\" ]+\\)[) \n,\\\\]"
- ;; 1 font-lock-variable-name-face)
-
- ;; other common commands
- (cons (gnuplot-make-regexp gnuplot-keywords-misc)
- font-lock-constant-face)
- (cons "!.*$" font-lock-constant-face))) ; what is this for? jjo
-
- (setq gnuplot-font-lock-defaults
- '(gnuplot-font-lock-keywords
- nil ; Use syntactic fontification
- t ; Use case folding
- nil ; No extra syntax
- ;; calls `gnuplot-beginning-of-continuation'
- ;; to find a safe place to begin syntactic highlighting
- beginning-of-defun))
-
- ;; Set up font-lock for Xemacs
- ;; For GNU Emacs, this is done in `gnuplot-mode'
- (if gnuplot-xemacs-p
- (put 'gnuplot-mode 'font-lock-defaults
- gnuplot-font-lock-defaults)))
-
-;; Some corner cases in Gnuplot's comment and string syntax are
-;; difficult to handle accurately using Emacs's built-in syntax tables
-;; and parser:
-;;
-;; - strings can continue over several lines, but only by using a
-;; backslash to escape the newline
-;;
-;; - double-quoted strings can contain escaped quotes, \", and escaped
-;; backslashes, \\; but in single-quoted strings the quote is
-;; escaped by doubling it, '', and backslash is only special at
-;; end-of-line
-;;
-;; - either type of string can end at newline without needing a
-;; - closing delimiter
-;;
-;; - comments continue over continuation lines
-;;
-;; The following syntax-propertize rules should accurately mark string
-;; and comment boundaries using the "generic string fence" and
-;; "generic comment fence" syntax properties. When syntax-propertize
-;; is unavailable (on Emacs versions <24), we fall back to using the
-;; normal syntax-table parser, which is accurate enough for most
-;; normal cases. (See the definition of `gnuplot-mode-syntax-table'.)
-(defalias 'gnuplot-syntax-propertize
- (when (fboundp 'syntax-propertize-rules)
- (syntax-propertize-rules
- ;; Double quoted strings
- ((rx
- (group "\"")
- (* (or (seq "\\" anything)
- (not (any "\"" "\n"))))
- (group (or "\"" "\n" buffer-end)))
- (1 "|") (2 "|"))
-
- ;; Single quoted strings
- ((rx
- (group "'")
- (* (or (seq "\\" "\n")
- "''"
- (not (any "'" "\n"))))
- (group (or "'" "\n" buffer-end)))
- (1 "|") (2 "|"))
-
- ;; Comments
- ((rx
- (group "#")
- (* (or (seq "\\" "\n")
- any))
- (or (group "\n") buffer-end))
- (1 "!") (2 "!")))))
-
-(defun gnuplot-syntax-propertize-extend-region (start end)
- "Expand the region to `syntax-propertize' for strings and comments.
-
-Region range is START to END.
-Ensures that the region being searched begins and ends outside of
-any lines continued with a backslash.
-
-This function is added to `syntax-propertize-extend-region-functions'
-in gnuplot-mode buffers."
- (let ((continuation-start
- (min start
- (gnuplot-point-at-beginning-of-continuation start)))
- (continuation-end
- (max end
- (gnuplot-point-at-end-of-continuation end))))
- (if (and (= continuation-start start)
- (= continuation-end end))
- nil
- (cons continuation-start continuation-end))))
-
-;; Parsing utilities to tell if we are inside a string or comment
-(defun gnuplot-in-string (&optional where)
- "Return non-nil if the text at WHERE is within a string.
-
-If WHERE is omitted, defaults to text at point.
-This is a simple wrapper for `syntax-ppss'."
- (save-excursion
- (let ((parse-state (gnuplot-syntax-ppss where)))
- (nth 3 parse-state))))
-
-(defun gnuplot-in-comment (&optional where)
- "Return non-nil if the text at WHERE is within a comment.
-
-If WHERE is omitted, defaults to text at point.
-This is a simple wrapper for `syntax-ppss'."
- (save-excursion
- (let ((parse-state (gnuplot-syntax-ppss where)))
- (nth 4 parse-state))))
-
-(defun gnuplot-in-string-or-comment (&optional where)
- "Return non-nil if the text at WHERE is within a string or comment.
-
-If WHERE is omitted, defaults to text at point.
-This is a simple wrapper for `syntax-ppss'."
-
- (save-excursion
- (let ((parse-state (gnuplot-syntax-ppss where)))
- (or (nth 3 parse-state)
- (nth 4 parse-state)))))
-
-;; these two lines get rid of an annoying compile time error
-;; message. that function gets non-trivially defalias-ed in
-;; gnuplot-toolbar.el
-;; (defun gnuplot-make-toolbar-dummy ())
-;; (defalias 'gnuplot-make-toolbar 'gnuplot-make-toolbar-dummy)
-
-
-;;; --- functions for sending commands to gnuplot
-
-(defun gnuplot-split-string (string)
- "Break STRING at each carriage return, returning a list of lines."
- (let ((list ()) (line "") (index 0))
- (while (< index (length string))
- (if (char-equal (elt string index) ?\n)
- (setq list (append list (list line))
- line "")
- (setq line (concat line (char-to-string (elt string index)))))
- (setq index (1+ index)))
- list))
-
-;; -- the calls to `sleep-for' are to allow enough time for gnuplot
-;; to write to the buffer before the next line is inserted
-;; -- note that the input string is split into lines and each line is
-;; sent to gnuplot individually. this is a bit slow, but it puts
-;; each line on the comint history.
-(defun gnuplot-send-string-to-gnuplot (string text)
- "Sends STRING to the gnuplot program.
-If no gnuplot process exists, a new one is created. TEXT indicates
-the type of text being sent to gnuplot and is typically one of
-nil, 'line, 'region, 'buffer, or 'file. TEXT may be useful for
-functions in `gnuplot-after-plot-hook'. `gnuplot-after-plot-hook' is
-called by this function after all of STRING is sent to gnuplot."
- (gnuplot-make-gnuplot-buffer) ; make sure a gnuplot buffer exists
- (gnuplot-fetch-version-number)
- (setq gnuplot-comint-recent-buffer (current-buffer))
-
- ;; Create a gnuplot frame if needed
- (if (equal gnuplot-display-process 'frame)
- (or (and gnuplot-process-frame
- (frame-live-p gnuplot-process-frame))
- (let ((frame (selected-frame)))
- (setq gnuplot-process-frame (make-frame))
- (select-frame gnuplot-process-frame)
- (switch-to-buffer gnuplot-buffer)
- (delete-other-windows)
- (select-frame frame))))
-
- (let ((list (gnuplot-split-string string)))
- (with-current-buffer (get-buffer gnuplot-buffer)
- (goto-char (point-max))
- ;; bruce asks: what is this next line for?
- (set-marker (process-mark gnuplot-process) (point-marker))
- (sleep-for (* 20 gnuplot-delay))
- (while list
- (insert (car list))
- (comint-send-input)
- (sleep-for gnuplot-delay)
- (setq list (cdr list))
- (goto-char (point-max))))
-
- (cond ((equal gnuplot-display-process 'window)
- (gnuplot-display-and-recenter-gnuplot-buffer))
- ((equal gnuplot-display-process 'frame)
- ;;(raise-frame gnuplot-process-frame)
- (with-selected-frame gnuplot-process-frame
- (gnuplot-display-and-recenter-gnuplot-buffer))))
-
- (setq gnuplot-recently-sent text)
- (run-hooks 'gnuplot-after-plot-hook)))
-
-(defun gnuplot-display-and-recenter-gnuplot-buffer ()
- "Make sure the gnuplot comint buffer is displayed.
-Move point to the end if necessary."
- (save-selected-window
- (select-window (display-buffer (get-buffer gnuplot-buffer)))
- (goto-char (point-max))
- (unless (pos-visible-in-window-p (point) (selected-window)) (recenter 5))))
-
-(defun gnuplot-send-region-to-gnuplot (&optional begin end text)
- "Sends a selected region to the gnuplot program.
-If BEGIN and END are not specified, point and mark are used. TEXT
-indicates the type of text being sent to gnuplot. This will be
-'region unless explicitly set by a function calling this one. Other
-typical values are of nil, 'line, 'buffer, or 'file. TEXT may be
-useful for function in `gnuplot-after-plot-hook'."
- (interactive "r")
- (let (string (txt (or text 'region)))
- (cond ((equal major-mode 'gnuplot-mode)
- (setq string (buffer-substring-no-properties begin end))
- (if (string= (substring string -1) "\n") ()
- (setq string (concat string "\n")))
- (gnuplot-send-string-to-gnuplot string txt))
- (t
- (message (concat "You can only send regions from "
- "gnuplot-mode buffers to gnuplot."))))))
-
-(defun gnuplot-send-line-to-gnuplot ()
- "Sends the current line to the gnuplot program.
-Respects continuation lines.
-This sets `gnuplot-recently-sent' to 'line."
- (interactive)
- (cond ((equal major-mode 'gnuplot-mode)
- (let (start end)
- (save-excursion
- ;; go to start of continued command, or beginning of line
- ;; if this is not a continuation of a previous line <JJO>
- (gnuplot-beginning-of-continuation)
- (setq start (point))
- (end-of-line)
- (while (save-excursion
- (backward-char)
- (looking-at "\\\\")) ; go to end of last continuation line
- (end-of-line 2))
- (beginning-of-line 2)
- (setq end (point)))
- (if (not (string-match "\\`\\s-*\\'"
- (buffer-substring-no-properties start end)))
- (gnuplot-send-region-to-gnuplot start end 'line))
- end))
- (t
- (message "You can only send lines in gnuplot-mode buffers to gnuplot.")
- nil)))
-
-;; I chose a very easy to type but slightly non-mnemonic key-binding
-;; for this (C-c C-v). It seems like the kind of thing one would want
-;; to do repeatedly without incurring RSI. 8^)
-(defun gnuplot-send-line-and-forward (&optional num)
- "Call `gnuplot-send-line-to-gnuplot' and move forward 1 line.
-You can use a numeric prefix to send more than one line. Blank lines and
-lines with only comments are skipped when moving forward.
-NUM is optional arg."
- (interactive "p")
- (let (end)
- (while (> num 0)
- (setq end (gnuplot-send-line-to-gnuplot))
- (goto-char end)
- (backward-char 1) ; <AR>
- (gnuplot-forward-script-line 1)
- (setq num (1- num)))))
-
-(defun gnuplot-send-line-and-newline ()
- "Call `gnuplot-send-line-to-gnuplot' and insert a new line."
- (interactive)
- (end-of-line)
- (gnuplot-send-line-to-gnuplot)
- (insert "\n"))
-
-(defun gnuplot-forward-script-line (&optional num) ; <SE>
- "Move forward my NUM script lines.
-Blank lines and commented lines are not included in the NUM count."
- (interactive "p")
- (while (> num 0)
- (and (not (eobp)) (forward-line 1))
- (while (and (not (eobp))
- (or (looking-at "^\\s-*$")
- (looking-at "^\\s-*#")))
- (forward-line 1))
- (setq num (1- num))))
-
-(defun gnuplot-send-buffer-to-gnuplot ()
- "Sends the entire buffer to the gnuplot program.
-This sets `gnuplot-recently-sent' to 'buffer."
- (interactive)
- (if (equal major-mode 'gnuplot-mode)
- (gnuplot-send-region-to-gnuplot (point-min) (point-max) 'buffer)
- (message "You can only send gnuplot-mode buffers to gnuplot.")))
-
-(defun gnuplot-send-file-to-gnuplot ()
- "Sends a selected file to the gnuplot program using the \"load\" command.
-This sets `gnuplot-recently-sent' to 'file."
- (interactive)
- (let ((string (read-file-name "Name of file to send to gnuplot > " nil nil t)))
- (setq string (concat "load '" (expand-file-name string) "'\n"))
- (message "%S" string)
- (gnuplot-make-gnuplot-buffer) ; make sure a gnuplot buffer exists
- (gnuplot-send-string-to-gnuplot string 'file)))
-
-;; suggested by <JS>
-(defun gnuplot-plot-from-comint ()
- "Send the contents of a script to gnuplot from the process buffer.
-This inserts the contents of the most recently used gnuplot script
-into the process buffer and sends those lines to gnuplot. It does
-this by copying the script line by line."
- (interactive)
- (if (not (buffer-live-p gnuplot-comint-recent-buffer))
- (message "Script buffer has been deleted.")
- (let (string list (buffer (current-buffer)))
- (set-buffer gnuplot-comint-recent-buffer)
- (setq string (buffer-substring-no-properties (point-min) (point-max))
- string (concat string "\n")
- list (gnuplot-split-string string))
- (set-buffer buffer)
- (while list
- (insert (car list))
- (comint-send-input)
- (sleep-for gnuplot-delay)
- (setq list (cdr list)))
- (comint-send-input))))
-
-(defun gnuplot-save-and-plot-from-comint ()
- "Send a current script to gnuplot from the process buffer.
-This sends the most recently used gnuplot script to gnuplot using the
-\"load\" command. This function first saves the script buffer to a
-file, prompting for a filename if one is not associated with the script
-buffer. Then it sends a load command to gnuplot using the name of the
-file visited by the script buffer."
- (interactive)
- (if (not (buffer-live-p gnuplot-comint-recent-buffer))
- (message "Script buffer has been deleted.")
- (let (fname)
- (with-current-buffer gnuplot-comint-recent-buffer
- (save-buffer)
- (setq fname (buffer-file-name)))
- (goto-char (point-max))
- (insert (format "load '%s'" fname))
- (comint-send-input))))
-
-(defun gnuplot-pop-to-recent-buffer ()
- "Switch to the most recently-plotted gnuplot script buffer."
- (interactive)
- (when (buffer-live-p gnuplot-comint-recent-buffer)
- (pop-to-buffer gnuplot-comint-recent-buffer)))
-
-(defun gnuplot-trim-gnuplot-buffer ()
- "Trim lines from the beginning of the *gnuplot* buffer.
-This keeps that buffer from growing excessively in size. Normally,
-this function is attached to `gnuplot-after-plot-hook'"
- (if (> gnuplot-buffer-max-size 0)
- (with-current-buffer gnuplot-buffer
- (let ((nlines (count-lines (point-min) (point-max)))
- (kill-whole-line t))
- (while (> nlines gnuplot-buffer-max-size)
- (goto-char (point-min))
- (kill-line)
- (setq nlines (1- nlines)))
- (goto-char (point-max))))))
-(add-hook 'gnuplot-after-plot-hook 'gnuplot-trim-gnuplot-buffer nil nil)
-
-
-;;; --- functions controlling the gnuplot process
-
-;; Menu for the comint-mode buffer
-(defvar gnuplot-comint-menu
- `("Gnuplot"
- ["Plot most recent gnuplot buffer" gnuplot-plot-from-comint
- (buffer-live-p gnuplot-comint-recent-buffer)]
- ["Save and plot most recent gnuplot buffer" gnuplot-save-and-plot-from-comint
- (buffer-live-p gnuplot-comint-recent-buffer)]
- "---"
- ,gnuplot-display-options-menu
- ["Contextual completion and help" gnuplot-context-sensitive-mode
- :style toggle
- :selected gnuplot-context-sensitive-mode]
- ["Echo area help (eldoc-mode)" eldoc-mode
- :active gnuplot-context-sensitive-mode
- :style toggle
- :selected eldoc-mode]
- "---"
- ["Insert filename at point" gnuplot-insert-filename t]
- ["Negate set option" gnuplot-negate-option t]
- ["Keyword help" gnuplot-info-lookup-symbol
- (or gnuplot-keywords gnuplot-keywords-pending)]
- ["Quick help for thing at point" gnuplot-help-function
- gnuplot-context-sensitive-mode]
- ["Info documentation on thing at point"
- gnuplot-info-at-point
- gnuplot-context-sensitive-mode]
- ["Switch to recent gnuplot script buffer" gnuplot-pop-to-recent-buffer
- (buffer-live-p gnuplot-comint-recent-buffer)]
- "---"
- ["Customize gnuplot" gnuplot-customize t]
- ["Show gnuplot-mode version" gnuplot-show-version t]
- ["Show gnuplot version" gnuplot-show-gnuplot-version t]
- "---"
- ["Kill gnuplot" gnuplot-kill-gnuplot-buffer t]))
-
-;; Major mode `gnuplot-comint-mode' for the interaction buffer
-(define-derived-mode gnuplot-comint-mode comint-mode "Gnuplot interaction"
- "Major mode for interacting with a gnuplot process in a buffer.
-
-This sets font-lock and keyword completion in the comint/gnuplot
-buffer."
-
- (set-syntax-table gnuplot-mode-syntax-table)
-
- (if gnuplot-xemacs-p ; deal with font-lock
- (if (fboundp 'turn-on-font-lock) (turn-on-font-lock))
- (progn
- (setq font-lock-defaults gnuplot-font-lock-defaults)
- (set (make-local-variable 'parse-sexp-lookup-properties) t)
- (set (make-local-variable 'syntax-propertize-function)
- #'gnuplot-syntax-propertize)))
-
- ;; XEmacs needs the call to make-local-hook
- (when (and (featurep 'xemacs)
- (fboundp 'make-local-hook))
- (make-local-hook 'kill-buffer-hook))
- (add-hook 'kill-buffer-hook 'gnuplot-close-down nil t)
-
- (add-hook 'comint-output-filter-functions
- 'comint-postoutput-scroll-to-bottom
- nil t)
- (add-hook 'comint-output-filter-functions
- 'gnuplot-protect-prompt-fn
- nil t)
-
- ;; Set up completion, using completion-at-point in recent Emacs,
- ;; comint-dynamic-complete in older Emacs
- (if (and (>= emacs-major-version 24)
- (>= emacs-minor-version 1))
- (add-hook 'completion-at-point-functions #'gnuplot-completion-at-point nil t)
- (add-hook 'comint-dynamic-complete-functions 'gnuplot-comint-complete nil t))
-
- ;; Set up menu (see below)
- (easy-menu-define
- gnuplot-comint-mode-menu gnuplot-comint-mode-map "Menu used in gnuplot-comint-mode"
- gnuplot-comint-menu)
- (easy-menu-add gnuplot-comint-mode-menu gnuplot-comint-mode-map))
-
-;; Key bindings for gnuplot-comint-mode
-(define-key gnuplot-comint-mode-map "\M-\C-p" 'gnuplot-plot-from-comint)
-(define-key gnuplot-comint-mode-map "\M-\C-f" 'gnuplot-save-and-plot-from-comint)
-(define-key gnuplot-comint-mode-map "\C-d" 'gnuplot-delchar-or-maybe-eof)
-(let ((completion-function
- (if (and (>= emacs-major-version 24)
- (>= emacs-minor-version 1))
- 'completion-at-point
- 'comint-dynamic-complete)))
- (define-key gnuplot-comint-mode-map "\M-\r" completion-function)
- (define-key gnuplot-comint-mode-map "\M-\t" completion-function))
-(define-key gnuplot-comint-mode-map "\C-c\C-d" 'gnuplot-info-lookup-symbol)
-(define-key gnuplot-comint-mode-map "\C-c\C-w" 'gnuplot-show-version)
-(define-key gnuplot-comint-mode-map "\C-c\C-i" 'gnuplot-insert-filename)
-(define-key gnuplot-comint-mode-map "\C-c\C-n" 'gnuplot-negate-option)
-(define-key gnuplot-comint-mode-map "\C-c\C-p" 'gnuplot-show-gnuplot-version)
-(define-key gnuplot-comint-mode-map "\C-c\C-z" 'gnuplot-customize)
-(define-key gnuplot-comint-mode-map "\C-c\C-e" 'gnuplot-pop-to-recent-buffer)
-(define-key gnuplot-comint-mode-map "\C-c\M-i" 'gnuplot-inline-image-mode)
-
-;; Menu for gnuplot-comint-mode
-(defvar gnuplot-comint-mode-menu nil
- "Menu for `gnuplot-comint-mode'.")
-
-;; Switch to the gnuplot program buffer
-(defun gnuplot-make-gnuplot-buffer ()
- "Switch to the gnuplot program buffer or create one if none exists."
- (unless (and gnuplot-process (eq (process-status gnuplot-process) 'run)
- gnuplot-buffer (buffer-live-p gnuplot-buffer))
- (message "Starting gnuplot plotting program...")
- (setq gnuplot-buffer (make-comint gnuplot-process-name gnuplot-program)
- gnuplot-process (get-buffer-process gnuplot-buffer))
- (gnuplot-set-process-query-on-exit-flag gnuplot-process nil)
- (with-current-buffer gnuplot-buffer
- (gnuplot-comint-mode)
- (when gnuplot-inline-image-mode
- (sleep-for gnuplot-delay)
- (gnuplot-setup-comint-for-image-mode)))
- (message "Starting gnuplot plotting program...Done")))
-
-
-(defun gnuplot-fetch-version-number ()
- "Determine the installed version of the gnuplot program.
-
-If `gnuplot-program-version' is already set, does nothing.
-Otherwise, runs `gnuplot-program' and searches the text printed
-at startup for a string like \"Version N.N\".
-
-Sets the variables `gnuplot-program-version',
-`gnuplot-program-major-version', `gnuplot-program-minor-version',
-and `gnuplot-three-eight-p'.
-
-If the version number cannot be determined by this method, it
-defaults to 3.7."
- (unless gnuplot-program-version
- (message "gnuplot-mode %s -- determining gnuplot version ......"
- gnuplot-version)
- (with-temp-buffer
- (insert "show version")
- (call-process-region (point-min) (point-max)
- gnuplot-program t (current-buffer))
- (goto-char (point-min))
- (if (and (re-search-forward "[Vv]ersion\\s-+" (point-max) t)
- (looking-at "\\([0-9]\\)\\.\\([0-9]+\\)"))
- (progn
- (setq gnuplot-program-version (match-string 0)
- gnuplot-program-major-version (string-to-number
- (match-string 1))
- gnuplot-program-minor-version (string-to-number
- (match-string 2))
- gnuplot-three-eight-p
- (>= (string-to-number gnuplot-program-version) 3.8)))
-
- ;; Guess v3.7 if something went wrong
- (message "Warning: could not determine gnuplot version, guessing 3.7")
- (setq gnuplot-program-version "3.7"
- gnuplot-program-major-version 3
- gnuplot-program-minor-version 7
- gnuplot-three-eight-p nil)))
-
- ;; Setup stuff that depends on version number
- (gnuplot-setup-menu-and-toolbar)))
-
-(defun gnuplot-setup-menu-and-toolbar ()
- "Setup stuff that depends on version number."
- ;; set up the menubar (possibly dependent on version number)
- (gnuplot-setup-menubar)
- ;; set up the toolbar (possibly dependent on version number)
- (if (and gnuplot-xemacs-p gnuplot-toolbar-display-flag)
- (condition-case () ; deal with the toolbar
- (and (require 'toolbar)
- (require 'xpm)
- (gnuplot-make-toolbar-function))
- (error nil)))
- (message "gnuplot-mode %s (gnuplot %s) -- report bugs as issues at %s"
- gnuplot-version gnuplot-program-version
- gnuplot-maintainer-url))
-
-(defvar gnuplot-prompt-regexp
- (regexp-opt '("gnuplot> " "multiplot> "))
- "Regexp for recognizing the GNUPLOT prompt.")
-
-(defun gnuplot-protect-prompt-fn (string)
- "Prevent the Gnuplot prompt from being deleted or overwritten.
-STRING is the text as originally inserted in the comint buffer."
- (save-excursion
- (let ((b (progn
- (goto-char (point-max))
- (beginning-of-line)
- (point)))
- e)
- (if (re-search-forward gnuplot-prompt-regexp (point-max) t)
- (progn
- (setq e (point))
- (put-text-property b e 'rear-nonsticky '(read-only intangible face))
- (put-text-property b e 'intangible t)
- (put-text-property b e 'face 'gnuplot-prompt-face)
- ;;(put-text-property b e 'read-only t)
- )))))
-
-(defun gnuplot-close-down ()
- "Tidy up when deleting the gnuplot buffer."
- (if (and gnuplot-process
- (eq (process-status gnuplot-process) 'run)) ; <SE>
- (kill-process gnuplot-process))
- (setq gnuplot-process nil
- gnuplot-buffer nil))
-
-(defun gnuplot-delchar-or-maybe-eof (arg)
- "Delete ARG characters forward, or (if at eob) send an EOF to subprocess.
-This is very similar to `comint-delchar-or-maybe-eof'."
- (interactive "p")
- (if (eobp)
- (gnuplot-kill-gnuplot-buffer)
- (delete-char arg)))
-
-(defun gnuplot-kill-gnuplot-buffer ()
- "Kill the gnuplot process and its display buffers."
- (interactive)
- (if (and gnuplot-process
- (eq (process-status gnuplot-process) 'run)) ;; <SE>
- (kill-process gnuplot-process))
- (if (and gnuplot-buffer (get-buffer gnuplot-buffer))
- (progn
- (if (one-window-p) ()
- (delete-window (get-buffer-window gnuplot-buffer)))
- (kill-buffer gnuplot-buffer)))
- (setq gnuplot-process nil
- gnuplot-buffer nil))
-
-
-(defun gnuplot-show-gnuplot-buffer ()
- "Switch to the buffer containing the gnuplot process.
-When `gnuplot-display-process' is nil this will switch to
-the gnuplot process buffer. When that variable is non-nil, the
-gnuplot process buffer will be displayed in a window."
- (interactive)
- (unless (and gnuplot-buffer (get-buffer gnuplot-buffer))
- (gnuplot-make-gnuplot-buffer))
- (cond ((equal gnuplot-display-process 'window)
- (switch-to-buffer-other-window gnuplot-buffer))
- ((equal gnuplot-display-process 'frame)
- (or (and gnuplot-process-frame
- (frame-live-p gnuplot-process-frame))
- (setq gnuplot-process-frame (make-frame)))
- (raise-frame gnuplot-process-frame)
- (select-frame gnuplot-process-frame)
- (switch-to-buffer gnuplot-buffer))
- (t
- (switch-to-buffer gnuplot-buffer))))
-
-
-;;; Support for displaying plotted images within Emacs
-
-(defvar gnuplot-inline-image-filename nil
- "Name of the current Gnuplot output file.")
-
-(defvar gnuplot-image-buffer-name "*gnuplot output*")
-
-(defun gnuplot-display-images-p ()
- "Inline images require GNU Emacs."
- (and (not (featurep 'xemacs))
- (fboundp 'display-images-p)
- (display-images-p)))
-
-(defun gnuplot-external-display-mode ()
- "Display image in external."
- (interactive)
- (gnuplot-set-display-mode 'gnuplot-inline-image-mode nil))
-
-(defun gnuplot-inline-display-mode ()
- "Display image in inline."
- (interactive)
- (gnuplot-set-display-mode 'gnuplot-inline-image-mode 'inline))
-
-(defun gnuplot-dedicated-display-mode ()
- "Display image in dedicated."
- (interactive)
- (gnuplot-set-display-mode 'gnuplot-inline-image-mode 'dedicated))
-
-(defun gnuplot-set-image-format (format)
- "Display image in FORMAT."
- (interactive "sGnuplot image format: ")
- (gnuplot-set-display-mode 'gnuplot-image-format format)
- (unless gnuplot-inline-image-mode
- (message "Setting will take effect when plots are displayed in Emacs")))
-
-(defun gnuplot-setup-comint-for-image-mode ()
- "Setup comint for image."
- (when (and gnuplot-buffer (buffer-live-p gnuplot-buffer)
- (get-buffer-process gnuplot-buffer))
- (with-current-buffer gnuplot-buffer
- (if gnuplot-inline-image-mode
- (progn
- (gnuplot-send-hiding-output
- (format "set terminal %s\n" gnuplot-image-format))
- (gnuplot-inline-image-set-output)
- (add-hook 'comint-output-filter-functions
- 'gnuplot-insert-inline-image-output nil t))
- (gnuplot-send-hiding-output "set terminal pop\n")
- (remove-hook 'comint-output-filter-functions
- 'gnuplot-insert-inline-image-output t)))))
-
-(defun gnuplot-inline-image-set-output ()
- "Set Gnuplot's output file to `gnuplot-inline-image-filename'."
- (let ((tmp (make-temp-file "gnuplot")))
- (setq gnuplot-inline-image-filename tmp)
- (gnuplot-send-hiding-output (format "set output '%s'\n" tmp))))
-
-(defvar gnuplot-inhibit-filter nil)
-
-(defun gnuplot-insert-inline-image-output (string)
- "Insert Gnuplot graphical output STRING in the gnuplot-comint buffer.
-
-Called via `comint-preoutput-filter-functions' hook when
-`gnuplot-inline-image-mode' is enabled. Checks the status of the
-file `gnuplot-inline-image-filename'; if it exists and has
-nonzero size, inserts it as an inline image, stores a new
-temporary filename in `gnuplot-inline-image-filename', and
-updates Gnuplot with the appropriate 'set output' command."
- (unless gnuplot-inhibit-filter ; Prevent recursively entering this filter
- (let ((gnuplot-inhibit-filter t)) ; (causing an infinite loop)
- (save-excursion
- (goto-char (point-max))
- (beginning-of-line)
- (when (looking-at gnuplot-prompt-regexp)
- (let* ((filename gnuplot-inline-image-filename)
- (size (nth 7 (file-attributes filename))))
- (when (and size (> size 0))
- (gnuplot-send-hiding-output "set output\n") ; Flush output file
- (sit-for 0.1) ; Hack: wait for Gnuplot IO to finish
- (ecase gnuplot-inline-image-mode
- (nil nil)
- (inline
- (ignore-errors
- (let ((image (create-image filename)))
- (beginning-of-line)
- (insert-image image)
- (insert "\n")
- (gnuplot-inline-image-set-output))))
- (dedicated
- (with-current-buffer
- (get-buffer-create gnuplot-image-buffer-name)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert-file-contents filename)
- (ignore-errors (normal-mode))
- (display-buffer (current-buffer))
- (gnuplot-inline-image-set-output))))))))))))
-
-;;; Send commands to GNUPLOT silently & without generating an extra prompt
-(defvar gnuplot-hidden-output-buffer " *gnuplot output*")
-
-(defun gnuplot-send-hiding-output (string)
- "Send STRING to the running Gnuplot process invisibly."
- (with-current-buffer gnuplot-buffer
- (add-hook 'comint-preoutput-filter-functions
- 'gnuplot-discard-output nil t))
- (with-current-buffer (get-buffer-create gnuplot-hidden-output-buffer)
- (erase-buffer))
- (comint-send-string (get-buffer-process gnuplot-buffer) string))
-
-(defun gnuplot-discard-output (string)
- "Temporary preoutput filter for hiding Gnuplot output & prompt.
-Accumulates output STRING in a buffer until it finds the next prompt,
-then removes itself from `comint-preoutput-filter-functions'."
- (with-current-buffer
- (get-buffer-create gnuplot-hidden-output-buffer)
- (insert string)
- (when (looking-back gnuplot-prompt-regexp (point-min))
- (with-current-buffer gnuplot-buffer
- (remove-hook 'comint-preoutput-filter-functions
- 'gnuplot-discard-output t))))
- "")
-
-
-
-;;; --- miscellaneous functions: insert file name, indentation, negation
-
-(defun gnuplot-insert-filename ()
- "Insert a filename at point, prompting for name in the minibuffer.
-This inserts a filename relative to the buffer's default directory.
-Uses completion and the value of `gnuplot-quote-character'.
-Bound to \\[gnuplot-insert-filename]"
- (interactive)
- (insert gnuplot-quote-character
- (file-relative-name (read-file-name "Filename > " "")
- default-directory)
- gnuplot-quote-character))
-
-
-;; Adjust indentation for the line containing point
-(defun gnuplot-indent-line ()
- "Set indentation in gnuplot buffer.
-For most lines, set indentation to previous level of indentation.
-Add additional indentation for continuation lines."
- (interactive)
- (let (indent)
- (if (gnuplot-in-string (point-at-bol))
- ;; Continued strings begin at left margin
- (setq indent 0)
- (save-excursion
- (if (gnuplot-continuation-line-p)
- ;; This is a continuation line. Indent to the same level as
- ;; the second word on the line beginning this command (i.e.,
- ;; the first non-whitespace character after whitespace)
- (progn
- (gnuplot-beginning-of-continuation)
- (back-to-indentation)
- (re-search-forward "\\S-+\\s-+" (point-at-eol) 'end-at-limit)
- (setq indent (current-column)))
-
- ;; Not a continuation line; indent according to block
- ;; nesting depth
- (save-excursion
- (condition-case nil
- (progn
- (beginning-of-line)
- (skip-syntax-forward "-" (point-at-eol))
- (if (looking-at "\\s)") (forward-char))
- (backward-up-list)
- (gnuplot-beginning-of-continuation)
- (setq indent (+ gnuplot-basic-offset (current-indentation))))
- (error
- (setq indent 0)))))))
-
- ;; Set indentation
- (save-excursion
- (indent-line-to indent))
-
- ;; Move point after indentation when at beginning of line
- (when (< (current-column) indent)
- (move-to-column indent))))
-
-(defun gnuplot-electric-insert (BRACE)
- "Adjust indentation on inserting a close BRACE.
-The blink-paren fix is stolen from cc-mode"
- (interactive "*p")
- (let ((old-blink-paren blink-paren-function)
- (blink-paren-function nil))
- (self-insert-command BRACE)
- (gnuplot-indent-line)
- (when old-blink-paren (funcall old-blink-paren))))
-
-;;
-;; Functions for finding the start and end of continuation blocks
-;;
-
-;; Check if line containing point is a continuation
-(defun gnuplot-continuation-line-p ()
- "Return t if the line containing point is a continuation of the previous line."
- (save-excursion
- (condition-case ()
- (progn
- (end-of-line 0)
- (backward-char)
- (looking-at "\\\\"))
- (error nil))))
-
-;; Move point to start of continuation block
-(defun gnuplot-beginning-of-continuation ()
- "Move point to the beginning of the continuation lines containing point.
-
-If not in a continuation line, move point to beginning of line."
- (beginning-of-line)
- (while (gnuplot-continuation-line-p)
- (beginning-of-line 0)))
-
-;; Move point to end of continuation block
-(defun gnuplot-end-of-continuation ()
- "Move point to the end of the continuation lines containing point.
-
-If there are no continuation lines, move point to `end-of-line'."
- (end-of-line)
- (unless (bobp)
- (catch 'eob
- (while (save-excursion (backward-char)
- (looking-at "\\\\"))
- (end-of-line 2)
- (if (eobp) (throw 'eob nil))))))
-
-;; Save-excursion wrappers for the above to return point at beginning
-;; or end of continuation
-(defun gnuplot-point-at-beginning-of-continuation (&optional pos)
- "Return value of point at beginning of the continued block containing point.
-
-If there are no continuation lines, returns `point-at-bol'.
-If specify POS, move POS befere execution."
- (save-excursion
- (when pos (goto-char pos))
- (gnuplot-beginning-of-continuation)
- (point)))
-
-(defun gnuplot-point-at-end-of-continuation (&optional pos)
- "Return value of point at the end of the continued block containing point.
-
-If there are no continuation lines, returns `point-at-eol'.
-If specify POS, move POS before execution."
- (save-excursion
- (when pos (goto-char pos))
- (gnuplot-end-of-continuation)
- (point)))
-
-(defun gnuplot-beginning-of-defun (&optional arg)
- "We also treat a block of continuation lines as a `defun'.
-ARG is optional arg."
- (if (not arg) (setq arg 1))
- (if (> arg 0)
- (catch 'bob ; go to beginning of ARGth prev. defun
- (dotimes (n arg)
- (when (= (point)
- (gnuplot-point-at-beginning-of-continuation))
- (forward-line -1)
- (if (bobp) (throw 'bob t))
- (while (looking-at "^\\s-*$")
- (forward-line -1)
- (if (bobp) (throw 'bob t))))
- (gnuplot-beginning-of-continuation))
- t)
-
- (catch 'eob ; find beginning of (-ARG)th following defun
- (dotimes (n (- arg))
- (gnuplot-end-of-continuation)
- (forward-line)
- (if (eobp) (throw 'eob t))
- (while (looking-at "^\\s-*$")
- (forward-line)
- (if (eobp) (throw 'eob t)))))))
-
-;; Movement to start or end of command, including multiple commands
-;; separated by semicolons
-(defun gnuplot-beginning-of-command ()
- "Move point to beginning of command containing point."
- (let ((limit (gnuplot-point-at-beginning-of-continuation)))
- (while
- (and
- (search-backward ";" limit 'lim)
- (gnuplot-in-string-or-comment)))
- (skip-chars-forward ";")
- (skip-syntax-forward "-")))
-
-(defun gnuplot-end-of-command ()
- "Move point to end of command containing point."
- (let ((limit (gnuplot-point-at-end-of-continuation)))
- (while
- (and
- (search-forward ";" limit 'lim)
- (gnuplot-in-string-or-comment)))
- (skip-chars-backward ";")
- (skip-syntax-backward "-")))
-
-(defun gnuplot-point-at-beginning-of-command ()
- "Return position at the beginning of command containing point."
- (save-excursion (gnuplot-beginning-of-command) (point)))
-
-(defun gnuplot-point-at-end-of-command ()
- "Return position at the end of command containing point."
- (save-excursion (gnuplot-end-of-command) (point)))
-
-(defun gnuplot-negate-option ()
- "Append \"no\" to or remove \"no\" from the set option on the current line.
-This checks if the set option is one which has a negated form.
-
-Negatable options are defined in `gnuplot-keywords-negatable-options'."
- (interactive)
- (gnuplot-fetch-version-number)
- (let ((begin (gnuplot-point-at-beginning-of-command))
- (end (gnuplot-point-at-end-of-command))
- (regex gnuplot-negatable-options-regexp))
- (save-excursion
- (goto-char begin)
- (skip-syntax-forward "-" end)
- (if (looking-at "\\(un\\)?set\\s-+")
- (cond ((> (string-to-number gnuplot-program-version) 3.7)
- (cond ((looking-at "unset")
- (delete-char 2))
- ((looking-at (concat "set\\s-+\\(" regex "\\)"))
- (insert "un"))
- (t
- (message "There is not a negatable set option on this line"))))
- (t
- (goto-char (match-end 0))
- (if (> (point) end) (goto-char end))
- (cond ((looking-at "no")
- (delete-char 2))
- ((looking-at regex)
- (insert "no"))
- (t
- (message "There is not a negatable set option on this line")))))
- (message "There is not a set option on this line")))))
-
-;; (defun gnuplot-set-binding ()
-;; "Interactively select a key sequence for binding to a plot function.
-;; This is only useful in gnuplot 3.8 and for plot terminals which support
-;; key bindings (i.e. those covered by pm3d)."
-;; (interactive)
-;; (let ((keyseq (read-key-sequence "Choose a key sequence now"))
-;; (command (read-string "Bind to this command > ")))
-;; (setq keyseq (format "%S" keyseq))
-;; (string-match "keypress-event\\s-+" keyseq)
-;; (setq keyseq (substring keyseq (match-end 0) -2))
-;; ;; need to convert from emacs nomenclature to gnuplot. what a pain.
-;; (let* ((alist '(("backspace" . "Backspace") ("tab" . "Tab") ("linefeed" . "Linefeed")
-;; ("clear" . "Clear") ("return" . "Return") ("pause" . "Pause")
-;; ("scroll-lock" . "Scroll_Lock") ("SysReq" . "sys-req")
-;; ("escape" . "Escape") ("delete" . "Delete") ("home" . "Home")
-;; ("left" . "Left") ("right" . "Right") ("up" . "Up") ("down" . "Down")
-;; ("prior" . "PageUp") ("next" . "PageDown") ("end" . "End")
-;; ("begin". "Begin")))
-;; (match (assoc keyseq alist)))
-;; (if match (setq keyseq (cdr match)))
-;;
-;; (insert (format "bind \"%s\" \"%s\"" keyseq command)))))
-
-
-(defun gnuplot-customize ()
- "Customize `gnuplot-mode'."
- (interactive)
- (if (fboundp 'customize-group)
- (customize-group "gnuplot")
- (message "The Custom library is not installed.")))
-
-
-
-;;; --- help from the info file, keyword list + completion, insert function
-
-
-;; set up stuff for info-look (as suggested by <SE>)
-;; modified with suggestion from <MS>
-(defun gnuplot-setup-info-look ()
- "Setup info-look in the gnuplot buffer.
-
-Also set the variable `gnuplot-keywords' and do something sensible if
-info-look was not available.
-See the comments in `gnuplot-info-hook'."
- (interactive)
- (setq gnuplot-keywords-pending nil)
- (if (featurep 'info-look)
- (progn
- (gnuplot-fetch-version-number)
-
- ;; In the absence of evidence to the contrary, I'm guessing
- ;; the info file layout changed with gnuplot version 4 <jjo>
- (let ((doc-spec
- (if (>= (string-to-number gnuplot-program-version) 4.0)
- ;; New info-file layout - works with gnuplot 4.4
- '(("(gnuplot)Command_Index" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)Options_Index" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)Function_Index" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)Terminal_Index" nil "[_a-zA-Z0-9]+"))
-
- ;; Old info-file layout
- '(("(gnuplot)Top" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)Commands" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)Functions" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)plot" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)set-show" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)data-file" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)smooth" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)style" nil "[_a-zA-Z0-9]+")
- ("(gnuplot)terminal" nil "[_a-zA-Z0-9]+")))))
- (cond ((boundp 'info-lookup-symbol-alist) ; older info-lookup version
- (setq info-lookup-symbol-alist
- (append
- info-lookup-symbol-alist
- `((gnuplot-mode
- "[a-zA-Z][_a-zA-Z0-9]*" nil
- ,doc-spec "[_a-zA-Z0-9]+" )))))
- (t ; newer version
- (info-lookup-add-help
- :mode 'gnuplot-mode :topic 'symbol
- :regexp "[a-zA-Z][_a-zA-Z0-9]*"
- :doc-spec doc-spec)
- ;; allow help lookup from the comint buffer as well <jjo>
- (info-lookup-add-help
- :mode 'gnuplot-comint-mode :topic 'symbol
- :regexp "[a-zA-Z][_a-zA-Z0-9]*"
- :doc-spec doc-spec))))
-
- ;; this hook is my best way of working with info-look and
- ;; allowing multiple versions of the gnuplot-info file.
- ;; yes, this is a hassle.
- (run-hooks 'gnuplot-info-hook)
- (let ((there (bufferp (get-buffer "*info*"))))
- (info-lookup-setup-mode 'symbol 'gnuplot-mode)
- (or there (and (get-buffer "*info*") (kill-buffer "*info*")))
- ;; why are these buffers here? I think that the general
- ;; user will not want them lying around
- (and (get-buffer "info dir") (kill-buffer "info dir"))
- (and (get-buffer "info dir<2>") (kill-buffer "info dir<2>")))
- (setq gnuplot-keywords (gnuplot-set-keywords-list))
- (setq gnuplot-keywords-alist ; needed for all-completions
- (mapcar 'list gnuplot-keywords)))
-
- ;; or do something sensible if info-look is not installed
- (defun info-lookup-interactive-arguments (symbol)
- (message
- "Help is not available. info-look.el is not installed.")
- (list nil nil))))
-
-
-(defun gnuplot-set-keywords-list ()
- "Set `gnuplot-keywords' from `info-lookup-cache'.
-Return a list of keywords."
- (let* ((list (cdr (assoc 'symbol info-lookup-cache)))
- (list (cdr (cdr (assoc 'gnuplot-mode list))))
- (list (car list))
- (store ()) item)
- (while list
- (setq item (car (car list))
- item (format "%s" item) ; keep this line for the sake of
- store (append (list item) store) ; info-look.el w/o my patch
- list (cdr list)))
- (delete "nil" store)
- store ))
-
-
-;;;; Completion at point and Eldoc.
-
-;; There are two alternative completion-at-point mechanisms: the old
-;; one using info-look and the new one (enabled by default) which
-;; parses the command line to provide smarter completions.
-
-;; `gnuplot-completion-at-point-function' defines which one is
-;; used. `gnuplot-context-sensitive-mode' toggles between the two.
-
-(defvar gnuplot-completion-at-point-function #'gnuplot-completion-at-point-info-look
- "Function to call to perform completion in Gnuplot buffers.")
-
-(defun gnuplot-completion-at-point ()
- "Perform completion in Gnuplot buffers."
- (funcall gnuplot-completion-at-point-function))
-
-(defvar gnuplot-eldoc-hash nil
- "ElDoc strings for gnuplot-mode.
-
-These have to be compiled from the Gnuplot source tree using
-`doc2texi.el'.")
-
-;; Enable and disable context-sensitive completion
-(define-minor-mode gnuplot-context-sensitive-mode
- "Use context-sensitive completion and help in gnuplot-mode.
-
-When context-sensitive mode is enabled, gnuplot-mode tries to
-provide more useful completions and help suggestions for built-in
-keywords and functions by parsing each command as you type. It
-attempts to take into account Gnuplot's many abbreviated
-keywords. For example, with point at the end of a line reading
-\"plot 'datafile' w \", typing \\[completion-at-point] will pop
-up a list of plotting styles.
-
-Key bindings:
-
-\\[completion-at-point] will complete the keyword at point based
-on its context in the command. To make keyword completion work on
-pressing TAB, set `tab-always-indent' to `complete', or customize
-`gnuplot-tab-completion' to make this automatic in gnuplot-mode
-buffers.
-
-\\[gnuplot-info-at-point] will try to find the most relevant
-Gnuplot info node for the construction at point, prompting for a
-node name if nothing is found.
-
-\\[gnuplot-help-function] will pop up a brief summary of the
-syntax at point in the minibuffer. To have one-line syntax
-summaries appear in the echo area as you type, toggle
-`eldoc-mode' or customize `gnuplot-eldoc-mode'.
-
-To choose whether to use this mode by default in Gnuplot buffers,
-customize the variable
-`gnuplot-use-context-sensitive-completion'.
-
-Note: help strings for eldoc-mode and \\[gnuplot-help-function]
-need to be provided in an Emacs-readable form by the Gnuplot
-distribution. See gnuplot-context.el for details."
- :keymap
- `((,(kbd "C-c C-/") . gnuplot-help-function)
- (,(kbd "C-c C-d") . gnuplot-info-at-point))
- (unless (derived-mode-p 'gnuplot-mode 'gnuplot-comint-mode)
- (message "Gnuplot context-sensitive mode works only in Gnuplot-mode buffers")
- (setq gnuplot-context-sensitive-mode nil))
- (if gnuplot-context-sensitive-mode
- ;; Turn on
- (progn
- (load-library "gnuplot-context")
- (load-library "eldoc")
- (setq gnuplot-completion-at-point-function #'gnuplot-context-completion-at-point)
-
- ;; Setup Eldoc
- (set (make-local-variable 'eldoc-documentation-function)
- 'gnuplot-eldoc-function)
- (eldoc-add-command 'completion-at-point) ; Check for eldoc after completion
- (when (fboundp 'comint-dynamic-complete)
- (eldoc-add-command 'comint-dynamic-complete))
-
- ;; Try to load Eldoc strings
- (when gnuplot-eldoc-mode
- (unless gnuplot-eldoc-hash
- (condition-case nil
- (load-library "gnuplot-eldoc")
- (error
- (message "gnuplot-eldoc.el not found. Install it from the Gnuplot distribution.")
- (setq gnuplot-eldoc-hash nil
- gnuplot-eldoc-mode nil))))
-
- (if gnuplot-eldoc-hash
- (eldoc-mode 1)
- (eldoc-mode 0)))
-
- ;; Set up tab-to-complete
- (when gnuplot-tab-completion
- (set (make-local-variable 'tab-always-indent) 'complete))
-
- (message "Gnuplot context-sensitive help & completion enabled."))
-
- ;; Turn off
- (setq gnuplot-completion-at-point-function #'gnuplot-completion-at-point-info-look)
- (setq eldoc-documentation-function nil)
- (eldoc-mode 0)
- (message "Gnuplot context-sensitive help & completion disabled.")))
-
-;; Older completion method using info-look
-(defun gnuplot-completion-at-point-info-look ()
- "Return completions of keyword preceding point.
-
-Uses the cache of keywords generated by info-lookup. See
-`gnuplot-setup-info-look'. If non-nil, the return value is in the form
-\(BEGIN END COMPLETIONS) where BEGIN and END are buffer
-positions and COMPLETIONS is a list."
-
- (if gnuplot-keywords-pending ; <HW>
- (gnuplot-setup-info-look))
- (let* ((end (point))
- (beg (condition-case _err
- (save-excursion (backward-sexp 1) (point))
- (error (point))))
- (patt (buffer-substring beg end))
- (pattern (if (string-match "\\([^ \t]*\\)\\s-+$" patt)
- (match-string 1 patt) patt))
- (completions (all-completions pattern gnuplot-keywords-alist)))
- (if completions
- (list beg end completions)
- (message "No gnuplot keywords complete '%s'" pattern)
- nil)))
-
-(defun gnuplot-comint-complete ()
- "Complete the keyword preceding point in the gnuplot comint buffer.
-
-This is only used in Emacs versions before 24.1."
- (let ((completions (gnuplot-completion-at-point)))
- (if completions
- (let* ((beg (nth 0 completions))
- (end (nth 1 completions))
- (candidates (nth 2 completions))
- (completion-base-position (list beg end)))
- (comint-dynamic-simple-complete
- (buffer-substring-no-properties beg end)
- candidates))
- nil)))
-
-
-(defun gnuplot-info-lookup-symbol (symbol &optional mode)
- "Wrapper for `info-lookup-symbol'.
-Takes SYMBOL and MODE as arguments exactly as
-`info-lookup-symbol'. After doing the info lookup, calls
-`gnuplot--adjust-info-display' to display the info buffer
-according to the value of `gnuplot-info-display'."
- (interactive
- (cond (gnuplot-keywords
- (info-lookup-interactive-arguments 'symbol))
- (gnuplot-keywords-pending ; <HW>
- (gnuplot-setup-info-look)
- (info-lookup-interactive-arguments 'symbol))
- (t
- (list nil (message
- "Help is not available. The gnuplot info file could not be found.")))))
-
- (when (and (featurep 'info-look) gnuplot-keywords)
- (unless symbol (setq symbol "Commands"))
- (save-window-excursion
- (info-lookup-symbol symbol mode))
- (gnuplot--adjust-info-display)))
-
-(defun gnuplot--adjust-info-display ()
- "Displays the *info* buffer in a window or frame.
-Specified by the value of `gnuplot-info-display'.
-If `gnuplot-info-display' is 'window, then the window will be
-shrunk to the size of the info entry if it is smaller than half
-the height of the frame.
-
-The *info* buffer should already exist when this function is
-called."
- (case gnuplot-info-display
- (window
- (switch-to-buffer-other-window "*info*")
- ;; Adjust window height only if the frame is split
- ;; horizontally, so as not to mess up the minibuffer <jjo>
- ;; we can't use shrink-window-if-larger-than-buffer here
- ;; because it doesn't work with Info mode's narrowing
- (with-selected-window (get-buffer-window "*info*")
- (unless (gnuplot-window-full-height-p)
- (enlarge-window
- (min (- (count-lines (point-min) (point-max)) (window-height) -1)
- (- (/ (frame-height) 2) (window-height)))))))
-
- (frame
- (unless (and gnuplot-info-frame
- (frame-live-p gnuplot-info-frame))
- (setq gnuplot-info-frame (make-frame)))
- (select-frame gnuplot-info-frame)
- (raise-frame gnuplot-info-frame)
- (if gnuplot-xemacs-p (setq toolbar-info-frame gnuplot-info-frame))
- (switch-to-buffer "*info*"))
-
- (t
- (switch-to-buffer "*info*"))))
-
-(defun gnuplot-insert (string)
- "Insert STRING at point and display help for for STRING.
-Help is not shown if `gnuplot-insertions-show-help-flag' is nil. The
-help shown is for STRING unless STRING begins with the word \"set\" or
-\"show\", in which case help is shown for the thing being set or
-shown."
- (interactive)
- (cond ((and (not gnuplot-three-eight-p)
- (string-match "\\(emf\\|p\\(alette\\|m3d\\)\\|vgagl\\)" string))
- (message "%S is an option introduced in gnuplot 3.8 (You are using %s)"
- string gnuplot-program-version))
- (t
- (insert string)
- (let ((topic string) term)
- (if (string-match
- "\\(set\\|show\\)[ \t]+\\([^ \t]+\\)\\(\\s-+\\([^ \t]+\\)\\)?"
- string)
- (progn
- (setq topic (downcase (match-string 2 string))
- term (match-string 4 string))
- (if (string= topic "terminal") (setq topic (downcase term)))))
- (cond ((and (fboundp 'gnuplot-gui-set-options-and-insert)
- gnuplot-gui-popup-flag)
- (gnuplot-gui-set-options-and-insert))
- (gnuplot-insertions-show-help-flag
- (if gnuplot-keywords-pending ; <HW>
- (gnuplot-setup-info-look))
- (gnuplot-info-lookup-symbol topic)))))))
-
-(defun gnuplot-toggle-info-display ()
- "Toggle info display."
- (interactive)
- (setq gnuplot-insertions-show-help-flag (not gnuplot-insertions-show-help-flag))
- (message (if gnuplot-insertions-show-help-flag
- "Help will be displayed after insertions."
- "Help no longer displayed after insertions.")))
-
-
-;;; --- autoloaded functions: gnuplot-mode and gnuplot-make-buffer
-
-;;;###autoload
-(defun gnuplot-mode ()
- "Major mode for editing and executing GNUPLOT scripts.
-This was written with version 4.6 of gnuplot in mind, but should
-work with newer and older versions.
-
-Report bugs at https://github.com/emacsorphanage/gnuplot/issues
-
- ------O------
-
-Gnuplot-mode includes two different systems for keyword
-completion and documentation lookup: a newer one,
-`gnuplot-context-sensitive-mode' (enabled by default), and a
-older one which extracts keywords from gnuplot's Info file. Both
-systems allow looking up documentation in the Info file. The
-older system also depends having the info file properly installed
-to make a list of keywords.
-
-The info file should be installed by default with the Gnuplot
-distribution, or is available at the `gnuplot-mode' web page:
-https://github.com/emacsorphanage/gnuplot/
-
-With the new context-sensitive mode active, gnuplot-mode can also
-provide function/`eldoc-mode' syntax hints as you type. This requires a
-separate file of strings, `gnuplot-eldoc.el', which is also
-provided by recent Gnuplot distributions.
-
- ------O------
-
-There are several known shortcomings of `gnuplot-mode', version 0.5g
-and up. Many of the shortcomings involve the graphical interface
-\(refered to as the GUI) to setting arguments to plot options. Here is
-a list:
-
- 1. Currently there is no way for `gnuplot-mode' to know if information
- sent to gnuplot was correctly plotted.
- 2. \"plot\", \"splot\", and \"fit\" are handled in the GUI, but are
- a bit flaky. Their arguments may not be read correctly from
- existing text, and continuation lines (common for plot and splot)
- are not supported.
- 3. The GUI does not know how to read from continuation lines.
- 4. Comma separated position arguments to plot options are
- unsupported in the GUI. Colon separated datafile modifiers (used
- for plot, splot, and fit) are not supported either. Arguments
- not yet supported by the GUI generate messages printed in grey
- text.
- 5. The GUI handling of \"hidden3d\" is flaky and \"cntrparam\" is
- unsupported.
-
- ------O------
-
- Key bindings:
- \\{gnuplot-mode-map}"
- (interactive)
- (kill-all-local-variables)
- (use-local-map gnuplot-mode-map)
- (setq major-mode 'gnuplot-mode
- mode-name "Gnuplot")
- (set (make-local-variable 'comment-start) "# ")
- (set (make-local-variable 'comment-end) "")
- (set (make-local-variable 'comment-column) 32)
- (set (make-local-variable 'comment-start-skip) "#[ \t]*")
- (set (make-local-variable 'indent-line-function) 'gnuplot-indent-line)
-
- (set (make-local-variable 'beginning-of-defun-function) 'gnuplot-beginning-of-defun)
- (set (make-local-variable 'end-of-defun-function) 'gnuplot-end-of-continuation)
-
- (unless (featurep 'xemacs)
- (add-hook 'completion-at-point-functions 'gnuplot-completion-at-point nil t))
-
- (set-syntax-table gnuplot-mode-syntax-table)
-
- (when (eq gnuplot-keywords-when 'immediately) ; <HW>
- (gnuplot-setup-info-look)) ;; <SE>
-
- (if gnuplot-xemacs-p ; deal with font-lock
- (when (fboundp 'turn-on-font-lock)
- (turn-on-font-lock))
- (progn
- ;; Add syntax-propertizing functions to search for strings and comments
- (set (make-local-variable 'syntax-propertize-function)
- #'gnuplot-syntax-propertize)
- (add-hook 'syntax-propertize-extend-region-functions
- #'gnuplot-syntax-propertize-extend-region nil t)
-
- ;; Set up font-lock
- (setq font-lock-defaults gnuplot-font-lock-defaults)
- (set (make-local-variable 'font-lock-multiline) t)
- (set (make-local-variable 'parse-sexp-lookup-properties) t)))
-
- (if (fboundp 'widget-create) ; gnuplot-gui
- (condition-case ()
- (require 'gnuplot-gui)
- (error nil)))
- (setq gnuplot-first-call nil ; a few more details ...
- gnuplot-comint-recent-buffer (current-buffer)
- comint-process-echoes gnuplot-echo-command-line-flag)
- (run-hooks 'gnuplot-mode-hook)
- ;; the first time we need to figure out which gnuplot we are running
- (if gnuplot-program-version
- (gnuplot-setup-menu-and-toolbar)
- (gnuplot-fetch-version-number)))
-
-;;;###autoload
-(defun gnuplot-make-buffer ()
- "Open a new buffer in `gnuplot-mode'.
-When invoked, it switches to a new, empty buffer visiting no file
-and then starts `gnuplot-mode'.
-
-It is convenient to bind this function to a global key sequence. For
-example, to make the F10 key open a gnuplot script buffer, put the
-following in your .emacs file:
- (autoload 'gnuplot-make-buffer \"gnuplot\"
- \"open a buffer in gnuplot mode\" t)
- (global-set-key [(f10)] 'gnuplot-make-buffer)"
- (interactive)
- (switch-to-buffer gnuplot-gnuplot-buffer)
- (gnuplot-mode))
-
-;;;###autoload
-(defun run-gnuplot ()
- "Run an inferior Gnuplot process."
- (interactive)
- (gnuplot-make-gnuplot-buffer)
- (pop-to-buffer gnuplot-buffer))
-
-(defun gnuplot-show-version ()
- "Show version number in echo area."
- (interactive)
- (message "gnuplot-mode %s -- URL: %s" gnuplot-version gnuplot-maintainer-url))
-
-(defun gnuplot-show-gnuplot-version ()
- "Show gnuplot program and version number in echo area."
- (interactive)
- (gnuplot-fetch-version-number)
- (message "You are calling gnuplot %s as %s" gnuplot-program-version gnuplot-program))
-
-
-;;; That's it! ----------------------------------------------------------------
-
-
-;;; --- final chores: provide 'gnuplot and run load-hook
-;; provide before run-hooks suggested by <DB>
-(provide 'gnuplot)
-(run-hooks 'gnuplot-load-hook)
-
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-
-;;; gnuplot.el ends here
diff --git a/elpa/goto-chg-20200603.1911/goto-chg-autoloads.el b/elpa/goto-chg-20200603.1911/goto-chg-autoloads.el
deleted file mode 100644
index 2443f71..0000000
--- a/elpa/goto-chg-20200603.1911/goto-chg-autoloads.el
+++ /dev/null
@@ -1,55 +0,0 @@
-;;; goto-chg-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "goto-chg" "goto-chg.el" (0 0 0 0))
-;;; Generated autoloads from goto-chg.el
-
-(autoload 'goto-last-change "goto-chg" "\
-Go to the point where the last edit was made in the current buffer.
-Repeat the command to go to the second last edit, etc.
-
-To go back to more recent edit, the reverse of this command, use \\[goto-last-change-reverse]
-or precede this command with \\[universal-argument] - (minus).
-
-It does not go to the same point twice even if there has been many edits
-there. I call the minimal distance between distinguishable edits \"span\".
-Set variable `glc-default-span' to control how close is \"the same point\".
-Default span is 8.
-The span can be changed temporarily with \\[universal-argument] right before \\[goto-last-change]:
-\\[universal-argument] <NUMBER> set current span to that number,
-\\[universal-argument] (no number) multiplies span by 4, starting with default.
-The so set span remains until it is changed again with \\[universal-argument], or the consecutive
-repetition of this command is ended by any other command.
-
-When span is zero (i.e. \\[universal-argument] 0) subsequent \\[goto-last-change] visits each and
-every point of edit and a message shows what change was made there.
-In this case it may go to the same point twice.
-
-This command uses undo information. If undo is disabled, so is this command.
-At times, when undo information becomes too large, the oldest information is
-discarded. See variable `undo-limit'.
-
-\(fn ARG)" t nil)
-
-(autoload 'goto-last-change-reverse "goto-chg" "\
-Go back to more recent changes after \\[goto-last-change] have been used.
-See `goto-last-change' for use of prefix argument.
-
-\(fn ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "goto-chg" '("glc-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; goto-chg-autoloads.el ends here
diff --git a/elpa/goto-chg-20200603.1911/goto-chg-pkg.el b/elpa/goto-chg-20200603.1911/goto-chg-pkg.el
deleted file mode 100644
index cc03e47..0000000
--- a/elpa/goto-chg-20200603.1911/goto-chg-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "goto-chg" "20200603.1911" "goto last change" '((undo-tree "0.1.3")) :commit "85fca9f7d8b04be3fbb37cc5d42416f3c4d32830" :keywords '("convenience" "matching") :authors '(("David Andersson <l.david.andersson(at)sverige.nu>")) :maintainer '("Vasilij Schneidermann" . "mail@vasilij.de") :url "https://github.com/emacs-evil/goto-chg")
diff --git a/elpa/goto-chg-20200603.1911/goto-chg.el b/elpa/goto-chg-20200603.1911/goto-chg.el
deleted file mode 100644
index 095f772..0000000
--- a/elpa/goto-chg-20200603.1911/goto-chg.el
+++ /dev/null
@@ -1,378 +0,0 @@
-;;; goto-chg.el --- goto last change
-;;--------------------------------------------------------------------
-;;
-;; Copyright (C) 2002-2008,2013 David Andersson
-;;
-;; 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 2 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 this program; if not, write to the Free
-;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301 USA
-;;
-;;-------------------------------------------------------------------
-;;
-;; Author: David Andersson <l.david.andersson(at)sverige.nu>
-;; Maintainer: Vasilij Schneidermann <mail@vasilij.de>
-;; Created: 16 May 2002
-;; Version: 1.7.3
-;; Package-Version: 20200603.1911
-;; Package-Commit: 85fca9f7d8b04be3fbb37cc5d42416f3c4d32830
-;; Package-Requires: ((undo-tree "0.1.3"))
-;; Keywords: convenience, matching
-;; URL: https://github.com/emacs-evil/goto-chg
-;;
-;;; Commentary:
-;;
-;; Goto Last Change
-;;
-;; Goto the point of the most recent edit in the buffer.
-;; When repeated, goto the second most recent edit, etc.
-;; Negative argument, C-u -, for reverse direction.
-;; Works by looking into buffer-undo-list to find points of edit.
-;;
-;; You would probably like to bind this command to a key.
-;; For example in your ~/.emacs:
-;;
-;; (require 'goto-chg)
-;;
-;; (global-set-key [(control ?.)] 'goto-last-change)
-;; (global-set-key [(control ?,)] 'goto-last-change-reverse)
-;;
-;; Works with emacs-19.29, 19.31, 20.3, 20.7, 21.1, 21.4, 22.1 and 23.1
-;; Works with XEmacs-20.4 and 21.4 (but see todo about `last-command' below)
-;;
-;;--------------------------------------------------------------------
-;; History
-;;
-;; Ver 1.7.3 2019-01-07 Vasilij Schneidermann
-;; Fix errors when used with persistent undo
-;; Ver 1.7.2 2018-01-05 Vasilij Schneidermann
-;; Fix byte-compiler warnings again
-;; Ver 1.7.1 2017-12-31 Vasilij Schneidermann
-;; Fix byte-compiler warnings
-;; Ver 1.7 2017-09-17 Vasilij Schneidermann
-;; Make it work with undo-tree-mode (see
-;; <https://github.com/martinp26/goto-chg>)
-;; Ver 1.6 2013-12-12 David Andersson
-;; Add keywords; Cleanup comments
-;; Ver 1.5 2013-12-11 David Andersson
-;; Autoload and document `goto-last-change-reverse'
-;; Ver 1.4 2008-09-20 David Andersson
-;; Improved property change description; Update comments.
-;; Ver 1.3 2007-03-14 David Andersson
-;; Added `goto-last-change-reverse'
-;; Ver 1.2 2003-04-06 David Andersson
-;; Don't let repeating error depthen glc-probe-depth.
-;; Ver 1.1 2003-04-06 David Andersson
-;; Zero arg describe changes. Negative arg go back.
-;; Autoload. Remove message using nil in stead of an empty string.
-;; Ver 1.0 2002-05-18 David Andersson
-;; Initial version
-;;
-;;--------------------------------------------------------------------
-;;
-;;todo: Rename "goto-chg.el" -> "gotochange.el" or "goto-chgs" ?
-;;todo: Rename function goto-last-change -> goto-last-edit ?
-;;todo: Rename adjective "-last-" -> "-latest-" or "-most-recent-" ?
-;;todo: There are some, maybe useful, funcs for region undo
-;; in simple.el in emacs 20. Take a look.
-;;todo: Add functionality to visit changed point in text order, not only in
-;; chronological order. (Naa, highlight-changes-mode does that).
-;;todo: Inverse indication that a change has been saved or not
-;;todo: Highlight the range of text involved in the last change?
-;;todo: See session-jump-to-last-change in session.el?
-;;todo: Unhide invisible text (e.g. outline mode) like isearch do.
-;;todo: XEmacs sets last-command to `t' after an error, so you cannot reverse
-;; after "No furter change info". Should we bother?
-;;todo: Try distinguish "No further change info" (end of truncated undo list)
-;; and "No further changes" (end of a complete undo list).
-;;
-;;--------------------------------------------------------------------
-
-;;; Code:
-
-(require 'undo-tree)
-
-(defvar glc-default-span 8 "*goto-last-change don't visit the same point twice. glc-default-span tells how far around a visited point not to visit again.")
-(defvar glc-current-span 8 "Internal for goto-last-change.\nA copy of glc-default-span or the ARG passed to goto-last-change.")
-(defvar glc-probe-depth 0 "Internal for goto-last-change.\nIt is non-zero between successive goto-last-change.")
-(defvar glc-direction 1 "Direction goto-last-change moves towards.")
-
-;;todo: Find begin and end of line, then use it somewhere
-
-(defun glc-fixup-edit (e)
- "Convert an Emacs 27.1-style combined change to a regular edit."
- (when (and (consp e)
- (eq (car e) 'apply)
- (not (functionp (cadr e)))
- (eq (nth 4 e) 'undo--wrap-and-run-primitive-undo))
- (let ((args (last e)))
- (when (and (consp args) (= (length args) 1)
- (consp (car args)) (= (length (car args)) 1)
- (consp (caar args)) (numberp (car (caar args))) (numberp (cdr (caar args))))
- (setq e (caar args)))))
- e)
-
-(defun glc-center-ellipsis (str maxlen &optional ellipsis)
- "Truncate STRING in the middle to length MAXLEN.
-If STRING is max MAXLEN just return the string.
-Optional third argument is the replacement, which defaults to \"...\"."
- (if (<= (length str) maxlen)
- str
- ;; else
- (let* ((lipsis (or ellipsis "..."))
- (i (/ (- maxlen (length lipsis)) 2)))
- (concat (substring str 0 i)
- lipsis
- (substring str (- i))))))
-
-(defun glc-adjust-pos2 (pos p1 p2 adj)
- ;; Helper function to glc-adjust-pos
- ;; p1, p2: interval where an edit occured
- ;; adj: amount of text added (positive) or removed (negativ) by the edit
- ;; Return pos if well before p1, or pos+adj if well after p2, or nil if too close
- (cond ((<= pos (- p1 glc-current-span))
- pos)
- ((> pos (+ p2 glc-current-span))
- (+ pos adj))
- ((zerop glc-current-span)
- p1)
- (t
- nil)))
-
-(defun glc-adjust-pos (pos e)
- "Given POS, a buffer position before the edit E, compute and return
-the \"same\" buffer position after E happened.
-Exception: return nil if POS is closer than `glc-current-span' to the edit E.
-\nInsertion edits before POS returns a larger value.
-Deletion edits before POS returns a smaller value.
-\nThe edit E is an entry from the `buffer-undo-list'. See for details."
- (setq e (glc-fixup-edit e))
- (cond ((atom e) ; nil==cmd boundary, or, num==changed pos
- pos)
- ((numberp (car e)) ; (beg . end)==insertion
- (glc-adjust-pos2 pos (car e) (car e) (- (cdr e) (car e))))
- ((stringp (car e)) ; (string . pos)==deletion
- (glc-adjust-pos2 pos (abs (cdr e)) (+ (abs (cdr e)) (length (car e))) (- (length (car e)))))
- ((null (car e)) ; (nil prop val beg . end)==prop change
- (glc-adjust-pos2 pos (nth 3 e) (nthcdr 4 e) 0))
- (t ; (marker . dist)==marker moved
- pos)))
-
-;; If recursive in stead of iterative (while), it tends to fill the call stack.
-;; (Isn't it tail optimized?)
-(defun glc-adjust-list (r)
- "R is list of edit entries in chronological order.
-Pick the point of the first edit entry and update that point with
-the second, third, etc, edit entries. Return the final updated point,
-or nil if the point was closer than `glc-current-span' to some edit in R.
-\nR is basically a reversed slice from the buffer-undo-list."
- (if r
- ;; Get pos
- (let ((pos (glc-get-pos (car r))))
- (setq r (cdr r))
- ;; Walk back in reverse list
- (while (and r pos)
- (setq pos (glc-adjust-pos pos (car r))
- r (cdr r)))
- pos)
- ;; else
- nil))
-
-(defun glc-get-pos (e)
- "If E represents an edit, return a position value in E, the position
-where the edit took place. Return nil if E represents no real change.
-\nE is an entry in the buffer-undo-list."
- (setq e (glc-fixup-edit e))
- (cond ((numberp e) e) ; num==changed position
- ((atom e) nil) ; nil==command boundary
- ((numberp (car e)) (cdr e)) ; (beg . end)==insertion
- ((stringp (car e)) (abs (cdr e))) ; (string . pos)==deletion
- ((null (car e)) (nthcdr 4 e)) ; (nil ...)==text property change
- ((atom (car e)) nil) ; (t ...)==file modification time
- (t nil))) ; (marker ...)==marker moved
-
-(defun glc-get-descript (e &optional n)
- "If E represents an edit, return a short string describing E.
-Return nil if E represents no real change.
-\nE is an entry in the buffer-undo-list."
- (setq e (glc-fixup-edit e))
- (let ((nn (or (format "T-%d: " n) "")))
- (cond ((numberp e) "New position") ; num==changed position
- ((atom e) nil) ; nil==command boundary
- ((numberp (car e)) ; (beg . end)==insertion
- (if (and n (< n 2))
- (format "%sInserted %d chars \"%s\"" nn (- (cdr e) (car e))
- (glc-center-ellipsis (buffer-substring (car e) (cdr e)) 60))
- ;; else
- ;; An older insert. The inserted text cannot easily be computed.
- ;; Just show the char count.
- (format "%sInserted %d chars" nn (- (cdr e) (car e)))))
- ((stringp (car e)) ; (string . pos)==deletion
- (format "%sDeleted \"%s\"" nn (glc-center-ellipsis (car e) 60)))
- ((null (car e)) ; (nil ...)==text property change
- (format "%sProperty change" nn))
- ((atom (car e)) nil) ; (t ...)==file modification time
- (t nil)))) ; (marker ...)==marker moved
-
-(defun glc-is-positionable (e)
- "Return non-nil if E is an insertion, deletion or text property change.
-\nE is an entry in the buffer-undo-list."
- (and (not (numberp e)) (glc-get-pos e)))
-
-(defun glc-is-filetime (e)
- "Return t if E indicates a buffer became \"modified\",
-that is, it was previously saved or unchanged. Nil otherwise."
- (and (listp e) (eq (car e) t)))
-
-;;;###autoload
-(defun goto-last-change (arg)
-"Go to the point where the last edit was made in the current buffer.
-Repeat the command to go to the second last edit, etc.
-\nTo go back to more recent edit, the reverse of this command, use \\[goto-last-change-reverse]
-or precede this command with \\[universal-argument] - (minus).
-\nIt does not go to the same point twice even if there has been many edits
-there. I call the minimal distance between distinguishable edits \"span\".
-Set variable `glc-default-span' to control how close is \"the same point\".
-Default span is 8.
-The span can be changed temporarily with \\[universal-argument] right before \\[goto-last-change]:
-\\[universal-argument] <NUMBER> set current span to that number,
-\\[universal-argument] (no number) multiplies span by 4, starting with default.
-The so set span remains until it is changed again with \\[universal-argument], or the consecutive
-repetition of this command is ended by any other command.
-\nWhen span is zero (i.e. \\[universal-argument] 0) subsequent \\[goto-last-change] visits each and
-every point of edit and a message shows what change was made there.
-In this case it may go to the same point twice.
-\nThis command uses undo information. If undo is disabled, so is this command.
-At times, when undo information becomes too large, the oldest information is
-discarded. See variable `undo-limit'."
- (interactive "P")
- (cond ((not (eq this-command last-command))
- ;; Start a glc sequence
- ;; Don't go to current point if last command was an obvious edit
- ;; (yank or self-insert, but not kill-region). Makes it easier to
- ;; jump back and forth when copying seleced lines.
- (setq glc-probe-depth (if (memq last-command '(yank self-insert-command)) 1 0)
- glc-direction 1
- glc-current-span glc-default-span)
- (if (< (prefix-numeric-value arg) 0)
- (error "Negative arg: Cannot reverse as the first operation"))))
- (cond ((and (null buffer-undo-list) (null buffer-undo-tree))
- (error "Buffer has not been changed"))
- ((eq buffer-undo-list t)
- (error "No change info (undo is disabled)")))
- (cond ((numberp arg) ; Numeric arg sets span
- (setq glc-current-span (abs arg)))
- ((consp arg) ; C-u's multiply previous span by 4
- (setq glc-current-span (* (abs (car arg)) glc-default-span))
- (message "Current span is %d chars" glc-current-span))) ;todo: keep message with "waiting" and "is saved"
- (cond ((< (prefix-numeric-value arg) 0)
- (setq glc-direction -1))
- (t
- (setq glc-direction 1)))
- (let (rev ; Reversed (and filtered) undo list
- pos ; The pos we look for, nil until found
- (n 0) ; Steps in undo list (length of 'rev')
- (l buffer-undo-list)
- (passed-save-entry (not (buffer-modified-p)))
- (new-probe-depth glc-probe-depth)
- (undo-tree-p (bound-and-true-p undo-tree-mode))
- glc-seen-canary)
- ;; Walk back and forth in the buffer-undo-list, each time one step deeper,
- ;; until we can walk back the whole list with a 'pos' that is not coming
- ;; too close to another edit.
- (while (null pos)
- (setq new-probe-depth (+ new-probe-depth glc-direction))
- (if (< glc-direction 0)
- (setq rev ()
- n 0
- l buffer-undo-list
- passed-save-entry (not (buffer-modified-p))))
- (if (< new-probe-depth 1)
- (error "No later change info"))
- (if (> n 150)
- (message "working..."))
- ;; Walk forward in buffer-undo-list, glc-probe-depth steps.
- ;; Build reverse list along the way
- (if (not undo-tree-p)
- (while (< n new-probe-depth)
- (cond ((null l)
- ;(setq this-command t) ; Disrupt repeat sequence
- (error "No further change info"))
- ((glc-is-positionable (car l))
- (setq n (1+ n)
- rev (cons (car l) rev)))
- ((or passed-save-entry (glc-is-filetime (car l)))
- (setq passed-save-entry t)))
- (setq l (cdr l)))
- (undo-list-transfer-to-tree)
- (when (not glc-seen-canary)
- (while (and (not (null l)) (not glc-seen-canary) (< n new-probe-depth))
- (cond ((eq 'undo-tree-canary (car l)) ; used by buffer-undo-tree
- (message "Canary found...")
- (setq l (undo-tree-current buffer-undo-tree)
- glc-seen-canary t))
- ((glc-is-positionable (car l))
- (setq n (1+ n)
- rev (cons (car l) rev)))
- ((or passed-save-entry (glc-is-filetime (car l)))
- (setq passed-save-entry t)))
- (when (not glc-seen-canary)
- (setq l (cdr l)))))
- (when glc-seen-canary
- (while (and (< n new-probe-depth) (undo-tree-node-p l))
- (cond ((null l)
- ;(setq this-command t) ; Disrupt repeat sequence
- (error "No further change info"))
- ((glc-is-positionable (car (undo-tree-node-undo l)))
- (setq n (1+ n)
- rev (cons (car (undo-tree-node-undo l)) rev)))
- ((or passed-save-entry (glc-is-filetime (car (undo-tree-node-undo l))))
- (setq passed-save-entry t)))
- (setq l (undo-tree-node-previous l))))
- (when (null l)
- (error "No further change info")))
- ;; Walk back in reverse list, from older to newer edits.
- ;; Adjusting pos along the way.
- (setq pos (glc-adjust-list rev)))
- ;; Found a place not previously visited, in 'pos'.
- ;; (An error have been issued if nothing (more) found.)
- (if (> n 150)
- (message nil)) ; remove message "working..."
- (if (and (= glc-current-span 0) (glc-get-descript (car rev) n))
- (message "%s" (glc-get-descript (car rev) n))
- ;; else
- (if passed-save-entry
- (message "(This change is saved)")))
- (setq glc-probe-depth new-probe-depth)
- (goto-char pos)))
-
-;;;###autoload
-(defun goto-last-change-reverse (arg)
- "Go back to more recent changes after \\[goto-last-change] have been used.
-See `goto-last-change' for use of prefix argument."
- (interactive "P")
- ;; Negate arg, all kinds
- (cond ((eq arg nil) (setq arg '-))
- ((eq arg '-) (setq arg nil))
- ((listp arg) (setq arg (list (- (car arg)))))
- (t (setq arg (- arg))))
- ;; Make 'goto-last-change-reverse' look like 'goto-last-change'
- (cond ((eq last-command this-command)
- (setq last-command 'goto-last-change)))
- (setq this-command 'goto-last-change)
- ;; Call 'goto-last-change' to do the job
- (goto-last-change arg))
-
-(provide 'goto-chg)
-
-;;; goto-chg.el ends here
diff --git a/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-autoloads.el b/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-autoloads.el
deleted file mode 100644
index 71f6409..0000000
--- a/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-autoloads.el
+++ /dev/null
@@ -1,38 +0,0 @@
-;;; ibuffer-sidebar-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "ibuffer-sidebar" "ibuffer-sidebar.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from ibuffer-sidebar.el
-
-(autoload 'ibuffer-sidebar-toggle-sidebar "ibuffer-sidebar" "\
-Toggle the `ibuffer-sidebar' window.
-
-\(fn)" t nil)
-
-(autoload 'ibuffer-sidebar-show-sidebar "ibuffer-sidebar" "\
-Show sidebar with `ibuffer'.
-
-\(fn)" t nil)
-
-(autoload 'ibuffer-sidebar-hide-sidebar "ibuffer-sidebar" "\
-Hide `ibuffer-sidebar' in selected frame.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ibuffer-sidebar" '("ibuffer-sidebar-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; ibuffer-sidebar-autoloads.el ends here
diff --git a/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-pkg.el b/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-pkg.el
deleted file mode 100644
index 4e6bca2..0000000
--- a/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "ibuffer-sidebar" "20180219.131" "Sidebar for `ibuffer'" '((emacs "25.1")) :commit "7ddf1b5a158b33e9a7d3fe5dad7ea626a464d2bc" :keywords '("ibuffer" "files" "tools") :authors '(("James Nguyen" . "james@jojojames.com")) :maintainer '("James Nguyen" . "james@jojojames.com") :url "https://github.com/jojojames/ibuffer-sidebar")
diff --git a/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar.el b/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar.el
deleted file mode 100644
index c7f9ecc..0000000
--- a/elpa/ibuffer-sidebar-20180219.131/ibuffer-sidebar.el
+++ /dev/null
@@ -1,330 +0,0 @@
-;;; ibuffer-sidebar.el --- Sidebar for `ibuffer' -*- lexical-binding: t -*-
-
-;; Copyright (C) 2018 James Nguyen
-
-;; Author: James Nguyen <james@jojojames.com>
-;; Maintainer: James Nguyen <james@jojojames.com>
-;; URL: https://github.com/jojojames/ibuffer-sidebar
-;; Package-Version: 20180219.131
-;; Package-Commit: 7ddf1b5a158b33e9a7d3fe5dad7ea626a464d2bc
-;; Version: 0.0.1
-;; Package-Requires: ((emacs "25.1"))
-;; Keywords: ibuffer, files, tools
-;; HomePage: https://github.com/jojojames/ibuffer-sidebar
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;; Provides a sidebar interface similar to `dired-sidebar', but for `ibuffer'.
-
-;;
-;; (use-package ibuffer-sidebar
-;; :bind (("C-x C-b" . ibuffer-sidebar-toggle-sidebar))
-;; :ensure nil
-;; :commands (ibuffer-sidebar-toggle-sidebar))
-;;
-
-;;; Code:
-(require 'ibuffer)
-(require 'face-remap)
-(eval-when-compile (require 'subr-x))
-
-;; Compatibility
-
-(eval-and-compile
- (with-no-warnings
- (if (version< emacs-version "26")
- (progn
- (defalias 'ibuffer-sidebar-if-let* #'if-let)
- (defalias 'ibuffer-sidebar-when-let* #'when-let)
- (function-put #'ibuffer-sidebar-if-let* 'lisp-indent-function 2)
- (function-put #'ibuffer-sidebar-when-let* 'lisp-indent-function 1))
- (defalias 'ibuffer-sidebar-if-let* #'if-let*)
- (defalias 'ibuffer-sidebar-when-let* #'when-let*))))
-
-;; Customizations
-(defgroup ibuffer-sidebar nil
- "A major mode leveraging `ibuffer-sidebar' to display buffers in a sidebar."
- :group 'convenience)
-
-(defcustom ibuffer-sidebar-use-custom-modeline t
- "Show `ibuffer-sidebar' with custom modeline.
-
-This uses format specified by `ibuffer-sidebar-mode-line-format'."
- :type 'boolean
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-mode-line-format
- '("%e" mode-line-front-space
- mode-line-buffer-identification
- " " mode-line-end-spaces)
- "Mode line format for `ibuffer-sidebar'."
- :type 'list
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-display-column-titles nil
- "Whether or not to display the column titles in sidebar."
- :type 'boolean
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-display-summary nil
- "Whether or not to display summary in sidebar."
- :type 'boolean
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-width 35
- "Width of the `ibuffer-sidebar' buffer."
- :type 'integer
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-pop-to-sidebar-on-toggle-open t
- "Whether to jump to sidebar upon toggling open.
-
-This is used in conjunction with `ibuffer-sidebar-toggle-sidebar'."
- :type 'boolean
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-use-custom-font nil
- "Show `ibuffer-sidebar' with custom font.
-
-This face can be customized using `ibuffer-sidebar-face'."
- :type 'boolean
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-face nil
- "Face used by `ibuffer-sidebar' for custom font.
-
-This only takes effect if `ibuffer-sidebar-use-custom-font' is true."
- :type 'list
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-display-alist '((side . left) (slot . 1))
- "Alist used in `display-buffer-in-side-window'.
-
-e.g. (display-buffer-in-side-window buffer '((side . left) (slot . 1)))"
- :type 'alist
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-refresh-on-special-commands t
- "Whether or not to trigger auto-revert after certain functions.
-
-Warning: This is implemented by advising specific functions."
- :type 'boolean
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-special-refresh-commands
- '((kill-buffer . 2)
- (find-file . 2)
- (delete-file . 2))
- "A list of commands that will trigger a refresh of the sidebar.
-
-The command can be an alist with the CDR of the alist being the amount of time
-to wait to refresh the sidebar after the CAR of the alist is called.
-
-Set this to nil or set `ibuffer-sidebar-refresh-on-special-commands' to nil
-to disable automatic refresh when a special command is triggered."
- :type 'list
- :group 'ibuffer-sidebar)
-
-(defcustom ibuffer-sidebar-name "*:Buffers:*"
- "The name of `ibuffer-sidebar' buffer."
- :type 'string
- :group 'ibuffer-sidebar)
-
-;; Mode
-
-(define-derived-mode ibuffer-sidebar-mode ibuffer-mode
- "Ibuffer-sidebar"
- "A major mode that puts `ibuffer' in a sidebar."
- :group 'ibuffer-sidebar
- (let ((inhibit-read-only t))
- (setq window-size-fixed 'width)
-
- (when ibuffer-sidebar-use-custom-font
- (ibuffer-sidebar-set-font))
-
- ;; Remove column titles.
- (unless ibuffer-sidebar-display-column-titles
- (advice-add 'ibuffer-update-title-and-summary
- :after 'ibuffer-sidebar-remove-column-headings))
-
- ;; Hide summary.
- (unless ibuffer-sidebar-display-summary
- (setq-local ibuffer-display-summary nil))
-
- ;; Set default format to be minimal.
- (setq-local ibuffer-formats (append ibuffer-formats '((mark " " name))))
- (setq-local ibuffer-current-format (1- (length ibuffer-formats)))
- (ibuffer-update-format)
- (ibuffer-redisplay t)
-
- ;; Set up refresh.
- (when ibuffer-sidebar-refresh-on-special-commands
- (mapc
- (lambda (x)
- (if (consp x)
- (let ((command (car x))
- (delay (cdr x)))
- (advice-add
- command
- :after
- (defalias (intern (format "ibuffer-sidebar-refresh-after-%S" command))
- (function
- (lambda (&rest _)
- (let ((timer-symbol
- (intern
- (format
- "ibuffer-sidebar-refresh-%S-timer" command))))
- (when (and (boundp timer-symbol)
- (timerp (symbol-value timer-symbol)))
- (cancel-timer (symbol-value timer-symbol)))
- (setf
- (symbol-value timer-symbol)
- (run-with-idle-timer
- delay
- nil
- #'ibuffer-sidebar-refresh-buffer))))))))
- (advice-add x :after #'ibuffer-sidebar-refresh-buffer)))
- ibuffer-sidebar-special-refresh-commands))
-
- (when ibuffer-sidebar-use-custom-modeline
- (ibuffer-sidebar-set-mode-line))))
-
-;; User Interface
-
-;;;###autoload
-(defun ibuffer-sidebar-toggle-sidebar ()
- "Toggle the `ibuffer-sidebar' window."
- (interactive)
- (if (ibuffer-sidebar-showing-sidebar-p)
- (ibuffer-sidebar-hide-sidebar)
- (ibuffer-sidebar-show-sidebar)
- (when ibuffer-sidebar-pop-to-sidebar-on-toggle-open
- (pop-to-buffer (ibuffer-sidebar-buffer)))))
-
-;;;###autoload
-(defun ibuffer-sidebar-show-sidebar ()
- "Show sidebar with `ibuffer'."
- (interactive)
- (let ((buffer (ibuffer-sidebar-get-or-create-buffer)))
- (display-buffer-in-side-window buffer ibuffer-sidebar-display-alist)
- (let ((window (get-buffer-window buffer)))
- (set-window-dedicated-p window t)
- (with-selected-window window
- (let ((window-size-fixed))
- (ibuffer-sidebar-set-width ibuffer-sidebar-width))))
- (ibuffer-sidebar-update-state buffer)))
-
-;;;###autoload
-(defun ibuffer-sidebar-hide-sidebar ()
- "Hide `ibuffer-sidebar' in selected frame."
- (ibuffer-sidebar-when-let* ((buffer (ibuffer-sidebar-buffer)))
- (delete-window (get-buffer-window buffer))
- (ibuffer-sidebar-update-state nil)))
-
-;; Helpers
-
-(defun ibuffer-sidebar-showing-sidebar-p (&optional f)
- "Return whether F or `selected-frame' is showing `ibuffer-sidebar'.
-
-Check if F or `selected-frame' contains a sidebar and return corresponding
-buffer if buffer has a window attached to it."
- (ibuffer-sidebar-if-let* ((buffer (ibuffer-sidebar-buffer f)))
- (get-buffer-window buffer)
- nil))
-
-(defun ibuffer-sidebar-get-or-create-buffer ()
- "Get or create a `ibuffer-sidebar' buffer."
- (let ((name ibuffer-sidebar-name))
- (ibuffer-sidebar-if-let* ((existing-buffer (get-buffer name)))
- existing-buffer
- (let ((new-buffer (generate-new-buffer name)))
- (with-current-buffer new-buffer
- (ibuffer-sidebar-setup))
- new-buffer))))
-
-(defun ibuffer-sidebar-setup ()
- "Bootstrap `ibuffer-sidebar'.
-
-Sets up both `ibuffer' and `ibuffer-sidebar'."
- (ibuffer-mode)
- (ibuffer-update nil)
- (run-hooks 'ibuffer-hook)
- (ibuffer-sidebar-mode))
-
-(defun ibuffer-sidebar-buffer (&optional f)
- "Return the current sidebar buffer in F or selected frame.
-
-This returns nil if there isn't a buffer for F."
- (let* ((frame (or f (selected-frame)))
- (buffer (frame-parameter frame 'ibuffer-sidebar)))
- (if (buffer-live-p buffer)
- buffer
- (set-frame-parameter frame 'ibuffer-sidebar nil)
- nil)))
-
-(defun ibuffer-sidebar-update-state (buffer &optional f)
- "Update current state with BUFFER for sidebar in F or selected frame."
- (let ((frame (or f (selected-frame))))
- (set-frame-parameter frame 'ibuffer-sidebar buffer)))
-
-(defun ibuffer-sidebar-refresh-buffer (&rest _)
- "Refresh sidebar buffer."
- (ibuffer-sidebar-when-let* ((sidebar (ibuffer-sidebar-buffer))
- (window (get-buffer-window sidebar)))
- (with-selected-window window
- (ibuffer-update nil t))))
-
-;; UI
-
-(defun ibuffer-sidebar-remove-column-headings (&rest _args)
- "Function ran after `ibuffer-update-title-and-summary' that removes headings.
-
-F should be function `ibuffer-update-title-and-summary'.
-ARGS are args for `ibuffer-update-title-and-summary'."
- (when (and (bound-and-true-p ibuffer-sidebar-mode)
- (not ibuffer-sidebar-display-column-titles))
- (with-current-buffer (current-buffer)
- (goto-char 1)
- (search-forward "-\n" nil t)
- (delete-region 1 (point))
- (let ((window-min-height 1))
- (shrink-window-if-larger-than-buffer)))))
-
-(defun ibuffer-sidebar-set-width (width)
- "Set the width of the buffer to WIDTH when it is created."
- ;; Copied from `treemacs--set-width' as well as `neotree'.
- (unless (one-window-p)
- (let ((window-size-fixed)
- (w (max width window-min-width)))
- (cond
- ((> (window-width) w)
- (shrink-window-horizontally (- (window-width) w)))
- ((< (window-width) w)
- (enlarge-window-horizontally (- w (window-width))))))))
-
-(defun ibuffer-sidebar-set-font ()
- "Customize font in `ibuffer-sidebar'.
-
-Set font to a variable width (proportional) in the current buffer."
- (interactive)
- (setq-local buffer-face-mode-face ibuffer-sidebar-face)
- (buffer-face-mode))
-
-(defun ibuffer-sidebar-set-mode-line ()
- "Customize modeline in `ibuffer-sidebar'."
- (setq mode-line-format ibuffer-sidebar-mode-line-format))
-
-(provide 'ibuffer-sidebar)
-;;; ibuffer-sidebar.el ends here
diff --git a/elpa/ivy-20200624.1140/colir.el b/elpa/ivy-20200624.1140/colir.el
deleted file mode 100644
index 9e61273..0000000
--- a/elpa/ivy-20200624.1140/colir.el
+++ /dev/null
@@ -1,124 +0,0 @@
-;;; colir.el --- Color blending library -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015-2019 Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel <ohwoeowho@gmail.com>
-
-;; This file is part of GNU Emacs.
-
-;; This file 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, 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.
-
-;; For a full copy of the GNU General Public License
-;; see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package solves the problem of adding a face with a background
-;; to text which may already have a background. In all conflicting
-;; areas, instead of choosing either the original or the new
-;; background face, their blended sum is used.
-;;
-;; The blend mode functions are taken from URL
-;; `https://en.wikipedia.org/wiki/Blend_modes'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'color)
-
-(defcustom colir-compose-method #'colir-compose-alpha
- "Select a method to compose two color channels."
- :group 'ivy
- :type '(radio
- (function-item colir-compose-alpha)
- (function-item colir-compose-overlay)
- (function-item colir-compose-soft-light)))
-
-(defun colir-compose-soft-light (a b)
- "Compose A and B channels."
- (if (< b 0.5)
- (+ (* 2 a b) (* a a (- 1 b b)))
- (+ (* 2 a (- 1 b)) (* (sqrt a) (- (* 2 b) 1)))))
-
-(defun colir-compose-overlay (a b)
- "Compose A and B channels."
- (if (< a 0.5)
- (* 2 a b)
- (- 1 (* 2 (- 1 a) (- 1 b)))))
-
-(defun colir-compose-alpha (a b &optional alpha gamma)
- "Compose A and B channels.
-Optional argument ALPHA is a number between 0.0 and 1.0 which corresponds
-to the influence of A on the result. Default value is 0.5.
-Optional argument GAMMA is used for gamma correction. Default value is 2.2."
- (setq alpha (or alpha 0.5))
- (setq gamma (or gamma 2.2))
- (+ (* (expt a gamma) alpha) (* (expt b gamma) (- 1 alpha))))
-
-(defun colir-blend (c1 c2)
- "Blend the two colors C1 and C2 using `colir-compose-method'.
-C1 and C2 are triples of floats in [0.0 1.0] range."
- (apply #'color-rgb-to-hex
- (cl-mapcar
- (if (eq (frame-parameter nil 'background-mode) 'dark)
- ;; this method works nicely for dark themes
- 'colir-compose-soft-light
- colir-compose-method)
- c1 c2)))
-
-(defun colir-color-parse (color)
- "Convert string COLOR to triple of floats in [0.0 1.0]."
- (if (string-match "#\\([[:xdigit:]]\\{2\\}\\)\\([[:xdigit:]]\\{2\\}\\)\\([[:xdigit:]]\\{2\\}\\)" color)
- (mapcar (lambda (v) (/ (string-to-number v 16) 255.0))
- (list (match-string 1 color) (match-string 2 color) (match-string 3 color)))
- ;; does not work properly in terminal (maps color to nearest color
- ;; from available color palette).
- (color-name-to-rgb color)))
-
-(defun colir--blend-background (start next prevn face object)
- (let ((background-prev (face-background prevn)))
- (progn
- (put-text-property
- start next 'face
- (if background-prev
- (cons `(background-color
- . ,(colir-blend
- (colir-color-parse background-prev)
- (colir-color-parse (face-background face nil t))))
- prevn)
- (list face prevn))
- object))))
-
-(defun colir-blend-face-background (start end face &optional object)
- "Append to the face property of the text from START to END the face FACE.
-When the text already has a face with a non-plain background,
-blend it with the background of FACE.
-Optional argument OBJECT is the string or buffer containing the text.
-See also `font-lock-append-text-property'."
- (let (next prev prevn)
- (while (/= start end)
- (setq next (next-single-property-change start 'face object end))
- (setq prev (get-text-property start 'face object))
- (setq prevn (if (listp prev)
- (cl-find-if #'atom prev)
- prev))
- (cond
- ((or (keywordp (car-safe prev)) (consp (car-safe prev)))
- (put-text-property start next 'face (cons face prev) object))
- ((facep prevn)
- (colir--blend-background start next prevn face object))
- (t
- (put-text-property start next 'face face object)))
- (setq start next))))
-
-(provide 'colir)
-
-;;; colir.el ends here
diff --git a/elpa/ivy-20200624.1140/dir b/elpa/ivy-20200624.1140/dir
deleted file mode 100644
index b68b083..0000000
--- a/elpa/ivy-20200624.1140/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* Ivy: (ivy). Using Ivy for completion.
diff --git a/elpa/ivy-20200624.1140/elpa.el b/elpa/ivy-20200624.1140/elpa.el
deleted file mode 100644
index e49b8d4..0000000
--- a/elpa/ivy-20200624.1140/elpa.el
+++ /dev/null
@@ -1,6 +0,0 @@
-(setq package-user-dir
- (expand-file-name
- (format "~/.elpa/%s/elpa"
- (concat emacs-version (when (getenv "MELPA_STABLE") "-stable")))))
-(package-initialize)
-(add-to-list 'load-path default-directory)
diff --git a/elpa/ivy-20200624.1140/ivy-autoloads.el b/elpa/ivy-20200624.1140/ivy-autoloads.el
deleted file mode 100644
index 69607bb..0000000
--- a/elpa/ivy-20200624.1140/ivy-autoloads.el
+++ /dev/null
@@ -1,172 +0,0 @@
-;;; ivy-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "colir" "colir.el" (0 0 0 0))
-;;; Generated autoloads from colir.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "colir" '("colir-")))
-
-;;;***
-
-;;;### (autoloads nil "ivy" "ivy.el" (0 0 0 0))
-;;; Generated autoloads from ivy.el
-
-(autoload 'ivy-resume "ivy" "\
-Resume the last completion session, or SESSION if non-nil.
-With a prefix arg, try to restore a recorded completion session,
-if one exists.
-
-\(fn &optional SESSION)" t nil)
-
-(autoload 'ivy-read "ivy" "\
-Read a string in the minibuffer, with completion.
-
-PROMPT is a string, normally ending in a colon and a space.
-`ivy-count-format' is prepended to PROMPT during completion.
-
-COLLECTION is either a list of strings, a function, an alist, or
-a hash table, supplied for `minibuffer-completion-table'.
-
-PREDICATE is applied to filter out the COLLECTION immediately.
-This argument is for compatibility with `completing-read'.
-
-When REQUIRE-MATCH is non-nil, only members of COLLECTION can be
-selected.
-
-If INITIAL-INPUT is non-nil, then insert that input in the
-minibuffer initially.
-
-HISTORY is a name of a variable to hold the completion session
-history.
-
-KEYMAP is composed with `ivy-minibuffer-map'.
-
-PRESELECT, when non-nil, determines which one of the candidates
-matching INITIAL-INPUT to select initially. An integer stands
-for the position of the desired candidate in the collection,
-counting from zero. Otherwise, use the first occurrence of
-PRESELECT in the collection. Comparison is first done with
-`equal'. If that fails, and when applicable, match PRESELECT as
-a regular expression.
-
-DEF is for compatibility with `completing-read'.
-
-UPDATE-FN is called each time the candidate list is re-displayed.
-
-When SORT is non-nil, `ivy-sort-functions-alist' determines how
-to sort candidates before displaying them.
-
-ACTION is a function to call after selecting a candidate.
-It takes one argument, the selected candidate. If COLLECTION is
-an alist, the argument is a cons cell, otherwise it's a string.
-
-MULTI-ACTION, when non-nil, is called instead of ACTION when
-there are marked candidates. It takes the list of candidates as
-its only argument. When it's nil, ACTION is called on each marked
-candidate.
-
-UNWIND is a function of no arguments to call before exiting.
-
-RE-BUILDER is a function transforming input text into a regex
-pattern.
-
-MATCHER is a function which can override how candidates are
-filtered based on user input. It takes a regex pattern and a
-list of candidates, and returns the list of matching candidates.
-
-DYNAMIC-COLLECTION is a boolean specifying whether the list of
-candidates is updated after each input by calling COLLECTION.
-
-EXTRA-PROPS is a plist that can be used to store
-collection-specific session-specific data.
-
-CALLER is a symbol to uniquely identify the caller to `ivy-read'.
-It is used, along with COLLECTION, to determine which
-customizations apply to the current completion session.
-
-\(fn PROMPT COLLECTION &key PREDICATE REQUIRE-MATCH INITIAL-INPUT HISTORY PRESELECT DEF KEYMAP UPDATE-FN SORT ACTION MULTI-ACTION UNWIND RE-BUILDER MATCHER DYNAMIC-COLLECTION EXTRA-PROPS CALLER)" nil nil)
-
-(autoload 'ivy-completing-read "ivy" "\
-Read a string in the minibuffer, with completion.
-
-This interface conforms to `completing-read' and can be used for
-`completing-read-function'.
-
-PROMPT is a string that normally ends in a colon and a space.
-COLLECTION is either a list of strings, an alist, an obarray, or a hash table.
-PREDICATE limits completion to a subset of COLLECTION.
-REQUIRE-MATCH is a boolean value or a symbol. See `completing-read'.
-INITIAL-INPUT is a string inserted into the minibuffer initially.
-HISTORY is a list of previously selected inputs.
-DEF is the default value.
-INHERIT-INPUT-METHOD is currently ignored.
-
-\(fn PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HISTORY DEF INHERIT-INPUT-METHOD)" nil nil)
-
-(defvar ivy-mode nil "\
-Non-nil if Ivy mode is enabled.
-See the `ivy-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `ivy-mode'.")
-
-(custom-autoload 'ivy-mode "ivy" nil)
-
-(autoload 'ivy-mode "ivy" "\
-Toggle Ivy mode on or off.
-Turn Ivy mode on if ARG is positive, off otherwise.
-Turning on Ivy mode sets `completing-read-function' to
-`ivy-completing-read'.
-
-Global bindings:
-\\{ivy-mode-map}
-
-Minibuffer bindings:
-\\{ivy-minibuffer-map}
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'ivy-switch-buffer "ivy" "\
-Switch to another buffer.
-
-\(fn)" t nil)
-
-(autoload 'ivy-switch-view "ivy" "\
-Switch to one of the window views stored by `ivy-push-view'.
-
-\(fn)" t nil)
-
-(autoload 'ivy-switch-buffer-other-window "ivy" "\
-Switch to another buffer in another window.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ivy" '("ivy-" "with-ivy-window")))
-
-;;;***
-
-;;;### (autoloads nil "ivy-overlay" "ivy-overlay.el" (0 0 0 0))
-;;; Generated autoloads from ivy-overlay.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ivy-overlay" '("ivy-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("elpa.el" "ivy-faces.el" "ivy-pkg.el")
-;;;;;; (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; ivy-autoloads.el ends here
diff --git a/elpa/ivy-20200624.1140/ivy-faces.el b/elpa/ivy-20200624.1140/ivy-faces.el
deleted file mode 100644
index 54492c4..0000000
--- a/elpa/ivy-20200624.1140/ivy-faces.el
+++ /dev/null
@@ -1,138 +0,0 @@
-;;; ivy-faces.el --- Faces for Ivy -*- lexical-binding: t -*-
-
-;; Copyright (C) 2020 Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel <ohwoeowho@gmail.com>
-;; Keywords: convenience
-
-;; 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 this program. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;; Code:
-
-(defgroup ivy-faces nil
- "Font-lock faces for `ivy'."
- :group 'ivy
- :group 'faces)
-
-(defface ivy-current-match
- '((((class color) (background light))
- :background "#1a4b77" :foreground "white" :extend t)
- (((class color) (background dark))
- :background "#65a7e2" :foreground "black" :extend t))
- "Face used by Ivy for highlighting the current match.")
-
-(defface ivy-minibuffer-match-highlight
- '((t :inherit highlight))
- "Face used by Ivy for highlighting the match under the cursor.")
-
-(defface ivy-minibuffer-match-face-1
- '((((class color) (background light))
- :background "#d3d3d3")
- (((class color) (background dark))
- :background "#555555"))
- "The background face for `ivy' minibuffer matches.")
-
-(defface ivy-minibuffer-match-face-2
- '((((class color) (background light))
- :background "#e99ce8" :weight bold)
- (((class color) (background dark))
- :background "#777777" :weight bold))
- "Face for `ivy' minibuffer matches numbered 1 modulo 3.")
-
-(defface ivy-minibuffer-match-face-3
- '((((class color) (background light))
- :background "#bbbbff" :weight bold)
- (((class color) (background dark))
- :background "#7777ff" :weight bold))
- "Face for `ivy' minibuffer matches numbered 2 modulo 3.")
-
-(defface ivy-minibuffer-match-face-4
- '((((class color) (background light))
- :background "#ffbbff" :weight bold)
- (((class color) (background dark))
- :background "#8a498a" :weight bold))
- "Face for `ivy' minibuffer matches numbered 3 modulo 3.")
-
-(defface ivy-confirm-face
- '((t :foreground "ForestGreen" :inherit minibuffer-prompt))
- "Face used by Ivy for a confirmation prompt.")
-
-(defface ivy-match-required-face
- '((t :foreground "red" :inherit minibuffer-prompt))
- "Face used by Ivy for a match required prompt.")
-
-(defface ivy-subdir
- '((t :inherit dired-directory))
- "Face used by Ivy for highlighting subdirs in the alternatives.")
-
-(defface ivy-org
- '((t :inherit org-level-4))
- "Face used by Ivy for highlighting Org buffers in the alternatives.")
-
-(defface ivy-modified-buffer
- '((t :inherit default))
- "Face used by Ivy for highlighting modified file visiting buffers.")
-
-(defface ivy-modified-outside-buffer
- '((t :inherit default))
- "Face used by Ivy for highlighting file visiting buffers modified outside Emacs.")
-
-(defface ivy-remote
- '((((class color) (background light))
- :foreground "#110099")
- (((class color) (background dark))
- :foreground "#7B6BFF"))
- "Face used by Ivy for highlighting remotes in the alternatives.")
-
-(defface ivy-virtual
- '((t :inherit font-lock-builtin-face))
- "Face used by Ivy for matching virtual buffer names.")
-
-(defface ivy-action
- '((t :inherit font-lock-builtin-face))
- "Face used by Ivy for displaying keys in `ivy-read-action'.")
-
-(defface ivy-highlight-face
- '((t :inherit highlight))
- "Face used by Ivy to highlight certain candidates.")
-
-(defface ivy-prompt-match
- '((t :inherit ivy-current-match))
- "Face used by Ivy for highlighting the selected prompt line.")
-
-(defface ivy-separator
- '((t :inherit font-lock-doc-face))
- "Face for multiline source separator.")
-
-(defface ivy-grep-info
- '((t :inherit compilation-info))
- "Face for highlighting grep information such as file names.")
-
-(defface ivy-grep-line-number
- '((t :inherit compilation-line-number))
- "Face for displaying line numbers in grep messages.")
-
-(defface ivy-completions-annotations
- '((t :inherit completions-annotations))
- "Face for displaying completion annotations.")
-
-(defface ivy-yanked-word
- '((t :inherit highlight))
- "Face used to highlight yanked word.")
-
-(provide 'ivy-faces)
-
-;;; ivy-faces.el ends here
diff --git a/elpa/ivy-20200624.1140/ivy-help.org b/elpa/ivy-20200624.1140/ivy-help.org
deleted file mode 100644
index 3a94118..0000000
--- a/elpa/ivy-20200624.1140/ivy-help.org
+++ /dev/null
@@ -1,138 +0,0 @@
-* Ivy Generic Help
-
-=ivy= is an Emacs incremental completion framework.
-
-- Narrow the list by typing some pattern,
-- Multiple patterns are allowed by separating with a space,
-- Select with ~C-n~ and ~C-p~, choose with ~RET~.
-
-** Help
-
-- ~C-h m~ :: Pop to this generic help buffer.
-
-** Basic Operations
-*** Key bindings for navigation
-
-- ~C-n~ (=ivy-next-line=) :: next candidate.
-- ~C-p~ (=ivy-previous-line=) :: previous candidate.
-- ~C-v~ (=ivy-scroll-up-command=) :: next page.
-- ~M-v~ (=ivy-scroll-down-command=) :: previous page.
-- ~M-<~ (=ivy-beginning-of-buffer=) :: first candidate.
-- ~M->~ (=ivy-end-of-buffer=) :: last candidate.
-
-*** Key bindings for single selection
-
-When selecting a candidate, an action is called on it. You can think
-of an action as a function that takes the selected candidate as an
-argument and does something with it.
-
-Ivy can offer several actions from which to choose. This can be
-independently composed with whether you want to end completion when
-the action is called. Depending on this, the short term is either
-"calling an action" or "exiting with action".
-
-~C-m~ or ~RET~ (=ivy-done=) - exit with the current action.
-
-~M-o~ (=ivy-dispatching-done=) - select an action and exit with it.
-
-~C-j~ (=ivy-alt-done=) - when the candidate is a directory, enter
-it. Otherwise, exit with the current action.
-
-~TAB~ (=ivy-partial-or-done=) - attempt partial completion, extending
-the current input as much as possible. ~TAB TAB~ is the same as ~C-j~.
-
-~C-M-j~ (=ivy-immediate-done=) - exit with the current action, calling
-it on the /current input/ instead of the current candidate. This is
-useful especially when creating new files or directories - often the
-input will match an existing file, which you don't want to select.
-
-~C-'~ (=ivy-avy=) - select a candidate from the current page with avy
-and exit with the current action.
-
-** Advanced Operations
-*** Key bindings for multiple selection
-
-For repeatedly applying multiple actions or acting on multiple
-candidates, Ivy does not close the minibuffer between commands. It
-keeps the minibuffer open for applying subsequent actions.
-
-Adding an extra meta key to the normal key chord invokes the special
-version of the regular commands that enables applying multiple
-actions.
-
-~C-M-m~ (=ivy-call=) is the non-exiting version of ~C-m~ (=ivy-done=).
-
-~C-M-n~ (=ivy-next-line-and-call=) combines ~C-n~ and ~C-M-m~.
-
-~C-M-p~ (=ivy-previous-line-and-call=) combines ~C-p~ and ~C-M-m~.
-
-~C-M-o~ (=ivy-dispatching-call=) is a non-exiting version of ~M-o~
-(=ivy-dispatching-done=).
-
-*** Key bindings that alter the minibuffer input
-
-~M-n~ (=ivy-next-history-element=) select the next history element or
-symbol/URL at point.
-
-~M-p~ (=ivy-previous-history-element=) select the previous history
-element.
-
-~C-r~ (=ivy-reverse-i-search=) start a recursive completion session to
-select a history element.
-
-~M-i~ (=ivy-insert-current=) insert the current candidate into the
-minibuffer. Useful for copying and renaming files, for example: ~M-i~
-to insert the original file name string, edit it, and then ~C-m~ to
-complete the renaming.
-
-~M-j~ (=ivy-yank-word=) insert the sub-word at point into the
-minibuffer.
-
-~S-SPC~ (=ivy-restrict-to-matches=) deletes the current input, and
-resets the candidates list to the currently restricted matches. This
-is how Ivy provides narrowing in successive tiers.
-
-*** Other key bindings
-
-~M-w~ (=ivy-kill-ring-save=) copies the selected candidates to the
-kill ring; when the region is active, copies the active region.
-
-*** Saving the current completion session to a buffer
-
-~C-c C-o~ (=ivy-occur=) saves the current candidates to a new buffer;
-the list is active in the new buffer.
-
-~RET~ or ~mouse-1~ in the new buffer calls the appropriate action on
-the selected candidate.
-
-Ivy has no limit on the number of active buffers like these.
-
-Ivy takes care of making these buffer names unique. It applies
-descriptive names, for example: =*ivy-occur counsel-describe-variable
-"function$*=.
-
-*** Global key bindings
-
-=ivy-resume= recalls the state of the completion session just before
-its last exit. Useful after an accidental ~C-m~ (=ivy-done=).
-Recommended global binding: ~C-c C-r~.
-
-*** Hydra in the minibuffer
-
-~C-o~ (=hydra-ivy/body=) invokes Hydra menus with key shortcuts.
-
-When in Hydra, ~C-o~ or ~i~ resumes editing.
-
-Hydra reduces key strokes, for example: ~C-n C-n C-n C-n~ is ~C-o
-jjjj~ in Hydra. Besides certain shorter keys, Hydra shows useful info
-such as case folding and the current action.
-
-Additionally, here are the keys that are otherwise not bound:
-
-- ~<~ and ~>~ adjust the height of the minibuffer.
-- ~c~ (=ivy-toggle-calling=) - toggle calling the current action each
- time a different candidate is selected.
-- ~M~ (=ivy-rotate-preferred-builders=) - rotate regex matcher.
-- ~w~ and ~s~ scroll the actions list.
-
-Minibuffer editing is disabled when Hydra is active.
diff --git a/elpa/ivy-20200624.1140/ivy-overlay.el b/elpa/ivy-20200624.1140/ivy-overlay.el
deleted file mode 100644
index ed77fc0..0000000
--- a/elpa/ivy-20200624.1140/ivy-overlay.el
+++ /dev/null
@@ -1,155 +0,0 @@
-;;; ivy-overlay.el --- Overlay display functions for Ivy -*- lexical-binding: t -*-
-
-;; Copyright (C) 2016-2019 Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel <ohwoeowho@gmail.com>
-;; Keywords: convenience
-
-;; 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 this program. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package allows to setup Ivy's completion at point to actually
-;; show the candidates and the input at point, instead of in the
-;; minibuffer.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(defface ivy-cursor
- '((((class color) (background light))
- :background "black" :foreground "white")
- (((class color) (background dark))
- :background "white" :foreground "black"))
- "Cursor face for inline completion."
- :group 'ivy-faces)
-
-(defvar ivy--old-cursor-type t)
-
-(defvar ivy-overlay-at nil
- "Overlay variable for `ivy-display-function-overlay'.")
-
-(declare-function ivy--truncate-string "ivy")
-
-(defun ivy-left-pad (str width)
- "Return STR, but with each line indented by WIDTH spaces.
-Lines are truncated to the window width."
- (let ((padding (make-string width ?\s)))
- (mapconcat (lambda (x)
- (ivy--truncate-string (concat padding x)
- (1- (+ (window-width)
- (window-hscroll)))))
- (split-string str "\n")
- "\n")))
-
-(defun ivy-overlay-cleanup ()
- "Clean up after `ivy-display-function-overlay'."
- (when (overlayp ivy-overlay-at)
- (delete-overlay ivy-overlay-at)
- (setq ivy-overlay-at nil))
- (unless cursor-type
- (setq cursor-type ivy--old-cursor-type))
- (when (fboundp 'company-abort)
- (company-abort)))
-
-(defvar ivy-height)
-
-(defun ivy-overlay-show-after (str)
- "Display STR in an overlay at point.
-
-First, fill each line of STR with spaces to the current column.
-Then attach the overlay to the character before point."
- (if ivy-overlay-at
- (progn
- (move-overlay ivy-overlay-at (1- (point)) (line-end-position))
- (overlay-put ivy-overlay-at 'invisible nil))
- (let ((available-height (- (window-height) (count-lines (window-start) (point)) 1)))
- (unless (>= available-height ivy-height)
- (recenter (- (window-height) ivy-height 2))))
- (setq ivy-overlay-at (make-overlay (1- (point)) (line-end-position)))
- ;; Specify face to avoid clashing with other overlays.
- (overlay-put ivy-overlay-at 'face 'default)
- (overlay-put ivy-overlay-at 'priority 9999))
- (overlay-put ivy-overlay-at 'display str)
- (overlay-put ivy-overlay-at 'after-string ""))
-
-(declare-function org-current-level "org")
-(declare-function org-at-heading-p "org")
-(defvar org-indent-indentation-per-level)
-(defvar ivy-height)
-(defvar ivy-last)
-(defvar ivy-text)
-(defvar ivy-completion-beg)
-(declare-function ivy--get-window "ivy")
-(declare-function ivy-state-current "ivy")
-(declare-function ivy-state-window "ivy")
-
-(defun ivy-overlay-impossible-p (_str)
- (or
- (and (eq major-mode 'org-mode)
- (plist-get (text-properties-at (point)) 'src-block))
- (<= (window-height) (+ ivy-height 2))
- (= (point) (point-min))
- (< (- (+ (window-width) (window-hscroll)) (current-column))
- 30)))
-
-(defun ivy-display-function-overlay (str)
- "Called from the minibuffer, display STR in an overlay in Ivy window.
-Hide the minibuffer contents and cursor."
- (if (save-selected-window
- (select-window (ivy-state-window ivy-last))
- (ivy-overlay-impossible-p str))
- (let ((buffer-undo-list t))
- (save-excursion
- (forward-line 1)
- (insert str)))
- (add-face-text-property (minibuffer-prompt-end) (point-max)
- '(:foreground "white"))
- (setq cursor-type nil)
- (with-selected-window (ivy--get-window ivy-last)
- (when cursor-type
- (setq ivy--old-cursor-type cursor-type))
- (setq cursor-type nil)
- (let ((overlay-str
- (apply
- #'concat
- (buffer-substring (max (point-min) (1- (point))) (point))
- ivy-text
- (and (eolp) " ")
- (buffer-substring (point) (line-end-position))
- (and (> (length str) 0)
- (list "\n"
- (ivy-left-pad
- (string-remove-prefix "\n" str)
- (+
- (if (and (eq major-mode 'org-mode)
- (bound-and-true-p org-indent-mode))
- (if (org-at-heading-p)
- (1- (org-current-level))
- (* org-indent-indentation-per-level (or (org-current-level) 1)))
- 0)
- (save-excursion
- (when ivy-completion-beg
- (goto-char ivy-completion-beg))
- (current-column)))))))))
- (let ((cursor-offset (1+ (length ivy-text))))
- (add-face-text-property cursor-offset (1+ cursor-offset)
- 'ivy-cursor t overlay-str))
- (ivy-overlay-show-after overlay-str)))))
-
-(provide 'ivy-overlay)
-
-;;; ivy-overlay.el ends here
diff --git a/elpa/ivy-20200624.1140/ivy-pkg.el b/elpa/ivy-20200624.1140/ivy-pkg.el
deleted file mode 100644
index 170c86c..0000000
--- a/elpa/ivy-20200624.1140/ivy-pkg.el
+++ /dev/null
@@ -1,12 +0,0 @@
-(define-package "ivy" "20200624.1140" "Incremental Vertical completYon"
- '((emacs "24.5"))
- :commit "c6b60d34ac37bf4d91a25f16d22e528f85e06938" :keywords
- '("matching")
- :authors
- '(("Oleh Krehel" . "ohwoeowho@gmail.com"))
- :maintainer
- '("Oleh Krehel" . "ohwoeowho@gmail.com")
- :url "https://github.com/abo-abo/swiper")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/ivy-20200624.1140/ivy.el b/elpa/ivy-20200624.1140/ivy.el
deleted file mode 100644
index d4c0b81..0000000
--- a/elpa/ivy-20200624.1140/ivy.el
+++ /dev/null
@@ -1,5255 +0,0 @@
-;;; ivy.el --- Incremental Vertical completYon -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel <ohwoeowho@gmail.com>
-;; URL: https://github.com/abo-abo/swiper
-;; Version: 0.13.0
-;; Package-Requires: ((emacs "24.5"))
-;; Keywords: matching
-
-;; This file is part of GNU Emacs.
-
-;; This file 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, 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.
-
-;; For a full copy of the GNU General Public License
-;; see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package provides `ivy-read' as an alternative to
-;; `completing-read' and similar functions.
-;;
-;; There's no intricate code to determine the best candidate.
-;; Instead, the user can navigate to it with `ivy-next-line' and
-;; `ivy-previous-line'.
-;;
-;; The matching is done by splitting the input text by spaces and
-;; re-building it into a regex.
-;; So "for example" is transformed into "\\(for\\).*\\(example\\)".
-
-;;; Code:
-
-(require 'colir)
-(require 'ivy-overlay)
-(require 'ivy-faces)
-
-(require 'cl-lib)
-(require 'ring)
-
-(eval-when-compile
- (require 'subr-x))
-
-;;* Customization
-(defgroup ivy nil
- "Incremental vertical completion."
- :group 'convenience)
-
-(defcustom ivy-height 10
- "Number of lines for the minibuffer window.
-
-See also `ivy-height-alist'."
- :type 'integer)
-
-(defcustom ivy-count-format "%-4d "
- "The style to use for displaying the current candidate count for `ivy-read'.
-Set this to \"\" to suppress the count visibility.
-Set this to \"(%d/%d) \" to display both the index and the count."
- :type '(choice
- (const :tag "Count disabled" "")
- (const :tag "Count matches" "%-4d ")
- (const :tag "Count matches and show current match" "(%d/%d) ")
- string))
-
-(defcustom ivy-pre-prompt-function nil
- "When non-nil, add strings before the `ivy-read' prompt."
- :type '(choice
- (const :tag "Do nothing" nil)
- (function :tag "Custom function")))
-
-(defcustom ivy-add-newline-after-prompt nil
- "When non-nil, add a newline after the `ivy-read' prompt."
- :type 'boolean)
-
-(defcustom ivy-wrap nil
- "When non-nil, wrap around after the first and the last candidate."
- :type 'boolean)
-
-(defcustom ivy-display-style 'fancy
- "The style for formatting the minibuffer.
-
-By default, the matched strings are copied as is.
-
-The fancy display style highlights matching parts of the regexp,
-a behavior similar to `swiper'."
- :type '(choice
- (const :tag "Plain" nil)
- (const :tag "Fancy" fancy)))
-
-(defcustom ivy-on-del-error-function #'abort-recursive-edit
- "Function to call when deletion fails during completion.
-The usual reason for `ivy-backward-delete-char' to fail is when
-there is no text left to delete, i.e., when it is called at the
-beginning of the minibuffer.
-The default setting provides a quick exit from completion."
- :type '(choice
- (const :tag "Exit completion" abort-recursive-edit)
- (const :tag "Do nothing" ignore)
- (function :tag "Custom function")))
-
-(defcustom ivy-extra-directories '("../" "./")
- "Add this to the front of the list when completing file names.
-Only \"./\" and \"../\" apply here. They appear in reverse order."
- :type '(repeat :tag "Dirs"
- (choice
- (const :tag "Parent Directory" "../")
- (const :tag "Current Directory" "./"))))
-
-(defcustom ivy-use-virtual-buffers nil
- "When non-nil, add recent files and/or bookmarks to `ivy-switch-buffer'.
-The value `recentf' includes only recent files to the virtual
-buffers list, whereas the value `bookmarks' does the same for
-bookmarks. Any other non-nil value includes both."
- :type '(choice
- (const :tag "Don't use virtual buffers" nil)
- (const :tag "Recent files" recentf)
- (const :tag "Bookmarks" bookmarks)
- (const :tag "All virtual buffers" t)))
-
-(defvar ivy--display-function nil
- "The display-function is used in current.")
-
-(defvar ivy-display-functions-props
- '((ivy-display-function-overlay :cleanup ivy-overlay-cleanup))
- "Map Ivy display functions to their property lists.
-Examples of properties include associated `:cleanup' functions.")
-
-(defcustom ivy-display-functions-alist
- '((ivy-completion-in-region . ivy-display-function-overlay)
- (t . nil))
- "An alist for customizing where to display the candidates.
-
-Each key is a caller symbol. When the value is nil (the default),
-the candidates are shown in the minibuffer. Otherwise, the value
-is a function which takes a string argument comprising the
-current matching candidates and displays it somewhere.
-
-See also `https://github.com/abo-abo/swiper/wiki/ivy-display-function'."
- :type '(alist
- :key-type symbol
- :value-type (choice
- (const :tag "Minibuffer" nil)
- (const :tag "LV" ivy-display-function-lv)
- (const :tag "Popup" ivy-display-function-popup)
- (const :tag "Overlay" ivy-display-function-overlay)
- (function :tag "Custom function"))))
-
-(defvar ivy-completing-read-dynamic-collection nil
- "Run `ivy-completing-read' with `:dynamic-collection t`.")
-
-(defcustom ivy-completing-read-handlers-alist
- '((tmm-menubar . completing-read-default)
- (tmm-shortcut . completing-read-default)
- (bbdb-create . ivy-completing-read-with-empty-string-def)
- (auto-insert . ivy-completing-read-with-empty-string-def)
- (Info-on-current-buffer . ivy-completing-read-with-empty-string-def)
- (Info-follow-reference . ivy-completing-read-with-empty-string-def)
- (Info-menu . ivy-completing-read-with-empty-string-def)
- (Info-index . ivy-completing-read-with-empty-string-def)
- (Info-virtual-index . ivy-completing-read-with-empty-string-def)
- (info-display-manual . ivy-completing-read-with-empty-string-def))
- "An alist of handlers to replace `completing-read' in `ivy-mode'."
- :type '(alist :key-type symbol :value-type function))
-
-(defcustom ivy-height-alist nil
- "An alist to customize `ivy-height'.
-
-It is a list of (CALLER . HEIGHT). CALLER is a caller of
-`ivy-read' and HEIGHT is the number of lines displayed.
-HEIGHT can also be a function that returns the number of lines."
- :type '(alist
- :key-type function
- :value-type (choice integer function)))
-
-(defvar ivy-completing-read-ignore-handlers-depth -1
- "Used to avoid infinite recursion.
-
-If `(minibuffer-depth)' equals this, `ivy-completing-read' will
-act as if `ivy-completing-read-handlers-alist' is empty.")
-
-(defvar ivy-highlight-grep-commands nil
- "List of grep-like commands.")
-
-(defvar ivy--actions-list nil
- "A list of extra actions per command.")
-
-(defun ivy-set-actions (cmd actions)
- "Set CMD extra exit points to ACTIONS."
- (setq ivy--actions-list
- (plist-put ivy--actions-list cmd actions)))
-
-(defun ivy-add-actions (cmd actions)
- "Add extra exit points ACTIONS to CMD.
-Existing exit points of CMD are overwritten by those in
-ACTIONS that have the same key."
- (setq ivy--actions-list
- (plist-put ivy--actions-list cmd
- (cl-delete-duplicates
- (append (plist-get ivy--actions-list cmd) actions)
- :key #'car :test #'equal))))
-
-(defun ivy--compute-extra-actions (action caller)
- "Add extra actions to ACTION based on CALLER."
- (let* ((extra-actions (cl-delete-duplicates
- (append (plist-get ivy--actions-list t)
- (plist-get ivy--actions-list this-command)
- (plist-get ivy--actions-list caller))
- :key #'car :test #'equal))
- (override-default (assoc "o" extra-actions)))
- (cond (override-default
- (cons 1 (cons override-default
- (cl-delete "o" extra-actions
- :key #'car :test #'equal))))
- ((not extra-actions)
- action)
- ((functionp action)
- `(1
- ("o" ,action "default")
- ,@extra-actions))
- ((null action)
- `(1
- ("o" identity "default")
- ,@extra-actions))
- (t
- (cons (car action)
- (cl-delete-duplicates (cdr (append action extra-actions))
- :key #'car :test #'equal :from-end t))))))
-
-(defvar ivy--prompts-list nil)
-
-(defun ivy-set-prompt (caller prompt-fn)
- "Associate CALLER with PROMPT-FN.
-PROMPT-FN is a function of no arguments that returns a prompt string."
- (setq ivy--prompts-list
- (plist-put ivy--prompts-list caller prompt-fn)))
-
-(defvar ivy--display-transformers-alist nil
- "A list of str->str transformers per command.")
-
-(defun ivy-set-display-transformer (cmd transformer)
- "Set CMD a displayed candidate TRANSFORMER.
-
-It's a lambda that takes a string one of the candidates in the
-collection and returns a string for display, the same candidate
-plus some extra information.
-
-This lambda is called only on the `ivy-height' candidates that
-are about to be displayed, not on the whole collection."
- (declare (obsolete "Use `ivy-configure' :display-transformer-fn" "<2020-05-20 Wed>"))
- (ivy--alist-set 'ivy--display-transformers-alist cmd transformer))
-
-(defvar ivy--sources-list nil
- "A list of extra sources per command.")
-
-(defun ivy-set-sources (cmd sources)
- "Attach to CMD a list of extra SOURCES.
-
-Each static source is a function that takes no argument and
-returns a list of strings.
-
-The (original-source) determines the position of the original
-dynamic source.
-
-Extra dynamic sources aren't supported yet.
-
-Example:
-
- (defun small-recentf ()
- (cl-subseq recentf-list 0 20))
-
- (ivy-set-sources
- 'counsel-locate
- '((small-recentf)
- (original-source)))"
- (setq ivy--sources-list
- (plist-put ivy--sources-list cmd sources)))
-
-(defun ivy--compute-extra-candidates (caller)
- (let ((extra-sources (or (plist-get ivy--sources-list caller)
- '((original-source))))
- (result nil))
- (dolist (source extra-sources)
- (cond ((equal source '(original-source))
- (push source result))
- ((null (cdr source))
- (push (list (car source) (funcall (car source))) result))))
- result))
-
-(defvar ivy-current-prefix-arg nil
- "Prefix arg to pass to actions.
-This is a global variable that is set by ivy functions for use in
-action functions.")
-
-;;* Keymap
-(require 'delsel)
-(defun ivy-define-key (keymap key def)
- "Forward to (`define-key' KEYMAP KEY DEF).
-Remove DEF from `counsel-M-x' list."
- (put def 'no-counsel-M-x t)
- (define-key keymap key def))
-
-(defvar ivy-minibuffer-map
- (let ((map (make-sparse-keymap)))
- (ivy-define-key map (kbd "C-m") 'ivy-done)
- (define-key map [down-mouse-1] 'ignore)
- (ivy-define-key map [mouse-1] 'ivy-mouse-done)
- (ivy-define-key map [mouse-3] 'ivy-mouse-dispatching-done)
- (ivy-define-key map (kbd "C-M-m") 'ivy-call)
- (ivy-define-key map (kbd "C-j") 'ivy-alt-done)
- (ivy-define-key map (kbd "C-M-j") 'ivy-immediate-done)
- (ivy-define-key map (kbd "TAB") 'ivy-partial-or-done)
- (ivy-define-key map [remap next-line] 'ivy-next-line)
- (ivy-define-key map [remap previous-line] 'ivy-previous-line)
- (ivy-define-key map (kbd "C-r") 'ivy-reverse-i-search)
- (define-key map (kbd "SPC") 'self-insert-command)
- (ivy-define-key map [remap delete-backward-char] 'ivy-backward-delete-char)
- (ivy-define-key map [remap backward-delete-char-untabify] 'ivy-backward-delete-char)
- (ivy-define-key map [remap backward-kill-word] 'ivy-backward-kill-word)
- (ivy-define-key map [remap delete-char] 'ivy-delete-char)
- (ivy-define-key map [remap forward-char] 'ivy-forward-char)
- (ivy-define-key map (kbd "<right>") 'ivy-forward-char)
- (ivy-define-key map [remap kill-word] 'ivy-kill-word)
- (ivy-define-key map [remap beginning-of-buffer] 'ivy-beginning-of-buffer)
- (ivy-define-key map [remap end-of-buffer] 'ivy-end-of-buffer)
- (ivy-define-key map (kbd "M-n") 'ivy-next-history-element)
- (ivy-define-key map (kbd "M-p") 'ivy-previous-history-element)
- (define-key map (kbd "C-g") 'minibuffer-keyboard-quit)
- (ivy-define-key map [remap scroll-up-command] 'ivy-scroll-up-command)
- (ivy-define-key map [remap scroll-down-command] 'ivy-scroll-down-command)
- (ivy-define-key map (kbd "<next>") 'ivy-scroll-up-command)
- (ivy-define-key map (kbd "<prior>") 'ivy-scroll-down-command)
- (ivy-define-key map (kbd "C-v") 'ivy-scroll-up-command)
- (ivy-define-key map (kbd "M-v") 'ivy-scroll-down-command)
- (ivy-define-key map (kbd "C-M-n") 'ivy-next-line-and-call)
- (ivy-define-key map (kbd "C-M-p") 'ivy-previous-line-and-call)
- (ivy-define-key map (kbd "M-a") 'ivy-toggle-marks)
- (ivy-define-key map (kbd "M-r") 'ivy-toggle-regexp-quote)
- (ivy-define-key map (kbd "M-j") 'ivy-yank-word)
- (ivy-define-key map (kbd "M-i") 'ivy-insert-current)
- (ivy-define-key map (kbd "C-M-y") 'ivy-insert-current-full)
- (ivy-define-key map (kbd "C-o") 'hydra-ivy/body)
- (ivy-define-key map (kbd "M-o") 'ivy-dispatching-done)
- (ivy-define-key map (kbd "C-M-o") 'ivy-dispatching-call)
- (ivy-define-key map [remap kill-line] 'ivy-kill-line)
- (ivy-define-key map [remap kill-whole-line] 'ivy-kill-whole-line)
- (ivy-define-key map (kbd "S-SPC") 'ivy-restrict-to-matches)
- (ivy-define-key map [remap kill-ring-save] 'ivy-kill-ring-save)
- (ivy-define-key map (kbd "C-M-a") 'ivy-read-action)
- (ivy-define-key map (kbd "C-c C-o") 'ivy-occur)
- (ivy-define-key map (kbd "C-c C-a") 'ivy-toggle-ignore)
- (ivy-define-key map (kbd "C-c C-s") 'ivy-rotate-sort)
- (ivy-define-key map [remap describe-mode] 'ivy-help)
- (ivy-define-key map "$" 'ivy-magic-read-file-env)
- map)
- "Keymap used in the minibuffer.")
-(autoload 'hydra-ivy/body "ivy-hydra" "" t)
-(autoload 'ivy-hydra-read-action "ivy-hydra" "" t)
-
-(defvar ivy-mode-map
- (let ((map (make-sparse-keymap)))
- (ivy-define-key map [remap switch-to-buffer] 'ivy-switch-buffer)
- (ivy-define-key map [remap switch-to-buffer-other-window] 'ivy-switch-buffer-other-window)
- map)
- "Keymap for `ivy-mode'.")
-
-;;* Globals
-(cl-defstruct ivy-state
- prompt collection
- predicate require-match initial-input
- history preselect keymap update-fn sort
- ;; The frame in which `ivy-read' was called
- frame
- ;; The window in which `ivy-read' was called
- window
- ;; The buffer in which `ivy-read' was called
- buffer
- ;; The value of `ivy-text' to be used by `ivy-occur'
- text
- action
- unwind
- re-builder
- matcher
- ;; When this is non-nil, call it for each input change to get new candidates
- dynamic-collection
- ;; A lambda that transforms candidates only for display
- display-transformer-fn
- directory
- caller
- current
- def
- ignore
- multi-action
- extra-props)
-
-(defvar ivy-last (make-ivy-state)
- "The last parameters passed to `ivy-read'.
-
-This should eventually become a stack so that you could use
-`ivy-read' recursively.")
-
-(defvar ivy--sessions nil
- "Alist mapping session symbols to `ivy-state' objects.")
-
-(defvar ivy-recursive-last nil)
-
-(defvar ivy-recursive-restore t
- "When non-nil, restore the above state when exiting the minibuffer.
-This variable is let-bound to nil by functions that take care of
-the restoring themselves.")
-
-(defsubst ivy-set-action (action)
- "Set the current `ivy-last' field to ACTION."
- (setf (ivy-state-action ivy-last) action))
-
-(defvar inhibit-message)
-
-(defvar ffap-machine-p-known)
-
-(defun ivy-thing-at-point ()
- "Return a string that corresponds to the current thing at point."
- (substring-no-properties
- (cond
- ((use-region-p)
- (let* ((beg (region-beginning))
- (end (region-end))
- (eol (save-excursion (goto-char beg) (line-end-position))))
- (buffer-substring-no-properties beg (min end eol))))
- ((thing-at-point 'url))
- ((and (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
- (let ((inhibit-message t)
- (ffap-machine-p-known 'reject))
- (run-hook-with-args-until-success 'file-name-at-point-functions))))
- ((let ((s (thing-at-point 'symbol)))
- (and (stringp s)
- (if (string-match "\\`[`']?\\(.*?\\)'?\\'" s)
- (match-string 1 s)
- s))))
- ((looking-at "(+\\(\\(?:\\sw\\|\\s_\\)+\\)\\_>")
- (match-string-no-properties 1))
- (t
- ""))))
-
-(defvar ivy-history nil
- "History list of candidates entered in the minibuffer.
-
-Maximum length of the history list is determined by the value
-of `history-length'.")
-
-(defvar ivy--directory nil
- "Current directory when completing file names.")
-
-(defvar ivy--directory-hist nil
- "Store the history of directories.
-This allows RET to reverse consecutive DEL.")
-
-(defvar ivy--length 0
- "Store the amount of viable candidates.")
-
-(defvar ivy-text ""
- "Store the user's string as it is typed in.")
-
-(defvar ivy-regex ""
- "Store the regex value that corresponds to `ivy-text'.")
-
-(defvar ivy--regex-function 'ivy--regex
- "Current function for building a regex.")
-
-(defun ivy-set-text (str)
- "Set `ivy-text' to STR."
- (setq ivy-text str)
- (setq ivy-regex (funcall ivy--regex-function ivy-text)))
-
-(defvar ivy--index 0
- "Store the index of the current candidate.")
-
-(defvar ivy--window-index 0
- "Store the index of the current candidate in the minibuffer window.
-
-This means it's between 0 and `ivy-height'.")
-
-(defvar ivy-exit nil
- "Store `done' if the completion was successfully selected.
-Otherwise, store nil.")
-
-(defvar ivy--all-candidates nil
- "Store the candidates passed to `ivy-read'.")
-
-(defvar ivy--extra-candidates '((original-source))
- "Store candidates added by the extra sources.
-
-This is an internal-use alist. Each key is a function name, or
-original-source (which represents where the current dynamic
-candidates should go).
-
-Each value is an evaluation of the function, in case of static
-sources. These values will subsequently be filtered on `ivy-text'.
-
-This variable is set by `ivy-read' and used by `ivy--set-candidates'.")
-
-(defcustom ivy-use-ignore-default t
- "The default policy for user-configured candidate filtering."
- :type '(choice
- (const :tag "Ignore ignored always" always)
- (const :tag "Ignore ignored when others exist" t)
- (const :tag "Don't ignore" nil)))
-
-(defvar ivy-use-ignore t
- "Store policy for user-configured candidate filtering.
-This may be changed dynamically by `ivy-toggle-ignore'.
-Use `ivy-use-ignore-default' for a permanent configuration.")
-
-(defvar ivy--default nil
- "Default initial input.")
-
-(defvar ivy--prompt nil
- "Store the format-style prompt.
-When non-nil, it should contain at least one %d.")
-
-(defvar ivy--prompt-extra ""
- "Temporary modifications to the prompt.")
-
-(defvar ivy--old-re nil
- "Store the old regexp.
-Either a string or a list for `ivy-re-match'.")
-
-(defvar ivy--old-cands nil
- "Store the candidates matched by `ivy--old-re'.")
-
-(defvar ivy--highlight-function 'ivy--highlight-default
- "Current function for formatting the candidates.")
-
-(defvar ivy--subexps 0
- "Number of groups in the current `ivy--regex'.")
-
-(defvar ivy--full-length nil
- "The total amount of candidates when :dynamic-collection is non-nil.")
-
-(defvar ivy--old-text ""
- "Store old `ivy-text' for dynamic completion.")
-
-(defvar ivy--trying-to-resume-dynamic-collection nil
- "Non-nil if resuming from a dynamic collection.
-When non-nil, ivy will wait until the first chunk of asynchronous
-candidates has been received before selecting the last
-preselected candidate.")
-
-(defun ivy--set-index-dynamic-collection ()
- (when ivy--trying-to-resume-dynamic-collection
- (let ((preselect-index
- (ivy--preselect-index (ivy-state-preselect ivy-last) ivy--all-candidates)))
- (when preselect-index
- (ivy-set-index preselect-index)))
- (setq ivy--trying-to-resume-dynamic-collection nil)))
-
-(defcustom ivy-case-fold-search-default
- (if search-upper-case
- 'auto
- case-fold-search)
- "The default value for `case-fold-search' in Ivy operations.
-The special value `auto' means case folding is performed so long
-as the entire input string comprises lower-case characters. This
-corresponds to the default behaviour of most Emacs search
-functionality, e.g. as seen in `isearch'."
- :link '(info-link "(emacs)Lax Search")
- :type '(choice
- (const :tag "Auto" auto)
- (const :tag "Always" t)
- (const :tag "Never" nil)))
-
-(defvar ivy-case-fold-search ivy-case-fold-search-default
- "Store the current overriding `case-fold-search'.")
-
-(defvar ivy-more-chars-alist
- '((t . 3))
- "Map commands to their minimum required input length.
-That is the number of characters prompted for before fetching
-candidates. The special key t is used as a fallback.")
-
-(defun ivy-more-chars ()
- "Return two fake candidates prompting for at least N input.
-N is obtained from `ivy-more-chars-alist'."
- (let ((diff (- (ivy-alist-setting ivy-more-chars-alist)
- (length ivy-text))))
- (when (> diff 0)
- (list "" (format "%d chars more" diff)))))
-
-(defun ivy--case-fold-p (string)
- "Return nil if STRING should be matched case-sensitively."
- (if (eq ivy-case-fold-search 'auto)
- (string= string (downcase string))
- ivy-case-fold-search))
-
-(defun ivy--case-fold-string= (s1 s2)
- "Like `string=', but obeys `case-fold-search'."
- (eq t (compare-strings s1 nil nil s2 nil nil case-fold-search)))
-
-(defmacro ivy-quit-and-run (&rest body)
- "Quit the minibuffer and run BODY afterwards."
- (declare (indent 0))
- `(progn
- (put 'quit 'error-message "")
- (run-at-time nil nil
- (lambda ()
- (put 'quit 'error-message "Quit")
- (with-demoted-errors "Error: %S"
- ,@body)))
- (abort-recursive-edit)))
-
-(defun ivy-exit-with-action (action &optional exit-code)
- "Quit the minibuffer and call ACTION afterwards."
- (ivy-set-action
- `(lambda (x)
- (funcall ',action x)
- (ivy-set-action ',(ivy-state-action ivy-last))))
- (setq ivy-exit (or exit-code 'done))
- (exit-minibuffer))
-
-(defmacro with-ivy-window (&rest body)
- "Execute BODY in the window from which `ivy-read' was called."
- (declare (indent 0)
- (debug t))
- `(with-selected-window (ivy--get-window ivy-last)
- ,@body))
-
-(defun ivy--expand-file-name (text)
- (cond
- ((eq (ivy-state-history ivy-last) 'grep-files-history)
- text)
- (ivy--directory
- (if (and (string-match-p "^/" text) (file-remote-p ivy--directory))
- (let ((parts (split-string ivy--directory ":")))
- (concat (nth 0 parts) ":" (nth 1 parts) ":" text))
- (expand-file-name text ivy--directory)))
- (t
- text)))
-
-(defun ivy--done (text)
- "Insert TEXT and exit minibuffer."
- (if (member (ivy-state-prompt ivy-last) '("Create directory: " "Make directory: "))
- (ivy-immediate-done)
- (when (stringp text)
- (insert
- (setf (ivy-state-current ivy-last)
- (ivy--expand-file-name text))))
- (setq ivy-exit 'done)
- (exit-minibuffer)))
-
-(defcustom ivy-use-selectable-prompt nil
- "When non-nil, make the prompt line selectable like a candidate.
-
-The prompt line can be selected by calling `ivy-previous-line' when the first
-regular candidate is selected. Both actions `ivy-done' and `ivy-alt-done',
-when called on a selected prompt, are forwarded to `ivy-immediate-done', which
-results to the same as calling `ivy-immediate-done' explicitly when a regular
-candidate is selected.
-
-Note that if `ivy-wrap' is set to t, calling `ivy-previous-line' when the
-prompt is selected wraps around to the last candidate, while calling
-`ivy-next-line' on the last candidate wraps around to the first
-candidate, not the prompt."
- :type 'boolean)
-
-(defvar ivy--use-selectable-prompt nil
- "Store the effective `ivy-use-selectable-prompt' for current session.")
-
-(defun ivy--prompt-selectable-p ()
- "Return t if the prompt line is selectable."
- (and ivy-use-selectable-prompt
- (or (memq (ivy-state-require-match ivy-last)
- '(nil confirm confirm-after-completion))
- ;; :require-match is t, but "" is in the collection
- (let ((coll (ivy-state-collection ivy-last)))
- (and (listp coll)
- (if (consp (car coll))
- (member '("") coll)
- (member "" coll)))))))
-
-(defun ivy--prompt-selected-p ()
- "Return t if the prompt line is selected."
- (and ivy--use-selectable-prompt
- (= ivy--index -1)))
-
-;;* Commands
-(defun ivy-done ()
- "Exit the minibuffer with the selected candidate."
- (interactive)
- (if (ivy--prompt-selected-p)
- (ivy-immediate-done)
- (setq ivy-current-prefix-arg current-prefix-arg)
- (delete-minibuffer-contents)
- (cond ((and (= ivy--length 0)
- (eq this-command 'ivy-dispatching-done))
- (ivy--done ivy-text))
- ((or (> ivy--length 0)
- ;; the action from `ivy-dispatching-done' may not need a
- ;; candidate at all
- (eq this-command 'ivy-dispatching-done))
- (ivy--done (ivy-state-current ivy-last)))
- ((and (memq (ivy-state-collection ivy-last)
- '(read-file-name-internal internal-complete-buffer))
- (eq confirm-nonexistent-file-or-buffer t)
- (not (string= " (confirm)" ivy--prompt-extra)))
- (setq ivy--prompt-extra " (confirm)")
- (insert ivy-text)
- (ivy--exhibit))
- ((memq (ivy-state-require-match ivy-last)
- '(nil confirm confirm-after-completion))
- (ivy--done ivy-text))
- (t
- (setq ivy--prompt-extra " (match required)")
- (insert ivy-text)
- (ivy--exhibit)))))
-
-(defvar ivy-mouse-1-tooltip
- "Exit the minibuffer with the selected candidate."
- "The doc visible in the tooltip for mouse-1 binding in the minibuffer.")
-(defvar ivy-mouse-3-tooltip
- "Display alternative actions."
- "The doc visible in the tooltip for mouse-3 binding in the minibuffer.")
-
-(defun ivy-mouse-offset (event)
- "Compute the offset between the candidate at point and the selected one."
- (if event
- (let* ((line-number-at-point
- (max 2
- (line-number-at-pos (posn-point (event-start event)))))
-
- (line-number-candidate ;; convert to 0 based index
- (- line-number-at-point 2))
- (offset
- (- line-number-candidate
- ivy--window-index)))
- offset)
- nil))
-
-(defun ivy-mouse-done (event)
- (interactive "@e")
- (let ((offset (ivy-mouse-offset event)))
- (when offset
- (ivy-next-line offset)
- (ivy--exhibit)
- (ivy-alt-done))))
-
-(defun ivy-mouse-dispatching-done (event)
- (interactive "@e")
- (let ((offset (ivy-mouse-offset event)))
- (when offset
- (ivy-next-line offset)
- (ivy--exhibit)
- (ivy-dispatching-done))))
-
-(defcustom ivy-read-action-format-function 'ivy-read-action-format-default
- "Function used to transform the actions list into a docstring."
- :type '(radio
- (function-item ivy-read-action-format-default)
- (function-item ivy-read-action-format-columns)))
-
-(defun ivy-read-action-format-default (actions)
- "Create a docstring from ACTIONS.
-
-ACTIONS is a list. Each list item is a list of 3 items:
-key (a string), cmd and doc (a string)."
- (format "%s\n%s\n"
- (if (eq this-command 'ivy-read-action)
- "Select action: "
- (ivy-state-current ivy-last))
- (mapconcat
- (lambda (x)
- (format "%s: %s"
- (propertize
- (car x)
- 'face 'ivy-action)
- (nth 2 x)))
- actions
- "\n")))
-
-(defun ivy-read-action-format-columns (actions)
- "Create a docstring from ACTIONS, using several columns if needed to preserve `ivy-height'.
-
-ACTIONS is a list. Each list item is a list of 3 items: key (a
-string), cmd and doc (a string)."
- (let ((length (length actions))
- (i 0)
- (max-rows (- ivy-height 1))
- rows cols col lwidth rwidth)
- (while (< i length)
- (setq col (cl-subseq actions i (min length (cl-incf i max-rows))))
- (setq lwidth (apply 'max (mapcar (lambda (x)
- (length (nth 0 x)))
- col)))
- (setq rwidth (apply 'max (mapcar (lambda (x)
- (length (nth 2 x)))
- col)))
- (setq col (mapcar (lambda (x)
- (format (format "%%%ds: %%-%ds" lwidth rwidth)
- (propertize (car x) 'face 'ivy-action)
- (nth 2 x)))
- col))
- (cond
- ((null rows)
- (setq rows (length col)))
- ((< (length col) rows)
- (setq col (append col (make-list (- rows (length col)) "")))))
- (push col cols))
- (format "%s\n%s\n"
- (if (eq this-command 'ivy-read-action)
- "Select action: "
- (ivy-state-current ivy-last))
- (mapconcat 'identity
- (apply 'cl-mapcar
- (lambda (&rest args)
- (mapconcat 'identity args " | "))
- (nreverse cols))
- "\n"))))
-
-(defcustom ivy-read-action-function #'ivy-read-action-by-key
- "Function used to read an action."
- :type '(radio
- (function-item ivy-read-action-by-key)
- (function-item ivy-read-action-ivy)
- (function-item ivy-hydra-read-action)))
-
-(defun ivy-read-action ()
- "Change the action to one of the available ones.
-
-Return nil for `minibuffer-keyboard-quit' or wrong key during the
-selection, non-nil otherwise."
- (interactive)
- (let ((actions (ivy-state-action ivy-last)))
- (if (not (ivy--actionp actions))
- t
- (let ((ivy--directory ivy--directory))
- (funcall ivy-read-action-function actions)))))
-
-(defvar set-message-function)
-
-(defun ivy-read-action-by-key (actions)
- (let* ((set-message-function nil)
- (hint (funcall ivy-read-action-format-function (cdr actions)))
- (resize-mini-windows t)
- (key "")
- action-idx)
- (while (and (setq action-idx (cl-position-if
- (lambda (x)
- (string-prefix-p key (car x)))
- (cdr actions)))
- (not (string= key (car (nth action-idx (cdr actions))))))
- (setq key (concat key (key-description (string (read-key hint))))))
- (ivy-shrink-after-dispatching)
- (cond ((member key '("ESC" "C-g"))
- nil)
- ((null action-idx)
- (message "%s is not bound" key)
- nil)
- (t
- (message "")
- (setcar actions (1+ action-idx))
- (ivy-set-action actions)))))
-
-(defvar ivy-marked-candidates nil
- "List of marked candidates.
-Use `ivy-mark' to populate this.
-
-When this list is non-nil at the end of the session, the action
-will be called for each element of this list.")
-
-(defun ivy-read-action-ivy (actions)
- "Select an action from ACTIONS using Ivy."
- (let ((enable-recursive-minibuffers t))
- (if (and (> (minibuffer-depth) 1)
- (eq (ivy-state-caller ivy-last) 'ivy-read-action-ivy))
- (minibuffer-keyboard-quit)
- (let ((ivy-marked-candidates ivy-marked-candidates))
- (ivy-read (format "action (%s): " (ivy-state-current ivy-last))
- (cl-mapcar
- (lambda (a i) (cons (format "[%s] %s" (nth 0 a) (nth 2 a)) i))
- (cdr actions) (number-sequence 1 (length (cdr actions))))
- :action (lambda (a)
- (setcar actions (cdr a))
- (ivy-set-action actions))
- :caller 'ivy-read-action-ivy)))))
-
-(defun ivy-shrink-after-dispatching ()
- "Shrink the window after dispatching when action list is too large."
- (when (window-minibuffer-p)
- (window-resize nil (- ivy-height (window-height)))))
-
-(defun ivy-dispatching-done ()
- "Select one of the available actions and call `ivy-done'."
- (interactive)
- (let ((ivy-exit 'ivy-dispatching-done))
- (when (ivy-read-action)
- (ivy-done)))
- (ivy-shrink-after-dispatching))
-
-(defun ivy-dispatching-call ()
- "Select one of the available actions and call `ivy-call'."
- (interactive)
- (setq ivy-current-prefix-arg current-prefix-arg)
- (let ((actions (copy-sequence (ivy-state-action ivy-last)))
- (old-ivy-text ivy-text))
- (unwind-protect
- (when (ivy-read-action)
- (ivy-set-text old-ivy-text)
- (ivy-call))
- (ivy-set-action actions)))
- (ivy-shrink-after-dispatching))
-
-(defun ivy-build-tramp-name (x)
- "Reconstruct X into a path.
-Is is a cons cell, related to `tramp-get-completion-function'."
- (let ((user (car x))
- (domain (cadr x)))
- (if user
- (concat user "@" domain)
- domain)))
-
-(declare-function Info-find-node "info")
-(declare-function Info-read-node-name-1 "info")
-(declare-function tramp-get-completion-function "tramp")
-
-(defcustom ivy-alt-done-functions-alist nil
- "Customize what `ivy-alt-done' does per-collection."
- :type '(alist
- :key-type symbol
- :value-type function))
-
-(defun ivy-alt-done (&optional arg)
- "Exit the minibuffer with the selected candidate.
-When ARG is t, exit with current text, ignoring the candidates.
-When the current candidate during file name completion is a
-directory, continue completion from within that directory instead
-of exiting. This function is otherwise like `ivy-done'."
- (interactive "P")
- (setq ivy-current-prefix-arg current-prefix-arg)
- (let (alt-done-fn)
- (cond ((or arg (ivy--prompt-selected-p))
- (ivy-immediate-done))
- ((setq alt-done-fn (ivy-alist-setting ivy-alt-done-functions-alist))
- (funcall alt-done-fn))
- (t
- (ivy-done)))))
-
-(defun ivy--info-alt-done ()
- (if (member (ivy-state-current ivy-last) '("(./)" "(../)"))
- (ivy-quit-and-run
- (ivy-read "Go to file: " #'read-file-name-internal
- :action (lambda (x)
- (Info-find-node
- (expand-file-name x ivy--directory)
- "Top"))))
- (ivy-done)))
-
-(defvar ivy-auto-select-single-candidate nil
- "When non-nil, auto-select the candidate if it is the only one.
-When t, it is the same as if the user were prompted and selected the candidate
-by calling the default action. This variable has no use unless the collection
-contains a single candidate.")
-
-(defun ivy--directory-enter ()
- (let (dir)
- (when (and
- (> ivy--length 0)
- (not (string= (ivy-state-current ivy-last) "./"))
- (setq dir (ivy-expand-file-if-directory (ivy-state-current ivy-last))))
- (ivy--cd dir)
- (ivy--exhibit))))
-
-(defun ivy--handle-directory (input)
- "Detect the next directory based on special values of INPUT."
- (cond ((string= input "/")
- "/")
- ((string= input "/sudo::")
- (concat input ivy--directory))))
-
-(defun ivy--tramp-candidates ()
- (let ((method (match-string 1 ivy-text))
- (user (match-string 2 ivy-text))
- (rest (match-string 3 ivy-text))
- res)
- (dolist (x (tramp-get-completion-function method))
- (setq res (append res (funcall (car x) (cadr x)))))
- (setq res (delq nil res))
- (when user
- (dolist (x res)
- (setcar x user)))
- (setq res (delete-dups res))
- (let* ((old-ivy-last ivy-last)
- (enable-recursive-minibuffers t)
- (host (let ((ivy-auto-select-single-candidate nil))
- (ivy-read "user@host: "
- (mapcar #'ivy-build-tramp-name res)
- :initial-input rest))))
- (setq ivy-last old-ivy-last)
- (when host
- (setq ivy--directory "/")
- (ivy--cd (concat "/" method ":" host ":/"))))))
-
-(defun ivy--directory-done ()
- "Handle exit from the minibuffer when completing file names."
- (let ((dir (ivy--handle-directory ivy-text)))
- (cond
- ((equal (ivy-state-current ivy-last) (ivy-state-def ivy-last))
- (ivy-done))
- ((and (ivy-state-require-match ivy-last)
- (equal ivy-text "")
- (null ivy--old-cands))
- (ivy-immediate-done))
- (dir
- (let ((inhibit-message t))
- (ivy--cd dir)))
- ((ivy--directory-enter))
- ((unless (string= ivy-text "")
- ;; Obsolete since 26.1 and removed in 28.1.
- (defvar tramp-completion-mode)
- (with-no-warnings
- (let* ((tramp-completion-mode t)
- (file (expand-file-name
- (if (> ivy--length 0) (ivy-state-current ivy-last) ivy-text)
- ivy--directory)))
- (when (ignore-errors (file-exists-p file))
- (if (file-directory-p file)
- (ivy--cd (file-name-as-directory file))
- (ivy-done))
- ivy-text)))))
- ((or (and (equal ivy--directory "/")
- (string-match-p "\\`[^/]+:.*:.*\\'" ivy-text))
- (string-match-p "\\`/[^/]+:.*:.*\\'" ivy-text))
- (ivy-done))
- ((ivy--tramp-prefix-p)
- (ivy--tramp-candidates))
- (t
- (ivy-done)))))
-
-(defun ivy--tramp-prefix-p ()
- (or (and (equal ivy--directory "/")
- (cond ((string-match
- "\\`\\([^/]+?\\):\\(?:\\(.*\\)@\\)?\\(.*\\)\\'"
- ivy-text)
- (save-match-data
- (ivy-set-text (ivy-state-current ivy-last))))
- ((string-match
- "\\`\\([^/]+?\\):\\(?:\\(.*\\)@\\)?\\(.*\\)\\'"
- (ivy-state-current ivy-last))
- (save-match-data
- (ivy-set-text (ivy-state-current ivy-last))))))
- (string-match
- "\\`/\\([^/]+?\\):\\(?:\\(.*\\)@\\)?\\(.*\\)\\'"
- ivy-text)))
-
-(defun ivy-expand-file-if-directory (file-name)
- "Expand FILE-NAME as directory.
-When this directory doesn't exist, return nil."
- (when (stringp file-name)
- (let ((full-name
- ;; Ignore host name must not match method "ssh"
- (ignore-errors
- (file-name-as-directory
- (expand-file-name file-name ivy--directory)))))
- (when (and full-name (file-directory-p full-name))
- full-name))))
-
-(defcustom ivy-tab-space nil
- "When non-nil, `ivy-partial-or-done' should insert a space."
- :type 'boolean)
-
-(defun ivy-partial-or-done ()
- "Complete the minibuffer text as much as possible.
-If the text hasn't changed as a result, forward to `ivy-alt-done'."
- (interactive)
- (cond
- ((and (numberp completion-cycle-threshold)
- (< (length ivy--all-candidates) completion-cycle-threshold))
- (let ((ivy-wrap t))
- (ivy-next-line)))
- ((and (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
- (or (and (equal ivy--directory "/")
- (string-match-p "\\`[^/]+:.*\\'" ivy-text))
- (= (string-to-char ivy-text) ?/)))
- (let ((default-directory ivy--directory)
- dir)
- (minibuffer-complete)
- (ivy-set-text (ivy--input))
- (when (setq dir (ivy-expand-file-if-directory ivy-text))
- (ivy--cd dir))))
- (t
- (or (ivy-partial)
- (when (or (eq this-command last-command)
- (eq ivy--length 1))
- (ivy-alt-done))))))
-
-(defun ivy--partial-cd-for-single-directory ()
- (when (and
- (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
- (= 1 (length
- (ivy--re-filter
- (funcall ivy--regex-function
- (concat "^" (string-remove-prefix "^" ivy-text)))
- ivy--all-candidates)))
- (let ((default-directory ivy--directory))
- (file-directory-p (ivy-state-current ivy-last))))
- (ivy--directory-done)))
-
-(defun ivy-partial ()
- "Complete the minibuffer text as much as possible."
- (interactive)
- (let* ((parts (or (ivy--split-spaces ivy-text) (list "")))
- (tail (last parts))
- (postfix (car tail))
- (case-fold-search (ivy--case-fold-p ivy-text))
- (completion-ignore-case case-fold-search)
- (new (try-completion (string-remove-prefix "^" postfix)
- (if (ivy-state-dynamic-collection ivy-last)
- ivy--all-candidates
- (mapcar (lambda (str)
- (let ((i (string-match-p postfix str)))
- (and i (substring str i))))
- ivy--old-cands)))))
- (cond ((eq new t) nil)
- ((string= new ivy-text) nil)
- ((string= (car tail) (car (ivy--split-spaces new))) nil)
- (new
- (delete-region (minibuffer-prompt-end) (point-max))
- (setcar tail
- (if (= (string-to-char postfix) ?^)
- (concat "^" new)
- new))
- (ivy-set-text
- (concat
- (mapconcat #'identity parts " ")
- (and ivy-tab-space (not (= (length ivy--old-cands) 1)) " ")))
- (insert ivy-text)
- (ivy--partial-cd-for-single-directory)
- t))))
-
-(defvar ivy-completion-beg nil
- "Completion bounds start.")
-
-(defvar ivy-completion-end nil
- "Completion bounds end.")
-
-(defun ivy-immediate-done ()
- "Exit the minibuffer with current input instead of current candidate."
- (interactive)
- (delete-minibuffer-contents)
- (setf (ivy-state-current ivy-last)
- (cond ((or (not ivy--directory)
- (eq (ivy-state-history ivy-last) 'grep-files-history))
- ivy-text)
- ((and (string= ivy-text "")
- (eq (ivy-state-collection ivy-last)
- #'read-file-name-internal))
- (if (ivy-state-def ivy-last)
- (if (and
- (file-exists-p (ivy-state-def ivy-last))
- (/= (length ivy--directory)
- (1+ (length (expand-file-name (ivy-state-def ivy-last))))))
- ivy--directory
- (copy-sequence (ivy-state-def ivy-last)))
- ivy--directory))
- (t
- (expand-file-name ivy-text ivy--directory))))
- (insert (ivy-state-current ivy-last))
- (setq ivy-completion-beg ivy-completion-end)
- (setq ivy-exit 'done)
- (exit-minibuffer))
-
-(defun ivy--restore-session (&optional session)
- "Resume a recorded completion SESSION, if any exists."
- (when ivy--sessions
- (unless session
- (setq session (intern
- (let ((ivy-last ivy-last)
- ivy--all-candidates
- ivy-text)
- (ivy-read "Choose ivy session: "
- ivy--sessions
- :require-match t)))))
- (setq ivy-last (or (cdr (assq session ivy--sessions))
- ivy-last)))
- (let ((data (plist-get (ivy-state-extra-props ivy-last) :ivy-data)))
- (when data
- (setq ivy--all-candidates (plist-get data :all-candidates))
- (setq ivy-text (plist-get data :text)))))
-
-;;;###autoload
-(defun ivy-resume (&optional session)
- "Resume the last completion session, or SESSION if non-nil.
-With a prefix arg, try to restore a recorded completion session,
-if one exists."
- (interactive)
- (when (or current-prefix-arg session)
- (ivy--restore-session session))
-
- (if (or (null (ivy-state-action ivy-last))
- (eq (ivy--get-action ivy-last) #'identity))
- (user-error "The last session isn't compatible with `ivy-resume'")
- (when (memq (ivy-state-caller ivy-last)
- '(swiper
- swiper-isearch swiper-backward
- swiper-isearch-backward
- counsel-grep))
- (switch-to-buffer (ivy-state-buffer ivy-last)))
- (with-current-buffer (ivy-state-buffer ivy-last)
- (let ((default-directory (ivy-state-directory ivy-last))
- (ivy-use-ignore-default (ivy-state-ignore ivy-last)))
- (ivy-read
- (ivy-state-prompt ivy-last)
- (ivy-state-collection ivy-last)
- :predicate (ivy-state-predicate ivy-last)
- :require-match (ivy-state-require-match ivy-last)
- :initial-input ivy-text
- :history (ivy-state-history ivy-last)
- :preselect (ivy-state-current ivy-last)
- :keymap (ivy-state-keymap ivy-last)
- :update-fn (ivy-state-update-fn ivy-last)
- :sort (ivy-state-sort ivy-last)
- :action (ivy-state-action ivy-last)
- :unwind (ivy-state-unwind ivy-last)
- :re-builder (ivy-state-re-builder ivy-last)
- :matcher (ivy-state-matcher ivy-last)
- :dynamic-collection (ivy-state-dynamic-collection ivy-last)
- :extra-props (ivy-state-extra-props ivy-last)
- :caller (ivy-state-caller ivy-last))))))
-
-(defvar-local ivy-calling nil
- "When non-nil, call the current action when `ivy--index' changes.")
-
-(defun ivy-set-index (index)
- "Set `ivy--index' to INDEX."
- (setq ivy--index index)
- (when ivy-calling
- (ivy--exhibit)
- (ivy-call)))
-
-(defun ivy-beginning-of-buffer ()
- "Select the first completion candidate."
- (interactive)
- (ivy-set-index 0))
-
-(defun ivy-end-of-buffer ()
- "Select the last completion candidate."
- (interactive)
- (ivy-set-index (1- ivy--length)))
-
-(defun ivy-scroll-up-command ()
- "Scroll the candidates upward by the minibuffer height."
- (interactive)
- (ivy-set-index (min (1- (+ ivy--index ivy-height))
- (1- ivy--length))))
-
-(defun ivy-scroll-down-command ()
- "Scroll the candidates downward by the minibuffer height."
- (interactive)
- (ivy-set-index (max (1+ (- ivy--index ivy-height))
- 0)))
-
-(defun ivy-next-line (&optional arg)
- "Move cursor vertically down ARG candidates."
- (interactive "p")
- (setq arg (or arg 1))
- (let ((index (+ ivy--index arg)))
- (if (> index (1- ivy--length))
- (if ivy-wrap
- (ivy-beginning-of-buffer)
- (ivy-set-index (1- ivy--length)))
- (ivy-set-index index))))
-
-(defun ivy-next-line-or-history (&optional arg)
- "Move cursor vertically down ARG candidates.
-If the input is empty, select the previous history element instead."
- (interactive "p")
- (let ((orig-index ivy--index))
- (ivy-next-line arg)
- (when (and (string= ivy-text "") (= ivy--index orig-index))
- (ivy-previous-history-element 1))))
-
-(defun ivy-previous-line (&optional arg)
- "Move cursor vertically up ARG candidates."
- (interactive "p")
- (setq arg (or arg 1))
- (let ((index (- ivy--index arg))
- (min-index (if ivy--use-selectable-prompt -1 0)))
- (if (< index min-index)
- (if ivy-wrap
- (ivy-end-of-buffer)
- (ivy-set-index min-index))
- (ivy-set-index index))))
-
-(defun ivy-previous-line-or-history (arg)
- "Move cursor vertically up ARG candidates.
-If the input is empty, select the previous history element instead."
- (interactive "p")
- (let ((orig-index ivy--index))
- (ivy-previous-line arg)
- (when (and (string= ivy-text "") (= ivy--index orig-index))
- (ivy-previous-history-element 1))))
-
-(defun ivy-toggle-calling ()
- "Flip `ivy-calling'."
- (interactive)
- (when (setq ivy-calling (not ivy-calling))
- (ivy-call)))
-
-(defun ivy-toggle-ignore ()
- "Toggle user-configured candidate filtering."
- (interactive)
- (setq ivy-use-ignore
- (if ivy-use-ignore
- nil
- (or ivy-use-ignore-default t)))
- (setf (ivy-state-ignore ivy-last) ivy-use-ignore)
- ;; invalidate cache
- (setq ivy--old-cands nil))
-
-(defun ivy--get-action (state)
- "Get the action function from STATE."
- (let ((action (ivy-state-action state)))
- (when action
- (if (functionp action)
- action
- (cadr (nth (car action) action))))))
-
-(defun ivy--get-multi-action (state)
- "Get the multi-action function from STATE."
- (let* ((action (ivy-state-action state))
- (multi-action
- (and (listp action)
- (not (eq (car action) 'lambda))
- (nth 3 (nth (car action) action)))))
- (if multi-action
- multi-action
- (when (eq (car action) 1)
- (ivy-state-multi-action state)))))
-
-(defun ivy--get-window (state)
- "Get the window from STATE."
- (if (ivy-state-p state)
- (let ((window (ivy-state-window state)))
- (if (window-live-p window)
- window
- (next-window)))
- (selected-window)))
-
-(defun ivy--actionp (x)
- "Return non-nil when X is a list of actions."
- (and (consp x) (not (memq (car x) '(closure lambda)))))
-
-(defcustom ivy-action-wrap nil
- "When non-nil, `ivy-next-action' and `ivy-prev-action' wrap."
- :type 'boolean)
-
-(defun ivy-next-action ()
- "When the current action is a list, scroll it forwards."
- (interactive)
- (let ((action (ivy-state-action ivy-last)))
- (when (ivy--actionp action)
- (let ((len (1- (length action)))
- (idx (car action)))
- (if (>= idx len)
- (when ivy-action-wrap
- (setf (car action) 1))
- (cl-incf (car action)))))))
-
-(defun ivy-prev-action ()
- "When the current action is a list, scroll it backwards."
- (interactive)
- (let ((action (ivy-state-action ivy-last)))
- (when (ivy--actionp action)
- (if (<= (car action) 1)
- (when ivy-action-wrap
- (setf (car action) (1- (length action))))
- (cl-decf (car action))))))
-
-(defun ivy-action-name ()
- "Return the name associated with the current action."
- (let ((action (ivy-state-action ivy-last)))
- (if (ivy--actionp action)
- (format "[%d/%d] %s"
- (car action)
- (1- (length action))
- (nth 2 (nth (car action) action)))
- "[1/1] default")))
-
-(defvar ivy-inhibit-action nil
- "When non-nil, `ivy-call' does nothing.
-
-Example use:
-
- (let* ((ivy-inhibit-action t)
- (str (ivy-switch-buffer)))
- ;; do whatever with str - the corresponding buffer will not be opened
- )")
-
-(defun ivy-recursive-restore ()
- "Restore the above state when exiting the minibuffer.
-See variable `ivy-recursive-restore' for further information."
- (when (and ivy-recursive-last
- ivy-recursive-restore
- (not (eq ivy-last ivy-recursive-last)))
- (ivy--reset-state (setq ivy-last ivy-recursive-last))))
-
-(defvar ivy-mark-prefix ">"
- "Prefix used by `ivy-mark'.")
-
-(defun ivy--call-marked (action)
- (let* ((prefix-len (length ivy-mark-prefix))
- (marked-candidates
- (mapcar
- (lambda (s)
- (let ((cand (substring s prefix-len)))
- (if ivy--directory
- (expand-file-name cand ivy--directory)
- cand)))
- ivy-marked-candidates))
- (multi-action (ivy--get-multi-action ivy-last)))
- (if multi-action
- (let ((default-directory (ivy-state-directory ivy-last)))
- (funcall multi-action (mapcar #'ivy--call-cand marked-candidates)))
- (dolist (c marked-candidates)
- (let ((default-directory (ivy-state-directory ivy-last)))
- (funcall action (ivy--call-cand c)))))))
-
-(defun ivy--call-cand (current)
- (let ((collection (ivy-state-collection ivy-last)))
- (cond
- ;; Alist type.
- ((and (consp (car-safe collection))
- ;; Previously, the cdr of the selected
- ;; candidate would be returned. Now, the
- ;; whole candidate is returned.
- (let ((idx (get-text-property 0 'idx current)))
- (if idx
- (progn
- (ivy--remove-props current 'idx)
- (nth idx collection))
- (assoc current collection)))))
- (ivy--directory
- (expand-file-name current ivy--directory))
- ((equal current "")
- ivy-text)
- (t
- current))))
-
-(defun ivy-call ()
- "Call the current action without exiting completion."
- (interactive)
- ;; Testing with `ivy-with' seems to call `ivy-call' again,
- ;; in which case `this-command' is nil; so check for this.
- (unless (memq this-command '(nil
- ivy-done
- ivy-alt-done
- ivy-dispatching-done))
- (setq ivy-current-prefix-arg current-prefix-arg))
- (let* ((action
- (if (functionp ivy-inhibit-action)
- ivy-inhibit-action
- (and (not ivy-inhibit-action)
- (ivy--get-action ivy-last))))
- (current (ivy-state-current ivy-last))
- (x (ivy--call-cand current))
- (res
- (cond
- ((null action)
- current)
- (t
- (select-window (ivy--get-window ivy-last))
- (set-buffer (ivy-state-buffer ivy-last))
- (prog1 (unwind-protect
- (if ivy-marked-candidates
- (ivy--call-marked action)
- (funcall action x))
- (ivy-recursive-restore))
- (unless (or (eq ivy-exit 'done)
- (minibuffer-window-active-p (selected-window))
- (null (active-minibuffer-window)))
- (select-window (active-minibuffer-window))))))))
- (if ivy-inhibit-action
- res
- current)))
-
-(defun ivy-call-and-recenter ()
- "Call action and recenter window according to the selected candidate."
- (interactive)
- (ivy-call)
- (with-ivy-window
- (recenter-top-bottom)))
-
-(defun ivy-next-line-and-call (&optional arg)
- "Move cursor vertically down ARG candidates.
-Call the permanent action if possible."
- (interactive "p")
- (ivy-next-line arg)
- (ivy--exhibit)
- (ivy-call))
-
-(defun ivy-previous-line-and-call (&optional arg)
- "Move cursor vertically up ARG candidates.
-Call the permanent action if possible."
- (interactive "p")
- (ivy-previous-line arg)
- (ivy--exhibit)
- (ivy-call))
-
-(defun ivy-previous-history-element (arg)
- "Forward to `previous-history-element' with ARG."
- (interactive "p")
- (previous-history-element arg)
- (ivy--cd-maybe)
- (move-end-of-line 1)
- (ivy--maybe-scroll-history))
-
-(defun ivy--insert-symbol-boundaries ()
- (undo-boundary)
- (beginning-of-line)
- (insert "\\_<")
- (end-of-line)
- (insert "\\_>"))
-
-(defun ivy-next-history-element (arg)
- "Forward to `next-history-element' with ARG."
- (interactive "p")
- (if (and (= minibuffer-history-position 0)
- (equal ivy-text ""))
- (progn
- (when minibuffer-default
- (setq ivy--default (car minibuffer-default)))
- (insert ivy--default)
- (when (and (with-ivy-window (derived-mode-p 'prog-mode))
- (eq (ivy-state-caller ivy-last) 'swiper)
- (not (file-exists-p ivy--default))
- (not (ivy-ffap-url-p ivy--default))
- (not (ivy-state-dynamic-collection ivy-last))
- (> (point) (minibuffer-prompt-end)))
- (ivy--insert-symbol-boundaries)))
- (next-history-element arg))
- (ivy--cd-maybe)
- (move-end-of-line 1)
- (ivy--maybe-scroll-history))
-
-(defvar ivy-ffap-url-functions nil
- "List of functions that check if the point is on a URL.")
-
-(defun ivy--cd-maybe ()
- "Check if the current input points to a different directory.
-If so, move to that directory, while keeping only the file name."
- (when ivy--directory
- (let ((input (ivy--input))
- url)
- (if (setq url (or (ivy-ffap-url-p input)
- (with-ivy-window
- (cl-reduce
- (lambda (a b)
- (or a (funcall b)))
- ivy-ffap-url-functions
- :initial-value nil))))
- (ivy-exit-with-action
- (lambda (_)
- (ivy-ffap-url-fetcher url))
- 'no-update-history)
- (setq input (expand-file-name input))
- (let ((file (file-name-nondirectory input))
- (dir (expand-file-name (file-name-directory input))))
- (if (string= dir ivy--directory)
- (progn
- (delete-minibuffer-contents)
- (insert file))
- (ivy--cd dir)
- (insert file)))))))
-
-(defun ivy--maybe-scroll-history ()
- "If the selected history element has an index, scroll there."
- (let ((idx (ignore-errors
- (get-text-property
- (minibuffer-prompt-end)
- 'ivy-index))))
- (when idx
- (ivy--exhibit)
- (ivy-set-index idx))))
-
-(declare-function tramp-get-completion-methods "tramp")
-
-(defun ivy--cd (dir)
- "When completing file names, move to directory DIR."
- (if (null ivy--directory)
- (error "Unexpected")
- (push dir ivy--directory-hist)
- (setq ivy--old-cands nil)
- (setq ivy--old-re nil)
- (ivy-set-index 0)
- (setq ivy--all-candidates
- (append
- (ivy--sorted-files (setq ivy--directory dir))
- (when (and (string= dir "/") (featurep 'tramp))
- (sort
- (mapcar
- (lambda (s) (substring s 1))
- (tramp-get-completion-methods ""))
- #'string<))))
- (ivy-set-text "")
- (setf (ivy-state-directory ivy-last) dir)
- (delete-minibuffer-contents)))
-
-(defun ivy--parent-dir (filename)
- "Return parent directory of absolute FILENAME."
- (file-name-directory (directory-file-name filename)))
-
-(defun ivy-backward-delete-char ()
- "Forward to `delete-backward-char'.
-Call `ivy-on-del-error-function' if an error occurs, usually when
-there is no more text to delete at the beginning of the
-minibuffer."
- (interactive)
- (if (and ivy--directory (= (minibuffer-prompt-end) (point)))
- (progn
- (ivy--cd (ivy--parent-dir (expand-file-name ivy--directory)))
- (ivy--exhibit))
- (setq prefix-arg current-prefix-arg)
- (condition-case nil
- (call-interactively #'delete-backward-char)
- (error
- (when ivy-on-del-error-function
- (funcall ivy-on-del-error-function))))))
-
-(defun ivy-delete-char (arg)
- "Forward to `delete-char' ARG."
- (interactive "p")
- (unless (eolp)
- (delete-char arg)))
-
-(defun ivy-forward-char (arg)
- "Forward to `forward-char' ARG."
- (interactive "p")
- (unless (eolp)
- (forward-char arg)))
-
-(defun ivy-kill-word (arg)
- "Forward to `kill-word' ARG."
- (interactive "p")
- (unless (eolp)
- (kill-word arg)))
-
-(defun ivy-kill-line ()
- "Forward to `kill-line'."
- (interactive)
- (if (eolp)
- (kill-region (minibuffer-prompt-end) (point))
- (kill-line)))
-
-(defun ivy-kill-whole-line ()
- "Forward to `kill-whole-line'."
- (interactive)
- (kill-region (minibuffer-prompt-end) (line-end-position)))
-
-(defun ivy-backward-kill-word ()
- "Forward to `backward-kill-word'."
- (interactive)
- (if (and ivy--directory (= (minibuffer-prompt-end) (point)))
- (progn
- (ivy--cd (ivy--parent-dir (expand-file-name ivy--directory)))
- (ivy--exhibit))
- (ignore-errors
- (let ((pt (point))
- (last-command (if (eq last-command 'ivy-backward-kill-word)
- 'kill-region
- last-command)))
- (forward-word -1)
- (kill-region pt (point))))))
-
-(defvar ivy--regexp-quote #'regexp-quote
- "Store the regexp quoting state.")
-
-(defun ivy-toggle-regexp-quote ()
- "Toggle the regexp quoting."
- (interactive)
- (setq ivy--old-re nil)
- (cl-rotatef ivy--regex-function ivy--regexp-quote)
- (setq ivy-regex (funcall ivy--regex-function ivy-text)))
-
-(defcustom ivy-format-functions-alist
- '((t . ivy-format-function-default))
- "An alist of functions that transform the list of candidates into a string.
-This string is inserted into the minibuffer."
- :type '(alist
- :key-type symbol
- :value-type
- (choice
- (const :tag "Default" ivy-format-function-default)
- (const :tag "Arrow prefix" ivy-format-function-arrow)
- (const :tag "Full line" ivy-format-function-line)
- (function :tag "Custom function"))))
-
-(defun ivy-sort-file-function-default (x y)
- "Compare two files X and Y.
-Prioritize directories."
- (if (get-text-property 0 'dirp x)
- (if (get-text-property 0 'dirp y)
- (string< (directory-file-name x) (directory-file-name y))
- t)
- (if (get-text-property 0 'dirp y)
- nil
- (string< x y))))
-
-(defun ivy-string< (x y)
- "Like `string<', but operate on CARs when given cons cells."
- (string< (if (consp x) (car x) x)
- (if (consp y) (car y) y)))
-
-(define-obsolete-function-alias 'ivy-sort-file-function-using-ido
- 'ido-file-extension-lessp "<2019-10-12 Sat>")
-
-(defcustom ivy-sort-functions-alist
- '((t . ivy-string<))
- "An alist of sorting functions for each collection function.
-Interactive functions that call completion fit in here as well.
-
-Nil means no sorting, which is useful to turn off the sorting for
-functions that have candidates in the natural buffer order, like
-`org-refile' or `Man-goto-section'.
-
-A list can be used to associate multiple sorting functions with a
-collection. The car of the list is the current sort
-function. This list can be rotated with `ivy-rotate-sort'.
-
-The entry associated with t is used for all fall-through cases.
-
-See also `ivy-sort-max-size'."
- :type
- '(alist
- :key-type (choice
- (const :tag "Fall-through" t)
- (symbol :tag "Collection"))
- :value-type (choice
- (const :tag "Plain sort" ivy-string<)
- (const :tag "File sort" ivy-sort-file-function-default)
- (const :tag "File sort using Ido" ido-file-extension-lessp)
- (const :tag "No sort" nil)
- (function :tag "Custom function")
- (repeat (function :tag "Custom function")))))
-
-(defun ivy--sort-function (collection)
- "Retrieve sort function for COLLECTION from `ivy-sort-functions-alist'."
- (let ((entry (cdr (or (assq collection ivy-sort-functions-alist)
- (assq (ivy-state-caller ivy-last) ivy-sort-functions-alist)
- (assq t ivy-sort-functions-alist)))))
- (and (or (functionp entry)
- (functionp (setq entry (car-safe entry))))
- entry)))
-
-(defun ivy-rotate-sort ()
- "Rotate through sorting functions available for current collection.
-This only has an effect if multiple sorting functions are
-specified for the current collection in
-`ivy-sort-functions-alist'."
- (interactive)
- (let ((cell (or (assq (ivy-state-collection ivy-last) ivy-sort-functions-alist)
- (assq (ivy-state-caller ivy-last) ivy-sort-functions-alist))))
- (when (consp (cdr cell))
- (setcdr cell (nconc (cddr cell) (list (cadr cell))))
- (ivy--reset-state ivy-last))))
-
-(defvar ivy-index-functions-alist
- '((t . ivy-recompute-index-zero))
- "An alist of index recomputing functions for each collection function.
-When the input changes, the appropriate function returns an
-integer - the index of the matched candidate that should be
-selected.")
-
-(defvar ivy-re-builders-alist
- '((t . ivy--regex-plus))
- "An alist of regex building functions for each collection function.
-
-Each key is (in order of priority):
-1. The actual collection function, e.g. `read-file-name-internal'.
-2. The symbol passed by :caller into `ivy-read'.
-3. `this-command'.
-4. t.
-
-Each value is a function that should take a string and return a
-valid regex or a regex sequence (see below).
-
-Possible choices: `ivy--regex', `regexp-quote',
-`ivy--regex-plus', `ivy--regex-fuzzy', `ivy--regex-ignore-order'.
-
-If a function returns a list, it should format like this:
-'((\"matching-regexp\" . t) (\"non-matching-regexp\") ...).
-
-The matches will be filtered in a sequence, you can mix the
-regexps that should match and that should not match as you
-like.")
-
-(defvar ivy-highlight-functions-alist
- '((ivy--regex-ignore-order . ivy--highlight-ignore-order)
- (ivy--regex-fuzzy . ivy--highlight-fuzzy)
- (ivy--regex-plus . ivy--highlight-default))
- "An alist of highlighting functions for each regex builder function.")
-
-(defcustom ivy-initial-inputs-alist
- '((org-refile . "^")
- (org-agenda-refile . "^")
- (org-capture-refile . "^")
- (Man-completion-table . "^")
- (woman . "^"))
- "An alist associating commands with their initial input.
-
-Each cdr is either a string or a function called in the context
-of a call to `ivy-read'."
- :type '(alist
- :key-type (symbol)
- :value-type (choice (string) (function))))
-
-(defcustom ivy-hooks-alist nil
- "An alist associating commands to setup functions.
-Examples: `toggle-input-method', (lambda () (insert \"^\")), etc.
-May supersede `ivy-initial-inputs-alist'."
- :type '(alist :key-type symbol :value-type function))
-
-(defvar ivy--occurs-list nil
- "A list of custom occur generators per command.")
-
-(defun ivy-set-occur (cmd occur)
- "Assign CMD a custom OCCUR function."
- (setq ivy--occurs-list
- (plist-put ivy--occurs-list cmd occur)))
-
-(defcustom ivy-update-fns-alist nil
- "An alist associating commands to their :update-fn values."
- :type '(alist
- :key-type symbol
- :value-type
- (radio
- (const :tag "Off" nil)
- (const :tag "Call action on change" auto))))
-
-(defvar ivy-unwind-fns-alist nil
- "An alist associating commands to their :unwind values.")
-
-(defvar ivy-init-fns-alist nil
- "An alist associating commands to their :init values.
-An :init is a function with no arguments.
-`ivy-read' calls it to initialize.")
-
-(defun ivy--alist-set (alist-sym key val)
- (let ((cell (assoc key (symbol-value alist-sym))))
- (if cell
- (setcdr cell val)
- (set alist-sym (cons (cons key val)
- (symbol-value alist-sym))))))
-
-(declare-function counsel-set-async-exit-code "counsel")
-
-(defvar ivy--parents-alist nil
- "Configure parent caller for child caller.
-The child caller inherits and can override the settings of the parent.")
-
-(cl-defun ivy-configure (caller
- &key
- parent
- initial-input
- height
- occur
- update-fn
- init-fn
- unwind-fn
- index-fn
- sort-fn
- format-fn
- display-fn
- display-transformer-fn
- alt-done-fn
- more-chars
- grep-p
- exit-codes)
- "Configure `ivy-read' params for CALLER."
- (declare (indent 1))
- (when parent
- (ivy--alist-set 'ivy--parents-alist caller parent))
- (when initial-input
- (ivy--alist-set 'ivy-initial-inputs-alist caller initial-input))
- (when height
- (ivy--alist-set 'ivy-height-alist caller height))
- (when occur
- (ivy-set-occur caller occur))
- (when update-fn
- (ivy--alist-set 'ivy-update-fns-alist caller update-fn))
- (when unwind-fn
- (ivy--alist-set 'ivy-unwind-fns-alist caller unwind-fn))
- (when init-fn
- (ivy--alist-set 'ivy-init-fns-alist caller init-fn))
- (when index-fn
- (ivy--alist-set 'ivy-index-functions-alist caller index-fn))
- (when sort-fn
- (ivy--alist-set 'ivy-sort-functions-alist caller sort-fn))
- (when format-fn
- (ivy--alist-set 'ivy-format-functions-alist caller format-fn))
- (when display-fn
- (ivy--alist-set 'ivy-display-functions-alist caller display-fn))
- (when display-transformer-fn
- (ivy--alist-set 'ivy--display-transformers-alist caller display-transformer-fn))
- (when alt-done-fn
- (ivy--alist-set 'ivy-alt-done-functions-alist caller alt-done-fn))
- (when more-chars
- (ivy--alist-set 'ivy-more-chars-alist caller more-chars))
- (when grep-p
- (cl-pushnew caller ivy-highlight-grep-commands))
- (when exit-codes
- (let (code msg)
- (while (and (setq code (pop exit-codes))
- (setq msg (pop exit-codes)))
- (counsel-set-async-exit-code caller code msg)))))
-
-(defcustom ivy-sort-max-size 30000
- "Sorting won't be done for collections larger than this."
- :type 'integer)
-
-(defalias 'ivy--dirname-p
- ;; Added in Emacs 25.1.
- (if (fboundp 'directory-name-p)
- #'directory-name-p
- (lambda (name)
- "Return non-nil if NAME ends with a directory separator."
- (string-suffix-p "/" name))))
-
-(defun ivy--sorted-files (dir)
- "Return the list of files in DIR.
-Directories come first."
- (let* ((default-directory dir)
- (seq (condition-case nil
- (mapcar (lambda (s) (replace-regexp-in-string "\\$\\$" "$" s))
- (all-completions "" #'read-file-name-internal
- (ivy-state-predicate ivy-last)))
- (error
- (directory-files dir))))
- sort-fn)
- (setq seq (delete "./" (delete "../" seq)))
- (when (eq (setq sort-fn (ivy--sort-function #'read-file-name-internal))
- #'ivy-sort-file-function-default)
- (setq seq (mapcar (lambda (x)
- (propertize x 'dirp (ivy--dirname-p x)))
- seq)))
- (when sort-fn
- (setq seq (sort seq sort-fn)))
- (dolist (dir ivy-extra-directories)
- (push dir seq))
- (if (string= dir "/")
- (cl-remove-if (lambda (s) (string-match ":$" s)) (delete "../" seq))
- seq)))
-
-(defun ivy-alist-setting (alist &optional key)
- "Return the value associated with KEY in ALIST, using `assq'.
-KEY defaults to the last caller of `ivy-read'; if no entry is
-found, it falls back to the key t."
- (let ((caller (or key (ivy-state-caller ivy-last))))
- (or
- (and caller (cdr (assq caller alist)))
- (let ((parent (cdr (assq caller ivy--parents-alist))))
- (when parent
- (ivy-alist-setting alist parent)))
- (cdr (assq t alist)))))
-
-(defun ivy--height (caller)
- (let ((v (or (ivy-alist-setting ivy-height-alist caller)
- ivy-height)))
- (if (integerp v)
- v
- (if (functionp v)
- (funcall v caller)
- (error "Unexpected value: %S" v)))))
-
-(defun ivy--remove-props (str &rest props)
- "Return STR with text PROPS destructively removed."
- (ignore-errors
- (remove-list-of-text-properties 0 (length str) props str))
- str)
-
-(defun ivy--update-prompt (prompt)
- (cond ((equal prompt "Keyword, C-h: ")
- ;; auto-insert.el
- "Keyword (C-M-j to end): ")
- (t
- ;; misearch.el
- (replace-regexp-in-string "RET to end" "C-M-j to end" prompt))))
-
-;;** Entry Point
-;;;###autoload
-(cl-defun ivy-read (prompt collection
- &key
- predicate require-match initial-input
- history preselect def keymap update-fn sort
- action multi-action
- unwind re-builder matcher
- dynamic-collection
- extra-props
- caller)
- "Read a string in the minibuffer, with completion.
-
-PROMPT is a string, normally ending in a colon and a space.
-`ivy-count-format' is prepended to PROMPT during completion.
-
-COLLECTION is either a list of strings, a function, an alist, or
-a hash table, supplied for `minibuffer-completion-table'.
-
-PREDICATE is applied to filter out the COLLECTION immediately.
-This argument is for compatibility with `completing-read'.
-
-When REQUIRE-MATCH is non-nil, only members of COLLECTION can be
-selected.
-
-If INITIAL-INPUT is non-nil, then insert that input in the
-minibuffer initially.
-
-HISTORY is a name of a variable to hold the completion session
-history.
-
-KEYMAP is composed with `ivy-minibuffer-map'.
-
-PRESELECT, when non-nil, determines which one of the candidates
-matching INITIAL-INPUT to select initially. An integer stands
-for the position of the desired candidate in the collection,
-counting from zero. Otherwise, use the first occurrence of
-PRESELECT in the collection. Comparison is first done with
-`equal'. If that fails, and when applicable, match PRESELECT as
-a regular expression.
-
-DEF is for compatibility with `completing-read'.
-
-UPDATE-FN is called each time the candidate list is re-displayed.
-
-When SORT is non-nil, `ivy-sort-functions-alist' determines how
-to sort candidates before displaying them.
-
-ACTION is a function to call after selecting a candidate.
-It takes one argument, the selected candidate. If COLLECTION is
-an alist, the argument is a cons cell, otherwise it's a string.
-
-MULTI-ACTION, when non-nil, is called instead of ACTION when
-there are marked candidates. It takes the list of candidates as
-its only argument. When it's nil, ACTION is called on each marked
-candidate.
-
-UNWIND is a function of no arguments to call before exiting.
-
-RE-BUILDER is a function transforming input text into a regex
-pattern.
-
-MATCHER is a function which can override how candidates are
-filtered based on user input. It takes a regex pattern and a
-list of candidates, and returns the list of matching candidates.
-
-DYNAMIC-COLLECTION is a boolean specifying whether the list of
-candidates is updated after each input by calling COLLECTION.
-
-EXTRA-PROPS is a plist that can be used to store
-collection-specific session-specific data.
-
-CALLER is a symbol to uniquely identify the caller to `ivy-read'.
-It is used, along with COLLECTION, to determine which
-customizations apply to the current completion session."
- (let ((init-fn (ivy-alist-setting ivy-init-fns-alist caller)))
- (when init-fn
- (funcall init-fn)))
- ;; get un-stuck from an existing `read-key' overriding minibuffer keys
- (when (equal overriding-local-map '(keymap))
- (keyboard-quit))
- (setq caller (or caller this-command))
- (let* ((ivy-recursive-last (and (active-minibuffer-window) ivy-last))
- (ivy--display-function
- (when (or ivy-recursive-last
- (not (window-minibuffer-p)))
- (ivy-alist-setting ivy-display-functions-alist caller))))
- (setq update-fn (or update-fn (ivy-alist-setting ivy-update-fns-alist caller)))
- (setq unwind (or unwind (ivy-alist-setting ivy-unwind-fns-alist caller)))
- (setq ivy-last
- (make-ivy-state
- :prompt (ivy--update-prompt prompt)
- :collection collection
- :predicate predicate
- :require-match require-match
- :initial-input initial-input
- :history history
- :preselect preselect
- :keymap keymap
- :update-fn (if (eq update-fn 'auto)
- (lambda ()
- (with-ivy-window
- (funcall
- (ivy--get-action ivy-last)
- (if (consp (car-safe (ivy-state-collection ivy-last)))
- (assoc (ivy-state-current ivy-last)
- (ivy-state-collection ivy-last))
- (ivy-state-current ivy-last)))))
- update-fn)
- :sort sort
- :action (ivy--compute-extra-actions action caller)
- :multi-action multi-action
- :frame (selected-frame)
- :window (selected-window)
- :buffer (current-buffer)
- :unwind unwind
- :re-builder re-builder
- :matcher matcher
- :dynamic-collection dynamic-collection
- :display-transformer-fn (ivy-alist-setting ivy--display-transformers-alist caller)
- :directory default-directory
- :extra-props extra-props
- :caller caller
- :def def))
- (ivy--reset-state ivy-last)
- (unwind-protect
- (minibuffer-with-setup-hook
- #'ivy--minibuffer-setup
- (let* ((hist (or history 'ivy-history))
- (minibuffer-completion-table collection)
- (minibuffer-completion-predicate predicate)
- (ivy-height (ivy--height caller))
- (resize-mini-windows (unless (display-graphic-p)
- 'grow-only)))
- (if (and ivy-auto-select-single-candidate
- ivy--all-candidates
- (null (cdr ivy--all-candidates)))
- (progn
- (setf (ivy-state-current ivy-last)
- (car ivy--all-candidates))
- (setq ivy-exit 'done))
- (condition-case err
- (read-from-minibuffer
- prompt
- (ivy-state-initial-input ivy-last)
- (make-composed-keymap keymap ivy-minibuffer-map)
- nil
- hist)
- (error
- (unless (equal err '(error "Selecting deleted buffer"))
- (signal (car err) (cdr err))))))
- (when (eq ivy-exit 'done)
- (ivy--update-history hist))))
- (let ((session (or (plist-get extra-props :session)
- (unless (or (minibufferp)
- (null (ivy-state-action ivy-last))
- (eq (ivy--get-action ivy-last) #'identity))
- caller))))
- (when session
- (setf (ivy-state-extra-props ivy-last)
- (plist-put extra-props :ivy-data `(:all-candidates ,ivy--all-candidates
- :text ,ivy-text)))
- (ivy--alist-set 'ivy--sessions session ivy-last)))
- (ivy--cleanup))
- (ivy-call)))
-
-(defun ivy--update-history (hist)
- (let ((item
- (if (or (string= ivy-text "")
- (eq
- (plist-get (ivy-state-extra-props ivy-last) :caller)
- 'ivy-completing-read)
- (eq (ivy-state-history ivy-last) 'file-name-history))
- (ivy-state-current ivy-last)
- ivy-text)))
- (cond ((equal item ""))
- ((stringp item)
- (set hist (cons (propertize item 'ivy-index ivy--index)
- (delete item (symbol-value hist))))))))
-
-(defun ivy--cleanup ()
- ;; Fixes a bug in ESS, #1660
- (put 'post-command-hook 'permanent-local nil)
- (remove-hook 'post-command-hook #'ivy--queue-exhibit)
- (remove-hook 'window-size-change-functions #'ivy--window-size-changed)
- (let ((cleanup (ivy--display-function-prop :cleanup))
- (unwind (ivy-state-unwind ivy-last)))
- (when (functionp cleanup)
- (funcall cleanup))
- (when unwind
- (funcall unwind)))
- (ivy--pulse-cleanup)
- (unless (eq ivy-exit 'done)
- (ivy-recursive-restore)))
-
-(defun ivy--display-function-prop (prop)
- "Return PROP associated with current `ivy--display-function'."
- (plist-get (cdr (assq ivy--display-function
- ivy-display-functions-props))
- prop))
-
-(defvar Info-complete-menu-buffer)
-
-(defun ivy--reset-state (state)
- "Reset the ivy to STATE.
-This is useful for recursive `ivy-read'."
- (setq ivy-marked-candidates nil)
- (unless (equal (selected-frame) (ivy-state-frame state))
- (select-window (active-minibuffer-window)))
- (let* ((prompt (or (ivy-state-prompt state) ""))
- (collection (ivy-state-collection state))
- (predicate (ivy-state-predicate state))
- (history (ivy-state-history state))
- (preselect (ivy-state-preselect state))
- (re-builder (ivy-state-re-builder state))
- (dynamic-collection (ivy-state-dynamic-collection state))
- (require-match (ivy-state-require-match state))
- (caller (or (ivy-state-caller state) this-command))
- (sort (or (ivy-state-sort state) (assoc caller ivy-sort-functions-alist)))
- (initial-input
- (or (ivy-state-initial-input state)
- (let ((init (ivy-alist-setting ivy-initial-inputs-alist caller)))
- (if (functionp init) (funcall init) init))))
- (def (ivy-state-def state)))
- (when (and (eq caller 'swiper-isearch) (buffer-modified-p))
- (setq preselect nil))
- (setq ivy--extra-candidates (ivy--compute-extra-candidates caller))
- (setq ivy--directory nil)
- (setq ivy--directory-hist (list default-directory))
- (setq ivy-case-fold-search ivy-case-fold-search-default)
- (setf (ivy-state-re-builder ivy-last)
- (setq ivy--regex-function
- (or re-builder
- (and (functionp collection)
- (cdr (assq collection ivy-re-builders-alist)))
- (ivy-alist-setting ivy-re-builders-alist)
- #'ivy--regex)))
- (setq ivy--subexps 0)
- (setq ivy--regexp-quote #'regexp-quote)
- (setq ivy--old-text "")
- (setq ivy--full-length nil)
- (ivy-set-text (or initial-input ""))
- (setq ivy--index 0)
- (setq ivy-calling nil)
- (setq ivy-use-ignore ivy-use-ignore-default)
- (setf (ivy-state-ignore state) ivy-use-ignore)
- (setq ivy--highlight-function
- (or (cdr (assq ivy--regex-function ivy-highlight-functions-alist))
- #'ivy--highlight-default))
- (let ((ivy-recursive-restore nil)
- coll sort-fn)
- (cond ((eq collection #'Info-read-node-name-1)
- (setq coll
- (if (equal (bound-and-true-p Info-current-file) "dir")
- (mapcar (lambda (x) (format "(%s)" x))
- (delete-dups
- (all-completions "(" collection predicate)))
- (all-completions "" collection predicate))))
- ((memq collection '(read-file-name-internal ffap-read-file-or-url-internal))
- (require 'tramp)
- (when (and (equal def initial-input)
- (member "./" ivy-extra-directories))
- (setq def nil))
- (setq ivy--directory default-directory)
- (when (and initial-input
- (not (equal initial-input "")))
- (cond ((file-directory-p initial-input)
- (when (equal (file-name-nondirectory initial-input) "")
- (setf (ivy-state-preselect state) (setq preselect nil))
- (setq def nil))
- (setq ivy--directory (file-name-as-directory initial-input))
- (setq initial-input nil)
- (when preselect
- (let ((preselect-directory
- (file-name-directory preselect)))
- (when (and preselect-directory
- (not (equal
- (expand-file-name
- preselect-directory)
- (expand-file-name ivy--directory))))
- (setf (ivy-state-preselect state)
- (setq preselect nil))))))
- ((ignore-errors
- (file-exists-p (file-name-directory initial-input)))
- (setq ivy--directory (file-name-directory initial-input))
- (setf (ivy-state-preselect state)
- (file-name-nondirectory initial-input)))))
- (require 'dired)
- (when preselect
- (let ((preselect-directory (ivy--parent-dir preselect)))
- (when (and preselect-directory
- (not (string= preselect-directory
- default-directory)))
- (setq ivy--directory preselect-directory))
- (setq preselect (file-relative-name preselect
- preselect-directory))
- (setf (ivy-state-preselect state) preselect)))
- (setq sort nil)
- (setq coll (ivy--sorted-files ivy--directory))
- (when initial-input
- (unless (or require-match
- (equal initial-input default-directory)
- (equal initial-input ""))
- (setq coll (cons initial-input coll)))
- (setq initial-input (file-name-nondirectory initial-input))))
- ((eq collection #'internal-complete-buffer)
- (setq coll (ivy--buffer-list
- ""
- (and ivy-use-virtual-buffers
- (member caller '(ivy-switch-buffer
- ivy-switch-buffer-other-window
- counsel-switch-buffer)))
- predicate)))
- (dynamic-collection
- (setq coll (if (and (eq this-command 'ivy-resume) (not (buffer-modified-p)))
- ivy--all-candidates
- (ivy--dynamic-collection-cands (or initial-input "")))))
- ((consp (car-safe collection))
- (setq collection (cl-remove-if-not predicate collection))
- (when (and sort (setq sort-fn (ivy--sort-function caller)))
- (setq collection (sort (copy-sequence collection) sort-fn))
- (setq sort nil))
- (setf (ivy-state-collection ivy-last) collection)
- (setq coll (let ((i -1))
- (mapcar (lambda (x)
- (propertize x 'idx (cl-incf i)))
- (all-completions "" collection)))))
- ((or (functionp collection)
- (byte-code-function-p collection)
- (vectorp collection)
- (hash-table-p collection)
- (and (listp collection) (symbolp (car collection))))
- (let ((Info-complete-menu-buffer
- ;; FIXME: This is a temporary workaround for issue #1803.
- (or (bound-and-true-p Info-complete-menu-buffer)
- (ivy-state-buffer state))))
- (setq coll (all-completions "" collection predicate))))
- (t
- (setq coll (all-completions "" collection predicate))))
- (unless (ivy-state-dynamic-collection ivy-last)
- (setq coll (delete "" coll)))
- (when (and sort
- (or (functionp collection)
- (not (eq history 'org-refile-history)))
- (setq sort-fn (ivy--sort-function
- (if (functionp collection) collection caller)))
- (listp coll)
- (null (nthcdr ivy-sort-max-size coll)))
- (setq coll (sort (copy-sequence coll) sort-fn)))
- (when def
- (cond ((stringp (car-safe def))
- (setq coll
- (delete-dups
- (append def coll))))
- ((and (stringp def) (not (member def coll)))
- (push def coll))))
- (setq coll (ivy--set-candidates coll))
- (setq ivy--old-re nil)
- (setq ivy--old-cands nil)
- (when initial-input
- ;; Needed for anchor to work
- (setq ivy--old-cands coll)
- (setq ivy--old-cands (ivy--filter initial-input coll)))
- (unless (setq ivy--trying-to-resume-dynamic-collection
- (and preselect dynamic-collection))
- (when (integerp preselect)
- (setq ivy--old-re "")
- (ivy-set-index preselect)))
- (setq ivy--all-candidates coll)
- (unless (integerp preselect)
- (ivy-set-index (or
- (and dynamic-collection
- ivy--index)
- (and preselect
- (ivy--preselect-index
- preselect
- (if initial-input
- ivy--old-cands
- coll)))
- 0))))
- (setq ivy-exit nil)
- (setq ivy--default
- (if (region-active-p)
- (buffer-substring (region-beginning) (region-end))
- (ivy-thing-at-point)))
- (setq ivy--prompt (ivy-add-prompt-count (ivy--quote-format-string prompt)))
- (setq ivy--use-selectable-prompt (ivy--prompt-selectable-p))
- (setf (ivy-state-initial-input ivy-last) initial-input)))
-
-(defun ivy-add-prompt-count (prompt)
- "Add count information to PROMPT."
- (cond ((null ivy-count-format)
- (error "`ivy-count-format' must not be nil; set it to \"\" instead"))
- ((string-match "%d.*\\(%d\\)" ivy-count-format)
- (let* ((w
- (if (listp ivy--all-candidates)
- (1+ (floor (log (max 1 (length ivy--all-candidates)) 10)))
- 1))
- (s (replace-match (format "%%-%dd" w) t t ivy-count-format 1)))
- (string-match "%d" s)
- (concat (replace-match (format "%%%dd" w) t t s)
- prompt)))
- ((string-match-p "%.*d" ivy-count-format)
- (concat ivy-count-format prompt))
- (ivy--directory
- prompt)
- (t
- prompt)))
-
-(defun ivy--quote-format-string (str)
- "Make STR suitable for `format' with no extra arguments."
- (replace-regexp-in-string "%" "%%" str t t))
-
-;;;###autoload
-(defun ivy-completing-read (prompt collection
- &optional predicate require-match initial-input
- history def inherit-input-method)
- "Read a string in the minibuffer, with completion.
-
-This interface conforms to `completing-read' and can be used for
-`completing-read-function'.
-
-PROMPT is a string that normally ends in a colon and a space.
-COLLECTION is either a list of strings, an alist, an obarray, or a hash table.
-PREDICATE limits completion to a subset of COLLECTION.
-REQUIRE-MATCH is a boolean value or a symbol. See `completing-read'.
-INITIAL-INPUT is a string inserted into the minibuffer initially.
-HISTORY is a list of previously selected inputs.
-DEF is the default value.
-INHERIT-INPUT-METHOD is currently ignored."
- (let ((handler
- (and (< ivy-completing-read-ignore-handlers-depth (minibuffer-depth))
- (assq this-command ivy-completing-read-handlers-alist))))
- (if handler
- (let ((completion-in-region-function #'completion--in-region)
- (ivy-completing-read-ignore-handlers-depth (1+ (minibuffer-depth))))
- (funcall (cdr handler)
- prompt collection
- predicate require-match
- initial-input history
- def inherit-input-method))
- ;; See the doc of `completing-read'.
- (when (consp history)
- (when (numberp (cdr history))
- (setq initial-input (nth (1- (cdr history))
- (symbol-value (car history)))))
- (setq history (car history)))
- (when (consp def)
- (setq def (car def)))
- (let ((str (ivy-read
- prompt collection
- :predicate predicate
- :require-match (when (and collection require-match)
- require-match)
- :initial-input (cond ((consp initial-input)
- (car initial-input))
- ((and (stringp initial-input)
- (not (eq collection #'read-file-name-internal))
- (string-match-p "\\+" initial-input))
- (replace-regexp-in-string
- "\\+" "\\\\+" initial-input))
- (t
- initial-input))
- :preselect def
- :def def
- :history history
- :keymap nil
- :dynamic-collection ivy-completing-read-dynamic-collection
- :extra-props '(:caller ivy-completing-read)
- :caller (if (and collection (symbolp collection))
- collection
- this-command))))
- (if (string= str "")
- ;; For `completing-read' compat, return the first element of
- ;; DEFAULT, if it is a list; "", if DEFAULT is nil; or DEFAULT.
- (or def "")
- str)))))
-
-(defun ivy-completing-read-with-empty-string-def
- (prompt collection
- &optional predicate require-match initial-input
- history def inherit-input-method)
- "Same as `ivy-completing-read' but with different handling of DEF.
-
-Specifically, if DEF is nil, it is treated the same as if DEF was
-the empty string. This mimics the behavior of
-`completing-read-default'. This function can therefore be used in
-place of `ivy-completing-read' for commands that rely on this
-behavior."
- (ivy-completing-read
- prompt collection predicate require-match initial-input
- history (or def "") inherit-input-method))
-
-(declare-function mc/all-fake-cursors "ext:multiple-cursors-core")
-
-(defun ivy-completion-in-region-action (str)
- "Insert STR, erasing the previous one.
-The previous string is between `ivy-completion-beg' and `ivy-completion-end'."
- (when (consp str)
- (setq str (cdr str)))
- (when (stringp str)
- (let ((fake-cursors (and (require 'multiple-cursors-core nil t)
- (mc/all-fake-cursors)))
- (pt (point))
- (beg ivy-completion-beg)
- (end ivy-completion-end))
- (when beg
- (delete-region beg end))
- (setq ivy-completion-beg (point))
- (insert (substring-no-properties str))
- (completion--done str 'exact)
- (setq ivy-completion-end (point))
- (save-excursion
- (dolist (cursor fake-cursors)
- (goto-char (overlay-start cursor))
- (delete-region (+ (point) (- beg pt))
- (+ (point) (- end pt)))
- (insert (substring-no-properties str))
- ;; manually move the fake cursor
- (move-overlay cursor (point) (1+ (point)))
- (set-marker (overlay-get cursor 'point) (point))
- (set-marker (overlay-get cursor 'mark) (point)))))))
-
-(defun ivy-completion-common-length (str)
- "Return the amount of characters that match in STR.
-
-`completion-all-completions' computes this and returns the result
-via text properties.
-
-The first non-matching part is propertized:
-- either with: (face (completions-first-difference))
-- or: (font-lock-face completions-first-difference)."
- (let ((char-property-alias-alist '((face font-lock-face)))
- (i (1- (length str))))
- (catch 'done
- (while (>= i 0)
- (when (equal (get-text-property i 'face str)
- '(completions-first-difference))
- (throw 'done i))
- (cl-decf i))
- (throw 'done (length str)))))
-
-(defun ivy-completion-in-region (start end collection &optional predicate)
- "An Ivy function suitable for `completion-in-region-function'.
-The function completes the text between START and END using COLLECTION.
-PREDICATE (a function called with no arguments) says when to exit.
-See `completion-in-region' for further information."
- (let* ((enable-recursive-minibuffers t)
- (str (buffer-substring-no-properties start end))
- (completion-ignore-case (ivy--case-fold-p str))
- (comps
- (completion-all-completions str collection predicate (- end start))))
- (cond ((null comps)
- (message "No matches"))
- ((progn
- (nconc comps nil)
- (and (null (cdr comps))
- (string= str (car comps))))
- (message "Sole match"))
- (t
- (when (eq collection 'crm--collection-fn)
- (setq comps (delete-dups comps)))
- (let* ((len (ivy-completion-common-length (car comps)))
- (initial (cond ((= len 0)
- "")
- ((let ((str-len (length str)))
- (when (> len str-len)
- (setq len str-len)
- str)))
- (t
- (substring str (- len))))))
- (delete-region (- end len) end)
- (setq ivy-completion-beg (- end len))
- (setq ivy-completion-end ivy-completion-beg)
- (if (null (cdr comps))
- (progn
- (unless (minibuffer-window-active-p (selected-window))
- (setf (ivy-state-window ivy-last) (selected-window)))
- (ivy-completion-in-region-action
- (substring-no-properties (car comps))))
- (dolist (s comps)
- ;; Remove face `completions-first-difference'.
- (ivy--remove-props s 'face))
- (setq ivy--old-re nil)
- (unless (ivy--filter initial comps)
- (setq initial nil)
- (setq predicate nil)
- (setq collection comps))
- (unless (derived-mode-p #'emacs-lisp-mode)
- (setq collection comps)
- (setq predicate nil))
- (ivy-read (format "(%s): " str) collection
- :predicate predicate
- :initial-input (concat
- (and (derived-mode-p #'emacs-lisp-mode)
- "^")
- initial)
- :action #'ivy-completion-in-region-action
- :unwind (lambda ()
- (unless (eq ivy-exit 'done)
- (goto-char ivy-completion-beg)
- (when initial
- (insert initial))))
- :caller 'ivy-completion-in-region)))
- ;; Return value should be non-nil on valid completion;
- ;; see `completion-in-region'.
- t))))
-
-(defun ivy-completion-in-region-prompt ()
- "Prompt function for `ivy-completion-in-region'.
-See `ivy-set-prompt'."
- (and (window-minibuffer-p (ivy-state-window ivy-last))
- (ivy-add-prompt-count (ivy-state-prompt ivy-last))))
-
-(ivy-set-prompt #'ivy-completion-in-region #'ivy-completion-in-region-prompt)
-
-(defcustom ivy-do-completion-in-region t
- "When non-nil `ivy-mode' will set `completion-in-region-function'."
- :type 'boolean)
-
-;;;###autoload
-(define-minor-mode ivy-mode
- "Toggle Ivy mode on or off.
-Turn Ivy mode on if ARG is positive, off otherwise.
-Turning on Ivy mode sets `completing-read-function' to
-`ivy-completing-read'.
-
-Global bindings:
-\\{ivy-mode-map}
-
-Minibuffer bindings:
-\\{ivy-minibuffer-map}"
- :group 'ivy
- :global t
- :keymap ivy-mode-map
- :lighter " ivy"
- (if ivy-mode
- (progn
- (setq completing-read-function 'ivy-completing-read)
- (when ivy-do-completion-in-region
- (setq completion-in-region-function 'ivy-completion-in-region)))
- (setq completing-read-function 'completing-read-default)
- (setq completion-in-region-function 'completion--in-region)))
-
-(defun ivy--preselect-index (preselect candidates)
- "Return the index of PRESELECT in CANDIDATES."
- (or (cond ((integerp preselect)
- (if (integerp (car candidates))
- (cl-position preselect candidates)
- preselect))
- ((cl-position preselect candidates :test #'equal))
- ((ivy--regex-p preselect)
- (cl-position preselect candidates :test #'string-match-p)))
- 0))
-
-;;* Implementation
-;;** Regex
-(defun ivy-re-match (re-seq str)
- "Return non-nil if RE-SEQ is matched by STR.
-
-RE-SEQ is a list of (RE . MATCH-P).
-
-RE is a regular expression.
-
-MATCH-P is t when RE should match STR and nil when RE should not
-match STR.
-
-Each element of RE-SEQ must match for the function to return true.
-
-This concept is used to generalize regular expressions for
-`ivy--regex-plus' and `ivy--regex-ignore-order'."
- (let ((res t)
- re)
- (while (and res (setq re (pop re-seq)))
- (setq res
- (if (cdr re)
- (string-match-p (car re) str)
- (not (string-match-p (car re) str)))))
- res))
-
-(defvar ivy--regex-hash
- (make-hash-table :test #'equal)
- "Store pre-computed regex.")
-
-(defvar ivy--input-garbage nil)
-
-(defun ivy--split (str)
- "Split STR into list of substrings bounded by spaces.
-Single spaces act as splitting points. Consecutive spaces
-\"quote\" their preceding spaces, i.e., guard them from being
-split. This allows the literal interpretation of N spaces by
-inputting N+1 spaces. Any substring not constituting a valid
-regexp is passed to `regexp-quote'."
- (let ((len (length str))
- (i 0)
- (start 0)
- (res nil)
- match-len
- end
- c)
- (catch 'break
- (while (< i len)
- (setq c (aref str i))
- (cond ((= ?\[ c)
- (if (setq end (ivy--match-regex-brackets
- (substring str i)))
- (cl-incf i end)
- (setq ivy--input-garbage (substring str i))
- (throw 'break nil)))
- ((= ?\\ c)
- (if (and (< (1+ i) len) (= ?\( (aref str (1+ i))))
- (progn
- (when (> i start)
- (push (substring str start i) res))
- (if (eq (string-match "\\\\([^\0]*?\\\\)" str i) i)
- (progn
- (push (match-string 0 str) res)
- (setq i (match-end 0))
- (setq start i))
- (setq ivy--input-garbage (substring str i))
- (throw 'break nil)))
- (cl-incf i)))
- ((= ?\ c)
- (string-match " +" str i)
- (setq match-len (- (match-end 0) (match-beginning 0)))
- (if (= match-len 1)
- (progn
- (when (> i start)
- (push (substring str start i) res))
- (setq start (1+ i)))
- (setq str (replace-match
- (make-string (1- match-len) ?\ )
- nil nil str))
- (setq len (length str))
- (cl-incf i (1- match-len)))
- (cl-incf i))
- (t
- (cl-incf i)))))
- (when (< start i)
- (push (substring str start) res))
- (mapcar #'ivy--regex-or-literal (nreverse res))))
-
-(defun ivy--match-regex-brackets (str)
- (let ((len (length str))
- (i 1)
- (open-count 1)
- c)
- (while (and (< i len)
- (> open-count 0))
- (setq c (aref str i))
- (cond ((= c ?\[)
- (cl-incf open-count))
- ((= c ?\])
- (cl-decf open-count)))
- (cl-incf i))
- (when (= open-count 0)
- (if (eq (string-match "[+*?]" str i) i)
- (match-end 0)
- i))))
-
-(defun ivy--trim-trailing-re (regex)
- "Trim incomplete REGEX.
-If REGEX ends with \\|, trim it, since then it matches an empty string."
- (if (string-match "\\`\\(.*\\)[\\]|\\'" regex)
- (match-string 1 regex)
- regex))
-
-(defun ivy--regex (str &optional greedy)
- "Re-build regex pattern from STR in case it has a space.
-When GREEDY is non-nil, join words in a greedy way."
- (let ((hashed (unless greedy
- (gethash str ivy--regex-hash))))
- (if hashed
- (progn
- (setq ivy--subexps (car hashed))
- (cdr hashed))
- (when (string-match-p "\\(?:[^\\]\\|^\\)\\\\\\'" str)
- (setq str (substring str 0 -1)))
- (setq str (ivy--trim-trailing-re str))
- (cdr (puthash str
- (let ((subs (ivy--split str)))
- (if (= (length subs) 1)
- (cons
- (setq ivy--subexps 0)
- (if (string-match-p "\\`\\.[^.]" (car subs))
- (concat "\\." (substring (car subs) 1))
- (car subs)))
- (cons
- (setq ivy--subexps (length subs))
- (replace-regexp-in-string
- "\\.\\*\\??\\\\( "
- "\\( "
- (mapconcat
- (lambda (x)
- (if (string-match-p "\\`\\\\([^?][^\0]*\\\\)\\'" x)
- x
- (format "\\(%s\\)" x)))
- subs
- (if greedy ".*" ".*?"))
- nil t))))
- ivy--regex-hash)))))
-
-(defun ivy--regex-p (object)
- "Return OBJECT if it is a valid regular expression, else nil."
- (ignore-errors (string-match-p object "") object))
-
-(defun ivy--regex-or-literal (str)
- "If STR isn't a legal regexp, escape it."
- (or (ivy--regex-p str) (regexp-quote str)))
-
-(defun ivy--split-negation (str)
- "Split STR into text before and after ! delimiter.
-Do not split if the delimiter is escaped as \\!.
-
-Assumes there is at most one un-escaped delimiter and discards
-text after delimiter if it is empty. Modifies match data."
- (unless (string= str "")
- (let ((delim "\\(?:\\`\\|[^\\]\\)\\(!\\)"))
- (mapcar (lambda (split)
- ;; Store "\!" as "!".
- (replace-regexp-in-string "\\\\!" "!" split t t))
- (if (string-match delim str)
- ;; Ignore everything past first un-escaped ! rather than
- ;; crashing. We can't warn or error because the minibuffer is
- ;; already active.
- (let* ((i (match-beginning 1))
- (j (and (string-match delim str (1+ i))
- (match-beginning 1)))
- (neg (substring str (1+ i) j)))
- (cons (substring str 0 i)
- (and (not (string= neg ""))
- (list neg))))
- (list str))))))
-
-(defun ivy--split-spaces (str)
- "Split STR on spaces, unless they're preceded by \\.
-No un-escaped spaces are left in the output. Any substring not
-constituting a valid regexp is passed to `regexp-quote'."
- (when str
- (let ((i 0) ; End of last search.
- (j 0) ; End of last delimiter.
- parts)
- (while (string-match "\\(\\\\ \\)\\| +" str i)
- (setq i (match-end 0))
- (if (not (match-beginning 1))
- ;; Un-escaped space(s).
- (let ((delim (match-beginning 0)))
- (when (< j delim)
- (push (substring str j delim) parts))
- (setq j i))
- ;; Store "\ " as " ".
- (setq str (replace-match " " t t str 1))
- (setq i (1- i))))
- (when (< j (length str))
- (push (substring str j) parts))
- (mapcar #'ivy--regex-or-literal (nreverse parts)))))
-
-(defun ivy--regex-ignore-order (str)
- "Re-build regex from STR by splitting at spaces and using ! for negation.
-
-Examples:
-foo -> matches \"foo\"
-foo bar -> matches if both \"foo\" and \"bar\" match (any order)
-foo !bar -> matches if \"foo\" matches and \"bar\" does not match
-foo !bar baz -> matches if \"foo\" matches and neither \"bar\" nor \"baz\" match
-foo[a-z] -> matches \"foo[a-z]\"
-
-Escaping examples:
-foo\\!bar -> matches \"foo!bar\"
-foo\\ bar -> matches \"foo bar\"
-
-Returns a list suitable for `ivy-re-match'."
- (setq str (ivy--trim-trailing-re str))
- (let* (regex-parts
- (raw-parts (ivy--split-negation str)))
- (dolist (part (ivy--split-spaces (car raw-parts)))
- (push (cons part t) regex-parts))
- (when (cdr raw-parts)
- (dolist (part (ivy--split-spaces (cadr raw-parts)))
- (push (cons part nil) regex-parts)))
- (if regex-parts (nreverse regex-parts)
- "")))
-
-(defun ivy--regex-plus (str)
- "Build a regex sequence from STR.
-Spaces are wild card characters, everything before \"!\" should
-match. Everything after \"!\" should not match."
- (let ((parts (ivy--split-negation str)))
- (cl-case (length parts)
- (0
- "")
- (1
- (if (= (aref str 0) ?!)
- (list (cons "" t)
- (list (ivy--regex (car parts))))
- (ivy--regex (car parts))))
- (2
- (cons
- (cons (ivy--regex (car parts)) t)
- (mapcar #'list (split-string (cadr parts) " " t))))
- (t (error "Unexpected: use only one !")))))
-
-(defun ivy--regex-fuzzy (str)
- "Build a regex sequence from STR.
-Insert .* between each char."
- (setq str (ivy--trim-trailing-re str))
- (if (string-match "\\`\\(\\^?\\)\\(.*?\\)\\(\\$?\\)\\'" str)
- (prog1
- (concat (match-string 1 str)
- (let ((lst (string-to-list (match-string 2 str))))
- (apply #'concat
- (cl-mapcar
- #'concat
- (cons "" (cdr (mapcar (lambda (c) (format "[^%c\n]*" c))
- lst)))
- (mapcar (lambda (x) (format "\\(%s\\)" (regexp-quote (char-to-string x))))
- lst))))
- (match-string 3 str))
- (setq ivy--subexps (length (match-string 2 str))))
- str))
-
-(defcustom ivy-fixed-height-minibuffer nil
- "When non nil, fix the height of the minibuffer during ivy completion.
-This effectively sets the minimum height at this level to `ivy-height' and
-tries to ensure that it does not change depending on the number of candidates."
- :type 'boolean)
-
-;;** Rest
-(defcustom ivy-truncate-lines t
- "Minibuffer setting for `truncate-lines'."
- :type 'boolean)
-
-(defun ivy--minibuffer-setup ()
- "Setup ivy completion in the minibuffer."
- (setq-local mwheel-scroll-up-function 'ivy-next-line)
- (setq-local mwheel-scroll-down-function 'ivy-previous-line)
- (setq-local completion-show-inline-help nil)
- (setq-local line-spacing nil)
- (setq-local minibuffer-default-add-function
- (lambda ()
- (list ivy--default)))
- (setq-local inhibit-field-text-motion nil)
- (setq truncate-lines ivy-truncate-lines)
- (setq-local max-mini-window-height ivy-height)
- (let ((height (cond ((and ivy-fixed-height-minibuffer
- (not (eq (ivy-state-caller ivy-last)
- #'ivy-completion-in-region)))
- (+ ivy-height (if ivy-add-newline-after-prompt 1 0)))
- (ivy-add-newline-after-prompt 2))))
- (when height
- (set-window-text-height nil height)))
- (add-hook 'post-command-hook #'ivy--queue-exhibit nil t)
- (add-hook 'window-size-change-functions #'ivy--window-size-changed nil t)
- (let ((hook (ivy-alist-setting ivy-hooks-alist)))
- (when (functionp hook)
- (funcall hook))))
-
-(defun ivy--input ()
- "Return the current minibuffer input."
- ;; assume one-line minibuffer input
- (save-excursion
- (goto-char (minibuffer-prompt-end))
- (let ((inhibit-field-text-motion t))
- (buffer-substring-no-properties
- (point)
- (line-end-position)))))
-
-(defun ivy--minibuffer-cleanup ()
- "Delete the displayed completion candidates."
- (save-excursion
- (goto-char (minibuffer-prompt-end))
- (delete-region (line-end-position) (point-max))))
-
-(defun ivy-cleanup-string (str)
- "Destructively remove unwanted text properties from STR."
- (ivy--remove-props str 'field))
-
-(defvar ivy-set-prompt-text-properties-function
- #'ivy-set-prompt-text-properties-default
- "Function to set the text properties of the default ivy prompt.
-Called with two arguments, PROMPT and PROPS, where PROMPT is the
-string to be propertized and PROPS is a plist of default text
-properties that may be applied to PROMPT. The function should
-return the propertized PROMPT, which may be modified in-place.")
-
-(defun ivy-set-prompt-text-properties-default (prompt props)
- "Propertize (confirm) and (match required) parts of PROMPT.
-PROPS is a plist of default text properties to apply to these
-parts beyond their respective faces `ivy-confirm-face' and
-`ivy-match-required-face'."
- (dolist (pair '(("confirm" . ivy-confirm-face)
- ("match required" . ivy-match-required-face)))
- (let ((i (string-match-p (car pair) prompt)))
- (when i
- (add-text-properties i (+ i (length (car pair)))
- `(face ,(cdr pair) ,@props)
- prompt))))
- prompt)
-
-(defun ivy-prompt ()
- "Return the current prompt."
- (let* ((caller (ivy-state-caller ivy-last))
- (fn (plist-get ivy--prompts-list caller)))
- (if fn
- (condition-case err
- (funcall fn)
- (wrong-number-of-arguments
- (lwarn 'ivy :error "%s
- Prompt function set via `ivy-set-prompt' for caller `%s'
- should take no arguments."
- (error-message-string err)
- caller)
- ;; Old behavior.
- (funcall fn (ivy-state-prompt ivy-last))))
- ivy--prompt)))
-
-(defun ivy--insert-prompt ()
- "Update the prompt according to `ivy--prompt'."
- (when (setq ivy--prompt (ivy-prompt))
- (unless (memq this-command '(ivy-done ivy-alt-done ivy-partial-or-done
- counsel-find-symbol))
- (setq ivy--prompt-extra ""))
- (let (head tail)
- (if (string-match "\\(.*?\\)\\(:? ?\\)\\'" ivy--prompt)
- (progn
- (setq head (match-string 1 ivy--prompt))
- (setq tail (match-string 2 ivy--prompt)))
- (setq head ivy--prompt)
- (setq tail ""))
- (let ((inhibit-read-only t)
- (std-props '(front-sticky t rear-nonsticky t field t read-only t))
- (n-str
- (concat
- (if (and (bound-and-true-p minibuffer-depth-indicate-mode)
- (> (minibuffer-depth) 1))
- (format "[%d] " (minibuffer-depth))
- "")
- (concat
- (if (string-match "%d.*%d" ivy-count-format)
- (format head
- (1+ ivy--index)
- (or (and (ivy-state-dynamic-collection ivy-last)
- ivy--full-length)
- ivy--length))
- (format head
- (or (and (ivy-state-dynamic-collection ivy-last)
- ivy--full-length)
- ivy--length)))
- ivy--prompt-extra
- tail)))
- (d-str (if ivy--directory
- (abbreviate-file-name ivy--directory)
- "")))
- (save-excursion
- (goto-char (point-min))
- (delete-region (point-min) (minibuffer-prompt-end))
- (let ((len-n (length n-str))
- (len-d (length d-str))
- (ww (window-width)))
- (setq n-str
- (cond ((> (+ len-n len-d) ww)
- (concat n-str "\n" d-str "\n"))
- ((> (+ len-n len-d (length ivy-text)) ww)
- (concat n-str d-str "\n"))
- (t
- (concat n-str d-str)))))
- (when ivy-pre-prompt-function
- (setq n-str (concat (funcall ivy-pre-prompt-function) n-str)))
- (when ivy-add-newline-after-prompt
- (setq n-str (concat n-str "\n")))
- (let ((regex (format "\\([^\n]\\{%d\\}\\)[^\n]" (window-width))))
- (while (string-match regex n-str)
- (setq n-str (replace-match
- (concat (match-string 1 n-str) "\n")
- nil t n-str 1))))
- (set-text-properties 0 (length n-str)
- `(face minibuffer-prompt ,@std-props)
- n-str)
- (setq n-str (funcall ivy-set-prompt-text-properties-function
- n-str std-props))
- (insert n-str))
- ;; Mark prompt as selected if the user moves there or it is the only
- ;; option left. Since the user input stays put, we have to manually
- ;; remove the face as well.
- (when ivy--use-selectable-prompt
- (if (= ivy--index -1)
- (add-face-text-property
- (minibuffer-prompt-end) (line-end-position) 'ivy-prompt-match)
- (remove-list-of-text-properties
- (minibuffer-prompt-end) (line-end-position) '(face))))
- ;; get out of the prompt area
- (constrain-to-field nil (point-max))))))
-
-(defun ivy--sort-maybe (collection)
- "Sort COLLECTION if needed."
- (let ((sort (ivy-state-sort ivy-last)))
- (if (and sort
- (or (functionp sort)
- (functionp (setq sort (ivy--sort-function
- (ivy-state-collection ivy-last))))))
- (sort (copy-sequence collection) sort)
- collection)))
-
-(defcustom ivy-magic-slash-non-match-action 'ivy-magic-slash-non-match-cd-selected
- "Action to take when a slash is added to the end of a non existing directory.
-Possible choices are 'ivy-magic-slash-non-match-cd-selected,
-'ivy-magic-slash-non-match-create, or nil"
- :type '(choice
- (const :tag "Use currently selected directory"
- ivy-magic-slash-non-match-cd-selected)
- (const :tag "Create and use new directory"
- ivy-magic-slash-non-match-create)
- (const :tag "Do nothing"
- nil)))
-
-(defun ivy--create-and-cd (dir)
- "When completing file names, create directory DIR and move there."
- (make-directory dir)
- (ivy--cd dir))
-
-(defun ivy--magic-file-doubleslash-directory ()
- "Return an appropriate directory for when two slashes are entered."
- (let (remote)
- (cond
- ;; Windows
- ;; ((string-match "\\`[[:alpha:]]:/" ivy--directory)
- ;; (match-string 0 ivy--directory))
- ;; Remote root if on remote
- ((setq remote (file-remote-p ivy--directory))
- (concat remote "/"))
- ;; Local root
- (t
- "/"))))
-
-(defun ivy--magic-file-slash ()
- "Handle slash when completing file names."
- (when (or (and (eq this-command #'self-insert-command)
- (eolp))
- (eq this-command #'ivy-partial-or-done))
- (let ((canonical (expand-file-name ivy-text ivy--directory))
- (magic (not (string= ivy-text "/"))))
- (cond ((member ivy-text ivy--all-candidates)
- (ivy--cd canonical))
- ((and (eq system-type 'windows-nt) (string= ivy-text "//")))
- ((string-suffix-p "//" ivy-text)
- (ivy--cd
- (ivy--magic-file-doubleslash-directory)))
- ((string-match-p "\\`/ssh:" ivy-text)
- (ivy--cd (file-name-directory ivy-text)))
- ((string-match "[[:alpha:]]:/\\'" ivy-text)
- (let ((drive-root (match-string 0 ivy-text)))
- (when (file-exists-p drive-root)
- (ivy--cd drive-root))))
- ((and magic (file-directory-p canonical))
- (ivy--cd canonical))
- ((let ((default-directory ivy--directory))
- (and (or (> ivy--index 0)
- (= ivy--length 1)
- magic)
- (not (ivy--prompt-selected-p))
- (not (equal (ivy-state-current ivy-last) ""))
- (file-directory-p (ivy-state-current ivy-last))
- (or (eq ivy-magic-slash-non-match-action
- 'ivy-magic-slash-non-match-cd-selected)
- (eq this-command #'ivy-partial-or-done))))
- (ivy--cd
- (expand-file-name (ivy-state-current ivy-last) ivy--directory)))
- ((and (eq ivy-magic-slash-non-match-action
- 'ivy-magic-slash-non-match-create)
- magic)
- (ivy--create-and-cd canonical))))))
-
-(defun ivy-magic-read-file-env ()
- "If reading filename, jump to environment variable location."
- (interactive)
- (if (and ivy--directory
- (equal ivy-text ""))
- (let* ((cands (cl-loop for pair in process-environment
- for (var val) = (split-string pair "=" t)
- if (and val (not (equal "" val)))
- if (file-exists-p
- (if (file-name-absolute-p val)
- val
- (setq val
- (expand-file-name val ivy--directory))))
- collect (cons var val)))
- (enable-recursive-minibuffers t)
- (x (ivy-read "Env: " cands))
- (path (cdr (assoc x cands))))
- (insert (if (file-accessible-directory-p path)
- (file-name-as-directory path)
- path))
- (ivy--cd-maybe))
- (insert last-input-event)))
-
-(defun ivy-make-magic-action (caller key)
- "Return a command that does the equivalent of `ivy-read-action' and KEY.
-This happens only when the input is empty.
-The intention is to bind the result to keys that are typically
-bound to `self-insert-command'."
- (let* ((alist (assoc key
- (plist-get
- ivy--actions-list
- caller)))
- (doc (format "%s (`%S')"
- (nth 2 alist)
- (nth 1 alist))))
- `(lambda (&optional arg)
- ,doc
- (interactive "p")
- (if (string= "" ivy-text)
- (execute-kbd-macro
- (kbd ,(concat "M-o " key)))
- (self-insert-command arg)))))
-
-(defcustom ivy-magic-tilde t
- "When non-nil, ~ will move home when selecting files.
-Otherwise, ~/ will move home."
- :type 'boolean)
-
-(defcustom ivy-dynamic-exhibit-delay-ms 0
- "Delay in ms before dynamic collections are refreshed"
- :type 'integer)
-
-(defvar ivy--exhibit-timer nil)
-
-(defun ivy--queue-exhibit ()
- "Insert Ivy completions display, possibly after a timeout for
-dynamic collections.
-Should be run via minibuffer `post-command-hook'."
- (if (and (> ivy-dynamic-exhibit-delay-ms 0)
- (ivy-state-dynamic-collection ivy-last))
- (progn
- (when ivy--exhibit-timer (cancel-timer ivy--exhibit-timer))
- (setq ivy--exhibit-timer
- (run-with-timer
- (/ ivy-dynamic-exhibit-delay-ms 1000.0)
- nil
- 'ivy--exhibit)))
- (ivy--exhibit)))
-
-(defalias 'ivy--file-local-name
- (if (fboundp 'file-local-name)
- #'file-local-name
- (lambda (file)
- (or (file-remote-p file 'localname) file)))
- "Compatibility shim for `file-local-name'.
-The function was added in Emacs 26.1.")
-
-(defun ivy--magic-tilde-directory (dir)
- "Return an appropriate home for DIR for when ~ or ~/ are entered."
- (file-name-as-directory
- (expand-file-name
- (let* ((home (expand-file-name (concat (file-remote-p dir) "~/")))
- (dir-path (ivy--file-local-name dir))
- (home-path (ivy--file-local-name home)))
- (if (string= dir-path home-path)
- "~"
- home)))))
-
-(defun ivy-update-candidates (cands)
- (ivy--insert-minibuffer
- (ivy--format
- (setq ivy--all-candidates cands))))
-
-(defun ivy--exhibit ()
- "Insert Ivy completions display.
-Should be run via minibuffer `post-command-hook'."
- (when (memq 'ivy--queue-exhibit post-command-hook)
- (let ((inhibit-field-text-motion nil))
- (constrain-to-field nil (point-max)))
- (ivy-set-text (ivy--input))
- (let ((new-minibuffer (ivy--update-minibuffer)))
- (when new-minibuffer
- (ivy--insert-minibuffer new-minibuffer)))
- t))
-
-(defun ivy--dynamic-collection-cands (input)
- (let ((coll (funcall (ivy-state-collection ivy-last) input)))
- (if (listp coll)
- (mapcar (lambda (x) (if (consp x) (car x) x)) coll)
- coll)))
-
-(defun ivy--update-minibuffer ()
- (prog1
- (if (ivy-state-dynamic-collection ivy-last)
- ;; while-no-input would cause annoying
- ;; "Waiting for process to die...done" message interruptions
- (let ((inhibit-message t)
- coll in-progress)
- (unless (or (equal ivy--old-text ivy-text)
- (eq this-command 'ivy-resume))
- (while-no-input
- (setq coll (ivy--dynamic-collection-cands ivy-text))
- (when (eq coll 0)
- (setq coll nil)
- (setq ivy--old-re nil)
- (setq in-progress t))
- (setq ivy--all-candidates (ivy--sort-maybe coll))))
- (when (eq ivy--all-candidates 0)
- (setq ivy--all-candidates nil)
- (setq ivy--old-re nil)
- (setq in-progress t))
- (when (or ivy--all-candidates
- (and (not (get-process " *counsel*"))
- (not in-progress)))
- (ivy--set-index-dynamic-collection)
- (ivy--format ivy--all-candidates)))
- (cond (ivy--directory
- (cond ((or (string= "~/" ivy-text)
- (and (string= "~" ivy-text)
- ivy-magic-tilde))
- (ivy--cd (ivy--magic-tilde-directory ivy--directory)))
- ((string-match "/\\'" ivy-text)
- (ivy--magic-file-slash))))
- ((eq (ivy-state-collection ivy-last) #'internal-complete-buffer)
- (when (or (and (string-match "\\` " ivy-text)
- (not (string-match "\\` " ivy--old-text)))
- (and (string-match "\\` " ivy--old-text)
- (not (string-match "\\` " ivy-text))))
- (setq ivy--all-candidates
- (if (= (string-to-char ivy-text) ?\s)
- (ivy--buffer-list " ")
- (ivy--buffer-list "" ivy-use-virtual-buffers)))
- (setq ivy--old-re nil))))
- (with-current-buffer (ivy-state-buffer ivy-last)
- (ivy--format
- (ivy--filter ivy-text ivy--all-candidates))))
- (setq ivy--old-text ivy-text)))
-
-(defun ivy-display-function-fallback (str)
- (let ((buffer-undo-list t))
- (save-excursion
- (forward-line 1)
- (insert str))))
-
-(defun ivy--insert-minibuffer (text)
- "Insert TEXT into minibuffer with appropriate cleanup."
- (let ((resize-mini-windows nil)
- (update-fn (ivy-state-update-fn ivy-last))
- (old-mark (marker-position (mark-marker)))
- (win (active-minibuffer-window))
- deactivate-mark)
- (when win
- (with-selected-window win
- (ivy--minibuffer-cleanup)
- (when update-fn
- (funcall update-fn))
- (ivy--insert-prompt)
- ;; Do nothing if while-no-input was aborted.
- (when (stringp text)
- (if ivy--display-function
- (funcall ivy--display-function text)
- (ivy-display-function-fallback text)))
- (ivy--resize-minibuffer-to-fit)
- ;; prevent region growing due to text remove/add
- (when (region-active-p)
- (set-mark old-mark))))))
-
-(defvar ivy-auto-shrink-minibuffer nil
- "When non-nil and the height < `ivy-height', auto-shrink the minibuffer.")
-
-(make-obsolete-variable 'ivy-auto-shrink-minibuffer
- 'ivy-auto-shrink-minibuffer-alist
- "<2020-04-28 Tue>")
-
-(defcustom ivy-auto-shrink-minibuffer-alist nil
- "An alist to configure auto-shrinking of the minibuffer.
-
-Each key is a caller symbol. When the value is non-nil, and the
-height < `ivy-height', auto-shrink the minibuffer."
- :type '(alist
- :key-type symbol
- :value-type boolean))
-
-(defun ivy--do-shrink-window ()
- (let ((h (save-excursion
- (goto-char (minibuffer-prompt-end))
- (let ((inhibit-field-text-motion t))
- (line-number-at-pos)))))
- (shrink-window (-
- (/ (window-body-height nil t)
- (frame-char-height))
- ivy--length h))))
-
-(defun ivy--resize-minibuffer-to-fit ()
- "Resize the minibuffer window size to fit the text in the minibuffer."
- (unless (or (frame-root-window-p (minibuffer-window))
- (memq this-command '(ivy-read-action
- ivy-dispatching-done
- ivy-dispatching-call)))
- (with-selected-window (minibuffer-window)
- (if (fboundp 'window-text-pixel-size)
- (let ((text-height (cdr (window-text-pixel-size)))
- (body-height (window-body-height nil t)))
- (cond ((> text-height body-height)
- ;; Note: the size increment needs to be at least
- ;; frame-char-height, otherwise resizing won't do
- ;; anything.
- (let ((delta (max (- text-height body-height)
- (frame-char-height))))
- (window-resize nil delta nil t t)))
- ((and (or ivy-auto-shrink-minibuffer
- (ivy-alist-setting
- ivy-auto-shrink-minibuffer-alist))
- (< ivy--length ivy-height))
- (ivy--do-shrink-window))))
- (let ((text-height (count-screen-lines))
- (body-height (window-body-height)))
- (when (> text-height body-height)
- (window-resize nil (- text-height body-height) nil t)))))))
-
-(defun ivy--window-size-changed (&rest _)
- "Resize ivy window to fit with current frame's size."
- (when ivy-mode
- (ivy--resize-minibuffer-to-fit)))
-
-(defun ivy--add-face (str face)
- "Propertize STR with FACE."
- (let ((len (length str)))
- (condition-case nil
- (progn
- (colir-blend-face-background 0 len face str)
- (let ((foreground (face-foreground face)))
- (when foreground
- (add-face-text-property
- 0 len (list :foreground foreground) nil str))))
- (error
- (ignore-errors
- (font-lock-append-text-property 0 len 'face face str)))))
- str)
-
-(declare-function flx-make-string-cache "ext:flx")
-(declare-function flx-score "ext:flx")
-
-(defvar ivy--flx-cache nil)
-
-(with-eval-after-load 'flx
- (setq ivy--flx-cache (flx-make-string-cache)))
-
-(defun ivy-toggle-case-fold ()
- "Toggle `case-fold-search' for Ivy operations.
-
-Instead of modifying `case-fold-search' directly, this command
-toggles `ivy-case-fold-search', which can take on more values
-than the former, between nil and either `auto' or t. See
-`ivy-case-fold-search-default' for the meaning of these values.
-
-In any Ivy completion session, the case folding starts with
-`ivy-case-fold-search-default'."
- (interactive)
- (setq ivy-case-fold-search
- (and (not ivy-case-fold-search)
- (or ivy-case-fold-search-default 'auto)))
- ;; Reset cache so that the candidate list updates.
- (setq ivy--old-re nil))
-
-(defun ivy--re-filter (re candidates &optional mkpred)
- "Return all RE matching CANDIDATES.
-RE is a list of cons cells, with a regexp car and a boolean cdr.
-When the cdr is t, the car must match.
-Otherwise, the car must not match."
- (if (equal re "")
- candidates
- (ignore-errors
- (dolist (re (if (stringp re) (list (cons re t)) re))
- (let* ((re-str (car re))
- (pred
- (if mkpred
- (funcall mkpred re-str)
- (lambda (x) (string-match-p re-str x)))))
- (setq candidates
- (cl-remove nil candidates
- (if (cdr re) :if-not :if)
- pred))))
- candidates)))
-
-(defun ivy--filter (name candidates)
- "Return all items that match NAME in CANDIDATES.
-CANDIDATES are assumed to be static."
- (let ((re (funcall ivy--regex-function name)))
- (if (and
- ivy--old-re
- ivy--old-cands
- (equal re ivy--old-re))
- ;; quick caching for "C-n", "C-p" etc.
- ivy--old-cands
- (let* ((re-str (ivy-re-to-str re))
- (matcher (ivy-state-matcher ivy-last))
- (case-fold-search (ivy--case-fold-p name))
- (cands (cond
- (matcher
- (funcall matcher re candidates))
- ((and ivy--old-re
- (stringp re)
- (stringp ivy--old-re)
- (not (string-match-p "\\\\" ivy--old-re))
- (not (equal ivy--old-re ""))
- (memq (cl-search
- (if (string-match-p "\\\\)\\'" ivy--old-re)
- (substring ivy--old-re 0 -2)
- ivy--old-re)
- re)
- '(0 2))
- ivy--old-cands
- (ivy--re-filter re ivy--old-cands)))
- (t
- (ivy--re-filter re candidates)))))
- (if (memq (cdr (assq (ivy-state-caller ivy-last)
- ivy-index-functions-alist))
- '(ivy-recompute-index-swiper
- ivy-recompute-index-swiper-async
- ivy-recompute-index-swiper-async-backward
- ivy-recompute-index-swiper-backward))
- (progn
- (ivy--recompute-index re-str cands)
- (setq ivy--old-cands (ivy--sort name cands)))
- (setq ivy--old-cands (ivy--sort name cands))
- (ivy--recompute-index re-str ivy--old-cands))
- (setq ivy--old-re re)
- ivy--old-cands))))
-
-(defun ivy--set-candidates (x)
- "Update `ivy--all-candidates' with X."
- (let (res
- ;; (ivy--recompute-index-inhibit t)
- )
- (dolist (source ivy--extra-candidates)
- (if (equal source '(original-source))
- (if (null res)
- (setq res x)
- (setq res (append x res)))
- (setq ivy--old-re nil)
- (setq res (append
- (ivy--filter ivy-text (cadr source))
- res))))
- (setq ivy--all-candidates
- (if (cdr ivy--extra-candidates)
- (delete-dups res)
- res))))
-
-(defun ivy--shorter-matches-first (_name cands)
- "Sort CANDS according to their length."
- (if (nthcdr ivy-sort-max-size cands)
- cands
- (cl-sort (copy-sequence cands) #'< :key #'length)))
-
-(defcustom ivy-sort-matches-functions-alist
- '((t . nil)
- (ivy-completion-in-region . ivy--shorter-matches-first)
- (ivy-switch-buffer . ivy-sort-function-buffer))
- "An alist of functions for sorting matching candidates.
-
-Unlike `ivy-sort-functions-alist', which is used to sort the
-whole collection only once, this alist of functions are used to
-sort only matching candidates after each change in input.
-
-The alist KEY is either a collection function or t to match
-previously unmatched collection functions.
-
-The alist VAL is a sorting function with the signature of
-`ivy--prefix-sort'."
- :type '(alist
- :key-type (choice
- (const :tag "Fall-through" t)
- (symbol :tag "Collection"))
- :value-type
- (choice
- (const :tag "Don't sort" nil)
- (const :tag "Put prefix matches ahead" ivy--prefix-sort)
- (function :tag "Custom sort function"))))
-
-(defun ivy--sort-files-by-date (_name candidates)
- "Re-sort CANDIDATES according to file modification date."
- (let ((default-directory ivy--directory))
- (sort (copy-sequence candidates) #'file-newer-than-file-p)))
-
-(defvar ivy--flx-featurep (require 'flx nil 'noerror))
-
-(defun ivy--sort (name candidates)
- "Re-sort candidates by NAME.
-All CANDIDATES are assumed to match NAME."
- (let (fun)
- (cond ((setq fun (ivy-alist-setting ivy-sort-matches-functions-alist))
- (funcall fun name candidates))
- ((and ivy--flx-featurep
- (eq ivy--regex-function 'ivy--regex-fuzzy))
- (ivy--flx-sort name candidates))
- (t
- candidates))))
-
-(defun ivy--prefix-sort (name candidates)
- "Re-sort candidates by NAME.
-All CANDIDATES are assumed to match NAME.
-Prefix matches to NAME are put ahead of the list."
- (if (or (string= name "")
- (= (aref name 0) ?^))
- candidates
- (let ((re-prefix (concat "\\`" (funcall ivy--regex-function name)))
- res-prefix
- res-noprefix)
- (dolist (s candidates)
- (if (string-match-p re-prefix s)
- (push s res-prefix)
- (push s res-noprefix)))
- (nconc
- (nreverse res-prefix)
- (nreverse res-noprefix)))))
-
-(defvar ivy--virtual-buffers nil
- "Store the virtual buffers alist.")
-
-(defun ivy-re-to-str (re)
- "Transform RE to a string.
-
-Functions like `ivy--regex-ignore-order' return a cons list.
-This function extracts a string from the cons list."
- (if (consp re) (caar re) re))
-
-(defun ivy-sort-function-buffer (name candidates)
- "Re-sort candidates by NAME.
-CANDIDATES is a list of buffer names each containing NAME.
-Sort open buffers before virtual buffers, and prefix matches
-before substring matches."
- (if (or (string= name "")
- (= (aref name 0) ?^))
- candidates
- (let* ((base-re (ivy-re-to-str (funcall ivy--regex-function name)))
- (re-star-prefix (concat "\\`\\*" base-re))
- (re-prefix (concat "\\`" base-re))
- res-prefix
- res-noprefix
- res-virtual-prefix
- res-virtual-noprefix)
- (dolist (s candidates)
- (cond
- ((and (assoc s ivy--virtual-buffers)
- (or (string-match-p re-star-prefix s)
- (string-match-p re-prefix s)))
- (push s res-virtual-prefix))
- ((assoc s ivy--virtual-buffers)
- (push s res-virtual-noprefix))
- ((or (string-match-p re-star-prefix s)
- (string-match-p re-prefix s))
- (push s res-prefix))
- (t
- (push s res-noprefix))))
- (nconc
- (nreverse res-prefix)
- (nreverse res-noprefix)
- (nreverse res-virtual-prefix)
- (nreverse res-virtual-noprefix)))))
-
-(defvar ivy-flx-limit 200
- "Used to conditionally turn off flx sorting.
-
-When the amount of matching candidates exceeds this limit, then
-no sorting is done.")
-
-(defvar ivy--recompute-index-inhibit nil
- "When non-nil, `ivy--recompute-index' is a no-op.")
-
-(defun ivy--recompute-index (re-str cands)
- "Recompute index of selected candidate matching RE-STR.
-CANDS are the current candidates."
- (let ((caller (ivy-state-caller ivy-last))
- (func (or (ivy-alist-setting ivy-index-functions-alist)
- #'ivy-recompute-index-zero))
- (case-fold-search (ivy--case-fold-p re-str))
- (preselect (ivy-state-preselect ivy-last))
- (current (ivy-state-current ivy-last))
- (empty (string= re-str "")))
- (unless (or (memq this-command '(ivy-resume ivy-partial-or-done))
- ivy--recompute-index-inhibit)
- (let ((index (cond
- ((or empty (string= re-str "^"))
- (ivy--preselect-index preselect cands))
- ((and (> (length cands) 10000) (eq func #'ivy-recompute-index-zero))
- 0)
- ((cl-position (string-remove-prefix "^" re-str)
- cands
- :test #'ivy--case-fold-string=))
- ((and ivy--directory
- (cl-position (concat re-str "/")
- cands
- :test #'ivy--case-fold-string=)))
- ((and (eq caller 'ivy-switch-buffer)
- (not empty)
- 0))
- ((and (not empty)
- (not (eq caller 'swiper))
- (not (and ivy--flx-featurep
- (eq ivy--regex-function 'ivy--regex-fuzzy)
- ;; Limit to configured number of candidates
- (null (nthcdr ivy-flx-limit cands))))
- ;; If there was a preselected candidate, don't try to
- ;; keep it selected even if the regexp still matches it.
- ;; See issue #1563. See also `ivy--preselect-index',
- ;; which this logic roughly mirrors.
- (not (or
- (and (integerp preselect)
- (= ivy--index preselect))
- (equal current preselect)
- (and (ivy--regex-p preselect)
- (stringp current)
- (string-match-p preselect current))))
- ivy--old-cands
- (cl-position current cands :test #'equal)))
- ((funcall func re-str cands))
- (t 0))))
- (ivy-set-index index)))))
-
-(defun ivy-recompute-index-swiper (_re-str cands)
- "Recompute index of selected candidate when using `swiper'.
-CANDS are the current candidates."
- (condition-case nil
- (let ((tail (nthcdr ivy--index ivy--old-cands))
- idx)
- (if (and tail ivy--old-cands (not (equal "^" ivy--old-re)))
- (progn
- (while (and tail (null idx))
- ;; Compare with eq to handle equal duplicates in cands
- (setq idx (cl-position (pop tail) cands)))
- (or
- idx
- (1- (length cands))))
- (if ivy--old-cands
- ivy--index
- ;; already in ivy-state-buffer
- (let ((n (line-number-at-pos))
- (res 0)
- (i 0))
- (dolist (c cands)
- (when (eq n (get-text-property 0 'swiper-line-number c))
- (setq res i))
- (cl-incf i))
- res))))
- (error 0)))
-
-(defun ivy-recompute-index-swiper-backward (re-str cands)
- "Recompute index of selected candidate when using `swiper-backward'.
-CANDS are the current candidates."
- (let ((idx (ivy-recompute-index-swiper re-str cands)))
- (if (or (= idx -1)
- (<= (get-text-property 0 'swiper-line-number (nth idx cands))
- (line-number-at-pos)))
- idx
- (- idx 1))))
-
-(defun ivy-recompute-index-swiper-async (_re-str cands)
- "Recompute index of selected candidate when using `swiper' asynchronously.
-CANDS are the current candidates."
- (if (null ivy--old-cands)
- (let ((ln (with-ivy-window
- (line-number-at-pos))))
- (or
- ;; closest to current line going forwards
- (cl-position-if (lambda (x)
- (>= (string-to-number x) ln))
- cands)
- ;; closest to current line going backwards
- (1- (length cands))))
- (let ((tail (nthcdr ivy--index ivy--old-cands))
- idx)
- (if (and tail ivy--old-cands (not (equal "^" ivy--old-re)))
- (progn
- (while (and tail (null idx))
- ;; Compare with `equal', since the collection is re-created
- ;; each time with `split-string'
- (setq idx (cl-position (pop tail) cands :test #'equal)))
- (or idx 0))
- ivy--index))))
-
-(defun ivy-recompute-index-swiper-async-backward (re-str cands)
- "Recompute index of selected candidate when using `swiper-backward'
-asynchronously. CANDS are the current candidates."
- (if (= (length cands) 0)
- 0
- (let ((idx (ivy-recompute-index-swiper-async re-str cands)))
- (if
- (<= (string-to-number (nth idx cands))
- (with-ivy-window (line-number-at-pos)))
- idx
- (- idx 1)))))
-
-(defun ivy-recompute-index-zero (_re-str _cands)
- "Recompute index of selected candidate.
-This function serves as a fallback when nothing else is available."
- 0)
-
-(defcustom ivy-minibuffer-faces
- '(ivy-minibuffer-match-face-1
- ivy-minibuffer-match-face-2
- ivy-minibuffer-match-face-3
- ivy-minibuffer-match-face-4)
- "List of `ivy' faces for minibuffer group matches."
- :type '(repeat :tag "Faces"
- (choice
- (const ivy-minibuffer-match-face-1)
- (const ivy-minibuffer-match-face-2)
- (const ivy-minibuffer-match-face-3)
- (const ivy-minibuffer-match-face-4)
- (face :tag "Other face"))))
-
-(defun ivy--minibuffer-face (n)
- "Return Nth face from `ivy-minibuffer-faces'.
-N wraps around, but skips the first element of the list."
- (let ((tail (cdr ivy-minibuffer-faces)))
- (nth (mod (+ n 2) (length tail)) tail)))
-
-(defun ivy--flx-propertize (x)
- "X is (cons (flx-score STR ...) STR)."
- (let ((str (copy-sequence (cdr x)))
- (i 0)
- (last-j -2))
- (dolist (j (cdar x))
- (unless (eq j (1+ last-j))
- (cl-incf i))
- (setq last-j j)
- (add-face-text-property j (1+ j) (ivy--minibuffer-face i) nil str))
- str))
-
-(defun ivy--flx-sort (name cands)
- "Sort according to closeness to string NAME the string list CANDS."
- (condition-case nil
- (let* ((bolp (= (string-to-char name) ?^))
- ;; An optimized regex for fuzzy matching
- ;; "abc" → "^[^a]*a[^b]*b[^c]*c"
- (fuzzy-regex (concat "\\`"
- (and bolp (regexp-quote (substring name 1 2)))
- (mapconcat
- (lambda (x)
- (setq x (char-to-string x))
- (concat "[^" x "]*" (regexp-quote x)))
- (if bolp (substring name 2) name)
- "")))
- ;; Strip off the leading "^" for flx matching
- (flx-name (if bolp (substring name 1) name))
- cands-left
- cands-to-sort)
-
- ;; Filter out non-matching candidates
- (dolist (cand cands)
- (when (string-match-p fuzzy-regex cand)
- (push cand cands-left)))
-
- ;; pre-sort the candidates by length before partitioning
- (setq cands-left (cl-sort cands-left #'< :key #'length))
-
- ;; partition the candidates into sorted and unsorted groups
- (dotimes (_ (min (length cands-left) ivy-flx-limit))
- (push (pop cands-left) cands-to-sort))
-
- (nconc
- ;; Compute all of the flx scores in one pass and sort
- (mapcar #'car
- (sort (mapcar
- (lambda (cand)
- (cons cand
- (car (flx-score cand flx-name ivy--flx-cache))))
- cands-to-sort)
- (lambda (c1 c2)
- ;; Break ties by length
- (if (/= (cdr c1) (cdr c2))
- (> (cdr c1)
- (cdr c2))
- (< (length (car c1))
- (length (car c2)))))))
-
- ;; Add the unsorted candidates
- cands-left))
- (error cands)))
-
-(defun ivy--truncate-string (str width)
- "Truncate STR to WIDTH."
- (truncate-string-to-width str width nil nil t))
-
-(defun ivy--format-function-generic (selected-fn other-fn cands separator)
- "Transform candidates into a string for minibuffer.
-SELECTED-FN is called for the selected candidate, OTHER-FN for the others.
-Both functions take one string argument each. CANDS is a list of candidates
-and SEPARATOR is used to join them."
- (let ((i -1))
- (mapconcat
- (lambda (str)
- (let ((curr (eq (cl-incf i) ivy--window-index)))
- (if curr
- (funcall selected-fn str)
- (funcall other-fn str))))
- cands
- separator)))
-
-(defun ivy-format-function-default (cands)
- "Transform CANDS into a string for minibuffer."
- (ivy--format-function-generic
- (lambda (str)
- (ivy--add-face str 'ivy-current-match))
- #'identity
- cands
- "\n"))
-
-(defun ivy-format-function-arrow (cands)
- "Transform CANDS into a string for minibuffer."
- (ivy--format-function-generic
- (lambda (str)
- (concat "> " (ivy--add-face str 'ivy-current-match)))
- (lambda (str)
- (concat " " str))
- cands
- "\n"))
-
-(defun ivy-format-function-line (cands)
- "Transform CANDS into a string for minibuffer.
-Note that since Emacs 27, `ivy-current-match' needs to have :extend t attribute.
-It has it by default, but the current theme also needs to set it."
- (ivy--format-function-generic
- (lambda (str)
- (ivy--add-face (concat str "\n") 'ivy-current-match))
- (lambda (str)
- (concat str "\n"))
- cands
- ""))
-
-(defun ivy--highlight-ignore-order (str)
- "Highlight STR, using the ignore-order method."
- (when (consp ivy--old-re)
- (let ((i 1))
- (dolist (re ivy--old-re)
- (when (string-match (car re) str)
- (add-face-text-property
- (match-beginning 0) (match-end 0)
- (ivy--minibuffer-face i)
- nil str))
- (cl-incf i))))
- str)
-
-(defun ivy--highlight-fuzzy (str)
- "Highlight STR, using the fuzzy method."
- (if (and ivy--flx-featurep
- (eq (ivy-alist-setting ivy-re-builders-alist) 'ivy--regex-fuzzy))
- (let ((flx-name (string-remove-prefix "^" ivy-text)))
- (ivy--flx-propertize
- (cons (flx-score str flx-name ivy--flx-cache) str)))
- (ivy--highlight-default str)))
-
-(defcustom ivy-use-group-face-if-no-groups t
- "If t, and the expression has no subgroups, highlight whole match as a group.
-
-It will then use the second face (first of the \"group\" faces)
-of `ivy-minibuffer-faces'. Otherwise, always use the first face
-in this case."
- :type 'boolean)
-
-(defun ivy--highlight-default (str)
- "Highlight STR, using the default method."
- (unless ivy--old-re
- (setq ivy--old-re ivy-regex))
- (let ((regexps
- (if (listp ivy--old-re)
- (mapcar #'car (cl-remove-if-not #'cdr ivy--old-re))
- (list ivy--old-re)))
- start)
- (dolist (re regexps)
- (ignore-errors
- (while (and (string-match re str start)
- (> (- (match-end 0) (match-beginning 0)) 0))
- (setq start (match-end 0))
- (let ((i 0)
- (n 0)
- prev)
- (while (<= i ivy--subexps)
- (let ((beg (match-beginning i))
- (end (match-end i)))
- (when (and beg end)
- (unless (and prev (= prev beg))
- (cl-incf n))
- (let ((face
- (cond ((and ivy-use-group-face-if-no-groups
- (zerop ivy--subexps))
- (cadr ivy-minibuffer-faces))
- ((zerop i)
- (car ivy-minibuffer-faces))
- (t
- (ivy--minibuffer-face n)))))
- (add-face-text-property beg end face nil str))
- (unless (zerop i)
- (setq prev end))))
- (cl-incf i)))))))
- str)
-
-(defun ivy--format-minibuffer-line (str)
- "Format line STR for use in minibuffer."
- (let* ((str (ivy-cleanup-string (copy-sequence str)))
- (str (if (eq ivy-display-style 'fancy)
- (if (memq (ivy-state-caller ivy-last)
- ivy-highlight-grep-commands)
- (let* ((start (if (string-match "\\`[^:]+:\\(?:[^:]+:\\)?" str)
- (match-end 0) 0))
- (file (substring str 0 start))
- (match (substring str start)))
- (concat file (funcall ivy--highlight-function match)))
- (funcall ivy--highlight-function str))
- str))
- (olen (length str))
- (annot (plist-get completion-extra-properties :annotation-function)))
- (add-text-properties
- 0 olen
- '(mouse-face
- ivy-minibuffer-match-highlight
- help-echo
- (format
- (if tooltip-mode
- "mouse-1: %s\nmouse-3: %s"
- "mouse-1: %s mouse-3: %s")
- ivy-mouse-1-tooltip ivy-mouse-3-tooltip))
- str)
- (when annot
- (setq str (concat str (funcall annot str)))
- (add-face-text-property
- olen (length str) 'ivy-completions-annotations nil str))
- str))
-
-(defun ivy-read-file-transformer (str)
- "Transform candidate STR when reading files."
- (if (ivy--dirname-p str)
- (propertize str 'face 'ivy-subdir)
- str))
-
-(defun ivy--minibuffer-index-bounds (idx len wnd-len)
- (let* ((half-height (/ wnd-len 2))
- (start (max 0
- (min (- idx half-height)
- (- len (1- wnd-len)))))
- (end (min (+ start (1- wnd-len)) len)))
- (list start end (- idx start))))
-
-(defun ivy--format (cands)
- "Return a string for CANDS suitable for display in the minibuffer.
-CANDS is a list of candidates that :display-transformer can turn into strings."
- (setq ivy--length (length cands))
- (when (>= ivy--index ivy--length)
- (ivy-set-index (max (1- ivy--length) 0)))
- (if (null cands)
- (setf (ivy-state-current ivy-last) "")
- (let ((cur (nth ivy--index cands)))
- (setf (ivy-state-current ivy-last) (if (stringp cur)
- (copy-sequence cur)
- cur)))
- (let* ((bnd (ivy--minibuffer-index-bounds
- ivy--index ivy--length ivy-height))
- (wnd-cands (cl-subseq cands (car bnd) (cadr bnd)))
- (case-fold-search (ivy--case-fold-p ivy-text))
- transformer-fn)
- (setq ivy--window-index (nth 2 bnd))
- (when (setq transformer-fn (ivy-state-display-transformer-fn ivy-last))
- (with-ivy-window
- (with-current-buffer (ivy-state-buffer ivy-last)
- (setq wnd-cands (mapcar transformer-fn wnd-cands)))))
- (ivy--wnd-cands-to-str wnd-cands))))
-
-(defun ivy--wnd-cands-to-str (wnd-cands)
- (let ((str (concat "\n"
- (funcall (ivy-alist-setting ivy-format-functions-alist)
- (condition-case nil
- (mapcar
- #'ivy--format-minibuffer-line
- wnd-cands)
- (error wnd-cands))))))
- (put-text-property 0 (length str) 'read-only nil str)
- str))
-
-(defvar recentf-list)
-(defvar bookmark-alist)
-
-(defcustom ivy-virtual-abbreviate 'name
- "The mode of abbreviation for virtual buffer names."
- :type '(choice
- (const :tag "Only name" name)
- (const :tag "Abbreviated path" abbreviate)
- (const :tag "Full path" full)
- ;; eventually, uniquify
- ))
-(declare-function bookmark-maybe-load-default-file "bookmark")
-(declare-function bookmark-get-filename "bookmark")
-
-(defun ivy--virtual-buffers ()
- "Adapted from `ido-add-virtual-buffers-to-list'."
- (require 'bookmark)
- (unless recentf-mode
- (recentf-mode 1))
- (bookmark-maybe-load-default-file)
- (let* ((vb-bkm (delete " - no file -"
- (delq nil (mapcar #'bookmark-get-filename
- bookmark-alist))))
- (vb-list (cond ((eq ivy-use-virtual-buffers 'recentf)
- recentf-list)
- ((eq ivy-use-virtual-buffers 'bookmarks)
- vb-bkm)
- (ivy-use-virtual-buffers
- (append recentf-list vb-bkm))
- (t nil)))
- virtual-buffers)
- (dolist (head vb-list)
- (let* ((file-name (if (stringp head)
- head
- (cdr head)))
- (name (cond ((eq ivy-virtual-abbreviate 'name)
- (file-name-nondirectory file-name))
- ((eq ivy-virtual-abbreviate 'abbreviate)
- (abbreviate-file-name file-name))
- (t
- (expand-file-name file-name)))))
- (when (equal name "")
- (setq name
- (if (consp head)
- (car head)
- (file-name-nondirectory (directory-file-name file-name)))))
- (unless (or (equal name "")
- (get-file-buffer file-name)
- (assoc name virtual-buffers))
- (push (cons (copy-sequence name) file-name) virtual-buffers))))
- (when virtual-buffers
- (dolist (comp virtual-buffers)
- (put-text-property 0 (length (car comp))
- 'face 'ivy-virtual
- (car comp)))
- (setq ivy--virtual-buffers (nreverse virtual-buffers))
- (mapcar #'car ivy--virtual-buffers))))
-
-(defcustom ivy-ignore-buffers '("\\` " "\\`\\*tramp/")
- "List of regexps or functions matching buffer names to ignore."
- :type '(repeat (choice regexp function)))
-
-(defvar ivy-switch-buffer-faces-alist '((dired-mode . ivy-subdir)
- (org-mode . ivy-org))
- "Store face customizations for `ivy-switch-buffer'.
-Each KEY is `major-mode', each VALUE is a face name.")
-
-(defun ivy--buffer-list (str &optional virtual predicate)
- "Return the buffers that match STR.
-If VIRTUAL is non-nil, add virtual buffers.
-If optional argument PREDICATE is non-nil, use it to test each
-possible match. See `all-completions' for further information."
- (delete-dups
- (nconc
- (all-completions str #'internal-complete-buffer predicate)
- (and virtual
- (ivy--virtual-buffers)))))
-
-(defvar ivy-views (and nil
- `(("ivy + *scratch* {}"
- (vert
- (file ,(expand-file-name "ivy.el"))
- (buffer "*scratch*")))
- ("swiper + *scratch* {}"
- (horz
- (file ,(expand-file-name "swiper.el"))
- (buffer "*scratch*")))))
- "Store window configurations selectable by `ivy-switch-buffer'.
-
-The default value is given as an example.
-
-Each element is a list of (NAME VIEW). NAME is a string, it's
-recommended to end it with a distinctive snippet e.g. \"{}\" so
-that it's easy to distinguish the window configurations.
-
-VIEW is either a TREE or a window-configuration (see
-`ivy--get-view-config').
-
-TREE is a nested list with the following valid cars:
-- vert: split the window vertically
-- horz: split the window horizontally
-- file: open the specified file
-- buffer: open the specified buffer
-
-TREE can be nested multiple times to have multiple window splits.")
-
-(defun ivy-default-view-name ()
- "Return default name for new view."
- (let* ((default-view-name
- (concat "{} "
- (mapconcat #'identity
- (sort
- (mapcar (lambda (w)
- (let* ((b (window-buffer w))
- (f (buffer-file-name b)))
- (if f
- (file-name-nondirectory f)
- (buffer-name b))))
- (window-list))
- #'string-lessp)
- " ")))
- (view-name-re (concat "\\`"
- (regexp-quote default-view-name)
- " \\([0-9]+\\)"))
- old-view)
- (cond ((setq old-view
- (cl-find-if
- (lambda (x)
- (string-match view-name-re (car x)))
- ivy-views))
- (format "%s %d"
- default-view-name
- (1+ (string-to-number
- (match-string 1 (car old-view))))))
- ((assoc default-view-name ivy-views)
- (concat default-view-name " 1"))
- (t
- default-view-name))))
-
-(defun ivy--get-view-config ()
- "Get `current-window-configuration' for `ivy-views'."
- (dolist (w (window-list))
- (set-window-parameter w 'ivy-view-data
- (with-current-buffer (window-buffer w)
- (cond (buffer-file-name
- (list 'file buffer-file-name (point)))
- ((eq major-mode 'dired-mode)
- (list 'file default-directory (point)))
- (t
- (list 'buffer (buffer-name) (point)))))))
- (let ((window-persistent-parameters
- (append window-persistent-parameters
- (list (cons 'ivy-view-data t)))))
- (current-window-configuration)))
-
-(defun ivy-push-view (&optional arg)
- "Push the current window tree on `ivy-views'.
-
-When ARG is non-nil, replace a selected item on `ivy-views'.
-
-Currently, the split configuration (i.e. horizontal or vertical)
-and point positions are saved, but the split positions aren't.
-Use `ivy-pop-view' to delete any item from `ivy-views'."
- (interactive "P")
- (let* ((view (ivy--get-view-config))
- (view-name
- (if arg
- (ivy-read "Update view: " ivy-views)
- (ivy-read "Name view: " nil
- :initial-input (ivy-default-view-name)))))
- (when view-name
- (let ((x (assoc view-name ivy-views)))
- (if x
- (setcdr x (list view))
- (push (list view-name view) ivy-views))))))
-
-(defun ivy-pop-view-action (view)
- "Delete VIEW from `ivy-views'."
- (setq ivy-views (delete view ivy-views))
- (setq ivy--all-candidates
- (delete (car view) ivy--all-candidates))
- (setq ivy--old-cands nil))
-
-(defun ivy-pop-view ()
- "Delete a view to delete from `ivy-views'."
- (interactive)
- (ivy-read "Pop view: " ivy-views
- :preselect (caar ivy-views)
- :action #'ivy-pop-view-action
- :caller 'ivy-pop-view))
-
-(defun ivy-source-views ()
- "Return the name of the views saved in `ivy-views'."
- (mapcar #'car ivy-views))
-
-(ivy-set-sources
- 'ivy-switch-buffer
- '((original-source)
- (ivy-source-views)))
-
-(defun ivy-set-view-recur (view)
- "Set VIEW recursively."
- (cond ((window-configuration-p view)
- (set-window-configuration view)
- (dolist (w (window-list))
- (with-selected-window w
- (ivy-set-view-recur
- (window-parameter w 'ivy-view-data)))))
- ((eq (car view) 'vert)
- (let* ((wnd1 (selected-window))
- (wnd2 (split-window-vertically))
- (views (cdr view))
- (v (pop views))
- (temp-wnd))
- (with-selected-window wnd1
- (ivy-set-view-recur v))
- (while (setq v (pop views))
- (with-selected-window wnd2
- (when views
- (setq temp-wnd (split-window-vertically)))
- (ivy-set-view-recur v)
- (when views
- (setq wnd2 temp-wnd))))))
- ((eq (car view) 'horz)
- (let* ((wnd1 (selected-window))
- (wnd2 (split-window-horizontally))
- (views (cdr view))
- (v (pop views))
- (temp-wnd))
- (with-selected-window wnd1
- (ivy-set-view-recur v))
- (while (setq v (pop views))
- (with-selected-window wnd2
- (when views
- (setq temp-wnd (split-window-horizontally)))
- (ivy-set-view-recur v)
- (when views
- (setq wnd2 temp-wnd))))))
- ((eq (car view) 'file)
- (let* ((name (nth 1 view))
- (virtual (assoc name ivy--virtual-buffers))
- buffer)
- (cond ((setq buffer (get-buffer name))
- (switch-to-buffer buffer nil 'force-same-window))
- (virtual
- (find-file (cdr virtual)))
- ((file-exists-p name)
- (find-file name))))
- (when (and (> (length view) 2)
- (numberp (nth 2 view)))
- (goto-char (nth 2 view))))
- ((eq (car view) 'buffer)
- (switch-to-buffer (nth 1 view))
- (when (and (> (length view) 2)
- (numberp (nth 2 view)))
- (goto-char (nth 2 view))))
- ((eq (car view) 'sexp)
- (eval (nth 1 view)))))
-
-(defun ivy--switch-buffer-action (buffer)
- "Switch to BUFFER.
-BUFFER may be a string or nil."
- (if (zerop (length buffer))
- (switch-to-buffer
- ivy-text nil 'force-same-window)
- (let ((virtual (assoc buffer ivy--virtual-buffers))
- (view (assoc buffer ivy-views)))
- (cond ((and virtual
- (not (get-buffer buffer)))
- (find-file (cdr virtual)))
- (view
- (delete-other-windows)
- (let (
- ;; silence "Directory has changed on disk"
- (inhibit-message t))
- (ivy-set-view-recur (cadr view))))
- (t
- (switch-to-buffer
- buffer nil 'force-same-window))))))
-
-(defun ivy--switch-buffer-other-window-action (buffer)
- "Switch to BUFFER in other window.
-BUFFER may be a string or nil."
- (if (zerop (length buffer))
- (switch-to-buffer-other-window ivy-text)
- (let ((virtual (assoc buffer ivy--virtual-buffers)))
- (if (and virtual
- (not (get-buffer buffer)))
- (find-file-other-window (cdr virtual))
- (switch-to-buffer-other-window buffer)))))
-
-(defun ivy--rename-buffer-action (buffer)
- "Rename BUFFER."
- (let ((new-name (read-string "Rename buffer (to new name): ")))
- (with-current-buffer buffer
- (rename-buffer new-name))))
-
-(defun ivy--find-file-action (buffer)
- "Find file from BUFFER's directory."
- (let* ((virtual (assoc buffer ivy--virtual-buffers))
- (default-directory (if virtual
- (file-name-directory (cdr virtual))
- (buffer-local-value 'default-directory
- (or (get-buffer buffer)
- (current-buffer))))))
- (call-interactively (if (functionp 'counsel-find-file)
- #'counsel-find-file
- #'find-file))))
-
-(defun ivy--kill-buffer-or-virtual (buffer)
- (if (get-buffer buffer)
- (kill-buffer buffer)
- (setq recentf-list (delete
- (cdr (assoc buffer ivy--virtual-buffers))
- recentf-list))))
-
-(defun ivy--kill-current-candidate ()
- (setf (ivy-state-preselect ivy-last) ivy--index)
- (setq ivy--old-re nil)
- (setq ivy--all-candidates (delete (ivy-state-current ivy-last) ivy--all-candidates))
- (let ((ivy--recompute-index-inhibit t))
- (ivy--exhibit)))
-
-(defun ivy--kill-current-candidate-buffer ()
- (setf (ivy-state-preselect ivy-last) ivy--index)
- (setq ivy--old-re nil)
- (setq ivy--all-candidates (ivy--buffer-list "" ivy-use-virtual-buffers nil))
- (let ((ivy--recompute-index-inhibit t))
- (ivy--exhibit)))
-
-(defun ivy--kill-buffer-action (buffer)
- "Kill BUFFER."
- (ivy--kill-buffer-or-virtual buffer)
- (unless (buffer-live-p (ivy-state-buffer ivy-last))
- (setf (ivy-state-buffer ivy-last)
- (with-ivy-window (current-buffer))))
- (ivy--kill-current-candidate-buffer))
-
-(defvar ivy-switch-buffer-map
- (let ((map (make-sparse-keymap)))
- (ivy-define-key map (kbd "C-k") 'ivy-switch-buffer-kill)
- map))
-
-(defun ivy-switch-buffer-kill ()
- "When at end-of-line, kill the current buffer in `ivy-switch-buffer'.
-Otherwise, forward to `ivy-kill-line'."
- (interactive)
- (if (not (eolp))
- (ivy-kill-line)
- (ivy--kill-buffer-action
- (ivy-state-current ivy-last))))
-
-(ivy-set-actions
- 'ivy-switch-buffer
- '(("f"
- ivy--find-file-action
- "find file")
- ("j"
- ivy--switch-buffer-other-window-action
- "other window")
- ("k"
- ivy--kill-buffer-action
- "kill")
- ("r"
- ivy--rename-buffer-action
- "rename")))
-
-(ivy-set-actions
- t
- '(("i" ivy--action-insert "insert")
- ("w" ivy--action-copy "copy")))
-
-(defun ivy--trim-grep-line-number (x)
- (if (string-match ":[0-9]+:" x)
- (substring x (match-end 0))
- x))
-
-(defun ivy--action-insert (x)
- (insert
- (if (stringp x)
- (ivy--trim-grep-line-number x)
- x (car x))))
-
-(defun ivy--action-copy (x)
- (kill-new
- (if (stringp x)
- (ivy--trim-grep-line-number x)
- (car x))))
-
-(defun ivy--switch-buffer-matcher (regexp candidates)
- "Return REGEXP matching CANDIDATES.
-Skip buffers that match `ivy-ignore-buffers'."
- (if (string-match-p "^:" ivy-text)
- (delete-dups
- (cl-remove-if-not
- (lambda (s)
- (let ((b (get-buffer s)))
- (and b
- (string-match-p regexp (buffer-local-value 'default-directory b))
- (not (string-match-p "^\\*" s)))))
- candidates))
- (let ((res (ivy--re-filter regexp candidates)))
- (if (or (null ivy-use-ignore)
- (null ivy-ignore-buffers))
- res
- (or (cl-remove-if
- (lambda (buf)
- (cl-find-if
- (lambda (f-or-r)
- (if (functionp f-or-r)
- (funcall f-or-r buf)
- (string-match-p f-or-r buf)))
- ivy-ignore-buffers))
- res)
- (and (eq ivy-use-ignore t)
- res))))))
-
-(defun ivy-append-face (str face)
- "Append to STR the property FACE."
- (when face
- (setq str (copy-sequence str))
- (add-face-text-property 0 (length str) face t str))
- str)
-
-(defun ivy--remote-buffer-p (buffer)
- "Return non-nil if BUFFER object is visiting a remote file.
-If that is the case, value is a string identifying the remote
-connection."
- (let ((dir (buffer-local-value 'default-directory buffer)))
- (ignore-errors (file-remote-p dir))))
-
-(defun ivy-switch-buffer-transformer (str)
- "Transform candidate STR when switching buffers."
- (let ((buf (get-buffer str)))
- (cond ((not buf) str)
- ((let ((remote (ivy--remote-buffer-p buf)))
- (when remote
- (format "%s (%s)" (ivy-append-face str 'ivy-remote) remote))))
- ((not (verify-visited-file-modtime buf))
- (ivy-append-face str 'ivy-modified-outside-buffer))
- ((buffer-modified-p buf)
- (ivy-append-face str 'ivy-modified-buffer))
- (t
- (let* ((mode (buffer-local-value 'major-mode buf))
- (face (cdr (assq mode ivy-switch-buffer-faces-alist))))
- (ivy-append-face str face))))))
-
-(defun ivy-switch-buffer-occur (cands)
- "Occur function for `ivy-switch-buffer' using `ibuffer'.
-CANDS are the candidates to be displayed."
- (unless cands
- (setq cands (all-completions ivy-text #'internal-complete-buffer)))
- (ibuffer
- nil (buffer-name)
- `((or ,@(cl-mapcan
- (lambda (cand)
- (unless (eq (get-text-property 0 'face cand) 'ivy-virtual)
- `((name . ,(format "\\_<%s\\_>" (regexp-quote cand))))))
- cands)))))
-
-;;;###autoload
-(defun ivy-switch-buffer ()
- "Switch to another buffer."
- (interactive)
- (ivy-read "Switch to buffer: " #'internal-complete-buffer
- :keymap ivy-switch-buffer-map
- :preselect (buffer-name (other-buffer (current-buffer)))
- :action #'ivy--switch-buffer-action
- :matcher #'ivy--switch-buffer-matcher
- :caller 'ivy-switch-buffer))
-
-(ivy-configure 'ivy-switch-buffer
- :parent 'internal-complete-buffer
- :occur #'ivy-switch-buffer-occur)
-
-;;;###autoload
-(defun ivy-switch-view ()
- "Switch to one of the window views stored by `ivy-push-view'."
- (interactive)
- (let ((ivy-initial-inputs-alist
- '((ivy-switch-buffer . "{}"))))
- (ivy-switch-buffer)))
-
-;;;###autoload
-(defun ivy-switch-buffer-other-window ()
- "Switch to another buffer in another window."
- (interactive)
- (ivy-read "Switch to buffer in other window: " #'internal-complete-buffer
- :matcher #'ivy--switch-buffer-matcher
- :preselect (buffer-name (other-buffer (current-buffer)))
- :action #'ivy--switch-buffer-other-window-action
- :keymap ivy-switch-buffer-map
- :caller 'ivy-switch-buffer-other-window))
-
-(ivy-configure 'ivy-switch-buffer-other-window
- :parent 'ivy-switch-buffer)
-
-(defun ivy--yank-handle-case-fold (text)
- (if (and (> (length ivy-text) 0)
- (string= (downcase ivy-text) ivy-text))
- (downcase text)
- text))
-
-(defun ivy--yank-by (fn &rest args)
- "Pull buffer text from current line into search string.
-The region to extract is determined by the respective values of
-point before and after applying FN to ARGS."
- (let (text)
- (with-ivy-window
- (let ((beg (point))
- (bol (line-beginning-position))
- (eol (line-end-position))
- end)
- (unwind-protect
- (progn (apply fn args)
- (setq end (goto-char (max bol (min (point) eol))))
- (setq text (buffer-substring-no-properties beg end))
- (ivy--pulse-region beg end))
- (unless text
- (goto-char beg)))))
- (when text
- (insert (replace-regexp-in-string
- " +" " "
- (ivy--yank-handle-case-fold text)
- t t)))))
-
-(defun ivy-yank-word (&optional arg)
- "Pull next word from buffer into search string.
-If optional ARG is non-nil, pull in the next ARG
-words (previous if ARG is negative)."
- (interactive "p")
- (ivy--yank-by #'forward-word arg))
-
-(defun ivy-yank-symbol (&optional arg)
- "Pull next symbol from buffer into search string.
-If optional ARG is non-nil, pull in the next ARG
-symbols (previous if ARG is negative)."
- (interactive "p")
- (ivy--yank-by #'forward-symbol (or arg 1)))
-
-(defun ivy-yank-char (&optional arg)
- "Pull next character from buffer into search string.
-If optional ARG is non-nil, pull in the next ARG
-characters (previous if ARG is negative)."
- (interactive "p")
- (ivy--yank-by #'forward-char arg))
-
-(defvar ivy--pulse-overlay nil
- "Overlay used to highlight yanked word.")
-
-(defvar ivy--pulse-timer nil
- "Timer used to dispose of `ivy--pulse-overlay'.")
-
-(defcustom ivy-pulse-delay 0.5
- "Number of seconds to display `ivy-yanked-word' highlight.
-When nil, disable highlighting."
- :type '(choice
- (number :tag "Delay in seconds")
- (const :tag "Disable" nil)))
-
-(defun ivy--pulse-region (start end)
- "Temporarily highlight text between START and END.
-The \"pulse\" duration is determined by `ivy-pulse-delay'."
- (when ivy-pulse-delay
- (if ivy--pulse-overlay
- (let ((ostart (overlay-start ivy--pulse-overlay))
- (oend (overlay-end ivy--pulse-overlay)))
- (when (< end start)
- (cl-rotatef start end))
- ;; Extend the existing overlay's region to include START..END,
- ;; but only if the two regions are contiguous.
- (move-overlay ivy--pulse-overlay
- (if (= start oend) ostart start)
- (if (= end ostart) oend end)))
- (setq ivy--pulse-overlay (make-overlay start end))
- (overlay-put ivy--pulse-overlay 'face 'ivy-yanked-word))
- (when ivy--pulse-timer
- (cancel-timer ivy--pulse-timer))
- (setq ivy--pulse-timer
- (run-at-time ivy-pulse-delay nil #'ivy--pulse-cleanup))))
-
-(defun ivy--pulse-cleanup ()
- "Cancel `ivy--pulse-timer' and delete `ivy--pulse-overlay'."
- (when ivy--pulse-timer
- (cancel-timer ivy--pulse-timer)
- (setq ivy--pulse-timer nil))
- (when ivy--pulse-overlay
- (delete-overlay ivy--pulse-overlay)
- (setq ivy--pulse-overlay nil)))
-
-(defun ivy-kill-ring-save ()
- "Store the current candidates into the kill ring.
-If the region is active, forward to `kill-ring-save' instead."
- (interactive)
- (if (region-active-p)
- (call-interactively 'kill-ring-save)
- (kill-new
- (mapconcat
- #'identity
- ivy--old-cands
- "\n"))))
-
-(defun ivy-insert-current ()
- "Make the current candidate into current input.
-Don't finish completion."
- (interactive)
- (delete-minibuffer-contents)
- (let ((end (and ivy--directory
- (ivy--dirname-p (ivy-state-current ivy-last))
- -1)))
- (insert (substring-no-properties
- (ivy-state-current ivy-last) 0 end))))
-
-(defun ivy-insert-current-full ()
- "Insert the full Yank the current directory into the minibuffer."
- (interactive)
- (insert ivy--directory))
-
-(defcustom ivy-preferred-re-builders
- '((ivy--regex-plus . "ivy")
- (ivy--regex-ignore-order . "order")
- (ivy--regex-fuzzy . "fuzzy"))
- "Alist of preferred re-builders with display names.
-This list can be rotated with `ivy-rotate-preferred-builders'."
- :type '(alist :key-type function :value-type string))
-
-(defun ivy-rotate-preferred-builders ()
- "Switch to the next re builder in `ivy-preferred-re-builders'."
- (interactive)
- (when ivy-preferred-re-builders
- (setq ivy--old-re nil)
- (setq ivy--regex-function
- (let ((cell (assq ivy--regex-function ivy-preferred-re-builders)))
- (car (or (cadr (memq cell ivy-preferred-re-builders))
- (car ivy-preferred-re-builders)))))))
-
-(defun ivy-toggle-fuzzy ()
- "Toggle the re builder between `ivy--regex-fuzzy' and `ivy--regex-plus'."
- (interactive)
- (setq ivy--old-re nil)
- (if (eq ivy--regex-function 'ivy--regex-fuzzy)
- (setq ivy--regex-function 'ivy--regex-plus)
- (setq ivy--regex-function 'ivy--regex-fuzzy)))
-
-(defun ivy--label-and-delete-dups (entries)
- "Label ENTRIES with history indices."
- (let ((ht (make-hash-table :test 'equal))
- (idx 0)
- entry
- accum)
- (while (setq entry (pop entries))
- (unless (gethash entry ht)
- (puthash entry t ht)
- (push `(,entry . ,idx) accum))
- (cl-incf idx))
- (nreverse accum)))
-
-(defvar ivy--reverse-i-search-symbol nil
- "Store the history symbol.")
-
-(defun ivy-reverse-i-search-kill ()
- "Remove the current item from history"
- (interactive)
- (if (not (eolp))
- (ivy-kill-line)
- (let ((current (ivy-state-current ivy-last)))
- (if (symbolp ivy--reverse-i-search-symbol)
- (set
- ivy--reverse-i-search-symbol
- (delete current (symbol-value ivy--reverse-i-search-symbol)))
- (ring-remove
- ivy--reverse-i-search-symbol
- (ring-member ivy--reverse-i-search-symbol (ivy-state-current ivy-last)))))
- (ivy--kill-current-candidate)))
-
-(defvar ivy-reverse-i-search-map
- (let ((map (make-sparse-keymap)))
- (ivy-define-key map (kbd "C-k") 'ivy-reverse-i-search-kill)
- map))
-
-(defun ivy-history-contents (history)
- "Copy contents of HISTORY.
-A copy is necessary so that we don't clobber any string attributes.
-Also set `ivy--reverse-i-search-symbol' to HISTORY."
- (setq ivy--reverse-i-search-symbol history)
- (cond ((symbolp history)
- (ivy--label-and-delete-dups
- (copy-sequence (symbol-value history))))
- ((ring-p history)
- (ivy--label-and-delete-dups
- (when (> (ring-size history) 0)
- (ring-elements history))))
- ((sequencep history)
- (ivy--label-and-delete-dups
- (copy-sequence history)))
- (t
- (error "Expected a symbol, ring, or sequence: %S" history))))
-
-(defun ivy-reverse-i-search ()
- "Enter a recursive `ivy-read' session using the current history.
-The selected history element will be inserted into the minibuffer.
-\\<ivy-reverse-i-search-map>
-You can also delete an element from history with \\[ivy-reverse-i-search-kill]."
- (interactive)
- (cond
- ((= (minibuffer-depth) 0)
- (user-error
- "This command is intended to be called from within `ivy-read'"))
- ;; don't recur
- ((and (> (minibuffer-depth) 1)
- (eq (ivy-state-caller ivy-last) 'ivy-reverse-i-search)))
- (t
- (let ((enable-recursive-minibuffers t)
- (old-last ivy-last))
- (ivy-read "Reverse-i-search: "
- (ivy-history-contents (ivy-state-history ivy-last))
- :keymap ivy-reverse-i-search-map
- :action (lambda (x)
- (ivy--reset-state
- (setq ivy-last old-last))
- (delete-minibuffer-contents)
- (insert (substring-no-properties (car x)))
- (ivy--cd-maybe))
- :caller 'ivy-reverse-i-search)))))
-
-(defun ivy-restrict-to-matches ()
- "Restrict candidates to current input and erase input."
- (interactive)
- (delete-minibuffer-contents)
- (if (ivy-state-dynamic-collection ivy-last)
- (progn
- (setf (ivy-state-dynamic-collection ivy-last) nil)
- (setf (ivy-state-collection ivy-last)
- (setq ivy--all-candidates ivy--old-cands)))
- (setq ivy--all-candidates
- (ivy--filter ivy-text ivy--all-candidates))))
-
-;;* Occur
-(defvar-local ivy-occur-last nil
- "Buffer-local value of `ivy-last'.
-Can't re-use `ivy-last' because using e.g. `swiper' in the same
-buffer would modify `ivy-last'.")
-
-(defvar ivy-occur-mode-map
- (let ((map (make-sparse-keymap)))
- (ivy-define-key map [mouse-1] 'ivy-occur-click)
- (ivy-define-key map (kbd "RET") 'ivy-occur-press-and-switch)
- (ivy-define-key map (kbd "j") 'ivy-occur-next-line)
- (ivy-define-key map (kbd "k") 'ivy-occur-previous-line)
- (define-key map (kbd "h") 'backward-char)
- (define-key map (kbd "l") 'forward-char)
- (ivy-define-key map (kbd "f") 'ivy-occur-press)
- (ivy-define-key map (kbd "g") 'ivy-occur-revert-buffer)
- (ivy-define-key map (kbd "a") 'ivy-occur-read-action)
- (ivy-define-key map (kbd "o") 'ivy-occur-dispatch)
- (ivy-define-key map (kbd "c") 'ivy-occur-toggle-calling)
- (define-key map (kbd "q") 'quit-window)
- (define-key map (kbd "R") 'read-only-mode)
- (ivy-define-key map (kbd "C-d") 'ivy-occur-delete-candidate)
- map)
- "Keymap for Ivy Occur mode.")
-
-(defun ivy-occur-toggle-calling ()
- "Toggle `ivy-calling'."
- (interactive)
- (if (setq ivy-calling (not ivy-calling))
- (progn
- (setq mode-name "Ivy-Occur [calling]")
- (ivy-occur-press))
- (setq mode-name "Ivy-Occur"))
- (force-mode-line-update))
-
-(defun ivy--find-occur-buffer ()
- (let ((cb (current-buffer)))
- (cl-find-if
- (lambda (b)
- (with-current-buffer b
- (and (eq major-mode 'ivy-occur-grep-mode)
- (equal cb (ivy-state-buffer ivy-occur-last)))))
- (buffer-list))))
-
-(defun ivy--select-occur-buffer ()
- (let* ((ob (ivy--find-occur-buffer))
- (ow (cl-find-if (lambda (w) (equal ob (window-buffer w)))
- (window-list))))
- (if ow
- (select-window ow)
- (pop-to-buffer ob))))
-
-(defun ivy-occur-next-line (&optional arg)
- "Move the cursor down ARG lines.
-When `ivy-calling' isn't nil, call `ivy-occur-press'."
- (interactive "p")
- (let ((offset (cond ((derived-mode-p 'ivy-occur-grep-mode) 5)
- ((derived-mode-p 'ivy-occur-mode) 2))))
- (if offset
- (progn
- (if (< (line-number-at-pos) offset)
- (progn
- (goto-char (point-min))
- (forward-line (1- offset)))
- (forward-line arg)
- (when (eolp)
- (forward-line -1)))
- (when ivy-calling
- (ivy-occur-press)))
- (ivy--select-occur-buffer)
- (ivy-occur-next-line arg)
- (ivy-occur-press-and-switch))))
-
-(defun ivy-occur-previous-line (&optional arg)
- "Move the cursor up ARG lines.
-When `ivy-calling' isn't nil, call `ivy-occur-press'."
- (interactive "p")
- (let ((offset (cond ((derived-mode-p 'ivy-occur-grep-mode) 5)
- ((derived-mode-p 'ivy-occur-mode) 2))))
- (if offset
- (progn
- (forward-line (- arg))
- (when (< (line-number-at-pos) offset)
- (goto-char (point-min))
- (forward-line (1- offset)))
- (when ivy-calling
- (ivy-occur-press)))
- (ivy--select-occur-buffer)
- (ivy-occur-previous-line arg)
- (ivy-occur-press-and-switch))))
-
-(defun ivy-occur-next-error (n &optional reset)
- "A `next-error-function' for `ivy-occur-mode'."
- (interactive "p")
- (when reset
- (goto-char (point-min)))
- (setq n (or n 1))
- (let ((ivy-calling t))
- (cond ((< n 0) (ivy-occur-previous-line (- n)))
- (t (ivy-occur-next-line n))))
- ;; The window's point overrides the buffer's point every time it's redisplayed
- (dolist (window (get-buffer-window-list nil nil t))
- (set-window-point window (point))))
-
-(define-derived-mode ivy-occur-mode fundamental-mode "Ivy-Occur"
- "Major mode for output from \\[ivy-occur].
-
-\\{ivy-occur-mode-map}"
- (setq-local view-read-only nil))
-
-(defvar ivy-occur-grep-mode-map
- (let ((map (copy-keymap ivy-occur-mode-map)))
- (ivy-define-key map (kbd "C-x C-q") 'ivy-wgrep-change-to-wgrep-mode)
- (ivy-define-key map "w" 'ivy-wgrep-change-to-wgrep-mode)
- map)
- "Keymap for Ivy Occur Grep mode.")
-
-(defun ivy-occur-delete-candidate ()
- (interactive)
- (let ((inhibit-read-only t))
- (delete-region (line-beginning-position)
- (1+ (line-end-position)))))
-
-(define-derived-mode ivy-occur-grep-mode grep-mode "Ivy-Occur"
- "Major mode for output from \\[ivy-occur].
-
-\\{ivy-occur-grep-mode-map}"
- (setq-local view-read-only nil)
- (when (fboundp 'wgrep-setup)
- (wgrep-setup)))
-
-(defun ivy--starts-with-dotslash (str)
- (string-match-p "\\`\\.[/\\]" str))
-
-(defun ivy--occur-insert-lines (cands)
- "Insert CANDS into `ivy-occur' buffer."
- (font-lock-mode -1)
- (dolist (cand cands)
- (setq cand
- (if (string-match "\\`\\(.*:[0-9]+:\\)\\(.*\\)\\'" cand)
- (let ((file-and-line (match-string 1 cand))
- (grep-line (match-string 2 cand)))
- (concat
- (propertize file-and-line 'face 'ivy-grep-info)
- (ivy--highlight-fuzzy grep-line)))
- (ivy--highlight-fuzzy (copy-sequence cand))))
- (add-text-properties
- 0 (length cand)
- '(mouse-face
- highlight
- help-echo "mouse-1: call ivy-action")
- cand)
- (insert (if (ivy--starts-with-dotslash cand) "" " ")
- cand ?\n)))
-
-(defun ivy--occur-default (cands)
- "Insert CANDS into the current occur buffer."
- (unless cands
- (let ((coll (ivy-state-collection ivy-last)))
- (when (arrayp coll)
- (setq coll (all-completions "" coll (ivy-state-predicate ivy-last))))
- (setq cands (ivy--filter (ivy-state-text ivy-last) coll))))
- (ivy-occur-mode)
- (insert (format "%d candidates:\n" (length cands)))
- (ivy--occur-insert-lines cands)
- (read-only-mode))
-
-(defun ivy-occur ()
- "Stop completion and put the current candidates into a new buffer.
-
-The new buffer remembers current action(s).
-
-While in the *ivy-occur* buffer, selecting a candidate with RET or
-a mouse click will call the appropriate action for that candidate.
-
-There is no limit on the number of *ivy-occur* buffers."
- (interactive)
- (if (not (window-minibuffer-p))
- (user-error "No completion session is active")
- (let* ((caller (ivy-state-caller ivy-last))
- (occur-fn (or (plist-get ivy--occurs-list caller)
- #'ivy--occur-default))
- (buffer
- (generate-new-buffer
- (format "*ivy-occur%s \"%s\"*"
- (if caller
- (concat " " (prin1-to-string caller))
- "")
- ivy-text))))
- (with-current-buffer buffer
- (funcall occur-fn ivy--old-cands)
- (setf (ivy-state-text ivy-last) ivy-text)
- (setq ivy-occur-last ivy-last))
- (ivy-exit-with-action
- (lambda (_)
- (pop-to-buffer buffer)
- (setq next-error-last-buffer buffer)
- (setq-local next-error-function #'ivy-occur-next-error))))))
-
-(defun ivy-occur-revert-buffer ()
- "Refresh the buffer making it up-to date with the collection.
-
-Currently only works for `swiper'. In that specific case, the
-*ivy-occur* buffer becomes nearly useless as the original buffer
-is updated, since the line numbers no longer match.
-
-Calling this function is as if you called `ivy-occur' on the
-updated original buffer."
- (interactive)
- (let ((caller (ivy-state-caller ivy-occur-last))
- (ivy-last ivy-occur-last))
- (let ((inhibit-read-only t)
- (line (line-number-at-pos)))
- (erase-buffer)
- (funcall (or (plist-get ivy--occurs-list caller)
- #'ivy--occur-default) nil)
- (goto-char (point-min))
- (forward-line (1- line)))
- (setq ivy-occur-last ivy-last)))
-
-(declare-function wgrep-change-to-wgrep-mode "ext:wgrep")
-
-(defun ivy-wgrep-change-to-wgrep-mode ()
- "Forward to `wgrep-change-to-wgrep-mode'."
- (interactive)
- (if (require 'wgrep nil 'noerror)
- (wgrep-change-to-wgrep-mode)
- (error "Package wgrep isn't installed")))
-
-(defun ivy-occur-read-action ()
- "Select one of the available actions as the current one."
- (interactive)
- (let ((ivy-last ivy-occur-last))
- (ivy-read-action)))
-
-(defun ivy-occur-dispatch ()
- "Call one of the available actions on the current item."
- (interactive)
- (let* ((state-action (ivy-state-action ivy-occur-last))
- (actions (if (symbolp state-action)
- state-action
- (copy-sequence state-action))))
- (unwind-protect
- (progn
- (ivy-occur-read-action)
- (ivy-occur-press))
- (setf (ivy-state-action ivy-occur-last) actions))))
-
-(defun ivy-occur-click (event)
- "Execute action for the current candidate.
-EVENT gives the mouse position."
- (interactive "e")
- (let ((window (posn-window (event-end event)))
- (pos (posn-point (event-end event))))
- (with-current-buffer (window-buffer window)
- (goto-char pos)
- (ivy-occur-press))))
-
-(declare-function swiper--cleanup "swiper")
-(declare-function swiper--add-overlays "swiper")
-(defvar ivy-occur-timer nil)
-
-(defun ivy--occur-press-update-window ()
- (cond
- ((memq (ivy-state-caller ivy-occur-last)
- (append '(swiper swiper-isearch) ivy-highlight-grep-commands))
- (let ((window (ivy-state-window ivy-occur-last))
- (buffer (ivy-state-buffer ivy-occur-last)))
- (when (buffer-live-p buffer)
- (cond ((or (not (window-live-p window))
- (equal window (selected-window)))
- (save-selected-window
- (setf (ivy-state-window ivy-occur-last)
- (display-buffer buffer))))
- ((not (equal (window-buffer window) buffer))
- (with-selected-window window
- (switch-to-buffer buffer)))))))
-
- ((memq (ivy-state-caller ivy-occur-last)
- '(counsel-describe-function
- counsel-describe-variable
- counsel-describe-symbol))
- (setf (ivy-state-window ivy-occur-last)
- (selected-window))
- (selected-window))))
-
-(defun ivy--occur-press-buffer ()
- (let ((buffer (ivy-state-buffer ivy-last)))
- (if (buffer-live-p buffer)
- buffer
- (current-buffer))))
-
-(defun ivy-occur-press ()
- "Execute action for the current candidate."
- (interactive)
- (ivy--occur-press-update-window)
- (when (save-excursion
- (beginning-of-line)
- (looking-at "\\(?:./\\| \\)\\(.*\\)$"))
- (let* ((ivy-last ivy-occur-last)
- (ivy-text (ivy-state-text ivy-last))
- (str (buffer-substring
- (match-beginning 1)
- (match-end 1)))
- (offset (or (get-text-property 0 'offset str) 0))
- (coll (ivy-state-collection ivy-last))
- (action (ivy--get-action ivy-last))
- (ivy-exit 'done))
- (with-ivy-window
- (with-current-buffer (ivy--occur-press-buffer)
- (save-restriction
- (widen)
- (funcall action
- (if (and (consp coll)
- (consp (car coll)))
- (assoc str coll)
- (substring str offset)))))
- (if (memq (ivy-state-caller ivy-last)
- (append '(swiper swiper-isearch) ivy-highlight-grep-commands))
- (with-current-buffer (window-buffer (selected-window))
- (swiper--cleanup)
- (swiper--add-overlays
- (ivy--regex ivy-text)
- (line-beginning-position)
- (line-end-position)
- (selected-window))
- (when (timerp ivy-occur-timer)
- (cancel-timer ivy-occur-timer))
- (setq ivy-occur-timer
- (run-at-time 1.0 nil 'swiper--cleanup))))))))
-
-(defun ivy-occur-press-and-switch ()
- "Execute action for the current candidate and switch window."
- (interactive)
- (ivy-occur-press)
- (select-window (ivy--get-window ivy-occur-last)))
-
-(defun ivy--marked-p ()
- (member (ivy-state-current ivy-last) ivy-marked-candidates))
-
-(defun ivy--unmark (cand)
- (setcar (member cand ivy--all-candidates)
- (setcar (member cand ivy--old-cands)
- (substring cand (length ivy-mark-prefix))))
- (setq ivy-marked-candidates
- (delete cand ivy-marked-candidates)))
-
-(defun ivy--mark (cand)
- (let ((marked-cand (concat ivy-mark-prefix cand)))
- (setcar (member cand ivy--all-candidates)
- (setcar (member cand ivy--old-cands) marked-cand))
- (setq ivy-marked-candidates
- (append ivy-marked-candidates (list marked-cand)))))
-
-(defun ivy-mark ()
- "Mark the selected candidate and move to the next one.
-
-In `ivy-call', :action will be called in turn for all marked
-candidates.
-
-However, if :multi-action was supplied to `ivy-read', then it
-will be called with `ivy-marked-candidates'. This way, it can
-make decisions based on the whole marked list."
- (interactive)
- (unless (ivy--marked-p)
- (ivy--mark (ivy-state-current ivy-last)))
- (ivy-next-line))
-
-(defun ivy-unmark ()
- "Unmark the selected candidate and move to the next one."
- (interactive)
- (when (ivy--marked-p)
- (ivy--unmark (ivy-state-current ivy-last)))
- (ivy-next-line))
-
-(defun ivy-unmark-backward ()
- "Move to the previous candidate and unmark it."
- (interactive)
- (ivy-previous-line)
- (ivy--exhibit)
- (when (ivy--marked-p)
- (ivy--unmark (ivy-state-current ivy-last))))
-
-(defun ivy-toggle-marks ()
- "Toggle mark for all narrowed candidates."
- (interactive)
- (dolist (cand ivy--old-cands)
- (if (member cand ivy-marked-candidates)
- (ivy--unmark cand)
- (ivy--mark cand))))
-
-(defconst ivy-help-file (let ((default-directory
- (if load-file-name
- (file-name-directory load-file-name)
- default-directory)))
- (if (file-exists-p "ivy-help.org")
- (expand-file-name "ivy-help.org")
- (if (file-exists-p "doc/ivy-help.org")
- (expand-file-name "doc/ivy-help.org"))))
- "The file for `ivy-help'.")
-
-(defvar org-hide-emphasis-markers)
-
-(defun ivy-help ()
- "Help for `ivy'."
- (interactive)
- (let ((buf (get-buffer "*Ivy Help*"))
- (inhibit-read-only t))
- (unless buf
- (setq buf (get-buffer-create "*Ivy Help*"))
- (cl-letf (((symbol-function #'help-buffer) (lambda () buf)))
- (describe-mode))
- (with-current-buffer buf
- (goto-char (point-min))
- (insert "* describe-mode\n")
- (goto-char (point-min))
- (insert-file-contents ivy-help-file)
- (org-mode)
- (setq-local org-hide-emphasis-markers t)
- (view-mode)
- (goto-char (point-min))
- (let ((inhibit-message t))
- (org-cycle '(64)))))
- (if (eq this-command 'ivy-help)
- (switch-to-buffer buf)
- (with-ivy-window
- (pop-to-buffer buf)))
- (view-mode)
- (goto-char (point-min))))
-
-(declare-function ffap-url-p "ffap")
-(defvar ffap-url-fetcher)
-
-(defun ivy-ffap-url-p (string)
- "Forward to `ffap-url-p'."
- (require 'ffap)
- (ffap-url-p string))
-
-(defun ivy-ffap-url-fetcher (url)
- "Calls `ffap-url-fetcher'."
- (require 'ffap)
- (funcall ffap-url-fetcher url))
-
-(ivy-configure 'read-file-name-internal
- :sort-fn #'ivy-sort-file-function-default
- :display-transformer-fn #'ivy-read-file-transformer
- :alt-done-fn #'ivy--directory-done)
-
-(ivy-configure 'internal-complete-buffer
- :display-transformer-fn #'ivy-switch-buffer-transformer)
-
-(ivy-configure 'Info-read-node-name-1
- :alt-done-fn #'ivy--info-alt-done)
-
-(provide 'ivy)
-
-;;; ivy.el ends here
diff --git a/elpa/ivy-20200624.1140/ivy.info b/elpa/ivy-20200624.1140/ivy.info
deleted file mode 100644
index 1a78d47..0000000
--- a/elpa/ivy-20200624.1140/ivy.info
+++ /dev/null
@@ -1,1966 +0,0 @@
-This is ivy.info, produced by makeinfo version 6.5 from ivy.texi.
-
-Ivy manual, version 0.13.0
-
- Ivy is an interactive interface for completion in Emacs. Emacs uses
-completion mechanism in a variety of contexts: code, menus, commands,
-variables, functions, etc. Completion entails listing, sorting,
-filtering, previewing, and applying actions on selected items. When
-active, ‘ivy-mode’ completes the selection process by narrowing
-available choices while previewing in the minibuffer. Selecting the
-final candidate is either through simple keyboard character inputs or
-through powerful regular expressions.
-
- Copyright (C) 2015-2019 Free Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, no Front-Cover Texts, and
- no Back-Cover Texts. A copy of the license is included in the
- section entitled "GNU Free Documentation License".
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Ivy: (ivy). Using Ivy for completion.
-END-INFO-DIR-ENTRY
-
-
-File: ivy.info, Node: Top, Next: Introduction, Up: (dir)
-
-Ivy User Manual
-***************
-
-* Menu:
-
-* Introduction::
-* Installation::
-* Getting started::
-* Key bindings::
-* Completion Styles::
-* Customization::
-* Commands::
-* API::
-* Variable Index::
-* Keystroke Index::
-
-— The Detailed Node Listing —
-
-Installation
-
-* Installing from Emacs Package Manager::
-* Installing from the Git repository::
-
-Getting started
-
-* Basic customization::
-
-Key bindings
-
-* Global key bindings::
-* Minibuffer key bindings::
-
-Minibuffer key bindings
-
-* Key bindings for navigation::
-* Key bindings for single selection, action, then exit minibuffer: Key bindings for single selection action then exit minibuffer.
-* Key bindings for multiple selections and actions, keep minibuffer open: Key bindings for multiple selections and actions keep minibuffer open.
-* Key bindings that alter the minibuffer input::
-* Other key bindings::
-* Hydra in the minibuffer::
-* Saving the current completion session to a buffer::
-
-Completion Styles
-
-* ivy--regex-plus::
-* ivy--regex-ignore-order::
-* ivy--regex-fuzzy::
-
-Customization
-
-* Faces::
-* Defcustoms::
-* Actions::
-* Packages::
-
-Actions
-
-* What are actions?::
-* How can different actions be called?::
-* How to modify the actions list?::
-* Example - add two actions to each command::
-* Example - define a new command with several actions::
-
-Example - add two actions to each command
-
-* How to undo adding the two actions::
-* How to add actions to a specific command::
-
-Example - define a new command with several actions
-
-* Test the above function with ivy-occur::
-
-Commands
-
-* File Name Completion::
-* Buffer Name Completion::
-* Counsel commands::
-
-File Name Completion
-
-* Using TRAMP::
-
-API
-
-* Required arguments for ivy-read::
-* Optional arguments for ivy-read::
-* Example - counsel-describe-function::
-* Example - counsel-locate::
-* Example - ivy-read-with-extra-properties::
-
-
-
-File: ivy.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-Ivy is for quick and easy selection from a list. When Emacs prompts for
-a string from a list of several possible choices, Ivy springs into
-action to assist in narrowing and picking the right string from a vast
-number of choices.
-
- Ivy strives for minimalism, simplicity, customizability and
-discoverability.
-
-Minimalism
-..........
-
- Uncluttered minibuffer is minimalism. Ivy shows the completion
- defaults, the number of matches, and 10 candidate matches below the
- input line. Customize ‘ivy-height’ to adjust the number of
- candidate matches displayed in the minibuffer.
-
-Simplicity
-..........
-
- Simplicity is about Ivy’s behavior in the minibuffer. It is also
- about the code interface to extend Ivy’s functionality. The
- minibuffer area behaves as close to ‘fundamental-mode’ as possible.
- ‘SPC’ inserts a space, for example, instead of being bound to the
- more complex ‘minibuffer-complete-word’. Ivy’s code uses
- easy-to-examine global variables; avoids needless complications
- with branch-introducing custom macros.
-
-Customizability
-...............
-
- Customizability is about being able to use different methods and
- interfaces of completion to tailor the selection process. For
- example, adding a custom display function that points to a selected
- candidate with ‘>’, instead of highlighting the selected candidate
- with the ‘ivy-current-match’ face (see
- ‘ivy-format-functions-alist’). Or take the customization of
- actions, say after the candidate function is selected. ‘RET’ uses
- ‘counsel-describe-function’ to describe the function, whereas ‘M-o
- d’ jumps to that function’s definition in the code. The ‘M-o’
- prefix can be uniformly used with characters like ‘d’ to group
- similar actions.
-
-Discoverability
-...............
-
- Ivy displays easily discoverable commands through the hydra
- facility. ‘C-o’ in the minibuffer displays a hydra menu. It opens
- up within an expanded minibuffer area. Each menu item comes with
- short documentation strings and highlighted one-key completions.
- So discovering even seldom used keys is simply a matter of ‘C-o’ in
- the minibuffer while in the midst of the Ivy interaction. This
- discoverability minimizes exiting Ivy interface for documentation
- look-ups.
-
-
-File: ivy.info, Node: Installation, Next: Getting started, Prev: Introduction, Up: Top
-
-2 Installation
-**************
-
-Install Ivy automatically through Emacs’s package manager, or manually
-from Ivy’s development repository.
-
- Emacs 24.3 is the oldest version to run Ivy. Emacs 24.4 is the
-oldest version that runs Ivy with fancy faces display.
-
-* Menu:
-
-* Installing from Emacs Package Manager::
-* Installing from the Git repository::
-
-
-File: ivy.info, Node: Installing from Emacs Package Manager, Next: Installing from the Git repository, Up: Installation
-
-2.1 Installing from Emacs Package Manager
-=========================================
-
-‘M-x’ ‘package-install’ ‘RET’ ‘counsel’ ‘RET’
-
- Ivy is installed as part of the ‘counsel’ package, which is available
-from two different package archives, GNU ELPA and MELPA. For the latest
-stable version, use the GNU ELPA archives. For current hourly builds,
-use the MELPA archives.
-
- Ivy is split into three packages: ‘ivy’, ‘swiper’ and ‘counsel’; by
-installing ‘counsel’, the other two are brought in as dependencies. If
-you are not interested in the extra functionality provided by ‘swiper’
-and ‘counsel’, you can install only ‘ivy’.
-
- See the code below for adding MELPA to the list of package archives:
-
- (require 'package)
- (add-to-list 'package-archives
- '("melpa" . "https://melpa.org/packages/"))
-
- After this do ‘M-x’ ‘package-refresh-contents’ ‘RET’, followed by
-‘M-x’ ‘package-install’ ‘RET’ ‘counsel’ ‘RET’.
-
- For package manager details, see *note (emacs)Packages::.
-
-
-File: ivy.info, Node: Installing from the Git repository, Prev: Installing from Emacs Package Manager, Up: Installation
-
-2.2 Installing from the Git repository
-======================================
-
-Why install from Git?
-.....................
-
- • No need to wait for MELPA’s hourly builds
- • Easy to revert to previous versions
- • Contribute to Ivy’s development; send patches; pull requests
-
-Configuration steps
-...................
-
- First clone the Swiper repository with:
-
- cd ~/git && git clone https://github.com/abo-abo/swiper
- cd swiper && make compile
-
- Second, add these lines to the Emacs init file:
-
- (add-to-list 'load-path "~/git/swiper/")
- (require 'ivy)
-
- Then, update the code with:
-
- git pull
- make
-
-
-File: ivy.info, Node: Getting started, Next: Key bindings, Prev: Installation, Up: Top
-
-3 Getting started
-*****************
-
-First enable Ivy completion everywhere:
-
- (ivy-mode 1)
-
- Note: ‘ivy-mode’ can be toggled on and off with ‘M-x’ ‘ivy-mode’.
-
-* Menu:
-
-* Basic customization::
-
-
-File: ivy.info, Node: Basic customization, Up: Getting started
-
-3.1 Basic customization
-=======================
-
-Here are some basic settings particularly useful for new Ivy users:
-
- (setq ivy-use-virtual-buffers t)
- (setq ivy-count-format "(%d/%d) ")
-
- If you want, you can go without any customizations at all. The above
-settings are the most bang for the buck in terms of customization. So
-users that typically don’t like customize a lot are advised to look at
-these settings first.
-
- For more advanced customizations, refer to ‘M-x describe-variable’
-documentation.
-
-
-File: ivy.info, Node: Key bindings, Next: Completion Styles, Prev: Getting started, Up: Top
-
-4 Key bindings
-**************
-
-* Menu:
-
-* Global key bindings::
-* Minibuffer key bindings::
-
-
-File: ivy.info, Node: Global key bindings, Next: Minibuffer key bindings, Up: Key bindings
-
-4.1 Global key bindings
-=======================
-
-Here is a list of commands that are useful to be bound globally, along
-with some sample bindings:
-
-Ivy-based interface to standard commands
-........................................
-
- (global-set-key (kbd "C-s") 'swiper-isearch)
- (global-set-key (kbd "M-x") 'counsel-M-x)
- (global-set-key (kbd "C-x C-f") 'counsel-find-file)
- (global-set-key (kbd "M-y") 'counsel-yank-pop)
- (global-set-key (kbd "<f1> f") 'counsel-describe-function)
- (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
- (global-set-key (kbd "<f1> l") 'counsel-find-library)
- (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
- (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
- (global-set-key (kbd "<f2> j") 'counsel-set-variable)
- (global-set-key (kbd "C-x b") 'ivy-switch-buffer)
- (global-set-key (kbd "C-c v") 'ivy-push-view)
- (global-set-key (kbd "C-c V") 'ivy-pop-view)
-
-Ivy-based interface to shell and system tools
-.............................................
-
- (global-set-key (kbd "C-c c") 'counsel-compile)
- (global-set-key (kbd "C-c g") 'counsel-git)
- (global-set-key (kbd "C-c j") 'counsel-git-grep)
- (global-set-key (kbd "C-c L") 'counsel-git-log)
- (global-set-key (kbd "C-c k") 'counsel-rg)
- (global-set-key (kbd "C-c m") 'counsel-linux-app)
- (global-set-key (kbd "C-c n") 'counsel-fzf)
- (global-set-key (kbd "C-x l") 'counsel-locate)
- (global-set-key (kbd "C-c J") 'counsel-file-jump)
- (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
- (global-set-key (kbd "C-c w") 'counsel-wmctrl)
-
-Ivy-resume and other commands
-.............................
-
- ‘ivy-resume’ resumes the last Ivy-based completion.
-
- (global-set-key (kbd "C-c C-r") 'ivy-resume)
- (global-set-key (kbd "C-c b") 'counsel-bookmark)
- (global-set-key (kbd "C-c d") 'counsel-descbinds)
- (global-set-key (kbd "C-c g") 'counsel-git)
- (global-set-key (kbd "C-c o") 'counsel-outline)
- (global-set-key (kbd "C-c t") 'counsel-load-theme)
- (global-set-key (kbd "C-c F") 'counsel-org-file)
-
- You can also enable ‘counsel-mode’ to make some global key binding
-remapping for you.
-
-
-File: ivy.info, Node: Minibuffer key bindings, Prev: Global key bindings, Up: Key bindings
-
-4.2 Minibuffer key bindings
-===========================
-
-Ivy includes several minibuffer bindings, which are defined in the
-‘ivy-minibuffer-map’ keymap variable. The most frequently used ones are
-described here.
-
- ‘swiper’ or ‘counsel-M-x’ add more key bindings through the ‘keymap’
-argument to ‘ivy-read’. These keys, also active in the minibuffer, are
-described under their respective commands.
-
- A key feature of ‘ivy-minibuffer-map’ is its full editing capability
-where the familiar ‘C-a’, ‘C-f’, ‘M-d’, ‘M-DEL’, ‘M-b’, ‘M-w’, ‘C-k’,
-‘C-y’ key bindings work the same as in ‘fundamental-mode’.
-
-* Menu:
-
-* Key bindings for navigation::
-* Key bindings for single selection, action, then exit minibuffer: Key bindings for single selection action then exit minibuffer.
-* Key bindings for multiple selections and actions, keep minibuffer open: Key bindings for multiple selections and actions keep minibuffer open.
-* Key bindings that alter the minibuffer input::
-* Other key bindings::
-* Hydra in the minibuffer::
-* Saving the current completion session to a buffer::
-
-
-File: ivy.info, Node: Key bindings for navigation, Next: Key bindings for single selection action then exit minibuffer, Up: Minibuffer key bindings
-
-4.2.1 Key bindings for navigation
----------------------------------
-
- • ‘C-n’ (‘ivy-next-line’) selects the next candidate
- • ‘C-p’ (‘ivy-previous-line’) selects the previous candidate
- • ‘M-<’ (‘ivy-beginning-of-buffer’) selects the first candidate
- • ‘M->’ (‘ivy-end-of-buffer’) selects the last candidate
- • ‘C-v’ (‘ivy-scroll-up-command’) scrolls up by ‘ivy-height’ lines
- • ‘M-v’ (‘ivy-scroll-down-command’) scrolls down by ‘ivy-height’
- lines
-
- -- User Option: ivy-wrap
- Specifies the wrap-around behavior for ‘C-n’ and ‘C-p’. When
- ‘ivy-wrap’ is set to ‘t’, ‘ivy-next-line’ and ‘ivy-previous-line’
- will cycle past the last and the first candidates respectively.
-
- Wrap-around behavior is off by default.
-
- -- User Option: ivy-height
- Use this option to adjust the minibuffer height, which also affects
- scroll size when using ‘C-v’ and ‘M-v’ key bindings.
-
- ‘ivy-height’ is 10 lines by default.
-
-
-File: ivy.info, Node: Key bindings for single selection action then exit minibuffer, Next: Key bindings for multiple selections and actions keep minibuffer open, Prev: Key bindings for navigation, Up: Minibuffer key bindings
-
-4.2.2 Key bindings for single selection, action, then exit minibuffer
----------------------------------------------------------------------
-
-Ivy can offer several actions from which to choose which action to run.
-This "calling an action" operates on the selected candidate. For
-example, when viewing a list of files, one action could open it for
-editing, one to view it, another to invoke a special function, and so
-on. Custom actions can be added to this interface. The precise action
-to call on the selected candidate can be delayed until after the
-narrowing is completed. No need to exit the interface if unsure which
-action to run. This delayed flexibility and customization of actions
-extends usability of lists in Emacs.
-
-‘C-m’ or ‘RET’ (‘ivy-done’)
-...........................
-
- Calls the default action and then exits the minibuffer.
-
-‘M-o’ (‘ivy-dispatching-done’)
-..............................
-
- Presents valid actions from which to choose. When only one action
- is available, there is no difference between ‘M-o’ and ‘C-m’.
-
-‘C-j’ (‘ivy-alt-done’)
-......................
-
- When completing file names, selects the current directory candidate
- and starts a new completion session there. Otherwise, it is the
- same as ‘ivy-done’.
-
-‘TAB’ (‘ivy-partial-or-done’)
-.............................
-
- Attempts partial completion, extending current input as much as
- possible. ‘TAB TAB’ is the same as ‘C-j’ (‘ivy-alt-done’).
-
- Example ERT test:
-
- (should
- (equal (ivy-with
- '(progn
- (ivy-read "Test: " '("can do" "can't, sorry" "other"))
- ivy-text)
- "c <tab>")
- "can"))
-
-‘C-M-j’ (‘ivy-immediate-done’)
-..............................
-
- Exits with _the current input_ instead of _the current candidate_
- (like other commands).
-
- This is useful e.g. when you call ‘find-file’ to create a new
- file, but the desired name matches an existing file. In that case,
- using ‘C-j’ would select that existing file, which isn’t what you
- want - use this command instead.
-
-‘C-'’ (‘ivy-avy’)
-.................
-
- Uses avy to select one of the candidates on the current candidate
- page. This can often be faster than multiple ‘C-n’ or ‘C-p’
- keystrokes followed by ‘C-m’.
-
-
-File: ivy.info, Node: Key bindings for multiple selections and actions keep minibuffer open, Next: Key bindings that alter the minibuffer input, Prev: Key bindings for single selection action then exit minibuffer, Up: Minibuffer key bindings
-
-4.2.3 Key bindings for multiple selections and actions, keep minibuffer open
-----------------------------------------------------------------------------
-
-For repeatedly applying multiple actions or acting on multiple
-candidates, Ivy does not close the minibuffer between commands. It
-keeps the minibuffer open for applying subsequent actions.
-
- Adding an extra meta key to the normal key chord invokes the special
-version of the regular commands that enables applying multiple actions.
-
-‘C-M-m’ (‘ivy-call’)
-....................
-
- Is the non-exiting version of ‘C-m’ (‘ivy-done’).
-
- Instead of closing the minibuffer, ‘C-M-m’ allows selecting another
- candidate or another action. For example, ‘C-M-m’ on functions
- list invokes ‘describe-function’. When combined with ‘C-n’,
- function descriptions can be invoked quickly in succession.
-
-‘C-M-o’ (‘ivy-dispatching-call’)
-................................
-
- Is the non-exiting version of ‘M-o’ (‘ivy-dispatching-done’).
-
- For example, during the ‘counsel-rhythmbox’ completion, press
- ‘C-M-o e’ to en-queue the selected candidate, followed by ‘C-n C-m’
- to play the next candidate - the current action reverts to the
- default one after ‘C-M-o’.
-
-‘C-M-n’ (‘ivy-next-line-and-call’)
-..................................
-
- Combines ‘C-n’ and ‘C-M-m’. Moves to next line and applies an
- action.
-
- Comes in handy when opening multiple files from
- ‘counsel-find-file’, ‘counsel-git-grep’, ‘counsel-ag’,
- ‘counsel-rg’, or ‘counsel-locate’ lists. Just hold ‘C-M-n’ for
- rapid-fire default action on each successive element of the list.
-
-‘C-M-p’ (‘ivy-previous-line-and-call’)
-......................................
-
- Combines ‘C-p’ and ‘C-M-m’.
-
- Similar to the above except it moves through the list in the other
- direction.
-
-‘ivy-resume’
-............
-
- Recalls the state of the completion session just before its last
- exit.
-
- Useful after an accidental ‘C-m’ (‘ivy-done’). Use it with
- ‘universal-argument’ to resume any previous session.
-
-
-File: ivy.info, Node: Key bindings that alter the minibuffer input, Next: Other key bindings, Prev: Key bindings for multiple selections and actions keep minibuffer open, Up: Minibuffer key bindings
-
-4.2.4 Key bindings that alter the minibuffer input
---------------------------------------------------
-
-‘M-n’ (‘ivy-next-history-element’)
-..................................
-
- Cycles forward through the Ivy command history.
-
- Ivy updates an internal history list after each action. When this
- history list is empty, ‘M-n’ inserts symbol (or URL) at point into
- the minibuffer.
-
-‘M-p’ (‘ivy-previous-history-element’)
-......................................
-
- Cycles forward through the Ivy command history.
-
-‘M-i’ (‘ivy-insert-current’)
-............................
-
- Inserts the current candidate into the minibuffer.
-
- Useful for copying and renaming files, for example: ‘M-i’ to insert
- the original file name string, edit it, and then ‘C-m’ to complete
- the renaming.
-
-‘M-j’ (‘ivy-yank-word’)
-.......................
-
- Inserts the sub-word at point into the minibuffer.
-
- This is similar to ‘C-s C-w’ with ‘isearch’. Ivy reserves ‘C-w’
- for ‘kill-region’. See also ‘ivy-yank-symbol’ and ‘ivy-yank-char’.
-
-‘S-SPC’ (‘ivy-restrict-to-matches’)
-...................................
-
- Deletes the current input, and resets the candidates list to the
- currently restricted matches.
-
- This is how Ivy provides narrowing in successive tiers.
-
-‘C-r’ (‘ivy-reverse-i-search’)
-..............................
-
- Starts a recursive completion session through the command’s
- history.
-
- This works just like ‘C-r’ at the bash command prompt, where the
- completion candidates are the history items. Upon completion, the
- selected candidate string is inserted into the minibuffer.
-
-
-File: ivy.info, Node: Other key bindings, Next: Hydra in the minibuffer, Prev: Key bindings that alter the minibuffer input, Up: Minibuffer key bindings
-
-4.2.5 Other key bindings
-------------------------
-
-‘M-w’ (‘ivy-kill-ring-save’)
-............................
-
- Copies selected candidates to the kill ring.
-
- Copies the region if the region is active.
-
-
-File: ivy.info, Node: Hydra in the minibuffer, Next: Saving the current completion session to a buffer, Prev: Other key bindings, Up: Minibuffer key bindings
-
-4.2.6 Hydra in the minibuffer
------------------------------
-
-‘C-o’ (‘hydra-ivy/body’)
-........................
-
- Invokes the hydra menu with short key bindings.
-
- When Hydra is active, minibuffer editing is disabled and menus
-display short aliases:
-
-Short Normal Command name
-------------------------------------------------
-‘o’ ‘C-g’ ‘keyboard-escape-quit’
-‘j’ ‘C-n’ ‘ivy-next-line’
-‘k’ ‘C-p’ ‘ivy-previous-line’
-‘h’ ‘M-<’ ‘ivy-beginning-of-buffer’
-‘l’ ‘M->’ ‘ivy-end-of-buffer’
-‘d’ ‘C-m’ ‘ivy-done’
-‘f’ ‘C-j’ ‘ivy-alt-done’
-‘g’ ‘C-M-m’ ‘ivy-call’
-‘u’ ‘C-c C-o’ ‘ivy-occur’
-
- Hydra reduces key strokes, for example: ‘C-n C-n C-n C-n’ is ‘C-o
-jjjj’ in Hydra.
-
- Hydra menu offers these additional bindings:
-
-‘c’ (‘ivy-toggle-calling’)
-..........................
-
- Toggle calling the action after each candidate change. It modifies
- ‘j’ to ‘jg’, ‘k’ to ‘kg’ etc.
-
-‘m’ (‘ivy-rotate-preferred-builders’)
-.....................................
-
- Rotate the current regexp matcher.
-
-‘>’ (‘ivy-minibuffer-grow’)
-...........................
-
- Increase ‘ivy-height’ for the current minibuffer.
-
-‘<’ (‘ivy-minibuffer-shrink’)
-.............................
-
- Decrease ‘ivy-height’ for the current minibuffer.
-
-‘w’ (‘ivy-prev-action’)
-.......................
-
- Select the previous action.
-
-‘s’ (‘ivy-next-action’)
-.......................
-
- Select the next action.
-
-‘a’ (‘ivy-read-action’)
-.......................
-
- Use a menu to select an action.
-
-‘C’ (‘ivy-toggle-case-fold’)
-............................
-
- Toggle case folding (match both upper and lower case characters for
- lower case input).
-
- Hydra menu also offers bindings for marking multiple candidates:
-
-Key Command name
---------------------------------
-‘m’ ‘ivy-mark’
-‘u’ ‘ivy-unmark’
-‘DEL’ ‘ivy-unmark-backward’
-‘t’ ‘ivy-toggle-marks’
-
- The action is called on each marked candidate one by one.
-
-
-File: ivy.info, Node: Saving the current completion session to a buffer, Prev: Hydra in the minibuffer, Up: Minibuffer key bindings
-
-4.2.7 Saving the current completion session to a buffer
--------------------------------------------------------
-
-‘C-c C-o’ (‘ivy-occur’)
-.......................
-
- Saves the current candidates to a new buffer and exits completion.
-
- The new buffer is read-only and has a few useful bindings defined.
-
-‘RET’ or ‘f’ (‘ivy-occur-press’)
-................................
-
- Call the current action on the selected candidate.
-
-‘mouse-1’ (‘ivy-occur-click’)
-.............................
-
- Call the current action on the selected candidate.
-
-‘j’ (‘next-line’)
-.................
-
- Move to next line.
-
-‘k’ (‘previous-line’)
-.....................
-
- Move to previous line.
-
-‘a’ (‘ivy-occur-read-action’)
-.............................
-
- Read an action and make it current for this buffer.
-
-‘o’ (‘ivy-occur-dispatch’)
-..........................
-
- Read an action and call it on the selected candidate.
-
-‘q’ (‘quit-window’)
-...................
-
- Bury the current buffer.
-
- Ivy has no limit on the number of active buffers like these.
-
- Ivy takes care of naming buffers uniquely by constructing descriptive
-names. For example: ‘*ivy-occur counsel-describe-variable "function$*’.
-
-
-File: ivy.info, Node: Completion Styles, Next: Customization, Prev: Key bindings, Up: Top
-
-5 Completion Styles
-*******************
-
-Ivy’s completion functions rely on a regex builder - a function that
-transforms a string input to a string regex. All current candidates
-simply have to match this regex. Each collection can be assigned its
-own regex builder by customizing ‘ivy-re-builders-alist’.
-
- The keys of this alist are collection names, and the values are one
-of the following:
- • ‘ivy--regex’
- • ‘ivy--regex-plus’
- • ‘ivy--regex-ignore-order’
- • ‘ivy--regex-fuzzy’
- • ‘regexp-quote’
-
- A catch-all key, ‘t’, applies to all collections that don’t have
-their own key.
-
- The default is:
-
- (setq ivy-re-builders-alist
- '((t . ivy--regex-plus)))
-
- This example shows a custom regex builder assigned to file name
-completion:
-
- (setq ivy-re-builders-alist
- '((read-file-name-internal . ivy--regex-fuzzy)
- (t . ivy--regex-plus)))
-
- Here, ‘read-file-name-internal’ is a function that is passed as the
-second argument to ‘completing-read’ for file name completion.
-
- The regex builder resolves as follows (in order of priority):
- 1. ‘re-builder’ argument passed to ‘ivy-read’.
- 2. ‘collection’ argument passed to ‘ivy-read’ is a function and has an
- entry on ‘ivy-re-builders-alist’.
- 3. ‘caller’ argument passed to ‘ivy-read’ has an entry on
- ‘ivy-re-builders-alist’.
- 4. ‘this-command’ has an entry on ‘ivy-re-builders-alist’.
- 5. ‘t’ has an entry on ‘ivy-re-builders-alist’.
- 6. ‘ivy--regex’.
-
-* Menu:
-
-* ivy--regex-plus::
-* ivy--regex-ignore-order::
-* ivy--regex-fuzzy::
-
-
-File: ivy.info, Node: ivy--regex-plus, Next: ivy--regex-ignore-order, Up: Completion Styles
-
-5.1 ivy–regex-plus
-==================
-
-‘ivy--regex-plus’ is Ivy’s default completion method.
-
- ‘ivy--regex-plus’ matches by splitting the input by spaces and
-rebuilding it into a regex.
-
- As the search string is typed in Ivy’s minibuffer, it is transformed
-into valid regex syntax. If the string is ‘"for example"’, it is
-transformed into
-
- "\\(for\\).*\\(example\\)"
-
- which in regex terminology matches ‘"for"’ followed by a wild card
-and then ‘"example"’. Note how Ivy uses the space character to build
-wild cards. To match a literal white space, use an extra space. So to
-match one space type two spaces, to match two spaces type three spaces,
-and so on.
-
- As Ivy transforms typed characters into regex strings, it provides an
-intuitive feedback through font highlights.
-
- Ivy supports regexp negation with ‘"!"’. For example, ‘"define key !
-ivy quit"’ first selects everything matching ‘"define.*key"’, then
-removes everything matching ‘"ivy"’, and finally removes everything
-matching ‘"quit"’. What remains is the final result set of the negation
-regexp.
-
- Since Ivy treats minibuffer input as a regexp, the standard regexp
-identifiers work: ‘"^"’, ‘"$"’, ‘"\b"’ or ‘"[a-z]"’. The exceptions are
-spaces, which translate to ‘".*"’, and ‘"!"’ that signal the beginning
-of a negation group.
-
-
-File: ivy.info, Node: ivy--regex-ignore-order, Next: ivy--regex-fuzzy, Prev: ivy--regex-plus, Up: Completion Styles
-
-5.2 ivy–regex-ignore-order
-==========================
-
-‘ivy--regex-ignore-order’ ignores the order of regexp tokens when
-searching for matching candidates. For instance, the input ‘"for
-example"’ will match ‘"example test for"’.
-
-
-File: ivy.info, Node: ivy--regex-fuzzy, Prev: ivy--regex-ignore-order, Up: Completion Styles
-
-5.3 ivy–regex-fuzzy
-===================
-
-‘ivy--regex-fuzzy’ splits each character with a wild card. Searching
-for ‘"for"’ returns all ‘"f.*o.*r"’ matches, resulting in a large number
-of hits. Yet some searches need these extra hits. Ivy sorts such large
-lists using ‘flx’ package’s scoring mechanism, if it’s installed.
-
- ‘C-o m’ toggles the current regexp builder.
-
-
-File: ivy.info, Node: Customization, Next: Commands, Prev: Completion Styles, Up: Top
-
-6 Customization
-***************
-
-* Menu:
-
-* Faces::
-* Defcustoms::
-* Actions::
-* Packages::
-
-
-File: ivy.info, Node: Faces, Next: Defcustoms, Up: Customization
-
-6.1 Faces
-=========
-
-‘ivy-current-match’
-...................
-
- Highlights the currently selected candidate.
-
-‘ivy-minibuffer-match-face-1’
-.............................
-
- Highlights the background of the match.
-
-‘ivy-minibuffer-match-face-2’
-.............................
-
- Highlights the first (modulo 3) matched group.
-
-‘ivy-minibuffer-match-face-3’
-.............................
-
- Highlights the second (modulo 3) matched group.
-
-‘ivy-minibuffer-match-face-4’
-.............................
-
- Highlights the third (modulo 3) matched group.
-
-‘ivy-confirm-face’
-..................
-
- Highlights the "(confirm)" part of the prompt.
-
- When ‘confirm-nonexistent-file-or-buffer’ set to ‘t’, then
- confirming non-existent files in ‘ivy-mode’ requires an additional
- ‘RET’.
-
- The confirmation prompt will use this face.
-
- For example:
-
- (setq confirm-nonexistent-file-or-buffer t)
-
- Then call ‘find-file’, enter "eldorado" and press ‘RET’ - the
- prompt will be appended with "(confirm)". Press ‘RET’ once more to
- confirm, or any key to continue the completion.
-
-‘ivy-match-required-face’
-.........................
-
- Highlights the "(match required)" part of the prompt.
-
- When completions have to match available candidates and cannot take
- random input, the "(match required)" prompt signals this
- constraint.
-
- For example, call ‘describe-variable’, enter "waldo" and press
- ‘RET’ - "(match required)" is prompted. Press any key for the
- prompt to disappear.
-
-‘ivy-subdir’
-............
-
- Highlights directories when completing file names.
-
-‘ivy-remote’
-............
-
- Highlights remote files when completing file names.
-
-‘ivy-virtual’
-.............
-
- Highlights virtual buffers when completing buffer names.
-
- Virtual buffers correspond to bookmarks and recent files list,
- ‘recentf’.
-
- Enable virtual buffers with:
-
- (setq ivy-use-virtual-buffers t)
-
-‘ivy-modified-buffer’
-.....................
-
- Highlights modified buffers when switching buffer.
-
-‘ivy-modified-outside-buffer’
-.............................
-
- Highlights buffers modified outside Emacs when switching buffer.
-
- This takes precedence over ‘ivy-modified-buffer’.
-
-
-File: ivy.info, Node: Defcustoms, Next: Actions, Prev: Faces, Up: Customization
-
-6.2 Defcustoms
-==============
-
- -- User Option: ivy-count-format
- A string that specifies display of number of candidates and current
- candidate, if one exists.
-
- The number of matching candidates by default is shown as a right-
- padded integer value.
-
- To disable showing the number of candidates:
-
- (setq ivy-count-format "")
-
- To also display the current candidate:
-
- (setq ivy-count-format "(%d/%d) ")
-
- The ‘format’-style switches this variable uses are described in the
- ‘format’ documentation.
-
- -- User Option: ivy-display-style
- Specifies highlighting candidates in the minibuffer.
-
- The default setting is ‘'fancy’ in Emacs versions 24.4 or newer.
-
- Set ‘ivy-display-style’ to ‘nil’ for a plain minibuffer.
-
- -- User Option: ivy-on-del-error-function
- Specifies what to do when ‘DEL’ (‘ivy-backward-delete-char’) fails.
-
- This is usually the case when there is no text left to delete,
- i.e., when ‘DEL’ is typed at the beginning of the minibuffer.
-
- The default behavior is to quit the completion after ‘DEL’ – a
- handy key to invoke after mistakenly triggering a completion.
-
-
-File: ivy.info, Node: Actions, Next: Packages, Prev: Defcustoms, Up: Customization
-
-6.3 Actions
-===========
-
-* Menu:
-
-* What are actions?::
-* How can different actions be called?::
-* How to modify the actions list?::
-* Example - add two actions to each command::
-* Example - define a new command with several actions::
-
-
-File: ivy.info, Node: What are actions?, Next: How can different actions be called?, Up: Actions
-
-6.3.1 What are actions?
------------------------
-
-An action is a function that is called after you select a candidate
-during completion. This function takes a single string argument, which
-is the selected candidate.
-
-Window context when calling an action
-.....................................
-
- Currently, the action is executed in the minibuffer window context.
- This means e.g. that if you call ‘insert’ the text will be
- inserted into the minibuffer.
-
- If you want to execute the action in the initial window from which
- the completion started, use the ‘with-ivy-window’ wrapper macro.
-
- (defun ivy-insert-action (x)
- (with-ivy-window
- (insert x)))
-
-
-File: ivy.info, Node: How can different actions be called?, Next: How to modify the actions list?, Prev: What are actions?, Up: Actions
-
-6.3.2 How can different actions be called?
-------------------------------------------
-
- • ‘C-m’ (‘ivy-done’) calls the current action.
- • ‘M-o’ (‘ivy-dispatching-done’) presents available actions for
- selection, calls it after selection, and then exits.
- • ‘C-M-o’ (‘ivy-dispatching-call’) presents available actions for
- selection, calls it after selection, and then does not exit.
-
-
-File: ivy.info, Node: How to modify the actions list?, Next: Example - add two actions to each command, Prev: How can different actions be called?, Up: Actions
-
-6.3.3 How to modify the actions list?
--------------------------------------
-
-Currently, you can append any amount of your own actions to the default
-list of actions. This can be done either for a specific command, or for
-all commands at once.
-
- Usually, the command has only one default action. The convention is
-to use single letters when selecting a command, and the letter ‘o’ is
-designated for the default command. This way, ‘M-o o’ should be always
-equivalent to ‘C-m’.
-
-
-File: ivy.info, Node: Example - add two actions to each command, Next: Example - define a new command with several actions, Prev: How to modify the actions list?, Up: Actions
-
-6.3.4 Example - add two actions to each command
------------------------------------------------
-
-The first action inserts the current candidate into the Ivy window - the
-window from which ‘ivy-read’ was called.
-
- The second action copies the current candidate to the kill ring.
-
- (defun ivy-yank-action (x)
- (kill-new x))
-
- (defun ivy-copy-to-buffer-action (x)
- (with-ivy-window
- (insert x)))
-
- (ivy-set-actions
- t
- '(("i" ivy-copy-to-buffer-action "insert")
- ("y" ivy-yank-action "yank")))
-
- Then in any completion session, ‘M-o y’ invokes ‘ivy-yank-action’,
-and ‘M-o i’ invokes ‘ivy-copy-to-buffer-action’.
-
-* Menu:
-
-* How to undo adding the two actions::
-* How to add actions to a specific command::
-
-
-File: ivy.info, Node: How to undo adding the two actions, Next: How to add actions to a specific command, Up: Example - add two actions to each command
-
-6.3.4.1 How to undo adding the two actions
-..........................................
-
-Since ‘ivy-set-actions’ modifies the internal dictionary with new data,
-set the extra actions list to ‘nil’ by assigning ‘nil’ value to the ‘t’
-key as follows:
-
- (ivy-set-actions t nil)
-
-
-File: ivy.info, Node: How to add actions to a specific command, Prev: How to undo adding the two actions, Up: Example - add two actions to each command
-
-6.3.4.2 How to add actions to a specific command
-................................................
-
-Use the command name as the key:
-
- (ivy-set-actions
- 'swiper
- '(("i" ivy-copy-to-buffer-action "insert")
- ("y" ivy-yank-action "yank")))
-
-
-File: ivy.info, Node: Example - define a new command with several actions, Prev: Example - add two actions to each command, Up: Actions
-
-6.3.5 Example - define a new command with several actions
----------------------------------------------------------
-
- (defun my-action-1 (x)
- (message "action-1: %s" x))
-
- (defun my-action-2 (x)
- (message "action-2: %s" x))
-
- (defun my-action-3 (x)
- (message "action-3: %s" x))
-
- (defun my-command-with-3-actions ()
- (interactive)
- (ivy-read "test: " '("foo" "bar" "baz")
- :action '(1
- ("o" my-action-1 "action 1")
- ("j" my-action-2 "action 2")
- ("k" my-action-3 "action 3"))))
-
- The number 1 above is the index of the default action. Each action
-has its own string description for easy selection.
-
-* Menu:
-
-* Test the above function with ivy-occur::
-
-
-File: ivy.info, Node: Test the above function with ivy-occur, Up: Example - define a new command with several actions
-
-6.3.5.1 Test the above function with ‘ivy-occur’
-................................................
-
-To examine each action with each candidate in a key-efficient way, try:
-
- • Call ‘my-command-with-3-actions’
- • Press ‘C-c C-o’ to close the completion window and move to an
- ivy-occur buffer
- • Press ‘kkk’ to move to the first candidate, since the point is most
- likely at the end of the buffer
- • Press ‘oo’ to call the first action
- • Press ‘oj’ and ‘ok’ to call the second and the third actions
- • Press ‘j’ to move to the next candidate
- • Press ‘oo’, ‘oj’, ‘ok’
- • Press ‘j’ to move to the next candidate
- • and so on...
-
-
-File: ivy.info, Node: Packages, Prev: Actions, Up: Customization
-
-6.4 Packages
-============
-
-‘org-mode’
-..........
-
- ‘org-mode’ versions 8.3.3 or later obey ‘completing-read-function’
- (which ‘ivy-mode’ sets). Try refiling headings with similar names
- to appreciate ‘ivy-mode’.
-
-‘magit’
-.......
-
- Uses ivy by default if Ivy is installed.
-
-‘find-file-in-project’
-......................
-
- Uses ivy by default if Ivy is installed.
-
-‘projectile’
-............
-
- Projectile requires this setting for ivy completion:
-
- (setq projectile-completion-system 'ivy)
-
-‘helm-make’
-...........
-
- Helm-make requires this setting for ivy completion.
-
- (setq helm-make-completion-method 'ivy)
-
-automatically integrated packages
-.................................
-
- Ivy re-uses the following packages if they are installed: ‘avy’,
- ‘amx’ or ‘smex’, ‘flx’, and ‘wgrep’.
-
-
-File: ivy.info, Node: Commands, Next: API, Prev: Customization, Up: Top
-
-7 Commands
-**********
-
-* Menu:
-
-* File Name Completion::
-* Buffer Name Completion::
-* Counsel commands::
-
-
-File: ivy.info, Node: File Name Completion, Next: Buffer Name Completion, Up: Commands
-
-7.1 File Name Completion
-========================
-
-Since file name completion is ubiquitous, Ivy provides extra bindings
-that work here:
-
-‘C-j’ (‘ivy-alt-done’)
-......................
-
- On a directory, restarts completion from that directory.
-
- On a file or ‘./’, exit completion with the selected candidate.
-
-‘DEL’ (‘ivy-backward-delete-char’)
-..................................
-
- Restart the completion in the parent directory if current input is
- empty.
-
-‘//’ (‘self-insert-command’)
-............................
-
- Switch to the root directory.
-
-‘~’ (‘self-insert-command’)
-...........................
-
- Switch to the home directory.
-
-‘/’ (‘self-insert-command’)
-...........................
-
- If the current input matches an existing directory name exactly,
- switch the completion to that directory.
-
-‘C-M-y’ (‘ivy-insert-current-full’)
-...................................
-
- Insert the current full path, in case you want to edit a part of
- it.
-
-‘M-r’ (‘ivy-toggle-regexp-quote’)
-.................................
-
- Toggle between input as regexp or not.
-
- Switch to matching literally since file names include ‘.’, which is
- for matching any char in regexp mode.
- -- User Option: ivy-extra-directories
- Decide if you want to see ‘../’ and ‘./’ during file name
- completion.
-
- Reason to remove: ‘../’ is the same as ‘DEL’.
-
- Reason not to remove: navigate anywhere with only ‘C-n’, ‘C-p’ and
- ‘C-j’.
-
- Likewise, ‘./’ can be removed.
-
-History
-.......
-
- File history works the same with ‘M-p’, ‘M-n’, and ‘C-r’, but uses
- a custom code for file name completion that cycles through files
- previously opened. It also works with TRAMP files.
-
-* Menu:
-
-* Using TRAMP::
-
-
-File: ivy.info, Node: Using TRAMP, Up: File Name Completion
-
-7.1.1 Using TRAMP
------------------
-
-‘~’ (tilde)
-...........
-
- Move to the home directory. Either the local or the remote one,
- depending on the current directory. The boolean option
- ‘ivy-magic-tilde’ decides whether the binding to do this is ‘~’ or
- ‘~/’.
-
-‘//’ (double slash)
-...................
-
- Move to the root directory. Either the local or the remote one,
- depending on the current directory. Here, you can also select a
- TRAMP connection method, such as ‘ssh’ or ‘scpx’.
-
-‘/ C-j’
-.......
-
- Move the the local root directory.
-
-‘~~’
-....
-
- Move to the local home directory.
-
- From any directory, with the empty input, inputting ‘/ssh:’ and
-pressing ‘C-j’ (or ‘RET’, which is the same thing) completes for host
-and user names.
-
- For ‘/ssh:user@’ input, completes the domain name.
-
- ‘C-i’ works in a similar way to the default completion.
-
- You can also get sudo access for the current directory by inputting
-‘/sudo::’ ‘RET’. Using ‘/sudo:’ (i.e. single colon instead of double)
-will result in a completion session for the desired user.
-
- Multi-hopping is possible, although a bit complex.
-
-Example : connect to a remote host ‘cloud’ and open a file with ‘sudo’ there
-............................................................................
-
- • ‘C-x C-f’ ‘/ssh:cloud|sudo:root:/’.
-
-
-File: ivy.info, Node: Buffer Name Completion, Next: Counsel commands, Prev: File Name Completion, Up: Commands
-
-7.2 Buffer Name Completion
-==========================
-
- -- User Option: ivy-use-virtual-buffers
- When non-nil, add ‘recentf-mode’ and bookmarks to
- ‘ivy-switch-buffer’ completion candidates.
-
- Adding this to Emacs init file:
-
- (setq ivy-use-virtual-buffers t)
- will add additional virtual buffers to the buffers list for recent
- files. Selecting such virtual buffers, which are highlighted with
- ‘ivy-virtual’ face, will open the corresponding file.
-
-
-File: ivy.info, Node: Counsel commands, Prev: Buffer Name Completion, Up: Commands
-
-7.3 Counsel commands
-====================
-
-The main advantages of ‘counsel-’ functions over their basic equivalents
-in ‘ivy-mode’ are:
-
- 1. Multi-actions and non-exiting actions work.
- 2. ‘ivy-resume’ can resume the last completion session.
- 3. Customize ‘ivy-set-actions’, ‘ivy-re-builders-alist’.
- 4. Customize individual keymaps, such as ‘counsel-describe-map’,
- ‘counsel-git-grep-map’, or ‘counsel-find-file-map’, instead of
- customizing ‘ivy-minibuffer-map’ that applies to all completion
- sessions.
-
-
-File: ivy.info, Node: API, Next: Variable Index, Prev: Commands, Up: Top
-
-8 API
-*****
-
-The main (and only) entry point is the ‘ivy-read’ function. It takes
-two required arguments and many optional arguments that can be passed by
-a key. The optional ‘:action’ argument is highly recommended for
-features such as multi-actions, non-exiting actions, ‘ivy-occur’ and
-‘ivy-resume’.
-
-* Menu:
-
-* Required arguments for ivy-read::
-* Optional arguments for ivy-read::
-* Example - counsel-describe-function::
-* Example - counsel-locate::
-* Example - ivy-read-with-extra-properties::
-
-
-File: ivy.info, Node: Required arguments for ivy-read, Next: Optional arguments for ivy-read, Up: API
-
-8.1 Required arguments for ‘ivy-read’
-=====================================
-
-‘prompt’
-........
-
- A prompt string normally ending in a colon and a space.
- ‘ivy-count-format’ is prepended to it during completion.
-
-‘collection’
-............
-
- Either a list of strings, a function, an alist or a hash table.
-
- If a function, then it has to be compatible with ‘all-completions’.
-
-
-File: ivy.info, Node: Optional arguments for ivy-read, Next: Example - counsel-describe-function, Prev: Required arguments for ivy-read, Up: API
-
-8.2 Optional arguments for ‘ivy-read’
-=====================================
-
-‘predicate’
-...........
-
- Is a function to filter the initial collection. It has to be
- compatible with ‘all-completions’. Tip: most of the time, it’s
- simpler to just apply this filter to the ‘collection’ argument
- itself, e.g. ‘(cl-remove-if-not predicate collection)’.
-
-‘require-match’
-...............
-
- When set to a non-nil value, input must match one of the
- candidates. Custom input is not accepted.
-
-‘initial-input’
-...............
-
- This string argument is included for compatibility with
- ‘completing-read’, which inserts it into the minibuffer.
-
- It’s recommended to use the ‘preselect’ argument instead of this.
-
-‘history’
-.........
-
- Name of the symbol to store history. See ‘completing-read’.
-
-‘preselect’
-...........
-
- Determines which one of the candidates to initially select.
-
- When set to an integer value, select the candidate with that index
- value.
-
- When set to any other non-nil value, select the first candidate
- matching this value. Comparison is first done with ‘equal’. If
- this fails, and when applicable, match ‘preselect’ as a regular
- expression.
-
- Every time the input becomes empty, the item corresponding to
- ‘preselect’ is selected.
-
-‘keymap’
-........
-
- A keymap to be composed with ‘ivy-minibuffer-map’. This keymap has
- priority over ‘ivy-minibuffer-map’ and can be modified at any later
- stage.
-
-‘update-fn’
-...........
-
- Is the function called each time the current candidate changes.
- This function takes no arguments and is called in the minibuffer’s
- ‘post-command-hook’. See ‘swiper’ for an example usage.
-
-‘sort’
-......
-
- When non-nil, use ‘ivy-sort-functions-alist’ to sort the collection
- as long as the collection is not larger than ‘ivy-sort-max-size’.
-
-‘action’
-........
-
- Is the function to call after selection. It takes a string
- argument.
-
-‘unwind’
-........
-
- Is the function to call before exiting completion. It takes no
- arguments. This function is called even if the completion is
- interrupted with ‘C-g’. See ‘swiper’ for an example usage.
-
-‘re-builder’
-............
-
- Is a function that takes a string and returns a valid regex. See
- ‘Completion Styles’ for details.
-
-‘matcher’
-.........
-
- Is a function that takes a regex string and a list of strings and
- returns a list of strings matching the regex. Any ordinary Emacs
- matching function will suffice, yet finely tuned matching functions
- can be used. See ‘counsel-find-file’ for an example usage.
-
-‘dynamic-collection’
-....................
-
- When non-nil, ‘collection’ will be used to dynamically generate the
- candidates each time the input changes, instead of being used once
- statically with ‘all-completions’ to generate a list of strings.
- See ‘counsel-locate’ for an example usage.
-
-‘caller’
-........
-
- Is a symbol that uniquely identifies the function that called
- ‘ivy-read’, which may be useful for further customizations.
-
-
-File: ivy.info, Node: Example - counsel-describe-function, Next: Example - counsel-locate, Prev: Optional arguments for ivy-read, Up: API
-
-8.3 Example - ‘counsel-describe-function’
-=========================================
-
-This is a typical example of a function with a non-async collection,
-which is a collection where all the strings in the collection are known
-prior to any input from the user.
-
- Only the first two arguments (along with ‘action’) are essential -
-the rest of the arguments are for fine-tuning, and could be omitted.
-
- The ‘action’ argument could also be omitted - but then ‘ivy-read’
-would do nothing except returning the string result, which you could
-later use yourself. However, it’s recommended that you use the ‘action’
-argument.
-
- (defun counsel-describe-function ()
- "Forward to `describe-function'."
- (interactive)
- (ivy-read "Describe function: "
- (let (cands)
- (mapatoms
- (lambda (x)
- (when (fboundp x)
- (push (symbol-name x) cands))))
- cands)
- :keymap counsel-describe-map
- :preselect (ivy-thing-at-point)
- :history 'counsel-describe-symbol-history
- :require-match t
- :action (lambda (x)
- (describe-function
- (intern x)))
- :caller 'counsel-describe-function))
-
- Here are the interesting features of the above function, in the order
-that they appear:
-
- • The ‘prompt’ argument is a simple string ending in ": ".
- • The ‘collection’ argument evaluates to a (large) list of strings.
- • The ‘keymap’ argument is for a custom keymap to supplement
- ‘ivy-minibuffer-map’.
- • The ‘preselect’ is provided by ‘ivy-thing-at-point’, which returns
- a symbol near the point. Ivy then selects the first candidate from
- the collection that matches this symbol. To select this
- pre-selected candidate, a ‘RET’ will suffice. No further user
- input is necessary.
- • The ‘history’ argument is for keeping the history of this command
- separate from the common history in ‘ivy-history’.
- • The ‘require-match’ is set to ‘t’ since it doesn’t make sense to
- call ‘describe-function’ on an un-interned symbol.
- • The ‘action’ argument calls ‘describe-function’ on the interned
- selected candidate.
- • The ‘caller’ argument identifies this completion session. This is
- important, since with the collection being a list of strings and
- not a function name, the only other way for ‘ivy-read’ to identify
- "who’s calling" and to apply the appropriate customizations is to
- examine ‘this-command’. But ‘this-command’ would be modified if
- another command called ‘counsel-describe-function’.
-
-
-File: ivy.info, Node: Example - counsel-locate, Next: Example - ivy-read-with-extra-properties, Prev: Example - counsel-describe-function, Up: API
-
-8.4 Example - ‘counsel-locate’
-==============================
-
-This is a typical example of a function with an async collection. Since
-the collection function cannot pre-compute all the locatable files in
-memory within reasonable limits (time or memory), it relies on user
-input to filter the universe of possible candidates to a manageable size
-while also continuing to search asynchronously for possible candidates.
-Both the filtering and searching continues with each character change of
-the input with rapid updates to the collection presented without idle
-waiting times. This live update will continue as long as there are
-likely candidates. Eventually updates to the minibuffer will stop after
-user input, filtering, and searching have exhausted looking for possible
-candidates.
-
- Async collections suit long-running shell commands, such as ‘locate’.
-With each new input, a new process starts while the old process is
-killed. The collection is refreshed anew with each new process.
-Meanwhile the user can provide more input characters (for further
-narrowing) or select a candidate from the visible collection.
-
- (defun counsel-locate-function (str)
- (or
- (ivy-more-chars)
- (progn
- (counsel--async-command
- (format "locate %s '%s'"
- (mapconcat #'identity counsel-locate-options " ")
- (counsel--elisp-to-pcre
- (ivy--regex str))))
- '("" "working..."))))
-
- ;;;###autoload
- (defun counsel-locate (&optional initial-input)
- "Call the \"locate\" shell command.
- INITIAL-INPUT can be given as the initial minibuffer input."
- (interactive)
- (ivy-read "Locate: " #'counsel-locate-function
- :initial-input initial-input
- :dynamic-collection t
- :history 'counsel-locate-history
- :action (lambda (file)
- (with-ivy-window
- (when file
- (find-file file))))
- :unwind #'counsel-delete-process
- :caller 'counsel-locate))
-
- Here are the interesting features of the above functions, in the
-order that they appear:
-
- • ‘counsel-locate-function’ takes a string argument and returns a
- list of strings. Note that it’s not compatible with
- ‘all-completions’, but since we’re not using that here, might as
- well use one argument instead of three.
- • ‘ivy-more-chars’ is a simple function that returns e.g. ‘'("2
- chars more")’ asking the user for more input.
- • ‘counsel--async-command’ is a very easy API simplification that
- takes a single string argument suitable for
- ‘shell-command-to-string’. So you could prototype your function as
- non-async using ‘shell-command-to-string’ and ‘split-string’ to
- produce a collection, then decide that you want async and simply
- swap in ‘counsel--async-command’.
- • ‘counsel-locate’ is an interactive function with an optional
- ‘initial-input’.
- • ‘#'counsel-locate-function’ is passed as the ‘collection’ argument.
- • ‘dynamic-collection’ is set to t, since this is an async
- collection.
- • ‘action’ argument uses ‘with-ivy-window’ wrapper, since we want to
- open the selected file in the same window from which
- ‘counsel-locate’ was called.
- • ‘unwind’ argument is set to ‘#'counsel-delete-process’: when we
- press ‘C-g’ we want to kill the running process created by
- ‘counsel--async-command’.
- • ‘caller’ argument identifies this command for easier customization.
-
-
-File: ivy.info, Node: Example - ivy-read-with-extra-properties, Prev: Example - counsel-locate, Up: API
-
-8.5 Example - ‘ivy-read-with-extra-properties’
-==============================================
-
-This is another example to show how to associate additional values to
-each displayed strings.
-
- (defun find-candidates-function (str pred _)
- (let ((props '(1 2))
- (strs '("foo" "foo2")))
- (cl-mapcar (lambda (s p) (propertize s 'property p))
- strs
- props)))
-
- (defun find-candidates ()
- (interactive)
- (ivy-read "Find symbols: "
- #'find-candidates-function
- :action (lambda (x)
- (message "Value: %s" (get-text-property 0 'property x)
- ))))
-
- Here are the interesting features of the above function:
-
- • ‘find-candidates-function’ builds up a list of strings and
- associates "foo" with the value 1 and "foo2" with 2.
- • ‘find-candidates’ is an interactive function.
- • ‘#'find-candidates’ is passed as the ‘collection’ argument.
- • ‘action’ gets passed the selected string with the associated value.
- It then retrieves that value and displays it.
-
-
-File: ivy.info, Node: Variable Index, Next: Keystroke Index, Prev: API, Up: Top
-
-Variable Index
-**************
-
-
-* Menu:
-
-* ivy-alt-done: Key bindings for single selection action then exit minibuffer.
- (line 30)
-* ivy-alt-done <1>: File Name Completion. (line 12)
-* ivy-avy: Key bindings for single selection action then exit minibuffer.
- (line 64)
-* ivy-backward-delete-char: File Name Completion. (line 19)
-* ivy-call: Key bindings for multiple selections and actions keep minibuffer open.
- (line 16)
-* ivy-confirm-face: Faces. (line 34)
-* ivy-count-format: Defcustoms. (line 6)
-* ivy-current-match: Faces. (line 9)
-* ivy-dispatching-call: Key bindings for multiple selections and actions keep minibuffer open.
- (line 26)
-* ivy-dispatching-done: Key bindings for single selection action then exit minibuffer.
- (line 24)
-* ivy-display-style: Defcustoms. (line 24)
-* ivy-done: Key bindings for single selection action then exit minibuffer.
- (line 19)
-* ivy-extra-directories: File Name Completion. (line 51)
-* ivy-height: Key bindings for navigation.
- (line 21)
-* ivy-immediate-done: Key bindings for single selection action then exit minibuffer.
- (line 53)
-* ivy-insert-current: Key bindings that alter the minibuffer input.
- (line 23)
-* ivy-insert-current-full: File Name Completion. (line 41)
-* ivy-kill-ring-save: Other key bindings. (line 9)
-* ivy-match-required-face: Faces. (line 53)
-* ivy-minibuffer-grow: Hydra in the minibuffer.
- (line 45)
-* ivy-minibuffer-map: Minibuffer key bindings.
- (line 6)
-* ivy-minibuffer-match-face-1: Faces. (line 14)
-* ivy-minibuffer-match-face-2: Faces. (line 19)
-* ivy-minibuffer-match-face-3: Faces. (line 24)
-* ivy-minibuffer-match-face-4: Faces. (line 29)
-* ivy-minibuffer-shrink: Hydra in the minibuffer.
- (line 50)
-* ivy-modified-buffer: Faces. (line 88)
-* ivy-modified-outside-buffer: Faces. (line 93)
-* ivy-next-action: Hydra in the minibuffer.
- (line 60)
-* ivy-next-history-element: Key bindings that alter the minibuffer input.
- (line 9)
-* ivy-next-line-and-call: Key bindings for multiple selections and actions keep minibuffer open.
- (line 36)
-* ivy-occur: Saving the current completion session to a buffer.
- (line 9)
-* ivy-occur-click: Saving the current completion session to a buffer.
- (line 21)
-* ivy-occur-dispatch: Saving the current completion session to a buffer.
- (line 41)
-* ivy-occur-press: Saving the current completion session to a buffer.
- (line 16)
-* ivy-occur-read-action: Saving the current completion session to a buffer.
- (line 36)
-* ivy-on-del-error-function: Defcustoms. (line 31)
-* ivy-partial-or-done: Key bindings for single selection action then exit minibuffer.
- (line 37)
-* ivy-prev-action: Hydra in the minibuffer.
- (line 55)
-* ivy-previous-history-element: Key bindings that alter the minibuffer input.
- (line 18)
-* ivy-previous-line-and-call: Key bindings for multiple selections and actions keep minibuffer open.
- (line 47)
-* ivy-read-action: Hydra in the minibuffer.
- (line 65)
-* ivy-remote: Faces. (line 71)
-* ivy-restrict-to-matches: Key bindings that alter the minibuffer input.
- (line 40)
-* ivy-resume: Key bindings for multiple selections and actions keep minibuffer open.
- (line 55)
-* ivy-reverse-i-search: Key bindings that alter the minibuffer input.
- (line 48)
-* ivy-rotate-preferred-builders: Hydra in the minibuffer.
- (line 40)
-* ivy-subdir: Faces. (line 66)
-* ivy-toggle-calling: Hydra in the minibuffer.
- (line 34)
-* ivy-toggle-case-fold: Hydra in the minibuffer.
- (line 70)
-* ivy-toggle-regexp-quote: File Name Completion. (line 47)
-* ivy-use-virtual-buffers: Buffer Name Completion.
- (line 6)
-* ivy-virtual: Faces. (line 76)
-* ivy-wrap: Key bindings for navigation.
- (line 14)
-* ivy-yank-word: Key bindings that alter the minibuffer input.
- (line 32)
-
-
-File: ivy.info, Node: Keystroke Index, Prev: Variable Index, Up: Top
-
-Keystroke Index
-***************
-
-
-* Menu:
-
-* /: File Name Completion. (line 35)
-* / C-j: Using TRAMP. (line 24)
-* //: File Name Completion. (line 25)
-* // <1>: Using TRAMP. (line 17)
-* <: Hydra in the minibuffer.
- (line 50)
-* >: Hydra in the minibuffer.
- (line 45)
-* ~: File Name Completion. (line 30)
-* ~ <1>: Using TRAMP. (line 9)
-* ~~: Using TRAMP. (line 29)
-* a: Hydra in the minibuffer.
- (line 65)
-* a <1>: Saving the current completion session to a buffer.
- (line 36)
-* c: Hydra in the minibuffer.
- (line 34)
-* C: Hydra in the minibuffer.
- (line 70)
-* C-': Key bindings for single selection action then exit minibuffer.
- (line 64)
-* C-c C-o: Saving the current completion session to a buffer.
- (line 9)
-* C-j: Key bindings for single selection action then exit minibuffer.
- (line 30)
-* C-j <1>: File Name Completion. (line 12)
-* C-m: Key bindings for single selection action then exit minibuffer.
- (line 19)
-* C-M-j: Key bindings for single selection action then exit minibuffer.
- (line 53)
-* C-M-m: Key bindings for multiple selections and actions keep minibuffer open.
- (line 16)
-* C-M-n: Key bindings for multiple selections and actions keep minibuffer open.
- (line 36)
-* C-M-o: Key bindings for multiple selections and actions keep minibuffer open.
- (line 26)
-* C-M-p: Key bindings for multiple selections and actions keep minibuffer open.
- (line 47)
-* C-M-y: File Name Completion. (line 41)
-* C-o: Hydra in the minibuffer.
- (line 9)
-* C-r: Key bindings that alter the minibuffer input.
- (line 48)
-* DEL: File Name Completion. (line 19)
-* f: Saving the current completion session to a buffer.
- (line 16)
-* j: Saving the current completion session to a buffer.
- (line 26)
-* k: Saving the current completion session to a buffer.
- (line 31)
-* m: Hydra in the minibuffer.
- (line 40)
-* M-i: Key bindings that alter the minibuffer input.
- (line 23)
-* M-j: Key bindings that alter the minibuffer input.
- (line 32)
-* M-n: Key bindings that alter the minibuffer input.
- (line 9)
-* M-o: Key bindings for single selection action then exit minibuffer.
- (line 24)
-* M-p: Key bindings that alter the minibuffer input.
- (line 18)
-* M-r: File Name Completion. (line 47)
-* M-w: Other key bindings. (line 9)
-* mouse-1: Saving the current completion session to a buffer.
- (line 21)
-* o: Saving the current completion session to a buffer.
- (line 41)
-* q: Saving the current completion session to a buffer.
- (line 46)
-* RET: Key bindings for single selection action then exit minibuffer.
- (line 19)
-* RET <1>: Saving the current completion session to a buffer.
- (line 16)
-* s: Hydra in the minibuffer.
- (line 60)
-* S-SPC: Key bindings that alter the minibuffer input.
- (line 40)
-* TAB: Key bindings for single selection action then exit minibuffer.
- (line 37)
-* w: Hydra in the minibuffer.
- (line 55)
-
-
-
-Tag Table:
-Node: Top1189
-Node: Introduction3100
-Node: Installation5623
-Node: Installing from Emacs Package Manager6073
-Node: Installing from the Git repository7282
-Node: Getting started8102
-Node: Basic customization8409
-Node: Key bindings9004
-Node: Global key bindings9196
-Node: Minibuffer key bindings11670
-Node: Key bindings for navigation12902
-Node: Key bindings for single selection action then exit minibuffer14109
-Node: Key bindings for multiple selections and actions keep minibuffer open16756
-Node: Key bindings that alter the minibuffer input19223
-Node: Other key bindings21168
-Node: Hydra in the minibuffer21546
-Node: Saving the current completion session to a buffer23964
-Node: Completion Styles25376
-Node: ivy--regex-plus27127
-Node: ivy--regex-ignore-order28613
-Node: ivy--regex-fuzzy28981
-Node: Customization29478
-Node: Faces29664
-Node: Defcustoms32093
-Node: Actions33387
-Node: What are actions?33713
-Node: How can different actions be called?34531
-Node: How to modify the actions list?35102
-Node: Example - add two actions to each command35762
-Node: How to undo adding the two actions36721
-Node: How to add actions to a specific command37173
-Node: Example - define a new command with several actions37589
-Node: Test the above function with ivy-occur38477
-Node: Packages39319
-Node: Commands40284
-Node: File Name Completion40469
-Node: Using TRAMP42426
-Node: Buffer Name Completion43928
-Node: Counsel commands44543
-Node: API45190
-Node: Required arguments for ivy-read45788
-Node: Optional arguments for ivy-read46307
-Node: Example - counsel-describe-function49733
-Node: Example - counsel-locate52591
-Node: Example - ivy-read-with-extra-properties56341
-Node: Variable Index57549
-Node: Keystroke Index64669
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/json-mode-20190123.422/json-mode-autoloads.el b/elpa/json-mode-20190123.422/json-mode-autoloads.el
deleted file mode 100644
index 9b1b0ad..0000000
--- a/elpa/json-mode-20190123.422/json-mode-autoloads.el
+++ /dev/null
@@ -1,65 +0,0 @@
-;;; json-mode-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "json-mode" "json-mode.el" (0 0 0 0))
-;;; Generated autoloads from json-mode.el
-
-(defconst json-mode-standard-file-ext '(".json" ".jsonld") "\
-List of JSON file extensions.")
-
-(defsubst json-mode--update-auto-mode (filenames) "\
-Update the `json-mode' entry of `auto-mode-alist'.
-
-FILENAMES should be a list of file as string.
-Return the new `auto-mode-alist' entry" (let* ((new-regexp (rx-to-string (\` (seq (eval (cons (quote or) (append json-mode-standard-file-ext (quote (\, filenames))))) eot)))) (new-entry (cons new-regexp (quote json-mode))) (old-entry (when (boundp (quote json-mode--auto-mode-entry)) json-mode--auto-mode-entry))) (setq auto-mode-alist (delete old-entry auto-mode-alist)) (add-to-list (quote auto-mode-alist) new-entry) new-entry))
-
-(defvar json-mode-auto-mode-list '(".babelrc" ".bowerrc" "composer.lock") "\
-List of filename as string to pass for the JSON entry of
-`auto-mode-alist'.
-
-Note however that custom `json-mode' entries in `auto-mode-alist'
-won’t be affected.")
-
-(custom-autoload 'json-mode-auto-mode-list "json-mode" nil)
-
-(defvar json-mode--auto-mode-entry (json-mode--update-auto-mode json-mode-auto-mode-list) "\
-Regexp generated from the `json-mode-auto-mode-list'.")
-
-(autoload 'json-mode "json-mode" "\
-Major mode for editing JSON files
-
-\(fn)" t nil)
-
-(add-to-list 'magic-fallback-mode-alist '("^[{[]$" . json-mode))
-
-(autoload 'json-mode-show-path "json-mode" "\
-Print the path to the node at point to the minibuffer, and yank to the kill ring.
-
-\(fn)" t nil)
-
-(autoload 'json-mode-kill-path "json-mode" "\
-
-
-\(fn)" t nil)
-
-(autoload 'json-mode-beautify "json-mode" "\
-Beautify / pretty-print the active region (or the entire buffer if no active region).
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "json-mode" '("json-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; json-mode-autoloads.el ends here
diff --git a/elpa/json-mode-20190123.422/json-mode-pkg.el b/elpa/json-mode-20190123.422/json-mode-pkg.el
deleted file mode 100644
index 5dab679..0000000
--- a/elpa/json-mode-20190123.422/json-mode-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "json-mode" "20190123.422" "Major mode for editing JSON files." '((json-reformat "0.0.5") (json-snatcher "1.0.0")) :commit "0e819e519ae17a2686e0881c4ca51fa873fa9b83" :authors '(("Josh Johnston")) :maintainer '("Josh Johnston") :url "https://github.com/joshwnj/json-mode")
diff --git a/elpa/json-mode-20190123.422/json-mode.el b/elpa/json-mode-20190123.422/json-mode.el
deleted file mode 100644
index adf8798..0000000
--- a/elpa/json-mode-20190123.422/json-mode.el
+++ /dev/null
@@ -1,224 +0,0 @@
-;;; json-mode.el --- Major mode for editing JSON files.
-
-;; Copyright (C) 2011-2014 Josh Johnston
-
-;; Author: Josh Johnston
-;; URL: https://github.com/joshwnj/json-mode
-;; Package-Version: 20190123.422
-;; Package-Commit: 0e819e519ae17a2686e0881c4ca51fa873fa9b83
-;; Version: 1.6.0
-;; Package-Requires: ((json-reformat "0.0.5") (json-snatcher "1.0.0"))
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; extend the builtin js-mode's syntax highlighting
-
-;;; Code:
-
-(require 'js)
-(require 'rx)
-(require 'json-snatcher)
-(require 'json-reformat)
-
-(defgroup json-mode '()
- "Major mode for editing JSON files."
- :group 'js)
-
-;;;###autoload
-(defconst json-mode-standard-file-ext '(".json" ".jsonld")
- "List of JSON file extensions.")
-
-;; This is to be sure the customization is loaded. Otherwise,
-;; autoload discards any defun or defcustom.
-;;;###autoload
-(defsubst json-mode--update-auto-mode (filenames)
- "Update the `json-mode' entry of `auto-mode-alist'.
-
-FILENAMES should be a list of file as string.
-Return the new `auto-mode-alist' entry"
- (let* ((new-regexp
- (rx-to-string
- `(seq (eval
- (cons 'or
- (append json-mode-standard-file-ext
- ',filenames))) eot)))
- (new-entry (cons new-regexp 'json-mode))
- (old-entry (when (boundp 'json-mode--auto-mode-entry)
- json-mode--auto-mode-entry)))
- (setq auto-mode-alist (delete old-entry auto-mode-alist))
- (add-to-list 'auto-mode-alist new-entry)
- new-entry))
-
-;;;###autoload
-(defcustom json-mode-auto-mode-list '(
- ".babelrc"
- ".bowerrc"
- "composer.lock"
- )
- "List of filename as string to pass for the JSON entry of
-`auto-mode-alist'.
-
-Note however that custom `json-mode' entries in `auto-mode-alist'
-won’t be affected."
- :group 'json-mode
- :type '(repeat string)
- :set (lambda (symbol value)
- "Update SYMBOL with a new regexp made from VALUE.
-
-This function calls `json-mode--update-auto-mode' to change the
-`json-mode--auto-mode-entry' entry in `auto-mode-alist'."
- (set-default symbol value)
- (setq json-mode--auto-mode-entry (json-mode--update-auto-mode value))))
-
-;; Autoload needed to initalize the the `auto-list-mode' entry.
-;;;###autoload
-(defvar json-mode--auto-mode-entry (json-mode--update-auto-mode json-mode-auto-mode-list)
- "Regexp generated from the `json-mode-auto-mode-list'.")
-
-(defconst json-mode-quoted-string-re
- (rx (group (char ?\")
- (zero-or-more (or (seq ?\\ ?\\)
- (seq ?\\ ?\")
- (seq ?\\ (not (any ?\" ?\\)))
- (not (any ?\" ?\\))))
- (char ?\"))))
-(defconst json-mode-quoted-key-re
- (rx (group (char ?\")
- (zero-or-more (or (seq ?\\ ?\\)
- (seq ?\\ ?\")
- (seq ?\\ (not (any ?\" ?\\)))
- (not (any ?\" ?\\))))
- (char ?\"))
- (zero-or-more blank)
- ?\:))
-(defconst json-mode-number-re (rx (group (one-or-more digit)
- (optional ?\. (one-or-more digit)))))
-(defconst json-mode-keyword-re (rx (group (or "true" "false" "null"))))
-
-(defconst json-font-lock-keywords-1
- (list
- (list json-mode-quoted-key-re 1 font-lock-keyword-face)
- (list json-mode-quoted-string-re 1 font-lock-string-face)
- (list json-mode-keyword-re 1 font-lock-constant-face)
- (list json-mode-number-re 1 font-lock-constant-face)
- )
- "Level one font lock.")
-
-;;;###autoload
-(define-derived-mode json-mode javascript-mode "JSON"
- "Major mode for editing JSON files"
- (set (make-local-variable 'font-lock-defaults) '(json-font-lock-keywords-1 t)))
-
-;; Well formatted JSON files almost always begin with “{” or “[”.
-;;;###autoload
-(add-to-list 'magic-fallback-mode-alist '("^[{[]$" . json-mode))
-
-;;;###autoload
-(defun json-mode-show-path ()
- "Print the path to the node at point to the minibuffer, and yank to the kill ring."
- (interactive)
- (message (jsons-print-path)))
-
-(define-key json-mode-map (kbd "C-c C-p") 'json-mode-show-path)
-
-;;;###autoload
-(defun json-mode-kill-path ()
- (interactive)
- (kill-new (jsons-print-path)))
-
-(define-key json-mode-map (kbd "C-c P") 'json-mode-kill-path)
-
-;;;###autoload
-(defun json-mode-beautify ()
- "Beautify / pretty-print the active region (or the entire buffer if no active region)."
- (interactive)
- (let ((json-reformat:indent-width js-indent-level)
- (json-reformat:pretty-string? t))
- (if (use-region-p)
- (json-reformat-region (region-beginning) (region-end))
- (json-reformat-region (buffer-end -1) (buffer-end 1)))))
-
-(define-key json-mode-map (kbd "C-c C-f") 'json-mode-beautify)
-
-(defun json-toggle-boolean ()
- "If point is on `true' or `false', toggle it."
- (interactive)
- (unless (nth 8 (syntax-ppss)) ; inside a keyword, string or comment
- (let* ((bounds (bounds-of-thing-at-point 'symbol))
- (string (and bounds (buffer-substring-no-properties (car bounds) (cdr bounds))))
- (pt (point)))
- (when (and bounds (member string '("true" "false")))
- (delete-region (car bounds) (cdr bounds))
- (cond
- ((string= "true" string)
- (insert "false")
- (goto-char (if (= pt (cdr bounds)) (1+ pt) pt)))
- (t
- (insert "true")
- (goto-char (if (= pt (cdr bounds)) (1- pt) pt))))))))
-
-(define-key json-mode-map (kbd "C-c C-t") 'json-toggle-boolean)
-
-(defun json-nullify-sexp ()
- "Replace the sexp at point with `null'."
- (interactive)
- (let ((syntax (syntax-ppss)) symbol)
- (cond
- ((nth 4 syntax) nil) ; inside a comment
- ((nth 3 syntax) ; inside a string
- (goto-char (nth 8 syntax))
- (when (save-excursion (forward-sexp) (skip-chars-forward "[:space:]") (eq (char-after) ?:))
- ;; sexp is an object key, so we nullify the entire object
- (goto-char (nth 1 syntax)))
- (kill-sexp)
- (insert "null"))
- ((setq symbol (bounds-of-thing-at-point 'symbol))
- (cond
- ((looking-at-p "null"))
- ((save-excursion (skip-chars-backward "[0-9.]") (looking-at json-mode-number-re))
- (kill-region (match-beginning 0) (match-end 0))
- (insert "null"))
- (t (kill-region (car symbol) (cdr symbol)) (insert "null"))))
- ((< 0 (nth 0 syntax))
- (goto-char (nth 1 syntax))
- (kill-sexp)
- (insert "null"))
- (t nil))))
-
-(define-key json-mode-map (kbd "C-c C-k") 'json-nullify-sexp)
-
-(defun json-increment-number-at-point (&optional delta)
- "Add DELTA to the number at point; DELTA defaults to 1."
- (interactive)
- (when (save-excursion (skip-chars-backward "[0-9.]") (looking-at json-mode-number-re))
- (let ((num (+ (or delta 1)
- (string-to-number (buffer-substring-no-properties (match-beginning 0) (match-end 0)))))
- (pt (point)))
- (delete-region (match-beginning 0) (match-end 0))
- (insert (number-to-string num))
- (goto-char pt))))
-
-(define-key json-mode-map (kbd "C-c C-i") 'json-increment-number-at-point)
-
-(defun json-decrement-number-at-point ()
- "Decrement the number at point."
- (interactive)
- (json-increment-number-at-point -1))
-
-(define-key json-mode-map (kbd "C-c C-d") 'json-decrement-number-at-point)
-
-(provide 'json-mode)
-;;; json-mode.el ends here
diff --git a/elpa/json-reformat-20160212.853/json-reformat-autoloads.el b/elpa/json-reformat-20160212.853/json-reformat-autoloads.el
deleted file mode 100644
index 6a42b63..0000000
--- a/elpa/json-reformat-20160212.853/json-reformat-autoloads.el
+++ /dev/null
@@ -1,31 +0,0 @@
-;;; json-reformat-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "json-reformat" "json-reformat.el" (0 0 0 0))
-;;; Generated autoloads from json-reformat.el
-
-(autoload 'json-reformat-region "json-reformat" "\
-Reformat the JSON in the specified region.
-
-If you want to customize the reformat style,
-please see the documentation of `json-reformat:indent-width'
-and `json-reformat:pretty-string?'.
-
-\(fn BEGIN END)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "json-reformat" '("json-reformat")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; json-reformat-autoloads.el ends here
diff --git a/elpa/json-reformat-20160212.853/json-reformat-pkg.el b/elpa/json-reformat-20160212.853/json-reformat-pkg.el
deleted file mode 100644
index 60678f5..0000000
--- a/elpa/json-reformat-20160212.853/json-reformat-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "json-reformat" "20160212.853" "Reformatting tool for JSON" 'nil :commit "8eb6668ed447988aea06467ba8f42e1f2178246f" :keywords '("json") :authors '(("Wataru MIYAGUNI" . "gonngo@gmail.com")) :maintainer '("Wataru MIYAGUNI" . "gonngo@gmail.com") :url "https://github.com/gongo/json-reformat")
diff --git a/elpa/json-reformat-20160212.853/json-reformat.el b/elpa/json-reformat-20160212.853/json-reformat.el
deleted file mode 100644
index fdb2328..0000000
--- a/elpa/json-reformat-20160212.853/json-reformat.el
+++ /dev/null
@@ -1,222 +0,0 @@
-;;; json-reformat.el --- Reformatting tool for JSON
-
-;; Author: Wataru MIYAGUNI <gonngo@gmail.com>
-;; URL: https://github.com/gongo/json-reformat
-;; Package-Version: 20160212.853
-;; Package-Commit: 8eb6668ed447988aea06467ba8f42e1f2178246f
-;; Version: 0.0.6
-;; Keywords: json
-
-;; Copyright (c) 2012 Wataru MIYAGUNI
-;;
-;; MIT License
-;;
-;; Permission is hereby granted, free of charge, to any person obtaining
-;; a copy of this software and associated documentation files (the
-;; "Software"), to deal in the Software without restriction, including
-;; without limitation the rights to use, copy, modify, merge, publish,
-;; distribute, sublicense, and/or sell copies of the Software, and to
-;; permit persons to whom the Software is furnished to do so, subject to
-;; the following conditions:
-;;
-;; The above copyright notice and this permission notice shall be
-;; included in all copies or substantial portions of the Software.
-;;
-;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-;; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-;;; Commentary:
-
-;; json-reformat.el is a reformatting tool for JSON (http://json.org/).
-;;
-;; ## Usage
-;;
-;; 1. Specify region
-;; 2. Call 'M-x json-reformat-region'
-;;
-;; ## Customize
-;;
-;; - `json-reformat:indent-width'
-;; - `json-reformat:pretty-string?'
-;;
-
-;;; Code:
-
-(require 'json)
-(eval-when-compile (require 'cl))
-
-(unless (require 'subr-x nil t)
- ;; built-in subr-x from 24.4
- (defsubst hash-table-keys (hash-table)
- "Return a list of keys in HASH-TABLE."
- (let ((keys '()))
- (maphash (lambda (k _v) (push k keys)) hash-table)
- keys)))
-
-(put 'json-reformat-error 'error-message "JSON Reformat error")
-(put 'json-reformat-error 'error-conditions '(json-reformat-error error))
-
-(defconst json-reformat:special-chars-as-pretty-string
- '((?\" . ?\")
- (?\\ . ?\\)))
-
-(defcustom json-reformat:indent-width 4
- "How much indentation `json-reformat-region' should do at each level."
- :type 'integer
- :safe #'integerp
- :group 'json-reformat)
-
-(defcustom json-reformat:pretty-string? nil
- "Whether to decode the string.
-
-Example:
-
-{\"name\":\"foobar\",\"nick\":\"foo \\u00e4 bar\",\"description\":\"<pre>\\nbaz\\n</pre>\"}
-
-If nil:
-
- {
- \"name\": \"foobar\",
- \"nick\": \"foo \\u00e4 bar\",
- \"description\": \"<pre>\\nbaz\\n<\\/pre>\"
- }
-
-Else t:
-
- {
- \"name\": \"foobar\",
- \"nick\": \"foo ä bar\",
- \"description\": \"<pre>
- baz
- </pre>\"
- }"
- :type 'boolean
- :safe #'booleanp
- :group 'json-reformat)
-
-(defun json-reformat:indent (level)
- (make-string (* level json-reformat:indent-width) ? ))
-
-(defun json-reformat:number-to-string (val)
- (number-to-string val))
-
-(defun json-reformat:symbol-to-string (val)
- (cond ((equal 't val) "true")
- ((equal json-false val) "false")
- (t (symbol-name val))))
-
-(defun json-reformat:encode-char-as-pretty (char)
- (setq char (encode-char char 'ucs))
- (let ((special-char (car (rassoc char json-reformat:special-chars-as-pretty-string))))
- (if special-char
- (format "\\%c" special-char)
- (format "%c" char))))
-
-(defun json-reformat:string-to-string (val)
- (if json-reformat:pretty-string?
- (format "\"%s\"" (mapconcat 'json-reformat:encode-char-as-pretty val ""))
- (json-encode-string val)))
-
-(defun json-reformat:vector-to-string (val level)
- (if (= (length val) 0) "[]"
- (concat "[\n"
- (mapconcat
- 'identity
- (loop for v across val
- collect (concat
- (json-reformat:indent (1+ level))
- (json-reformat:print-node v (1+ level))
- ))
- (concat ",\n"))
- "\n" (json-reformat:indent level) "]"
- )))
-
-(defun json-reformat:print-node (val level)
- (cond ((hash-table-p val) (json-reformat:tree-to-string (json-reformat:tree-sibling-to-plist val) level))
- ((numberp val) (json-reformat:number-to-string val))
- ((vectorp val) (json-reformat:vector-to-string val level))
- ((null val) "null")
- ((symbolp val) (json-reformat:symbol-to-string val))
- (t (json-reformat:string-to-string val))))
-
-(defun json-reformat:tree-sibling-to-plist (root)
- (let (pl)
- (dolist (key (reverse (hash-table-keys root)) pl)
- (setq pl (plist-put pl key (gethash key root))))))
-
-(defun json-reformat:tree-to-string (root level)
- (concat "{\n"
- (let (key val str)
- (while root
- (setq key (car root)
- val (cadr root)
- root (cddr root))
- (setq str
- (concat str (json-reformat:indent (1+ level))
- "\"" key "\""
- ": "
- (json-reformat:print-node val (1+ level))
- (when root ",")
- "\n"
- )))
- str)
- (json-reformat:indent level)
- "}"))
-
-(defun json-reformat-from-string (string)
- (with-temp-buffer
- (insert string)
- (goto-char (point-min))
- (condition-case errvar
- (let ((json-key-type 'string)
- (json-object-type 'hash-table)
- json-tree)
- (setq json-tree (json-read))
- (json-reformat:print-node json-tree 0))
- (json-error
- (signal 'json-reformat-error
- (list (error-message-string errvar)
- (line-number-at-pos (point))
- (point)))))))
-
-;;;###autoload
-(defun json-reformat-region (begin end)
- "Reformat the JSON in the specified region.
-
-If you want to customize the reformat style,
-please see the documentation of `json-reformat:indent-width'
-and `json-reformat:pretty-string?'."
- (interactive "*r")
- (let ((start-line (line-number-at-pos begin))
- (start-pos begin))
- (save-excursion
- (save-restriction
- (narrow-to-region begin end)
- (goto-char (point-min))
- (let (reformatted)
- (condition-case errvar
- (progn
- (setq reformatted
- (json-reformat-from-string
- (buffer-substring-no-properties (point-min) (point-max))))
- (delete-region (point-min) (point-max))
- (insert reformatted))
- (json-reformat-error
- (let ((reason (nth 1 errvar))
- (line (nth 2 errvar))
- (position (nth 3 errvar)))
- (message
- "JSON parse error [Reason] %s [Position] In buffer, line %d (char %d)"
- reason
- (+ start-line line -1)
- (+ start-pos position -1))))))))))
-
-(provide 'json-reformat)
-
-;;; json-reformat.el ends here
diff --git a/elpa/json-snatcher-20150512.347/json-snatcher-autoloads.el b/elpa/json-snatcher-20150512.347/json-snatcher-autoloads.el
deleted file mode 100644
index a88092d..0000000
--- a/elpa/json-snatcher-20150512.347/json-snatcher-autoloads.el
+++ /dev/null
@@ -1,27 +0,0 @@
-;;; json-snatcher-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "json-snatcher" "json-snatcher.el" (0 0 0 0))
-;;; Generated autoloads from json-snatcher.el
-
-(autoload 'jsons-print-path "json-snatcher" "\
-Print the path to the JSON value under point, and save it in the kill ring.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "json-snatcher" '("jsons-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; json-snatcher-autoloads.el ends here
diff --git a/elpa/json-snatcher-20150512.347/json-snatcher-pkg.el b/elpa/json-snatcher-20150512.347/json-snatcher-pkg.el
deleted file mode 100644
index 1500f80..0000000
--- a/elpa/json-snatcher-20150512.347/json-snatcher-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "json-snatcher" "20150512.347" "Grabs the path to JSON values in a JSON file" '((emacs "24")) :commit "c4cecc0a5051bd364373aa499c47a1bb7a5ac51c" :authors '(("Sterling Graham" . "sterlingrgraham@gmail.com")) :maintainer '("Sterling Graham" . "sterlingrgraham@gmail.com") :url "http://github.com/sterlingg/json-snatcher")
diff --git a/elpa/json-snatcher-20150512.347/json-snatcher.el b/elpa/json-snatcher-20150512.347/json-snatcher.el
deleted file mode 100644
index 20f1595..0000000
--- a/elpa/json-snatcher-20150512.347/json-snatcher.el
+++ /dev/null
@@ -1,352 +0,0 @@
-;;; json-snatcher.el --- Grabs the path to JSON values in a JSON file -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013 Sterling Graham <sterlingrgraham@gmail.com>
-
-;; Author: Sterling Graham <sterlingrgraham@gmail.com>
-;; URL: http://github.com/sterlingg/json-snatcher
-;; Package-Version: 20150512.347
-;; Package-Commit: c4cecc0a5051bd364373aa499c47a1bb7a5ac51c
-;; Version: 1.0
-;; Package-Requires: ((emacs "24"))
-
-;; This file is not part of GNU Emacs.
-
-;;; Commentary:
-;;
-;; Well this was my first excursion into ELisp programmming. It didn't go too badly once
-;; I fiddled around with a bunch of the functions.
-;;
-;; The process of getting the path to a JSON value at point starts with
-;; a call to the jsons-print-path function.
-;;
-;; It works by parsing the current buffer into a list of parse tree nodes
-;; if the buffer hasn't already been parsed in the current Emacs session.
-;; While parsing, the region occupied by the node is recorded into the
-;; jsons-parsed-regions hash table as a list.The list contains the location
-;; of the first character occupied by the node, the location of the last
-;; character occupied, and the path to the node. The parse tree is also stored
-;; in the jsons-parsed list for possible future use.
-;;
-;; Once the buffer has been parsed, the node at point is looked up in the
-;; jsons-curr-region list, which is the list of regions described in the
-;; previous paragraph for the current buffer. If point is not in one of these
-;; interval ranges nil is returned, otherwise the path to the value is returned
-;; in the form [<key-string>] for objects, and [<loc-int>] for arrays.
-;; eg: ['value1'][0]['value2'] gets the array at with name value1, then gets the
-;; 0th element of the array (another object), then gets the value at 'value2'.
-;;
-
-;;; Installation:
-;;
-;; IMPORTANT: Works ONLY in Emacs 24 due to the use of the lexical-binding variable.
-;;
-;; To install add the json-snatcher.el file to your load-path, and
-;; add the following lines to your .emacs file:
-;;(require 'json-snatcher)
-;; (defun js-mode-bindings ()
-;; "Sets a hotkey for using the json-snatcher plugin."
-;; (when (string-match "\\.json$" (buffer-name))
-;; (local-set-key (kbd "C-c C-g") 'jsons-print-path)))
-;; (add-hook 'js-mode-hook 'js-mode-bindings)
-;; (add-hook 'js2-mode-hook 'js-mode-bindings)
-;;
-;; This binds the key to snatch the path to the JSON value to C-c C-g only
-;; when either JS mode, or JS2 mode is active on a buffer ending with
-;; the .json extension.
-
-;;; License:
-
-;; This program is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License
-;; as published by the Free Software Foundation; either version 3
-;; of the License, or (at your option) any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Code:
-
-
-(defvar jsons-curr-token 0
- "The current character in the buffer being parsed.")
-(defvar jsons-parsed (make-hash-table :test 'equal)
- "Hashes each open buffer to the parse tree for that buffer.")
-(defvar jsons-parsed-regions (make-hash-table :test 'equal)
- "Hashes each open buffer to the ranges in the buffer for each of the parse trees nodes.")
-(defvar jsons-curr-region () "The node ranges in the current buffer.")
-(defvar jsons-path-printer 'jsons-print-path-python "Default jsons path printer")
-(add-hook 'kill-buffer-hook 'jsons-remove-buffer)
-
-(defun jsons-consume-token ()
- "Return the next token in the stream."
- (goto-char jsons-curr-token)
- (let* ((delim_regex "\\([\][\\{\\}:,]\\)")
- ;; TODO: Improve this regex. Although now it SEEMS to be working, and can be
- ;; used to validate escapes if needed later. The second half of the string regex is pretty
- ;; pointless at the moment. I did it this way, so that the code closely mirrors
- ;; the RFC.
- (string_regex "\\(\"\\(\\([^\"\\\\\r\s\t\n]\\)*\\([\r\s\t\n]\\)*\\|\\(\\(\\\\\\\\\\)*\\\\\\(\\([^\r\s\t\n]\\|\\(u[0-9A-Fa-f]\\{4\\}\\)\\)\\)\\)\\)+\"\\)")
- (num_regex "\\(-?\\(0\\|\\([1-9][[:digit:]]*\\)\\)\\(\\.[[:digit:]]+\\)?\\([eE][-+]?[[:digit:]]+\\)?\\)")
- (literal_regex "\\(true\\|false\\|null\\)")
- (full_regex (concat "\\(" delim_regex "\\|" literal_regex "\\|" string_regex "\\|" num_regex "\\)")))
-
- (if (re-search-forward full_regex (point-max) "Not nil")
- (progn
- (setq jsons-curr-token (match-end 0))
- (buffer-substring-no-properties (match-beginning 0) (match-end 0)))
- (message "Reached EOF. Possibly invalid JSON."))))
-
-(defun jsons-array (path)
- "Create a new json array object that contain the identifier \"json-array\".
-a list of the elements contained in the array, and the PATH to the array."
- (let*(
- (token (jsons-consume-token))
- (array "json-array")
- (elements ())
- (i 0))
- (while (not (string= token "]"))
- (if (not (string= token ","))
- (let ((json-val (jsons-value token path i)))
- (setq i (+ i 1))
- (push json-val elements)
- (setq token (jsons-consume-token)))
- (setq token (jsons-consume-token))))
- (list array (reverse elements) path)))
-
-(defun jsons-literal (token path)
- "Given a TOKEN and PATH, this function return the PATH to the literal."
- (let ((match_start (match-beginning 0))
- (match_end (match-end 0)))
- (progn
- (setq jsons-curr-region (append (list (list match_start match_end path)) jsons-curr-region))
- (list "json-literal" token path (list match_start match_end)))))
-
-(defun jsons-member (token path)
- "This function is called when a member in a JSON object needs to be parsed.
-Given the current TOKEN, and the PATH to this member."
- (let* ((member ())
- (value token)
- (range_start (match-beginning 0))
- (range_end (match-end 0))
- )
- (setq member (list "json-member" token))
- (if (not (string= (jsons-consume-token) ":"))
- (error "Encountered token other than : in jsons-member")
- nil)
- (let ((json-val (jsons-value (jsons-consume-token) (cons value path) nil)))
- (setq member (list member (append json-val
- (list range_start range_end))))
- (setq jsons-curr-region (append (list (list range_start range_end (elt json-val 2))) jsons-curr-region))
- member)))
-
-(defun jsons-number (token path)
- "This function will return a json-number given by the current TOKEN.
-PATH points to the path to this number. A json-number is defined as per
-the num_regex in the `jsons-get-tokens' function."
- (progn
- (setq jsons-curr-region (append (list (list (match-beginning 0) (match-end 0) path)) jsons-curr-region))
- (list "json-number" token path)))
-
-(defun jsons-object (path)
- "This function is called when a { is encountered while parsing.
-PATH is the path in the tree to this object."
- (let*(
- (token (jsons-consume-token))
- (members (make-hash-table :test 'equal))
- (object (list "json-object" members path)))
- (while (not (string= token "}"))
- (if (not (string= token ","))
- (let ((json-mem (jsons-member token path)))
- (puthash (elt (elt json-mem 0) 1) (elt json-mem 1) (elt object 1))
- (setq token (jsons-consume-token)))
- (setq token (jsons-consume-token))))
- object))
-
-(defun jsons-string (token path)
- "This function is called when a string is encountered while parsing.
-The TOKEN is the current token being examined.
-The PATH is the path to this string."
-(let ((match_start (match-beginning 0))
- (match_end (match-end 0)))
- (progn
- (setq jsons-curr-region (append (list (list match_start match_end path)) jsons-curr-region))
- (list "json-string" token path (list match_start match_end)))))
-
-(defun jsons-value (token path array-index)
- "A value, which is either an object, array, string, number, or literal.
-The is-array variable is nil if inside an array, or the index in
-the array that it occupies.
-TOKEN is the current token being parsed.
-PATH is the path to this value.
-ARRAY-INDEX is non-nil if the value is contained within an array, and
-points to the index of this value in the containing array."
-;;TODO: Refactor the if array-index statement.
- (if array-index
- (if (jsons-is-number token)
- (list "json-value" (jsons-number token (cons array-index path)) (list (match-beginning 0) (match-end 0)))
- (cond
- ((string= token "{") (jsons-object (cons array-index path)))
- ((string= token "[") (jsons-array (cons array-index path)))
- ((string= (substring token 0 1) "\"") (jsons-string token (cons array-index path)))
- (t (jsons-literal token (cons array-index path)))))
- (if (jsons-is-number token)
- (list "json-value" (jsons-number token path) path (list (match-beginning 0) (match-end 0)))
- (cond
- ((string= token "{") (jsons-object path))
- ((string= token "[") (jsons-array path))
- ((string= (substring token 0 1) "\"") (jsons-string token path))
- (t (jsons-literal token path))))))
-
-
-(defun jsons-get-path ()
- "Function to check whether we can grab the json path from the cursor position in the json file."
- (let ((i 0)
- (node nil))
- (setq jsons-curr-region (gethash (current-buffer) jsons-parsed-regions))
- (when (not (gethash (current-buffer) jsons-parsed))
- (jsons-parse))
- (while (< i (length jsons-curr-region))
- (let*
- ((json_region (elt jsons-curr-region i))
- (min_token (elt json_region 0))
- (max_token (elt json_region 1)))
- (when (and (> (point) min_token) (< (point) max_token))
- (setq node (elt json_region 2))))
- (setq i (+ i 1)))
- node))
-
-(defun jsons-is-number (str)
- "Test to see whether STR is a valid JSON number."
- (progn
- (match-end 0)
- (save-match-data
- (if (string-match "^\\(-?\\(0\\|\\([1-9][[:digit:]]*\\)\\)\\(\\.[[:digit:]]+\\)?\\([eE][-+]?[[:digit:]]+\\)?\\)$" str)
- (progn
- (match-end 0)
- t)
- nil))))
-
-(defun jsons-parse ()
- "Parse the file given in file, return a list of nodes representing the file."
- (save-excursion
- (setq jsons-curr-token 0)
- (setq jsons-curr-region ())
- (if (not (gethash (current-buffer) jsons-parsed))
- (let* ((token (jsons-consume-token))
- (return_val nil))
- (cond
- ((string= token "{") (setq return_val (jsons-object ())))
- ((string= token "[") (setq return_val (jsons-array ())))
- (t nil))
- (puthash (current-buffer) return_val jsons-parsed)
- (puthash (current-buffer) jsons-curr-region jsons-parsed-regions)
- return_val)
- (gethash (current-buffer) jsons-parsed))))
-
-(defun jsons-print-to-buffer (node buffer)
- "Prints the given NODE to the BUFFER specified in buffer argument.
-TODO: Remove extra comma printed after lists of object members, and lists of array members."
- (let ((id (elt node 0)))
- (cond
- ((string= id "json-array")
- (progn
- (jsons-put-string buffer "[")
- (mapc (lambda (x) (progn
- (jsons-print-to-buffer buffer x)
- (jsons-put-string buffer ",") )) (elt node 1))
- (jsons-put-string buffer "]")))
- ((string= id "json-literal")
- (jsons-put-string buffer (elt node 1)))
- ((string= id "json-member")
- (jsons-put-string buffer (elt node 1))
- (jsons-put-string buffer ": ")
- (jsons-print-to-buffer buffer (elt node 2)))
- ((string= id "json-number")
- (jsons-put-string buffer (elt node 1)))
- ((string= id "json-object")
- (progn
- (jsons-put-string buffer "{")
- (maphash (lambda (key value)
- (progn
- (jsons-put-string buffer key)
- (jsons-put-string buffer ":")
- (jsons-print-to-buffer buffer value)
- (jsons-put-string buffer ","))) (elt node 1))
- (jsons-put-string buffer "}")))
- ((string= id "json-string")
- (jsons-put-string buffer (elt node 1)))
- ((string= id "json-value")
- (jsons-print-to-buffer buffer (elt node 1)))
- (t nil))))
-
-(defun jsons-print-path-jq ()
- "Print the jq path to the JSON value under point, and save it in the kill ring."
- (let* ((path (jsons-get-path))
- (i 0)
- (jq_str ".")
- key)
- (setq path (reverse path))
- (while (< i (length path))
- (if (numberp (elt path i))
- (progn
- (setq jq_str (concat jq_str "[" (number-to-string (elt path i)) "]"))
- (setq i (+ i 1)))
- (progn
- (setq key (elt path i))
- (setq jq_str (concat jq_str (substring key 1 (- (length key) 1))))
- (setq i (+ i 1))))
- (when (elt path i)
- (unless (numberp (elt path i))
- (setq jq_str (concat jq_str ".")))))
- (progn (kill-new jq_str)
- (princ jq_str))))
-
-(defun jsons-print-path-python ()
- "Print the python path to the JSON value under point, and save it in the kill ring."
- (let ((path (jsons-get-path))
- (i 0)
- (python_str ""))
- (setq path (reverse path))
- (while (< i (length path))
- (if (numberp (elt path i))
- (progn
- (setq python_str (concat python_str "[" (number-to-string (elt path i)) "]"))
- (setq i (+ i 1)))
- (progn
- (setq python_str (concat python_str "[" (elt path i) "]"))
- (setq i (+ i 1)))))
- (progn (kill-new python_str)
- (princ python_str))))
-
-;;;###autoload
-(defun jsons-print-path ()
- "Print the path to the JSON value under point, and save it in the kill ring."
- (interactive)
- (funcall jsons-path-printer))
-
-(defun jsons-put-string (buffer str)
- "Append STR to the BUFFER specified in the argument."
- (save-current-buffer
- (set-buffer (get-buffer-create buffer))
- (insert (prin1-to-string str t))))
-
-(defun jsons-remove-buffer ()
- "Used to clean up the token regions, and parse tree used by the parser."
- (progn
- (remhash (current-buffer) jsons-parsed)
- (remhash (current-buffer) jsons-parsed-regions)))
-
-(provide 'json-snatcher)
-
-;; Local-Variables:
-;; indent-tabs-mode: nil
-;; End:
-
-;;; json-snatcher.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/dir b/elpa/ledger-mode-20200530.1710/dir
deleted file mode 100644
index 81102e0..0000000
--- a/elpa/ledger-mode-20200530.1710/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* Ledger Mode: (ledger-mode). Command-Line Accounting
diff --git a/elpa/ledger-mode-20200530.1710/ledger-check.el b/elpa/ledger-mode-20200530.1710/ledger-check.el
deleted file mode 100644
index a0c3305..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-check.el
+++ /dev/null
@@ -1,143 +0,0 @@
-;;; ledger-check.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Craig Earls (enderw88 AT gmail DOT com)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Provide secial mode to correct errors in ledger when running with --strict and --explicit
-;;
-;; Adapted to ledger mode by Craig Earls <enderw88 at gmail dot com>
-
-;;; Code:
-
-(require 'easymenu)
-(require 'ledger-navigate)
-(require 'ledger-report) ; for ledger-master-file
-
-
-(defvar ledger-check-buffer-name "*Ledger Check*")
-(defvar ledger-original-window-cfg nil)
-
-
-
-
-(defvar ledger-check-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [return] 'ledger-report-visit-source)
- (define-key map [?q] 'ledger-check-quit)
- map)
- "Keymap for `ledger-check-mode'.")
-
-(easy-menu-define ledger-check-mode-menu ledger-check-mode-map
- "Ledger check menu"
- '("Check"
- ;; ["Re-run Check" ledger-check-redo]
- "---"
- ["Visit Source" ledger-report-visit-source]
- "---"
- ["Quit" ledger-check-quit]
- ))
-
-(define-derived-mode ledger-check-mode text-mode "Ledger-Check"
- "A mode for viewing ledger errors and warnings.")
-
-
-(defun ledger-do-check ()
- "Run a check command ."
- (goto-char (point-min))
- (let ((data-pos (point))
- (have-warnings nil))
- (shell-command
- ;; ledger balance command will just return empty if you give it
- ;; an account name that doesn't exist. I will assume that no
- ;; one will ever have an account named "e342asd2131". If
- ;; someones does, this will probably still work for them.
- ;; I should only highlight error and warning lines.
- "ledger bal e342asd2131 --strict --explicit "
- t nil)
- (goto-char data-pos)
-
- ;; format check report to make it navigate the file
-
- (while (re-search-forward "^.*: \"\\(.*\\)\", line \\([0-9]+\\)" nil t)
- (let ((file (match-string 1))
- (line (string-to-number (match-string 2))))
- (when file
- (set-text-properties (line-beginning-position) (line-end-position)
- (list 'ledger-source (cons file (save-window-excursion
- (save-excursion
- (find-file file)
- (widen)
- (ledger-navigate-to-line line)
- (point-marker))))))
- (add-text-properties (line-beginning-position) (line-end-position)
- (list 'font-lock-face 'ledger-font-report-clickable-face))
- (setq have-warnings 'true)
- (end-of-line))))
- (if (not have-warnings)
- (insert "No errors or warnings reported."))))
-
-(defun ledger-check-goto ()
- "Goto the ledger check buffer."
- (interactive)
- (let ((rbuf (get-buffer ledger-check-buffer-name)))
- (if (not rbuf)
- (error "There is no ledger check buffer"))
- (pop-to-buffer rbuf)
- (shrink-window-if-larger-than-buffer)))
-
-(defun ledger-check-quit ()
- "Quit the ledger check buffer."
- (interactive)
- (ledger-check-goto)
- (set-window-configuration ledger-original-window-cfg)
- (kill-buffer (get-buffer ledger-check-buffer-name)))
-
-(defun ledger-check-buffer ()
- "Check the current buffer for errors.
-
-Runs ledger with --explicit and --strict report errors and assist
-with fixing them.
-
-The output buffer will be in `ledger-check-mode', which defines
-commands for navigating the buffer to the errors found, etc."
- (interactive
- (progn
- (when (and (buffer-modified-p)
- (y-or-n-p "Buffer modified, save it? "))
- (save-buffer))))
- (let ((_buf (find-file-noselect (ledger-master-file)))
- (cbuf (get-buffer ledger-check-buffer-name))
- (wcfg (current-window-configuration)))
- (if cbuf
- (kill-buffer cbuf))
- (with-current-buffer
- (pop-to-buffer (get-buffer-create ledger-check-buffer-name))
- (ledger-check-mode)
- (set (make-local-variable 'ledger-original-window-cfg) wcfg)
- (ledger-do-check)
- (shrink-window-if-larger-than-buffer)
- (set-buffer-modified-p nil)
- (setq buffer-read-only t)
- (message "q to quit; r to redo; k to kill"))))
-
-
-(provide 'ledger-check)
-
-;;; ledger-check.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-commodities.el b/elpa/ledger-mode-20200530.1710/ledger-commodities.el
deleted file mode 100644
index 50453dc..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-commodities.el
+++ /dev/null
@@ -1,161 +0,0 @@
-;;; ledger-commodities.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Helper functions to deal with commoditized numbers. A commoditized
-;; number will be a list of value and string where the string contains
-;; the commodity
-
-;;; Code:
-
-(require 'ledger-regex)
-
-;; These keep the byte-compiler from warning about them, but have no other
-;; effect:
-(defvar ledger-environment-alist)
-(declare-function ledger-exec-ledger "ledger-exec" (input-buffer &optional output-buffer &rest args))
-
-(defcustom ledger-reconcile-default-commodity "$"
- "The default commodity for use in target calculations in ledger reconcile."
- :type 'string
- :group 'ledger-reconcile)
-
-(defun ledger-read-commodity-with-prompt (prompt)
- "Read commodity name after PROMPT.
-
-Default value is `ledger-reconcile-default-commodity'."
- (let* ((buffer (current-buffer))
- (commodities (with-temp-buffer
- (ledger-exec-ledger buffer (current-buffer) "commodities")
- (split-string (buffer-string) "\n" t))))
- (completing-read prompt commodities nil t nil nil ledger-reconcile-default-commodity)))
-
-(defun ledger-split-commodity-string (str)
- "Split a commoditized string, STR, into two parts.
-Returns a list with (value commodity)."
- (let ((number-regex (if (assoc "decimal-comma" ledger-environment-alist)
- ledger-amount-decimal-comma-regex
- ledger-amount-decimal-period-regex)))
- (if (> (length str) 0)
- (with-temp-buffer
- (insert str)
- (goto-char (point-min))
- (cond
- ((re-search-forward "\"\\(.*\\)\"" nil t) ; look for quoted commodities
- (let ((com (delete-and-extract-region
- (match-beginning 1)
- (match-end 1))))
- (if (re-search-forward
- number-regex nil t)
- (list
- (ledger-string-to-number
- (delete-and-extract-region (match-beginning 0) (match-end 0)))
- com))))
- ((re-search-forward number-regex nil t)
- ;; found a number in the current locale, return it in the
- ;; car. Anything left over is annotation, the first
- ;; thing should be the commodity, separated by
- ;; whitespace, return it in the cdr. I can't think of
- ;; any counterexamples
- (list
- (ledger-string-to-number
- (delete-and-extract-region (match-beginning 0) (match-end 0)))
- (nth 0 (split-string (buffer-substring-no-properties (point-min) (point-max))))))
- ((re-search-forward "0" nil t)
- ;; couldn't find a decimal number, look for a single 0,
- ;; indicating account with zero balance
- (list 0 ledger-reconcile-default-commodity))
- ;; nothing found, return 0
- (t (list 0 ledger-reconcile-default-commodity)))))))
-
-(defun ledger-string-balance-to-commoditized-amount (str)
- "Return a commoditized amount (val, 'comm') from STR."
- ; break any balances with multi commodities into a list
- (mapcar #'(lambda (st)
- (ledger-split-commodity-string st))
- (split-string str "[\n\r]")))
-
-(defun ledger-subtract-commodity (c1 c2)
- "Subtract C2 from C1, ensuring their commodities match."
- (if (string= (cadr c1) (cadr c2))
- (list (-(car c1) (car c2)) (cadr c1))
- (error "Can't subtract different commodities %S from %S" c2 c1)))
-
-(defun ledger-add-commodity (c1 c2)
- "Add C1 and C2, ensuring their commodities match."
- (if (string= (cadr c1) (cadr c2))
- (list (+ (car c1) (car c2)) (cadr c1))
- (error "Can't add different commodities, %S to %S" c1 c2)))
-
-(defun ledger-strip (str char)
- "Return STR with CHAR removed."
- (replace-regexp-in-string char "" str))
-
-(defun ledger-string-to-number (str &optional decimal-comma)
- "Parse STR as a number and return that number.
-
-Improves builtin `string-to-number' by handling
-internationalization, and return nil if number can't be parsed.
-See `ledger-environment-alist' for DECIMAL-COMMA."
- (let ((nstr (if (or decimal-comma
- (assoc "decimal-comma" ledger-environment-alist))
- (ledger-strip str "[.]")
- (ledger-strip str ","))))
- (while (string-match "," nstr) ;if there is a comma now, it is a thousands separator
- (setq nstr (replace-match "." nil nil nstr)))
- (string-to-number nstr)))
-
-(defun ledger-number-to-string (n &optional decimal-comma)
- "See `number-to-string' for N.
-DECIMAL-COMMA is as documented in `ledger-environment-alist'."
- (let ((str (number-to-string n)))
- (when (or decimal-comma
- (assoc "decimal-comma" ledger-environment-alist))
- (while (string-match "\\." str)
- (setq str (replace-match "," nil nil str))))
- str))
-
-(defun ledger-commodity-to-string (c1)
- "Return string representing C1.
-Single character commodities are placed ahead of the value,
-longer ones are after the value."
- (let ((str (ledger-number-to-string (car c1)))
- (commodity (cadr c1)))
- (if (> (length commodity) 1)
- (concat str " " commodity)
- (concat commodity " " str))))
-
-(defun ledger-read-commodity-string (prompt)
- "Read an amount from mini-buffer using PROMPT."
- (let ((str (read-from-minibuffer
- (concat prompt " (" ledger-reconcile-default-commodity "): ")))
- comm)
- (if (and (> (length str) 0)
- (ledger-split-commodity-string str))
- (progn
- (setq comm (ledger-split-commodity-string str))
- (if (cadr comm)
- comm
- (list (car comm) ledger-reconcile-default-commodity))))))
-
-(provide 'ledger-commodities)
-
-;;; ledger-commodities.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-complete.el b/elpa/ledger-mode-20200530.1710/ledger-complete.el
deleted file mode 100644
index 2bf2cec..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-complete.el
+++ /dev/null
@@ -1,362 +0,0 @@
-;;; ledger-complete.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Functions providing payee and account auto complete.
-
-(require 'cl-lib)
-(eval-when-compile
- (require 'subr-x))
-
-;; In-place completion support
-
-;;; Code:
-(require 'ledger-context)
-(require 'ledger-xact)
-(require 'ledger-schedule)
-
-(defcustom ledger-accounts-file nil
- "The path to an optional file in which all accounts are used or declared.
-This file will then be used as a source for account name completions."
- :type 'file
- :group 'ledger)
-
-(defcustom ledger-accounts-exclude-function nil
- "Function to exclude accounts from completion.
-Should be a predicate function that accepts one argument, an
-element of `ledger-accounts-list-in-buffer'."
- :type 'function
- :group 'ledger
- :package-version '(ledger-mode . "2019-08-14"))
-
-(defcustom ledger-complete-in-steps nil
- "When non-nil, `ledger-complete-at-point' completes account names in steps.
-If nil, full account names are offered for completion."
- :type 'boolean
- :group 'ledger
- :package-version '(ledger-mode . "4.0.0"))
-
-(defun ledger-parse-arguments ()
- "Parse whitespace separated arguments in the current region."
- ;; FIXME: We don't use pcomplete anymore.
- ;; This is more complex than it appears
- ;; to need, so that it can work with pcomplete. See
- ;; pcomplete-parse-arguments-function for details
- (let* ((begin (save-match-data
- (if (looking-back (concat "^\\(" ledger-iso-date-regexp "=\\|\\)"
- ledger-incomplete-date-regexp) nil)
- (match-end 1)
- (save-excursion
- (ledger-thing-at-point) ;; leave point at beginning of thing under point
- (point)))))
- (end (point))
- begins args)
- ;; to support end of line metadata
- (save-excursion
- (when (search-backward ";"
- (line-beginning-position) t)
- (setq begin (match-beginning 0))))
- (save-excursion
- (goto-char begin)
- (when (< (point) end)
- (skip-chars-forward " \t\n")
- (setq begins (cons (point) begins))
- (setq args (cons (buffer-substring-no-properties
- (car begins) end)
- args)))
- (cons (reverse args) (reverse begins)))))
-
-
-(defun ledger-payees-in-buffer ()
- "Scan buffer and return list of all payees."
- (let ((origin (point))
- payees-list)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward
- ledger-payee-any-status-regex nil t) ;; matches first line
- (unless (and (>= origin (match-beginning 0))
- (< origin (match-end 0)))
- (setq payees-list (cons (match-string-no-properties 3)
- payees-list))))) ;; add the payee
- ;; to the list
- (sort (delete-dups payees-list) #'string-lessp)))
-
-(defun ledger-accounts-in-buffer ()
- "Return an alist of accounts in the current buffer.
-The `car' of each element is the account name and the `cdr' is an
-alist where the key is a subdirective such as \"assert\" and the
-value (if any) is the associated data. In other words, if you've
-declared an account like so:
-
-account Assets:Checking
- assert commodity == \"$\"
- default
-
-Then one of the elements this function returns will be
-\(\"Assets:Checking\"
- (\"default\")
- (\"assert\" . \"commodity == \"$\"\"))"
- (save-excursion
- (goto-char (point-min))
- (let (account-list
- (seen (make-hash-table :test #'equal :size 1)))
- ;; First, consider accounts declared with "account" directives, which may or
- ;; may not have associated data. The data is on the following lines up to a
- ;; line not starting with whitespace.
- (while (re-search-forward ledger-account-directive-regex nil t)
- (let ((account (match-string-no-properties 1))
- (lines (buffer-substring-no-properties
- (point)
- (progn (ledger-navigate-next-xact-or-directive)
- (point))))
- data)
- (dolist (d (split-string lines "\n"))
- (setq d (string-trim d))
- (unless (string= d "")
- (if (string-match " " d)
- (push (cons (substring d 0 (match-beginning 0))
- (substring d (match-end 0) nil))
- data)
- (push (cons d nil) data))))
- (push (cons account data) account-list)
- (puthash account t seen)))
- ;; Next, gather all accounts declared in postings
- (unless
- ;; FIXME: People who have set `ledger-flymake-be-pedantic' to non-nil
- ;; probably don't want accounts from postings, just those declared
- ;; with directives. But the name is a little misleading. Should we
- ;; make a ledger-mode-be-pedantic and use that instead?
- (bound-and-true-p ledger-flymake-be-pedantic)
- (goto-char (point-min))
- (while (re-search-forward ledger-account-name-or-directive-regex nil t)
- (let ((account (match-string-no-properties 1)))
- (unless (gethash account seen)
- (puthash account t seen)
- (push (cons account nil) account-list)))))
- (sort account-list (lambda (a b) (string-lessp (car a) (car b)))))))
-
-(defun ledger-accounts-list-in-buffer ()
- "Return a list of all known account names in the current buffer as strings.
-Considers both accounts listed in postings and those declared with \"account\" directives."
- (let ((accounts (ledger-accounts-in-buffer)))
- (when ledger-accounts-exclude-function
- (setq accounts (cl-remove-if ledger-accounts-exclude-function accounts)))
- (mapcar #'car accounts)))
-
-(defun ledger-accounts-list ()
- "Return a list of all known account names as strings.
-Looks in `ledger-accounts-file' if set, otherwise the current buffer."
- (if ledger-accounts-file
- (let ((f ledger-accounts-file))
- (with-temp-buffer
- (insert-file-contents f)
- (ledger-accounts-list-in-buffer)))
- (ledger-accounts-list-in-buffer)))
-
-(defun ledger-find-accounts-in-buffer ()
- (let ((account-tree (list t))
- (account-elements nil)
- (prefix ""))
- (save-excursion
- (goto-char (point-min))
-
- (dolist (account
- (cl-remove-if-not (lambda (c) (string-prefix-p prefix c))
- (ledger-accounts-list)))
- (let ((root account-tree))
- (setq account-elements
- (split-string
- account ":"))
- (while account-elements
- (let ((xact (assoc (car account-elements) root)))
- (if xact
- (setq root (cdr xact))
- (setq xact (cons (car account-elements) (list t)))
- (nconc root (list xact))
- (setq root (cdr xact))))
- (setq account-elements (cdr account-elements))))))
- account-tree))
-
-(defun ledger-accounts-tree ()
- "Return a tree of all accounts in the buffer."
- (let* ((current (caar (ledger-parse-arguments)))
- (elements (and current (split-string current ":")))
- (root (ledger-find-accounts-in-buffer))
- (prefix nil))
- (while (cdr elements)
- (let ((xact (assoc (car elements) root)))
- (if xact
- (setq prefix (concat prefix (and prefix ":")
- (car elements))
- root (cdr xact))
- (setq root nil elements nil)))
- (setq elements (cdr elements)))
- (setq root (delete (list (car elements) t) root))
- (and root
- (sort
- (mapcar (function
- (lambda (x)
- (let ((term (if prefix
- (concat prefix ":" (car x))
- (car x))))
- (if (> (length (cdr x)) 1)
- (concat term ":")
- term))))
- (cdr root))
- 'string-lessp))))
-
-(defun ledger-complete-date (month-string day-string)
- "Complete a date."
- (let*
- ((now (current-time))
- (decoded (decode-time now))
- (this-month (nth 4 decoded))
- (this-year (nth 5 decoded))
- (last-month (if (> this-month 1) (1- this-month) 12))
- (last-year (1- this-year))
- (last-month-year (if (> this-month 1) this-year last-year))
- (month (and month-string
- (string-to-number month-string)))
- (day (string-to-number day-string))
- (dates (list (encode-time 0 0 0 day (or month this-month) this-year)
- (if month
- (encode-time 0 0 0 day month last-year)
- (encode-time 0 0 0 day last-month last-month-year)))))
- (lambda (_string _predicate _all)
- (concat (ledger-format-date
- (cl-find-if (lambda (date) (not (time-less-p now date))) dates))
- (and (= (point) (line-end-position)) " ")))))
-
-(defun ledger-complete-effective-date
- (tx-year-string tx-month-string tx-day-string
- month-string day-string)
- "Complete an effective date."
- (let*
- ((tx-year (string-to-number tx-year-string))
- (tx-month (string-to-number tx-month-string))
- (tx-day (string-to-number tx-day-string))
- (tx-date (encode-time 0 0 0 tx-day tx-month tx-year))
- (next-month (if (< tx-month 12) (1+ tx-month) 1))
- (next-year (1+ tx-year))
- (next-month-year (if (< tx-month 12) tx-year next-year))
- (month (and month-string
- (string-to-number month-string)))
- (day (string-to-number day-string))
- (dates (list (encode-time 0 0 0 day (or month tx-month) tx-year)
- (if month
- (encode-time 0 0 0 day month next-year)
- (encode-time 0 0 0 day next-month next-month-year)))))
- (lambda (_string _predicate _all)
- (concat (ledger-format-date
- (cl-find-if (lambda (date) (not (time-less-p date tx-date))) dates))
- (and (= (point) (line-end-position)) " ")))))
-
-(defun ledger-complete-at-point ()
- "Do appropriate completion for the thing at point."
- (let ((end (point))
- start collection
- realign-after
- delete-suffix)
- (cond (;; Date
- (looking-back (concat "^" ledger-incomplete-date-regexp) (line-beginning-position))
- (setq collection (ledger-complete-date (match-string 1) (match-string 2))
- start (match-beginning 0)
- delete-suffix (save-match-data
- (when (looking-at (rx (one-or-more (or digit (any ?/ ?-)))))
- (length (match-string 0))))))
- (;; Effective dates
- (looking-back (concat "^" ledger-iso-date-regexp "=" ledger-incomplete-date-regexp)
- (line-beginning-position))
- (setq start (line-beginning-position))
- (setq collection (ledger-complete-effective-date
- (match-string 2) (match-string 3) (match-string 4)
- (match-string 5) (match-string 6))))
- (;; Payees
- (eq (save-excursion (ledger-thing-at-point)) 'transaction)
- (setq start (save-excursion (backward-word) (point)))
- (setq collection #'ledger-payees-in-buffer))
- (;; Accounts
- (looking-back (rx-to-string `(seq bol (one-or-more space)
- (optional (any ?\( ?\[ )) ;; for virtual accounts
- (group (zero-or-more (not space)))))
- (line-beginning-position))
- (setq start (match-beginning 1)
- delete-suffix (save-excursion
- (when (search-forward-regexp (rx (or eol (repeat 2 space))) (line-end-position) t)
- (- (match-beginning 0) end)))
- realign-after t
- collection (if ledger-complete-in-steps
- #'ledger-accounts-tree
- #'ledger-accounts-list))))
- (when collection
- (let ((prefix (buffer-substring-no-properties start end)))
- (list start end
- (if (functionp collection)
- (completion-table-with-cache
- (lambda (_)
- (cl-remove-if (apply-partially 'string= prefix) (funcall collection))))
- collection)
- :exit-function (lambda (&rest _)
- (when delete-suffix
- (delete-char delete-suffix))
- (when (and realign-after ledger-post-auto-align)
- (ledger-post-align-postings (line-beginning-position) (line-end-position))))
- 'ignore)))))
-
-(defun ledger-trim-trailing-whitespace (str)
- (replace-regexp-in-string "[ \t]*$" "" str))
-
-(defun ledger-fully-complete-xact ()
- "Completes a transaction if there is another matching payee in the buffer.
-
-Interactively, if point is after a payee, complete the
-transaction with the details from the last transaction to that
-payee."
- (interactive)
- (let* ((name (ledger-trim-trailing-whitespace (caar (ledger-parse-arguments))))
- (rest-of-name name)
- xacts)
- (save-excursion
- (when (eq 'transaction (ledger-thing-at-point))
- (delete-region (point) (+ (length name) (point)))
- ;; Search backward for a matching payee
- (when (re-search-backward
- (concat "^[0-9/.=-]+\\(\\s-+\\*\\)?\\(\\s-+(.*?)\\)?\\s-+\\(.*"
- (regexp-quote name) ".*\\)" ) nil t)
- (setq rest-of-name (match-string 3))
- ;; Start copying the postings
- (forward-line)
- (setq xacts (buffer-substring-no-properties (point) (ledger-navigate-end-of-xact))))))
- ;; Insert rest-of-name and the postings
- (save-excursion
- (insert rest-of-name ?\n)
- (insert xacts)
- (unless (looking-at-p "\n\n")
- (insert "\n")))
- (forward-line)
- (goto-char (line-end-position))
- (when (re-search-backward "\\(\t\\| [ \t]\\)" nil t)
- (goto-char (match-end 0)))))
-
-(provide 'ledger-complete)
-
-;;; ledger-complete.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-context.el b/elpa/ledger-mode-20200530.1710/ledger-context.el
deleted file mode 100644
index 6485020..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-context.el
+++ /dev/null
@@ -1,210 +0,0 @@
-;;; ledger-context.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Provide facilities for reflection in ledger buffers
-
-;;; Code:
-
-(require 'ledger-regex)
-
-;; ledger-*-string constants are assembled in the
-;; `ledger-single-line-config' macro to form the regex and list of
-;; elements
-(defconst ledger-indent-string "\\(^[ \t]+\\)")
-(defconst ledger-status-string "\\(*\\|!\\)?")
-(defconst ledger-account-string "[\\[(]?\\(.*?\\)[])]?")
-(defconst ledger-separator-string "\\(\\s-\\s-+\\)")
-(defconst ledger-amount-string ledger-amount-regexp)
-(defconst ledger-commoditized-amount-string ledger-commoditized-amount-regexp)
-(defconst ledger-balance-assertion-string ledger-balance-assertion-regexp)
-(defconst ledger-comment-string "[ \t]*;[ \t]*\\(.*?\\)")
-(defconst ledger-nil-string "\\([ \t]+\\)")
-(defconst ledger-date-string "^\\([0-9]\\{4\\}[/-][01]?[0-9][/-][0123]?[0-9]\\)\\(?:=[0-9]\\{4\\}[/-][01]?[0-9][/-][0123]?[0-9]\\)?")
-(defconst ledger-code-string "\\((.*)\\)?")
-(defconst ledger-payee-string "\\(.*[^[:space:]]\\)")
-
-
-(defun ledger-get-regex-str (name)
- "Get the ledger regex of type NAME."
- (symbol-value (intern (concat "ledger-" (symbol-name name) "-string"))))
-
-(defun ledger-line-regex (elements)
- "Get a regex to match ELEMENTS on a single line."
- (concat (apply 'concat (mapcar 'ledger-get-regex-str elements)) "[ \t]*$"))
-
-(defmacro ledger-single-line-config (&rest elements)
- "Take list of ELEMENTS and return regex and element list for use in context-at-point."
- `(list (ledger-line-regex (quote ,elements)) (quote ,elements)))
-
-(defconst ledger-line-config
- (list (list 'xact (list (ledger-single-line-config date nil status nil code nil payee comment)
- (ledger-single-line-config date nil status nil code nil payee)
- (ledger-single-line-config date nil status nil payee comment)
- (ledger-single-line-config date nil status nil payee)
- (ledger-single-line-config date nil code nil payee comment)
- (ledger-single-line-config date nil code nil payee)
- (ledger-single-line-config date nil payee comment)
- (ledger-single-line-config date nil payee)))
- (list 'acct-transaction (list (ledger-single-line-config indent comment)
- (ledger-single-line-config indent status nil account separator commoditized-amount nil balance-assertion)
- (ledger-single-line-config indent status nil account separator commoditized-amount comment)
- (ledger-single-line-config indent status nil account separator commoditized-amount)
- (ledger-single-line-config indent status nil account separator amount)
- (ledger-single-line-config indent status nil account comment)
- (ledger-single-line-config indent status nil account)
- (ledger-single-line-config indent account separator commoditized-amount comment)
- (ledger-single-line-config indent account separator commoditized-amount)
- (ledger-single-line-config indent account separator amount)
- (ledger-single-line-config indent account comment)
- (ledger-single-line-config indent account)))))
-
-(defun ledger-extract-context-info (line-type pos)
- "Get context info for current line with LINE-TYPE.
-
-Assumes point is at beginning of line, and the POS argument specifies
-where the \"users\" point was."
- (let ((linfo (assoc line-type ledger-line-config))
- found field fields)
- (dolist (re-info (nth 1 linfo))
- (let ((re (nth 0 re-info))
- (names (nth 1 re-info)))
- (unless found
- (when (looking-at re)
- (setq found t)
- (dotimes (i (length names))
- (when (nth i names)
- (setq fields (append fields
- (list
- (list (nth i names)
- (match-string-no-properties (1+ i))
- (match-beginning (1+ i))))))))
- (dolist (f fields)
- (and (nth 1 f)
- (>= pos (nth 2 f))
- (setq field (nth 0 f))))))))
- (list line-type field fields)))
-
-(defun ledger-thing-at-point ()
- "Describe thing at points. Return 'transaction, 'posting, or nil.
-Leave point at the beginning of the thing under point"
- (let ((here (point)))
- (goto-char (line-beginning-position))
- (cond ((looking-at "^\\(?:[~=][ \t]\\|[0-9/.=-]+\\(\\s-+\\*\\)?\\(\\s-+(.+?)\\)?\\s-+\\)")
- (goto-char (match-end 0))
- 'transaction)
- ((looking-at "^\\s-+\\([*!]\\s-+\\)?[[(]?\\([^\\s-]\\)")
- (goto-char (match-beginning 2))
- 'posting)
- ((looking-at "^\\(sun\\|mon\\|tue\\|wed\\|thu\\|fri\\|sat\\)\\s-+")
- (goto-char (match-end 0))
- 'day)
- (t
- (ignore (goto-char here))))))
-
-(defun ledger-context-at-point ()
- "Return a list describing the context around point.
-
-The contents of the list are the line type, the name of the field
-containing point, and for selected line types, the content of
-the fields in the line in a association list."
- (let ((pos (point)))
- (save-excursion
- (beginning-of-line)
- (let ((first-char (char-after)))
- (cond ((equal (point) (line-end-position))
- '(empty-line nil nil))
- ((memq first-char '(?\ ?\t))
- (ledger-extract-context-info 'acct-transaction pos))
- ((memq first-char '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
- (ledger-extract-context-info 'xact pos))
- ((equal first-char ?\=)
- '(automated-xact nil nil))
- ((equal first-char ?\~)
- '(period-xact nil nil))
- ((equal first-char ?\!)
- '(command-directive))
- ((equal first-char ?\;)
- '(comment nil nil))
- ((equal first-char ?Y)
- '(default-year nil nil))
- ((equal first-char ?P)
- '(commodity-price nil nil))
- ((equal first-char ?N)
- '(price-ignored-commodity nil nil))
- ((equal first-char ?D)
- '(default-commodity nil nil))
- ((equal first-char ?C)
- '(commodity-conversion nil nil))
- ((equal first-char ?i)
- '(timeclock-i nil nil))
- ((equal first-char ?o)
- '(timeclock-o nil nil))
- ((equal first-char ?b)
- '(timeclock-b nil nil))
- ((equal first-char ?h)
- '(timeclock-h nil nil))
- (t
- '(unknown nil nil)))))))
-
-(defun ledger-context-other-line (offset)
- "Return a list describing context of line OFFSET from existing position.
-
-Offset can be positive or negative. If run out of buffer before reaching
-specified line, returns nil."
- (save-excursion
- (let ((left (forward-line offset)))
- (if (not (equal left 0))
- nil
- (ledger-context-at-point)))))
-
-(defun ledger-context-line-type (context-info)
- (nth 0 context-info))
-
-(defun ledger-context-current-field (context-info)
- (nth 1 context-info))
-
-(defun ledger-context-field-info (context-info field-name)
- (assoc field-name (nth 2 context-info)))
-
-(defun ledger-context-field-present-p (context-info field-name)
- (not (null (ledger-context-field-info context-info field-name))))
-
-(defun ledger-context-field-value (context-info field-name)
- (nth 1 (ledger-context-field-info context-info field-name)))
-
-(defun ledger-context-field-position (context-info field-name)
- (nth 2 (ledger-context-field-info context-info field-name)))
-
-(defun ledger-context-field-end-position (context-info field-name)
- (+ (ledger-context-field-position context-info field-name)
- (length (ledger-context-field-value context-info field-name))))
-
-(defun ledger-context-goto-field-start (context-info field-name)
- (goto-char (ledger-context-field-position context-info field-name)))
-
-(defun ledger-context-goto-field-end (context-info field-name)
- (goto-char (ledger-context-field-end-position context-info field-name)))
-
-(provide 'ledger-context)
-
-;;; ledger-context.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-exec.el b/elpa/ledger-mode-20200530.1710/ledger-exec.el
deleted file mode 100644
index 8568854..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-exec.el
+++ /dev/null
@@ -1,125 +0,0 @@
-;;; ledger-exec.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Code for executing ledger synchronously.
-
-;;; Code:
-
-(declare-function ledger-master-file "ledger-report" ())
-
-(defconst ledger-version-needed "3.0.0"
- "The version of ledger executable needed for interactive features.")
-
-(defvar ledger-works nil
- "Flag showing whether the ledger binary can support `ledger-mode' interactive features.")
-
-(defgroup ledger-exec nil
- "Interface to the Ledger command-line accounting program."
- :group 'ledger)
-
-(defcustom ledger-mode-should-check-version t
- "Should Ledger-mode verify that the executable is working?"
- :type 'boolean
- :group 'ledger-exec)
-
-(defcustom ledger-binary-path "ledger"
- "Path to the ledger executable."
- :type 'file
- :risky t
- :group 'ledger-exec)
-
-(defun ledger-exec-handle-error (ledger-errfile)
- "Deal with ledger errors contained in LEDGER-ERRFILE."
- (with-current-buffer (get-buffer-create "*Ledger Error*")
- (let ((buffer-read-only nil))
- (delete-region (point-min) (point-max))
- (insert-file-contents ledger-errfile))
- (view-mode)
- (setq buffer-read-only t)
- (current-buffer)))
-
-(defun ledger-exec-success-p (exit-code ledger-output-buffer)
- "Return t if EXIT-CODE is non-zero and output in LEDGER-OUTPUT-BUFFER is successful."
- (with-current-buffer ledger-output-buffer
- (goto-char (point-min))
- (if (or (not (zerop exit-code))
- (and (> (buffer-size) 1) (looking-at (regexp-quote "While"))))
- nil ;; failure, there is an error starting with "While"
- ledger-output-buffer)))
-
-(defun ledger-exec-ledger (input-buffer &optional output-buffer &rest args)
- "Run Ledger using INPUT-BUFFER.
-Optionally capture output in OUTPUT-BUFFER, and pass ARGS on the
-command line. Returns OUTPUT-BUFFER if ledger succeeded,
-otherwise the error output is displayed and an error is raised."
- (unless (and ledger-binary-path
- (or (and (file-exists-p ledger-binary-path)
- (file-executable-p ledger-binary-path))
- (executable-find ledger-binary-path)))
- (error "`ledger-binary-path' (value: %s) is not executable" ledger-binary-path))
- (let ((buf (or input-buffer (find-file-noselect (ledger-master-file))))
- (outbuf (or output-buffer
- (generate-new-buffer " *ledger-tmp*")))
- (errfile (make-temp-file "ledger-errors")))
- (unwind-protect
- (with-current-buffer buf
- (let ((exit-code
- (let ((coding-system-for-write 'utf-8)
- (coding-system-for-read 'utf-8))
- (apply #'call-process-region
- (append (list (point-min) (point-max)
- ledger-binary-path nil (list outbuf errfile) nil "-f" "-")
- args)))))
- (if (ledger-exec-success-p exit-code outbuf)
- outbuf
- (display-buffer (ledger-exec-handle-error errfile))
- (error "Ledger execution failed"))))
- (delete-file errfile))))
-
-(defun ledger-version-greater-p (needed)
- "Verify the ledger binary is usable for `ledger-mode' (version greater than NEEDED)."
- (let ((version-strings '()))
- (with-temp-buffer
- (when (ledger-exec-ledger (current-buffer) (current-buffer) "--version")
- (goto-char (point-min))
- (delete-horizontal-space)
- (setq version-strings (split-string
- (buffer-substring-no-properties (point)
- (point-max))))
- (if (and (string-match (regexp-quote "Ledger") (car version-strings))
- (or (string= needed (cadr version-strings))
- (string< needed (cadr version-strings))))
- t ;; success
- nil))))) ;;failure
-
-(defun ledger-check-version ()
- "Verify that ledger works and is modern enough."
- (interactive)
- (if ledger-mode-should-check-version
- (if (setq ledger-works (ledger-version-greater-p ledger-version-needed))
- (message "Good Ledger Version")
- (message "Bad Ledger Version"))))
-
-(provide 'ledger-exec)
-
-;;; ledger-exec.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-flymake.el b/elpa/ledger-mode-20200530.1710/ledger-flymake.el
deleted file mode 100644
index 18f3bdc..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-flymake.el
+++ /dev/null
@@ -1,142 +0,0 @@
-;;; ledger-flymake.el --- A ledger Flymake backend -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2018 J. Alexander Branham (alex DOT branham AT gmail DOT com)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Flymake is the built-in Emacs package to support on-the-fly syntax checking.
-;; This file adds support for flymake to `ledger-mode'. Enable it by calling
-;; `flymake-mode' from a file-visiting ledger buffer.
-
-;;; Code:
-(require 'cl-lib)
-(require 'flymake)
-(require 'ledger-exec) ; for `ledger-binary-path'
-
-;; To silence byte compiler warnings in Emacs 25 and older:
-(declare-function flymake-diag-region "flymake" (buffer line &optional col))
-(declare-function flymake-make-diagnostic "flymake" (buffer beg end type text &optional data overlay-properties))
-
-(defvar-local ledger--flymake-proc nil)
-
-(defcustom ledger-flymake-be-pedantic nil
- "If non-nil, pass the --pedantic flag for ledger to the flymake backend.
-If --pedantic is in your ledgerrc file, then --pedantic gets
-passed regardless of the value."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger)
-
-(defcustom ledger-flymake-be-explicit nil
- "If non-nil, pass the --explicit flag for ledger to the flymake backend.
-If --explicit is in your ledgerrc file, then --explicit gets
-passed regardless of the value."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger)
-
-;; Based on the example from Flymake's info:
-(defun ledger-flymake (report-fn &rest _args)
- "A Flymake backend for `ledger-mode'.
-
-Flymake calls this with REPORT-FN as needed."
- (unless (executable-find ledger-binary-path)
- (error "Cannot find ledger"))
- ;; If a live process launched in an earlier check was found, that
- ;; process is killed. When that process's sentinel eventually runs,
- ;; it will notice its obsoletion, since it have since reset
- ;; `ledger-flymake-proc' to a different value
- (when (process-live-p ledger--flymake-proc)
- (kill-process ledger--flymake-proc))
- ;; Save the current buffer, the narrowing restriction, remove any
- ;; narrowing restriction.
- (let ((source (current-buffer))
- (file (buffer-file-name)))
- (save-restriction
- (widen)
- ;; Reset the `ledger--flymake-proc' process to a new process
- ;; calling the ledger tool.
- (setq
- ledger--flymake-proc
- (make-process
- :name "ledger-flymake" :noquery t :connection-type 'pipe
- :buffer (generate-new-buffer " *ledger-flymake*")
- :command (cl-remove
- nil
- `(,ledger-binary-path "-f" ,file
- ,(when ledger-flymake-be-pedantic "--pedantic")
- ,(when ledger-flymake-be-explicit "--explicit")
- "balance"))
- :sentinel
- (lambda (proc _event)
- ;; Check that the process has indeed exited, as it might
- ;; be simply suspended.
- (when (eq 'exit (process-status proc))
- (unwind-protect
- ;; Only proceed if `proc' is the same as
- ;; `ledger--flymake-proc', which indicates that
- ;; `proc' is not an obsolete process.
- (if (with-current-buffer source (eq proc ledger--flymake-proc))
- (with-current-buffer (process-buffer proc)
- (goto-char (point-min))
- ;; Parse the output buffer for diagnostic's
- ;; messages and locations, collect them in a list
- ;; of objects, and call `report-fn'.
- (cl-loop
- while (search-forward-regexp
- ;; This regex needs to match the whole error. We
- ;; also need a capture group for the error message
- ;; (that's group 1 here) and the line number
- ;; (group 2).
- (rx line-start "While parsing file \"" (one-or-more (not whitespace)) " line " (group-n 2 (one-or-more num)) ":\n"
- (zero-or-more line-start "While " (one-or-more not-newline) "\n" )
- (minimal-match (zero-or-more line-start (zero-or-more not-newline) "\n"))
- (group-n 1 "Error: " (one-or-more not-newline) "\n"))
- nil t)
- for msg = (match-string 1)
- for (beg . end) = (flymake-diag-region
- source
- (string-to-number (match-string 2)))
- for type = :error
- collect (flymake-make-diagnostic source
- beg
- end
- type
- msg)
- into diags
- finally (funcall report-fn diags)))
- (flymake-log :warning "Canceling obsolete check %s"
- proc))
- ;; Cleanup the temporary buffer used to hold the
- ;; check's output.
- (kill-buffer (process-buffer proc))))))))))
-
-;;;###autoload
-(defun ledger-flymake-enable ()
- "Enable `flymake-mode' in `ledger-mode' buffers."
- (unless (> emacs-major-version 25)
- (error "Ledger-flymake requires Emacs version 26 or higher"))
- ;; Add `ledger-flymake' to `flymake-diagnostic-functions' so that flymake can
- ;; work in ledger-mode:
- (add-hook 'flymake-diagnostic-functions 'ledger-flymake nil t)
- (flymake-mode))
-
-(provide 'ledger-flymake)
-
-;;; ledger-flymake.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-fontify.el b/elpa/ledger-mode-20200530.1710/ledger-fontify.el
deleted file mode 100644
index 0e53215..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-fontify.el
+++ /dev/null
@@ -1,58 +0,0 @@
-;;; ledger-fontify.el --- Provide custom fontification for ledger-mode -*- lexical-binding: t; -*-
-
-
-;; Copyright (C) 2014 Craig P. Earls (enderw88 at gmail dot com)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Font-lock-mode doesn't handle multiline syntax very well. This
-;; code provides font lock that is sensitive to overall transaction
-;; states
-
-
-;;; Code:
-
-(require 'ledger-navigate)
-(require 'ledger-regex)
-(require 'ledger-state)
-
-;; These are dynamically bound, see `font-lock-extend-region-functions'.
-(defvar font-lock-beg)
-(defvar font-lock-end)
-
-(defcustom ledger-fontify-xact-state-overrides nil
- "If t the highlight entire xact with state."
- :type 'boolean
- :group 'ledger)
-
-(defun ledger-fontify-extend-region ()
- "Extend fontification region to include whole transactions or directives."
- (save-match-data
- (let* ((new-beg (min font-lock-beg (car (ledger-navigate-find-element-extents font-lock-beg))))
- (new-end (max font-lock-end (cadr (ledger-navigate-find-element-extents font-lock-end))))
- (changed (or (/= new-beg font-lock-beg)
- (/= new-end font-lock-end))))
- (setq font-lock-beg new-beg)
- (setq font-lock-end new-end)
- changed)))
-
-
-(provide 'ledger-fontify)
-
-;;; ledger-fontify.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-fonts.el b/elpa/ledger-mode-20200530.1710/ledger-fonts.el
deleted file mode 100644
index 93cea88..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-fonts.el
+++ /dev/null
@@ -1,684 +0,0 @@
-;;; ledger-fonts.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-
-;;; Commentary:
-;; All of the faces for ledger mode are defined here.
-
-;;; Code:
-
-(require 'ledger-navigate)
-(require 'ledger-regex)
-(require 'ledger-state)
-(require 'ledger-fontify)
-
-(defgroup ledger-faces nil "Ledger mode highlighting" :group 'ledger)
-
-(defface ledger-font-auto-xact-face
- `((t :inherit font-lock-negation-char-face))
- "Default face for automatic transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-periodic-xact-face
- `((t :inherit font-lock-constant-face))
- "Default face for automatic transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-xact-cleared-face
- `((t :inherit ledger-font-payee-cleared-face))
- "Default face for cleared transaction"
- :group 'ledger-faces)
-
-(defface ledger-font-xact-pending-face
- `((t :inherit ledger-font-pending-face))
- "Default face for pending transaction"
- :group 'ledger-faces)
-
-(defface ledger-font-payee-uncleared-face
- `((t :inherit error))
- "Default face for Ledger"
- :group 'ledger-faces)
-
-(defface ledger-font-payee-cleared-face
- `((t :inherit shadow))
- "Default face for cleared (*) payees"
- :group 'ledger-faces)
-
-(defface ledger-font-payee-pending-face
- `((t :inherit ledger-font-pending-face))
- "Default face for pending (!) payees"
- :group 'ledger-faces)
-
-(defface ledger-font-xact-highlight-face
- `((t
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit ledger-occur-xact-face))
- "Default face for transaction under point"
- :group 'ledger-faces)
-
-(defface ledger-font-pending-face
- `((t :inherit warning))
- "Default face for pending (!) transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-other-face
- `((t :inherit font-lock-type-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-directive-face
- `((t :inherit font-lock-preprocessor-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-account-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-account-name-face
- `((t :inherit font-lock-variable-name-face))
- "Face for account names in account and alias directives"
- :group 'ledger-faces)
-
-(defface ledger-font-note-directive-face
- `((t :inherit ledger-font-directive-face))
- "Face for note subdirectives"
- :group 'ledger-faces)
-
-(defface ledger-font-note-text-face
- `((t :inherit font-lock-doc-face))
- "Face for note subdirective text"
- :group 'ledger-faces)
-
-(defface ledger-font-default-directive-face
- `((t :inherit ledger-font-directive-face))
- "Face for default subdirectives"
- :group 'ledger-faces)
-
-(defface ledger-font-price-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-price-date-face
- `((t :inherit default))
- "Face for date and time in price directive"
- :group 'ledger-faces)
-
-(defface ledger-font-price-symbol-face
- `((t :inherit font-lock-constant-face))
- "Face for symbol in price directive"
- :group 'ledger-faces)
-
-(defface ledger-font-price-face
- `((t :inherit default))
- "Face for price in price directive"
- :group 'ledger-faces)
-
-(defface ledger-font-apply-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-apply-account-face
- `((t :inherit default))
- "Face for argument of apply account directive"
- :group 'ledger-faces)
-
-(defface ledger-font-apply-tag-face
- `((t :inherit default))
- "Face for argument of apply tag directive"
- :group 'ledger-faces)
-
-(defface ledger-font-alias-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-alias-definition-face
- `((t :inherit default))
- "Face for aliased account in alias directives"
- :group 'ledger-faces)
-
-(defface ledger-font-assert-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-condition-face
- `((t :inherit default))
- "Default face for check and assert conditions"
- :group 'ledger-faces)
-
-(defface ledger-font-assert-condition-face
- `((t :inherit ledger-font-condition-face))
- "Face for assert conditions"
- :group 'ledger-faces)
-
-(defface ledger-font-bucket-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-bucket-account-face
- `((t :inherit default))
- "Face for bucket directive argument"
- :group 'ledger-faces)
-
-(defface ledger-font-C-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for C directive"
- :group 'ledger-faces)
-
-(defface ledger-font-C-amount-face
- `((t :inherit default))
- "Face for amounts in C directives"
- :group 'ledger-faces)
-
-(defface ledger-font-capture-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-capture-account-face
- `((t :inherit default))
- "Face for account name in capture directives"
- :group 'ledger-faces)
-
-(defface ledger-font-capture-regex-face
- `((t :inherit default))
- "Face for match regex in capture directives"
- :group 'ledger-faces)
-
-(defface ledger-font-check-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-check-condition-face
- `((t :inherit ledger-font-condition-face))
- "Face for check conditions"
- :group 'ledger-faces)
-
-(defface ledger-font-commodity-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-commodity-name-face
- `((t :inherit font-lock-constant-face))
- "Face for commodity name in commodity directives"
- :group 'ledger-faces)
-
-(defface ledger-font-format-directive-face
- `((t :inherit ledger-font-directive-face))
- "Face for format subdirective"
- :group 'ledger-faces)
-
-(defface ledger-font-commodity-format-face
- `((t :inherit default))
- "Face for format subdirective argument"
- :group 'ledger-faces)
-
-(defface ledger-font-D-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for D directive"
- :group 'ledger-faces)
-
-(defface ledger-font-define-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-define-name-face
- `((t :inherit font-lock-variable-name-face))
- "Face for variable name in define directive"
- :group 'ledger-faces)
-
-(defface ledger-font-define-body-face
- `((t :inherit default))
- "Face for body in define directive"
- :group 'ledger-faces)
-
-(defface ledger-font-end-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-expr-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-expr-expression-face
- `((t :inherit default))
- "Face for expr and eval expressions"
- :group 'ledger-faces)
-
-(defface ledger-font-fixed-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-fixed-commodity-face
- `((t :inherit font-lock-constant-face))
- "Face for commodity name in fixed directive"
- :group 'ledger-faces)
-
-(defface ledger-font-fixed-price-face
- `((t :inherit default))
- "Face for price in fixed directive"
- :group 'ledger-faces)
-
-(defface ledger-font-include-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-include-filename-face
- `((t :inherit font-lock-string-face))
- "Face for file name in include directives"
- :group 'ledger-faces)
-
-(defface ledger-font-N-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for N directive"
- :group 'ledger-faces)
-
-(defface ledger-font-N-symbol-face
- `((t :inherit default))
- "Face for symbol in N directives")
-
-(defface ledger-font-payee-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-payee-name-face
- `((t :inherit font-lock-function-name-face))
- "Face for payee name in payee directive"
- :group 'ledger-faces)
-
-(defface ledger-font-payee-regex-face
- `((t :inherit font-lock-string-face))
- "Face for payee subdirective regex in account directive"
- :group 'ledger-faces)
-
-(defface ledger-font-uuid-directive-face
- `((t :inherit ledger-font-directive-face))
- "Face for uuid subdirectives"
- :group 'ledger-faces)
-
-(defface ledger-font-uuid-face
- `((t :inherit default))
- "Face for uuid in uuid subdirectives"
- :group 'ledger-faces)
-
-(defface ledger-font-tag-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-tag-name-face
- `((t :inherit font-lock-type-face))
- "Face for tag name in tag directive"
- :group 'ledger-faces)
-
-(defface ledger-font-timeclock-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for timeclock I,i,O,o,b,h directives"
- :group 'ledger-faces)
-
-(defface ledger-font-year-directive-face
- `((t :inherit ledger-font-directive-face))
- "Default face for other transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-year-face
- `((t :inherit default))
- "Font for year in year directives"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-account-face
- `((t :inherit ledger-font-default-face))
- "Face for Ledger accounts"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-account-cleared-face
- `((t :inherit ledger-font-payee-cleared-face))
- "Face for Ledger accounts"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-amount-cleared-face
- `((t :inherit ledger-font-posting-account-cleared-face))
- "Face for Ledger accounts"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-account-pending-face
- `((t :inherit ledger-font-pending-face))
- "Face for Ledger accounts"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-amount-pending-face
- `((t :inherit ledger-font-posting-account-pending-face))
- "Face for Ledger accounts"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-amount-face
- `((t :inherit font-lock-constant-face ))
- "Face for Ledger amounts"
- :group 'ledger-faces)
-
-(defface ledger-font-posting-date-face
- `((t :inherit font-lock-keyword-face))
- "Face for Ledger dates"
- :group 'ledger-faces)
-
-(defface ledger-occur-narrowed-face
- `((t :inherit font-lock-comment-face :invisible t))
- "Default face for Ledger occur mode hidden transactions"
- :group 'ledger-faces)
-
-(defface ledger-occur-xact-face
- `((t :inherit highlight))
- "Default face for Ledger occur mode shown transactions"
- :group 'ledger-faces)
-
-(defface ledger-font-comment-face
- `((t :inherit font-lock-comment-face))
- "Face for Ledger comments"
- :group 'ledger-faces)
-
-(defface ledger-font-reconciler-uncleared-face
- `((t :inherit ledger-font-payee-uncleared-face))
- "Default face for uncleared transactions in the reconcile window"
- :group 'ledger-faces)
-
-(defface ledger-font-reconciler-cleared-face
- `((t :inherit ledger-font-payee-cleared-face))
- "Default face for cleared (*) transactions in the reconcile window"
- :group 'ledger-faces)
-
-(defface ledger-font-reconciler-pending-face
- `((t :inherit ledger-font-pending-face))
- "Default face for pending (!) transactions in the reconcile window"
- :group 'ledger-faces)
-
-(defface ledger-font-report-clickable-face
- `((t))
- "Face applied to clickable entries in the report window"
- :group 'ledger-faces)
-
-(defface ledger-font-code-face
- `((t :inherit default))
- "Face for Ledger codes"
- :group 'ledger-faces)
-
-(defun ledger-font-face-by-state (num faces)
- "Choose one of three faces depending on transaction state.
-NUM specifies a match group containing the state.
-FACES has the form (CLEARED PENDING OTHER).
-Return CLEARED if that group specifies a cleared transaction,
-PENDING if pending, and OTHER if none of the above."
- (let ((state (save-match-data (ledger-state-from-string (match-string num)))))
- (cond ((eq state 'cleared) (nth 0 faces))
- ((eq state 'pending) (nth 1 faces))
- (t (nth 2 faces)))))
-
-(defun ledger-font-face-by-timeclock-state (num faces)
- "Choose one of two faces depending on a timeclock directive character.
-NUM specifies a match group containing the character.
-FACES has the form (CLEARED UNCLEARED).
-Return CLEARED if the character specifies a cleared transaction,
-UNCLEARED otherwise."
- (if (member (match-string num) '("I" "O"))
- (nth 0 faces)
- (nth 1 faces)))
-
-(defun ledger-font-subdirectives (subdirectives)
- "Construct anchored highlighters for subdirectives.
-
-Each element of SUBDIRECTIVES should have the form (MATCHER
-SUBEXP-HIGHLIGHTERS…). The result will be a list of elements of
-the form (MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS) with
-PRE-FORM and POST-FORM set to appropriate values.
-
-See `font-lock-keywords' for the full description."
-
- (mapcar (lambda (item)
- `(,(car item)
- (save-excursion
- (save-match-data
- (ledger-navigate-end-of-xact))
- (point))
- (goto-char (match-end 0))
- ,@(cdr item)))
- subdirectives))
-
-(defvar ledger-font-lock-keywords
- `(("^[;#%|*].*$" . 'ledger-font-comment-face)
- ("^\\(account\\)\\(?:[[:blank:]]\\(.*\\)\\)?$"
- (1 'ledger-font-account-directive-face)
- (2 'ledger-font-account-name-face nil :lax)
- ,@(ledger-font-subdirectives
- '(("^[ \t]+\\(;.*\\)" (1 'ledger-font-comment-face))
- ("^[ \t]+\\(note\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-note-directive-face)
- (2 'ledger-font-note-text-face nil :lax))
- ("^[ \t]+\\(alias\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-alias-directive-face)
- (2 'ledger-font-account-name-face nil :lax))
- ("^[ \t]+\\(payee\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-payee-directive-face)
- (2 'ledger-font-payee-regex-face nil :lax))
- ("^[ \t]+\\(check\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-check-directive-face)
- (2 'ledger-font-check-condition-face nil :lax))
- ("^[ \t]+\\(assert\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-assert-directive-face)
- (2 'ledger-font-assert-condition-face nil :lax))
- ("^[ \t]+\\(eval\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-expr-directive-face)
- (2 'ledger-font-expr-expression-face nil :lax))
- ("^[ \t]+\\(default\\)\\>.*"
- (1 'ledger-font-default-directive-face)))))
- ("^\\(alias\\)\\(?:[[:blank:]]+\\([^=\n]*\\)\\(?:=\\(.*\\)\\)?\\)?$"
- (1 'ledger-font-alias-directive-face)
- (2 'ledger-font-account-name-face nil :lax)
- (3 'ledger-font-alias-definition-face nil :lax))
- (,(concat "^\\(apply\\)\\(?:[[:blank:]]+"
- "\\(?:\\(account\\)\\(?:[[:blank:]]+\\(.*\\)\\)?"
- "\\|\\(tag\\)\\(?:[[:blank:]]+\\(.*\\)\\)?\\)\\)?$")
- (1 'ledger-font-apply-directive-face)
- (2 'ledger-font-apply-directive-face nil :lax)
- (3 'ledger-font-apply-account-face nil :lax)
- (4 'ledger-font-apply-directive-face nil :lax)
- (5 'ledger-font-apply-tag-face nil :lax))
- ("^\\(assert\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-assert-directive-face)
- (2 'ledger-font-assert-condition-face nil :lax))
- ("^\\(bucket\\|A\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-bucket-directive-face)
- (2 'ledger-font-bucket-account-face nil :lax))
- (,(concat "^\\(C\\)"
- "\\(?:[[:blank:]]+\\([^=\n]*?\\)[[:blank:]]*"
- "\\(?:=[[:blank:]]*\\(.*\\)\\)?\\)?$")
- (1 'ledger-font-C-directive-face)
- (2 'ledger-font-C-amount-face nil :lax)
- (3 'ledger-font-C-amount-face nil :lax))
- (,(concat "^\\(capture\\)"
- "\\(?:[[:blank:]]+\\(.*?\\)"
- "\\(?:\\(?:\t\\|[ \t]\\{2,\\}\\)\\(.*\\)\\)?\\)?$")
- (1 'ledger-font-capture-directive-face)
- (2 'ledger-font-capture-account-face nil :lax)
- (3 'ledger-font-capture-regex-face nil :lax))
- ("^\\(check\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-check-directive-face)
- (2 'ledger-font-check-condition-face nil :lax))
- (,(concat "^\\(?:comment\\|test\\)\\>"
- "[^\0]*?\n"
- "end[[:blank:]]+\\(?:comment\\|test\\)\\>.*\n")
- . 'ledger-font-comment-face)
- ("^\\(commodity\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-commodity-directive-face)
- (2 'ledger-font-commodity-name-face nil :lax)
- ,@(ledger-font-subdirectives
- '(("^[ \t]+\\(;.*\\)" (1 'ledger-font-comment-face))
- ("^[ \t]+\\(note\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-note-directive-face)
- (2 'ledger-font-note-text-face nil :lax))
- ("^[ \t]+\\(format\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-format-directive-face)
- (2 'ledger-font-commodity-format-face nil :lax))
- ("^[ \t]+\\(nomarket\\)\\>.*"
- (1 'ledger-font-N-directive-face))
- ("^[ \t]+\\(default\\)\\>.*"
- (1 'ledger-font-default-directive-face)))))
- ("^\\(D\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-D-directive-face)
- (2 'ledger-font-commodity-format-face nil :lax))
- (,(concat "^\\(define\\|def\\)"
- "\\(?:[[:blank:]]+\\([^=\n]*?\\)[[:blank:]]*"
- "\\(?:=[[:blank:]]*\\(.*\\)\\)?\\)?$")
- (1 'ledger-font-define-directive-face)
- (2 'ledger-font-define-name-face nil :lax)
- (3 'ledger-font-define-body-face nil :lax))
- (,(concat "^\\(end\\)"
- "\\(?:[[:blank:]]+\\(apply\\)"
- "\\(?:[[:blank:]]+\\(account\\|tag\\)\\>.*\\)?\\)?$")
- (1 'ledger-font-end-directive-face)
- (2 'ledger-font-end-directive-face nil :lax)
- (3 'ledger-font-end-directive-face nil :lax))
- ("^\\(endfixed\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-end-directive-face)
- (2 'ledger-font-fixed-commodity-face nil :lax))
- ("^\\(expr\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-expr-directive-face)
- (2 'ledger-font-expr-expression-face nil :lax))
- ("^\\(fixed\\)\\(?:[[:blank:]]+\\([^[:blank:]\n]+\\)\\(?:[[:blank:]]+\\(.*\\)\\)?\\)?$"
- (1 'ledger-font-fixed-directive-face)
- (2 'ledger-font-fixed-commodity-face nil :lax)
- (3 'ledger-font-fixed-price-face nil :lax))
- ("^\\(include\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-include-directive-face)
- (2 'ledger-font-include-filename-face nil :lax))
- ("^\\(N\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-N-directive-face)
- (2 'ledger-font-N-symbol-face nil :lax))
- ("^\\(payee\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-payee-directive-face)
- (2 'ledger-font-payee-name-face nil :lax)
- ,@(ledger-font-subdirectives
- '(("^[ \t]+\\(;.*\\)" (1 'ledger-font-comment-face))
- ("^[ \t]+\\(alias\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-alias-directive-face)
- (2 'ledger-font-payee-regex-face nil :lax))
- ("^[ \t]+\\(uuid\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-uuid-directive-face)
- (2 'ledger-font-uuid-face nil :lax)))))
- (,(concat "^\\(P\\)"
- "\\(?:[[:blank:]]+\\([^[:blank:]\n]+"
- "\\(?:[[:blank:]]+[[:digit:]][^[:blank:]\n]*\\)?\\)"
- "\\(?:[[:blank:]]+\\([^[:blank:]\n]+\\)"
- "\\(?:[[:blank:]]+\\(.*\\)\\)?\\)?\\)?$")
- (1 'ledger-font-price-directive-face)
- (2 'ledger-font-price-date-face nil :lax)
- (3 'ledger-font-price-symbol-face nil :lax)
- (4 'ledger-font-price-face nil :lax))
- ("^\\(tag\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-tag-directive-face)
- (2 'ledger-font-tag-name-face nil :lax)
- ,@(ledger-font-subdirectives
- '(("^[ \t]+\\(;.*\\)" (1 'ledger-font-comment-face))
- ("^[ \t]+\\(check\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-check-directive-face)
- (2 'ledger-font-check-condition-face nil :lax))
- ("^[ \t]+\\(assert\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-assert-directive-face)
- (2 'ledger-font-assert-condition-face nil :lax)))))
- (,(concat "^\\([IiOo]\\)"
- "\\(?:[[:blank:]]+\\([^[:blank:]\n]+"
- "\\(?:[[:blank:]]+[^[:blank:]\n]+\\)?\\)"
- "\\(?:[[:blank:]]+\\(.*?\\)"
- "\\(?:\t\\|[ \t]\\{2,\\}\\(.*?\\)"
- "\\(?:\t\\|[ \t]\\{2,\\}\\(;.*\\)\\)?\\)?\\)?\\)?$")
- (1 'ledger-font-timeclock-directive-face)
- (2 'ledger-font-posting-date-face nil :lax)
- (3 (ledger-font-face-by-timeclock-state 1 '(ledger-font-posting-account-cleared-face
- ledger-font-posting-account-face)) nil :lax)
- (4 (ledger-font-face-by-timeclock-state 1 '(ledger-font-payee-cleared-face
- ledger-font-payee-uncleared-face)) nil :lax)
- (5 'ledger-font-comment-face nil :lax))
- ("^\\([bh]\\)\\>.*$" (1 'ledger-font-timeclock-directive-face))
- ("^\\(year\\|Y\\)\\(?:[[:blank:]]+\\(.*\\)\\)?$"
- (1 'ledger-font-year-directive-face)
- (2 'ledger-font-year-face nil :lax))
-
- (,(lambda (limit)
- (when ledger-fontify-xact-state-overrides
- (re-search-forward
- (concat "^\\(?:\\([=~]\\)[ \t].*\\|" ; auto/periodic, subexpr 1
- "[[:digit:]][^ \t\n]*" ; date
- "[ \t]+\\([*!]\\)" ; mark, subexp 2
- ".*\\)" ; rest of header
- "\\(?:\n[ \t]+.*\\)*" ; postings
- )
- limit t)))
- (0 (cond ((equal "=" (match-string 1)) 'ledger-font-auto-xact-face)
- ((equal "~" (match-string 1)) 'ledger-font-periodic-xact-face)
- (t (ledger-font-face-by-state 2 '(ledger-font-xact-cleared-face
- ledger-font-xact-pending-face))))))
- (,(concat "^\\(?:\\(\\([=~]\\).*\\)\\|" ; auto/periodic, subexp 1, 2
- "\\([[:digit:]][^ \t\n]*\\)" ; date, subexp 3
- ledger-xact-after-date-regex "\\)") ; mark 4, code 5, desc 6, comment 7
- (1 (cond ((equal "=" (match-string 2)) 'ledger-font-auto-xact-face)
- ((equal "~" (match-string 2)) 'ledger-font-periodic-xact-face)
- (t 'ledger-font-default-face))
- nil :lax)
- (3 'ledger-font-posting-date-face nil :lax)
- (5 'ledger-font-code-face nil :lax)
- (6 (ledger-font-face-by-state 4 '(ledger-font-payee-cleared-face
- ledger-font-payee-pending-face
- ledger-font-payee-uncleared-face))
- nil :lax)
- (7 'ledger-font-comment-face nil :lax)
- ,@(ledger-font-subdirectives
- `(("^[ \t]+\\(;.*\\)"
- (1 'ledger-font-comment-face))
- (,ledger-posting-regex ; state and account 1, state 2, account 3, amount 4, comment 5
- (1 (ledger-font-face-by-state 2 '(ledger-font-posting-account-cleared-face
- ledger-font-posting-account-pending-face
- ledger-font-posting-account-face))
- nil :lax)
- (4 (ledger-font-face-by-state 2 '(ledger-font-posting-amount-cleared-face
- ledger-font-posting-amount-pending-face
- ledger-font-posting-amount-face))
- nil :lax)
- (5 'ledger-font-comment-face nil :lax))))))
- "Expressions to highlight in Ledger mode.")
-
-
-
-(provide 'ledger-fonts)
-
-;;; ledger-fonts.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-init.el b/elpa/ledger-mode-20200530.1710/ledger-init.el
deleted file mode 100644
index ce39066..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-init.el
+++ /dev/null
@@ -1,98 +0,0 @@
-;;; ledger-init.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Determine the ledger environment
-
-(require 'ledger-regex)
-
-;;; Code:
-
-(defcustom ledger-init-file-name "~/.ledgerrc"
- "Location of the ledger initialization file. nil if you don't have one."
- :type 'file
- :group 'ledger-exec)
-
-(defvar ledger-environment-alist nil
- "Variable to hold details about ledger-mode's environment.
-
-Adding the dotted pair (\"decimal-comma\" . t) will tell ledger
-to treat commas as decimal separator.")
-
-(defcustom ledger-default-date-format "%Y/%m/%d"
- "The date format that ledger uses throughout.
-Set this to the value of `ledger-iso-date-format' if you prefer
-ISO 8601 dates."
- :type 'string
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger)
-
-(defconst ledger-iso-date-format "%Y-%m-%d"
- "The format for ISO 8601 dates.")
-
-(defun ledger-format-date (&optional date)
- "Format DATE according to the current preferred date format.
-Returns the current date if DATE is nil or not supplied."
- (format-time-string
- (or (cdr (assoc "input-date-format" ledger-environment-alist))
- ledger-default-date-format)
- date))
-
-
-(defun ledger-init-parse-initialization (buffer)
- "Parse the .ledgerrc file in BUFFER."
- (with-current-buffer buffer
- (let (environment-alist)
- (goto-char (point-min))
- (while (re-search-forward ledger-init-string-regex nil t )
- (let ((matchb (match-beginning 0)) ;; save the match data, string-match stamp on it
- (matche (match-end 0)))
- (end-of-line)
- (setq environment-alist
- (append environment-alist
- (list (cons (let ((flag (buffer-substring-no-properties (+ 2 matchb) matche)))
- (if (string-match "[ \t\n\r]+\\'" flag)
- (replace-match "" t t flag)
- flag))
- (let ((value (buffer-substring-no-properties matche (point) )))
- (if (> (length value) 0)
- value
- t))))))))
- environment-alist)))
-
-(defun ledger-init-load-init-file ()
- "Load and parse the .ledgerrc file."
- (interactive)
- (let ((init-base-name (file-name-nondirectory ledger-init-file-name)))
- (if (get-buffer init-base-name) ;; init file already loaded, parse it and leave it
- (setq ledger-environment-alist
- (ledger-init-parse-initialization init-base-name))
- (when (and ledger-init-file-name
- (file-exists-p ledger-init-file-name)
- (file-readable-p ledger-init-file-name))
- (let ((init-buffer (find-file-noselect ledger-init-file-name)))
- (setq ledger-environment-alist
- (ledger-init-parse-initialization init-buffer))
- (kill-buffer init-buffer))))))
-
-(provide 'ledger-init)
-
-;;; ledger-init.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-mode-autoloads.el b/elpa/ledger-mode-20200530.1710/ledger-mode-autoloads.el
deleted file mode 100644
index e9f7fad..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-mode-autoloads.el
+++ /dev/null
@@ -1,193 +0,0 @@
-;;; ledger-mode-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "ledger-check" "ledger-check.el" (0 0 0 0))
-;;; Generated autoloads from ledger-check.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-check" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-commodities" "ledger-commodities.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from ledger-commodities.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-commodities" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-complete" "ledger-complete.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from ledger-complete.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-complete" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-context" "ledger-context.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from ledger-context.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-context" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-exec" "ledger-exec.el" (0 0 0 0))
-;;; Generated autoloads from ledger-exec.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-exec" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-flymake" "ledger-flymake.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from ledger-flymake.el
-
-(autoload 'ledger-flymake-enable "ledger-flymake" "\
-Enable `flymake-mode' in `ledger-mode' buffers.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-flymake" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-fontify" "ledger-fontify.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from ledger-fontify.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-fontify" '("ledger-fontify-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-fonts" "ledger-fonts.el" (0 0 0 0))
-;;; Generated autoloads from ledger-fonts.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-fonts" '("ledger-font-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-init" "ledger-init.el" (0 0 0 0))
-;;; Generated autoloads from ledger-init.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-init" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-mode" "ledger-mode.el" (0 0 0 0))
-;;; Generated autoloads from ledger-mode.el
-
-(autoload 'ledger-mode "ledger-mode" "\
-A mode for editing ledger data files.
-
-\(fn)" t nil)
-
-(add-to-list 'auto-mode-alist '("\\.ledger\\'" . ledger-mode))
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-mode" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-navigate" "ledger-navigate.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from ledger-navigate.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-navigate" '("ledger-navigate-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-occur" "ledger-occur.el" (0 0 0 0))
-;;; Generated autoloads from ledger-occur.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-occur" '("ledger-occur")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-post" "ledger-post.el" (0 0 0 0))
-;;; Generated autoloads from ledger-post.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-post" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-reconcile" "ledger-reconcile.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from ledger-reconcile.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-reconcile" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-regex" "ledger-regex.el" (0 0 0 0))
-;;; Generated autoloads from ledger-regex.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-regex" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-report" "ledger-report.el" (0 0 0 0))
-;;; Generated autoloads from ledger-report.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-report" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-schedule" "ledger-schedule.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from ledger-schedule.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-schedule" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-sort" "ledger-sort.el" (0 0 0 0))
-;;; Generated autoloads from ledger-sort.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-sort" '("ledger-sort-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-state" "ledger-state.el" (0 0 0 0))
-;;; Generated autoloads from ledger-state.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-state" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-test" "ledger-test.el" (0 0 0 0))
-;;; Generated autoloads from ledger-test.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-test" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-texi" "ledger-texi.el" (0 0 0 0))
-;;; Generated autoloads from ledger-texi.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-texi" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil "ledger-xact" "ledger-xact.el" (0 0 0 0))
-;;; Generated autoloads from ledger-xact.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ledger-xact" '("ledger-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("ledger-mode-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; ledger-mode-autoloads.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-mode-pkg.el b/elpa/ledger-mode-20200530.1710/ledger-mode-pkg.el
deleted file mode 100644
index ce567d1..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-mode-pkg.el
+++ /dev/null
@@ -1,6 +0,0 @@
-(define-package "ledger-mode" "20200530.1710" "Helper code for use with the \"ledger\" command-line tool"
- '((emacs "25.1"))
- :commit "f8463744191b4feb9fea54190917663f7ba26102")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/ledger-mode-20200530.1710/ledger-mode.el b/elpa/ledger-mode-20200530.1710/ledger-mode.el
deleted file mode 100644
index 3463da1..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-mode.el
+++ /dev/null
@@ -1,334 +0,0 @@
-;;; ledger-mode.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; Package-Requires: ((emacs "25.1"))
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Most of the general ledger-mode code is here.
-
-;;; Code:
-
-(require 'ledger-regex)
-(require 'org)
-(require 'ledger-commodities)
-(require 'ledger-complete)
-(require 'ledger-context)
-(require 'ledger-exec)
-(require 'ledger-fonts)
-(require 'ledger-fontify)
-(require 'ledger-init)
-(require 'ledger-navigate)
-(require 'ledger-occur)
-(require 'ledger-post)
-(require 'ledger-reconcile)
-(require 'ledger-report)
-(require 'ledger-sort)
-(require 'ledger-state)
-(require 'ledger-test)
-(require 'ledger-texi)
-(require 'ledger-xact)
-(require 'ledger-schedule)
-(require 'ledger-check)
-
-(declare-function custom-group-members "cus-edit" (symbol groups-only))
-
-;;; Code:
-
-(defgroup ledger nil
- "Interface to the Ledger command-line accounting program."
- :group 'data)
-
-(defconst ledger-version "3.0"
- "The version of ledger.el currently loaded.")
-
-(defconst ledger-mode-version "4.0.0")
-
-(defun ledger-mode-dump-variable (var)
- "Format VAR for dump to buffer."
- (if var
- (insert (format " %s: %S\n" (symbol-name var) (eval var)))))
-
-(defun ledger-mode-dump-group (group)
- "Dump GROUP customizations to current buffer."
- (require 'cus-edit)
- (let ((members (custom-group-members group nil)))
- (dolist (member members)
- (cond ((eq (cadr member) 'custom-group)
- (insert (format "Group %s:\n" (symbol-name (car member))))
- (ledger-mode-dump-group (car member)))
- ((eq (cadr member) 'custom-variable)
- (ledger-mode-dump-variable (car member)))))))
-
-(defun ledger-mode-dump-configuration ()
- "Dump all customizations."
- (interactive)
- (find-file "ledger-mode-dump")
- (ledger-mode-dump-group 'ledger))
-
-(defun ledger-read-account-with-prompt (prompt)
- "Read an account from the minibuffer with PROMPT."
- (let* ((context (ledger-context-at-point))
- (account (ledger-context-field-value context 'account)))
- (ledger-completing-read-with-default prompt
- (when account
- (regexp-quote account))
- (ledger-accounts-list))))
-
-(defun ledger-read-date (prompt)
- "Return user-supplied date after `PROMPT', defaults to today.
-This uses `org-read-date', which see."
- (ledger-format-date (let ((org-read-date-prefer-future nil))
- (org-read-date nil t nil prompt))))
-
-(defun ledger-get-minibuffer-prompt (prompt default)
- "Return a string composing of PROMPT and DEFAULT appropriate for a minibuffer prompt."
- (concat prompt
- (if default
- (concat " (" default "): ")
- ": ")))
-
-(defun ledger-completing-read-with-default (prompt default collection)
- "Return a user supplied string after PROMPT, or DEFAULT while providing completions from COLLECTION."
- (completing-read (ledger-get-minibuffer-prompt prompt default)
- collection nil nil nil 'ledger-minibuffer-history default))
-
-(defun ledger-read-string-with-default (prompt default)
- "Return user supplied string after PROMPT, or DEFAULT."
- (read-string (ledger-get-minibuffer-prompt prompt default)
- nil 'ledger-minibuffer-history default))
-
-(defun ledger-display-balance-at-point (&optional arg)
- "Display the cleared-or-pending balance.
-And calculate the target-delta of the account being reconciled.
-
-With ARG (\\[universal-argument]) ask for the target commodity and convert
-the balance into that."
- (interactive "P")
- (let* ((account (ledger-read-account-with-prompt "Account balance to show"))
- (target-commodity (when arg (ledger-read-commodity-with-prompt "Target commodity: ")))
- (buffer (find-file-noselect (ledger-master-file)))
- (balance (with-temp-buffer
- (apply 'ledger-exec-ledger buffer (current-buffer) "cleared" account
- (when target-commodity (list "-X" target-commodity)))
- (if (> (buffer-size) 0)
- (buffer-substring-no-properties (point-min) (1- (point-max)))
- (concat account " is empty.")))))
- (when balance
- (message balance))))
-
-(defun ledger-display-ledger-stats ()
- "Display the cleared-or-pending balance.
-And calculate the target-delta of the account being reconciled."
- (interactive)
- (let* ((buffer (find-file-noselect (ledger-master-file)))
- (balance (with-temp-buffer
- (ledger-exec-ledger buffer (current-buffer) "stats")
- (buffer-substring-no-properties (point-min) (1- (point-max))))))
- (when balance
- (message balance))))
-
-(defvar ledger-mode-abbrev-table)
-
-(defvar ledger-date-string-today (ledger-format-date))
-
-(defun ledger-remove-effective-date ()
- "Remove the effective date from a transaction or posting."
- (interactive)
- (let ((context (car (ledger-context-at-point))))
- (save-excursion
- (save-restriction
- (narrow-to-region (point-at-bol) (point-at-eol))
- (beginning-of-line)
- (cond ((eq 'xact context)
- (re-search-forward ledger-iso-date-regexp)
- (when (= (char-after) ?=)
- (let ((eq-pos (point)))
- (delete-region
- eq-pos
- (re-search-forward ledger-iso-date-regexp)))))
- ((eq 'acct-transaction context)
- ;; Match "; [=date]" & delete string
- (when (re-search-forward
- (concat ledger-comment-regex
- "\\[=" ledger-iso-date-regexp "\\]")
- nil 'noerr)
- (replace-match ""))))))))
-
-(defun ledger-insert-effective-date (&optional date)
- "Insert effective date `DATE' to the transaction or posting.
-
-If `DATE' is nil, prompt the user a date.
-
-Replace the current effective date if there's one in the same
-line.
-
-With a prefix argument, remove the effective date."
- (interactive)
- (if (and (listp current-prefix-arg)
- (= 4 (prefix-numeric-value current-prefix-arg)))
- (ledger-remove-effective-date)
- (let* ((context (car (ledger-context-at-point)))
- (date-string (or date (ledger-read-date "Effective date: "))))
- (save-restriction
- (narrow-to-region (point-at-bol) (point-at-eol))
- (cond
- ((eq 'xact context)
- (beginning-of-line)
- (re-search-forward ledger-iso-date-regexp)
- (when (= (char-after) ?=)
- (ledger-remove-effective-date))
- (insert "=" date-string))
- ((eq 'acct-transaction context)
- (end-of-line)
- (ledger-remove-effective-date)
- (insert " ; [=" date-string "]")))))))
-
-(defun ledger-mode-remove-extra-lines ()
- "Get rid of multiple empty lines."
- (goto-char (point-min))
- (while (re-search-forward "\n\n\\(\n\\)+" nil t)
- (replace-match "\n\n")))
-
-(defun ledger-mode-clean-buffer ()
- "Indent, remove multiple line feeds and sort the buffer."
- (interactive)
- (let ((start (point-min-marker))
- (end (point-max-marker)))
- (ledger-navigate-beginning-of-xact)
- (beginning-of-line)
- (let ((target (buffer-substring (point) (progn
- (end-of-line)
- (point)))))
- (goto-char start)
- (untabify start end)
- (ledger-sort-buffer)
- (ledger-post-align-postings start end)
- (ledger-mode-remove-extra-lines)
- (goto-char start)
- (search-forward target))))
-
-(defvar ledger-mode-syntax-table
- (let ((table (make-syntax-table text-mode-syntax-table)))
- (modify-syntax-entry ?\; "<" table)
- (modify-syntax-entry ?\n ">" table)
- table)
- "Syntax table in use in `ledger-mode' buffers.")
-
-(defvar ledger-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-c C-a") #'ledger-add-transaction)
- (define-key map (kbd "C-c C-b") #'ledger-post-edit-amount)
- (define-key map (kbd "C-c C-c") #'ledger-toggle-current)
- (define-key map (kbd "C-c C-d") #'ledger-delete-current-transaction)
- (define-key map (kbd "C-c C-e") #'ledger-toggle-current-transaction)
- (define-key map (kbd "C-c C-f") #'ledger-occur)
- (define-key map (kbd "C-c C-k") #'ledger-copy-transaction-at-point)
- (define-key map (kbd "C-c C-r") #'ledger-reconcile)
- (define-key map (kbd "C-c C-s") #'ledger-sort-region)
- (define-key map (kbd "C-c C-t") #'ledger-insert-effective-date)
- (define-key map (kbd "C-c C-u") #'ledger-schedule-upcoming)
- (define-key map (kbd "C-c C-p") #'ledger-display-balance-at-point)
- (define-key map (kbd "C-c C-l") #'ledger-display-ledger-stats)
- (define-key map (kbd "C-c C-q") #'ledger-post-align-xact)
-
- (define-key map (kbd "C-TAB") #'ledger-post-align-xact)
- (define-key map (kbd "C-c TAB") #'ledger-fully-complete-xact)
- (define-key map (kbd "C-c C-i") #'ledger-fully-complete-xact)
-
- (define-key map (kbd "C-c C-o C-a") #'ledger-report-redo)
- (define-key map (kbd "C-c C-o C-e") #'ledger-report-edit-report)
- (define-key map (kbd "C-c C-o C-g") #'ledger-report-goto)
- (define-key map (kbd "C-c C-o C-k") #'ledger-report-quit)
- (define-key map (kbd "C-c C-o C-r") #'ledger-report)
- (define-key map (kbd "C-c C-o C-s") #'ledger-report-save)
-
- (define-key map (kbd "M-p") #'ledger-navigate-prev-xact-or-directive)
- (define-key map (kbd "M-n") #'ledger-navigate-next-xact-or-directive)
- (define-key map (kbd "M-q") #'ledger-post-align-dwim)
-
- ;; Reset the `text-mode' override of this standard binding
- (define-key map (kbd "C-M-i") 'completion-at-point)
- map)
- "Keymap for `ledger-mode'.")
-
-(easy-menu-define ledger-mode-menu ledger-mode-map
- "Ledger menu"
- '("Ledger"
- ["Narrow to REGEX" ledger-occur]
- ["Show all transactions" ledger-occur-mode ledger-occur-mode]
- ["Ledger Statistics" ledger-display-ledger-stats ledger-works]
- "---"
- ["Show upcoming transactions" ledger-schedule-upcoming]
- ["Add Transaction (ledger xact)" ledger-add-transaction ledger-works]
- ["Complete Transaction" ledger-fully-complete-xact]
- ["Delete Transaction" ledger-delete-current-transaction]
- "---"
- ["Calc on Amount" ledger-post-edit-amount]
- "---"
- ["Check Balance" ledger-display-balance-at-point ledger-works]
- ["Reconcile Account" ledger-reconcile ledger-works]
- "---"
- ["Toggle Current Transaction" ledger-toggle-current-transaction]
- ["Toggle Current Posting" ledger-toggle-current]
- ["Copy Trans at Point" ledger-copy-transaction-at-point]
- "---"
- ["Clean-up Buffer" ledger-mode-clean-buffer]
- ["Check Buffer" ledger-check-buffer ledger-works]
- ["Align Region" ledger-post-align-postings mark-active]
- ["Align Xact" ledger-post-align-xact]
- ["Sort Region" ledger-sort-region mark-active]
- ["Sort Buffer" ledger-sort-buffer]
- ["Mark Sort Beginning" ledger-sort-insert-start-mark]
- ["Mark Sort End" ledger-sort-insert-end-mark]
- ["Set effective date" ledger-insert-effective-date]
- "---"
- ["Customize Ledger Mode" (lambda () (interactive) (customize-group 'ledger))]
- "---"
- ["Run Report" ledger-report ledger-works]
- ["Goto Report" ledger-report-goto ledger-works]
- ["Re-run Report" ledger-report-redo ledger-works]
- ["Save Report" ledger-report-save ledger-works]
- ["Edit Report" ledger-report-edit-report ledger-works]
- ["Quit Report" ledger-report-quit ledger-works]))
-
-;;;###autoload
-(define-derived-mode ledger-mode text-mode "Ledger"
- "A mode for editing ledger data files."
- (ledger-check-version)
- (setq font-lock-defaults
- '(ledger-font-lock-keywords t nil nil nil))
- (add-hook 'font-lock-extend-region-functions 'ledger-fontify-extend-region)
- (add-hook 'completion-at-point-functions #'ledger-complete-at-point nil t)
- (add-hook 'after-save-hook 'ledger-report-redo nil t)
-
- (add-hook 'post-command-hook 'ledger-highlight-xact-under-point nil t)
-
- (ledger-init-load-init-file)
- (setq-local comment-start ";")
- (setq-local indent-line-function #'ledger-indent-line)
- (setq-local indent-region-function 'ledger-post-align-postings))
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.ledger\\'" . ledger-mode))
-
-(provide 'ledger-mode)
-
-;;; ledger-mode.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-mode.info b/elpa/ledger-mode-20200530.1710/ledger-mode.info
deleted file mode 100644
index a6b97c0..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-mode.info
+++ /dev/null
@@ -1,1526 +0,0 @@
-This is ledger-mode.info, produced by makeinfo version 6.5 from
-ledger-mode.texi.
-
-Copyright © 2013, Craig Earls. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- • Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- • Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the
- distribution.
-
- • Neither the name of New Artisans LLC nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Ledger Mode: (ledger-mode). Command-Line Accounting
-END-INFO-DIR-ENTRY
-
-
-File: ledger-mode.info, Node: Top, Next: Introduction to Ledger-mode, Prev: (dir), Up: (dir)
-
-Overview
-********
-
-Ledger is a command line accounting tool that provides double-entry
-accounting based on a text journal. It provides no bells or whistles,
-and returns the user to the days before user interfaces were even a
-1twinkling in their father’s CRT.
-
- Ledger-mode assists you in maintaining input files for Ledger,
-running reports and much more...
-
-* Menu:
-
-* Introduction to Ledger-mode::
-* The Ledger Buffer::
-* The Reconcile Buffer::
-* The Report Buffer::
-* Scheduling Transactions::
-* Customizing Ledger-mode::
-* Generating Ledger Regression Tests::
-* Embedding Example results in Ledger Documentation::
-* Hacking Ledger-mode::
-* Concept Index::
-* Command & Variable Index::
-* Keystroke Index::
-
-
-File: ledger-mode.info, Node: Introduction to Ledger-mode, Next: The Ledger Buffer, Prev: Top, Up: Top
-
-1 Introduction to Ledger-mode
-*****************************
-
-* Menu:
-
-* Quick Installation::
-* Menus::
-* Quick Demo::
-
-
-File: ledger-mode.info, Node: Quick Installation, Next: Menus, Prev: Introduction to Ledger-mode, Up: Introduction to Ledger-mode
-
-1.1 Quick Installation
-======================
-
-The Emacs lisp source for Ledger-mode is included with the source
-distribution of Ledger. It is entirely included in the ‘lisp’
-subdirectory. To use Ledger-mode, include the following in your Emacs
-initialization file (‘~/.emacs’, ‘~/.emacs.d/init.el’, or
-‘~/.Aquamacs/Preferences.el’).
-
- (autoload 'ledger-mode "ledger-mode" "A major mode for Ledger" t)
- (add-to-list 'load-path
- (expand-file-name "/path/to/ledger/source/lisp/"))
- (add-to-list 'auto-mode-alist '("\\.ledger$" . ledger-mode))
-
- This sets up Emacs to automatically recognize files that end with
-‘.ledger’ and start Ledger-mode. Nothing else should be required as
-long as the ledger command line utility is properly installed.
-
-
-File: ledger-mode.info, Node: Menus, Next: Quick Demo, Prev: Quick Installation, Up: Introduction to Ledger-mode
-
-1.2 Menus
-=========
-
-The vast majority of Ledger-mode functionality is available from the
-Emacs menu system. The keystrokes are shown in the menu to help you
-learn the faster keyboard methods.
-
-
-File: ledger-mode.info, Node: Quick Demo, Prev: Menus, Up: Introduction to Ledger-mode
-
-1.3 Quick Demo
-==============
-
-Load the demo file ‘demo.ledger’ from the Ledger source ‘test/input’
-directory. The ledger will be loaded and font highlighted. At this
-point you could manually edit transactions and run Ledger from a
-convenient command line.
-
-* Menu:
-
-* Quick Add::
-* Reconciliation::
-* Reports::
-* Narrowing::
-
-
-File: ledger-mode.info, Node: Quick Add, Next: Reconciliation, Prev: Quick Demo, Up: Quick Demo
-
-1.3.1 Quick Add
----------------
-
-As simple as the Ledger transaction format is, it can still be daunting
-to add many transactions manually. Ledger provides two ways to add
-transactions with minimal typing. Both are based on the idea that most
-transactions are repetitions of earlier transactions.
-
- In the ‘demo.ledger’ buffer enter a date using the correct format.
-Then type the first few characters of another payee in the ‘demo.ledger’
-buffer. Type ‘C-c TAB’. Ledger-mode will search for a Payee that has
-the same beginning and copy the rest of the transaction to you new
-entry.
-
- Additionally you can use the ledger ‘xact’ command, by either typing
-‘C-c C-a’ or using ‘Add Transaction’ menu entry. Then typing a close
-match to the payee. Ledger-mode will call ‘ledger xact’ with the data
-you enter and place the transaction in the proper chronological place in
-the ledger. Subsequent calls to ‘C-c C-a’ remember the last date so
-entering many dates in the past is easy. The date format can be changed
-by modifying ‘ledger-default-date-format’.
-
-
-File: ledger-mode.info, Node: Reconciliation, Next: Reports, Prev: Quick Add, Up: Quick Demo
-
-1.3.2 Reconciliation
---------------------
-
-The biggest task of maintaining a ledger is ensuring that it matches the
-outside world. This process is called reconciliation (*note Basics of
-Reconciliation::) and can be quite onerous. Ledger-mode attempts to
-make it as painless as possible.
-
- In the ‘demo.ledger’ buffer type ‘C-c C-r’. If cursor is on an
-account, Ledger-mode will propose this account, or in the Minibuffer,
-will prompt for an account to reconcile. Hit ‘RET’ if you are happy
-with proposed account, or enter ‘Checking’ as example. Emacs will then
-prompt for a target value. The target value is the amount you want the
-cleared transactions in the buffer to total. Normally this would be the
-ending value from your bank statement, or the latest value in your
-on-line transaction summary. Enter ‘1710’. Note that Ledger-mode
-assumes you are using ‘$’ (USD) as your default commodity, this can be
-easily changed in the customization variables. *Note Ledger-mode
-Customization::.
-
- You now see a list of uncleared transactions in a buffer below the
-‘demo.ledger’ buffer. Touching the ‘SPC’ bar will mark a transaction as
-pending and display the current cleared (and pending) balance, along
-with the difference remaining to meet your target. Clear the first
-three transactions, and you will see the difference to target reach
-‘$0’. End the reconciliation by typing ‘C-c C-c’. This saves the
-‘demo.ledger’ buffer and marks the transactions and finally cleared.
-Type ‘q’ to close out the reconciliation buffer.
-
-
-File: ledger-mode.info, Node: Reports, Next: Narrowing, Prev: Reconciliation, Up: Quick Demo
-
-1.3.3 Reports
--------------
-
-The real power of Ledger is in its reporting capabilities. Reports can
-be run and displayed in a separate Emacs buffer. In the ‘demo.ledger’
-buffer, type ‘C-c C-o C-r’. In the Minibuffer Emacs will prompt for a
-report name. There are a few built-in reports, and you can add any
-report you need *Note Adding and Editing Reports::.
-
- In the Minibuffer type ‘account’. When prompted for an account type
-‘checking’. In a buffer named ‘*Ledger Report*’, you will see a Ledger
-register report. You can move around the buffer, with the point on a
-transaction, type ‘RET’. Ledger-mode will take you directly to that
-transaction in the ‘demo.ledger’ buffer.
-
- Another built-in report is the balance report. In the ‘demo.ledger’
-buffer, type ‘C-c C-o C-r’. When prompted for a report to run, type
-‘bal’, and a balance report of all accounts will be shown.
-
-
-File: ledger-mode.info, Node: Narrowing, Prev: Reports, Up: Quick Demo
-
-1.3.4 Narrowing
----------------
-
-A ledger file can get very large. It can be helpful to collapse the
-buffer to display only the transactions you are interested in.
-Ledger-mode copies the ‘occur’ mode functionality. Typing ‘C-c C-f’ and
-entering any regex in the Minibuffer will show only transactions that
-match the regex. The regex can be on any field, or amount. Use ‘C-c
-C-g’ after editing transactions to re-apply the current regex. Cancel
-the narrowing by typing ‘C-c C-f’ again.
-
-
-File: ledger-mode.info, Node: The Ledger Buffer, Next: The Reconcile Buffer, Prev: Introduction to Ledger-mode, Up: Top
-
-2 The Ledger Buffer
-*******************
-
-* Menu:
-
-* Navigating Transactions::
-* Adding Transactions::
-* Copying Transactions::
-* Editing Amounts::
-* Marking Transactions::
-* Formatting Transactions::
-* Deleting Transactions::
-* Sorting Transactions::
-* Narrowing Transactions::
-
-
-File: ledger-mode.info, Node: Navigating Transactions, Next: Adding Transactions, Prev: The Ledger Buffer, Up: The Ledger Buffer
-
-2.1 Navigating Transactions
-===========================
-
-In addition to the usual Emacs navigation commands, ledger-mode offers
-several additional commands to ease navigation. ‘M-n’ and ‘M-p’
-navigate between next and previous xacts or directives.
-
- Additionally, M-x ledger-navigate-previous-uncleared and M-x
-ledger-navigate-next-uncleared navigate to the next and precious
-uncleared transactions.
-
-
-File: ledger-mode.info, Node: Adding Transactions, Next: Copying Transactions, Prev: Navigating Transactions, Up: The Ledger Buffer
-
-2.2 Adding Transactions
-=======================
-
-Beyond the two ways of quickly adding transactions (*note Quick Add::)
-Ledger-mode assists you by providing robust ‘TAB’ completion for payees
-and accounts. Ledger-mode will scan the existing buffer for payees and
-accounts. Included files are not currently included in the completion
-scan. Ledger-mode respects Emacs’s variables that govern ‘TAB’
-completion, see especially ‘tab-always-indent’.
-
- To cycle between completions when hitting ‘TAB’ multiple times, you
-can adjust the standard completion configuration like this:
-
- (add-hook 'ledger-mode-hook
- (lambda ()
- (setq-local tab-always-indent 'complete)
- (setq-local completion-cycle-threshold t)
- (setq-local ledger-complete-in-steps t)))
-
- Ledger-mode will help you keep your amounts aligned. When indenting
-or completing, Ledger-mode will automatically place any amounts such
-that their last digit is aligned to the column specified by
-‘ledger-post-amount-alignment-column’, which defaults to ‘52’. *Note
-Ledger Post Customization Group::.
-
- To prevent the automatic realignment of amounts, disable
-‘ledger-post-auto-align’. *Note Ledger Post Customization Group::.
-
-* Menu:
-
-* Setting a Transactions Effective Date::
-* Quick Balance Display::
-
-
-File: ledger-mode.info, Node: Setting a Transactions Effective Date, Next: Quick Balance Display, Prev: Adding Transactions, Up: Adding Transactions
-
-2.2.1 Setting a Transactions Effective Date
--------------------------------------------
-
-Ledger provides for adding information to a transaction that add details
-to the dates. For example, you can specify when the transaction was
-entered, when the transaction was cleared, or when individual postings
-were cleared. Ledger-mode refers to these additional dates as
-_effective_ dates. To set the effective date of a transaction, place
-the point in the first line of a transaction and type ‘C-c C-t’. The
-effective date will be added to the transaction. To set the effective
-date for an individual posting, place point in the posting and type ‘C-c
-C-t’ and the effective date for that posting will be added at the end of
-the posting.
-
-
-File: ledger-mode.info, Node: Quick Balance Display, Prev: Setting a Transactions Effective Date, Up: Adding Transactions
-
-2.2.2 Quick Balance Display
----------------------------
-
-You will often want to quickly check the balance of an account. The
-easiest way is to position point on the account you are interested in,
-and type ‘C-c C-p’. The Minibuffer will ask you to verify the name of
-the account you want, if it is already correct hit ‘RET’, then the
-balance of the account will be displayed in the Minibuffer.
-
-
-File: ledger-mode.info, Node: Copying Transactions, Next: Editing Amounts, Prev: Adding Transactions, Up: The Ledger Buffer
-
-2.3 Copying Transactions
-========================
-
-An easy way to copy a transaction is to type ‘C-c C-k’ or menu entry
-‘Copy Trans at Point’. You will be prompted the new date for the copied
-transaction, and after having confirmed with ‘RET’, new transaction will
-be inserted at _date_ position in buffer.
-
- If you prefer to keep blank lines between your transactions, you can
-change the default in ‘ledger-copy-transaction-insert-blank-line-after’.
-
-
-File: ledger-mode.info, Node: Editing Amounts, Next: Marking Transactions, Prev: Copying Transactions, Up: The Ledger Buffer
-
-2.4 Editing Amounts
-===================
-
-GNU Emacs Calculator, aka ‘Calc’, is a very powerful Reverse Polish
-Notation calculator built into all recent version of Emacs. Ledger-mode
-makes it easy to calculate values for amount by integrating ‘Calc’.
-With the point anywhere in the same line as a posting, typing ‘C-c C-b’
-will bring up the ‘Calc’ buffer, and push the current amount for the
-posting onto the top of the ‘Calc’ stack. Perform any calculations you
-need to arrive at the final value, then type ‘y’ to yank the value at
-the top of stack back into the ledger buffer. Note: ‘Calc’ does not
-directly support commas as decimal separators. Ledger-mode will
-translate values from decimal-comma format to decimal-period format for
-use in ‘Calc’, but it cannot intercept the value being yanked from the
-‘Calc’ stack, so decimal-comma users will have to manually replace the
-period with a comma.
-
-
-File: ledger-mode.info, Node: Marking Transactions, Next: Formatting Transactions, Prev: Editing Amounts, Up: The Ledger Buffer
-
-2.5 Marking Transactions
-========================
-
-Ledger considers transaction or posting to be in one of three states:
-uncleared, cleared, and pending. For calculation Ledger ignores these
-states unless specifically instructed to use them. Ledger-mode assigns
-some additional meaning to the states:
-
- • Uncleared. No state. This is equivalent to sticking a check in
- the mail. It has been obligated, but not been cashed by the
- recipient. It could also apply to credit/debit card transactions
- that have not been cleared into your account balance. You bank may
- call these transactions _pending_, but Ledger-mode uses a slightly
- different meaning.
-
- • Pending. Ledger-mode’s reconciliation function see pending
- transactions as an intermediate step in reconciling an account.
- When doing a reconciliation (*note Reconciliation::), marking a
- transaction as pending means that you have seen the transaction
- finally recorded by the recipient, but you have not completely
- reconciled the account.
-
- • Cleared. The transaction has been completely recognized by all
- parties to the transaction.
-
- Typing ‘C-c C-c’, depending where is the point, will clear the
-complete transaction, or an individual posting. This places an asterisk
-‘*’ prior to the payee for the complete transaction, or prior to the
-account for an individual posting. When point is inside a transaction,
-specifically on an individual posting, you can still clear the complete
-transaction by typing ‘C-c C-e’.
-
-
-File: ledger-mode.info, Node: Formatting Transactions, Next: Deleting Transactions, Prev: Marking Transactions, Up: The Ledger Buffer
-
-2.6 Formatting Transactions
-===========================
-
-When editing a transaction, liberal use of the ‘TAB’ key can keep the
-transaction well formatted. If you want to have Ledger-mode cleanup the
-formatting of a transaction you can use ‘Align Transaction’ or ‘Align
-Region’ from the menu bar.
-
- The menu item ‘Clean-up Buffer’ sorts all transactions in the buffer
-by date, removes extraneous empty lines and aligns every transaction.
-
-
-File: ledger-mode.info, Node: Deleting Transactions, Next: Sorting Transactions, Prev: Formatting Transactions, Up: The Ledger Buffer
-
-2.7 Deleting Transactions
-=========================
-
-Along with normal buffer editing methods to delete text, Ledger-mode
-provides an easy way to delete the transaction under point: ‘C-c C-d’.
-The advantage to using this method is that the complete transaction
-operation is in the undo buffer.
-
-
-File: ledger-mode.info, Node: Sorting Transactions, Next: Narrowing Transactions, Prev: Deleting Transactions, Up: The Ledger Buffer
-
-2.8 Sorting Transactions
-========================
-
-As you operating on the Ledger files, they may become disorganized. For
-the most part, Ledger doesn’t care, but our human brains prefer a bit of
-order. Sorting the transactions in a buffer into chronological order
-can help bring order to chaos. Either using ‘Sort Region’ menu entry or
-typing ‘C-c C-s’ will sort all of the transactions in a region by date.
-Ledger-mode isn’t particularly smart about handling dates and it simply
-sorts the transactions using the string at the beginning of the
-transaction. So, you should use the preferred ISO 8601 standard date
-format ‘YYYY/MM/DD’ which easily sorts.
-
- Note, there is a menu entry ‘Sort Buffer’ to sort the entire buffer.
-Special transactions like automated transaction, will be moved in the
-sorting process and may not function correctly afterwards. For this
-reason there is no key sequence.
-
- You can limit the allowed sort region by using embedded Ledger-mode
-markup within your ledger. For example:
-
- <<< information to not sort >>>
-
- ; Ledger-mode: Start sort
-
- <<< transactions to sort >>>
-
- ; Ledger-mode: End sort
-
- <<< information to not sort >>>
-
- You can use menu entries ‘Mark Sort Beginning’ to insert start and
-‘Mark Sort End’ to insert end markers. These functions will
-automatically delete old markers and put new marker at point.
-
-
-File: ledger-mode.info, Node: Narrowing Transactions, Prev: Sorting Transactions, Up: The Ledger Buffer
-
-2.9 Narrowing Transactions
-==========================
-
-Often you will want to run Ledger register reports just to look at a
-specific set of transactions. If you don’t need the running total
-calculation handled by Ledger, Ledger-mode provides a rapid way of
-narrowing what is displayed in the buffer in a way that is simpler than
-the Ledger register command.
-
- Based on the Emacs Occur mode by Alexey Veretennikov, Ledger-occur
-hides all transactions that do _not_ meet a specific regular expression.
-The regular expression can match on any part of the transaction. If you
-want to find all transactions whose amount ends in ‘.37’, you can do
-that (I don’t know why, but hey, whatever ever floats you aerostat).
-
- Using ‘C-c C-f’ or the ‘Narrow to Regex’ menu entry, enter a regular
-expression in the Minibuffer. Ledger-mode will hide all other
-transactions. For details of the regular expression syntax, see your
-Emacs documentation. A few examples using the ‘demo.ledger’ are given
-here:
-
-‘Groceries’
- Show only transactions that have a posting to the ‘Groceries’
- account.
-
-‘^2011/01’
- Show only transactions occurring in January of 2011.
-
-‘^2011/.*/25’
- Show only transactions occurring on the 25th of the month in 2011.
-
-‘auto’
- Show only transactions with payees or accounts or comments
- containing. ‘auto’
-
-‘harley$’
- Show only transactions with any line ending with ‘harley’.
-
- To show back all transactions simply invoke ‘Narrow to Regex’ or ‘C-c
-C-f’ again.
-
- If you’ve edited some transactions after narrowing such that they
-would no longer match the regular expression, you can refresh the
-narrowed view using ‘C-c C-g’.
-
-
-File: ledger-mode.info, Node: The Reconcile Buffer, Next: The Report Buffer, Prev: The Ledger Buffer, Up: Top
-
-3 The Reconcile Buffer
-**********************
-
-* Menu:
-
-* Basics of Reconciliation::
-* Starting a Reconciliation::
-* Mark Transactions Pending::
-* Edit Transactions During Reconciliation::
-* Finalize Reconciliation::
-* Adding and Deleting Transactions during Reconciliation::
-* Changing Reconciliation Account::
-* Changing Reconciliation Target::
-
-
-File: ledger-mode.info, Node: Basics of Reconciliation, Next: Starting a Reconciliation, Prev: The Reconcile Buffer, Up: The Reconcile Buffer
-
-3.1 Basics of Reconciliation
-============================
-
-Even in this relatively modern era, financial transactions do not happen
-instantaneously, unless you are paying cash. When you swipe your debit
-card the money may take several days to actually come out of your
-account, or a check may take several days to _clear_. That is the root
-of the difference between _obligating_ funds and _expending_ funds.
-Obligation says you have agreed to pay it, the expenditure doesn’t
-happen until the money actually leaves your account. Or in the case of
-receiving payment, you have an account receivable until the money has
-actually made it to you.
-
- After an account has been reconciled you have verified that all the
-transactions in that account have been correctly recorded and all
-parties agree.
-
-
-File: ledger-mode.info, Node: Starting a Reconciliation, Next: Mark Transactions Pending, Prev: Basics of Reconciliation, Up: The Reconcile Buffer
-
-3.2 Starting a Reconciliation
-=============================
-
-To start reconciling an account you must have a target, both the
-transactions that you know about and the transactions the bank knows
-about. You can get this from a monthly statement, or from checking your
-on-line transaction history. It also helps immensely to know the final
-cleared balance you are aiming for.
-
- Use menu ‘Reconcile Account’ or keyboard shortcut ‘C-c C-r’ to start
-reconciliation.
-
- If cursor is on an account, Ledger-mode will propose this account, or
-in the Minibuffer, will prompt for an account to reconcile. Hit ‘RET’
-if you are happy with proposed account, or enter ‘Checking’ as example.
-Ledger-mode is not particular about what you enter for the account. You
-can leave it blank and ‘*Reconcile*’ buffer will show you _all_
-uncleared transactions.
-
- After you enter the account enter the target amount. It is helpful
-to enter an amount with a commodity. You can also leave it blank, you
-will be able to clear transactions but not benefit from balance
-calculations. It assumes initially that you are using ‘$’ (USD) as your
-default commodity. If you are working in a different currency you can
-change the default in variable ‘ledger-reconcile-default-commodity’ to
-whatever you need. If you work in multiple commodities simply enter the
-commoditized amount (for example ‘340 VSDX’, for 340 shares of VSDX).
-
- Ledger-mode reconcile cannot currently reconcile accounts that have
-multiple commodities, such as brokerage accounts. You may use
-reconciliation mode to clear transactions, but balance calculations will
-not display the complete list of commodities.
-
-
-File: ledger-mode.info, Node: Mark Transactions Pending, Next: Edit Transactions During Reconciliation, Prev: Starting a Reconciliation, Up: The Reconcile Buffer
-
-3.3 Mark Transactions Pending
-=============================
-
-The ‘*Reconcile*’ buffer will show all the uncleared transactions that
-meet the criteria set in the regex. By default uncleared transactions
-are shown in red. When you have verified that a transaction has been
-correctly and completely recorded by the opposing party, mark the
-transaction as pending using the ‘SPC’ bar. Continue this process until
-you agree with the opposing party and the difference from your target is
-zero.
-
-
-File: ledger-mode.info, Node: Edit Transactions During Reconciliation, Next: Finalize Reconciliation, Prev: Mark Transactions Pending, Up: The Reconcile Buffer
-
-3.4 Edit Transactions during Reconciliation
-===========================================
-
-If you find errors during reconciliation. You can visit the transaction
-under point in the ‘*Reconcile*’ buffer by hitting the ‘RET’ key. This
-will take you to the transaction in the Ledger buffer. When you have
-finished editing the transaction, saving the buffer will automatically
-return you to the ‘*Reconcile*’ buffer and you can mark the transaction
-if appropriate.
-
-
-File: ledger-mode.info, Node: Finalize Reconciliation, Next: Adding and Deleting Transactions during Reconciliation, Prev: Edit Transactions During Reconciliation, Up: The Reconcile Buffer
-
-3.5 Finalize Reconciliation
-===========================
-
-Once you have marked all transactions as pending and the cleared balance
-is correct. Finish the reconciliation by typing ‘C-c C-c’. This marks
-all pending transactions as cleared and saves the ledger buffer.
-
- Type ‘q’ to close out the reconciliation buffer. If variable
-LEDGER-RECONCILE-FINISH-FORCE-QUIT is set, the reconciliation buffer
-will be killed automatically after ‘C-c C-c’.
-
-
-File: ledger-mode.info, Node: Adding and Deleting Transactions during Reconciliation, Next: Changing Reconciliation Account, Prev: Finalize Reconciliation, Up: The Reconcile Buffer
-
-3.6 Adding and Deleting Transactions during Reconciliation
-==========================================================
-
-While reconciling, you may find new transactions that need to be entered
-into your ledger. Simply type ‘a’ to bring up the quick add for the
-ledger buffer.
-
- Typing ‘d’ will delete the transaction under point in the
-‘*Reconcile*’ buffer from the ledger buffer.
-
-
-File: ledger-mode.info, Node: Changing Reconciliation Account, Next: Changing Reconciliation Target, Prev: Adding and Deleting Transactions during Reconciliation, Up: The Reconcile Buffer
-
-3.7 Changing Reconciliation Account
-===================================
-
-You can conveniently switch the account being reconciled by typing ‘g’,
-and entering a new account to reconcile. This simply restarts the
-reconcile process. Any transactions that were marked _pending_ in the
-ledger buffer are left in that state when the account is switched.
-
-
-File: ledger-mode.info, Node: Changing Reconciliation Target, Prev: Changing Reconciliation Account, Up: The Reconcile Buffer
-
-3.8 Changing Reconciliation Target
-==================================
-
-If for some reason during reconciliation your target amount changes,
-type ‘t’ and enter the new target value.
-
-
-File: ledger-mode.info, Node: The Report Buffer, Next: Scheduling Transactions, Prev: The Reconcile Buffer, Up: Top
-
-4 The Report Buffer
-*******************
-
-* Menu:
-
-* Running Basic Reports::
-* Adding and Editing Reports::
-* Reversing Report Order::
-
-
-File: ledger-mode.info, Node: Running Basic Reports, Next: Adding and Editing Reports, Prev: The Report Buffer, Up: The Report Buffer
-
-4.1 Running Reports
-===================
-
-The real power behind Ledger is in its amazing reporting capability.
-Ledger-mode provides easy facility to run reports directly from Emacs.
-It has four reports built-in and facilities for adding custom reports.
-
- Typing ‘C-c C-o C-r’ or using menu ‘Run Report’ prompts for the name
-of a saved report. The built-in reports are:
-
-BAL
- Produce a balance reports of all accounts.
-
-REG
- Produce a register report of all transactions.
-
-PAYEE
- Prompt for a payee, then produce a register report of all
- transactions involving that payee.
-
-ACCOUNT
- Prompt for an account, then produce a register report of all
- transactions involving that account.
-
- While viewing reports you can easily switch back and forth between
-the ledger buffer and the ‘*Ledger Report*’ buffer. In ‘*Ledger
-Report*’ buffer, typing ‘RET’ will take you to that transaction in the
-ledger buffer. While in the ledger buffer ‘C-c C-o C-g’ returns you to
-the ‘*Ledger Report*’ buffer.
-
- By default Ledger-mode will refresh the report buffer when the ledger
-buffer is saved. If you want to rerun the report at another time ‘C-c
-C-o C-a’. This is useful if you have other programs altering your
-ledger file outside of Emacs.
-
-
-File: ledger-mode.info, Node: Adding and Editing Reports, Next: Reversing Report Order, Prev: Running Basic Reports, Up: The Report Buffer
-
-4.2 Adding and Editing Reports
-==============================
-
-* Menu:
-
-* Expansion Formats::
-* Make Report Transactions Active::
-
-If you type a report name that Ledger-mode doesn’t recognize it will
-prompt you for a ledger command line to run. That command is
-automatically saved with the name given and you can re-run it at any
-time.
-
- There are two ways to edit the command line for a report. The first
-is to provide a prefix argument to the run-report command. For example,
-type ‘M-1 C-c C-o C-r’. This will prompt you for the report name, then
-present the report command line to be edited. When you hit ‘RET’, the
-report will be run, but it will not be permanently saved. If you want
-to save it, type ‘S’ in the ‘*Ledger Report*’ buffer you will have the
-option to give it a new name, or overwrite the old report.
-
- Deleting reports is accomplished by typing ‘C-c C-o C-e’ or using
-‘Edit Report’ menu in the ledger buffer, or typing ‘e’ in the ‘*Ledger
-Report*’ buffer. This takes you to the Emacs customization window for
-the Ledger Reports variables. Use the widgets to delete the report you
-want removed.
-
- Typing ‘C-c C-o C-s’ will prompt for a name and save the current
-report.
-
-
-File: ledger-mode.info, Node: Expansion Formats, Next: Make Report Transactions Active, Prev: Adding and Editing Reports, Up: Adding and Editing Reports
-
-4.2.1 Expansion Formats
------------------------
-
-It is sometimes convenient to leave room to customize a report without
-saving the command line every time. For example running a register
-report for a specific account entered at runtime by the user. The
-built-in report ACCOUNT does exactly that, using a variable expansion to
-prompt the user for the account to use. There are four variables that
-can be expanded to run a report:
-
-LEDGER-FILE
- Returns the file to be operated on.
-
-PAYEE
- Prompts for a payee.
-
-ACCOUNT
- Prompt for an account.
-
-TAGNAME
- Prompt for a meta-data tag name.
-
-TAGVALUE
- Prompt for a meta-data tag value.
-
-MONTH
- Return the current month.
-
- You can use these expansion values in your ledger report commands.
-For example, if you wanted to specify a register report the displayed
-transactions from a user-determined account with a particular meta-data
-tag value, you specify the following command line:
-
- ledger -f %(ledger-file) reg %(account) \
- --limit \"tag('my-tag') =~/%(value)/\"
-
- Note how the double-quotes are escaped with back-slashes.
-
- Additionally, if you want a report showing a particular month and be
-able to easily change that month, you can specify a period using the
-‘%(month)’ specifier like this:
-
- ledger -f %(ledger-file) balance --period %(month) ^Income ^Expenses
-
- When you do this, you can use ‘M-p’ or ‘M-n’ to re-open the same
-report with the previous or next month.
-
-
-File: ledger-mode.info, Node: Make Report Transactions Active, Prev: Expansion Formats, Up: Adding and Editing Reports
-
-4.2.2 Make Report Transactions Active
--------------------------------------
-
-In a large register report it is convenient to be able to jump to the
-source transaction. Ledger-mode will automatically include source
-information in every register file that doesn’t contain a ‘--subtotal’
-option. It does this by adding
-‘--prepend-format='%(filename):%(beg_line):'’ to the register report
-command-line you specify. You should never have to see this, but if
-there is an error in your ledger output this additional information may
-not get stripped out of the visible report.
-
-
-File: ledger-mode.info, Node: Reversing Report Order, Prev: Adding and Editing Reports, Up: The Report Buffer
-
-4.3 Reversing Report Order
-==========================
-
-Often, banks show their on-line transaction histories with the most
-recent transaction at the top. Ledger itself cannot do a sensible
-ledger report in reverse chronological order, if you sort on reverse
-date the calculation will also run in the opposite direction. If you
-want to compare a ledger register report to a bank report with the most
-recent transactions at the top, type ‘R’ in the ‘*Ledger Report*’ buffer
-and it will reverse the order of the transactions and maintain the
-proper mathematical sense.
-
-
-File: ledger-mode.info, Node: Scheduling Transactions, Next: Customizing Ledger-mode, Prev: The Report Buffer, Up: Top
-
-5 Scheduling Transactions
-*************************
-
-The Ledger program provides for automating transactions but these
-transaction aren’t _real_, they only exist inside a ledger session and
-are not reflected in the actual data file. Many transactions are very
-repetitive, but may vary slightly in the date they occur on, or the
-amount. Some transactions are weekly, monthly, quarterly or annually.
-Ledger mode provides a way to schedule upcoming transaction with a
-flexible scheduler that allows you to specify the transactions in a
-separate ledger file and calculate the upcoming occurrences of those
-transactions. You can then copy the transactions into your live data
-file.
-
-* Menu:
-
-* Specifying Upcoming Transactions::
-
-
-File: ledger-mode.info, Node: Specifying Upcoming Transactions, Prev: Scheduling Transactions, Up: Scheduling Transactions
-
-5.1 Specifying Upcoming Transactions
-====================================
-
-The format for specifying transactions is identical to Ledger’s file
-format with the exception of the date field. The data field is modified
-by surrounding it with brackets and using wild cards and special
-characters to specify when the transactions should appear.
-
-* Menu:
-
-* Transactions that occur on specific dates::
-* Transactions that occur on specific days::
-
-
-File: ledger-mode.info, Node: Transactions that occur on specific dates, Next: Transactions that occur on specific days, Prev: Specifying Upcoming Transactions, Up: Specifying Upcoming Transactions
-
-5.1.1 Transactions that occur on specific dates
------------------------------------------------
-
-Many times you will enter repetitive transactions that occur on the same
-day of the month each month. These can be specified using a wild card
-in the year and month with a fixed date in the day. The following entry
-specifies a transaction that occurs on the first and fifteenth of every
-month in every year.
- [*/*/1,15] Paycheck
- Income:Job $1000.00
- Assets:Checking
-
- Some transactions do not occur every month. Comma separated lists of
-the months, or ‘E’ for even, or ‘O’ for odd number months can also be
-specified. The following entry specifies a bi-monthly exterminator bill
-that occurs in the even months:
- [*/E/01] Exterminator
- Expenses:Home $100.00
- Assets:Checking
-
-
-File: ledger-mode.info, Node: Transactions that occur on specific days, Prev: Transactions that occur on specific dates, Up: Specifying Upcoming Transactions
-
-5.1.2 Transactions that occur on specific days
-----------------------------------------------
-
-Some transactions occur every relative to the day of the week rather
-than the date of the month. For example, many people are paid every two
-weeks without regard to the day of the month. Other events may occur on
-specific days regardless of the date. For example the following
-transactions creates a transaction every other Thursday:
-
- [2014/11/27+2Th] Paycheck
- Income:Job $1000.00
- Assets:Checking
-
- It is necessary to specify a starting date in order for this type of
-recurrence relation to be specified. The day names are two character
-codes that default to Mo, Tu, We, Th, Fr, Sa, Su, for Monday, Tuesday,
-Wednesday, Thursday, Friday, Saturday, Sunday respectively. You can
-change the codes to something more convenient for your locale by
-customizing the ledger ‘ledger-schedule-week-days’. They must be two
-characters long.
-
-
-File: ledger-mode.info, Node: Customizing Ledger-mode, Next: Generating Ledger Regression Tests, Prev: Scheduling Transactions, Up: Top
-
-6 Customizing Ledger-mode
-*************************
-
-* Menu:
-
-* Ledger-mode Customization::
-* Customization Variables::
-
-
-File: ledger-mode.info, Node: Ledger-mode Customization, Next: Customization Variables, Prev: Customizing Ledger-mode, Up: Customizing Ledger-mode
-
-6.1 Ledger-mode Customization
-=============================
-
-Ledger-mode has several options available for configuration. All
-options can be configured through the Emacs customization menus, or
-specified in your Emacs initialization file. The complete list of
-options is shown below. To change the option using the Emacs
-customization menu, simply choose customize in the Options menu and look
-for Ledger under the data options. Alternatively you can choose
-‘Customize Specific Group’ and enter ‘Ledger’ as the group.
-
-
-File: ledger-mode.info, Node: Customization Variables, Prev: Ledger-mode Customization, Up: Customizing Ledger-mode
-
-6.2 Customization Variables
-===========================
-
-* Menu:
-
-* Ledger Customization Group::
-* Ledger Reconcile Customization Group::
-* Ledger Report Customization Group::
-* Ledger Faces Customization Group::
-* Ledger Post Customization Group::
-* Ledger Exec Customization Group::
-* Ledger Test Customization Group::
-* Ledger Texi Customization Group::
-
-
-File: ledger-mode.info, Node: Ledger Customization Group, Next: Ledger Reconcile Customization Group, Prev: Customization Variables, Up: Customization Variables
-
-6.2.1 Ledger Customization Group
---------------------------------
-
-‘ledger-occur-use-face-shown’
- If non-nil, use a custom face for transactions shown in
- ‘ledger-occur’ mode using ‘ledger-occur-xact-face’.
-
-‘ledger-clear-whole-transactions’
- If non-nil, clear whole transactions, not individual postings.
-
-‘ledger-highlight-xact-under-point’
- If non-nil, highlight transaction under point using
- ‘ledger-font-highlight-face’.
-
-
-File: ledger-mode.info, Node: Ledger Reconcile Customization Group, Next: Ledger Report Customization Group, Prev: Ledger Customization Group, Up: Customization Variables
-
-6.2.2 Ledger Reconcile Customization Group
-------------------------------------------
-
-‘ledger-recon-buffer-name’
- Name to use for reconciliation buffer. Defaults to ‘*Reconcile*’.
-
-‘ledger-narrow-on-reconcile’
- If t, limit transactions shown in main buffer to those matching the
- reconcile regex.
-
-‘ledger-buffer-tracks-reconcile-buffer’
- If t, then when the cursor is moved to a new transaction in the
- ‘*Reconcile*’ buffer. Then that transaction will be shown in its
- source buffer.
-
-‘ledger-reconcile-force-window-bottom’
- If t, make the ‘*Reconcile*’ window appear along the bottom of the
- register window and resize.
-
-‘ledger-reconcile-toggle-to-pending’
- If t, then toggle between uncleared and pending ‘!’. If false
- toggle between uncleared and cleared ‘*’.
-
-‘ledger-reconcile-default-date-format’
- Date format for the reconcile buffer. Defaults to
- ‘ledger-default-date-format’.
-
-‘ledger-reconcile-target-prompt-string’
- Prompt for recon target. Defaults to "Target amount for
- reconciliation ".
-
-‘ledger-reconcile-buffer-header’
- Header string for the reconcile buffer. If non-nil, the name of
- the account being reconciled will be substituted into the ’%s’. If
- nil, no header will be displayed. Defaults to "Reconciling account
- %s\n\n".
-
-‘ledger-reconcile-buffer-line-format’
- Format string for the ledger reconcile posting format. Available
- fields are date, status, code, payee, account, amount. The format
- for each field is %WIDTH(FIELD), WIDTH can be preceded by a minus
- sign which mean to left justify and pad the field. WIDTH is the
- minimum number of characters to display; if string is longer, it is
- not truncated unless ‘ledger-reconcile-buffer-payee-max-chars’ or
- ‘ledger-reconcile-buffer-account-max-chars’ is defined. Defaults
- to "%(date)s %-4(code)s %-50(payee)s %-30(account)s %15(amount)s\n"
-
-‘ledger-reconcile-buffer-payee-max-chars’
- If positive, truncate payee name right side to max number of
- characters.
-
-‘ledger-reconcile-buffer-account-max-chars’
- If positive, truncate account name left side to max number of
- characters.
-
-‘ledger-reconcile-sort-key’
- Key for sorting reconcile buffer. Possible values are ’(date)’,
- ’(amount)’, ’(payee)’ or ’(0)’ for no sorting, i.e. using ledger
- file order. Defaults to ’(0)’.
-
-‘ledger-reconcile-insert-effective-date nil’
- If t, prompt for effective date when clearing transactions during
- reconciliation.
-
-‘ledger-reconcile-finish-force-quit nil’
- If t, will force closing reconcile window after ‘C-c C-c’.
-
-
-File: ledger-mode.info, Node: Ledger Report Customization Group, Next: Ledger Faces Customization Group, Prev: Ledger Reconcile Customization Group, Up: Customization Variables
-
-6.2.3 Ledger Report Customization Group
----------------------------------------
-
-‘ledger-reports’
- Definition of reports to run.
-
-‘ledger-report-format-specifiers’
- An alist mapping ledger report format specifiers to implementing
- functions.
-
-‘ledger-report-use-native-highlighting’
- Whether reports should be displayed using the same colors as when
- calling ledger on the command line.
-
-‘ledger-report-auto-width’
- Whether reports should fill the whole width of the ‘*Report*’
- window
-
-
-File: ledger-mode.info, Node: Ledger Faces Customization Group, Next: Ledger Post Customization Group, Prev: Ledger Report Customization Group, Up: Customization Variables
-
-6.2.4 Ledger Faces Customization Group
---------------------------------------
-
-Ledger Faces: Ledger-mode highlighting
-
-‘ledger-font-uncleared-face’
- Default face for Ledger.
-
-‘ledger-font-cleared-face’
- Default face for cleared ‘*’ transactions.
-
-‘ledger-font-highlight-face’
- Default face for transaction under point.
-
-‘ledger-font-pending-face’
- Default face for pending ‘!’ transactions.
-
-‘ledger-font-other-face’
- Default face for other transactions.
-
-‘ledger-font-posting-account-face’
- Face for Ledger accounts.
-
-‘ledger-font-posting-account-cleared-face’
- Face for cleared Ledger accounts.
-
-‘ledger-font-posting-account-pending-face’
- Face for Ledger pending accounts.
-
-‘ledger-font-posting-amount-face’
- Face for Ledger amounts.
-
-‘ledger-occur-narrowed-face’
- Default face for Ledger occur mode hidden transactions.
-
-‘ledger-occur-xact-face’
- Default face for Ledger occur mode shown transactions.
-
-‘ledger-font-comment-face’
- Face for Ledger comments.
-
-‘ledger-font-reconciler-uncleared-face’
- Default face for uncleared transactions in the ‘*Reconcile*’
- buffer.
-
-‘ledger-font-reconciler-cleared-face’
- Default face for cleared ‘*’ transactions in the ‘*Reconcile*’
- buffer.
-
-‘ledger-font-reconciler-pending-face’
- Default face for pending ‘!’ transactions in the ‘*Reconcile*’
- buffer.
-
-‘ledger-font-report-clickable-face’
- Face applied to clickable entries in the ‘*Report*’ buffer.
-
-
-File: ledger-mode.info, Node: Ledger Post Customization Group, Next: Ledger Exec Customization Group, Prev: Ledger Faces Customization Group, Up: Customization Variables
-
-6.2.5 Ledger Post Customization Group
--------------------------------------
-
-Ledger Post:
-
-‘ledger-post-account-alignment-column’
- The column Ledger-mode attempts to align accounts to.
-
-‘ledger-post-amount-alignment-at’
- Position at which the amount is aligned.
-
- Can be ‘:end’ to align on the last number of the amount (can be
- followed by unaligned commodity) or ‘:decimal’ to align at the
- decimal separator.
-
-‘ledger-post-amount-alignment-column’
- The column Ledger-mode attempts to align amounts to.
-
-‘ledger-post-auto-align’
- When non-nil, realign post amounts when indenting or completing.
-
-
-File: ledger-mode.info, Node: Ledger Exec Customization Group, Next: Ledger Test Customization Group, Prev: Ledger Post Customization Group, Up: Customization Variables
-
-6.2.6 Ledger Exec Customization Group
--------------------------------------
-
-Ledger Exec: Interface to the Ledger command-line accounting program.
-
-‘ledger-binary-path’
- Path to the ledger executable.
-
-‘ledger-init-file-name’
- Location of the ledger initialization file. nil if you don’t have
- one.
-
-
-File: ledger-mode.info, Node: Ledger Test Customization Group, Next: Ledger Texi Customization Group, Prev: Ledger Exec Customization Group, Up: Customization Variables
-
-6.2.7 Ledger Test Customization Group
--------------------------------------
-
-‘ledger-source-directory’
- Directory where the Ledger sources are located.
-
-‘ledger-test-binary’
- Directory where the debug binary.
-
-
-File: ledger-mode.info, Node: Ledger Texi Customization Group, Prev: Ledger Test Customization Group, Up: Customization Variables
-
-6.2.8 Ledger Texi Customization Group
--------------------------------------
-
-‘ledger-texi-sample-doc-path’
- Location for sample data to be used in texi tests, defaults to
- ‘~/ledger/doc/sample.dat’.
-
-‘ledger-texi-normalization-args’
- texi normalization for producing ledger output, defaults to
- ‘--args-only --columns 80’.
-
-
-File: ledger-mode.info, Node: Generating Ledger Regression Tests, Next: Embedding Example results in Ledger Documentation, Prev: Customizing Ledger-mode, Up: Top
-
-7 Generating Ledger Regression Tests
-************************************
-
-Work in Progress.
-
-
-File: ledger-mode.info, Node: Embedding Example results in Ledger Documentation, Next: Hacking Ledger-mode, Prev: Generating Ledger Regression Tests, Up: Top
-
-8 Embedding Example results in Ledger Documentation
-***************************************************
-
-Work in Progress.
-
-
-File: ledger-mode.info, Node: Hacking Ledger-mode, Next: Concept Index, Prev: Embedding Example results in Ledger Documentation, Up: Top
-
-9 Hacking Ledger-mode
-*********************
-
-Work in Progress.
-
-
-File: ledger-mode.info, Node: Concept Index, Next: Command & Variable Index, Prev: Hacking Ledger-mode, Up: Top
-
-Concept Index
-*************
-
-
-* Menu:
-
-* balance: Quick Balance Display. (line 6)
-* Calc: Editing Amounts. (line 6)
-* cleared: Marking Transactions. (line 6)
-* customization, executable: Ledger Exec Customization Group.
- (line 6)
-* customization, faces: Ledger Faces Customization Group.
- (line 6)
-* customization, ledger-mode: Ledger Customization Group.
- (line 6)
-* customization, post: Ledger Post Customization Group.
- (line 6)
-* customization, reconcile: Ledger Reconcile Customization Group.
- (line 6)
-* customization, report: Ledger Report Customization Group.
- (line 6)
-* customization, test: Ledger Test Customization Group.
- (line 6)
-* customization, texi: Ledger Texi Customization Group.
- (line 6)
-* demo: Quick Demo. (line 6)
-* effective date: Setting a Transactions Effective Date.
- (line 6)
-* GNU Emacs Calculator: Editing Amounts. (line 6)
-* installation: Quick Installation. (line 6)
-* menu: Menus. (line 6)
-* pending: Marking Transactions. (line 6)
-* reconciliation, account changing: Changing Reconciliation Account.
- (line 6)
-* reconciliation, basics: Basics of Reconciliation.
- (line 6)
-* reconciliation, finalizing: Finalize Reconciliation.
- (line 6)
-* reconciliation, starting: Starting a Reconciliation.
- (line 6)
-* reconciliation, target changing: Changing Reconciliation Target.
- (line 6)
-* reconciliation, transaction adding and deleting: Adding and Deleting Transactions during Reconciliation.
- (line 6)
-* reconciliation, transaction editing: Edit Transactions During Reconciliation.
- (line 6)
-* reconciliation, transaction marking: Mark Transactions Pending.
- (line 6)
-* report, adding and editing: Adding and Editing Reports.
- (line 6)
-* report, custom command: Make Report Transactions Active.
- (line 6)
-* report, custom variable: Expansion Formats. (line 6)
-* report, order reversing: Reversing Report Order.
- (line 6)
-* report, running: Running Basic Reports. (line 6)
-* transaction, adding: Adding Transactions. (line 6)
-* transaction, copying: Copying Transactions. (line 6)
-* transaction, deleting: Deleting Transactions. (line 6)
-* transaction, display filtering: Narrowing Transactions.
- (line 6)
-* transaction, editing amounts: Editing Amounts. (line 6)
-* transaction, formatting: Formatting Transactions.
- (line 6)
-* transaction, marking: Marking Transactions. (line 6)
-* transaction, narrowing: Narrowing Transactions.
- (line 6)
-* transaction, navigation: Navigating Transactions.
- (line 6)
-* transaction, sorting: Sorting Transactions. (line 6)
-* uncleared: Marking Transactions. (line 6)
-
-
-File: ledger-mode.info, Node: Command & Variable Index, Next: Keystroke Index, Prev: Concept Index, Up: Top
-
-Command & Variable Index
-************************
-
-
-* Menu:
-
-* ledger-binary-path: Ledger Exec Customization Group.
- (line 8)
-* ledger-buffer-tracks-reconcile-buffer: Ledger Reconcile Customization Group.
- (line 13)
-* ledger-clear-whole-transactions: Ledger Customization Group.
- (line 10)
-* ledger-font-cleared-face: Ledger Faces Customization Group.
- (line 11)
-* ledger-font-comment-face: Ledger Faces Customization Group.
- (line 41)
-* ledger-font-highlight-face: Ledger Faces Customization Group.
- (line 14)
-* ledger-font-other-face: Ledger Faces Customization Group.
- (line 20)
-* ledger-font-pending-face: Ledger Faces Customization Group.
- (line 17)
-* ledger-font-posting-account-cleared-face: Ledger Faces Customization Group.
- (line 26)
-* ledger-font-posting-account-face: Ledger Faces Customization Group.
- (line 23)
-* ledger-font-posting-account-pending-face: Ledger Faces Customization Group.
- (line 29)
-* ledger-font-posting-amount-face: Ledger Faces Customization Group.
- (line 32)
-* ledger-font-reconciler-cleared-face: Ledger Faces Customization Group.
- (line 48)
-* ledger-font-reconciler-pending-face: Ledger Faces Customization Group.
- (line 52)
-* ledger-font-reconciler-uncleared-face: Ledger Faces Customization Group.
- (line 44)
-* ledger-font-report-clickable-face: Ledger Faces Customization Group.
- (line 56)
-* ledger-font-uncleared-face: Ledger Faces Customization Group.
- (line 8)
-* ledger-highlight-xact-under-point: Ledger Customization Group.
- (line 13)
-* ledger-init-file-name: Ledger Exec Customization Group.
- (line 11)
-* ledger-narrow-on-reconcile: Ledger Reconcile Customization Group.
- (line 9)
-* ledger-navigate-next-uncleared: Navigating Transactions.
- (line 10)
-* ledger-navigate-next-xact-or-directive: Navigating Transactions.
- (line 6)
-* ledger-navigate-prev-xact-or-directive: Navigating Transactions.
- (line 6)
-* ledger-navigate-previous-uncleared: Navigating Transactions.
- (line 10)
-* ledger-occur-narrowed-face: Ledger Faces Customization Group.
- (line 35)
-* ledger-occur-use-face-shown: Ledger Customization Group.
- (line 6)
-* ledger-occur-xact-face: Ledger Faces Customization Group.
- (line 38)
-* ledger-post-account-alignment-column: Ledger Post Customization Group.
- (line 8)
-* ledger-post-amount-alignment-at: Ledger Post Customization Group.
- (line 11)
-* ledger-post-amount-alignment-column: Adding Transactions. (line 6)
-* ledger-post-amount-alignment-column <1>: Ledger Post Customization Group.
- (line 18)
-* ledger-post-auto-align: Ledger Post Customization Group.
- (line 21)
-* ledger-recon-buffer-name: Ledger Reconcile Customization Group.
- (line 6)
-* ledger-reconcile-buffer-account-max-chars: Ledger Reconcile Customization Group.
- (line 54)
-* ledger-reconcile-buffer-header: Ledger Reconcile Customization Group.
- (line 34)
-* ledger-reconcile-buffer-line-format: Ledger Reconcile Customization Group.
- (line 40)
-* ledger-reconcile-buffer-payee-max-chars: Ledger Reconcile Customization Group.
- (line 50)
-* ledger-reconcile-default-commodity: Starting a Reconciliation.
- (line 6)
-* ledger-reconcile-default-date-format: Ledger Reconcile Customization Group.
- (line 26)
-* ledger-reconcile-finish-force-quit nil: Ledger Reconcile Customization Group.
- (line 67)
-* ledger-reconcile-force-window-bottom: Ledger Reconcile Customization Group.
- (line 18)
-* ledger-reconcile-insert-effective-date nil: Ledger Reconcile Customization Group.
- (line 63)
-* ledger-reconcile-sort-key: Ledger Reconcile Customization Group.
- (line 58)
-* ledger-reconcile-target-prompt-string: Ledger Reconcile Customization Group.
- (line 30)
-* ledger-reconcile-toggle-to-pending: Ledger Reconcile Customization Group.
- (line 22)
-* ledger-report-auto-width: Ledger Report Customization Group.
- (line 17)
-* ledger-report-format-specifiers: Ledger Report Customization Group.
- (line 9)
-* ledger-report-use-native-highlighting: Ledger Report Customization Group.
- (line 13)
-* ledger-reports: Adding and Editing Reports.
- (line 6)
-* ledger-reports <1>: Ledger Report Customization Group.
- (line 6)
-* ledger-source-directory: Ledger Test Customization Group.
- (line 6)
-* ledger-test-binary: Ledger Test Customization Group.
- (line 9)
-* ledger-texi-normalization-args: Ledger Texi Customization Group.
- (line 10)
-* ledger-texi-sample-doc-path: Ledger Texi Customization Group.
- (line 6)
-
-
-File: ledger-mode.info, Node: Keystroke Index, Prev: Command & Variable Index, Up: Top
-
-Keystroke Index
-***************
-
-
-* Menu:
-
-* a: Adding and Deleting Transactions during Reconciliation.
- (line 6)
-* C-c C-a: Quick Add. (line 6)
-* C-c C-b: Editing Amounts. (line 6)
-* C-c C-c: Reconciliation. (line 6)
-* C-c C-c <1>: Reports. (line 6)
-* C-c C-c <2>: Marking Transactions. (line 28)
-* C-c C-c <3>: Edit Transactions During Reconciliation.
- (line 6)
-* C-c C-c <4>: Finalize Reconciliation.
- (line 6)
-* C-c C-d: Deleting Transactions.
- (line 6)
-* C-c C-e: Marking Transactions. (line 28)
-* C-c C-f: Narrowing. (line 6)
-* C-c C-f <1>: Narrowing Transactions.
- (line 6)
-* C-c C-g: Narrowing. (line 6)
-* C-c C-g <1>: Narrowing Transactions.
- (line 6)
-* C-c C-k: Copying Transactions. (line 6)
-* C-c C-o C-a: Running Basic Reports.
- (line 6)
-* C-c C-o C-e: Adding and Editing Reports.
- (line 6)
-* C-c C-o C-g: Running Basic Reports.
- (line 6)
-* C-c C-o C-r: Reports. (line 6)
-* C-c C-o C-r <1>: Running Basic Reports.
- (line 6)
-* C-c C-p: Quick Balance Display.
- (line 6)
-* C-c C-r: Reconciliation. (line 6)
-* C-c C-r <1>: Starting a Reconciliation.
- (line 6)
-* C-c C-s: Sorting Transactions. (line 6)
-* C-c C-t: Setting a Transactions Effective Date.
- (line 6)
-* C-c TAB: Quick Add. (line 6)
-* d: Adding and Deleting Transactions during Reconciliation.
- (line 6)
-* e: Adding and Editing Reports.
- (line 6)
-* g: Changing Reconciliation Account.
- (line 6)
-* M-1 C-c C-o C-r: Adding and Editing Reports.
- (line 6)
-* M-n: Navigating Transactions.
- (line 6)
-* M-p: Navigating Transactions.
- (line 6)
-* q: Reconciliation. (line 6)
-* q <1>: Finalize Reconciliation.
- (line 6)
-* R: Reversing Report Order.
- (line 6)
-* RET: Edit Transactions During Reconciliation.
- (line 6)
-* S: Adding and Editing Reports.
- (line 6)
-* SPC: Reconciliation. (line 6)
-* SPC <1>: Mark Transactions Pending.
- (line 6)
-* t: Changing Reconciliation Target.
- (line 6)
-* TAB: Adding Transactions. (line 6)
-* y: Editing Amounts. (line 6)
-
-
-
-Tag Table:
-Node: Top1742
-Node: Introduction to Ledger-mode2556
-Node: Quick Installation2785
-Node: Menus3717
-Node: Quick Demo4032
-Node: Quick Add4462
-Node: Reconciliation5662
-Node: Reports7346
-Node: Narrowing8376
-Node: The Ledger Buffer8960
-Node: Navigating Transactions9366
-Node: Adding Transactions9914
-Node: Setting a Transactions Effective Date11413
-Node: Quick Balance Display12313
-Node: Copying Transactions12845
-Node: Editing Amounts13447
-Node: Marking Transactions14518
-Node: Formatting Transactions16213
-Node: Deleting Transactions16811
-Node: Sorting Transactions17251
-Node: Narrowing Transactions18803
-Node: The Reconcile Buffer20653
-Node: Basics of Reconciliation21118
-Node: Starting a Reconciliation22067
-Node: Mark Transactions Pending23916
-Node: Edit Transactions During Reconciliation24585
-Node: Finalize Reconciliation25228
-Node: Adding and Deleting Transactions during Reconciliation25885
-Node: Changing Reconciliation Account26469
-Node: Changing Reconciliation Target27019
-Node: The Report Buffer27337
-Node: Running Basic Reports27595
-Node: Adding and Editing Reports29028
-Node: Expansion Formats30415
-Node: Make Report Transactions Active32056
-Node: Reversing Report Order32763
-Node: Scheduling Transactions33456
-Node: Specifying Upcoming Transactions34312
-Node: Transactions that occur on specific dates34886
-Node: Transactions that occur on specific days35927
-Node: Customizing Ledger-mode37056
-Node: Ledger-mode Customization37320
-Node: Customization Variables38005
-Node: Ledger Customization Group38485
-Node: Ledger Reconcile Customization Group39125
-Node: Ledger Report Customization Group42068
-Node: Ledger Faces Customization Group42787
-Node: Ledger Post Customization Group44534
-Node: Ledger Exec Customization Group45361
-Node: Ledger Test Customization Group45860
-Node: Ledger Texi Customization Group46262
-Node: Generating Ledger Regression Tests46754
-Node: Embedding Example results in Ledger Documentation47017
-Node: Hacking Ledger-mode47306
-Node: Concept Index47514
-Node: Command & Variable Index52427
-Node: Keystroke Index60537
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/ledger-mode-20200530.1710/ledger-navigate.el b/elpa/ledger-mode-20200530.1710/ledger-navigate.el
deleted file mode 100644
index c2046f0..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-navigate.el
+++ /dev/null
@@ -1,199 +0,0 @@
-;;; ledger-navigate.el --- Provide navigation services through the ledger buffer. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2014-2015 Craig Earls (enderw88 AT gmail DOT com)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;;
-
-;;; Code:
-
-(require 'ledger-regex)
-(require 'ledger-context)
-
-(defun ledger-navigate-next-xact ()
- "Move point to beginning of next xact."
- ;; make sure we actually move to the next xact, even if we are the
- ;; beginning of one now.
- (if (looking-at ledger-payee-any-status-regex)
- (forward-line))
- (if (re-search-forward ledger-payee-any-status-regex nil t)
- (goto-char (match-beginning 0))
- (goto-char (point-max))))
-
-(defun ledger-navigate-start-xact-or-directive-p ()
- "Return t if at the beginning of an empty or all-whitespace line."
- (not (looking-at "[ \t]\\|\\(^$\\)")))
-
-(defun ledger-navigate-next-xact-or-directive ()
- "Move to the beginning of the next xact or directive."
- (interactive)
- (beginning-of-line)
- (if (ledger-navigate-start-xact-or-directive-p) ; if we are the start of an xact, move forward to the next xact
- (progn
- (forward-line)
- (if (not (ledger-navigate-start-xact-or-directive-p)) ; we have moved forward and are not at another xact, recurse forward
- (ledger-navigate-next-xact-or-directive)))
- (while (not (or (eobp) ; we didn't start off at the beginning of an xact
- (ledger-navigate-start-xact-or-directive-p)))
- (forward-line))))
-
-(defun ledger-navigate-prev-xact-or-directive ()
- "Move point to beginning of previous xact."
- (interactive)
- (let ((context (car (ledger-context-at-point))))
- (when (equal context 'acct-transaction)
- (ledger-navigate-beginning-of-xact))
- (beginning-of-line)
- (re-search-backward "^[[:graph:]]" nil t)))
-
-(defun ledger-navigate-beginning-of-xact ()
- "Move point to the beginning of the current xact."
- (interactive)
- ;; need to start at the beginning of a line in case we are in the first line of an xact already.
- (beginning-of-line)
- (let ((sreg (concat "^[=~[:digit:]]")))
- (unless (looking-at sreg)
- (re-search-backward sreg nil t)
- (beginning-of-line)))
- (point))
-
-(defun ledger-navigate-end-of-xact ()
- "Move point to end of xact."
- (interactive)
- (ledger-navigate-next-xact-or-directive)
- (re-search-backward ".$")
- (end-of-line)
- (point))
-
-(defun ledger-navigate-to-line (line-number)
- "Rapidly move point to line LINE-NUMBER."
- (goto-char (point-min))
- (forward-line (1- line-number)))
-
-(defun ledger-navigate-find-xact-extents (pos)
- "Return list containing point for beginning and end of xact containing POS.
-Requires empty line separating xacts."
- (interactive "d")
- (save-excursion
- (goto-char pos)
- (list (ledger-navigate-beginning-of-xact)
- (ledger-navigate-end-of-xact))))
-
-(defun ledger-navigate-skip-lines-backwards (re)
- "Move backwards if necessary until RE does not match at the beginning of the line."
- (beginning-of-line)
- (while (and (looking-at-p re)
- (zerop (forward-line -1)))))
-
-(defun ledger-navigate-skip-lines-forwards (re)
- "Move forwards if necessary until RE does not match at the beginning of the line."
- (beginning-of-line)
- (while (and (looking-at-p re)
- (zerop (forward-line 1)))))
-
-(defun ledger-navigate-find-directive-extents (pos)
- "Return the extents of the directive at POS."
- (goto-char pos)
- (let ((begin (progn (ledger-navigate-skip-lines-backwards "[ \t]\\|end[[:blank:]]+\\(?:comment\\|test\\)")
- (point)))
- (end (progn (forward-line 1)
- (ledger-navigate-skip-lines-forwards "[ \t]")
- (1- (point))))
- (comment-re " *;"))
- ;; handle block comments here
- (goto-char begin)
- (cond
- ((looking-at comment-re)
- (progn
- (ledger-navigate-skip-lines-backwards comment-re)
- ;; We are either at the beginning of the buffer, or we found
- ;; a line outside the comment, or both. If we are outside
- ;; the comment then we need to move forward a line.
- (unless (looking-at comment-re)
- (forward-line 1)
- (beginning-of-line))
- (setq begin (point))
- (goto-char pos)
- (ledger-navigate-skip-lines-forwards comment-re)
- (setq end (point))))
- ((looking-at "\\(?:comment\\|test\\)\\>")
- (setq end (or (save-match-data
- (re-search-forward "^end[[:blank:]]+\\(?:comment\\|test\\)\\_>"))
- (point-max)))))
- (list begin end)))
-
-(defun ledger-navigate-block-comment (pos)
- "Move past the block comment at POS, and return its extents."
- (interactive "d")
- (goto-char pos)
- (let ((begin (progn (beginning-of-line)
- (point)))
- (end (progn (end-of-line)
- (point)))
- (comment-re " *;"))
- ;; handle block comments here
- (beginning-of-line)
- (if (looking-at comment-re)
- (progn
- (ledger-navigate-skip-lines-backwards comment-re)
- (setq begin (point))
- (goto-char pos)
- (beginning-of-line)
- (ledger-navigate-skip-lines-forwards comment-re)
- (setq end (point))))
- (list begin end)))
-
-
-(defun ledger-navigate-find-element-extents (pos)
- "Return list containing beginning and end of the entity surrounding POS."
- (interactive "d")
- (save-excursion
- (goto-char pos)
- (beginning-of-line)
- (ledger-navigate-skip-lines-backwards "[ \t]\\|end[[:blank:]]+\\(?:comment\\|test\\)\\_>")
- (if (looking-at "[=~0-9\\[]")
- (ledger-navigate-find-xact-extents pos)
- (ledger-navigate-find-directive-extents pos))))
-
-(defun ledger-navigate-next-uncleared ()
- "Move point to the next uncleared transaction."
- (interactive)
- (when (looking-at ledger-payee-uncleared-regex)
- (forward-line))
- (if (re-search-forward ledger-payee-uncleared-regex nil t)
- (progn (beginning-of-line)
- (point))
- (user-error "No next uncleared transactions")))
-
-(defun ledger-navigate-previous-uncleared ()
- "Move point to the previous uncleared transaction."
- (interactive)
- (when (equal (car (ledger-context-at-point)) 'acct-transaction)
- (ledger-navigate-beginning-of-xact))
- (if (re-search-backward ledger-payee-uncleared-regex nil t)
- (progn (beginning-of-line)
- (point))
- (user-error "No previous uncleared transactions")))
-
-
-(provide 'ledger-navigate)
-
-;;; ledger-navigate.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-occur.el b/elpa/ledger-mode-20200530.1710/ledger-occur.el
deleted file mode 100644
index bfd006e..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-occur.el
+++ /dev/null
@@ -1,169 +0,0 @@
-;;; ledger-occur.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;; Provide buffer narrowing to ledger mode. Adapted from original loccur
-;; mode by Alexey Veretennikov <alexey dot veretennikov at gmail dot
-;; com>
-;;
-;; Adapted to ledger mode by Craig Earls <enderww at gmail dot
-;; com>
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'ledger-navigate)
-
-(defconst ledger-occur-overlay-property-name 'ledger-occur-custom-buffer-grep)
-
-(defcustom ledger-occur-use-face-shown t
- "If non-nil, use a custom face for xacts shown in `ledger-occur' mode using ledger-occur-xact-face."
- :type 'boolean
- :group 'ledger)
-(make-variable-buffer-local 'ledger-occur-use-face-shown)
-
-
-(defvar ledger-occur-history nil
- "History of previously searched expressions for the prompt.")
-
-(defvar ledger-occur-current-regex nil
- "Pattern currently applied to narrow the buffer.")
-(make-variable-buffer-local 'ledger-occur-current-regex)
-
-(defvar ledger-occur-mode-map (make-sparse-keymap))
-
-(define-minor-mode ledger-occur-mode
- "A minor mode which display only transactions matching `ledger-occur-current-regex'."
- nil
- (:eval (format " Ledger-Narrow(%s)" ledger-occur-current-regex))
- ledger-occur-mode-map
- (if (and ledger-occur-current-regex ledger-occur-mode)
- (ledger-occur-refresh)
- (ledger-occur-remove-overlays)
- (message "Showing all transactions")))
-
-(define-key ledger-occur-mode-map (kbd "C-c C-g") #'ledger-occur-refresh)
-(define-key ledger-occur-mode-map (kbd "C-c C-f") #'ledger-occur-mode)
-
-(defun ledger-occur-refresh ()
- "Re-apply the current narrowing expression."
- (interactive)
- (let ((matches (ledger-occur-compress-matches
- (ledger-occur-find-matches ledger-occur-current-regex))))
- (if matches
- (ledger-occur-create-overlays matches)
- (message "No matches found for '%s'" ledger-occur-current-regex)
- (ledger-occur-mode -1))))
-
-(defun ledger-occur (regex)
- "Show only transactions in the current buffer which match REGEX.
-
-This command hides all xact in the current buffer except those
-matching REGEX. If REGEX is nil or empty, turn off any narrowing
-currently active."
- (interactive
- (list (read-regexp "Regexp" (ledger-occur-prompt) 'ledger-occur-history)))
- (if (or (null regex)
- (zerop (length regex))) ; empty regex, or already have narrowed, clear narrowing
- (ledger-occur-mode -1)
- (setq ledger-occur-current-regex regex)
- (ledger-occur-mode 1)))
-
-(defun ledger-occur-prompt ()
- "Return the default value of the prompt.
-
- Default value for prompt is a current word or active
- region(selection), if its size is 1 line"
- (if (use-region-p)
- (let ((pos1 (region-beginning))
- (pos2 (region-end)))
- ;; Check if the start and the of an active region is on
- ;; the same line
- (if (= (line-number-at-pos pos1)
- (line-number-at-pos pos2))
- (buffer-substring-no-properties pos1 pos2)))
- (current-word)))
-
-
-(defun ledger-occur-make-visible-overlay (beg end)
- (let ((ovl (make-overlay beg end (current-buffer))))
- (overlay-put ovl ledger-occur-overlay-property-name t)
- (when ledger-occur-use-face-shown
- (overlay-put ovl 'font-lock-face 'ledger-occur-xact-face))))
-
-(defun ledger-occur-make-invisible-overlay (beg end)
- (let ((ovl (make-overlay beg end (current-buffer))))
- (overlay-put ovl ledger-occur-overlay-property-name t)
- (overlay-put ovl 'invisible t)))
-
-(defun ledger-occur-create-overlays (ovl-bounds)
- "Create the overlays for the visible transactions.
-Argument OVL-BOUNDS contains bounds for the transactions to be left visible."
- (let* ((beg (caar ovl-bounds))
- (end (cl-cadar ovl-bounds)))
- (ledger-occur-remove-overlays)
- (ledger-occur-make-invisible-overlay (point-min) (1- beg))
- (dolist (visible (cdr ovl-bounds))
- (ledger-occur-make-visible-overlay beg end)
- (ledger-occur-make-invisible-overlay (1+ end) (1- (car visible)))
- (setq beg (car visible))
- (setq end (cadr visible)))
- (ledger-occur-make-invisible-overlay (1+ end) (point-max))))
-
-(defun ledger-occur-remove-overlays ()
- "Remove the transaction hiding overlays."
- (interactive)
- (remove-overlays (point-min)
- (point-max) ledger-occur-overlay-property-name t))
-
-(defun ledger-occur-find-matches (regex)
- "Return a list of 2-number tuples describing the beginning and end of transactions meeting REGEX."
- (save-excursion
- (goto-char (point-min))
- ;; Set initial values for variables
- (let (endpoint lines bounds)
- ;; Search loop
- (while (not (eobp))
- ;; if something found
- (when (setq endpoint (re-search-forward regex nil 'end))
- (setq bounds (ledger-navigate-find-element-extents endpoint))
- (push bounds lines)
- ;; move to the end of the xact, no need to search inside it more
- (goto-char (cadr bounds))))
- (nreverse lines))))
-
-(defun ledger-occur-compress-matches (buffer-matches)
- "identify sequential xacts to reduce number of overlays required"
- (if buffer-matches
- (let ((points (list))
- (current-beginning (caar buffer-matches))
- (current-end (cl-cadar buffer-matches)))
- (dolist (match (cdr buffer-matches))
- (if (< (- (car match) current-end) 2)
- (setq current-end (cadr match))
- (push (list current-beginning current-end) points)
- (setq current-beginning (car match))
- (setq current-end (cadr match))))
- (nreverse (push (list current-beginning current-end) points)))))
-
-(provide 'ledger-occur)
-
-;;; ledger-occur.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-post.el b/elpa/ledger-mode-20200530.1710/ledger-post.el
deleted file mode 100644
index 6cfaa7a..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-post.el
+++ /dev/null
@@ -1,183 +0,0 @@
-;;; ledger-post.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Utility functions for dealing with postings.
-
-(require 'ledger-regex)
-(require 'ledger-navigate)
-
-;;; Code:
-
-(defgroup ledger-post nil
- "Options for controlling how Ledger-mode deals with postings and completion"
- :group 'ledger)
-
-(defcustom ledger-post-account-alignment-column 4
- "The column Ledger-mode attempts to align accounts to."
- :type 'integer
- :group 'ledger-post)
-
-(defcustom ledger-post-amount-alignment-column 52
- "The column Ledger-mode attempts to align amounts to."
- :type 'integer
- :group 'ledger-post)
-
-(defcustom ledger-post-amount-alignment-at :end
- "Position at which the amount is aligned.
-
-Can be :end to align on the last number of the amount (can be
-followed by unaligned commodity) or :decimal to align at the
-decimal separator."
- :type '(radio (const :tag "align at the end of amount" :end)
- (const :tag "align at the decimal separator" :decimal))
- :group 'ledger-post)
-
-(defcustom ledger-post-auto-align t
- "When non-nil, realign post amounts when indenting or completing."
- :type 'boolean
- :group 'ledger-post
- :package-version '(ledger-mode . "4.0.0")
- :safe 'booleanp)
-
-(defun ledger-next-amount (&optional end)
- "Move point to the next amount, as long as it is not past END.
-Return the width of the amount field as an integer and leave
-point at beginning of the commodity."
- ;;(beginning-of-line)
- (let ((case-fold-search nil))
- (when (re-search-forward ledger-amount-regex end t)
- (goto-char (match-beginning 0))
- (skip-syntax-forward " ")
- (cond
- ((eq ledger-post-amount-alignment-at :end)
- (- (or (match-end 4) (match-end 3)) (point)))
- ((eq ledger-post-amount-alignment-at :decimal)
- (- (match-end 3) (point)))))))
-
-(defun ledger-next-account (&optional end)
- "Move to the beginning of the posting, or status marker.
-Return the column of the beginning of the account and leave point
-at beginning of account.
-Looks only as far as END, if supplied, otherwise `point-max'."
- (let ((end (or end (point-max))))
- (if (> end (point))
- (when (re-search-forward ledger-account-any-status-regex (1+ end) t)
- ;; the 1+ is to make sure we can catch the newline
- (if (match-beginning 1)
- (goto-char (match-beginning 1))
- (goto-char (match-beginning 2)))
- (current-column)))))
-
-(defun ledger-post-align-xact (pos)
- "Align all the posting in the xact at POS."
- (interactive "d")
- (let ((bounds (ledger-navigate-find-xact-extents pos)))
- (ledger-post-align-postings (car bounds) (cadr bounds))))
-
-(defun ledger-post-align-postings (beg end)
- "Align all accounts and amounts between BEG and END, or the current region, or, if no region, the current line."
- (interactive "r")
- (save-match-data
- (save-excursion
- (let ((inhibit-modification-hooks t)
- ;; Extend region to whole lines
- (beg (save-excursion (goto-char beg) (line-beginning-position)))
- (end (save-excursion (goto-char end) (move-end-of-line 1) (point-marker))))
- (untabify beg end)
- (goto-char beg)
- (while (< (point) end)
- (when (looking-at-p " ")
- ;; fix spaces at beginning of line:
- (just-one-space ledger-post-account-alignment-column)
- ;; fix spaces before amount if any:
- (when (re-search-forward "\t\\| \\| \t" (line-end-position) t)
- (goto-char (match-beginning 0))
- (let ((acct-end-column (current-column))
- (amt-width (ledger-next-amount (line-end-position)))
- amt-adjust)
- (when amt-width
- (if (/= 0 (setq amt-adjust (- (if (> (- ledger-post-amount-alignment-column amt-width)
- (+ 2 acct-end-column))
- ledger-post-amount-alignment-column ;;we have room
- (+ acct-end-column 2 amt-width))
- amt-width
- (current-column))))
- (if (> amt-adjust 0)
- (insert (make-string amt-adjust ? ))
- (delete-char amt-adjust)))))))
- (forward-line 1))))))
-
-(defun ledger-indent-line ()
- "Indent the current line."
- ;; Ensure indent if the previous line was indented
- (let ((indent-level (save-excursion (if (and (zerop (forward-line -1))
- (memq (ledger-thing-at-point) '(transaction posting)))
- ledger-post-account-alignment-column
- 0))))
- (unless (= (current-indentation) indent-level)
- (back-to-indentation)
- (delete-horizontal-space t)
- (indent-to indent-level)))
- (when ledger-post-auto-align
- (ledger-post-align-postings (line-beginning-position) (line-end-position))))
-
-(defun ledger-post-align-dwim ()
- "Align all the posting of the current xact or the current region.
-
-If the point is in a comment, fill the comment paragraph as
-regular text."
- (interactive)
- (cond
- ((nth 4 (syntax-ppss))
- (call-interactively 'ledger-post-align-postings)
- (fill-paragraph))
- ((use-region-p) (call-interactively 'ledger-post-align-postings))
- (t (call-interactively 'ledger-post-align-xact))))
-
-(defun ledger-post-edit-amount ()
- "Call 'calc-mode' and push the amount in the posting to the top of stack."
- (interactive)
- (goto-char (line-beginning-position))
- (when (re-search-forward ledger-post-line-regexp (line-end-position) t)
- (goto-char (match-end ledger-regex-post-line-group-account)) ;; go to the and of the account
- (let ((end-of-amount (re-search-forward "[-.,0-9]+" (line-end-position) t)))
- ;; determine if there is an amount to edit
- (if end-of-amount
- (let ((val-string (match-string 0)))
- (goto-char (match-beginning 0))
- (delete-region (match-beginning 0) (match-end 0))
- (push-mark)
- (calc)
- (calc-eval val-string 'push)) ;; edit the amount
- (progn ;;make sure there are two spaces after the account name and go to calc
- (if (search-backward " " (- (point) 3) t)
- (goto-char (line-end-position))
- (insert " "))
- (push-mark)
- (calc))))))
-
-(provide 'ledger-post)
-
-
-
-;;; ledger-post.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-reconcile.el b/elpa/ledger-mode-20200530.1710/ledger-reconcile.el
deleted file mode 100644
index 6452cb2..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-reconcile.el
+++ /dev/null
@@ -1,640 +0,0 @@
-;;; ledger-reconcile.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;; Reconcile mode
-
-
-;;; Commentary:
-;; Code to handle reconciling Ledger files with outside sources
-
-;;; Code:
-
-(require 'easymenu)
-(require 'ledger-init)
-
-(require 'ledger-xact)
-(require 'ledger-occur)
-(require 'ledger-commodities)
-(require 'ledger-exec)
-(require 'ledger-navigate)
-(require 'ledger-state)
-(declare-function ledger-insert-effective-date "ledger-mode" (&optional date))
-(declare-function ledger-read-account-with-prompt "ledger-mode" (prompt))
-(declare-function ledger-read-date "ledger-mode" (prompt))
-
-(defvar ledger-buf nil)
-(defvar ledger-bufs nil)
-(defvar ledger-acct nil)
-(defvar ledger-target nil)
-
-(defgroup ledger-reconcile nil
- "Options for Ledger-mode reconciliation"
- :group 'ledger)
-
-(defcustom ledger-recon-buffer-name "*Reconcile*"
- "Name to use for reconciliation buffer."
- :type 'string
- :group 'ledger-reconcile)
-
-(defcustom ledger-narrow-on-reconcile t
- "If t, limit transactions shown in main buffer to those matching the reconcile regex."
- :type 'boolean
- :group 'ledger-reconcile)
-
-(defcustom ledger-buffer-tracks-reconcile-buffer t
- "If t, move point in the ledger buffer when it moves in the reconcile buffer.
-When the cursor is moved to a new transaction in the reconcile
-buffer then that transaction will be shown in its source buffer."
- :type 'boolean
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-force-window-bottom nil
- "If t, make the reconcile window appear along the bottom of the register window and resize."
- :type 'boolean
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-toggle-to-pending t
- "If t, then toggle between uncleared and pending.
-reconcile-finish will mark all pending posting cleared."
- :type 'boolean
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-default-date-format ledger-default-date-format
- "Date format for the reconcile buffer.
-Default is `ledger-default-date-format'."
- :type 'string
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-target-prompt-string "Target amount for reconciliation "
- "Prompt for recon target."
- :type 'string
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-buffer-header "Reconciling account %s\n\n"
- "Default header string for the reconcile buffer.
-
-If non-nil, the name of the account being reconciled will be substituted
- into the '%s'. If nil, no header will be displayed."
- :type 'string
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-buffer-line-format "%(date)s %-4(code)s %-50(payee)s %-30(account)s %15(amount)s\n"
- "Format string for the ledger reconcile posting format.
-Available fields are date, status, code, payee, account,
-amount. The format for each field is %WIDTH(FIELD), WIDTH can be
-preceded by a minus sign which mean to left justify and pad the
-field. WIDTH is the minimum number of characters to display;
-if string is longer, it is not truncated unless
-`ledger-reconcile-buffer-payee-max-chars' or
-`ledger-reconcile-buffer-account-max-chars' is defined."
- :type 'string
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-buffer-payee-max-chars -1
- "If positive, truncate payee name right side to max number of characters."
- :type 'integer
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-buffer-account-max-chars -1
- "If positive, truncate account name left side to max number of characters."
- :type 'integer
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-sort-key "(0)"
- "Key for sorting reconcile buffer.
-
-Possible values are '(date)', '(amount)', '(payee)' or '(0)' for no sorting, i.e. using ledger file order."
- :type 'string
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-insert-effective-date nil
- "If t, prompt for effective date when clearing transactions during reconciliation."
- :type 'boolean
- :group 'ledger-reconcile)
-
-(defcustom ledger-reconcile-finish-force-quit nil
- "If t, will force closing reconcile window after \\[ledger-reconcile-finish]."
- :type 'boolean
- :group 'ledger-reconcile)
-
-;; s-functions below are copied from Magnars' s.el
-;; prefix ledger-reconcile- is added to not conflict with s.el
-(defun ledger-reconcile-s-pad-left (len padding s)
- "If S is shorter than LEN, pad it with PADDING on the left."
- (let ((extra (max 0 (- len (length s)))))
- (concat (make-string extra (string-to-char padding))
- s)))
-(defun ledger-reconcile-s-pad-right (len padding s)
- "If S is shorter than LEN, pad it with PADDING on the right."
- (let ((extra (max 0 (- len (length s)))))
- (concat s
- (make-string extra (string-to-char padding)))))
-(defun ledger-reconcile-s-left (len s)
- "Return up to the LEN first chars of S."
- (if (> (length s) len)
- (substring s 0 len)
- s))
-(defun ledger-reconcile-s-right (len s)
- "Return up to the LEN last chars of S."
- (let ((l (length s)))
- (if (> l len)
- (substring s (- l len) l)
- s)))
-
-(defun ledger-reconcile-truncate-right (str len)
- "Truncate STR right side with max LEN characters, and pad with '…' if truncated."
- (if (and (>= len 0) (> (length str) len))
- (ledger-reconcile-s-pad-right len "…" (ledger-reconcile-s-left (- len 1) str))
- str))
-
-(defun ledger-reconcile-truncate-left (str len)
- "Truncate STR left side with max LEN characters, and pad with '…' if truncated."
- (if (and (>= len 0) (> (length str) len))
- (ledger-reconcile-s-pad-left len "…" (ledger-reconcile-s-right (- len 1) str))
- str))
-
-(defun ledger-reconcile-get-cleared-or-pending-balance (buffer account)
- "Use BUFFER to Calculate the cleared or pending balance of the ACCOUNT."
-
- ;; these vars are buffer local, need to hold them for use in the
- ;; temp buffer below
-
- (with-temp-buffer
- ;; note that in the line below, the --format option is
- ;; separated from the actual format string. emacs does not
- ;; split arguments like the shell does, so you need to
- ;; specify the individual fields in the command line.
- (ledger-exec-ledger buffer (current-buffer)
- "balance" "--real" "--limit" "cleared or pending" "--empty" "--collapse"
- "--format" "%(scrub(display_total))" account)
- (ledger-split-commodity-string
- (buffer-substring-no-properties (point-min) (point-max)))))
-
-(defun ledger-display-balance ()
- "Display the cleared-or-pending balance.
-And calculate the target-delta of the account being reconciled."
- (interactive)
- (let* ((pending (ledger-reconcile-get-cleared-or-pending-balance ledger-buf ledger-acct)))
- (when pending
- (if ledger-target
- (message "Cleared and Pending balance: %s, Difference from target: %s"
- (ledger-commodity-to-string pending)
- (ledger-commodity-to-string (ledger-subtract-commodity ledger-target pending)))
- (message "Pending balance: %s"
- (ledger-commodity-to-string pending))))))
-
-(defun ledger-is-stdin (file)
- "True if ledger FILE is standard input."
- (or
- (equal file "")
- (equal file "<stdin>")
- (equal file "/dev/stdin")))
-
-(defun ledger-reconcile-get-buffer (where)
- "Return a buffer from WHERE the transaction is."
- (if (bufferp (car where))
- (car where)
- (error "Function ledger-reconcile-get-buffer: Buffer not set")))
-
-(defun ledger-reconcile-toggle ()
- "Toggle the current transaction, and mark the recon window."
- (interactive)
- (beginning-of-line)
- (let ((where (get-text-property (point) 'where))
- (inhibit-read-only t)
- status)
- (when (ledger-reconcile-get-buffer where)
- (with-current-buffer (ledger-reconcile-get-buffer where)
- (ledger-navigate-to-line (cdr where))
- (forward-char)
- (setq status (ledger-toggle-current (if ledger-reconcile-toggle-to-pending
- 'pending
- 'cleared)))
- (when ledger-reconcile-insert-effective-date
- ;; Ask for effective date & insert it
- (ledger-insert-effective-date)))
- ;; remove the existing face and add the new face
- (remove-text-properties (line-beginning-position)
- (line-end-position)
- (list 'font-lock-face))
- (cond ((eq status 'pending)
- (add-text-properties (line-beginning-position)
- (line-end-position)
- (list 'font-lock-face 'ledger-font-reconciler-pending-face )))
- ((eq status 'cleared)
- (add-text-properties (line-beginning-position)
- (line-end-position)
- (list 'font-lock-face 'ledger-font-reconciler-cleared-face )))
- (t
- (add-text-properties (line-beginning-position)
- (line-end-position)
- (list 'font-lock-face 'ledger-font-reconciler-uncleared-face )))))
- (forward-line)
- (beginning-of-line)
- (ledger-display-balance)))
-
-(defun ledger-reconcile-refresh ()
- "Force the reconciliation window to refresh.
-Return the number of uncleared xacts found."
- (interactive)
- (let ((inhibit-read-only t)
- (line (count-lines (point-min) (point))))
- (erase-buffer)
- (prog1
- (ledger-do-reconcile ledger-reconcile-sort-key)
- (set-buffer-modified-p t)
- (ledger-reconcile-ensure-xacts-visible)
- (goto-char (point-min))
- (forward-line line))))
-
-(defun ledger-reconcile-refresh-after-save ()
- "Refresh the recon-window after the ledger buffer is saved."
- (let ((curbufwin (get-buffer-window (current-buffer)))
- (curpoint (point))
- (recon-buf (get-buffer ledger-recon-buffer-name)))
- (when (buffer-live-p recon-buf)
- (with-current-buffer recon-buf
- (ledger-reconcile-refresh)
- (set-buffer-modified-p nil))
- (when curbufwin
- (select-window curbufwin)
- (goto-char curpoint)
- (recenter)
- (ledger-highlight-xact-under-point)))))
-
-(defun ledger-reconcile-add ()
- "Use ledger xact to add a new transaction."
- (interactive)
- (with-current-buffer ledger-buf
- (let ((date (ledger-read-date "Date: "))
- (text (read-string "Transaction: ")))
- (ledger-add-transaction (concat date " " text))))
- (ledger-reconcile-refresh))
-
-(defun ledger-reconcile-delete ()
- "Delete the transactions pointed to in the recon window."
- (interactive)
- (let ((where (get-text-property (point) 'where)))
- (when (ledger-reconcile-get-buffer where)
- (with-current-buffer (ledger-reconcile-get-buffer where)
- (ledger-navigate-to-line (cdr where))
- (ledger-delete-current-transaction (point)))
- (let ((inhibit-read-only t))
- (delete-region (line-beginning-position)
- (min (1+ (line-end-position)) (point-max)))
- (set-buffer-modified-p t))
- (ledger-reconcile-refresh)
- (ledger-reconcile-visit t))))
-
-(defun ledger-reconcile-visit (&optional come-back)
- "Recenter ledger buffer on transaction and COME-BACK if non-nil."
- (interactive)
- (beginning-of-line)
- (let* ((where (get-text-property (1+ (point)) 'where))
- (target-buffer (if where
- (ledger-reconcile-get-buffer where)
- nil))
- (cur-win (get-buffer-window (get-buffer ledger-recon-buffer-name))))
- (when target-buffer
- (switch-to-buffer-other-window target-buffer)
- (ledger-navigate-to-line (cdr where))
- (forward-char)
- (recenter)
- (ledger-highlight-xact-under-point)
- (forward-char -1)
- (when (and come-back cur-win)
- (select-window cur-win)
- (get-buffer ledger-recon-buffer-name)))))
-
-
-(defun ledger-reconcile-save ()
- "Save the ledger buffer."
- (interactive)
- (with-selected-window (selected-window) ; restoring window is needed because after-save-hook will modify window and buffers
- (dolist (buf (cons ledger-buf ledger-bufs))
- (with-current-buffer buf
- (basic-save-buffer)))))
-
-
-(defun ledger-reconcile-finish ()
- "Mark all pending posting or transactions as cleared.
-Depends on ledger-reconcile-clear-whole-transactions, save the buffers
-and exit reconcile mode if `ledger-reconcile-finish-force-quit'"
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (while (not (eobp))
- (let ((where (get-text-property (point) 'where))
- (face (get-text-property (point) 'font-lock-face)))
- (if (eq face 'ledger-font-reconciler-pending-face)
- (with-current-buffer (ledger-reconcile-get-buffer where)
- (ledger-navigate-to-line (cdr where))
- (ledger-toggle-current 'cleared))))
- (forward-line 1)))
- (ledger-reconcile-save)
- (when ledger-reconcile-finish-force-quit
- (ledger-reconcile-quit)))
-
-
-(defun ledger-reconcile-quit ()
- "Quit the reconcile window without saving ledger buffer."
- (interactive)
- (let ((recon-buf (get-buffer ledger-recon-buffer-name))
- buf)
- (if recon-buf
- (with-current-buffer recon-buf
- (ledger-reconcile-quit-cleanup)
- (setq buf ledger-buf)
- ;; Make sure you delete the window before you delete the buffer,
- ;; otherwise, madness ensues
- (delete-window (get-buffer-window recon-buf))
- (kill-buffer recon-buf)
- (set-window-buffer (selected-window) buf)))))
-
-(defun ledger-reconcile-quit-cleanup ()
- "Cleanup all hooks established by reconcile mode."
- (interactive)
- (let ((buf ledger-buf))
- (if (buffer-live-p buf)
- (with-current-buffer buf
- (remove-hook 'after-save-hook 'ledger-reconcile-refresh-after-save t)
- (when ledger-narrow-on-reconcile
- (ledger-occur-mode -1)
- (ledger-highlight-xact-under-point))))))
-
-(defun ledger-marker-where-xact-is (emacs-xact posting)
- "Find the position of the EMACS-XACT in the `ledger-buf'.
-POSTING is used in `ledger-clear-whole-transactions' is nil."
- (let ((buf (if (ledger-is-stdin (nth 0 emacs-xact))
- ledger-buf
- (find-file-noselect (nth 0 emacs-xact)))))
- (cons
- buf
- (if (or ledger-clear-whole-transactions
- ;; The posting might not be part of the ledger buffer. This can
- ;; happen if the account to reconcile is the default account. In
- ;; that case, we just behave as if ledger-clear-whole-transactions
- ;; was turned on. See #58 for more info.
- (= -1 (nth 0 posting)))
- (nth 1 emacs-xact) ;; return line-no of xact
- (nth 0 posting))))) ;; return line-no of posting
-
-(defun ledger-reconcile-compile-format-string (fstr)
- "Return a function that implements the format string in FSTR."
- (let (fields
- (start 0))
- (while (string-match "(\\(.*?\\))" fstr start)
- (setq fields (cons (intern (match-string 1 fstr)) fields))
- (setq start (match-end 0)))
- (setq fields (cl-list* 'format (replace-regexp-in-string "(.*?)" "" fstr) (nreverse fields)))
- `(lambda (date code status payee account amount)
- ,fields)))
-
-
-
-(defun ledger-reconcile-format-posting (beg where fmt date code status payee account amount)
- "Format posting for the reconcile buffer."
- (insert (funcall fmt date code status payee account amount))
-
- ; Set face depending on cleared status
- (if status
- (if (eq status 'pending)
- (set-text-properties beg (1- (point))
- (list 'font-lock-face 'ledger-font-reconciler-pending-face
- 'where where))
- (set-text-properties beg (1- (point))
- (list 'font-lock-face 'ledger-font-reconciler-cleared-face
- 'where where)))
- (set-text-properties beg (1- (point))
- (list 'font-lock-face 'ledger-font-reconciler-uncleared-face
- 'where where))))
-
-(defun ledger-reconcile-format-xact (xact fmt)
- "Format XACT using FMT."
- (dolist (posting (nthcdr 5 xact))
- (let ((beg (point))
- (where (ledger-marker-where-xact-is xact posting)))
- (ledger-reconcile-format-posting beg
- where
- fmt
- (ledger-format-date (nth 2 xact)) ; date
- (if (nth 3 xact) (nth 3 xact) "") ; code
- (nth 3 posting) ; status
- (ledger-reconcile-truncate-right
- (nth 4 xact) ; payee
- ledger-reconcile-buffer-payee-max-chars)
- (ledger-reconcile-truncate-left
- (nth 1 posting) ; account
- ledger-reconcile-buffer-account-max-chars)
- (nth 2 posting))))) ; amount
-
-(defun ledger-do-reconcile (&optional sort)
- "SORT the uncleared transactions in the account and display them in the *Reconcile* buffer.
-Return a count of the uncleared transactions."
- (let* ((buf ledger-buf)
- (account ledger-acct)
- (sort-by (if sort
- sort
- "(date)"))
- (xacts
- (with-temp-buffer
- (ledger-exec-ledger buf (current-buffer)
- "--uncleared" "--real" "emacs" "--sort" sort-by account)
- (goto-char (point-min))
- (unless (eobp)
- (if (looking-at "(")
- (read (current-buffer))))))
- (fmt (ledger-reconcile-compile-format-string ledger-reconcile-buffer-line-format)))
- (if (> (length xacts) 0)
- (progn
- (if ledger-reconcile-buffer-header
- (insert (format ledger-reconcile-buffer-header account)))
- (dolist (xact xacts)
- (ledger-reconcile-format-xact xact fmt))
- (goto-char (point-max))
- (delete-char -1)) ;gets rid of the extra line feed at the bottom of the list
- (insert (concat "There are no uncleared entries for " account)))
- (goto-char (point-min))
- (set-buffer-modified-p nil)
- (setq buffer-read-only t)
-
- (length xacts)))
-
-(defun ledger-reconcile-ensure-xacts-visible ()
- "Ensure the last of the visible transactions in the ledger buffer is at the bottom of the main window.
-The key to this is to ensure the window is selected when the buffer point is
-moved and recentered. If they aren't strange things happen."
-
- (let ((recon-window (get-buffer-window (get-buffer ledger-recon-buffer-name))))
- (when recon-window
- (fit-window-to-buffer recon-window)
- (with-current-buffer ledger-buf
- (add-hook 'kill-buffer-hook 'ledger-reconcile-quit nil t)
- (if (get-buffer-window ledger-buf)
- (select-window (get-buffer-window ledger-buf)))
- (recenter))
- (select-window recon-window)
- (ledger-reconcile-visit t))
- (add-hook 'post-command-hook 'ledger-reconcile-track-xact nil t)))
-
-(defun ledger-reconcile-track-xact ()
- "Force the ledger buffer to recenter on the transaction at point in the reconcile buffer."
- (if (and ledger-buffer-tracks-reconcile-buffer
- (member this-command (list 'next-line
- 'previous-line
- 'mouse-set-point
- 'ledger-reconcile-toggle
- 'end-of-buffer
- 'beginning-of-buffer)))
- (save-excursion
- (ledger-reconcile-visit t))))
-
-(defun ledger-reconcile-open-windows (buf rbuf)
- "Ensure that the ledger buffer BUF is split by RBUF."
- (if ledger-reconcile-force-window-bottom
- ;;create the *Reconcile* window directly below the ledger buffer.
- (set-window-buffer (split-window (get-buffer-window buf) nil nil) rbuf)
- (pop-to-buffer rbuf)))
-
-(defun ledger-reconcile-check-valid-account (account)
- "Check to see if ACCOUNT exists in the ledger file."
- (if (> (length account) 0)
- (save-excursion
- (goto-char (point-min))
- (search-forward account nil t))))
-
-(defun ledger-reconcile (&optional account target)
- "Start reconciling, prompt for ACCOUNT."
- (interactive)
- (let ((account (or account (ledger-read-account-with-prompt "Account to reconcile")))
- (buf (current-buffer))
- (rbuf (get-buffer ledger-recon-buffer-name)))
-
- (when (ledger-reconcile-check-valid-account account)
- (if rbuf ;; *Reconcile* already exists
- (with-current-buffer rbuf
- (set 'ledger-acct account) ;; already buffer local
- (when (not (eq buf rbuf))
- ;; called from some other ledger-mode buffer
- (ledger-reconcile-quit-cleanup)
- (setq ledger-buf buf)) ;; should already be buffer-local
-
- (unless (get-buffer-window rbuf)
- (ledger-reconcile-open-windows buf rbuf)))
-
- ;; no recon-buffer, starting from scratch.
-
- (with-current-buffer (setq rbuf
- (get-buffer-create ledger-recon-buffer-name))
- (ledger-reconcile-open-windows buf rbuf)
- (ledger-reconcile-mode)
- (make-local-variable 'ledger-target)
- (set (make-local-variable 'ledger-buf) buf)
- (set (make-local-variable 'ledger-acct) account)))
-
- (add-hook 'after-save-hook 'ledger-reconcile-refresh-after-save nil t)
-
- ;; Narrow the ledger buffer
- (with-current-buffer rbuf
- (save-excursion
- (if ledger-narrow-on-reconcile
- (ledger-occur account)))
- (if (> (ledger-reconcile-refresh) 0)
- (ledger-reconcile-change-target target))
- (ledger-display-balance)))))
-
-(defvar ledger-reconcile-mode-abbrev-table)
-
-(defun ledger-reconcile-change-target (&optional target)
- "Change the TARGET amount for the reconciliation process."
- (interactive)
- (setq ledger-target (or target (ledger-read-commodity-string ledger-reconcile-target-prompt-string))))
-
-(defmacro ledger-reconcile-change-sort-key-and-refresh (sort-by)
- "Set the sort-key to SORT-BY."
- `(lambda ()
- (interactive)
-
- (setq ledger-reconcile-sort-key ,sort-by)
- (ledger-reconcile-refresh)))
-
-(defvar ledger-reconcile-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [(control ?m)] #'ledger-reconcile-visit)
- (define-key map [return] #'ledger-reconcile-visit)
- (define-key map [(control ?x) (control ?s)] #'ledger-reconcile-save)
- (define-key map [(control ?l)] #'ledger-reconcile-refresh)
- (define-key map [(control ?c) (control ?c)] #'ledger-reconcile-finish)
- (define-key map [? ] #'ledger-reconcile-toggle)
- (define-key map [?a] #'ledger-reconcile-add)
- (define-key map [?d] #'ledger-reconcile-delete)
- (define-key map [?g] #'ledger-reconcile);
- (define-key map [?n] #'next-line)
- (define-key map [?p] #'previous-line)
- (define-key map [?t] #'ledger-reconcile-change-target)
- (define-key map [?s] #'ledger-reconcile-save)
- (define-key map [?q] #'ledger-reconcile-quit)
- (define-key map [?b] #'ledger-display-balance)
-
- (define-key map [(control ?c) (control ?o)] (ledger-reconcile-change-sort-key-and-refresh "(0)"))
-
- (define-key map [(control ?c) (control ?a)] (ledger-reconcile-change-sort-key-and-refresh "(amount)"))
-
- (define-key map [(control ?c) (control ?d)] (ledger-reconcile-change-sort-key-and-refresh "(date)"))
-
- (define-key map [(control ?c) (control ?p)] (ledger-reconcile-change-sort-key-and-refresh "(payee)"))
- map)
- "Keymap for `ledger-reconcile-mode'.")
-
-(easy-menu-define ledger-reconcile-mode-menu ledger-reconcile-mode-map
- "Ledger reconcile menu"
- `("Reconcile"
- ["Save" ledger-reconcile-save]
- ["Refresh" ledger-reconcile-refresh]
- ["Finish" ledger-reconcile-finish]
- "---"
- ["Reconcile New Account" ledger-reconcile]
- "---"
- ["Change Target Balance" ledger-reconcile-change-target]
- ["Show Cleared Balance" ledger-display-balance]
- "---"
- ["Sort by payee" ,(ledger-reconcile-change-sort-key-and-refresh "(payee)")]
- ["Sort by date" ,(ledger-reconcile-change-sort-key-and-refresh "(date)")]
- ["Sort by amount" ,(ledger-reconcile-change-sort-key-and-refresh "(amount)")]
- ["Sort by file order" ,(ledger-reconcile-change-sort-key-and-refresh "(0)")]
- "---"
- ["Toggle Entry" ledger-reconcile-toggle]
- ["Add Entry" ledger-reconcile-add]
- ["Delete Entry" ledger-reconcile-delete]
- "---"
- ["Next Entry" next-line]
- ["Visit Source" ledger-reconcile-visit]
- ["Previous Entry" previous-line]
- "---"
- ["Quit" ledger-reconcile-quit]
- ))
-
-(define-derived-mode ledger-reconcile-mode text-mode "Reconcile"
- "A mode for reconciling ledger entries.")
-
-(provide 'ledger-reconcile)
-
-;;; ledger-reconcile.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-regex.el b/elpa/ledger-mode-20200530.1710/ledger-regex.el
deleted file mode 100644
index 6b0db98..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-regex.el
+++ /dev/null
@@ -1,413 +0,0 @@
-;;; ledger-regex.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Regular expressions used by ledger-mode.
-
-;;; Code:
-
-(require 'rx)
-(require 'cl-lib)
-
-(defvar ledger-iso-date-regex)
-
-(defconst ledger-amount-decimal-comma-regex
- "-?[1-9][0-9.]*[,]?[0-9]*")
-
-(defconst ledger-amount-decimal-period-regex
- "-?[1-9][0-9,]*[.]?[0-9]*")
-
-(defconst ledger-other-entries-regex
- "\\(^[~=A-Za-z].+\\)+")
-
-(defconst ledger-comment-regex
- "^[;#|\\*%].*\\|[ \t]+;.*")
-
-(defconst ledger-multiline-comment-start-regex
- "^!comment$")
-(defconst ledger-multiline-comment-end-regex
- "^!end_comment$")
-(defconst ledger-multiline-comment-regex
- "^!comment\n\\(.*\n\\)*?!end_comment$")
-
-(defconst ledger-payee-any-status-regex
- "^[0-9]+[-/][-/.=0-9]+\\(\\s-+\\*\\)?\\(\\s-+(.*?)\\)?\\s-+\\(.+?\\)\\s-*\\(;\\|$\\)")
-
-(defconst ledger-payee-pending-regex
- "^[0-9]+[-/][-/.=0-9]+\\s-!\\s-+\\(([^)]+)\\s-+\\)?\\([^*].+?\\)\\s-*\\(;\\|$\\)")
-
-(defconst ledger-payee-cleared-regex
- "^[0-9]+[-/][-/.=0-9]+\\s-\\*\\s-+\\(([^)]+)\\s-+\\)?\\([^*].+?\\)\\s-*\\(;\\|$\\)")
-
-(defconst ledger-payee-uncleared-regex
- "^[0-9]+[-/][-/.=0-9]+\\s-+\\(([^)]+)\\s-+\\)?\\([^*].+?\\)\\s-*\\(;\\|$\\)")
-
-(defconst ledger-init-string-regex
- "^--.+?\\($\\|[ ]\\)")
-
-(defconst ledger-account-name-regex
- "\\(?1:[^][(); \t\r\n]+\\(?: [^][(); \t\r\n]+\\)*\\)")
-
-(defconst ledger-account-directive-regex
- (concat "^account[ \t]+" ledger-account-name-regex))
-
-(defconst ledger-account-name-maybe-virtual-regex
- (concat "[[(]?" ledger-account-name-regex "[])]?"))
-
-(defconst ledger-account-any-status-regex
- (concat "^[ \t]+\\(?:[!*][ \t]*\\)?" ledger-account-name-maybe-virtual-regex))
-
-;; This would incorrectly match "account (foo)", but writing the regexp this way
-;; allows us to have just one match result
-(defconst ledger-account-name-or-directive-regex
- (format "\\(?:%s\\|%s\\)" ledger-account-any-status-regex ledger-account-directive-regex))
-
-(defconst ledger-account-pending-regex
- (concat "\\(^[ \t]+\\)!" ledger-account-name-maybe-virtual-regex))
-
-(defconst ledger-account-cleared-regex
- (concat "\\(^[ \t]+\\)*" ledger-account-name-maybe-virtual-regex))
-
-(defmacro ledger-define-regexp (name regex docs &rest args)
- "Simplify the creation of a Ledger regex and helper functions."
- (let ((defs
- (list
- `(defconst
- ,(intern (concat "ledger-" (symbol-name name) "-regexp"))
- ,(eval regex)
- ,docs)))
- (addend 0) last-group)
- (if (null args)
- (progn
- (nconc
- defs
- (list
- `(defconst
- ,(intern
- (concat "ledger-regex-" (symbol-name name) "-group"))
- 1)))
- (nconc
- defs
- (list
- `(defconst
- ,(intern (concat "ledger-regex-" (symbol-name name)
- "-group--count"))
- 1)))
- (nconc
- defs
- (list
- `(defmacro
- ,(intern (concat "ledger-regex-" (symbol-name name)))
- (&optional string)
- ,(format "Return the match string for the %s" name)
- (match-string
- ,(intern (concat "ledger-regex-" (symbol-name name)
- "-group"))
- string)))))
-
- (dolist (arg args)
- (let (var grouping target)
- (if (symbolp arg)
- (setq var arg target arg)
- (cl-assert (listp arg))
- (if (= 2 (length arg))
- (setq var (car arg)
- target (cadr arg))
- (setq var (car arg)
- grouping (cadr arg)
- target (cl-caddr arg))))
-
- (if (and last-group
- (not (eq last-group (or grouping target))))
- (cl-incf addend
- (symbol-value
- (intern-soft (concat "ledger-regex-"
- (symbol-name last-group)
- "-group--count")))))
- (nconc
- defs
- (list
- `(defconst
- ,(intern (concat "ledger-regex-" (symbol-name name)
- "-group-" (symbol-name var)))
- ,(+ addend
- (symbol-value
- (intern-soft
- (if grouping
- (concat "ledger-regex-" (symbol-name grouping)
- "-group-" (symbol-name target))
- (concat "ledger-regex-" (symbol-name target)
- "-group"))))))))
- (nconc
- defs
- (list
- `(defmacro
- ,(intern (concat "ledger-regex-" (symbol-name name)
- "-" (symbol-name var)))
- (&optional string)
- ,(format "Return the sub-group match for the %s %s."
- name var)
- (match-string
- ,(intern (concat "ledger-regex-" (symbol-name name)
- "-group-" (symbol-name var)))
- string))))
-
- (setq last-group (or grouping target))))
-
- (nconc defs
- (list
- `(defconst ,(intern (concat "ledger-regex-" (symbol-name name)
- "-group--count"))
- ,(length args)))))
-
- (cons 'eval-and-compile defs)))
-
-(put 'ledger-define-regexp 'lisp-indent-function 1)
-
-(ledger-define-regexp iso-date
- ( let ((sep '(or ?- ?/)))
- (rx (group
- (and (group (= 4 num))
- (eval sep)
- (group (and num (? num)))
- (eval sep)
- (group (and num (? num)))))))
- "Match a single date, in its 'written' form.")
-
-(ledger-define-regexp full-date
- (macroexpand
- `(rx (and (regexp ,ledger-iso-date-regexp)
- (? (and ?= (regexp ,ledger-iso-date-regexp))))))
- "Match a compound date, of the form ACTUAL=EFFECTIVE"
- (actual iso-date)
- (effective iso-date))
-
-(ledger-define-regexp state
- (rx (group (any ?! ?*)))
- "Match a transaction or posting's \"state\" character.")
-
-(ledger-define-regexp code
- (rx (and ?\( (group (+? (not (any ?\))))) ?\)))
- "Match the transaction code.")
-
-(ledger-define-regexp long-space
- (rx (and (*? blank)
- (or (and ? (or ? ?\t)) ?\t)))
- "Match a \"long space\".")
-
-(ledger-define-regexp note
- (rx (group (+ nonl)))
- "")
-
-(ledger-define-regexp end-note
- (macroexpand
- `(rx (and (regexp ,ledger-long-space-regexp) ?\;
- (regexp ,ledger-note-regexp))))
- "")
-
-(ledger-define-regexp full-note
- (macroexpand
- `(rx (and line-start (+ blank)
- ?\; (regexp ,ledger-note-regexp))))
- "")
-
-(ledger-define-regexp xact-line
- (macroexpand
- `(rx (and line-start
- (regexp ,ledger-full-date-regexp)
- (? (and (+ blank) (regexp ,ledger-state-regexp)))
- (? (and (+ blank) (regexp ,ledger-code-regexp)))
- (+ blank) (+? nonl)
- (? (regexp ,ledger-end-note-regexp))
- line-end)))
- "Match a transaction's first line (and optional notes)."
- (actual-date full-date actual)
- (effective-date full-date effective)
- state
- code
- (note end-note))
-
-(ledger-define-regexp recurring-line
- (macroexpand
- `(rx (and line-start
- (regexp "\\[.+/.+/.+\\]")
- (? (and (+ blank) (regexp ,ledger-state-regexp)))
- (? (and (+ blank) (regexp ,ledger-code-regexp)))
- (+ blank) (+? nonl)
- (? (regexp ,ledger-end-note-regexp))
- line-end)))
- "Match a transaction's first line (and optional notes)."
- (actual-date full-date actual)
- (effective-date full-date effective)
- state
- code
- (note end-note))
-
-(ledger-define-regexp account
- (rx (group (and (not (any blank ?\[ ?\( ?: ?\;)) (*? nonl))))
- "")
-
-(ledger-define-regexp account-kind
- (rx (group (? (any ?\[ ?\())))
- "")
-
-(ledger-define-regexp full-account
- (macroexpand
- `(rx (and (regexp ,ledger-account-kind-regexp)
- (regexp ,ledger-account-regexp)
- (? (any ?\] ?\))))))
- ""
- (kind account-kind)
- (name account))
-
-(ledger-define-regexp commodity-no-group
- (rx (or (and ?\" (+ (not (any ?\"))) ?\")
- (+ (not (any blank ?\n
- digit
- ?- ?\[ ?\]
- ?. ?, ?\; ?+ ?* ?/ ?^ ?? ?: ?& ?| ?! ?=
- ?\< ?\> ?\{ ?\} ?\( ?\) ?@)))))
- "")
-
-(ledger-define-regexp commodity
- (macroexpand
- `(rx (group (regexp ,ledger-commodity-no-group-regexp))))
- "")
-
-(ledger-define-regexp amount-no-group
- (rx (and (? ?-)
- (+ digit)
- (*? (and (any ?. ?,) (+ digit)))))
- "")
-
-(ledger-define-regexp amount
- (macroexpand
- `(rx (group (regexp ,ledger-amount-no-group-regexp))))
- "")
-
-(ledger-define-regexp commoditized-amount
- (macroexpand
- `(rx (group
- (or (and (regexp ,ledger-commodity-no-group-regexp)
- (*? blank)
- (regexp ,ledger-amount-no-group-regexp))
- (and (regexp ,ledger-amount-no-group-regexp)
- (*? blank)
- (regexp ,ledger-commodity-no-group-regexp))))))
- "")
-
-(ledger-define-regexp commodity-annotations
- (macroexpand
- `(rx (* (+ blank)
- (or (and ?\{ (regexp ,ledger-commoditized-amount-regexp) ?\})
- (and ?\[ (regexp ,ledger-iso-date-regexp) ?\])
- (and ?\( (not (any ?\))) ?\))))))
- "")
-
-(ledger-define-regexp cost
- (macroexpand
- `(rx (and (or "@" "@@") (+ blank)
- (regexp ,ledger-commoditized-amount-regexp))))
- "")
-
-(ledger-define-regexp balance-assertion
- (macroexpand
- `(rx (and ?= (+ blank)
- (regexp ,ledger-commoditized-amount-regexp))))
- "")
-
-(ledger-define-regexp full-amount
- (macroexpand `(rx (group (+? (not (any ?\;))))))
- "")
-
-(ledger-define-regexp post-line
- (macroexpand
- `(rx (and line-start (+ blank)
- (? (and (regexp ,ledger-state-regexp) (* blank)))
- (regexp ,ledger-full-account-regexp)
- (? (and (regexp ,ledger-long-space-regexp)
- (regexp ,ledger-full-amount-regexp)))
- (? (regexp ,ledger-end-note-regexp))
- line-end)))
- ""
- state
- (account-kind full-account kind)
- (account full-account name)
- (amount full-amount)
- (note end-note))
-
-(defconst ledger-amount-regex
- (concat "\\( \\|\t\\| \t\\)[ \t]*-?"
- "\\(?:" ledger-commodity-regexp " *\\)?"
- ;; We either match just a number after the commodity with no
- ;; decimal or thousand separators or a number with thousand
- ;; separators. If we have a decimal part starting with `,'
- ;; or `.', because the match is non-greedy, it must leave at
- ;; least one of those symbols for the following capture
- ;; group, which then finishes the decimal part.
- "\\(-?\\(?:[0-9]+\\|[0-9,.]+?\\)\\)"
- "\\([,.][0-9)]+\\)?"
- "\\(?: *" ledger-commodity-regexp "\\)?"
- "\\([ \t]*[@={]@?[^\n;]+?\\)?"
- "\\([ \t]+;.+?\\|[ \t]*\\)?$"))
-
-(defconst ledger-iterate-regex
- (concat "\\(\\(?:Y\\|year\\)\\s-+\\([0-9]+\\)\\|" ;; Catches a Y/year directive
- ledger-iso-date-regexp
- "\\([ *!]+\\)" ;; mark
- "\\((.*)\\)?" ;; code
- "\\([[:word:] ]+\\)" ;; desc
- "\\)"))
-
-(defconst ledger-incomplete-date-regexp
- "\\(?:\\([0-9]\\{1,2\\}\\)[-/]\\)?\\([0-9]\\{1,2\\}\\)")
-
-(defconst ledger-xact-start-regex
- (concat "^" ledger-iso-date-regexp ;; subexp 1
- "\\(=" ledger-iso-date-regexp "\\)?"
- ))
-
-(defconst ledger-xact-after-date-regex
- (concat "\\(?:[ \t]+\\([*!]\\)\\)?" ;; mark, subexp 1
- "\\(?:[ \t]+\\((.*?)\\)\\)?" ;; code, subexp 2
- "\\(?:[ \t]+\\(.+?\\)\\)?" ;; desc, subexp 3
- "\\(?:\\(?:\t\\|[ \t]\\{2,\\}\\)\\(;[^\n]*\\)\\)?$" ;; comment, subexp 4
- ))
-
-(defconst ledger-posting-regex
- (concat "^[[:blank:]]+" ; initial white space
- "\\(\\([*!]\\)?" ; state and account 1, state 2
- "[[:blank:]]*\\(.*?\\)\\)?" ; account 3
- "\\(?:\t\\|[[:blank:]]\\{2,\\}" ; column separator
- "\\([^;\n]*?\\)" ; amount 4
- "[[:blank:]]*\\(;.*\\)?\\)?$" ; comment 5
- ))
-
-
-
-(defconst ledger-directive-start-regex
- "[=~;#%|\\*[A-Za-z]")
-
-
-(provide 'ledger-regex)
-
-;;; ledger-regex.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-report.el b/elpa/ledger-mode-20200530.1710/ledger-report.el
deleted file mode 100644
index 67ba238..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-report.el
+++ /dev/null
@@ -1,672 +0,0 @@
-;;; ledger-report.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Provide facilities for running and saving reports in Emacs
-
-;;; Code:
-
-(require 'ledger-xact)
-(require 'ledger-navigate)
-(require 'ledger-commodities)
-(declare-function ledger-read-string-with-default "ledger-mode" (prompt default))
-(declare-function ledger-read-account-with-prompt "ledger-mode" (prompt))
-
-(require 'easymenu)
-(require 'ansi-color)
-(require 'font-lock)
-(eval-when-compile
- (require 'rx)
- (require 'subr-x))
-
-(defvar ledger-buf)
-
-(defgroup ledger-report nil
- "Customization option for the Report buffer"
- :group 'ledger)
-
-(defcustom ledger-reports
- '(("bal" "%(binary) -f %(ledger-file) bal")
- ("reg" "%(binary) -f %(ledger-file) reg")
- ("payee" "%(binary) -f %(ledger-file) reg @%(payee)")
- ("account" "%(binary) -f %(ledger-file) reg %(account)"))
- "Definition of reports to run.
-
-Each element has the form (NAME CMDLINE). The command line can
-contain format specifiers that are replaced with context sensitive
-information. Format specifiers have the format '%(<name>)' where
-<name> is an identifier for the information to be replaced. The
-`ledger-report-format-specifiers' alist variable contains a mapping
-from format specifier identifier to a Lisp function that implements
-the substitution. See the documentation of the individual functions
-in that variable for more information on the behavior of each
-specifier."
- :type '(repeat (list (string :tag "Report Name")
- (string :tag "Command Line")))
- :group 'ledger-report)
-
-(defcustom ledger-report-format-specifiers
- '(("ledger-file" . ledger-report-ledger-file-format-specifier)
- ("binary" . ledger-report-binary-format-specifier)
- ("payee" . ledger-report-payee-format-specifier)
- ("account" . ledger-report-account-format-specifier)
- ("month" . ledger-report-month-format-specifier)
- ("tagname" . ledger-report-tagname-format-specifier)
- ("tagvalue" . ledger-report-tagvalue-format-specifier))
- "An alist mapping ledger report format specifiers to implementing functions.
-
-The function is called with no parameters and expected to return
-a string, or a list of strings, that should replace the format specifier.
-Single strings are quoted with `shell-quote-argument'; lists of strings are
-simply concatenated (no quoting)."
- :type 'alist
- :group 'ledger-report)
-
-(defcustom ledger-report-auto-refresh t
- "If non-nil, automatically rerun the report when the ledger buffer is saved."
- :type 'boolean
- :group 'ledger-report)
-
-(defcustom ledger-report-auto-refresh-sticky-cursor nil
- "If non-nil, place cursor at same relative position as it was before auto-refresh."
- :type 'boolean
- :group 'ledger-report)
-
-(defcustom ledger-report-links-in-register t
- "If non-nil, link entries in \"register\" reports to entries in the ledger buffer."
- :type 'boolean
- :group 'ledger-report)
-
-(defcustom ledger-report-use-native-highlighting t
- "When non-nil, use ledger's native highlighting in reports."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defcustom ledger-report-auto-width t
- "When non-nil, tell ledger about the width of the report window."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defcustom ledger-report-use-header-line nil
- "If non-nil, indicate report name/command in the `header-line'.
-The report name/command won't be printed in the buffer. See
-`ledger-report-header-line-fn' for how to customize the
-information reported."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defcustom ledger-report-header-line-fn #'ledger-report--header-function
- "Evaluate this function in the `header-line' of the report buffer.
-`ledger-report-use-header-line' must be non-nil for this to have any effect."
- :type 'function
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defcustom ledger-report-resize-window t
- "If non-nil, resize the report window.
-Calls `shrink-window-if-larger-than-buffer'."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defcustom ledger-report-use-strict nil
- "When non-nil, `ledger-mode' will use --strict when running reports?"
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defcustom ledger-report-after-report-hook nil
- "Hook run after `ledger-report' has created the buffer and report."
- :type 'boolean
- :package-version '(ledger-mode . "4.0.0")
- :group 'ledger-report)
-
-(defvar ledger-report-buffer-name "*Ledger Report*")
-
-(defvar ledger-report-name nil)
-(defvar ledger-report-cmd nil)
-(defvar ledger-report-name-prompt-history nil)
-(defvar ledger-report-cmd-prompt-history nil)
-(defvar ledger-original-window-cfg nil)
-(defvar ledger-report-saved nil)
-(defvar ledger-minibuffer-history nil)
-(defvar ledger-report-mode-abbrev-table)
-(defvar ledger-report-current-month nil)
-
-(defvar ledger-report-is-reversed nil)
-(defvar ledger-report-cursor-line-number nil)
-(defvar-local ledger-master-file nil
- "The master file for the current buffer.
-See documentation for the function `ledger-master-file'")
-
-(defun ledger-report-reverse-report ()
- "Reverse the order of the report."
- (interactive)
- (ledger-report-reverse-lines)
- (setq ledger-report-is-reversed (not ledger-report-is-reversed)))
-
-(defun ledger-report-reverse-lines ()
- "Reverse the lines in the ledger report buffer."
- (with-silent-modifications
- (goto-char (point-min))
- (unless ledger-report-use-header-line
- (forward-paragraph)
- (forward-line))
- (save-excursion
- (reverse-region (point) (point-max)))))
-
-(defun ledger-report-maybe-shrink-window ()
- "Shrink window if `ledger-report-resize-window' is non-nil."
- (when ledger-report-resize-window
- (shrink-window-if-larger-than-buffer)))
-
-(defvar ledger-report-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [?r] #'ledger-report-redo)
- (define-key map [(shift ?r)] #'ledger-report-reverse-report)
- (define-key map [?s] #'ledger-report-save)
- (define-key map [(shift ?s)] #'ledger-report)
- (define-key map [?e] #'ledger-report-edit-report)
- (define-key map [( shift ?e)] #'ledger-report-edit-reports)
- (define-key map [?q] #'ledger-report-quit)
- (define-key map [(control ?c) (control ?l) (control ?r)]
- #'ledger-report-redo)
- (define-key map [(control ?c) (control ?l) (control ?S)]
- #'ledger-report-save)
- (define-key map [(control ?c) (control ?l) (control ?e)]
- #'ledger-report-edit-report)
- (define-key map [(control ?c) (control ?o) (control ?r)] #'ledger-report)
- (define-key map (kbd "M-p") #'ledger-report-previous-month)
- (define-key map (kbd "M-n") #'ledger-report-next-month)
- (define-key map (kbd "$") #'ledger-report-toggle-default-commodity)
- map)
- "Keymap for `ledger-report-mode'.")
-
-(easy-menu-define ledger-report-mode-menu ledger-report-mode-map
- "Ledger report menu"
- '("Reports"
- ["Select Report" ledger-report]
- ["Save Report" ledger-report-save]
- ["Edit Current Report" ledger-report-edit-report]
- ["Edit All Reports" ledger-report-edit-reports]
- ["Re-run Report" ledger-report-redo]
- "---"
- ["Reverse report order" ledger-report-reverse-report]
- "---"
- ["Scroll Up" scroll-up]
- ["Visit Source" ledger-report-visit-source]
- ["Scroll Down" scroll-down]
- "---"
- ["Quit" ledger-report-quit]
- ))
-
-(define-derived-mode ledger-report-mode special-mode "Ledger-Report"
- "A mode for viewing ledger reports."
- (setq-local revert-buffer-function #'ledger-report-redo)
- (hack-dir-local-variables-non-file-buffer))
-
-(defconst ledger-report--extra-args-marker "[[ledger-mode-flags]]")
-
-(defun ledger-report-binary-format-specifier ()
- "Return the path to ledger, plus a marker for extra arguments."
- (list (shell-quote-argument ledger-binary-path)
- ledger-report--extra-args-marker))
-
-(defun ledger-report-tagname-format-specifier ()
- "Return a valid meta-data tag name."
- ;; It is intended completion should be available on existing tag
- ;; names, but it remains to be implemented.
- (ledger-read-string-with-default "Tag Name: " nil))
-
-(defun ledger-report-tagvalue-format-specifier ()
- "Return a valid meta-data tag name."
- ;; It is intended completion should be available on existing tag
- ;; values, but it remains to be implemented.
- (ledger-read-string-with-default "Tag Value: " nil))
-
-(defun ledger-report-read-name ()
- "Read the name of a ledger report to use, with completion.
-
-The empty string and unknown names are allowed."
- (completing-read "Report name: "
- ledger-reports nil nil nil
- 'ledger-report-name-prompt-history nil))
-
-(defun ledger-report (report-name edit)
- "Run a user-specified report from `ledger-reports'.
-
-Prompts the user for the REPORT-NAME of the report to run or
-EDIT. If no name is entered, the user will be prompted for a
-command line to run. The command line specified or associated
-with the selected report name is run and the output is made
-available in another buffer for viewing. If a prefix argument is
-given and the user selects a valid report name, the user is
-prompted with the corresponding command line for editing before
-the command is run.
-
-The output buffer will be in `ledger-report-mode', which defines
-commands for saving a new named report based on the command line
-used to generate the buffer, navigating the buffer, etc."
- (interactive
- (progn
- (when (and (buffer-modified-p)
- (y-or-n-p "Buffer modified, save it? "))
- (save-buffer))
- (let ((rname (ledger-report-read-name))
- (edit (not (null current-prefix-arg))))
- (list rname edit))))
- (let* ((file (ledger-master-file))
- (buf (find-file-noselect file))
- (wcfg (current-window-configuration)))
- (with-current-buffer
- (pop-to-buffer (get-buffer-create ledger-report-buffer-name))
- (with-silent-modifications
- (erase-buffer)
- (ledger-report-mode)
- (set (make-local-variable 'ledger-report-saved) nil)
- (set (make-local-variable 'ledger-buf) buf)
- (set (make-local-variable 'ledger-report-name) report-name)
- (set (make-local-variable 'ledger-original-window-cfg) wcfg)
- (set (make-local-variable 'ledger-report-is-reversed) nil)
- (set (make-local-variable 'ledger-report-current-month) nil)
- (set 'ledger-master-file file)
- (ledger-do-report (ledger-report-cmd report-name edit)))
- (ledger-report-maybe-shrink-window)
- (run-hooks 'ledger-report-after-report-hook)
- (message (substitute-command-keys (concat "\\[ledger-report-quit] to quit; "
- "\\[ledger-report-redo] to redo; "
- "\\[ledger-report-edit-report] to edit; "
- "\\[ledger-report-save] to save; "
- "\\[scroll-up-command] and \\[scroll-down-command] to scroll"))))))
-
-(defun ledger-report--header-function ()
- "Compute the string to be used as the header in the `ledger-report' buffer."
- (format "Ledger Report: %s -- Buffer: %s -- Command: %s"
- (propertize ledger-report-name 'face 'font-lock-constant-face)
- (propertize (buffer-name ledger-buf) 'face 'font-lock-string-face)
- (propertize ledger-report-cmd 'face 'font-lock-comment-face)))
-
-(defun ledger-report-string-empty-p (s)
- "Check S for the empty string."
- (string-equal "" s))
-
-(defun ledger-report-name-exists (name)
- "Check to see if the given report NAME exists.
-
- If name exists, returns the object naming the report,
- otherwise returns nil."
- (unless (ledger-report-string-empty-p name)
- (car (assoc name ledger-reports))))
-
-(defun ledger-reports-add (name cmd)
- "Add a new report NAME and CMD to `ledger-reports'."
- (setq ledger-reports (cons (list name cmd) ledger-reports)))
-
-(defun ledger-reports-custom-save ()
- "Save the `ledger-reports' variable using the customize framework."
- (customize-save-variable 'ledger-reports ledger-reports))
-
-(defun ledger-report-read-command (report-cmd)
- "Read the command line to create a report from REPORT-CMD."
- (read-from-minibuffer "Report command line: "
- (if (null report-cmd) "ledger " report-cmd)
- nil nil 'ledger-report-cmd-prompt-history))
-
-(defun ledger-report-ledger-file-format-specifier ()
- "Substitute the full path to master or current ledger file.
-
- The master file name is determined by the variable `ledger-master-file'
- buffer-local variable which can be set using file variables.
- If it is set, it is used, otherwise the current buffer file is
- used."
- (ledger-master-file))
-
-;; General helper functions
-
-(defun ledger-master-file ()
- "Return the master file for a ledger file.
-
- The master file is either the file for the current ledger buffer or the
- file specified by the buffer-local variable `ledger-master-file'. Typically
- this variable would be set in a file local variable comment block at the
- end of a ledger file which is included in some other file."
- (if ledger-master-file
- (expand-file-name ledger-master-file)
- (buffer-file-name)))
-
-(defun ledger-report-payee-format-specifier ()
- "Substitute a payee name.
-
- The user is prompted to enter a payee and that is substitued. If
- point is in an xact, the payee for that xact is used as the
- default."
- ;; It is intended completion should be available on existing
- ;; payees, but the list of possible completions needs to be
- ;; developed to allow this.
- (if-let ((payee (ledger-xact-payee)))
- (ledger-read-string-with-default "Payee" (regexp-quote payee))
- (ledger-read-string-with-default "Payee" nil)))
-
-(defun ledger-report-account-format-specifier ()
- "Substitute an account name.
-
- The user is prompted to enter an account name, which can be any
- regular expression identifying an account. If point is on an account
- posting line for an xact, the full account name on that line is
- the default."
- (ledger-read-account-with-prompt "Account"))
-
-(defun ledger-report--current-month ()
- "Return current month as (YEAR . MONTH-INDEX).
-
-MONTH-INDEX ranges from 1 (January) to 12 (December) and YEAR is
-a number."
- (let* ((time-parts (decode-time))
- (year (nth 5 time-parts))
- (month-index (nth 4 time-parts)))
- (cons year month-index)))
-
-(defun ledger-report--normalize-month (month)
- "Return (YEAR . NEW-MONTH) where NEW-MONTH is between 1 and 12.
-
-MONTH is of the form (YEAR . INDEX) where INDEX is an integer.
-The purpose of this method is then to convert any year/month pair
-to a meaningful date, e.g., from (2018 . -2) to (2017 . 10)."
- (let* ((month-index (cdr month))
- (year-shift (/ (1- month-index) 12)))
- (when (<= month-index 0)
- (setq year-shift (1- year-shift)))
- (cons (+ (car month) year-shift)
- (1+ (mod (1- month-index) 12)))))
-
-(defun ledger-report--shift-month (month shift)
- "Return (YEAR . NEW-MONTH) where NEW-MONTH is MONTH+SHIFT.
-
-MONTH is of the form (YEAR . INDEX) where INDEX ranges from
-1 (January) to 12 (December) and YEAR is a number."
- (let* ((year (car month))
- (new-month (+ (cdr month) shift)))
- (ledger-report--normalize-month (cons year new-month))))
-
-(defun ledger-report-month-format-specifier ()
- "Substitute current month."
- (with-current-buffer (or ledger-report-buffer-name (current-buffer))
- (let* ((month (or ledger-report-current-month (ledger-report--current-month)))
- (year (car month))
- (month-index (cdr month)))
- (format "%s-%s" year month-index))))
-
-(defun ledger-report-expand-format-specifiers (report-cmd)
- "Expand format specifiers in REPORT-CMD with thing under point."
- (save-match-data
- (let ((expanded-cmd report-cmd))
- (set-match-data (list 0 0))
- (while (string-match "%(\\([^)]*\\))" expanded-cmd
- (if (> (length expanded-cmd) (match-end 0))
- (match-end 0)
- (1- (length expanded-cmd))))
- (let* ((specifier (match-string 1 expanded-cmd))
- (f (cdr (assoc specifier ledger-report-format-specifiers))))
- (if f
- (let* ((arg (save-match-data
- (with-current-buffer ledger-buf
- (funcall f))))
- (quoted (if (listp arg)
- (mapconcat #'identity arg " ")
- (shell-quote-argument arg))))
- (setq expanded-cmd (replace-match quoted t t expanded-cmd))))))
- expanded-cmd)))
-
-(defun ledger-report--cmd-needs-links-p (cmd)
- "Check links should be added to the report produced by CMD."
- ;; --subtotal reports do not produce identifiable transactions, so
- ;; don't prepend location information for them
- (and (string-match "\\<reg\\(ister\\)?\\>" cmd)
- ledger-report-links-in-register
- (not (string-match "--subtotal" cmd))))
-
-(defun ledger-report--compute-extra-args (report-cmd)
- "Compute extra args to add to REPORT-CMD."
- `(,@(when (ledger-report--cmd-needs-links-p report-cmd)
- '("--prepend-format=%(filename):%(beg_line):"))
- ,@(when ledger-report-auto-width
- `("--columns" ,(format "%d" (- (window-width) 1))))
- ,@(when ledger-report-use-native-highlighting
- '("--color" "--force-color"))
- ,@(when ledger-report-use-strict
- '("--strict"))))
-
-(defun ledger-report-cmd (report-name edit)
- "Get the command line to run the report name REPORT-NAME.
-Optionally EDIT the command."
- (let ((report-cmd (car (cdr (assoc report-name ledger-reports)))))
- ;; logic for substitution goes here
- (when (or (null report-cmd) edit)
- (setq report-cmd (ledger-report-read-command report-cmd))
- (setq ledger-report-saved nil)) ;; this is a new report, or edited report
- (setq report-cmd (ledger-report-expand-format-specifiers report-cmd))
- (set (make-local-variable 'ledger-report-cmd) report-cmd)
- (or (ledger-report-string-empty-p report-name)
- (ledger-report-name-exists report-name)
- (progn
- (ledger-reports-add report-name report-cmd)
- (ledger-reports-custom-save)))
- report-cmd))
-
-(define-button-type 'ledger-report-register-entry
- 'follow-link t
- 'face nil ;; Otherwise make-text-button replaces Ledger's native highlighting
- 'action (lambda (_button) (ledger-report-visit-source)))
-
-(defun ledger-report--change-month (shift)
- "Rebuild report with transactions from current month + SHIFT."
- (let* ((current-month (or ledger-report-current-month (ledger-report--current-month)))
- (previous-month (ledger-report--shift-month current-month shift)))
- (set (make-local-variable 'ledger-report-current-month) previous-month)
- (ledger-report-cmd ledger-report-name nil)
- (ledger-report-redo)))
-
-(defun ledger-report--add-links ()
- "Replace file and line annotations with buttons."
- (while (re-search-forward "^\\(/[^:]+\\)?:\\([0-9]+\\)?:" nil t)
- (let ((file (match-string 1))
- (line (string-to-number (match-string 2))))
- (delete-region (match-beginning 0) (match-end 0))
- (when (and file line)
- (add-text-properties (line-beginning-position) (line-end-position)
- (list 'ledger-source (cons file line)))
- (make-text-button
- (line-beginning-position) (line-end-position)
- 'type 'ledger-report-register-entry
- 'help-echo (format "mouse-2, RET: Visit %s:%d" file line))
- ;; Appending the face preserves Ledger's native highlighting
- (font-lock-append-text-property (line-beginning-position) (line-end-position)
- 'face 'ledger-font-report-clickable-face)
- (end-of-line)))))
-
-(defun ledger-report--compute-header-line (cmd)
- "Call `ledger-report-header-line-fn' with `ledger-report-cmd' bound to CMD."
- (let ((ledger-report-cmd cmd))
- (funcall ledger-report-header-line-fn)))
-
-(defun ledger-do-report (cmd)
- "Run a report command line CMD.
-CMD may contain a (shell-quoted) version of
-`ledger-report--extra-args-marker', which will be replaced by
-arguments returned by `ledger-report--compute-extra-args'."
- (goto-char (point-min))
- (let* ((marker ledger-report--extra-args-marker)
- (marker-re (concat " *" (regexp-quote marker)))
- (args (ledger-report--compute-extra-args cmd))
- (args-str (concat " " (mapconcat #'shell-quote-argument args " ")))
- (clean-cmd (replace-regexp-in-string marker-re "" cmd t t))
- (real-cmd (replace-regexp-in-string marker-re args-str cmd t t)))
- (setq header-line-format
- (and ledger-report-use-header-line
- `(:eval (ledger-report--compute-header-line ,clean-cmd))))
- (unless ledger-report-use-header-line
- (insert (format "Report: %s\n" ledger-report-name)
- (format "Command: %s\n" clean-cmd)
- (make-string (- (window-width) 1) ?=)
- "\n\n"))
- (let* ((report (shell-command-to-string real-cmd)))
- (when ledger-report-use-native-highlighting
- (setq report (ansi-color-apply report)))
- (save-excursion
- (insert report))
- (when (ledger-report--cmd-needs-links-p cmd)
- (save-excursion
- (ledger-report--add-links))))))
-
-(defun ledger-report-visit-source ()
- "Visit the transaction under point in the report window."
- (interactive)
- (let* ((prop (get-text-property (point) 'ledger-source))
- (file (car prop))
- (line (cdr prop)))
- (when (and file line)
- (find-file-other-window file)
- (widen)
- (goto-char (point-min))
- (forward-line (1- line))
- (ledger-navigate-beginning-of-xact))))
-
-(defun ledger-report-goto ()
- "Goto the ledger report buffer."
- (interactive)
- (let ((rbuf (get-buffer ledger-report-buffer-name)))
- (if (not rbuf)
- (error "There is no ledger report buffer"))
- (pop-to-buffer rbuf)
- (ledger-report-maybe-shrink-window)))
-
-(defun ledger-report-redo (&optional _ignore-auto _noconfirm)
- "Redo the report in the current ledger report buffer.
-IGNORE-AUTO and NOCONFIRM are for compatibility with
-`revert-buffer-function' and are currently ignored."
- (interactive)
- (unless (or (derived-mode-p 'ledger-mode)
- (derived-mode-p 'ledger-report-mode))
- (user-error "Not in a ledger-mode or ledger-report-mode buffer"))
- (let ((cur-buf (current-buffer)))
- (when (and ledger-report-auto-refresh
- (get-buffer ledger-report-buffer-name))
- (pop-to-buffer (get-buffer ledger-report-buffer-name))
- (ledger-report-maybe-shrink-window)
- (setq ledger-report-cursor-line-number (line-number-at-pos))
- (with-silent-modifications
- (erase-buffer)
- (ledger-do-report ledger-report-cmd)
- (when ledger-report-is-reversed
- (ledger-report-reverse-lines))
- (when ledger-report-auto-refresh-sticky-cursor
- (forward-line (- ledger-report-cursor-line-number 5))))
- (run-hooks 'ledger-report-after-report-hook)
- (pop-to-buffer cur-buf))))
-
-(defun ledger-report-quit ()
- "Quit the ledger report buffer."
- (interactive)
- (ledger-report-goto)
- (set-window-configuration ledger-original-window-cfg)
- (kill-buffer (get-buffer ledger-report-buffer-name)))
-
-(define-obsolete-function-alias 'ledger-report-kill #'ledger-report-quit)
-
-(defun ledger-report-edit-reports ()
- "Edit the defined ledger reports."
- (interactive)
- (customize-variable 'ledger-reports))
-
-(defun ledger-report-edit-report ()
- "Edit the current report command in the mini buffer and re-run the report."
- (interactive)
- (setq ledger-report-cmd (ledger-report-read-command ledger-report-cmd))
- (ledger-report-redo))
-
-(define-obsolete-function-alias 'ledger-report-select-report #'ledger-report "ledger 4.0.0")
-
-(defun ledger-report-read-new-name ()
- "Read the name for a new report from the minibuffer."
- (let ((name ""))
- (while (ledger-report-string-empty-p name)
- (setq name (read-from-minibuffer "Report name: " nil nil nil
- 'ledger-report-name-prompt-history)))
- name))
-
-(defun ledger-report-save ()
- "Save the current report command line as a named report."
- (interactive)
- (ledger-report-goto)
- (let (existing-name)
- (when (ledger-report-string-empty-p ledger-report-name)
- (setq ledger-report-name (ledger-report-read-new-name)))
-
- (if (setq existing-name (ledger-report-name-exists ledger-report-name))
- (cond ((y-or-n-p (format "Overwrite existing report named '%s'? "
- ledger-report-name))
- (if (string-equal
- ledger-report-cmd
- (car (cdr (assq existing-name ledger-reports))))
- (message "Nothing to save. Current command is identical to existing saved one")
- (progn
- (setq ledger-reports
- (assq-delete-all existing-name ledger-reports))
- (ledger-reports-add ledger-report-name ledger-report-cmd)
- (ledger-reports-custom-save))))
- (t
- (progn
- (setq ledger-report-name (ledger-report-read-new-name))
- (ledger-reports-add ledger-report-name ledger-report-cmd)
- (ledger-reports-custom-save)))))))
-
-(defun ledger-report-previous-month ()
- "Rebuild report with transactions from the previous month."
- (interactive)
- (ledger-report--change-month -1))
-
-(defun ledger-report-next-month ()
- "Rebuild report with transactions from the next month."
- (interactive)
- (ledger-report--change-month 1))
-
-(defun ledger-report-toggle-default-commodity ()
- "Add or remove \"--exchange `ledger-reconcile-default-commodity' to the current report."
- (interactive)
- (unless (derived-mode-p 'ledger-report-mode)
- (user-error "Not a ledger report buffer"))
- (save-match-data
- (if (string-match
- (concat (rx (or "--exchange" "-X") (1+ space))
- (regexp-quote ledger-reconcile-default-commodity))
- ledger-report-cmd)
- (setq ledger-report-cmd (replace-match "" nil nil ledger-report-cmd))
- (setq ledger-report-cmd (concat ledger-report-cmd
- " --exchange " ledger-reconcile-default-commodity))))
- (ledger-report-redo))
-
-(provide 'ledger-report)
-
-;;; ledger-report.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-schedule.el b/elpa/ledger-mode-20200530.1710/ledger-schedule.el
deleted file mode 100644
index c10594a..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-schedule.el
+++ /dev/null
@@ -1,331 +0,0 @@
-;;; ledger-schedule.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013 Craig Earls (enderw88 at gmail dot com)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option)
-;; any later version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-;; License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;;
-;; This module provides for automatically adding transactions to a
-;; ledger buffer on a periodic basis. Recurrence expressions are
-;; inspired by Martin Fowler's "Recurring Events for Calendars",
-;; martinfowler.com/apsupp/recurring.pdf
-
-;; use (fset 'VARNAME (macro args)) to put the macro definition in the
-;; function slot of the symbol VARNAME. Then use VARNAME as the
-;; function without have to use funcall.
-
-
-(require 'ledger-init)
-(require 'cl-lib)
-
-(declare-function ledger-mode "ledger-mode")
-;;; Code:
-
-(defgroup ledger-schedule nil
- "Support for automatically recommendation transactions."
- :group 'ledger)
-
-(defcustom ledger-schedule-buffer-name "*Ledger Schedule*"
- "Name for the schedule buffer."
- :type 'string
- :group 'ledger-schedule)
-
-(defcustom ledger-schedule-look-backward 7
- "Number of days to look back in time for transactions."
- :type 'integer
- :group 'ledger-schedule)
-
-(defcustom ledger-schedule-look-forward 14
- "Number of days auto look forward to recommend transactions."
- :type 'integer
- :group 'ledger-schedule)
-
-(defcustom ledger-schedule-file "~/ledger-schedule.ledger"
- "File to find scheduled transactions."
- :type 'file
- :group 'ledger-schedule)
-
-(defcustom ledger-schedule-week-days '(("Mo" 1)
- ("Tu" 2)
- ("We" 3)
- ("Th" 4)
- ("Fr" 5)
- ("Sa" 6)
- ("Su" 0))
- "List of weekday abbreviations.
-There must be exactly seven entries each with a two character
-abbreviation for a day and the number of that day in the week."
- :type '(alist :value-type (group integer))
- :group 'ledger-schedule)
-
-(defsubst ledger-between (val low high)
- "Return TRUE if VAL >= LOW and <= HIGH."
- (declare (obsolete <= "Ledger-mode v4.0.1"))
- (<= low val high))
-
-(defun ledger-schedule-days-in-month (month year)
- "Return number of days in the MONTH, MONTH is from 1 to 12.
-If YEAR is nil, assume it is not a leap year"
- (if (<= 1 month 12)
- (if (and year (date-leap-year-p year) (= 2 month))
- 29
- (nth (1- month) '(31 28 31 30 31 30 31 31 30 31 30 31)))
- (error "Month out of range, MONTH=%S" month)))
-
-(defun ledger-schedule-encode-day-of-week (day-string)
- "Return the numerical day of week corresponding to DAY-STRING."
- (cadr (assoc day-string ledger-schedule-week-days)))
-
-;; Macros to handle date expressions
-
-(defun ledger-schedule-constrain-day-in-month (count day-of-week)
- "Return a form that returns TRUE for the the COUNT DAY-OF-WEEK.
-For example, return true if date is the 3rd Thursday of the
-month. Negative COUNT starts from the end of the month. (EQ
-COUNT 0) means EVERY day-of-week (eg. every Saturday)"
- (if (and (<= -6 count 6) (<= 0 day-of-week 6))
- (cond ((zerop count) ;; Return true if day-of-week matches
- `(eq (nth 6 (decode-time date)) ,day-of-week))
- ((> count 0) ;; Positive count
- (let ((decoded (cl-gensym)))
- `(let ((,decoded (decode-time date)))
- (and (eq (nth 6 ,decoded) ,day-of-week)
- (<= ,(* (1- count) 7)
- (nth 3 ,decoded)
- ,(* count 7))))))
- ((< count 0)
- (let ((days-in-month (cl-gensym))
- (decoded (cl-gensym)))
- `(let* ((,decoded (decode-time date))
- (,days-in-month (ledger-schedule-days-in-month
- (nth 4 ,decoded)
- (nth 5 ,decoded))))
- (and (eq (nth 6 ,decoded) ,day-of-week)
- (<= (+ ,days-in-month ,(* count 7))
- (nth 3 ,decoded)
- (+ ,days-in-month ,(* (1+ count) 7)))))))
- (t
- (error "COUNT out of range, COUNT=%S" count)))
- (error "Invalid argument to ledger-schedule-day-in-month-macro %S %S"
- count
- day-of-week)))
-
-(defun ledger-schedule-constrain-every-count-day (day-of-week skip start-date)
- "Return a form that is true for every DAY-OF-WEEK skipping SKIP, starting on START-DATE.
-For example every second Friday, regardless of month."
- (let ((start-day (nth 6 (decode-time start-date))))
- (if (eq start-day day-of-week) ;; good, can proceed
- `(zerop (mod (- (time-to-days date) ,(time-to-days start-date)) ,(* skip 7)))
- (error "START-DATE day of week doesn't match DAY-OF-WEEK"))))
-
-(defun ledger-schedule-constrain-date-range (month1 day1 month2 day2)
- "Return a form of DATE that is true if DATE falls between MONTH1 DAY1 and MONTH2 DAY2."
- (let ((decoded (cl-gensym))
- (target-month (cl-gensym))
- (target-day (cl-gensym)))
- `(let* ((,decoded (decode-time date))
- (,target-month (nth 4 decoded))
- (,target-day (nth 3 decoded)))
- (and (and (> ,target-month ,month1)
- (< ,target-month ,month2))
- (and (> ,target-day ,day1)
- (< ,target-day ,day2))))))
-
-
-
-(defun ledger-schedule-scan-transactions (schedule-file)
- "Scan SCHEDULE-FILE and return a list of transactions with date predicates.
-The car of each item is a function of date that returns true if
-the transaction should be logged for that day."
- (interactive "fFile name: ")
- (let ((xact-list (list)))
- (with-current-buffer
- (find-file-noselect schedule-file)
- (goto-char (point-min))
- (while (re-search-forward "^\\[\\(.*\\)\\] " nil t)
- (let ((date-descriptor "")
- (transaction nil)
- (xact-start (match-end 0)))
- (setq date-descriptor
- (ledger-schedule-read-descriptor-tree
- (buffer-substring-no-properties
- (match-beginning 0)
- (match-end 0))))
- (forward-paragraph)
- (setq transaction (list date-descriptor
- (buffer-substring-no-properties
- xact-start
- (point))))
- (setq xact-list (cons transaction xact-list))))
- xact-list)))
-
-(defun ledger-schedule-read-descriptor-tree (descriptor-string)
- "Read DESCRIPTOR-STRING and return a form that evaluates dates."
- (ledger-schedule-transform-auto-tree
- (split-string
- (substring descriptor-string 1 (string-match "]" descriptor-string)) " ")))
-
-(defun ledger-schedule-transform-auto-tree (descriptor-string-list)
- "Take DESCRIPTOR-STRING-LIST, and return a string with a lambda function of date."
- ;; use funcall to use the lambda function spit out here
- (if (consp descriptor-string-list)
- (let (result)
- (while (consp descriptor-string-list)
- (let ((newcar (car descriptor-string-list)))
- (if (consp newcar)
- (setq newcar (ledger-schedule-transform-auto-tree (car descriptor-string-list))))
- ;; newcar may be a cons now, after ledger-schedule-transfrom-auto-tree
- (if (consp newcar)
- (push newcar result)
- ;; this is where we actually turn the string descriptor into useful lisp
- (push (ledger-schedule-compile-constraints newcar) result)) )
- (setq descriptor-string-list (cdr descriptor-string-list)))
-
- ;; tie up all the clauses in a big or lambda, and return
- ;; the lambda function as list to be executed by funcall
- `(lambda (date)
- ,(nconc (list 'or) (nreverse result) descriptor-string-list)))))
-
-(defun ledger-schedule-compile-constraints (descriptor-string)
- "Return a list with the year, month and day fields split."
- (let ((fields (split-string descriptor-string "[/\\-]" t)))
- (list 'and
- (ledger-schedule-constrain-day (nth 0 fields) (nth 1 fields) (nth 2 fields))
- (ledger-schedule-constrain-year (nth 0 fields) (nth 1 fields) (nth 2 fields))
- (ledger-schedule-constrain-month (nth 0 fields) (nth 1 fields) (nth 2 fields)))))
-
-(defun ledger-schedule-constrain-year (year-desc month-desc day-desc)
- "Return a form that constrains the year.
-
-YEAR-DESC, MONTH-DESC, and DAY-DESC are the string portions of the
-date descriptor."
- (cond
- ((string-match "[A-Za-z]" day-desc) t) ; there is an advanced day descriptor which overrides the year
- ((string= year-desc "*") t)
- ((/= 0 (string-to-number year-desc))
- `(memq (nth 5 (decode-time date)) ',(mapcar 'string-to-number (split-string year-desc ","))))
- (t
- (error "Improperly specified year constraint: %s %s %s" year-desc month-desc day-desc))))
-
-(defun ledger-schedule-constrain-month (year-desc month-desc day-desc)
- "Return a form that constrains the month.
-
-YEAR-DESC, MONTH-DESC, and DAY-DESC are the string portions of the
-date descriptor."
- (cond
- ((string-match "[A-Za-z]" day-desc) t) ; there is an advanced day descriptor which overrides the month
- ((string= month-desc "*")
- t) ;; always match
- ((string= month-desc "E") ;; Even
- `(cl-evenp (nth 4 (decode-time date))))
- ((string= month-desc "O") ;; Odd
- `(cl-oddp (nth 4 (decode-time date))))
- ((/= 0 (string-to-number month-desc)) ;; Starts with number
- `(memq (nth 4 (decode-time date)) ',(mapcar 'string-to-number (split-string month-desc ","))))
- (t
- (error "Improperly specified month constraint: %s %s %s" year-desc month-desc day-desc))))
-
-(defun ledger-schedule-constrain-day (year-desc month-desc day-desc)
- "Return a form that constrains the day.
-
-YEAR-DESC, MONTH-DESC, and DAY-DESC are the string portions of the
-date descriptor."
- (cond ((string= day-desc "*")
- t)
- ((string= day-desc "L")
- `(= (nth 3 (decode-time date)) (ledger-schedule-days-in-month (nth 4 (decode-time date)) (nth 5 (decode-time date)))))
- ((string-match "[A-Za-z]" day-desc) ;; There is something other than digits and commas
- (ledger-schedule-parse-complex-date year-desc month-desc day-desc))
- ((/= 0 (string-to-number day-desc))
- `(memq (nth 3 (decode-time date)) ',(mapcar 'string-to-number (split-string day-desc ","))))
- (t
- (error "Improperly specified day constraint: %s %s %s" year-desc month-desc day-desc))))
-
-
-
-(defun ledger-schedule-parse-complex-date (year-desc month-desc day-desc)
- "Parse day descriptors that have repeats."
- (let ((years (mapcar 'string-to-number (split-string year-desc ",")))
- (months (mapcar 'string-to-number (split-string month-desc ",")))
- (day-parts (split-string day-desc "\\+"))
- (every-nth (string-match "\\+" day-desc)))
- (if every-nth
- (let ((base-day (string-to-number (car day-parts)))
- (increment (string-to-number (substring (cadr day-parts) 0
- (string-match "[A-Za-z]" (cadr day-parts)))))
- (day-of-week (ledger-schedule-encode-day-of-week
- (substring (cadr day-parts) (string-match "[A-Za-z]" (cadr day-parts))))))
- (ledger-schedule-constrain-every-count-day day-of-week increment (encode-time 0 0 0 base-day (car months) (car years))))
- (let ((count (string-to-number (substring (car day-parts) 0 1)))
- (day-of-week (ledger-schedule-encode-day-of-week
- (substring (car day-parts) (string-match "[A-Za-z]" (car day-parts))))))
- (ledger-schedule-constrain-day-in-month count day-of-week)))))
-
-(defun ledger-schedule-list-upcoming-xacts (candidate-items early horizon)
- "Search CANDIDATE-ITEMS for xacts that occur within the period today - EARLY to today + HORIZON."
- (let ((start-date (time-subtract (current-time) (days-to-time early)))
- test-date items)
- (cl-loop for day from 0 to (+ early horizon) by 1 do
- (setq test-date (time-add start-date (days-to-time day)))
- (dolist (candidate candidate-items items)
- (if (funcall (car candidate) test-date)
- (setq items (append items (list (list test-date (cadr candidate))))))))
- items))
-
-(defun ledger-schedule-create-auto-buffer (candidate-items early horizon)
- "Format CANDIDATE-ITEMS for display."
- (let ((candidates (ledger-schedule-list-upcoming-xacts candidate-items early horizon))
- (schedule-buf (get-buffer-create ledger-schedule-buffer-name)))
- (with-current-buffer schedule-buf
- (erase-buffer)
- (dolist (candidate candidates)
- (insert (ledger-format-date (car candidate) ) " " (cadr candidate) "\n"))
- (ledger-mode))
- (length candidates)))
-
-(defun ledger-schedule-upcoming (file look-backward look-forward)
- "Generate upcoming transactions.
-
-FILE is the file containing the scheduled transaction,
-default to `ledger-schedule-file'.
-LOOK-BACKWARD is the number of days in the past to look at
-default to `ledger-schedule-look-backward'
-LOOK-FORWARD is the number of days in the future to look at
-default to `ledger-schedule-look-forward'
-
-Use a prefix arg to change the default value"
- (interactive (if current-prefix-arg
- (list (read-file-name "Schedule File: " () ledger-schedule-file t)
- (read-number "Look backward: " ledger-schedule-look-backward)
- (read-number "Look forward: " ledger-schedule-look-forward))
- (list ledger-schedule-file ledger-schedule-look-backward ledger-schedule-look-forward)))
- (if (and file
- (file-exists-p file))
- (progn
- (ledger-schedule-create-auto-buffer
- (ledger-schedule-scan-transactions file)
- look-backward
- look-forward)
- (pop-to-buffer ledger-schedule-buffer-name))
- (error "Could not find ledger schedule file at %s" file)))
-
-
-(provide 'ledger-schedule)
-
-;;; ledger-schedule.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-sort.el b/elpa/ledger-mode-20200530.1710/ledger-sort.el
deleted file mode 100644
index c58be8c..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-sort.el
+++ /dev/null
@@ -1,117 +0,0 @@
-;;; ledger-sort.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-
-;;; Commentary:
-;;
-
-;;; Code:
-(require 'ledger-regex)
-(require 'ledger-navigate)
-
-(defun ledger-sort-find-start ()
- "Find the beginning of a sort region."
- (when (re-search-forward ";.*Ledger-mode:.*Start sort" nil t)
- (match-end 0)))
-
-(defun ledger-sort-find-end ()
- "Find the end of a sort region."
- (when (re-search-forward ";.*Ledger-mode:.*End sort" nil t)
- (match-end 0)))
-
-(defun ledger-sort-insert-start-mark ()
- "Insert a marker to start a sort region."
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (when (ledger-sort-find-start)
- (delete-region (match-beginning 0) (match-end 0))))
- (beginning-of-line)
- (insert "\n; Ledger-mode: Start sort\n\n"))
-
-(defun ledger-sort-insert-end-mark ()
- "Insert a marker to end a sort region."
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (when (ledger-sort-find-end)
- (delete-region (match-beginning 0) (match-end 0))))
- (beginning-of-line)
- (insert "\n; Ledger-mode: End sort\n\n"))
-
-(defun ledger-sort-startkey ()
- "Return the actual date so the sort subroutine doesn't sort on the entire first line."
- (buffer-substring-no-properties (point) (+ 10 (point))))
-
-(defun ledger-sort-region (beg end)
- "Sort the region from BEG to END in chronological order."
- (interactive "r") ;; load beg and end from point and mark
- ;; automagically
- (let* ((new-beg beg)
- (new-end end)
- (bounds (ledger-navigate-find-xact-extents (point)))
- (point-delta (- (point) (car bounds)))
- (target-xact (buffer-substring (car bounds) (cadr bounds)))
- (inhibit-modification-hooks t))
- (save-excursion
- (save-restriction
- (goto-char beg)
- ;; make sure beg of region is at the beginning of a line
- (beginning-of-line)
- ;; make sure point is at the beginning of a xact
- (unless (looking-at ledger-payee-any-status-regex)
- (ledger-navigate-next-xact))
- (setq new-beg (point))
- (goto-char end)
- (ledger-navigate-next-xact)
- ;; make sure end of region is at the beginning of next record
- ;; after the region
- (setq new-end (point))
- (narrow-to-region new-beg new-end)
- (goto-char new-beg)
-
- (let ((inhibit-field-text-motion t))
- (sort-subr
- nil
- 'ledger-navigate-next-xact
- 'ledger-navigate-end-of-xact
- 'ledger-sort-startkey))))
-
- (goto-char (point-min))
- (re-search-forward (regexp-quote target-xact))
- (goto-char (+ (match-beginning 0) point-delta))))
-
-(defun ledger-sort-buffer ()
- "Sort the entire buffer."
- (interactive)
- (let (sort-start
- sort-end)
- (save-excursion
- (goto-char (point-min))
- (setq sort-start (ledger-sort-find-start)
- sort-end (ledger-sort-find-end)))
- (ledger-sort-region (or sort-start (point-min))
- (or sort-end (point-max)))))
-
-(provide 'ledger-sort)
-
-;;; ledger-sort.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-state.el b/elpa/ledger-mode-20200530.1710/ledger-state.el
deleted file mode 100644
index 930290c..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-state.el
+++ /dev/null
@@ -1,259 +0,0 @@
-;;; ledger-state.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Utilities for dealing with transaction and posting status.
-
-;;; Code:
-(require 'ledger-navigate)
-(require 'ledger-context)
-
-(defcustom ledger-clear-whole-transactions nil
- "If non-nil, clear whole transactions, not individual postings."
- :type 'boolean
- :group 'ledger)
-
-(defun ledger-transaction-state ()
- "Return the state of the transaction at point."
- (save-excursion
- (when (or (looking-at "^[0-9]")
- (re-search-backward "^[0-9]" nil t))
- (skip-chars-forward "0-9./=\\-")
- (skip-syntax-forward " ")
- (cond ((looking-at "!\\s-*") 'pending)
- ((looking-at "\\*\\s-*") 'cleared)
- (t nil)))))
-
-(defun ledger-posting-state ()
- "Return the state of the posting."
- (save-excursion
- (goto-char (line-beginning-position))
- (skip-syntax-forward " ")
- (cond ((looking-at "!\\s-*") 'pending)
- ((looking-at "\\*\\s-*") 'cleared)
- (t (ledger-transaction-state)))))
-
-(defun ledger-char-from-state (state)
- "Return the char representation of STATE."
- (if state
- (if (eq state 'pending)
- "!"
- "*")
- ""))
-
-(defun ledger-state-from-char (state-char)
- "Get state from STATE-CHAR."
- (cond ((eql state-char ?\!) 'pending)
- ((eql state-char ?\*) 'cleared)
- ((eql state-char ?\;) 'comment)
- (t nil)))
-
-
-(defun ledger-state-from-string (state-string)
- "Get state from STATE-STRING."
- (when state-string
- (cond
- ((string-match "!" state-string) 'pending)
- ((string-match "\\*" state-string) 'cleared)
- ((string-match ";" state-string) 'comment)
- (t nil))))
-
-(defun ledger-toggle-current-posting (&optional style)
- "Toggle the cleared status of the transaction under point.
-Optional argument STYLE may be `pending' or `cleared', depending
-on which type of status the caller wishes to indicate (default is
-`cleared'). Returns the new status as 'pending 'cleared or nil.
-This function is rather complicated because it must preserve both
-the overall formatting of the ledger xact, as well as ensuring
-that the most minimal display format is used. This could be
-achieved more certainly by passing the xact to ledger for
-formatting, but doing so causes inline math expressions to be
-dropped."
- (interactive)
- (let ((bounds (ledger-navigate-find-xact-extents (point)))
- new-status cur-status)
- ;; Uncompact the xact, to make it easier to toggle the
- ;; transaction
- (save-excursion ;; this excursion checks state of entire
- ;; transaction and unclears if marked
- (goto-char (car bounds)) ;; beginning of xact
- (skip-chars-forward "0-9./=\\-") ;; skip the date
- (skip-chars-forward " \t") ;; skip the white space after the date
- (setq cur-status (and (member (char-after) '(?\* ?\!))
- (ledger-state-from-char (char-after))))
- ;;if cur-status if !, or * then delete the marker
- (when cur-status
- (let ((here (point)))
- (skip-chars-forward "*! ")
- (let ((width (- (point) here)))
- (when (> width 0)
- (delete-region here (point))
- (if (search-forward " " (line-end-position) t)
- (insert (make-string width ? ))))))
- (forward-line)
- ;; Shift the cleared/pending status to the postings
- (while (looking-at "[ \t]")
- (skip-chars-forward " \t")
- (when (not (eq (ledger-state-from-char (char-after)) 'comment))
- (insert (ledger-char-from-state cur-status) " ")
- (if (and (search-forward " " (line-end-position) t)
- (looking-at " "))
- (delete-char 2)))
- (forward-line))
- (setq new-status nil)))
-
- ;;this excursion toggles the posting status
- (save-excursion
- (setq inhibit-modification-hooks t)
-
- (goto-char (line-beginning-position))
- (when (looking-at "[ \t]")
- (skip-chars-forward " \t")
- (let ((here (point))
- (cur-status (ledger-state-from-char (char-after))))
- (skip-chars-forward "*! ")
- (let ((width (- (point) here)))
- (when (> width 0)
- (delete-region here (point))
- (save-excursion
- (if (search-forward " " (line-end-position) t)
- (insert (make-string width ? ))))))
- (let (inserted)
- (if cur-status
- (if (and style (eq style 'cleared))
- (progn
- (insert "* ")
- (setq inserted 'cleared)))
- (if (and style (eq style 'pending))
- (progn
- (insert "! ")
- (setq inserted 'pending))
- (progn
- (insert "* ")
- (setq inserted 'cleared))))
- (if (and inserted
- (re-search-forward "\\(\t\\| [ \t]\\)"
- (line-end-position) t))
- (cond
- ((looking-at "\t")
- (delete-char 1))
- ((looking-at " [ \t]")
- (delete-char 2))
- ((looking-at " ")
- (delete-char 1))))
- (setq new-status inserted))))
- (setq inhibit-modification-hooks nil))
-
- ;; This excursion cleans up the xact so that it displays
- ;; minimally. This means that if all posts are cleared, remove
- ;; the marks and clear the entire transaction.
- (save-excursion
- (goto-char (car bounds))
- (forward-line)
- (let ((first t)
- (state nil)
- (hetero nil))
- (while (and (not hetero) (looking-at "[ \t]"))
- (skip-chars-forward " \t")
- (let ((cur-status (ledger-state-from-char (char-after))))
- (if (not (eq cur-status 'comment))
- (if first
- (setq state cur-status
- first nil)
- (if (not (eq state cur-status))
- (setq hetero t)))))
- (forward-line))
- (when (and (not hetero) (not (eq state nil)))
- (goto-char (car bounds))
- (forward-line)
- (while (looking-at "[ \t]")
- (skip-chars-forward " \t")
- (let ((here (point)))
- (skip-chars-forward "*! ")
- (let ((width (- (point) here)))
- (when (> width 0)
- (delete-region here (point))
- (if (re-search-forward "\\(\t\\| [ \t]\\)"
- (line-end-position) t)
- (insert (make-string width ? ))))))
- (forward-line))
- (goto-char (car bounds))
- (skip-chars-forward "0-9./=\\-") ;; Skip the date
- (skip-chars-forward " \t") ;; Skip the white space
- (insert (ledger-char-from-state state) " ")
- (setq new-status state)
- (if (re-search-forward "\\(\t\\| [ \t]\\)"
- (line-end-position) t)
- (cond
- ((looking-at "\t")
- (delete-char 1))
- ((looking-at " [ \t]")
- (delete-char 2))
- ((looking-at " ")
- (delete-char 1)))))))
- new-status))
-
-(defun ledger-toggle-current (&optional style)
- "Toggle the current thing at point with optional STYLE."
- (interactive)
- (if (or ledger-clear-whole-transactions
- (eq 'transaction (ledger-thing-at-point)))
- (progn
- (save-excursion
- (forward-line)
- (goto-char (line-beginning-position))
- (while (and (not (eolp))
- (save-excursion
- (not (eq 'transaction (ledger-thing-at-point)))))
- (if (looking-at "\\s-+[*!]")
- (ledger-toggle-current-posting style))
- (forward-line)
- (goto-char (line-beginning-position))))
- (ledger-toggle-current-transaction style))
- (ledger-toggle-current-posting style)))
-
-(defun ledger-toggle-current-transaction (&optional style)
- "Toggle the transaction at point using optional STYLE."
- (interactive)
- (save-excursion
- (when (or (looking-at "^[0-9]")
- (re-search-backward "^[0-9]" nil t))
- (skip-chars-forward "0-9./=\\-")
- (delete-horizontal-space)
- (if (or (eq (ledger-state-from-char (char-after)) 'pending)
- (eq (ledger-state-from-char (char-after)) 'cleared))
- (progn
- (delete-char 1)
- (when (and style (eq style 'cleared))
- (insert " *")
- 'cleared))
- (if (and style (eq style 'pending))
- (progn
- (insert " ! ")
- 'pending)
- (progn
- (insert " * ")
- 'cleared))))))
-
-(provide 'ledger-state)
-
-;;; ledger-state.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-test.el b/elpa/ledger-mode-20200530.1710/ledger-test.el
deleted file mode 100644
index 03e6884..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-test.el
+++ /dev/null
@@ -1,137 +0,0 @@
-;;; ledger-test.el --- Helper code for use with the "ledger" command-line tool
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-
-;;; Code:
-
-(declare-function ledger-mode "ledger-mode") ; TODO: fix this cyclic dependency
-(require 'org)
-(require 'outline)
-
-(defgroup ledger-test nil
- "Definitions for the Ledger testing framework"
- :group 'ledger)
-
-(defcustom ledger-source-directory "~/ledger/"
- "Directory where the Ledger sources are located."
- :type 'directory
- :group 'ledger-test)
-
-(defcustom ledger-test-binary "/Products/ledger/debug/ledger"
- "Directory where the Ledger debug binary is located."
- :type 'file
- :group 'ledger-test)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun ledger-create-test ()
- "Create a regression test."
- (interactive)
- (save-restriction
- (org-narrow-to-subtree)
- (save-excursion
- (let (text beg)
- (goto-char (point-min))
- (forward-line 1)
- (setq beg (point))
- (search-forward ":PROPERTIES:")
- (goto-char (line-beginning-position))
- (setq text (buffer-substring-no-properties beg (point)))
- (goto-char (point-min))
- (re-search-forward ":ID:\\s-+\\([^-]+\\)")
- (find-file-other-window
- (format "~/src/ledger/test/regress/%s.test" (match-string 1)))
- (sit-for 0)
- (insert text)
- (goto-char (point-min))
- (while (not (eobp))
- (goto-char (line-beginning-position))
- (delete-char 3)
- (forward-line 1))))))
-
-(defun ledger-test-org-narrow-to-entry ()
- (outline-back-to-heading)
- (narrow-to-region (point) (progn (outline-next-heading) (point)))
- (goto-char (point-min)))
-
-(defun ledger-test-create ()
- (interactive)
- (let ((uuid (org-entry-get (point) "ID")))
- (when (string-match "\\`\\([^-]+\\)-" uuid)
- (let ((prefix (match-string 1 uuid))
- input output)
- (save-restriction
- (ledger-test-org-narrow-to-entry)
- (goto-char (point-min))
- (while (re-search-forward "#\\+begin_src ledger" nil t)
- (goto-char (match-end 0))
- (forward-line 1)
- (let ((beg (point)))
- (re-search-forward "#\\+end_src")
- (setq input
- (concat (or input "")
- (buffer-substring beg (match-beginning 0))))))
- (goto-char (point-min))
- (while (re-search-forward ":OUTPUT:" nil t)
- (goto-char (match-end 0))
- (forward-line 1)
- (let ((beg (point)))
- (re-search-forward ":END:")
- (setq output
- (concat (or output "")
- (buffer-substring beg (match-beginning 0)))))))
- (find-file-other-window
- (expand-file-name (concat prefix ".test")
- (expand-file-name "test/regress"
- ledger-source-directory)))
- (ledger-mode)
- (if input
- (insert input)
- (insert "2012-03-17 Payee\n")
- (insert " Expenses:Food $20\n")
- (insert " Assets:Cash\n"))
- (insert "\ntest reg\n")
- (if output
- (insert output))
- (insert "end test\n")))))
-
-(defun ledger-test-run ()
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (when (re-search-forward "^test \\(.+?\\)\\( ->.*\\)?$" nil t)
- (let ((command (expand-file-name ledger-test-binary))
- (args (format "--args-only --columns=80 --no-color -f \"%s\" %s"
- buffer-file-name (match-string 1))))
- (setq args (replace-regexp-in-string "\\$sourcepath"
- ledger-source-directory args))
- (kill-new args)
- (message "Testing: ledger %s" args)
- (let ((prev-directory default-directory))
- (cd ledger-source-directory)
- (unwind-protect
- (async-shell-command (format "\"%s\" %s" command args))
- (cd prev-directory)))))))
-
-(provide 'ledger-test)
-
-;;; ledger-test.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-texi.el b/elpa/ledger-mode-20200530.1710/ledger-texi.el
deleted file mode 100644
index 45eb281..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-texi.el
+++ /dev/null
@@ -1,179 +0,0 @@
-;;; ledger-texi.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-;;; Commentary:
-;;
-
-;;; Code:
-(defvar ledger-binary-path)
-
-(defgroup ledger-texi nil
- "Options for working on Ledger texi documentation"
- :group 'ledger)
-
-(defcustom ledger-texi-sample-doc-path "~/ledger/doc/sample.dat"
- "Location for sample data to be used in texi tests."
- :type 'file
- :group 'ledger-texi)
-
-(defcustom ledger-texi-normalization-args "--args-only --columns 80"
- "Texi normalization for producing ledger output."
- :type 'string
- :group 'ledger-texi)
-
-(defun ledger-update-test ()
- (interactive)
- (goto-char (point-min))
- (let ((command (buffer-substring (point-min) (line-end-position))))
- (re-search-forward "^<<<\n")
- (let ((beg (point)) end)
- (re-search-forward "^>>>")
- (setq end (match-beginning 0))
- (forward-line 1)
- (let ((output-beg (point)))
- (re-search-forward "^>>>")
- (goto-char (match-beginning 0))
- (delete-region output-beg (point))
- (apply #'call-process-region
- beg end (expand-file-name "~/Products/ledger/debug/ledger")
- nil t nil
- "-f" "-" "--args-only" "--columns=80" "--no-color"
- (split-string command " "))))))
-
-(defun ledger-texi-write-test (name command input output &optional category)
- (let ((buf (current-buffer)))
- (with-current-buffer (find-file-noselect
- (expand-file-name (concat name ".test") category))
- (erase-buffer)
- (let ((case-fold-search nil))
- (if (string-match "\\$LEDGER\\s-+" command)
- (setq command (replace-match "" t t command)))
- (if (string-match " -f \\$\\([-a-z]+\\)" command)
- (setq command (replace-match "" t t command))))
- (insert command ?\n)
- (insert "<<<" ?\n)
- (insert input)
- (insert ">>>1" ?\n)
- (insert output)
- (insert ">>>2" ?\n)
- (insert "=== 0" ?\n)
- (save-buffer)
- (unless (eq buf (current-buffer))
- (kill-buffer (current-buffer))))))
-
-(defun ledger-texi-update-test ()
- (interactive)
- (let ((details (ledger-texi-test-details))
- (name (file-name-sans-extension
- (file-name-nondirectory (buffer-file-name)))))
- (ledger-texi-write-test
- name (nth 0 details)
- (nth 1 details)
- (ledger-texi-invoke-command
- (ledger-texi-expand-command
- (nth 0 details)
- (ledger-texi-write-test-data name (nth 1 details)))))))
-
-(defun ledger-texi-test-details ()
- (goto-char (point-min))
- (let ((command (buffer-substring (point) (line-end-position)))
- input output)
- (re-search-forward "^<<<")
- (let ((input-beg (1+ (match-end 0))))
- (re-search-forward "^>>>1")
- (let ((output-beg (1+ (match-end 0))))
- (setq input (buffer-substring input-beg (match-beginning 0)))
- (re-search-forward "^>>>2")
- (setq output (buffer-substring output-beg (match-beginning 0)))
- (list command input output)))))
-
-(defun ledger-texi-expand-command (command data-file)
- (if (string-match "\\$LEDGER" command)
- (replace-match (format "%s -f \"%s\" %s" ledger-binary-path
- data-file ledger-texi-normalization-args) t t command)
- (concat (format "%s -f \"%s\" %s " ledger-binary-path
- data-file ledger-texi-normalization-args) command)))
-
-(defun ledger-texi-invoke-command (command)
- (with-temp-buffer (shell-command command t (current-buffer))
- (if (= (point-min) (point-max))
- (progn
- (push-mark nil t)
- (message "Command '%s' yielded no result at %d" command (point))
- (ding))
- (buffer-string))))
-
-(defun ledger-texi-write-test-data (name input)
- (let ((path (expand-file-name name temporary-file-directory)))
- (with-current-buffer (find-file-noselect path)
- (erase-buffer)
- (insert input)
- (save-buffer))
- path))
-
-(defun ledger-texi-update-examples ()
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "^@c \\(\\(?:sm\\)?ex\\) \\(\\S-+\\): \\(.*\\)" nil t)
- (let ((section (match-string 1))
- (example-name (match-string 2))
- (command (match-string 3))
- (data-file ledger-texi-sample-doc-path)
- input output)
- (goto-char (match-end 0))
- (forward-line)
- (when (looking-at "@\\(\\(?:small\\)?example\\)")
- (let ((beg (point)))
- (re-search-forward "^@end \\(\\(?:small\\)?example\\)")
- (delete-region beg (1+ (point)))))
-
- (when (let ((case-fold-search nil))
- (string-match " -f \\$\\([-a-z]+\\)" command))
- (let ((label (match-string 1 command)))
- (setq command (replace-match "" t t command))
- (save-excursion
- (goto-char (point-min))
- (search-forward (format "@c data: %s" label))
- (re-search-forward "@\\(\\(?:small\\)?example\\)")
- (forward-line)
- (let ((beg (point)))
- (re-search-forward "@end \\(\\(?:small\\)?example\\)")
- (setq data-file (ledger-texi-write-test-data
- (format "%s.dat" label)
- (buffer-substring-no-properties
- beg (match-beginning 0))))))))
-
- (let ((section-name (if (string= section "smex")
- "smallexample"
- "example"))
- (output (ledger-texi-invoke-command
- (ledger-texi-expand-command command data-file))))
- (insert "@" section-name ?\n output
- "@end " section-name ?\n))
-
- ;; Update the regression test associated with this example
- (ledger-texi-write-test example-name command input output
- "../test/manual")))))
-
-(provide 'ledger-texi)
-
-;;; ledger-texi.el ends here
diff --git a/elpa/ledger-mode-20200530.1710/ledger-xact.el b/elpa/ledger-mode-20200530.1710/ledger-xact.el
deleted file mode 100644
index d35a897..0000000
--- a/elpa/ledger-mode-20200530.1710/ledger-xact.el
+++ /dev/null
@@ -1,227 +0,0 @@
-;;; ledger-xact.el --- Helper code for use with the "ledger" command-line tool -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2003-2016 John Wiegley (johnw AT gnu DOT org)
-
-;; This file is not part of GNU Emacs.
-
-;; This 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 2, or (at your option) any later
-;; version.
-;;
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-;; for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301 USA.
-
-
-;;; Commentary:
-;; Utilities for running ledger synchronously.
-
-;;; Code:
-
-(require 'eshell)
-(require 'ledger-regex)
-(require 'ledger-navigate)
-(require 'ledger-exec)
-(require 'ledger-post)
-(declare-function ledger-read-date "ledger-mode" (prompt))
-(declare-function ledger-format-date "ledger-init" (&optional date))
-
-;; TODO: This file depends on code in ledger-mode.el, which depends on this.
-
-(defcustom ledger-highlight-xact-under-point t
- "If t highlight xact under point."
- :type 'boolean
- :group 'ledger)
-
-(defvar-local ledger-xact-highlight-overlay (list))
-
-(defun ledger-highlight-make-overlay ()
- (let ((ovl (make-overlay 1 1)))
- (overlay-put ovl 'font-lock-face 'ledger-font-xact-highlight-face)
- (overlay-put ovl 'priority '(nil . 99))
- ovl))
-
-(defun ledger-highlight-xact-under-point ()
- "Move the highlight overlay to the current transaction."
- (when ledger-highlight-xact-under-point
- (unless ledger-xact-highlight-overlay
- (setq ledger-xact-highlight-overlay (ledger-highlight-make-overlay)))
- (let ((exts (ledger-navigate-find-element-extents (point))))
- (let ((b (car exts))
- (e (cadr exts))
- (p (point)))
- (if (and (> (- e b) 1) ; not an empty line
- (<= p e) (>= p b) ; point is within the boundaries
- (not (region-active-p))) ; no active region
- (move-overlay ledger-xact-highlight-overlay b (+ 1 e))
- (move-overlay ledger-xact-highlight-overlay 1 1))))))
-
-(defun ledger-xact-context ()
- "Return the context of the transaction containing point or nil."
- (let ((i 0))
- (while (eq (ledger-context-line-type (ledger-context-other-line i)) 'acct-transaction)
- (setq i (- i 1)))
- (let ((context-info (ledger-context-other-line i)))
- (if (eq (ledger-context-line-type context-info) 'xact)
- context-info
- nil))))
-
-(defun ledger-xact-payee ()
- "Return the payee of the transaction containing point or nil."
- (let ((xact-context (ledger-xact-context)))
- (if xact-context
- (ledger-context-field-value xact-context 'payee)
- nil)))
-
-(defun ledger-xact-date ()
- "Return the date of the transaction containing point or nil."
- (let ((xact-context (ledger-xact-context)))
- (if xact-context
- (ledger-context-field-value xact-context 'date)
- nil)))
-
-(defun ledger-time-less-p (t1 t2)
- "Say whether time value T1 is less than time value T2."
- ;; TODO: assert listp, or support when both are strings
- (or (< (car t1) (car t2))
- (and (= (car t1) (car t2))
- (< (nth 1 t1) (nth 1 t2)))))
-
-(defun ledger-xact-find-slot (moment)
- "Find the right place in the buffer for a transaction at MOMENT.
-MOMENT is an encoded date"
- (let (last-xact-start)
- (catch 'found
- (ledger-xact-iterate-transactions
- (function
- (lambda (start date _mark _desc)
- (setq last-xact-start start)
- (if (ledger-time-less-p moment date)
- (throw 'found t))))))
- (when (and (eobp) last-xact-start)
- (let ((end (cadr (ledger-navigate-find-xact-extents last-xact-start))))
- (goto-char end)
- (insert "\n")
- (forward-line)))))
-
-(defun ledger-xact-iterate-transactions (callback)
- "Iterate through each transaction call CALLBACK for each."
- (goto-char (point-min))
- (let* ((now (current-time))
- (current-year (nth 5 (decode-time now))))
- (while (not (eobp))
- (when (looking-at ledger-iterate-regex)
- (let ((found-y-p (match-string 2)))
- (if found-y-p
- (setq current-year (string-to-number found-y-p)) ;; a Y directive was found
- (let ((start (match-beginning 0))
- (year (match-string 4))
- (month (string-to-number (match-string 5)))
- (day (string-to-number (match-string 6)))
- (mark (match-string 7))
- (desc (match-string 9)))
- (if (and year (> (length year) 0))
- (setq year (string-to-number year)))
- (funcall callback start
- (encode-time 0 0 0 day month
- (or year current-year))
- mark desc)))))
- (forward-line))))
-
-(defvar ledger-copy-transaction-insert-blank-line-after nil
- "Non-nil means insert blank line after a transaction inserted with ‘ledger-copy-transaction-at-point’.")
-
-(defun ledger-copy-transaction-at-point (date)
- "Ask for a new DATE and copy the transaction under point to that date. Leave point on the first amount."
- (interactive (list
- (ledger-read-date "Copy to date: ")))
- (let* ((extents (ledger-navigate-find-xact-extents (point)))
- (transaction (buffer-substring-no-properties (car extents) (cadr extents)))
- (encoded-date (ledger-parse-iso-date date)))
- (ledger-xact-find-slot encoded-date)
- (insert transaction
- (if ledger-copy-transaction-insert-blank-line-after
- "\n\n"
- "\n"))
- (beginning-of-line -1)
- (ledger-navigate-beginning-of-xact)
- (re-search-forward ledger-iso-date-regexp)
- (replace-match date)
- (ledger-next-amount)
- (if (re-search-forward "[-0-9]")
- (goto-char (match-beginning 0)))))
-
-(defun ledger-delete-current-transaction (pos)
- "Delete the transaction surrounging POS."
- (interactive "d")
- (let ((bounds (ledger-navigate-find-xact-extents pos)))
- (delete-region (car bounds) (cadr bounds)))
- (delete-blank-lines))
-
-(defvar ledger-add-transaction-last-date nil
- "Last date entered using `ledger-read-transaction'.")
-
-(defun ledger-read-transaction ()
- "Read the text of a transaction, which is at least the current date."
- (let* ((reference-date (or ledger-add-transaction-last-date (current-time)))
- (full-date-string (ledger-format-date reference-date))
- ;; Pre-fill year and month, but not day: this assumes DD is the last format arg.
- (initial-string (replace-regexp-in-string "[0-9]+$" "" full-date-string))
- (entered-string (ledger-read-date "Date: ")))
- (if (string= initial-string entered-string)
- full-date-string
- entered-string)))
-
-(defun ledger-parse-iso-date (date)
- "Try to parse DATE using `ledger-iso-date-regexp' and return a time value or nil."
- (save-match-data
- (when (string-match ledger-iso-date-regexp date)
- (encode-time 0 0 0 (string-to-number (match-string 4 date))
- (string-to-number (match-string 3 date))
- (string-to-number (match-string 2 date))))))
-
-(defun ledger-add-transaction (transaction-text &optional insert-at-point)
- "Use ledger xact TRANSACTION-TEXT to add a transaction to the buffer.
-If INSERT-AT-POINT is non-nil insert the transaction there,
-otherwise call `ledger-xact-find-slot' to insert it at the
-correct chronological place in the buffer. Interactively, the
-date is requested via `ledger-read-date'."
- (interactive (list (ledger-read-transaction)))
- (let* ((args (with-temp-buffer
- (insert transaction-text)
- (eshell-parse-arguments (point-min) (point-max))))
- (ledger-buf (current-buffer))
- (separator "\n"))
- (unless insert-at-point
- (let* ((date (car args))
- (parsed-date (ledger-parse-iso-date date)))
- (setq ledger-add-transaction-last-date parsed-date)
- (push-mark)
- ;; TODO: what about when it can't be parsed?
- (ledger-xact-find-slot (or parsed-date date))
- (when (looking-at "\n*\\'")
- (setq separator ""))))
- (if (> (length args) 1)
- (save-excursion
- (insert
- (with-temp-buffer
- (apply #'ledger-exec-ledger ledger-buf (current-buffer) "xact"
- (mapcar 'eval args))
- (goto-char (point-min))
- (ledger-post-align-postings (point-min) (point-max))
- (buffer-string))
- separator))
- (progn
- (insert (car args) " ")
- (save-excursion (insert "\n" separator))))))
-
-(provide 'ledger-xact)
-
-;;; ledger-xact.el ends here
diff --git a/elpa/linum-relative-20180124.1047/linum-relative-autoloads.el b/elpa/linum-relative-20180124.1047/linum-relative-autoloads.el
deleted file mode 100644
index fc8f34f..0000000
--- a/elpa/linum-relative-20180124.1047/linum-relative-autoloads.el
+++ /dev/null
@@ -1,60 +0,0 @@
-;;; linum-relative-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "linum-relative" "linum-relative.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from linum-relative.el
-
-(autoload 'linum-relative-toggle "linum-relative" "\
-Toggle between linum-relative and linum.
-
-\(fn)" t nil)
-
-(autoload 'linum-relative-mode "linum-relative" "\
-Display relative line numbers for current buffer.
-
-\(fn &optional ARG)" t nil)
-
-(defvar linum-relative-global-mode nil "\
-Non-nil if Linum-Relative-Global mode is enabled.
-See the `linum-relative-global-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `linum-relative-global-mode'.")
-
-(custom-autoload 'linum-relative-global-mode "linum-relative" nil)
-
-(autoload 'linum-relative-global-mode "linum-relative" "\
-Toggle Linum-Relative mode in all buffers.
-With prefix ARG, enable Linum-Relative-Global mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Linum-Relative mode is enabled in all buffers where
-`(lambda nil (unless (linum-relative-in-helm-p) (linum-relative-mode 1)))' would do it.
-See `linum-relative-mode' for more information on Linum-Relative mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'helm-linum-relative-mode "linum-relative" "\
-Turn on `linum-relative-mode' in helm.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "linum-relative" '("helm--turn-on-linum-relative" "linum-relative")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; linum-relative-autoloads.el ends here
diff --git a/elpa/linum-relative-20180124.1047/linum-relative-pkg.el b/elpa/linum-relative-20180124.1047/linum-relative-pkg.el
deleted file mode 100644
index 7703cac..0000000
--- a/elpa/linum-relative-20180124.1047/linum-relative-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "linum-relative" "20180124.1047" "display relative line number in emacs." 'nil :commit "c74a6981b688a5e1e6b8e0809363963ff558ce4d" :keywords '("converience") :authors '(("coldnew" . "coldnew.tw@gmail.com")) :maintainer '("coldnew" . "coldnew.tw@gmail.com") :url "http://github.com/coldnew/linum-relative")
diff --git a/elpa/linum-relative-20180124.1047/linum-relative.el b/elpa/linum-relative-20180124.1047/linum-relative.el
deleted file mode 100644
index 581e60c..0000000
--- a/elpa/linum-relative-20180124.1047/linum-relative.el
+++ /dev/null
@@ -1,286 +0,0 @@
-;;; linum-relative.el --- display relative line number in emacs.
-
-;; Copyright (c) 2013 - 2018 Yen-Chin, Lee.
-;;
-;; Author: coldnew <coldnew.tw@gmail.com>
-;; Keywords: converience
-;; Package-Version: 20180124.1047
-;; Package-Commit: c74a6981b688a5e1e6b8e0809363963ff558ce4d
-;; X-URL: http://github.com/coldnew/linum-relative
-;; Version: 0.6
-
-;; This file is not part of GNU 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 2, 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 this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-;;; Commentary:
-;; [![MELPA](http://melpa.org/packages/linum-relative-badge.svg)](http://melpa.org/#/linum-relative)
-;; [![MELPA Stable](http://stable.melpa.org/packages/linum-relative-badge.svg)](http://stable.melpa.org/#/linum-relative)
-
-;; ![Screenshot](https://github.com/coldnew/linum-relative/raw/master/screenshot/screenshot1.jpg)
-;;
-;; linum-relative lets you display relative line numbers for current buffer.
-;;
-
-;;; Installation:
-
-;; If you have `melpa` and `emacs24` installed, simply type:
-;;
-;; M-x package-install linum-relative
-;;
-;; And add the following to your .emacs
-;;
-;; (require 'linum-relative)
-
-;;; Setup & Tips:
-
-;; The non-interactive function *linum-on* (which should already be built into recent GNU Emacs distributions), turns on side-bar line numbering:
-;;
-;; (linum-on)
-;;
-;; and alternatively, by using command:
-;;
-;; M-x linum-relative-mode
-;;
-;; Relative line numbering should already be enabled by default (by installing this package), following *linum-on* or enabling *linum-mode*. One can also use the *linum-relative-toggle* interactive function to switch between relative and non-relative line numbering:
-;;
-;; M-x linum-relative-toggle
-;;
-
-;;; Backends
-
-;; By default, linum-relative use *linum-mode* as backend, since linum-mode is based on emacs-lisp, you may have performance issue on large file.
-;;
-;; Since linum-relative 0.6, if you also use emacs version 26.1 or above, you can setup `linum-relative-backend' to make linum-relative-mode use `display-line-number-mode' as backend, which is implement in C so the performance is really nice.
-;;
-;; However some linum-relative's customize function may not work propely.
-;;
-;; Here's how to use `display-line-number-mode' as backend:
-;;
-;; ```elisp
-;; ;; Use `display-line-number-mode' as linum-mode's backend for smooth performance
-;; (setq linum-relative-backend 'display-line-numbers-mode)
-;; ```
-
-
-;;; Code:
-
-(eval-when-compile (require 'cl))
-
-;; display-line-numbers is shipped with emacs 26.0.50
-(when (version<= "26.0.50" emacs-version)
- (require 'display-line-numbers))
-(require 'linum)
-
-
-(defgroup linum-relative nil
- "Show relative line numbers on fringe."
- :group 'convenience)
-
-;;;; Faces
-;; NOTE: can't work on `display-line-numbers-mode'
-(defface linum-relative-current-face
- '((t :inherit linum :foreground "#CAE682" :background "#444444" :weight bold))
- "Face for displaying current line.
-
-This won't take effect if you choose `display-line-numbers-mode' backend."
- :group 'linum-relative)
-
-;;;; Customize Variables
-
-;; NOTE: can't work on `display-line-numbers-mode'
-(defcustom linum-relative-current-symbol "0"
- "The symbol you want to show on the current line, by default it is 0.
- You can use any string like \"->\". If this variable is empty string,
-linum-releative will show the real line number at current line.
-
-This won't take effect if you choose `display-line-numbers-mode' backend."
- :type 'string
- :group 'linum-relative)
-
-;; NOTE: can't work on `display-line-numbers-mode'
-(defcustom linum-relative-plusp-offset 0
- "Offset to use for positive relative line numbers.
-
-This won't take effect if you choose `display-line-numbers-mode' backend."
- :type 'integer
- :group 'linum-relative)
-
-;; NOTE: can't work on `display-line-numbers-mode'
-(defcustom linum-relative-format "%3s"
- "Format for each line. Good for adding spaces/paddings like so: \" %3s \"
-
-This won't take effect if you choose `display-line-numbers-mode' backend."
- :type 'string
- :group 'linum-relative)
-
-(defcustom linum-relative-lighter " LR"
- "Lighter of linum-relative-mode"
- :type 'string
- :group 'linum-relative)
-
-(defcustom linum-relative-backend 'linum-mode
- "The default backend for `linum-relative', by default we use
-`linum-mode' (slow), you can switch to `display-line-numbers-mode' if
-you has emacs-version greater than 26.0.50."
- :group 'linum-relative
- :type '(choice (const :tag "Use display-line-numbers-mode as backend" display-line-numbers-mode)
- (other :tag "Use linum-mode as backend" linum-mode)))
-
-;;;; Internal Variables
-
-;; NOTE: can't work on `display-line-numbers-mode'
-(defvar linum-relative-last-pos 0
- "Store last position.")
-
-;; NOTE: can't work on `display-line-numbers-mode'
-(defvar linum-relative-user-format linum-format
- "Store the users linum-format")
-
-(defvar linum-relative-user-type (bound-and-true-p display-line-numbers-type)
- "Store the user's `display-line-number-type' value")
-
-;;;; helm support
-(defvar helm-buffer)
-(defvar helm-candidate-separator)
-(defvar helm-alive-p)
-(declare-function with-helm-buffer "ext:helm-lib.el" (&rest body))
-(declare-function helm-candidate-number-at-point "ext:helm.el")
-(declare-function helm-pos-header-line-p "ext:helm.el")
-
-(defmacro linum-relative-with-helm-buffer (&rest body)
- (when (fboundp 'with-helm-buffer)
- `(with-helm-buffer ,@body)))
-
-(defun linum-relative-in-helm-p ()
- "Return non nil when in an helm session."
- (bound-and-true-p helm-alive-p))
-
-(defun linum-relative-for-helm ()
- (linum-relative-with-helm-buffer
- (make-local-variable 'linum-relative-last-pos))
- (linum-update helm-buffer))
-
-;;;; Advices
-(defadvice linum-update (before relative-linum-update activate)
- "This advice get the last position of linum."
- (if (linum-relative-in-helm-p)
- (setq linum-relative-last-pos (helm-candidate-number-at-point))
- (setq linum-relative-last-pos (line-number-at-pos))))
-
-;;;; Functions
-(defun linum-relative (line-number)
- (when (linum-relative-in-helm-p)
- (linum-relative-with-helm-buffer
- (if (looking-at helm-candidate-separator)
- (setq line-number (save-excursion
- (forward-line 1) (helm-candidate-number-at-point)))
- (setq line-number (helm-candidate-number-at-point)))))
- (let* ((diff1 (abs (- line-number linum-relative-last-pos)))
- (diff (if (minusp diff1)
- diff1
- (+ diff1 linum-relative-plusp-offset)))
- (current-p (= diff linum-relative-plusp-offset))
- (current-symbol (if (and linum-relative-current-symbol current-p)
- (if (string= "" linum-relative-current-symbol)
- (number-to-string line-number)
- linum-relative-current-symbol)
- (number-to-string diff)))
- (face (if current-p 'linum-relative-current-face 'linum)))
- (if (and (linum-relative-in-helm-p)
- (linum-relative-with-helm-buffer
- (or (looking-at helm-candidate-separator)
- (eq (point-at-bol) (point-at-eol))
- (helm-pos-header-line-p))))
- (propertize (format linum-relative-format current-symbol) 'invisible t)
- (propertize (format linum-relative-format current-symbol) 'face face))))
-
-
-(defun linum-relative-on ()
- "Turn ON linum-relative."
- (cond
- ;; if use `display-line-numbers-mode'
- ((eq linum-relative-backend 'display-line-numbers-mode)
- (unless (eq linum-relative-user-type 'relative)
- (setq linum-relative-user-type display-line-numbers-type)
- (setq display-line-numbers-type 'relative))
- (display-line-numbers-mode 1))
- ;; default for linum-mode backend
- (t (unless (eq linum-format 'linum-relative)
- (setq linum-relative-user-format linum-format)
- (setq linum-format 'linum-relative))
- (linum-mode 1))))
-
-(defun linum-relative-off ()
- "Turn OFF linum-relative."
- (cond
- ;; if use `display-line-numbers-mode'
- ((eq linum-relative-backend 'display-line-numbers-mode)
- (setq display-line-numbers-type linum-relative-user-type)
- (display-line-numbers-mode -1))
- ;; default for linum-mode backend
- (t (setq linum-format linum-relative-user-format)
- (linum-mode -1))))
-
-;;;###autoload
-(defun linum-relative-toggle ()
- "Toggle between linum-relative and linum."
- (interactive)
- (cond
- ;; if use `display-line-numbers-mode'
- ((eq linum-relative-backend 'display-line-numbers-mode)
- (if (eq display-line-numbers-type 'relative)
- (linum-relative-off)
- (linum-relative-on)))
- ;; default for linum-mode backend
- (t (if (eq linum-format 'linum-relative)
- (linum-relative-off)
- (linum-relative-on)))))
-
-;;;###autoload
-(define-minor-mode linum-relative-mode
- "Display relative line numbers for current buffer."
- :group 'linum-relative
- :lighter linum-relative-lighter
- (if linum-relative-mode
- (linum-relative-on)
- (linum-relative-off)))
-
-;;;###autoload
-(define-global-minor-mode linum-relative-global-mode
- linum-relative-mode (lambda () (unless (linum-relative-in-helm-p)
- (linum-relative-mode 1))))
-
-;;;; Interaction of helm with linum-relative
-
-(defun helm--turn-on-linum-relative ()
- (with-helm-buffer (linum-relative-mode 1)))
-
-;;;###autoload
-(define-minor-mode helm-linum-relative-mode
- "Turn on `linum-relative-mode' in helm."
- :group 'helm
- (if helm-linum-relative-mode
- (progn
- (add-hook 'helm-move-selection-after-hook 'linum-relative-for-helm)
- (add-hook 'helm-after-initialize-hook 'helm--turn-on-linum-relative)
- (add-hook 'helm-after-preselection-hook 'linum-relative-for-helm))
- (remove-hook 'helm-move-selection-after-hook 'linum-relative-for-helm)
- (remove-hook 'helm-after-initialize-hook 'helm--turn-on-linum-relative)
- (remove-hook 'helm-after-preselection-hook 'linum-relative-for-helm)))
-
-
-(provide 'linum-relative)
-;;; linum-relative.el ends here.
diff --git a/elpa/magit-20200728.45/AUTHORS.md b/elpa/magit-20200728.45/AUTHORS.md
deleted file mode 100644
index 8414159..0000000
--- a/elpa/magit-20200728.45/AUTHORS.md
+++ /dev/null
@@ -1,347 +0,0 @@
-Authors
-=======
-
-The following people have contributed to Magit, including the
-libraries `git-commit.el`, `magit-popup.el`, and `with-editor.el`
-which are distributed as separate Elpa packages.
-
-For statistics see https://magit.vc/stats/authors.html.
-
-Names below are sorted alphabetically.
-
-Author
-------
-
-- Marius Vollmer <marius.vollmer@gmail.com>
-
-Maintainer
-----------
-
-- Jonas Bernoulli <jonas@bernoul.li>
-
-Developers
-----------
-
-- Kyle Meyer <kyle@kyleam.com>
-- Noam Postavsky <npostavs@users.sourceforge.net>
-
-Retired Maintainers and Developers
-----------------------------------
-
-- Nicolas Dudebout <nicolas.dudebout@gatech.edu>
-- Peter J. Weisberg <pj@irregularexpressions.net>
-- Pieter Praet <pieter@praet.org>
-- Phil Jackson <phil@shellarchive.co.uk>
-- Rémi Vanicat <vanicat@debian.org>
-- Yann Hodique <yann.hodique@gmail.com>
-
-Contributors
-------------
-
-- Aaron Culich <aculich@gmail.com>
-- Aaron Madlon-Kay <aaron@madlon-kay.com>
-- Abdo Roig-Maranges <abdo.roig@gmail.com>
-- Adam Benanti <0entropy@protonmail.com>
-- Adam Kruszewski <adam@kruszewski.name>
-- Adam Porter <adam@alphapapa.net>
-- Adam Spiers <emacs@adamspiers.org>
-- Adeodato Simó <dato@net.com.org.es>
-- Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-- Alan Falloon <alan.falloon@gmail.com>
-- Alban Gruin <alban@pa1ch.fr>
-- Aleksey Uimanov <s9gf4ult@gmail.com>
-- Alexander Gramiak <fice-t@protonmail.com>
-- Alexander Miller <alexanderm@web.de>
-- Alex Branham <alex.branham@gmail.com>
-- Alex Dunn <adunn@ucsb.edu>
-- Alexey Voinov <alexey.v.voinov@gmail.com>
-- Alex Kost <alezost@gmail.com>
-- Alex Ott <alexott@gmail.com>
-- Allen <darkfeline@felesatra.moe>
-- Allen Li <darkfeline@felesatra.moe>
-- Andreas Fuchs <asf@boinkor.net>
-- Andreas Liljeqvist <andreas.liljeqvist@robacks.se>
-- Andreas Rottmann <a.rottmann@gmx.at>
-- Andrei Chițu <andrei.chitu1@gmail.com>
-- Andrew Eggenberger <andrew.eggenberger@gmail.com>
-- Andrew Kirkpatrick <andrew.kirkpatrick@adelaide.edu.au>
-- Andrew Schwartzmeyer <andrew@schwartzmeyer.com>
-- Andrey Smirnov <andrew.smirnov@gmail.com>
-- Andriy Kmit' <dev@madand.net>
-- Andy Sawyer <git@pureabstract.org>
-- Aria Edmonds <aria@ar1as.space>
-- Arialdo Martini <arialdomartini@gmail.com>
-- Arnau Roig Ninerola <arnau.ninerola@outlook.com>
-- Barak A. Pearlmutter <barak+git@pearlmutter.net>
-- Bar Magal <bmagamb@gmail.com>
-- Bart Bakker <bart@thesoftwarecraft.com>
-- Basil L. Contovounesios <contovob@tcd.ie>
-- Bastian Beischer <beischer@physik.rwth-aachen.de>
-- Benjamin Motz <benjamin.motz@mailbox.org>
-- Ben North <ben@redfrontdoor.org>
-- Ben Walton <bwalton@artsci.utoronto.ca>
-- Bob Uhl <buhl@zvelo.com>
-- Bradley Wright <brad@intranation.com>
-- Brandon W Maister <quodlibetor@gmail.com>
-- Brian Warner <warner@lothar.com>
-- Bryan Shell <bryan.shell@orbitz.com>
-- Buster Copley <buster@buster.me.uk>
-- Carl Lieberman <liebermancarl@gmail.com>
-- Chillar Anand <anand21nanda@gmail.com>
-- Chris Bernard <cebernard@gmail.com>
-- Chris Done <chrisdone@gmail.com>
-- Chris LaRose <cjlarose@gmail.com>
-- Chris Moore <dooglus@gmail.com>
-- Chris Ring <chris@ringthis.com>
-- Chris Shoemaker <chris@mojotech.com>
-- Christian Dietrich <christian.dietrich@informatik.uni-erlangen.de>
-- Christian Kluge <ckfrakturfreak@web.de>
-- Christophe Junke <junke.christophe@gmail.com>
-- Christopher Monsanto <chris@monsan.to>
-- Clément Pit-Claudel <clement.pitclaudel@live.com>
-- Cornelius Mika <cornelius.mika@gmail.com>
-- Craig Andera <candera@wangdera.com>
-- Dale Hagglund <dale.hagglund@gmail.com>
-- Damien Cassou <damien@cassou.me>
-- Dan Erikson <derikson3@gmail.com>
-- Daniel Brockman <daniel@gointeractive.se>
-- Daniel Farina <drfarina@acm.org>
-- Daniel Gröber <daniel@dps.uibk.ac.at>
-- Daniel Hackney <dan@haxney.org>
-- Daniel Kraus <daniel@kraus.my>
-- Daniel Mai <daniel@danielmai.net>
-- Daniel Martín <mardani29@yahoo.es>
-- Dan LaManna <dan.lamanna@gmail.com>
-- Danny Zhu <dzhu@dzhu.us>
-- Dato Simó <dato@net.com.org.es>
-- David Abrahams <dave@boostpro.com>
-- David Ellison <davidehellison@gmail.com>
-- David Ellison <davide@voicebox.com>
-- David Hull <david.hull@openx.com>
-- David L. Rager <ragerdl@gmail.com>
-- David Wallin <david.wallin@gmail.com>
-- Dean Kariniemi <8913263+d3k4r@users.noreply.github.com>
-- Dennis Paskorz <dennis@walltowall.com>
-- Divye Kapoor <divye@google.com>
-- Dominique Quatravaux <dominique.quatravaux@epfl.ch>
-- Dominique Quatravaux <domq@google.com>
-- Duianto Vebotci <vebotci@openmailbox.org>
-- Eli Barzilay <eli@barzilay.org>
-- Eric Davis <ed@npri.org>
-- Eric Prud'hommeaux <eric@w3.org>
-- Eric Schulte <schulte.eric@gmail.com>
-- Erik Anderson <erikbpanderson@gmail.com>
-- Evan Torrie <etorrie@gmail.com>
-- Evgkeni Sampelnikof <esabof@gmail.com>
-- Eyal Lotem <eyal.lotem@gmail.com>
-- Fabian Wiget <fabacino@gmail.com>
-- Felix Geller <fgeller@gmail.com>
-- Felix Yan <felixonmars@archlinux.org>
-- Feng Li <fengli@blackmagicdesign.com>
-- Florian Ragwitz <rafl@debian.org>
-- Fritz Grabo <fritz.grabo@gmail.com>
-- Fritz Stelzer <brotzeitmacher@gmail.com>
-- Geoff Shannon <geoffpshannon@gmail.com>
-- George Kadianakis <desnacked@gmail.com>
-- Graham Clark <grclark@gmail.com>
-- Graham Dobbins <gdobbins@protonmail.com>
-- Greg A. Woods <woods@planix.com>
-- Greg Lucas <greg@glucas.net>
-- Greg Sexton <gregsexton@gmail.com>
-- Guillaume Martres <smarter@ubuntu.com>
-- Hannu Koivisto <azure@iki.fi>
-- Hans-Peter Deifel <hpdeifel@gmx.de>
-- Hussein Ait-Lahcen <hussein.ait-lahcen@fretlink.com>
-- Ian Eure <ian.eure@gmail.com>
-- Ingo Lohmar <i.lohmar@gmail.com>
-- Ioan-Adrian Ratiu <adi@adirat.com>
-- Ivan Brennan <ivan.brennan@gmail.com>
-- Jan Tatarik <jan.tatarik@xing.com>
-- Jasper St. Pierre <jstpierre@mecheye.net>
-- Jeff Bellegarde <jbellegarde@whitepages.com>
-- Jeff Dairiki <dairiki@dairiki.org>
-- Jeremy Meng <yumeng@microsoft.com>
-- Jesse Alama <jesse.alama@gmail.com>
-- Jim Blandy <jimb@red-bean.com>
-- Joakim Jalap <JOJA@stoneridge.com>
-- Johannes Altmanninger <aclopte@gmail.com>
-- Johann Klähn <kljohann@gmail.com>
-- John Mastro <john.b.mastro@gmail.com>
-- John Morris <john@zultron.com>
-- John Wiegley <johnw@newartisans.com>
-- Jonas Bernoulli <jonas@bernoul.li>
-- Jonathan Arnett <jonathan@scriptdrop.co>
-- Jonathan Leech-Pepin <jonathan.leechpepin@gmail.com>
-- Jonathan Roes <jroes@jroes.net>
-- Jon Vanderwijk <jonathn@github.com>
-- Jordan Galby <gravemind2a@gmail.com>
-- Jordan Greenberg <jordan@softwareslave.com>
-- Josh Elsasser <jelsasser@appneta.com>
-- Josiah Schwab <jschwab@gmail.com>
-- Julien Danjou <julien@danjou.info>
-- Justin Burkett <justin@burkett.cc>
-- Justin Caratzas <justin.caratzas@gmail.com>
-- Justin Guenther <jguenther@gmail.com>
-- Justin Thomas <justin.thomas1@gmail.com>
-- Kan-Ru Chen <kanru@kanru.info>
-- Kenny Ballou <kballou@devnulllabs.io>
-- Keshav Kini <keshav.kini@gmail.com>
-- Kevin Brubeck Unhammer <unhammer@fsfe.org>
-- Kevin J. Foley <kfoley15@gmail.com>
-- Kévin Le Gouguec <kevin.legouguec@gmail.com>
-- Kimberly Wolk <kimwolk@hotmail.com>
-- Knut Olav Bøhmer <bohmer@gmail.com>
-- Kyle Meyer <kyle@kyleam.com>
-- Laurent Laffont <laurent.laffont@gmail.com>
-- Laverne Schrock <laverne@schrock.email>
-- Leandro Facchinetti <me@leafac.com>
-- Lele Gaifax <lele@metapensiero.it>
-- Leo Liu <sdl.web@gmail.com>
-- Leonardo Etcheverry <leo@kalio.net>
-- Lingchao Xin <douglarek@users.noreply.github.com>
-- Li-Yun Chang <michael142536@gmail.com>
-- Lluís Vilanova <vilanova@ac.upc.edu>
-- Loic Dachary <loic@dachary.org>
-- Louis Roché <louis@louisroche.net>
-- Luís Oliveira <luismbo@gmail.com>
-- Luke Amdor <luke.amdor@gmail.com>
-- Magnus Malm <magnusmalm@gmail.com>
-- Mak Kolybabi <mak@kolybabi.com>
-- Manuel Vázquez Acosta <mva.led@gmail.com>
-- Marcel Wolf <mwolf@ml1.net>
-- Marc Herbert <marc.herbert@gmail.com>
-- Marcin Bachry <hegel666@gmail.com>
-- Marco Craveiro <marco.craveiro@gmail.com>
-- Marco Wahl <marcowahlsoft@gmail.com>
-- Marc Sherry <msherry@gmail.com>
-- Marian Schubert <marian.schubert@gmail.com>
-- Mario Rodas <marsam@users.noreply.github.com>
-- Marius Vollmer <marius.vollmer@gmail.com>
-- Mark Hepburn <Mark.Hepburn@csiro.au>
-- Mark Karpov <markkarpov@opmbx.org>
-- Mark Oteiza <mvoteiza@udel.edu>
-- Matthew Fluet <matthew.fluet@gmail.com>
-- Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
-- Matus Goljer <dota.keys@gmail.com>
-- Michael Fogleman <michaelwfogleman@gmail.com>
-- Michael Griffiths <mikey@cich.li>
-- Michael Heerdegen <michael_heerdegen@web.de>
-- Michal Sojka <sojkam1@fel.cvut.cz>
-- Miciah Masters <miciah.masters@gmail.com>
-- Miles Bader <miles@gnu.org>
-- Miloš Mošić <mosic.milos@gmail.com>
-- Mitchel Humpherys <mitch.special@gmail.com>
-- Moritz Bunkus <moritz@bunkus.org>
-- Naoya Yamashita <conao3@gmail.com>
-- Natalie Weizenbaum <nex342@gmail.com>
-- Nguyễn Tuấn Anh <ubolonton@gmail.com>
-- Nic Ferier <nic@ferrier.me.uk>
-- Nick Alcock <nick.alcock@oracle.com>
-- Nick Alexander <nalexander@mozilla.com>
-- Nick Dimiduk <ndimiduk@gmail.com>
-- Nicklas Lindgren <nili@gulmohar.se>
-- Nicolas Dudebout <nicolas.dudebout@gatech.edu>
-- Nicolas Petton <nicolas@petton.fr>
-- Nicolas Richard <theonewiththeevillook@yahoo.fr>
-- Nikolay Martynov <mar.kolya@gmail.com>
-- Noam Postavsky <npostavs@users.sourceforge.net>
-- N. Troy de Freitas <me@ntdef.com>
-- Ole Arndt <oliver.arndt@cegedim.com>
-- Oleh Krehel <ohwoeowho@gmail.com>
-- Orivej Desh <orivej@gmx.fr>
-- Óscar Fuentes <ofv@wanadoo.es>
-- Paul Stadig <paul@stadig.name>
-- Pavel Holejsovsky <pavel.holejsovsky@upek.com>
-- Pekka Pessi <nospam@pessi.fi>
-- Peter Eisentraut <peter@eisentraut.org>
-- Peter Jaros <peter.a.jaros@gmail.com>
-- Peter J. Weisberg <pj@irregularexpressions.net>
-- Peter Vasil <mail@petervasil.net>
-- Philippe Vaucher <philippe.vaucher@gmail.com>
-- Philipp Haselwarter <philipp@haselwarter.org>
-- Philipp Stephani <phst@google.com>
-- Philip Weaver <philip.weaver@gmail.com>
-- Phil Jackson <phil@shellarchive.co.uk>
-- Phil Sainty <phil@catalyst.net.nz>
-- Pierre Neidhardt <ambrevar@gmail.com>
-- Pieter Praet <pieter@praet.org>
-- Prathamesh Sonpatki <csonpatki@gmail.com>
-- rabio <rabiodev@o2.pl>
-- Radon Rosborough <radon.neon@gmail.com>
-- Rafael Laboissiere <rafael@laboissiere.net>
-- Raimon Grau <raimon@3scale.net>
-- Ramkumar Ramachandra <artagnon@gmail.com>
-- Remco van 't Veer <rwvtveer@xs4all.nl>
-- Rémi Vanicat <vanicat@debian.org>
-- René Stadler <mail@renestadler.de>
-- Richard Kim <emacs18@gmail.com>
-- Robert Boone <robo4288@gmail.com>
-- Robin Green <greenrd@greenrd.org>
-- Roey Darwish Dror <roey.ghost@gmail.com>
-- Roger Crew <crew@cs.stanford.edu>
-- Romain Francoise <romain@orebokech.com>
-- Ron Parker <rparker@a123systems.com>
-- Roy Crihfield <rscrihf@gmail.com>
-- Rüdiger Sonderfeld <ruediger@c-plusplus.net>
-- Russell Black <black.russell@gmail.com>
-- Ryan C. Thompson <rct@thompsonclan.org>
-- Samuel Bronson <naesten@gmail.com>
-- Samuel W. Flint <swflint@flintfam.org>
-- Sanjoy Das <sanjoy@playingwithpointers.com>
-- Sean Allred <code@seanallred.com>
-- Sean Bryant <sbryant@hackinggibsons.com>
-- Sean Whitton <spwhitton@spwhitton.name>
-- Sebastian Wiesner <lunaryorn@gmail.com>
-- Sébastien Gross <seb@chezwam.org>
-- Seong-Kook Shin <cinsky@gmail.com>
-- Sergey Pashinin <sergey@pashinin.com>
-- Sergey Vinokurov <serg.foo@gmail.com>
-- Servilio Afre Puentes <afrepues@mcmaster.ca>
-- Silent Sphere <silentsphere110@gmail.com>
-- Štěpán Němec <stepnem@gmail.com>
-- Steven Chow <steve@myfreestuffapp.com>
-- Steven E. Harris <seh@panix.com>
-- Steven Thomas <sthomas314@gmail.com>
-- Steven Vancoillie <steven.vancoillie@runbox.com>
-- Steve Purcell <steve@sanityinc.com>
-- Suhail Shergill <suhailshergill@gmail.com>
-- Sylvain Rousseau <thisirs@gmail.com>
-- Syohei Yoshida <syohex@gmail.com>
-- Takafumi Arakaki <aka.tkf@gmail.com>
-- Tassilo Horn <tsdh@gnu.org>
-- Teemu Likonen <tlikonen@iki.fi>
-- Teruki Shigitani <teruki.shigitani@gmail.com>
-- Thierry Volpiatto <thierry.volpiatto@gmail.com>
-- Thomas A Caswell <tcaswell@gmail.com>
-- Thomas Fini Hansen <xen@xen.dk>
-- Thomas Frössman <thomasf@jossystem.se>
-- Thomas Jost <thomas.jost@gmail.com>
-- Thomas Riccardi <riccardi.thomas@gmail.com>
-- Tibor Simko <tibor.simko@cern.ch>
-- Timo Juhani Lindfors <timo.lindfors@iki.fi>
-- Tim Perkins <tprk77@gmail.com>
-- Tim Wraight <tim@wraight.net>
-- Ting-Yu Lin <aethanyc@gmail.com>
-- Tom Feist <shabble@metavore.org>
-- Topi Miettinen <toiwoton@gmail.com>
-- Troy Hinckley <t.macman@gmail.com>
-- Tsuyoshi Kitamoto <tsuyoshi.kitamoto@gmail.com>
-- Tunc Uzlu <bb2020@users.noreply.github.com>
-- Vineet Naik <vineet@helpshift.com>
-- Vitaly Ostashov <hotosho@yandex-team.ru>
-- Vladimir Panteleev <git@thecybershadow.net>
-- Wei Huang <weih@opera.com>
-- Wilfred Hughes <me@wilfred.me.uk>
-- Win Treese <treese@acm.org>
-- Wouter Bolsterlee <wouter@bolsterl.ee>
-- Xavier Noria <fxn@hashref.com>
-- Xu Chunyang <mail@xuchunyang.me>
-- Yann Hodique <yann.hodique@gmail.com>
-- Ynilu <ynilu.chang@gmail.com>
-- York Zhao <gtdplatform@gmail.com>
-- Yuichi Higashi <aaa707b@gmail.com>
-- Yuri Khan <yurivkhan@gmail.com>
-- Zach Latta <zach@zachlatta.com>
-- zakora <zakora@users.noreply.github.com>
-- Zhu Zihao <all_but_last@163.com>
-- zilongshanren <guanghui8827@126.com>
diff --git a/elpa/magit-20200728.45/LICENSE b/elpa/magit-20200728.45/LICENSE
deleted file mode 100644
index 4432540..0000000
--- a/elpa/magit-20200728.45/LICENSE
+++ /dev/null
@@ -1,676 +0,0 @@
-
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-
diff --git a/elpa/magit-20200728.45/dir b/elpa/magit-20200728.45/dir
deleted file mode 100644
index dfdbd71..0000000
--- a/elpa/magit-20200728.45/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* Magit: (magit). Using Git from Emacs with Magit.
diff --git a/elpa/magit-20200728.45/git-rebase.el b/elpa/magit-20200728.45/git-rebase.el
deleted file mode 100644
index 3d635c8..0000000
--- a/elpa/magit-20200728.45/git-rebase.el
+++ /dev/null
@@ -1,804 +0,0 @@
-;;; git-rebase.el --- Edit Git rebase files -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Phil Jackson <phil@shellarchive.co.uk>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; This file is not part of GNU Emacs.
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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 this file. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package assists the user in editing the list of commits to be
-;; rewritten during an interactive rebase.
-
-;; When the user initiates an interactive rebase, e.g. using "r e" in
-;; a Magit buffer or on the command line using "git rebase -i REV",
-;; Git invokes the `$GIT_SEQUENCE_EDITOR' (or if that is undefined
-;; `$GIT_EDITOR' or even `$EDITOR') letting the user rearrange, drop,
-;; reword, edit, and squash commits.
-
-;; This package provides the major-mode `git-rebase-mode' which makes
-;; doing so much more fun, by making the buffer more colorful and
-;; providing the following commands:
-;;
-;; C-c C-c Tell Git to make it happen.
-;; C-c C-k Tell Git that you changed your mind, i.e. abort.
-;;
-;; p Move point to previous line.
-;; n Move point to next line.
-;;
-;; M-p Move the commit at point up.
-;; M-n Move the commit at point down.
-;;
-;; k Drop the commit at point.
-;; c Don't drop the commit at point.
-;; r Change the message of the commit at point.
-;; e Edit the commit at point.
-;; s Squash the commit at point, into the one above.
-;; f Like "s" but don't also edit the commit message.
-;; b Break for editing at this point in the sequence.
-;; x Add a script to be run with the commit at point
-;; being checked out.
-;; z Add noop action at point.
-;;
-;; SPC Show the commit at point in another buffer.
-;; RET Show the commit at point in another buffer and
-;; select its window.
-;; C-/ Undo last change.
-;;
-;; Commands for --rebase-merges:
-;; l Associate label with current HEAD in sequence.
-;; MM Merge specified revisions into HEAD.
-;; Mt Toggle whether the merge will invoke an editor
-;; before committing.
-;; t Reset HEAD to the specified label.
-
-;; You should probably also read the `git-rebase' manpage.
-
-;;; Code:
-
-(require 'dash)
-(require 'easymenu)
-(require 'server)
-(require 'with-editor)
-(require 'magit)
-
-(and (require 'async-bytecomp nil t)
- (let ((pkgs (bound-and-true-p async-bytecomp-allowed-packages)))
- (if (consp pkgs)
- (cl-intersection '(all magit) pkgs)
- (memq pkgs '(all t))))
- (fboundp 'async-bytecomp-package-mode)
- (async-bytecomp-package-mode 1))
-
-(eval-when-compile (require 'recentf))
-
-;;; Options
-;;;; Variables
-
-(defgroup git-rebase nil
- "Edit Git rebase sequences."
- :link '(info-link "(magit)Editing Rebase Sequences")
- :group 'tools)
-
-(defcustom git-rebase-auto-advance t
- "Whether to move to next line after changing a line."
- :group 'git-rebase
- :type 'boolean)
-
-(defcustom git-rebase-show-instructions t
- "Whether to show usage instructions inside the rebase buffer."
- :group 'git-rebase
- :type 'boolean)
-
-(defcustom git-rebase-confirm-cancel t
- "Whether confirmation is required to cancel."
- :group 'git-rebase
- :type 'boolean)
-
-;;;; Faces
-
-(defgroup git-rebase-faces nil
- "Faces used by Git-Rebase mode."
- :group 'faces
- :group 'git-rebase)
-
-(defface git-rebase-hash '((t (:inherit magit-hash)))
- "Face for commit hashes."
- :group 'git-rebase-faces)
-
-(defface git-rebase-label '((t (:inherit magit-refname)))
- "Face for labels in label, merge, and reset lines."
- :group 'git-rebase-faces)
-
-(defface git-rebase-description nil
- "Face for commit descriptions."
- :group 'git-rebase-faces)
-
-(defface git-rebase-killed-action
- '((t (:inherit font-lock-comment-face :strike-through t)))
- "Face for commented commit action lines."
- :group 'git-rebase-faces)
-
-(defface git-rebase-comment-hash
- '((t (:inherit git-rebase-hash :weight bold)))
- "Face for commit hashes in commit message comments."
- :group 'git-rebase-faces)
-
-(defface git-rebase-comment-heading
- '((t :inherit font-lock-keyword-face))
- "Face for headings in rebase message comments."
- :group 'git-commit-faces)
-
-;;; Keymaps
-
-(defvar git-rebase-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map special-mode-map)
- (define-key map (kbd "C-m") 'git-rebase-show-commit)
- (define-key map (kbd "p") 'git-rebase-backward-line)
- (define-key map (kbd "n") 'forward-line)
- (define-key map (kbd "M-p") 'git-rebase-move-line-up)
- (define-key map (kbd "M-n") 'git-rebase-move-line-down)
- (define-key map (kbd "c") 'git-rebase-pick)
- (define-key map (kbd "k") 'git-rebase-kill-line)
- (define-key map (kbd "C-k") 'git-rebase-kill-line)
- (define-key map (kbd "b") 'git-rebase-break)
- (define-key map (kbd "e") 'git-rebase-edit)
- (define-key map (kbd "l") 'git-rebase-label)
- (define-key map (kbd "MM") 'git-rebase-merge)
- (define-key map (kbd "Mt") 'git-rebase-merge-toggle-editmsg)
- (define-key map (kbd "m") 'git-rebase-edit)
- (define-key map (kbd "f") 'git-rebase-fixup)
- (define-key map (kbd "q") 'undefined)
- (define-key map (kbd "r") 'git-rebase-reword)
- (define-key map (kbd "w") 'git-rebase-reword)
- (define-key map (kbd "s") 'git-rebase-squash)
- (define-key map (kbd "t") 'git-rebase-reset)
- (define-key map (kbd "x") 'git-rebase-exec)
- (define-key map (kbd "y") 'git-rebase-insert)
- (define-key map (kbd "z") 'git-rebase-noop)
- (define-key map (kbd "SPC") 'git-rebase-show-or-scroll-up)
- (define-key map (kbd "DEL") 'git-rebase-show-or-scroll-down)
- (define-key map (kbd "C-x C-t") 'git-rebase-move-line-up)
- (define-key map [M-up] 'git-rebase-move-line-up)
- (define-key map [M-down] 'git-rebase-move-line-down)
- (define-key map [remap undo] 'git-rebase-undo)
- map)
- "Keymap for Git-Rebase mode.")
-
-(put 'git-rebase-reword :advertised-binding (kbd "r"))
-(put 'git-rebase-move-line-up :advertised-binding (kbd "M-p"))
-(put 'git-rebase-kill-line :advertised-binding (kbd "k"))
-
-(easy-menu-define git-rebase-mode-menu git-rebase-mode-map
- "Git-Rebase mode menu"
- '("Rebase"
- ["Pick" git-rebase-pick t]
- ["Reword" git-rebase-reword t]
- ["Edit" git-rebase-edit t]
- ["Squash" git-rebase-squash t]
- ["Fixup" git-rebase-fixup t]
- ["Kill" git-rebase-kill-line t]
- ["Noop" git-rebase-noop t]
- ["Execute" git-rebase-exec t]
- ["Move Down" git-rebase-move-line-down t]
- ["Move Up" git-rebase-move-line-up t]
- "---"
- ["Cancel" with-editor-cancel t]
- ["Finish" with-editor-finish t]))
-
-(defvar git-rebase-command-descriptions
- '((with-editor-finish . "tell Git to make it happen")
- (with-editor-cancel . "tell Git that you changed your mind, i.e. abort")
- (git-rebase-backward-line . "move point to previous line")
- (forward-line . "move point to next line")
- (git-rebase-move-line-up . "move the commit at point up")
- (git-rebase-move-line-down . "move the commit at point down")
- (git-rebase-show-or-scroll-up . "show the commit at point in another buffer")
- (git-rebase-show-commit
- . "show the commit at point in another buffer and select its window")
- (undo . "undo last change")
- (git-rebase-kill-line . "drop the commit at point")
- (git-rebase-insert . "insert a line for an arbitrary commit")
- (git-rebase-noop . "add noop action at point")))
-
-;;; Commands
-
-(defun git-rebase-pick ()
- "Use commit on current line."
- (interactive)
- (git-rebase-set-action "pick"))
-
-(defun git-rebase-reword ()
- "Edit message of commit on current line."
- (interactive)
- (git-rebase-set-action "reword"))
-
-(defun git-rebase-edit ()
- "Stop at the commit on the current line."
- (interactive)
- (git-rebase-set-action "edit"))
-
-(defun git-rebase-squash ()
- "Meld commit on current line into previous commit, edit message."
- (interactive)
- (git-rebase-set-action "squash"))
-
-(defun git-rebase-fixup ()
- "Meld commit on current line into previous commit, discard its message."
- (interactive)
- (git-rebase-set-action "fixup"))
-
-(defvar-local git-rebase-comment-re nil)
-
-(defvar git-rebase-short-options
- '((?b . "break")
- (?e . "edit")
- (?f . "fixup")
- (?l . "label")
- (?m . "merge")
- (?p . "pick")
- (?r . "reword")
- (?s . "squash")
- (?t . "reset")
- (?x . "exec"))
- "Alist mapping single key of an action to the full name.")
-
-(defclass git-rebase-action ()
- (;; action-type: commit, exec, bare, label, merge
- (action-type :initarg :action-type :initform nil)
- ;; Examples for each action type:
- ;; | action | action options | target | trailer |
- ;; |--------+----------------+---------+---------|
- ;; | pick | | hash | subject |
- ;; | exec | | command | |
- ;; | noop | | | |
- ;; | reset | | name | subject |
- ;; | merge | -C hash | name | subject |
- (action :initarg :action :initform nil)
- (action-options :initarg :action-options :initform nil)
- (target :initarg :target :initform nil)
- (trailer :initarg :trailer :initform nil)
- (comment-p :initarg :comment-p :initform nil)))
-
-(defvar git-rebase-line-regexps
- `((commit . ,(concat
- (regexp-opt '("e" "edit"
- "f" "fixup"
- "p" "pick"
- "r" "reword"
- "s" "squash")
- "\\(?1:")
- " \\(?3:[^ \n]+\\) ?\\(?4:.*\\)"))
- (exec . "\\(?1:x\\|exec\\) \\(?3:.*\\)")
- (bare . ,(concat (regexp-opt '("b" "break" "noop") "\\(?1:")
- " *$"))
- (label . ,(concat (regexp-opt '("l" "label"
- "t" "reset")
- "\\(?1:")
- " \\(?3:[^ \n]+\\) ?\\(?4:.*\\)"))
- (merge . ,(concat "\\(?1:m\\|merge\\) "
- "\\(?:\\(?2:-[cC] [^ \n]+\\) \\)?"
- "\\(?3:[^ \n]+\\)"
- " ?\\(?4:.*\\)"))))
-
-;;;###autoload
-(defun git-rebase-current-line ()
- "Parse current line into a `git-rebase-action' instance.
-If the current line isn't recognized as a rebase line, an
-instance with all nil values is returned."
- (save-excursion
- (goto-char (line-beginning-position))
- (if-let ((re-start (concat "^\\(?5:" (regexp-quote comment-start)
- "\\)? *"))
- (type (-some (lambda (arg)
- (let ((case-fold-search nil))
- (and (looking-at (concat re-start (cdr arg)))
- (car arg))))
- git-rebase-line-regexps)))
- (git-rebase-action
- :action-type type
- :action (when-let ((action (match-string-no-properties 1)))
- (or (cdr (assoc action git-rebase-short-options))
- action))
- :action-options (match-string-no-properties 2)
- :target (match-string-no-properties 3)
- :trailer (match-string-no-properties 4)
- :comment-p (and (match-string 5) t))
- ;; Use default empty class rather than nil to ease handling.
- (git-rebase-action))))
-
-(defun git-rebase-set-action (action)
- (goto-char (line-beginning-position))
- (with-slots (action-type target trailer)
- (git-rebase-current-line)
- (if (eq action-type 'commit)
- (let ((inhibit-read-only t))
- (magit-delete-line)
- (insert (concat action " " target " " trailer "\n"))
- (unless git-rebase-auto-advance
- (forward-line -1)))
- (ding))))
-
-(defun git-rebase-line-p (&optional pos)
- (save-excursion
- (when pos (goto-char pos))
- (and (oref (git-rebase-current-line) action-type)
- t)))
-
-(defun git-rebase-region-bounds ()
- (when (use-region-p)
- (let ((beg (save-excursion (goto-char (region-beginning))
- (line-beginning-position)))
- (end (save-excursion (goto-char (region-end))
- (line-end-position))))
- (when (and (git-rebase-line-p beg)
- (git-rebase-line-p end))
- (list beg (1+ end))))))
-
-(defun git-rebase-move-line-down (n)
- "Move the current commit (or command) N lines down.
-If N is negative, move the commit up instead. With an active
-region, move all the lines that the region touches, not just the
-current line."
- (interactive "p")
- (pcase-let* ((`(,beg ,end)
- (or (git-rebase-region-bounds)
- (list (line-beginning-position)
- (1+ (line-end-position)))))
- (pt-offset (- (point) beg))
- (mark-offset (and mark-active (- (mark) beg))))
- (save-restriction
- (narrow-to-region
- (point-min)
- (1-
- (if git-rebase-show-instructions
- (save-excursion
- (goto-char (point-min))
- (while (or (git-rebase-line-p)
- ;; The output for --rebase-merges has empty
- ;; lines and "Branch" comments interspersed.
- (looking-at-p "^$")
- (looking-at-p (concat git-rebase-comment-re
- " Branch")))
- (forward-line))
- (line-beginning-position))
- (point-max))))
- (if (or (and (< n 0) (= beg (point-min)))
- (and (> n 0) (= end (point-max)))
- (> end (point-max)))
- (ding)
- (goto-char (if (< n 0) beg end))
- (forward-line n)
- (atomic-change-group
- (let ((inhibit-read-only t))
- (insert (delete-and-extract-region beg end)))
- (let ((new-beg (- (point) (- end beg))))
- (when (use-region-p)
- (setq deactivate-mark nil)
- (set-mark (+ new-beg mark-offset)))
- (goto-char (+ new-beg pt-offset))))))))
-
-(defun git-rebase-move-line-up (n)
- "Move the current commit (or command) N lines up.
-If N is negative, move the commit down instead. With an active
-region, move all the lines that the region touches, not just the
-current line."
- (interactive "p")
- (git-rebase-move-line-down (- n)))
-
-(defun git-rebase-highlight-region (start end window rol)
- (let ((inhibit-read-only t)
- (deactivate-mark nil)
- (bounds (git-rebase-region-bounds)))
- (mapc #'delete-overlay magit-section-highlight-overlays)
- (when bounds
- (magit-section-make-overlay (car bounds) (cadr bounds)
- 'magit-section-heading-selection))
- (if (and bounds (not magit-keep-region-overlay))
- (funcall (default-value 'redisplay-unhighlight-region-function) rol)
- (funcall (default-value 'redisplay-highlight-region-function)
- start end window rol))))
-
-(defun git-rebase-unhighlight-region (rol)
- (mapc #'delete-overlay magit-section-highlight-overlays)
- (funcall (default-value 'redisplay-unhighlight-region-function) rol))
-
-(defun git-rebase-kill-line ()
- "Kill the current action line."
- (interactive)
- (goto-char (line-beginning-position))
- (unless (oref (git-rebase-current-line) comment-p)
- (let ((inhibit-read-only t))
- (insert comment-start)
- (insert " "))
- (goto-char (line-beginning-position))
- (when git-rebase-auto-advance
- (forward-line))))
-
-(defun git-rebase-insert (rev)
- "Read an arbitrary commit and insert it below current line."
- (interactive (list (magit-read-branch-or-commit "Insert revision")))
- (forward-line)
- (--if-let (magit-rev-format "%h %s" rev)
- (let ((inhibit-read-only t))
- (insert "pick " it ?\n))
- (user-error "Unknown revision")))
-
-(defun git-rebase-set-noncommit-action (action value-fn arg)
- (goto-char (line-beginning-position))
- (pcase-let* ((inhibit-read-only t)
- (`(,initial ,trailer ,comment-p)
- (and (not arg)
- (with-slots ((ln-action action)
- target trailer comment-p)
- (git-rebase-current-line)
- (and (equal ln-action action)
- (list target trailer comment-p)))))
- (value (funcall value-fn initial)))
- (pcase (list value initial comment-p)
- (`("" nil ,_)
- (ding))
- (`("" ,_ ,_)
- (magit-delete-line))
- (_
- (if initial
- (magit-delete-line)
- (forward-line))
- (insert (concat action " " value
- (and (equal value initial)
- trailer
- (concat " " trailer))
- "\n"))
- (unless git-rebase-auto-advance
- (forward-line -1))))))
-
-(defun git-rebase-exec (arg)
- "Insert a shell command to be run after the current commit.
-
-If there already is such a command on the current line, then edit
-that instead. With a prefix argument insert a new command even
-when there already is one on the current line. With empty input
-remove the command on the current line, if any."
- (interactive "P")
- (git-rebase-set-noncommit-action
- "exec"
- (lambda (initial) (read-shell-command "Execute: " initial))
- arg))
-
-(defun git-rebase-label (arg)
- "Add a label after the current commit.
-If there already is a label on the current line, then edit that
-instead. With a prefix argument, insert a new label even when
-there is already a label on the current line. With empty input,
-remove the label on the current line, if any."
- (interactive "P")
- (git-rebase-set-noncommit-action
- "label"
- (lambda (initial)
- (read-from-minibuffer
- "Label: " initial magit-minibuffer-local-ns-map))
- arg))
-
-(defun git-rebase-buffer-labels ()
- (let (labels)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "^\\(?:l\\|label\\) \\([^ \n]+\\)" nil t)
- (push (match-string-no-properties 1) labels)))
- (nreverse labels)))
-
-(defun git-rebase-reset (arg)
- "Reset the current HEAD to a label.
-If there already is a reset command on the current line, then
-edit that instead. With a prefix argument, insert a new reset
-line even when point is already on a reset line. With empty
-input, remove the reset command on the current line, if any."
- (interactive "P")
- (git-rebase-set-noncommit-action
- "reset"
- (lambda (initial)
- (or (magit-completing-read "Label" (git-rebase-buffer-labels)
- nil t initial)
- ""))
- arg))
-
-(defun git-rebase-merge (arg)
- "Add a merge command after the current commit.
-If there is already a merge command on the current line, then
-replace that command instead. With a prefix argument, insert a
-new merge command even when there is already one on the current
-line. With empty input, remove the merge command on the current
-line, if any."
- (interactive "P")
- (git-rebase-set-noncommit-action
- "merge"
- (lambda (_)
- (or (magit-completing-read "Merge" (git-rebase-buffer-labels))
- ""))
- arg))
-
-(defun git-rebase-merge-toggle-editmsg ()
- "Toggle whether an editor is invoked when performing the merge at point.
-When a merge command uses a lower-case -c, the message for the
-specified commit will be opened in an editor before creating the
-commit. For an upper-case -C, the message will be used as is."
- (interactive)
- (with-slots (action-type target action-options trailer)
- (git-rebase-current-line)
- (if (eq action-type 'merge)
- (let ((inhibit-read-only t))
- (magit-delete-line)
- (insert
- (format "merge %s %s %s\n"
- (replace-regexp-in-string
- "-[cC]" (lambda (c)
- (if (equal c "-c") "-C" "-c"))
- action-options t t)
- target
- trailer)))
- (ding))))
-
-(defun git-rebase-set-bare-action (action arg)
- (goto-char (line-beginning-position))
- (with-slots ((ln-action action) comment-p)
- (git-rebase-current-line)
- (let ((same-action-p (equal action ln-action))
- (inhibit-read-only t))
- (when (or arg
- (not ln-action)
- (not same-action-p)
- (and same-action-p comment-p))
- (unless (or arg (not same-action-p))
- (magit-delete-line))
- (insert action ?\n)
- (unless git-rebase-auto-advance
- (forward-line -1))))))
-
-(defun git-rebase-noop (&optional arg)
- "Add noop action at point.
-
-If the current line already contains a noop action, leave it
-unchanged. If there is a commented noop action present, remove
-the comment. Otherwise add a new noop action. With a prefix
-argument insert a new noop action regardless of what is already
-present on the current line.
-
-A noop action can be used to make git perform a rebase even if
-no commits are selected. Without the noop action present, git
-would see an empty file and therefore do nothing."
- (interactive "P")
- (git-rebase-set-bare-action "noop" arg))
-
-(defun git-rebase-break (&optional arg)
- "Add break action at point.
-
-If there is a commented break action present, remove the comment.
-If the current line already contains a break action, add another
-break action only if a prefix argument is given.
-
-A break action can be used to interrupt the rebase at the
-specified point. It is particularly useful for pausing before
-the first commit in the sequence. For other cases, the
-equivalent behavior can be achieved with `git-rebase-edit'."
- (interactive "P")
- (git-rebase-set-bare-action "break" arg))
-
-(defun git-rebase-undo (&optional arg)
- "Undo some previous changes.
-Like `undo' but works in read-only buffers."
- (interactive "P")
- (let ((inhibit-read-only t))
- (undo arg)))
-
-(defun git-rebase--show-commit (&optional scroll)
- (let ((disable-magit-save-buffers t))
- (save-excursion
- (goto-char (line-beginning-position))
- (--if-let (with-slots (action-type target) (git-rebase-current-line)
- (and (eq action-type 'commit)
- target))
- (pcase scroll
- (`up (magit-diff-show-or-scroll-up))
- (`down (magit-diff-show-or-scroll-down))
- (_ (apply #'magit-show-commit it
- (magit-diff-arguments 'magit-revision-mode))))
- (ding)))))
-
-(defun git-rebase-show-commit ()
- "Show the commit on the current line if any."
- (interactive)
- (git-rebase--show-commit))
-
-(defun git-rebase-show-or-scroll-up ()
- "Update the commit buffer for commit on current line.
-
-Either show the commit at point in the appropriate buffer, or if
-that buffer is already being displayed in the current frame and
-contains information about that commit, then instead scroll the
-buffer up."
- (interactive)
- (git-rebase--show-commit 'up))
-
-(defun git-rebase-show-or-scroll-down ()
- "Update the commit buffer for commit on current line.
-
-Either show the commit at point in the appropriate buffer, or if
-that buffer is already being displayed in the current frame and
-contains information about that commit, then instead scroll the
-buffer down."
- (interactive)
- (git-rebase--show-commit 'down))
-
-(defun git-rebase-backward-line (&optional n)
- "Move N lines backward (forward if N is negative).
-Like `forward-line' but go into the opposite direction."
- (interactive "p")
- (forward-line (- (or n 1))))
-
-;;; Mode
-
-;;;###autoload
-(define-derived-mode git-rebase-mode special-mode "Git Rebase"
- "Major mode for editing of a Git rebase file.
-
-Rebase files are generated when you run 'git rebase -i' or run
-`magit-interactive-rebase'. They describe how Git should perform
-the rebase. See the documentation for git-rebase (e.g., by
-running 'man git-rebase' at the command line) for details."
- :group 'git-rebase
- (setq comment-start (or (magit-get "core.commentChar") "#"))
- (setq git-rebase-comment-re (concat "^" (regexp-quote comment-start)))
- (setq font-lock-defaults (list (git-rebase-mode-font-lock-keywords) t t))
- (unless git-rebase-show-instructions
- (let ((inhibit-read-only t))
- (flush-lines git-rebase-comment-re)))
- (unless with-editor-mode
- ;; Maybe already enabled when using `shell-command' or an Emacs shell.
- (with-editor-mode 1))
- (when git-rebase-confirm-cancel
- (add-hook 'with-editor-cancel-query-functions
- 'git-rebase-cancel-confirm nil t))
- (setq-local redisplay-highlight-region-function 'git-rebase-highlight-region)
- (setq-local redisplay-unhighlight-region-function 'git-rebase-unhighlight-region)
- (add-hook 'with-editor-pre-cancel-hook 'git-rebase-autostash-save nil t)
- (add-hook 'with-editor-post-cancel-hook 'git-rebase-autostash-apply nil t)
- (setq imenu-prev-index-position-function
- #'magit-imenu--rebase-prev-index-position-function)
- (setq imenu-extract-index-name-function
- #'magit-imenu--rebase-extract-index-name-function)
- (when (boundp 'save-place)
- (setq save-place nil)))
-
-(defun git-rebase-cancel-confirm (force)
- (or (not (buffer-modified-p))
- force
- (magit-confirm 'abort-rebase "Abort this rebase" nil 'noabort)))
-
-(defun git-rebase-autostash-save ()
- (--when-let (magit-file-line (magit-git-dir "rebase-merge/autostash"))
- (push (cons 'stash it) with-editor-cancel-alist)))
-
-(defun git-rebase-autostash-apply ()
- (--when-let (cdr (assq 'stash with-editor-cancel-alist))
- (magit-stash-apply it)))
-
-(defun git-rebase-match-comment-line (limit)
- (re-search-forward (concat git-rebase-comment-re ".*") limit t))
-
-(defun git-rebase-mode-font-lock-keywords ()
- "Font lock keywords for Git-Rebase mode."
- `((,(concat "^" (cdr (assq 'commit git-rebase-line-regexps)))
- (1 'font-lock-keyword-face)
- (3 'git-rebase-hash)
- (4 'git-rebase-description))
- (,(concat "^" (cdr (assq 'exec git-rebase-line-regexps)))
- (1 'font-lock-keyword-face)
- (3 'git-rebase-description))
- (,(concat "^" (cdr (assq 'bare git-rebase-line-regexps)))
- (1 'font-lock-keyword-face))
- (,(concat "^" (cdr (assq 'label git-rebase-line-regexps)))
- (1 'font-lock-keyword-face)
- (3 'git-rebase-label)
- (4 'font-lock-comment-face))
- ("^\\(m\\(?:erge\\)?\\) -[Cc] \\([^ \n]+\\) \\([^ \n]+\\)\\( #.*\\)?"
- (1 'font-lock-keyword-face)
- (2 'git-rebase-hash)
- (3 'git-rebase-label)
- (4 'font-lock-comment-face))
- ("^\\(m\\(?:erge\\)?\\) \\([^ \n]+\\)"
- (1 'font-lock-keyword-face)
- (2 'git-rebase-label))
- (,(concat git-rebase-comment-re " *"
- (cdr (assq 'commit git-rebase-line-regexps)))
- 0 'git-rebase-killed-action t)
- (git-rebase-match-comment-line 0 'font-lock-comment-face)
- ("\\[[^[]*\\]"
- 0 'magit-keyword t)
- ("\\(?:fixup!\\|squash!\\)"
- 0 'magit-keyword-squash t)
- (,(format "^%s Rebase \\([^ ]*\\) onto \\([^ ]*\\)" comment-start)
- (1 'git-rebase-comment-hash t)
- (2 'git-rebase-comment-hash t))
- (,(format "^%s \\(Commands:\\)" comment-start)
- (1 'git-rebase-comment-heading t))
- (,(format "^%s Branch \\(.*\\)" comment-start)
- (1 'git-rebase-label t))))
-
-(defun git-rebase-mode-show-keybindings ()
- "Modify the \"Commands:\" section of the comment Git generates
-at the bottom of the file so that in place of the one-letter
-abbreviation for the command, it shows the command's keybinding.
-By default, this is the same except for the \"pick\" command."
- (let ((inhibit-read-only t))
- (save-excursion
- (goto-char (point-min))
- (when (and git-rebase-show-instructions
- (re-search-forward
- (concat git-rebase-comment-re "\\s-+p, pick")
- nil t))
- (goto-char (line-beginning-position))
- (pcase-dolist (`(,cmd . ,desc) git-rebase-command-descriptions)
- (insert (format "%s %-8s %s\n"
- comment-start
- (substitute-command-keys (format "\\[%s]" cmd))
- desc)))
- (while (re-search-forward (concat git-rebase-comment-re
- "\\( ?\\)\\([^\n,],\\) "
- "\\([^\n ]+\\) ")
- nil t)
- (let ((cmd (intern (concat "git-rebase-" (match-string 3)))))
- (if (not (fboundp cmd))
- (delete-region (line-beginning-position) (1+ (line-end-position)))
- (replace-match " " t t nil 1)
- (replace-match
- (format "%-8s"
- (mapconcat #'key-description
- (--remove (eq (elt it 0) 'menu-bar)
- (reverse (where-is-internal
- cmd git-rebase-mode-map)))
- ", "))
- t t nil 2))))))))
-
-(add-hook 'git-rebase-mode-hook 'git-rebase-mode-show-keybindings t)
-
-(defun git-rebase-mode-disable-before-save-hook ()
- (set (make-local-variable 'before-save-hook) nil))
-
-(add-hook 'git-rebase-mode-hook 'git-rebase-mode-disable-before-save-hook)
-
-;;;###autoload
-(defconst git-rebase-filename-regexp "/git-rebase-todo\\'")
-;;;###autoload
-(add-to-list 'auto-mode-alist
- (cons git-rebase-filename-regexp 'git-rebase-mode))
-
-(add-to-list 'with-editor-server-window-alist
- (cons git-rebase-filename-regexp 'switch-to-buffer))
-
-(eval-after-load 'recentf
- '(add-to-list 'recentf-exclude git-rebase-filename-regexp))
-
-(add-to-list 'with-editor-file-name-history-exclude git-rebase-filename-regexp)
-
-;;; _
-(provide 'git-rebase)
-;;; git-rebase.el ends here
diff --git a/elpa/magit-20200728.45/magit-apply.el b/elpa/magit-20200728.45/magit-apply.el
deleted file mode 100644
index 766a3cc..0000000
--- a/elpa/magit-20200728.45/magit-apply.el
+++ /dev/null
@@ -1,739 +0,0 @@
-;;; magit-apply.el --- apply Git diffs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements commands for applying Git diffs or parts
-;; of such a diff. The supported "apply variants" are apply, stage,
-;; unstage, discard, and reverse - more than Git itself knows about,
-;; at least at the porcelain level.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit-core)
-(require 'magit-diff)
-(require 'magit-wip)
-
-(require 'transient) ; See #3732.
-
-;; For `magit-apply'
-(declare-function magit-am "magit-sequence" ())
-(declare-function magit-patch-apply "magit-files" ())
-;; For `magit-discard-files'
-(declare-function magit-checkout-stage "magit-merge" (file arg))
-(declare-function magit-checkout-read-stage "magit-merge" (file))
-(defvar auto-revert-verbose)
-;; For `magit-stage-untracked'
-(declare-function magit-submodule-add-1 "magit-submodule"
- (url &optional path name args))
-(declare-function magit-submodule-read-name-for-path "magit-submodule"
- (path &optional prefer-short))
-(declare-function borg--maybe-absorb-gitdir "borg" (pkg))
-(declare-function borg--sort-submodule-sections "borg" (file))
-(defvar borg-user-emacs-directory)
-
-;;; Options
-
-(defcustom magit-delete-by-moving-to-trash t
- "Whether Magit uses the system's trash can.
-
-You should absolutely not disable this and also remove `discard'
-from `magit-no-confirm'. You shouldn't do that even if you have
-all of the Magit-Wip modes enabled, because those modes do not
-track any files that are not tracked in the proper branch."
- :package-version '(magit . "2.1.0")
- :group 'magit-essentials
- :type 'boolean)
-
-(defcustom magit-unstage-committed t
- "Whether unstaging a committed change reverts it instead.
-
-A committed change cannot be unstaged, because staging and
-unstaging are actions that are concerned with the differences
-between the index and the working tree, not with committed
-changes.
-
-If this option is non-nil (the default), then typing \"u\"
-\(`magit-unstage') on a committed change, causes it to be
-reversed in the index but not the working tree. For more
-information see command `magit-reverse-in-index'."
- :package-version '(magit . "2.4.1")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-reverse-atomically nil
- "Whether to reverse changes atomically.
-
-If some changes can be reversed while others cannot, then nothing
-is reversed if the value of this option is non-nil. But when it
-is nil, then the changes that can be reversed are reversed and
-for the other changes diff files are created that contain the
-rejected reversals."
- :package-version '(magit . "2.7.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-post-stage-hook nil
- "Hook run after staging changes.
-This hook is run by `magit-refresh' if `this-command'
-is a member of `magit-post-stage-hook-commands'."
- :package-version '(magit . "2.90.0")
- :group 'magit-commands
- :type 'hook)
-
-(defvar magit-post-stage-hook-commands
- '(magit-stage magit-stage-file magit-stage-modified))
-
-(defcustom magit-post-unstage-hook nil
- "Hook run after unstaging changes.
-This hook is run by `magit-refresh' if `this-command'
-is a member of `magit-post-unstage-hook-commands'."
- :package-version '(magit . "2.90.0")
- :group 'magit-commands
- :type 'hook)
-
-(defvar magit-post-unstage-hook-commands
- '(magit-unstage magit-unstage-file magit-unstage-all))
-
-;;; Commands
-;;;; Apply
-
-(defun magit-apply (&rest args)
- "Apply the change at point to the working tree.
-With a prefix argument fallback to a 3-way merge. Doing
-so causes the change to be applied to the index as well."
- (interactive (and current-prefix-arg (list "--3way")))
- (--when-let (magit-apply--get-selection)
- (pcase (list (magit-diff-type) (magit-diff-scope))
- (`(,(or `unstaged `staged) ,_)
- (user-error "Change is already in the working tree"))
- (`(untracked ,(or `file `files))
- (call-interactively 'magit-am))
- (`(,_ region) (magit-apply-region it args))
- (`(,_ hunk) (magit-apply-hunk it args))
- (`(,_ hunks) (magit-apply-hunks it args))
- (`(rebase-sequence file)
- (call-interactively 'magit-patch-apply))
- (`(,_ file) (magit-apply-diff it args))
- (`(,_ files) (magit-apply-diffs it args)))))
-
-(defun magit-apply--section-content (section)
- (buffer-substring-no-properties (if (magit-hunk-section-p section)
- (oref section start)
- (oref section content))
- (oref section end)))
-
-(defun magit-apply-diffs (sections &rest args)
- (setq sections (magit-apply--get-diffs sections))
- (magit-apply-patch sections args
- (mapconcat
- (lambda (s)
- (concat (magit-diff-file-header s)
- (magit-apply--section-content s)))
- sections "")))
-
-(defun magit-apply-diff (section &rest args)
- (setq section (car (magit-apply--get-diffs (list section))))
- (magit-apply-patch section args
- (concat (magit-diff-file-header section)
- (magit-apply--section-content section))))
-
-(defun magit-apply--adjust-hunk-new-starts (hunks)
- "Adjust new line numbers in headers of HUNKS for partial application.
-HUNKS should be a list of ordered, contiguous hunks to be applied
-from a file. For example, if there is a sequence of hunks with
-the headers
-
- @@ -2,6 +2,7 @@
- @@ -10,6 +11,7 @@
- @@ -18,6 +20,7 @@
-
-and only the second and third are to be applied, they would be
-adjusted as \"@@ -10,6 +10,7 @@\" and \"@@ -18,6 +19,7 @@\"."
- (let* ((first-hunk (car hunks))
- (offset (if (string-match diff-hunk-header-re-unified first-hunk)
- (- (string-to-number (match-string 3 first-hunk))
- (string-to-number (match-string 1 first-hunk)))
- (error "Hunk does not have expected header"))))
- (if (= offset 0)
- hunks
- (mapcar (lambda (hunk)
- (if (string-match diff-hunk-header-re-unified hunk)
- (replace-match (number-to-string
- (- (string-to-number (match-string 3 hunk))
- offset))
- t t hunk 3)
- (error "Hunk does not have expected header")))
- hunks))))
-
-(defun magit-apply--adjust-hunk-new-start (hunk)
- (car (magit-apply--adjust-hunk-new-starts (list hunk))))
-
-(defun magit-apply-hunks (sections &rest args)
- (let ((section (oref (car sections) parent)))
- (when (string-match "^diff --cc" (oref section value))
- (user-error "Cannot un-/stage resolution hunks. Stage the whole file"))
- (magit-apply-patch
- section args
- (concat (oref section header)
- (mapconcat #'identity
- (magit-apply--adjust-hunk-new-starts
- (mapcar #'magit-apply--section-content sections))
- "")))))
-
-(defun magit-apply-hunk (section &rest args)
- (when (string-match "^diff --cc" (magit-section-parent-value section))
- (user-error "Cannot un-/stage resolution hunks. Stage the whole file"))
- (magit-apply-patch (oref section parent) args
- (concat (magit-diff-file-header section)
- (magit-apply--adjust-hunk-new-start
- (magit-apply--section-content section)))))
-
-(defun magit-apply-region (section &rest args)
- (when (string-match "^diff --cc" (magit-section-parent-value section))
- (user-error "Cannot un-/stage resolution hunks. Stage the whole file"))
- (magit-apply-patch (oref section parent) args
- (concat (magit-diff-file-header section)
- (magit-apply--adjust-hunk-new-start
- (magit-diff-hunk-region-patch section args)))))
-
-(defun magit-apply-patch (section:s args patch)
- (let* ((files (if (atom section:s)
- (list (oref section:s value))
- (--map (oref it value) section:s)))
- (command (symbol-name this-command))
- (command (if (and command (string-match "^magit-\\([^-]+\\)" command))
- (match-string 1 command)
- "apply"))
- (ignore-context (magit-diff-ignore-any-space-p)))
- (unless (magit-diff-context-p)
- (user-error "Not enough context to apply patch. Increase the context"))
- (when (and magit-wip-before-change-mode (not inhibit-magit-refresh))
- (magit-wip-commit-before-change files (concat " before " command)))
- (with-temp-buffer
- (insert patch)
- (magit-run-git-with-input
- "apply" args "-p0"
- (and ignore-context "-C0")
- "--ignore-space-change" "-"))
- (unless inhibit-magit-refresh
- (when magit-wip-after-apply-mode
- (magit-wip-commit-after-apply files (concat " after " command)))
- (magit-refresh))))
-
-(defun magit-apply--get-selection ()
- (or (magit-region-sections '(hunk file module) t)
- (let ((section (magit-current-section)))
- (pcase (oref section type)
- ((or `hunk `file `module) section)
- ((or `staged `unstaged `untracked
- `stashed-index `stashed-worktree `stashed-untracked)
- (oref section children))
- (_ (user-error "Cannot apply this, it's not a change"))))))
-
-(defun magit-apply--get-diffs (sections)
- (magit-section-case
- ([file diffstat]
- (--map (or (magit-get-section
- (append `((file . ,(oref it value)))
- (magit-section-ident magit-root-section)))
- (error "Cannot get required diff headers"))
- sections))
- (t sections)))
-
-(defun magit-apply--diff-ignores-whitespace-p ()
- (and (cl-intersection magit-buffer-diff-args
- '("--ignore-space-at-eol"
- "--ignore-space-change"
- "--ignore-all-space"
- "--ignore-blank-lines")
- :test #'equal)
- t))
-
-;;;; Stage
-
-(defun magit-stage (&optional intent)
- "Add the change at point to the staging area.
-With a prefix argument, INTENT, and an untracked file (or files)
-at point, stage the file but not its content."
- (interactive "P")
- (--if-let (and (derived-mode-p 'magit-mode) (magit-apply--get-selection))
- (pcase (list (magit-diff-type)
- (magit-diff-scope)
- (magit-apply--diff-ignores-whitespace-p))
- (`(untracked ,_ ,_) (magit-stage-untracked intent))
- (`(unstaged region ,_) (magit-apply-region it "--cached"))
- (`(unstaged hunk ,_) (magit-apply-hunk it "--cached"))
- (`(unstaged hunks ,_) (magit-apply-hunks it "--cached"))
- (`(unstaged file t) (magit-apply-diff it "--cached"))
- (`(unstaged files t) (magit-apply-diffs it "--cached"))
- (`(unstaged list t) (magit-apply-diffs it "--cached"))
- (`(unstaged file nil) (magit-stage-1 "-u" (list (oref it value))))
- (`(unstaged files nil) (magit-stage-1 "-u" (magit-region-values nil t)))
- (`(unstaged list nil) (magit-stage-modified))
- (`(staged ,_ ,_) (user-error "Already staged"))
- (`(committed ,_ ,_) (user-error "Cannot stage committed changes"))
- (`(undefined ,_ ,_) (user-error "Cannot stage this change")))
- (call-interactively 'magit-stage-file)))
-
-;;;###autoload
-(defun magit-stage-file (file)
- "Stage all changes to FILE.
-With a prefix argument or when there is no file at point ask for
-the file to be staged. Otherwise stage the file at point without
-requiring confirmation."
- (interactive
- (let* ((atpoint (magit-section-value-if 'file))
- (current (magit-file-relative-name))
- (choices (nconc (magit-unstaged-files)
- (magit-untracked-files)))
- (default (car (member (or atpoint current) choices))))
- (list (if (or current-prefix-arg (not default))
- (magit-completing-read "Stage file" choices
- nil t nil nil default)
- default))))
- (magit-with-toplevel
- (magit-stage-1 nil (list file))))
-
-;;;###autoload
-(defun magit-stage-modified (&optional all)
- "Stage all changes to files modified in the worktree.
-Stage all new content of tracked files and remove tracked files
-that no longer exist in the working tree from the index also.
-With a prefix argument also stage previously untracked (but not
-ignored) files."
- (interactive "P")
- (when (magit-anything-staged-p)
- (magit-confirm 'stage-all-changes))
- (magit-with-toplevel
- (magit-stage-1 (if all "--all" "-u") magit-buffer-diff-files)))
-
-(defun magit-stage-1 (arg &optional files)
- (magit-wip-commit-before-change files " before stage")
- (magit-run-git "add" arg (if files (cons "--" files) "."))
- (when magit-auto-revert-mode
- (mapc #'magit-turn-on-auto-revert-mode-if-desired files))
- (magit-wip-commit-after-apply files " after stage"))
-
-(defun magit-stage-untracked (&optional intent)
- (let* ((section (magit-current-section))
- (files (pcase (magit-diff-scope)
- (`file (list (oref section value)))
- (`files (magit-region-values nil t))
- (`list (magit-untracked-files))))
- plain repos)
- (dolist (file files)
- (if (and (not (file-symlink-p file))
- (magit-git-repo-p file t))
- (push file repos)
- (push file plain)))
- (magit-wip-commit-before-change files " before stage")
- (when plain
- (magit-run-git "add" (and intent "--intent-to-add")
- "--" plain)
- (when magit-auto-revert-mode
- (mapc #'magit-turn-on-auto-revert-mode-if-desired plain)))
- (dolist (repo repos)
- (save-excursion
- (goto-char (oref (magit-get-section
- `((file . ,repo) (untracked) (status)))
- start))
- (let* ((topdir (magit-toplevel))
- (package
- (and (equal (bound-and-true-p borg-user-emacs-directory)
- topdir)
- (file-name-nondirectory (directory-file-name repo)))))
- (magit-submodule-add-1
- (let ((default-directory
- (file-name-as-directory (expand-file-name repo))))
- (or (magit-get "remote" (magit-get-some-remote) "url")
- (concat (file-name-as-directory ".") repo)))
- repo
- (magit-submodule-read-name-for-path repo package))
- (when package
- (borg--sort-submodule-sections
- (expand-file-name ".gitmodules" topdir))
- (let ((default-directory borg-user-emacs-directory))
- (borg--maybe-absorb-gitdir package))
- (when (and (y-or-n-p
- (format "Also build and activate `%s' drone?" package))
- (fboundp 'borg-build)
- (fboundp 'borg-activate))
- (borg-build package)
- (borg-activate package))))))
- (magit-wip-commit-after-apply files " after stage")))
-
-;;;; Unstage
-
-(defun magit-unstage ()
- "Remove the change at point from the staging area."
- (interactive)
- (--when-let (magit-apply--get-selection)
- (pcase (list (magit-diff-type)
- (magit-diff-scope)
- (magit-apply--diff-ignores-whitespace-p))
- (`(untracked ,_ ,_) (user-error "Cannot unstage untracked changes"))
- (`(unstaged file ,_) (magit-unstage-intent (list (oref it value))))
- (`(unstaged files ,_) (magit-unstage-intent (magit-region-values nil t)))
- (`(unstaged ,_ ,_) (user-error "Already unstaged"))
- (`(staged region ,_) (magit-apply-region it "--reverse" "--cached"))
- (`(staged hunk ,_) (magit-apply-hunk it "--reverse" "--cached"))
- (`(staged hunks ,_) (magit-apply-hunks it "--reverse" "--cached"))
- (`(staged file t) (magit-apply-diff it "--reverse" "--cached"))
- (`(staged files t) (magit-apply-diffs it "--reverse" "--cached"))
- (`(staged list t) (magit-apply-diffs it "--reverse" "--cached"))
- (`(staged file nil) (magit-unstage-1 (list (oref it value))))
- (`(staged files nil) (magit-unstage-1 (magit-region-values nil t)))
- (`(staged list nil) (magit-unstage-all))
- (`(committed ,_ ,_) (if magit-unstage-committed
- (magit-reverse-in-index)
- (user-error "Cannot unstage committed changes")))
- (`(undefined ,_ ,_) (user-error "Cannot unstage this change")))))
-
-;;;###autoload
-(defun magit-unstage-file (file)
- "Unstage all changes to FILE.
-With a prefix argument or when there is no file at point ask for
-the file to be unstaged. Otherwise unstage the file at point
-without requiring confirmation."
- (interactive
- (let* ((atpoint (magit-section-value-if 'file))
- (current (magit-file-relative-name))
- (choices (magit-staged-files))
- (default (car (member (or atpoint current) choices))))
- (list (if (or current-prefix-arg (not default))
- (magit-completing-read "Unstage file" choices
- nil t nil nil default)
- default))))
- (magit-with-toplevel
- (magit-unstage-1 (list file))))
-
-(defun magit-unstage-1 (files)
- (magit-wip-commit-before-change files " before unstage")
- (if (magit-no-commit-p)
- (magit-run-git "rm" "--cached" "--" files)
- (magit-run-git "reset" "HEAD" "--" files))
- (magit-wip-commit-after-apply files " after unstage"))
-
-(defun magit-unstage-intent (files)
- (if-let ((staged (magit-staged-files))
- (intent (--filter (member it staged) files)))
- (magit-unstage-1 intent)
- (user-error "Already unstaged")))
-
-;;;###autoload
-(defun magit-unstage-all ()
- "Remove all changes from the staging area."
- (interactive)
- (when (or (magit-anything-unstaged-p)
- (magit-untracked-files))
- (magit-confirm 'unstage-all-changes))
- (magit-wip-commit-before-change nil " before unstage")
- (magit-run-git "reset" "HEAD" "--" magit-buffer-diff-files)
- (magit-wip-commit-after-apply nil " after unstage"))
-
-;;;; Discard
-
-(defun magit-discard ()
- "Remove the change at point."
- (interactive)
- (--when-let (magit-apply--get-selection)
- (pcase (list (magit-diff-type) (magit-diff-scope))
- (`(committed ,_) (user-error "Cannot discard committed changes"))
- (`(undefined ,_) (user-error "Cannot discard this change"))
- (`(,_ region) (magit-discard-region it))
- (`(,_ hunk) (magit-discard-hunk it))
- (`(,_ hunks) (magit-discard-hunks it))
- (`(,_ file) (magit-discard-file it))
- (`(,_ files) (magit-discard-files it))
- (`(,_ list) (magit-discard-files it)))))
-
-(defun magit-discard-region (section)
- (magit-confirm 'discard "Discard region")
- (magit-discard-apply section 'magit-apply-region))
-
-(defun magit-discard-hunk (section)
- (magit-confirm 'discard "Discard hunk")
- (magit-discard-apply section 'magit-apply-hunk))
-
-(defun magit-discard-apply (section apply)
- (if (eq (magit-diff-type section) 'unstaged)
- (funcall apply section "--reverse")
- (if (magit-anything-unstaged-p
- nil (if (magit-file-section-p section)
- (oref section value)
- (magit-section-parent-value section)))
- (progn (let ((inhibit-magit-refresh t))
- (funcall apply section "--reverse" "--cached")
- (funcall apply section "--reverse" "--reject"))
- (magit-refresh))
- (funcall apply section "--reverse" "--index"))))
-
-(defun magit-discard-hunks (sections)
- (magit-confirm 'discard (format "Discard %s hunks from %s"
- (length sections)
- (magit-section-parent-value (car sections))))
- (magit-discard-apply-n sections 'magit-apply-hunks))
-
-(defun magit-discard-apply-n (sections apply)
- (let ((section (car sections)))
- (if (eq (magit-diff-type section) 'unstaged)
- (funcall apply sections "--reverse")
- (if (magit-anything-unstaged-p
- nil (if (magit-file-section-p section)
- (oref section value)
- (magit-section-parent-value section)))
- (progn (let ((inhibit-magit-refresh t))
- (funcall apply sections "--reverse" "--cached")
- (funcall apply sections "--reverse" "--reject"))
- (magit-refresh))
- (funcall apply sections "--reverse" "--index")))))
-
-(defun magit-discard-file (section)
- (magit-discard-files (list section)))
-
-(defun magit-discard-files (sections)
- (let ((auto-revert-verbose nil)
- (type (magit-diff-type (car sections)))
- (status (magit-file-status))
- files delete resurrect rename discard discard-new resolve)
- (dolist (section sections)
- (let ((file (oref section value)))
- (push file files)
- (pcase (cons (pcase type
- (`staged ?X)
- (`unstaged ?Y)
- (`untracked ?Z))
- (cddr (assoc file status)))
- (`(?Z) (dolist (f (magit-untracked-files nil file))
- (push f delete)))
- ((or `(?Z ?? ??) `(?Z ?! ?!)) (push file delete))
- ((or `(?Z ?D ? ) `(,_ ?D ?D)) (push file delete))
- ((or `(,_ ?U ,_) `(,_ ,_ ?U)) (push file resolve))
- (`(,_ ?A ?A) (push file resolve))
- (`(?X ?M ,(or ? ?M ?D)) (push section discard))
- (`(?Y ,_ ?M ) (push section discard))
- (`(?X ?A ?M ) (push file discard-new))
- (`(?X ?C ?M ) (push file discard-new))
- (`(?X ?A ,(or ? ?D)) (push file delete))
- (`(?X ?C ,(or ? ?D)) (push file delete))
- (`(?X ?D ,(or ? ?M )) (push file resurrect))
- (`(?Y ,_ ?D ) (push file resurrect))
- (`(?X ?R ,(or ? ?M ?D)) (push file rename)))))
- (unwind-protect
- (let ((inhibit-magit-refresh t))
- (magit-wip-commit-before-change files " before discard")
- (when resolve
- (magit-discard-files--resolve (nreverse resolve)))
- (when resurrect
- (magit-discard-files--resurrect (nreverse resurrect)))
- (when delete
- (magit-discard-files--delete (nreverse delete) status))
- (when rename
- (magit-discard-files--rename (nreverse rename) status))
- (when (or discard discard-new)
- (magit-discard-files--discard (nreverse discard)
- (nreverse discard-new)))
- (magit-wip-commit-after-apply files " after discard"))
- (magit-refresh))))
-
-(defun magit-discard-files--resolve (files)
- (if-let ((arg (and (cdr files)
- (magit-read-char-case
- (format "For these %i files\n%s\ncheckout:\n"
- (length files)
- (mapconcat (lambda (file)
- (concat " " file))
- files "\n"))
- t
- (?o "[o]ur stage" "--ours")
- (?t "[t]heir stage" "--theirs")
- (?c "[c]onflict" "--merge")
- (?i "decide [i]ndividually" nil)))))
- (dolist (file files)
- (magit-checkout-stage file arg))
- (dolist (file files)
- (magit-checkout-stage file (magit-checkout-read-stage file)))))
-
-(defun magit-discard-files--resurrect (files)
- (magit-confirm-files 'resurrect files)
- (if (eq (magit-diff-type) 'staged)
- (magit-call-git "reset" "--" files)
- (magit-call-git "checkout" "--" files)))
-
-(defun magit-discard-files--delete (files status)
- (magit-confirm-files (if magit-delete-by-moving-to-trash 'trash 'delete)
- files)
- (let ((delete-by-moving-to-trash magit-delete-by-moving-to-trash))
- (dolist (file files)
- (when (string-match-p "\\`\\\\?~" file)
- (error "Refusing to delete %S, too dangerous" file))
- (pcase (nth 3 (assoc file status))
- ((guard (memq (magit-diff-type) '(unstaged untracked)))
- (dired-delete-file file dired-recursive-deletes
- magit-delete-by-moving-to-trash)
- (dired-clean-up-after-deletion file))
- (?\s (delete-file file t)
- (magit-call-git "rm" "--cached" "--" file))
- (?M (let ((temp (magit-git-string "checkout-index" "--temp" file)))
- (string-match
- (format "\\(.+?\\)\t%s" (regexp-quote file)) temp)
- (rename-file (match-string 1 temp)
- (setq temp (concat file ".~{index}~")))
- (delete-file temp t))
- (magit-call-git "rm" "--cached" "--force" "--" file))
- (?D (magit-call-git "checkout" "--" file)
- (delete-file file t)
- (magit-call-git "rm" "--cached" "--force" "--" file))))))
-
-(defun magit-discard-files--rename (files status)
- (magit-confirm 'rename "Undo rename %s" "Undo %i renames" nil
- (mapcar (lambda (file)
- (setq file (assoc file status))
- (format "%s -> %s" (cadr file) (car file)))
- files))
- (dolist (file files)
- (let ((orig (cadr (assoc file status))))
- (if (file-exists-p file)
- (progn
- (--when-let (file-name-directory orig)
- (make-directory it t))
- (magit-call-git "mv" file orig))
- (magit-call-git "rm" "--cached" "--" file)
- (magit-call-git "reset" "--" orig)))))
-
-(defun magit-discard-files--discard (sections new-files)
- (let ((files (--map (oref it value) sections)))
- (magit-confirm-files 'discard (append files new-files)
- (format "Discard %s changes in" (magit-diff-type)))
- (if (eq (magit-diff-type (car sections)) 'unstaged)
- (magit-call-git "checkout" "--" files)
- (when new-files
- (magit-call-git "add" "--" new-files)
- (magit-call-git "reset" "--" new-files))
- (let ((binaries (magit-binary-files "--cached")))
- (when binaries
- (setq sections
- (--remove (member (oref it value) binaries)
- sections)))
- (cond ((= (length sections) 1)
- (magit-discard-apply (car sections) 'magit-apply-diff))
- (sections
- (magit-discard-apply-n sections 'magit-apply-diffs)))
- (when binaries
- (let ((modified (magit-unstaged-files t)))
- (setq binaries (--separate (member it modified) binaries)))
- (when (cadr binaries)
- (magit-call-git "reset" "--" (cadr binaries)))
- (when (car binaries)
- (user-error
- (concat
- "Cannot discard staged changes to binary files, "
- "which also have unstaged changes. Unstage instead."))))))))
-
-;;;; Reverse
-
-(defun magit-reverse (&rest args)
- "Reverse the change at point in the working tree.
-With a prefix argument fallback to a 3-way merge. Doing
-so causes the change to be applied to the index as well."
- (interactive (and current-prefix-arg (list "--3way")))
- (--when-let (magit-apply--get-selection)
- (pcase (list (magit-diff-type) (magit-diff-scope))
- (`(untracked ,_) (user-error "Cannot reverse untracked changes"))
- (`(unstaged ,_) (user-error "Cannot reverse unstaged changes"))
- (`(,_ region) (magit-reverse-region it args))
- (`(,_ hunk) (magit-reverse-hunk it args))
- (`(,_ hunks) (magit-reverse-hunks it args))
- (`(,_ file) (magit-reverse-file it args))
- (`(,_ files) (magit-reverse-files it args))
- (`(,_ list) (magit-reverse-files it args)))))
-
-(defun magit-reverse-region (section args)
- (magit-confirm 'reverse "Reverse region")
- (magit-reverse-apply section 'magit-apply-region args))
-
-(defun magit-reverse-hunk (section args)
- (magit-confirm 'reverse "Reverse hunk")
- (magit-reverse-apply section 'magit-apply-hunk args))
-
-(defun magit-reverse-hunks (sections args)
- (magit-confirm 'reverse
- (format "Reverse %s hunks from %s"
- (length sections)
- (magit-section-parent-value (car sections))))
- (magit-reverse-apply sections 'magit-apply-hunks args))
-
-(defun magit-reverse-file (section args)
- (magit-reverse-files (list section) args))
-
-(defun magit-reverse-files (sections args)
- (pcase-let ((`(,binaries ,sections)
- (let ((bs (magit-binary-files
- (cond ((derived-mode-p 'magit-revision-mode)
- magit-buffer-range)
- ((derived-mode-p 'magit-diff-mode)
- magit-buffer-range)
- (t
- "--cached")))))
- (--separate (member (oref it value) bs)
- sections))))
- (magit-confirm-files 'reverse (--map (oref it value) sections))
- (cond ((= (length sections) 1)
- (magit-reverse-apply (car sections) 'magit-apply-diff args))
- (sections
- (magit-reverse-apply sections 'magit-apply-diffs args)))
- (when binaries
- (user-error "Cannot reverse binary files"))))
-
-(defun magit-reverse-apply (section:s apply args)
- (funcall apply section:s "--reverse" args
- (and (not magit-reverse-atomically)
- (not (member "--3way" args))
- "--reject")))
-
-(defun magit-reverse-in-index (&rest args)
- "Reverse the change at point in the index but not the working tree.
-
-Use this command to extract a change from `HEAD', while leaving
-it in the working tree, so that it can later be committed using
-a separate commit. A typical workflow would be:
-
-0. Optionally make sure that there are no uncommitted changes.
-1. Visit the `HEAD' commit and navigate to the change that should
- not have been included in that commit.
-2. Type \"u\" (`magit-unstage') to reverse it in the index.
- This assumes that `magit-unstage-committed-changes' is non-nil.
-3. Type \"c e\" to extend `HEAD' with the staged changes,
- including those that were already staged before.
-4. Optionally stage the remaining changes using \"s\" or \"S\"
- and then type \"c c\" to create a new commit."
- (interactive)
- (magit-reverse (cons "--cached" args)))
-
-;;; _
-(provide 'magit-apply)
-;;; magit-apply.el ends here
diff --git a/elpa/magit-20200728.45/magit-autoloads.el b/elpa/magit-20200728.45/magit-autoloads.el
deleted file mode 100644
index aa69e25..0000000
--- a/elpa/magit-20200728.45/magit-autoloads.el
+++ /dev/null
@@ -1,2532 +0,0 @@
-;;; magit-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "git-rebase" "git-rebase.el" (0 0 0 0))
-;;; Generated autoloads from git-rebase.el
-
-(autoload 'git-rebase-current-line "git-rebase" "\
-Parse current line into a `git-rebase-action' instance.
-If the current line isn't recognized as a rebase line, an
-instance with all nil values is returned.
-
-\(fn)" nil nil)
-
-(autoload 'git-rebase-mode "git-rebase" "\
-Major mode for editing of a Git rebase file.
-
-Rebase files are generated when you run 'git rebase -i' or run
-`magit-interactive-rebase'. They describe how Git should perform
-the rebase. See the documentation for git-rebase (e.g., by
-running 'man git-rebase' at the command line) for details.
-
-\(fn)" t nil)
-
-(defconst git-rebase-filename-regexp "/git-rebase-todo\\'")
-
-(add-to-list 'auto-mode-alist (cons git-rebase-filename-regexp 'git-rebase-mode))
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "git-rebase" '("git-rebase-")))
-
-;;;***
-
-;;;### (autoloads nil "magit" "magit.el" (0 0 0 0))
-;;; Generated autoloads from magit.el
- (autoload 'magit-dispatch "magit" nil t)
- (autoload 'magit-run "magit" nil t)
-
-(autoload 'magit-git-command "magit" "\
-Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. \"git \" is
-used as initial input, but can be deleted to run another command.
-
-With a prefix argument COMMAND is run in the top-level directory
-of the current working tree, otherwise in `default-directory'.
-
-\(fn COMMAND)" t nil)
-
-(autoload 'magit-git-command-topdir "magit" "\
-Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. \"git \" is
-used as initial input, but can be deleted to run another command.
-
-COMMAND is run in the top-level directory of the current
-working tree.
-
-\(fn COMMAND)" t nil)
-
-(autoload 'magit-shell-command "magit" "\
-Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. With a
-prefix argument COMMAND is run in the top-level directory of
-the current working tree, otherwise in `default-directory'.
-
-\(fn COMMAND)" t nil)
-
-(autoload 'magit-shell-command-topdir "magit" "\
-Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. COMMAND
-is run in the top-level directory of the current working tree.
-
-\(fn COMMAND)" t nil)
-
-(autoload 'magit-version "magit" "\
-Return the version of Magit currently in use.
-If optional argument PRINT-DEST is non-nil, output
-stream (interactively, the echo area, or the current buffer with
-a prefix argument), also print the used versions of Magit, Git,
-and Emacs to it.
-
-\(fn &optional PRINT-DEST)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-apply" "magit-apply.el" (0 0 0 0))
-;;; Generated autoloads from magit-apply.el
-
-(autoload 'magit-stage-file "magit-apply" "\
-Stage all changes to FILE.
-With a prefix argument or when there is no file at point ask for
-the file to be staged. Otherwise stage the file at point without
-requiring confirmation.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-stage-modified "magit-apply" "\
-Stage all changes to files modified in the worktree.
-Stage all new content of tracked files and remove tracked files
-that no longer exist in the working tree from the index also.
-With a prefix argument also stage previously untracked (but not
-ignored) files.
-
-\(fn &optional ALL)" t nil)
-
-(autoload 'magit-unstage-file "magit-apply" "\
-Unstage all changes to FILE.
-With a prefix argument or when there is no file at point ask for
-the file to be unstaged. Otherwise unstage the file at point
-without requiring confirmation.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-unstage-all "magit-apply" "\
-Remove all changes from the staging area.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-apply" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-autorevert" "magit-autorevert.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from magit-autorevert.el
-
-(defvar magit-auto-revert-mode (not (or global-auto-revert-mode noninteractive)) "\
-Non-nil if Magit-Auto-Revert mode is enabled.
-See the `magit-auto-revert-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `magit-auto-revert-mode'.")
-
-(custom-autoload 'magit-auto-revert-mode "magit-autorevert" nil)
-
-(autoload 'magit-auto-revert-mode "magit-autorevert" "\
-Toggle Auto-Revert mode in all buffers.
-With prefix ARG, enable Magit-Auto-Revert mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Auto-Revert mode is enabled in all buffers where
-`magit-turn-on-auto-revert-mode-if-desired' would do it.
-See `auto-revert-mode' for more information on Auto-Revert mode.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-autorevert" '("auto-revert-buffer" "magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-bisect" "magit-bisect.el" (0 0 0 0))
-;;; Generated autoloads from magit-bisect.el
- (autoload 'magit-bisect "magit-bisect" nil t)
-
-(autoload 'magit-bisect-start "magit-bisect" "\
-Start a bisect session.
-
-Bisecting a bug means to find the commit that introduced it.
-This command starts such a bisect session by asking for a know
-good and a bad commit. To move the session forward use the
-other actions from the bisect transient command (\\<magit-status-mode-map>\\[magit-bisect]).
-
-\(fn BAD GOOD)" t nil)
-
-(autoload 'magit-bisect-reset "magit-bisect" "\
-After bisecting, cleanup bisection state and return to original `HEAD'.
-
-\(fn)" t nil)
-
-(autoload 'magit-bisect-good "magit-bisect" "\
-While bisecting, mark the current commit as good.
-Use this after you have asserted that the commit does not contain
-the bug in question.
-
-\(fn)" t nil)
-
-(autoload 'magit-bisect-bad "magit-bisect" "\
-While bisecting, mark the current commit as bad.
-Use this after you have asserted that the commit does contain the
-bug in question.
-
-\(fn)" t nil)
-
-(autoload 'magit-bisect-skip "magit-bisect" "\
-While bisecting, skip the current commit.
-Use this if for some reason the current commit is not a good one
-to test. This command lets Git choose a different one.
-
-\(fn)" t nil)
-
-(autoload 'magit-bisect-run "magit-bisect" "\
-Bisect automatically by running commands after each step.
-
-Unlike `git bisect run' this can be used before bisecting has
-begun. In that case it behaves like `git bisect start; git
-bisect run'.
-
-\(fn CMDLINE &optional BAD GOOD)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-bisect" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-blame" "magit-blame.el" (0 0 0 0))
-;;; Generated autoloads from magit-blame.el
- (autoload 'magit-blame-echo "magit-blame" nil t)
- (autoload 'magit-blame-addition "magit-blame" nil t)
- (autoload 'magit-blame-removal "magit-blame" nil t)
- (autoload 'magit-blame-reverse "magit-blame" nil t)
- (autoload 'magit-blame "magit-blame" nil t)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-blame" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-bookmark" "magit-bookmark.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from magit-bookmark.el
-
-(autoload 'magit--handle-bookmark "magit-bookmark" "\
-Open a bookmark created by `magit--make-bookmark'.
-Call the `magit-*-setup-buffer' function of the the major-mode
-with the variables' values as arguments, which were recorded by
-`magit--make-bookmark'. Ignore `magit-display-buffer-function'.
-
-\(fn BOOKMARK)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-bookmark" '("magit--make-bookmark")))
-
-;;;***
-
-;;;### (autoloads nil "magit-branch" "magit-branch.el" (0 0 0 0))
-;;; Generated autoloads from magit-branch.el
- (autoload 'magit-branch "magit" nil t)
-
-(autoload 'magit-checkout "magit-branch" "\
-Checkout REVISION, updating the index and the working tree.
-If REVISION is a local branch, then that becomes the current
-branch. If it is something else, then `HEAD' becomes detached.
-Checkout fails if the working tree or the staging area contain
-changes.
-
-\(git checkout REVISION).
-
-\(fn REVISION)" t nil)
-
-(autoload 'magit-branch-create "magit-branch" "\
-Create BRANCH at branch or revision START-POINT.
-
-\(fn BRANCH START-POINT)" t nil)
-
-(autoload 'magit-branch-and-checkout "magit-branch" "\
-Create and checkout BRANCH at branch or revision START-POINT.
-
-\(fn BRANCH START-POINT)" t nil)
-
-(autoload 'magit-branch-or-checkout "magit-branch" "\
-Hybrid between `magit-checkout' and `magit-branch-and-checkout'.
-
-Ask the user for an existing branch or revision. If the user
-input actually can be resolved as a branch or revision, then
-check that out, just like `magit-checkout' would.
-
-Otherwise create and checkout a new branch using the input as
-its name. Before doing so read the starting-point for the new
-branch. This is similar to what `magit-branch-and-checkout'
-does.
-
-\(fn ARG &optional START-POINT)" t nil)
-
-(autoload 'magit-branch-checkout "magit-branch" "\
-Checkout an existing or new local branch.
-
-Read a branch name from the user offering all local branches and
-a subset of remote branches as candidates. Omit remote branches
-for which a local branch by the same name exists from the list
-of candidates. The user can also enter a completely new branch
-name.
-
-- If the user selects an existing local branch, then check that
- out.
-
-- If the user selects a remote branch, then create and checkout
- a new local branch with the same name. Configure the selected
- remote branch as push target.
-
-- If the user enters a new branch name, then create and check
- that out, after also reading the starting-point from the user.
-
-In the latter two cases the upstream is also set. Whether it is
-set to the chosen START-POINT or something else depends on the
-value of `magit-branch-adjust-remote-upstream-alist', just like
-when using `magit-branch-and-checkout'.
-
-\(fn BRANCH &optional START-POINT)" t nil)
-
-(autoload 'magit-branch-orphan "magit-branch" "\
-Create and checkout an orphan BRANCH with contents from revision START-POINT.
-
-\(fn BRANCH START-POINT)" t nil)
-
-(autoload 'magit-branch-spinout "magit-branch" "\
-Create new branch from the unpushed commits.
-Like `magit-branch-spinoff' but remain on the current branch.
-If there are any uncommitted changes, then behave exactly like
-`magit-branch-spinoff'.
-
-\(fn BRANCH &optional FROM)" t nil)
-
-(autoload 'magit-branch-spinoff "magit-branch" "\
-Create new branch from the unpushed commits.
-
-Create and checkout a new branch starting at and tracking the
-current branch. That branch in turn is reset to the last commit
-it shares with its upstream. If the current branch has no
-upstream or no unpushed commits, then the new branch is created
-anyway and the previously current branch is not touched.
-
-This is useful to create a feature branch after work has already
-began on the old branch (likely but not necessarily \"master\").
-
-If the current branch is a member of the value of option
-`magit-branch-prefer-remote-upstream' (which see), then the
-current branch will be used as the starting point as usual, but
-the upstream of the starting-point may be used as the upstream
-of the new branch, instead of the starting-point itself.
-
-If optional FROM is non-nil, then the source branch is reset
-to `FROM~', instead of to the last commit it shares with its
-upstream. Interactively, FROM is only ever non-nil, if the
-region selects some commits, and among those commits, FROM is
-the commit that is the fewest commits ahead of the source
-branch.
-
-The commit at the other end of the selection actually does not
-matter, all commits between FROM and `HEAD' are moved to the new
-branch. If FROM is not reachable from `HEAD' or is reachable
-from the source branch's upstream, then an error is raised.
-
-\(fn BRANCH &optional FROM)" t nil)
-
-(autoload 'magit-branch-reset "magit-branch" "\
-Reset a branch to the tip of another branch or any other commit.
-
-When the branch being reset is the current branch, then do a
-hard reset. If there are any uncommitted changes, then the user
-has to confirm the reset because those changes would be lost.
-
-This is useful when you have started work on a feature branch but
-realize it's all crap and want to start over.
-
-When resetting to another branch and a prefix argument is used,
-then also set the target branch as the upstream of the branch
-that is being reset.
-
-\(fn BRANCH TO &optional SET-UPSTREAM)" t nil)
-
-(autoload 'magit-branch-delete "magit-branch" "\
-Delete one or multiple branches.
-If the region marks multiple branches, then offer to delete
-those, otherwise prompt for a single branch to be deleted,
-defaulting to the branch at point.
-
-\(fn BRANCHES &optional FORCE)" t nil)
-
-(autoload 'magit-branch-rename "magit-branch" "\
-Rename the branch named OLD to NEW.
-
-With a prefix argument FORCE, rename even if a branch named NEW
-already exists.
-
-If `branch.OLD.pushRemote' is set, then unset it. Depending on
-the value of `magit-branch-rename-push-target' (which see) maybe
-set `branch.NEW.pushRemote' and maybe rename the push-target on
-the remote.
-
-\(fn OLD NEW &optional FORCE)" t nil)
-
-(autoload 'magit-branch-shelve "magit-branch" "\
-Shelve a BRANCH.
-Rename \"refs/heads/BRANCH\" to \"refs/shelved/BRANCH\",
-and also rename the respective reflog file.
-
-\(fn BRANCH)" t nil)
-
-(autoload 'magit-branch-unshelve "magit-branch" "\
-Unshelve a BRANCH
-Rename \"refs/shelved/BRANCH\" to \"refs/heads/BRANCH\",
-and also rename the respective reflog file.
-
-\(fn BRANCH)" t nil)
- (autoload 'magit-branch-configure "magit-branch" nil t)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-branch" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-clone" "magit-clone.el" (0 0 0 0))
-;;; Generated autoloads from magit-clone.el
- (autoload 'magit-clone "magit-clone" nil t)
-
-(autoload 'magit-clone-regular "magit-clone" "\
-Create a clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-
-\(fn REPOSITORY DIRECTORY ARGS)" t nil)
-
-(autoload 'magit-clone-shallow "magit-clone" "\
-Create a shallow clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-With a prefix argument read the DEPTH of the clone;
-otherwise use 1.
-
-\(fn REPOSITORY DIRECTORY ARGS DEPTH)" t nil)
-
-(autoload 'magit-clone-shallow-since "magit-clone" "\
-Create a shallow clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-Exclude commits before DATE, which is read from the
-user.
-
-\(fn REPOSITORY DIRECTORY ARGS DATE)" t nil)
-
-(autoload 'magit-clone-shallow-exclude "magit-clone" "\
-Create a shallow clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-Exclude commits reachable from EXCLUDE, which is a
-branch or tag read from the user.
-
-\(fn REPOSITORY DIRECTORY ARGS EXCLUDE)" t nil)
-
-(autoload 'magit-clone-bare "magit-clone" "\
-Create a bare clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-
-\(fn REPOSITORY DIRECTORY ARGS)" t nil)
-
-(autoload 'magit-clone-mirror "magit-clone" "\
-Create a mirror of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-
-\(fn REPOSITORY DIRECTORY ARGS)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-clone" '("magit-clone-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-commit" "magit-commit.el" (0 0 0 0))
-;;; Generated autoloads from magit-commit.el
- (autoload 'magit-commit "magit-commit" nil t)
-
-(autoload 'magit-commit-create "magit-commit" "\
-Create a new commit on `HEAD'.
-With a prefix argument, amend to the commit at `HEAD' instead.
-
-\(git commit [--amend] ARGS)
-
-\(fn &optional ARGS)" t nil)
-
-(autoload 'magit-commit-amend "magit-commit" "\
-Amend the last commit.
-
-\(git commit --amend ARGS)
-
-\(fn &optional ARGS)" t nil)
-
-(autoload 'magit-commit-extend "magit-commit" "\
-Amend the last commit, without editing the message.
-
-With a prefix argument keep the committer date, otherwise change
-it. The option `magit-commit-extend-override-date' can be used
-to inverse the meaning of the prefix argument.
-\(git commit
---amend --no-edit)
-
-\(fn &optional ARGS OVERRIDE-DATE)" t nil)
-
-(autoload 'magit-commit-reword "magit-commit" "\
-Reword the last commit, ignoring staged changes.
-
-With a prefix argument keep the committer date, otherwise change
-it. The option `magit-commit-reword-override-date' can be used
-to inverse the meaning of the prefix argument.
-
-Non-interactively respect the optional OVERRIDE-DATE argument
-and ignore the option.
-
-\(git commit --amend --only)
-
-\(fn &optional ARGS OVERRIDE-DATE)" t nil)
-
-(autoload 'magit-commit-fixup "magit-commit" "\
-Create a fixup commit.
-
-With a prefix argument the target COMMIT has to be confirmed.
-Otherwise the commit at point may be used without confirmation
-depending on the value of option `magit-commit-squash-confirm'.
-
-\(fn &optional COMMIT ARGS)" t nil)
-
-(autoload 'magit-commit-squash "magit-commit" "\
-Create a squash commit, without editing the squash message.
-
-With a prefix argument the target COMMIT has to be confirmed.
-Otherwise the commit at point may be used without confirmation
-depending on the value of option `magit-commit-squash-confirm'.
-
-\(fn &optional COMMIT ARGS)" t nil)
-
-(autoload 'magit-commit-augment "magit-commit" "\
-Create a squash commit, editing the squash message.
-
-With a prefix argument the target COMMIT has to be confirmed.
-Otherwise the commit at point may be used without confirmation
-depending on the value of option `magit-commit-squash-confirm'.
-
-\(fn &optional COMMIT ARGS)" t nil)
-
-(autoload 'magit-commit-instant-fixup "magit-commit" "\
-Create a fixup commit targeting COMMIT and instantly rebase.
-
-\(fn &optional COMMIT ARGS)" t nil)
-
-(autoload 'magit-commit-instant-squash "magit-commit" "\
-Create a squash commit targeting COMMIT and instantly rebase.
-
-\(fn &optional COMMIT ARGS)" t nil)
-
-(autoload 'magit-commit-reshelve "magit-commit" "\
-Change the committer date and possibly the author date of `HEAD'.
-
-If you are the author of `HEAD', then both dates are changed,
-otherwise only the committer date. The current time is used
-as the initial minibuffer input and the original author (if
-that is you) or committer date is available as the previous
-history element.
-
-\(fn DATE)" t nil)
- (autoload 'magit-commit-absorb "magit-commit" nil t)
- (autoload 'magit-commit-autofixup "magit-commit" nil t)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-commit" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-diff" "magit-diff.el" (0 0 0 0))
-;;; Generated autoloads from magit-diff.el
- (autoload 'magit-diff "magit-diff" nil t)
- (autoload 'magit-diff-refresh "magit-diff" nil t)
-
-(autoload 'magit-diff-dwim "magit-diff" "\
-Show changes for the thing at point.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-diff-range "magit-diff" "\
-Show differences between two commits.
-
-REV-OR-RANGE should be a range or a single revision. If it is a
-revision, then show changes in the working tree relative to that
-revision. If it is a range, but one side is omitted, then show
-changes relative to `HEAD'.
-
-If the region is active, use the revisions on the first and last
-line of the region as the two sides of the range. With a prefix
-argument, instead of diffing the revisions, choose a revision to
-view changes along, starting at the common ancestor of both
-revisions (i.e., use a \"...\" range).
-
-\(fn REV-OR-RANGE &optional ARGS FILES)" t nil)
-
-(autoload 'magit-diff-working-tree "magit-diff" "\
-Show changes between the current working tree and the `HEAD' commit.
-With a prefix argument show changes between the working tree and
-a commit read from the minibuffer.
-
-\(fn &optional REV ARGS FILES)" t nil)
-
-(autoload 'magit-diff-staged "magit-diff" "\
-Show changes between the index and the `HEAD' commit.
-With a prefix argument show changes between the index and
-a commit read from the minibuffer.
-
-\(fn &optional REV ARGS FILES)" t nil)
-
-(autoload 'magit-diff-unstaged "magit-diff" "\
-Show changes between the working tree and the index.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-diff-unmerged "magit-diff" "\
-Show changes that are being merged.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-diff-while-committing "magit-diff" "\
-While committing, show the changes that are about to be committed.
-While amending, invoking the command again toggles between
-showing just the new changes or all the changes that will
-be committed.
-
-\(fn &optional ARGS)" t nil)
-
-(autoload 'magit-diff-buffer-file "magit-diff" "\
-Show diff for the blob or file visited in the current buffer.
-
-When the buffer visits a blob, then show the respective commit.
-When the buffer visits a file, then show the differenced between
-`HEAD' and the working tree. In both cases limit the diff to
-the file or blob.
-
-\(fn)" t nil)
-
-(autoload 'magit-diff-paths "magit-diff" "\
-Show changes between any two files on disk.
-
-\(fn A B)" t nil)
-
-(autoload 'magit-show-commit "magit-diff" "\
-Visit the revision at point in another buffer.
-If there is no revision at point or with a prefix argument prompt
-for a revision.
-
-\(fn REV &optional ARGS FILES MODULE)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-diff" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-ediff" "magit-ediff.el" (0 0 0 0))
-;;; Generated autoloads from magit-ediff.el
- (autoload 'magit-ediff "magit-ediff" nil)
-
-(autoload 'magit-ediff-resolve "magit-ediff" "\
-Resolve outstanding conflicts in FILE using Ediff.
-FILE has to be relative to the top directory of the repository.
-
-In the rare event that you want to manually resolve all
-conflicts, including those already resolved by Git, use
-`ediff-merge-revisions-with-ancestor'.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-ediff-stage "magit-ediff" "\
-Stage and unstage changes to FILE using Ediff.
-FILE has to be relative to the top directory of the repository.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-ediff-compare "magit-ediff" "\
-Compare REVA:FILEA with REVB:FILEB using Ediff.
-
-FILEA and FILEB have to be relative to the top directory of the
-repository. If REVA or REVB is nil, then this stands for the
-working tree state.
-
-If the region is active, use the revisions on the first and last
-line of the region. With a prefix argument, instead of diffing
-the revisions, choose a revision to view changes along, starting
-at the common ancestor of both revisions (i.e., use a \"...\"
-range).
-
-\(fn REVA REVB FILEA FILEB)" t nil)
-
-(autoload 'magit-ediff-dwim "magit-ediff" "\
-Compare, stage, or resolve using Ediff.
-This command tries to guess what file, and what commit or range
-the user wants to compare, stage, or resolve using Ediff. It
-might only be able to guess either the file, or range or commit,
-in which case the user is asked about the other. It might not
-always guess right, in which case the appropriate `magit-ediff-*'
-command has to be used explicitly. If it cannot read the user's
-mind at all, then it asks the user for a command to run.
-
-\(fn)" t nil)
-
-(autoload 'magit-ediff-show-staged "magit-ediff" "\
-Show staged changes using Ediff.
-
-This only allows looking at the changes; to stage, unstage,
-and discard changes using Ediff, use `magit-ediff-stage'.
-
-FILE must be relative to the top directory of the repository.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-ediff-show-unstaged "magit-ediff" "\
-Show unstaged changes using Ediff.
-
-This only allows looking at the changes; to stage, unstage,
-and discard changes using Ediff, use `magit-ediff-stage'.
-
-FILE must be relative to the top directory of the repository.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-ediff-show-working-tree "magit-ediff" "\
-Show changes between `HEAD' and working tree using Ediff.
-FILE must be relative to the top directory of the repository.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-ediff-show-commit "magit-ediff" "\
-Show changes introduced by COMMIT using Ediff.
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-ediff-show-stash "magit-ediff" "\
-Show changes introduced by STASH using Ediff.
-`magit-ediff-show-stash-with-index' controls whether a
-three-buffer Ediff is used in order to distinguish changes in the
-stash that were staged.
-
-\(fn STASH)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-ediff" '("magit-ediff-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-extras" "magit-extras.el" (0 0 0 0))
-;;; Generated autoloads from magit-extras.el
-
-(autoload 'magit-run-git-gui "magit-extras" "\
-Run `git gui' for the current git repository.
-
-\(fn)" t nil)
-
-(autoload 'magit-run-git-gui-blame "magit-extras" "\
-Run `git gui blame' on the given FILENAME and COMMIT.
-Interactively run it for the current file and the `HEAD', with a
-prefix or when the current file cannot be determined let the user
-choose. When the current buffer is visiting FILENAME instruct
-blame to center around the line point is on.
-
-\(fn COMMIT FILENAME &optional LINENUM)" t nil)
-
-(autoload 'magit-run-gitk "magit-extras" "\
-Run `gitk' in the current repository.
-
-\(fn)" t nil)
-
-(autoload 'magit-run-gitk-branches "magit-extras" "\
-Run `gitk --branches' in the current repository.
-
-\(fn)" t nil)
-
-(autoload 'magit-run-gitk-all "magit-extras" "\
-Run `gitk --all' in the current repository.
-
-\(fn)" t nil)
-
-(autoload 'ido-enter-magit-status "magit-extras" "\
-Drop into `magit-status' from file switching.
-
-This command does not work in Emacs 26.1.
-See https://github.com/magit/magit/issues/3634
-and https://debbugs.gnu.org/cgi/bugreport.cgi?bug=31707.
-
-To make this command available use something like:
-
- (add-hook \\='ido-setup-hook
- (lambda ()
- (define-key ido-completion-map
- (kbd \"C-x g\") \\='ido-enter-magit-status)))
-
-Starting with Emacs 25.1 the Ido keymaps are defined just once
-instead of every time Ido is invoked, so now you can modify it
-like pretty much every other keymap:
-
- (define-key ido-common-completion-map
- (kbd \"C-x g\") \\='ido-enter-magit-status)
-
-\(fn)" t nil)
-
-(autoload 'magit-project-status "magit-extras" "\
-Run `magit-status' in the current project's root.
-
-\(fn)" t nil)
-
-(autoload 'magit-dired-jump "magit-extras" "\
-Visit file at point using Dired.
-With a prefix argument, visit in another window. If there
-is no file at point, then instead visit `default-directory'.
-
-\(fn &optional OTHER-WINDOW)" t nil)
-
-(autoload 'magit-dired-log "magit-extras" "\
-Show log for all marked files, or the current file.
-
-\(fn &optional FOLLOW)" t nil)
-
-(autoload 'magit-do-async-shell-command "magit-extras" "\
-Open FILE with `dired-do-async-shell-command'.
-Interactively, open the file at point.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-previous-line "magit-extras" "\
-Like `previous-line' but with Magit-specific shift-selection.
-
-Magit's selection mechanism is based on the region but selects an
-area that is larger than the region. This causes `previous-line'
-when invoked while holding the shift key to move up one line and
-thereby select two lines. When invoked inside a hunk body this
-command does not move point on the first invocation and thereby
-it only selects a single line. Which inconsistency you prefer
-is a matter of preference.
-
-\(fn &optional ARG TRY-VSCROLL)" t nil)
-
-(function-put 'magit-previous-line 'interactive-only '"use `forward-line' with negative argument instead.")
-
-(autoload 'magit-next-line "magit-extras" "\
-Like `next-line' but with Magit-specific shift-selection.
-
-Magit's selection mechanism is based on the region but selects
-an area that is larger than the region. This causes `next-line'
-when invoked while holding the shift key to move down one line
-and thereby select two lines. When invoked inside a hunk body
-this command does not move point on the first invocation and
-thereby it only selects a single line. Which inconsistency you
-prefer is a matter of preference.
-
-\(fn &optional ARG TRY-VSCROLL)" t nil)
-
-(function-put 'magit-next-line 'interactive-only 'forward-line)
-
-(autoload 'magit-clean "magit-extras" "\
-Remove untracked files from the working tree.
-With a prefix argument also remove ignored files,
-with two prefix arguments remove ignored files only.
-
-\(git clean -f -d [-x|-X])
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'magit-add-change-log-entry "magit-extras" "\
-Find change log file and add date entry and item for current change.
-This differs from `add-change-log-entry' (which see) in that
-it acts on the current hunk in a Magit buffer instead of on
-a position in a file-visiting buffer.
-
-\(fn &optional WHOAMI FILE-NAME OTHER-WINDOW)" t nil)
-
-(autoload 'magit-add-change-log-entry-other-window "magit-extras" "\
-Find change log file in other window and add entry and item.
-This differs from `add-change-log-entry-other-window' (which see)
-in that it acts on the current hunk in a Magit buffer instead of
-on a position in a file-visiting buffer.
-
-\(fn &optional WHOAMI FILE-NAME)" t nil)
-
-(autoload 'magit-edit-line-commit "magit-extras" "\
-Edit the commit that added the current line.
-
-With a prefix argument edit the commit that removes the line,
-if any. The commit is determined using `git blame' and made
-editable using `git rebase --interactive' if it is reachable
-from `HEAD', or by checking out the commit (or a branch that
-points at it) otherwise.
-
-\(fn &optional TYPE)" t nil)
-
-(autoload 'magit-diff-edit-hunk-commit "magit-extras" "\
-From a hunk, edit the respective commit and visit the file.
-
-First visit the file being modified by the hunk at the correct
-location using `magit-diff-visit-file'. This actually visits a
-blob. When point is on a diff header, not within an individual
-hunk, then this visits the blob the first hunk is about.
-
-Then invoke `magit-edit-line-commit', which uses an interactive
-rebase to make the commit editable, or if that is not possible
-because the commit is not reachable from `HEAD' by checking out
-that commit directly. This also causes the actual worktree file
-to be visited.
-
-Neither the blob nor the file buffer are killed when finishing
-the rebase. If that is undesirable, then it might be better to
-use `magit-rebase-edit-command' instead of this command.
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-reshelve-since "magit-extras" "\
-Change the author and committer dates of the commits since REV.
-
-Ask the user for the first reachable commit whose dates should
-be changed. Then read the new date for that commit. The initial
-minibuffer input and the previous history element offer good
-values. The next commit will be created one minute later and so
-on.
-
-This command is only intended for interactive use and should only
-be used on highly rearranged and unpublished history.
-
-\(fn REV)" t nil)
-
-(autoload 'magit-pop-revision-stack "magit-extras" "\
-Insert a representation of a revision into the current buffer.
-
-Pop a revision from the `magit-revision-stack' and insert it into
-the current buffer according to `magit-pop-revision-stack-format'.
-Revisions can be put on the stack using `magit-copy-section-value'
-and `magit-copy-buffer-revision'.
-
-If the stack is empty or with a prefix argument, instead read a
-revision in the minibuffer. By using the minibuffer history this
-allows selecting an item which was popped earlier or to insert an
-arbitrary reference or revision without first pushing it onto the
-stack.
-
-When reading the revision from the minibuffer, then it might not
-be possible to guess the correct repository. When this command
-is called inside a repository (e.g. while composing a commit
-message), then that repository is used. Otherwise (e.g. while
-composing an email) then the repository recorded for the top
-element of the stack is used (even though we insert another
-revision). If not called inside a repository and with an empty
-stack, or with two prefix arguments, then read the repository in
-the minibuffer too.
-
-\(fn REV TOPLEVEL)" t nil)
-
-(autoload 'magit-copy-section-value "magit-extras" "\
-Save the value of the current section for later use.
-
-Save the section value to the `kill-ring', and, provided that
-the current section is a commit, branch, or tag section, push
-the (referenced) revision to the `magit-revision-stack' for use
-with `magit-pop-revision-stack'.
-
-When `magit-copy-revision-abbreviated' is non-nil, save the
-abbreviated revision to the `kill-ring' and the
-`magit-revision-stack'.
-
-When the current section is a branch or a tag, and a prefix
-argument is used, then save the revision at its tip to the
-`kill-ring' instead of the reference name.
-
-When the region is active, then save that to the `kill-ring',
-like `kill-ring-save' would, instead of behaving as described
-above. If a prefix argument is used and the region is within a
-hunk, strip the outer diff marker column.
-
-\(fn)" t nil)
-
-(autoload 'magit-copy-buffer-revision "magit-extras" "\
-Save the revision of the current buffer for later use.
-
-Save the revision shown in the current buffer to the `kill-ring'
-and push it to the `magit-revision-stack'.
-
-This command is mainly intended for use in `magit-revision-mode'
-buffers, the only buffers where it is always unambiguous exactly
-which revision should be saved.
-
-Most other Magit buffers usually show more than one revision, in
-some way or another, so this command has to select one of them,
-and that choice might not always be the one you think would have
-been the best pick.
-
-In such buffers it is often more useful to save the value of
-the current section instead, using `magit-copy-section-value'.
-
-When the region is active, then save that to the `kill-ring',
-like `kill-ring-save' would, instead of behaving as described
-above.
-
-When `magit-copy-revision-abbreviated' is non-nil, save the
-abbreviated revision to the `kill-ring' and the
-`magit-revision-stack'.
-
-\(fn)" t nil)
-
-(autoload 'magit-abort-dwim "magit-extras" "\
-Abort current operation.
-Depending on the context, this will abort a merge, a rebase, a
-patch application, a cherry-pick, a revert, or a bisect.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-extras" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-fetch" "magit-fetch.el" (0 0 0 0))
-;;; Generated autoloads from magit-fetch.el
- (autoload 'magit-fetch "magit-fetch" nil t)
- (autoload 'magit-fetch-from-pushremote "magit-fetch" nil t)
- (autoload 'magit-fetch-from-upstream "magit-fetch" nil t)
-
-(autoload 'magit-fetch-other "magit-fetch" "\
-Fetch from another repository.
-
-\(fn REMOTE ARGS)" t nil)
-
-(autoload 'magit-fetch-branch "magit-fetch" "\
-Fetch a BRANCH from a REMOTE.
-
-\(fn REMOTE BRANCH ARGS)" t nil)
-
-(autoload 'magit-fetch-refspec "magit-fetch" "\
-Fetch a REFSPEC from a REMOTE.
-
-\(fn REMOTE REFSPEC ARGS)" t nil)
-
-(autoload 'magit-fetch-all "magit-fetch" "\
-Fetch from all remotes.
-
-\(fn ARGS)" t nil)
-
-(autoload 'magit-fetch-all-prune "magit-fetch" "\
-Fetch from all remotes, and prune.
-Prune remote tracking branches for branches that have been
-removed on the respective remote.
-
-\(fn)" t nil)
-
-(autoload 'magit-fetch-all-no-prune "magit-fetch" "\
-Fetch from all remotes.
-
-\(fn)" t nil)
-
-(autoload 'magit-fetch-modules "magit-fetch" "\
-Fetch all submodules.
-
-Option `magit-fetch-modules-jobs' controls how many submodules
-are being fetched in parallel. Also fetch the super-repository,
-because `git-fetch' does not support not doing that. With a
-prefix argument fetch all remotes.
-
-\(fn &optional ALL)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-fetch" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-files" "magit-files.el" (0 0 0 0))
-;;; Generated autoloads from magit-files.el
-
-(autoload 'magit-find-file "magit-files" "\
-View FILE from REV.
-Switch to a buffer visiting blob REV:FILE, creating one if none
-already exists. If prior to calling this command the current
-buffer and/or cursor position is about the same file, then go
-to the line and column corresponding to that location.
-
-\(fn REV FILE)" t nil)
-
-(autoload 'magit-find-file-other-window "magit-files" "\
-View FILE from REV, in another window.
-Switch to a buffer visiting blob REV:FILE, creating one if none
-already exists. If prior to calling this command the current
-buffer and/or cursor position is about the same file, then go to
-the line and column corresponding to that location.
-
-\(fn REV FILE)" t nil)
-
-(autoload 'magit-find-file-other-frame "magit-files" "\
-View FILE from REV, in another frame.
-Switch to a buffer visiting blob REV:FILE, creating one if none
-already exists. If prior to calling this command the current
-buffer and/or cursor position is about the same file, then go to
-the line and column corresponding to that location.
-
-\(fn REV FILE)" t nil)
- (autoload 'magit-file-dispatch "magit" nil t)
-
-(defvar global-magit-file-mode t "\
-Non-nil if Global Magit-File mode is enabled.
-See the `global-magit-file-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `global-magit-file-mode'.")
-
-(custom-autoload 'global-magit-file-mode "magit-files" nil)
-
-(autoload 'global-magit-file-mode "magit-files" "\
-Toggle Magit-File mode in all buffers.
-With prefix ARG, enable Global Magit-File mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Magit-File mode is enabled in all buffers where
-`magit-file-mode-turn-on' would do it.
-See `magit-file-mode' for more information on Magit-File mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'magit-blob-visit-file "magit-files" "\
-View the file from the worktree corresponding to the current blob.
-When visiting a blob or the version from the index, then go to
-the same location in the respective file in the working tree.
-
-\(fn)" t nil)
-
-(autoload 'magit-file-checkout "magit-files" "\
-Checkout FILE from REV.
-
-\(fn REV FILE)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-files" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-git" "magit-git.el" (0 0 0 0))
-;;; Generated autoloads from magit-git.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-git" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-gitignore" "magit-gitignore.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from magit-gitignore.el
- (autoload 'magit-gitignore "magit-gitignore" nil t)
-
-(autoload 'magit-gitignore-in-topdir "magit-gitignore" "\
-Add the Git ignore RULE to the top-level \".gitignore\" file.
-Since this file is tracked, it is shared with other clones of the
-repository. Also stage the file.
-
-\(fn RULE)" t nil)
-
-(autoload 'magit-gitignore-in-subdir "magit-gitignore" "\
-Add the Git ignore RULE to a \".gitignore\" file.
-Prompted the user for a directory and add the rule to the
-\".gitignore\" file in that directory. Since such files are
-tracked, they are shared with other clones of the repository.
-Also stage the file.
-
-\(fn RULE DIRECTORY)" t nil)
-
-(autoload 'magit-gitignore-in-gitdir "magit-gitignore" "\
-Add the Git ignore RULE to \"$GIT_DIR/info/exclude\".
-Rules in that file only affects this clone of the repository.
-
-\(fn RULE)" t nil)
-
-(autoload 'magit-gitignore-on-system "magit-gitignore" "\
-Add the Git ignore RULE to the file specified by `core.excludesFile'.
-Rules that are defined in that file affect all local repositories.
-
-\(fn RULE)" t nil)
-
-(autoload 'magit-skip-worktree "magit-gitignore" "\
-Call \"git update-index --skip-worktree -- FILE\".
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-no-skip-worktree "magit-gitignore" "\
-Call \"git update-index --no-skip-worktree -- FILE\".
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-assume-unchanged "magit-gitignore" "\
-Call \"git update-index --assume-unchanged -- FILE\".
-
-\(fn FILE)" t nil)
-
-(autoload 'magit-no-assume-unchanged "magit-gitignore" "\
-Call \"git update-index --no-assume-unchanged -- FILE\".
-
-\(fn FILE)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-gitignore" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-imenu" "magit-imenu.el" (0 0 0 0))
-;;; Generated autoloads from magit-imenu.el
-
-(autoload 'magit-imenu--log-prev-index-position-function "magit-imenu" "\
-Move point to previous line in current buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--log-extract-index-name-function "magit-imenu" "\
-Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--diff-prev-index-position-function "magit-imenu" "\
-Move point to previous file line in current buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--diff-extract-index-name-function "magit-imenu" "\
-Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--status-create-index-function "magit-imenu" "\
-Return an alist of all imenu entries in current buffer.
-This function is used as a value for
-`imenu-create-index-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--refs-create-index-function "magit-imenu" "\
-Return an alist of all imenu entries in current buffer.
-This function is used as a value for
-`imenu-create-index-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--cherry-create-index-function "magit-imenu" "\
-Return an alist of all imenu entries in current buffer.
-This function is used as a value for
-`imenu-create-index-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--submodule-prev-index-position-function "magit-imenu" "\
-Move point to previous line in magit-submodule-list buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--submodule-extract-index-name-function "magit-imenu" "\
-Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--repolist-prev-index-position-function "magit-imenu" "\
-Move point to previous line in magit-repolist buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--repolist-extract-index-name-function "magit-imenu" "\
-Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--process-prev-index-position-function "magit-imenu" "\
-Move point to previous process in magit-process buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--process-extract-index-name-function "magit-imenu" "\
-Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--rebase-prev-index-position-function "magit-imenu" "\
-Move point to previous commit in git-rebase buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'.
-
-\(fn)" nil nil)
-
-(autoload 'magit-imenu--rebase-extract-index-name-function "magit-imenu" "\
-Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-imenu" '("magit-imenu--index-function")))
-
-;;;***
-
-;;;### (autoloads nil "magit-log" "magit-log.el" (0 0 0 0))
-;;; Generated autoloads from magit-log.el
- (autoload 'magit-log "magit-log" nil t)
- (autoload 'magit-log-refresh "magit-log" nil t)
-
-(autoload 'magit-log-current "magit-log" "\
-Show log for the current branch.
-When `HEAD' is detached or with a prefix argument show log for
-one or more revs read from the minibuffer.
-
-\(fn REVS &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-other "magit-log" "\
-Show log for one or more revs read from the minibuffer.
-The user can input any revision or revisions separated by a
-space, or even ranges, but only branches and tags, and a
-representation of the commit at point, are available as
-completion candidates.
-
-\(fn REVS &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-head "magit-log" "\
-Show log for `HEAD'.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-branches "magit-log" "\
-Show log for all local branches and `HEAD'.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-matching-branches "magit-log" "\
-Show log for all branches matching PATTERN and `HEAD'.
-
-\(fn PATTERN &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-matching-tags "magit-log" "\
-Show log for all tags matching PATTERN and `HEAD'.
-
-\(fn PATTERN &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-all-branches "magit-log" "\
-Show log for all local and remote branches and `HEAD'.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-all "magit-log" "\
-Show log for all references and `HEAD'.
-
-\(fn &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-buffer-file "magit-log" "\
-Show log for the blob or file visited in the current buffer.
-With a prefix argument or when `--follow' is an active log
-argument, then follow renames. When the region is active,
-restrict the log to the lines that the region touches.
-
-\(fn &optional FOLLOW BEG END)" t nil)
-
-(autoload 'magit-log-trace-definition "magit-log" "\
-Show log for the definition at point.
-
-\(fn FILE FN REV)" t nil)
-
-(autoload 'magit-log-merged "magit-log" "\
-Show log for the merge of COMMIT into BRANCH.
-
-More precisely, find merge commit M that brought COMMIT into
-BRANCH, and show the log of the range \"M^1..M\". If COMMIT is
-directly on BRANCH, then show approximately twenty surrounding
-commits instead.
-
-This command requires git-when-merged, which is available from
-https://github.com/mhagger/git-when-merged.
-
-\(fn COMMIT BRANCH &optional ARGS FILES)" t nil)
-
-(autoload 'magit-log-move-to-parent "magit-log" "\
-Move to the Nth parent of the current commit.
-
-\(fn &optional N)" t nil)
-
-(autoload 'magit-cherry "magit-log" "\
-Show commits in a branch that are not merged in the upstream branch.
-
-\(fn HEAD UPSTREAM)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-log" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-margin" "magit-margin.el" (0 0 0 0))
-;;; Generated autoloads from magit-margin.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-margin" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-merge" "magit-merge.el" (0 0 0 0))
-;;; Generated autoloads from magit-merge.el
- (autoload 'magit-merge "magit" nil t)
-
-(autoload 'magit-merge-plain "magit-merge" "\
-Merge commit REV into the current branch; using default message.
-
-Unless there are conflicts or a prefix argument is used create a
-merge commit using a generic commit message and without letting
-the user inspect the result. With a prefix argument pretend the
-merge failed to give the user the opportunity to inspect the
-merge.
-
-\(git merge --no-edit|--no-commit [ARGS] REV)
-
-\(fn REV &optional ARGS NOCOMMIT)" t nil)
-
-(autoload 'magit-merge-editmsg "magit-merge" "\
-Merge commit REV into the current branch; and edit message.
-Perform the merge and prepare a commit message but let the user
-edit it.
-
-\(git merge --edit --no-ff [ARGS] REV)
-
-\(fn REV &optional ARGS)" t nil)
-
-(autoload 'magit-merge-nocommit "magit-merge" "\
-Merge commit REV into the current branch; pretending it failed.
-Pretend the merge failed to give the user the opportunity to
-inspect the merge and change the commit message.
-
-\(git merge --no-commit --no-ff [ARGS] REV)
-
-\(fn REV &optional ARGS)" t nil)
-
-(autoload 'magit-merge-into "magit-merge" "\
-Merge the current branch into BRANCH and remove the former.
-
-Before merging, force push the source branch to its push-remote,
-provided the respective remote branch already exists, ensuring
-that the respective pull-request (if any) won't get stuck on some
-obsolete version of the commits that are being merged. Finally
-if `forge-branch-pullreq' was used to create the merged branch,
-branch, then also remove the respective remote branch.
-
-\(fn BRANCH &optional ARGS)" t nil)
-
-(autoload 'magit-merge-absorb "magit-merge" "\
-Merge BRANCH into the current branch and remove the former.
-
-Before merging, force push the source branch to its push-remote,
-provided the respective remote branch already exists, ensuring
-that the respective pull-request (if any) won't get stuck on some
-obsolete version of the commits that are being merged. Finally
-if `forge-branch-pullreq' was used to create the merged branch,
-then also remove the respective remote branch.
-
-\(fn BRANCH &optional ARGS)" t nil)
-
-(autoload 'magit-merge-squash "magit-merge" "\
-Squash commit REV into the current branch; don't create a commit.
-
-\(git merge --squash REV)
-
-\(fn REV)" t nil)
-
-(autoload 'magit-merge-preview "magit-merge" "\
-Preview result of merging REV into the current branch.
-
-\(fn REV)" t nil)
-
-(autoload 'magit-merge-abort "magit-merge" "\
-Abort the current merge operation.
-
-\(git merge --abort)
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-merge" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-mode" "magit-mode.el" (0 0 0 0))
-;;; Generated autoloads from magit-mode.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-mode" '("magit-" "disable-magit-save-buffers" "inhibit-magit-refresh")))
-
-;;;***
-
-;;;### (autoloads nil "magit-notes" "magit-notes.el" (0 0 0 0))
-;;; Generated autoloads from magit-notes.el
- (autoload 'magit-notes "magit" nil t)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-notes" '("magit-notes-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-obsolete" "magit-obsolete.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from magit-obsolete.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-obsolete" '("magit--magit-popup-warning")))
-
-;;;***
-
-;;;### (autoloads nil "magit-patch" "magit-patch.el" (0 0 0 0))
-;;; Generated autoloads from magit-patch.el
- (autoload 'magit-patch "magit-patch" nil t)
- (autoload 'magit-patch-create "magit-patch" nil t)
- (autoload 'magit-patch-apply "magit-patch" nil t)
-
-(autoload 'magit-patch-save "magit-patch" "\
-Write current diff into patch FILE.
-
-What arguments are used to create the patch depends on the value
-of `magit-patch-save-arguments' and whether a prefix argument is
-used.
-
-If the value is the symbol `buffer', then use the same arguments
-as the buffer. With a prefix argument use no arguments.
-
-If the value is a list beginning with the symbol `exclude', then
-use the same arguments as the buffer except for those matched by
-entries in the cdr of the list. The comparison is done using
-`string-prefix-p'. With a prefix argument use the same arguments
-as the buffer.
-
-If the value is a list of strings (including the empty list),
-then use those arguments. With a prefix argument use the same
-arguments as the buffer.
-
-Of course the arguments that are required to actually show the
-same differences as those shown in the buffer are always used.
-
-\(fn FILE &optional ARG)" t nil)
-
-(autoload 'magit-request-pull "magit-patch" "\
-Request upstream to pull from you public repository.
-
-URL is the url of your publicly accessible repository.
-START is a commit that already is in the upstream repository.
-END is the last commit, usually a branch name, which upstream
-is asked to pull. START has to be reachable from that commit.
-
-\(fn URL START END)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-patch" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-process" "magit-process.el" (0 0 0 0))
-;;; Generated autoloads from magit-process.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-process" '("magit-" "tramp-sh-handle-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-pull" "magit-pull.el" (0 0 0 0))
-;;; Generated autoloads from magit-pull.el
- (autoload 'magit-pull "magit-pull" nil t)
- (autoload 'magit-pull-from-pushremote "magit-pull" nil t)
- (autoload 'magit-pull-from-upstream "magit-pull" nil t)
-
-(autoload 'magit-pull-branch "magit-pull" "\
-Pull from a branch read in the minibuffer.
-
-\(fn SOURCE ARGS)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-pull" '("magit-pull-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-push" "magit-push.el" (0 0 0 0))
-;;; Generated autoloads from magit-push.el
- (autoload 'magit-push "magit-push" nil t)
- (autoload 'magit-push-current-to-pushremote "magit-push" nil t)
- (autoload 'magit-push-current-to-upstream "magit-push" nil t)
-
-(autoload 'magit-push-current "magit-push" "\
-Push the current branch to a branch read in the minibuffer.
-
-\(fn TARGET ARGS)" t nil)
-
-(autoload 'magit-push-other "magit-push" "\
-Push an arbitrary branch or commit somewhere.
-Both the source and the target are read in the minibuffer.
-
-\(fn SOURCE TARGET ARGS)" t nil)
-
-(autoload 'magit-push-refspecs "magit-push" "\
-Push one or multiple REFSPECS to a REMOTE.
-Both the REMOTE and the REFSPECS are read in the minibuffer. To
-use multiple REFSPECS, separate them with commas. Completion is
-only available for the part before the colon, or when no colon
-is used.
-
-\(fn REMOTE REFSPECS ARGS)" t nil)
-
-(autoload 'magit-push-matching "magit-push" "\
-Push all matching branches to another repository.
-If multiple remotes exist, then read one from the user.
-If just one exists, use that without requiring confirmation.
-
-\(fn REMOTE &optional ARGS)" t nil)
-
-(autoload 'magit-push-tags "magit-push" "\
-Push all tags to another repository.
-If only one remote exists, then push to that. Otherwise prompt
-for a remote, offering the remote configured for the current
-branch as default.
-
-\(fn REMOTE &optional ARGS)" t nil)
-
-(autoload 'magit-push-tag "magit-push" "\
-Push a tag to another repository.
-
-\(fn TAG REMOTE &optional ARGS)" t nil)
-
-(autoload 'magit-push-notes-ref "magit-push" "\
-Push a notes ref to another repository.
-
-\(fn REF REMOTE &optional ARGS)" t nil)
-
-(autoload 'magit-push-implicitly "magit-push" "\
-Push somewhere without using an explicit refspec.
-
-This command simply runs \"git push -v [ARGS]\". ARGS are the
-arguments specified in the popup buffer. No explicit refspec
-arguments are used. Instead the behavior depends on at least
-these Git variables: `push.default', `remote.pushDefault',
-`branch.<branch>.pushRemote', `branch.<branch>.remote',
-`branch.<branch>.merge', and `remote.<remote>.push'.
-
-The function `magit-push-implicitly--desc' attempts to predict
-what this command will do. The value it returns is displayed in
-the popup buffer.
-
-\(fn ARGS)" t nil)
-
-(autoload 'magit-push-to-remote "magit-push" "\
-Push to REMOTE without using an explicit refspec.
-The REMOTE is read in the minibuffer.
-
-This command simply runs \"git push -v [ARGS] REMOTE\". ARGS
-are the arguments specified in the popup buffer. No refspec
-arguments are used. Instead the behavior depends on at least
-these Git variables: `push.default', `remote.pushDefault',
-`branch.<branch>.pushRemote', `branch.<branch>.remote',
-`branch.<branch>.merge', and `remote.<remote>.push'.
-
-\(fn REMOTE ARGS)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-push" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-reflog" "magit-reflog.el" (0 0 0 0))
-;;; Generated autoloads from magit-reflog.el
-
-(autoload 'magit-reflog-current "magit-reflog" "\
-Display the reflog of the current branch.
-If `HEAD' is detached, then show the reflog for that instead.
-
-\(fn)" t nil)
-
-(autoload 'magit-reflog-other "magit-reflog" "\
-Display the reflog of a branch or another ref.
-
-\(fn REF)" t nil)
-
-(autoload 'magit-reflog-head "magit-reflog" "\
-Display the `HEAD' reflog.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-reflog" '("magit-reflog-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-refs" "magit-refs.el" (0 0 0 0))
-;;; Generated autoloads from magit-refs.el
- (autoload 'magit-show-refs "magit-refs" nil t)
-
-(autoload 'magit-show-refs-head "magit-refs" "\
-List and compare references in a dedicated buffer.
-Compared with `HEAD'.
-
-\(fn &optional ARGS)" t nil)
-
-(autoload 'magit-show-refs-current "magit-refs" "\
-List and compare references in a dedicated buffer.
-Compare with the current branch or `HEAD' if it is detached.
-
-\(fn &optional ARGS)" t nil)
-
-(autoload 'magit-show-refs-other "magit-refs" "\
-List and compare references in a dedicated buffer.
-Compared with a branch read from the user.
-
-\(fn &optional REF ARGS)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-refs" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-remote" "magit-remote.el" (0 0 0 0))
-;;; Generated autoloads from magit-remote.el
- (autoload 'magit-remote "magit-remote" nil t)
-
-(autoload 'magit-remote-add "magit-remote" "\
-Add a remote named REMOTE and fetch it.
-
-\(fn REMOTE URL &optional ARGS)" t nil)
-
-(autoload 'magit-remote-rename "magit-remote" "\
-Rename the remote named OLD to NEW.
-
-\(fn OLD NEW)" t nil)
-
-(autoload 'magit-remote-remove "magit-remote" "\
-Delete the remote named REMOTE.
-
-\(fn REMOTE)" t nil)
-
-(autoload 'magit-remote-prune "magit-remote" "\
-Remove stale remote-tracking branches for REMOTE.
-
-\(fn REMOTE)" t nil)
-
-(autoload 'magit-remote-prune-refspecs "magit-remote" "\
-Remove stale refspecs for REMOTE.
-
-A refspec is stale if there no longer exists at least one branch
-on the remote that would be fetched due to that refspec. A stale
-refspec is problematic because its existence causes Git to refuse
-to fetch according to the remaining non-stale refspecs.
-
-If only stale refspecs remain, then offer to either delete the
-remote or to replace the stale refspecs with the default refspec.
-
-Also remove the remote-tracking branches that were created due to
-the now stale refspecs. Other stale branches are not removed.
-
-\(fn REMOTE)" t nil)
-
-(autoload 'magit-remote-set-head "magit-remote" "\
-Set the local representation of REMOTE's default branch.
-Query REMOTE and set the symbolic-ref refs/remotes/<remote>/HEAD
-accordingly. With a prefix argument query for the branch to be
-used, which allows you to select an incorrect value if you fancy
-doing that.
-
-\(fn REMOTE &optional BRANCH)" t nil)
-
-(autoload 'magit-remote-unset-head "magit-remote" "\
-Unset the local representation of REMOTE's default branch.
-Delete the symbolic-ref \"refs/remotes/<remote>/HEAD\".
-
-\(fn REMOTE)" t nil)
- (autoload 'magit-remote-configure "magit-remote" nil t)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-remote" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-repos" "magit-repos.el" (0 0 0 0))
-;;; Generated autoloads from magit-repos.el
-
-(autoload 'magit-list-repositories "magit-repos" "\
-Display a list of repositories.
-
-Use the options `magit-repository-directories' to control which
-repositories are displayed.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-repos" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-reset" "magit-reset.el" (0 0 0 0))
-;;; Generated autoloads from magit-reset.el
- (autoload 'magit-reset "magit" nil t)
-
-(autoload 'magit-reset-mixed "magit-reset" "\
-Reset the `HEAD' and index to COMMIT, but not the working tree.
-
-\(git reset --mixed COMMIT)
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-reset-soft "magit-reset" "\
-Reset the `HEAD' to COMMIT, but not the index and working tree.
-
-\(git reset --soft REVISION)
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-reset-hard "magit-reset" "\
-Reset the `HEAD', index, and working tree to COMMIT.
-
-\(git reset --hard REVISION)
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-reset-keep "magit-reset" "\
-Reset the `HEAD' and index to COMMIT, while keeping uncommitted changes.
-
-\(git reset --keep REVISION)
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-reset-index "magit-reset" "\
-Reset the index to COMMIT.
-Keep the `HEAD' and working tree as-is, so if COMMIT refers to the
-head this effectively unstages all changes.
-
-\(git reset COMMIT .)
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-reset-worktree "magit-reset" "\
-Reset the worktree to COMMIT.
-Keep the `HEAD' and index as-is.
-
-\(fn COMMIT)" t nil)
-
-(autoload 'magit-reset-quickly "magit-reset" "\
-Reset the `HEAD' and index to COMMIT, and possibly the working tree.
-With a prefix argument reset the working tree otherwise don't.
-
-\(git reset --mixed|--hard COMMIT)
-
-\(fn COMMIT &optional HARD)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-reset" '("magit-reset-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-section" "magit-section.el" (0 0 0 0))
-;;; Generated autoloads from magit-section.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-section" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-sequence" "magit-sequence.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from magit-sequence.el
-
-(autoload 'magit-sequencer-continue "magit-sequence" "\
-Resume the current cherry-pick or revert sequence.
-
-\(fn)" t nil)
-
-(autoload 'magit-sequencer-skip "magit-sequence" "\
-Skip the stopped at commit during a cherry-pick or revert sequence.
-
-\(fn)" t nil)
-
-(autoload 'magit-sequencer-abort "magit-sequence" "\
-Abort the current cherry-pick or revert sequence.
-This discards all changes made since the sequence started.
-
-\(fn)" t nil)
- (autoload 'magit-cherry-pick "magit-sequence" nil t)
-
-(autoload 'magit-cherry-copy "magit-sequence" "\
-Copy COMMITS from another branch onto the current branch.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then pick all of them,
-without prompting.
-
-\(fn COMMITS &optional ARGS)" t nil)
-
-(autoload 'magit-cherry-apply "magit-sequence" "\
-Apply the changes in COMMITS but do not commit them.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then apply all of them,
-without prompting.
-
-\(fn COMMITS &optional ARGS)" t nil)
-
-(autoload 'magit-cherry-harvest "magit-sequence" "\
-Move COMMITS from another BRANCH onto the current branch.
-Remove the COMMITS from BRANCH and stay on the current branch.
-If a conflict occurs, then you have to fix that and finish the
-process manually.
-
-\(fn COMMITS BRANCH &optional ARGS)" t nil)
-
-(autoload 'magit-cherry-donate "magit-sequence" "\
-Move COMMITS from the current branch onto another existing BRANCH.
-Remove COMMITS from the current branch and stay on that branch.
-If a conflict occurs, then you have to fix that and finish the
-process manually.
-
-\(fn COMMITS BRANCH &optional ARGS)" t nil)
-
-(autoload 'magit-cherry-spinout "magit-sequence" "\
-Move COMMITS from the current branch onto a new BRANCH.
-Remove COMMITS from the current branch and stay on that branch.
-If a conflict occurs, then you have to fix that and finish the
-process manually.
-
-\(fn COMMITS BRANCH START-POINT &optional ARGS)" t nil)
-
-(autoload 'magit-cherry-spinoff "magit-sequence" "\
-Move COMMITS from the current branch onto a new BRANCH.
-Remove COMMITS from the current branch and checkout BRANCH.
-If a conflict occurs, then you have to fix that and finish
-the process manually.
-
-\(fn COMMITS BRANCH START-POINT &optional ARGS)" t nil)
- (autoload 'magit-revert "magit-sequence" nil t)
-
-(autoload 'magit-revert-and-commit "magit-sequence" "\
-Revert COMMIT by creating a new commit.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then revert all of them,
-without prompting.
-
-\(fn COMMIT &optional ARGS)" t nil)
-
-(autoload 'magit-revert-no-commit "magit-sequence" "\
-Revert COMMIT by applying it in reverse to the worktree.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then revert all of them,
-without prompting.
-
-\(fn COMMIT &optional ARGS)" t nil)
- (autoload 'magit-am "magit-sequence" nil t)
-
-(autoload 'magit-am-apply-patches "magit-sequence" "\
-Apply the patches FILES.
-
-\(fn &optional FILES ARGS)" t nil)
-
-(autoload 'magit-am-apply-maildir "magit-sequence" "\
-Apply the patches from MAILDIR.
-
-\(fn &optional MAILDIR ARGS)" t nil)
-
-(autoload 'magit-am-continue "magit-sequence" "\
-Resume the current patch applying sequence.
-
-\(fn)" t nil)
-
-(autoload 'magit-am-skip "magit-sequence" "\
-Skip the stopped at patch during a patch applying sequence.
-
-\(fn)" t nil)
-
-(autoload 'magit-am-abort "magit-sequence" "\
-Abort the current patch applying sequence.
-This discards all changes made since the sequence started.
-
-\(fn)" t nil)
- (autoload 'magit-rebase "magit-sequence" nil t)
- (autoload 'magit-rebase-onto-pushremote "magit-sequence" nil t)
- (autoload 'magit-rebase-onto-upstream "magit-sequence" nil t)
-
-(autoload 'magit-rebase-branch "magit-sequence" "\
-Rebase the current branch onto a branch read in the minibuffer.
-All commits that are reachable from `HEAD' but not from the
-selected branch TARGET are being rebased.
-
-\(fn TARGET ARGS)" t nil)
-
-(autoload 'magit-rebase-subset "magit-sequence" "\
-Rebase a subset of the current branch's history onto a new base.
-Rebase commits from START to `HEAD' onto NEWBASE.
-START has to be selected from a list of recent commits.
-
-\(fn NEWBASE START ARGS)" t nil)
-
-(autoload 'magit-rebase-interactive "magit-sequence" "\
-Start an interactive rebase sequence.
-
-\(fn COMMIT ARGS)" t nil)
-
-(autoload 'magit-rebase-autosquash "magit-sequence" "\
-Combine squash and fixup commits with their intended targets.
-
-\(fn ARGS)" t nil)
-
-(autoload 'magit-rebase-edit-commit "magit-sequence" "\
-Edit a single older commit using rebase.
-
-\(fn COMMIT ARGS)" t nil)
-
-(autoload 'magit-rebase-reword-commit "magit-sequence" "\
-Reword a single older commit using rebase.
-
-\(fn COMMIT ARGS)" t nil)
-
-(autoload 'magit-rebase-remove-commit "magit-sequence" "\
-Remove a single older commit using rebase.
-
-\(fn COMMIT ARGS)" t nil)
-
-(autoload 'magit-rebase-continue "magit-sequence" "\
-Restart the current rebasing operation.
-In some cases this pops up a commit message buffer for you do
-edit. With a prefix argument the old message is reused as-is.
-
-\(fn &optional NOEDIT)" t nil)
-
-(autoload 'magit-rebase-skip "magit-sequence" "\
-Skip the current commit and restart the current rebase operation.
-
-\(fn)" t nil)
-
-(autoload 'magit-rebase-edit "magit-sequence" "\
-Edit the todo list of the current rebase operation.
-
-\(fn)" t nil)
-
-(autoload 'magit-rebase-abort "magit-sequence" "\
-Abort the current rebase operation, restoring the original branch.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-sequence" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-stash" "magit-stash.el" (0 0 0 0))
-;;; Generated autoloads from magit-stash.el
- (autoload 'magit-stash "magit-stash" nil t)
-
-(autoload 'magit-stash-both "magit-stash" "\
-Create a stash of the index and working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'.
-
-\(fn MESSAGE &optional INCLUDE-UNTRACKED)" t nil)
-
-(autoload 'magit-stash-index "magit-stash" "\
-Create a stash of the index only.
-Unstaged and untracked changes are not stashed. The stashed
-changes are applied in reverse to both the index and the
-worktree. This command can fail when the worktree is not clean.
-Applying the resulting stash has the inverse effect.
-
-\(fn MESSAGE)" t nil)
-
-(autoload 'magit-stash-worktree "magit-stash" "\
-Create a stash of unstaged changes in the working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'.
-
-\(fn MESSAGE &optional INCLUDE-UNTRACKED)" t nil)
-
-(autoload 'magit-stash-keep-index "magit-stash" "\
-Create a stash of the index and working tree, keeping index intact.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'.
-
-\(fn MESSAGE &optional INCLUDE-UNTRACKED)" t nil)
-
-(autoload 'magit-snapshot-both "magit-stash" "\
-Create a snapshot of the index and working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'.
-
-\(fn &optional INCLUDE-UNTRACKED)" t nil)
-
-(autoload 'magit-snapshot-index "magit-stash" "\
-Create a snapshot of the index only.
-Unstaged and untracked changes are not stashed.
-
-\(fn)" t nil)
-
-(autoload 'magit-snapshot-worktree "magit-stash" "\
-Create a snapshot of unstaged changes in the working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'.
-
-\(fn &optional INCLUDE-UNTRACKED)" t nil)
-
-(autoload 'magit-stash-apply "magit-stash" "\
-Apply a stash to the working tree.
-Try to preserve the stash index. If that fails because there
-are staged changes, apply without preserving the stash index.
-
-\(fn STASH)" t nil)
-
-(autoload 'magit-stash-drop "magit-stash" "\
-Remove a stash from the stash list.
-When the region is active offer to drop all contained stashes.
-
-\(fn STASH)" t nil)
-
-(autoload 'magit-stash-clear "magit-stash" "\
-Remove all stashes saved in REF's reflog by deleting REF.
-
-\(fn REF)" t nil)
-
-(autoload 'magit-stash-branch "magit-stash" "\
-Create and checkout a new BRANCH from STASH.
-
-\(fn STASH BRANCH)" t nil)
-
-(autoload 'magit-stash-branch-here "magit-stash" "\
-Create and checkout a new BRANCH and apply STASH.
-The branch is created using `magit-branch-and-checkout', using the
-current branch or `HEAD' as the start-point.
-
-\(fn STASH BRANCH)" t nil)
-
-(autoload 'magit-stash-format-patch "magit-stash" "\
-Create a patch from STASH
-
-\(fn STASH)" t nil)
-
-(autoload 'magit-stash-list "magit-stash" "\
-List all stashes in a buffer.
-
-\(fn)" t nil)
-
-(autoload 'magit-stash-show "magit-stash" "\
-Show all diffs of a stash in a buffer.
-
-\(fn STASH &optional ARGS FILES)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-stash" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-status" "magit-status.el" (0 0 0 0))
-;;; Generated autoloads from magit-status.el
-
-(autoload 'magit-init "magit-status" "\
-Initialize a Git repository, then show its status.
-
-If the directory is below an existing repository, then the user
-has to confirm that a new one should be created inside. If the
-directory is the root of the existing repository, then the user
-has to confirm that it should be reinitialized.
-
-Non-interactively DIRECTORY is (re-)initialized unconditionally.
-
-\(fn DIRECTORY)" t nil)
-
-(autoload 'magit-status "magit-status" "\
-Show the status of the current Git repository in a buffer.
-
-If the current directory isn't located within a Git repository,
-then prompt for an existing repository or an arbitrary directory,
-depending on option `magit-repository-directories', and show the
-status of the selected repository instead.
-
-* If that option specifies any existing repositories, then offer
- those for completion and show the status buffer for the
- selected one.
-
-* Otherwise read an arbitrary directory using regular file-name
- completion. If the selected directory is the top-level of an
- existing working tree, then show the status buffer for that.
-
-* Otherwise offer to initialize the selected directory as a new
- repository. After creating the repository show its status
- buffer.
-
-These fallback behaviors can also be forced using one or more
-prefix arguments:
-
-* With two prefix arguments (or more precisely a numeric prefix
- value of 16 or greater) read an arbitrary directory and act on
- it as described above. The same could be accomplished using
- the command `magit-init'.
-
-* With a single prefix argument read an existing repository, or
- if none can be found based on `magit-repository-directories',
- then fall back to the same behavior as with two prefix
- arguments.
-
-\(fn &optional DIRECTORY CACHE)" t nil)
-
-(defalias 'magit 'magit-status "\
-An alias for `magit-status' for better discoverability.
-
-Instead of invoking this alias for `magit-status' using
-\"M-x magit RET\", you should bind a key to `magit-status'
-and read the info node `(magit)Getting Started', which
-also contains other useful hints.")
-
-(autoload 'magit-status-here "magit-status" "\
-Like `magit-status' but with non-nil `magit-status-goto-file-position'.
-
-\(fn)" t nil)
-
-(autoload 'magit-status-setup-buffer "magit-status" "\
-
-
-\(fn &optional DIRECTORY)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-status" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-submodule" "magit-submodule.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from magit-submodule.el
- (autoload 'magit-submodule "magit-submodule" nil t)
- (autoload 'magit-submodule-add "magit-submodule" nil t)
-
-(autoload 'magit-submodule-read-name-for-path "magit-submodule" "\
-
-
-\(fn PATH &optional PREFER-SHORT)" nil nil)
- (autoload 'magit-submodule-register "magit-submodule" nil t)
- (autoload 'magit-submodule-populate "magit-submodule" nil t)
- (autoload 'magit-submodule-update "magit-submodule" nil t)
- (autoload 'magit-submodule-synchronize "magit-submodule" nil t)
- (autoload 'magit-submodule-unpopulate "magit-submodule" nil t)
-
-(autoload 'magit-submodule-remove "magit-submodule" "\
-Unregister MODULES and remove their working directories.
-
-For safety reasons, do not remove the gitdirs and if a module has
-uncommitted changes, then do not remove it at all. If a module's
-gitdir is located inside the working directory, then move it into
-the gitdir of the superproject first.
-
-With the \"--force\" argument offer to remove dirty working
-directories and with a prefix argument offer to delete gitdirs.
-Both actions are very dangerous and have to be confirmed. There
-are additional safety precautions in place, so you might be able
-to recover from making a mistake here, but don't count on it.
-
-\(fn MODULES ARGS TRASH-GITDIRS)" t nil)
-
-(autoload 'magit-insert-modules "magit-submodule" "\
-Insert submodule sections.
-Hook `magit-module-sections-hook' controls which module sections
-are inserted, and option `magit-module-sections-nested' controls
-whether they are wrapped in an additional section.
-
-\(fn)" nil nil)
-
-(autoload 'magit-insert-modules-overview "magit-submodule" "\
-Insert sections for all modules.
-For each section insert the path and the output of `git describe --tags',
-or, failing that, the abbreviated HEAD commit hash.
-
-\(fn)" nil nil)
-
-(autoload 'magit-insert-modules-unpulled-from-upstream "magit-submodule" "\
-Insert sections for modules that haven't been pulled from the upstream.
-These sections can be expanded to show the respective commits.
-
-\(fn)" nil nil)
-
-(autoload 'magit-insert-modules-unpulled-from-pushremote "magit-submodule" "\
-Insert sections for modules that haven't been pulled from the push-remote.
-These sections can be expanded to show the respective commits.
-
-\(fn)" nil nil)
-
-(autoload 'magit-insert-modules-unpushed-to-upstream "magit-submodule" "\
-Insert sections for modules that haven't been pushed to the upstream.
-These sections can be expanded to show the respective commits.
-
-\(fn)" nil nil)
-
-(autoload 'magit-insert-modules-unpushed-to-pushremote "magit-submodule" "\
-Insert sections for modules that haven't been pushed to the push-remote.
-These sections can be expanded to show the respective commits.
-
-\(fn)" nil nil)
-
-(autoload 'magit-list-submodules "magit-submodule" "\
-Display a list of the current repository's submodules.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-submodule" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-subtree" "magit-subtree.el" (0 0 0 0))
-;;; Generated autoloads from magit-subtree.el
- (autoload 'magit-subtree "magit-subtree" nil t)
- (autoload 'magit-subtree-import "magit-subtree" nil t)
- (autoload 'magit-subtree-export "magit-subtree" nil t)
-
-(autoload 'magit-subtree-add "magit-subtree" "\
-Add REF from REPOSITORY as a new subtree at PREFIX.
-
-\(fn PREFIX REPOSITORY REF ARGS)" t nil)
-
-(autoload 'magit-subtree-add-commit "magit-subtree" "\
-Add COMMIT as a new subtree at PREFIX.
-
-\(fn PREFIX COMMIT ARGS)" t nil)
-
-(autoload 'magit-subtree-merge "magit-subtree" "\
-Merge COMMIT into the PREFIX subtree.
-
-\(fn PREFIX COMMIT ARGS)" t nil)
-
-(autoload 'magit-subtree-pull "magit-subtree" "\
-Pull REF from REPOSITORY into the PREFIX subtree.
-
-\(fn PREFIX REPOSITORY REF ARGS)" t nil)
-
-(autoload 'magit-subtree-push "magit-subtree" "\
-Extract the history of the subtree PREFIX and push it to REF on REPOSITORY.
-
-\(fn PREFIX REPOSITORY REF ARGS)" t nil)
-
-(autoload 'magit-subtree-split "magit-subtree" "\
-Extract the history of the subtree PREFIX.
-
-\(fn PREFIX COMMIT ARGS)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-subtree" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-tag" "magit-tag.el" (0 0 0 0))
-;;; Generated autoloads from magit-tag.el
- (autoload 'magit-tag "magit" nil t)
-
-(autoload 'magit-tag-create "magit-tag" "\
-Create a new tag with the given NAME at REV.
-With a prefix argument annotate the tag.
-
-\(git tag [--annotate] NAME REV)
-
-\(fn NAME REV &optional ARGS)" t nil)
-
-(autoload 'magit-tag-delete "magit-tag" "\
-Delete one or more tags.
-If the region marks multiple tags (and nothing else), then offer
-to delete those, otherwise prompt for a single tag to be deleted,
-defaulting to the tag at point.
-
-\(git tag -d TAGS)
-
-\(fn TAGS)" t nil)
-
-(autoload 'magit-tag-prune "magit-tag" "\
-Offer to delete tags missing locally from REMOTE, and vice versa.
-
-\(fn TAGS REMOTE-TAGS REMOTE)" t nil)
-
-(autoload 'magit-tag-release "magit-tag" "\
-Create a release tag.
-
-Assume that release tags match `magit-release-tag-regexp'.
-
-First prompt for the name of the new tag using the highest
-existing tag as initial input and leaving it to the user to
-increment the desired part of the version string.
-
-If `--annotate' is enabled, then prompt for the message of the
-new tag. Base the proposed tag message on the message of the
-highest tag, provided that that contains the corresponding
-version string and substituting the new version string for that.
-Otherwise propose something like \"Foo-Bar 1.2.3\", given, for
-example, a TAG \"v1.2.3\" and a repository located at something
-like \"/path/to/foo-bar\".
-
-\(fn TAG MSG &optional ARGS)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-tag" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-transient" "magit-transient.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from magit-transient.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-transient" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-utils" "magit-utils.el" (0 0 0 0))
-;;; Generated autoloads from magit-utils.el
-
-(autoload 'magit-emacs-Q-command "magit-utils" "\
-Show a shell command that runs an uncustomized Emacs with only Magit loaded.
-See info node `(magit)Debugging Tools' for more information.
-
-\(fn)" t nil)
-
-(autoload 'Info-follow-nearest-node--magit-gitman "magit-utils" "\
-
-
-\(fn FN &optional FORK)" nil nil)
-
-(advice-add 'Info-follow-nearest-node :around 'Info-follow-nearest-node--magit-gitman)
-
-(autoload 'org-man-export--magit-gitman "magit-utils" "\
-
-
-\(fn FN LINK DESCRIPTION FORMAT)" nil nil)
-
-(advice-add 'org-man-export :around 'org-man-export--magit-gitman)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-utils" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-wip" "magit-wip.el" (0 0 0 0))
-;;; Generated autoloads from magit-wip.el
-
-(defvar magit-wip-after-save-mode nil "\
-Non-nil if Magit-Wip-After-Save mode is enabled.
-See the `magit-wip-after-save-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `magit-wip-after-save-mode'.")
-
-(custom-autoload 'magit-wip-after-save-mode "magit-wip" nil)
-
-(autoload 'magit-wip-after-save-mode "magit-wip" "\
-Toggle Magit-Wip-After-Save-Local mode in all buffers.
-With prefix ARG, enable Magit-Wip-After-Save mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Magit-Wip-After-Save-Local mode is enabled in all buffers where
-`magit-wip-after-save-local-mode-turn-on' would do it.
-See `magit-wip-after-save-local-mode' for more information on Magit-Wip-After-Save-Local mode.
-
-\(fn &optional ARG)" t nil)
-
-(defvar magit-wip-after-apply-mode nil "\
-Non-nil if Magit-Wip-After-Apply mode is enabled.
-See the `magit-wip-after-apply-mode' command
-for a description of this minor mode.")
-
-(custom-autoload 'magit-wip-after-apply-mode "magit-wip" nil)
-
-(autoload 'magit-wip-after-apply-mode "magit-wip" "\
-Commit to work-in-progress refs.
-
-After applying a change using any \"apply variant\"
-command (apply, stage, unstage, discard, and reverse) commit the
-affected files to the current wip refs. For each branch there
-may be two wip refs; one contains snapshots of the files as found
-in the worktree and the other contains snapshots of the entries
-in the index.
-
-\(fn &optional ARG)" t nil)
-
-(defvar magit-wip-before-change-mode nil "\
-Non-nil if Magit-Wip-Before-Change mode is enabled.
-See the `magit-wip-before-change-mode' command
-for a description of this minor mode.")
-
-(custom-autoload 'magit-wip-before-change-mode "magit-wip" nil)
-
-(autoload 'magit-wip-before-change-mode "magit-wip" "\
-Commit to work-in-progress refs before certain destructive changes.
-
-Before invoking a revert command or an \"apply variant\"
-command (apply, stage, unstage, discard, and reverse) commit the
-affected tracked files to the current wip refs. For each branch
-there may be two wip refs; one contains snapshots of the files
-as found in the worktree and the other contains snapshots of the
-entries in the index.
-
-Only changes to files which could potentially be affected by the
-command which is about to be called are committed.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'magit-wip-commit-initial-backup "magit-wip" "\
-Before saving, commit current file to a worktree wip ref.
-
-The user has to add this function to `before-save-hook'.
-
-Commit the current state of the visited file before saving the
-current buffer to that file. This backs up the same version of
-the file as `backup-buffer' would, but stores the backup in the
-worktree wip ref, which is also used by the various Magit Wip
-modes, instead of in a backup file as `backup-buffer' would.
-
-This function ignores the variables that affect `backup-buffer'
-and can be used along-side that function, which is recommended
-because this function only backs up files that are tracked in
-a Git repository.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-wip" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil "magit-worktree" "magit-worktree.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from magit-worktree.el
- (autoload 'magit-worktree "magit-worktree" nil t)
-
-(autoload 'magit-worktree-checkout "magit-worktree" "\
-Checkout BRANCH in a new worktree at PATH.
-
-\(fn PATH BRANCH)" t nil)
-
-(autoload 'magit-worktree-branch "magit-worktree" "\
-Create a new BRANCH and check it out in a new worktree at PATH.
-
-\(fn PATH BRANCH START-POINT &optional FORCE)" t nil)
-
-(autoload 'magit-worktree-move "magit-worktree" "\
-Move WORKTREE to PATH.
-
-\(fn WORKTREE PATH)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-worktree" '("magit-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("magit-core.el" "magit-pkg.el") (0 0 0
-;;;;;; 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; magit-autoloads.el ends here
diff --git a/elpa/magit-20200728.45/magit-autorevert.el b/elpa/magit-20200728.45/magit-autorevert.el
deleted file mode 100644
index 74c0721..0000000
--- a/elpa/magit-20200728.45/magit-autorevert.el
+++ /dev/null
@@ -1,269 +0,0 @@
-;;; magit-autorevert.el --- revert buffers when files in repository change -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-
-(require 'magit-git)
-
-(require 'autorevert)
-
-;;; Options
-
-(defgroup magit-auto-revert nil
- "Revert buffers when files in repository change."
- :link '(custom-group-link auto-revert)
- :link '(info-link "(magit)Automatic Reverting of File-Visiting Buffers")
- :group 'auto-revert
- :group 'magit-essentials
- :group 'magit-modes)
-
-(defcustom auto-revert-buffer-list-filter nil
- "Filter that determines which buffers `auto-revert-buffers' reverts.
-
-This option is provided by Magit, which also advises
-`auto-revert-buffers' to respect it. Magit users who do not turn
-on the local mode `auto-revert-mode' themselves, are best served
-by setting the value to `magit-auto-revert-repository-buffer-p'.
-
-However the default is nil, so as not to disturb users who do use
-the local mode directly. If you experience delays when running
-Magit commands, then you should consider using one of the
-predicates provided by Magit - especially if you also use Tramp.
-
-Users who do turn on `auto-revert-mode' in buffers in which Magit
-doesn't do that for them, should likely not use any filter.
-Users who turn on `global-auto-revert-mode', do not have to worry
-about this option, because it is disregarded if the global mode
-is enabled."
- :package-version '(magit . "2.4.2")
- :group 'auto-revert
- :group 'magit-auto-revert
- :group 'magit-related
- :type '(radio (const :tag "No filter" nil)
- (function-item magit-auto-revert-buffer-p)
- (function-item magit-auto-revert-repository-buffer-p)
- function))
-
-(defcustom magit-auto-revert-tracked-only t
- "Whether `magit-auto-revert-mode' only reverts tracked files."
- :package-version '(magit . "2.4.0")
- :group 'magit-auto-revert
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (when (and (bound-and-true-p magit-auto-revert-mode)
- (featurep 'magit-autorevert))
- (magit-auto-revert-mode -1)
- (magit-auto-revert-mode))))
-
-(defcustom magit-auto-revert-immediately t
- "Whether Magit reverts buffers immediately.
-
-If this is non-nil and either `global-auto-revert-mode' or
-`magit-auto-revert-mode' is enabled, then Magit immediately
-reverts buffers by explicitly calling `auto-revert-buffers'
-after running Git for side-effects.
-
-If `auto-revert-use-notify' is non-nil (and file notifications
-are actually supported), then `magit-auto-revert-immediately'
-does not have to be non-nil, because the reverts happen
-immediately anyway.
-
-If `magit-auto-revert-immediately' and `auto-revert-use-notify'
-are both nil, then reverts happen after `auto-revert-interval'
-seconds of user inactivity. That is not desirable."
- :package-version '(magit . "2.4.0")
- :group 'magit-auto-revert
- :type 'boolean)
-
-;;; Mode
-
-(defun magit-turn-on-auto-revert-mode-if-desired (&optional file)
- (if file
- (--when-let (find-buffer-visiting file)
- (with-current-buffer it
- (magit-turn-on-auto-revert-mode-if-desired)))
- (when (and buffer-file-name
- (file-readable-p buffer-file-name)
- (or (< emacs-major-version 27)
- (with-no-warnings
- (condition-case nil
- (executable-find magit-git-executable t) ; see #3684
- (wrong-number-of-arguments t)))) ; very old 27 built
- (magit-toplevel)
- (or (not magit-auto-revert-tracked-only)
- (magit-file-tracked-p buffer-file-name))
- (not auto-revert-mode) ; see #3014
- (not global-auto-revert-mode)) ; see #3460
- (auto-revert-mode 1))))
-
-;;;###autoload
-(define-globalized-minor-mode magit-auto-revert-mode auto-revert-mode
- magit-turn-on-auto-revert-mode-if-desired
- :package-version '(magit . "2.4.0")
- :link '(info-link "(magit)Automatic Reverting of File-Visiting Buffers")
- :group 'magit-auto-revert
- :group 'magit-essentials
- ;; - When `global-auto-revert-mode' is enabled, then this mode is
- ;; redundant.
- ;; - In all other cases enable the mode because if buffers are not
- ;; automatically reverted that would make many very common tasks
- ;; much more cumbersome.
- :init-value (not (or global-auto-revert-mode
- noninteractive)))
-;; - Unfortunately `:init-value t' only sets the value of the mode
-;; variable but does not cause the mode function to be called.
-;; - I don't think it works like this on purpose, but since one usually
-;; should not enable global modes by default, it is understandable.
-;; - If the user has set the variable `magit-auto-revert-mode' to nil
-;; after loading magit (instead of doing so before loading magit or
-;; by using the function), then we should still respect that setting.
-;; - If the user sets one of these variables after loading magit and
-;; after `after-init-hook' has run, then that won't have an effect
-;; and there is nothing we can do about it.
-(defun magit-auto-revert-mode--init-kludge ()
- "This is an internal kludge to be used on `after-init-hook'.
-Do not use this function elsewhere, and don't remove it from
-the `after-init-hook'. For more information see the comments
-and code surrounding the definition of this function."
- (if magit-auto-revert-mode
- (let ((start (current-time)))
- (magit-message "Turning on magit-auto-revert-mode...")
- (magit-auto-revert-mode 1)
- (magit-message
- "Turning on magit-auto-revert-mode...done%s"
- (let ((elapsed (float-time (time-subtract nil start))))
- (if (> elapsed 0.2)
- (format " (%.3fs, %s buffers checked)" elapsed
- (length (buffer-list)))
- ""))))
- (magit-auto-revert-mode -1)))
-(if after-init-time
- ;; Since `after-init-hook' has already been
- ;; run, turn the mode on or off right now.
- (magit-auto-revert-mode--init-kludge)
- ;; By the time the init file has been fully loaded the
- ;; values of the relevant variables might have changed.
- (add-hook 'after-init-hook #'magit-auto-revert-mode--init-kludge t))
-
-(put 'magit-auto-revert-mode 'function-documentation
- "Toggle Magit Auto Revert mode.
-If called interactively, enable Magit Auto Revert mode if ARG is
-positive, and disable it if ARG is zero or negative. If called
-from Lisp, also enable the mode if ARG is omitted or nil, and
-toggle it if ARG is `toggle'; disable the mode otherwise.
-
-Magit Auto Revert mode is a global minor mode that reverts
-buffers associated with a file that is located inside a Git
-repository when the file changes on disk. Use `auto-revert-mode'
-to revert a particular buffer. Or use `global-auto-revert-mode'
-to revert all file-visiting buffers, not just those that visit
-a file located inside a Git repository.
-
-This global mode works by turning on the buffer-local mode
-`auto-revert-mode' at the time a buffer is first created. The
-local mode is turned on if the visited file is being tracked in
-a Git repository at the time when the buffer is created.
-
-If `magit-auto-revert-tracked-only' is non-nil (the default),
-then only tracked files are reverted. But if you stage a
-previously untracked file using `magit-stage', then this mode
-notices that.
-
-Unlike `global-auto-revert-mode', this mode never reverts any
-buffers that are not visiting files.
-
-The behavior of this mode can be customized using the options
-in the `autorevert' and `magit-autorevert' groups.
-
-This function calls the hook `magit-auto-revert-mode-hook'.
-
-Like nearly every mode, this mode should be enabled or disabled
-by calling the respective mode function, the reason being that
-changing the state of a mode involves more than merely toggling
-a single switch, so setting the mode variable is not enough.
-Also, you should not use `after-init-hook' to disable this mode.")
-
-(defun magit-auto-revert-buffers ()
- (when (and magit-auto-revert-immediately
- (or global-auto-revert-mode
- (and magit-auto-revert-mode auto-revert-buffer-list)))
- (let ((auto-revert-buffer-list-filter
- (or auto-revert-buffer-list-filter
- #'magit-auto-revert-repository-buffer-p)))
- (auto-revert-buffers))))
-
-(defvar magit-auto-revert-toplevel nil)
-
-(defvar magit-auto-revert-counter 1
- "Incremented each time `auto-revert-buffers' is called.")
-
-(defun magit-auto-revert-buffer-p (buffer)
- "Return non-nil if BUFFER visits a file inside the current repository.
-The current repository is the one containing `default-directory'.
-If there is no current repository, then return t for any BUFFER."
- (magit-auto-revert-repository-buffer-p buffer t))
-
-(defun magit-auto-revert-repository-buffer-p (buffer &optional fallback)
- "Return non-nil if BUFFER visits a file inside the current repository.
-The current repository is the one containing `default-directory'.
-If there is no current repository, then return FALLBACK (which
-defaults to nil) for any BUFFER."
- ;; Call `magit-toplevel' just once per cycle.
- (unless (and magit-auto-revert-toplevel
- (= (cdr magit-auto-revert-toplevel)
- magit-auto-revert-counter))
- (setq magit-auto-revert-toplevel
- (cons (or (magit-toplevel) 'no-repo)
- magit-auto-revert-counter)))
- (let ((top (car magit-auto-revert-toplevel)))
- (if (eq top 'no-repo)
- fallback
- (let ((dir (buffer-local-value 'default-directory buffer)))
- (and (equal (file-remote-p dir)
- (file-remote-p top))
- ;; ^ `tramp-handle-file-in-directory-p' lacks this optimization.
- (file-in-directory-p dir top))))))
-
-(defun auto-revert-buffers--buffer-list-filter (fn)
- (cl-incf magit-auto-revert-counter)
- (if (or global-auto-revert-mode
- (not auto-revert-buffer-list)
- (not auto-revert-buffer-list-filter))
- (funcall fn)
- (let ((auto-revert-buffer-list
- (-filter auto-revert-buffer-list-filter
- auto-revert-buffer-list)))
- (funcall fn))
- (unless auto-revert-timer
- (auto-revert-set-timer))))
-
-(advice-add 'auto-revert-buffers :around
- 'auto-revert-buffers--buffer-list-filter)
-
-;;; _
-(provide 'magit-autorevert)
-;;; magit-autorevert.el ends here
diff --git a/elpa/magit-20200728.45/magit-bisect.el b/elpa/magit-20200728.45/magit-bisect.el
deleted file mode 100644
index 3ed42c8..0000000
--- a/elpa/magit-20200728.45/magit-bisect.el
+++ /dev/null
@@ -1,239 +0,0 @@
-;;; magit-bisect.el --- bisect support for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2011-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Use a binary search to find the commit that introduced a bug.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-bisect-show-graph t
- "Whether to use `--graph' in the log showing commits yet to be bisected."
- :package-version '(magit . "2.8.0")
- :group 'magit-status
- :type 'boolean)
-
-(defface magit-bisect-good
- '((t :foreground "DarkOliveGreen"))
- "Face for good bisect revisions."
- :group 'magit-faces)
-
-(defface magit-bisect-skip
- '((t :foreground "DarkGoldenrod"))
- "Face for skipped bisect revisions."
- :group 'magit-faces)
-
-(defface magit-bisect-bad
- '((t :foreground "IndianRed4"))
- "Face for bad bisect revisions."
- :group 'magit-faces)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-bisect "magit-bisect" nil t)
-(transient-define-prefix magit-bisect ()
- "Narrow in on the commit that introduced a bug."
- :man-page "git-bisect"
- ["Actions"
- :if-not magit-bisect-in-progress-p
- ("B" "Start" magit-bisect-start)
- ("s" "Start script" magit-bisect-run)]
- ["Actions"
- :if magit-bisect-in-progress-p
- ("B" "Bad" magit-bisect-bad)
- ("g" "Good" magit-bisect-good)
- ("k" "Skip" magit-bisect-skip)
- ("r" "Reset" magit-bisect-reset)
- ("s" "Run script" magit-bisect-run)])
-
-;;;###autoload
-(defun magit-bisect-start (bad good)
- "Start a bisect session.
-
-Bisecting a bug means to find the commit that introduced it.
-This command starts such a bisect session by asking for a know
-good and a bad commit. To move the session forward use the
-other actions from the bisect transient command (\
-\\<magit-status-mode-map>\\[magit-bisect])."
- (interactive (if (magit-bisect-in-progress-p)
- (user-error "Already bisecting")
- (magit-bisect-start-read-args)))
- (unless (magit-rev-ancestor-p good bad)
- (user-error
- "The good revision (%s) has to be an ancestor of the bad one (%s)"
- good bad))
- (when (magit-anything-modified-p)
- (user-error "Cannot bisect with uncommitted changes"))
- (magit-git-bisect "start" (list bad good) t))
-
-(defun magit-bisect-start-read-args ()
- (let ((b (magit-read-branch-or-commit "Start bisect with bad revision")))
- (list b (magit-read-other-branch-or-commit "Good revision" b))))
-
-;;;###autoload
-(defun magit-bisect-reset ()
- "After bisecting, cleanup bisection state and return to original `HEAD'."
- (interactive)
- (magit-confirm 'reset-bisect)
- (magit-run-git "bisect" "reset")
- (ignore-errors (delete-file (magit-git-dir "BISECT_CMD_OUTPUT"))))
-
-;;;###autoload
-(defun magit-bisect-good ()
- "While bisecting, mark the current commit as good.
-Use this after you have asserted that the commit does not contain
-the bug in question."
- (interactive)
- (magit-git-bisect "good"))
-
-;;;###autoload
-(defun magit-bisect-bad ()
- "While bisecting, mark the current commit as bad.
-Use this after you have asserted that the commit does contain the
-bug in question."
- (interactive)
- (magit-git-bisect "bad"))
-
-;;;###autoload
-(defun magit-bisect-skip ()
- "While bisecting, skip the current commit.
-Use this if for some reason the current commit is not a good one
-to test. This command lets Git choose a different one."
- (interactive)
- (magit-git-bisect "skip"))
-
-;;;###autoload
-(defun magit-bisect-run (cmdline &optional bad good)
- "Bisect automatically by running commands after each step.
-
-Unlike `git bisect run' this can be used before bisecting has
-begun. In that case it behaves like `git bisect start; git
-bisect run'."
- (interactive (let ((args (and (not (magit-bisect-in-progress-p))
- (magit-bisect-start-read-args))))
- (cons (read-shell-command "Bisect shell command: ") args)))
- (when (and bad good)
- (magit-bisect-start bad good))
- (magit-git-bisect "run" (list shell-file-name shell-command-switch cmdline)))
-
-(defun magit-git-bisect (subcommand &optional args no-assert)
- (unless (or no-assert (magit-bisect-in-progress-p))
- (user-error "Not bisecting"))
- (message "Bisecting...")
- (magit-with-toplevel
- (magit-run-git-async "bisect" subcommand args))
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (> (process-exit-status process) 0)
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (when (buffer-live-p (process-buffer process))
- (with-current-buffer (process-buffer process)
- (when-let ((section (get-text-property (point) 'magit-section))
- (output (buffer-substring-no-properties
- (oref section content)
- (oref section end))))
- (with-temp-file (magit-git-dir "BISECT_CMD_OUTPUT")
- (insert output)))))
- (magit-refresh))
- (message "Bisecting...done")))))
-
-;;; Sections
-
-(defun magit-bisect-in-progress-p ()
- (file-exists-p (magit-git-dir "BISECT_LOG")))
-
-(defun magit-insert-bisect-output ()
- "While bisecting, insert section with output from `git bisect'."
- (when (magit-bisect-in-progress-p)
- (let* ((lines
- (or (magit-file-lines (magit-git-dir "BISECT_CMD_OUTPUT"))
- (list "Bisecting: (no saved bisect output)"
- "It appears you have invoked `git bisect' from a shell."
- "There is nothing wrong with that, we just cannot display"
- "anything useful here. Consult the shell output instead.")))
- (done-re "^\\([a-z0-9]\\{40\\}\\) is the first bad commit$")
- (bad-line (or (and (string-match done-re (car lines))
- (pop lines))
- (--first (string-match done-re it) lines))))
- (magit-insert-section ((eval (if bad-line 'commit 'bisect-output))
- (and bad-line (match-string 1 bad-line)))
- (magit-insert-heading
- (propertize (or bad-line (pop lines))
- 'font-lock-face 'magit-section-heading))
- (dolist (line lines)
- (insert line "\n"))))
- (insert "\n")))
-
-(defun magit-insert-bisect-rest ()
- "While bisecting, insert section visualizing the bisect state."
- (when (magit-bisect-in-progress-p)
- (magit-insert-section (bisect-view)
- (magit-insert-heading "Bisect Rest:")
- (magit-git-wash (apply-partially 'magit-log-wash-log 'bisect-vis)
- "bisect" "visualize" "git" "log"
- "--format=%h%x00%D%x00%s" "--decorate=full"
- (and magit-bisect-show-graph "--graph")))))
-
-(defun magit-insert-bisect-log ()
- "While bisecting, insert section logging bisect progress."
- (when (magit-bisect-in-progress-p)
- (magit-insert-section (bisect-log)
- (magit-insert-heading "Bisect Log:")
- (magit-git-wash #'magit-wash-bisect-log "bisect" "log")
- (insert ?\n))))
-
-(defun magit-wash-bisect-log (_args)
- (let (beg)
- (while (progn (setq beg (point-marker))
- (re-search-forward "^\\(git bisect [^\n]+\n\\)" nil t))
- (magit-bind-match-strings (heading) nil
- (magit-delete-match)
- (save-restriction
- (narrow-to-region beg (point))
- (goto-char (point-min))
- (magit-insert-section (bisect-item heading t)
- (insert (propertize heading 'font-lock-face
- 'magit-section-secondary-heading))
- (magit-insert-heading)
- (magit-wash-sequence
- (apply-partially 'magit-log-wash-rev 'bisect-log
- (magit-abbrev-length)))
- (insert ?\n)))))
- (when (re-search-forward
- "# first bad commit: \\[\\([a-z0-9]\\{40\\}\\)\\] [^\n]+\n" nil t)
- (magit-bind-match-strings (hash) nil
- (magit-delete-match)
- (magit-insert-section (bisect-item)
- (insert hash " is the first bad commit\n"))))))
-
-;;; _
-(provide 'magit-bisect)
-;;; magit-bisect.el ends here
diff --git a/elpa/magit-20200728.45/magit-blame.el b/elpa/magit-20200728.45/magit-blame.el
deleted file mode 100644
index d537a34..0000000
--- a/elpa/magit-20200728.45/magit-blame.el
+++ /dev/null
@@ -1,944 +0,0 @@
-;;; magit-blame.el --- blame support for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Annotates each line in file-visiting buffer with information from
-;; the revision which last modified the line.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Options
-
-(defgroup magit-blame nil
- "Blame support for Magit."
- :link '(info-link "(magit)Blaming")
- :group 'magit-modes)
-
-(defcustom magit-blame-styles
- '((headings
- (heading-format . "%-20a %C %s\n"))
- (margin
- (margin-format . (" %s%f" " %C %a" " %H"))
- (margin-width . 42)
- (margin-face . magit-blame-margin)
- (margin-body-face . (magit-blame-dimmed)))
- (highlight
- (highlight-face . magit-blame-highlight))
- (lines
- (show-lines . t)
- (show-message . t)))
- "List of styles used to visualize blame information.
-
-Each entry has the form (IDENT (KEY . VALUE)...). IDENT has
-to be a symbol uniquely identifying the style. The following
-KEYs are recognized:
-
- `show-lines'
- Whether to prefix each chunk of lines with a thin line.
- This has no effect if `heading-format' is non-nil.
- `show-message'
- Whether to display a commit's summary line in the echo area
- when crossing chunks.
- `highlight-face'
- Face used to highlight the first line of each chunk.
- If this is nil, then those lines are not highlighted.
- `heading-format'
- String specifying the information to be shown above each
- chunk of lines. It must end with a newline character.
- `margin-format'
- String specifying the information to be shown in the left
- buffer margin. It must NOT end with a newline character.
- This can also be a list of formats used for the lines at
- the same positions within the chunk. If the chunk has
- more lines than formats are specified, then the last is
- repeated.
- `margin-width'
- Width of the margin, provided `margin-format' is non-nil.
- `margin-face'
- Face used in the margin, provided `margin-format' is
- non-nil. This face is used in combination with the faces
- that are specific to the used %-specs. If this is nil,
- then `magit-blame-margin' is used.
- `margin-body-face'
- Face used in the margin for all but first line of a chunk.
- This face is used in combination with the faces that are
- specific to the used %-specs. This can also be a list of
- faces (usually one face), in which case only these faces
- are used and the %-spec faces are ignored. A good value
- might be `(magit-blame-dimmed)'. If this is nil, then
- the same face as for the first line is used.
-
-The following %-specs can be used in `heading-format' and
-`margin-format':
-
- %H hash using face `magit-blame-hash'
- %s summary using face `magit-blame-summary'
- %a author using face `magit-blame-name'
- %A author time using face `magit-blame-date'
- %c committer using face `magit-blame-name'
- %C committer time using face `magit-blame-date'
-
-Additionally if `margin-format' ends with %f, then the string
-that is displayed in the margin is made at least `margin-width'
-characters wide, which may be desirable if the used face sets
-the background color.
-
-The style used in the current buffer can be cycled from the blame
-popup. Blame commands (except `magit-blame-echo') use the first
-style as the initial style when beginning to blame in a buffer."
- :package-version '(magit . "2.13.0")
- :group 'magit-blame
- :type 'string)
-
-(defcustom magit-blame-echo-style 'lines
- "The blame visualization style used by `magit-blame-echo'.
-A symbol that has to be used as the identifier for one of the
-styles defined in `magit-blame-styles'."
- :package-version '(magit . "2.13.0")
- :group 'magit-blame
- :type 'symbol)
-
-(defcustom magit-blame-time-format "%F %H:%M"
- "Format for time strings in blame headings."
- :group 'magit-blame
- :type 'string)
-
-(defcustom magit-blame-read-only t
- "Whether to initially make the blamed buffer read-only."
- :package-version '(magit . "2.13.0")
- :group 'magit-blame
- :type 'boolean)
-
-(defcustom magit-blame-disable-modes '(fci-mode yascroll-bar-mode)
- "List of modes not compatible with Magit-Blame mode.
-This modes are turned off when Magit-Blame mode is turned on,
-and then turned on again when turning off the latter."
- :group 'magit-blame
- :type '(repeat (symbol :tag "Mode")))
-
-(defcustom magit-blame-mode-lighter " Blame"
- "The mode-line lighter of the Magit-Blame mode."
- :group 'magit-blame
- :type '(choice (const :tag "No lighter" "") string))
-
-(defcustom magit-blame-goto-chunk-hook
- '(magit-blame-maybe-update-revision-buffer
- magit-blame-maybe-show-message)
- "Hook run after point entered another chunk."
- :package-version '(magit . "2.13.0")
- :group 'magit-blame
- :type 'hook
- :get 'magit-hook-custom-get
- :options '(magit-blame-maybe-update-revision-buffer
- magit-blame-maybe-show-message))
-
-;;; Faces
-
-(defface magit-blame-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey80"
- :foreground "black")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey25"
- :foreground "white"))
- "Face used for highlighting when blaming.
-Also see option `magit-blame-styles'."
- :group 'magit-faces)
-
-(defface magit-blame-margin
- '((t :inherit magit-blame-highlight
- :weight normal
- :slant normal))
- "Face used for the blame margin by default when blaming.
-Also see option `magit-blame-styles'."
- :group 'magit-faces)
-
-(defface magit-blame-dimmed
- '((t :inherit magit-dimmed
- :weight normal
- :slant normal))
- "Face used for the blame margin in some cases when blaming.
-Also see option `magit-blame-styles'."
- :group 'magit-faces)
-
-(defface magit-blame-heading
- `((t ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-blame-highlight
- :weight normal
- :slant normal))
- "Face used for blame headings by default when blaming.
-Also see option `magit-blame-styles'."
- :group 'magit-faces)
-
-(defface magit-blame-summary nil
- "Face used for commit summaries when blaming."
- :group 'magit-faces)
-
-(defface magit-blame-hash nil
- "Face used for commit hashes when blaming."
- :group 'magit-faces)
-
-(defface magit-blame-name nil
- "Face used for author and committer names when blaming."
- :group 'magit-faces)
-
-(defface magit-blame-date nil
- "Face used for dates when blaming."
- :group 'magit-faces)
-
-;;; Chunks
-
-(defclass magit-blame-chunk ()
- (;; <orig-rev> <orig-line> <final-line> <num-lines>
- (orig-rev :initarg :orig-rev)
- (orig-line :initarg :orig-line)
- (final-line :initarg :final-line)
- (num-lines :initarg :num-lines)
- ;; previous <prev-rev> <prev-file>
- (prev-rev :initform nil)
- (prev-file :initform nil)
- ;; filename <orig-file>
- (orig-file)))
-
-(defun magit-current-blame-chunk (&optional type)
- (or (and (not (and type (not (eq type magit-blame-type))))
- (magit-blame-chunk-at (point)))
- (and type
- (let ((rev (or magit-buffer-refname magit-buffer-revision))
- (file (magit-file-relative-name nil (not magit-buffer-file-name)))
- (line (format "%i,+1" (line-number-at-pos))))
- (unless file
- (error "Buffer does not visit a tracked file"))
- (with-temp-buffer
- (magit-with-toplevel
- (magit-git-insert
- "blame" "--porcelain"
- (if (memq magit-blame-type '(final removal))
- (cons "--reverse" (magit-blame-arguments))
- (magit-blame-arguments))
- "-L" line rev "--" file)
- (goto-char (point-min))
- (car (magit-blame--parse-chunk type))))))))
-
-(defun magit-blame-chunk-at (pos)
- (--some (overlay-get it 'magit-blame-chunk)
- (overlays-at pos)))
-
-(defun magit-blame--overlay-at (&optional pos key)
- (unless pos
- (setq pos (point)))
- (--first (overlay-get it (or key 'magit-blame-chunk))
- (nconc (overlays-at pos)
- (overlays-in pos pos))))
-
-;;; Keymaps
-
-(defvar magit-blame-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-c C-q") 'magit-blame-quit)
- map)
- "Keymap for `magit-blame-mode'.
-Note that most blaming key bindings are defined
-in `magit-blame-read-only-mode-map' instead.")
-
-(defvar magit-blame-read-only-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-m") 'magit-show-commit)
- (define-key map (kbd "p") 'magit-blame-previous-chunk)
- (define-key map (kbd "P") 'magit-blame-previous-chunk-same-commit)
- (define-key map (kbd "n") 'magit-blame-next-chunk)
- (define-key map (kbd "N") 'magit-blame-next-chunk-same-commit)
- (define-key map (kbd "b") 'magit-blame-addition)
- (define-key map (kbd "r") 'magit-blame-removal)
- (define-key map (kbd "f") 'magit-blame-reverse)
- (define-key map (kbd "B") 'magit-blame)
- (define-key map (kbd "c") 'magit-blame-cycle-style)
- (define-key map (kbd "q") 'magit-blame-quit)
- (define-key map (kbd "M-w") 'magit-blame-copy-hash)
- (define-key map (kbd "SPC") 'magit-diff-show-or-scroll-up)
- (define-key map (kbd "S-SPC") 'magit-diff-show-or-scroll-down)
- (define-key map (kbd "DEL") 'magit-diff-show-or-scroll-down)
- map)
- "Keymap for `magit-blame-read-only-mode'.")
-
-;;; Modes
-;;;; Variables
-
-(defvar-local magit-blame-buffer-read-only nil)
-(defvar-local magit-blame-cache nil)
-(defvar-local magit-blame-disabled-modes nil)
-(defvar-local magit-blame-process nil)
-(defvar-local magit-blame-recursive-p nil)
-(defvar-local magit-blame-type nil)
-(defvar-local magit-blame-separator nil)
-(defvar-local magit-blame-previous-chunk nil)
-
-(defvar-local magit-blame--style nil)
-
-(defsubst magit-blame--style-get (key)
- (cdr (assoc key (cdr magit-blame--style))))
-
-;;;; Base Mode
-
-(define-minor-mode magit-blame-mode
- "Display blame information inline."
- :lighter magit-blame-mode-lighter
- (cond (magit-blame-mode
- (when (called-interactively-p 'any)
- (setq magit-blame-mode nil)
- (user-error
- (concat "Don't call `magit-blame-mode' directly; "
- "instead use `magit-blame'")))
- (add-hook 'after-save-hook 'magit-blame--refresh t t)
- (add-hook 'post-command-hook 'magit-blame-goto-chunk-hook t t)
- (add-hook 'before-revert-hook 'magit-blame--remove-overlays t t)
- (add-hook 'after-revert-hook 'magit-blame--refresh t t)
- (add-hook 'read-only-mode-hook 'magit-blame-toggle-read-only t t)
- (setq magit-blame-buffer-read-only buffer-read-only)
- (when (or magit-blame-read-only magit-buffer-file-name)
- (read-only-mode 1))
- (dolist (mode magit-blame-disable-modes)
- (when (and (boundp mode) (symbol-value mode))
- (funcall mode -1)
- (push mode magit-blame-disabled-modes)))
- (setq magit-blame-separator (magit-blame--format-separator))
- (unless magit-blame--style
- (setq magit-blame--style (car magit-blame-styles)))
- (magit-blame--update-margin))
- (t
- (when (process-live-p magit-blame-process)
- (kill-process magit-blame-process)
- (while magit-blame-process
- (sit-for 0.01))) ; avoid racing the sentinel
- (remove-hook 'after-save-hook 'magit-blame--refresh t)
- (remove-hook 'post-command-hook 'magit-blame-goto-chunk-hook t)
- (remove-hook 'before-revert-hook 'magit-blame--remove-overlays t)
- (remove-hook 'after-revert-hook 'magit-blame--refresh t)
- (remove-hook 'read-only-mode-hook 'magit-blame-toggle-read-only t)
- (unless magit-blame-buffer-read-only
- (read-only-mode -1))
- (magit-blame-read-only-mode -1)
- (dolist (mode magit-blame-disabled-modes)
- (funcall mode 1))
- (kill-local-variable 'magit-blame-disabled-modes)
- (kill-local-variable 'magit-blame-type)
- (kill-local-variable 'magit-blame--style)
- (magit-blame--update-margin)
- (magit-blame--remove-overlays))))
-
-(defun magit-blame--refresh ()
- (magit-blame--run (magit-blame-arguments)))
-
-(defun magit-blame-goto-chunk-hook ()
- (let ((chunk (magit-blame-chunk-at (point))))
- (when (cl-typep chunk 'magit-blame-chunk)
- (unless (eq chunk magit-blame-previous-chunk)
- (run-hooks 'magit-blame-goto-chunk-hook))
- (setq magit-blame-previous-chunk chunk))))
-
-(defun magit-blame-toggle-read-only ()
- (magit-blame-read-only-mode (if buffer-read-only 1 -1)))
-
-;;;; Read-Only Mode
-
-(define-minor-mode magit-blame-read-only-mode
- "Provide keybindings for Magit-Blame mode.
-
-This minor-mode provides the key bindings for Magit-Blame mode,
-but only when Read-Only mode is also enabled because these key
-bindings would otherwise conflict badly with regular bindings.
-
-When both Magit-Blame mode and Read-Only mode are enabled, then
-this mode gets automatically enabled too and when one of these
-modes is toggled, then this mode also gets toggled automatically.
-
-\\{magit-blame-read-only-mode-map}")
-
-;;;; Kludges
-
-(defun magit-blame-put-keymap-before-view-mode ()
- "Put `magit-blame-read-only-mode' ahead of `view-mode' in `minor-mode-map-alist'."
- (--when-let (assq 'magit-blame-read-only-mode
- (cl-member 'view-mode minor-mode-map-alist :key #'car))
- (setq minor-mode-map-alist
- (cons it (delq it minor-mode-map-alist))))
- (remove-hook 'view-mode-hook #'magit-blame-put-keymap-before-view-mode))
-
-(add-hook 'view-mode-hook #'magit-blame-put-keymap-before-view-mode)
-
-;;; Process
-
-(defun magit-blame--run (args)
- (magit-with-toplevel
- (unless magit-blame-mode
- (magit-blame-mode 1))
- (message "Blaming...")
- (magit-blame-run-process
- (or magit-buffer-refname magit-buffer-revision)
- (magit-file-relative-name nil (not magit-buffer-file-name))
- (if (memq magit-blame-type '(final removal))
- (cons "--reverse" args)
- args)
- (list (line-number-at-pos (window-start))
- (line-number-at-pos (1- (window-end nil t)))))
- (set-process-sentinel magit-this-process
- 'magit-blame-process-quickstart-sentinel)))
-
-(defun magit-blame-run-process (revision file args &optional lines)
- (let ((process (magit-parse-git-async
- "blame" "--incremental" args
- (and lines (list "-L" (apply #'format "%s,%s" lines)))
- revision "--" file)))
- (set-process-filter process 'magit-blame-process-filter)
- (set-process-sentinel process 'magit-blame-process-sentinel)
- (process-put process 'arguments (list revision file args))
- (setq magit-blame-cache (make-hash-table :test 'equal))
- (setq magit-blame-process process)))
-
-(defun magit-blame-process-quickstart-sentinel (process event)
- (when (memq (process-status process) '(exit signal))
- (magit-blame-process-sentinel process event t)
- (magit-blame-assert-buffer process)
- (with-current-buffer (process-get process 'command-buf)
- (when magit-blame-mode
- (let ((default-directory (magit-toplevel)))
- (apply #'magit-blame-run-process
- (process-get process 'arguments)))))))
-
-(defun magit-blame-process-sentinel (process _event &optional quiet)
- (let ((status (process-status process)))
- (when (memq status '(exit signal))
- (kill-buffer (process-buffer process))
- (if (and (eq status 'exit)
- (zerop (process-exit-status process)))
- (unless quiet
- (message "Blaming...done"))
- (magit-blame-assert-buffer process)
- (with-current-buffer (process-get process 'command-buf)
- (if magit-blame-mode
- (progn (magit-blame-mode -1)
- (message "Blaming...failed"))
- (message "Blaming...aborted"))))
- (kill-local-variable 'magit-blame-process))))
-
-(defun magit-blame-process-filter (process string)
- (internal-default-process-filter process string)
- (let ((buf (process-get process 'command-buf))
- (pos (process-get process 'parsed))
- (mark (process-mark process))
- type cache)
- (with-current-buffer buf
- (setq type magit-blame-type)
- (setq cache magit-blame-cache))
- (with-current-buffer (process-buffer process)
- (goto-char pos)
- (while (and (< (point) mark)
- (save-excursion (re-search-forward "^filename .+\n" nil t)))
- (pcase-let* ((`(,chunk ,revinfo)
- (magit-blame--parse-chunk type))
- (rev (oref chunk orig-rev)))
- (if revinfo
- (puthash rev revinfo cache)
- (setq revinfo
- (or (gethash rev cache)
- (puthash rev (magit-blame--commit-alist rev) cache))))
- (magit-blame--make-overlays buf chunk revinfo))
- (process-put process 'parsed (point))))))
-
-(defun magit-blame--parse-chunk (type)
- (let (chunk revinfo)
- (looking-at "^\\(.\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\)")
- (with-slots (orig-rev orig-file prev-rev prev-file)
- (setq chunk (magit-blame-chunk
- :orig-rev (match-string 1)
- :orig-line (string-to-number (match-string 2))
- :final-line (string-to-number (match-string 3))
- :num-lines (string-to-number (match-string 4))))
- (forward-line)
- (let (done)
- (while (not done)
- (cond ((looking-at "^filename \\(.+\\)")
- (setq done t)
- (setf orig-file (match-string 1)))
- ((looking-at "^previous \\(.\\{40\\}\\) \\(.+\\)")
- (setf prev-rev (match-string 1))
- (setf prev-file (match-string 2)))
- ((looking-at "^\\([^ ]+\\) \\(.+\\)")
- (push (cons (match-string 1)
- (match-string 2)) revinfo)))
- (forward-line)))
- (when (and (eq type 'removal) prev-rev)
- (cl-rotatef orig-rev prev-rev)
- (cl-rotatef orig-file prev-file)
- (setq revinfo nil)))
- (list chunk revinfo)))
-
-(defun magit-blame--commit-alist (rev)
- (cl-mapcar 'cons
- '("summary"
- "author" "author-time" "author-tz"
- "committer" "committer-time" "committer-tz")
- (split-string (magit-rev-format "%s\v%an\v%ad\v%cn\v%cd" rev
- "--date=format:%s\v%z")
- "\v")))
-
-(defun magit-blame-assert-buffer (process)
- (unless (buffer-live-p (process-get process 'command-buf))
- (kill-process process)
- (user-error "Buffer being blamed has been killed")))
-
-;;; Display
-
-(defun magit-blame--make-overlays (buf chunk revinfo)
- (with-current-buffer buf
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-min))
- (forward-line (1- (oref chunk final-line)))
- (let ((beg (point))
- (end (save-excursion
- (forward-line (oref chunk num-lines))
- (point))))
- (magit-blame--remove-overlays beg end)
- (magit-blame--make-margin-overlays chunk revinfo beg end)
- (magit-blame--make-heading-overlay chunk revinfo beg end)
- (magit-blame--make-highlight-overlay chunk beg))))))
-
-(defun magit-blame--make-margin-overlays (chunk revinfo _beg end)
- (save-excursion
- (let ((line 0))
- (while (< (point) end)
- (magit-blame--make-margin-overlay chunk revinfo line)
- (forward-line)
- (cl-incf line)))))
-
-(defun magit-blame--make-margin-overlay (chunk revinfo line)
- (let* ((end (line-end-position))
- ;; If possible avoid putting this on the first character
- ;; of the line to avoid a conflict with the line overlay.
- (beg (min (1+ (line-beginning-position)) end))
- (ov (make-overlay beg end)))
- (overlay-put ov 'magit-blame-chunk chunk)
- (overlay-put ov 'magit-blame-revinfo revinfo)
- (overlay-put ov 'magit-blame-margin line)
- (magit-blame--update-margin-overlay ov)))
-
-(defun magit-blame--make-heading-overlay (chunk revinfo beg end)
- (let ((ov (make-overlay beg end)))
- (overlay-put ov 'magit-blame-chunk chunk)
- (overlay-put ov 'magit-blame-revinfo revinfo)
- (overlay-put ov 'magit-blame-heading t)
- (magit-blame--update-heading-overlay ov)))
-
-(defun magit-blame--make-highlight-overlay (chunk beg)
- (let ((ov (make-overlay beg (1+ (line-end-position)))))
- (overlay-put ov 'magit-blame-chunk chunk)
- (overlay-put ov 'magit-blame-highlight t)
- (magit-blame--update-highlight-overlay ov)))
-
-(defun magit-blame--update-margin ()
- (setq left-margin-width (or (magit-blame--style-get 'margin-width) 0))
- (set-window-buffer (selected-window) (current-buffer)))
-
-(defun magit-blame--update-overlays ()
- (save-restriction
- (widen)
- (dolist (ov (overlays-in (point-min) (point-max)))
- (cond ((overlay-get ov 'magit-blame-heading)
- (magit-blame--update-heading-overlay ov))
- ((overlay-get ov 'magit-blame-margin)
- (magit-blame--update-margin-overlay ov))
- ((overlay-get ov 'magit-blame-highlight)
- (magit-blame--update-highlight-overlay ov))))))
-
-(defun magit-blame--update-margin-overlay (ov)
- (overlay-put
- ov 'before-string
- (and (magit-blame--style-get 'margin-width)
- (propertize
- "o" 'display
- (list (list 'margin 'left-margin)
- (let ((line (overlay-get ov 'magit-blame-margin))
- (format (magit-blame--style-get 'margin-format))
- (face (magit-blame--style-get 'margin-face)))
- (magit-blame--format-string
- ov
- (or (and (atom format)
- format)
- (nth line format)
- (car (last format)))
- (or (and (not (zerop line))
- (magit-blame--style-get 'margin-body-face))
- face
- 'magit-blame-margin))))))))
-
-(defun magit-blame--update-heading-overlay (ov)
- (overlay-put
- ov 'before-string
- (--if-let (magit-blame--style-get 'heading-format)
- (magit-blame--format-string ov it 'magit-blame-heading)
- (and (magit-blame--style-get 'show-lines)
- (or (not (magit-blame--style-get 'margin-format))
- (save-excursion
- (goto-char (overlay-start ov))
- ;; Special case of the special case described in
- ;; `magit-blame--make-margin-overlay'. For empty
- ;; lines it is not possible to show both overlays
- ;; without the line being to high.
- (not (= (point) (line-end-position)))))
- magit-blame-separator))))
-
-(defun magit-blame--update-highlight-overlay (ov)
- (overlay-put ov 'font-lock-face (magit-blame--style-get 'highlight-face)))
-
-(defun magit-blame--format-string (ov format face)
- (let* ((chunk (overlay-get ov 'magit-blame-chunk))
- (revinfo (overlay-get ov 'magit-blame-revinfo))
- (key (list format face))
- (string (cdr (assoc key revinfo))))
- (unless string
- (setq string
- (and format
- (magit-blame--format-string-1 (oref chunk orig-rev)
- revinfo format face)))
- (nconc revinfo (list (cons key string))))
- string))
-
-(defun magit-blame--format-string-1 (rev revinfo format face)
- (let ((str
- (if (equal rev "0000000000000000000000000000000000000000")
- (propertize (concat (if (string-prefix-p "\s" format) "\s" "")
- "Not Yet Committed"
- (if (string-suffix-p "\n" format) "\n" ""))
- 'font-lock-face face)
- (magit--format-spec
- (propertize format 'font-lock-face face)
- (cl-flet* ((p0 (s f)
- (propertize s 'font-lock-face
- (if face
- (if (listp face)
- face
- (list f face))
- f)))
- (p1 (k f)
- (p0 (cdr (assoc k revinfo)) f))
- (p2 (k1 k2 f)
- (p0 (magit-blame--format-time-string
- (cdr (assoc k1 revinfo))
- (cdr (assoc k2 revinfo)))
- f)))
- `((?H . ,(p0 rev 'magit-blame-hash))
- (?s . ,(p1 "summary" 'magit-blame-summary))
- (?a . ,(p1 "author" 'magit-blame-name))
- (?c . ,(p1 "committer" 'magit-blame-name))
- (?A . ,(p2 "author-time" "author-tz" 'magit-blame-date))
- (?C . ,(p2 "committer-time" "committer-tz" 'magit-blame-date))
- (?f . "")))))))
- (if-let ((width (and (string-suffix-p "%f" format)
- (magit-blame--style-get 'margin-width))))
- (concat str
- (propertize (make-string (max 0 (- width (length str))) ?\s)
- 'font-lock-face face))
- str)))
-
-(defun magit-blame--format-separator ()
- (propertize
- (concat (propertize "\s" 'display '(space :height (2)))
- (propertize "\n" 'line-height t))
- 'font-lock-face (list :background
- (face-attribute 'magit-blame-heading
- :background nil t))))
-
-(defun magit-blame--format-time-string (time tz)
- (let* ((time-format (or (magit-blame--style-get 'time-format)
- magit-blame-time-format))
- (tz-in-second (and (string-match "%z" time-format)
- (car (last (parse-time-string tz))))))
- (format-time-string time-format
- (seconds-to-time (string-to-number time))
- tz-in-second)))
-
-(defun magit-blame--remove-overlays (&optional beg end)
- (save-restriction
- (widen)
- (dolist (ov (overlays-in (or beg (point-min))
- (or end (point-max))))
- (when (overlay-get ov 'magit-blame-chunk)
- (delete-overlay ov)))))
-
-(defun magit-blame-maybe-show-message ()
- (when (magit-blame--style-get 'show-message)
- (let ((message-log-max 0))
- (if-let ((msg (cdr (assoc "summary"
- (gethash (oref (magit-current-blame-chunk)
- orig-rev)
- magit-blame-cache)))))
- (progn (set-text-properties 0 (length msg) nil msg)
- (message msg))
- (message "Commit data not available yet. Still blaming.")))))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-blame-echo "magit-blame" nil t)
-(transient-define-suffix magit-blame-echo (args)
- "For each line show the revision in which it was added.
-Show the information about the chunk at point in the echo area
-when moving between chunks. Unlike other blaming commands, do
-not turn on `read-only-mode'."
- :if (lambda ()
- (and buffer-file-name
- (or (not magit-blame-mode)
- buffer-read-only)))
- (interactive (list (magit-blame-arguments)))
- (when magit-buffer-file-name
- (user-error "Blob buffers aren't supported"))
- (setq-local magit-blame--style
- (assq magit-blame-echo-style magit-blame-styles))
- (setq-local magit-blame-disable-modes
- (cons 'eldoc-mode magit-blame-disable-modes))
- (if (not magit-blame-mode)
- (let ((magit-blame-read-only nil))
- (magit-blame--pre-blame-assert 'addition)
- (magit-blame--pre-blame-setup 'addition)
- (magit-blame--run args))
- (read-only-mode -1)
- (magit-blame--update-overlays)))
-
-;;;###autoload (autoload 'magit-blame-addition "magit-blame" nil t)
-(transient-define-suffix magit-blame-addition (args)
- "For each line show the revision in which it was added."
- (interactive (list (magit-blame-arguments)))
- (magit-blame--pre-blame-assert 'addition)
- (magit-blame--pre-blame-setup 'addition)
- (magit-blame--run args))
-
-;;;###autoload (autoload 'magit-blame-removal "magit-blame" nil t)
-(transient-define-suffix magit-blame-removal (args)
- "For each line show the revision in which it was removed."
- :if-nil 'buffer-file-name
- (interactive (list (magit-blame-arguments)))
- (unless magit-buffer-file-name
- (user-error "Only blob buffers can be blamed in reverse"))
- (magit-blame--pre-blame-assert 'removal)
- (magit-blame--pre-blame-setup 'removal)
- (magit-blame--run args))
-
-;;;###autoload (autoload 'magit-blame-reverse "magit-blame" nil t)
-(transient-define-suffix magit-blame-reverse (args)
- "For each line show the last revision in which it still exists."
- :if-nil 'buffer-file-name
- (interactive (list (magit-blame-arguments)))
- (unless magit-buffer-file-name
- (user-error "Only blob buffers can be blamed in reverse"))
- (magit-blame--pre-blame-assert 'final)
- (magit-blame--pre-blame-setup 'final)
- (magit-blame--run args))
-
-(defun magit-blame--pre-blame-assert (type)
- (unless (magit-toplevel)
- (magit--not-inside-repository-error))
- (if (and magit-blame-mode
- (eq type magit-blame-type))
- (if-let ((chunk (magit-current-blame-chunk)))
- (unless (oref chunk prev-rev)
- (user-error "Chunk has no further history"))
- (user-error "Commit data not available yet. Still blaming."))
- (unless (magit-file-relative-name nil (not magit-buffer-file-name))
- (if buffer-file-name
- (user-error "Buffer isn't visiting a tracked file")
- (user-error "Buffer isn't visiting a file")))))
-
-(defun magit-blame--pre-blame-setup (type)
- (when magit-blame-mode
- (if (eq type magit-blame-type)
- (let ((style magit-blame--style))
- (magit-blame-visit-other-file)
- (setq-local magit-blame--style style)
- (setq-local magit-blame-recursive-p t)
- ;; Set window-start for the benefit of quickstart.
- (redisplay))
- (magit-blame--remove-overlays)))
- (setq magit-blame-type type))
-
-(defun magit-blame-visit-other-file ()
- "Visit another blob related to the current chunk."
- (interactive)
- (with-slots (prev-rev prev-file orig-line)
- (magit-current-blame-chunk)
- (unless prev-rev
- (user-error "Chunk has no further history"))
- (magit-with-toplevel
- (magit-find-file prev-rev prev-file))
- ;; TODO Adjust line like magit-diff-visit-file.
- (goto-char (point-min))
- (forward-line (1- orig-line))))
-
-(defun magit-blame-visit-file ()
- "Visit the blob related to the current chunk."
- (interactive)
- (with-slots (orig-rev orig-file orig-line)
- (magit-current-blame-chunk)
- (magit-with-toplevel
- (magit-find-file orig-rev orig-file))
- (goto-char (point-min))
- (forward-line (1- orig-line))))
-
-(transient-define-suffix magit-blame-quit ()
- "Turn off Magit-Blame mode.
-If the buffer was created during a recursive blame,
-then also kill the buffer."
- :if-non-nil 'magit-blame-mode
- (interactive)
- (magit-blame-mode -1)
- (when magit-blame-recursive-p
- (kill-buffer)))
-
-(defun magit-blame-next-chunk ()
- "Move to the next chunk."
- (interactive)
- (--if-let (next-single-char-property-change (point) 'magit-blame-chunk)
- (goto-char it)
- (user-error "No more chunks")))
-
-(defun magit-blame-previous-chunk ()
- "Move to the previous chunk."
- (interactive)
- (--if-let (previous-single-char-property-change (point) 'magit-blame-chunk)
- (goto-char it)
- (user-error "No more chunks")))
-
-(defun magit-blame-next-chunk-same-commit (&optional previous)
- "Move to the next chunk from the same commit.\n\n(fn)"
- (interactive)
- (if-let ((rev (oref (magit-current-blame-chunk) orig-rev)))
- (let ((pos (point)) ov)
- (save-excursion
- (while (and (not ov)
- (not (= pos (if previous (point-min) (point-max))))
- (setq pos (funcall
- (if previous
- 'previous-single-char-property-change
- 'next-single-char-property-change)
- pos 'magit-blame-chunk)))
- (--when-let (magit-blame--overlay-at pos)
- (when (equal (oref (magit-blame-chunk-at pos) orig-rev) rev)
- (setq ov it)))))
- (if ov
- (goto-char (overlay-start ov))
- (user-error "No more chunks from same commit")))
- (user-error "This chunk hasn't been blamed yet")))
-
-(defun magit-blame-previous-chunk-same-commit ()
- "Move to the previous chunk from the same commit."
- (interactive)
- (magit-blame-next-chunk-same-commit 'previous-single-char-property-change))
-
-(defun magit-blame-cycle-style ()
- "Change how blame information is visualized.
-Cycle through the elements of option `magit-blame-styles'."
- (interactive)
- (setq magit-blame--style
- (or (cadr (cl-member (car magit-blame--style)
- magit-blame-styles :key #'car))
- (car magit-blame-styles)))
- (magit-blame--update-margin)
- (magit-blame--update-overlays))
-
-(defun magit-blame-copy-hash ()
- "Save hash of the current chunk's commit to the kill ring.
-
-When the region is active, then save the region's content
-instead of the hash, like `kill-ring-save' would."
- (interactive)
- (if (use-region-p)
- (call-interactively #'copy-region-as-kill)
- (kill-new (message "%s" (oref (magit-current-blame-chunk) orig-rev)))))
-
-;;; Popup
-
-;;;###autoload (autoload 'magit-blame "magit-blame" nil t)
-(transient-define-prefix magit-blame ()
- "Show the commits that added or removed lines in the visited file."
- :man-page "git-blame"
- :value '("-w")
- ["Arguments"
- ("-w" "Ignore whitespace" "-w")
- ("-r" "Do not treat root commits as boundaries" "--root")
- (magit-blame:-M)
- (magit-blame:-C)]
- ["Actions"
- ("b" "Show commits adding lines" magit-blame-addition)
- ("r" "Show commits removing lines" magit-blame-removal)
- ("f" "Show last commits that still have lines" magit-blame-reverse)
- ("m" "Blame echo" magit-blame-echo)
- ("q" "Quit blaming" magit-blame-quit)]
- ["Refresh"
- :if-non-nil magit-blame-mode
- ("c" "Cycle style" magit-blame-cycle-style)])
-
-(defun magit-blame-arguments ()
- (transient-args 'magit-blame))
-
-(transient-define-argument magit-blame:-M ()
- :description "Detect lines moved or copied within a file"
- :class 'transient-option
- :argument "-M"
- :reader 'transient-read-number-N+)
-
-(transient-define-argument magit-blame:-C ()
- :description "Detect lines moved or copied between files"
- :class 'transient-option
- :argument "-C"
- :reader 'transient-read-number-N+)
-
-;;; Utilities
-
-(defun magit-blame-maybe-update-revision-buffer ()
- (when-let ((chunk (magit-current-blame-chunk))
- (commit (oref chunk orig-rev))
- (buffer (magit-get-mode-buffer 'magit-revision-mode nil t)))
- (if magit--update-revision-buffer
- (setq magit--update-revision-buffer (list commit buffer))
- (setq magit--update-revision-buffer (list commit buffer))
- (run-with-idle-timer
- magit-update-other-window-delay nil
- (lambda ()
- (pcase-let ((`(,rev ,buf) magit--update-revision-buffer))
- (setq magit--update-revision-buffer nil)
- (when (buffer-live-p buf)
- (let ((magit-display-buffer-noselect t))
- (apply #'magit-show-commit rev
- (magit-diff-arguments 'magit-revision-mode))))))))))
-
-;;; _
-(provide 'magit-blame)
-;;; magit-blame.el ends here
diff --git a/elpa/magit-20200728.45/magit-bookmark.el b/elpa/magit-20200728.45/magit-bookmark.el
deleted file mode 100644
index bd6c683..0000000
--- a/elpa/magit-20200728.45/magit-bookmark.el
+++ /dev/null
@@ -1,203 +0,0 @@
-;;; magit-bookmark.el --- bookmark support for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Inspired by an earlier implementation by Yuri Khan.
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Support for bookmarks for most Magit buffers.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-(require 'bookmark)
-
-;;; Core
-
-(defun magit--make-bookmark ()
- "Create a bookmark for the current Magit buffer.
-Input values are the major-mode's `magit-bookmark-name' method,
-and the buffer-local values of the variables referenced in its
-`magit-bookmark-variables' property."
- (if (plist-member (symbol-plist major-mode) 'magit-bookmark-variables)
- (let ((bookmark (bookmark-make-record-default 'no-file)))
- (bookmark-prop-set bookmark 'handler 'magit--handle-bookmark)
- (bookmark-prop-set bookmark 'mode major-mode)
- (bookmark-prop-set bookmark 'filename (magit-toplevel))
- (bookmark-prop-set bookmark 'defaults (list (magit-bookmark-name)))
- (dolist (var (get major-mode 'magit-bookmark-variables))
- (bookmark-prop-set bookmark var (symbol-value var)))
- (bookmark-prop-set
- bookmark 'magit-hidden-sections
- (--keep (and (oref it hidden)
- (cons (oref it type)
- (if (derived-mode-p 'magit-stash-mode)
- (replace-regexp-in-string
- (regexp-quote magit-buffer-revision)
- magit-buffer-revision-hash
- (oref it value))
- (oref it value))))
- (oref magit-root-section children)))
- bookmark)
- (user-error "Bookmarking is not implemented for %s buffers" major-mode)))
-
-;;;###autoload
-(defun magit--handle-bookmark (bookmark)
- "Open a bookmark created by `magit--make-bookmark'.
-Call the `magit-*-setup-buffer' function of the the major-mode
-with the variables' values as arguments, which were recorded by
-`magit--make-bookmark'. Ignore `magit-display-buffer-function'."
- (let ((buffer (let ((default-directory (bookmark-get-filename bookmark))
- (mode (bookmark-prop-get bookmark 'mode))
- (magit-display-buffer-function #'identity)
- (magit-display-buffer-noselect t))
- (apply (intern (format "%s-setup-buffer"
- (substring (symbol-name mode) 0 -5)))
- (--map (bookmark-prop-get bookmark it)
- (get mode 'magit-bookmark-variables))))))
- (set-buffer buffer) ; That is the interface we have to adhere to.
- (when-let ((hidden (bookmark-prop-get bookmark 'magit-hidden-sections)))
- (with-current-buffer buffer
- (dolist (child (oref magit-root-section children))
- (if (member (cons (oref child type)
- (oref child value))
- hidden)
- (magit-section-hide child)
- (magit-section-show child)))))
- nil))
-
-(cl-defgeneric magit-bookmark-name ()
- "Return name for bookmark to current buffer."
- (format "%s%s"
- (substring (symbol-name major-mode) 0 -5)
- (if-let ((vars (get major-mode 'magit-bookmark-variables)))
- (cl-mapcan (lambda (var)
- (let ((val (symbol-value var)))
- (if (and val (atom val))
- (list val)
- val)))
- vars)
- "")))
-
-;;; Diff
-;;;; Diff
-
-(put 'magit-diff-mode 'magit-bookmark-variables
- '(magit-buffer-range-hashed
- magit-buffer-typearg
- magit-buffer-diff-args
- magit-buffer-diff-files))
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-diff-mode))
- (format "magit-diff(%s%s)"
- (pcase (magit-diff-type)
- (`staged "staged")
- (`unstaged "unstaged")
- (`committed magit-buffer-range)
- (`undefined
- (delq nil (list magit-buffer-typearg magit-buffer-range-hashed))))
- (if magit-buffer-diff-files
- (concat " -- " (mapconcat #'identity magit-buffer-diff-files " "))
- "")))
-
-;;;; Revision
-
-(put 'magit-revision-mode 'magit-bookmark-variables
- '(magit-buffer-revision-hash
- magit-buffer-diff-args
- magit-buffer-diff-files))
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-revision-mode))
- (format "magit-revision(%s %s)"
- (magit-rev-abbrev magit-buffer-revision)
- (if magit-buffer-diff-files
- (mapconcat #'identity magit-buffer-diff-files " ")
- (magit-rev-format "%s" magit-buffer-revision))))
-
-;;;; Stash
-
-(put 'magit-stash-mode 'magit-bookmark-variables
- '(magit-buffer-revision-hash
- magit-buffer-diff-args
- magit-buffer-diff-files))
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-stash-mode))
- (format "magit-stash(%s %s)"
- (magit-rev-abbrev magit-buffer-revision)
- (if magit-buffer-diff-files
- (mapconcat #'identity magit-buffer-diff-files " ")
- (magit-rev-format "%s" magit-buffer-revision))))
-
-;;; Log
-;;;; Log
-
-(put 'magit-log-mode 'magit-bookmark-variables
- '(magit-buffer-revisions
- magit-buffer-log-args
- magit-buffer-log-files))
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-log-mode))
- (format "magit-log(%s%s)"
- (mapconcat #'identity magit-buffer-revisions " ")
- (if magit-buffer-log-files
- (concat " -- " (mapconcat #'identity magit-buffer-log-files " "))
- "")))
-
-;;;; Cherry
-
-(put 'magit-cherry-mode 'magit-bookmark-variables
- '(magit-buffer-refname
- magit-buffer-upstream))
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-cherry-mode))
- (format "magit-cherry(%s > %s)"
- magit-buffer-refname
- magit-buffer-upstream))
-
-;;;; Reflog
-
-(put 'magit-reflog-mode 'magit-bookmark-variables
- '(magit-buffer-refname))
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-reflog-mode))
- (format "magit-reflog(%s)" magit-buffer-refname))
-
-;;; Misc
-
-(put 'magit-status-mode 'magit-bookmark-variables nil)
-
-(put 'magit-refs-mode 'magit-bookmark-variables
- '(magit-buffer-upstream
- magit-buffer-arguments))
-
-(put 'magit-stashes-mode 'magit-bookmark-variables nil)
-
-(cl-defmethod magit-bookmark-name (&context (major-mode magit-stashes-mode))
- (format "magit-states(%s)" magit-buffer-refname))
-
-;;; _
-(provide 'magit-bookmark)
-;;; magit-bookmark.el ends here
diff --git a/elpa/magit-20200728.45/magit-branch.el b/elpa/magit-20200728.45/magit-branch.el
deleted file mode 100644
index e50c810..0000000
--- a/elpa/magit-20200728.45/magit-branch.el
+++ /dev/null
@@ -1,893 +0,0 @@
-;;; magit-branch.el --- branch support -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for branches. It defines commands
-;; for creating, checking out, manipulating, and configuring branches.
-;; Commands defined here are mainly concerned with branches as
-;; pointers, commands that deal with what a branch points at, are
-;; defined elsewhere.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-(require 'magit-reset)
-
-;;; Options
-
-(defcustom magit-branch-read-upstream-first t
- "Whether to read upstream before name of new branch when creating a branch.
-
-`nil' Read the branch name first.
-`t' Read the upstream first.
-`fallback' Read the upstream first, but if it turns out that the chosen
- value is not a valid upstream (because it cannot be resolved
- as an existing revision), then treat it as the name of the
- new branch and continue by reading the upstream next."
- :package-version '(magit . "2.2.0")
- :group 'magit-commands
- :type '(choice (const :tag "read branch name first" nil)
- (const :tag "read upstream first" t)
- (const :tag "read upstream first, with fallback" fallback)))
-
-(defcustom magit-branch-prefer-remote-upstream nil
- "Whether to favor remote upstreams when creating new branches.
-
-When a new branch is created, then the branch, commit, or stash
-at point is suggested as the default starting point of the new
-branch, or if there is no such revision at point the current
-branch. In either case the user may choose another starting
-point.
-
-If the chosen starting point is a branch, then it may also be set
-as the upstream of the new branch, depending on the value of the
-Git variable `branch.autoSetupMerge'. By default this is done
-for remote branches, but not for local branches.
-
-You might prefer to always use some remote branch as upstream.
-If the chosen starting point is (1) a local branch, (2) whose
-name matches a member of the value of this option, (3) the
-upstream of that local branch is a remote branch with the same
-name, and (4) that remote branch can be fast-forwarded to the
-local branch, then the chosen branch is used as starting point,
-but its own upstream is used as the upstream of the new branch.
-
-Members of this option's value are treated as branch names that
-have to match exactly unless they contain a character that makes
-them invalid as a branch name. Recommended characters to use
-to trigger interpretation as a regexp are \"*\" and \"^\". Some
-other characters which you might expect to be invalid, actually
-are not, e.g. \".+$\" are all perfectly valid. More precisely,
-if `git check-ref-format --branch STRING' exits with a non-zero
-status, then treat STRING as a regexp.
-
-Assuming the chosen branch matches these conditions you would end
-up with with e.g.:
-
- feature --upstream--> origin/master
-
-instead of
-
- feature --upstream--> master --upstream--> origin/master
-
-Which you prefer is a matter of personal preference. If you do
-prefer the former, then you should add branches such as \"master\",
-\"next\", and \"maint\" to the value of this options."
- :package-version '(magit . "2.4.0")
- :group 'magit-commands
- :type '(repeat string))
-
-(defcustom magit-branch-adjust-remote-upstream-alist nil
- "Alist of upstreams to be used when branching from remote branches.
-
-When creating a local branch from an ephemeral branch located
-on a remote, e.g. a feature or hotfix branch, then that remote
-branch should usually not be used as the upstream branch, since
-the push-remote already allows accessing it and having both the
-upstream and the push-remote reference the same related branch
-would be wasteful. Instead a branch like \"maint\" or \"master\"
-should be used as the upstream.
-
-This option allows specifying the branch that should be used as
-the upstream when branching certain remote branches. The value
-is an alist of the form ((UPSTREAM . RULE)...). The first
-matching element is used, the following elements are ignored.
-
-UPSTREAM is the branch to be used as the upstream for branches
-specified by RULE. It can be a local or a remote branch.
-
-RULE can either be a regular expression, matching branches whose
-upstream should be the one specified by UPSTREAM. Or it can be
-a list of the only branches that should *not* use UPSTREAM; all
-other branches will. Matching is done after stripping the remote
-part of the name of the branch that is being branched from.
-
-If you use a finite set of non-ephemeral branches across all your
-repositories, then you might use something like:
-
- ((\"origin/master\" \"master\" \"next\" \"maint\"))
-
-Or if the names of all your ephemeral branches contain a slash,
-at least in some repositories, then a good value could be:
-
- ((\"origin/master\" . \"/\"))
-
-Of course you can also fine-tune:
-
- ((\"origin/maint\" . \"\\\\\\=`hotfix/\")
- (\"origin/master\" . \"\\\\\\=`feature/\"))
-
-If you use remote branches as UPSTREAM, then you might also want
-to set `magit-branch-prefer-remote-upstream' to a non-nil value.
-However, I recommend that you use local branches as UPSTREAM."
- :package-version '(magit . "2.9.0")
- :group 'magit-commands
- :type '(repeat (cons (string :tag "Use upstream")
- (choice :tag "for branches"
- (regexp :tag "matching")
- (repeat :tag "except"
- (string :tag "branch"))))))
-
-(defcustom magit-branch-rename-push-target t
- "Whether the push-remote setup is preserved when renaming a branch.
-
-The command `magit-branch-rename' renames a branch named OLD to
-NEW. This option controls how much of the push-remote setup is
-preserved when doing so.
-
-When nil, then preserve nothing and unset `branch.OLD.pushRemote'.
-
-When `local-only', then first set `branch.NEW.pushRemote' to the
- same value as `branch.OLD.pushRemote', provided the latter is
- actually set and unless the former already has another value.
-
-When t, then rename the branch named OLD on the remote specified
- by `branch.OLD.pushRemote' to NEW, provided OLD exists on that
- remote and unless NEW already exists on the remote.
-
-When `forge-only' and the `forge' package is available, then
- behave like `t' if the remote points to a repository on a forge
- (currently Github or Gitlab), otherwise like `local-only'.
-
-Another supported but obsolete value is `github-only'. It is a
- misnomer because it now treated as an alias for `forge-only'."
- :package-version '(magit . "2.90.0")
- :group 'magit-commands
- :type '(choice
- (const :tag "Don't preserve push-remote setup" nil)
- (const :tag "Preserve push-remote setup" local-only)
- (const :tag "... and rename corresponding branch on remote" t)
- (const :tag "... but only if remote is on a forge" forge-only)))
-
-(defcustom magit-branch-direct-configure t
- "Whether the command `magit-branch' shows Git variables.
-When set to nil, no variables are displayed by this transient
-command, instead the sub-transient `magit-branch-configure'
-has to be used to view and change branch related variables."
- :package-version '(magit . "2.7.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-published-branches '("origin/master")
- "List of branches that are considered to be published."
- :package-version '(magit . "2.13.0")
- :group 'magit-commands
- :type '(repeat string))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-branch "magit" nil t)
-(transient-define-prefix magit-branch (branch)
- "Add, configure or remove a branch."
- :man-page "git-branch"
- ["Variables"
- :if (lambda ()
- (and magit-branch-direct-configure
- (oref transient--prefix scope)))
- ("d" magit-branch.<branch>.description)
- ("u" magit-branch.<branch>.merge/remote)
- ("r" magit-branch.<branch>.rebase)
- ("p" magit-branch.<branch>.pushRemote)]
- [["Checkout"
- ("b" "branch/revision" magit-checkout)
- ("l" "local branch" magit-branch-checkout)
- (6 "o" "new orphan" magit-branch-orphan)]
- [""
- ("c" "new branch" magit-branch-and-checkout)
- ("s" "new spin-off" magit-branch-spinoff)
- (5 "w" "new worktree" magit-worktree-checkout)]
- ["Create"
- ("n" "new branch" magit-branch-create)
- ("S" "new spin-out" magit-branch-spinout)
- (5 "W" "new worktree" magit-worktree-branch)]
- ["Do"
- ("C" "configure..." magit-branch-configure)
- ("m" "rename" magit-branch-rename)
- ("x" "reset" magit-branch-reset)
- ("k" "delete" magit-branch-delete)]
- [""
- (7 "h" "shelve" magit-branch-shelve)
- (7 "H" "unshelve" magit-branch-unshelve)]]
- (interactive (list (magit-get-current-branch)))
- (transient-setup 'magit-branch nil nil :scope branch))
-
-;;;###autoload
-(defun magit-checkout (revision)
- "Checkout REVISION, updating the index and the working tree.
-If REVISION is a local branch, then that becomes the current
-branch. If it is something else, then `HEAD' becomes detached.
-Checkout fails if the working tree or the staging area contain
-changes.
-\n(git checkout REVISION)."
- (interactive (list (magit-read-other-branch-or-commit "Checkout")))
- (when (string-match "\\`heads/\\(.+\\)" revision)
- (setq revision (match-string 1 revision)))
- (magit-run-git "checkout" revision))
-
-;;;###autoload
-(defun magit-branch-create (branch start-point)
- "Create BRANCH at branch or revision START-POINT."
- (interactive (magit-branch-read-args "Create branch"))
- (magit-call-git "branch" branch start-point)
- (magit-branch-maybe-adjust-upstream branch start-point)
- (magit-refresh))
-
-;;;###autoload
-(defun magit-branch-and-checkout (branch start-point)
- "Create and checkout BRANCH at branch or revision START-POINT."
- (interactive (magit-branch-read-args "Create and checkout branch"))
- (if (string-match-p "^stash@{[0-9]+}$" start-point)
- (magit-run-git "stash" "branch" branch start-point)
- (magit-call-git "checkout" "-b" branch start-point)
- (magit-branch-maybe-adjust-upstream branch start-point)
- (magit-refresh)))
-
-;;;###autoload
-(defun magit-branch-or-checkout (arg &optional start-point)
- "Hybrid between `magit-checkout' and `magit-branch-and-checkout'.
-
-Ask the user for an existing branch or revision. If the user
-input actually can be resolved as a branch or revision, then
-check that out, just like `magit-checkout' would.
-
-Otherwise create and checkout a new branch using the input as
-its name. Before doing so read the starting-point for the new
-branch. This is similar to what `magit-branch-and-checkout'
-does."
- (interactive
- (let ((arg (magit-read-other-branch-or-commit "Checkout")))
- (list arg
- (and (not (magit-commit-p arg))
- (magit-read-starting-point "Create and checkout branch" arg)))))
- (when (string-match "\\`heads/\\(.+\\)" arg)
- (setq arg (match-string 1 arg)))
- (if start-point
- (magit-branch-and-checkout arg start-point)
- (magit-checkout arg)))
-
-;;;###autoload
-(defun magit-branch-checkout (branch &optional start-point)
- "Checkout an existing or new local branch.
-
-Read a branch name from the user offering all local branches and
-a subset of remote branches as candidates. Omit remote branches
-for which a local branch by the same name exists from the list
-of candidates. The user can also enter a completely new branch
-name.
-
-- If the user selects an existing local branch, then check that
- out.
-
-- If the user selects a remote branch, then create and checkout
- a new local branch with the same name. Configure the selected
- remote branch as push target.
-
-- If the user enters a new branch name, then create and check
- that out, after also reading the starting-point from the user.
-
-In the latter two cases the upstream is also set. Whether it is
-set to the chosen START-POINT or something else depends on the
-value of `magit-branch-adjust-remote-upstream-alist', just like
-when using `magit-branch-and-checkout'."
- (interactive
- (let* ((current (magit-get-current-branch))
- (local (magit-list-local-branch-names))
- (remote (--filter (and (string-match "[^/]+/" it)
- (not (member (substring it (match-end 0))
- (cons "HEAD" local))))
- (magit-list-remote-branch-names)))
- (choices (nconc (delete current local) remote))
- (atpoint (magit-branch-at-point))
- (choice (magit-completing-read
- "Checkout branch" choices
- nil nil nil 'magit-revision-history
- (or (car (member atpoint choices))
- (and atpoint
- (car (member (and (string-match "[^/]+/" atpoint)
- (substring atpoint (match-end 0)))
- choices)))))))
- (cond ((member choice remote)
- (list (and (string-match "[^/]+/" choice)
- (substring choice (match-end 0)))
- choice))
- ((member choice local)
- (list choice))
- (t
- (list choice (magit-read-starting-point "Create" choice))))))
- (if (not start-point)
- (magit-checkout branch)
- (when (magit-anything-modified-p t)
- (user-error "Cannot checkout when there are uncommitted changes"))
- (magit-branch-and-checkout branch start-point)
- (when (magit-remote-branch-p start-point)
- (pcase-let ((`(,remote . ,remote-branch)
- (magit-split-branch-name start-point)))
- (when (and (equal branch remote-branch)
- (not (equal remote (magit-get "remote.pushDefault"))))
- (magit-set remote "branch" branch "pushRemote"))))))
-
-(defun magit-branch-maybe-adjust-upstream (branch start-point)
- (--when-let
- (or (and (magit-get-upstream-branch branch)
- (magit-get-indirect-upstream-branch start-point))
- (and (magit-remote-branch-p start-point)
- (let ((name (cdr (magit-split-branch-name start-point))))
- (car (--first (if (listp (cdr it))
- (not (member name (cdr it)))
- (string-match-p (cdr it) name))
- magit-branch-adjust-remote-upstream-alist)))))
- (magit-call-git "branch" (concat "--set-upstream-to=" it) branch)))
-
-;;;###autoload
-(defun magit-branch-orphan (branch start-point)
- "Create and checkout an orphan BRANCH with contents from revision START-POINT."
- (interactive (magit-branch-read-args "Create and checkout orphan branch"))
- (magit-run-git "checkout" "--orphan" branch start-point))
-
-(defun magit-branch-read-args (prompt &optional default-start)
- (if magit-branch-read-upstream-first
- (let ((choice (magit-read-starting-point prompt nil default-start)))
- (if (magit-rev-verify choice)
- (list (magit-read-string-ns
- (if magit-completing-read--silent-default
- (format "%s (starting at `%s')" prompt choice)
- "Name for new branch")
- (let ((def (mapconcat #'identity
- (cdr (split-string choice "/"))
- "/")))
- (and (member choice (magit-list-remote-branch-names))
- (not (member def (magit-list-local-branch-names)))
- def)))
- choice)
- (if (eq magit-branch-read-upstream-first 'fallback)
- (list choice
- (magit-read-starting-point prompt choice default-start))
- (user-error "Not a valid starting-point: %s" choice))))
- (let ((branch (magit-read-string-ns (concat prompt " named"))))
- (list branch (magit-read-starting-point prompt branch default-start)))))
-
-;;;###autoload
-(defun magit-branch-spinout (branch &optional from)
- "Create new branch from the unpushed commits.
-Like `magit-branch-spinoff' but remain on the current branch.
-If there are any uncommitted changes, then behave exactly like
-`magit-branch-spinoff'."
- (interactive (list (magit-read-string-ns "Spin out branch")
- (car (last (magit-region-values 'commit)))))
- (magit--branch-spinoff branch from nil))
-
-;;;###autoload
-(defun magit-branch-spinoff (branch &optional from)
- "Create new branch from the unpushed commits.
-
-Create and checkout a new branch starting at and tracking the
-current branch. That branch in turn is reset to the last commit
-it shares with its upstream. If the current branch has no
-upstream or no unpushed commits, then the new branch is created
-anyway and the previously current branch is not touched.
-
-This is useful to create a feature branch after work has already
-began on the old branch (likely but not necessarily \"master\").
-
-If the current branch is a member of the value of option
-`magit-branch-prefer-remote-upstream' (which see), then the
-current branch will be used as the starting point as usual, but
-the upstream of the starting-point may be used as the upstream
-of the new branch, instead of the starting-point itself.
-
-If optional FROM is non-nil, then the source branch is reset
-to `FROM~', instead of to the last commit it shares with its
-upstream. Interactively, FROM is only ever non-nil, if the
-region selects some commits, and among those commits, FROM is
-the commit that is the fewest commits ahead of the source
-branch.
-
-The commit at the other end of the selection actually does not
-matter, all commits between FROM and `HEAD' are moved to the new
-branch. If FROM is not reachable from `HEAD' or is reachable
-from the source branch's upstream, then an error is raised."
- (interactive (list (magit-read-string-ns "Spin off branch")
- (car (last (magit-region-values 'commit)))))
- (magit--branch-spinoff branch from t))
-
-(defun magit--branch-spinoff (branch from checkout)
- (when (magit-branch-p branch)
- (user-error "Cannot spin off %s. It already exists" branch))
- (when (and (not checkout)
- (magit-anything-modified-p))
- (message "Staying on HEAD due to uncommitted changes")
- (setq checkout t))
- (if-let ((current (magit-get-current-branch)))
- (let ((tracked (magit-get-upstream-branch current))
- base)
- (when from
- (unless (magit-rev-ancestor-p from current)
- (user-error "Cannot spin off %s. %s is not reachable from %s"
- branch from current))
- (when (and tracked
- (magit-rev-ancestor-p from tracked))
- (user-error "Cannot spin off %s. %s is ancestor of upstream %s"
- branch from tracked)))
- (let ((magit-process-raise-error t))
- (if checkout
- (magit-call-git "checkout" "-b" branch current)
- (magit-call-git "branch" branch current)))
- (--when-let (magit-get-indirect-upstream-branch current)
- (magit-call-git "branch" "--set-upstream-to" it branch))
- (when (and tracked
- (setq base
- (if from
- (concat from "^")
- (magit-git-string "merge-base" current tracked)))
- (not (magit-rev-eq base current)))
- (if checkout
- (magit-call-git "update-ref" "-m"
- (format "reset: moving to %s" base)
- (concat "refs/heads/" current) base)
- (magit-call-git "reset" "--hard" base))))
- (if checkout
- (magit-call-git "checkout" "-b" branch)
- (magit-call-git "branch" branch)))
- (magit-refresh))
-
-;;;###autoload
-(defun magit-branch-reset (branch to &optional set-upstream)
- "Reset a branch to the tip of another branch or any other commit.
-
-When the branch being reset is the current branch, then do a
-hard reset. If there are any uncommitted changes, then the user
-has to confirm the reset because those changes would be lost.
-
-This is useful when you have started work on a feature branch but
-realize it's all crap and want to start over.
-
-When resetting to another branch and a prefix argument is used,
-then also set the target branch as the upstream of the branch
-that is being reset."
- (interactive
- (let* ((atpoint (magit-local-branch-at-point))
- (branch (magit-read-local-branch "Reset branch" atpoint)))
- (list branch
- (magit-completing-read (format "Reset %s to" branch)
- (delete branch (magit-list-branch-names))
- nil nil nil 'magit-revision-history
- (or (and (not (equal branch atpoint)) atpoint)
- (magit-get-upstream-branch branch)))
- current-prefix-arg)))
- (let ((inhibit-magit-refresh t))
- (if (equal branch (magit-get-current-branch))
- (if (and (magit-anything-modified-p)
- (not (yes-or-no-p
- "Uncommitted changes will be lost. Proceed? ")))
- (user-error "Abort")
- (magit-reset-hard to))
- (magit-call-git "update-ref"
- "-m" (format "reset: moving to %s" to)
- (magit-git-string "rev-parse" "--symbolic-full-name"
- branch)
- to))
- (when (and set-upstream (magit-branch-p to))
- (magit-set-upstream-branch branch to)
- (magit-branch-maybe-adjust-upstream branch to)))
- (magit-refresh))
-
-(defvar magit-branch-delete-never-verify nil
- "Whether `magit-branch-delete' always pushes with \"--no-verify\".")
-
-;;;###autoload
-(defun magit-branch-delete (branches &optional force)
- "Delete one or multiple branches.
-If the region marks multiple branches, then offer to delete
-those, otherwise prompt for a single branch to be deleted,
-defaulting to the branch at point."
- ;; One would expect this to be a command as simple as, for example,
- ;; `magit-branch-rename'; but it turns out everyone wants to squeeze
- ;; a bit of extra functionality into this one, including myself.
- (interactive
- (let ((branches (magit-region-values 'branch t))
- (force current-prefix-arg))
- (if (> (length branches) 1)
- (magit-confirm t nil "Delete %i branches" nil branches)
- (setq branches
- (list (magit-read-branch-prefer-other
- (if force "Force delete branch" "Delete branch")))))
- (unless force
- (when-let ((unmerged (-remove #'magit-branch-merged-p branches)))
- (if (magit-confirm 'delete-unmerged-branch
- "Delete unmerged branch %s"
- "Delete %i unmerged branches"
- 'noabort unmerged)
- (setq force branches)
- (or (setq branches (-difference branches unmerged))
- (user-error "Abort")))))
- (list branches force)))
- (let* ((refs (mapcar #'magit-ref-fullname branches))
- (ambiguous (--remove it refs)))
- (when ambiguous
- (user-error
- "%s ambiguous. Please cleanup using git directly."
- (let ((len (length ambiguous)))
- (cond
- ((= len 1)
- (format "%s is" (-first #'magit-ref-ambiguous-p branches)))
- ((= len (length refs))
- (format "These %s names are" len))
- (t
- (format "%s of these names are" len))))))
- (cond
- ((string-match "^refs/remotes/\\([^/]+\\)" (car refs))
- (let* ((remote (match-string 1 (car refs)))
- (offset (1+ (length remote))))
- ;; Assume the branches actually still exists on the remote.
- (magit-run-git-async
- "push"
- (and (or force magit-branch-delete-never-verify) "--no-verify")
- remote
- (--map (concat ":" (substring it offset)) branches))
- ;; If that is not the case, then this deletes the tracking branches.
- (set-process-sentinel
- magit-this-process
- (apply-partially 'magit-delete-remote-branch-sentinel remote refs))))
- ((> (length branches) 1)
- (setq branches (delete (magit-get-current-branch) branches))
- (mapc 'magit-branch-maybe-delete-pr-remote branches)
- (mapc 'magit-branch-unset-pushRemote branches)
- (magit-run-git "branch" (if force "-D" "-d") branches))
- (t ; And now for something completely different.
- (let* ((branch (car branches))
- (prompt (format "Branch %s is checked out. " branch)))
- (when (equal branch (magit-get-current-branch))
- (pcase (if (or (equal branch "master")
- (not (magit-rev-verify "master")))
- (magit-read-char-case prompt nil
- (?d "[d]etach HEAD & delete" 'detach)
- (?a "[a]bort" 'abort))
- (magit-read-char-case prompt nil
- (?d "[d]etach HEAD & delete" 'detach)
- (?c "[c]heckout master & delete" 'master)
- (?a "[a]bort" 'abort)))
- (`detach (unless (or (equal force '(4))
- (member branch force)
- (magit-branch-merged-p branch t))
- (magit-confirm 'delete-unmerged-branch
- "Delete unmerged branch %s" ""
- nil (list branch)))
- (magit-call-git "checkout" "--detach"))
- (`master (unless (or (equal force '(4))
- (member branch force)
- (magit-branch-merged-p branch "master"))
- (magit-confirm 'delete-unmerged-branch
- "Delete unmerged branch %s" ""
- nil (list branch)))
- (magit-call-git "checkout" "master"))
- (`abort (user-error "Abort")))
- (setq force t))
- (magit-branch-maybe-delete-pr-remote branch)
- (magit-branch-unset-pushRemote branch)
- (magit-run-git "branch" (if force "-D" "-d") branch))))))
-
-(put 'magit-branch-delete 'interactive-only t)
-
-(defun magit-branch-maybe-delete-pr-remote (branch)
- (when-let ((remote (magit-get "branch" branch "pullRequestRemote")))
- (let* ((variable (format "remote.%s.fetch" remote))
- (refspecs (magit-get-all variable)))
- (unless (member (format "+refs/heads/*:refs/remotes/%s/*" remote)
- refspecs)
- (let ((refspec
- (if (equal (magit-get "branch" branch "pushRemote") remote)
- (format "+refs/heads/%s:refs/remotes/%s/%s"
- branch remote branch)
- (let ((merge (magit-get "branch" branch "merge")))
- (and merge
- (string-prefix-p "refs/heads/" merge)
- (setq merge (substring merge 11))
- (format "+refs/heads/%s:refs/remotes/%s/%s"
- merge remote merge))))))
- (when (member refspec refspecs)
- (if (and (= (length refspecs) 1)
- (magit-confirm 'delete-pr-remote
- (format "Also delete remote %s (%s)" remote
- "no pull-request branch remains")
- nil t))
- (magit-call-git "remote" "rm" remote)
- (magit-call-git "config" "--unset-all" variable
- (format "^%s$" (regexp-quote refspec))))))))))
-
-(defun magit-branch-unset-pushRemote (branch)
- (magit-set nil "branch" branch "pushRemote"))
-
-(defun magit-delete-remote-branch-sentinel (remote refs process event)
- (when (memq (process-status process) '(exit signal))
- (if (= (process-exit-status process) 1)
- (if-let ((on-remote (--map (concat "refs/remotes/" remote "/" it)
- (magit-remote-list-branches remote)))
- (rest (--filter (and (not (member it on-remote))
- (magit-ref-exists-p it))
- refs)))
- (progn
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (setq magit-this-error nil)
- (message "Some remote branches no longer exist. %s"
- "Deleting just the local tracking refs instead...")
- (dolist (ref rest)
- (magit-call-git "update-ref" "-d" ref))
- (magit-refresh)
- (message "Deleting local remote-tracking refs...done"))
- (magit-process-sentinel process event))
- (magit-process-sentinel process event))))
-
-;;;###autoload
-(defun magit-branch-rename (old new &optional force)
- "Rename the branch named OLD to NEW.
-
-With a prefix argument FORCE, rename even if a branch named NEW
-already exists.
-
-If `branch.OLD.pushRemote' is set, then unset it. Depending on
-the value of `magit-branch-rename-push-target' (which see) maybe
-set `branch.NEW.pushRemote' and maybe rename the push-target on
-the remote."
- (interactive
- (let ((branch (magit-read-local-branch "Rename branch")))
- (list branch
- (magit-read-string-ns (format "Rename branch '%s' to" branch)
- nil 'magit-revision-history)
- current-prefix-arg)))
- (when (string-match "\\`heads/\\(.+\\)" old)
- (setq old (match-string 1 old)))
- (when (equal old new)
- (user-error "Old and new branch names are the same"))
- (magit-call-git "branch" (if force "-M" "-m") old new)
- (when magit-branch-rename-push-target
- (let ((remote (magit-get-push-remote old))
- (old-specific (magit-get "branch" old "pushRemote"))
- (new-specific (magit-get "branch" new "pushRemote")))
- (when (and old-specific (or force (not new-specific)))
- ;; Keep the target setting branch specific, even if that is
- ;; redundant. But if a branch by the same name existed before
- ;; and the rename isn't forced, then do not change a leftover
- ;; setting. Such a leftover setting may or may not conform to
- ;; what we expect here...
- (magit-set old-specific "branch" new "pushRemote"))
- (when (and (equal (magit-get-push-remote new) remote)
- ;; ...and if it does not, then we must abort.
- (not (eq magit-branch-rename-push-target 'local-only))
- (or (not (memq magit-branch-rename-push-target
- '(forge-only github-only)))
- (and (require (quote forge) nil t)
- (fboundp 'forge--forge-remote-p)
- (forge--forge-remote-p remote))))
- (let ((old-target (magit-get-push-branch old t))
- (new-target (magit-get-push-branch new t))
- (remote (magit-get-push-remote new)))
- (when (and old-target
- (not new-target)
- (magit-y-or-n-p (format "Also rename %S to %S on \"%s\""
- old new remote)))
- ;; Rename on (i.e. within) the remote, but only if the
- ;; destination ref doesn't exist yet. If that ref already
- ;; exists, then it probably is of some value and we better
- ;; not touch it. Ignore what the local ref points at,
- ;; i.e. if the local and the remote ref didn't point at
- ;; the same commit before the rename then keep it that way.
- (magit-call-git "push" "-v" remote
- (format "%s:refs/heads/%s" old-target new)
- (format ":refs/heads/%s" old)))))))
- (magit-branch-unset-pushRemote old)
- (magit-refresh))
-
-;;;###autoload
-(defun magit-branch-shelve (branch)
- "Shelve a BRANCH.
-Rename \"refs/heads/BRANCH\" to \"refs/shelved/BRANCH\",
-and also rename the respective reflog file."
- (interactive (list (magit-read-other-local-branch "Shelve branch")))
- (let ((old (concat "refs/heads/" branch))
- (new (concat "refs/shelved/" branch)))
- (magit-git "update-ref" new old "")
- (magit--rename-reflog-file old new)
- (magit-branch-unset-pushRemote branch)
- (magit-run-git "branch" "-D" branch)))
-
-;;;###autoload
-(defun magit-branch-unshelve (branch)
- "Unshelve a BRANCH
-Rename \"refs/shelved/BRANCH\" to \"refs/heads/BRANCH\",
-and also rename the respective reflog file."
- (interactive
- (list (magit-completing-read
- "Unshelve branch"
- (--map (substring it 8)
- (magit-list-refnames "refs/shelved"))
- nil t)))
- (let ((old (concat "refs/shelved/" branch))
- (new (concat "refs/heads/" branch)))
- (magit-git "update-ref" new old "")
- (magit--rename-reflog-file old new)
- (magit-run-git "update-ref" "-d" old)))
-
-(defun magit--rename-reflog-file (old new)
- (let ((old (magit-git-dir (concat "logs/" old)))
- (new (magit-git-dir (concat "logs/" new))))
- (when (file-exists-p old)
- (make-directory (file-name-directory new) t)
- (rename-file old new t))))
-
-;;; Configure
-
-;;;###autoload (autoload 'magit-branch-configure "magit-branch" nil t)
-(transient-define-prefix magit-branch-configure (branch)
- "Configure a branch."
- :man-page "git-branch"
- [:description
- (lambda ()
- (concat
- (propertize "Configure " 'face 'transient-heading)
- (propertize (oref transient--prefix scope) 'face 'magit-branch-local)))
- ("d" magit-branch.<branch>.description)
- ("u" magit-branch.<branch>.merge/remote)
- ("r" magit-branch.<branch>.rebase)
- ("p" magit-branch.<branch>.pushRemote)]
- ["Configure repository defaults"
- ("R" magit-pull.rebase)
- ("P" magit-remote.pushDefault)]
- ["Configure branch creation"
- ("a m" magit-branch.autoSetupMerge)
- ("a r" magit-branch.autoSetupRebase)]
- (interactive
- (list (or (and (not current-prefix-arg)
- (not (and magit-branch-direct-configure
- (eq transient-current-command 'magit-branch)))
- (magit-get-current-branch))
- (magit--read-branch-scope))))
- (transient-setup 'magit-branch-configure nil nil :scope branch))
-
-(defun magit--read-branch-scope (&optional obj)
- (magit-read-local-branch
- (if obj
- (format "Set %s for branch"
- (format (oref obj variable) "<name>"))
- "Configure branch")))
-
-(transient-define-suffix magit-branch.<branch>.description (branch)
- "Edit the description of BRANCH."
- :class 'magit--git-variable
- :transient nil
- :variable "branch.%s.description"
- (interactive (list (oref transient-current-prefix scope)))
- (magit-run-git-with-editor "branch" "--edit-description" branch))
-
-(add-hook 'find-file-hook 'magit-branch-description-check-buffers)
-
-(defun magit-branch-description-check-buffers ()
- (and buffer-file-name
- (string-match-p "/\\(BRANCH\\|EDIT\\)_DESCRIPTION\\'" buffer-file-name)))
-
-(defclass magit--git-branch:upstream (magit--git-variable)
- ((format :initform " %k %m %M\n %r %R")))
-
-(transient-define-infix magit-branch.<branch>.merge/remote ()
- :class 'magit--git-branch:upstream)
-
-(cl-defmethod transient-init-value ((obj magit--git-branch:upstream))
- (when-let ((branch (oref transient--prefix scope))
- (remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge")))
- (oset obj value (list remote merge))))
-
-(cl-defmethod transient-infix-read ((obj magit--git-branch:upstream))
- (if (oref obj value)
- (oset obj value nil)
- (magit-read-upstream-branch (oref transient--prefix scope) "Upstream")))
-
-(cl-defmethod transient-infix-set ((obj magit--git-branch:upstream) refname)
- (magit-set-upstream-branch (oref transient--prefix scope) refname)
- (oset obj value
- (let ((branch (oref transient--prefix scope)))
- (when-let ((r (magit-get "branch" branch "remote"))
- (m (magit-get "branch" branch "merge")))
- (list r m))))
- (magit-refresh))
-
-(cl-defmethod transient-format ((obj magit--git-branch:upstream))
- (let ((branch (oref transient--prefix scope)))
- (format-spec
- (oref obj format)
- `((?k . ,(transient-format-key obj))
- (?r . ,(format "branch.%s.remote" branch))
- (?m . ,(format "branch.%s.merge" branch))
- (?R . ,(transient-format-value obj #'car))
- (?M . ,(transient-format-value obj #'cadr))))))
-
-(cl-defmethod transient-format-value ((obj magit--git-branch:upstream) key)
- (if-let ((value (funcall key (oref obj value))))
- (propertize value 'face 'transient-argument)
- (propertize "unset" 'face 'transient-inactive-argument)))
-
-(transient-define-infix magit-branch.<branch>.rebase ()
- :class 'magit--git-variable:choices
- :scope 'magit--read-branch-scope
- :variable "branch.%s.rebase"
- :fallback "pull.rebase"
- :choices '("true" "false")
- :default "false")
-
-(transient-define-infix magit-branch.<branch>.pushRemote ()
- :class 'magit--git-variable:choices
- :scope 'magit--read-branch-scope
- :variable "branch.%s.pushRemote"
- :fallback "remote.pushDefault"
- :choices 'magit-list-remotes)
-
-(transient-define-infix magit-pull.rebase ()
- :class 'magit--git-variable:choices
- :variable "pull.rebase"
- :choices '("true" "false")
- :default "false")
-
-(transient-define-infix magit-remote.pushDefault ()
- :class 'magit--git-variable:choices
- :variable "remote.pushDefault"
- :choices 'magit-list-remotes)
-
-(transient-define-infix magit-branch.autoSetupMerge ()
- :class 'magit--git-variable:choices
- :variable "branch.autoSetupMerge"
- :choices '("always" "true" "false")
- :default "true")
-
-(transient-define-infix magit-branch.autoSetupRebase ()
- :class 'magit--git-variable:choices
- :variable "branch.autoSetupRebase"
- :choices '("always" "local" "remote" "never")
- :default "never")
-
-;;; _
-(provide 'magit-branch)
-;;; magit-branch.el ends here
diff --git a/elpa/magit-20200728.45/magit-clone.el b/elpa/magit-20200728.45/magit-clone.el
deleted file mode 100644
index 2927a29..0000000
--- a/elpa/magit-20200728.45/magit-clone.el
+++ /dev/null
@@ -1,273 +0,0 @@
-;;; magit-clone.el --- clone a repository -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements clone commands.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-clone-set-remote-head nil
- "Whether cloning creates the symbolic-ref `<remote>/HEAD'."
- :package-version '(magit . "2.4.2")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-clone-set-remote.pushDefault 'ask
- "Whether to set the value of `remote.pushDefault' after cloning.
-
-If t, then set without asking. If nil, then don't set. If
-`ask', then ask."
- :package-version '(magit . "2.4.0")
- :group 'magit-commands
- :type '(choice (const :tag "set" t)
- (const :tag "ask" ask)
- (const :tag "don't set" nil)))
-
-(defcustom magit-clone-default-directory nil
- "Default directory to use when `magit-clone' reads destination.
-If nil (the default), then use the value of `default-directory'.
-If a directory, then use that. If a function, then call that
-with the remote url as only argument and use the returned value."
- :package-version '(magit . "2.90.0")
- :group 'magit-commands
- :type '(choice (const :tag "value of default-directory")
- (directory :tag "constant directory")
- (function :tag "function's value")))
-
-(defcustom magit-clone-always-transient nil
- "Whether `magit-clone' always acts as a transient prefix command.
-If nil, then a prefix argument has to be used to show the transient
-popup instead of invoking the default suffix `magit-clone-regular'
-directly."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-clone-name-alist
- '(("\\`\\(?:github:\\|gh:\\)?\\([^:]+\\)\\'" "github.com" "github.user")
- ("\\`\\(?:gitlab:\\|gl:\\)\\([^:]+\\)\\'" "gitlab.com" "gitlab.user"))
- "Alist mapping repository names to repository urls.
-
-Each element has the form (REGEXP HOSTNAME USER). When the user
-enters a name when a cloning command asks for a name or url, then
-that is looked up in this list. The first element whose REGEXP
-matches is used.
-
-The format specified by option `magit-clone-url-format' is used
-to turn the name into an url, using HOSTNAME and the repository
-name. If the provided name contains a slash, then that is used.
-Otherwise if the name omits the owner of the repository, then the
-default user specified in the matched entry is used.
-
-If USER contains a dot, then it is treated as a Git variable and
-the value of that is used as the username. Otherwise it is used
-as the username itself."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type '(repeat (list regexp
- (string :tag "hostname")
- (string :tag "user name or git variable"))))
-
-(defcustom magit-clone-url-format "git@%h:%n.git"
- "Format used when turning repository names into urls.
-%h is the hostname and %n is the repository name, including
-the name of the owner. Also see `magit-clone-name-alist'."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'regexp)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-clone "magit-clone" nil t)
-(transient-define-prefix magit-clone (&optional transient)
- "Clone a repository."
- :man-page "git-clone"
- ["Fetch arguments"
- ("-B" "Clone a single branch" "--single-branch")
- ("-n" "Do not clone tags" "--no-tags")
- ("-S" "Clones submodules" "--recurse-submodules" :level 6)
- ("-l" "Do not optimize" "--no-local" :level 7)]
- ["Setup arguments"
- ("-o" "Set name of remote" ("-o" "--origin="))
- ("-b" "Set HEAD branch" ("-b" "--branch="))
- ("-g" "Separate git directory" "--separate-git-dir="
- transient-read-directory :level 7)
- ("-t" "Use template directory" "--template="
- transient-read-existing-directory :level 6)]
- ["Local sharing arguments"
- ("-s" "Share objects" ("-s" "--shared" :level 7))
- ("-h" "Do not use hardlinks" "--no-hardlinks")]
- ["Clone"
- ("C" "regular" magit-clone-regular)
- ("s" "shallow" magit-clone-shallow)
- ("d" "shallow since date" magit-clone-shallow-since :level 7)
- ("e" "shallow excluding" magit-clone-shallow-exclude :level 7)
- ("b" "bare" magit-clone-bare)
- ("m" "mirror" magit-clone-mirror)]
- (interactive (list (or magit-clone-always-transient current-prefix-arg)))
- (if transient
- (transient-setup #'magit-clone)
- (call-interactively #'magit-clone-regular)))
-
-;;;###autoload
-(defun magit-clone-regular (repository directory args)
- "Create a clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository."
- (interactive (magit-clone-read-args))
- (magit-clone-internal repository directory args))
-
-;;;###autoload
-(defun magit-clone-shallow (repository directory args depth)
- "Create a shallow clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-With a prefix argument read the DEPTH of the clone;
-otherwise use 1."
- (interactive (append (magit-clone-read-args)
- (list (if current-prefix-arg
- (read-number "Depth: " 1)
- 1))))
- (magit-clone-internal repository directory
- (cons (format "--depth=%s" depth) args)))
-
-;;;###autoload
-(defun magit-clone-shallow-since (repository directory args date)
- "Create a shallow clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-Exclude commits before DATE, which is read from the
-user."
- (interactive (append (magit-clone-read-args)
- (list (transient-read-date "Exclude commits before: "
- nil nil))))
- (magit-clone-internal repository directory
- (cons (format "--shallow-since=%s" date) args)))
-
-;;;###autoload
-(defun magit-clone-shallow-exclude (repository directory args exclude)
- "Create a shallow clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository.
-Exclude commits reachable from EXCLUDE, which is a
-branch or tag read from the user."
- (interactive (append (magit-clone-read-args)
- (list (read-string "Exclude commits reachable from: "))))
- (magit-clone-internal repository directory
- (cons (format "--shallow-exclude=%s" exclude) args)))
-
-;;;###autoload
-(defun magit-clone-bare (repository directory args)
- "Create a bare clone of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository."
- (interactive (magit-clone-read-args))
- (magit-clone-internal repository directory (cons "--bare" args)))
-
-;;;###autoload
-(defun magit-clone-mirror (repository directory args)
- "Create a mirror of REPOSITORY in DIRECTORY.
-Then show the status buffer for the new repository."
- (interactive (magit-clone-read-args))
- (magit-clone-internal repository directory (cons "--mirror" args)))
-
-(defun magit-clone-internal (repository directory args)
- (let* ((checkout (not (memq (car args) '("--bare" "--mirror"))))
- (set-push-default
- (and checkout
- (or (eq magit-clone-set-remote.pushDefault t)
- (and magit-clone-set-remote.pushDefault
- (y-or-n-p "Set `remote.pushDefault' to \"origin\"? "))))))
- (run-hooks 'magit-credential-hook)
- (setq directory (file-name-as-directory (expand-file-name directory)))
- (magit-run-git-async "clone" args "--" repository
- (magit-convert-filename-for-git directory))
- ;; Don't refresh the buffer we're calling from.
- (process-put magit-this-process 'inhibit-refresh t)
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (let ((magit-process-raise-error t))
- (magit-process-sentinel process event)))
- (when (and (eq (process-status process) 'exit)
- (= (process-exit-status process) 0))
- (when checkout
- (let ((default-directory directory))
- (when set-push-default
- (setf (magit-get "remote.pushDefault") "origin"))
- (unless magit-clone-set-remote-head
- (magit-remote-unset-head "origin"))))
- (with-current-buffer (process-get process 'command-buf)
- (magit-status-setup-buffer directory)))))))
-
-(defun magit-clone-read-args ()
- (let ((repo (magit-clone-read-repository)))
- (list repo
- (read-directory-name
- "Clone to: "
- (if (functionp magit-clone-default-directory)
- (funcall magit-clone-default-directory repo)
- magit-clone-default-directory)
- nil nil
- (and (string-match "\\([^/:]+?\\)\\(/?\\.git\\)?$" repo)
- (match-string 1 repo)))
- (transient-args 'magit-clone))))
-
-(defun magit-clone-read-repository ()
- (magit-read-char-case "Clone from " nil
- (?u "[u]rl or name"
- (let ((str (magit-read-string-ns "Clone from url or name")))
- (if (string-match-p "\\(://\\|@\\)" str)
- str
- (magit-clone--name-to-url str))))
- (?p "[p]ath"
- (read-directory-name "Clone repository: "))
- (?l "or [l]ocal url"
- (concat "file://" (read-directory-name "Clone repository: file://")))))
-
-(defun magit-clone--name-to-url (name)
- (or (-some
- (pcase-lambda (`(,re ,host ,user))
- (and (string-match re name)
- (let ((repo (match-string 1 name)))
- (magit-clone--format-url host user repo))))
- magit-clone-name-alist)
- (user-error "Not an url and no matching entry in `%s'"
- 'magit-clone-name-alist)))
-
-(defun magit-clone--format-url (host user repo)
- (format-spec
- magit-clone-url-format
- `((?h . ,host)
- (?n . ,(if (string-match-p "/" repo)
- repo
- (if (string-match-p "\\." user)
- (if-let ((user (magit-get user)))
- (concat user "/" repo)
- (user-error "Set %S or specify owner explicitly" user))
- (concat user "/" repo)))))))
-
-;;; _
-(provide 'magit-clone)
-;;; magit-clone.el ends here
diff --git a/elpa/magit-20200728.45/magit-commit.el b/elpa/magit-20200728.45/magit-commit.el
deleted file mode 100644
index 3a3d81d..0000000
--- a/elpa/magit-20200728.45/magit-commit.el
+++ /dev/null
@@ -1,612 +0,0 @@
-;;; magit-commit.el --- create Git commits -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements commands for creating Git commits. These
-;; commands just initiate the commit, support for writing the commit
-;; messages is implemented in `git-commit.el'.
-
-;;; Code:
-
-(require 'magit)
-(require 'magit-sequence)
-
-(eval-when-compile (require 'epa)) ; for `epa-protocol'
-(eval-when-compile (require 'epg))
-(eval-when-compile (require 'subr-x))
-
-;;; Options
-
-(defcustom magit-commit-ask-to-stage 'verbose
- "Whether to ask to stage all unstaged changes when committing and nothing is staged."
- :package-version '(magit . "2.3.0")
- :group 'magit-commands
- :type '(choice (const :tag "Ask" t)
- (const :tag "Ask showing diff" verbose)
- (const :tag "Stage without confirmation" stage)
- (const :tag "Don't ask" nil)))
-
-(defcustom magit-commit-show-diff t
- "Whether the relevant diff is automatically shown when committing."
- :package-version '(magit . "2.3.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-commit-extend-override-date t
- "Whether using `magit-commit-extend' changes the committer date."
- :package-version '(magit . "2.3.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-commit-reword-override-date t
- "Whether using `magit-commit-reword' changes the committer date."
- :package-version '(magit . "2.3.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-commit-squash-confirm t
- "Whether the commit targeted by squash and fixup has to be confirmed.
-When non-nil then the commit at point (if any) is used as default
-choice, otherwise it has to be confirmed. This option only
-affects `magit-commit-squash' and `magit-commit-fixup'. The
-\"instant\" variants always require confirmation because making
-an error while using those is harder to recover from."
- :package-version '(magit . "2.1.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-post-commit-hook nil
- "Hook run after creating a commit without the user editing a message.
-
-This hook is run by `magit-refresh' if `this-command' is a member
-of `magit-post-stage-hook-commands'. This only includes commands
-named `magit-commit-*' that do *not* require that the user edits
-the commit message in a buffer and then finishes by pressing
-\\<with-editor-mode-map>\\[with-editor-finish].
-
-Also see `git-commit-post-finish-hook'."
- :package-version '(magit . "2.90.0")
- :group 'magit-commands
- :type 'hook)
-
-(defvar magit-post-commit-hook-commands
- '(magit-commit-extend
- magit-commit-fixup
- magit-commit-augment
- magit-commit-instant-fixup
- magit-commit-instant-squash))
-
-;;; Popup
-
-;;;###autoload (autoload 'magit-commit "magit-commit" nil t)
-(transient-define-prefix magit-commit ()
- "Create a new commit or replace an existing commit."
- :info-manual "(magit)Initiating a Commit"
- :man-page "git-commit"
- ["Arguments"
- ("-a" "Stage all modified and deleted files" ("-a" "--all"))
- ("-e" "Allow empty commit" "--allow-empty")
- ("-v" "Show diff of changes to be committed" ("-v" "--verbose"))
- ("-n" "Disable hooks" ("-n" "--no-verify"))
- ("-R" "Claim authorship and reset author date" "--reset-author")
- (magit:--author :description "Override the author")
- (7 "-D" "Override the author date" "--date=" transient-read-date)
- ("-s" "Add Signed-off-by line" ("-s" "--signoff"))
- (5 magit:--gpg-sign)
- (magit-commit:--reuse-message)]
- [["Create"
- ("c" "Commit" magit-commit-create)]
- ["Edit HEAD"
- ("e" "Extend" magit-commit-extend)
- ("w" "Reword" magit-commit-reword)
- ("a" "Amend" magit-commit-amend)
- (6 "n" "Reshelve" magit-commit-reshelve)]
- ["Edit"
- ("f" "Fixup" magit-commit-fixup)
- ("s" "Squash" magit-commit-squash)
- ("A" "Augment" magit-commit-augment)
- (6 "x" "Absorb changes" magit-commit-autofixup)]
- [""
- ("F" "Instant fixup" magit-commit-instant-fixup)
- ("S" "Instant squash" magit-commit-instant-squash)]]
- (interactive)
- (if-let ((buffer (magit-commit-message-buffer)))
- (switch-to-buffer buffer)
- (transient-setup 'magit-commit)))
-
-(defun magit-commit-arguments nil
- (transient-args 'magit-commit))
-
-(transient-define-argument magit:--gpg-sign ()
- :description "Sign using gpg"
- :class 'transient-option
- :shortarg "-S"
- :argument "--gpg-sign="
- :allow-empty t
- :reader 'magit-read-gpg-secret-key)
-
-(defvar magit-gpg-secret-key-hist nil)
-
-(defun magit-read-gpg-secret-key (prompt &optional initial-input history)
- (require 'epa)
- (let* ((keys (mapcar
- (lambda (obj)
- (let ((key (epg-sub-key-id (car (epg-key-sub-key-list obj))))
- (author
- (when-let ((id-obj (car (epg-key-user-id-list obj))))
- (let ((id-str (epg-user-id-string id-obj)))
- (if (stringp id-str)
- id-str
- (epg-decode-dn id-obj))))))
- (propertize key 'display (concat key " " author))))
- (epg-list-keys (epg-make-context epa-protocol) nil t)))
- (choice (completing-read prompt keys nil nil nil
- history nil initial-input)))
- (set-text-properties 0 (length choice) nil choice)
- choice))
-
-(transient-define-argument magit-commit:--reuse-message ()
- :description "Reuse commit message"
- :class 'transient-option
- :shortarg "-C"
- :argument "--reuse-message="
- :reader 'magit-read-reuse-message
- :history-key 'magit-revision-history)
-
-(defun magit-read-reuse-message (prompt &optional default history)
- (magit-completing-read prompt (magit-list-refnames)
- nil nil nil history
- (or default
- (and (magit-rev-verify "ORIG_HEAD")
- "ORIG_HEAD"))))
-
-;;; Commands
-
-;;;###autoload
-(defun magit-commit-create (&optional args)
- "Create a new commit on `HEAD'.
-With a prefix argument, amend to the commit at `HEAD' instead.
-\n(git commit [--amend] ARGS)"
- (interactive (if current-prefix-arg
- (list (cons "--amend" (magit-commit-arguments)))
- (list (magit-commit-arguments))))
- (when (member "--all" args)
- (setq this-command 'magit-commit-all))
- (when (setq args (magit-commit-assert args))
- (let ((default-directory (magit-toplevel)))
- (magit-run-git-with-editor "commit" args))))
-
-;;;###autoload
-(defun magit-commit-amend (&optional args)
- "Amend the last commit.
-\n(git commit --amend ARGS)"
- (interactive (list (magit-commit-arguments)))
- (magit-commit-amend-assert)
- (magit-run-git-with-editor "commit" "--amend" args))
-
-;;;###autoload
-(defun magit-commit-extend (&optional args override-date)
- "Amend the last commit, without editing the message.
-
-With a prefix argument keep the committer date, otherwise change
-it. The option `magit-commit-extend-override-date' can be used
-to inverse the meaning of the prefix argument. \n(git commit
---amend --no-edit)"
- (interactive (list (magit-commit-arguments)
- (if current-prefix-arg
- (not magit-commit-extend-override-date)
- magit-commit-extend-override-date)))
- (when (setq args (magit-commit-assert args (not override-date)))
- (magit-commit-amend-assert)
- (let ((process-environment process-environment))
- (unless override-date
- (push (magit-rev-format "GIT_COMMITTER_DATE=%cD") process-environment))
- (magit-run-git-with-editor "commit" "--amend" "--no-edit" args))))
-
-;;;###autoload
-(defun magit-commit-reword (&optional args override-date)
- "Reword the last commit, ignoring staged changes.
-
-With a prefix argument keep the committer date, otherwise change
-it. The option `magit-commit-reword-override-date' can be used
-to inverse the meaning of the prefix argument.
-
-Non-interactively respect the optional OVERRIDE-DATE argument
-and ignore the option.
-\n(git commit --amend --only)"
- (interactive (list (magit-commit-arguments)
- (if current-prefix-arg
- (not magit-commit-reword-override-date)
- magit-commit-reword-override-date)))
- (magit-commit-amend-assert)
- (let ((process-environment process-environment))
- (unless override-date
- (push (magit-rev-format "GIT_COMMITTER_DATE=%cD") process-environment))
- (cl-pushnew "--allow-empty" args :test #'equal)
- (magit-run-git-with-editor "commit" "--amend" "--only" args)))
-
-;;;###autoload
-(defun magit-commit-fixup (&optional commit args)
- "Create a fixup commit.
-
-With a prefix argument the target COMMIT has to be confirmed.
-Otherwise the commit at point may be used without confirmation
-depending on the value of option `magit-commit-squash-confirm'."
- (interactive (list (magit-commit-at-point)
- (magit-commit-arguments)))
- (magit-commit-squash-internal "--fixup" commit args))
-
-;;;###autoload
-(defun magit-commit-squash (&optional commit args)
- "Create a squash commit, without editing the squash message.
-
-With a prefix argument the target COMMIT has to be confirmed.
-Otherwise the commit at point may be used without confirmation
-depending on the value of option `magit-commit-squash-confirm'."
- (interactive (list (magit-commit-at-point)
- (magit-commit-arguments)))
- (magit-commit-squash-internal "--squash" commit args))
-
-;;;###autoload
-(defun magit-commit-augment (&optional commit args)
- "Create a squash commit, editing the squash message.
-
-With a prefix argument the target COMMIT has to be confirmed.
-Otherwise the commit at point may be used without confirmation
-depending on the value of option `magit-commit-squash-confirm'."
- (interactive (list (magit-commit-at-point)
- (magit-commit-arguments)))
- (magit-commit-squash-internal "--squash" commit args nil t))
-
-;;;###autoload
-(defun magit-commit-instant-fixup (&optional commit args)
- "Create a fixup commit targeting COMMIT and instantly rebase."
- (interactive (list (magit-commit-at-point)
- (magit-commit-arguments)))
- (magit-commit-squash-internal "--fixup" commit args t))
-
-;;;###autoload
-(defun magit-commit-instant-squash (&optional commit args)
- "Create a squash commit targeting COMMIT and instantly rebase."
- (interactive (list (magit-commit-at-point)
- (magit-commit-arguments)))
- (magit-commit-squash-internal "--squash" commit args t))
-
-(defun magit-commit-squash-internal
- (option commit &optional args rebase edit confirmed)
- (when-let ((args (magit-commit-assert args t)))
- (when commit
- (when (and rebase (not (magit-rev-ancestor-p commit "HEAD")))
- (magit-read-char-case
- (format "%s isn't an ancestor of HEAD. " commit) nil
- (?c "[c]reate without rebasing" (setq rebase nil))
- (?s "[s]elect other" (setq commit nil))
- (?a "[a]bort" (user-error "Quit")))))
- (when commit
- (setq commit (magit-rebase-interactive-assert commit t)))
- (if (and commit
- (or confirmed
- (not (or rebase
- current-prefix-arg
- magit-commit-squash-confirm))))
- (let ((magit-commit-show-diff nil))
- (push (concat option "=" commit) args)
- (unless edit
- (push "--no-edit" args))
- (if rebase
- (magit-with-editor
- (magit-call-git
- "commit" "--no-gpg-sign"
- (-remove-first
- (apply-partially #'string-match-p "\\`--gpg-sign=")
- args)))
- (magit-run-git-with-editor "commit" args))
- t) ; The commit was created; used by below lambda.
- (magit-log-select
- (lambda (commit)
- (when (and (magit-commit-squash-internal option commit args
- rebase edit t)
- rebase)
- (magit-commit-amend-assert commit)
- (magit-rebase-interactive-1 commit
- (list "--autosquash" "--autostash" "--keep-empty")
- "" "true" nil t)))
- (format "Type %%p on a commit to %s into it,"
- (substring option 2))
- nil nil nil commit)
- (when magit-commit-show-diff
- (let ((magit-display-buffer-noselect t))
- (apply #'magit-diff-staged nil (magit-diff-arguments)))))))
-
-(defun magit-commit-amend-assert (&optional commit)
- (--when-let (magit-list-publishing-branches commit)
- (let ((m1 "This commit has already been published to ")
- (m2 ".\nDo you really want to modify it"))
- (magit-confirm 'amend-published
- (concat m1 "%s" m2)
- (concat m1 "%i public branches" m2)
- nil it))))
-
-(defun magit-commit-assert (args &optional strict)
- (cond
- ((or (magit-anything-staged-p)
- (and (magit-anything-unstaged-p)
- ;; ^ Everything of nothing is still nothing.
- (member "--all" args))
- (and (not strict)
- ;; ^ For amend variants that don't make sense otherwise.
- (or (member "--amend" args)
- (member "--allow-empty" args))))
- (or args (list "--")))
- ((and (magit-rebase-in-progress-p)
- (not (magit-anything-unstaged-p))
- (y-or-n-p "Nothing staged. Continue in-progress rebase? "))
- (setq this-command 'magit-rebase-continue)
- (magit-run-git-sequencer "rebase" "--continue")
- nil)
- ((and (file-exists-p (magit-git-dir "MERGE_MSG"))
- (not (magit-anything-unstaged-p)))
- (or args (list "--")))
- ((not (magit-anything-unstaged-p))
- (user-error "Nothing staged (or unstaged)"))
- (magit-commit-ask-to-stage
- (when (eq magit-commit-ask-to-stage 'verbose)
- (magit-diff-unstaged))
- (prog1 (when (or (eq magit-commit-ask-to-stage 'stage)
- (y-or-n-p "Nothing staged. Stage and commit all unstaged changes? "))
- (magit-run-git "add" "-u" ".")
- (or args (list "--")))
- (when (and (eq magit-commit-ask-to-stage 'verbose)
- (derived-mode-p 'magit-diff-mode))
- (magit-mode-bury-buffer))))
- (t
- (user-error "Nothing staged"))))
-
-(defvar magit--reshelve-history nil)
-
-;;;###autoload
-(defun magit-commit-reshelve (date)
- "Change the committer date and possibly the author date of `HEAD'.
-
-If you are the author of `HEAD', then both dates are changed,
-otherwise only the committer date. The current time is used
-as the initial minibuffer input and the original author (if
-that is you) or committer date is available as the previous
-history element."
- (interactive
- (let ((author-p (magit-rev-author-p "HEAD")))
- (push (magit-rev-format (if author-p "%ad" "%cd") "HEAD"
- (concat "--date=format:%F %T %z"))
- magit--reshelve-history)
- (list (read-string (if author-p
- "Change author and committer dates to: "
- "Change committer date to: ")
- (cons (format-time-string "%F %T %z") 17)
- 'magit--reshelve-history))))
- (let ((process-environment process-environment))
- (push (concat "GIT_COMMITTER_DATE=" date) process-environment)
- (magit-run-git "commit" "--amend" "--no-edit"
- (and (magit-rev-author-p "HEAD")
- (concat "--date=" date)))))
-
-;;;###autoload (autoload 'magit-commit-absorb "magit-commit" nil t)
-(transient-define-prefix magit-commit-absorb (phase commit args)
- "Spread staged changes across recent commits.
-With a prefix argument use a transient command to select infix
-arguments. This command requires git-absorb executable, which
-is available from https://github.com/tummychow/git-absorb.
-See `magit-commit-autofixup' for an alternative implementation."
- ["Arguments"
- ("-f" "Skip safety checks" ("-f" "--force"))
- ("-v" "Display more output" ("-v" "--verbose"))]
- ["Actions"
- ("x" "Absorb" magit-commit-absorb)]
- (interactive (if current-prefix-arg
- (list 'transient nil nil)
- (list 'select
- (magit-get-upstream-branch)
- (transient-args 'magit-commit-absorb))))
- (if (eq phase 'transient)
- (transient-setup 'magit-commit-absorb)
- (unless (executable-find "git-absorb")
- (user-error "This command requires the git-absorb executable, which %s"
- "is available from https://github.com/tummychow/git-absorb"))
- (unless (magit-anything-staged-p)
- (if (magit-anything-unstaged-p)
- (if (y-or-n-p "Nothing staged. Absorb all unstaged changes? ")
- (magit-with-toplevel
- (magit-run-git "add" "-u" "."))
- (user-error "Abort"))
- (user-error "There are no changes that could be absorbed")))
- (when commit
- (setq commit (magit-rebase-interactive-assert commit t)))
- (if (and commit (eq phase 'run))
- (progn (magit-run-git-async "absorb" "-v" args "-b" commit) t)
- (magit-log-select
- (lambda (commit)
- (with-no-warnings ; about non-interactive use
- (magit-commit-absorb 'run commit args)))
- nil nil nil nil commit))))
-
-;;;###autoload (autoload 'magit-commit-autofixup "magit-commit" nil t)
-(transient-define-prefix magit-commit-autofixup (phase commit args)
- "Spread unstaged changes across recent commits.
-With a prefix argument use a transient command to select infix
-arguments. This command requires the git-autofixup script, which
-is available from https://github.com/torbiak/git-autofixup.
-See `magit-commit-absorb' for an alternative implementation."
- ["Arguments"
- (magit-autofixup:--context)
- (magit-autofixup:--strict)]
- ["Actions"
- ("x" "Absorb" magit-commit-autofixup)]
- (interactive (if current-prefix-arg
- (list 'transient nil nil)
- (list 'select
- (magit-get-upstream-branch)
- (transient-args 'magit-commit-autofixup))))
- (if (eq phase 'transient)
- (transient-setup 'magit-commit-autofixup)
- (unless (executable-find "git-autofixup")
- (user-error "This command requires the git-autofixup script, which %s"
- "is available from https://github.com/torbiak/git-autofixup"))
- (when (magit-anything-staged-p)
- (user-error "Cannot absorb when there are staged changes"))
- (unless (magit-anything-unstaged-p)
- (user-error "There are no unstaged changes that could be absorbed"))
- (when commit
- (setq commit (magit-rebase-interactive-assert commit t)))
- (if (and commit (eq phase 'run))
- (progn (magit-run-git-async "autofixup" "-vv" args commit) t)
- (magit-log-select
- (lambda (commit)
- (with-no-warnings ; about non-interactive use
- (magit-commit-autofixup 'run commit args)))
- nil nil nil nil commit))))
-
-(transient-define-argument magit-autofixup:--context ()
- :description "Diff context lines"
- :class 'transient-option
- :shortarg "-c"
- :argument "--context="
- :reader 'transient-read-number-N0)
-
-(transient-define-argument magit-autofixup:--strict ()
- :description "Strictness"
- :class 'transient-option
- :shortarg "-s"
- :argument "--strict="
- :reader 'transient-read-number-N0)
-
-;;; Pending Diff
-
-(defun magit-commit-diff ()
- (when (and git-commit-mode magit-commit-show-diff)
- (when-let ((diff-buffer (magit-get-mode-buffer 'magit-diff-mode)))
- ;; This window just started displaying the commit message
- ;; buffer. Without this that buffer would immediately be
- ;; replaced with the diff buffer. See #2632.
- (unrecord-window-buffer nil diff-buffer))
- (condition-case nil
- (let ((args (car (magit-diff-arguments)))
- (magit-inhibit-save-previous-winconf 'unset)
- (magit-display-buffer-noselect t)
- (inhibit-quit nil)
- (display-buffer-overriding-action '(nil (inhibit-same-window t))))
- (message "Diffing changes to be committed (C-g to abort diffing)")
- (cl-case last-command
- (magit-commit
- (magit-diff-staged nil args))
- (magit-commit-all
- (magit-diff-working-tree nil args))
- ((magit-commit-amend
- magit-commit-reword
- magit-rebase-reword-commit)
- (magit-diff-while-amending args))
- (t (if (magit-anything-staged-p)
- (magit-diff-staged nil args)
- (magit-diff-while-amending args)))))
- (quit))))
-
-;; Mention `magit-diff-while-committing' because that's
-;; always what I search for when I try to find this line.
-(add-hook 'server-switch-hook 'magit-commit-diff)
-(add-hook 'with-editor-filter-visit-hook 'magit-commit-diff)
-
-(add-to-list 'with-editor-server-window-alist
- (cons git-commit-filename-regexp 'switch-to-buffer))
-
-;;; Message Utilities
-
-(defun magit-commit-message-buffer ()
- (let* ((find-file-visit-truename t) ; git uses truename of COMMIT_EDITMSG
- (topdir (magit-toplevel)))
- (--first (equal topdir (with-current-buffer it
- (and git-commit-mode (magit-toplevel))))
- (append (buffer-list (selected-frame))
- (buffer-list)))))
-
-(defvar magit-commit-add-log-insert-function 'magit-commit-add-log-insert
- "Used by `magit-commit-add-log' to insert a single entry.")
-
-(defun magit-commit-add-log ()
- "Add a stub for the current change into the commit message buffer.
-If no commit is in progress, then initiate it. Use the function
-specified by variable `magit-commit-add-log-insert-function' to
-actually insert the entry."
- (interactive)
- (pcase-let* ((hunk (and (magit-section-match 'hunk)
- (magit-current-section)))
- (log (magit-commit-message-buffer))
- (`(,buf ,pos) (magit-diff-visit-file--noselect)))
- (unless log
- (unless (magit-commit-assert nil)
- (user-error "Abort"))
- (magit-commit-create)
- (while (not (setq log (magit-commit-message-buffer)))
- (sit-for 0.01)))
- (magit--with-temp-position buf pos
- (funcall magit-commit-add-log-insert-function log
- (magit-file-relative-name)
- (and hunk (add-log-current-defun))))))
-
-(defun magit-commit-add-log-insert (buffer file defun)
- (with-current-buffer buffer
- (undo-boundary)
- (goto-char (point-max))
- (while (re-search-backward (concat "^" comment-start) nil t))
- (save-restriction
- (narrow-to-region (point-min) (point))
- (cond ((re-search-backward (format "* %s\\(?: (\\([^)]+\\))\\)?: " file)
- nil t)
- (when (equal (match-string 1) defun)
- (setq defun nil))
- (re-search-forward ": "))
- (t
- (when (re-search-backward "^[\\*(].+\n" nil t)
- (goto-char (match-end 0)))
- (while (re-search-forward "^[^\\*\n].*\n" nil t))
- (if defun
- (progn (insert (format "* %s (%s): \n" file defun))
- (setq defun nil))
- (insert (format "* %s: \n" file)))
- (backward-char)
- (unless (looking-at "\n[\n\\']")
- (insert ?\n)
- (backward-char))))
- (when defun
- (forward-line)
- (let ((limit (save-excursion
- (and (re-search-forward "^\\*" nil t)
- (point)))))
- (unless (or (looking-back (format "(%s): " defun)
- (line-beginning-position))
- (re-search-forward (format "^(%s): " defun) limit t))
- (while (re-search-forward "^[^\\*\n].*\n" limit t))
- (insert (format "(%s): \n" defun))
- (backward-char)))))))
-
-;;; _
-(provide 'magit-commit)
-;;; magit-commit.el ends here
diff --git a/elpa/magit-20200728.45/magit-core.el b/elpa/magit-20200728.45/magit-core.el
deleted file mode 100644
index 900f2c5..0000000
--- a/elpa/magit-20200728.45/magit-core.el
+++ /dev/null
@@ -1,128 +0,0 @@
-;;; magit-core.el --- core functionality -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library requires several other libraries, so that yet other
-;; libraries can just require this one, instead of having to require
-;; all the other ones. In other words this separates the low-level
-;; stuff from the rest. It also defines some Custom groups.
-
-;;; Code:
-
-(require 'magit-utils)
-(require 'magit-section)
-(require 'magit-git)
-(require 'magit-mode)
-(require 'magit-margin)
-(require 'magit-process)
-(require 'magit-transient)
-(require 'magit-autorevert)
-
-(when (magit--libgit-available-p)
- (condition-case err
- (require 'magit-libgit)
- (error
- (setq magit-inhibit-libgit 'error)
- (message "Error while loading `magit-libgit': %S" err)
- (message "That is not fatal. The `libegit2' module just won't be used."))))
-
-(defgroup magit nil
- "Controlling Git from Emacs."
- :link '(url-link "https://magit.vc")
- :link '(info-link "(magit)FAQ")
- :link '(info-link "(magit)")
- :group 'tools)
-
-(defgroup magit-essentials nil
- "Options that every Magit user should briefly think about.
-
-Each of these options falls into one or more of these categories:
-
-* Options that affect Magit's behavior in fundamental ways.
-* Options that affect safety.
-* Options that affect performance.
-* Options that are of a personal nature."
- :link '(info-link "(magit)Essential Settings")
- :group 'magit)
-
-(defgroup magit-miscellaneous nil
- "Miscellaneous Magit options."
- :group 'magit)
-
-(defgroup magit-commands nil
- "Options controlling behavior of certain commands."
- :group 'magit)
-
-(defgroup magit-modes nil
- "Modes used or provided by Magit."
- :group 'magit)
-
-(defgroup magit-buffers nil
- "Options concerning Magit buffers."
- :link '(info-link "(magit)Modes and Buffers")
- :group 'magit)
-
-(defgroup magit-refresh nil
- "Options controlling how Magit buffers are refreshed."
- :link '(info-link "(magit)Automatic Refreshing of Magit Buffers")
- :group 'magit
- :group 'magit-buffers)
-
-(defgroup magit-faces nil
- "Faces used by Magit."
- :group 'magit
- :group 'faces)
-
-(defgroup magit-extensions nil
- "Extensions to Magit."
- :group 'magit)
-
-(custom-add-to-group 'magit-modes 'git-commit 'custom-group)
-(custom-add-to-group 'magit-faces 'git-commit-faces 'custom-group)
-(custom-add-to-group 'magit-modes 'git-rebase 'custom-group)
-(custom-add-to-group 'magit-faces 'git-rebase-faces 'custom-group)
-(custom-add-to-group 'magit 'magit-section 'custom-group)
-(custom-add-to-group 'magit-faces 'magit-section-faces 'custom-group)
-(custom-add-to-group 'magit-process 'with-editor 'custom-group)
-
-(defgroup magit-related nil
- "Options that are relevant to Magit but that are defined elsewhere."
- :link '(custom-group-link vc)
- :link '(custom-group-link smerge)
- :link '(custom-group-link ediff)
- :link '(custom-group-link auto-revert)
- :group 'magit
- :group 'magit-extensions
- :group 'magit-essentials)
-
-(custom-add-to-group 'magit-related 'auto-revert-check-vc-info 'custom-variable)
-(custom-add-to-group 'magit-auto-revert 'auto-revert-check-vc-info 'custom-variable)
-
-(custom-add-to-group 'magit-related 'ediff-window-setup-function 'custom-variable)
-(custom-add-to-group 'magit-related 'smerge-refine-ignore-whitespace 'custom-variable)
-(custom-add-to-group 'magit-related 'vc-follow-symlinks 'custom-variable)
-
-;;; _
-(provide 'magit-core)
-;;; magit-core.el ends here
diff --git a/elpa/magit-20200728.45/magit-diff.el b/elpa/magit-20200728.45/magit-diff.el
deleted file mode 100644
index 07e08e6..0000000
--- a/elpa/magit-20200728.45/magit-diff.el
+++ /dev/null
@@ -1,3287 +0,0 @@
-;;; magit-diff.el --- inspect Git diffs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for looking at Git diffs and
-;; commits.
-
-;;; Code:
-
-(eval-when-compile
- (require 'ansi-color)
- (require 'subr-x))
-
-(require 'git-commit)
-(require 'magit-core)
-
-;; For `magit-diff-popup'
-(declare-function magit-stash-show "magit-stash" (stash &optional args files))
-;; For `magit-diff-visit-file'
-(declare-function dired-jump "dired-x" (&optional other-window file-name))
-(declare-function magit-find-file-noselect "magit-files" (rev file))
-(declare-function magit-status-setup-buffer "magit-status" (directory))
-;; For `magit-diff-while-committing'
-(declare-function magit-commit-message-buffer "magit-commit" ())
-;; For `magit-insert-revision-gravatar'
-(defvar gravatar-size)
-;; For `magit-show-commit' and `magit-diff-show-or-scroll'
-(declare-function magit-current-blame-chunk "magit-blame" ())
-(declare-function magit-blame-mode "magit-blame" (&optional arg))
-(defvar magit-blame-mode)
-;; For `magit-diff-show-or-scroll'
-(declare-function git-rebase-current-line "git-rebase" ())
-;; For `magit-diff-unmerged'
-(declare-function magit-merge-in-progress-p "magit-merge" ())
-(declare-function magit--merge-range "magit-merge" (&optional head))
-;; For `magit-diff--dwim'
-(declare-function forge--pullreq-range "forge-pullreq"
- (pullreq &optional endpoints))
-(declare-function forge--pullreq-ref "forge-pullreq" (pullreq))
-;; For `magit-diff-wash-diff'
-(declare-function ansi-color-apply-on-region "ansi-color" (begin end))
-
-(eval-when-compile
- (cl-pushnew 'orig-rev eieio--known-slot-names)
- (cl-pushnew 'action-type eieio--known-slot-names)
- (cl-pushnew 'target eieio--known-slot-names))
-
-(require 'diff-mode)
-(require 'smerge-mode)
-
-;;; Options
-;;;; Diff Mode
-
-(defgroup magit-diff nil
- "Inspect and manipulate Git diffs."
- :link '(info-link "(magit)Diffing")
- :group 'magit-modes)
-
-(defcustom magit-diff-mode-hook nil
- "Hook run after entering Magit-Diff mode."
- :group 'magit-diff
- :type 'hook)
-
-(defcustom magit-diff-sections-hook
- '(magit-insert-diff
- magit-insert-xref-buttons)
- "Hook run to insert sections into a `magit-diff-mode' buffer."
- :package-version '(magit . "2.3.0")
- :group 'magit-diff
- :type 'hook)
-
-(defcustom magit-diff-expansion-threshold 60
- "After how many seconds not to expand anymore diffs.
-
-Except in status buffers, diffs are usually start out fully
-expanded. Because that can take a long time, all diffs that
-haven't been fontified during a refresh before the threshold
-defined here are instead displayed with their bodies collapsed.
-
-Note that this can cause sections that were previously expanded
-to be collapsed. So you should not pick a very low value here.
-
-The hook function `magit-diff-expansion-threshold' has to be a
-member of `magit-section-set-visibility-hook' for this option
-to have any effect."
- :package-version '(magit . "2.9.0")
- :group 'magit-diff
- :type 'float)
-
-(defcustom magit-diff-highlight-hunk-body t
- "Whether to highlight bodies of selected hunk sections.
-This only has an effect if `magit-diff-highlight' is a
-member of `magit-section-highlight-hook', which see."
- :package-version '(magit . "2.1.0")
- :group 'magit-diff
- :type 'boolean)
-
-(defcustom magit-diff-highlight-hunk-region-functions
- '(magit-diff-highlight-hunk-region-dim-outside
- magit-diff-highlight-hunk-region-using-overlays)
- "The functions used to highlight the hunk-internal region.
-
-`magit-diff-highlight-hunk-region-dim-outside' overlays the outside
-of the hunk internal selection with a face that causes the added and
-removed lines to have the same background color as context lines.
-This function should not be removed from the value of this option.
-
-`magit-diff-highlight-hunk-region-using-overlays' and
-`magit-diff-highlight-hunk-region-using-underline' emphasize the
-region by placing delimiting horizontal lines before and after it.
-The underline variant was implemented because Eli said that is
-how we should do it. However the overlay variant actually works
-better. Also see https://github.com/magit/magit/issues/2758.
-
-Instead of, or in addition to, using delimiting horizontal lines,
-to emphasize the boundaries, you may which to emphasize the text
-itself, using `magit-diff-highlight-hunk-region-using-face'.
-
-In terminal frames it's not possible to draw lines as the overlay
-and underline variants normally do, so there they fall back to
-calling the face function instead."
- :package-version '(magit . "2.9.0")
- :set-after '(magit-diff-show-lines-boundaries)
- :group 'magit-diff
- :type 'hook
- :options '(magit-diff-highlight-hunk-region-dim-outside
- magit-diff-highlight-hunk-region-using-underline
- magit-diff-highlight-hunk-region-using-overlays
- magit-diff-highlight-hunk-region-using-face))
-
-(defcustom magit-diff-unmarked-lines-keep-foreground t
- "Whether `magit-diff-highlight-hunk-region-dim-outside' preserves foreground.
-When this is set to nil, then that function only adjusts the
-foreground color but added and removed lines outside the region
-keep their distinct foreground colors."
- :package-version '(magit . "2.9.0")
- :group 'magit-diff
- :type 'boolean)
-
-(defcustom magit-diff-refine-hunk nil
- "Whether to show word-granularity differences within diff hunks.
-
-nil Never show fine differences.
-t Show fine differences for the current diff hunk only.
-`all' Show fine differences for all displayed diff hunks."
- :group 'magit-diff
- :safe (lambda (val) (memq val '(nil t all)))
- :type '(choice (const :tag "Never" nil)
- (const :tag "Current" t)
- (const :tag "All" all)))
-
-(defcustom magit-diff-refine-ignore-whitespace smerge-refine-ignore-whitespace
- "Whether to ignore whitespace changes in word-granularity differences."
- :package-version '(magit . "3.0.0")
- :set-after '(smerge-refine-ignore-whitespace)
- :group 'magit-diff
- :safe 'booleanp
- :type 'boolean)
-
-(put 'magit-diff-refine-hunk 'permanent-local t)
-
-(defcustom magit-diff-adjust-tab-width nil
- "Whether to adjust the width of tabs in diffs.
-
-Determining the correct width can be expensive if it requires
-opening large and/or many files, so the widths are cached in
-the variable `magit-diff--tab-width-cache'. Set that to nil
-to invalidate the cache.
-
-nil Never adjust tab width. Use `tab-width's value from
- the Magit buffer itself instead.
-
-t If the corresponding file-visiting buffer exits, then
- use `tab-width's value from that buffer. Doing this is
- cheap, so this value is used even if a corresponding
- cache entry exists.
-
-`always' If there is no such buffer, then temporarily visit the
- file to determine the value.
-
-NUMBER Like `always', but don't visit files larger than NUMBER
- bytes."
- :package-version '(magit . "2.12.0")
- :group 'magit-diff
- :type '(choice (const :tag "Never" nil)
- (const :tag "If file-visiting buffer exists" t)
- (integer :tag "If file isn't larger than N bytes")
- (const :tag "Always" always)))
-
-(defcustom magit-diff-paint-whitespace t
- "Specify where to highlight whitespace errors.
-
-nil Never highlight whitespace errors.
-t Highlight whitespace errors everywhere.
-`uncommitted' Only highlight whitespace errors in diffs
- showing uncommitted changes.
-
-For backward compatibility `status' is treated as a synonym
-for `uncommitted'.
-
-The option `magit-diff-paint-whitespace-lines' controls for
-what lines (added/remove/context) errors are highlighted.
-
-The options `magit-diff-highlight-trailing' and
-`magit-diff-highlight-indentation' control what kind of
-whitespace errors are highlighted."
- :group 'magit-diff
- :safe (lambda (val) (memq val '(t nil uncommitted status)))
- :type '(choice (const :tag "In all diffs" t)
- (const :tag "Only in uncommitted changes" uncommitted)
- (const :tag "Never" nil)))
-
-(defcustom magit-diff-paint-whitespace-lines t
- "Specify in what kind of lines to highlight whitespace errors.
-
-t Highlight only in added lines.
-`both' Highlight in added and removed lines.
-`all' Highlight in added, removed and context lines."
- :package-version '(magit . "3.0.0")
- :group 'magit-diff
- :safe (lambda (val) (memq val '(t both all)))
- :type '(choice (const :tag "in added lines" t)
- (const :tag "in added and removed lines" both)
- (const :tag "in added, removed and context lines" all)))
-
-(defcustom magit-diff-highlight-trailing t
- "Whether to highlight whitespace at the end of a line in diffs.
-Used only when `magit-diff-paint-whitespace' is non-nil."
- :group 'magit-diff
- :safe 'booleanp
- :type 'boolean)
-
-(defcustom magit-diff-highlight-indentation nil
- "Highlight the \"wrong\" indentation style.
-Used only when `magit-diff-paint-whitespace' is non-nil.
-
-The value is an alist of the form ((REGEXP . INDENT)...). The
-path to the current repository is matched against each element
-in reverse order. Therefore if a REGEXP matches, then earlier
-elements are not tried.
-
-If the used INDENT is `tabs', highlight indentation with tabs.
-If INDENT is an integer, highlight indentation with at least
-that many spaces. Otherwise, highlight neither."
- :group 'magit-diff
- :type `(repeat (cons (string :tag "Directory regexp")
- (choice (const :tag "Tabs" tabs)
- (integer :tag "Spaces" :value ,tab-width)
- (const :tag "Neither" nil)))))
-
-(defcustom magit-diff-hide-trailing-cr-characters
- (and (memq system-type '(ms-dos windows-nt)) t)
- "Whether to hide ^M characters at the end of a line in diffs."
- :package-version '(magit . "2.6.0")
- :group 'magit-diff
- :type 'boolean)
-
-(defcustom magit-diff-highlight-keywords t
- "Whether to highlight bracketed keywords in commit messages."
- :package-version '(magit . "2.12.0")
- :group 'magit-diff
- :type 'boolean)
-
-;;;; File Diff
-
-(defcustom magit-diff-buffer-file-locked t
- "Whether `magit-diff-buffer-file' uses a dedicated buffer."
- :package-version '(magit . "2.7.0")
- :group 'magit-commands
- :group 'magit-diff
- :type 'boolean)
-
-;;;; Revision Mode
-
-(defgroup magit-revision nil
- "Inspect and manipulate Git commits."
- :link '(info-link "(magit)Revision Buffer")
- :group 'magit-modes)
-
-(defcustom magit-revision-mode-hook '(bug-reference-mode)
- "Hook run after entering Magit-Revision mode."
- :group 'magit-revision
- :type 'hook
- :options '(bug-reference-mode))
-
-(defcustom magit-revision-sections-hook
- '(magit-insert-revision-tag
- magit-insert-revision-headers
- magit-insert-revision-message
- magit-insert-revision-notes
- magit-insert-revision-diff
- magit-insert-xref-buttons)
- "Hook run to insert sections into a `magit-revision-mode' buffer."
- :package-version '(magit . "2.3.0")
- :group 'magit-revision
- :type 'hook)
-
-(defcustom magit-revision-headers-format "\
-Author: %aN <%aE>
-AuthorDate: %ad
-Commit: %cN <%cE>
-CommitDate: %cd
-"
- "Format string used to insert headers in revision buffers.
-
-All headers in revision buffers are inserted by the section
-inserter `magit-insert-revision-headers'. Some of the headers
-are created by calling `git show --format=FORMAT' where FORMAT
-is the format specified here. Other headers are hard coded or
-subject to option `magit-revision-insert-related-refs'."
- :package-version '(magit . "2.3.0")
- :group 'magit-revision
- :type 'string)
-
-(defcustom magit-revision-insert-related-refs t
- "Whether to show related branches in revision buffers
-
-`nil' Don't show any related branches.
-`t' Show related local branches.
-`all' Show related local and remote branches.
-`mixed' Show all containing branches and local merged branches."
- :package-version '(magit . "2.1.0")
- :group 'magit-revision
- :type '(choice (const :tag "don't" nil)
- (const :tag "local only" t)
- (const :tag "all related" all)
- (const :tag "all containing, local merged" mixed)))
-
-(defcustom magit-revision-use-hash-sections 'quicker
- "Whether to turn hashes inside the commit message into sections.
-
-If non-nil, then hashes inside the commit message are turned into
-`commit' sections. There is a trade off to be made between
-performance and reliability:
-
-- `slow' calls git for every word to be absolutely sure.
-- `quick' skips words less than seven characters long.
-- `quicker' additionally skips words that don't contain a number.
-- `quickest' uses all words that are at least seven characters
- long and which contain at least one number as well as at least
- one letter.
-
-If nil, then no hashes are turned into sections, but you can
-still visit the commit at point using \"RET\"."
- :package-version '(magit . "2.12.0")
- :group 'magit-revision
- :type '(choice (const :tag "Use sections, quickest" quickest)
- (const :tag "Use sections, quicker" quicker)
- (const :tag "Use sections, quick" quick)
- (const :tag "Use sections, slow" slow)
- (const :tag "Don't use sections" nil)))
-
-(defcustom magit-revision-show-gravatars nil
- "Whether to show gravatar images in revision buffers.
-
-If nil, then don't insert any gravatar images. If t, then insert
-both images. If `author' or `committer', then insert only the
-respective image.
-
-If you have customized the option `magit-revision-header-format'
-and want to insert the images then you might also have to specify
-where to do so. In that case the value has to be a cons-cell of
-two regular expressions. The car specifies where to insert the
-author's image. The top half of the image is inserted right
-after the matched text, the bottom half on the next line in the
-same column. The cdr specifies where to insert the committer's
-image, accordingly. Either the car or the cdr may be nil."
- :package-version '(magit . "2.3.0")
- :group 'magit-revision
- :type '(choice (const :tag "Don't show gravatars" nil)
- (const :tag "Show gravatars" t)
- (const :tag "Show author gravatar" author)
- (const :tag "Show committer gravatar" committer)
- (cons :tag "Show gravatars using custom pattern."
- (regexp :tag "Author regexp" "^Author: ")
- (regexp :tag "Committer regexp" "^Commit: "))))
-
-(defcustom magit-revision-use-gravatar-kludge nil
- "Whether to work around a bug which affects display of gravatars.
-
-Gravatar images are spliced into two halves which are then
-displayed on separate lines. On OS X the splicing has a bug in
-some Emacs builds, which causes the top and bottom halves to be
-interchanged. Enabling this option works around this issue by
-interchanging the halves once more, which cancels out the effect
-of the bug.
-
-See https://github.com/magit/magit/issues/2265
-and https://debbugs.gnu.org/cgi/bugreport.cgi?bug=7847.
-
-Starting with Emacs 26.1 this kludge should not be required for
-any build."
- :package-version '(magit . "2.3.0")
- :group 'magit-revision
- :type 'boolean)
-
-(defcustom magit-revision-fill-summary-line nil
- "Whether to fill excessively long summary lines.
-
-If this is an integer, then the summary line is filled if it is
-longer than either the limit specified here or `window-width'.
-
-You may want to only set this locally in \".dir-locals-2.el\" for
-repositories known to contain bad commit messages.
-
-The body of the message is left alone because (a) most people who
-write excessively long summary lines usually don't add a body and
-(b) even people who have the decency to wrap their lines may have
-a good reason to include a long line in the body sometimes."
- :package-version '(magit . "2.90.0")
- :group 'magit-revision
- :type '(choice (const :tag "Don't fill" nil)
- (integer :tag "Fill if longer than")))
-
-(defcustom magit-revision-filter-files-on-follow nil
- "Whether to honor file filter if log arguments include --follow.
-
-When a commit is displayed from a log buffer, the resulting
-revision buffer usually shares the log's file arguments,
-restricting the diff to those files. However, there's a
-complication when the log arguments include --follow: if the log
-follows a file across a rename event, keeping the file
-restriction would mean showing an empty diff in revision buffers
-for commits before the rename event.
-
-When this option is nil, the revision buffer ignores the log's
-filter if the log arguments include --follow. If non-nil, the
-log's file filter is always honored."
- :package-version '(magit . "3.0.0")
- :group 'magit-revision
- :type 'boolean)
-
-;;;; Visit Commands
-
-(defcustom magit-diff-visit-previous-blob t
- "Whether `magit-diff-visit-file' may visit the previous blob.
-
-When this is t and point is on a removed line in a diff for a
-committed change, then `magit-diff-visit-file' visits the blob
-from the last revision which still had that line.
-
-Currently this is only supported for committed changes, for
-staged and unstaged changes `magit-diff-visit-file' always
-visits the file in the working tree."
- :package-version '(magit . "2.9.0")
- :group 'magit-diff
- :type 'boolean)
-
-(defcustom magit-diff-visit-avoid-head-blob nil
- "Whether `magit-diff-visit-file' avoids visiting a blob from `HEAD'.
-
-By default `magit-diff-visit-file' always visits the blob that
-added the current line, while `magit-diff-visit-worktree-file'
-visits the respective file in the working tree. For the `HEAD'
-commit, the former command used to visit the worktree file too,
-but that made it impossible to visit a blob from `HEAD'.
-
-When point is on a removed line and that change has not been
-committed yet, then `magit-diff-visit-file' now visits the last
-blob that still had that line, which is a blob from `HEAD'.
-Previously this function used to visit the worktree file not
-only for added lines but also for such removed lines.
-
-If you prefer the old behaviors, then set this to t."
- :package-version '(magit . "3.0.0")
- :group 'magit-diff
- :type 'boolean)
-
-;;; Faces
-
-(defface magit-diff-file-heading
- `((t ,@(and (>= emacs-major-version 27) '(:extend t))
- :weight bold))
- "Face for diff file headings."
- :group 'magit-faces)
-
-(defface magit-diff-file-heading-highlight
- `((t ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-section-highlight))
- "Face for current diff file headings."
- :group 'magit-faces)
-
-(defface magit-diff-file-heading-selection
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-diff-file-heading-highlight
- :foreground "salmon4")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-diff-file-heading-highlight
- :foreground "LightSalmon3"))
- "Face for selected diff file headings."
- :group 'magit-faces)
-
-(defface magit-diff-hunk-heading
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey80"
- :foreground "grey30")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey25"
- :foreground "grey70"))
- "Face for diff hunk headings."
- :group 'magit-faces)
-
-(defface magit-diff-hunk-heading-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey75"
- :foreground "grey30")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey35"
- :foreground "grey70"))
- "Face for current diff hunk headings."
- :group 'magit-faces)
-
-(defface magit-diff-hunk-heading-selection
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-diff-hunk-heading-highlight
- :foreground "salmon4")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-diff-hunk-heading-highlight
- :foreground "LightSalmon3"))
- "Face for selected diff hunk headings."
- :group 'magit-faces)
-
-(defface magit-diff-hunk-region
- `((t :inherit bold
- ,@(and (>= emacs-major-version 27)
- (list :extend (ignore-errors (face-attribute 'region :extend))))))
- "Face used by `magit-diff-highlight-hunk-region-using-face'.
-
-This face is overlaid over text that uses other hunk faces,
-and those normally set the foreground and background colors.
-The `:foreground' and especially the `:background' properties
-should be avoided here. Setting the latter would cause the
-loss of information. Good properties to set here are `:weight'
-and `:slant'."
- :group 'magit-faces)
-
-(defface magit-diff-revision-summary
- '((t :inherit magit-diff-hunk-heading))
- "Face for commit message summaries."
- :group 'magit-faces)
-
-(defface magit-diff-revision-summary-highlight
- '((t :inherit magit-diff-hunk-heading-highlight))
- "Face for highlighted commit message summaries."
- :group 'magit-faces)
-
-(defface magit-diff-lines-heading
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-diff-hunk-heading-highlight
- :background "LightSalmon3")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :inherit magit-diff-hunk-heading-highlight
- :foreground "grey80"
- :background "salmon4"))
- "Face for diff hunk heading when lines are marked."
- :group 'magit-faces)
-
-(defface magit-diff-lines-boundary
- `((t ,@(and (>= emacs-major-version 27) '(:extend t)) ; !important
- :inherit magit-diff-lines-heading))
- "Face for boundary of marked lines in diff hunk."
- :group 'magit-faces)
-
-(defface magit-diff-conflict-heading
- '((t :inherit magit-diff-hunk-heading))
- "Face for conflict markers."
- :group 'magit-faces)
-
-(defface magit-diff-added
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#ddffdd"
- :foreground "#22aa22")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#335533"
- :foreground "#ddffdd"))
- "Face for lines in a diff that have been added."
- :group 'magit-faces)
-
-(defface magit-diff-removed
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#ffdddd"
- :foreground "#aa2222")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#553333"
- :foreground "#ffdddd"))
- "Face for lines in a diff that have been removed."
- :group 'magit-faces)
-
-(defface magit-diff-our
- '((t :inherit magit-diff-removed))
- "Face for lines in a diff for our side in a conflict."
- :group 'magit-faces)
-
-(defface magit-diff-base
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#ffffcc"
- :foreground "#aaaa11")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#555522"
- :foreground "#ffffcc"))
- "Face for lines in a diff for the base side in a conflict."
- :group 'magit-faces)
-
-(defface magit-diff-their
- '((t :inherit magit-diff-added))
- "Face for lines in a diff for their side in a conflict."
- :group 'magit-faces)
-
-(defface magit-diff-context
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :foreground "grey50")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :foreground "grey70"))
- "Face for lines in a diff that are unchanged."
- :group 'magit-faces)
-
-(defface magit-diff-added-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#cceecc"
- :foreground "#22aa22")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#336633"
- :foreground "#cceecc"))
- "Face for lines in a diff that have been added."
- :group 'magit-faces)
-
-(defface magit-diff-removed-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#eecccc"
- :foreground "#aa2222")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#663333"
- :foreground "#eecccc"))
- "Face for lines in a diff that have been removed."
- :group 'magit-faces)
-
-(defface magit-diff-our-highlight
- '((t :inherit magit-diff-removed-highlight))
- "Face for lines in a diff for our side in a conflict."
- :group 'magit-faces)
-
-(defface magit-diff-base-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#eeeebb"
- :foreground "#aaaa11")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "#666622"
- :foreground "#eeeebb"))
- "Face for lines in a diff for the base side in a conflict."
- :group 'magit-faces)
-
-(defface magit-diff-their-highlight
- '((t :inherit magit-diff-added-highlight))
- "Face for lines in a diff for their side in a conflict."
- :group 'magit-faces)
-
-(defface magit-diff-context-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey95"
- :foreground "grey50")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey20"
- :foreground "grey70"))
- "Face for lines in the current context in a diff."
- :group 'magit-faces)
-
-(defface magit-diff-whitespace-warning
- '((t :inherit trailing-whitespace))
- "Face for highlighting whitespace errors added lines."
- :group 'magit-faces)
-
-(defface magit-diffstat-added
- '((((class color) (background light)) :foreground "#22aa22")
- (((class color) (background dark)) :foreground "#448844"))
- "Face for plus sign in diffstat."
- :group 'magit-faces)
-
-(defface magit-diffstat-removed
- '((((class color) (background light)) :foreground "#aa2222")
- (((class color) (background dark)) :foreground "#aa4444"))
- "Face for minus sign in diffstat."
- :group 'magit-faces)
-
-;;; Arguments
-;;;; Prefix Classes
-
-(defclass magit-diff-prefix (transient-prefix)
- ((history-key :initform 'magit-diff)
- (major-mode :initform 'magit-diff-mode)))
-
-(defclass magit-diff-refresh-prefix (magit-diff-prefix)
- ((history-key :initform 'magit-diff)
- (major-mode :initform nil)))
-
-;;;; Prefix Methods
-
-(cl-defmethod transient-init-value ((obj magit-diff-prefix))
- (pcase-let ((`(,args ,files)
- (magit-diff--get-value 'magit-diff-mode
- magit-prefix-use-buffer-arguments)))
- (unless (eq transient-current-command 'magit-dispatch)
- (when-let ((file (magit-file-relative-name)))
- (setq files (list file))))
- (oset obj value (if files `(("--" ,@files) ,args) args))))
-
-(cl-defmethod transient-init-value ((obj magit-diff-refresh-prefix))
- (oset obj value (if magit-buffer-diff-files
- `(("--" ,@magit-buffer-diff-files)
- ,magit-buffer-diff-args)
- magit-buffer-diff-args)))
-
-(cl-defmethod transient-set-value ((obj magit-diff-prefix))
- (magit-diff--set-value obj))
-
-(cl-defmethod transient-save-value ((obj magit-diff-prefix))
- (magit-diff--set-value obj 'save))
-
-;;;; Argument Access
-
-(defun magit-diff-arguments (&optional mode)
- "Return the current diff arguments."
- (if (memq transient-current-command '(magit-diff magit-diff-refresh))
- (pcase-let ((`(,args ,alist)
- (-separate #'atom (transient-get-value))))
- (list args (cdr (assoc "--" alist))))
- (magit-diff--get-value (or mode 'magit-diff-mode))))
-
-(defun magit-diff--get-value (mode &optional use-buffer-args)
- (unless use-buffer-args
- (setq use-buffer-args magit-direct-use-buffer-arguments))
- (let (args files)
- (cond
- ((and (memq use-buffer-args '(always selected current))
- (eq major-mode mode))
- (setq args magit-buffer-diff-args)
- (setq files magit-buffer-diff-files))
- ((and (memq use-buffer-args '(always selected))
- (when-let ((buffer (magit-get-mode-buffer
- mode nil
- (eq use-buffer-args 'selected))))
- (setq args (buffer-local-value 'magit-buffer-diff-args buffer))
- (setq files (buffer-local-value 'magit-buffer-diff-files buffer))
- t)))
- ((plist-member (symbol-plist mode) 'magit-diff-current-arguments)
- (setq args (get mode 'magit-diff-current-arguments)))
- ((when-let ((elt (assq (intern (format "magit-diff:%s" mode))
- transient-values)))
- (setq args (cdr elt))
- t))
- (t
- (setq args (get mode 'magit-diff-default-arguments))))
- (list args files)))
-
-(defun magit-diff--set-value (obj &optional save)
- (pcase-let* ((obj (oref obj prototype))
- (mode (or (oref obj major-mode) major-mode))
- (key (intern (format "magit-diff:%s" mode)))
- (`(,args ,alist)
- (-separate #'atom (transient-get-value)))
- (files (cdr (assoc "--" alist))))
- (put mode 'magit-diff-current-arguments args)
- (when save
- (setf (alist-get key transient-values) args)
- (transient-save-values))
- (transient--history-push obj)
- (setq magit-buffer-diff-args args)
- (setq magit-buffer-diff-files files)
- (magit-refresh)))
-
-;;; Section Classes
-
-(defclass magit-file-section (magit-section)
- ((source :initform nil)
- (header :initform nil)))
-
-(defclass magit-module-section (magit-file-section)
- ())
-
-(defclass magit-hunk-section (magit-section)
- ((refined :initform nil)
- (combined :initform nil)
- (from-range :initform nil)
- (from-ranges :initform nil)
- (to-range :initform nil)
- (about :initform nil)))
-
-(setf (alist-get 'hunk magit--section-type-alist) 'magit-hunk-section)
-(setf (alist-get 'module magit--section-type-alist) 'magit-module-section)
-(setf (alist-get 'file magit--section-type-alist) 'magit-file-section)
-
-;;; Commands
-;;;; Prefix Commands
-
-;;;###autoload (autoload 'magit-diff "magit-diff" nil t)
-(transient-define-prefix magit-diff ()
- "Show changes between different versions."
- :man-page "git-diff"
- :class 'magit-diff-prefix
- ["Limit arguments"
- (magit:--)
- (magit-diff:--ignore-submodules)
- ("-b" "Ignore whitespace changes" ("-b" "--ignore-space-change"))
- ("-w" "Ignore all whitespace" ("-w" "--ignore-all-space"))
- (5 "-D" "Omit preimage for deletes" ("-D" "--irreversible-delete"))]
- ["Context arguments"
- (magit-diff:-U)
- ("-W" "Show surrounding functions" ("-W" "--function-context"))]
- ["Tune arguments"
- (magit-diff:--diff-algorithm)
- (magit-diff:-M)
- (magit-diff:-C)
- ("-x" "Disallow external diff drivers" "--no-ext-diff")
- ("-s" "Show stats" "--stat")
- ("=g" "Show signature" "--show-signature")
- (5 magit-diff:--color-moved)
- (5 magit-diff:--color-moved-ws)]
- ["Actions"
- [("d" "Dwim" magit-diff-dwim)
- ("r" "Diff range" magit-diff-range)
- ("p" "Diff paths" magit-diff-paths)]
- [("u" "Diff unstaged" magit-diff-unstaged)
- ("s" "Diff staged" magit-diff-staged)
- ("w" "Diff worktree" magit-diff-working-tree)]
- [("c" "Show commit" magit-show-commit)
- ("t" "Show stash" magit-stash-show)]])
-
-;;;###autoload (autoload 'magit-diff-refresh "magit-diff" nil t)
-(transient-define-prefix magit-diff-refresh ()
- "Change the arguments used for the diff(s) in the current buffer."
- :man-page "git-diff"
- :class 'magit-diff-refresh-prefix
- ["Limit arguments"
- (magit:--)
- (magit-diff:--ignore-submodules)
- ("-b" "Ignore whitespace changes" ("-b" "--ignore-space-change"))
- ("-w" "Ignore all whitespace" ("-w" "--ignore-all-space"))
- (5 "-D" "Omit preimage for deletes" ("-D" "--irreversible-delete"))]
- ["Context arguments"
- (magit-diff:-U)
- ("-W" "Show surrounding functions" ("-W" "--function-context"))]
- ["Tune arguments"
- (magit-diff:--diff-algorithm)
- (magit-diff:-M)
- (magit-diff:-C)
- ("-x" "Disallow external diff drivers" "--no-ext-diff")
- ("-s" "Show stats" "--stat"
- :if-derived magit-diff-mode)
- ("=g" "Show signature" "--show-signature"
- :if-derived magit-diff-mode)
- (5 magit-diff:--color-moved)
- (5 magit-diff:--color-moved-ws)]
- [["Refresh"
- ("g" "buffer" magit-diff-refresh)
- ("s" "buffer and set defaults" transient-set :transient nil)
- ("w" "buffer and save defaults" transient-save :transient nil)]
- ["Toggle"
- ("t" "hunk refinement" magit-diff-toggle-refine-hunk)
- ("F" "file filter" magit-diff-toggle-file-filter)
- ("b" "buffer lock" magit-toggle-buffer-lock
- :if-mode (magit-diff-mode magit-revision-mode magit-stash-mode))]
- [:if-mode magit-diff-mode
- :description "Do"
- ("r" "switch range type" magit-diff-switch-range-type)
- ("f" "flip revisions" magit-diff-flip-revs)]]
- (interactive)
- (if (not (eq transient-current-command 'magit-diff-refresh))
- (transient-setup 'magit-diff-refresh)
- (pcase-let ((`(,args ,files) (magit-diff-arguments)))
- (setq magit-buffer-diff-args args)
- (setq magit-buffer-diff-files files))
- (magit-refresh)))
-
-;;;; Infix Commands
-
-(transient-define-argument magit:-- ()
- :description "Limit to files"
- :class 'transient-files
- :key "--"
- :argument "--"
- :prompt "Limit to file(s): "
- :reader 'magit-read-files
- :multi-value t)
-
-(defun magit-read-files (prompt initial-input history)
- (magit-completing-read-multiple* prompt
- (magit-list-files)
- nil nil
- (or initial-input (magit-file-at-point))
- history))
-
-(transient-define-argument magit-diff:-U ()
- :description "Context lines"
- :class 'transient-option
- :argument "-U"
- :reader 'transient-read-number-N0)
-
-(transient-define-argument magit-diff:-M ()
- :description "Detect renames"
- :class 'transient-option
- :argument "-M"
- :reader 'transient-read-number-N+)
-
-(transient-define-argument magit-diff:-C ()
- :description "Detect copies"
- :class 'transient-option
- :argument "-C"
- :reader 'transient-read-number-N+)
-
-(transient-define-argument magit-diff:--diff-algorithm ()
- :description "Diff algorithm"
- :class 'transient-option
- :key "-A"
- :argument "--diff-algorithm="
- :reader 'magit-diff-select-algorithm)
-
-(defun magit-diff-select-algorithm (&rest _ignore)
- (magit-read-char-case nil t
- (?d "[d]efault" "default")
- (?m "[m]inimal" "minimal")
- (?p "[p]atience" "patience")
- (?h "[h]istogram" "histogram")))
-
-(transient-define-argument magit-diff:--ignore-submodules ()
- :description "Ignore submodules"
- :class 'transient-option
- :key "-i"
- :argument "--ignore-submodules="
- :reader 'magit-diff-select-ignore-submodules)
-
-(defun magit-diff-select-ignore-submodules (&rest _ignored)
- (magit-read-char-case "Ignore submodules " t
- (?u "[u]ntracked" "untracked")
- (?d "[d]irty" "dirty")
- (?a "[a]ll" "all")))
-
-(transient-define-argument magit-diff:--color-moved ()
- :description "Color moved lines"
- :class 'transient-option
- :key "-m"
- :argument "--color-moved="
- :reader 'magit-diff-select-color-moved-mode)
-
-(defun magit-diff-select-color-moved-mode (&rest _ignore)
- (magit-read-char-case "Color moved " t
- (?d "[d]efault" "default")
- (?p "[p]lain" "plain")
- (?b "[b]locks" "blocks")
- (?z "[z]ebra" "zebra")
- (?Z "[Z] dimmed-zebra" "dimmed-zebra")))
-
-(transient-define-argument magit-diff:--color-moved-ws ()
- :description "Whitespace treatment for --color-moved"
- :class 'transient-option
- :key "=w"
- :argument "--color-moved-ws="
- :reader 'magit-diff-select-color-moved-ws-mode)
-
-(defun magit-diff-select-color-moved-ws-mode (&rest _ignore)
- (magit-read-char-case "Ignore whitespace " t
- (?i "[i]ndentation" "allow-indentation-change")
- (?e "[e]nd of line" "ignore-space-at-eol")
- (?s "[s]pace change" "ignore-space-change")
- (?a "[a]ll space" "ignore-all-space")
- (?n "[n]o" "no")))
-
-;;;; Setup Commands
-
-;;;###autoload
-(defun magit-diff-dwim (&optional args files)
- "Show changes for the thing at point."
- (interactive (magit-diff-arguments))
- (pcase (magit-diff--dwim)
- (`unmerged (magit-diff-unmerged args files))
- (`unstaged (magit-diff-unstaged args files))
- (`staged
- (let ((file (magit-file-at-point)))
- (if (and file (equal (cddr (car (magit-file-status file))) '(?D ?U)))
- ;; File was deleted by us and modified by them. Show the latter.
- (magit-diff-unmerged args (list file))
- (magit-diff-staged nil args files))))
- (`(commit . ,value)
- (magit-diff-range (format "%s^..%s" value value) args files))
- (`(stash . ,value) (magit-stash-show value args))
- ((and range (pred stringp))
- (magit-diff-range range args files))
- (_
- (call-interactively #'magit-diff-range))))
-
-(defun magit-diff--dwim ()
- "Return information for performing DWIM diff.
-
-The information can be in three forms:
-1. TYPE
- A symbol describing a type of diff where no additional information
- is needed to generate the diff. Currently, this includes `staged',
- `unstaged' and `unmerged'.
-2. (TYPE . VALUE)
- Like #1 but the diff requires additional information, which is
- given by VALUE. Currently, this includes `commit' and `stash',
- where VALUE is the given commit or stash, respectively.
-3. RANGE
- A string indicating a diff range.
-
-If no DWIM context is found, nil is returned."
- (cond
- ((--when-let (magit-region-values '(commit branch) t)
- (deactivate-mark)
- (concat (car (last it)) ".." (car it))))
- (magit-buffer-refname
- (cons 'commit magit-buffer-refname))
- ((derived-mode-p 'magit-stash-mode)
- (cons 'commit
- (magit-section-case
- (commit (oref it value))
- (file (-> it
- (oref parent)
- (oref value)))
- (hunk (-> it
- (oref parent)
- (oref parent)
- (oref value))))))
- ((derived-mode-p 'magit-revision-mode)
- (cons 'commit magit-buffer-revision))
- ((derived-mode-p 'magit-diff-mode)
- magit-buffer-range)
- (t
- (magit-section-case
- ([* unstaged] 'unstaged)
- ([* staged] 'staged)
- (unmerged 'unmerged)
- (unpushed (oref it value))
- (unpulled (oref it value))
- (branch (let ((current (magit-get-current-branch))
- (atpoint (oref it value)))
- (if (equal atpoint current)
- (--if-let (magit-get-upstream-branch)
- (format "%s...%s" it current)
- (if (magit-anything-modified-p)
- current
- (cons 'commit current)))
- (format "%s...%s"
- (or current "HEAD")
- atpoint))))
- (commit (cons 'commit (oref it value)))
- (stash (cons 'stash (oref it value)))
- (pullreq (forge--pullreq-range (oref it value) t))))))
-
-(defun magit-diff-read-range-or-commit (prompt &optional secondary-default mbase)
- "Read range or revision with special diff range treatment.
-If MBASE is non-nil, prompt for which rev to place at the end of
-a \"revA...revB\" range. Otherwise, always construct
-\"revA..revB\" range."
- (--if-let (magit-region-values '(commit branch) t)
- (let ((revA (car (last it)))
- (revB (car it)))
- (deactivate-mark)
- (if mbase
- (let ((base (magit-git-string "merge-base" revA revB)))
- (cond
- ((string= (magit-rev-parse revA) base)
- (format "%s..%s" revA revB))
- ((string= (magit-rev-parse revB) base)
- (format "%s..%s" revB revA))
- (t
- (let ((main (magit-completing-read "View changes along"
- (list revA revB)
- nil t nil nil revB)))
- (format "%s...%s"
- (if (string= main revB) revA revB) main)))))
- (format "%s..%s" revA revB)))
- (magit-read-range prompt
- (or (pcase (magit-diff--dwim)
- (`(commit . ,value)
- (format "%s^..%s" value value))
- ((and range (pred stringp))
- range))
- secondary-default
- (magit-get-current-branch)))))
-
-;;;###autoload
-(defun magit-diff-range (rev-or-range &optional args files)
- "Show differences between two commits.
-
-REV-OR-RANGE should be a range or a single revision. If it is a
-revision, then show changes in the working tree relative to that
-revision. If it is a range, but one side is omitted, then show
-changes relative to `HEAD'.
-
-If the region is active, use the revisions on the first and last
-line of the region as the two sides of the range. With a prefix
-argument, instead of diffing the revisions, choose a revision to
-view changes along, starting at the common ancestor of both
-revisions (i.e., use a \"...\" range)."
- (interactive (cons (magit-diff-read-range-or-commit "Diff for range"
- nil current-prefix-arg)
- (magit-diff-arguments)))
- (magit-diff-setup-buffer rev-or-range nil args files))
-
-;;;###autoload
-(defun magit-diff-working-tree (&optional rev args files)
- "Show changes between the current working tree and the `HEAD' commit.
-With a prefix argument show changes between the working tree and
-a commit read from the minibuffer."
- (interactive
- (cons (and current-prefix-arg
- (magit-read-branch-or-commit "Diff working tree and commit"))
- (magit-diff-arguments)))
- (magit-diff-setup-buffer (or rev "HEAD") nil args files))
-
-;;;###autoload
-(defun magit-diff-staged (&optional rev args files)
- "Show changes between the index and the `HEAD' commit.
-With a prefix argument show changes between the index and
-a commit read from the minibuffer."
- (interactive
- (cons (and current-prefix-arg
- (magit-read-branch-or-commit "Diff index and commit"))
- (magit-diff-arguments)))
- (magit-diff-setup-buffer rev "--cached" args files))
-
-;;;###autoload
-(defun magit-diff-unstaged (&optional args files)
- "Show changes between the working tree and the index."
- (interactive (magit-diff-arguments))
- (magit-diff-setup-buffer nil nil args files))
-
-;;;###autoload
-(defun magit-diff-unmerged (&optional args files)
- "Show changes that are being merged."
- (interactive (magit-diff-arguments))
- (unless (magit-merge-in-progress-p)
- (user-error "No merge is in progress"))
- (magit-diff-setup-buffer (magit--merge-range) nil args files))
-
-;;;###autoload
-(defun magit-diff-while-committing (&optional args)
- "While committing, show the changes that are about to be committed.
-While amending, invoking the command again toggles between
-showing just the new changes or all the changes that will
-be committed."
- (interactive (list (car (magit-diff-arguments))))
- (unless (magit-commit-message-buffer)
- (user-error "No commit in progress"))
- (let ((magit-display-buffer-noselect t))
- (if-let ((diff-buf (magit-get-mode-buffer 'magit-diff-mode 'selected)))
- (with-current-buffer diff-buf
- (cond ((and (equal magit-buffer-range "HEAD^")
- (equal magit-buffer-typearg "--cached"))
- (magit-diff-staged nil args))
- ((and (equal magit-buffer-range nil)
- (equal magit-buffer-typearg "--cached"))
- (magit-diff-while-amending args))
- ((magit-anything-staged-p)
- (magit-diff-staged nil args))
- (t
- (magit-diff-while-amending args))))
- (if (magit-anything-staged-p)
- (magit-diff-staged nil args)
- (magit-diff-while-amending args)))))
-
-(define-key git-commit-mode-map
- (kbd "C-c C-d") 'magit-diff-while-committing)
-
-(defun magit-diff-while-amending (&optional args)
- (magit-diff-setup-buffer "HEAD^" "--cached" args nil))
-
-;;;###autoload
-(defun magit-diff-buffer-file ()
- "Show diff for the blob or file visited in the current buffer.
-
-When the buffer visits a blob, then show the respective commit.
-When the buffer visits a file, then show the differenced between
-`HEAD' and the working tree. In both cases limit the diff to
-the file or blob."
- (interactive)
- (require 'magit)
- (if-let ((file (magit-file-relative-name)))
- (if magit-buffer-refname
- (magit-show-commit magit-buffer-refname
- (car (magit-show-commit--arguments))
- (list file))
- (save-buffer)
- (let ((line (line-number-at-pos))
- (col (current-column)))
- (with-current-buffer
- (magit-diff-setup-buffer (or (magit-get-current-branch) "HEAD")
- nil
- (car (magit-diff-arguments))
- (list file)
- magit-diff-buffer-file-locked)
- (magit-diff--goto-position file line col))))
- (user-error "Buffer isn't visiting a file")))
-
-;;;###autoload
-(defun magit-diff-paths (a b)
- "Show changes between any two files on disk."
- (interactive (list (read-file-name "First file: " nil nil t)
- (read-file-name "Second file: " nil nil t)))
- (magit-diff-setup-buffer nil "--no-index"
- nil (list (magit-convert-filename-for-git
- (expand-file-name a))
- (magit-convert-filename-for-git
- (expand-file-name b)))))
-
-(defun magit-show-commit--arguments ()
- (pcase-let ((`(,args ,diff-files)
- (magit-diff-arguments 'magit-revision-mode)))
- (list args (if (derived-mode-p 'magit-log-mode)
- (and (or magit-revision-filter-files-on-follow
- (not (member "--follow" magit-buffer-log-args)))
- magit-buffer-log-files)
- diff-files))))
-
-;;;###autoload
-(defun magit-show-commit (rev &optional args files module)
- "Visit the revision at point in another buffer.
-If there is no revision at point or with a prefix argument prompt
-for a revision."
- (interactive
- (pcase-let* ((mcommit (magit-section-value-if 'module-commit))
- (atpoint (or (and (bound-and-true-p magit-blame-mode)
- (oref (magit-current-blame-chunk) orig-rev))
- mcommit
- (thing-at-point 'git-revision t)
- (magit-branch-or-commit-at-point)))
- (`(,args ,files) (magit-show-commit--arguments)))
- (list (or (and (not current-prefix-arg) atpoint)
- (magit-read-branch-or-commit "Show commit" atpoint))
- args
- files
- (and mcommit
- (magit-section-parent-value (magit-current-section))))))
- (require 'magit)
- (let ((file (magit-file-relative-name)))
- (magit-with-toplevel
- (when module
- (setq default-directory
- (expand-file-name (file-name-as-directory module))))
- (unless (magit-commit-p rev)
- (user-error "%s is not a commit" rev))
- (let ((buf (magit-revision-setup-buffer rev args files)))
- (when file
- (save-buffer)
- (let ((line (magit-diff-visit--offset file (list "-R" rev)
- (line-number-at-pos)))
- (col (current-column)))
- (with-current-buffer buf
- (magit-diff--goto-position file line col))))))))
-
-(defun magit-diff--locate-hunk (file line &optional parent)
- (when-let ((diff (cl-find-if (lambda (section)
- (and (cl-typep section 'magit-file-section)
- (equal (oref section value) file)))
- (oref (or parent magit-root-section) children))))
- (let (hunk (hunks (oref diff children)))
- (cl-block nil
- (while (setq hunk (pop hunks))
- (pcase-let* ((`(,beg ,len) (oref hunk to-range))
- (end (+ beg len)))
- (cond ((> beg line) (cl-return (list diff nil)))
- ((<= beg line end) (cl-return (list hunk t)))
- ((null hunks) (cl-return (list hunk nil))))))))))
-
-(defun magit-diff--goto-position (file line column &optional parent)
- (when-let ((pos (magit-diff--locate-hunk file line parent)))
- (pcase-let ((`(,section ,exact) pos))
- (cond ((cl-typep section 'magit-file-section)
- (goto-char (oref section start)))
- (exact
- (goto-char (oref section content))
- (let ((pos (car (oref section to-range))))
- (while (or (< pos line)
- (= (char-after) ?-))
- (unless (= (char-after) ?-)
- (cl-incf pos))
- (forward-line)))
- (forward-char (1+ column)))
- (t
- (goto-char (oref section start))
- (setq section (oref section parent))))
- (while section
- (when (oref section hidden)
- (magit-section-show section))
- (setq section (oref section parent))))
- (magit-section-update-highlight)
- t))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-revision-mode))
- (cons magit-buffer-range magit-buffer-diff-files))
-
-;;;; Setting Commands
-
-(defun magit-diff-switch-range-type ()
- "Convert diff range type.
-Change \"revA..revB\" to \"revA...revB\", or vice versa."
- (interactive)
- (if (and magit-buffer-range
- (derived-mode-p 'magit-diff-mode)
- (string-match magit-range-re magit-buffer-range))
- (setq magit-buffer-range
- (replace-match (if (string= (match-string 2 magit-buffer-range) "..")
- "..."
- "..")
- t t magit-buffer-range 2))
- (user-error "No range to change"))
- (magit-refresh))
-
-(defun magit-diff-flip-revs ()
- "Swap revisions in diff range.
-Change \"revA..revB\" to \"revB..revA\"."
- (interactive)
- (if (and magit-buffer-range
- (derived-mode-p 'magit-diff-mode)
- (string-match magit-range-re magit-buffer-range))
- (progn
- (setq magit-buffer-range
- (concat (match-string 3 magit-buffer-range)
- (match-string 2 magit-buffer-range)
- (match-string 1 magit-buffer-range)))
- (magit-refresh))
- (user-error "No range to swap")))
-
-(defun magit-diff-toggle-file-filter ()
- "Toggle the file restriction of the current buffer's diffs.
-If the current buffer's mode is derived from `magit-log-mode',
-toggle the file restriction in the repository's revision buffer
-instead."
- (interactive)
- (cl-flet ((toggle ()
- (if (or magit-buffer-diff-files
- magit-buffer-diff-files-suspended)
- (cl-rotatef magit-buffer-diff-files
- magit-buffer-diff-files-suspended)
- (setq magit-buffer-diff-files
- (transient-infix-read 'magit:--)))
- (magit-refresh)))
- (cond
- ((derived-mode-p 'magit-log-mode
- 'magit-cherry-mode
- 'magit-reflog-mode)
- (if-let ((buffer (magit-get-mode-buffer 'magit-revision-mode)))
- (with-current-buffer buffer (toggle))
- (message "No revision buffer")))
- ((local-variable-p 'magit-buffer-diff-files)
- (toggle))
- (t
- (user-error "Cannot toggle file filter in this buffer")))))
-
-(defun magit-diff-less-context (&optional count)
- "Decrease the context for diff hunks by COUNT lines."
- (interactive "p")
- (magit-diff-set-context `(lambda (cur) (max 0 (- (or cur 0) ,count)))))
-
-(defun magit-diff-more-context (&optional count)
- "Increase the context for diff hunks by COUNT lines."
- (interactive "p")
- (magit-diff-set-context `(lambda (cur) (+ (or cur 0) ,count))))
-
-(defun magit-diff-default-context ()
- "Reset context for diff hunks to the default height."
- (interactive)
- (magit-diff-set-context #'ignore))
-
-(defun magit-diff-set-context (fn)
- (let* ((def (--if-let (magit-get "diff.context") (string-to-number it) 3))
- (val magit-buffer-diff-args)
- (arg (--first (string-match "^-U\\([0-9]+\\)?$" it) val))
- (num (--if-let (and arg (match-string 1 arg)) (string-to-number it) def))
- (val (delete arg val))
- (num (funcall fn num))
- (arg (and num (not (= num def)) (format "-U%i" num)))
- (val (if arg (cons arg val) val)))
- (setq magit-buffer-diff-args val))
- (magit-refresh))
-
-(defun magit-diff-context-p ()
- (if-let ((arg (--first (string-match "^-U\\([0-9]+\\)$" it)
- magit-buffer-diff-args)))
- (not (equal arg "-U0"))
- t))
-
-(defun magit-diff-ignore-any-space-p ()
- (--any-p (member it magit-buffer-diff-args)
- '("--ignore-cr-at-eol"
- "--ignore-space-at-eol"
- "--ignore-space-change" "-b"
- "--ignore-all-space" "-w"
- "--ignore-blank-space")))
-
-(defun magit-diff-toggle-refine-hunk (&optional style)
- "Turn diff-hunk refining on or off.
-
-If hunk refining is currently on, then hunk refining is turned off.
-If hunk refining is off, then hunk refining is turned on, in
-`selected' mode (only the currently selected hunk is refined).
-
-With a prefix argument, the \"third choice\" is used instead:
-If hunk refining is currently on, then refining is kept on, but
-the refining mode (`selected' or `all') is switched.
-If hunk refining is off, then hunk refining is turned on, in
-`all' mode (all hunks refined).
-
-Customize variable `magit-diff-refine-hunk' to change the default mode."
- (interactive "P")
- (setq-local magit-diff-refine-hunk
- (if style
- (if (eq magit-diff-refine-hunk 'all) t 'all)
- (not magit-diff-refine-hunk)))
- (magit-diff-update-hunk-refinement))
-
-;;;; Visit Commands
-;;;;; Dwim Variants
-
-(defun magit-diff-visit-file (file &optional other-window)
- "From a diff visit the appropriate version of FILE.
-
-Display the buffer in the selected window. With a prefix
-argument OTHER-WINDOW display the buffer in another window
-instead.
-
-Visit the worktree version of the appropriate file. The location
-of point inside the diff determines which file is being visited.
-The visited version depends on what changes the diff is about.
-
-1. If the diff shows uncommitted changes (i.e. stage or unstaged
- changes), then visit the file in the working tree (i.e. the
- same \"real\" file that `find-file' would visit. In all other
- cases visit a \"blob\" (i.e. the version of a file as stored
- in some commit).
-
-2. If point is on a removed line, then visit the blob for the
- first parent of the commit that removed that line, i.e. the
- last commit where that line still exists.
-
-3. If point is on an added or context line, then visit the blob
- that adds that line, or if the diff shows from more than a
- single commit, then visit the blob from the last of these
- commits.
-
-In the file-visiting buffer also go to the line that corresponds
-to the line that point is on in the diff.
-
-Note that this command only works if point is inside a diff. In
-other cases `magit-find-file' (which see) had to be used."
- (interactive (list (magit-file-at-point t t) current-prefix-arg))
- (magit-diff-visit-file--internal file nil
- (if other-window
- #'switch-to-buffer-other-window
- #'pop-to-buffer-same-window)))
-
-(defun magit-diff-visit-file-other-window (file)
- "From a diff visit the appropriate version of FILE in another window.
-Like `magit-diff-visit-file' but use
-`switch-to-buffer-other-window'."
- (interactive (list (magit-file-at-point t t)))
- (magit-diff-visit-file--internal file nil #'switch-to-buffer-other-window))
-
-(defun magit-diff-visit-file-other-frame (file)
- "From a diff visit the appropriate version of FILE in another frame.
-Like `magit-diff-visit-file' but use
-`switch-to-buffer-other-frame'."
- (interactive (list (magit-file-at-point t t)))
- (magit-diff-visit-file--internal file nil #'switch-to-buffer-other-frame))
-
-;;;;; Worktree Variants
-
-(defun magit-diff-visit-worktree-file (file &optional other-window)
- "From a diff visit the worktree version of FILE.
-
-Display the buffer in the selected window. With a prefix
-argument OTHER-WINDOW display the buffer in another window
-instead.
-
-Visit the worktree version of the appropriate file. The location
-of point inside the diff determines which file is being visited.
-
-Unlike `magit-diff-visit-file' always visits the \"real\" file in
-the working tree, i.e the \"current version\" of the file.
-
-In the file-visiting buffer also go to the line that corresponds
-to the line that point is on in the diff. Lines that were added
-or removed in the working tree, the index and other commits in
-between are automatically accounted for."
- (interactive (list (magit-file-at-point t t) current-prefix-arg))
- (magit-diff-visit-file--internal file t
- (if other-window
- #'switch-to-buffer-other-window
- #'pop-to-buffer-same-window)))
-
-(defun magit-diff-visit-worktree-file-other-window (file)
- "From a diff visit the worktree version of FILE in another window.
-Like `magit-diff-visit-worktree-file' but use
-`switch-to-buffer-other-window'."
- (interactive (list (magit-file-at-point t t)))
- (magit-diff-visit-file--internal file t #'switch-to-buffer-other-window))
-
-(defun magit-diff-visit-worktree-file-other-frame (file)
- "From a diff visit the worktree version of FILE in another frame.
-Like `magit-diff-visit-worktree-file' but use
-`switch-to-buffer-other-frame'."
- (interactive (list (magit-file-at-point t t)))
- (magit-diff-visit-file--internal file t #'switch-to-buffer-other-frame))
-
-;;;;; Internal
-
-(defun magit-diff-visit-file--internal (file force-worktree fn)
- "From a diff visit the appropriate version of FILE.
-If FORCE-WORKTREE is non-nil, then visit the worktree version of
-the file, even if the diff is about a committed change. USE FN
-to display the buffer in some window."
- (if (magit-file-accessible-directory-p file)
- (magit-diff-visit-directory file force-worktree)
- (pcase-let ((`(,buf ,pos)
- (magit-diff-visit-file--noselect file force-worktree)))
- (funcall fn buf)
- (magit-diff-visit-file--setup buf pos)
- buf)))
-
-(defun magit-diff-visit-directory (directory &optional other-window)
- "Visit DIRECTORY in some window.
-Display the buffer in the selected window unless OTHER-WINDOW is
-non-nil. If DIRECTORY is the top-level directory of the current
-repository, then visit the containing directory using Dired and
-in the Dired buffer put point on DIRECTORY. Otherwise display
-the Magit-Status buffer for DIRECTORY."
- (if (equal (magit-toplevel directory)
- (magit-toplevel))
- (dired-jump other-window (concat directory "/."))
- (let ((display-buffer-overriding-action
- (if other-window
- '(nil (inhibit-same-window t))
- '(display-buffer-same-window))))
- (magit-status-setup-buffer directory))))
-
-(defun magit-diff-visit-file--setup (buf pos)
- (if-let ((win (get-buffer-window buf 'visible)))
- (with-selected-window win
- (when pos
- (unless (<= (point-min) pos (point-max))
- (widen))
- (goto-char pos))
- (when (and buffer-file-name
- (magit-anything-unmerged-p buffer-file-name))
- (smerge-start-session))
- (run-hooks 'magit-diff-visit-file-hook))
- (error "File buffer is not visible")))
-
-(defun magit-diff-visit-file--noselect (&optional file goto-worktree)
- (unless file
- (setq file (magit-file-at-point t t)))
- (let* ((hunk (magit-diff-visit--hunk))
- (goto-from (and hunk
- (magit-diff-visit--goto-from-p hunk goto-worktree)))
- (line (and hunk (magit-diff-hunk-line hunk goto-from)))
- (col (and hunk (magit-diff-hunk-column hunk goto-from)))
- (spec (magit-diff--dwim))
- (rev (if goto-from
- (magit-diff-visit--range-from spec)
- (magit-diff-visit--range-to spec)))
- (buf (if (or goto-worktree
- (and (not (stringp rev))
- (or magit-diff-visit-avoid-head-blob
- (not goto-from))))
- (or (get-file-buffer file)
- (find-file-noselect file))
- (magit-find-file-noselect (if (stringp rev) rev "HEAD")
- file))))
- (if line
- (with-current-buffer buf
- (cond ((eq rev 'staged)
- (setq line (magit-diff-visit--offset file nil line)))
- ((and goto-worktree
- (stringp rev))
- (setq line (magit-diff-visit--offset file rev line))))
- (list buf (save-restriction
- (widen)
- (goto-char (point-min))
- (forward-line (1- line))
- (move-to-column col)
- (point))))
- (list buf nil))))
-
-(defun magit-diff-visit--hunk ()
- (when-let ((scope (magit-diff-scope)))
- (let ((section (magit-current-section)))
- (cl-case scope
- ((file files)
- (setq section (car (oref section children))))
- (list
- (setq section (car (oref section children)))
- (when section
- (setq section (car (oref section children))))))
- (and
- ;; Unmerged files appear in the list of staged changes
- ;; but unlike in the list of unstaged changes no diffs
- ;; are shown here. In that case `section' is nil.
- section
- ;; Currently the `hunk' type is also abused for file
- ;; mode changes, which we are not interested in here.
- ;; Such sections have no value.
- (oref section value)
- section))))
-
-(defun magit-diff-visit--goto-from-p (section in-worktree)
- (and magit-diff-visit-previous-blob
- (not in-worktree)
- (not (oref section combined))
- (not (< (point) (oref section content)))
- (= (char-after (line-beginning-position)) ?-)))
-
-(defun magit-diff-hunk-line (section goto-from)
- (save-excursion
- (goto-char (line-beginning-position))
- (with-slots (content combined from-ranges from-range to-range) section
- (when (< (point) content)
- (goto-char content)
- (re-search-forward "^[-+]"))
- (+ (car (if goto-from from-range to-range))
- (let ((prefix (if combined (length from-ranges) 1))
- (target (point))
- (offset 0))
- (goto-char content)
- (while (< (point) target)
- (unless (string-match-p
- (if goto-from "\\+" "-")
- (buffer-substring (point) (+ (point) prefix)))
- (cl-incf offset))
- (forward-line))
- offset)))))
-
-(defun magit-diff-hunk-column (section goto-from)
- (if (or (< (point)
- (oref section content))
- (and (not goto-from)
- (= (char-after (line-beginning-position)) ?-)))
- 0
- (max 0 (- (+ (current-column) 2)
- (length (oref section value))))))
-
-(defun magit-diff-visit--range-from (spec)
- (cond ((consp spec)
- (concat (cdr spec) "^"))
- ((stringp spec)
- (car (magit-split-range spec)))
- (t
- spec)))
-
-(defun magit-diff-visit--range-to (spec)
- (if (symbolp spec)
- spec
- (let ((rev (if (consp spec)
- (cdr spec)
- (cdr (magit-split-range spec)))))
- (if (and magit-diff-visit-avoid-head-blob
- (magit-rev-head-p rev))
- 'unstaged
- rev))))
-
-(defun magit-diff-visit--offset (file rev line)
- (let ((offset 0))
- (with-temp-buffer
- (save-excursion
- (magit-with-toplevel
- (magit-git-insert "diff" rev "--" file)))
- (catch 'found
- (while (re-search-forward
- "^@@ -\\([0-9]+\\),\\([0-9]+\\) \\+\\([0-9]+\\),\\([0-9]+\\) @@.*\n"
- nil t)
- (let ((from-beg (string-to-number (match-string 1)))
- (from-len (string-to-number (match-string 2)))
- ( to-len (string-to-number (match-string 4))))
- (if (<= from-beg line)
- (if (< (+ from-beg from-len) line)
- (cl-incf offset (- to-len from-len))
- (let ((rest (- line from-beg)))
- (while (> rest 0)
- (pcase (char-after)
- (?\s (cl-decf rest))
- (?- (cl-decf offset) (cl-decf rest))
- (?+ (cl-incf offset)))
- (forward-line))))
- (throw 'found nil))))))
- (+ line offset)))
-
-;;;; Scroll Commands
-
-(defun magit-diff-show-or-scroll-up ()
- "Update the commit or diff buffer for the thing at point.
-
-Either show the commit or stash at point in the appropriate
-buffer, or if that buffer is already being displayed in the
-current frame and contains information about that commit or
-stash, then instead scroll the buffer up. If there is no
-commit or stash at point, then prompt for a commit."
- (interactive)
- (magit-diff-show-or-scroll 'scroll-up))
-
-(defun magit-diff-show-or-scroll-down ()
- "Update the commit or diff buffer for the thing at point.
-
-Either show the commit or stash at point in the appropriate
-buffer, or if that buffer is already being displayed in the
-current frame and contains information about that commit or
-stash, then instead scroll the buffer down. If there is no
-commit or stash at point, then prompt for a commit."
- (interactive)
- (magit-diff-show-or-scroll 'scroll-down))
-
-(defun magit-diff-show-or-scroll (fn)
- (let (rev cmd buf win)
- (cond
- (magit-blame-mode
- (setq rev (oref (magit-current-blame-chunk) orig-rev))
- (setq cmd 'magit-show-commit)
- (setq buf (magit-get-mode-buffer 'magit-revision-mode)))
- ((derived-mode-p 'git-rebase-mode)
- (with-slots (action-type target)
- (git-rebase-current-line)
- (if (not (eq action-type 'commit))
- (user-error "No commit on this line")
- (setq rev target)
- (setq cmd 'magit-show-commit)
- (setq buf (magit-get-mode-buffer 'magit-revision-mode)))))
- (t
- (magit-section-case
- (branch
- (setq rev (magit-ref-maybe-qualify (oref it value)))
- (setq cmd 'magit-show-commit)
- (setq buf (magit-get-mode-buffer 'magit-revision-mode)))
- (commit
- (setq rev (oref it value))
- (setq cmd 'magit-show-commit)
- (setq buf (magit-get-mode-buffer 'magit-revision-mode)))
- (stash
- (setq rev (oref it value))
- (setq cmd 'magit-stash-show)
- (setq buf (magit-get-mode-buffer 'magit-stash-mode))))))
- (if rev
- (if (and buf
- (setq win (get-buffer-window buf))
- (with-current-buffer buf
- (and (equal rev magit-buffer-revision)
- (equal (magit-rev-parse rev)
- magit-buffer-revision-hash))))
- (with-selected-window win
- (condition-case nil
- (funcall fn)
- (error
- (goto-char (pcase fn
- (`scroll-up (point-min))
- (`scroll-down (point-max)))))))
- (let ((magit-display-buffer-noselect t))
- (if (eq cmd 'magit-show-commit)
- (apply #'magit-show-commit rev (magit-show-commit--arguments))
- (funcall cmd rev))))
- (call-interactively #'magit-show-commit))))
-
-;;;; Section Commands
-
-(defun magit-section-cycle-diffs ()
- "Cycle visibility of diff-related sections in the current buffer."
- (interactive)
- (when-let ((sections
- (cond ((derived-mode-p 'magit-status-mode)
- (--mapcat
- (when it
- (when (oref it hidden)
- (magit-section-show it))
- (oref it children))
- (list (magit-get-section '((staged) (status)))
- (magit-get-section '((unstaged) (status))))))
- ((derived-mode-p 'magit-diff-mode)
- (-filter #'magit-file-section-p
- (oref magit-root-section children))))))
- (if (--any-p (oref it hidden) sections)
- (dolist (s sections)
- (magit-section-show s)
- (magit-section-hide-children s))
- (let ((children (--mapcat (oref it children) sections)))
- (cond ((and (--any-p (oref it hidden) children)
- (--any-p (oref it children) children))
- (mapc 'magit-section-show-headings sections))
- ((-any-p 'magit-section-hidden-body children)
- (mapc 'magit-section-show-children sections))
- (t
- (mapc 'magit-section-hide sections)))))))
-
-;;; Diff Mode
-
-(defvar magit-diff-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-mode-map)
- (define-key map (kbd "C-c C-d") 'magit-diff-while-committing)
- (define-key map (kbd "C-c C-b") 'magit-go-backward)
- (define-key map (kbd "C-c C-f") 'magit-go-forward)
- (define-key map (kbd "SPC") 'scroll-up)
- (define-key map (kbd "DEL") 'scroll-down)
- (define-key map (kbd "j") 'magit-jump-to-diffstat-or-diff)
- (define-key map [remap write-file] 'magit-patch-save)
- map)
- "Keymap for `magit-diff-mode'.")
-
-(define-derived-mode magit-diff-mode magit-mode "Magit Diff"
- "Mode for looking at a Git diff.
-
-This mode is documented in info node `(magit)Diff Buffer'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-section-toggle] to expand or hide the section at point.
-Type \\[magit-visit-thing] to visit the hunk or file at point.
-
-Staging and applying changes is documented in info node
-`(magit)Staging and Unstaging' and info node `(magit)Applying'.
-
-\\<magit-hunk-section-map>Type \
-\\[magit-apply] to apply the change at point, \
-\\[magit-stage] to stage,
-\\[magit-unstage] to unstage, \
-\\[magit-discard] to discard, or \
-\\[magit-reverse] to reverse it.
-
-\\{magit-diff-mode-map}"
- :group 'magit-diff
- (hack-dir-local-variables-non-file-buffer)
- (setq imenu-prev-index-position-function
- 'magit-imenu--diff-prev-index-position-function)
- (setq imenu-extract-index-name-function
- 'magit-imenu--diff-extract-index-name-function))
-
-(put 'magit-diff-mode 'magit-diff-default-arguments
- '("--stat" "--no-ext-diff"))
-
-(defun magit-diff-setup-buffer (range typearg args files &optional locked)
- (require 'magit)
- (magit-setup-buffer #'magit-diff-mode locked
- (magit-buffer-range range)
- (magit-buffer-typearg typearg)
- (magit-buffer-diff-args args)
- (magit-buffer-diff-files files)
- (magit-buffer-diff-files-suspended nil)))
-
-(defun magit-diff-refresh-buffer ()
- "Refresh the current `magit-diff-mode' buffer."
- (magit-set-header-line-format
- (if (equal magit-buffer-typearg "--no-index")
- (apply #'format "Differences between %s and %s" magit-buffer-diff-files)
- (concat (if magit-buffer-range
- (if (string-match-p "\\(\\.\\.\\|\\^-\\)"
- magit-buffer-range)
- (format "Changes in %s" magit-buffer-range)
- (format "Changes from %s to working tree" magit-buffer-range))
- (if (equal magit-buffer-typearg "--cached")
- "Staged changes"
- "Unstaged changes"))
- (pcase (length magit-buffer-diff-files)
- (0)
- (1 (concat " in file " (car magit-buffer-diff-files)))
- (_ (concat " in files "
- (mapconcat #'identity magit-buffer-diff-files ", ")))))))
- (setq magit-buffer-range-hashed
- (and magit-buffer-range (magit-hash-range magit-buffer-range)))
- (magit-insert-section (diffbuf)
- (magit-run-section-hook 'magit-diff-sections-hook)))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-diff-mode))
- (nconc (cond (magit-buffer-range
- (delq nil (list magit-buffer-range magit-buffer-typearg)))
- ((equal magit-buffer-typearg "--cached")
- (list 'staged))
- (t
- (list 'unstaged magit-buffer-typearg)))
- (and magit-buffer-diff-files (cons "--" magit-buffer-diff-files))))
-
-(defvar magit-diff-section-base-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-j") 'magit-diff-visit-worktree-file)
- (define-key map [C-return] 'magit-diff-visit-worktree-file)
- (define-key map [remap magit-visit-thing] 'magit-diff-visit-file)
- (define-key map [remap magit-delete-thing] 'magit-discard)
- (define-key map [remap magit-revert-no-commit] 'magit-reverse)
- (define-key map "a" 'magit-apply)
- (define-key map "s" 'magit-stage)
- (define-key map "u" 'magit-unstage)
- (define-key map "&" 'magit-do-async-shell-command)
- (define-key map "C" 'magit-commit-add-log)
- (define-key map (kbd "C-x a") 'magit-add-change-log-entry)
- (define-key map (kbd "C-x 4 a") 'magit-add-change-log-entry-other-window)
- (define-key map (kbd "C-c C-t") 'magit-diff-trace-definition)
- (define-key map (kbd "C-c C-e") 'magit-diff-edit-hunk-commit)
- map)
- "Parent of `magit-{hunk,file}-section-map'.")
-
-(defvar magit-file-section-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-diff-section-base-map)
- map)
- "Keymap for `file' sections.")
-
-(defvar magit-hunk-section-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-diff-section-base-map)
- map)
- "Keymap for `hunk' sections.")
-
-(defconst magit-diff-conflict-headline-re
- (concat "^" (regexp-opt
- ;; Defined in merge-tree.c in this order.
- '("merged"
- "added in remote"
- "added in both"
- "added in local"
- "removed in both"
- "changed in both"
- "removed in local"
- "removed in remote"))))
-
-(defconst magit-diff-headline-re
- (concat "^\\(@@@?\\|diff\\|Submodule\\|"
- "\\* Unmerged path\\|"
- (substring magit-diff-conflict-headline-re 1)
- "\\)"))
-
-(defconst magit-diff-statline-re
- (concat "^ ?"
- "\\(.*\\)" ; file
- "\\( +| +\\)" ; separator
- "\\([0-9]+\\|Bin\\(?: +[0-9]+ -> [0-9]+ bytes\\)?$\\) ?"
- "\\(\\+*\\)" ; add
- "\\(-*\\)$")) ; del
-
-(defvar magit-diff--reset-non-color-moved
- (list
- "-c" "color.diff.context=normal"
- "-c" "color.diff.plain=normal" ; historical synonym for context
- "-c" "color.diff.meta=normal"
- "-c" "color.diff.frag=normal"
- "-c" "color.diff.func=normal"
- "-c" "color.diff.old=normal"
- "-c" "color.diff.new=normal"
- "-c" "color.diff.commit=normal"
- "-c" "color.diff.whitespace=normal"
- ;; "git-range-diff" does not support "--color-moved", so we don't
- ;; need to reset contextDimmed, oldDimmed, newDimmed, contextBold,
- ;; oldBold, and newBold.
- ))
-
-(defun magit-insert-diff ()
- "Insert the diff into this `magit-diff-mode' buffer."
- (magit--insert-diff
- "diff" magit-buffer-range "-p" "--no-prefix"
- (and (member "--stat" magit-buffer-diff-args) "--numstat")
- magit-buffer-typearg
- magit-buffer-diff-args "--"
- magit-buffer-diff-files))
-
-(defun magit--insert-diff (&rest args)
- (declare (indent 0))
- (let ((magit-git-global-arguments
- (remove "--literal-pathspecs" magit-git-global-arguments)))
- (setq args (-flatten args))
- ;; As of Git 2.19.0, we need to generate diffs with
- ;; --ita-visible-in-index so that `magit-stage' can work with
- ;; intent-to-add files (see #4026). Cache the result for each
- ;; repo to avoid a `git version' call for every diff insertion.
- (when (and (not (equal (car args) "merge-tree"))
- (pcase (magit-repository-local-get 'diff-ita-kludge-p 'unset)
- (`unset
- (let ((val (version<= "2.19.0" (magit-git-version))))
- (magit-repository-local-set 'diff-ita-kludge-p val)
- val))
- (val val)))
- (push "--ita-visible-in-index" (cdr args)))
- (when (cl-member-if (lambda (arg) (string-prefix-p "--color-moved" arg)) args)
- (push "--color=always" (cdr args))
- (setq magit-git-global-arguments
- (append magit-diff--reset-non-color-moved
- magit-git-global-arguments)))
- (magit-git-wash #'magit-diff-wash-diffs args)))
-
-(defun magit-diff-wash-diffs (args &optional limit)
- (run-hooks 'magit-diff-wash-diffs-hook)
- (when (member "--show-signature" args)
- (magit-diff-wash-signature))
- (when (member "--stat" args)
- (magit-diff-wash-diffstat))
- (when (re-search-forward magit-diff-headline-re limit t)
- (goto-char (line-beginning-position))
- (magit-wash-sequence (apply-partially 'magit-diff-wash-diff args))
- (insert ?\n)))
-
-(defun magit-jump-to-diffstat-or-diff ()
- "Jump to the diffstat or diff.
-When point is on a file inside the diffstat section, then jump
-to the respective diff section, otherwise jump to the diffstat
-section or a child thereof."
- (interactive)
- (--if-let (magit-get-section
- (append (magit-section-case
- ([file diffstat] `((file . ,(oref it value))))
- (file `((file . ,(oref it value)) (diffstat)))
- (t '((diffstat))))
- (magit-section-ident magit-root-section)))
- (magit-section-goto it)
- (user-error "No diffstat in this buffer")))
-
-(defun magit-diff-wash-signature ()
- (when (looking-at "^gpg: ")
- (magit-insert-section (signature)
- (while (looking-at "^gpg: ")
- (forward-line))
- (insert "\n"))))
-
-(defun magit-diff-wash-diffstat ()
- (let (heading (beg (point)))
- (when (re-search-forward "^ ?\\([0-9]+ +files? change[^\n]*\n\\)" nil t)
- (setq heading (match-string 1))
- (magit-delete-match)
- (goto-char beg)
- (magit-insert-section (diffstat)
- (insert (propertize heading 'font-lock-face 'magit-diff-file-heading))
- (magit-insert-heading)
- (let (files)
- (while (looking-at "^[-0-9]+\t[-0-9]+\t\\(.+\\)$")
- (push (magit-decode-git-path
- (let ((f (match-string 1)))
- (cond
- ((string-match "\\`\\([^{]+\\){\\(.+\\) => \\(.+\\)}\\'" f)
- (concat (match-string 1 f)
- (match-string 3 f)))
- ((string-match " => " f)
- (substring f (match-end 0)))
- (t f))))
- files)
- (magit-delete-line))
- (setq files (nreverse files))
- (while (looking-at magit-diff-statline-re)
- (magit-bind-match-strings (file sep cnt add del) nil
- (magit-delete-line)
- (when (string-match " +$" file)
- (setq sep (concat (match-string 0 file) sep))
- (setq file (substring file 0 (match-beginning 0))))
- (let ((le (length file)) ld)
- (setq file (magit-decode-git-path file))
- (setq ld (length file))
- (when (> le ld)
- (setq sep (concat (make-string (- le ld) ?\s) sep))))
- (magit-insert-section (file (pop files))
- (insert (propertize file 'font-lock-face 'magit-filename)
- sep cnt " ")
- (when add
- (insert (propertize add 'font-lock-face
- 'magit-diffstat-added)))
- (when del
- (insert (propertize del 'font-lock-face
- 'magit-diffstat-removed)))
- (insert "\n")))))
- (if (looking-at "^$") (forward-line) (insert "\n"))))))
-
-(defun magit-diff-wash-diff (args)
- (when (cl-member-if (lambda (arg) (string-prefix-p "--color-moved" arg)) args)
- (require 'ansi-color)
- (ansi-color-apply-on-region (point-min) (point-max)))
- (cond
- ((looking-at "^Submodule")
- (magit-diff-wash-submodule))
- ((looking-at "^\\* Unmerged path \\(.*\\)")
- (let ((file (magit-decode-git-path (match-string 1))))
- (magit-delete-line)
- (unless (and (derived-mode-p 'magit-status-mode)
- (not (member "--cached" args)))
- (magit-insert-section (file file)
- (insert (propertize
- (format "unmerged %s%s" file
- (pcase (cddr (car (magit-file-status file)))
- (`(?D ?D) " (both deleted)")
- (`(?D ?U) " (deleted by us)")
- (`(?U ?D) " (deleted by them)")
- (`(?A ?A) " (both added)")
- (`(?A ?U) " (added by us)")
- (`(?U ?A) " (added by them)")
- (`(?U ?U) "")))
- 'font-lock-face 'magit-diff-file-heading))
- (insert ?\n))))
- t)
- ((looking-at magit-diff-conflict-headline-re)
- (let ((long-status (match-string 0))
- (status "BUG")
- file orig base modes)
- (if (equal long-status "merged")
- (progn (setq status long-status)
- (setq long-status nil))
- (setq status (pcase-exhaustive long-status
- ("added in remote" "new file")
- ("added in both" "new file")
- ("added in local" "new file")
- ("removed in both" "removed")
- ("changed in both" "changed")
- ("removed in local" "removed")
- ("removed in remote" "removed"))))
- (magit-delete-line)
- (while (looking-at
- "^ \\([^ ]+\\) +[0-9]\\{6\\} \\([a-z0-9]\\{40\\}\\) \\(.+\\)$")
- (magit-bind-match-strings (side _blob name) nil
- (pcase side
- ("result" (setq file name))
- ("our" (setq orig name))
- ("their" (setq file name))
- ("base" (setq base name))))
- (magit-delete-line))
- (when orig (setq orig (magit-decode-git-path orig)))
- (when file (setq file (magit-decode-git-path file)))
- (magit-diff-insert-file-section
- (or file base) orig status modes nil long-status)))
- ((looking-at
- "^diff --\\(?:\\(git\\) \\(?:\\(.+?\\) \\2\\)?\\|\\(cc\\|combined\\) \\(.+\\)\\)")
- (let ((status (cond ((equal (match-string 1) "git") "modified")
- ((derived-mode-p 'magit-revision-mode) "resolved")
- (t "unmerged")))
- (file (or (match-string 2) (match-string 4)))
- (beg (point))
- orig header modes)
- (save-excursion
- (forward-line 1)
- (setq header (buffer-substring
- beg (if (re-search-forward magit-diff-headline-re nil t)
- (match-beginning 0)
- (point-max)))))
- (magit-delete-line)
- (while (not (or (eobp) (looking-at magit-diff-headline-re)))
- (if (looking-at "^old mode \\([^\n]+\\)\nnew mode \\([^\n]+\\)\n")
- (progn (setq modes (match-string 0))
- (magit-delete-match))
- (cond
- ((looking-at "^--- \\([^/].*?\\)\t?$") ; i.e. not /dev/null
- (setq orig (match-string 1)))
- ((looking-at "^\\+\\+\\+ \\([^/].*?\\)\t?$")
- (setq file (match-string 1)))
- ((looking-at "^\\(copy\\|rename\\) from \\(.+\\)$")
- (setq orig (match-string 2)))
- ((looking-at "^\\(copy\\|rename\\) to \\(.+\\)$")
- (setq file (match-string 2))
- (setq status (if (equal (match-string 1) "copy") "new file" "renamed")))
- ((looking-at "^\\(new file\\|deleted\\)")
- (setq status (match-string 1))))
- (magit-delete-line)))
- (when orig
- (setq orig (magit-decode-git-path orig)))
- (setq file (magit-decode-git-path file))
- ;; KLUDGE `git-log' ignores `--no-prefix' when `-L' is used.
- (when (and (derived-mode-p 'magit-log-mode)
- (--first (string-match-p "\\`-L" it) magit-buffer-log-args))
- (setq file (substring file 2))
- (when orig
- (setq orig (substring orig 2))))
- (magit-diff-insert-file-section file orig status modes header)))))
-
-(defun magit-diff-insert-file-section
- (file orig status modes header &optional long-status)
- (magit-insert-section section
- (file file (or (equal status "deleted")
- (derived-mode-p 'magit-status-mode)))
- (insert (propertize (format "%-10s %s" status
- (if (or (not orig) (equal orig file))
- file
- (format "%s -> %s" orig file)))
- 'font-lock-face 'magit-diff-file-heading))
- (when long-status
- (insert (format " (%s)" long-status)))
- (magit-insert-heading)
- (unless (equal orig file)
- (oset section source orig))
- (oset section header header)
- (when modes
- (magit-insert-section (hunk)
- (insert modes)
- (magit-insert-heading)))
- (magit-wash-sequence #'magit-diff-wash-hunk)))
-
-(defun magit-diff-wash-submodule ()
- ;; See `show_submodule_summary' in submodule.c and "this" commit.
- (when (looking-at "^Submodule \\([^ ]+\\)")
- (let ((module (match-string 1))
- untracked modified)
- (when (looking-at "^Submodule [^ ]+ contains untracked content$")
- (magit-delete-line)
- (setq untracked t))
- (when (looking-at "^Submodule [^ ]+ contains modified content$")
- (magit-delete-line)
- (setq modified t))
- (cond
- ((and (looking-at "^Submodule \\([^ ]+\\) \\([^ :]+\\)\\( (rewind)\\)?:$")
- (equal (match-string 1) module))
- (magit-bind-match-strings (_module range rewind) nil
- (magit-delete-line)
- (while (looking-at "^ \\([<>]\\) \\(.+\\)$")
- (magit-delete-line))
- (when rewind
- (setq range (replace-regexp-in-string "[^.]\\(\\.\\.\\)[^.]"
- "..." range t t 1)))
- (magit-insert-section (magit-module-section module t)
- (magit-insert-heading
- (propertize (concat "modified " module)
- 'font-lock-face 'magit-diff-file-heading)
- " ("
- (cond (rewind "rewind")
- ((string-match-p "\\.\\.\\." range) "non-ff")
- (t "new commits"))
- (and (or modified untracked)
- (concat ", "
- (and modified "modified")
- (and modified untracked " and ")
- (and untracked "untracked")
- " content"))
- ")")
- (let ((default-directory
- (file-name-as-directory
- (expand-file-name module (magit-toplevel)))))
- (magit-git-wash (apply-partially 'magit-log-wash-log 'module)
- "log" "--oneline" "--left-right" range)
- (delete-char -1)))))
- ((and (looking-at "^Submodule \\([^ ]+\\) \\([^ ]+\\) (\\([^)]+\\))$")
- (equal (match-string 1) module))
- (magit-bind-match-strings (_module _range msg) nil
- (magit-delete-line)
- (magit-insert-section (magit-module-section module)
- (magit-insert-heading
- (propertize (concat "submodule " module)
- 'font-lock-face 'magit-diff-file-heading)
- " (" msg ")"))))
- (t
- (magit-insert-section (magit-module-section module)
- (magit-insert-heading
- (propertize (concat "modified " module)
- 'font-lock-face 'magit-diff-file-heading)
- " ("
- (and modified "modified")
- (and modified untracked " and ")
- (and untracked "untracked")
- " content)")))))))
-
-(defun magit-diff-wash-hunk ()
- (when (looking-at "^@\\{2,\\} \\(.+?\\) @\\{2,\\}\\(?: \\(.*\\)\\)?")
- (let* ((heading (match-string 0))
- (ranges (mapcar (lambda (str)
- (mapcar (lambda (n) (string-to-number n))
- (split-string (substring str 1) ",")))
- (split-string (match-string 1))))
- (about (match-string 2))
- (combined (= (length ranges) 3))
- (value (cons about ranges)))
- (magit-delete-line)
- (magit-insert-section section (hunk value)
- (insert (propertize (concat heading "\n")
- 'font-lock-face 'magit-diff-hunk-heading))
- (magit-insert-heading)
- (while (not (or (eobp) (looking-at "^[^-+\s\\]")))
- (forward-line))
- (oset section end (point))
- (oset section washer 'magit-diff-paint-hunk)
- (oset section combined combined)
- (if combined
- (oset section from-ranges (butlast ranges))
- (oset section from-range (car ranges)))
- (oset section to-range (car (last ranges)))
- (oset section about about)))
- t))
-
-(defun magit-diff-expansion-threshold (section)
- "Keep new diff sections collapsed if washing takes too long."
- (and (magit-file-section-p section)
- (> (float-time (time-subtract (current-time) magit-refresh-start-time))
- magit-diff-expansion-threshold)
- 'hide))
-
-(add-hook 'magit-section-set-visibility-hook #'magit-diff-expansion-threshold)
-
-;;; Revision Mode
-
-(define-derived-mode magit-revision-mode magit-diff-mode "Magit Rev"
- "Mode for looking at a Git commit.
-
-This mode is documented in info node `(magit)Revision Buffer'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-section-toggle] to expand or hide the section at point.
-Type \\[magit-visit-thing] to visit the hunk or file at point.
-
-Staging and applying changes is documented in info node
-`(magit)Staging and Unstaging' and info node `(magit)Applying'.
-
-\\<magit-hunk-section-map>Type \
-\\[magit-apply] to apply the change at point, \
-\\[magit-stage] to stage,
-\\[magit-unstage] to unstage, \
-\\[magit-discard] to discard, or \
-\\[magit-reverse] to reverse it.
-
-\\{magit-revision-mode-map}"
- :group 'magit-revision
- (hack-dir-local-variables-non-file-buffer))
-
-(put 'magit-revision-mode 'magit-diff-default-arguments
- '("--stat" "--no-ext-diff"))
-
-(defun magit-revision-setup-buffer (rev args files)
- (magit-setup-buffer #'magit-revision-mode nil
- (magit-buffer-revision rev)
- (magit-buffer-range (format "%s^..%s" rev rev))
- (magit-buffer-diff-args args)
- (magit-buffer-diff-files files)
- (magit-buffer-diff-files-suspended nil)))
-
-(defun magit-revision-refresh-buffer ()
- (magit-set-header-line-format
- (concat (capitalize (magit-object-type magit-buffer-revision))
- " " magit-buffer-revision
- (pcase (length magit-buffer-diff-files)
- (0)
- (1 (concat " limited to file " (car magit-buffer-diff-files)))
- (_ (concat " limited to files "
- (mapconcat #'identity magit-buffer-diff-files ", "))))))
- (setq magit-buffer-revision-hash (magit-rev-parse magit-buffer-revision))
- (magit-insert-section (commitbuf)
- (magit-run-section-hook 'magit-revision-sections-hook)))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-revision-mode))
- (cons magit-buffer-revision magit-buffer-diff-files))
-
-(defun magit-insert-revision-diff ()
- "Insert the diff into this `magit-revision-mode' buffer."
- (magit--insert-diff
- "show" "-p" "--cc" "--format=" "--no-prefix"
- (and (member "--stat" magit-buffer-diff-args) "--numstat")
- magit-buffer-diff-args
- (concat magit-buffer-revision "^{commit}")
- "--" magit-buffer-diff-files))
-
-(defun magit-insert-revision-tag ()
- "Insert tag message and headers into a revision buffer.
-This function only inserts anything when `magit-show-commit' is
-called with a tag as argument, when that is called with a commit
-or a ref which is not a branch, then it inserts nothing."
- (when (equal (magit-object-type magit-buffer-revision) "tag")
- (magit-insert-section (taginfo)
- (let ((beg (point)))
- ;; "git verify-tag -v" would output what we need, but the gpg
- ;; output is send to stderr and we have no control over the
- ;; order in which stdout and stderr are inserted, which would
- ;; make parsing hard. We are forced to use "git cat-file tag"
- ;; instead, which inserts the signature instead of verifying
- ;; it. We remove that later and then insert the verification
- ;; output using "git verify-tag" (without the "-v").
- (magit-git-insert "cat-file" "tag" magit-buffer-revision)
- (goto-char beg)
- (forward-line 3)
- (delete-region beg (point)))
- (looking-at "^tagger \\([^<]+\\) <\\([^>]+\\)")
- (let ((heading (format "Tagger: %s <%s>"
- (match-string 1)
- (match-string 2))))
- (magit-delete-line)
- (insert (propertize heading 'font-lock-face
- 'magit-section-secondary-heading)))
- (magit-insert-heading)
- (if (re-search-forward "-----BEGIN PGP SIGNATURE-----" nil t)
- (progn
- (let ((beg (match-beginning 0)))
- (re-search-forward "-----END PGP SIGNATURE-----")
- (delete-region beg (point)))
- (insert ?\n)
- (process-file magit-git-executable nil t nil
- "verify-tag" magit-buffer-revision))
- (goto-char (point-max)))
- (insert ?\n))))
-
-(defvar magit-commit-message-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-show-commit)
- map)
- "Keymap for `commit-message' sections.")
-
-(defun magit-insert-revision-message ()
- "Insert the commit message into a revision buffer."
- (magit-insert-section section (commit-message)
- (oset section heading-highlight-face 'magit-diff-revision-summary-highlight)
- (let ((beg (point))
- (rev magit-buffer-revision))
- (insert (with-temp-buffer
- (magit-rev-insert-format "%B" rev)
- (magit-revision--wash-message)))
- (if (= (point) (+ beg 2))
- (progn (backward-delete-char 2)
- (insert "(no message)\n"))
- (goto-char beg)
- (save-excursion
- (while (search-forward "\r\n" nil t) ; Remove trailing CRs.
- (delete-region (match-beginning 0) (1+ (match-beginning 0)))))
- (when magit-revision-fill-summary-line
- (let ((fill-column (min magit-revision-fill-summary-line
- (window-width))))
- (fill-region (point) (line-end-position))))
- (when magit-revision-use-hash-sections
- (save-excursion
- (while (not (eobp))
- (re-search-forward "\\_<" nil 'move)
- (let ((beg (point)))
- (re-search-forward "\\_>" nil t)
- (when (> (point) beg)
- (let ((text (buffer-substring-no-properties beg (point))))
- (when (pcase magit-revision-use-hash-sections
- (`quickest ; false negatives and positives
- (and (>= (length text) 7)
- (string-match-p "[0-9]" text)
- (string-match-p "[a-z]" text)))
- (`quicker ; false negatives (number-less hashes)
- (and (>= (length text) 7)
- (string-match-p "[0-9]" text)
- (magit-commit-p text)))
- (`quick ; false negatives (short hashes)
- (and (>= (length text) 7)
- (magit-commit-p text)))
- (`slow
- (magit-commit-p text)))
- (put-text-property beg (point)
- 'font-lock-face 'magit-hash)
- (let ((end (point)))
- (goto-char beg)
- (magit-insert-section (commit text)
- (goto-char end))))))))))
- (save-excursion
- (forward-line)
- (magit--add-face-text-property
- beg (point) 'magit-diff-revision-summary)
- (magit-insert-heading))
- (when magit-diff-highlight-keywords
- (save-excursion
- (while (re-search-forward "\\[[^[]*\\]" nil t)
- (let ((beg (match-beginning 0))
- (end (match-end 0)))
- (put-text-property
- beg end 'font-lock-face
- (if-let ((face (get-text-property beg 'font-lock-face)))
- (list face 'magit-keyword)
- 'magit-keyword))))))
- (goto-char (point-max))))))
-
-(defun magit-insert-revision-notes ()
- "Insert commit notes into a revision buffer."
- (let* ((var "core.notesRef")
- (def (or (magit-get var) "refs/notes/commits")))
- (dolist (ref (or (magit-list-active-notes-refs)))
- (magit-insert-section section (notes ref (not (equal ref def)))
- (oset section heading-highlight-face 'magit-diff-hunk-heading-highlight)
- (let ((beg (point))
- (rev magit-buffer-revision))
- (insert (with-temp-buffer
- (magit-git-insert "-c" (concat "core.notesRef=" ref)
- "notes" "show" rev)
- (magit-revision--wash-message)))
- (if (= (point) beg)
- (magit-cancel-section)
- (goto-char beg)
- (end-of-line)
- (insert (format " (%s)"
- (propertize (if (string-prefix-p "refs/notes/" ref)
- (substring ref 11)
- ref)
- 'font-lock-face 'magit-refname)))
- (forward-char)
- (magit--add-face-text-property beg (point) 'magit-diff-hunk-heading)
- (magit-insert-heading)
- (goto-char (point-max))
- (insert ?\n)))))))
-
-(defun magit-revision--wash-message ()
- (let ((major-mode 'git-commit-mode))
- (hack-dir-local-variables)
- (hack-local-variables-apply))
- (unless (memq git-commit-major-mode '(nil text-mode))
- (funcall git-commit-major-mode)
- (font-lock-ensure))
- (buffer-string))
-
-(defun magit-insert-revision-headers ()
- "Insert headers about the commit into a revision buffer."
- (magit-insert-section (headers)
- (--when-let (magit-rev-format "%D" magit-buffer-revision "--decorate=full")
- (insert (magit-format-ref-labels it) ?\s))
- (insert (propertize
- (magit-rev-parse (concat magit-buffer-revision "^{commit}"))
- 'font-lock-face 'magit-hash))
- (magit-insert-heading)
- (let ((beg (point)))
- (magit-rev-insert-format magit-revision-headers-format
- magit-buffer-revision)
- (magit-insert-revision-gravatars magit-buffer-revision beg))
- (when magit-revision-insert-related-refs
- (dolist (parent (magit-commit-parents magit-buffer-revision))
- (magit-insert-section (commit parent)
- (let ((line (magit-rev-format "%h %s" parent)))
- (string-match "^\\([^ ]+\\) \\(.*\\)" line)
- (magit-bind-match-strings (hash msg) line
- (insert "Parent: ")
- (insert (propertize hash 'font-lock-face 'magit-hash))
- (insert " " msg "\n")))))
- (magit--insert-related-refs
- magit-buffer-revision "--merged" "Merged"
- (eq magit-revision-insert-related-refs 'all))
- (magit--insert-related-refs
- magit-buffer-revision "--contains" "Contained"
- (eq magit-revision-insert-related-refs '(all mixed)))
- (when-let ((follows (magit-get-current-tag magit-buffer-revision t)))
- (let ((tag (car follows))
- (cnt (cadr follows)))
- (magit-insert-section (tag tag)
- (insert
- (format "Follows: %s (%s)\n"
- (propertize tag 'font-lock-face 'magit-tag)
- (propertize (number-to-string cnt)
- 'font-lock-face 'magit-branch-local))))))
- (when-let ((precedes (magit-get-next-tag magit-buffer-revision t)))
- (let ((tag (car precedes))
- (cnt (cadr precedes)))
- (magit-insert-section (tag tag)
- (insert (format "Precedes: %s (%s)\n"
- (propertize tag 'font-lock-face 'magit-tag)
- (propertize (number-to-string cnt)
- 'font-lock-face 'magit-tag))))))
- (insert ?\n))))
-
-(defun magit--insert-related-refs (rev arg title remote)
- (when-let ((refs (magit-list-related-branches arg rev (and remote "-a"))))
- (insert title ":" (make-string (- 10 (length title)) ?\s))
- (dolist (branch refs)
- (if (<= (+ (current-column) 1 (length branch))
- (window-width))
- (insert ?\s)
- (insert ?\n (make-string 12 ?\s)))
- (magit-insert-section (branch branch)
- (insert (propertize branch 'font-lock-face
- (if (string-prefix-p "remotes/" branch)
- 'magit-branch-remote
- 'magit-branch-local)))))
- (insert ?\n)))
-
-(defun magit-insert-revision-gravatars (rev beg)
- (when (and magit-revision-show-gravatars
- (window-system))
- (require 'gravatar)
- (pcase-let ((`(,author . ,committer)
- (pcase magit-revision-show-gravatars
- (`t '("^Author: " . "^Commit: "))
- (`author '("^Author: " . nil))
- (`committer '(nil . "^Commit: "))
- (_ magit-revision-show-gravatars))))
- (--when-let (and author (magit-rev-format "%aE" rev))
- (magit-insert-revision-gravatar beg rev it author))
- (--when-let (and committer (magit-rev-format "%cE" rev))
- (magit-insert-revision-gravatar beg rev it committer)))))
-
-(defun magit-insert-revision-gravatar (beg rev email regexp)
- (save-excursion
- (goto-char beg)
- (when (re-search-forward regexp nil t)
- (when-let ((window (get-buffer-window)))
- (let* ((column (length (match-string 0)))
- (font-obj (query-font (font-at (point) window)))
- (size (* 2 (+ (aref font-obj 4)
- (aref font-obj 5))))
- (align-to (+ column
- (ceiling (/ size (aref font-obj 7) 1.0))
- 1))
- (gravatar-size (- size 2)))
- (ignore-errors ; service may be unreachable
- (gravatar-retrieve email 'magit-insert-revision-gravatar-cb
- (list rev (point-marker) align-to column))))))))
-
-(defun magit-insert-revision-gravatar-cb (image rev marker align-to column)
- (unless (eq image 'error)
- (when-let ((buffer (marker-buffer marker)))
- (with-current-buffer buffer
- (save-excursion
- (goto-char marker)
- ;; The buffer might display another revision by now or
- ;; it might have been refreshed, in which case another
- ;; process might already have inserted the image.
- (when (and (equal rev magit-buffer-revision)
- (not (eq (car-safe
- (car-safe
- (get-text-property (point) 'display)))
- 'image)))
- (let ((top `((,@image :ascent center :relief 1)
- (slice 0.0 0.0 1.0 0.5)))
- (bot `((,@image :ascent center :relief 1)
- (slice 0.0 0.5 1.0 1.0)))
- (align `((space :align-to ,align-to))))
- (when magit-revision-use-gravatar-kludge
- (cl-rotatef top bot))
- (let ((inhibit-read-only t))
- (insert (propertize " " 'display top))
- (insert (propertize " " 'display align))
- (forward-line)
- (forward-char column)
- (insert (propertize " " 'display bot))
- (insert (propertize " " 'display align))))))))))
-
-;;; Merge-Preview Mode
-
-(define-derived-mode magit-merge-preview-mode magit-diff-mode "Magit Merge"
- "Mode for previewing a merge."
- :group 'magit-diff
- (hack-dir-local-variables-non-file-buffer))
-
-(put 'magit-merge-preview-mode 'magit-diff-default-arguments
- '("--no-ext-diff"))
-
-(defun magit-merge-preview-setup-buffer (rev)
- (magit-setup-buffer #'magit-merge-preview-mode nil
- (magit-buffer-revision rev)
- (magit-buffer-range (format "%s^..%s" rev rev))))
-
-(defun magit-merge-preview-refresh-buffer ()
- (let* ((branch (magit-get-current-branch))
- (head (or branch (magit-rev-verify "HEAD"))))
- (magit-set-header-line-format (format "Preview merge of %s into %s"
- magit-buffer-revision
- (or branch "HEAD")))
- (magit-insert-section (diffbuf)
- (magit--insert-diff
- "merge-tree" (magit-git-string "merge-base" head magit-buffer-revision)
- head magit-buffer-revision))))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-merge-preview-mode))
- magit-buffer-revision)
-
-;;; Diff Sections
-
-(defun magit-hunk-set-window-start (section)
- "When SECTION is a `hunk', ensure that its beginning is visible.
-It the SECTION has a different type, then do nothing."
- (when (magit-hunk-section-p section)
- (magit-section-set-window-start section)))
-
-(add-hook 'magit-section-movement-hook #'magit-hunk-set-window-start)
-
-(defun magit-hunk-goto-successor (section arg)
- (and (magit-hunk-section-p section)
- (when-let ((parent (magit-get-section
- (magit-section-ident
- (oref section parent)))))
- (let* ((children (oref parent children))
- (siblings (magit-section-siblings section 'prev))
- (previous (nth (length siblings) children)))
- (if (not arg)
- (--when-let (or previous (car (last children)))
- (magit-section-goto it)
- t)
- (when previous
- (magit-section-goto previous))
- (if (and (stringp arg)
- (re-search-forward arg (oref parent end) t))
- (goto-char (match-beginning 0))
- (goto-char (oref (car (last children)) end))
- (forward-line -1)
- (while (looking-at "^ ") (forward-line -1))
- (while (looking-at "^[-+]") (forward-line -1))
- (forward-line)))))))
-
-(add-hook 'magit-section-goto-successor-hook #'magit-hunk-goto-successor)
-
-(defvar magit-unstaged-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-diff-unstaged)
- (define-key map [remap magit-delete-thing] 'magit-discard)
- (define-key map "s" 'magit-stage)
- (define-key map "u" 'magit-unstage)
- map)
- "Keymap for the `unstaged' section.")
-
-(magit-define-section-jumper magit-jump-to-unstaged "Unstaged changes" unstaged)
-
-(defun magit-insert-unstaged-changes ()
- "Insert section showing unstaged changes."
- (magit-insert-section (unstaged)
- (magit-insert-heading "Unstaged changes:")
- (magit--insert-diff
- "diff" magit-buffer-diff-args "--no-prefix"
- "--" magit-buffer-diff-files)))
-
-(defvar magit-staged-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-diff-staged)
- (define-key map [remap magit-delete-thing] 'magit-discard)
- (define-key map [remap magit-revert-no-commit] 'magit-reverse)
- (define-key map "s" 'magit-stage)
- (define-key map "u" 'magit-unstage)
- map)
- "Keymap for the `staged' section.")
-
-(magit-define-section-jumper magit-jump-to-staged "Staged changes" staged)
-
-(defun magit-insert-staged-changes ()
- "Insert section showing staged changes."
- ;; Avoid listing all files as deleted when visiting a bare repo.
- (unless (magit-bare-repo-p)
- (magit-insert-section (staged)
- (magit-insert-heading "Staged changes:")
- (magit--insert-diff
- "diff" "--cached" magit-buffer-diff-args "--no-prefix"
- "--" magit-buffer-diff-files))))
-
-;;; Diff Type
-
-(defun magit-diff-type (&optional section)
- "Return the diff type of SECTION.
-
-The returned type is one of the symbols `staged', `unstaged',
-`committed', or `undefined'. This type serves a similar purpose
-as the general type common to all sections (which is stored in
-the `type' slot of the corresponding `magit-section' struct) but
-takes additional information into account. When the SECTION
-isn't related to diffs and the buffer containing it also isn't
-a diff-only buffer, then return nil.
-
-Currently the type can also be one of `tracked' and `untracked'
-but these values are not handled explicitly everywhere they
-should be and a possible fix could be to just return nil here.
-
-The section has to be a `diff' or `hunk' section, or a section
-whose children are of type `diff'. If optional SECTION is nil,
-return the diff type for the current section. In buffers whose
-major mode is `magit-diff-mode' SECTION is ignored and the type
-is determined using other means. In `magit-revision-mode'
-buffers the type is always `committed'.
-
-Do not confuse this with `magit-diff-scope' (which see)."
- (--when-let (or section (magit-current-section))
- (cond ((derived-mode-p 'magit-revision-mode 'magit-stash-mode) 'committed)
- ((derived-mode-p 'magit-diff-mode)
- (let ((range magit-buffer-range)
- (const magit-buffer-typearg))
- (cond ((equal const "--no-index") 'undefined)
- ((or (not range)
- (magit-rev-eq range "HEAD"))
- (if (equal const "--cached")
- 'staged
- 'unstaged))
- ((equal const "--cached")
- (if (magit-rev-head-p range)
- 'staged
- 'undefined)) ; i.e. committed and staged
- (t 'committed))))
- ((derived-mode-p 'magit-status-mode)
- (let ((stype (oref it type)))
- (if (memq stype '(staged unstaged tracked untracked))
- stype
- (pcase stype
- ((or `file `module)
- (let* ((parent (oref it parent))
- (type (oref parent type)))
- (if (memq type '(file module))
- (magit-diff-type parent)
- type)))
- (`hunk (-> it
- (oref parent)
- (oref parent)
- (oref type)))))))
- ((derived-mode-p 'magit-log-mode)
- (if (or (and (magit-section-match 'commit section)
- (oref section children))
- (magit-section-match [* file commit] section))
- 'committed
- 'undefined))
- (t 'undefined))))
-
-(cl-defun magit-diff-scope (&optional (section nil ssection) strict)
- "Return the diff scope of SECTION or the selected section(s).
-
-A diff's \"scope\" describes what part of a diff is selected, it is
-a symbol, one of `region', `hunk', `hunks', `file', `files', or
-`list'. Do not confuse this with the diff \"type\", as returned by
-`magit-diff-type'.
-
-If optional SECTION is non-nil, then return the scope of that,
-ignoring the sections selected by the region. Otherwise return
-the scope of the current section, or if the region is active and
-selects a valid group of diff related sections, the type of these
-sections, i.e. `hunks' or `files'. If SECTION, or if that is nil
-the current section, is a `hunk' section; and the region region
-starts and ends inside the body of a that section, then the type
-is `region'. If the region is empty after a mouse click, then
-`hunk' is returned instead of `region'.
-
-If optional STRICT is non-nil, then return nil if the diff type of
-the section at point is `untracked' or the section at point is not
-actually a `diff' but a `diffstat' section."
- (let ((siblings (and (not ssection) (magit-region-sections nil t))))
- (setq section (or section (car siblings) (magit-current-section)))
- (when (and section
- (or (not strict)
- (and (not (eq (magit-diff-type section) 'untracked))
- (not (eq (--when-let (oref section parent)
- (oref it type))
- 'diffstat)))))
- (pcase (list (oref section type)
- (and siblings t)
- (magit-diff-use-hunk-region-p)
- ssection)
- (`(hunk nil t ,_)
- (if (magit-section-internal-region-p section) 'region 'hunk))
- (`(hunk t t nil) 'hunks)
- (`(hunk ,_ ,_ ,_) 'hunk)
- (`(file t t nil) 'files)
- (`(file ,_ ,_ ,_) 'file)
- (`(module t t nil) 'files)
- (`(module ,_ ,_ ,_) 'file)
- (`(,(or `staged `unstaged `untracked)
- nil ,_ ,_) 'list)))))
-
-(defun magit-diff-use-hunk-region-p ()
- (and (region-active-p)
- ;; TODO implement this from first principals
- ;; currently it's trial-and-error
- (not (and (or (eq this-command 'mouse-drag-region)
- (eq last-command 'mouse-drag-region)
- ;; When another window was previously
- ;; selected then the last-command is
- ;; some byte-code function.
- (byte-code-function-p last-command))
- (eq (region-end) (region-beginning))))))
-
-;;; Diff Highlight
-
-(add-hook 'magit-section-unhighlight-hook #'magit-diff-unhighlight)
-(add-hook 'magit-section-highlight-hook #'magit-diff-highlight)
-
-(defun magit-diff-unhighlight (section selection)
- "Remove the highlighting of the diff-related SECTION."
- (when (magit-hunk-section-p section)
- (magit-diff-paint-hunk section selection nil)
- t))
-
-(defun magit-diff-highlight (section selection)
- "Highlight the diff-related SECTION.
-If SECTION is not a diff-related section, then do nothing and
-return nil. If SELECTION is non-nil, then it is a list of sections
-selected by the region, including SECTION. All of these sections
-are highlighted."
- (if (and (magit-section-match 'commit section)
- (oref section children))
- (progn (if selection
- (dolist (section selection)
- (magit-diff-highlight-list section selection))
- (magit-diff-highlight-list section))
- t)
- (when-let ((scope (magit-diff-scope section t)))
- (cond ((eq scope 'region)
- (magit-diff-paint-hunk section selection t))
- (selection
- (dolist (section selection)
- (magit-diff-highlight-recursive section selection)))
- (t
- (magit-diff-highlight-recursive section)))
- t)))
-
-(defun magit-diff-highlight-recursive (section &optional selection)
- (pcase (magit-diff-scope section)
- (`list (magit-diff-highlight-list section selection))
- (`file (magit-diff-highlight-file section selection))
- (`hunk (magit-diff-highlight-heading section selection)
- (magit-diff-paint-hunk section selection t))
- (_ (magit-section-highlight section nil))))
-
-(defun magit-diff-highlight-list (section &optional selection)
- (let ((beg (oref section start))
- (cnt (oref section content))
- (end (oref section end)))
- (when (or (eq this-command 'mouse-drag-region)
- (not selection))
- (unless (and (region-active-p)
- (<= (region-beginning) beg))
- (magit-section-make-overlay beg cnt 'magit-section-highlight))
- (unless (oref section hidden)
- (dolist (child (oref section children))
- (when (or (eq this-command 'mouse-drag-region)
- (not (and (region-active-p)
- (<= (region-beginning)
- (oref child start)))))
- (magit-diff-highlight-recursive child selection)))))
- (when magit-diff-highlight-hunk-body
- (magit-section-make-overlay (1- end) end 'magit-section-highlight))))
-
-(defun magit-diff-highlight-file (section &optional selection)
- (magit-diff-highlight-heading section selection)
- (unless (oref section hidden)
- (dolist (child (oref section children))
- (magit-diff-highlight-recursive child selection))))
-
-(defun magit-diff-highlight-heading (section &optional selection)
- (magit-section-make-overlay
- (oref section start)
- (or (oref section content)
- (oref section end))
- (pcase (list (oref section type)
- (and (member section selection)
- (not (eq this-command 'mouse-drag-region))))
- (`(file t) 'magit-diff-file-heading-selection)
- (`(file nil) 'magit-diff-file-heading-highlight)
- (`(module t) 'magit-diff-file-heading-selection)
- (`(module nil) 'magit-diff-file-heading-highlight)
- (`(hunk t) 'magit-diff-hunk-heading-selection)
- (`(hunk nil) 'magit-diff-hunk-heading-highlight))))
-
-;;; Hunk Paint
-
-(cl-defun magit-diff-paint-hunk
- (section &optional selection
- (highlight (magit-section-selected-p section selection)))
- (let (paint)
- (unless magit-diff-highlight-hunk-body
- (setq highlight nil))
- (cond (highlight
- (unless (oref section hidden)
- (add-to-list 'magit-section-highlighted-sections section)
- (cond ((memq section magit-section-unhighlight-sections)
- (setq magit-section-unhighlight-sections
- (delq section magit-section-unhighlight-sections)))
- (magit-diff-highlight-hunk-body
- (setq paint t)))))
- (t
- (cond ((and (oref section hidden)
- (memq section magit-section-unhighlight-sections))
- (add-to-list 'magit-section-highlighted-sections section)
- (setq magit-section-unhighlight-sections
- (delq section magit-section-unhighlight-sections)))
- (t
- (setq paint t)))))
- (when paint
- (save-excursion
- (goto-char (oref section start))
- (let ((end (oref section end))
- (merging (looking-at "@@@"))
- (diff-type (magit-diff-type))
- (stage nil)
- (tab-width (magit-diff-tab-width
- (magit-section-parent-value section))))
- (forward-line)
- (while (< (point) end)
- (when (and magit-diff-hide-trailing-cr-characters
- (char-equal ?\r (char-before (line-end-position))))
- (put-text-property (1- (line-end-position)) (line-end-position)
- 'invisible t))
- (put-text-property
- (point) (1+ (line-end-position)) 'font-lock-face
- (cond
- ((looking-at "^\\+\\+?\\([<=|>]\\)\\{7\\}")
- (setq stage (pcase (list (match-string 1) highlight)
- (`("<" nil) 'magit-diff-our)
- (`("<" t) 'magit-diff-our-highlight)
- (`("|" nil) 'magit-diff-base)
- (`("|" t) 'magit-diff-base-highlight)
- (`("=" nil) 'magit-diff-their)
- (`("=" t) 'magit-diff-their-highlight)
- (`(">" nil) nil)))
- 'magit-diff-conflict-heading)
- ((looking-at (if merging "^\\(\\+\\| \\+\\)" "^\\+"))
- (magit-diff-paint-tab merging tab-width)
- (magit-diff-paint-whitespace merging 'added diff-type)
- (or stage
- (if highlight 'magit-diff-added-highlight 'magit-diff-added)))
- ((looking-at (if merging "^\\(-\\| -\\)" "^-"))
- (magit-diff-paint-tab merging tab-width)
- (magit-diff-paint-whitespace merging 'removed diff-type)
- (if highlight 'magit-diff-removed-highlight 'magit-diff-removed))
- (t
- (magit-diff-paint-tab merging tab-width)
- (magit-diff-paint-whitespace merging 'context diff-type)
- (if highlight 'magit-diff-context-highlight 'magit-diff-context))))
- (forward-line))))))
- (magit-diff-update-hunk-refinement section))
-
-(defvar magit-diff--tab-width-cache nil)
-
-(defun magit-diff-tab-width (file)
- (setq file (expand-file-name file))
- (cl-flet ((cache (value)
- (let ((elt (assoc file magit-diff--tab-width-cache)))
- (if elt
- (setcdr elt value)
- (setq magit-diff--tab-width-cache
- (cons (cons file value)
- magit-diff--tab-width-cache))))
- value))
- (cond
- ((not magit-diff-adjust-tab-width)
- tab-width)
- ((--when-let (find-buffer-visiting file)
- (cache (buffer-local-value 'tab-width it))))
- ((--when-let (assoc file magit-diff--tab-width-cache)
- (or (cdr it)
- tab-width)))
- ((or (eq magit-diff-adjust-tab-width 'always)
- (and (numberp magit-diff-adjust-tab-width)
- (>= magit-diff-adjust-tab-width
- (nth 7 (file-attributes file)))))
- (cache (buffer-local-value 'tab-width (find-file-noselect file))))
- (t
- (cache nil)
- tab-width))))
-
-(defun magit-diff-paint-tab (merging width)
- (save-excursion
- (forward-char (if merging 2 1))
- (while (= (char-after) ?\t)
- (put-text-property (point) (1+ (point))
- 'display (list (list 'space :width width)))
- (forward-char))))
-
-(defun magit-diff-paint-whitespace (merging line-type diff-type)
- (when (and magit-diff-paint-whitespace
- (or (not (memq magit-diff-paint-whitespace '(uncommitted status)))
- (memq diff-type '(staged unstaged)))
- (cl-case line-type
- (added t)
- (removed (memq magit-diff-paint-whitespace-lines '(all both)))
- (context (memq magit-diff-paint-whitespace-lines '(all)))))
- (let ((prefix (if merging "^[-\\+\s]\\{2\\}" "^[-\\+\s]"))
- (indent
- (if (local-variable-p 'magit-diff-highlight-indentation)
- magit-diff-highlight-indentation
- (setq-local
- magit-diff-highlight-indentation
- (cdr (--first (string-match-p (car it) default-directory)
- (nreverse
- (default-value
- 'magit-diff-highlight-indentation))))))))
- (when (and magit-diff-highlight-trailing
- (looking-at (concat prefix ".*?\\([ \t]+\\)$")))
- (let ((ov (make-overlay (match-beginning 1) (match-end 1) nil t)))
- (overlay-put ov 'font-lock-face 'magit-diff-whitespace-warning)
- (overlay-put ov 'priority 2)
- (overlay-put ov 'evaporate t)))
- (when (or (and (eq indent 'tabs)
- (looking-at (concat prefix "\\( *\t[ \t]*\\)")))
- (and (integerp indent)
- (looking-at (format "%s\\([ \t]* \\{%s,\\}[ \t]*\\)"
- prefix indent))))
- (let ((ov (make-overlay (match-beginning 1) (match-end 1) nil t)))
- (overlay-put ov 'font-lock-face 'magit-diff-whitespace-warning)
- (overlay-put ov 'priority 2)
- (overlay-put ov 'evaporate t))))))
-
-(defun magit-diff-update-hunk-refinement (&optional section)
- (if section
- (unless (oref section hidden)
- (pcase (list magit-diff-refine-hunk
- (oref section refined)
- (eq section (magit-current-section)))
- ((or `(all nil ,_) `(t nil t))
- (oset section refined t)
- (save-excursion
- (goto-char (oref section start))
- ;; `diff-refine-hunk' does not handle combined diffs.
- (unless (looking-at "@@@")
- (let ((smerge-refine-ignore-whitespace
- magit-diff-refine-ignore-whitespace)
- ;; Avoid fsyncing many small temp files
- (write-region-inhibit-fsync t))
- (diff-refine-hunk)))))
- ((or `(nil t ,_) `(t t nil))
- (oset section refined nil)
- (remove-overlays (oref section start)
- (oref section end)
- 'diff-mode 'fine))))
- (cl-labels ((recurse (section)
- (if (magit-section-match 'hunk section)
- (magit-diff-update-hunk-refinement section)
- (dolist (child (oref section children))
- (recurse child)))))
- (recurse magit-root-section))))
-
-
-;;; Hunk Region
-
-(defun magit-diff-hunk-region-beginning ()
- (save-excursion (goto-char (region-beginning))
- (line-beginning-position)))
-
-(defun magit-diff-hunk-region-end ()
- (save-excursion (goto-char (region-end))
- (line-end-position)))
-
-(defun magit-diff-update-hunk-region (section)
- "Highlight the hunk-internal region if any."
- (when (eq (magit-diff-scope section t) 'region)
- (magit-diff--make-hunk-overlay
- (oref section start)
- (1- (oref section content))
- 'font-lock-face 'magit-diff-lines-heading
- 'display (magit-diff-hunk-region-header section)
- 'after-string (magit-diff--hunk-after-string 'magit-diff-lines-heading))
- (run-hook-with-args 'magit-diff-highlight-hunk-region-functions section)
- t))
-
-(defun magit-diff-highlight-hunk-region-dim-outside (section)
- "Dim the parts of the hunk that are outside the hunk-internal region.
-This is done by using the same foreground and background color
-for added and removed lines as for context lines."
- (let ((face (if magit-diff-highlight-hunk-body
- 'magit-diff-context-highlight
- 'magit-diff-context)))
- (when magit-diff-unmarked-lines-keep-foreground
- (setq face `(,@(and (>= emacs-major-version 27) '(:extend t))
- :background ,(face-attribute face :background))))
- (magit-diff--make-hunk-overlay (oref section content)
- (magit-diff-hunk-region-beginning)
- 'font-lock-face face
- 'priority 2)
- (magit-diff--make-hunk-overlay (1+ (magit-diff-hunk-region-end))
- (oref section end)
- 'font-lock-face face
- 'priority 2)))
-
-(defun magit-diff-highlight-hunk-region-using-face (_section)
- "Highlight the hunk-internal region by making it bold.
-Or rather highlight using the face `magit-diff-hunk-region', though
-changing only the `:weight' and/or `:slant' is recommended for that
-face."
- (magit-diff--make-hunk-overlay (magit-diff-hunk-region-beginning)
- (1+ (magit-diff-hunk-region-end))
- 'font-lock-face 'magit-diff-hunk-region))
-
-(defun magit-diff-highlight-hunk-region-using-overlays (section)
- "Emphasize the hunk-internal region using delimiting horizontal lines.
-This is implemented as single-pixel newlines places inside overlays."
- (if (window-system)
- (let ((beg (magit-diff-hunk-region-beginning))
- (end (magit-diff-hunk-region-end))
- (str (propertize
- (concat (propertize "\s" 'display '(space :height (1)))
- (propertize "\n" 'line-height t))
- 'font-lock-face 'magit-diff-lines-boundary)))
- (magit-diff--make-hunk-overlay beg (1+ beg) 'before-string str)
- (magit-diff--make-hunk-overlay end (1+ end) 'after-string str))
- (magit-diff-highlight-hunk-region-using-face section)))
-
-(defun magit-diff-highlight-hunk-region-using-underline (section)
- "Emphasize the hunk-internal region using delimiting horizontal lines.
-This is implemented by overlining and underlining the first and
-last (visual) lines of the region."
- (if (window-system)
- (let* ((beg (magit-diff-hunk-region-beginning))
- (end (magit-diff-hunk-region-end))
- (beg-eol (save-excursion (goto-char beg)
- (end-of-visual-line)
- (point)))
- (end-bol (save-excursion (goto-char end)
- (beginning-of-visual-line)
- (point)))
- (color (face-background 'magit-diff-lines-boundary nil t)))
- (cl-flet ((ln (b e &rest face)
- (magit-diff--make-hunk-overlay
- b e 'font-lock-face face 'after-string
- (magit-diff--hunk-after-string face))))
- (if (= beg end-bol)
- (ln beg beg-eol :overline color :underline color)
- (ln beg beg-eol :overline color)
- (ln end-bol end :underline color))))
- (magit-diff-highlight-hunk-region-using-face section)))
-
-(defun magit-diff--make-hunk-overlay (start end &rest args)
- (let ((ov (make-overlay start end nil t)))
- (overlay-put ov 'evaporate t)
- (while args (overlay-put ov (pop args) (pop args)))
- (push ov magit-section--region-overlays)
- ov))
-
-(defun magit-diff--hunk-after-string (face)
- (propertize "\s"
- 'font-lock-face face
- 'display (list 'space :align-to
- `(+ (0 . right)
- ,(min (window-hscroll)
- (- (line-end-position)
- (line-beginning-position)))))
- ;; This prevents the cursor from being rendered at the
- ;; edge of the window.
- 'cursor t))
-
-;;; Hunk Utilities
-
-(defun magit-diff-inside-hunk-body-p ()
- "Return non-nil if point is inside the body of a hunk."
- (and (magit-section-match 'hunk)
- (when-let ((content (oref (magit-current-section) content)))
- (> (point) content))))
-
-;;; Diff Extract
-
-(defun magit-diff-file-header (section)
- (when (magit-hunk-section-p section)
- (setq section (oref section parent)))
- (when (magit-file-section-p section)
- (oref section header)))
-
-(defun magit-diff-hunk-region-header (section)
- (let ((patch (magit-diff-hunk-region-patch section)))
- (string-match "\n" patch)
- (substring patch 0 (1- (match-end 0)))))
-
-(defun magit-diff-hunk-region-patch (section &optional args)
- (let ((op (if (member "--reverse" args) "+" "-"))
- (sbeg (oref section start))
- (rbeg (magit-diff-hunk-region-beginning))
- (rend (region-end))
- (send (oref section end))
- (patch nil))
- (save-excursion
- (goto-char sbeg)
- (while (< (point) send)
- (looking-at "\\(.\\)\\([^\n]*\n\\)")
- (cond ((or (string-match-p "[@ ]" (match-string-no-properties 1))
- (and (>= (point) rbeg)
- (<= (point) rend)))
- (push (match-string-no-properties 0) patch))
- ((equal op (match-string-no-properties 1))
- (push (concat " " (match-string-no-properties 2)) patch)))
- (forward-line)))
- (let ((buffer-list-update-hook nil)) ; #3759
- (with-temp-buffer
- (insert (mapconcat #'identity (reverse patch) ""))
- (diff-fixup-modifs (point-min) (point-max))
- (setq patch (buffer-string))))
- patch))
-
-;;; _
-(provide 'magit-diff)
-;;; magit-diff.el ends here
diff --git a/elpa/magit-20200728.45/magit-ediff.el b/elpa/magit-20200728.45/magit-ediff.el
deleted file mode 100644
index f7e2193..0000000
--- a/elpa/magit-20200728.45/magit-ediff.el
+++ /dev/null
@@ -1,509 +0,0 @@
-;;; magit-ediff.el --- Ediff extension for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library provides basic support for Ediff.
-
-;;; Code:
-
-(require 'magit)
-
-(require 'ediff)
-(require 'smerge-mode)
-
-(defvar smerge-ediff-buf)
-(defvar smerge-ediff-windows)
-
-;;; Options
-
-(defgroup magit-ediff nil
- "Ediff support for Magit."
- :link '(info-link "(magit)Ediffing")
- :group 'magit-extensions)
-
-(defcustom magit-ediff-quit-hook
- '(magit-ediff-cleanup-auxiliary-buffers
- magit-ediff-restore-previous-winconf)
- "Hooks to run after finishing Ediff, when that was invoked using Magit.
-The hooks are run in the Ediff control buffer. This is similar
-to `ediff-quit-hook' but takes the needs of Magit into account.
-The `ediff-quit-hook' is ignored by Ediff sessions which were
-invoked using Magit."
- :package-version '(magit . "2.2.0")
- :group 'magit-ediff
- :type 'hook
- :get 'magit-hook-custom-get
- :options '(magit-ediff-cleanup-auxiliary-buffers
- magit-ediff-restore-previous-winconf))
-
-(defcustom magit-ediff-dwim-show-on-hunks nil
- "Whether `magit-ediff-dwim' runs show variants on hunks.
-If non-nil, `magit-ediff-show-staged' or
-`magit-ediff-show-unstaged' are called based on what section the
-hunk is in. Otherwise, `magit-ediff-dwim' runs
-`magit-ediff-stage' when point is on an uncommitted hunk."
- :package-version '(magit . "2.2.0")
- :group 'magit-ediff
- :type 'boolean)
-
-(defcustom magit-ediff-show-stash-with-index t
- "Whether `magit-ediff-show-stash' shows the state of the index.
-
-If non-nil, use a third Ediff buffer to distinguish which changes
-in the stash were staged. In cases where the stash contains no
-staged changes, fall back to a two-buffer Ediff.
-
-More specifically, a stash is a merge commit, stash@{N}, with
-potentially three parents.
-
-* stash@{N}^1 represents the `HEAD' commit at the time the stash
- was created.
-
-* stash@{N}^2 records any changes that were staged when the stash
- was made.
-
-* stash@{N}^3, if it exists, contains files that were untracked
- when stashing.
-
-If this option is non-nil, `magit-ediff-show-stash' will run
-Ediff on a file using three buffers: one for stash@{N}, another
-for stash@{N}^1, and a third for stash@{N}^2.
-
-Otherwise, Ediff uses two buffers, comparing
-stash@{N}^1..stash@{N}. Along with any unstaged changes, changes
-in the index commit, stash@{N}^2, will be shown in this
-comparison unless they conflicted with changes in the working
-tree at the time of stashing."
- :package-version '(magit . "2.6.0")
- :group 'magit-ediff
- :type 'boolean)
-
-;;; Commands
-
-(defvar magit-ediff-previous-winconf nil)
-
-;;;###autoload (autoload 'magit-ediff "magit-ediff" nil)
-(transient-define-prefix magit-ediff ()
- "Show differences using the Ediff package."
- :info-manual "(ediff)"
- ["Ediff"
- [("E" "Dwim" magit-ediff-dwim)
- ("s" "Stage" magit-ediff-stage)
- ("m" "Resolve" magit-ediff-resolve)]
- [("u" "Show unstaged" magit-ediff-show-unstaged)
- ("i" "Show staged" magit-ediff-show-staged)
- ("w" "Show worktree" magit-ediff-show-working-tree)]
- [("c" "Show commit" magit-ediff-show-commit)
- ("r" "Show range" magit-ediff-compare)
- ("z" "Show stash" magit-ediff-show-stash)]])
-
-;;;###autoload
-(defun magit-ediff-resolve (file)
- "Resolve outstanding conflicts in FILE using Ediff.
-FILE has to be relative to the top directory of the repository.
-
-In the rare event that you want to manually resolve all
-conflicts, including those already resolved by Git, use
-`ediff-merge-revisions-with-ancestor'."
- (interactive
- (let ((current (magit-current-file))
- (unmerged (magit-unmerged-files)))
- (unless unmerged
- (user-error "There are no unresolved conflicts"))
- (list (magit-completing-read "Resolve file" unmerged nil t nil nil
- (car (member current unmerged))))))
- (magit-with-toplevel
- (with-current-buffer (find-file-noselect file)
- (smerge-ediff)
- (setq-local
- ediff-quit-hook
- (lambda ()
- (let ((bufC ediff-buffer-C)
- (bufS smerge-ediff-buf))
- (with-current-buffer bufS
- (when (yes-or-no-p (format "Conflict resolution finished; save %s? "
- buffer-file-name))
- (erase-buffer)
- (insert-buffer-substring bufC)
- (save-buffer))))
- (when (buffer-live-p ediff-buffer-A) (kill-buffer ediff-buffer-A))
- (when (buffer-live-p ediff-buffer-B) (kill-buffer ediff-buffer-B))
- (when (buffer-live-p ediff-buffer-C) (kill-buffer ediff-buffer-C))
- (when (buffer-live-p ediff-ancestor-buffer)
- (kill-buffer ediff-ancestor-buffer))
- (let ((magit-ediff-previous-winconf smerge-ediff-windows))
- (run-hooks 'magit-ediff-quit-hook)))))))
-
-;;;###autoload
-(defun magit-ediff-stage (file)
- "Stage and unstage changes to FILE using Ediff.
-FILE has to be relative to the top directory of the repository."
- (interactive
- (let ((files (magit-tracked-files)))
- (list (magit-completing-read "Selectively stage file" files nil t nil nil
- (car (member (magit-current-file) files))))))
- (magit-with-toplevel
- (let* ((conf (current-window-configuration))
- (bufA (magit-get-revision-buffer "HEAD" file))
- (bufB (magit-get-revision-buffer "{index}" file))
- (bufBrw (and bufB (with-current-buffer bufB (not buffer-read-only))))
- (bufC (get-file-buffer file))
- (fileBufC (or bufC (find-file-noselect file)))
- (coding-system-for-read
- (with-current-buffer fileBufC buffer-file-coding-system)))
- (ediff-buffers3
- (or bufA (magit-find-file-noselect "HEAD" file))
- (with-current-buffer (magit-find-file-index-noselect file t)
- (setq buffer-read-only nil)
- (current-buffer))
- fileBufC
- `((lambda ()
- (setq-local
- ediff-quit-hook
- (lambda ()
- (and (buffer-live-p ediff-buffer-B)
- (buffer-modified-p ediff-buffer-B)
- (with-current-buffer ediff-buffer-B
- (magit-update-index)))
- (and (buffer-live-p ediff-buffer-C)
- (buffer-modified-p ediff-buffer-C)
- (with-current-buffer ediff-buffer-C
- (when (y-or-n-p
- (format "Save file %s? " buffer-file-name))
- (save-buffer))))
- ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A)))
- ,@(if bufB
- (unless bufBrw '((with-current-buffer ediff-buffer-B
- (setq buffer-read-only t))))
- '((ediff-kill-buffer-carefully ediff-buffer-B)))
- ,@(unless bufC '((ediff-kill-buffer-carefully ediff-buffer-C)))
- (let ((magit-ediff-previous-winconf ,conf))
- (run-hooks 'magit-ediff-quit-hook))))))
- 'ediff-buffers3))))
-
-;;;###autoload
-(defun magit-ediff-compare (revA revB fileA fileB)
- "Compare REVA:FILEA with REVB:FILEB using Ediff.
-
-FILEA and FILEB have to be relative to the top directory of the
-repository. If REVA or REVB is nil, then this stands for the
-working tree state.
-
-If the region is active, use the revisions on the first and last
-line of the region. With a prefix argument, instead of diffing
-the revisions, choose a revision to view changes along, starting
-at the common ancestor of both revisions (i.e., use a \"...\"
-range)."
- (interactive
- (pcase-let ((`(,revA ,revB) (magit-ediff-compare--read-revisions
- nil current-prefix-arg)))
- (nconc (list revA revB)
- (magit-ediff-read-files revA revB))))
- (magit-with-toplevel
- (let ((conf (current-window-configuration))
- (bufA (if revA
- (magit-get-revision-buffer revA fileA)
- (get-file-buffer fileA)))
- (bufB (if revB
- (magit-get-revision-buffer revB fileB)
- (get-file-buffer fileB))))
- (ediff-buffers
- (or bufA (if revA
- (magit-find-file-noselect revA fileA)
- (find-file-noselect fileA)))
- (or bufB (if revB
- (magit-find-file-noselect revB fileB)
- (find-file-noselect fileB)))
- `((lambda ()
- (setq-local
- ediff-quit-hook
- (lambda ()
- ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A)))
- ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B)))
- (let ((magit-ediff-previous-winconf ,conf))
- (run-hooks 'magit-ediff-quit-hook))))))
- 'ediff-revision))))
-
-(defun magit-ediff-compare--read-revisions (&optional arg mbase)
- (let ((input (or arg (magit-diff-read-range-or-commit
- "Compare range or commit"
- nil mbase))))
- (--if-let (magit-split-range input)
- (-cons-to-list it)
- (list input nil))))
-
-(defun magit-ediff-read-files (revA revB &optional fileB)
- "Read file in REVB, return it and the corresponding file in REVA.
-When FILEB is non-nil, use this as REVB's file instead of
-prompting for it."
- (unless fileB
- (setq fileB (magit-read-file-choice
- (format "File to compare between %s and %s"
- revA (or revB "the working tree"))
- (magit-changed-files revA revB)
- (format "No changed files between %s and %s"
- revA (or revB "the working tree")))))
- (list (or (car (member fileB (magit-revision-files revA)))
- (cdr (assoc fileB (magit-renamed-files revB revA)))
- (magit-read-file-choice
- (format "File in %s to compare with %s in %s"
- revA fileB (or revB "the working tree"))
- (magit-changed-files revB revA)
- (format "No files have changed between %s and %s"
- revA revB)))
- fileB))
-
-;;;###autoload
-(defun magit-ediff-dwim ()
- "Compare, stage, or resolve using Ediff.
-This command tries to guess what file, and what commit or range
-the user wants to compare, stage, or resolve using Ediff. It
-might only be able to guess either the file, or range or commit,
-in which case the user is asked about the other. It might not
-always guess right, in which case the appropriate `magit-ediff-*'
-command has to be used explicitly. If it cannot read the user's
-mind at all, then it asks the user for a command to run."
- (interactive)
- (magit-section-case
- (hunk (save-excursion
- (goto-char (oref (oref it parent) start))
- (magit-ediff-dwim)))
- (t
- (let ((range (magit-diff--dwim))
- (file (magit-current-file))
- command revA revB)
- (pcase range
- ((and (guard (not magit-ediff-dwim-show-on-hunks))
- (or `unstaged `staged))
- (setq command (if (magit-anything-unmerged-p)
- #'magit-ediff-resolve
- #'magit-ediff-stage)))
- (`unstaged (setq command #'magit-ediff-show-unstaged))
- (`staged (setq command #'magit-ediff-show-staged))
- (`(commit . ,value)
- (setq command #'magit-ediff-show-commit)
- (setq revB value))
- (`(stash . ,value)
- (setq command #'magit-ediff-show-stash)
- (setq revB value))
- ((pred stringp)
- (pcase-let ((`(,a ,b) (magit-ediff-compare--read-revisions range)))
- (setq command #'magit-ediff-compare)
- (setq revA a)
- (setq revB b)))
- (_
- (when (derived-mode-p 'magit-diff-mode)
- (pcase (magit-diff-type)
- (`committed (pcase-let ((`(,a ,b)
- (magit-ediff-compare--read-revisions
- magit-buffer-range)))
- (setq revA a)
- (setq revB b)))
- ((guard (not magit-ediff-dwim-show-on-hunks))
- (setq command #'magit-ediff-stage))
- (`unstaged (setq command #'magit-ediff-show-unstaged))
- (`staged (setq command #'magit-ediff-show-staged))
- (`undefined (setq command nil))
- (_ (setq command nil))))))
- (cond ((not command)
- (call-interactively
- (magit-read-char-case
- "Failed to read your mind; do you want to " t
- (?c "[c]ommit" 'magit-ediff-show-commit)
- (?r "[r]ange" 'magit-ediff-compare)
- (?s "[s]tage" 'magit-ediff-stage)
- (?v "resol[v]e" 'magit-ediff-resolve))))
- ((eq command 'magit-ediff-compare)
- (apply 'magit-ediff-compare revA revB
- (magit-ediff-read-files revA revB file)))
- ((eq command 'magit-ediff-show-commit)
- (magit-ediff-show-commit revB))
- ((eq command 'magit-ediff-show-stash)
- (magit-ediff-show-stash revB))
- (file
- (funcall command file))
- (t
- (call-interactively command)))))))
-
-;;;###autoload
-(defun magit-ediff-show-staged (file)
- "Show staged changes using Ediff.
-
-This only allows looking at the changes; to stage, unstage,
-and discard changes using Ediff, use `magit-ediff-stage'.
-
-FILE must be relative to the top directory of the repository."
- (interactive
- (list (magit-read-file-choice "Show staged changes for file"
- (magit-staged-files)
- "No staged files")))
- (let ((conf (current-window-configuration))
- (bufA (magit-get-revision-buffer "HEAD" file))
- (bufB (get-buffer (concat file ".~{index}~"))))
- (ediff-buffers
- (or bufA (magit-find-file-noselect "HEAD" file))
- (or bufB (magit-find-file-index-noselect file t))
- `((lambda ()
- (setq-local
- ediff-quit-hook
- (lambda ()
- ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A)))
- ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B)))
- (let ((magit-ediff-previous-winconf ,conf))
- (run-hooks 'magit-ediff-quit-hook))))))
- 'ediff-buffers)))
-
-;;;###autoload
-(defun magit-ediff-show-unstaged (file)
- "Show unstaged changes using Ediff.
-
-This only allows looking at the changes; to stage, unstage,
-and discard changes using Ediff, use `magit-ediff-stage'.
-
-FILE must be relative to the top directory of the repository."
- (interactive
- (list (magit-read-file-choice "Show unstaged changes for file"
- (magit-unstaged-files)
- "No unstaged files")))
- (magit-with-toplevel
- (let ((conf (current-window-configuration))
- (bufA (get-buffer (concat file ".~{index}~")))
- (bufB (get-file-buffer file)))
- (ediff-buffers
- (or bufA (magit-find-file-index-noselect file t))
- (or bufB (find-file-noselect file))
- `((lambda ()
- (setq-local
- ediff-quit-hook
- (lambda ()
- ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A)))
- ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B)))
- (let ((magit-ediff-previous-winconf ,conf))
- (run-hooks 'magit-ediff-quit-hook))))))
- 'ediff-buffers))))
-
-;;;###autoload
-(defun magit-ediff-show-working-tree (file)
- "Show changes between `HEAD' and working tree using Ediff.
-FILE must be relative to the top directory of the repository."
- (interactive
- (list (magit-read-file-choice "Show changes in file"
- (magit-changed-files "HEAD")
- "No changed files")))
- (magit-with-toplevel
- (let ((conf (current-window-configuration))
- (bufA (magit-get-revision-buffer "HEAD" file))
- (bufB (get-file-buffer file)))
- (ediff-buffers
- (or bufA (magit-find-file-noselect "HEAD" file))
- (or bufB (find-file-noselect file))
- `((lambda ()
- (setq-local
- ediff-quit-hook
- (lambda ()
- ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A)))
- ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B)))
- (let ((magit-ediff-previous-winconf ,conf))
- (run-hooks 'magit-ediff-quit-hook))))))
- 'ediff-buffers))))
-
-;;;###autoload
-(defun magit-ediff-show-commit (commit)
- "Show changes introduced by COMMIT using Ediff."
- (interactive (list (magit-read-branch-or-commit "Revision")))
- (let ((revA (concat commit "^"))
- (revB commit))
- (apply #'magit-ediff-compare
- revA revB
- (magit-ediff-read-files revA revB (magit-current-file)))))
-
-;;;###autoload
-(defun magit-ediff-show-stash (stash)
- "Show changes introduced by STASH using Ediff.
-`magit-ediff-show-stash-with-index' controls whether a
-three-buffer Ediff is used in order to distinguish changes in the
-stash that were staged."
- (interactive (list (magit-read-stash "Stash")))
- (pcase-let* ((revA (concat stash "^1"))
- (revB (concat stash "^2"))
- (revC stash)
- (`(,fileA ,fileC) (magit-ediff-read-files revA revC))
- (fileB fileC))
- (if (and magit-ediff-show-stash-with-index
- (member fileA (magit-changed-files revB revA)))
- (let ((conf (current-window-configuration))
- (bufA (magit-get-revision-buffer revA fileA))
- (bufB (magit-get-revision-buffer revB fileB))
- (bufC (magit-get-revision-buffer revC fileC)))
- (ediff-buffers3
- (or bufA (magit-find-file-noselect revA fileA))
- (or bufB (magit-find-file-noselect revB fileB))
- (or bufC (magit-find-file-noselect revC fileC))
- `((lambda ()
- (setq-local
- ediff-quit-hook
- (lambda ()
- ,@(unless bufA
- '((ediff-kill-buffer-carefully ediff-buffer-A)))
- ,@(unless bufB
- '((ediff-kill-buffer-carefully ediff-buffer-B)))
- ,@(unless bufC
- '((ediff-kill-buffer-carefully ediff-buffer-C)))
- (let ((magit-ediff-previous-winconf ,conf))
- (run-hooks 'magit-ediff-quit-hook))))))
- 'ediff-buffers3))
- (magit-ediff-compare revA revC fileA fileC))))
-
-(defun magit-ediff-cleanup-auxiliary-buffers ()
- (let* ((ctl-buf ediff-control-buffer)
- (ctl-win (ediff-get-visible-buffer-window ctl-buf))
- (ctl-frm ediff-control-frame)
- (main-frame (cond ((window-live-p ediff-window-A)
- (window-frame ediff-window-A))
- ((window-live-p ediff-window-B)
- (window-frame ediff-window-B)))))
- (ediff-kill-buffer-carefully ediff-diff-buffer)
- (ediff-kill-buffer-carefully ediff-custom-diff-buffer)
- (ediff-kill-buffer-carefully ediff-fine-diff-buffer)
- (ediff-kill-buffer-carefully ediff-tmp-buffer)
- (ediff-kill-buffer-carefully ediff-error-buffer)
- (ediff-kill-buffer-carefully ediff-msg-buffer)
- (ediff-kill-buffer-carefully ediff-debug-buffer)
- (when (boundp 'ediff-patch-diagnostics)
- (ediff-kill-buffer-carefully ediff-patch-diagnostics))
- (cond ((and (ediff-window-display-p)
- (frame-live-p ctl-frm))
- (delete-frame ctl-frm))
- ((window-live-p ctl-win)
- (delete-window ctl-win)))
- (ediff-kill-buffer-carefully ctl-buf)
- (when (frame-live-p main-frame)
- (select-frame main-frame))))
-
-(defun magit-ediff-restore-previous-winconf ()
- (set-window-configuration magit-ediff-previous-winconf))
-
-;;; _
-(provide 'magit-ediff)
-;;; magit-ediff.el ends here
diff --git a/elpa/magit-20200728.45/magit-extras.el b/elpa/magit-20200728.45/magit-extras.el
deleted file mode 100644
index d3b0df6..0000000
--- a/elpa/magit-20200728.45/magit-extras.el
+++ /dev/null
@@ -1,698 +0,0 @@
-;;; magit-extras.el --- additional functionality for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Additional functionality for Magit.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-(declare-function dired-read-shell-command "dired-aux" (prompt arg files))
-;; For `magit-project-status'.
-(declare-function project-root "project" (project))
-
-(defvar ido-exit)
-(defvar ido-fallback)
-
-(defgroup magit-extras nil
- "Additional functionality for Magit."
- :group 'magit-extensions)
-
-;;; External Tools
-
-(defcustom magit-gitk-executable
- (or (and (eq system-type 'windows-nt)
- (let ((exe (magit-git-string
- "-c" "alias.X=!x() { which \"$1\" | cygpath -mf -; }; x"
- "X" "gitk.exe")))
- (and exe (file-executable-p exe) exe)))
- (executable-find "gitk") "gitk")
- "The Gitk executable."
- :group 'magit-extras
- :set-after '(magit-git-executable)
- :type 'string)
-
-;;;###autoload
-(defun magit-run-git-gui ()
- "Run `git gui' for the current git repository."
- (interactive)
- (magit-with-toplevel
- (magit-process-file magit-git-executable nil 0 nil "gui")))
-
-;;;###autoload
-(defun magit-run-git-gui-blame (commit filename &optional linenum)
- "Run `git gui blame' on the given FILENAME and COMMIT.
-Interactively run it for the current file and the `HEAD', with a
-prefix or when the current file cannot be determined let the user
-choose. When the current buffer is visiting FILENAME instruct
-blame to center around the line point is on."
- (interactive
- (let (revision filename)
- (when (or current-prefix-arg
- (not (setq revision "HEAD"
- filename (magit-file-relative-name nil 'tracked))))
- (setq revision (magit-read-branch-or-commit "Blame from revision"))
- (setq filename (magit-read-file-from-rev revision "Blame file")))
- (list revision filename
- (and (equal filename
- (ignore-errors
- (magit-file-relative-name buffer-file-name)))
- (line-number-at-pos)))))
- (magit-with-toplevel
- (apply #'magit-process-file magit-git-executable nil 0 nil "gui" "blame"
- `(,@(and linenum (list (format "--line=%d" linenum)))
- ,commit
- ,filename))))
-
-;;;###autoload
-(defun magit-run-gitk ()
- "Run `gitk' in the current repository."
- (interactive)
- (magit-process-file magit-gitk-executable nil 0))
-
-;;;###autoload
-(defun magit-run-gitk-branches ()
- "Run `gitk --branches' in the current repository."
- (interactive)
- (magit-process-file magit-gitk-executable nil 0 nil "--branches"))
-
-;;;###autoload
-(defun magit-run-gitk-all ()
- "Run `gitk --all' in the current repository."
- (interactive)
- (magit-process-file magit-gitk-executable nil 0 nil "--all"))
-
-;;; Emacs Tools
-
-;;;###autoload
-(defun ido-enter-magit-status ()
- "Drop into `magit-status' from file switching.
-
-This command does not work in Emacs 26.1.
-See https://github.com/magit/magit/issues/3634
-and https://debbugs.gnu.org/cgi/bugreport.cgi?bug=31707.
-
-To make this command available use something like:
-
- (add-hook \\='ido-setup-hook
- (lambda ()
- (define-key ido-completion-map
- (kbd \"C-x g\") \\='ido-enter-magit-status)))
-
-Starting with Emacs 25.1 the Ido keymaps are defined just once
-instead of every time Ido is invoked, so now you can modify it
-like pretty much every other keymap:
-
- (define-key ido-common-completion-map
- (kbd \"C-x g\") \\='ido-enter-magit-status)"
- (interactive)
- (setq ido-exit 'fallback)
- (setq ido-fallback 'magit-status) ; for Emacs >= 26.2
- (with-no-warnings (setq fallback 'magit-status)) ; for Emacs 25
- (exit-minibuffer))
-
-;;;###autoload
-(defun magit-project-status ()
- "Run `magit-status' in the current project's root."
- (interactive)
- (magit-status-setup-buffer (project-root (project-current t))))
-
-(with-eval-after-load 'project
- ;; Only more recent versions of project.el have `project-prefix-map' and
- ;; `project-switch-commands', though project.el is available in Emacs 25.
- (when (boundp 'project-prefix-map)
- (define-key project-prefix-map "m" #'magit-project-status))
- (when (boundp 'project-switch-commands)
- (add-to-list 'project-switch-commands '(?m "Magit" magit-status))))
-
-;;;###autoload
-(defun magit-dired-jump (&optional other-window)
- "Visit file at point using Dired.
-With a prefix argument, visit in another window. If there
-is no file at point, then instead visit `default-directory'."
- (interactive "P")
- (dired-jump other-window
- (when-let ((file (magit-file-at-point)))
- (expand-file-name (if (file-directory-p file)
- (file-name-as-directory file)
- file)))))
-
-;;;###autoload
-(defun magit-dired-log (&optional follow)
- "Show log for all marked files, or the current file."
- (interactive "P")
- (if-let ((topdir (magit-toplevel default-directory)))
- (let ((args (car (magit-log-arguments)))
- (files (dired-get-marked-files nil nil #'magit-file-tracked-p)))
- (unless files
- (user-error "No marked file is being tracked by Git"))
- (when (and follow
- (not (member "--follow" args))
- (not (cdr files)))
- (push "--follow" args))
- (magit-log-setup-buffer
- (list (or (magit-get-current-branch) "HEAD"))
- args
- (let ((default-directory topdir))
- (mapcar #'file-relative-name files))
- magit-log-buffer-file-locked))
- (magit--not-inside-repository-error)))
-
-;;;###autoload
-(defun magit-do-async-shell-command (file)
- "Open FILE with `dired-do-async-shell-command'.
-Interactively, open the file at point."
- (interactive (list (or (magit-file-at-point)
- (completing-read "Act on file: "
- (magit-list-files)))))
- (require 'dired-aux)
- (dired-do-async-shell-command
- (dired-read-shell-command "& on %s: " current-prefix-arg (list file))
- nil (list file)))
-
-;;; Shift Selection
-
-(defun magit--turn-on-shift-select-mode-p ()
- (and shift-select-mode
- this-command-keys-shift-translated
- (not mark-active)
- (not (eq (car-safe transient-mark-mode) 'only))))
-
-;;;###autoload
-(defun magit-previous-line (&optional arg try-vscroll)
- "Like `previous-line' but with Magit-specific shift-selection.
-
-Magit's selection mechanism is based on the region but selects an
-area that is larger than the region. This causes `previous-line'
-when invoked while holding the shift key to move up one line and
-thereby select two lines. When invoked inside a hunk body this
-command does not move point on the first invocation and thereby
-it only selects a single line. Which inconsistency you prefer
-is a matter of preference."
- (declare (interactive-only
- "use `forward-line' with negative argument instead."))
- (interactive "p\np")
- (unless arg (setq arg 1))
- (let ((stay (or (magit-diff-inside-hunk-body-p)
- (magit-section-position-in-heading-p))))
- (if (and stay (= arg 1) (magit--turn-on-shift-select-mode-p))
- (push-mark nil nil t)
- (with-no-warnings
- (handle-shift-selection)
- (previous-line (if stay (max (1- arg) 1) arg) try-vscroll)))))
-
-;;;###autoload
-(defun magit-next-line (&optional arg try-vscroll)
- "Like `next-line' but with Magit-specific shift-selection.
-
-Magit's selection mechanism is based on the region but selects
-an area that is larger than the region. This causes `next-line'
-when invoked while holding the shift key to move down one line
-and thereby select two lines. When invoked inside a hunk body
-this command does not move point on the first invocation and
-thereby it only selects a single line. Which inconsistency you
-prefer is a matter of preference."
- (declare (interactive-only forward-line))
- (interactive "p\np")
- (unless arg (setq arg 1))
- (let ((stay (or (magit-diff-inside-hunk-body-p)
- (magit-section-position-in-heading-p))))
- (if (and stay (= arg 1) (magit--turn-on-shift-select-mode-p))
- (push-mark nil nil t)
- (with-no-warnings
- (handle-shift-selection)
- (next-line (if stay (max (1- arg) 1) arg) try-vscroll)))))
-
-;;; Clean
-
-;;;###autoload
-(defun magit-clean (&optional arg)
- "Remove untracked files from the working tree.
-With a prefix argument also remove ignored files,
-with two prefix arguments remove ignored files only.
-\n(git clean -f -d [-x|-X])"
- (interactive "p")
- (when (yes-or-no-p (format "Remove %s files? "
- (pcase arg
- (1 "untracked")
- (4 "untracked and ignored")
- (_ "ignored"))))
- (magit-wip-commit-before-change)
- (magit-run-git "clean" "-f" "-d" (pcase arg (4 "-x") (16 "-X")))))
-
-(put 'magit-clean 'disabled t)
-
-;;; ChangeLog
-
-;;;###autoload
-(defun magit-add-change-log-entry (&optional whoami file-name other-window)
- "Find change log file and add date entry and item for current change.
-This differs from `add-change-log-entry' (which see) in that
-it acts on the current hunk in a Magit buffer instead of on
-a position in a file-visiting buffer."
- (interactive (list current-prefix-arg
- (prompt-for-change-log-name)))
- (pcase-let ((`(,buf ,pos) (magit-diff-visit-file--noselect)))
- (magit--with-temp-position buf pos
- (let ((add-log-buffer-file-name-function
- (lambda ()
- (or magit-buffer-file-name
- (buffer-file-name)))))
- (add-change-log-entry whoami file-name other-window)))))
-
-;;;###autoload
-(defun magit-add-change-log-entry-other-window (&optional whoami file-name)
- "Find change log file in other window and add entry and item.
-This differs from `add-change-log-entry-other-window' (which see)
-in that it acts on the current hunk in a Magit buffer instead of
-on a position in a file-visiting buffer."
- (interactive (and current-prefix-arg
- (list current-prefix-arg
- (prompt-for-change-log-name))))
- (magit-add-change-log-entry whoami file-name t))
-
-;;; Edit Line Commit
-
-;;;###autoload
-(defun magit-edit-line-commit (&optional type)
- "Edit the commit that added the current line.
-
-With a prefix argument edit the commit that removes the line,
-if any. The commit is determined using `git blame' and made
-editable using `git rebase --interactive' if it is reachable
-from `HEAD', or by checking out the commit (or a branch that
-points at it) otherwise."
- (interactive (list (and current-prefix-arg 'removal)))
- (let* ((chunk (magit-current-blame-chunk (or type 'addition)))
- (rev (oref chunk orig-rev)))
- (if (equal rev "0000000000000000000000000000000000000000")
- (message "This line has not been committed yet")
- (let ((rebase (magit-rev-ancestor-p rev "HEAD"))
- (file (expand-file-name (oref chunk orig-file)
- (magit-toplevel))))
- (if rebase
- (let ((magit--rebase-published-symbol 'edit-published))
- (magit-rebase-edit-commit rev (magit-rebase-arguments)))
- (magit-checkout (or (magit-rev-branch rev) rev)))
- (unless (and buffer-file-name
- (file-equal-p file buffer-file-name))
- (let ((blame-type (and magit-blame-mode magit-blame-type)))
- (if rebase
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (magit-sequencer-process-sentinel process event)
- (when (eq (process-status process) 'exit)
- (find-file file)
- (when blame-type
- (magit-blame--pre-blame-setup blame-type)
- (magit-blame--run (magit-blame-arguments))))))
- (find-file file)
- (when blame-type
- (magit-blame--pre-blame-setup blame-type)
- (magit-blame--run (magit-blame-arguments))))))))))
-
-(put 'magit-edit-line-commit 'disabled t)
-
-;;;###autoload
-(defun magit-diff-edit-hunk-commit (file)
- "From a hunk, edit the respective commit and visit the file.
-
-First visit the file being modified by the hunk at the correct
-location using `magit-diff-visit-file'. This actually visits a
-blob. When point is on a diff header, not within an individual
-hunk, then this visits the blob the first hunk is about.
-
-Then invoke `magit-edit-line-commit', which uses an interactive
-rebase to make the commit editable, or if that is not possible
-because the commit is not reachable from `HEAD' by checking out
-that commit directly. This also causes the actual worktree file
-to be visited.
-
-Neither the blob nor the file buffer are killed when finishing
-the rebase. If that is undesirable, then it might be better to
-use `magit-rebase-edit-command' instead of this command."
- (interactive (list (magit-file-at-point t t)))
- (let ((magit-diff-visit-previous-blob nil))
- (with-current-buffer
- (magit-diff-visit-file--internal file nil #'pop-to-buffer-same-window)
- (magit-edit-line-commit))))
-
-(put 'magit-diff-edit-hunk-commit 'disabled t)
-
-;;; Reshelve
-
-(defcustom magit-reshelve-since-committer-only nil
- "Whether `magit-reshelve-since' changes only the committer dates.
-Otherwise the author dates are also changed."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'boolean)
-
-;;;###autoload
-(defun magit-reshelve-since (rev)
- "Change the author and committer dates of the commits since REV.
-
-Ask the user for the first reachable commit whose dates should
-be changed. Then read the new date for that commit. The initial
-minibuffer input and the previous history element offer good
-values. The next commit will be created one minute later and so
-on.
-
-This command is only intended for interactive use and should only
-be used on highly rearranged and unpublished history."
- (interactive (list nil))
- (let* ((current (or (magit-get-current-branch)
- (user-error "Refusing to reshelve detached head")))
- (backup (concat "refs/original/refs/heads/" current)))
- (cond
- ((not rev)
- (when (and (magit-ref-p backup)
- (not (magit-y-or-n-p
- (format "Backup ref %s already exists. Override? " backup))))
- (user-error "Abort"))
- (magit-log-select 'magit-reshelve-since
- "Type %p on a commit to reshelve it and the commits above it,"))
- (t
- (cl-flet ((adjust (time offset)
- (format-time-string
- "%F %T %z"
- (+ (floor time)
- (* offset 60)
- (- (car (decode-time time)))))))
- (let* ((start (concat rev "^"))
- (range (concat start ".." current))
- (time-rev (adjust (float-time (string-to-number
- (magit-rev-format "%at" start)))
- 1))
- (time-now (adjust (float-time)
- (- (string-to-number
- (magit-git-string "rev-list" "--count"
- range))))))
- (push time-rev magit--reshelve-history)
- (let ((date (floor
- (float-time
- (date-to-time
- (read-string "Date for first commit: "
- time-now 'magit--reshelve-history)))))
- (process-environment process-environment))
- (push "FILTER_BRANCH_SQUELCH_WARNING=1" process-environment)
- (magit-with-toplevel
- (magit-run-git-async
- "filter-branch" "--force" "--env-filter"
- (format
- "case $GIT_COMMIT in %s\nesac"
- (mapconcat
- (lambda (rev)
- (prog1 (concat
- (format "%s) " rev)
- (and (not magit-reshelve-since-committer-only)
- (format "export GIT_AUTHOR_DATE=\"%s\"; " date))
- (format "export GIT_COMMITTER_DATE=\"%s\";;" date))
- (cl-incf date 60)))
- (magit-git-lines "rev-list" "--reverse" range)
- " "))
- range "--"))
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (> (process-exit-status process) 0)
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (magit-run-git "update-ref" "-d" backup))))))))))))
-
-;;; Revision Stack
-
-(defvar magit-revision-stack nil)
-
-(defcustom magit-pop-revision-stack-format
- '("[%N: %h] " "%N: %H\n %s\n" "\\[\\([0-9]+\\)[]:]")
- "Control how `magit-pop-revision-stack' inserts a revision.
-
-The command `magit-pop-revision-stack' inserts a representation
-of the revision last pushed to the `magit-revision-stack' into
-the current buffer. It inserts text at point and/or near the end
-of the buffer, and removes the consumed revision from the stack.
-
-The entries on the stack have the format (HASH TOPLEVEL) and this
-option has the format (POINT-FORMAT EOB-FORMAT INDEX-REGEXP), all
-of which may be nil or a string (though either one of EOB-FORMAT
-or POINT-FORMAT should be a string, and if INDEX-REGEXP is
-non-nil, then the two formats should be too).
-
-First INDEX-REGEXP is used to find the previously inserted entry,
-by searching backward from point. The first submatch must match
-the index number. That number is incremented by one, and becomes
-the index number of the entry to be inserted. If you don't want
-to number the inserted revisions, then use nil for INDEX-REGEXP.
-
-If INDEX-REGEXP is non-nil, then both POINT-FORMAT and EOB-FORMAT
-should contain \"%N\", which is replaced with the number that was
-determined in the previous step.
-
-Both formats, if non-nil and after removing %N, are then expanded
-using `git show --format=FORMAT ...' inside TOPLEVEL.
-
-The expansion of POINT-FORMAT is inserted at point, and the
-expansion of EOB-FORMAT is inserted at the end of the buffer (if
-the buffer ends with a comment, then it is inserted right before
-that)."
- :package-version '(magit . "2.3.0")
- :group 'magit-commands
- :type '(list (choice (string :tag "Insert at point format")
- (cons (string :tag "Insert at point format")
- (repeat (string :tag "Argument to git show")))
- (const :tag "Don't insert at point" nil))
- (choice (string :tag "Insert at eob format")
- (cons (string :tag "Insert at eob format")
- (repeat (string :tag "Argument to git show")))
- (const :tag "Don't insert at eob" nil))
- (choice (regexp :tag "Find index regexp")
- (const :tag "Don't number entries" nil))))
-
-(defcustom magit-copy-revision-abbreviated nil
- "Whether to save abbreviated revision to `kill-ring' and `magit-revision-stack'."
- :package-version '(magit . "3.0.0")
- :group 'magit-miscellaneous
- :type 'boolean)
-
-;;;###autoload
-(defun magit-pop-revision-stack (rev toplevel)
- "Insert a representation of a revision into the current buffer.
-
-Pop a revision from the `magit-revision-stack' and insert it into
-the current buffer according to `magit-pop-revision-stack-format'.
-Revisions can be put on the stack using `magit-copy-section-value'
-and `magit-copy-buffer-revision'.
-
-If the stack is empty or with a prefix argument, instead read a
-revision in the minibuffer. By using the minibuffer history this
-allows selecting an item which was popped earlier or to insert an
-arbitrary reference or revision without first pushing it onto the
-stack.
-
-When reading the revision from the minibuffer, then it might not
-be possible to guess the correct repository. When this command
-is called inside a repository (e.g. while composing a commit
-message), then that repository is used. Otherwise (e.g. while
-composing an email) then the repository recorded for the top
-element of the stack is used (even though we insert another
-revision). If not called inside a repository and with an empty
-stack, or with two prefix arguments, then read the repository in
-the minibuffer too."
- (interactive
- (if (or current-prefix-arg (not magit-revision-stack))
- (let ((default-directory
- (or (and (not (= (prefix-numeric-value current-prefix-arg) 16))
- (or (magit-toplevel)
- (cadr (car magit-revision-stack))))
- (magit-read-repository))))
- (list (magit-read-branch-or-commit "Insert revision")
- default-directory))
- (push (caar magit-revision-stack) magit-revision-history)
- (pop magit-revision-stack)))
- (if rev
- (pcase-let ((`(,pnt-format ,eob-format ,idx-format)
- magit-pop-revision-stack-format))
- (let ((default-directory toplevel)
- (idx (and idx-format
- (save-excursion
- (if (re-search-backward idx-format nil t)
- (number-to-string
- (1+ (string-to-number (match-string 1))))
- "1"))))
- pnt-args eob-args)
- (when (listp pnt-format)
- (setq pnt-args (cdr pnt-format))
- (setq pnt-format (car pnt-format)))
- (when (listp eob-format)
- (setq eob-args (cdr eob-format))
- (setq eob-format (car eob-format)))
- (when pnt-format
- (when idx-format
- (setq pnt-format
- (replace-regexp-in-string "%N" idx pnt-format t t)))
- (magit-rev-insert-format pnt-format rev pnt-args)
- (backward-delete-char 1))
- (when eob-format
- (when idx-format
- (setq eob-format
- (replace-regexp-in-string "%N" idx eob-format t t)))
- (save-excursion
- (goto-char (point-max))
- (skip-syntax-backward ">s-")
- (beginning-of-line)
- (if (and comment-start (looking-at comment-start))
- (while (looking-at comment-start)
- (forward-line -1))
- (forward-line)
- (unless (= (current-column) 0)
- (insert ?\n)))
- (insert ?\n)
- (magit-rev-insert-format eob-format rev eob-args)
- (backward-delete-char 1)))))
- (user-error "Revision stack is empty")))
-
-(define-key git-commit-mode-map
- (kbd "C-c C-w") 'magit-pop-revision-stack)
-
-;;;###autoload
-(defun magit-copy-section-value ()
- "Save the value of the current section for later use.
-
-Save the section value to the `kill-ring', and, provided that
-the current section is a commit, branch, or tag section, push
-the (referenced) revision to the `magit-revision-stack' for use
-with `magit-pop-revision-stack'.
-
-When `magit-copy-revision-abbreviated' is non-nil, save the
-abbreviated revision to the `kill-ring' and the
-`magit-revision-stack'.
-
-When the current section is a branch or a tag, and a prefix
-argument is used, then save the revision at its tip to the
-`kill-ring' instead of the reference name.
-
-When the region is active, then save that to the `kill-ring',
-like `kill-ring-save' would, instead of behaving as described
-above. If a prefix argument is used and the region is within a
-hunk, strip the outer diff marker column."
- (interactive)
- (cond
- ((and current-prefix-arg
- (magit-section-internal-region-p)
- (magit-section-match 'hunk))
- (kill-new (replace-regexp-in-string
- "^[ \\+\\-]" ""
- (buffer-substring-no-properties
- (region-beginning) (region-end))))
- (deactivate-mark))
- ((use-region-p)
- (call-interactively #'copy-region-as-kill))
- (t
- (when-let ((section (magit-current-section))
- (value (oref section value)))
- (magit-section-case
- ((branch commit module-commit tag)
- (let ((default-directory default-directory) ref)
- (magit-section-case
- ((branch tag)
- (setq ref value))
- (module-commit
- (setq default-directory
- (file-name-as-directory
- (expand-file-name (magit-section-parent-value section)
- (magit-toplevel))))))
- (setq value (magit-rev-parse
- (and magit-copy-revision-abbreviated "--short")
- value))
- (push (list value default-directory) magit-revision-stack)
- (kill-new (message "%s" (or (and current-prefix-arg ref)
- value)))))
- (t (kill-new (message "%s" value))))))))
-
-;;;###autoload
-(defun magit-copy-buffer-revision ()
- "Save the revision of the current buffer for later use.
-
-Save the revision shown in the current buffer to the `kill-ring'
-and push it to the `magit-revision-stack'.
-
-This command is mainly intended for use in `magit-revision-mode'
-buffers, the only buffers where it is always unambiguous exactly
-which revision should be saved.
-
-Most other Magit buffers usually show more than one revision, in
-some way or another, so this command has to select one of them,
-and that choice might not always be the one you think would have
-been the best pick.
-
-In such buffers it is often more useful to save the value of
-the current section instead, using `magit-copy-section-value'.
-
-When the region is active, then save that to the `kill-ring',
-like `kill-ring-save' would, instead of behaving as described
-above.
-
-When `magit-copy-revision-abbreviated' is non-nil, save the
-abbreviated revision to the `kill-ring' and the
-`magit-revision-stack'."
- (interactive)
- (if (use-region-p)
- (call-interactively #'copy-region-as-kill)
- (when-let ((rev (or magit-buffer-revision
- (cl-case major-mode
- (magit-diff-mode
- (if (string-match "\\.\\.\\.?\\(.+\\)"
- magit-buffer-range)
- (match-string 1 magit-buffer-range)
- magit-buffer-range))
- (magit-status-mode "HEAD")))))
- (when (magit-commit-p rev)
- (setq rev (magit-rev-parse
- (and magit-copy-revision-abbreviated "--short")
- rev))
- (push (list rev default-directory) magit-revision-stack)
- (kill-new (message "%s" rev))))))
-
-;;; Miscellaneous
-
-;;;###autoload
-(defun magit-abort-dwim ()
- "Abort current operation.
-Depending on the context, this will abort a merge, a rebase, a
-patch application, a cherry-pick, a revert, or a bisect."
- (interactive)
- (cond ((magit-merge-in-progress-p) (magit-merge-abort))
- ((magit-rebase-in-progress-p) (magit-rebase-abort))
- ((magit-am-in-progress-p) (magit-am-abort))
- ((magit-sequencer-in-progress-p) (magit-sequencer-abort))
- ((magit-bisect-in-progress-p) (magit-bisect-reset))))
-
-;;; _
-(provide 'magit-extras)
-;;; magit-extras.el ends here
diff --git a/elpa/magit-20200728.45/magit-fetch.el b/elpa/magit-20200728.45/magit-fetch.el
deleted file mode 100644
index b8fed37..0000000
--- a/elpa/magit-20200728.45/magit-fetch.el
+++ /dev/null
@@ -1,186 +0,0 @@
-;;; magit-fetch.el --- download objects and refs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements fetch commands.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-fetch-modules-jobs 4
- "Number of submodules to fetch in parallel.
-Ignored for Git versions before v2.8.0."
- :package-version '(magit . "2.12.0")
- :group 'magit-commands
- :type '(choice (const :tag "one at a time" nil) number))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-fetch "magit-fetch" nil t)
-(transient-define-prefix magit-fetch ()
- "Fetch from another repository."
- :man-page "git-fetch"
- ["Arguments"
- ("-p" "Prune deleted branches" ("-p" "--prune"))
- ("-t" "Fetch all tags" ("-t" "--tags"))]
- ["Fetch from"
- ("p" magit-fetch-from-pushremote)
- ("u" magit-fetch-from-upstream)
- ("e" "elsewhere" magit-fetch-other)
- ("a" "all remotes" magit-fetch-all)]
- ["Fetch"
- ("o" "another branch" magit-fetch-branch)
- ("r" "explicit refspec" magit-fetch-refspec)
- ("m" "submodules" magit-fetch-modules)]
- ["Configure"
- ("C" "variables..." magit-branch-configure)])
-
-(defun magit-fetch-arguments ()
- (transient-args 'magit-fetch))
-
-(defun magit-git-fetch (remote args)
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "fetch" remote args))
-
-;;;###autoload (autoload 'magit-fetch-from-pushremote "magit-fetch" nil t)
-(transient-define-suffix magit-fetch-from-pushremote (args)
- "Fetch from the current push-remote.
-
-With a prefix argument or when the push-remote is either not
-configured or unusable, then let the user first configure the
-push-remote."
- :description 'magit-fetch--pushremote-description
- (interactive (list (magit-fetch-arguments)))
- (let ((remote (magit-get-push-remote)))
- (when (or current-prefix-arg
- (not (member remote (magit-list-remotes))))
- (let ((var (magit--push-remote-variable)))
- (setq remote
- (magit-read-remote (format "Set %s and fetch from there" var)))
- (magit-set remote var)))
- (magit-git-fetch remote args)))
-
-(defun magit-fetch--pushremote-description ()
- (let* ((branch (magit-get-current-branch))
- (remote (magit-get-push-remote branch))
- (v (magit--push-remote-variable branch t)))
- (cond
- ((member remote (magit-list-remotes)) remote)
- (remote
- (format "%s, replacing invalid" v))
- (t
- (format "%s, setting that" v)))))
-
-;;;###autoload (autoload 'magit-fetch-from-upstream "magit-fetch" nil t)
-(transient-define-suffix magit-fetch-from-upstream (remote args)
- "Fetch from the \"current\" remote, usually the upstream.
-
-If the upstream is configured for the current branch and names
-an existing remote, then use that. Otherwise try to use another
-remote: If only a single remote is configured, then use that.
-Otherwise if a remote named \"origin\" exists, then use that.
-
-If no remote can be determined, then this command is not available
-from the `magit-fetch' transient prefix and invoking it directly
-results in an error."
- :if (lambda () (magit-get-current-remote t))
- :description (lambda () (magit-get-current-remote t))
- (interactive (list (magit-get-current-remote t)
- (magit-fetch-arguments)))
- (unless remote
- (error "The \"current\" remote could not be determined"))
- (magit-git-fetch remote args))
-
-;;;###autoload
-(defun magit-fetch-other (remote args)
- "Fetch from another repository."
- (interactive (list (magit-read-remote "Fetch remote")
- (magit-fetch-arguments)))
- (magit-git-fetch remote args))
-
-;;;###autoload
-(defun magit-fetch-branch (remote branch args)
- "Fetch a BRANCH from a REMOTE."
- (interactive
- (let ((remote (magit-read-remote-or-url "Fetch from remote or url")))
- (list remote
- (magit-read-remote-branch "Fetch branch" remote)
- (magit-fetch-arguments))))
- (magit-git-fetch remote (cons branch args)))
-
-;;;###autoload
-(defun magit-fetch-refspec (remote refspec args)
- "Fetch a REFSPEC from a REMOTE."
- (interactive
- (let ((remote (magit-read-remote-or-url "Fetch from remote or url")))
- (list remote
- (magit-read-refspec "Fetch using refspec" remote)
- (magit-fetch-arguments))))
- (magit-git-fetch remote (cons refspec args)))
-
-;;;###autoload
-(defun magit-fetch-all (args)
- "Fetch from all remotes."
- (interactive (list (magit-fetch-arguments)))
- (magit-git-fetch nil (cons "--all" args)))
-
-;;;###autoload
-(defun magit-fetch-all-prune ()
- "Fetch from all remotes, and prune.
-Prune remote tracking branches for branches that have been
-removed on the respective remote."
- (interactive)
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "remote" "update" "--prune"))
-
-;;;###autoload
-(defun magit-fetch-all-no-prune ()
- "Fetch from all remotes."
- (interactive)
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "remote" "update"))
-
-;;;###autoload
-(defun magit-fetch-modules (&optional all)
- "Fetch all submodules.
-
-Option `magit-fetch-modules-jobs' controls how many submodules
-are being fetched in parallel. Also fetch the super-repository,
-because `git-fetch' does not support not doing that. With a
-prefix argument fetch all remotes."
- (interactive "P")
- (magit-with-toplevel
- (magit-run-git-async
- "fetch" "--verbose" "--recurse-submodules"
- (and magit-fetch-modules-jobs
- (version<= "2.8.0" (magit-git-version))
- (list "-j" (number-to-string magit-fetch-modules-jobs)))
- (and all "--all"))))
-
-;;; _
-(provide 'magit-fetch)
-;;; magit-fetch.el ends here
diff --git a/elpa/magit-20200728.45/magit-files.el b/elpa/magit-20200728.45/magit-files.el
deleted file mode 100644
index 3ba31a9..0000000
--- a/elpa/magit-20200728.45/magit-files.el
+++ /dev/null
@@ -1,551 +0,0 @@
-;;; magit-files.el --- finding files -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for finding blobs, staged files,
-;; and Git configuration files. It also implements modes useful in
-;; buffers visiting files and blobs, and the commands used by those
-;; modes.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Find Blob
-
-(defvar magit-find-file-hook nil)
-(add-hook 'magit-find-file-hook #'magit-blob-mode)
-
-;;;###autoload
-(defun magit-find-file (rev file)
- "View FILE from REV.
-Switch to a buffer visiting blob REV:FILE, creating one if none
-already exists. If prior to calling this command the current
-buffer and/or cursor position is about the same file, then go
-to the line and column corresponding to that location."
- (interactive (magit-find-file-read-args "Find file"))
- (magit-find-file--internal rev file #'pop-to-buffer-same-window))
-
-;;;###autoload
-(defun magit-find-file-other-window (rev file)
- "View FILE from REV, in another window.
-Switch to a buffer visiting blob REV:FILE, creating one if none
-already exists. If prior to calling this command the current
-buffer and/or cursor position is about the same file, then go to
-the line and column corresponding to that location."
- (interactive (magit-find-file-read-args "Find file in other window"))
- (magit-find-file--internal rev file #'switch-to-buffer-other-window))
-
-;;;###autoload
-(defun magit-find-file-other-frame (rev file)
- "View FILE from REV, in another frame.
-Switch to a buffer visiting blob REV:FILE, creating one if none
-already exists. If prior to calling this command the current
-buffer and/or cursor position is about the same file, then go to
-the line and column corresponding to that location."
- (interactive (magit-find-file-read-args "Find file in other frame"))
- (magit-find-file--internal rev file #'switch-to-buffer-other-frame))
-
-(defun magit-find-file-read-args (prompt)
- (let ((pseudo-revs '("{worktree}" "{index}")))
- (if-let ((rev (magit-completing-read "Find file from revision"
- (append pseudo-revs
- (magit-list-refnames nil t))
- nil nil nil 'magit-revision-history
- (or (magit-branch-or-commit-at-point)
- (magit-get-current-branch)))))
- (list rev (magit-read-file-from-rev (if (member rev pseudo-revs)
- "HEAD"
- rev)
- prompt))
- (user-error "Nothing selected"))))
-
-(defun magit-find-file--internal (rev file fn)
- (let ((buf (magit-find-file-noselect rev file))
- line col)
- (when-let ((visited-file (magit-file-relative-name)))
- (setq line (line-number-at-pos))
- (setq col (current-column))
- (cond
- ((not (equal visited-file file)))
- ((equal magit-buffer-revision rev))
- ((equal rev "{worktree}")
- (setq line (magit-diff-visit--offset file magit-buffer-revision line)))
- ((equal rev "{index}")
- (setq line (magit-diff-visit--offset file nil line)))
- (magit-buffer-revision
- (setq line (magit-diff-visit--offset
- file (concat magit-buffer-revision ".." rev) line)))
- (t
- (setq line (magit-diff-visit--offset file (list "-R" rev) line)))))
- (funcall fn buf)
- (when line
- (with-current-buffer buf
- (widen)
- (goto-char (point-min))
- (forward-line (1- line))
- (move-to-column col)))
- buf))
-
-(defun magit-find-file-noselect (rev file)
- "Read FILE from REV into a buffer and return the buffer.
-REV is a revision or one of \"{worktree}\" or \"{index}\".
-FILE must be relative to the top directory of the repository."
- (magit-find-file-noselect-1 rev file))
-
-(defun magit-find-file-noselect-1 (rev file &optional revert)
- "Read FILE from REV into a buffer and return the buffer.
-REV is a revision or one of \"{worktree}\" or \"{index}\".
-FILE must be relative to the top directory of the repository.
-Non-nil REVERT means to revert the buffer. If `ask-revert',
-then only after asking. A non-nil value for REVERT is ignored if REV is
-\"{worktree}\"."
- (if (equal rev "{worktree}")
- (find-file-noselect (expand-file-name file (magit-toplevel)))
- (let ((topdir (magit-toplevel)))
- (when (file-name-absolute-p file)
- (setq file (file-relative-name file topdir)))
- (with-current-buffer (magit-get-revision-buffer-create rev file)
- (when (or (not magit-buffer-file-name)
- (if (eq revert 'ask-revert)
- (y-or-n-p (format "%s already exists; revert it? "
- (buffer-name))))
- revert)
- (setq magit-buffer-revision
- (if (equal rev "{index}")
- "{index}"
- (magit-rev-format "%H" rev)))
- (setq magit-buffer-refname rev)
- (setq magit-buffer-file-name (expand-file-name file topdir))
- (setq default-directory
- (let ((dir (file-name-directory magit-buffer-file-name)))
- (if (file-exists-p dir) dir topdir)))
- (setq-local revert-buffer-function #'magit-revert-rev-file-buffer)
- (revert-buffer t t)
- (run-hooks (if (equal rev "{index}")
- 'magit-find-index-hook
- 'magit-find-file-hook)))
- (current-buffer)))))
-
-(defun magit-get-revision-buffer-create (rev file)
- (magit-get-revision-buffer rev file t))
-
-(defun magit-get-revision-buffer (rev file &optional create)
- (funcall (if create 'get-buffer-create 'get-buffer)
- (format "%s.~%s~" file (subst-char-in-string ?/ ?_ rev))))
-
-(defun magit-revert-rev-file-buffer (_ignore-auto noconfirm)
- (when (or noconfirm
- (and (not (buffer-modified-p))
- (catch 'found
- (dolist (regexp revert-without-query)
- (when (string-match regexp magit-buffer-file-name)
- (throw 'found t)))))
- (yes-or-no-p (format "Revert buffer from Git %s? "
- (if (equal magit-buffer-refname "{index}")
- "index"
- (concat "revision " magit-buffer-refname)))))
- (let* ((inhibit-read-only t)
- (default-directory (magit-toplevel))
- (file (file-relative-name magit-buffer-file-name))
- (coding-system-for-read (or coding-system-for-read 'undecided)))
- (erase-buffer)
- (magit-git-insert "cat-file" "-p"
- (if (equal magit-buffer-refname "{index}")
- (concat ":" file)
- (concat magit-buffer-refname ":" file)))
- (setq buffer-file-coding-system last-coding-system-used))
- (let ((buffer-file-name magit-buffer-file-name)
- (after-change-major-mode-hook
- (remq 'global-diff-hl-mode-enable-in-buffers
- after-change-major-mode-hook)))
- (normal-mode t))
- (setq buffer-read-only t)
- (set-buffer-modified-p nil)
- (goto-char (point-min))))
-
-;;; Find Index
-
-(defvar magit-find-index-hook nil)
-
-(defun magit-find-file-index-noselect (file &optional revert)
- "Read FILE from the index into a buffer and return the buffer.
-FILE must to be relative to the top directory of the repository."
- (magit-find-file-noselect-1 "{index}" file (or revert 'ask-revert)))
-
-(defun magit-update-index ()
- "Update the index with the contents of the current buffer.
-The current buffer has to be visiting a file in the index, which
-is done using `magit-find-index-noselect'."
- (interactive)
- (let ((file (magit-file-relative-name)))
- (unless (equal magit-buffer-refname "{index}")
- (user-error "%s isn't visiting the index" file))
- (if (y-or-n-p (format "Update index with contents of %s" (buffer-name)))
- (let ((index (make-temp-file "index"))
- (buffer (current-buffer)))
- (when magit-wip-before-change-mode
- (magit-wip-commit-before-change (list file) " before un-/stage"))
- (let ((coding-system-for-write buffer-file-coding-system))
- (with-temp-file index
- (insert-buffer-substring buffer)))
- (magit-with-toplevel
- (magit-call-git "update-index" "--cacheinfo"
- (substring (magit-git-string "ls-files" "-s" file)
- 0 6)
- (magit-git-string "hash-object" "-t" "blob" "-w"
- (concat "--path=" file)
- "--" index)
- file))
- (set-buffer-modified-p nil)
- (when magit-wip-after-apply-mode
- (magit-wip-commit-after-apply (list file) " after un-/stage")))
- (message "Abort")))
- (--when-let (magit-get-mode-buffer 'magit-status-mode)
- (with-current-buffer it (magit-refresh)))
- t)
-
-;;; Find Config File
-
-(defun magit-find-git-config-file (filename &optional wildcards)
- "Edit a file located in the current repository's git directory.
-
-When \".git\", located at the root of the working tree, is a
-regular file, then that makes it cumbersome to open a file
-located in the actual git directory.
-
-This command is like `find-file', except that it temporarily
-binds `default-directory' to the actual git directory, while
-reading the FILENAME."
- (interactive
- (let ((default-directory (magit-git-dir)))
- (find-file-read-args "Find file: "
- (confirm-nonexistent-file-or-buffer))))
- (find-file filename wildcards))
-
-(defun magit-find-git-config-file-other-window (filename &optional wildcards)
- "Edit a file located in the current repository's git directory, in another window.
-
-When \".git\", located at the root of the working tree, is a
-regular file, then that makes it cumbersome to open a file
-located in the actual git directory.
-
-This command is like `find-file-other-window', except that it
-temporarily binds `default-directory' to the actual git
-directory, while reading the FILENAME."
- (interactive
- (let ((default-directory (magit-git-dir)))
- (find-file-read-args "Find file in other window: "
- (confirm-nonexistent-file-or-buffer))))
- (find-file-other-window filename wildcards))
-
-(defun magit-find-git-config-file-other-frame (filename &optional wildcards)
- "Edit a file located in the current repository's git directory, in another frame.
-
-When \".git\", located at the root of the working tree, is a
-regular file, then that makes it cumbersome to open a file
-located in the actual git directory.
-
-This command is like `find-file-other-frame', except that it
-temporarily binds `default-directory' to the actual git
-directory, while reading the FILENAME."
- (interactive
- (let ((default-directory (magit-git-dir)))
- (find-file-read-args "Find file in other frame: "
- (confirm-nonexistent-file-or-buffer))))
- (find-file-other-frame filename wildcards))
-
-;;; File Mode
-
-(defvar magit-file-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "\C-xg" 'magit-status)
- (define-key map "\C-x\M-g" 'magit-dispatch)
- (define-key map "\C-c\M-g" 'magit-file-dispatch)
- map)
- "Keymap for `magit-file-mode'.")
-
-;;;###autoload (autoload 'magit-file-dispatch "magit" nil t)
-(transient-define-prefix magit-file-dispatch ()
- "Invoke a Magit command that acts on the visited file."
- :info-manual "(magit) Minor Mode for Buffers Visiting Files"
- ["Actions"
- [("s" "Stage" magit-stage-file)
- ("u" "Unstage" magit-unstage-file)
- ("c" "Commit" magit-commit)
- ("e" "Edit line" magit-edit-line-commit)]
- [("D" "Diff..." magit-diff)
- ("d" "Diff" magit-diff-buffer-file)
- ("g" "Status" magit-status-here)]
- [("L" "Log..." magit-log)
- ("l" "Log" magit-log-buffer-file)
- ("t" "Trace" magit-log-trace-definition)]
- [("B" "Blame..." magit-blame)
- ("b" "Blame" magit-blame-addition)
- ("r" "...removal" magit-blame-removal)
- ("f" "...reverse" magit-blame-reverse)
- ("m" "Blame echo" magit-blame-echo)
- ("q" "Quit blame" magit-blame-quit)]
- [("p" "Prev blob" magit-blob-previous)
- ("n" "Next blob" magit-blob-next)
- ("v" "Goto blob" magit-find-file)
- ("V" "Goto file" magit-blob-visit-file)]
- [(5 "C-c r" "Rename file" magit-file-rename)
- (5 "C-c d" "Delete file" magit-file-delete)
- (5 "C-c u" "Untrack file" magit-file-untrack)
- (5 "C-c c" "Checkout file" magit-file-checkout)]])
-
-(defvar magit-file-mode-lighter "")
-
-(define-minor-mode magit-file-mode
- "Enable some Magit features in a file-visiting buffer.
-
-Currently this only adds the following key bindings.
-\n\\{magit-file-mode-map}"
- :package-version '(magit . "2.2.0")
- :lighter magit-file-mode-lighter
- :keymap magit-file-mode-map)
-
-(defun magit-file-mode-turn-on ()
- (and buffer-file-name
- (magit-inside-worktree-p t)
- (magit-file-mode)))
-
-;;;###autoload
-(define-globalized-minor-mode global-magit-file-mode
- magit-file-mode magit-file-mode-turn-on
- :package-version '(magit . "2.13.0")
- :link '(info-link "(magit)Minor Mode for Buffers Visiting Files")
- :group 'magit-essentials
- :group 'magit-modes
- :init-value t)
-;; Unfortunately `:init-value t' only sets the value of the mode
-;; variable but does not cause the mode function to be called, and we
-;; cannot use `:initialize' to call that explicitly because the option
-;; is defined before the functions, so we have to do it here.
-(cl-eval-when (load eval)
- (when global-magit-file-mode
- (global-magit-file-mode 1)))
-
-;;; Blob Mode
-
-(defvar magit-blob-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "p" 'magit-blob-previous)
- (define-key map "n" 'magit-blob-next)
- (define-key map "b" 'magit-blame-addition)
- (define-key map "r" 'magit-blame-removal)
- (define-key map "f" 'magit-blame-reverse)
- (define-key map "q" 'magit-kill-this-buffer)
- map)
- "Keymap for `magit-blob-mode'.")
-
-(define-minor-mode magit-blob-mode
- "Enable some Magit features in blob-visiting buffers.
-
-Currently this only adds the following key bindings.
-\n\\{magit-blob-mode-map}"
- :package-version '(magit . "2.3.0"))
-
-(defun magit-blob-next ()
- "Visit the next blob which modified the current file."
- (interactive)
- (if magit-buffer-file-name
- (magit-blob-visit (or (magit-blob-successor magit-buffer-revision
- magit-buffer-file-name)
- magit-buffer-file-name))
- (if (buffer-file-name (buffer-base-buffer))
- (user-error "You have reached the end of time")
- (user-error "Buffer isn't visiting a file or blob"))))
-
-(defun magit-blob-previous ()
- "Visit the previous blob which modified the current file."
- (interactive)
- (if-let ((file (or magit-buffer-file-name
- (buffer-file-name (buffer-base-buffer)))))
- (--if-let (magit-blob-ancestor magit-buffer-revision file)
- (magit-blob-visit it)
- (user-error "You have reached the beginning of time"))
- (user-error "Buffer isn't visiting a file or blob")))
-
-;;;###autoload
-(defun magit-blob-visit-file ()
- "View the file from the worktree corresponding to the current blob.
-When visiting a blob or the version from the index, then go to
-the same location in the respective file in the working tree."
- (interactive)
- (if-let ((file (magit-file-relative-name)))
- (magit-find-file--internal "{worktree}" file #'pop-to-buffer-same-window)
- (user-error "Not visiting a blob")))
-
-(defun magit-blob-visit (blob-or-file)
- (if (stringp blob-or-file)
- (find-file blob-or-file)
- (pcase-let ((`(,rev ,file) blob-or-file))
- (magit-find-file rev file)
- (apply #'message "%s (%s %s ago)"
- (magit-rev-format "%s" rev)
- (magit--age (magit-rev-format "%ct" rev))))))
-
-(defun magit-blob-ancestor (rev file)
- (let ((lines (magit-with-toplevel
- (magit-git-lines "log" "-2" "--format=%H" "--name-only"
- "--follow" (or rev "HEAD") "--" file))))
- (if rev (cddr lines) (butlast lines 2))))
-
-(defun magit-blob-successor (rev file)
- (let ((lines (magit-with-toplevel
- (magit-git-lines "log" "--format=%H" "--name-only" "--follow"
- "HEAD" "--" file))))
- (catch 'found
- (while lines
- (if (equal (nth 2 lines) rev)
- (throw 'found (list (nth 0 lines) (nth 1 lines)))
- (setq lines (nthcdr 2 lines)))))))
-
-;;; File Commands
-
-(defun magit-file-rename (file newname)
- "Rename the FILE to NEWNAME.
-If FILE isn't tracked in Git, fallback to using `rename-file'."
- (interactive
- (let* ((file (magit-read-file "Rename file"))
- (dir (file-name-directory file))
- (newname (read-file-name (format "Rename %s to file: " file)
- (and dir (expand-file-name dir)))))
- (list (expand-file-name file (magit-toplevel))
- (expand-file-name newname))))
- (let ((oldbuf (get-file-buffer file)))
- (when (and oldbuf (buffer-modified-p oldbuf))
- (user-error "Save %s before moving it" file))
- (when (file-exists-p newname)
- (user-error "%s already exists" newname))
- (if (magit-file-tracked-p (magit-convert-filename-for-git file))
- (magit-call-git "mv"
- (magit-convert-filename-for-git file)
- (magit-convert-filename-for-git newname))
- (rename-file file newname current-prefix-arg))
- (when oldbuf
- (with-current-buffer oldbuf
- (let ((buffer-read-only buffer-read-only))
- (set-visited-file-name newname nil t))
- (if (fboundp 'vc-refresh-state)
- (vc-refresh-state)
- (with-no-warnings
- (vc-find-file-hook))))))
- (magit-refresh))
-
-(defun magit-file-untrack (files &optional force)
- "Untrack the selected FILES or one file read in the minibuffer.
-
-With a prefix argument FORCE do so even when the files have
-staged as well as unstaged changes."
- (interactive (list (or (--if-let (magit-region-values 'file t)
- (progn
- (unless (magit-file-tracked-p (car it))
- (user-error "Already untracked"))
- (magit-confirm-files 'untrack it "Untrack"))
- (list (magit-read-tracked-file "Untrack file"))))
- current-prefix-arg))
- (magit-with-toplevel
- (magit-run-git "rm" "--cached" (and force "--force") "--" files)))
-
-(defun magit-file-delete (files &optional force)
- "Delete the selected FILES or one file read in the minibuffer.
-
-With a prefix argument FORCE do so even when the files have
-uncommitted changes. When the files aren't being tracked in
-Git, then fallback to using `delete-file'."
- (interactive (list (--if-let (magit-region-values 'file t)
- (magit-confirm-files 'delete it "Delete")
- (list (magit-read-file "Delete file")))
- current-prefix-arg))
- (if (magit-file-tracked-p (car files))
- (magit-call-git "rm" (and force "--force") "--" files)
- (let ((topdir (magit-toplevel)))
- (dolist (file files)
- (delete-file (expand-file-name file topdir) t))))
- (magit-refresh))
-
-;;;###autoload
-(defun magit-file-checkout (rev file)
- "Checkout FILE from REV."
- (interactive
- (let ((rev (magit-read-branch-or-commit
- "Checkout from revision" magit-buffer-revision)))
- (list rev (magit-read-file-from-rev rev "Checkout file"))))
- (magit-with-toplevel
- (magit-run-git "checkout" rev "--" file)))
-
-;;; Read File
-
-(defvar magit-read-file-hist nil)
-
-(defun magit-read-file-from-rev (rev prompt &optional default)
- (let ((files (magit-revision-files rev)))
- (magit-completing-read
- prompt files nil t nil 'magit-read-file-hist
- (car (member (or default (magit-current-file)) files)))))
-
-(defun magit-read-file (prompt &optional tracked-only)
- (let ((choices (nconc (magit-list-files)
- (unless tracked-only (magit-untracked-files)))))
- (magit-completing-read
- prompt choices nil t nil nil
- (car (member (or (magit-section-value-if '(file submodule))
- (magit-file-relative-name nil tracked-only))
- choices)))))
-
-(defun magit-read-tracked-file (prompt)
- (magit-read-file prompt t))
-
-(defun magit-read-file-choice (prompt files &optional error default)
- "Read file from FILES.
-
-If FILES has only one member, return that instead of prompting.
-If FILES has no members, give a user error. ERROR can be given
-to provide a more informative error.
-
-If DEFAULT is non-nil, use this as the default value instead of
-`magit-current-file'."
- (pcase (length files)
- (0 (user-error (or error "No file choices")))
- (1 (car files))
- (_ (magit-completing-read
- prompt files nil t nil 'magit-read-file-hist
- (car (member (or default (magit-current-file)) files))))))
-
-(defun magit-read-changed-file (rev-or-range prompt &optional default)
- (magit-read-file-choice
- prompt
- (magit-changed-files rev-or-range)
- default
- (concat "No file changed in " rev-or-range)))
-
-;;; _
-(provide 'magit-files)
-;;; magit-files.el ends here
diff --git a/elpa/magit-20200728.45/magit-git.el b/elpa/magit-20200728.45/magit-git.el
deleted file mode 100644
index 6fafc97..0000000
--- a/elpa/magit-20200728.45/magit-git.el
+++ /dev/null
@@ -1,2335 +0,0 @@
-;;; magit-git.el --- Git functionality -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements wrappers for various Git plumbing commands.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit-utils)
-(require 'magit-section)
-
-;; From `magit-branch'.
-(defvar magit-branch-prefer-remote-upstream)
-(defvar magit-published-branches)
-
-;; From `magit-margin'.
-(declare-function magit-maybe-make-margin-overlay "magit-margin" ())
-
-;; From `magit-mode'.
-(declare-function magit-get-mode-buffer "magit-mode"
- (mode &optional value frame))
-(declare-function magit-refresh "magit-mode" ())
-(defvar magit-buffer-diff-args)
-(defvar magit-buffer-file-name)
-(defvar magit-buffer-log-args)
-(defvar magit-buffer-log-files)
-(defvar magit-buffer-refname)
-(defvar magit-buffer-revision)
-
-;; From `magit-process'.
-(declare-function magit-call-git "magit-process" (&rest args))
-(declare-function magit-process-buffer "magit-process" (&optional nodisplay))
-(declare-function magit-process-file "magit-process" (&rest args))
-(declare-function magit-process-insert-section "magit-process"
- (pwd program args &optional errcode errlog))
-(defvar magit-this-error)
-(defvar magit-process-error-message-regexps)
-
-;; From later in `magit-git'.
-(defvar magit-tramp-process-environment nil)
-
-(eval-when-compile
- (cl-pushnew 'number eieio--known-slot-names))
-
-;;; Git implementations
-
-(defvar magit-inhibit-libgit nil
- "Whether to inhibit the use of libgit.")
-
-(defvar magit--libgit-available-p eieio-unbound
- "Whether libgit is available.
-Use the function by the same name instead of this variable.")
-
-(defun magit--libgit-available-p ()
- (if (eq magit--libgit-available-p eieio-unbound)
- (setq magit--libgit-available-p
- (and module-file-suffix
- (let ((libgit (locate-library "libgit")))
- (and libgit
- (or (locate-library "libegit2")
- (let ((load-path
- (cons (expand-file-name
- (convert-standard-filename "build")
- (file-name-directory libgit))
- load-path)))
- (locate-library "libegit2")))))))
- magit--libgit-available-p))
-
-(defun magit-gitimpl ()
- "Return the Git implementation used in this repository."
- (if (and (not magit-inhibit-libgit)
- (not (file-remote-p default-directory))
- (magit--libgit-available-p))
- 'libgit
- 'git))
-
-;;; Options
-
-;; For now this is shared between `magit-process' and `magit-git'.
-(defgroup magit-process nil
- "Git and other external processes used by Magit."
- :group 'magit)
-
-(defvar magit-git-environment
- (list (format "INSIDE_EMACS=%s,magit" emacs-version))
- "Prepended to `process-environment' while running git.")
-
-(defcustom magit-git-output-coding-system
- (and (eq system-type 'windows-nt) 'utf-8)
- "Coding system for receiving output from Git.
-
-If non-nil, the Git config value `i18n.logOutputEncoding' should
-be set via `magit-git-global-arguments' to value consistent with
-this."
- :package-version '(magit . "2.9.0")
- :group 'magit-process
- :type '(choice (coding-system :tag "Coding system to decode Git output")
- (const :tag "Use system default" nil)))
-
-(defvar magit-git-w32-path-hack nil
- "Alist of (EXE . (PATHENTRY)).
-This specifies what additional PATH setting needs to be added to
-the environment in order to run the non-wrapper git executables
-successfully.")
-
-(defcustom magit-git-executable
- ;; Git might be installed in a different location on a remote, so
- ;; it is better not to use the full path to the executable, except
- ;; on Window where we would otherwise end up using one of the
- ;; wrappers "cmd/git.exe" or "cmd/git.cmd", which are much slower
- ;; than using "bin/git.exe" directly.
- (or (and (eq system-type 'windows-nt)
- (--when-let (executable-find "git")
- (ignore-errors
- ;; Git for Windows 2.x provides cygpath so we can
- ;; ask it for native paths.
- (let* ((core-exe
- (car
- (process-lines
- it "-c"
- "alias.X=!x() { which \"$1\" | cygpath -mf -; }; x"
- "X" "git")))
- (hack-entry (assoc core-exe magit-git-w32-path-hack))
- ;; Running the libexec/git-core executable
- ;; requires some extra PATH entries.
- (path-hack
- (list (concat "PATH="
- (car (process-lines
- it "-c"
- "alias.P=!cygpath -wp \"$PATH\""
- "P"))))))
- ;; The defcustom STANDARD expression can be
- ;; evaluated many times, so make sure it is
- ;; idempotent.
- (if hack-entry
- (setcdr hack-entry path-hack)
- (push (cons core-exe path-hack) magit-git-w32-path-hack))
- core-exe))))
- "git")
- "The Git executable used by Magit."
- :group 'magit-process
- :type 'string)
-
-(defcustom magit-git-global-arguments
- `("--no-pager" "--literal-pathspecs"
- "-c" "core.preloadindex=true"
- "-c" "log.showSignature=false"
- "-c" "color.ui=false"
- "-c" "color.diff=false"
- ,@(and (eq system-type 'windows-nt)
- (list "-c" "i18n.logOutputEncoding=UTF-8")))
- "Global Git arguments.
-
-The arguments set here are used every time the git executable is
-run as a subprocess. They are placed right after the executable
-itself and before the git command - as in `git HERE... COMMAND
-REST'. See the manpage `git(1)' for valid arguments.
-
-Be careful what you add here, especially if you are using Tramp
-to connect to servers with ancient Git versions. Never remove
-anything that is part of the default value, unless you really
-know what you are doing. And think very hard before adding
-something; it will be used every time Magit runs Git for any
-purpose."
- :package-version '(magit . "2.9.0")
- :group 'magit-commands
- :group 'magit-process
- :type '(repeat string))
-
-(defvar magit-git-debug nil
- "Whether to enable additional reporting of git errors.
-
-Magit basically calls git for one of these two reasons: for
-side-effects or to do something with its standard output.
-
-When git is run for side-effects then its output, including error
-messages, go into the process buffer which is shown when using \
-\\<magit-status-mode-map>\\[magit-process].
-
-When git's output is consumed in some way, then it would be too
-expensive to also insert it into this buffer, but when this
-option is non-nil and git returns with a non-zero exit status,
-then at least its standard error is inserted into this buffer.
-
-This is only intended for debugging purposes. Do not enable this
-permanently, that would negatively affect performance.")
-
-
-(defcustom magit-prefer-remote-upstream nil
- "Whether to favor remote branches when reading the upstream branch.
-
-This controls whether commands that read a branch from the user
-and then set it as the upstream branch, offer a local or a remote
-branch as default completion candidate, when they have the choice.
-
-This affects all commands that use `magit-read-upstream-branch'
-or `magit-read-starting-point', which includes most commands
-that change the upstream and many that create new branches."
- :package-version '(magit . "2.4.2")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-list-refs-sortby nil
- "How to sort the ref collection in the prompt.
-
-This affects commands that read a ref. More specifically, it
-controls the order of refs returned by `magit-list-refs', which
-is called by functions like `magit-list-branch-names' to generate
-the collection of refs. By default, refs are sorted according to
-their full refname (i.e., 'refs/...').
-
-Any value accepted by the `--sort' flag of `git for-each-ref' can
-be used. For example, \"-creatordate\" places refs with more
-recent committer or tagger dates earlier in the list. A list of
-strings can also be given in order to pass multiple sort keys to
-`git for-each-ref'.
-
-Note that, depending on the completion framework you use, this
-may not be sufficient to change the order in which the refs are
-displayed. It only controls the order of the collection passed
-to `magit-completing-read' or, for commands that support reading
-multiple strings, `read-from-minibuffer'. The completion
-framework ultimately determines how the collection is displayed."
- :package-version '(magit . "2.11.0")
- :group 'magit-miscellaneous
- :type '(choice string (repeat string)))
-
-;;; Git
-
-(defvar magit--refresh-cache nil)
-
-(defmacro magit--with-refresh-cache (key &rest body)
- (declare (indent 1) (debug (form body)))
- (let ((k (cl-gensym)))
- `(if magit--refresh-cache
- (let ((,k ,key))
- (--if-let (assoc ,k (cdr magit--refresh-cache))
- (progn (cl-incf (caar magit--refresh-cache))
- (cdr it))
- (cl-incf (cdar magit--refresh-cache))
- (let ((value ,(macroexp-progn body)))
- (push (cons ,k value)
- (cdr magit--refresh-cache))
- value)))
- ,@body)))
-
-(defvar magit-with-editor-envvar "GIT_EDITOR"
- "The environment variable exported by `magit-with-editor'.
-Set this to \"GIT_SEQUENCE_EDITOR\" if you do not want to use
-Emacs to edit commit messages but would like to do so to edit
-rebase sequences.")
-
-(defmacro magit-with-editor (&rest body)
- "Like `with-editor' but let-bind some more variables.
-Also respect the value of `magit-with-editor-envvar'."
- (declare (indent 0) (debug (body)))
- `(let ((magit-process-popup-time -1)
- ;; The user may have customized `shell-file-name' to
- ;; something which results in `w32-shell-dos-semantics' nil
- ;; (which changes the quoting style used by
- ;; `shell-quote-argument'), but Git for Windows expects shell
- ;; quoting in the dos style.
- (shell-file-name (if (and (eq system-type 'windows-nt)
- ;; If we have Cygwin mount points,
- ;; the git flavor is cygwin, so dos
- ;; shell quoting is probably wrong.
- (not magit-cygwin-mount-points))
- "cmdproxy"
- shell-file-name)))
- (with-editor* magit-with-editor-envvar
- ,@body)))
-
-(defmacro magit--with-temp-process-buffer (&rest body)
- "Like `with-temp-buffer', but always propagate `process-environment'.
-When that var is buffer-local in the calling buffer, it is not
-propagated by `with-temp-buffer', so we explicitly ensure that
-happens, so that processes will be invoked consistently. BODY is
-as for that macro."
- (declare (indent 0) (debug (body)))
- (let ((p (cl-gensym)))
- `(let ((,p process-environment))
- (with-temp-buffer
- (setq-local process-environment ,p)
- ,@body))))
-
-(defun magit-process-git-arguments (args)
- "Prepare ARGS for a function that invokes Git.
-
-Magit has many specialized functions for running Git; they all
-pass arguments through this function before handing them to Git,
-to do the following.
-
-* Flatten ARGS, removing nil arguments.
-* Prepend `magit-git-global-arguments' to ARGS.
-* On w32 systems, encode to `w32-ansi-code-page'."
- (setq args (append magit-git-global-arguments (-flatten args)))
- (if (and (eq system-type 'windows-nt) (boundp 'w32-ansi-code-page))
- ;; On w32, the process arguments *must* be encoded in the
- ;; current code-page (see #3250).
- (mapcar (lambda (arg)
- (encode-coding-string
- arg (intern (format "cp%d" w32-ansi-code-page))))
- args)
- args))
-
-(defun magit-git-exit-code (&rest args)
- "Execute Git with ARGS, returning its exit code."
- (apply #'magit-process-file magit-git-executable nil nil nil
- (magit-process-git-arguments args)))
-
-(defun magit-git-success (&rest args)
- "Execute Git with ARGS, returning t if its exit code is 0."
- (= (magit-git-exit-code args) 0))
-
-(defun magit-git-failure (&rest args)
- "Execute Git with ARGS, returning t if its exit code is 1."
- (= (magit-git-exit-code args) 1))
-
-(defun magit-git-string-p (&rest args)
- "Execute Git with ARGS, returning the first line of its output.
-If the exit code isn't zero or if there is no output, then return
-nil. Neither of these results is considered an error; if that is
-what you want, then use `magit-git-string-ng' instead.
-
-This is an experimental replacement for `magit-git-string', and
-still subject to major changes."
- (magit--with-refresh-cache (cons default-directory args)
- (magit--with-temp-process-buffer
- (and (zerop (apply #'magit-process-file magit-git-executable nil t nil
- (magit-process-git-arguments args)))
- (not (bobp))
- (progn
- (goto-char (point-min))
- (buffer-substring-no-properties (point) (line-end-position)))))))
-
-(defun magit-git-string-ng (&rest args)
- "Execute Git with ARGS, returning the first line of its output.
-If the exit code isn't zero or if there is no output, then that
-is considered an error, but instead of actually signaling an
-error, return nil. Additionally the output is put in the process
-buffer (creating it if necessary) and the error message is shown
-in the status buffer (provided it exists).
-
-This is an experimental replacement for `magit-git-string', and
-still subject to major changes. Also see `magit-git-string-p'."
- (magit--with-refresh-cache
- (list default-directory 'magit-git-string-ng args)
- (magit--with-temp-process-buffer
- (let* ((args (magit-process-git-arguments args))
- (status (apply #'magit-process-file magit-git-executable
- nil t nil args)))
- (if (zerop status)
- (and (not (bobp))
- (progn
- (goto-char (point-min))
- (buffer-substring-no-properties
- (point) (line-end-position))))
- (let ((buf (current-buffer)))
- (with-current-buffer (magit-process-buffer t)
- (magit-process-insert-section default-directory
- magit-git-executable args
- status buf)))
- (when-let ((status-buf (magit-get-mode-buffer 'magit-status-mode)))
- (let ((msg (magit--locate-error-message)))
- (with-current-buffer status-buf
- (setq magit-this-error msg))))
- nil)))))
-
-(defun magit-git-str (&rest args)
- "Execute Git with ARGS, returning the first line of its output.
-If there is no output, return nil. If the output begins with a
-newline, return an empty string. Like `magit-git-string' but
-ignore `magit-git-debug'."
- (setq args (-flatten args))
- (magit--with-refresh-cache (cons default-directory args)
- (magit--with-temp-process-buffer
- (apply #'magit-process-file magit-git-executable nil (list t nil) nil
- (magit-process-git-arguments args))
- (unless (bobp)
- (goto-char (point-min))
- (buffer-substring-no-properties (point) (line-end-position))))))
-
-(defun magit-git-output (&rest args)
- "Execute Git with ARGS, returning its output."
- (setq args (-flatten args))
- (magit--with-refresh-cache (cons default-directory args)
- (magit--with-temp-process-buffer
- (apply #'magit-process-file magit-git-executable nil (list t nil) nil
- (magit-process-git-arguments args))
- (buffer-substring-no-properties (point-min) (point-max)))))
-
-(define-error 'magit-invalid-git-boolean "Not a Git boolean")
-
-(defun magit-git-true (&rest args)
- "Execute Git with ARGS, returning t if it prints \"true\".
-If it prints \"false\", then return nil. For any other output
-signal `magit-invalid-git-boolean'."
- (pcase (magit-git-output args)
- ((or "true" "true\n") t)
- ((or "false" "false\n") nil)
- (output (signal 'magit-invalid-git-boolean output))))
-
-(defun magit-git-false (&rest args)
- "Execute Git with ARGS, returning t if it prints \"false\".
-If it prints \"true\", then return nil. For any other output
-signal `magit-invalid-git-boolean'."
- (pcase (magit-git-output args)
- ((or "true" "true\n") nil)
- ((or "false" "false\n") t)
- (output (signal 'magit-invalid-git-boolean output))))
-
-(defun magit-git-insert (&rest args)
- "Execute Git with ARGS, inserting its output at point.
-If Git exits with a non-zero exit status, then show a message and
-add a section in the respective process buffer."
- (setq args (magit-process-git-arguments args))
- (if magit-git-debug
- (let (log)
- (unwind-protect
- (progn
- (setq log (make-temp-file "magit-stderr"))
- (delete-file log)
- (let ((exit (apply #'magit-process-file magit-git-executable
- nil (list t log) nil args)))
- (when (> exit 0)
- (let ((msg "Git failed"))
- (when (file-exists-p log)
- (setq msg (with-temp-buffer
- (insert-file-contents log)
- (goto-char (point-max))
- (if (functionp magit-git-debug)
- (funcall magit-git-debug (buffer-string))
- (magit--locate-error-message))))
- (let ((magit-git-debug nil))
- (with-current-buffer (magit-process-buffer t)
- (magit-process-insert-section default-directory
- magit-git-executable
- args exit log))))
- (message "%s" msg)))
- exit))
- (ignore-errors (delete-file log))))
- (apply #'magit-process-file magit-git-executable
- nil (list t nil) nil args)))
-
-(defun magit--locate-error-message ()
- (goto-char (point-max))
- (and (run-hook-wrapped 'magit-process-error-message-regexps
- (lambda (re) (re-search-backward re nil t)))
- (match-string-no-properties 1)))
-
-(defun magit-git-string (&rest args)
- "Execute Git with ARGS, returning the first line of its output.
-If there is no output, return nil. If the output begins with a
-newline, return an empty string."
- (setq args (-flatten args))
- (magit--with-refresh-cache (cons default-directory args)
- (magit--with-temp-process-buffer
- (apply #'magit-git-insert args)
- (unless (bobp)
- (goto-char (point-min))
- (buffer-substring-no-properties (point) (line-end-position))))))
-
-(defun magit-git-lines (&rest args)
- "Execute Git with ARGS, returning its output as a list of lines.
-Empty lines anywhere in the output are omitted.
-
-If Git exits with a non-zero exit status, then report show a
-message and add a section in the respective process buffer."
- (magit--with-temp-process-buffer
- (apply #'magit-git-insert args)
- (split-string (buffer-string) "\n" t)))
-
-(defun magit-git-items (&rest args)
- "Execute Git with ARGS, returning its null-separated output as a list.
-Empty items anywhere in the output are omitted.
-
-If Git exits with a non-zero exit status, then report show a
-message and add a section in the respective process buffer."
- (magit--with-temp-process-buffer
- (apply #'magit-git-insert args)
- (split-string (buffer-string) "\0" t)))
-
-(defun magit-git-wash (washer &rest args)
- "Execute Git with ARGS, inserting washed output at point.
-Actually first insert the raw output at point. If there is no
-output, call `magit-cancel-section'. Otherwise temporarily narrow
-the buffer to the inserted text, move to its beginning, and then
-call function WASHER with ARGS as its sole argument."
- (declare (indent 1))
- (let ((beg (point)))
- (setq args (-flatten args))
- (magit-git-insert args)
- (if (= (point) beg)
- (magit-cancel-section)
- (unless (bolp)
- (insert "\n"))
- (save-restriction
- (narrow-to-region beg (point))
- (goto-char beg)
- (funcall washer args))
- (when (or (= (point) beg)
- (= (point) (1+ beg)))
- (magit-cancel-section))
- (magit-maybe-make-margin-overlay))))
-
-(defun magit-git-version (&optional raw)
- (--when-let (let (magit-git-global-arguments)
- (ignore-errors (substring (magit-git-string "version") 12)))
- (if raw it (and (string-match "\\`\\([0-9]+\\(\\.[0-9]+\\)\\{1,2\\}\\)" it)
- (match-string 1 it)))))
-
-;;; Variables
-
-(defun magit-config-get-from-cached-list (key)
- (gethash
- ;; `git config --list' downcases first and last components of the key.
- (--> key
- (replace-regexp-in-string "\\`[^.]+" #'downcase it t t)
- (replace-regexp-in-string "[^.]+\\'" #'downcase it t t))
- (magit--with-refresh-cache (cons (magit-toplevel) 'config)
- (let ((configs (make-hash-table :test 'equal)))
- (dolist (conf (magit-git-items "config" "--list" "-z"))
- (let* ((nl-pos (cl-position ?\n conf))
- (key (substring conf 0 nl-pos))
- (val (if nl-pos (substring conf (1+ nl-pos)) "")))
- (puthash key (nconc (gethash key configs) (list val)) configs)))
- configs))))
-
-(defun magit-get (&rest keys)
- "Return the value of the Git variable specified by KEYS."
- (car (last (apply 'magit-get-all keys))))
-
-(defun magit-get-all (&rest keys)
- "Return all values of the Git variable specified by KEYS."
- (let ((magit-git-debug nil)
- (arg (and (or (null (car keys))
- (string-prefix-p "--" (car keys)))
- (pop keys)))
- (key (mapconcat 'identity keys ".")))
- (if (and magit--refresh-cache (not arg))
- (magit-config-get-from-cached-list key)
- (magit-git-items "config" arg "-z" "--get-all" key))))
-
-(defun magit-get-boolean (&rest keys)
- "Return the boolean value of the Git variable specified by KEYS."
- (let ((key (mapconcat 'identity keys ".")))
- (if magit--refresh-cache
- (equal "true" (car (last (magit-config-get-from-cached-list key))))
- (equal (magit-git-str "config" "--bool" key) "true"))))
-
-(defun magit-set (value &rest keys)
- "Set the value of the Git variable specified by KEYS to VALUE."
- (let ((arg (and (or (null (car keys))
- (string-prefix-p "--" (car keys)))
- (pop keys)))
- (key (mapconcat 'identity keys ".")))
- (if value
- (magit-git-success "config" arg key value)
- (magit-git-success "config" arg "--unset" key))
- value))
-
-(gv-define-setter magit-get (val &rest keys)
- `(magit-set ,val ,@keys))
-
-(defun magit-set-all (values &rest keys)
- "Set all values of the Git variable specified by KEYS to VALUES."
- (let ((arg (and (or (null (car keys))
- (string-prefix-p "--" (car keys)))
- (pop keys)))
- (var (mapconcat 'identity keys ".")))
- (when (magit-get var)
- (magit-call-git "config" arg "--unset-all" var))
- (dolist (v values)
- (magit-call-git "config" arg "--add" var v))))
-
-;;; Files
-
-(defun magit--safe-default-directory (&optional file)
- (catch 'unsafe-default-dir
- (let ((dir (file-name-as-directory
- (expand-file-name (or file default-directory))))
- (previous nil))
- (while (not (magit-file-accessible-directory-p dir))
- (setq dir (file-name-directory (directory-file-name dir)))
- (when (equal dir previous)
- (throw 'unsafe-default-dir nil))
- (setq previous dir))
- dir)))
-
-(defmacro magit--with-safe-default-directory (file &rest body)
- (declare (indent 1) (debug (form body)))
- `(when-let ((default-directory (magit--safe-default-directory ,file)))
- ,@body))
-
-(defun magit-gitdir (&optional directory)
- "Return the absolute and resolved path of the .git directory.
-
-If the `GIT_DIR' environment variable is define then return that.
-Otherwise return the .git directory for DIRECTORY, or if that is
-nil, then for `default-directory' instead. If the directory is
-not located inside a Git repository, then return nil."
- (let ((default-directory (or directory default-directory)))
- (magit-git-dir)))
-
-(defun magit-git-dir (&optional path)
- "Return the absolute and resolved path of the .git directory.
-
-If the `GIT_DIR' environment variable is define then return that.
-Otherwise return the .git directory for `default-directory'. If
-the directory is not located inside a Git repository, then return
-nil."
- (magit--with-refresh-cache (list default-directory 'magit-git-dir path)
- (magit--with-safe-default-directory nil
- (when-let ((dir (magit-rev-parse-safe "--git-dir")))
- (setq dir (file-name-as-directory (magit-expand-git-file-name dir)))
- (unless (file-remote-p dir)
- (setq dir (concat (file-remote-p default-directory) dir)))
- (if path (expand-file-name (convert-standard-filename path) dir) dir)))))
-
-(defvar magit--separated-gitdirs nil)
-
-(defun magit--record-separated-gitdir ()
- (let ((topdir (magit-toplevel))
- (gitdir (magit-git-dir)))
- ;; Kludge: git-annex converts submodule gitdirs to symlinks. See #3599.
- (when (file-symlink-p (directory-file-name gitdir))
- (setq gitdir (file-truename gitdir)))
- ;; We want to delete the entry for `topdir' here, rather than within
- ;; (unless ...), in case a `--separate-git-dir' repository was switched to
- ;; the standard structure (i.e., "topdir/.git/").
- (setq magit--separated-gitdirs (cl-delete topdir
- magit--separated-gitdirs
- :key #'car :test #'equal))
- (unless (equal (file-name-as-directory (expand-file-name ".git" topdir))
- gitdir)
- (push (cons topdir gitdir) magit--separated-gitdirs))))
-
-(defun magit-toplevel (&optional directory)
- "Return the absolute path to the toplevel of the current repository.
-
-From within the working tree or control directory of a repository
-return the absolute path to the toplevel directory of the working
-tree. As a special case, from within a bare repository return
-the control directory instead. When called outside a repository
-then return nil.
-
-When optional DIRECTORY is non-nil then return the toplevel for
-that directory instead of the one for `default-directory'.
-
-Try to respect the option `find-file-visit-truename', i.e. when
-the value of that option is nil, then avoid needlessly returning
-the truename. When a symlink to a sub-directory of the working
-tree is involved, or when called from within a sub-directory of
-the gitdir or from the toplevel of a gitdir, which itself is not
-located within the working tree, then it is not possible to avoid
-returning the truename."
- (magit--with-refresh-cache
- (cons (or directory default-directory) 'magit-toplevel)
- (magit--with-safe-default-directory directory
- (if-let ((topdir (magit-rev-parse-safe "--show-toplevel")))
- (let (updir)
- (setq topdir (magit-expand-git-file-name topdir))
- (if (and
- ;; Always honor these settings.
- (not find-file-visit-truename)
- (not (getenv "GIT_WORK_TREE"))
- ;; `--show-cdup' is the relative path to the toplevel
- ;; from `(file-truename default-directory)'. Here we
- ;; pretend it is relative to `default-directory', and
- ;; go to that directory. Then we check whether
- ;; `--show-toplevel' still returns the same value and
- ;; whether `--show-cdup' now is the empty string. If
- ;; both is the case, then we are at the toplevel of
- ;; the same working tree, but also avoided needlessly
- ;; following any symlinks.
- (progn
- (setq updir (file-name-as-directory
- (magit-rev-parse-safe "--show-cdup")))
- (setq updir (if (file-name-absolute-p updir)
- (concat (file-remote-p default-directory) updir)
- (expand-file-name updir)))
- (let ((default-directory updir))
- (and (string-equal (magit-rev-parse-safe "--show-cdup") "")
- (--when-let (magit-rev-parse-safe "--show-toplevel")
- (string-equal (magit-expand-git-file-name it)
- topdir))))))
- updir
- (concat (file-remote-p default-directory)
- (file-name-as-directory topdir))))
- (when-let ((gitdir (magit-rev-parse-safe "--git-dir")))
- (setq gitdir (file-name-as-directory
- (if (file-name-absolute-p gitdir)
- ;; We might have followed a symlink.
- (concat (file-remote-p default-directory)
- (magit-expand-git-file-name gitdir))
- (expand-file-name gitdir))))
- (if (magit-bare-repo-p)
- gitdir
- (let* ((link (expand-file-name "gitdir" gitdir))
- (wtree (and (file-exists-p link)
- (magit-file-line link))))
- (cond
- ((and wtree
- ;; Ignore .git/gitdir files that result from a
- ;; Git bug. See #2364.
- (not (equal wtree ".git")))
- ;; Return the linked working tree.
- (concat (file-remote-p default-directory)
- (file-name-directory wtree)))
- ;; The working directory may not be the parent directory of
- ;; .git if it was set up with `git init --separate-git-dir'.
- ;; See #2955.
- ((car (rassoc gitdir magit--separated-gitdirs)))
- (t
- ;; Step outside the control directory to enter the working tree.
- (file-name-directory (directory-file-name gitdir)))))))))))
-
-(defmacro magit-with-toplevel (&rest body)
- (declare (indent defun) (debug (body)))
- (let ((toplevel (cl-gensym "toplevel")))
- `(let ((,toplevel (magit-toplevel)))
- (if ,toplevel
- (let ((default-directory ,toplevel))
- ,@body)
- (magit--not-inside-repository-error)))))
-
-(define-error 'magit-outside-git-repo "Not inside Git repository")
-(define-error 'magit-git-executable-not-found
- "Git executable cannot be found (see https://magit.vc/goto/e6a78ed2)")
-
-(defun magit--not-inside-repository-error ()
- (if (executable-find magit-git-executable)
- (signal 'magit-outside-git-repo default-directory)
- (signal 'magit-git-executable-not-found magit-git-executable)))
-
-(defun magit-inside-gitdir-p (&optional noerror)
- "Return t if `default-directory' is below the repository directory.
-If it is below the working directory, then return nil.
-If it isn't below either, then signal an error unless NOERROR
-is non-nil, in which case return nil."
- (and (magit--assert-default-directory noerror)
- ;; Below a repository directory that is not located below the
- ;; working directory "git rev-parse --is-inside-git-dir" prints
- ;; "false", which is wrong.
- (let ((gitdir (magit-git-dir)))
- (cond (gitdir (file-in-directory-p default-directory gitdir))
- (noerror nil)
- (t (signal 'magit-outside-git-repo default-directory))))))
-
-(defun magit-inside-worktree-p (&optional noerror)
- "Return t if `default-directory' is below the working directory.
-If it is below the repository directory, then return nil.
-If it isn't below either, then signal an error unless NOERROR
-is non-nil, in which case return nil."
- (and (magit--assert-default-directory noerror)
- (condition-case nil
- (magit-rev-parse-true "--is-inside-work-tree")
- (magit-invalid-git-boolean
- (and (not noerror)
- (signal 'magit-outside-git-repo default-directory))))))
-
-(cl-defgeneric magit-bare-repo-p (&optional noerror)
- "Return t if the current repository is bare.
-If it is non-bare, then return nil. If `default-directory'
-isn't below a Git repository, then signal an error unless
-NOERROR is non-nil, in which case return nil."
- (and (magit--assert-default-directory noerror)
- (condition-case nil
- (magit-rev-parse-true "--is-bare-repository")
- (magit-invalid-git-boolean
- (and (not noerror)
- (signal 'magit-outside-git-repo default-directory))))))
-
-(defun magit--assert-default-directory (&optional noerror)
- (or (file-directory-p default-directory)
- (and (not noerror)
- (let ((exists (file-exists-p default-directory)))
- (signal (if exists 'file-error 'file-missing)
- (list "Running git in directory"
- (if exists
- "Not a directory"
- "No such file or directory")
- default-directory))))))
-
-(defun magit-git-repo-p (directory &optional non-bare)
- "Return t if DIRECTORY is a Git repository.
-When optional NON-BARE is non-nil also return nil if DIRECTORY is
-a bare repository."
- (and (file-directory-p directory) ; Avoid archives, see #3397.
- (or (file-regular-p (expand-file-name ".git" directory))
- (file-directory-p (expand-file-name ".git" directory))
- (and (not non-bare)
- (file-regular-p (expand-file-name "HEAD" directory))
- (file-directory-p (expand-file-name "refs" directory))
- (file-directory-p (expand-file-name "objects" directory))))))
-
-(defun magit-file-relative-name (&optional file tracked)
- "Return the path of FILE relative to the repository root.
-
-If optional FILE is nil or omitted, return the relative path of
-the file being visited in the current buffer, if any, else nil.
-If the file is not inside a Git repository, then return nil.
-
-If TRACKED is non-nil, return the path only if it matches a
-tracked file."
- (unless file
- (with-current-buffer (or (buffer-base-buffer)
- (current-buffer))
- (setq file (or magit-buffer-file-name buffer-file-name
- (and (derived-mode-p 'dired-mode) default-directory)))))
- (when (and file (or (not tracked)
- (magit-file-tracked-p (file-relative-name file))))
- (--when-let (magit-toplevel
- (magit--safe-default-directory
- (directory-file-name (file-name-directory file))))
- (file-relative-name file it))))
-
-(defun magit-file-tracked-p (file)
- (magit-git-success "ls-files" "--error-unmatch" file))
-
-(defun magit-list-files (&rest args)
- (apply #'magit-git-items "ls-files" "-z" "--full-name" args))
-
-(defun magit-tracked-files ()
- (magit-list-files "--cached"))
-
-(defun magit-untracked-files (&optional all files)
- (magit-list-files "--other" (unless all "--exclude-standard") "--" files))
-
-(defun magit-unstaged-files (&optional nomodules files)
- (magit-git-items "diff-files" "-z" "--name-only"
- (and nomodules "--ignore-submodules")
- "--" files))
-
-(defun magit-staged-files (&optional nomodules files)
- (magit-git-items "diff-index" "-z" "--name-only" "--cached"
- (and nomodules "--ignore-submodules")
- (magit-headish) "--" files))
-
-(defun magit-binary-files (&rest args)
- (--mapcat (and (string-match "^-\t-\t\\(.+\\)" it)
- (list (match-string 1 it)))
- (apply #'magit-git-items
- "diff" "-z" "--numstat" "--ignore-submodules"
- args)))
-
-(defun magit-unmerged-files ()
- (magit-git-items "diff-files" "-z" "--name-only" "--diff-filter=U"))
-
-(defun magit-ignored-files ()
- (magit-git-items "ls-files" "-z" "--others" "--ignored"
- "--exclude-standard" "--directory"))
-
-(defun magit-skip-worktree-files ()
- (--keep (and (and (= (aref it 0) ?S)
- (substring it 2)))
- (magit-list-files "-t")))
-
-(defun magit-assume-unchanged-files ()
- (--keep (and (and (memq (aref it 0) '(?h ?s ?m ?r ?c ?k))
- (substring it 2)))
- (magit-list-files "-v")))
-
-(defun magit-revision-files (rev)
- (magit-with-toplevel
- (magit-git-items "ls-tree" "-z" "-r" "--name-only" rev)))
-
-(defun magit-changed-files (rev-or-range &optional other-rev)
- "Return list of files the have changed between two revisions.
-If OTHER-REV is non-nil, REV-OR-RANGE should be a revision, not a
-range. Otherwise, it can be any revision or range accepted by
-\"git diff\" (i.e., <rev>, <revA>..<revB>, or <revA>...<revB>)."
- (magit-with-toplevel
- (magit-git-items "diff" "-z" "--name-only" rev-or-range other-rev)))
-
-(defun magit-renamed-files (revA revB)
- (--map (cons (nth 1 it) (nth 2 it))
- (-partition 3 (magit-git-items
- "diff-tree" "-r" "--diff-filter=R" "-z" "-M"
- revA revB))))
-
-(defun magit-file-status (&rest args)
- (magit--with-temp-process-buffer
- (save-excursion (magit-git-insert "status" "-z" args))
- (let ((pos (point)) status)
- (while (> (skip-chars-forward "[:print:]") 0)
- (let ((x (char-after pos))
- (y (char-after (1+ pos)))
- (file (buffer-substring (+ pos 3) (point))))
- (forward-char)
- (if (memq x '(?R ?C))
- (progn
- (setq pos (point))
- (skip-chars-forward "[:print:]")
- (push (list file (buffer-substring pos (point)) x y) status)
- (forward-char))
- (push (list file nil x y) status)))
- (setq pos (point)))
- status)))
-
-(defcustom magit-cygwin-mount-points
- (when (eq system-type 'windows-nt)
- (cl-sort (--map (if (string-match "^\\(.*\\) on \\(.*\\) type" it)
- (cons (file-name-as-directory (match-string 2 it))
- (file-name-as-directory (match-string 1 it)))
- (lwarn '(magit) :error
- "Failed to parse Cygwin mount: %S" it))
- ;; If --exec-path is not a native Windows path,
- ;; then we probably have a cygwin git.
- (let ((process-environment
- (append magit-git-environment process-environment)))
- (and (not (string-match-p
- "\\`[a-zA-Z]:"
- (car (process-lines
- magit-git-executable "--exec-path"))))
- (ignore-errors (process-lines "mount")))))
- #'> :key (pcase-lambda (`(,cyg . ,_win)) (length cyg))))
- "Alist of (CYGWIN . WIN32) directory names.
-Sorted from longest to shortest CYGWIN name."
- :package-version '(magit . "2.3.0")
- :group 'magit-process
- :type '(alist :key-type string :value-type directory))
-
-(defun magit-expand-git-file-name (filename)
- (unless (file-name-absolute-p filename)
- (setq filename (expand-file-name filename)))
- (-if-let ((cyg . win)
- (cl-assoc filename magit-cygwin-mount-points
- :test (lambda (f cyg) (string-prefix-p cyg f))))
- (concat win (substring filename (length cyg)))
- filename))
-
-(defun magit-convert-filename-for-git (filename)
- "Convert FILENAME so that it can be passed to git.
-1. If it's a remote filename, then remove the remote part.
-2. Deal with an `windows-nt' Emacs vs. Cygwin Git incompatibility."
- (if (file-name-absolute-p filename)
- (-if-let ((cyg . win)
- (cl-rassoc filename magit-cygwin-mount-points
- :test (lambda (f win) (string-prefix-p win f))))
- (concat cyg (substring filename (length win)))
- (or (file-remote-p filename 'localname)
- filename))
- filename))
-
-(defun magit-decode-git-path (path)
- (if (eq (aref path 0) ?\")
- (decode-coding-string (read path)
- (or magit-git-output-coding-system
- (car default-process-coding-system))
- t)
- path))
-
-(defun magit-file-at-point (&optional expand assert)
- (if-let ((file (magit-section-case
- (file (oref it value))
- (hunk (magit-section-parent-value it)))))
- (if expand
- (expand-file-name file (magit-toplevel))
- file)
- (when assert
- (user-error "No file at point"))))
-
-(defun magit-current-file ()
- (or (magit-file-relative-name)
- (magit-file-at-point)
- (and (derived-mode-p 'magit-log-mode)
- (car magit-buffer-log-files))))
-
-;;; Predicates
-
-(defun magit-no-commit-p ()
- "Return t if there is no commit in the current Git repository."
- (not (magit-rev-verify "HEAD")))
-
-(defun magit-merge-commit-p (commit)
- "Return t if COMMIT is a merge commit."
- (> (length (magit-commit-parents commit)) 1))
-
-(defun magit-anything-staged-p (&optional ignore-submodules &rest files)
- "Return t if there are any staged changes.
-If optional FILES is non-nil, then only changes to those files
-are considered."
- (magit-git-failure "diff" "--quiet" "--cached"
- (and ignore-submodules "--ignore-submodules")
- "--" files))
-
-(defun magit-anything-unstaged-p (&optional ignore-submodules &rest files)
- "Return t if there are any unstaged changes.
-If optional FILES is non-nil, then only changes to those files
-are considered."
- (magit-git-failure "diff" "--quiet"
- (and ignore-submodules "--ignore-submodules")
- "--" files))
-
-(defun magit-anything-modified-p (&optional ignore-submodules &rest files)
- "Return t if there are any staged or unstaged changes.
-If optional FILES is non-nil, then only changes to those files
-are considered."
- (or (apply 'magit-anything-staged-p ignore-submodules files)
- (apply 'magit-anything-unstaged-p ignore-submodules files)))
-
-(defun magit-anything-unmerged-p (&rest files)
- "Return t if there are any merge conflicts.
-If optional FILES is non-nil, then only conflicts in those files
-are considered."
- (and (magit-git-string "ls-files" "--unmerged" files) t))
-
-(defun magit-module-worktree-p (module)
- (magit-with-toplevel
- (file-exists-p (expand-file-name (expand-file-name ".git" module)))))
-
-(defun magit-module-no-worktree-p (module)
- (not (magit-module-worktree-p module)))
-
-(defun magit-ignore-submodules-p (&optional return-argument)
- (or (cl-find-if (lambda (arg)
- (string-prefix-p "--ignore-submodules" arg))
- magit-buffer-diff-args)
- (when-let ((value (magit-get "diff.ignoreSubmodules")))
- (if return-argument
- (concat "--ignore-submodules=" value)
- (concat "diff.ignoreSubmodules=" value)))))
-
-;;; Revisions and References
-
-(defun magit-rev-parse (&rest args)
- "Execute `git rev-parse ARGS', returning first line of output.
-If there is no output, return nil."
- (apply #'magit-git-string "rev-parse" args))
-
-(defun magit-rev-parse-safe (&rest args)
- "Execute `git rev-parse ARGS', returning first line of output.
-If there is no output, return nil. Like `magit-rev-parse' but
-ignore `magit-git-debug'."
- (apply #'magit-git-str "rev-parse" args))
-
-(defun magit-rev-parse-true (&rest args)
- "Execute `git rev-parse ARGS', returning t if it prints \"true\".
-If it prints \"false\", then return nil. For any other output
-signal an error."
- (magit-git-true "rev-parse" args))
-
-(defun magit-rev-parse-false (&rest args)
- "Execute `git rev-parse ARGS', returning t if it prints \"false\".
-If it prints \"true\", then return nil. For any other output
-signal an error."
- (magit-git-false "rev-parse" args))
-
-(defun magit-rev-parse-p (&rest args)
- "Execute `git rev-parse ARGS', returning t if it prints \"true\".
-Return t if the first (and usually only) output line is the
-string \"true\", otherwise return nil."
- (equal (magit-git-str "rev-parse" args) "true"))
-
-(defun magit-rev-verify (rev)
- (magit-git-string-p "rev-parse" "--verify" rev))
-
-(defun magit-commit-p (rev)
- "Return full hash for REV if it names an existing commit."
- (magit-rev-verify (concat rev "^{commit}")))
-
-(defalias 'magit-rev-verify-commit 'magit-commit-p)
-
-(defalias 'magit-rev-hash 'magit-commit-p)
-
-(defun magit-rev-equal (a b)
- "Return t if there are no differences between the commits A and B."
- (magit-git-success "diff" "--quiet" a b))
-
-(defun magit-rev-eq (a b)
- "Return t if A and B refer to the same commit."
- (let ((a (magit-commit-p a))
- (b (magit-commit-p b)))
- (and a b (equal a b))))
-
-(defun magit-rev-ancestor-p (a b)
- "Return non-nil if commit A is an ancestor of commit B."
- (magit-git-success "merge-base" "--is-ancestor" a b))
-
-(defun magit-rev-head-p (rev)
- (or (equal rev "HEAD")
- (and rev
- (not (string-match-p "\\.\\." rev))
- (equal (magit-rev-parse rev)
- (magit-rev-parse "HEAD")))))
-
-(defun magit-rev-author-p (rev)
- "Return t if the user is the author of REV.
-More precisely return t if `user.name' is equal to the author
-name of REV and/or `user.email' is equal to the author email
-of REV."
- (or (equal (magit-get "user.name") (magit-rev-format "%an" rev))
- (equal (magit-get "user.email") (magit-rev-format "%ae" rev))))
-
-(defun magit-rev-name (rev &optional pattern not-anchored)
- "Return a symbolic name for REV using `git-name-rev'.
-
-PATTERN can be used to limit the result to a matching ref.
-Unless NOT-ANCHORED is non-nil, the beginning of the ref must
-match PATTERN.
-
-An anchored lookup is done using the arguments
-\"--exclude=*/<PATTERN> --exclude=*/HEAD\" in addition to
-\"--refs=<PATTERN>\", provided at least version v2.13 of Git is
-used. Older versions did not support the \"--exclude\" argument.
-When \"--exclude\" cannot be used and `git-name-rev' returns a
-ref that should have been excluded, then that is discarded and
-this function returns nil instead. This is unfortunate because
-there might be other refs that do match. To fix that, update
-Git."
- (if (version< (magit-git-version) "2.13")
- (when-let
- ((ref (magit-git-string "name-rev" "--name-only" "--no-undefined"
- (and pattern (concat "--refs=" pattern))
- rev)))
- (if (and pattern
- (string-match-p "\\`refs/[^/]+/\\*\\'" pattern))
- (let ((namespace (substring pattern 0 -1)))
- (and (not (or (string-suffix-p "HEAD" ref)
- (and (string-match-p namespace ref)
- (not (magit-rev-verify
- (concat namespace ref))))))
- ref))
- ref))
- (magit-git-string "name-rev" "--name-only" "--no-undefined"
- (and pattern (concat "--refs=" pattern))
- (and pattern
- (not not-anchored)
- (list "--exclude=*/HEAD"
- (concat "--exclude=*/" pattern)))
- rev)))
-
-(defun magit-rev-branch (rev)
- (--when-let (magit-rev-name rev "refs/heads/*")
- (unless (string-match-p "[~^]" it) it)))
-
-(defun magit-get-shortname (rev)
- (let* ((fn (apply-partially 'magit-rev-name rev))
- (name (or (funcall fn "refs/tags/*")
- (funcall fn "refs/heads/*")
- (funcall fn "refs/remotes/*"))))
- (cond ((not name)
- (magit-rev-parse "--short" rev))
- ((string-match "^\\(?:tags\\|remotes\\)/\\(.+\\)" name)
- (if (magit-ref-ambiguous-p (match-string 1 name))
- name
- (match-string 1 name)))
- (t (magit-ref-maybe-qualify name)))))
-
-(defun magit-name-branch (rev &optional lax)
- (or (magit-name-local-branch rev)
- (magit-name-remote-branch rev)
- (and lax (or (magit-name-local-branch rev t)
- (magit-name-remote-branch rev t)))))
-
-(defun magit-name-local-branch (rev &optional lax)
- (--when-let (magit-rev-name rev "refs/heads/*")
- (and (or lax (not (string-match-p "[~^]" it))) it)))
-
-(defun magit-name-remote-branch (rev &optional lax)
- (--when-let (magit-rev-name rev "refs/remotes/*")
- (and (or lax (not (string-match-p "[~^]" it)))
- (substring it 8))))
-
-(defun magit-name-tag (rev &optional lax)
- (--when-let (magit-rev-name rev "refs/tags/*")
- (and (or lax (not (string-match-p "[~^]" it)))
- (substring it 5))))
-
-(defun magit-ref-abbrev (refname)
- "Return an unambiguous abbreviation of REFNAME."
- (magit-rev-parse "--verify" "--abbrev-ref" refname))
-
-(defun magit-ref-fullname (refname)
- "Return fully qualified refname for REFNAME.
-If REFNAME is ambiguous, return nil."
- (magit-rev-parse "--verify" "--symbolic-full-name" refname))
-
-(defun magit-ref-ambiguous-p (refname)
- (save-match-data
- (if (string-match "\\`\\([^^~]+\\)\\(.*\\)" refname)
- (not (magit-ref-fullname (match-string 1 refname)))
- (error "%S has an unrecognized format" refname))))
-
-(defun magit-ref-maybe-qualify (refname &optional prefix)
- "If REFNAME is ambiguous, try to disambiguate it by prepend PREFIX to it.
-Return an unambiguous refname, either REFNAME or that prefixed
-with PREFIX, nil otherwise. If REFNAME has an offset suffix
-such as \"~1\", then that is preserved. If optional PREFIX is
-nil, then use \"heads/\". "
- (if (magit-ref-ambiguous-p refname)
- (let ((refname (concat (or prefix "heads/") refname)))
- (and (not (magit-ref-ambiguous-p refname)) refname))
- refname))
-
-(defun magit-ref-exists-p (ref)
- (magit-git-success "show-ref" "--verify" ref))
-
-(defun magit-ref-equal (a b)
- "Return t if the refnames A and B are `equal'.
-A symbolic-ref pointing to some ref, is `equal' to that ref,
-as are two symbolic-refs pointing to the same ref. Refnames
-may be abbreviated."
- (let ((a (magit-ref-fullname a))
- (b (magit-ref-fullname b)))
- (and a b (equal a b))))
-
-(defun magit-ref-eq (a b)
- "Return t if the refnames A and B are `eq'.
-A symbolic-ref is `eq' to itself, but not to the ref it points
-to, or to some other symbolic-ref that points to the same ref."
- (let ((symbolic-a (magit-symbolic-ref-p a))
- (symbolic-b (magit-symbolic-ref-p b)))
- (or (and symbolic-a
- symbolic-b
- (equal a b))
- (and (not symbolic-a)
- (not symbolic-b)
- (magit-ref-equal a b)))))
-
-(defun magit-headish ()
- "Return \"HEAD\" or if that doesn't exist the hash of the empty tree."
- (if (magit-no-commit-p)
- (magit-git-string "mktree")
- "HEAD"))
-
-(defun magit-branch-at-point ()
- (magit-section-case
- (branch (oref it value))
- (commit (or (magit--painted-branch-at-point)
- (magit-name-branch (oref it value))))))
-
-(defun magit--painted-branch-at-point (&optional type)
- (or (and (not (eq type 'remote))
- (memq (get-text-property (point) 'font-lock-face)
- (list 'magit-branch-local
- 'magit-branch-current))
- (when-let ((branch (thing-at-point 'git-revision t)))
- (cdr (magit-split-branch-name branch))))
- (and (not (eq type 'local))
- (memq (get-text-property (point) 'font-lock-face)
- (list 'magit-branch-remote
- 'magit-branch-remote-head))
- (thing-at-point 'git-revision t))))
-
-(defun magit-local-branch-at-point ()
- (magit-section-case
- (branch (let ((branch (magit-ref-maybe-qualify (oref it value))))
- (when (member branch (magit-list-local-branch-names))
- branch)))
- (commit (or (magit--painted-branch-at-point 'local)
- (magit-name-local-branch (oref it value))))))
-
-(defun magit-remote-branch-at-point ()
- (magit-section-case
- (branch (let ((branch (oref it value)))
- (when (member branch (magit-list-remote-branch-names))
- branch)))
- (commit (or (magit--painted-branch-at-point 'remote)
- (magit-name-remote-branch (oref it value))))))
-
-(defun magit-commit-at-point ()
- (or (magit-section-value-if 'commit)
- (and (derived-mode-p 'magit-stash-mode
- 'magit-merge-preview-mode
- 'magit-revision-mode)
- magit-buffer-revision)))
-
-(defun magit-branch-or-commit-at-point ()
- (or (and magit-buffer-file-name
- magit-buffer-refname)
- (magit-section-case
- (branch (magit-ref-maybe-qualify (oref it value)))
- (commit (or (magit--painted-branch-at-point)
- (let ((rev (oref it value)))
- (or (magit-name-branch rev) rev))))
- (tag (magit-ref-maybe-qualify (oref it value) "tags/"))
- (pullreq (or (and (fboundp 'forge--pullreq-branch)
- (magit-branch-p
- (forge--pullreq-branch (oref it value))))
- (magit-ref-p (format "refs/pullreqs/%s"
- (oref (oref it value) number))))))
- (thing-at-point 'git-revision t)
- (and (derived-mode-p 'magit-stash-mode
- 'magit-merge-preview-mode
- 'magit-revision-mode)
- magit-buffer-revision)))
-
-(defun magit-tag-at-point ()
- (magit-section-case
- (tag (oref it value))
- (commit (magit-name-tag (oref it value)))))
-
-(defun magit-stash-at-point ()
- (magit-section-value-if 'stash))
-
-(defun magit-remote-at-point ()
- (magit-section-case
- (remote (oref it value))
- (branch (magit-section-parent-value it))))
-
-(defun magit-module-at-point (&optional predicate)
- (when (magit-section-match 'magit-module-section)
- (let ((module (oref (magit-current-section) value)))
- (and (or (not predicate)
- (funcall predicate module))
- module))))
-
-(defun magit-get-current-branch ()
- "Return the refname of the currently checked out branch.
-Return nil if no branch is currently checked out."
- (magit-git-string "symbolic-ref" "--short" "HEAD"))
-
-(defvar magit-get-previous-branch-timeout 0.5
- "Maximum time to spend in `magit-get-previous-branch'.
-Given as a number of seconds.")
-
-(defun magit-get-previous-branch ()
- "Return the refname of the previously checked out branch.
-Return nil if no branch can be found in the `HEAD' reflog
-which is different from the current branch and still exists.
-The amount of time spent searching is limited by
-`magit-get-previous-branch-timeout'."
- (let ((t0 (float-time))
- (current (magit-get-current-branch))
- (i 1) prev)
- (while (if (> (- (float-time) t0) magit-get-previous-branch-timeout)
- (setq prev nil) ;; Timed out.
- (and (setq prev (magit-rev-verify (format "@{-%i}" i)))
- (or (not (setq prev (magit-rev-branch prev)))
- (equal prev current))))
- (cl-incf i))
- prev))
-
-(defun magit-set-upstream-branch (branch upstream)
- "Set UPSTREAM as the upstream of BRANCH.
-If UPSTREAM is nil, then unset BRANCH's upstream.
-Otherwise UPSTREAM has to be an existing branch."
- (if upstream
- (magit-call-git "branch" "--set-upstream-to" upstream branch)
- (magit-call-git "branch" "--unset-upstream" branch)))
-
-(defun magit-get-upstream-ref (&optional branch)
- "Return the upstream branch of BRANCH as a fully qualified ref.
-It BRANCH is nil, then return the upstream of the current branch,
-if any, nil otherwise. If the upstream is not configured, the
-configured remote is an url, or the named branch does not exist,
-then return nil. I.e. return an existing local or
-remote-tracking branch ref."
- (when-let ((branch (or branch (magit-get-current-branch))))
- (magit-ref-fullname (concat branch "@{upstream}"))))
-
-(defun magit-get-upstream-branch (&optional branch)
- "Return the name of the upstream branch of BRANCH.
-It BRANCH is nil, then return the upstream of the current branch
-if any, nil otherwise. If the upstream is not configured, the
-configured remote is an url, or the named branch does not exist,
-then return nil. I.e. return the name of an existing local or
-remote-tracking branch. The returned string is colorized
-according to the branch type."
- (when-let ((branch (or branch (magit-get-current-branch)))
- (upstream (magit-ref-abbrev (concat branch "@{upstream}"))))
- (magit--propertize-face
- upstream (if (equal (magit-get "branch" branch "remote") ".")
- 'magit-branch-local
- 'magit-branch-remote))))
-
-(defun magit-get-indirect-upstream-branch (branch &optional force)
- (let ((remote (magit-get "branch" branch "remote")))
- (and remote (not (equal remote "."))
- ;; The user has opted in...
- (or force
- (--some (if (magit-git-success "check-ref-format" "--branch" it)
- (equal it branch)
- (string-match-p it branch))
- magit-branch-prefer-remote-upstream))
- ;; and local BRANCH tracks a remote branch...
- (let ((upstream (magit-get-upstream-branch branch)))
- ;; whose upstream...
- (and upstream
- ;; has the same name as BRANCH...
- (equal (substring upstream (1+ (length remote))) branch)
- ;; and can be fast-forwarded to BRANCH.
- (magit-rev-ancestor-p upstream branch)
- upstream)))))
-
-(defun magit-get-upstream-remote (&optional branch allow-unnamed)
- (when-let ((branch (or branch (magit-get-current-branch)))
- (remote (magit-get "branch" branch "remote")))
- (and (not (equal remote "."))
- (cond ((member remote (magit-list-remotes))
- (magit--propertize-face remote 'magit-branch-remote))
- ((and allow-unnamed
- (string-match-p "\\(\\`.\\{0,2\\}/\\|[:@]\\)" remote))
- (magit--propertize-face remote 'bold))))))
-
-(defun magit-get-unnamed-upstream (&optional branch)
- (when-let ((branch (or branch (magit-get-current-branch)))
- (remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge")))
- (and (magit--unnamed-upstream-p remote merge)
- (list (magit--propertize-face remote 'bold)
- (magit--propertize-face merge 'magit-branch-remote)))))
-
-(defun magit--unnamed-upstream-p (remote merge)
- (and remote (string-match-p "\\(\\`\\.\\{0,2\\}/\\|[:@]\\)" remote)
- merge (string-prefix-p "refs/" merge)))
-
-(defun magit--valid-upstream-p (remote merge)
- (and (or (equal remote ".")
- (member remote (magit-list-remotes)))
- (string-prefix-p "refs/" merge)))
-
-(defun magit-get-current-remote (&optional allow-unnamed)
- (or (magit-get-upstream-remote nil allow-unnamed)
- (when-let ((remotes (magit-list-remotes))
- (remote (if (= (length remotes) 1)
- (car remotes)
- (car (member "origin" remotes)))))
- (magit--propertize-face remote 'magit-branch-remote))))
-
-(defun magit-get-push-remote (&optional branch)
- (when-let ((remote
- (or (and (or branch (setq branch (magit-get-current-branch)))
- (magit-get "branch" branch "pushRemote"))
- (magit-get "remote.pushDefault"))))
- (magit--propertize-face remote 'magit-branch-remote)))
-
-(defun magit-get-push-branch (&optional branch verify)
- (when-let ((branch (or branch (setq branch (magit-get-current-branch))))
- (remote (magit-get-push-remote branch))
- (target (concat remote "/" branch)))
- (and (or (not verify)
- (magit-rev-verify target))
- (magit--propertize-face target 'magit-branch-remote))))
-
-(defun magit-get-@{push}-branch (&optional branch)
- (let ((ref (magit-rev-parse "--symbolic-full-name"
- (concat branch "@{push}"))))
- (when (and ref (string-prefix-p "refs/remotes/" ref))
- (substring ref 13))))
-
-(defun magit-get-remote (&optional branch)
- (when (or branch (setq branch (magit-get-current-branch)))
- (let ((remote (magit-get "branch" branch "remote")))
- (unless (equal remote ".")
- remote))))
-
-(defun magit-get-some-remote (&optional branch)
- (or (magit-get-remote branch)
- (and (magit-branch-p "master")
- (magit-get-remote "master"))
- (let ((remotes (magit-list-remotes)))
- (or (car (member "origin" remotes))
- (car remotes)))))
-
-(defun magit-branch-merged-p (branch &optional target)
- "Return non-nil if BRANCH is merged into its upstream and TARGET.
-
-TARGET defaults to the current branch. If `HEAD' is detached and
-TARGET is nil, then always return nil. As a special case, if
-TARGET is t, then return non-nil if BRANCH is merged into any one
-of the other local branches.
-
-If, and only if, BRANCH has an upstream, then only return non-nil
-if BRANCH is merged into both TARGET (as described above) as well
-as into its upstream."
- (and (--if-let (and (magit-branch-p branch)
- (magit-get-upstream-branch branch))
- (magit-git-success "merge-base" "--is-ancestor" branch it)
- t)
- (if (eq target t)
- (delete (magit-name-local-branch branch)
- (magit-list-containing-branches branch))
- (--when-let (or target (magit-get-current-branch))
- (magit-git-success "merge-base" "--is-ancestor" branch it)))))
-
-(defun magit-get-tracked (refname)
- "Return the remote branch tracked by the remote-tracking branch REFNAME.
-The returned value has the form (REMOTE . REF), where REMOTE is
-the name of a remote and REF is the ref local to the remote."
- (when-let ((ref (magit-ref-fullname refname)))
- (save-match-data
- (-some (lambda (line)
- (and (string-match "\
-\\`remote\\.\\([^.]+\\)\\.fetch=\\+?\\([^:]+\\):\\(.+\\)" line)
- (let ((rmt (match-string 1 line))
- (src (match-string 2 line))
- (dst (match-string 3 line)))
- (and (string-match (format "\\`%s\\'"
- (replace-regexp-in-string
- "*" "\\(.+\\)" dst t t))
- ref)
- (cons rmt (replace-regexp-in-string
- "*" (match-string 1 ref) src))))))
- (magit-git-lines "config" "--local" "--list")))))
-
-(defun magit-split-branch-name (branch)
- (cond ((member branch (magit-list-local-branch-names))
- (cons "." branch))
- ((string-match "/" branch)
- (or (-some (lambda (remote)
- (and (string-match (format "\\`\\(%s\\)/\\(.+\\)\\'" remote)
- branch)
- (cons (match-string 1 branch)
- (match-string 2 branch))))
- (magit-list-remotes))
- (error "Invalid branch name %s" branch)))))
-
-(defun magit-get-current-tag (&optional rev with-distance)
- "Return the closest tag reachable from REV.
-
-If optional REV is nil, then default to `HEAD'.
-If optional WITH-DISTANCE is non-nil then return (TAG COMMITS),
-if it is `dirty' return (TAG COMMIT DIRTY). COMMITS is the number
-of commits in `HEAD' but not in TAG and DIRTY is t if there are
-uncommitted changes, nil otherwise."
- (--when-let (magit-git-str "describe" "--long" "--tags"
- (and (eq with-distance 'dirty) "--dirty") rev)
- (save-match-data
- (string-match
- "\\(.+\\)-\\(?:0[0-9]*\\|\\([0-9]+\\)\\)-g[0-9a-z]+\\(-dirty\\)?$" it)
- (if with-distance
- `(,(match-string 1 it)
- ,(string-to-number (or (match-string 2 it) "0"))
- ,@(and (match-string 3 it) (list t)))
- (match-string 1 it)))))
-
-(defun magit-get-next-tag (&optional rev with-distance)
- "Return the closest tag from which REV is reachable.
-
-If optional REV is nil, then default to `HEAD'.
-If no such tag can be found or if the distance is 0 (in which
-case it is the current tag, not the next), return nil instead.
-If optional WITH-DISTANCE is non-nil, then return (TAG COMMITS)
-where COMMITS is the number of commits in TAG but not in REV."
- (--when-let (magit-git-str "describe" "--contains" (or rev "HEAD"))
- (save-match-data
- (when (string-match "^[^^~]+" it)
- (setq it (match-string 0 it))
- (unless (equal it (magit-get-current-tag rev))
- (if with-distance
- (list it (car (magit-rev-diff-count it rev)))
- it))))))
-
-(defvar magit-list-refs-namespaces
- '("refs/heads" "refs/remotes" "refs/tags" "refs/pull"))
-
-(defun magit-list-refs (&optional namespaces format sortby)
- "Return list of references.
-
-When NAMESPACES is non-nil, list refs from these namespaces
-rather than those from `magit-list-refs-namespaces'.
-
-FORMAT is passed to the `--format' flag of `git for-each-ref'
-and defaults to \"%(refname)\". If the format is \"%(refname)\"
-or \"%(refname:short)\", then drop the symbolic-ref \"HEAD\".
-
-SORTBY is a key or list of keys to pass to the `--sort' flag of
-`git for-each-ref'. When nil, use `magit-list-refs-sortby'"
- (unless format
- (setq format "%(refname)"))
- (let ((refs (magit-git-lines "for-each-ref"
- (concat "--format=" format)
- (--map (concat "--sort=" it)
- (pcase (or sortby magit-list-refs-sortby)
- ((and val (pred stringp)) (list val))
- ((and val (pred listp)) val)))
- (or namespaces magit-list-refs-namespaces))))
- (if (member format '("%(refname)" "%(refname:short)"))
- (--remove (string-match-p "\\(\\`\\|/\\)HEAD\\'" it) refs)
- refs)))
-
-(defun magit-list-branches ()
- (magit-list-refs (list "refs/heads" "refs/remotes")))
-
-(defun magit-list-local-branches ()
- (magit-list-refs "refs/heads"))
-
-(defun magit-list-remote-branches (&optional remote)
- (magit-list-refs (concat "refs/remotes/" remote)))
-
-(defun magit-list-related-branches (relation &optional commit &rest args)
- (--remove (string-match-p "\\(\\`(HEAD\\|HEAD -> \\)" it)
- (--map (substring it 2)
- (magit-git-lines "branch" args relation commit))))
-
-(defun magit-list-containing-branches (&optional commit &rest args)
- (magit-list-related-branches "--contains" commit args))
-
-(defun magit-list-publishing-branches (&optional commit)
- (--filter (magit-rev-ancestor-p (or commit "HEAD") it)
- magit-published-branches))
-
-(defun magit-list-merged-branches (&optional commit &rest args)
- (magit-list-related-branches "--merged" commit args))
-
-(defun magit-list-unmerged-branches (&optional commit &rest args)
- (magit-list-related-branches "--no-merged" commit args))
-
-(defun magit-list-unmerged-to-upstream-branches ()
- (--filter (when-let ((upstream (magit-get-upstream-branch it)))
- (member it (magit-list-unmerged-branches upstream)))
- (magit-list-local-branch-names)))
-
-(defun magit-list-branches-pointing-at (commit)
- (let ((re (format "\\`%s refs/\\(heads\\|remotes\\)/\\(.*\\)\\'"
- (magit-rev-verify commit))))
- (--keep (and (string-match re it)
- (let ((name (match-string 2 it)))
- (and (not (string-suffix-p "HEAD" name))
- name)))
- (magit-git-lines "show-ref"))))
-
-(defun magit-list-refnames (&optional namespaces include-special)
- (nconc (magit-list-refs namespaces "%(refname:short)")
- (and include-special
- (magit-list-special-refnames))))
-
-(defvar magit-special-refnames
- '("HEAD" "ORIG_HEAD" "FETCH_HEAD" "MERGE_HEAD" "CHERRY_PICK_HEAD"))
-
-(defun magit-list-special-refnames ()
- (let ((gitdir (magit-gitdir)))
- (cl-mapcan (lambda (name)
- (and (file-exists-p (expand-file-name name gitdir))
- (list name)))
- magit-special-refnames)))
-
-(defun magit-list-branch-names ()
- (magit-list-refnames (list "refs/heads" "refs/remotes")))
-
-(defun magit-list-local-branch-names ()
- (magit-list-refnames "refs/heads"))
-
-(defun magit-list-remote-branch-names (&optional remote relative)
- (if (and remote relative)
- (let ((regexp (format "^refs/remotes/%s/\\(.+\\)" remote)))
- (--mapcat (when (string-match regexp it)
- (list (match-string 1 it)))
- (magit-list-remote-branches remote)))
- (magit-list-refnames (concat "refs/remotes/" remote))))
-
-(defun magit-format-refs (format &rest args)
- (let ((lines (magit-git-lines
- "for-each-ref" (concat "--format=" format)
- (or args (list "refs/heads" "refs/remotes" "refs/tags")))))
- (if (string-match-p "\f" format)
- (--map (split-string it "\f") lines)
- lines)))
-
-(defun magit-list-remotes ()
- (magit-git-lines "remote"))
-
-(defun magit-list-tags ()
- (magit-git-lines "tag"))
-
-(defun magit-list-stashes (&optional format)
- (magit-git-lines "stash" "list" (concat "--format=" (or format "%gd"))))
-
-(defun magit-list-active-notes-refs ()
- "Return notes refs according to `core.notesRef' and `notes.displayRef'."
- (magit-git-lines "for-each-ref" "--format=%(refname)"
- (or (magit-get "core.notesRef") "refs/notes/commits")
- (magit-get-all "notes.displayRef")))
-
-(defun magit-list-notes-refnames ()
- (--map (substring it 6) (magit-list-refnames "refs/notes")))
-
-(defun magit-remote-list-tags (remote)
- (--keep (and (not (string-match-p "\\^{}$" it))
- (substring it 51))
- (magit-git-lines "ls-remote" "--tags" remote)))
-
-(defun magit-remote-list-branches (remote)
- (--keep (and (not (string-match-p "\\^{}$" it))
- (substring it 52))
- (magit-git-lines "ls-remote" "--heads" remote)))
-
-(defun magit-remote-list-refs (remote)
- (--keep (and (not (string-match-p "\\^{}$" it))
- (substring it 41))
- (magit-git-lines "ls-remote" remote)))
-
-(defun magit-list-module-paths ()
- (--mapcat (and (string-match "^160000 [0-9a-z]\\{40\\} 0\t\\(.+\\)$" it)
- (list (match-string 1 it)))
- (magit-git-items "ls-files" "-z" "--stage")))
-
-(defun magit-get-submodule-name (path)
- "Return the name of the submodule at PATH.
-PATH has to be relative to the super-repository."
- (cadr (split-string
- (car (or (magit-git-items
- "config" "-z"
- "-f" (expand-file-name ".gitmodules" (magit-toplevel))
- "--get-regexp" "^submodule\\..*\\.path$"
- (concat "^" (regexp-quote (directory-file-name path)) "$"))
- (error "No such submodule `%s'" path)))
- "\n")))
-
-(defun magit-list-worktrees ()
- (let (worktrees worktree)
- (dolist (line (let ((magit-git-global-arguments
- ;; KLUDGE At least in v2.8.3 this triggers a segfault.
- (remove "--no-pager" magit-git-global-arguments)))
- (magit-git-lines "worktree" "list" "--porcelain")))
- (cond ((string-prefix-p "worktree" line)
- (push (setq worktree (list (substring line 9) nil nil nil))
- worktrees))
- ((string-equal line "bare")
- (let* ((default-directory (car worktree))
- (wt (and (not (magit-get-boolean "core.bare"))
- (magit-get "core.worktree"))))
- (if (and wt (file-exists-p (expand-file-name wt)))
- (progn (setf (nth 0 worktree) (expand-file-name wt))
- (setf (nth 2 worktree) (magit-rev-parse "HEAD"))
- (setf (nth 3 worktree) (magit-get-current-branch)))
- (setf (nth 1 worktree) t))))
- ((string-prefix-p "HEAD" line)
- (setf (nth 2 worktree) (substring line 5)))
- ((string-prefix-p "branch" line)
- (setf (nth 3 worktree) (substring line 18)))
- ((string-equal line "detached"))))
- (nreverse worktrees)))
-
-(defun magit-symbolic-ref-p (name)
- (magit-git-success "symbolic-ref" "--quiet" name))
-
-(defun magit-ref-p (rev)
- (or (car (member rev (magit-list-refs "refs/")))
- (car (member rev (magit-list-refnames "refs/")))))
-
-(defun magit-branch-p (rev)
- (or (car (member rev (magit-list-branches)))
- (car (member rev (magit-list-branch-names)))))
-
-(defun magit-local-branch-p (rev)
- (or (car (member rev (magit-list-local-branches)))
- (car (member rev (magit-list-local-branch-names)))))
-
-(defun magit-remote-branch-p (rev)
- (or (car (member rev (magit-list-remote-branches)))
- (car (member rev (magit-list-remote-branch-names)))))
-
-(defun magit-branch-set-face (branch)
- (magit--propertize-face branch (if (magit-local-branch-p branch)
- 'magit-branch-local
- 'magit-branch-remote)))
-
-(defun magit-tag-p (rev)
- (car (member rev (magit-list-tags))))
-
-(defun magit-remote-p (string)
- (car (member string (magit-list-remotes))))
-
-(defun magit-rev-diff-count (a b)
- "Return the commits in A but not B and vice versa.
-Return a list of two integers: (A>B B>A)."
- (mapcar 'string-to-number
- (split-string (magit-git-string "rev-list"
- "--count" "--left-right"
- (concat a "..." b))
- "\t")))
-
-(defun magit-abbrev-length ()
- (let ((abbrev (magit-get "core.abbrev")))
- (if (and abbrev (not (equal abbrev "auto")))
- (string-to-number abbrev)
- ;; Guess the length git will be using based on an example
- ;; abbreviation. Actually HEAD's abbreviation might be an
- ;; outlier, so use the shorter of the abbreviations for two
- ;; commits. See #3034.
- (if-let ((head (magit-rev-parse "--short" "HEAD"))
- (head-len (length head)))
- (min head-len
- (--if-let (magit-rev-parse "--short" "HEAD~")
- (length it)
- head-len))
- ;; We're on an unborn branch, but perhaps the repository has
- ;; other commits. See #4123.
- (if-let ((commits (magit-git-lines "rev-list" "-n2" "--all"
- "--abbrev-commit")))
- (apply #'min (mapcar #'length commits))
- ;; A commit does not exist. Fall back to the default of 7.
- 7)))))
-
-(defun magit-abbrev-arg (&optional arg)
- (format "--%s=%d" (or arg "abbrev") (magit-abbrev-length)))
-
-(defun magit-rev-abbrev (rev)
- (magit-rev-parse (magit-abbrev-arg "short") rev))
-
-(defun magit-commit-children (commit &optional args)
- (mapcar #'car
- (--filter (member commit (cdr it))
- (--map (split-string it " ")
- (magit-git-lines
- "log" "--format=%H %P"
- (or args (list "--branches" "--tags" "--remotes"))
- "--not" commit)))))
-
-(defun magit-commit-parents (commit)
- (--when-let (magit-git-string "rev-list" "-1" "--parents" commit)
- (cdr (split-string it))))
-
-(defun magit-patch-id (rev)
- (magit--with-temp-process-buffer
- (magit-process-file
- shell-file-name nil '(t nil) nil shell-command-switch
- (let ((exec (shell-quote-argument magit-git-executable)))
- (format "%s diff-tree -u %s | %s patch-id" exec rev exec)))
- (car (split-string (buffer-string)))))
-
-(defun magit-rev-format (format &optional rev args)
- (let ((str (magit-git-string "show" "--no-patch"
- (concat "--format=" format) args
- (if rev (concat rev "^{commit}") "HEAD") "--")))
- (unless (string-equal str "")
- str)))
-
-(defun magit-rev-insert-format (format &optional rev args)
- (magit-git-insert "show" "--no-patch"
- (concat "--format=" format) args
- (if rev (concat rev "^{commit}") "HEAD") "--"))
-
-(defun magit-format-rev-summary (rev)
- (--when-let (magit-rev-format "%h %s" rev)
- (string-match " " it)
- (magit--put-face 0 (match-beginning 0) 'magit-hash it)
- it))
-
-(defvar magit-ref-namespaces
- '(("\\`HEAD\\'" . magit-head)
- ("\\`refs/tags/\\(.+\\)" . magit-tag)
- ("\\`refs/heads/\\(.+\\)" . magit-branch-local)
- ("\\`refs/remotes/\\(.+\\)" . magit-branch-remote)
- ("\\`refs/bisect/\\(bad\\)" . magit-bisect-bad)
- ("\\`refs/bisect/\\(skip.*\\)" . magit-bisect-skip)
- ("\\`refs/bisect/\\(good.*\\)" . magit-bisect-good)
- ("\\`refs/stash$" . magit-refname-stash)
- ("\\`refs/wip/\\(.+\\)" . magit-refname-wip)
- ("\\`refs/pullreqs/\\(.+\\)" . magit-refname-pullreq)
- ("\\`\\(bad\\):" . magit-bisect-bad)
- ("\\`\\(skip\\):" . magit-bisect-skip)
- ("\\`\\(good\\):" . magit-bisect-good)
- ("\\`\\(.+\\)" . magit-refname))
- "How refs are formatted for display.
-
-Each entry controls how a certain type of ref is displayed, and
-has the form (REGEXP . FACE). REGEXP is a regular expression
-used to match full refs. The first entry whose REGEXP matches
-the reference is used.
-
-In log and revision buffers the first regexp submatch becomes the
-\"label\" that represents the ref and is propertized with FONT.
-In refs buffers the displayed text is controlled by other means
-and this option only controls what face is used.")
-
-(defun magit-format-ref-labels (string)
- (save-match-data
- (let ((regexp "\\(, \\|tag: \\|HEAD -> \\)")
- names)
- (if (and (derived-mode-p 'magit-log-mode)
- (member "--simplify-by-decoration" magit-buffer-log-args))
- (let ((branches (magit-list-local-branch-names))
- (re (format "^%s/.+" (regexp-opt (magit-list-remotes)))))
- (setq names
- (--map (cond ((string-equal it "HEAD") it)
- ((string-prefix-p "refs/" it) it)
- ((member it branches) (concat "refs/heads/" it))
- ((string-match re it) (concat "refs/remotes/" it))
- (t (concat "refs/" it)))
- (split-string
- (replace-regexp-in-string "tag: " "refs/tags/" string)
- regexp t))))
- (setq names (split-string string regexp t)))
- (let (state head upstream tags branches remotes other combined)
- (dolist (ref names)
- (let* ((face (cdr (--first (string-match (car it) ref)
- magit-ref-namespaces)))
- (name (magit--propertize-face
- (or (match-string 1 ref) ref) face)))
- (cl-case face
- ((magit-bisect-bad magit-bisect-skip magit-bisect-good)
- (setq state name))
- (magit-head
- (setq head (magit--propertize-face "@" 'magit-head)))
- (magit-tag (push name tags))
- (magit-branch-local (push name branches))
- (magit-branch-remote (push name remotes))
- (t (push name other)))))
- (setq remotes
- (-keep
- (lambda (name)
- (if (string-match "\\`\\([^/]*\\)/\\(.*\\)\\'" name)
- (let ((r (match-string 1 name))
- (b (match-string 2 name)))
- (and (not (equal b "HEAD"))
- (if (equal (concat "refs/remotes/" name)
- (magit-git-string
- "symbolic-ref"
- (format "refs/remotes/%s/HEAD" r)))
- (magit--propertize-face
- name 'magit-branch-remote-head)
- name)))
- name))
- remotes))
- (let* ((current (magit-get-current-branch))
- (target (magit-get-upstream-branch current)))
- (dolist (name branches)
- (let ((push (car (member (magit-get-push-branch name) remotes))))
- (when push
- (setq remotes (delete push remotes))
- (string-match "^[^/]*/" push)
- (setq push (substring push 0 (match-end 0))))
- (cond
- ((equal name current)
- (setq head
- (concat push
- (magit--propertize-face
- name 'magit-branch-current))))
- ((equal name target)
- (setq upstream
- (concat push
- (magit--propertize-face
- name '(magit-branch-upstream
- magit-branch-local)))))
- (t
- (push (concat push name) combined)))))
- (when (and target (not upstream))
- (if (member target remotes)
- (progn
- (magit--add-face-text-property
- 0 (length target) 'magit-branch-upstream nil target)
- (setq upstream target)
- (setq remotes (delete target remotes)))
- (when-let ((target (car (member target combined))))
- (magit--add-face-text-property
- 0 (length target) 'magit-branch-upstream nil target)
- (setq upstream target)
- (setq combined (delete target combined))))))
- (mapconcat #'identity
- (-flatten `(,state
- ,head
- ,upstream
- ,@(nreverse tags)
- ,@(nreverse combined)
- ,@(nreverse remotes)
- ,@other))
- " ")))))
-
-(defun magit-object-type (object)
- (magit-git-string "cat-file" "-t" object))
-
-(defmacro magit-with-blob (commit file &rest body)
- (declare (indent 2)
- (debug (form form body)))
- `(magit--with-temp-process-buffer
- (let ((buffer-file-name ,file))
- (save-excursion
- (magit-git-insert "cat-file" "-p"
- (concat ,commit ":" buffer-file-name)))
- (decode-coding-inserted-region
- (point-min) (point-max) buffer-file-name t nil nil t)
- ,@body)))
-
-(defmacro magit-with-temp-index (tree arg &rest body)
- (declare (indent 2) (debug (form form body)))
- (let ((file (cl-gensym "file")))
- `(let ((magit--refresh-cache nil)
- (,file (magit-convert-filename-for-git
- (make-temp-name (magit-git-dir "index.magit.")))))
- (unwind-protect
- (magit-with-toplevel
- (--when-let ,tree
- (or (magit-git-success "read-tree" ,arg it
- (concat "--index-output=" ,file))
- (error "Cannot read tree %s" it)))
- (if (file-remote-p default-directory)
- (let ((magit-tramp-process-environment
- (cons (concat "GIT_INDEX_FILE=" ,file)
- magit-tramp-process-environment)))
- ,@body)
- (let ((process-environment
- (cons (concat "GIT_INDEX_FILE=" ,file)
- process-environment)))
- ,@body)))
- (ignore-errors
- (delete-file (concat (file-remote-p default-directory) ,file)))))))
-
-(defun magit-commit-tree (message &optional tree &rest parents)
- (magit-git-string "commit-tree" "--no-gpg-sign" "-m" message
- (--mapcat (list "-p" it) (delq nil parents))
- (or tree
- (magit-git-string "write-tree")
- (error "Cannot write tree"))))
-
-(defun magit-commit-worktree (message &optional arg &rest other-parents)
- (magit-with-temp-index "HEAD" arg
- (and (magit-update-files (magit-unstaged-files))
- (apply #'magit-commit-tree message nil "HEAD" other-parents))))
-
-(defun magit-update-files (files)
- (magit-git-success "update-index" "--add" "--remove" "--" files))
-
-(defun magit-update-ref (ref message rev &optional stashish)
- (let ((magit--refresh-cache nil))
- (or (if (not (version< (magit-git-version) "2.6.0"))
- (zerop (magit-call-git "update-ref" "--create-reflog"
- "-m" message ref rev
- (or (magit-rev-verify ref) "")))
- ;; `--create-reflog' didn't exist before v2.6.0
- (let ((oldrev (magit-rev-verify ref))
- (logfile (magit-git-dir (concat "logs/" ref))))
- (unless (file-exists-p logfile)
- (when oldrev
- (magit-git-success "update-ref" "-d" ref oldrev))
- (make-directory (file-name-directory logfile) t)
- (with-temp-file logfile)
- (when (and oldrev (not stashish))
- (magit-git-success "update-ref" "-m" "enable reflog"
- ref oldrev ""))))
- (magit-git-success "update-ref" "-m" message ref rev
- (or (magit-rev-verify ref) "")))
- (error "Cannot update %s with %s" ref rev))))
-
-(defconst magit-range-re
- (concat "\\`\\([^ \t]*[^.]\\)?" ; revA
- "\\(\\.\\.\\.?\\)" ; range marker
- "\\([^.][^ \t]*\\)?\\'")) ; revB
-
-(defun magit-split-range (range)
- (and (string-match magit-range-re range)
- (let ((beg (or (match-string 1 range) "HEAD"))
- (end (or (match-string 3 range) "HEAD")))
- (cons (if (string-equal (match-string 2 range) "...")
- (magit-git-string "merge-base" beg end)
- beg)
- end))))
-
-(defun magit-hash-range (range)
- (if (string-match magit-range-re range)
- (concat (magit-rev-hash (match-string 1 range))
- (match-string 2 range)
- (magit-rev-hash (match-string 3 range)))
- (magit-rev-hash range)))
-
-(put 'git-revision 'thing-at-point 'magit-thingatpt--git-revision)
-(defun magit-thingatpt--git-revision ()
- (--when-let
- (let ((c "\s\n\t~^:?*[\\"))
- (cl-letf (((get 'git-revision 'beginning-op)
- (lambda ()
- (if (re-search-backward (format "[%s]" c) nil t)
- (forward-char)
- (goto-char (point-min)))))
- ((get 'git-revision 'end-op)
- (lambda ()
- (re-search-forward (format "\\=[^%s]*" c) nil t))))
- (bounds-of-thing-at-point 'git-revision)))
- (let ((text (buffer-substring-no-properties (car it) (cdr it))))
- (and (magit-commit-p text) text))))
-
-;;; Completion
-
-(defvar magit-revision-history nil)
-
-(defun magit-read-branch (prompt &optional secondary-default)
- (magit-completing-read prompt (magit-list-branch-names)
- nil t nil 'magit-revision-history
- (or (magit-branch-at-point)
- secondary-default
- (magit-get-current-branch))))
-
-(defun magit-read-branch-or-commit (prompt &optional secondary-default)
- (or (magit-completing-read prompt (magit-list-refnames nil t)
- nil nil nil 'magit-revision-history
- (or (magit-branch-or-commit-at-point)
- secondary-default
- (magit-get-current-branch)))
- (user-error "Nothing selected")))
-
-(defun magit-read-range-or-commit (prompt &optional secondary-default)
- (magit-read-range
- prompt
- (or (--when-let (magit-region-values '(commit branch) t)
- (deactivate-mark)
- (concat (car (last it)) ".." (car it)))
- (magit-branch-or-commit-at-point)
- secondary-default
- (magit-get-current-branch))))
-
-(defun magit-read-range (prompt &optional default)
- (magit-completing-read-multiple prompt
- (magit-list-refnames)
- "\\.\\.\\.?"
- default 'magit-revision-history))
-
-(defun magit-read-remote-branch
- (prompt &optional remote default local-branch require-match)
- (let ((choice (magit-completing-read
- prompt
- (-union (and local-branch
- (if remote
- (concat remote "/" local-branch)
- (--map (concat it "/" local-branch)
- (magit-list-remotes))))
- (magit-list-remote-branch-names remote t))
- nil require-match nil 'magit-revision-history default)))
- (if (or remote (string-match "\\`\\([^/]+\\)/\\(.+\\)" choice))
- choice
- (user-error "`%s' doesn't have the form REMOTE/BRANCH" choice))))
-
-(defun magit-read-refspec (prompt remote)
- (magit-completing-read prompt
- (prog2 (message "Determining available refs...")
- (magit-remote-list-refs remote)
- (message "Determining available refs...done"))))
-
-(defun magit-read-local-branch (prompt &optional secondary-default)
- (magit-completing-read prompt (magit-list-local-branch-names)
- nil t nil 'magit-revision-history
- (or (magit-local-branch-at-point)
- secondary-default
- (magit-get-current-branch))))
-
-(defun magit-read-local-branch-or-commit (prompt)
- (let ((choices (nconc (magit-list-local-branch-names)
- (magit-list-special-refnames)))
- (commit (magit-commit-at-point)))
- (when commit
- (push commit choices))
- (or (magit-completing-read prompt choices
- nil nil nil 'magit-revision-history
- (or (magit-local-branch-at-point) commit))
- (user-error "Nothing selected"))))
-
-(defun magit-read-local-branch-or-ref (prompt &optional secondary-default)
- (magit-completing-read prompt (nconc (magit-list-local-branch-names)
- (magit-list-refs "refs/"))
- nil t nil 'magit-revision-history
- (or (magit-local-branch-at-point)
- secondary-default
- (magit-get-current-branch))))
-
-(defun magit-read-other-branch
- (prompt &optional exclude secondary-default no-require-match)
- (let* ((current (magit-get-current-branch))
- (atpoint (magit-branch-at-point))
- (exclude (or exclude current))
- (default (or (and (not (equal atpoint exclude)) atpoint)
- (and (not (equal current exclude)) current)
- secondary-default
- (magit-get-previous-branch))))
- (magit-completing-read prompt (delete exclude (magit-list-branch-names))
- nil (not no-require-match)
- nil 'magit-revision-history default)))
-
-(defun magit-read-other-branch-or-commit
- (prompt &optional exclude secondary-default)
- (let* ((current (magit-get-current-branch))
- (atpoint (magit-branch-or-commit-at-point))
- (exclude (or exclude current))
- (default (or (and (not (equal atpoint exclude))
- (not (and (not current)
- (magit-rev-equal atpoint "HEAD")))
- atpoint)
- (and (not (equal current exclude)) current)
- secondary-default
- (magit-get-previous-branch))))
- (or (magit-completing-read prompt (delete exclude (magit-list-refnames))
- nil nil nil 'magit-revision-history default)
- (user-error "Nothing selected"))))
-
-(defun magit-read-other-local-branch
- (prompt &optional exclude secondary-default no-require-match)
- (let* ((current (magit-get-current-branch))
- (atpoint (magit-local-branch-at-point))
- (exclude (or exclude current))
- (default (or (and (not (equal atpoint exclude)) atpoint)
- (and (not (equal current exclude)) current)
- secondary-default
- (magit-get-previous-branch))))
- (magit-completing-read prompt
- (delete exclude (magit-list-local-branch-names))
- nil (not no-require-match)
- nil 'magit-revision-history default)))
-
-(defun magit-read-branch-prefer-other (prompt)
- (let* ((current (magit-get-current-branch))
- (commit (magit-commit-at-point))
- (atrev (and commit (magit-list-branches-pointing-at commit)))
- (atpoint (magit--painted-branch-at-point)))
- (magit-completing-read prompt (magit-list-branch-names)
- nil t nil 'magit-revision-history
- (or (magit-section-value-if 'branch)
- atpoint
- (and (not (cdr atrev)) (car atrev))
- (--first (not (equal it current)) atrev)
- (magit-get-previous-branch)
- (car atrev)))))
-
-(defun magit-read-upstream-branch (&optional branch prompt)
- "Read the upstream for BRANCH using PROMPT.
-If optional BRANCH is nil, then read the upstream for the
-current branch, or raise an error if no branch is checked
-out. Only existing branches can be selected."
- (unless branch
- (setq branch (or (magit-get-current-branch)
- (error "Need a branch to set its upstream"))))
- (let ((branches (delete branch (magit-list-branch-names))))
- (magit-completing-read
- (or prompt (format "Change upstream of %s to" branch))
- branches nil t nil 'magit-revision-history
- (or (let ((r (car (member (magit-remote-branch-at-point) branches)))
- (l (car (member (magit-local-branch-at-point) branches))))
- (if magit-prefer-remote-upstream (or r l) (or l r)))
- (let ((r (car (member "origin/master" branches)))
- (l (car (member "master" branches))))
- (if magit-prefer-remote-upstream (or r l) (or l r)))
- (car (member (magit-get-previous-branch) branches))))))
-
-(defun magit-read-starting-point (prompt &optional branch default)
- (or (magit-completing-read
- (concat prompt
- (and branch
- (if (bound-and-true-p ivy-mode)
- ;; Ivy-mode strips faces from prompt.
- (format " `%s'" branch)
- (concat " " (magit--propertize-face
- branch 'magit-branch-local))))
- " starting at")
- (nconc (list "HEAD")
- (magit-list-refnames)
- (directory-files (magit-git-dir) nil "_HEAD\\'"))
- nil nil nil 'magit-revision-history
- (or default (magit--default-starting-point)))
- (user-error "Nothing selected")))
-
-(defun magit--default-starting-point ()
- (or (let ((r (magit-remote-branch-at-point))
- (l (magit-local-branch-at-point)))
- (if magit-prefer-remote-upstream (or r l) (or l r)))
- (magit-commit-at-point)
- (magit-stash-at-point)
- (magit-get-current-branch)))
-
-(defun magit-read-tag (prompt &optional require-match)
- (magit-completing-read prompt (magit-list-tags) nil
- require-match nil 'magit-revision-history
- (magit-tag-at-point)))
-
-(defun magit-read-stash (prompt)
- (let ((stashes (magit-list-stashes)))
- (magit-completing-read prompt stashes nil t nil nil
- (magit-stash-at-point)
- (car stashes))))
-
-(defun magit-read-remote (prompt &optional default use-only)
- (let ((remotes (magit-list-remotes)))
- (if (and use-only (= (length remotes) 1))
- (car remotes)
- (magit-completing-read prompt remotes
- nil t nil nil
- (or default
- (magit-remote-at-point)
- (magit-get-remote))))))
-
-(defun magit-read-remote-or-url (prompt &optional default)
- (magit-completing-read prompt
- (nconc (magit-list-remotes)
- (list "https://" "git://" "git@"))
- nil nil nil nil
- (or default
- (magit-remote-at-point)
- (magit-get-remote))))
-
-(defun magit-read-module-path (prompt &optional predicate)
- (magit-completing-read prompt (magit-list-module-paths)
- predicate t nil nil
- (magit-module-at-point predicate)))
-
-(defun magit-module-confirm (verb &optional predicate)
- (let (modules)
- (if current-prefix-arg
- (progn
- (setq modules (magit-list-module-paths))
- (when predicate
- (setq modules (-filter predicate modules)))
- (unless modules
- (if predicate
- (user-error "No modules satisfying %s available" predicate)
- (user-error "No modules available"))))
- (setq modules (magit-region-values 'magit-module-section))
- (when modules
- (when predicate
- (setq modules (-filter predicate modules)))
- (unless modules
- (user-error "No modules satisfying %s selected" predicate))))
- (if (> (length modules) 1)
- (magit-confirm t nil (format "%s %%i modules" verb) nil modules)
- (list (magit-read-module-path (format "%s module" verb) predicate)))))
-
-;;; _
-(provide 'magit-git)
-;;; magit-git.el ends here
diff --git a/elpa/magit-20200728.45/magit-gitignore.el b/elpa/magit-20200728.45/magit-gitignore.el
deleted file mode 100644
index 6004413..0000000
--- a/elpa/magit-20200728.45/magit-gitignore.el
+++ /dev/null
@@ -1,197 +0,0 @@
-;;; magit-gitignore.el --- intentionally untracked files -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements gitignore commands.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Transient
-
-;;;###autoload (autoload 'magit-gitignore "magit-gitignore" nil t)
-(transient-define-prefix magit-gitignore ()
- "Instruct Git to ignore a file or pattern."
- :man-page "gitignore"
- ["Gitignore"
- ("t" "shared at toplevel (.gitignore)"
- magit-gitignore-in-topdir)
- ("s" "shared in subdirectory (path/to/.gitignore)"
- magit-gitignore-in-subdir)
- ("p" "privately (.git/info/exclude)"
- magit-gitignore-in-gitdir)
- ("g" magit-gitignore-on-system
- :if (lambda () (magit-get "core.excludesfile"))
- :description (lambda ()
- (format "privately for all repositories (%s)"
- (magit-get "core.excludesfile"))))]
- ["Skip worktree"
- (7 "w" "do skip worktree" magit-skip-worktree)
- (7 "W" "do not skip worktree" magit-no-skip-worktree)]
- ["Assume unchanged"
- (7 "u" "do assume unchanged" magit-assume-unchanged)
- (7 "U" "do not assume unchanged" magit-no-assume-unchanged)])
-
-;;; Gitignore Commands
-
-;;;###autoload
-(defun magit-gitignore-in-topdir (rule)
- "Add the Git ignore RULE to the top-level \".gitignore\" file.
-Since this file is tracked, it is shared with other clones of the
-repository. Also stage the file."
- (interactive (list (magit-gitignore-read-pattern)))
- (magit-with-toplevel
- (magit--gitignore rule ".gitignore")
- (magit-run-git "add" ".gitignore")))
-
-;;;###autoload
-(defun magit-gitignore-in-subdir (rule directory)
- "Add the Git ignore RULE to a \".gitignore\" file.
-Prompted the user for a directory and add the rule to the
-\".gitignore\" file in that directory. Since such files are
-tracked, they are shared with other clones of the repository.
-Also stage the file."
- (interactive (list (magit-gitignore-read-pattern)
- (read-directory-name "Limit rule to files in: ")))
- (magit-with-toplevel
- (let ((file (expand-file-name ".gitignore" directory)))
- (magit--gitignore rule file)
- (magit-run-git "add" file))))
-
-;;;###autoload
-(defun magit-gitignore-in-gitdir (rule)
- "Add the Git ignore RULE to \"$GIT_DIR/info/exclude\".
-Rules in that file only affects this clone of the repository."
- (interactive (list (magit-gitignore-read-pattern)))
- (magit--gitignore rule (magit-git-dir "info/exclude"))
- (magit-refresh))
-
-;;;###autoload
-(defun magit-gitignore-on-system (rule)
- "Add the Git ignore RULE to the file specified by `core.excludesFile'.
-Rules that are defined in that file affect all local repositories."
- (interactive (list (magit-gitignore-read-pattern)))
- (magit--gitignore rule
- (or (magit-get "core.excludesFile")
- (error "Variable `core.excludesFile' isn't set")))
- (magit-refresh))
-
-(defun magit--gitignore (rule file)
- (when-let ((directory (file-name-directory file)))
- (make-directory directory t))
- (with-temp-buffer
- (when (file-exists-p file)
- (insert-file-contents file))
- (goto-char (point-max))
- (unless (bolp)
- (insert "\n"))
- (insert (replace-regexp-in-string "\\(\\\\*\\)" "\\1\\1" rule))
- (insert "\n")
- (write-region nil nil file)))
-
-(defun magit-gitignore-read-pattern ()
- (let* ((default (magit-current-file))
- (base (car magit-buffer-diff-files))
- (base (and base (file-directory-p base) base))
- (choices
- (delete-dups
- (--mapcat
- (cons (concat "/" it)
- (when-let ((ext (file-name-extension it)))
- (list (concat "/" (file-name-directory it) "*." ext)
- (concat "*." ext))))
- (sort (nconc
- (magit-untracked-files nil base)
- ;; The untracked section of the status buffer lists
- ;; directories containing only untracked files.
- ;; Add those as candidates.
- (-filter #'directory-name-p
- (magit-list-files
- "--other" "--exclude-standard" "--directory"
- "--no-empty-directory" "--" base)))
- #'string-lessp)))))
- (when default
- (setq default (concat "/" default))
- (unless (member default choices)
- (setq default (concat "*." (file-name-extension default)))
- (unless (member default choices)
- (setq default nil))))
- (magit-completing-read "File or pattern to ignore"
- choices nil nil nil nil default)))
-
-;;; Skip Worktree Commands
-
-;;;###autoload
-(defun magit-skip-worktree (file)
- "Call \"git update-index --skip-worktree -- FILE\"."
- (interactive
- (list (magit-read-file-choice "Skip worktree for"
- (magit-with-toplevel
- (cl-set-difference
- (magit-list-files)
- (magit-skip-worktree-files))))))
- (magit-with-toplevel
- (magit-run-git "update-index" "--skip-worktree" "--" file)))
-
-;;;###autoload
-(defun magit-no-skip-worktree (file)
- "Call \"git update-index --no-skip-worktree -- FILE\"."
- (interactive
- (list (magit-read-file-choice "Do not skip worktree for"
- (magit-with-toplevel
- (magit-skip-worktree-files)))))
- (magit-with-toplevel
- (magit-run-git "update-index" "--no-skip-worktree" "--" file)))
-
-;;; Assume Unchanged Commands
-
-;;;###autoload
-(defun magit-assume-unchanged (file)
- "Call \"git update-index --assume-unchanged -- FILE\"."
- (interactive
- (list (magit-read-file-choice "Assume file to be unchanged"
- (magit-with-toplevel
- (cl-set-difference
- (magit-list-files)
- (magit-assume-unchanged-files))))))
- (magit-with-toplevel
- (magit-run-git "update-index" "--assume-unchanged" "--" file)))
-
-;;;###autoload
-(defun magit-no-assume-unchanged (file)
- "Call \"git update-index --no-assume-unchanged -- FILE\"."
- (interactive
- (list (magit-read-file-choice "Do not assume file to be unchanged"
- (magit-with-toplevel
- (magit-assume-unchanged-files)))))
- (magit-with-toplevel
- (magit-run-git "update-index" "--no-assume-unchanged" "--" file)))
-
-;;; _
-(provide 'magit-gitignore)
-;;; magit-gitignore.el ends here
diff --git a/elpa/magit-20200728.45/magit-imenu.el b/elpa/magit-20200728.45/magit-imenu.el
deleted file mode 100644
index bba7eed..0000000
--- a/elpa/magit-20200728.45/magit-imenu.el
+++ /dev/null
@@ -1,245 +0,0 @@
-;;; magit-imenu.el --- Integrate Imenu in magit major modes -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Damien Cassou <damien@cassou.me>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Emacs' major modes can facilitate navigation in their buffers by
-;; supporting Imenu. In such major modes, launching Imenu (M-x imenu)
-;; makes Emacs display a list of items (e.g., function definitions in
-;; a programming major mode). Selecting an item from this list moves
-;; point to this item.
-
-;; magit-imenu.el adds Imenu support to every major mode in Magit.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-(require 'git-rebase)
-
-;;; Core
-
-(defun magit-imenu--index-function (entry-types menu-types)
- "Return an alist of imenu entries in current buffer.
-
-ENTRY-TYPES is a list of section types to be selected through
-`imenu'.
-
-MENU-TYPES is a list of section types containing elements of
-ENTRY-TYPES. Elements of MENU-TYPES are are used to categories
-elements of ENTRY-TYPES.
-
-This function is used as a helper for functions set as
-`imenu-create-index-function'."
- (let ((entries (make-hash-table :test 'equal)))
- (goto-char (point-max))
- (while (magit-section--backward-find
- (lambda ()
- (let* ((section (magit-current-section))
- (type (oref section type))
- (parent (oref section parent))
- (parent-type (oref parent type)))
- (and (-contains-p entry-types type)
- (-contains-p menu-types parent-type)))))
- (let* ((section (magit-current-section))
- (name (buffer-substring-no-properties
- (line-beginning-position)
- (line-end-position)))
- (parent (oref section parent))
- (parent-title (buffer-substring-no-properties
- (oref parent start)
- (1- (oref parent content)))))
- (puthash parent-title
- (cons (cons name (point))
- (gethash parent-title entries (list)))
- entries)))
- (mapcar (lambda (menu-title)
- (cons menu-title (gethash menu-title entries)))
- (hash-table-keys entries))))
-
-;;; Log mode
-
-;;;###autoload
-(defun magit-imenu--log-prev-index-position-function ()
- "Move point to previous line in current buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'."
- (magit-section--backward-find
- (lambda ()
- (-contains-p '(commit stash)
- (oref (magit-current-section) type)))))
-
-;;;###autoload
-(defun magit-imenu--log-extract-index-name-function ()
- "Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line."
- (save-match-data
- (looking-at "\\([^ ]+\\)[ *|]+\\(.+\\)$")
- (format "%s: %s"
- (match-string-no-properties 1)
- (match-string-no-properties 2))))
-
-;;; Diff mode
-
-;;;###autoload
-(defun magit-imenu--diff-prev-index-position-function ()
- "Move point to previous file line in current buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'."
- (magit-section--backward-find
- (lambda ()
- (let ((section (magit-current-section)))
- (and (magit-file-section-p section)
- (not (equal (oref (oref section parent) type)
- 'diffstat)))))))
-
-;;;###autoload
-(defun magit-imenu--diff-extract-index-name-function ()
- "Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line."
- (buffer-substring-no-properties (line-beginning-position)
- (line-end-position)))
-
-;;; Status mode
-
-;;;###autoload
-(defun magit-imenu--status-create-index-function ()
- "Return an alist of all imenu entries in current buffer.
-This function is used as a value for
-`imenu-create-index-function'."
- (magit-imenu--index-function
- '(file commit stash)
- '(unpushed unstaged unpulled untracked staged stashes)))
-
-;;;; Refs mode
-
-;;;###autoload
-(defun magit-imenu--refs-create-index-function ()
- "Return an alist of all imenu entries in current buffer.
-This function is used as a value for
-`imenu-create-index-function'."
- (magit-imenu--index-function
- '(branch commit tag)
- '(local remote tags)))
-
-;;;; Cherry mode
-
-;;;###autoload
-(defun magit-imenu--cherry-create-index-function ()
- "Return an alist of all imenu entries in current buffer.
-This function is used as a value for
-`imenu-create-index-function'."
- (magit-imenu--index-function
- '(commit)
- '(cherries)))
-
-;;;; Submodule list mode
-
-;;;###autoload
-(defun magit-imenu--submodule-prev-index-position-function ()
- "Move point to previous line in magit-submodule-list buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'."
- (unless (bobp)
- (forward-line -1)))
-
-;;;###autoload
-(defun magit-imenu--submodule-extract-index-name-function ()
- "Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line."
- (elt (tabulated-list-get-entry) 0))
-
-;;;; Repolist mode
-
-;;;###autoload
-(defun magit-imenu--repolist-prev-index-position-function ()
- "Move point to previous line in magit-repolist buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'."
- (unless (bobp)
- (forward-line -1)))
-
-;;;###autoload
-(defun magit-imenu--repolist-extract-index-name-function ()
- "Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line."
- (let ((entry (tabulated-list-get-entry)))
- (format "%s (%s)"
- (elt entry 0)
- (elt entry (1- (length entry))))))
-
-;;;; Process mode
-
-;;;###autoload
-(defun magit-imenu--process-prev-index-position-function ()
- "Move point to previous process in magit-process buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'."
- (magit-section--backward-find
- (lambda ()
- (eq (oref (magit-current-section) type) 'process))))
-
-;;;###autoload
-(defun magit-imenu--process-extract-index-name-function ()
- "Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line."
- (buffer-substring-no-properties (line-beginning-position)
- (line-end-position)))
-
-;;;; Rebase mode
-
-;;;###autoload
-(defun magit-imenu--rebase-prev-index-position-function ()
- "Move point to previous commit in git-rebase buffer.
-This function is used as a value for
-`imenu-prev-index-position-function'."
- (catch 'found
- (while (not (bobp))
- (git-rebase-backward-line)
- (when (git-rebase-line-p)
- (throw 'found t)))))
-
-;;;###autoload
-(defun magit-imenu--rebase-extract-index-name-function ()
- "Return imenu name for line at point.
-This function is used as a value for
-`imenu-extract-index-name-function'. Point should be at the
-beginning of the line."
- (buffer-substring-no-properties (line-beginning-position)
- (line-end-position)))
-
-;;; _
-(provide 'magit-imenu)
-;;; magit-imenu.el ends here
diff --git a/elpa/magit-20200728.45/magit-log.el b/elpa/magit-20200728.45/magit-log.el
deleted file mode 100644
index 6450dfd..0000000
--- a/elpa/magit-20200728.45/magit-log.el
+++ /dev/null
@@ -1,1785 +0,0 @@
-;;; magit-log.el --- inspect Git history -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for looking at Git logs, including
-;; special logs like cherry-logs, as well as for selecting a commit
-;; from a log.
-
-;;; Code:
-
-(require 'magit-core)
-(require 'magit-diff)
-
-(declare-function magit-blob-visit "magit-files" (blob-or-file line))
-(declare-function magit-insert-head-branch-header "magit-status"
- (&optional branch))
-(declare-function magit-insert-upstream-branch-header "magit-status"
- (&optional branch pull keyword))
-(declare-function magit-read-file-from-rev "magit-files"
- (rev prompt &optional default))
-(declare-function magit-show-commit "magit-diff"
- (arg1 &optional arg2 arg3 arg4))
-(declare-function magit-reflog-format-subject "magit-reflog" (subject))
-(defvar magit-refs-focus-column-width)
-(defvar magit-refs-margin)
-(defvar magit-refs-show-commit-count)
-(defvar magit-buffer-margin)
-(defvar magit-status-margin)
-(defvar magit-status-sections-hook)
-
-(require 'ansi-color)
-(require 'crm)
-(require 'which-func)
-
-(eval-when-compile
- (require 'subr-x))
-
-;;; Options
-;;;; Log Mode
-
-(defgroup magit-log nil
- "Inspect and manipulate Git history."
- :link '(info-link "(magit)Logging")
- :group 'magit-modes)
-
-(defcustom magit-log-mode-hook nil
- "Hook run after entering Magit-Log mode."
- :group 'magit-log
- :type 'hook)
-
-(defcustom magit-log-remove-graph-args '("--follow" "--grep" "-G" "-S" "-L")
- "The log arguments that cause the `--graph' argument to be dropped."
- :package-version '(magit . "2.3.0")
- :group 'magit-log
- :type '(repeat (string :tag "Argument"))
- :options '("--follow" "--grep" "-G" "-S" "-L"))
-
-(defcustom magit-log-revision-headers-format "\
-%+b
-Author: %aN <%aE>
-Committer: %cN <%cE>"
- "Additional format string used with the `++header' argument."
- :package-version '(magit . "2.3.0")
- :group 'magit-log
- :type 'string)
-
-(defcustom magit-log-auto-more nil
- "Insert more log entries automatically when moving past the last entry.
-Only considered when moving past the last entry with
-`magit-goto-*-section' commands."
- :group 'magit-log
- :type 'boolean)
-
-(defcustom magit-log-margin '(t age magit-log-margin-width t 18)
- "Format of the margin in `magit-log-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-log
- :group 'magit-margin
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set (apply-partially #'magit-margin-set-variable 'magit-log-mode))
-
-(defcustom magit-log-margin-show-committer-date nil
- "Whether to show the committer date in the margin.
-
-This option only controls whether the committer date is displayed
-instead of the author date. Whether some date is displayed in
-the margin and whether the margin is displayed at all is
-controlled by other options."
- :package-version '(magit . "3.0.0")
- :group 'magit-log
- :group 'magit-margin
- :type 'boolean)
-
-(defcustom magit-log-show-refname-after-summary nil
- "Whether to show refnames after commit summaries.
-This is useful if you use really long branch names."
- :package-version '(magit . "2.2.0")
- :group 'magit-log
- :type 'boolean)
-
-(defcustom magit-log-highlight-keywords t
- "Whether to highlight bracketed keywords in commit summaries."
- :package-version '(magit . "2.12.0")
- :group 'magit-log
- :type 'boolean)
-
-(defcustom magit-log-header-line-function 'magit-log-header-line-sentence
- "Function used to generate text shown in header line of log buffers."
- :package-version '(magit . "2.12.0")
- :group 'magit-log
- :type '(choice (function-item magit-log-header-line-arguments)
- (function-item magit-log-header-line-sentence)
- function))
-
-(defcustom magit-log-trace-definition-function 'magit-which-function
- "Function used to determine the function at point.
-This is used by the command `magit-log-trace-definition'.
-You should prefer `magit-which-function' over `which-function'
-because the latter may make use of Imenu's outdated cache."
- :package-version '(magit . "3.0.0")
- :group 'magit-log
- :type '(choice (function-item magit-which-function)
- (function-item which-function)
- (function-item add-log-current-defun)
- function))
-
-(defface magit-log-graph
- '((((class color) (background light)) :foreground "grey30")
- (((class color) (background dark)) :foreground "grey80"))
- "Face for the graph part of the log output."
- :group 'magit-faces)
-
-(defface magit-log-author
- '((((class color) (background light))
- :foreground "firebrick"
- :slant normal
- :weight normal)
- (((class color) (background dark))
- :foreground "tomato"
- :slant normal
- :weight normal))
- "Face for the author part of the log output."
- :group 'magit-faces)
-
-(defface magit-log-date
- '((((class color) (background light))
- :foreground "grey30"
- :slant normal
- :weight normal)
- (((class color) (background dark))
- :foreground "grey80"
- :slant normal
- :weight normal))
- "Face for the date part of the log output."
- :group 'magit-faces)
-
-(defface magit-header-line-log-select
- '((t :inherit bold))
- "Face for the `header-line' in `magit-log-select-mode'."
- :group 'magit-faces)
-
-;;;; File Log
-
-(defcustom magit-log-buffer-file-locked t
- "Whether `magit-log-buffer-file-quick' uses a dedicated buffer."
- :package-version '(magit . "2.7.0")
- :group 'magit-commands
- :group 'magit-log
- :type 'boolean)
-
-;;;; Select Mode
-
-(defcustom magit-log-select-show-usage 'both
- "Whether to show usage information when selecting a commit from a log.
-The message can be shown in the `echo-area' or the `header-line', or in
-`both' places. If the value isn't one of these symbols, then it should
-be nil, in which case no usage information is shown."
- :package-version '(magit . "2.1.0")
- :group 'magit-log
- :type '(choice (const :tag "in echo-area" echo-area)
- (const :tag "in header-line" header-line)
- (const :tag "in both places" both)
- (const :tag "nowhere")))
-
-(defcustom magit-log-select-margin
- (list (nth 0 magit-log-margin)
- (nth 1 magit-log-margin)
- 'magit-log-margin-width t
- (nth 4 magit-log-margin))
- "Format of the margin in `magit-log-select-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-log
- :group 'magit-margin
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set-after '(magit-log-margin)
- :set (apply-partially #'magit-margin-set-variable 'magit-log-select-mode))
-
-;;;; Cherry Mode
-
-(defcustom magit-cherry-sections-hook
- '(magit-insert-cherry-headers
- magit-insert-cherry-commits)
- "Hook run to insert sections into the cherry buffer."
- :package-version '(magit . "2.1.0")
- :group 'magit-log
- :type 'hook)
-
-(defcustom magit-cherry-margin
- (list (nth 0 magit-log-margin)
- (nth 1 magit-log-margin)
- 'magit-log-margin-width t
- (nth 4 magit-log-margin))
- "Format of the margin in `magit-cherry-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-log
- :group 'magit-margin
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set-after '(magit-log-margin)
- :set (apply-partially #'magit-margin-set-variable 'magit-cherry-mode))
-
-;;;; Log Sections
-
-(defcustom magit-log-section-commit-count 10
- "How many recent commits to show in certain log sections.
-How many recent commits `magit-insert-recent-commits' and
-`magit-insert-unpulled-from-upstream-or-recent' (provided
-the upstream isn't ahead of the current branch) show."
- :package-version '(magit . "2.1.0")
- :group 'magit-status
- :type 'number)
-
-;;; Arguments
-;;;; Prefix Classes
-
-(defclass magit-log-prefix (transient-prefix)
- ((history-key :initform 'magit-log)
- (major-mode :initform 'magit-log-mode)))
-
-(defclass magit-log-refresh-prefix (magit-log-prefix)
- ((history-key :initform 'magit-log)
- (major-mode :initform nil)))
-
-;;;; Prefix Methods
-
-(cl-defmethod transient-init-value ((obj magit-log-prefix))
- (pcase-let ((`(,args ,files)
- (magit-log--get-value 'magit-log-mode
- magit-prefix-use-buffer-arguments)))
- (unless (eq transient-current-command 'magit-dispatch)
- (when-let ((file (magit-file-relative-name)))
- (setq files (list file))))
- (oset obj value (if files `(("--" ,@files) ,args) args))))
-
-(cl-defmethod transient-init-value ((obj magit-log-refresh-prefix))
- (oset obj value (if magit-buffer-log-files
- `(("--" ,@magit-buffer-log-files)
- ,magit-buffer-log-args)
- magit-buffer-log-args)))
-
-(cl-defmethod transient-set-value ((obj magit-log-prefix))
- (magit-log--set-value obj))
-
-(cl-defmethod transient-save-value ((obj magit-log-prefix))
- (magit-log--set-value obj 'save))
-
-;;;; Argument Access
-
-(defun magit-log-arguments (&optional mode)
- "Return the current log arguments."
- (if (memq transient-current-command '(magit-log magit-log-refresh))
- (pcase-let ((`(,args ,alist)
- (-separate #'atom (transient-get-value))))
- (list args (cdr (assoc "--" alist))))
- (magit-log--get-value (or mode 'magit-log-mode))))
-
-(defun magit-log--get-value (mode &optional use-buffer-args)
- (unless use-buffer-args
- (setq use-buffer-args magit-direct-use-buffer-arguments))
- (let (args files)
- (cond
- ((and (memq use-buffer-args '(always selected current))
- (eq major-mode mode))
- (setq args magit-buffer-log-args)
- (setq files magit-buffer-log-files))
- ((and (memq use-buffer-args '(always selected))
- (when-let ((buffer (magit-get-mode-buffer
- mode nil
- (eq use-buffer-args 'selected))))
- (setq args (buffer-local-value 'magit-buffer-log-args buffer))
- (setq files (buffer-local-value 'magit-buffer-log-files buffer))
- t)))
- ((plist-member (symbol-plist mode) 'magit-log-current-arguments)
- (setq args (get mode 'magit-log-current-arguments)))
- ((when-let ((elt (assq (intern (format "magit-log:%s" mode))
- transient-values)))
- (setq args (cdr elt))
- t))
- (t
- (setq args (get mode 'magit-log-default-arguments))))
- (list args files)))
-
-(defun magit-log--set-value (obj &optional save)
- (pcase-let* ((obj (oref obj prototype))
- (mode (or (oref obj major-mode) major-mode))
- (key (intern (format "magit-log:%s" mode)))
- (`(,args ,alist)
- (-separate #'atom (transient-get-value)))
- (files (cdr (assoc "--" alist))))
- (put mode 'magit-log-current-arguments args)
- (when save
- (setf (alist-get key transient-values) args)
- (transient-save-values))
- (transient--history-push obj)
- (setq magit-buffer-log-args args)
- (unless (derived-mode-p 'magit-log-select-mode)
- (setq magit-buffer-log-files files))
- (magit-refresh)))
-
-;;; Commands
-;;;; Prefix Commands
-
-;;;###autoload (autoload 'magit-log "magit-log" nil t)
-(transient-define-prefix magit-log ()
- "Show a commit or reference log."
- :man-page "git-log"
- :class 'magit-log-prefix
- ;; The grouping in git-log(1) appears to be guided by implementation
- ;; details, so our logical grouping only follows it to an extend.
- ;; Arguments that are "misplaced" here:
- ;; 1. From "Commit Formatting".
- ;; 2. From "Common Diff Options".
- ;; 3. From unnamed first group.
- ;; 4. Implemented by Magit.
- ["Commit limiting"
- (magit-log:-n)
- (magit:--author)
- (7 "=s" "Limit to commits since" "--since=" transient-read-date)
- (7 "=u" "Limit to commits until" "--until=" transient-read-date)
- (magit-log:--grep)
- (7 "-I" "Invert search pattern" "--invert-grep")
- (magit-log:-G) ;2
- (magit-log:-S) ;2
- (magit-log:-L) ;2
- (7 "=m" "Omit merges" "--no-merges")
- (7 "=p" "First parent" "--first-parent")]
- ["History simplification"
- ( "-D" "Simplify by decoration" "--simplify-by-decoration")
- (magit:--)
- ( "-f" "Follow renames when showing single-file log" "--follow") ;3
- (6 "/s" "Only commits changing given paths" "--sparse")
- (7 "/d" "Only selected commits plus meaningful history" "--dense")
- (7 "/a" "Only commits existing directly on ancestry path" "--ancestry-path")
- (6 "/f" "Do not prune history" "--full-history")
- (7 "/m" "Prune some history" "--simplify-merges")]
- ["Commit ordering"
- (magit-log:--*-order)
- ("-r" "Reverse order" "--reverse")]
- ["Formatting"
- ("-g" "Show graph" "--graph") ;1
- ("-c" "Show graph in color" "--color") ;2
- ("-d" "Show refnames" "--decorate") ;3
- ("=S" "Show signatures" "--show-signature") ;1
- ("-h" "Show header" "++header") ;4
- ("-p" "Show diffs" ("-p" "--patch")) ;2
- ("-s" "Show diffstats" "--stat")] ;2
- [["Log"
- ("l" "current" magit-log-current)
- ("o" "other" magit-log-other)
- ("h" "HEAD" magit-log-head)]
- [""
- ("L" "local branches" magit-log-branches)
- (7 "B" "matching branches" magit-log-matching-branches)
- (7 "T" "matching tags" magit-log-matching-tags)
- ("b" "all branches" magit-log-all-branches)
- ("a" "all references" magit-log-all)
- (7 "m" "merged" magit-log-merged)]
- ["Reflog"
- ("r" "current" magit-reflog-current)
- ("O" "other" magit-reflog-other)
- ("H" "HEAD" magit-reflog-head)]
- [:if magit--any-wip-mode-enabled-p
- :description "Wiplog"
- ("i" "index" magit-wip-log-index)
- ("w" "worktree" magit-wip-log-worktree)]])
-
-;;;###autoload (autoload 'magit-log-refresh "magit-log" nil t)
-(transient-define-prefix magit-log-refresh ()
- "Change the arguments used for the log(s) in the current buffer."
- :man-page "git-log"
- :class 'magit-log-refresh-prefix
- [:if-mode magit-log-mode
- :class transient-subgroups
- ["Commit limiting"
- (magit-log:-n)
- (magit:--author)
- (magit-log:--grep)
- (7 "-I" "Invert search pattern" "--invert-grep")
- (magit-log:-G)
- (magit-log:-S)
- (magit-log:-L)]
- ["History simplification"
- ( "-D" "Simplify by decoration" "--simplify-by-decoration")
- (magit:--)
- ( "-f" "Follow renames when showing single-file log" "--follow") ;3
- (6 "/s" "Only commits changing given paths" "--sparse")
- (7 "/d" "Only selected commits plus meaningful history" "--dense")
- (7 "/a" "Only commits existing directly on ancestry path" "--ancestry-path")
- (6 "/f" "Do not prune history" "--full-history")
- (7 "/m" "Prune some history" "--simplify-merges")]
- ["Commit ordering"
- (magit-log:--*-order)
- ("-r" "Reverse order" "--reverse")]
- ["Formatting"
- ("-g" "Show graph" "--graph")
- ("-c" "Show graph in color" "--color")
- ("-d" "Show refnames" "--decorate")
- ("=S" "Show signatures" "--show-signature")
- ("-h" "Show header" "++header")
- ("-p" "Show diffs" ("-p" "--patch"))
- ("-s" "Show diffstats" "--stat")]]
- [:if-not-mode magit-log-mode
- :description "Arguments"
- (magit-log:-n)
- (magit-log:--*-order)
- ("-g" "Show graph" "--graph")
- ("-c" "Show graph in color" "--color")
- ("-d" "Show refnames" "--decorate")]
- [["Refresh"
- ("g" "buffer" magit-log-refresh)
- ("s" "buffer and set defaults" transient-set :transient nil)
- ("w" "buffer and save defaults" transient-save :transient nil)]
- ["Margin"
- ("L" "toggle visibility" magit-toggle-margin)
- ("l" "cycle style" magit-cycle-margin-style)
- ("d" "toggle details" magit-toggle-margin-details)
- ("x" "toggle shortstat" magit-toggle-log-margin-style)]
- [:if-mode magit-log-mode
- :description "Toggle"
- ("b" "buffer lock" magit-toggle-buffer-lock)]]
- (interactive)
- (cond
- ((not (eq transient-current-command 'magit-log-refresh))
- (pcase major-mode
- (`magit-reflog-mode
- (user-error "Cannot change log arguments in reflog buffers"))
- (`magit-cherry-mode
- (user-error "Cannot change log arguments in cherry buffers")))
- (transient-setup 'magit-log-refresh))
- (t
- (pcase-let ((`(,args ,files) (magit-log-arguments)))
- (setq magit-buffer-log-args args)
- (unless (derived-mode-p 'magit-log-select-mode)
- (setq magit-buffer-log-files files)))
- (magit-refresh))))
-
-;;;; Infix Commands
-
-(transient-define-argument magit-log:-n ()
- :description "Limit number of commits"
- :class 'transient-option
- ;; For historic reasons (and because it easy to guess what "-n"
- ;; stands for) this is the only argument where we do not use the
- ;; long argument ("--max-count").
- :shortarg "-n"
- :argument "-n"
- :reader 'transient-read-number-N+)
-
-(transient-define-argument magit:--author ()
- :description "Limit to author"
- :class 'transient-option
- :key "-A"
- :argument "--author="
- :reader 'magit-transient-read-person)
-
-(transient-define-argument magit-log:--*-order ()
- :description "Order commits by"
- :class 'transient-switches
- :key "-o"
- :argument-format "--%s-order"
- :argument-regexp "\\(--\\(topo\\|author-date\\|date\\)-order\\)"
- :choices '("topo" "author-date" "date"))
-
-(transient-define-argument magit-log:--grep ()
- :description "Search messages"
- :class 'transient-option
- :key "-F"
- :argument "--grep=")
-
-(transient-define-argument magit-log:-G ()
- :description "Search changes"
- :class 'transient-option
- :argument "-G")
-
-(transient-define-argument magit-log:-S ()
- :description "Search occurrences"
- :class 'transient-option
- :argument "-S")
-
-(transient-define-argument magit-log:-L ()
- :description "Trace line evolution"
- :class 'transient-option
- :argument "-L"
- :reader 'magit-read-file-trace)
-
-(defun magit-read-file-trace (&rest _ignored)
- (let ((file (magit-read-file-from-rev "HEAD" "File"))
- (trace (magit-read-string "Trace")))
- (concat trace ":" file)))
-
-;;;; Setup Commands
-
-(defvar magit-log-read-revs-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map crm-local-completion-map)
- (define-key map "\s" 'self-insert-command)
- map))
-
-(defun magit-log-read-revs (&optional use-current)
- (or (and use-current (--when-let (magit-get-current-branch) (list it)))
- (let ((collection (magit-list-refnames nil t)))
- (split-string
- (magit-completing-read-multiple "Log rev,s" collection
- "\\(\\.\\.\\.?\\|[, ]\\)"
- (or (magit-branch-or-commit-at-point)
- (unless use-current
- (magit-get-previous-branch)))
- 'magit-revision-history
- magit-log-read-revs-map)
- "[, ]" t))))
-
-(defun magit-log-read-pattern (option)
- "Read a string from the user to pass as parameter to OPTION."
- (magit-read-string (format "Type a pattern to pass to %s" option)))
-
-;;;###autoload
-(defun magit-log-current (revs &optional args files)
- "Show log for the current branch.
-When `HEAD' is detached or with a prefix argument show log for
-one or more revs read from the minibuffer."
- (interactive (cons (magit-log-read-revs t)
- (magit-log-arguments)))
- (magit-log-setup-buffer revs args files))
-
-;;;###autoload
-(defun magit-log-other (revs &optional args files)
- "Show log for one or more revs read from the minibuffer.
-The user can input any revision or revisions separated by a
-space, or even ranges, but only branches and tags, and a
-representation of the commit at point, are available as
-completion candidates."
- (interactive (cons (magit-log-read-revs)
- (magit-log-arguments)))
- (magit-log-setup-buffer revs args files))
-
-;;;###autoload
-(defun magit-log-head (&optional args files)
- "Show log for `HEAD'."
- (interactive (magit-log-arguments))
- (magit-log-setup-buffer (list "HEAD") args files))
-
-;;;###autoload
-(defun magit-log-branches (&optional args files)
- "Show log for all local branches and `HEAD'."
- (interactive (magit-log-arguments))
- (magit-log-setup-buffer (if (magit-get-current-branch)
- (list "--branches")
- (list "HEAD" "--branches"))
- args files))
-
-;;;###autoload
-(defun magit-log-matching-branches (pattern &optional args files)
- "Show log for all branches matching PATTERN and `HEAD'."
- (interactive (cons (magit-log-read-pattern "--branches") (magit-log-arguments)))
- (magit-log-setup-buffer
- (list "HEAD" (format "--branches=%s" pattern))
- args files))
-
-;;;###autoload
-(defun magit-log-matching-tags (pattern &optional args files)
- "Show log for all tags matching PATTERN and `HEAD'."
- (interactive (cons (magit-log-read-pattern "--tags") (magit-log-arguments)))
- (magit-log-setup-buffer
- (list "HEAD" (format "--tags=%s" pattern))
- args files))
-
-;;;###autoload
-(defun magit-log-all-branches (&optional args files)
- "Show log for all local and remote branches and `HEAD'."
- (interactive (magit-log-arguments))
- (magit-log-setup-buffer (if (magit-get-current-branch)
- (list "--branches" "--remotes")
- (list "HEAD" "--branches" "--remotes"))
- args files))
-
-;;;###autoload
-(defun magit-log-all (&optional args files)
- "Show log for all references and `HEAD'."
- (interactive (magit-log-arguments))
- (magit-log-setup-buffer (if (magit-get-current-branch)
- (list "--all")
- (list "HEAD" "--all"))
- args files))
-
-;;;###autoload
-(defun magit-log-buffer-file (&optional follow beg end)
- "Show log for the blob or file visited in the current buffer.
-With a prefix argument or when `--follow' is an active log
-argument, then follow renames. When the region is active,
-restrict the log to the lines that the region touches."
- (interactive
- (cons current-prefix-arg
- (and (region-active-p)
- (magit-file-relative-name)
- (save-restriction
- (widen)
- (list (line-number-at-pos (region-beginning))
- (line-number-at-pos
- (let ((end (region-end)))
- (if (char-after end)
- end
- ;; Ensure that we don't get the line number
- ;; of a trailing newline.
- (1- end)))))))))
- (require 'magit)
- (if-let ((file (magit-file-relative-name)))
- (magit-log-setup-buffer
- (list (or magit-buffer-refname
- (magit-get-current-branch)
- "HEAD"))
- (let ((args (car (magit-log-arguments))))
- (when (and follow (not (member "--follow" args)))
- (push "--follow" args))
- (when (and (file-regular-p
- (expand-file-name file (magit-toplevel)))
- beg end)
- (setq args (cons (format "-L%s,%s:%s" beg end file)
- (cl-delete "-L" args :test
- 'string-prefix-p)))
- (setq file nil))
- args)
- (and file (list file))
- magit-log-buffer-file-locked)
- (user-error "Buffer isn't visiting a file")))
-
-;;;###autoload
-(defun magit-log-trace-definition (file fn rev)
- "Show log for the definition at point."
- (interactive (list (or (magit-file-relative-name)
- (user-error "Buffer isn't visiting a file"))
- (or (funcall magit-log-trace-definition-function)
- (user-error "No function at point found"))
- (or magit-buffer-refname
- (magit-get-current-branch)
- "HEAD")))
- (require 'magit)
- (magit-log-setup-buffer
- (list rev)
- (cons (format "-L:%s%s:%s"
- (replace-regexp-in-string ":" "\\:" (regexp-quote fn) nil t)
- (if (derived-mode-p 'lisp-mode 'emacs-lisp-mode)
- ;; Git doesn't treat "-" the same way as
- ;; "_", leading to false-positives such as
- ;; "foo-suffix" being considered a match
- ;; for "foo". Wing it.
- "\\( \\|$\\)"
- ;; We could use "\\b" here, but since Git
- ;; already does something equivalent, that
- ;; isn't necessary.
- "")
- file)
- (cl-delete "-L" (car (magit-log-arguments))
- :test 'string-prefix-p))
- nil magit-log-buffer-file-locked))
-
-(defun magit-diff-trace-definition ()
- "Show log for the definition at point in a diff."
- (interactive)
- (pcase-let ((`(,buf ,pos) (magit-diff-visit-file--noselect)))
- (magit--with-temp-position buf pos
- (call-interactively #'magit-log-trace-definition))))
-
-;;;###autoload
-(defun magit-log-merged (commit branch &optional args files)
- "Show log for the merge of COMMIT into BRANCH.
-
-More precisely, find merge commit M that brought COMMIT into
-BRANCH, and show the log of the range \"M^1..M\". If COMMIT is
-directly on BRANCH, then show approximately twenty surrounding
-commits instead.
-
-This command requires git-when-merged, which is available from
-https://github.com/mhagger/git-when-merged."
- (interactive
- (append (let ((commit (magit-read-branch-or-commit "Commit")))
- (list commit
- (magit-read-other-branch "Merged into" commit)))
- (magit-log-arguments)))
- (unless (executable-find "git-when-merged")
- (user-error "This command requires git-when-merged (%s)"
- "https://github.com/mhagger/git-when-merged"))
- (let (exit m)
- (with-temp-buffer
- (save-excursion
- (setq exit (magit-process-file
- magit-git-executable nil t nil
- "when-merged" "-c"
- "--abbrev" (number-to-string (magit-abbrev-length))
- commit branch)))
- (setq m (buffer-substring-no-properties (point) (line-end-position))))
- (if (zerop exit)
- (magit-log-setup-buffer (list (format "%s^1..%s" m m))
- args files nil commit)
- (setq m (string-trim-left (substring m (string-match " " m))))
- (if (equal m "Commit is directly on this branch.")
- (let* ((from (concat commit "~10"))
- (to (- (car (magit-rev-diff-count branch commit)) 10))
- (to (if (<= to 0)
- branch
- (format "%s~%s" branch to))))
- (unless (magit-rev-verify-commit from)
- (setq from (magit-git-string "rev-list" "--max-parents=0"
- commit)))
- (magit-log-setup-buffer (list (concat from ".." to))
- (cons "--first-parent" args)
- files nil commit))
- (user-error "Could not find when %s was merged into %s: %s"
- commit branch m)))))
-
-;;;; Limit Commands
-
-(defun magit-log-toggle-commit-limit ()
- "Toggle the number of commits the current log buffer is limited to.
-If the number of commits is currently limited, then remove that
-limit. Otherwise set it to 256."
- (interactive)
- (magit-log-set-commit-limit (lambda (&rest _) nil)))
-
-(defun magit-log-double-commit-limit ()
- "Double the number of commits the current log buffer is limited to."
- (interactive)
- (magit-log-set-commit-limit '*))
-
-(defun magit-log-half-commit-limit ()
- "Half the number of commits the current log buffer is limited to."
- (interactive)
- (magit-log-set-commit-limit '/))
-
-(defun magit-log-set-commit-limit (fn)
- (let* ((val magit-buffer-log-args)
- (arg (--first (string-match "^-n\\([0-9]+\\)?$" it) val))
- (num (and arg (string-to-number (match-string 1 arg))))
- (num (if num (funcall fn num 2) 256)))
- (setq val (delete arg val))
- (setq magit-buffer-log-args
- (if (and num (> num 0))
- (cons (format "-n%i" num) val)
- val)))
- (magit-refresh))
-
-(defun magit-log-get-commit-limit ()
- (--when-let (--first (string-match "^-n\\([0-9]+\\)?$" it)
- magit-buffer-log-args)
- (string-to-number (match-string 1 it))))
-
-;;;; Mode Commands
-
-(defun magit-log-bury-buffer (&optional arg)
- "Bury the current buffer or the revision buffer in the same frame.
-Like `magit-mode-bury-buffer' (which see) but with a negative
-prefix argument instead bury the revision buffer, provided it
-is displayed in the current frame."
- (interactive "p")
- (if (< arg 0)
- (let* ((buf (magit-get-mode-buffer 'magit-revision-mode))
- (win (and buf (get-buffer-window buf (selected-frame)))))
- (if win
- (with-selected-window win
- (with-current-buffer buf
- (magit-mode-bury-buffer (> (abs arg) 1))))
- (user-error "No revision buffer in this frame")))
- (magit-mode-bury-buffer (> arg 1))))
-
-;;;###autoload
-(defun magit-log-move-to-parent (&optional n)
- "Move to the Nth parent of the current commit."
- (interactive "p")
- (when (derived-mode-p 'magit-log-mode)
- (when (magit-section-match 'commit)
- (let* ((section (magit-current-section))
- (parent-rev (format "%s^%s" (oref section value) (or n 1))))
- (if-let ((parent-hash (magit-rev-parse "--short" parent-rev)))
- (if-let ((parent (--first (equal (oref it value)
- parent-hash)
- (magit-section-siblings section 'next))))
- (magit-section-goto parent)
- (user-error
- (substitute-command-keys
- (concat "Parent " parent-hash " not found. Try typing "
- "\\[magit-log-double-commit-limit] first"))))
- (user-error "Parent %s does not exist" parent-rev))))))
-
-;;; Log Mode
-
-(defvar magit-log-disable-graph-hack-args
- '("-G" "--grep" "--author")
- "Arguments which disable the graph speedup hack.")
-
-(defvar magit-log-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-mode-map)
- (define-key map "\C-c\C-b" 'magit-go-backward)
- (define-key map "\C-c\C-f" 'magit-go-forward)
- (define-key map "\C-c\C-n" 'magit-log-move-to-parent)
- (define-key map "=" 'magit-log-toggle-commit-limit)
- (define-key map "+" 'magit-log-double-commit-limit)
- (define-key map "-" 'magit-log-half-commit-limit)
- (define-key map "q" 'magit-log-bury-buffer)
- map)
- "Keymap for `magit-log-mode'.")
-
-(define-derived-mode magit-log-mode magit-mode "Magit Log"
- "Mode for looking at Git log.
-
-This mode is documented in info node `(magit)Log Buffer'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \
-to visit the commit at point.
-
-Type \\[magit-branch] to see available branch commands.
-Type \\[magit-merge] to merge the branch or commit at point.
-Type \\[magit-cherry-pick] to apply the commit at point.
-Type \\[magit-reset] to reset `HEAD' to the commit at point.
-
-\\{magit-log-mode-map}"
- :group 'magit-log
- (hack-dir-local-variables-non-file-buffer)
- (setq imenu-prev-index-position-function
- 'magit-imenu--log-prev-index-position-function)
- (setq imenu-extract-index-name-function
- 'magit-imenu--log-extract-index-name-function))
-
-(put 'magit-log-mode 'magit-log-default-arguments
- '("--graph" "-n256" "--decorate"))
-
-(defun magit-log-setup-buffer (revs args files &optional locked focus)
- (require 'magit)
- (with-current-buffer
- (magit-setup-buffer #'magit-log-mode locked
- (magit-buffer-revisions revs)
- (magit-buffer-log-args args)
- (magit-buffer-log-files files))
- (when (if focus
- (magit-log-goto-commit-section focus)
- (magit-log-goto-same-commit))
- (magit-section-update-highlight))
- (current-buffer)))
-
-(defun magit-log-refresh-buffer ()
- (let ((revs magit-buffer-revisions)
- (args magit-buffer-log-args)
- (files magit-buffer-log-files))
- (magit-set-header-line-format
- (funcall magit-log-header-line-function revs args files))
- (if (= (length files) 1)
- (unless (magit-file-tracked-p (car files))
- (setq args (cons "--full-history" args)))
- (setq args (remove "--follow" args)))
- (when (and (car magit-log-remove-graph-args)
- (--any-p (string-match-p
- (concat "^" (regexp-opt magit-log-remove-graph-args)) it)
- args))
- (setq args (remove "--graph" args)))
- (unless (member "--graph" args)
- (setq args (remove "--color" args)))
- (when-let ((limit (magit-log-get-commit-limit))
- (limit (* 2 limit)) ; increase odds for complete graph
- (count (and (= (length revs) 1)
- (> limit 1024) ; otherwise it's fast enough
- (setq revs (car revs))
- (not (string-match-p "\\.\\." revs))
- (not (member revs '("--all" "--branches")))
- (-none-p (lambda (arg)
- (--any-p (string-prefix-p it arg)
- magit-log-disable-graph-hack-args))
- args)
- (magit-git-string "rev-list" "--count"
- "--first-parent" args revs))))
- (setq revs (if (< (string-to-number count) limit)
- revs
- (format "%s~%s..%s" revs limit revs))))
- (magit-insert-section (logbuf)
- (magit-insert-log revs args files))))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-log-mode))
- (append magit-buffer-revisions
- (if (and magit-buffer-revisions magit-buffer-log-files)
- (cons "--" magit-buffer-log-files)
- magit-buffer-log-files)))
-
-(defun magit-log-header-line-arguments (revs args files)
- "Return string describing some of the used arguments."
- (mapconcat (lambda (arg)
- (if (string-match-p " " arg)
- (prin1 arg)
- arg))
- `("git" "log" ,@args ,@revs "--" ,@files)
- " "))
-
-(defun magit-log-header-line-sentence (revs args files)
- "Return string containing all arguments."
- (concat "Commits in "
- (mapconcat #'identity revs " ")
- (and (member "--reverse" args)
- " in reverse")
- (and files (concat " touching "
- (mapconcat 'identity files " ")))
- (--some (and (string-prefix-p "-L" it)
- (concat " " it))
- args)))
-
-(defun magit-insert-log (revs &optional args files)
- "Insert a log section.
-Do not add this to a hook variable."
- (let ((magit-git-global-arguments
- (remove "--literal-pathspecs" magit-git-global-arguments)))
- (magit-git-wash (apply-partially #'magit-log-wash-log 'log)
- "log"
- (format "--format=%s%%h%%x0c%s%%x0c%s%%x0c%%aN%%x0c%s%%x0c%%s%s"
- (if (and (member "--left-right" args)
- (not (member "--graph" args)))
- "%m "
- "")
- (if (member "--decorate" args) "%D" "")
- (if (member "--show-signature" args)
- (progn (setq args (remove "--show-signature" args)) "%G?")
- "")
- (if magit-log-margin-show-committer-date "%ct" "%at")
- (if (member "++header" args)
- (if (member "--graph" (setq args (remove "++header" args)))
- (concat "\n" magit-log-revision-headers-format "\n")
- (concat "\n" magit-log-revision-headers-format "\n"))
- ""))
- (progn
- (--when-let (--first (string-match "^\\+\\+order=\\(.+\\)$" it) args)
- (setq args (cons (format "--%s-order" (match-string 1 it))
- (remove it args))))
- (when (member "--decorate" args)
- (setq args (cons "--decorate=full" (remove "--decorate" args))))
- (when (member "--reverse" args)
- (setq args (remove "--graph" args)))
- args)
- "--use-mailmap" "--no-prefix" revs "--" files)))
-
-(defvar magit-commit-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-show-commit)
- (define-key map "a" 'magit-cherry-apply)
- map)
- "Keymap for `commit' sections.")
-
-(defvar magit-module-commit-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-show-commit)
- map)
- "Keymap for `module-commit' sections.")
-
-(defconst magit-log-heading-re
- ;; Note: A form feed instead of a null byte is used as the delimiter
- ;; because using the latter interferes with the graph prefix when
- ;; ++header is used.
- (concat "^"
- "\\(?4:[-_/|\\*o<>. ]*\\)" ; graph
- "\\(?1:[0-9a-fA-F]+\\)? " ; sha1
- "\\(?3:[^ \n]+\\)? " ; refs
- "\\(?7:[BGUXYREN]\\)? " ; gpg
- "\\(?5:[^ \n]*\\) " ; author
- ;; Note: Date is optional because, prior to Git v2.19.0,
- ;; `git rebase -i --root` corrupts the root's author date.
- "\\(?6:[^ \n]*\\) " ; date
- "\\(?2:.*\\)$")) ; msg
-
-(defconst magit-log-cherry-re
- (concat "^"
- "\\(?8:[-+]\\) " ; cherry
- "\\(?1:[0-9a-fA-F]+\\) " ; sha1
- "\\(?2:.*\\)$")) ; msg
-
-(defconst magit-log-module-re
- (concat "^"
- "\\(?:\\(?11:[<>]\\) \\)?" ; side
- "\\(?1:[0-9a-fA-F]+\\) " ; sha1
- "\\(?2:.*\\)$")) ; msg
-
-(defconst magit-log-bisect-vis-re
- (concat "^"
- "\\(?4:[-_/|\\*o<>. ]*\\)" ; graph
- "\\(?1:[0-9a-fA-F]+\\)?\0" ; sha1
- "\\(?3:[^\0\n]+\\)?\0" ; refs
- "\\(?2:.*\\)$")) ; msg
-
-(defconst magit-log-bisect-log-re
- (concat "^# "
- "\\(?3:bad:\\|skip:\\|good:\\) " ; "refs"
- "\\[\\(?1:[^]\n]+\\)\\] " ; sha1
- "\\(?2:.*\\)$")) ; msg
-
-(defconst magit-log-reflog-re
- (concat "^"
- "\\(?1:[^\0\n]+\\)\0" ; sha1
- "\\(?5:[^\0\n]*\\)\0" ; author
- "\\(?:\\(?:[^@\n]+@{\\(?6:[^}\n]+\\)}\0" ; date
- "\\(?10:merge \\|autosave \\|restart \\|[^:\n]+: \\)?" ; refsub
- "\\(?2:.*\\)?\\)\\|\0\\)$")) ; msg
-
-(defconst magit-reflog-subject-re
- (concat "\\(?1:[^ ]+\\) ?" ; command
- "\\(?2:\\(?: ?-[^ ]+\\)+\\)?" ; option
- "\\(?: ?(\\(?3:[^)]+\\))\\)?")) ; type
-
-(defconst magit-log-stash-re
- (concat "^"
- "\\(?1:[^\0\n]+\\)\0" ; "sha1"
- "\\(?5:[^\0\n]*\\)\0" ; author
- "\\(?6:[^\0\n]+\\)\0" ; date
- "\\(?2:.*\\)$")) ; msg
-
-(defvar magit-log-count nil)
-
-(defvar magit-log-format-message-function 'magit-log-propertize-keywords)
-
-(defun magit-log-wash-log (style args)
- (setq args (-flatten args))
- (when (and (member "--graph" args)
- (member "--color" args))
- (let ((ansi-color-apply-face-function
- (lambda (beg end face)
- (put-text-property beg end 'font-lock-face
- (or face 'magit-log-graph)))))
- (ansi-color-apply-on-region (point-min) (point-max))))
- (when (eq style 'cherry)
- (reverse-region (point-min) (point-max)))
- (let ((magit-log-count 0))
- (when (looking-at "^\\.\\.\\.")
- (magit-delete-line))
- (magit-wash-sequence (apply-partially 'magit-log-wash-rev style
- (magit-abbrev-length)))
- (if (derived-mode-p 'magit-log-mode 'magit-reflog-mode)
- (when (eq magit-log-count (magit-log-get-commit-limit))
- (magit-insert-section (longer)
- (insert-text-button
- (substitute-command-keys
- (format "Type \\<%s>\\[%s] to show more history"
- 'magit-log-mode-map
- 'magit-log-double-commit-limit))
- 'action (lambda (_button)
- (magit-log-double-commit-limit))
- 'follow-link t
- 'mouse-face 'magit-section-highlight)))
- (insert ?\n))))
-
-(cl-defun magit-log-wash-rev (style abbrev)
- (when (derived-mode-p 'magit-log-mode 'magit-reflog-mode)
- (cl-incf magit-log-count))
- (looking-at (pcase style
- (`log magit-log-heading-re)
- (`cherry magit-log-cherry-re)
- (`module magit-log-module-re)
- (`reflog magit-log-reflog-re)
- (`stash magit-log-stash-re)
- (`bisect-vis magit-log-bisect-vis-re)
- (`bisect-log magit-log-bisect-log-re)))
- (magit-bind-match-strings
- (hash msg refs graph author date gpg cherry _ refsub side) nil
- (setq msg (substring-no-properties msg))
- (when refs
- (setq refs (substring-no-properties refs)))
- (let ((align (or (eq style 'cherry)
- (not (member "--stat" magit-buffer-log-args))))
- (non-graph-re (if (eq style 'bisect-vis)
- magit-log-bisect-vis-re
- magit-log-heading-re)))
- (magit-delete-line)
- ;; If the reflog entries have been pruned, the output of `git
- ;; reflog show' includes a partial line that refers to the hash
- ;; of the youngest expired reflog entry.
- (when (and (eq style 'reflog) (not date))
- (cl-return-from magit-log-wash-rev t))
- (magit-insert-section section (commit hash)
- (pcase style
- (`stash (oset section type 'stash))
- (`module (oset section type 'module-commit))
- (`bisect-log (setq hash (magit-rev-parse "--short" hash))))
- (when cherry
- (when (and (derived-mode-p 'magit-refs-mode)
- magit-refs-show-commit-count)
- (insert (make-string (1- magit-refs-focus-column-width) ?\s)))
- (insert (propertize cherry 'font-lock-face
- (if (string= cherry "-")
- 'magit-cherry-equivalent
- 'magit-cherry-unmatched)))
- (insert ?\s))
- (when side
- (insert (propertize side 'font-lock-face
- (if (string= side "<")
- 'magit-cherry-equivalent
- 'magit-cherry-unmatched)))
- (insert ?\s))
- (when align
- (insert (propertize hash 'font-lock-face 'magit-hash) ?\s))
- (when graph
- (insert graph))
- (unless align
- (insert (propertize hash 'font-lock-face 'magit-hash) ?\s))
- (when (and refs (not magit-log-show-refname-after-summary))
- (insert (magit-format-ref-labels refs) ?\s))
- (when (eq style 'reflog)
- (insert (format "%-2s " (1- magit-log-count)))
- (when refsub
- (insert (magit-reflog-format-subject
- (substring refsub 0 (if (string-match-p ":" refsub) -2 -1))))))
- (when msg
- (when gpg
- (setq msg (propertize msg 'font-lock-face
- (pcase (aref gpg 0)
- (?G 'magit-signature-good)
- (?B 'magit-signature-bad)
- (?U 'magit-signature-untrusted)
- (?X 'magit-signature-expired)
- (?Y 'magit-signature-expired-key)
- (?R 'magit-signature-revoked)
- (?E 'magit-signature-error)))))
- (insert (funcall magit-log-format-message-function hash msg)))
- (when (and refs magit-log-show-refname-after-summary)
- (insert ?\s)
- (insert (magit-format-ref-labels refs)))
- (insert ?\n)
- (when (memq style '(log reflog stash))
- (goto-char (line-beginning-position))
- (when (and refsub
- (string-match "\\`\\([^ ]\\) \\+\\(..\\)\\(..\\)" date))
- (setq date (+ (string-to-number (match-string 1 date))
- (* (string-to-number (match-string 2 date)) 60 60)
- (* (string-to-number (match-string 3 date)) 60))))
- (save-excursion
- (backward-char)
- (magit-log-format-margin hash author date)))
- (when (and (eq style 'cherry)
- (magit-buffer-margin-p))
- (save-excursion
- (backward-char)
- (apply #'magit-log-format-margin hash
- (split-string (magit-rev-format "%aN%x00%ct" hash) "\0"))))
- (when (and graph
- (not (eobp))
- (not (looking-at non-graph-re)))
- (when (looking-at "")
- (magit-insert-heading)
- (delete-char 1)
- (magit-insert-section (commit-header)
- (forward-line)
- (magit-insert-heading)
- (re-search-forward "")
- (backward-delete-char 1)
- (forward-char)
- (insert ?\n))
- (delete-char 1))
- (if (looking-at "^\\(---\\|\n\s\\|\ndiff\\)")
- (let ((limit (save-excursion
- (and (re-search-forward non-graph-re nil t)
- (match-beginning 0)))))
- (unless (oref magit-insert-section--current content)
- (magit-insert-heading))
- (delete-char (if (looking-at "\n") 1 4))
- (magit-diff-wash-diffs (list "--stat") limit))
- (when align
- (setq align (make-string (1+ abbrev) ? )))
- (when (and (not (eobp)) (not (looking-at non-graph-re)))
- (when align
- (setq align (make-string (1+ abbrev) ? )))
- (while (and (not (eobp)) (not (looking-at non-graph-re)))
- (when align
- (save-excursion (insert align)))
- (magit-make-margin-overlay)
- (forward-line))
- ;; When `--format' is used and its value isn't one of the
- ;; predefined formats, then `git-log' does not insert a
- ;; separator line.
- (save-excursion
- (forward-line -1)
- (looking-at "[-_/|\\*o<>. ]*"))
- (setq graph (match-string 0))
- (unless (string-match-p "[/\\.]" graph)
- (insert graph ?\n))))))))
- t)
-
-(defun magit-log-propertize-keywords (_rev msg)
- (let ((boundary 0))
- (when (string-match "^\\(?:squash\\|fixup\\)! " msg boundary)
- (setq boundary (match-end 0))
- (magit--put-face (match-beginning 0) (1- boundary)
- 'magit-keyword-squash msg))
- (when magit-log-highlight-keywords
- (while (string-match "\\[[^[]*?]" msg boundary)
- (setq boundary (match-end 0))
- (magit--put-face (match-beginning 0) boundary
- 'magit-keyword msg))))
- msg)
-
-(defun magit-log-maybe-show-more-commits (section)
- "When point is at the end of a log buffer, insert more commits.
-
-Log buffers end with a button \"Type + to show more history\".
-When the use of a section movement command puts point on that
-button, then automatically show more commits, without the user
-having to press \"+\".
-
-This function is called by `magit-section-movement-hook' and
-exists mostly for backward compatibility reasons."
- (when (and (eq (oref section type) 'longer)
- magit-log-auto-more)
- (magit-log-double-commit-limit)
- (forward-line -1)
- (magit-section-forward)))
-
-(add-hook 'magit-section-movement-hook #'magit-log-maybe-show-more-commits)
-
-(defvar magit--update-revision-buffer nil)
-
-(defun magit-log-maybe-update-revision-buffer (&optional _)
- "When moving in a log or cherry buffer, update the revision buffer.
-If there is no revision buffer in the same frame, then do nothing."
- (when (derived-mode-p 'magit-log-mode 'magit-cherry-mode 'magit-reflog-mode)
- (magit--maybe-update-revision-buffer)))
-
-(add-hook 'magit-section-movement-hook #'magit-log-maybe-update-revision-buffer)
-
-(defun magit--maybe-update-revision-buffer ()
- (when-let ((commit (magit-section-value-if 'commit))
- (buffer (magit-get-mode-buffer 'magit-revision-mode nil t)))
- (if magit--update-revision-buffer
- (setq magit--update-revision-buffer (list commit buffer))
- (setq magit--update-revision-buffer (list commit buffer))
- (run-with-idle-timer
- magit-update-other-window-delay nil
- (let ((args (with-current-buffer buffer
- (let ((magit-direct-use-buffer-arguments 'selected))
- (magit-show-commit--arguments)))))
- (lambda ()
- (pcase-let ((`(,rev ,buf) magit--update-revision-buffer))
- (setq magit--update-revision-buffer nil)
- (when (buffer-live-p buf)
- (let ((magit-display-buffer-noselect t))
- (apply #'magit-show-commit rev args))))
- (setq magit--update-revision-buffer nil)))))))
-
-(defvar magit--update-blob-buffer nil)
-
-(defun magit-log-maybe-update-blob-buffer (&optional _)
- "When moving in a log or cherry buffer, update the blob buffer.
-If there is no blob buffer in the same frame, then do nothing."
- (when (derived-mode-p 'magit-log-mode 'magit-cherry-mode 'magit-reflog-mode)
- (magit--maybe-update-blob-buffer)))
-
-(defun magit--maybe-update-blob-buffer ()
- (when-let ((commit (magit-section-value-if 'commit))
- (buffer (--first (with-current-buffer it
- (eq revert-buffer-function
- 'magit-revert-rev-file-buffer))
- (mapcar #'window-buffer (window-list)))))
- (if magit--update-blob-buffer
- (setq magit--update-blob-buffer (list commit buffer))
- (setq magit--update-blob-buffer (list commit buffer))
- (run-with-idle-timer
- magit-update-other-window-delay nil
- (lambda ()
- (pcase-let ((`(,rev ,buf) magit--update-blob-buffer))
- (setq magit--update-blob-buffer nil)
- (when (buffer-live-p buf)
- (with-selected-window (get-buffer-window buf)
- (with-current-buffer buf
- (save-excursion
- (magit-blob-visit (list (magit-rev-parse rev)
- (magit-file-relative-name
- magit-buffer-file-name))
- (line-number-at-pos))))))))))))
-
-(defun magit-log-goto-commit-section (rev)
- (let ((abbrev (magit-rev-format "%h" rev)))
- (when-let ((section (--first (equal (oref it value) abbrev)
- (oref magit-root-section children))))
- (goto-char (oref section start)))))
-
-(defun magit-log-goto-same-commit ()
- (when (and magit-previous-section
- (magit-section-match '(commit branch)
- magit-previous-section))
- (magit-log-goto-commit-section (oref magit-previous-section value))))
-
-;;; Log Margin
-
-(defvar-local magit-log-margin-show-shortstat nil)
-
-(defun magit-toggle-log-margin-style ()
- "Toggle between the regular and the shortstat margin style.
-The shortstat style is experimental and rather slow."
- (interactive)
- (setq magit-log-margin-show-shortstat
- (not magit-log-margin-show-shortstat))
- (magit-set-buffer-margin nil t))
-
-(defun magit-log-format-margin (rev author date)
- (when (magit-margin-option)
- (if magit-log-margin-show-shortstat
- (magit-log-format-shortstat-margin rev)
- (magit-log-format-author-margin author date))))
-
-(defun magit-log-format-author-margin (author date &optional previous-line)
- (pcase-let ((`(,_ ,style ,width ,details ,details-width)
- (or magit-buffer-margin
- (symbol-value (magit-margin-option)))))
- (magit-make-margin-overlay
- (concat (and details
- (concat (magit--propertize-face
- (truncate-string-to-width
- (or author "")
- details-width
- nil ?\s (make-string 1 magit-ellipsis))
- 'magit-log-author)
- " "))
- (magit--propertize-face
- (if (stringp style)
- (format-time-string
- style
- (seconds-to-time (string-to-number date)))
- (pcase-let* ((abbr (eq style 'age-abbreviated))
- (`(,cnt ,unit) (magit--age date abbr)))
- (format (format (if abbr "%%2i%%-%ic" "%%2i %%-%is")
- (- width (if details (1+ details-width) 0)))
- cnt unit)))
- 'magit-log-date))
- previous-line)))
-
-(defun magit-log-format-shortstat-margin (rev)
- (magit-make-margin-overlay
- (if-let ((line (and rev (magit-git-string
- "show" "--format=" "--shortstat" rev))))
- (if (string-match "\
-\\([0-9]+\\) files? changed, \
-\\(?:\\([0-9]+\\) insertions?(\\+)\\)?\
-\\(?:\\(?:, \\)?\\([0-9]+\\) deletions?(-)\\)?\\'" line)
- (magit-bind-match-strings (files add del) line
- (format
- "%5s %5s%4s"
- (if add
- (magit--propertize-face (format "%s+" add)
- 'magit-diffstat-added)
- "")
- (if del
- (magit--propertize-face (format "%s-" del)
- 'magit-diffstat-removed)
- "")
- files))
- "")
- "")))
-
-(defun magit-log-margin-width (style details details-width)
- (if magit-log-margin-show-shortstat
- 16
- (+ (if details (1+ details-width) 0)
- (if (stringp style)
- (length (format-time-string style))
- (+ 2 ; two digits
- 1 ; trailing space
- (if (eq style 'age-abbreviated)
- 1 ; single character
- (+ 1 ; gap after digits
- (apply #'max (--map (max (length (nth 1 it))
- (length (nth 2 it)))
- magit--age-spec)))))))))
-
-;;; Select Mode
-
-(defvar magit-log-select-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-log-mode-map)
- (define-key map "\C-c\C-b" 'undefined)
- (define-key map "\C-c\C-f" 'undefined)
- (define-key map "." 'magit-log-select-pick)
- (define-key map "e" 'magit-log-select-pick)
- (define-key map "\C-c\C-c" 'magit-log-select-pick)
- (define-key map "q" 'magit-log-select-quit)
- (define-key map "\C-c\C-k" 'magit-log-select-quit)
- map)
- "Keymap for `magit-log-select-mode'.")
-
-(put 'magit-log-select-pick :advertised-binding [?\C-c ?\C-c])
-(put 'magit-log-select-quit :advertised-binding [?\C-c ?\C-k])
-
-(define-derived-mode magit-log-select-mode magit-log-mode "Magit Select"
- "Mode for selecting a commit from history.
-
-This mode is documented in info node `(magit)Select from Log'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \
-to visit the commit at point.
-
-\\<magit-log-select-mode-map>\
-Type \\[magit-log-select-pick] to select the commit at point.
-Type \\[magit-log-select-quit] to abort without selecting a commit."
- :group 'magit-log
- (hack-dir-local-variables-non-file-buffer))
-
-(put 'magit-log-select-mode 'magit-log-default-arguments
- '("--graph" "-n256" "--decorate"))
-
-(defun magit-log-select-setup-buffer (revs args)
- (magit-setup-buffer #'magit-log-select-mode nil
- (magit-buffer-revisions revs)
- (magit-buffer-log-args args)))
-
-(defun magit-log-select-refresh-buffer ()
- (magit-insert-section (logbuf)
- (magit-insert-log magit-buffer-revisions
- magit-buffer-log-args)))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-log-select-mode))
- magit-buffer-revisions)
-
-(defvar-local magit-log-select-pick-function nil)
-(defvar-local magit-log-select-quit-function nil)
-
-(defun magit-log-select (pick &optional msg quit branch args initial)
- (declare (indent defun))
- (unless initial
- (setq initial (magit-commit-at-point)))
- (magit-log-select-setup-buffer
- (or branch (magit-get-current-branch) "HEAD")
- (append args
- (car (magit-log--get-value 'magit-log-select-mode
- magit-direct-use-buffer-arguments))))
- (when initial
- (magit-log-goto-commit-section initial))
- (setq magit-log-select-pick-function pick)
- (setq magit-log-select-quit-function quit)
- (when magit-log-select-show-usage
- (let ((pick (propertize (substitute-command-keys
- "\\[magit-log-select-pick]")
- 'font-lock-face
- 'magit-header-line-key))
- (quit (propertize (substitute-command-keys
- "\\[magit-log-select-quit]")
- 'font-lock-face
- 'magit-header-line-key)))
- (setq msg (format-spec
- (if msg
- (if (string-suffix-p "," msg)
- (concat msg " or %q to abort")
- msg)
- "Type %p to select commit at point, or %q to abort")
- `((?p . ,pick)
- (?q . ,quit)))))
- (magit--add-face-text-property
- 0 (length msg) 'magit-header-line-log-select t msg)
- (when (memq magit-log-select-show-usage '(both header-line))
- (magit-set-header-line-format msg))
- (when (memq magit-log-select-show-usage '(both echo-area))
- (message "%s" (substring-no-properties msg)))))
-
-(defun magit-log-select-pick ()
- "Select the commit at point and act on it.
-Call `magit-log-select-pick-function' with the selected
-commit as argument."
- (interactive)
- (let ((fun magit-log-select-pick-function)
- (rev (magit-commit-at-point)))
- (magit-mode-bury-buffer 'kill)
- (funcall fun rev)))
-
-(defun magit-log-select-quit ()
- "Abort selecting a commit, don't act on any commit."
- (interactive)
- (magit-mode-bury-buffer 'kill)
- (when magit-log-select-quit-function
- (funcall magit-log-select-quit-function)))
-
-;;; Cherry Mode
-
-(defvar magit-cherry-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-mode-map)
- (define-key map "q" 'magit-log-bury-buffer)
- (define-key map "L" 'magit-margin-settings)
- map)
- "Keymap for `magit-cherry-mode'.")
-
-(define-derived-mode magit-cherry-mode magit-mode "Magit Cherry"
- "Mode for looking at commits not merged upstream.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \
-to visit the commit at point.
-
-Type \\[magit-cherry-pick] to apply the commit at point.
-
-\\{magit-cherry-mode-map}"
- :group 'magit-log
- (hack-dir-local-variables-non-file-buffer)
- (setq imenu-create-index-function
- 'magit-imenu--cherry-create-index-function))
-
-(defun magit-cherry-setup-buffer (head upstream)
- (magit-setup-buffer #'magit-cherry-mode nil
- (magit-buffer-refname head)
- (magit-buffer-upstream upstream)
- (magit-buffer-range (concat upstream ".." head))))
-
-(defun magit-cherry-refresh-buffer ()
- (magit-insert-section (cherry)
- (magit-run-section-hook 'magit-cherry-sections-hook)))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-cherry-mode))
- magit-buffer-range)
-
-;;;###autoload
-(defun magit-cherry (head upstream)
- "Show commits in a branch that are not merged in the upstream branch."
- (interactive
- (let ((head (magit-read-branch "Cherry head")))
- (list head (magit-read-other-branch "Cherry upstream" head
- (magit-get-upstream-branch head)))))
- (require 'magit)
- (magit-cherry-setup-buffer head upstream))
-
-(defun magit-insert-cherry-headers ()
- "Insert headers appropriate for `magit-cherry-mode' buffers."
- (let ((branch (propertize magit-buffer-refname
- 'font-lock-face 'magit-branch-local))
- (upstream (propertize magit-buffer-upstream 'font-lock-face
- (if (magit-local-branch-p magit-buffer-upstream)
- 'magit-branch-local
- 'magit-branch-remote))))
- (magit-insert-head-branch-header branch)
- (magit-insert-upstream-branch-header branch upstream "Upstream: ")
- (insert ?\n)))
-
-(defun magit-insert-cherry-commits ()
- "Insert commit sections into a `magit-cherry-mode' buffer."
- (magit-insert-section (cherries)
- (magit-insert-heading "Cherry commits:")
- (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry)
- "cherry" "-v" "--abbrev"
- magit-buffer-upstream
- magit-buffer-refname)))
-
-;;; Log Sections
-;;;; Standard Log Sections
-
-(defvar magit-unpulled-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-diff-dwim)
- map)
- "Keymap for `unpulled' sections.")
-
-(magit-define-section-jumper magit-jump-to-unpulled-from-upstream
- "Unpulled from @{upstream}" unpulled "..@{upstream}")
-
-(defun magit-insert-unpulled-from-upstream ()
- "Insert commits that haven't been pulled from the upstream yet."
- (when-let ((upstream (magit-get-upstream-branch)))
- (magit-insert-section (unpulled "..@{upstream}" t)
- (magit-insert-heading
- (format (propertize "Unpulled from %s."
- 'font-lock-face 'magit-section-heading)
- upstream))
- (magit-insert-log "..@{upstream}" magit-buffer-log-args)
- (magit-log-insert-child-count))))
-
-(magit-define-section-jumper magit-jump-to-unpulled-from-pushremote
- "Unpulled from <push-remote>" unpulled
- (concat ".." (magit-get-push-branch)))
-
-(defun magit-insert-unpulled-from-pushremote ()
- "Insert commits that haven't been pulled from the push-remote yet."
- (--when-let (magit-get-push-branch)
- (unless (and (equal (magit-rev-name it)
- (magit-rev-name "@{upstream}"))
- (or (memq 'magit-insert-unpulled-from-upstream
- magit-status-sections-hook)
- (memq 'magit-insert-unpulled-from-upstream-or-recent
- magit-status-sections-hook)))
- (magit-insert-section (unpulled (concat ".." it) t)
- (magit-insert-heading
- (format (propertize "Unpulled from %s."
- 'font-lock-face 'magit-section-heading)
- (propertize it 'font-lock-face 'magit-branch-remote)))
- (magit-insert-log (concat ".." it) magit-buffer-log-args)
- (magit-log-insert-child-count)))))
-
-(defvar magit-unpushed-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-diff-dwim)
- map)
- "Keymap for `unpushed' sections.")
-
-(magit-define-section-jumper magit-jump-to-unpushed-to-upstream
- "Unpushed to @{upstream}" unpushed "@{upstream}..")
-
-(defun magit-insert-unpushed-to-upstream-or-recent ()
- "Insert section showing unpushed or other recent commits.
-If an upstream is configured for the current branch and it is
-behind of the current branch, then show the commits that have
-not yet been pushed into the upstream branch. If no upstream is
-configured or if the upstream is not behind of the current branch,
-then show the last `magit-log-section-commit-count' commits."
- (let ((upstream (magit-get-upstream-branch)))
- (if (or (not upstream)
- (magit-rev-ancestor-p "HEAD" upstream))
- (magit-insert-recent-commits 'unpushed "@{upstream}..")
- (magit-insert-unpushed-to-upstream))))
-
-(defun magit-insert-unpushed-to-upstream ()
- "Insert commits that haven't been pushed to the upstream yet."
- (when (magit-git-success "rev-parse" "@{upstream}")
- (magit-insert-section (unpushed "@{upstream}..")
- (magit-insert-heading
- (format (propertize "Unmerged into %s."
- 'font-lock-face 'magit-section-heading)
- (magit-get-upstream-branch)))
- (magit-insert-log "@{upstream}.." magit-buffer-log-args)
- (magit-log-insert-child-count))))
-
-(defun magit-insert-recent-commits (&optional type value)
- "Insert section showing recent commits.
-Show the last `magit-log-section-commit-count' commits."
- (let* ((start (format "HEAD~%s" magit-log-section-commit-count))
- (range (and (magit-rev-verify start)
- (concat start "..HEAD"))))
- (magit-insert-section ((eval (or type 'recent))
- (or value range)
- t)
- (magit-insert-heading "Recent commits")
- (magit-insert-log range
- (cons (format "-n%d" magit-log-section-commit-count)
- (--remove (string-prefix-p "-n" it)
- magit-buffer-log-args))))))
-
-(magit-define-section-jumper magit-jump-to-unpushed-to-pushremote
- "Unpushed to <push-remote>" unpushed
- (concat (magit-get-push-branch) ".."))
-
-(defun magit-insert-unpushed-to-pushremote ()
- "Insert commits that haven't been pushed to the push-remote yet."
- (--when-let (magit-get-push-branch)
- (unless (and (equal (magit-rev-name it)
- (magit-rev-name "@{upstream}"))
- (or (memq 'magit-insert-unpushed-to-upstream
- magit-status-sections-hook)
- (memq 'magit-insert-unpushed-to-upstream-or-recent
- magit-status-sections-hook)))
- (magit-insert-section (unpushed (concat it "..") t)
- (magit-insert-heading
- (format (propertize "Unpushed to %s."
- 'font-lock-face 'magit-section-heading)
- (propertize it 'font-lock-face 'magit-branch-remote)))
- (magit-insert-log (concat it "..") magit-buffer-log-args)
- (magit-log-insert-child-count)))))
-
-(defun magit-log-insert-child-count ()
- (when magit-section-show-child-count
- (let ((count (length (oref magit-insert-section--current children))))
- (when (> count 0)
- (when (= count (magit-log-get-commit-limit))
- (setq count (format "%s+" count)))
- (save-excursion
- (goto-char (- (oref magit-insert-section--current content) 2))
- (insert (format " (%s)" count))
- (delete-char 1))))))
-
-;;;; Auxiliary Log Sections
-
-(defun magit-insert-unpulled-cherries ()
- "Insert section showing unpulled commits.
-Like `magit-insert-unpulled-from-upstream' but prefix each commit
-which has not been applied yet (i.e. a commit with a patch-id
-not shared with any local commit) with \"+\", and all others with
-\"-\"."
- (when (magit-git-success "rev-parse" "@{upstream}")
- (magit-insert-section (unpulled "..@{upstream}")
- (magit-insert-heading "Unpulled commits:")
- (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry)
- "cherry" "-v" (magit-abbrev-arg)
- (magit-get-current-branch) "@{upstream}"))))
-
-(defun magit-insert-unpushed-cherries ()
- "Insert section showing unpushed commits.
-Like `magit-insert-unpushed-to-upstream' but prefix each commit
-which has not been applied to upstream yet (i.e. a commit with
-a patch-id not shared with any upstream commit) with \"+\", and
-all others with \"-\"."
- (when (magit-git-success "rev-parse" "@{upstream}")
- (magit-insert-section (unpushed "@{upstream}..")
- (magit-insert-heading "Unpushed commits:")
- (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry)
- "cherry" "-v" (magit-abbrev-arg) "@{upstream}"))))
-
-;;; _
-(provide 'magit-log)
-;;; magit-log.el ends here
diff --git a/elpa/magit-20200728.45/magit-margin.el b/elpa/magit-20200728.45/magit-margin.el
deleted file mode 100644
index bd411b7..0000000
--- a/elpa/magit-20200728.45/magit-margin.el
+++ /dev/null
@@ -1,241 +0,0 @@
-;;; magit-margin.el --- margins in Magit buffers -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for showing additional information
-;; in the margins of Magit buffers. Currently this is only used for
-;; commits, for which the committer date or age, and optionally the
-;; author name are shown.
-
-;;; Code:
-
-(require 'dash)
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit-section)
-(require 'magit-transient)
-(require 'magit-mode)
-
-(defgroup magit-margin nil
- "Information Magit displays in the margin.
-
-You can change the STYLE and AUTHOR-WIDTH of all `magit-*-margin'
-options to the same values by customizing `magit-log-margin'
-*before* `magit' is loaded. If you do that, then the respective
-values for the other options will default to what you have set
-for that variable. Likewise if you set `magit-log-margin's INIT
-to nil, then that is used in the default of all other options. But
-setting it to t, i.e. re-enforcing the default for that option,
-does not carry to other options."
- :link '(info-link "(magit)Log Margin")
- :group 'magit-log)
-
-(defvar-local magit-buffer-margin nil)
-(put 'magit-buffer-margin 'permanent-local t)
-
-(defvar-local magit-set-buffer-margin-refresh nil)
-
-(defvar magit--age-spec)
-
-;;; Commands
-
-(transient-define-prefix magit-margin-settings ()
- "Change what information is displayed in the margin."
- :info-manual "(magit) Log Margin"
- ["Margin"
- ("L" "Toggle visibility" magit-toggle-margin)
- ("l" "Cycle style" magit-cycle-margin-style)
- ("d" "Toggle details" magit-toggle-margin-details)
- ("v" "Change verbosity" magit-refs-set-show-commit-count
- :if-derived magit-refs-mode)])
-
-(defun magit-toggle-margin ()
- "Show or hide the Magit margin."
- (interactive)
- (unless (magit-margin-option)
- (user-error "Magit margin isn't supported in this buffer"))
- (setcar magit-buffer-margin (not (magit-buffer-margin-p)))
- (magit-set-buffer-margin))
-
-(defun magit-cycle-margin-style ()
- "Cycle style used for the Magit margin."
- (interactive)
- (unless (magit-margin-option)
- (user-error "Magit margin isn't supported in this buffer"))
- ;; This is only suitable for commit margins (there are not others).
- (setf (cadr magit-buffer-margin)
- (pcase (cadr magit-buffer-margin)
- (`age 'age-abbreviated)
- (`age-abbreviated
- (let ((default (cadr (symbol-value (magit-margin-option)))))
- (if (stringp default) default "%Y-%m-%d %H:%M ")))
- (_ 'age)))
- (magit-set-buffer-margin nil t))
-
-(defun magit-toggle-margin-details ()
- "Show or hide details in the Magit margin."
- (interactive)
- (unless (magit-margin-option)
- (user-error "Magit margin isn't supported in this buffer"))
- (setf (nth 3 magit-buffer-margin)
- (not (nth 3 magit-buffer-margin)))
- (magit-set-buffer-margin nil t))
-
-;;; Core
-
-(defun magit-buffer-margin-p ()
- (car magit-buffer-margin))
-
-(defun magit-margin-option ()
- (pcase major-mode
- (`magit-cherry-mode 'magit-cherry-margin)
- (`magit-log-mode 'magit-log-margin)
- (`magit-log-select-mode 'magit-log-select-margin)
- (`magit-reflog-mode 'magit-reflog-margin)
- (`magit-refs-mode 'magit-refs-margin)
- (`magit-stashes-mode 'magit-stashes-margin)
- (`magit-status-mode 'magit-status-margin)
- (`forge-notifications-mode 'magit-status-margin)))
-
-(defun magit-set-buffer-margin (&optional reset refresh)
- (when-let ((option (magit-margin-option)))
- (let* ((default (symbol-value option))
- (default-width (nth 2 default)))
- (when (or reset (not magit-buffer-margin))
- (setq magit-buffer-margin (copy-sequence default)))
- (pcase-let ((`(,enable ,style ,_width ,details ,details-width)
- magit-buffer-margin))
- (when (functionp default-width)
- (setf (nth 2 magit-buffer-margin)
- (funcall default-width style details details-width)))
- (dolist (window (get-buffer-window-list nil nil 0))
- (with-selected-window window
- (magit-set-window-margin window)
- (if enable
- (add-hook 'window-configuration-change-hook
- 'magit-set-window-margin nil t)
- (remove-hook 'window-configuration-change-hook
- 'magit-set-window-margin t))))
- (when (and enable (or refresh magit-set-buffer-margin-refresh))
- (magit-refresh-buffer))))))
-
-(defun magit-set-window-margin (&optional window)
- (when (or window (setq window (get-buffer-window)))
- (with-selected-window window
- (set-window-margins
- nil (car (window-margins))
- (and (magit-buffer-margin-p)
- (nth 2 magit-buffer-margin))))))
-
-(defun magit-make-margin-overlay (&optional string previous-line)
- (if previous-line
- (save-excursion
- (forward-line -1)
- (magit-make-margin-overlay string))
- ;; Don't put the overlay on the complete line to work around #1880.
- (let ((o (make-overlay (1+ (line-beginning-position))
- (line-end-position)
- nil t)))
- (overlay-put o 'evaporate t)
- (overlay-put o 'before-string
- (propertize "o" 'display
- (list (list 'margin 'right-margin)
- (or string " ")))))))
-
-(defun magit-maybe-make-margin-overlay ()
- (when (or (magit-section-match
- '(unpulled unpushed recent stashes local cherries)
- magit-insert-section--current)
- (and (eq major-mode 'magit-refs-mode)
- (magit-section-match
- '(remote commit tags)
- magit-insert-section--current)))
- (magit-make-margin-overlay nil t)))
-
-;;; Custom Support
-
-(defun magit-margin-set-variable (mode symbol value)
- (set-default symbol value)
- (message "Updating margins in %s buffers..." mode)
- (dolist (buffer (buffer-list))
- (with-current-buffer buffer
- (when (eq major-mode mode)
- (magit-set-buffer-margin t)
- (magit-refresh))))
- (message "Updating margins in %s buffers...done" mode))
-
-(defconst magit-log-margin--custom-type
- '(list (boolean :tag "Show margin initially")
- (choice :tag "Show committer"
- (string :tag "date using time-format" "%Y-%m-%d %H:%M ")
- (const :tag "date's age" age)
- (const :tag "date's age (abbreviated)" age-abbreviated))
- (const :tag "Calculate width using magit-log-margin-width"
- magit-log-margin-width)
- (boolean :tag "Show author name by default")
- (integer :tag "Show author name using width")))
-
-;;; Time Utilities
-
-(defvar magit--age-spec
- `((?Y "year" "years" ,(round (* 60 60 24 365.2425)))
- (?M "month" "months" ,(round (* 60 60 24 30.436875)))
- (?w "week" "weeks" ,(* 60 60 24 7))
- (?d "day" "days" ,(* 60 60 24))
- (?h "hour" "hours" ,(* 60 60))
- (?m "minute" "minutes" 60)
- (?s "second" "seconds" 1))
- "Time units used when formatting relative commit ages.
-
-The value is a list of time units, beginning with the longest.
-Each element has the form (CHAR UNIT UNITS SECONDS). UNIT is the
-time unit, UNITS is the plural of that unit. CHAR is a character
-abbreviation. And SECONDS is the number of seconds in one UNIT.
-
-This is defined as a variable to make it possible to use time
-units for a language other than English. It is not defined
-as an option, because most other parts of Magit are always in
-English.")
-
-(defun magit--age (date &optional abbreviate)
- (cl-labels ((fn (age spec)
- (pcase-let ((`(,char ,unit ,units ,weight) (car spec)))
- (let ((cnt (round (/ age weight 1.0))))
- (if (or (not (cdr spec))
- (>= (/ age weight) 1))
- (list cnt (cond (abbreviate char)
- ((= cnt 1) unit)
- (t units)))
- (fn age (cdr spec)))))))
- (fn (abs (- (float-time)
- (if (stringp date)
- (string-to-number date)
- date)))
- magit--age-spec)))
-
-;;; _
-(provide 'magit-margin)
-;;; magit-margin.el ends here
diff --git a/elpa/magit-20200728.45/magit-merge.el b/elpa/magit-20200728.45/magit-merge.el
deleted file mode 100644
index 35d80bc..0000000
--- a/elpa/magit-20200728.45/magit-merge.el
+++ /dev/null
@@ -1,307 +0,0 @@
-;;; magit-merge.el --- merge functionality -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements merge commands.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-(require 'magit-diff)
-
-(declare-function magit-git-push "magit-push" (branch target args))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-merge "magit" nil t)
-(transient-define-prefix magit-merge ()
- "Merge branches."
- :man-page "git-merge"
- :incompatible '(("--ff-only" "--no-ff"))
- ["Arguments"
- :if-not magit-merge-in-progress-p
- ("-f" "Fast-forward only" "--ff-only")
- ("-n" "No fast-forward" "--no-ff")
- (magit-merge:--strategy)
- (5 magit-diff:--diff-algorithm :argument "--Xdiff-algorithm=")
- (5 magit:--gpg-sign)]
- ["Actions"
- :if-not magit-merge-in-progress-p
- [("m" "Merge" magit-merge-plain)
- ("e" "Merge and edit message" magit-merge-editmsg)
- ("n" "Merge but don't commit" magit-merge-nocommit)
- ("a" "Absorb" magit-merge-absorb)]
- [("p" "Preview merge" magit-merge-preview)
- ""
- ("s" "Squash merge" magit-merge-squash)
- ("i" "Merge into" magit-merge-into)]]
- ["Actions"
- :if magit-merge-in-progress-p
- ("m" "Commit merge" magit-commit-create)
- ("a" "Abort merge" magit-merge-abort)])
-
-(defun magit-merge-arguments ()
- (transient-args 'magit-merge))
-
-(transient-define-argument magit-merge:--strategy ()
- :description "Strategy"
- :class 'transient-option
- ;; key for merge and rebase: "-s"
- ;; key for cherry-pick and revert: "=s"
- ;; shortarg for merge and rebase: "-s"
- ;; shortarg for cherry-pick and revert: none
- :key "-s"
- :argument "--strategy="
- :choices '("resolve" "recursive" "octopus" "ours" "subtree"))
-
-;;;###autoload
-(defun magit-merge-plain (rev &optional args nocommit)
- "Merge commit REV into the current branch; using default message.
-
-Unless there are conflicts or a prefix argument is used create a
-merge commit using a generic commit message and without letting
-the user inspect the result. With a prefix argument pretend the
-merge failed to give the user the opportunity to inspect the
-merge.
-
-\(git merge --no-edit|--no-commit [ARGS] REV)"
- (interactive (list (magit-read-other-branch-or-commit "Merge")
- (magit-merge-arguments)
- current-prefix-arg))
- (magit-merge-assert)
- (magit-run-git-async "merge" (if nocommit "--no-commit" "--no-edit") args rev))
-
-;;;###autoload
-(defun magit-merge-editmsg (rev &optional args)
- "Merge commit REV into the current branch; and edit message.
-Perform the merge and prepare a commit message but let the user
-edit it.
-\n(git merge --edit --no-ff [ARGS] REV)"
- (interactive (list (magit-read-other-branch-or-commit "Merge")
- (magit-merge-arguments)))
- (magit-merge-assert)
- (cl-pushnew "--no-ff" args :test #'equal)
- (apply #'magit-run-git-with-editor "merge" "--edit"
- (append (delete "--ff-only" args)
- (list rev))))
-
-;;;###autoload
-(defun magit-merge-nocommit (rev &optional args)
- "Merge commit REV into the current branch; pretending it failed.
-Pretend the merge failed to give the user the opportunity to
-inspect the merge and change the commit message.
-\n(git merge --no-commit --no-ff [ARGS] REV)"
- (interactive (list (magit-read-other-branch-or-commit "Merge")
- (magit-merge-arguments)))
- (magit-merge-assert)
- (cl-pushnew "--no-ff" args :test #'equal)
- (magit-run-git-async "merge" "--no-commit" args rev))
-
-;;;###autoload
-(defun magit-merge-into (branch &optional args)
- "Merge the current branch into BRANCH and remove the former.
-
-Before merging, force push the source branch to its push-remote,
-provided the respective remote branch already exists, ensuring
-that the respective pull-request (if any) won't get stuck on some
-obsolete version of the commits that are being merged. Finally
-if `forge-branch-pullreq' was used to create the merged branch,
-branch, then also remove the respective remote branch."
- (interactive
- (list (magit-read-other-local-branch
- (format "Merge `%s' into"
- (or (magit-get-current-branch)
- (magit-rev-parse "HEAD")))
- nil
- (when-let ((upstream (magit-get-upstream-branch))
- (upstream (cdr (magit-split-branch-name upstream))))
- (and (magit-branch-p upstream) upstream)))
- (magit-merge-arguments)))
- (let ((current (magit-get-current-branch))
- (head (magit-rev-parse "HEAD")))
- (when (zerop (magit-call-git "checkout" branch))
- (if current
- (magit--merge-absorb current args)
- (magit-run-git-with-editor "merge" args head)))))
-
-;;;###autoload
-(defun magit-merge-absorb (branch &optional args)
- "Merge BRANCH into the current branch and remove the former.
-
-Before merging, force push the source branch to its push-remote,
-provided the respective remote branch already exists, ensuring
-that the respective pull-request (if any) won't get stuck on some
-obsolete version of the commits that are being merged. Finally
-if `forge-branch-pullreq' was used to create the merged branch,
-then also remove the respective remote branch."
- (interactive (list (magit-read-other-local-branch "Absorb branch")
- (magit-merge-arguments)))
- (magit--merge-absorb branch args))
-
-(defun magit--merge-absorb (branch args)
- (when (equal branch "master")
- (unless (yes-or-no-p
- "Do you really want to merge `master' into another branch? ")
- (user-error "Abort")))
- (if-let ((target (magit-get-push-branch branch t)))
- (progn
- (magit-git-push branch target (list "--force-with-lease"))
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (not (zerop (process-exit-status process)))
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (magit--merge-absorb-1 branch args))))))
- (magit--merge-absorb-1 branch args)))
-
-(defun magit--merge-absorb-1 (branch args)
- (if-let ((pr (magit-get "branch" branch "pullRequest")))
- (magit-run-git-async
- "merge" args "-m"
- (format "Merge branch '%s'%s [#%s]"
- branch
- (let ((current (magit-get-current-branch)))
- (if (equal current "master") "" (format " into %s" current)))
- pr)
- branch)
- (magit-run-git-async "merge" args "--no-edit" branch))
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (> (process-exit-status process) 0)
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (magit-branch-maybe-delete-pr-remote branch)
- (magit-branch-unset-pushRemote branch)
- (magit-run-git "branch" "-D" branch))))))
-
-;;;###autoload
-(defun magit-merge-squash (rev)
- "Squash commit REV into the current branch; don't create a commit.
-\n(git merge --squash REV)"
- (interactive (list (magit-read-other-branch-or-commit "Squash")))
- (magit-merge-assert)
- (magit-run-git-async "merge" "--squash" rev))
-
-;;;###autoload
-(defun magit-merge-preview (rev)
- "Preview result of merging REV into the current branch."
- (interactive (list (magit-read-other-branch-or-commit "Preview merge")))
- (magit-merge-preview-setup-buffer rev))
-
-;;;###autoload
-(defun magit-merge-abort ()
- "Abort the current merge operation.
-\n(git merge --abort)"
- (interactive)
- (unless (file-exists-p (magit-git-dir "MERGE_HEAD"))
- (user-error "No merge in progress"))
- (magit-confirm 'abort-merge)
- (magit-run-git-async "merge" "--abort"))
-
-(defun magit-checkout-stage (file arg)
- "During a conflict checkout and stage side, or restore conflict."
- (interactive
- (let ((file (magit-completing-read "Checkout file"
- (magit-tracked-files) nil nil nil
- 'magit-read-file-hist
- (magit-current-file))))
- (cond ((member file (magit-unmerged-files))
- (list file (magit-checkout-read-stage file)))
- ((yes-or-no-p (format "Restore conflicts in %s? " file))
- (list file "--merge"))
- (t
- (user-error "Quit")))))
- (pcase (cons arg (cddr (car (magit-file-status file))))
- ((or `("--ours" ?D ,_)
- `("--theirs" ,_ ?D))
- (magit-run-git "rm" "--" file))
- (_ (if (equal arg "--merge")
- ;; This fails if the file was deleted on one
- ;; side. And we cannot do anything about it.
- (magit-run-git "checkout" "--merge" "--" file)
- (magit-call-git "checkout" arg "--" file)
- (magit-run-git "add" "-u" "--" file)))))
-
-;;; Utilities
-
-(defun magit-merge-in-progress-p ()
- (file-exists-p (magit-git-dir "MERGE_HEAD")))
-
-(defun magit--merge-range (&optional head)
- (unless head
- (setq head (magit-get-shortname
- (car (magit-file-lines (magit-git-dir "MERGE_HEAD"))))))
- (and head
- (concat (magit-git-string "merge-base" "--octopus" "HEAD" head)
- ".." head)))
-
-(defun magit-merge-assert ()
- (or (not (magit-anything-modified-p t))
- (magit-confirm 'merge-dirty
- "Merging with dirty worktree is risky. Continue")))
-
-(defun magit-checkout-read-stage (file)
- (magit-read-char-case (format "For %s checkout: " file) t
- (?o "[o]ur stage" "--ours")
- (?t "[t]heir stage" "--theirs")
- (?c "[c]onflict" "--merge")))
-
-;;; Sections
-
-(defvar magit-unmerged-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-diff-dwim)
- map)
- "Keymap for `unmerged' sections.")
-
-(defun magit-insert-merge-log ()
- "Insert section for the on-going merge.
-Display the heads that are being merged.
-If no merge is in progress, do nothing."
- (when (magit-merge-in-progress-p)
- (let* ((heads (mapcar #'magit-get-shortname
- (magit-file-lines (magit-git-dir "MERGE_HEAD"))))
- (range (magit--merge-range (car heads))))
- (magit-insert-section (unmerged range)
- (magit-insert-heading
- (format "Merging %s:" (mapconcat #'identity heads ", ")))
- (magit-insert-log
- range
- (let ((args magit-buffer-log-args))
- (unless (member "--decorate=full" magit-buffer-log-args)
- (push "--decorate=full" args))
- args))))))
-
-;;; _
-(provide 'magit-merge)
-;;; magit-merge.el ends here
diff --git a/elpa/magit-20200728.45/magit-mode.el b/elpa/magit-20200728.45/magit-mode.el
deleted file mode 100644
index fbc1350..0000000
--- a/elpa/magit-20200728.45/magit-mode.el
+++ /dev/null
@@ -1,1431 +0,0 @@
-;;; magit-mode.el --- create and refresh Magit buffers -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements the abstract major-mode `magit-mode' from
-;; which almost all other Magit major-modes derive. The code in here
-;; is mostly concerned with creating and refreshing Magit buffers.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'transient)
-
-(require 'magit-section)
-(require 'magit-git)
-
-;; For `magit-display-buffer-fullcolumn-most-v1' from `git-commit'
-(defvar git-commit-mode)
-;; For `magit-refresh'
-(defvar magit-post-commit-hook-commands)
-(defvar magit-post-stage-hook-commands)
-(defvar magit-post-unstage-hook-commands)
-;; For `magit-refresh' and `magit-refresh-all'
-(declare-function magit-auto-revert-buffers "magit-autorevert" ())
-;; For `magit-refresh-buffer'
-(declare-function magit-process-unset-mode-line-error-status "magit-process" ())
-;; For `magit-refresh-get-relative-position'
-(declare-function magit-hunk-section-p "magit-diff" (obj))
-;; For `magit-mode-setup-internal'
-(declare-function magit-status-goto-initial-section "magit-status" ())
-;; For `magit-mode' from `bookmark'
-(defvar bookmark-make-record-function)
-
-(require 'format-spec)
-(require 'help-mode)
-
-;;; Options
-
-(defcustom magit-mode-hook
- '(magit-load-config-extensions)
- "Hook run when entering a mode derived from Magit mode."
- :package-version '(magit . "3.0.0")
- :group 'magit-modes
- :type 'hook
- :options '(magit-load-config-extensions
- bug-reference-mode))
-
-(defcustom magit-setup-buffer-hook
- '(magit-maybe-save-repository-buffers
- magit-set-buffer-margin)
- "Hook run by `magit-setup-buffer'.
-
-This is run right after displaying the buffer and right before
-generating or updating its content. `magit-mode-hook' and other,
-more specific, `magit-mode-*-hook's on the other hand are run
-right before displaying the buffer. Usually one of these hooks
-should be used instead of this one."
- :package-version '(magit . "2.3.0")
- :group 'magit-modes
- :type 'hook
- :options '(magit-maybe-save-repository-buffers
- magit-set-buffer-margin))
-
-(defcustom magit-pre-refresh-hook '(magit-maybe-save-repository-buffers)
- "Hook run before refreshing in `magit-refresh'.
-
-This hook, or `magit-post-refresh-hook', should be used
-for functions that are not tied to a particular buffer.
-
-To run a function with a particular buffer current, use
-`magit-refresh-buffer-hook' and use `derived-mode-p'
-inside your function."
- :package-version '(magit . "2.4.0")
- :group 'magit-refresh
- :type 'hook
- :options '(magit-maybe-save-repository-buffers))
-
-(defcustom magit-post-refresh-hook nil
- "Hook run after refreshing in `magit-refresh'.
-
-This hook, or `magit-pre-refresh-hook', should be used
-for functions that are not tied to a particular buffer.
-
-To run a function with a particular buffer current, use
-`magit-refresh-buffer-hook' and use `derived-mode-p'
-inside your function."
- :package-version '(magit . "2.4.0")
- :group 'magit-refresh
- :type 'hook)
-
-(defcustom magit-display-buffer-function 'magit-display-buffer-traditional
- "The function used display a Magit buffer.
-
-All Magit buffers (buffers whose major-modes derive from
-`magit-mode') are displayed using `magit-display-buffer',
-which in turn uses the function specified here."
- :package-version '(magit . "2.3.0")
- :group 'magit-buffers
- :type '(radio (function-item magit-display-buffer-traditional)
- (function-item magit-display-buffer-same-window-except-diff-v1)
- (function-item magit-display-buffer-fullframe-status-v1)
- (function-item magit-display-buffer-fullframe-status-topleft-v1)
- (function-item magit-display-buffer-fullcolumn-most-v1)
- (function-item display-buffer)
- (function :tag "Function")))
-
-(defcustom magit-pre-display-buffer-hook '(magit-save-window-configuration)
- "Hook run by `magit-display-buffer' before displaying the buffer."
- :package-version '(magit . "2.3.0")
- :group 'magit-buffers
- :type 'hook
- :get 'magit-hook-custom-get
- :options '(magit-save-window-configuration))
-
-(defcustom magit-post-display-buffer-hook '(magit-maybe-set-dedicated)
- "Hook run by `magit-display-buffer' after displaying the buffer."
- :package-version '(magit . "2.3.0")
- :group 'magit-buffers
- :type 'hook
- :get 'magit-hook-custom-get
- :options '(magit-maybe-set-dedicated))
-
-(defcustom magit-generate-buffer-name-function
- 'magit-generate-buffer-name-default-function
- "The function used to generate the name for a Magit buffer."
- :package-version '(magit . "2.3.0")
- :group 'magit-buffers
- :type '(radio (function-item magit-generate-buffer-name-default-function)
- (function :tag "Function")))
-
-(defcustom magit-buffer-name-format "%x%M%v: %t%x"
- "The format string used to name Magit buffers.
-
-The following %-sequences are supported:
-
-`%m' The name of the major-mode, but with the `-mode' suffix
- removed.
-
-`%M' Like \"%m\" but abbreviate `magit-status-mode' as `magit'.
-
-`%v' The value the buffer is locked to, in parentheses, or an
- empty string if the buffer is not locked to a value.
-
-`%V' Like \"%v\", but the string is prefixed with a space, unless
- it is an empty string.
-
-`%t' The top-level directory of the working tree of the
- repository, or if `magit-uniquify-buffer-names' is non-nil
- an abbreviation of that.
-
-`%x' If `magit-uniquify-buffer-names' is nil \"*\", otherwise the
- empty string. Due to limitations of the `uniquify' package,
- buffer names must end with the path.
-
-`%T' Obsolete, use \"%t%x\" instead. Like \"%t\", but append an
- asterisk if and only if `magit-uniquify-buffer-names' is nil.
-
-The value should always contain \"%m\" or \"%M\", \"%v\" or
-\"%V\", and \"%t\" (or the obsolete \"%T\").
-
-If `magit-uniquify-buffer-names' is non-nil, then the value must
-end with \"%t\" or \"%t%x\" (or the obsolete \"%T\"). See issue
-#2841.
-
-This is used by `magit-generate-buffer-name-default-function'.
-If another `magit-generate-buffer-name-function' is used, then
-it may not respect this option, or on the contrary it may
-support additional %-sequences."
- :package-version '(magit . "2.12.0")
- :group 'magit-buffers
- :type 'string)
-
-(defcustom magit-uniquify-buffer-names t
- "Whether to uniquify the names of Magit buffers."
- :package-version '(magit . "2.3.0")
- :group 'magit-buffers
- :type 'boolean)
-
-(defcustom magit-bury-buffer-function 'magit-restore-window-configuration
- "The function used to bury or kill the current Magit buffer."
- :package-version '(magit . "2.3.0")
- :group 'magit-buffers
- :type '(radio (function-item quit-window)
- (function-item magit-mode-quit-window)
- (function-item magit-restore-window-configuration)
- (function :tag "Function")))
-
-(defcustom magit-prefix-use-buffer-arguments 'selected
- "Whether certain prefix commands reuse arguments active in relevant buffer.
-
-This affects the transient prefix commands `magit-diff',
-`magit-log' and `magit-show-refs'.
-
-Valid values are:
-
-`always': Always use the set of arguments that is currently
- active in the respective buffer, provided that buffer exists
- of course.
-`selected': Use the set of arguments from the respective
- buffer, but only if it is displayed in a window of the current
- frame. This is the default.
-`current': Use the set of arguments from the respective buffer,
- but only if it is the current buffer.
-`never': Never use the set of arguments from the respective
- buffer.
-
-For more information see info node `(magit)Transient Arguments
-and Buffer Arguments'."
- :package-version '(magit . "3.0.0")
- :group 'magit-buffers
- :group 'magit-commands
- :type '(choice
- (const :tag "always use args from buffer" always)
- (const :tag "use args from buffer if displayed in frame" selected)
- (const :tag "use args from buffer if it is current" current)
- (const :tag "never use args from buffer" never)))
-
-(defcustom magit-direct-use-buffer-arguments 'selected
- "Whether certain commands reuse arguments active in relevant buffer.
-
-This affects certain commands such as `magit-show-commit' that
-are suffixes of the diff or log transient prefix commands, but
-only if they are invoked directly, i.e. *not* as a suffix.
-
-Valid values are:
-
-`always': Always use the set of arguments that is currently
- active in the respective buffer, provided that buffer exists
- of course.
-`selected': Use the set of arguments from the respective
- buffer, but only if it is displayed in a window of the current
- frame. This is the default.
-`current': Use the set of arguments from the respective buffer,
- but only if it is the current buffer.
-`never': Never use the set of arguments from the respective
- buffer.
-
-For more information see info node `(magit)Transient Arguments
-and Buffer Arguments'."
- :package-version '(magit . "3.0.0")
- :group 'magit-buffers
- :group 'magit-commands
- :type '(choice
- (const :tag "always use args from buffer" always)
- (const :tag "use args from buffer if displayed in frame" selected)
- (const :tag "use args from buffer if it is current" current)
- (const :tag "never use args from buffer" never)))
-
-(defcustom magit-region-highlight-hook '(magit-diff-update-hunk-region)
- "Functions used to highlight the region.
-
-Each function is run with the current section as only argument
-until one of them returns non-nil. If all functions return nil,
-then fall back to regular region highlighting."
- :package-version '(magit . "2.1.0")
- :group 'magit-refresh
- :type 'hook
- :options '(magit-diff-update-hunk-region))
-
-(defcustom magit-create-buffer-hook nil
- "Normal hook run after creating a new `magit-mode' buffer."
- :package-version '(magit . "2.90.0")
- :group 'magit-refresh
- :type 'hook)
-
-(defcustom magit-refresh-buffer-hook nil
- "Normal hook for `magit-refresh-buffer' to run after refreshing."
- :package-version '(magit . "2.1.0")
- :group 'magit-refresh
- :type 'hook)
-
-(defcustom magit-refresh-status-buffer t
- "Whether the status buffer is refreshed after running git.
-
-When this is non-nil, then the status buffer is automatically
-refreshed after running git for side-effects, in addition to the
-current Magit buffer, which is always refreshed automatically.
-
-Only set this to nil after exhausting all other options to
-improve performance."
- :package-version '(magit . "2.4.0")
- :group 'magit-refresh
- :group 'magit-status
- :type 'boolean)
-
-(defcustom magit-refresh-verbose nil
- "Whether to revert Magit buffers verbosely."
- :package-version '(magit . "2.1.0")
- :group 'magit-refresh
- :type 'boolean)
-
-(defcustom magit-save-repository-buffers t
- "Whether to save file-visiting buffers when appropriate.
-
-If non-nil, then all modified file-visiting buffers belonging
-to the current repository may be saved before running Magit
-commands and before creating or refreshing Magit buffers.
-If `dontask', then this is done without user intervention, for
-any other non-nil value the user has to confirm each save.
-
-The default is t to avoid surprises, but `dontask' is the
-recommended value."
- :group 'magit-essentials
- :group 'magit-buffers
- :type '(choice (const :tag "Never" nil)
- (const :tag "Ask" t)
- (const :tag "Save without asking" dontask)))
-
-;;; Key Bindings
-
-(defvar magit-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-section-mode-map)
- (define-key map [C-return] 'magit-visit-thing)
- (define-key map (kbd "C-m") 'magit-visit-thing)
- (define-key map (kbd "C-M-i") 'magit-dired-jump)
- (define-key map [M-tab] 'magit-section-cycle-diffs)
- (define-key map (kbd "P") 'magit-push)
- (define-key map (kbd "k") 'magit-delete-thing)
- (define-key map (kbd "K") 'magit-file-untrack)
- (define-key map (kbd "i") 'magit-gitignore)
- (define-key map (kbd "I") 'magit-gitignore)
- (define-key map (kbd "SPC") 'magit-diff-show-or-scroll-up)
- (define-key map (kbd "S-SPC") 'magit-diff-show-or-scroll-down)
- (define-key map (kbd "DEL") 'magit-diff-show-or-scroll-down)
- (define-key map "+" 'magit-diff-more-context)
- (define-key map "-" 'magit-diff-less-context)
- (define-key map "0" 'magit-diff-default-context)
- (define-key map "$" 'magit-process-buffer)
- (define-key map "%" 'magit-worktree)
- (define-key map "a" 'magit-cherry-apply)
- (define-key map "A" 'magit-cherry-pick)
- (define-key map "b" 'magit-branch)
- (define-key map "B" 'magit-bisect)
- (define-key map "c" 'magit-commit)
- (define-key map "C" 'magit-clone)
- (define-key map "d" 'magit-diff)
- (define-key map "D" 'magit-diff-refresh)
- (define-key map "e" 'magit-ediff-dwim)
- (define-key map "E" 'magit-ediff)
- (define-key map "f" 'magit-fetch)
- (define-key map "F" 'magit-pull)
- (define-key map "g" 'magit-refresh)
- (define-key map "G" 'magit-refresh-all)
- (define-key map "h" 'magit-dispatch)
- (define-key map "?" 'magit-dispatch)
- (define-key map "l" 'magit-log)
- (define-key map "L" 'magit-log-refresh)
- (define-key map "m" 'magit-merge)
- (define-key map "M" 'magit-remote)
- (define-key map "o" 'magit-submodule)
- (define-key map "O" 'magit-subtree)
- (define-key map "q" 'magit-mode-bury-buffer)
- (define-key map "r" 'magit-rebase)
- (define-key map "R" 'magit-file-rename)
- (define-key map "s" 'magit-stage-file)
- (define-key map "S" 'magit-stage-modified)
- (define-key map "t" 'magit-tag)
- (define-key map "T" 'magit-notes)
- (define-key map "u" 'magit-unstage-file)
- (define-key map "U" 'magit-unstage-all)
- (define-key map "v" 'magit-revert-no-commit)
- (define-key map "V" 'magit-revert)
- (define-key map "w" 'magit-am)
- (define-key map "W" 'magit-patch)
- (define-key map "x" 'magit-reset-quickly)
- (define-key map "X" 'magit-reset)
- (define-key map "y" 'magit-show-refs)
- (define-key map "Y" 'magit-cherry)
- (define-key map "z" 'magit-stash)
- (define-key map "Z" 'magit-stash)
- (define-key map ":" 'magit-git-command)
- (define-key map "!" 'magit-run)
- (define-key map (kbd "C-c C-c") 'magit-dispatch)
- (define-key map (kbd "C-c C-e") 'magit-edit-thing)
- (define-key map (kbd "C-c C-o") 'magit-browse-thing)
- (define-key map (kbd "C-c C-w") 'magit-browse-thing)
- (define-key map (kbd "C-w") 'magit-copy-section-value)
- (define-key map (kbd "M-w") 'magit-copy-buffer-revision)
- (define-key map [remap previous-line] 'magit-previous-line)
- (define-key map [remap next-line] 'magit-next-line)
- (define-key map [remap evil-previous-line] 'evil-previous-visual-line)
- (define-key map [remap evil-next-line] 'evil-next-visual-line)
- map)
- "Parent keymap for all keymaps of modes derived from `magit-mode'.")
-
-(defun magit-delete-thing ()
- "This is a placeholder command.
-Where applicable, section-specific keymaps bind another command
-which deletes the thing at point."
- (interactive)
- (user-error "There is no thing at point that could be deleted"))
-
-(defun magit-visit-thing ()
- "This is a placeholder command.
-Where applicable, section-specific keymaps bind another command
-which visits the thing at point."
- (interactive)
- (if (eq transient-current-command 'magit-dispatch)
- (call-interactively (key-binding (this-command-keys)))
- (user-error "There is no thing at point that could be visited")))
-
-(defun magit-edit-thing ()
- "This is a placeholder command.
-Where applicable, section-specific keymaps bind another command
-which lets you edit the thing at point, likely in another buffer."
- (interactive)
- (if (eq transient-current-command 'magit-dispatch)
- (call-interactively (key-binding (this-command-keys)))
- (user-error "There is no thing at point that could be edited")))
-
-(defun magit-browse-thing ()
- "This is a placeholder command.
-Where applicable, section-specific keymaps bind another command
-which visits the thing at point using `browse-url'."
- (interactive)
- (user-error "There is no thing at point that could be browsed"))
-
-(defvar bug-reference-map)
-(with-eval-after-load 'bug-reference
- (define-key bug-reference-map [remap magit-visit-thing]
- 'bug-reference-push-button))
-
-(easy-menu-define magit-mode-menu magit-mode-map
- "Magit menu"
- '("Magit"
- ["Refresh" magit-refresh t]
- ["Refresh all" magit-refresh-all t]
- "---"
- ["Stage" magit-stage t]
- ["Stage modified" magit-stage-modified t]
- ["Unstage" magit-unstage t]
- ["Reset index" magit-reset-index t]
- ["Commit" magit-commit t]
- ["Add log entry" magit-commit-add-log t]
- ["Tag" magit-tag-create t]
- "---"
- ["Diff working tree" magit-diff-working-tree t]
- ["Diff" magit-diff t]
- ("Log"
- ["Log" magit-log-other t]
- ["Reflog" magit-reflog-other t]
- ["Extended..." magit-log t])
- "---"
- ["Cherry pick" magit-cherry-pick t]
- ["Revert commit" magit-revert t]
- "---"
- ["Ignore globally" magit-gitignore-globally t]
- ["Ignore locally" magit-gitignore-locally t]
- ["Discard" magit-discard t]
- ["Reset head and index" magit-reset-mixed t]
- ["Stash" magit-stash-both t]
- ["Snapshot" magit-snapshot-both t]
- "---"
- ["Branch..." magit-checkout t]
- ["Merge" magit-merge t]
- ["Ediff resolve" magit-ediff-resolve t]
- ["Rebase..." magit-rebase t]
- "---"
- ["Push" magit-push t]
- ["Pull" magit-pull-branch t]
- ["Remote update" magit-fetch-all t]
- ("Submodule"
- ["Submodule update" magit-submodule-update t]
- ["Submodule update and init" magit-submodule-setup t]
- ["Submodule init" magit-submodule-init t]
- ["Submodule sync" magit-submodule-sync t])
- "---"
- ("Extensions")
- "---"
- ["Display Git output" magit-process-buffer t]
- ["Quit Magit" magit-mode-bury-buffer t]))
-
-;;; Mode
-
-(defun magit-load-config-extensions ()
- "Load Magit extensions that are defined at the Git config layer."
- (dolist (ext (magit-get-all "magit.extension"))
- (let ((sym (intern (format "magit-%s-mode" ext))))
- (when (fboundp sym)
- (funcall sym 1)))))
-
-(define-derived-mode magit-mode magit-section-mode "Magit"
- "Parent major mode from which Magit major modes inherit.
-
-Magit is documented in info node `(magit)'."
- :group 'magit
- (hack-dir-local-variables-non-file-buffer)
- (setq mode-line-process (magit-repository-local-get 'mode-line-process))
- (setq-local bookmark-make-record-function 'magit--make-bookmark))
-
-;;; Highlighting
-
-;;; Local Variables
-
-(defvar-local magit-buffer-arguments nil)
-(defvar-local magit-buffer-diff-args nil)
-(defvar-local magit-buffer-diff-files nil)
-(defvar-local magit-buffer-diff-files-suspended nil)
-(defvar-local magit-buffer-file-name nil)
-(defvar-local magit-buffer-files nil)
-(defvar-local magit-buffer-log-args nil)
-(defvar-local magit-buffer-log-files nil)
-(defvar-local magit-buffer-range nil)
-(defvar-local magit-buffer-range-hashed nil)
-(defvar-local magit-buffer-refname nil)
-(defvar-local magit-buffer-revision nil)
-(defvar-local magit-buffer-revision-hash nil)
-(defvar-local magit-buffer-revisions nil)
-(defvar-local magit-buffer-typearg nil)
-(defvar-local magit-buffer-upstream nil)
-
-;; These variables are also used in file-visiting buffers.
-;; Because the user may change the major-mode, they have
-;; to be permanent buffer-local.
-(put 'magit-buffer-file-name 'permanent-local t)
-(put 'magit-buffer-refname 'permanent-local t)
-(put 'magit-buffer-revision 'permanent-local t)
-(put 'magit-buffer-revision-hash 'permanent-local t)
-
-;; `magit-status' re-enables mode function but its refresher
-;; function does not reinstate this.
-(put 'magit-buffer-diff-files-suspended 'permanent-local t)
-
-(defvar-local magit-refresh-args nil
- "Obsolete. Possibly the arguments used to refresh the current buffer.
-Some third-party packages might still use this, but Magit does not.")
-(put 'magit-refresh-args 'permanent-local t)
-(make-obsolete-variable 'magit-refresh-args nil "Magit 3.0.0")
-
-(defvar magit-buffer-lock-functions nil
- "Obsolete buffer-locking support for third-party modes.
-Implement the generic function `magit-buffer-value' for
-your mode instead of adding an entry to this variable.")
-(make-obsolete-variable 'magit-buffer-lock-functions nil "Magit 3.0.0")
-
-(cl-defgeneric magit-buffer-value ()
- (when-let ((fn (cdr (assq major-mode magit-buffer-lock-functions))))
- (funcall fn (with-no-warnings magit-refresh-args))))
-
-(defvar-local magit-previous-section nil)
-(put 'magit-previous-section 'permanent-local t)
-
-;;; Setup Buffer
-
-(defmacro magit-setup-buffer (mode &optional locked &rest bindings)
- (declare (indent 2))
- `(magit-setup-buffer-internal
- ,mode ,locked
- ,(cons 'list (mapcar (pcase-lambda (`(,var ,form))
- `(list ',var ,form))
- bindings))))
-
-(defun magit-setup-buffer-internal (mode locked bindings)
- (let* ((value (and locked
- (with-temp-buffer
- (pcase-dolist (`(,var ,val) bindings)
- (set (make-local-variable var) val))
- (let ((major-mode mode))
- (magit-buffer-value)))))
- (buffer (magit-get-mode-buffer mode value))
- (section (and buffer (magit-current-section)))
- (created (not buffer)))
- (unless buffer
- (setq buffer (magit-with-toplevel
- (magit-generate-new-buffer mode value))))
- (with-current-buffer buffer
- (setq magit-previous-section section)
- (funcall mode)
- (magit-xref-setup 'magit-setup-buffer-internal bindings)
- (pcase-dolist (`(,var ,val) bindings)
- (set (make-local-variable var) val))
- (when created
- (magit-status-goto-initial-section)
- (run-hooks 'magit-create-buffer-hook)))
- (magit-display-buffer buffer)
- (with-current-buffer buffer
- (run-hooks 'magit-setup-buffer-hook)
- (magit-refresh-buffer))
- buffer))
-
-(defun magit-mode-setup (mode &rest args)
- "Setup up a MODE buffer using ARGS to generate its content."
- (declare (obsolete magit-setup-buffer "Magit 3.0.0"))
- (with-no-warnings
- (magit-mode-setup-internal mode args)))
-
-(defun magit-mode-setup-internal (mode args &optional locked)
- "Setup up a MODE buffer using ARGS to generate its content.
-When optional LOCKED is non-nil, then create a buffer that is
-locked to its value, which is derived from MODE and ARGS."
- (declare (obsolete magit-setup-buffer "Magit 3.0.0"))
- (let* ((value (and locked
- (with-temp-buffer
- (with-no-warnings
- (setq magit-refresh-args args))
- (let ((major-mode mode))
- (magit-buffer-value)))))
- (buffer (magit-get-mode-buffer mode value))
- (section (and buffer (magit-current-section)))
- (created (not buffer)))
- (unless buffer
- (setq buffer (magit-with-toplevel
- (magit-generate-new-buffer mode value))))
- (with-current-buffer buffer
- (setq magit-previous-section section)
- (with-no-warnings
- (setq magit-refresh-args args))
- (funcall mode)
- (magit-xref-setup 'magit-mode-setup-internal args)
- (when created
- (magit-status-goto-initial-section)
- (run-hooks 'magit-create-buffer-hook)))
- (magit-display-buffer buffer)
- (with-current-buffer buffer
- (run-hooks 'magit-mode-setup-hook)
- (magit-refresh-buffer))))
-
-;;; Display Buffer
-
-(defvar magit-display-buffer-noselect nil
- "If non-nil, then `magit-display-buffer' doesn't call `select-window'.")
-
-(defun magit-display-buffer (buffer &optional display-function)
- "Display BUFFER in some window and maybe select it.
-
-If optional DISPLAY-FUNCTION is non-nil, then use that to display
-the buffer. Otherwise use `magit-display-buffer-function', which
-is the normal case.
-
-Then, unless `magit-display-buffer-noselect' is non-nil, select
-the window which was used to display the buffer.
-
-Also run the hooks `magit-pre-display-buffer-hook'
-and `magit-post-display-buffer-hook'."
- (with-current-buffer buffer
- (run-hooks 'magit-pre-display-buffer-hook))
- (let ((window (funcall (or display-function magit-display-buffer-function)
- buffer)))
- (unless magit-display-buffer-noselect
- (let* ((old-frame (selected-frame))
- (new-frame (window-frame window)))
- (select-window window)
- (unless (eq old-frame new-frame)
- (select-frame-set-input-focus new-frame)))))
- (with-current-buffer buffer
- (run-hooks 'magit-post-display-buffer-hook)))
-
-(defun magit-display-buffer-traditional (buffer)
- "Display BUFFER the way this has traditionally been done."
- (display-buffer
- buffer (if (and (derived-mode-p 'magit-mode)
- (not (memq (with-current-buffer buffer major-mode)
- '(magit-process-mode
- magit-revision-mode
- magit-diff-mode
- magit-stash-mode
- magit-status-mode))))
- '(display-buffer-same-window)
- nil))) ; display in another window
-
-(defun magit-display-buffer-same-window-except-diff-v1 (buffer)
- "Display BUFFER in the selected window except for some modes.
-If a buffer's `major-mode' derives from `magit-diff-mode' or
-`magit-process-mode', display it in another window. Display all
-other buffers in the selected window."
- (display-buffer
- buffer (if (with-current-buffer buffer
- (derived-mode-p 'magit-diff-mode 'magit-process-mode))
- '(nil (inhibit-same-window . t))
- '(display-buffer-same-window))))
-
-(defun magit--display-buffer-fullframe (buffer alist)
- (when-let ((window (or (display-buffer-reuse-window buffer alist)
- (display-buffer-same-window buffer alist)
- (display-buffer-pop-up-window buffer alist)
- (display-buffer-use-some-window buffer alist))))
- (delete-other-windows window)
- window))
-
-(defun magit-display-buffer-fullframe-status-v1 (buffer)
- "Display BUFFER, filling entire frame if BUFFER is a status buffer.
-Otherwise, behave like `magit-display-buffer-traditional'."
- (if (eq (with-current-buffer buffer major-mode)
- 'magit-status-mode)
- (display-buffer buffer '(magit--display-buffer-fullframe))
- (magit-display-buffer-traditional buffer)))
-
-(defun magit--display-buffer-topleft (buffer alist)
- (or (display-buffer-reuse-window buffer alist)
- (when-let ((window2 (display-buffer-pop-up-window buffer alist)))
- (let ((window1 (get-buffer-window))
- (buffer1 (current-buffer))
- (buffer2 (window-buffer window2))
- (w2-quit-restore (window-parameter window2 'quit-restore)))
- (set-window-buffer window1 buffer2)
- (set-window-buffer window2 buffer1)
- (select-window window2)
- ;; Swap some window state that `magit-mode-quit-window' and
- ;; `quit-restore-window' inspect.
- (set-window-prev-buffers window2 (cdr (window-prev-buffers window1)))
- (set-window-prev-buffers window1 nil)
- (set-window-parameter window2 'magit-dedicated
- (window-parameter window1 'magit-dedicated))
- (set-window-parameter window1 'magit-dedicated t)
- (set-window-parameter window1 'quit-restore
- (list 'window 'window
- (nth 2 w2-quit-restore)
- (nth 3 w2-quit-restore)))
- (set-window-parameter window2 'quit-restore nil)
- window1))))
-
-(defun magit-display-buffer-fullframe-status-topleft-v1 (buffer)
- "Display BUFFER, filling entire frame if BUFFER is a status buffer.
-When BUFFER derives from `magit-diff-mode' or
-`magit-process-mode', try to display BUFFER to the top or left of
-the current buffer rather than to the bottom or right, as
-`magit-display-buffer-fullframe-status-v1' would. Whether the
-split is made vertically or horizontally is determined by
-`split-window-preferred-function'."
- (display-buffer
- buffer
- (cond ((eq (with-current-buffer buffer major-mode)
- 'magit-status-mode)
- '(magit--display-buffer-fullframe))
- ((with-current-buffer buffer
- (derived-mode-p 'magit-diff-mode 'magit-process-mode))
- '(magit--display-buffer-topleft))
- (t
- '(display-buffer-same-window)))))
-
-(defun magit--display-buffer-fullcolumn (buffer alist)
- (when-let ((window (or (display-buffer-reuse-window buffer alist)
- (display-buffer-same-window buffer alist)
- (display-buffer-below-selected buffer alist))))
- (delete-other-windows-vertically window)
- window))
-
-(defun magit-display-buffer-fullcolumn-most-v1 (buffer)
- "Display BUFFER using the full column except in some cases.
-For most cases where BUFFER's `major-mode' derives from
-`magit-mode', display it in the selected window and grow that
-window to the full height of the frame, deleting other windows in
-that column as necessary. However, display BUFFER in another
-window if 1) BUFFER's mode derives from `magit-process-mode', or
-2) BUFFER's mode derives from `magit-diff-mode', provided that
-the mode of the current buffer derives from `magit-log-mode' or
-`magit-cherry-mode'."
- (display-buffer
- buffer
- (cond ((and (or git-commit-mode
- (derived-mode-p 'magit-log-mode
- 'magit-cherry-mode
- 'magit-reflog-mode))
- (with-current-buffer buffer
- (derived-mode-p 'magit-diff-mode)))
- nil)
- ((with-current-buffer buffer
- (derived-mode-p 'magit-process-mode))
- nil)
- (t
- '(magit--display-buffer-fullcolumn)))))
-
-(defun magit-maybe-set-dedicated ()
- "Mark the selected window as dedicated if appropriate.
-
-If a new window was created to display the buffer, then remember
-that fact. That information is used by `magit-mode-quit-window',
-to determine whether the window should be deleted when its last
-Magit buffer is buried."
- (let ((window (get-buffer-window (current-buffer))))
- (when (and (window-live-p window)
- (not (window-prev-buffers window)))
- (set-window-parameter window 'magit-dedicated t))))
-
-;;; Get Buffer
-
-(defvar-local magit--default-directory nil
- "Value of `default-directory' when buffer is generated.
-This exists to prevent a let-bound `default-directory' from
-tricking `magit-get-mode-buffer' or `magit-mode-get-buffers'
-into thinking a buffer belongs to a repo that it doesn't.")
-(put 'magit--default-directory 'permanent-local t)
-
-(defun magit-mode-get-buffers ()
- (let ((topdir (magit-toplevel)))
- (--filter (with-current-buffer it
- (and (derived-mode-p 'magit-mode)
- (equal magit--default-directory topdir)))
- (buffer-list))))
-
-(defvar-local magit-buffer-locked-p nil)
-(put 'magit-buffer-locked-p 'permanent-local t)
-
-(defun magit-get-mode-buffer (mode &optional value frame)
- "Return buffer belonging to the current repository whose major-mode is MODE.
-
-If no such buffer exists then return nil. Multiple buffers with
-the same major-mode may exist for a repository but only one can
-exist that hasn't been looked to its value. Return that buffer
-\(or nil if there is no such buffer) unless VALUE is non-nil, in
-which case return the buffer that has been looked to that value.
-
-If FRAME nil or omitted, then consider all buffers. Otherwise
- only consider buffers that are displayed in some live window
- on some frame.
-If `all', then consider all buffers on all frames.
-If `visible', then only consider buffers on all visible frames.
-If `selected' or t, then only consider buffers on the selected
- frame.
-If a frame, then only consider buffers on that frame."
- (if-let ((topdir (magit-toplevel)))
- (cl-flet* ((b (buffer)
- (with-current-buffer buffer
- (and (eq major-mode mode)
- (equal magit--default-directory topdir)
- (if value
- (and magit-buffer-locked-p
- (equal (magit-buffer-value) value))
- (not magit-buffer-locked-p))
- buffer)))
- (w (window)
- (b (window-buffer window)))
- (f (frame)
- (-some #'w (window-list frame 'no-minibuf))))
- (pcase-exhaustive frame
- (`nil (-some #'b (buffer-list)))
- (`all (-some #'f (frame-list)))
- (`visible (-some #'f (visible-frame-list)))
- ((or `selected `t) (-some #'w (window-list (selected-frame))))
- ((guard (framep frame)) (-some #'w (window-list frame)))))
- (magit--not-inside-repository-error)))
-
-(defun magit-mode-get-buffer (mode &optional create frame value)
- (declare (obsolete magit-get-mode-buffer "Magit 3.0.0"))
- (when create
- (error "`magit-mode-get-buffer's CREATE argument is obsolete"))
- (if-let ((topdir (magit-toplevel)))
- (--first (with-current-buffer it
- (and (eq major-mode mode)
- (equal magit--default-directory topdir)
- (if value
- (and magit-buffer-locked-p
- (equal (magit-buffer-value) value))
- (not magit-buffer-locked-p))))
- (if frame
- (mapcar #'window-buffer
- (window-list (unless (eq frame t) frame)))
- (buffer-list)))
- (magit--not-inside-repository-error)))
-
-(defun magit-generate-new-buffer (mode &optional value)
- (let* ((name (funcall magit-generate-buffer-name-function mode value))
- (buffer (generate-new-buffer name)))
- (with-current-buffer buffer
- (setq magit--default-directory default-directory)
- (setq magit-buffer-locked-p (and value t))
- (magit-restore-section-visibility-cache mode))
- (when magit-uniquify-buffer-names
- (add-to-list 'uniquify-list-buffers-directory-modes mode)
- (with-current-buffer buffer
- (setq list-buffers-directory (abbreviate-file-name default-directory)))
- (let ((uniquify-buffer-name-style
- (if (memq uniquify-buffer-name-style '(nil forward))
- 'post-forward-angle-brackets
- uniquify-buffer-name-style)))
- (uniquify-rationalize-file-buffer-names
- name (file-name-directory (directory-file-name default-directory))
- buffer)))
- buffer))
-
-(defun magit-generate-buffer-name-default-function (mode &optional value)
- "Generate buffer name for a MODE buffer in the current repository.
-The returned name is based on `magit-buffer-name-format' and
-takes `magit-uniquify-buffer-names' and VALUE, if non-nil, into
-account."
- (let ((m (substring (symbol-name mode) 0 -5))
- (v (and value (format "%s" (if (listp value) value (list value)))))
- (n (if magit-uniquify-buffer-names
- (file-name-nondirectory
- (directory-file-name default-directory))
- (abbreviate-file-name default-directory))))
- (format-spec
- magit-buffer-name-format
- `((?m . ,m)
- (?M . ,(if (eq mode 'magit-status-mode) "magit" m))
- (?v . ,(or v ""))
- (?V . ,(if v (concat " " v) ""))
- (?t . ,n)
- (?x . ,(if magit-uniquify-buffer-names "" "*"))
- (?T . ,(if magit-uniquify-buffer-names n (concat n "*")))))))
-
-;;; Buffer Lock
-
-(defun magit-toggle-buffer-lock ()
- "Lock the current buffer to its value or unlock it.
-
-Locking a buffer to its value prevents it from being reused to
-display another value. The name of a locked buffer contains its
-value, which allows telling it apart from other locked buffers
-and the unlocked buffer.
-
-Not all Magit buffers can be locked to their values, for example
-it wouldn't make sense to lock a status buffer.
-
-There can only be a single unlocked buffer using a certain
-major-mode per repository. So when a buffer is being unlocked
-and another unlocked buffer already exists for that mode and
-repository, then the former buffer is instead deleted and the
-latter is displayed in its place."
- (interactive)
- (if magit-buffer-locked-p
- (if-let ((unlocked (magit-get-mode-buffer major-mode)))
- (let ((locked (current-buffer)))
- (switch-to-buffer unlocked nil t)
- (kill-buffer locked))
- (setq magit-buffer-locked-p nil)
- (rename-buffer (funcall magit-generate-buffer-name-function
- major-mode)))
- (if-let ((value (magit-buffer-value)))
- (if-let ((locked (magit-get-mode-buffer major-mode value)))
- (let ((unlocked (current-buffer)))
- (switch-to-buffer locked nil t)
- (kill-buffer unlocked))
- (setq magit-buffer-locked-p t)
- (rename-buffer (funcall magit-generate-buffer-name-function
- major-mode value)))
- (user-error "Buffer has no value it could be locked to"))))
-
-;;; Bury Buffer
-
-(defun magit-mode-bury-buffer (&optional kill-buffer)
- "Bury the current buffer.
-With a prefix argument, kill the buffer instead.
-With two prefix arguments, also kill all Magit buffers associated
-with this repository.
-This is done using `magit-bury-buffer-function'."
- (interactive "P")
- ;; Kill all associated Magit buffers when a double prefix arg is given.
- (when (>= (prefix-numeric-value kill-buffer) 16)
- (let ((current (current-buffer)))
- (dolist (buf (magit-mode-get-buffers))
- (unless (eq buf current)
- (kill-buffer buf)))))
- (funcall magit-bury-buffer-function kill-buffer))
-
-(defun magit-mode-quit-window (kill-buffer)
- "Quit the selected window and bury its buffer.
-
-This behaves similar to `quit-window', but when the window
-was originally created to display a Magit buffer and the
-current buffer is the last remaining Magit buffer that was
-ever displayed in the selected window, then delete that
-window."
- (if (or (one-window-p)
- (--first (let ((buffer (car it)))
- (and (not (eq buffer (current-buffer)))
- (buffer-live-p buffer)
- (or (not (window-parameter nil 'magit-dedicated))
- (with-current-buffer buffer
- (derived-mode-p 'magit-mode
- 'magit-process-mode)))))
- (window-prev-buffers)))
- (quit-window kill-buffer)
- (let ((window (selected-window)))
- (quit-window kill-buffer)
- (when (window-live-p window)
- (delete-window window)))))
-
-;;; Refresh Buffers
-
-(defvar inhibit-magit-refresh nil)
-
-(defun magit-refresh ()
- "Refresh some buffers belonging to the current repository.
-
-Refresh the current buffer if its major mode derives from
-`magit-mode', and refresh the corresponding status buffer.
-
-Run hooks `magit-pre-refresh-hook' and `magit-post-refresh-hook'."
- (interactive)
- (unless inhibit-magit-refresh
- (unwind-protect
- (let ((start (current-time))
- (magit--refresh-cache (or magit--refresh-cache
- (list (cons 0 0)))))
- (when magit-refresh-verbose
- (message "Refreshing magit..."))
- (magit-run-hook-with-benchmark 'magit-pre-refresh-hook)
- (cond ((derived-mode-p 'magit-mode)
- (magit-refresh-buffer))
- ((derived-mode-p 'tabulated-list-mode)
- (revert-buffer)))
- (--when-let (and magit-refresh-status-buffer
- (not (derived-mode-p 'magit-status-mode))
- (magit-get-mode-buffer 'magit-status-mode))
- (with-current-buffer it
- (magit-refresh-buffer)))
- (magit-auto-revert-buffers)
- (cond
- ((and (not this-command)
- (memq last-command magit-post-commit-hook-commands))
- (magit-run-hook-with-benchmark 'magit-post-commit-hook))
- ((memq this-command magit-post-stage-hook-commands)
- (magit-run-hook-with-benchmark 'magit-post-stage-hook))
- ((memq this-command magit-post-unstage-hook-commands)
- (magit-run-hook-with-benchmark 'magit-post-unstage-hook)))
- (magit-run-hook-with-benchmark 'magit-post-refresh-hook)
- (when magit-refresh-verbose
- (message "Refreshing magit...done (%.3fs, cached %s/%s)"
- (float-time (time-subtract (current-time) start))
- (caar magit--refresh-cache)
- (+ (caar magit--refresh-cache)
- (cdar magit--refresh-cache)))))
- (run-hooks 'magit-unwind-refresh-hook))))
-
-(defun magit-refresh-all ()
- "Refresh all buffers belonging to the current repository.
-
-Refresh all Magit buffers belonging to the current repository,
-and revert buffers that visit files located inside the current
-repository.
-
-Run hooks `magit-pre-refresh-hook' and `magit-post-refresh-hook'."
- (interactive)
- (magit-run-hook-with-benchmark 'magit-pre-refresh-hook)
- (dolist (buffer (magit-mode-get-buffers))
- (with-current-buffer buffer (magit-refresh-buffer)))
- (magit-auto-revert-buffers)
- (magit-run-hook-with-benchmark 'magit-post-refresh-hook))
-
-(defvar-local magit-refresh-start-time nil)
-
-(defun magit-refresh-buffer ()
- "Refresh the current Magit buffer."
- (setq magit-refresh-start-time (current-time))
- (let ((refresh (intern (format "%s-refresh-buffer"
- (substring (symbol-name major-mode) 0 -5))))
- (magit--refresh-cache (or magit--refresh-cache (list (cons 0 0)))))
- (when (functionp refresh)
- (when magit-refresh-verbose
- (message "Refreshing buffer `%s'..." (buffer-name)))
- (let* ((buffer (current-buffer))
- (windows
- (--mapcat (with-selected-window it
- (with-current-buffer buffer
- (when-let ((section (magit-current-section)))
- (list
- (nconc (list it section)
- (magit-refresh-get-relative-position))))))
- (or (get-buffer-window-list buffer nil t)
- (list (selected-window))))))
- (deactivate-mark)
- (setq magit-section-highlight-overlays nil)
- (setq magit-section-highlighted-section nil)
- (setq magit-section-highlighted-sections nil)
- (setq magit-section-unhighlight-sections nil)
- (magit-process-unset-mode-line-error-status)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (save-excursion
- (apply refresh (with-no-warnings magit-refresh-args))))
- (pcase-dolist (`(,window . ,args) windows)
- (with-selected-window window
- (with-current-buffer buffer
- (apply #'magit-section-goto-successor args))))
- (run-hooks 'magit-refresh-buffer-hook)
- (magit-section-update-highlight)
- (set-buffer-modified-p nil))
- (when magit-refresh-verbose
- (message "Refreshing buffer `%s'...done (%.3fs)" (buffer-name)
- (float-time (time-subtract (current-time)
- magit-refresh-start-time)))))))
-
-(defun magit-refresh-get-relative-position ()
- (when-let ((section (magit-current-section)))
- (let ((start (oref section start)))
- (list (count-lines start (point))
- (- (point) (line-beginning-position))
- (and (magit-hunk-section-p section)
- (region-active-p)
- (progn (goto-char (line-beginning-position))
- (when (looking-at "^[-+]") (forward-line))
- (while (looking-at "^[ @]") (forward-line))
- (let ((beg (point)))
- (cond ((looking-at "^[-+]")
- (forward-line)
- (while (looking-at "^[-+]") (forward-line))
- (while (looking-at "^ ") (forward-line))
- (forward-line -1)
- (regexp-quote (buffer-substring-no-properties
- beg (line-end-position))))
- (t t)))))))))
-
-;;; Save File-Visiting Buffers
-
-(defvar disable-magit-save-buffers nil)
-
-(defun magit-pre-command-hook ()
- (setq disable-magit-save-buffers nil))
-(add-hook 'pre-command-hook #'magit-pre-command-hook)
-
-(defvar magit-after-save-refresh-buffers nil)
-
-(defun magit-after-save-refresh-buffers ()
- (dolist (buffer magit-after-save-refresh-buffers)
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (magit-refresh-buffer))))
- (setq magit-after-save-refresh-buffers nil)
- (remove-hook 'post-command-hook 'magit-after-save-refresh-buffers))
-
-(defun magit-after-save-refresh-status ()
- "Refresh the status buffer of the current repository.
-
-This function is intended to be added to `after-save-hook'.
-
-If the status buffer does not exist or the file being visited in
-the current buffer isn't inside the working tree of a repository,
-then do nothing.
-
-Note that refreshing a Magit buffer is done by re-creating its
-contents from scratch, which can be slow in large repositories.
-If you are not satisfied with Magit's performance, then you
-should obviously not add this function to that hook."
- (when (and (not disable-magit-save-buffers)
- (magit-inside-worktree-p t))
- (--when-let (ignore-errors (magit-get-mode-buffer 'magit-status-mode))
- (add-to-list 'magit-after-save-refresh-buffers it)
- (add-hook 'post-command-hook 'magit-after-save-refresh-buffers))))
-
-(defun magit-maybe-save-repository-buffers ()
- "Maybe save file-visiting buffers belonging to the current repository.
-Do so if `magit-save-repository-buffers' is non-nil. You should
-not remove this from any hooks, instead set that variable to nil
-if you so desire."
- (when (and magit-save-repository-buffers
- (not disable-magit-save-buffers))
- (setq disable-magit-save-buffers t)
- (let ((msg (current-message)))
- (magit-save-repository-buffers
- (eq magit-save-repository-buffers 'dontask))
- (when (and msg
- (current-message)
- (not (equal msg (current-message))))
- (message "%s" msg)))))
-
-(add-hook 'magit-pre-refresh-hook #'magit-maybe-save-repository-buffers)
-(add-hook 'magit-pre-call-git-hook #'magit-maybe-save-repository-buffers)
-(add-hook 'magit-pre-start-git-hook #'magit-maybe-save-repository-buffers)
-
-(defvar-local magit-inhibit-refresh-save nil)
-
-(defun magit-save-repository-buffers (&optional arg)
- "Save file-visiting buffers belonging to the current repository.
-After any buffer where `buffer-save-without-query' is non-nil
-is saved without asking, the user is asked about each modified
-buffer which visits a file in the current repository. Optional
-argument (the prefix) non-nil means save all with no questions."
- (interactive "P")
- (when-let ((topdir (magit-rev-parse-safe "--show-toplevel")))
- (let ((remote (file-remote-p topdir))
- (save-some-buffers-action-alist
- `((?Y (lambda (buffer)
- (with-current-buffer buffer
- (setq buffer-save-without-query t)
- (save-buffer)))
- "to save the current buffer and remember choice")
- (?N (lambda (buffer)
- (with-current-buffer buffer
- (setq magit-inhibit-refresh-save t)))
- "to skip the current buffer and remember choice")
- ,@save-some-buffers-action-alist)))
- (save-some-buffers
- arg (lambda ()
- (and (not magit-inhibit-refresh-save)
- buffer-file-name
- ;; Avoid needlessly connecting to unrelated remotes.
- (equal (file-remote-p buffer-file-name)
- remote)
- ;; For remote files this makes network requests and
- ;; therefore has to come after the above to avoid
- ;; unnecessarily waiting for unrelated hosts.
- (file-exists-p (file-name-directory buffer-file-name))
- (string-prefix-p topdir (file-truename buffer-file-name))
- (equal (magit-rev-parse-safe "--show-toplevel")
- topdir)))))))
-
-;;; Restore Window Configuration
-
-(defvar magit-inhibit-save-previous-winconf nil)
-
-(defvar-local magit-previous-window-configuration nil)
-(put 'magit-previous-window-configuration 'permanent-local t)
-
-(defun magit-save-window-configuration ()
- "Save the current window configuration.
-
-Later, when the buffer is buried, it may be restored by
-`magit-restore-window-configuration'."
- (if magit-inhibit-save-previous-winconf
- (when (eq magit-inhibit-save-previous-winconf 'unset)
- (setq magit-previous-window-configuration nil))
- (unless (get-buffer-window (current-buffer) (selected-frame))
- (setq magit-previous-window-configuration
- (current-window-configuration)))))
-
-(defun magit-restore-window-configuration (&optional kill-buffer)
- "Bury or kill the current buffer and restore previous window configuration."
- (let ((winconf magit-previous-window-configuration)
- (buffer (current-buffer))
- (frame (selected-frame)))
- (quit-window kill-buffer (selected-window))
- (when (and winconf (equal frame (window-configuration-frame winconf)))
- (set-window-configuration winconf)
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (setq magit-previous-window-configuration nil))))))
-
-;;; Buffer History
-
-(defun magit-go-backward ()
- "Move backward in current buffer's history."
- (interactive)
- (if help-xref-stack
- (help-xref-go-back (current-buffer))
- (user-error "No previous entry in buffer's history")))
-
-(defun magit-go-forward ()
- "Move forward in current buffer's history."
- (interactive)
- (if help-xref-forward-stack
- (help-xref-go-forward (current-buffer))
- (user-error "No next entry in buffer's history")))
-
-(defun magit-insert-xref-buttons ()
- "Insert xref buttons."
- (when (and (not magit-buffer-locked-p)
- (or help-xref-stack help-xref-forward-stack))
- (when help-xref-stack
- (magit-xref-insert-button help-back-label 'magit-xref-backward))
- (when help-xref-forward-stack
- (when help-xref-stack
- (insert " "))
- (magit-xref-insert-button help-forward-label 'magit-xref-forward))))
-
-(defun magit-xref-insert-button (label type)
- (magit-insert-section (button label)
- (insert-text-button label 'type type
- 'help-args (list (current-buffer)))))
-
-(define-button-type 'magit-xref-backward
- :supertype 'help-back
- 'mouse-face 'magit-section-highlight
- 'help-echo (purecopy "mouse-2, RET: go back to previous history entry"))
-
-(define-button-type 'magit-xref-forward
- :supertype 'help-forward
- 'mouse-face 'magit-section-highlight
- 'help-echo (purecopy "mouse-2, RET: go back to next history entry"))
-
-(defvar magit-xref-modes
- '(magit-log-mode
- magit-reflog-mode
- magit-diff-mode
- magit-revision-mode)
- "List of modes for which to insert navigation buttons.")
-
-(defun magit-xref-setup (fn args)
- (when (memq major-mode magit-xref-modes)
- (when help-xref-stack-item
- (push (cons (point) help-xref-stack-item) help-xref-stack)
- (setq help-xref-forward-stack nil))
- (when (called-interactively-p 'interactive)
- (--when-let (nthcdr 10 help-xref-stack)
- (setcdr it nil)))
- (setq help-xref-stack-item
- (list 'magit-xref-restore fn default-directory args))))
-
-(defun magit-xref-restore (fn dir args)
- (setq default-directory dir)
- (funcall fn major-mode nil args)
- (magit-refresh-buffer))
-
-;;; Repository-Local Cache
-
-(defvar magit-repository-local-cache nil
- "Alist mapping `magit-toplevel' paths to alists of key/value pairs.")
-
-(defun magit-repository-local-repository ()
- "Return the key for the current repository."
- (or (bound-and-true-p magit--default-directory)
- (magit-toplevel)))
-
-(defun magit-repository-local-set (key value &optional repository)
- "Set the repository-local VALUE for KEY.
-
-Unless specified, REPOSITORY is the current buffer's repository.
-
-If REPOSITORY is nil (meaning there is no current repository),
-then the value is not cached, and we return nil."
- (let* ((repokey (or repository (magit-repository-local-repository)))
- (cache (assoc repokey magit-repository-local-cache)))
- ;; Don't cache values for a nil REPOSITORY, as the 'set' and 'get'
- ;; calls for some KEY may happen in unrelated contexts.
- (when repokey
- (if cache
- (let ((keyvalue (assoc key (cdr cache))))
- (if keyvalue
- ;; Update pre-existing value for key.
- (setcdr keyvalue value)
- ;; No such key in repository-local cache.
- (push (cons key value) (cdr cache))))
- ;; No cache for this repository.
- (push (cons repokey (list (cons key value)))
- magit-repository-local-cache)))))
-
-(defun magit-repository-local-exists-p (key &optional repository)
- "Non-nil when a repository-local value exists for KEY.
-
-Returns a (KEY . value) cons cell.
-
-The KEY is matched using `equal'.
-
-Unless specified, REPOSITORY is the current buffer's repository."
- (let* ((repokey (or repository (magit-repository-local-repository)))
- (cache (assoc repokey magit-repository-local-cache)))
- (and cache
- (assoc key (cdr cache)))))
-
-(defun magit-repository-local-get (key &optional default repository)
- "Return the repository-local value for KEY.
-
-Return DEFAULT if no value for KEY exists.
-
-The KEY is matched using `equal'.
-
-Unless specified, REPOSITORY is the current buffer's repository."
- (let ((keyvalue (magit-repository-local-exists-p key repository)))
- (if keyvalue
- (cdr keyvalue)
- default)))
-
-(defun magit-repository-local-delete (key &optional repository)
- "Delete the repository-local value for KEY.
-
-Unless specified, REPOSITORY is the current buffer's repository."
- (let* ((repokey (or repository (magit-repository-local-repository)))
- (cache (assoc repokey magit-repository-local-cache)))
- (when cache
- ;; There is no `assoc-delete-all'.
- (setf (cdr cache)
- (cl-delete key (cdr cache) :key #'car :test #'equal)))))
-
-(defun magit-preserve-section-visibility-cache ()
- (when (derived-mode-p 'magit-status-mode 'magit-refs-mode)
- (magit-repository-local-set
- (cons major-mode 'magit-section-visibility-cache)
- magit-section-visibility-cache)))
-
-(defun magit-restore-section-visibility-cache (mode)
- (setq magit-section-visibility-cache
- (magit-repository-local-get
- (cons mode 'magit-section-visibility-cache))))
-
-(defun magit-zap-caches ()
- "Zap caches for the current repository.
-Remove the repository's entry from `magit-repository-local-cache'
-and set `magit-section-visibility-cache' to nil in all of the
-repository's Magit buffers."
- (interactive)
- (magit-with-toplevel
- (setq magit-repository-local-cache
- (cl-delete default-directory
- magit-repository-local-cache
- :key #'car :test #'equal)))
- (dolist (buffer (magit-mode-get-buffers))
- (with-current-buffer buffer
- (setq magit-section-visibility-cache nil)))
- (setq magit--libgit-available-p eieio-unbound))
-
-;;; Utilities
-
-(defun magit-toggle-verbose-refresh ()
- "Toggle whether Magit refreshes buffers verbosely.
-Enabling this helps figuring out which sections are bottlenecks.
-The additional output can be found in the *Messages* buffer."
- (interactive)
- (setq magit-refresh-verbose (not magit-refresh-verbose))
- (message "%s verbose refreshing"
- (if magit-refresh-verbose "Enabled" "Disabled")))
-
-(defun magit-run-hook-with-benchmark (hook)
- (when hook
- (if magit-refresh-verbose
- (let ((start (current-time)))
- (message "Running %s..." hook)
- (run-hooks hook)
- (message "Running %s...done (%.3fs)" hook
- (float-time (time-subtract (current-time) start))))
- (run-hooks hook))))
-
-;;; _
-(provide 'magit-mode)
-;;; magit-mode.el ends here
diff --git a/elpa/magit-20200728.45/magit-notes.el b/elpa/magit-20200728.45/magit-notes.el
deleted file mode 100644
index 9956625..0000000
--- a/elpa/magit-20200728.45/magit-notes.el
+++ /dev/null
@@ -1,200 +0,0 @@
-;;; magit-notes.el --- notes support -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for `git-notes'.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-notes "magit" nil t)
-(transient-define-prefix magit-notes ()
- "Edit notes attached to commits."
- :man-page "git-notes"
- ["Configure local settings"
- ("c" magit-core.notesRef)
- ("d" magit-notes.displayRef)]
- ["Configure global settings"
- ("C" magit-global-core.notesRef)
- ("D" magit-global-notes.displayRef)]
- ["Arguments for prune"
- :if-not magit-notes-merging-p
- ("-n" "Dry run" ("-n" "--dry-run"))]
- ["Arguments for edit and remove"
- :if-not magit-notes-merging-p
- (magit-notes:--ref)]
- ["Arguments for merge"
- :if-not magit-notes-merging-p
- (magit-notes:--strategy)]
- ["Actions"
- :if-not magit-notes-merging-p
- ("T" "Edit" magit-notes-edit)
- ("r" "Remove" magit-notes-remove)
- ("m" "Merge" magit-notes-merge)
- ("p" "Prune" magit-notes-prune)]
- ["Actions"
- :if magit-notes-merging-p
- ("c" "Commit merge" magit-notes-merge-commit)
- ("a" "Abort merge" magit-notes-merge-abort)])
-
-(defun magit-notes-merging-p ()
- (let ((dir (magit-git-dir "NOTES_MERGE_WORKTREE")))
- (and (file-directory-p dir)
- (directory-files dir nil "^[^.]"))))
-
-(transient-define-infix magit-core.notesRef ()
- :class 'magit--git-variable
- :variable "core.notesRef"
- :reader 'magit-notes-read-ref
- :prompt "Set local core.notesRef")
-
-(transient-define-infix magit-notes.displayRef ()
- :class 'magit--git-variable
- :variable "notes.displayRef"
- :multi-value t
- :reader 'magit-notes-read-refs
- :prompt "Set local notes.displayRef")
-
-(transient-define-infix magit-global-core.notesRef ()
- :class 'magit--git-variable
- :variable "core.notesRef"
- :reader 'magit-notes-read-ref
- :prompt "Set global core.notesRef")
-
-(transient-define-infix magit-global-notes.displayRef ()
- :class 'magit--git-variable
- :variable "notes.displayRef"
- :multi-value t
- :reader 'magit-notes-read-refs
- :prompt "Set global notes.displayRef")
-
-(transient-define-argument magit-notes:--ref ()
- :description "Merge strategy"
- :class 'transient-option
- :key "-r"
- :argument "--ref="
- :reader 'magit-notes-read-ref)
-
-(transient-define-argument magit-notes:--strategy ()
- :description "Merge strategy"
- :class 'transient-option
- :shortarg "-s"
- :argument "--strategy="
- :choices '("manual" "ours" "theirs" "union" "cat_sort_uniq"))
-
-(defun magit-notes-edit (commit &optional ref)
- "Edit the note attached to COMMIT.
-REF is the notes ref used to store the notes.
-
-Interactively or when optional REF is nil use the value of Git
-variable `core.notesRef' or \"refs/notes/commits\" if that is
-undefined."
- (interactive (magit-notes-read-args "Edit notes"))
- (magit-run-git-with-editor "notes" (and ref (concat "--ref=" ref))
- "edit" commit))
-
-(defun magit-notes-remove (commit &optional ref)
- "Remove the note attached to COMMIT.
-REF is the notes ref from which the note is removed.
-
-Interactively or when optional REF is nil use the value of Git
-variable `core.notesRef' or \"refs/notes/commits\" if that is
-undefined."
- (interactive (magit-notes-read-args "Remove notes"))
- (magit-run-git-with-editor "notes" (and ref (concat "--ref=" ref))
- "remove" commit))
-
-(defun magit-notes-merge (ref)
- "Merge the notes ref REF into the current notes ref.
-
-The current notes ref is the value of Git variable
-`core.notesRef' or \"refs/notes/commits\" if that is undefined.
-
-When there are conflicts, then they have to be resolved in the
-temporary worktree \".git/NOTES_MERGE_WORKTREE\". When
-done use `magit-notes-merge-commit' to finish. To abort
-use `magit-notes-merge-abort'."
- (interactive (list (magit-read-string-ns "Merge reference")))
- (magit-run-git-with-editor "notes" "merge" ref))
-
-(defun magit-notes-merge-commit ()
- "Commit the current notes ref merge.
-Also see `magit-notes-merge'."
- (interactive)
- (magit-run-git-with-editor "notes" "merge" "--commit"))
-
-(defun magit-notes-merge-abort ()
- "Abort the current notes ref merge.
-Also see `magit-notes-merge'."
- (interactive)
- (magit-run-git-with-editor "notes" "merge" "--abort"))
-
-(defun magit-notes-prune (&optional dry-run)
- "Remove notes about unreachable commits."
- (interactive (list (and (member "--dry-run" (transient-args 'magit-notes)) t)))
- (when dry-run
- (magit-process-buffer))
- (magit-run-git-with-editor "notes" "prune" (and dry-run "--dry-run")))
-
-;;; Readers
-
-(defun magit-notes-read-ref (prompt _initial-input history)
- (--when-let (magit-completing-read
- prompt (magit-list-notes-refnames) nil nil
- (--when-let (magit-get "core.notesRef")
- (if (string-prefix-p "refs/notes/" it)
- (substring it 11)
- it))
- history)
- (if (string-prefix-p "refs/" it)
- it
- (concat "refs/notes/" it))))
-
-(defun magit-notes-read-refs (prompt)
- (mapcar (lambda (ref)
- (if (string-prefix-p "refs/" ref)
- ref
- (concat "refs/notes/" ref)))
- (completing-read-multiple
- (concat prompt ": ")
- (magit-list-notes-refnames) nil nil
- (mapconcat (lambda (ref)
- (if (string-prefix-p "refs/notes/" ref)
- (substring ref 11)
- ref))
- (magit-get-all "notes.displayRef")
- ","))))
-
-(defun magit-notes-read-args (prompt)
- (list (magit-read-branch-or-commit prompt (magit-stash-at-point))
- (--when-let (--first (string-match "^--ref=\\(.+\\)" it)
- (transient-args 'magit-notes))
- (match-string 1 it))))
-
-;;; _
-(provide 'magit-notes)
-;;; magit-notes.el ends here
diff --git a/elpa/magit-20200728.45/magit-obsolete.el b/elpa/magit-20200728.45/magit-obsolete.el
deleted file mode 100644
index d7c2f1b..0000000
--- a/elpa/magit-20200728.45/magit-obsolete.el
+++ /dev/null
@@ -1,109 +0,0 @@
-;;; magit-obsolete.el --- obsolete definitions -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library defines aliases for obsolete variables and functions.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Obsolete since v3.0.0
-
-(define-obsolete-function-alias 'magit-diff-visit-file-worktree
- 'magit-diff-visit-worktree-file "Magit 3.0.0")
-
-(define-obsolete-function-alias 'magit-status-internal
- 'magit-status-setup-buffer "Magit 3.0.0")
-
-(define-obsolete-variable-alias 'magit-mode-setup-hook
- 'magit-setup-buffer-hook "Magit 3.0.0")
-
-(define-obsolete-variable-alias 'magit-branch-popup-show-variables
- 'magit-branch-direct-configure "Magit 3.0.0")
-
-(define-obsolete-function-alias 'magit-dispatch-popup
- 'magit-dispatch "Magit 3.0.0")
-
-(define-obsolete-function-alias 'magit-repolist-column-dirty
- 'magit-repolist-column-flag "Magit 3.0.0")
-
-(define-obsolete-variable-alias 'magit-disable-line-numbers
- 'magit-section-disable-line-numbers "Magit 3.0.0")
-
-(defun magit--magit-popup-warning ()
- (display-warning 'magit "\
-Magit no longer uses Magit-Popup.
-It now uses Transient.
-See https://emacsair.me/2019/02/14/transient-0.1.
-
-However your configuration and/or some third-party package that
-you use still depends on the `magit-popup' package. But because
-`magit' no longer depends on that, `package' has removed it from
-your system.
-
-If some package that you use still depends on `magit-popup' but
-does not declare it as a dependency, then please contact its
-maintainer about that and install `magit-popup' explicitly.
-
-If you yourself use functions that are defined in `magit-popup'
-in your configuration, then the next step depends on what you use
-that for.
-
-* If you use `magit-popup' to define your own popups but do not
- modify any of Magit's old popups, then you have to install
- `magit-popup' explicitly. (You can also migrate to Transient,
- but there is no need to rush that.)
-
-* If you add additional arguments and/or actions to Magit's popups,
- then you have to port that to modify the new \"transients\" instead.
- See https://github.com/magit/magit/wiki/\
-Converting-popup-modifications-to-transient-modifications
-
-To find installed packages that still use `magit-popup' you can
-use e.g. \"M-x rgrep RET magit-popup RET RET ~/.emacs.d/ RET\"."))
-(cl-eval-when (eval load)
- (unless (require (quote magit-popup) nil t)
- (defun magit-define-popup-switch (&rest _)
- (magit--magit-popup-warning))
- (defun magit-define-popup-option (&rest _)
- (magit--magit-popup-warning))
- (defun magit-define-popup-variable (&rest _)
- (magit--magit-popup-warning))
- (defun magit-define-popup-action (&rest _)
- (magit--magit-popup-warning))
- (defun magit-define-popup-sequence-action (&rest _)
- (magit--magit-popup-warning))
- (defun magit-define-popup-key (&rest _)
- (magit--magit-popup-warning))
- (defun magit-define-popup-keys-deferred (&rest _)
- (magit--magit-popup-warning))
- (defun magit-change-popup-key (&rest _)
- (magit--magit-popup-warning))
- (defun magit-remove-popup-key (&rest _)
- (magit--magit-popup-warning))))
-
-;;; _
-(provide 'magit-obsolete)
-;;; magit-obsolete.el ends here
diff --git a/elpa/magit-20200728.45/magit-patch.el b/elpa/magit-20200728.45/magit-patch.el
deleted file mode 100644
index 3a63f22..0000000
--- a/elpa/magit-20200728.45/magit-patch.el
+++ /dev/null
@@ -1,331 +0,0 @@
-;;; magit-patch.el --- creating and applying patches -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements patch commands.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-patch-save-arguments '(exclude "--stat")
- "Control arguments used by the command `magit-patch-save'.
-
-`magit-patch-save' (which see) saves a diff for the changes
-shown in the current buffer in a patch file. It may use the
-same arguments as used in the buffer or a subset thereof, or
-a constant list of arguments, depending on this option and
-the prefix argument."
- :package-version '(magit . "2.12.0")
- :group 'magit-diff
- :type '(choice (const :tag "use buffer arguments" buffer)
- (cons :tag "use buffer arguments except"
- (const :format "" exclude)
- (repeat :format "%v%i\n"
- (string :tag "Argument")))
- (repeat :tag "use constant arguments"
- (string :tag "Argument"))))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-patch "magit-patch" nil t)
-(transient-define-prefix magit-patch ()
- "Create or apply patches."
- ["Actions"
- ("c" "Create patches" magit-patch-create)
- ("a" "Apply patch" magit-patch-apply)
- ("s" "Save diff as patch" magit-patch-save)
- ("r" "Request pull" magit-request-pull)])
-
-;;;###autoload (autoload 'magit-patch-create "magit-patch" nil t)
-(transient-define-prefix magit-patch-create (range args files)
- "Create patches for the commits in RANGE.
-When a single commit is given for RANGE, create a patch for the
-changes introduced by that commit (unlike 'git format-patch'
-which creates patches for all commits that are reachable from
-`HEAD' but not from the specified commit)."
- :man-page "git-format-patch"
- :incompatible '(("--subject-prefix=" "--rfc"))
- ["Mail arguments"
- (6 magit-format-patch:--in-reply-to)
- (6 magit-format-patch:--thread)
- (6 magit-format-patch:--from)
- (6 magit-format-patch:--to)
- (6 magit-format-patch:--cc)]
- ["Patch arguments"
- (magit-format-patch:--base)
- (magit-format-patch:--reroll-count)
- (5 magit-format-patch:--interdiff)
- (magit-format-patch:--range-diff)
- (magit-format-patch:--subject-prefix)
- ("C-m r " "RFC subject prefix" "--rfc")
- ("C-m l " "Add cover letter" "--cover-letter")
- (5 magit-format-patch:--cover-from-description)
- (5 magit-format-patch:--notes)
- (magit-format-patch:--output-directory)]
- ["Diff arguments"
- (magit-diff:-U)
- (magit-diff:-M)
- (magit-diff:-C)
- (magit-diff:--diff-algorithm)
- (magit:--)
- (7 "-b" "Ignore whitespace changes" ("-b" "--ignore-space-change"))
- (7 "-w" "Ignore all whitespace" ("-w" "--ignore-all-space"))]
- ["Actions"
- ("c" "Create patches" magit-patch-create)]
- (interactive
- (if (not (eq transient-current-command 'magit-patch-create))
- (list nil nil nil)
- (cons (if-let ((revs (magit-region-values 'commit t)))
- (concat (car (last revs)) "^.." (car revs))
- (let ((range (magit-read-range-or-commit
- "Format range or commit")))
- (if (string-match-p "\\.\\." range)
- range
- (format "%s~..%s" range range))))
- (let ((args (transient-args 'magit-patch-create)))
- (list (-filter #'stringp args)
- (cdr (assoc "--" args)))))))
- (if (not range)
- (transient-setup 'magit-patch-create)
- (magit-run-git "format-patch" range args "--" files)
- (when (member "--cover-letter" args)
- (save-match-data
- (find-file
- (expand-file-name
- (concat (--some (and (string-match "\\`--reroll-count=\\(.+\\)" it)
- (format "v%s-" (match-string 1 it)))
- args)
- "0000-cover-letter.patch")
- (let ((topdir (magit-toplevel)))
- (or (--some (and (string-match "\\`--output-directory=\\(.+\\)" it)
- (expand-file-name (match-string 1 it) topdir))
- args)
- topdir))))))))
-
-(transient-define-argument magit-format-patch:--in-reply-to ()
- :description "In reply to"
- :class 'transient-option
- :key "C-m C-r"
- :argument "--in-reply-to=")
-
-(transient-define-argument magit-format-patch:--thread ()
- :description "Thread style"
- :class 'transient-option
- :key "C-m s "
- :argument "--thread="
- :reader #'magit-format-patch-select-thread-style)
-
-(defun magit-format-patch-select-thread-style (&rest _ignore)
- (magit-read-char-case "Thread style " t
- (?d "[d]eep" "deep")
- (?s "[s]hallow" "shallow")))
-
-(transient-define-argument magit-format-patch:--base ()
- :description "Insert base commit"
- :class 'transient-option
- :key "C-m b "
- :argument "--base="
- :reader #'magit-format-patch-select-base)
-
-(defun magit-format-patch-select-base (prompt initial-input history)
- (or (magit-completing-read prompt (cons "auto" (magit-list-refnames))
- nil nil initial-input history "auto")
- (user-error "Nothing selected")))
-
-(transient-define-argument magit-format-patch:--reroll-count ()
- :description "Reroll count"
- :class 'transient-option
- :key "C-m v "
- :shortarg "-v"
- :argument "--reroll-count="
- :reader 'transient-read-number-N+)
-
-(transient-define-argument magit-format-patch:--interdiff ()
- :description "Insert interdiff"
- :class 'transient-option
- :key "C-m d i"
- :argument "--interdiff="
- :reader #'magit-transient-read-revision)
-
-(transient-define-argument magit-format-patch:--range-diff ()
- :description "Insert range-diff"
- :class 'transient-option
- :key "C-m d r"
- :argument "--range-diff="
- :reader #'magit-format-patch-select-range-diff)
-
-(defun magit-format-patch-select-range-diff (prompt _initial-input _history)
- (magit-read-range-or-commit prompt))
-
-(transient-define-argument magit-format-patch:--subject-prefix ()
- :description "Subject Prefix"
- :class 'transient-option
- :key "C-m p "
- :argument "--subject-prefix=")
-
-(transient-define-argument magit-format-patch:--cover-from-description ()
- :description "Use branch description"
- :class 'transient-option
- :key "C-m D "
- :argument "--cover-from-description="
- :reader #'magit-format-patch-select-description-mode)
-
-(defun magit-format-patch-select-description-mode (&rest _ignore)
- (magit-read-char-case "Use description as " t
- (?m "[m]essage" "message")
- (?s "[s]ubject" "subject")
- (?a "[a]uto" "auto")
- (?n "[n]othing" "none")))
-
-(transient-define-argument magit-format-patch:--notes ()
- :description "Insert commentary from notes"
- :class 'transient-option
- :key "C-m n "
- :argument "--notes="
- :reader #'magit-notes-read-ref)
-
-(transient-define-argument magit-format-patch:--from ()
- :description "From"
- :class 'transient-option
- :key "C-m C-f"
- :argument "--from="
- :reader 'magit-transient-read-person)
-
-(transient-define-argument magit-format-patch:--to ()
- :description "To"
- :class 'transient-option
- :key "C-m C-t"
- :argument "--to="
- :reader 'magit-transient-read-person)
-
-(transient-define-argument magit-format-patch:--cc ()
- :description "CC"
- :class 'transient-option
- :key "C-m C-c"
- :argument "--cc="
- :reader 'magit-transient-read-person)
-
-(transient-define-argument magit-format-patch:--output-directory ()
- :description "Output directory"
- :class 'transient-option
- :key "C-m o "
- :shortarg "-o"
- :argument "--output-directory="
- :reader 'transient-read-existing-directory)
-
-;;;###autoload (autoload 'magit-patch-apply "magit-patch" nil t)
-(transient-define-prefix magit-patch-apply (file &rest args)
- "Apply the patch file FILE."
- :man-page "git-apply"
- ["Arguments"
- ("-i" "Also apply to index" "--index")
- ("-c" "Only apply to index" "--cached")
- ("-3" "Fall back on 3way merge" ("-3" "--3way"))]
- ["Actions"
- ("a" "Apply patch" magit-patch-apply)]
- (interactive
- (if (not (eq transient-current-command 'magit-patch-apply))
- (list nil)
- (list (expand-file-name
- (read-file-name "Apply patch: "
- default-directory nil nil
- (when-let ((file (magit-file-at-point)))
- (file-relative-name file))))
- (transient-args 'magit-patch-apply))))
- (if (not file)
- (transient-setup 'magit-patch-apply)
- (magit-run-git "apply" args "--" (magit-convert-filename-for-git file))))
-
-;;;###autoload
-(defun magit-patch-save (file &optional arg)
- "Write current diff into patch FILE.
-
-What arguments are used to create the patch depends on the value
-of `magit-patch-save-arguments' and whether a prefix argument is
-used.
-
-If the value is the symbol `buffer', then use the same arguments
-as the buffer. With a prefix argument use no arguments.
-
-If the value is a list beginning with the symbol `exclude', then
-use the same arguments as the buffer except for those matched by
-entries in the cdr of the list. The comparison is done using
-`string-prefix-p'. With a prefix argument use the same arguments
-as the buffer.
-
-If the value is a list of strings (including the empty list),
-then use those arguments. With a prefix argument use the same
-arguments as the buffer.
-
-Of course the arguments that are required to actually show the
-same differences as those shown in the buffer are always used."
- (interactive (list (read-file-name "Write patch file: " default-directory)
- current-prefix-arg))
- (unless (derived-mode-p 'magit-diff-mode)
- (user-error "Only diff buffers can be saved as patches"))
- (let ((rev magit-buffer-range)
- (typearg magit-buffer-typearg)
- (args magit-buffer-diff-args)
- (files magit-buffer-diff-files))
- (cond ((eq magit-patch-save-arguments 'buffer)
- (when arg
- (setq args nil)))
- ((eq (car-safe magit-patch-save-arguments) 'exclude)
- (unless arg
- (setq args (-difference args (cdr magit-patch-save-arguments)))))
- ((not arg)
- (setq args magit-patch-save-arguments)))
- (with-temp-file file
- (magit-git-insert "diff" rev "-p" typearg args "--" files)))
- (magit-refresh))
-
-;;;###autoload
-(defun magit-request-pull (url start end)
- "Request upstream to pull from you public repository.
-
-URL is the url of your publicly accessible repository.
-START is a commit that already is in the upstream repository.
-END is the last commit, usually a branch name, which upstream
-is asked to pull. START has to be reachable from that commit."
- (interactive
- (list (magit-get "remote" (magit-read-remote "Remote") "url")
- (magit-read-branch-or-commit "Start" (magit-get-upstream-branch))
- (magit-read-branch-or-commit "End")))
- (let ((dir default-directory))
- ;; mu4e changes default-directory
- (compose-mail)
- (setq default-directory dir))
- (message-goto-body)
- (magit-git-insert "request-pull" start url end)
- (set-buffer-modified-p nil))
-
-;;; _
-(provide 'magit-patch)
-;;; magit-patch.el ends here
diff --git a/elpa/magit-20200728.45/magit-pkg.el b/elpa/magit-20200728.45/magit-pkg.el
deleted file mode 100644
index 0ae3799..0000000
--- a/elpa/magit-20200728.45/magit-pkg.el
+++ /dev/null
@@ -1,12 +0,0 @@
-(define-package "magit" "20200728.45" "A Git porcelain inside Emacs."
- '((emacs "25.1")
- (async "20200113")
- (dash "20200524")
- (git-commit "20200516")
- (transient "20200601")
- (with-editor "20200522"))
- :commit "fccd3cff52fc5b655bbb80bc6c894a2a27f188ea" :keywords
- '("git" "tools" "vc"))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/magit-20200728.45/magit-process.el b/elpa/magit-20200728.45/magit-process.el
deleted file mode 100644
index 12eedf8..0000000
--- a/elpa/magit-20200728.45/magit-process.el
+++ /dev/null
@@ -1,1156 +0,0 @@
-;;; magit-process.el --- process functionality -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements the tools used to run Git for side-effects.
-
-;; Note that the functions used to run Git and then consume its
-;; output, are defined in `magit-git.el'. There's a bit of overlap
-;; though.
-
-;;; Code:
-
-(require 'ansi-color)
-(require 'cl-lib)
-(require 'dash)
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'with-editor)
-(require 'magit-utils)
-(require 'magit-section)
-(require 'magit-git)
-(require 'magit-mode)
-
-(declare-function auth-source-search "auth-source"
- (&rest spec &key max require create delete &allow-other-keys))
-
-;;; Options
-
-(defcustom magit-process-connection-type (not (eq system-type 'cygwin))
- "Connection type used for the Git process.
-
-If nil, use pipes: this is usually more efficient, and works on Cygwin.
-If t, use ptys: this enables Magit to prompt for passphrases when needed."
- :group 'magit-process
- :type '(choice (const :tag "pipe" nil)
- (const :tag "pty" t)))
-
-(defcustom magit-need-cygwin-noglob
- (and (eq system-type 'windows-nt)
- (with-temp-buffer
- (let ((process-environment
- (append magit-git-environment process-environment)))
- (condition-case e
- (process-file magit-git-executable
- nil (current-buffer) nil
- "-c" "alias.echo=!echo" "echo" "x{0}")
- (file-error
- (lwarn 'magit-process :warning
- "Could not run Git: %S" e))))
- (equal "x0\n" (buffer-string))))
- "Whether to use a workaround for Cygwin's globbing behavior.
-
-If non-nil, add environment variables to `process-environment' to
-prevent the git.exe distributed by Cygwin and MSYS2 from
-attempting to perform glob expansion when called from a native
-Windows build of Emacs. See #2246."
- :package-version '(magit . "2.3.0")
- :group 'magit-process
- :type '(choice (const :tag "Yes" t)
- (const :tag "No" nil)))
-
-(defcustom magit-process-popup-time -1
- "Popup the process buffer if a command takes longer than this many seconds."
- :group 'magit-process
- :type '(choice (const :tag "Never" -1)
- (const :tag "Immediately" 0)
- (integer :tag "After this many seconds")))
-
-(defcustom magit-process-log-max 32
- "Maximum number of sections to keep in a process log buffer.
-When adding a new section would go beyond the limit set here,
-then the older half of the sections are remove. Sections that
-belong to processes that are still running are never removed.
-When this is nil, no sections are ever removed."
- :package-version '(magit . "2.1.0")
- :group 'magit-process
- :type '(choice (const :tag "Never remove old sections" nil) integer))
-
-(defcustom magit-process-error-tooltip-max-lines 20
- "The number of lines for `magit-process-error-lines' to return.
-
-These are displayed in a tooltip for `mode-line-process' errors.
-
-If `magit-process-error-tooltip-max-lines' is nil, the tooltip
-displays the text of `magit-process-error-summary' instead."
- :package-version '(magit . "2.12.0")
- :group 'magit-process
- :type '(choice (const :tag "Use summary line" nil)
- integer))
-
-(defcustom magit-credential-cache-daemon-socket
- (--some (pcase-let ((`(,prog . ,args) (split-string it)))
- (if (and prog
- (string-match-p
- "\\`\\(?:\\(?:/.*/\\)?git-credential-\\)?cache\\'" prog))
- (or (cl-loop for (opt val) on args
- if (string= opt "--socket")
- return val)
- (expand-file-name "~/.git-credential-cache/socket"))))
- ;; Note: `magit-process-file' is not yet defined when
- ;; evaluating this form, so we use `process-lines'.
- (ignore-errors
- (let ((process-environment
- (append magit-git-environment process-environment)))
- (process-lines magit-git-executable
- "config" "--get-all" "credential.helper"))))
- "If non-nil, start a credential cache daemon using this socket.
-
-When using Git's cache credential helper in the normal way, Emacs
-sends a SIGHUP to the credential daemon after the git subprocess
-has exited, causing the daemon to also quit. This can be avoided
-by starting the `git-credential-cache--daemon' process directly
-from Emacs.
-
-The function `magit-maybe-start-credential-cache-daemon' takes
-care of starting the daemon if necessary, using the value of this
-option as the socket. If this option is nil, then it does not
-start any daemon. Likewise if another daemon is already running,
-then it starts no new daemon. This function has to be a member
-of the hook variable `magit-credential-hook' for this to work.
-If an error occurs while starting the daemon, most likely because
-the necessary executable is missing, then the function removes
-itself from the hook, to avoid further futile attempts."
- :package-version '(magit . "2.3.0")
- :group 'magit-process
- :type '(choice (file :tag "Socket")
- (const :tag "Don't start a cache daemon" nil)))
-
-(defcustom magit-process-yes-or-no-prompt-regexp
- (concat " [\[(]"
- "\\([Yy]\\(?:es\\)?\\)"
- "[/|]"
- "\\([Nn]o?\\)"
- ;; OpenSSH v8 prints this. See #3969.
- "\\(?:/\\[fingerprint\\]\\)?"
- "[\])] ?[?:] ?$")
- "Regexp matching Yes-or-No prompts of Git and its subprocesses."
- :package-version '(magit . "2.1.0")
- :group 'magit-process
- :type 'regexp)
-
-(defcustom magit-process-password-prompt-regexps
- '("^\\(Enter \\)?[Pp]assphrase\\( for \\(RSA \\)?key '.*'\\)?: ?$"
- ;; Match-group 99 is used to identify the "user@host" part.
- "^\\(Enter \\)?[Pp]assword\\( for '?\\(https?://\\)?\\(?99:[^']*\\)'?\\)?: ?$"
- "Please enter the passphrase for the ssh key"
- "Please enter the passphrase to unlock the OpenPGP secret key"
- "^.*'s password: ?$"
- "^Yubikey for .*: ?$"
- "^Enter PIN for .*: ?$")
- "List of regexps matching password prompts of Git and its subprocesses.
-Also see `magit-process-find-password-functions'."
- :package-version '(magit . "2.8.0")
- :group 'magit-process
- :type '(repeat (regexp)))
-
-(defcustom magit-process-find-password-functions nil
- "List of functions to try in sequence to get a password.
-
-These functions may be called when git asks for a password, which
-is detected using `magit-process-password-prompt-regexps'. They
-are called if and only if matching the prompt resulted in the
-value of the 99th submatch to be non-nil. Therefore users can
-control for which prompts these functions should be called by
-putting the host name in the 99th submatch, or not.
-
-If the functions are called, then they are called in the order
-given, with the host name as only argument, until one of them
-returns non-nil. If they are not called or none of them returns
-non-nil, then the password is read from the user instead."
- :package-version '(magit . "2.3.0")
- :group 'magit-process
- :type 'hook
- :options '(magit-process-password-auth-source))
-
-(defcustom magit-process-username-prompt-regexps
- '("^Username for '.*': ?$")
- "List of regexps matching username prompts of Git and its subprocesses."
- :package-version '(magit . "2.1.0")
- :group 'magit-process
- :type '(repeat (regexp)))
-
-(defcustom magit-process-prompt-functions nil
- "List of functions used to forward arbitrary questions to the user.
-
-Magit has dedicated support for forwarding username and password
-prompts and Yes-or-No questions asked by Git and its subprocesses
-to the user. This can be customized using other options in the
-`magit-process' customization group.
-
-If you encounter a new question that isn't handled by default,
-then those options should be used instead of this hook.
-
-However subprocesses may also ask questions that differ too much
-from what the code related to the above options assume, and this
-hook allows users to deal with such questions explicitly.
-
-Each function is called with the process and the output string
-as arguments until one of the functions returns non-nil. The
-function is responsible for asking the user the appropriate
-question using e.g. `read-char-choice' and then forwarding the
-answer to the process using `process-send-string'.
-
-While functions such as `magit-process-yes-or-no-prompt' may not
-be sufficient to handle some prompt, it may still be of benefit
-to look at the implementations to gain some insights on how to
-implement such functions."
- :package-version '(magit . "3.0.0")
- :group 'magit-process
- :type 'hook)
-
-(defcustom magit-process-ensure-unix-line-ending t
- "Whether Magit should ensure a unix coding system when talking to Git."
- :package-version '(magit . "2.6.0")
- :group 'magit-process
- :type 'boolean)
-
-(defcustom magit-process-display-mode-line-error t
- "Whether Magit should retain and highlight process errors in the mode line."
- :package-version '(magit . "2.12.0")
- :group 'magit-process
- :type 'boolean)
-
-(defface magit-process-ok
- '((t :inherit magit-section-heading :foreground "green"))
- "Face for zero exit-status."
- :group 'magit-faces)
-
-(defface magit-process-ng
- '((t :inherit magit-section-heading :foreground "red"))
- "Face for non-zero exit-status."
- :group 'magit-faces)
-
-(defface magit-mode-line-process
- '((t :inherit mode-line-emphasis))
- "Face for `mode-line-process' status when Git is running for side-effects."
- :group 'magit-faces)
-
-(defface magit-mode-line-process-error
- '((t :inherit error))
- "Face for `mode-line-process' error status.
-
-Used when `magit-process-display-mode-line-error' is non-nil."
- :group 'magit-faces)
-
-;;; Process Mode
-
-(defvar magit-process-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-mode-map)
- map)
- "Keymap for `magit-process-mode'.")
-
-(define-derived-mode magit-process-mode magit-mode "Magit Process"
- "Mode for looking at Git process output."
- :group 'magit-process
- (hack-dir-local-variables-non-file-buffer)
- (setq imenu-prev-index-position-function
- 'magit-imenu--process-prev-index-position-function)
- (setq imenu-extract-index-name-function
- 'magit-imenu--process-extract-index-name-function))
-
-(defun magit-process-buffer (&optional nodisplay)
- "Display the current repository's process buffer.
-
-If that buffer doesn't exist yet, then create it.
-Non-interactively return the buffer and unless
-optional NODISPLAY is non-nil also display it."
- (interactive)
- (let ((topdir (magit-toplevel)))
- (unless topdir
- (magit--with-safe-default-directory nil
- (setq topdir default-directory)
- (let (prev)
- (while (not (equal topdir prev))
- (setq prev topdir)
- (setq topdir (file-name-directory (directory-file-name topdir)))))))
- (let ((buffer (or (--first (with-current-buffer it
- (and (eq major-mode 'magit-process-mode)
- (equal default-directory topdir)))
- (buffer-list))
- (let ((default-directory topdir))
- (magit-generate-new-buffer 'magit-process-mode)))))
- (with-current-buffer buffer
- (if magit-root-section
- (when magit-process-log-max
- (magit-process-truncate-log))
- (magit-process-mode)
- (let ((inhibit-read-only t)
- (magit-insert-section--parent nil)
- (magit-insert-section--oldroot nil))
- (make-local-variable 'text-property-default-nonsticky)
- (magit-insert-section (processbuf)
- (insert "\n")))))
- (unless nodisplay
- (magit-display-buffer buffer))
- buffer)))
-
-(defun magit-process-kill ()
- "Kill the process at point."
- (interactive)
- (when-let ((process (magit-section-value-if 'process)))
- (unless (eq (process-status process) 'run)
- (user-error "Process isn't running"))
- (magit-confirm 'kill-process)
- (kill-process process)))
-
-;;; Synchronous Processes
-
-(defvar magit-process-raise-error nil)
-
-(defun magit-git (&rest args)
- "Call Git synchronously in a separate process, for side-effects.
-
-Option `magit-git-executable' specifies the Git executable.
-The arguments ARGS specify arguments to Git, they are flattened
-before use.
-
-Process output goes into a new section in the buffer returned by
-`magit-process-buffer'. If Git exits with a non-zero status,
-then raise an error."
- (let ((magit-process-raise-error t))
- (magit-call-git args)))
-
-(defun magit-run-git (&rest args)
- "Call Git synchronously in a separate process, and refresh.
-
-Option `magit-git-executable' specifies the Git executable and
-option `magit-git-global-arguments' specifies constant arguments.
-The arguments ARGS specify arguments to Git, they are flattened
-before use.
-
-After Git returns, the current buffer (if it is a Magit buffer)
-as well as the current repository's status buffer are refreshed.
-
-Process output goes into a new section in the buffer returned by
-`magit-process-buffer'."
- (let ((magit--refresh-cache (list (cons 0 0))))
- (magit-call-git args)
- (when (member (car args) '("init" "clone"))
- ;; Creating a new repository invalidates the cache.
- (setq magit--refresh-cache nil))
- (magit-refresh)))
-
-(defvar magit-pre-call-git-hook nil)
-
-(defun magit-call-git (&rest args)
- "Call Git synchronously in a separate process.
-
-Option `magit-git-executable' specifies the Git executable and
-option `magit-git-global-arguments' specifies constant arguments.
-The arguments ARGS specify arguments to Git, they are flattened
-before use.
-
-Process output goes into a new section in the buffer returned by
-`magit-process-buffer'."
- (run-hooks 'magit-pre-call-git-hook)
- (let ((default-process-coding-system (magit--process-coding-system)))
- (apply #'magit-call-process magit-git-executable
- (magit-process-git-arguments args))))
-
-(defun magit-call-process (program &rest args)
- "Call PROGRAM synchronously in a separate process.
-Process output goes into a new section in the buffer returned by
-`magit-process-buffer'."
- (pcase-let ((`(,process-buf . ,section)
- (magit-process-setup program args)))
- (magit-process-finish
- (let ((inhibit-read-only t))
- (apply #'magit-process-file program nil process-buf nil args))
- process-buf (current-buffer) default-directory section)))
-
-(defun magit-process-file (process &optional infile buffer display &rest args)
- "Process files synchronously in a separate process.
-Identical to `process-file' but temporarily enable Cygwin's
-\"noglob\" option during the call and ensure unix eol
-conversion."
- (let ((process-environment (magit-process-environment))
- (default-process-coding-system (magit--process-coding-system)))
- (apply #'process-file process infile buffer display args)))
-
-(defun magit-process-environment ()
- ;; The various w32 hacks are only applicable when running on the
- ;; local machine. As of Emacs 25.1, a local binding of
- ;; process-environment different from the top-level value affects
- ;; the environment used in
- ;; tramp-sh-handle-{start-file-process,process-file}.
- (let ((local (not (file-remote-p default-directory))))
- (append magit-git-environment
- (and local
- (cdr (assoc magit-git-executable magit-git-w32-path-hack)))
- (and local magit-need-cygwin-noglob
- (mapcar (lambda (var)
- (concat var "=" (--if-let (getenv var)
- (concat it " noglob")
- "noglob")))
- '("CYGWIN" "MSYS")))
- process-environment)))
-
-(defvar magit-this-process nil)
-
-(defun magit-run-git-with-input (&rest args)
- "Call Git in a separate process.
-ARGS is flattened and then used as arguments to Git.
-
-The current buffer's content is used as the process's standard
-input.
-
-Option `magit-git-executable' specifies the Git executable and
-option `magit-git-global-arguments' specifies constant arguments.
-The remaining arguments ARGS specify arguments to Git, they are
-flattened before use."
- (when (eq system-type 'windows-nt)
- ;; On w32, git expects UTF-8 encoded input, ignore any user
- ;; configuration telling us otherwise (see #3250).
- (encode-coding-region (point-min) (point-max) 'utf-8-unix))
- (if (file-remote-p default-directory)
- ;; We lack `process-file-region', so fall back to asynch +
- ;; waiting in remote case.
- (progn
- (magit-start-git (current-buffer) args)
- (while (and magit-this-process
- (eq (process-status magit-this-process) 'run))
- (sleep-for 0.005)))
- (run-hooks 'magit-pre-call-git-hook)
- (pcase-let* ((process-environment (magit-process-environment))
- (default-process-coding-system (magit--process-coding-system))
- (flat-args (magit-process-git-arguments args))
- (`(,process-buf . ,section)
- (magit-process-setup magit-git-executable flat-args))
- (inhibit-read-only t))
- (magit-process-finish
- (apply #'call-process-region (point-min) (point-max)
- magit-git-executable nil process-buf nil flat-args)
- process-buf nil default-directory section))))
-
-;;; Asynchronous Processes
-
-(defun magit-run-git-async (&rest args)
- "Start Git, prepare for refresh, and return the process object.
-ARGS is flattened and then used as arguments to Git.
-
-Display the command line arguments in the echo area.
-
-After Git returns some buffers are refreshed: the buffer that was
-current when this function was called (if it is a Magit buffer
-and still alive), as well as the respective Magit status buffer.
-
-See `magit-start-process' for more information."
- (message "Running %s %s" magit-git-executable
- (let ((m (mapconcat #'identity (-flatten args) " ")))
- (remove-list-of-text-properties 0 (length m) '(face) m)
- m))
- (magit-start-git nil args))
-
-(defun magit-run-git-with-editor (&rest args)
- "Export GIT_EDITOR and start Git.
-Also prepare for refresh and return the process object.
-ARGS is flattened and then used as arguments to Git.
-
-Display the command line arguments in the echo area.
-
-After Git returns some buffers are refreshed: the buffer that was
-current when this function was called (if it is a Magit buffer
-and still alive), as well as the respective Magit status buffer.
-
-See `magit-start-process' and `with-editor' for more information."
- (magit--record-separated-gitdir)
- (magit-with-editor (magit-run-git-async args)))
-
-(defun magit-run-git-sequencer (&rest args)
- "Export GIT_EDITOR and start Git.
-Also prepare for refresh and return the process object.
-ARGS is flattened and then used as arguments to Git.
-
-Display the command line arguments in the echo area.
-
-After Git returns some buffers are refreshed: the buffer that was
-current when this function was called (if it is a Magit buffer
-and still alive), as well as the respective Magit status buffer.
-If the sequence stops at a commit, make the section representing
-that commit the current section by moving `point' there.
-
-See `magit-start-process' and `with-editor' for more information."
- (apply #'magit-run-git-with-editor args)
- (set-process-sentinel magit-this-process #'magit-sequencer-process-sentinel)
- magit-this-process)
-
-(defvar magit-pre-start-git-hook nil)
-
-(defun magit-start-git (input &rest args)
- "Start Git, prepare for refresh, and return the process object.
-
-If INPUT is non-nil, it has to be a buffer or the name of an
-existing buffer. The buffer content becomes the processes
-standard input.
-
-Option `magit-git-executable' specifies the Git executable and
-option `magit-git-global-arguments' specifies constant arguments.
-The remaining arguments ARGS specify arguments to Git, they are
-flattened before use.
-
-After Git returns some buffers are refreshed: the buffer that was
-current when this function was called (if it is a Magit buffer
-and still alive), as well as the respective Magit status buffer.
-
-See `magit-start-process' for more information."
- (run-hooks 'magit-pre-start-git-hook)
- (let ((default-process-coding-system (magit--process-coding-system)))
- (apply #'magit-start-process magit-git-executable input
- (magit-process-git-arguments args))))
-
-(defun magit-start-process (program &optional input &rest args)
- "Start PROGRAM, prepare for refresh, and return the process object.
-
-If optional argument INPUT is non-nil, it has to be a buffer or
-the name of an existing buffer. The buffer content becomes the
-processes standard input.
-
-The process is started using `start-file-process' and then setup
-to use the sentinel `magit-process-sentinel' and the filter
-`magit-process-filter'. Information required by these functions
-is stored in the process object. When this function returns the
-process has not started to run yet so it is possible to override
-the sentinel and filter.
-
-After the process returns, `magit-process-sentinel' refreshes the
-buffer that was current when `magit-start-process' was called (if
-it is a Magit buffer and still alive), as well as the respective
-Magit status buffer."
- (pcase-let*
- ((`(,process-buf . ,section)
- (magit-process-setup program args))
- (process
- (let ((process-connection-type
- ;; Don't use a pty, because it would set icrnl
- ;; which would modify the input (issue #20).
- (and (not input) magit-process-connection-type))
- (process-environment (magit-process-environment))
- (default-process-coding-system (magit--process-coding-system)))
- (apply #'start-file-process
- (file-name-nondirectory program)
- process-buf program args))))
- (with-editor-set-process-filter process #'magit-process-filter)
- (set-process-sentinel process #'magit-process-sentinel)
- (set-process-buffer process process-buf)
- (when (eq system-type 'windows-nt)
- ;; On w32, git expects UTF-8 encoded input, ignore any user
- ;; configuration telling us otherwise.
- (set-process-coding-system process 'utf-8-unix))
- (process-put process 'section section)
- (process-put process 'command-buf (current-buffer))
- (process-put process 'default-dir default-directory)
- (when inhibit-magit-refresh
- (process-put process 'inhibit-refresh t))
- (oset section process process)
- (with-current-buffer process-buf
- (set-marker (process-mark process) (point)))
- (when input
- (with-current-buffer input
- (process-send-region process (point-min) (point-max))
- (process-send-eof process)))
- (setq magit-this-process process)
- (oset section value process)
- (magit-process-display-buffer process)
- process))
-
-(defun magit-parse-git-async (&rest args)
- (setq args (magit-process-git-arguments args))
- (let ((command-buf (current-buffer))
- (process-buf (generate-new-buffer " *temp*"))
- (toplevel (magit-toplevel)))
- (with-current-buffer process-buf
- (setq default-directory toplevel)
- (let ((process
- (let ((process-connection-type nil)
- (process-environment (magit-process-environment))
- (default-process-coding-system
- (magit--process-coding-system)))
- (apply #'start-file-process "git" process-buf
- magit-git-executable args))))
- (process-put process 'command-buf command-buf)
- (process-put process 'parsed (point))
- (setq magit-this-process process)
- process))))
-
-;;; Process Internals
-
-(defun magit-process-setup (program args)
- (magit-process-set-mode-line program args)
- (let ((pwd default-directory)
- (buf (magit-process-buffer t)))
- (cons buf (with-current-buffer buf
- (prog1 (magit-process-insert-section pwd program args nil nil)
- (backward-char 1))))))
-
-(defun magit-process-insert-section (pwd program args &optional errcode errlog)
- (let ((inhibit-read-only t)
- (magit-insert-section--parent magit-root-section)
- (magit-insert-section--oldroot nil))
- (goto-char (1- (point-max)))
- (magit-insert-section (process)
- (insert (if errcode
- (format "%3s " (propertize (number-to-string errcode)
- 'font-lock-face 'magit-process-ng))
- "run "))
- (unless (equal (expand-file-name pwd)
- (expand-file-name default-directory))
- (insert (file-relative-name pwd default-directory) ?\s))
- (cond
- ((and args (equal program magit-git-executable))
- (setq args (-split-at (length magit-git-global-arguments) args))
- (insert (propertize (file-name-nondirectory program)
- 'font-lock-face 'magit-section-heading) " ")
- (insert (propertize (char-to-string magit-ellipsis)
- 'font-lock-face 'magit-section-heading
- 'help-echo (mapconcat #'identity (car args) " ")))
- (insert " ")
- (insert (propertize (mapconcat #'shell-quote-argument (cadr args) " ")
- 'font-lock-face 'magit-section-heading)))
- ((and args (equal program shell-file-name))
- (insert (propertize (cadr args)
- 'font-lock-face 'magit-section-heading)))
- (t
- (insert (propertize (file-name-nondirectory program)
- 'font-lock-face 'magit-section-heading) " ")
- (insert (propertize (mapconcat #'shell-quote-argument args " ")
- 'font-lock-face 'magit-section-heading))))
- (magit-insert-heading)
- (when errlog
- (if (bufferp errlog)
- (insert (with-current-buffer errlog
- (buffer-substring-no-properties (point-min) (point-max))))
- (insert-file-contents errlog)
- (goto-char (1- (point-max)))))
- (insert "\n"))))
-
-(defun magit-process-truncate-log ()
- (let* ((head nil)
- (tail (oref magit-root-section children))
- (count (length tail)))
- (when (> (1+ count) magit-process-log-max)
- (while (and (cdr tail)
- (> count (/ magit-process-log-max 2)))
- (let* ((inhibit-read-only t)
- (section (car tail))
- (process (oref section process)))
- (cond ((not process))
- ((memq (process-status process) '(exit signal))
- (delete-region (oref section start)
- (1+ (oref section end)))
- (cl-decf count))
- (t
- (push section head))))
- (pop tail))
- (oset magit-root-section children
- (nconc (reverse head) tail)))))
-
-(defun magit-process-sentinel (process event)
- "Default sentinel used by `magit-start-process'."
- (when (memq (process-status process) '(exit signal))
- (setq event (substring event 0 -1))
- (when (string-match "^finished" event)
- (message (concat (capitalize (process-name process)) " finished")))
- (magit-process-finish process)
- (when (eq process magit-this-process)
- (setq magit-this-process nil))
- (unless (process-get process 'inhibit-refresh)
- (let ((command-buf (process-get process 'command-buf)))
- (if (buffer-live-p command-buf)
- (with-current-buffer command-buf
- (magit-refresh))
- (with-temp-buffer
- (setq default-directory (process-get process 'default-dir))
- (magit-refresh)))))))
-
-(defun magit-sequencer-process-sentinel (process event)
- "Special sentinel used by `magit-run-git-sequencer'."
- (when (memq (process-status process) '(exit signal))
- (magit-process-sentinel process event)
- (when-let ((process-buf (process-buffer process)))
- (when (buffer-live-p process-buf)
- (when-let ((status-buf (with-current-buffer process-buf
- (magit-get-mode-buffer 'magit-status-mode))))
- (with-current-buffer status-buf
- (--when-let
- (magit-get-section
- `((commit . ,(magit-rev-parse "HEAD"))
- (,(pcase (car (cadr (-split-at
- (1+ (length magit-git-global-arguments))
- (process-command process))))
- ((or "rebase" "am") 'rebase-sequence)
- ((or "cherry-pick" "revert") 'sequence)))
- (status)))
- (goto-char (oref it start))
- (magit-section-update-highlight))))))))
-
-(defun magit-process-filter (proc string)
- "Default filter used by `magit-start-process'."
- (with-current-buffer (process-buffer proc)
- (let ((inhibit-read-only t))
- (goto-char (process-mark proc))
- ;; Find last ^M in string. If one was found, ignore
- ;; everything before it and delete the current line.
- (when-let ((ret-pos (cl-position ?\r string :from-end t)))
- (cl-callf substring string (1+ ret-pos))
- (delete-region (line-beginning-position) (point)))
- (insert (propertize string 'magit-section
- (process-get proc 'section)))
- (set-marker (process-mark proc) (point))
- ;; Make sure prompts are matched after removing ^M.
- (magit-process-yes-or-no-prompt proc string)
- (magit-process-username-prompt proc string)
- (magit-process-password-prompt proc string)
- (run-hook-with-args-until-success 'magit-process-prompt-functions
- proc string))))
-
-(defmacro magit-process-kill-on-abort (proc &rest body)
- (declare (indent 1) (debug (form body)))
- (let ((map (cl-gensym)))
- `(let ((,map (make-sparse-keymap)))
- (set-keymap-parent ,map minibuffer-local-map)
- (define-key ,map "\C-g"
- (lambda ()
- (interactive)
- (ignore-errors (kill-process ,proc))
- (abort-recursive-edit)))
- (let ((minibuffer-local-map ,map))
- ,@body))))
-
-(defun magit-process-yes-or-no-prompt (process string)
- "Forward Yes-or-No prompts to the user."
- (when-let ((beg (string-match magit-process-yes-or-no-prompt-regexp string)))
- (let ((max-mini-window-height 30))
- (process-send-string
- process
- (downcase
- (concat
- (match-string
- (if (save-match-data
- (magit-process-kill-on-abort process
- (yes-or-no-p (substring string 0 beg)))) 1 2)
- string)
- "\n"))))))
-
-(defun magit-process-password-auth-source (key)
- "Use `auth-source-search' to get a password.
-If found, return the password. Otherwise, return nil.
-
-To use this function add it to the appropriate hook
- (add-hook 'magit-process-find-password-functions
- 'magit-process-password-auth-source)
-
-KEY typically derives from a prompt such as:
- Password for 'https://tarsius@bitbucket.org'
-in which case it would be the string
- tarsius@bitbucket.org
-which matches the ~/.authinfo.gpg entry
- machine bitbucket.org login tarsius password 12345
-or iff that is undefined, for backward compatibility
- machine tarsius@bitbucket.org password 12345"
- (require 'auth-source)
- (and (string-match "\\`\\(.+\\)@\\([^@]+\\)\\'" key)
- (let* ((user (match-string 1 key))
- (host (match-string 2 key))
- (secret
- (plist-get
- (car (or (auth-source-search :max 1 :host host :user user)
- (auth-source-search :max 1 :host key)))
- :secret)))
- (if (functionp secret)
- (funcall secret)
- secret))))
-
-(defun magit-process-password-prompt (process string)
- "Find a password based on prompt STRING and send it to git.
-Use `magit-process-password-prompt-regexps' to find a known
-prompt. If and only if one is found, then call functions in
-`magit-process-find-password-functions' until one of them returns
-the password. If all function return nil, then read the password
-from the user."
- (when-let ((prompt (magit-process-match-prompt
- magit-process-password-prompt-regexps string)))
- (process-send-string
- process (magit-process-kill-on-abort process
- (concat (or (when-let ((key (match-string 99 string)))
- (run-hook-with-args-until-success
- 'magit-process-find-password-functions key))
- (read-passwd prompt))
- "\n")))))
-
-(defun magit-process-username-prompt (process string)
- "Forward username prompts to the user."
- (--when-let (magit-process-match-prompt
- magit-process-username-prompt-regexps string)
- (process-send-string
- process (magit-process-kill-on-abort process
- (concat (read-string it nil nil (user-login-name)) "\n")))))
-
-(defun magit-process-match-prompt (prompts string)
- "Match STRING against PROMPTS and set match data.
-Return the matched string suffixed with \": \", if needed."
- (when (--any-p (string-match it string) prompts)
- (let ((prompt (match-string 0 string)))
- (cond ((string-suffix-p ": " prompt) prompt)
- ((string-suffix-p ":" prompt) (concat prompt " "))
- (t (concat prompt ": "))))))
-
-(defun magit--process-coding-system ()
- (let ((fro (or magit-git-output-coding-system
- (car default-process-coding-system)))
- (to (cdr default-process-coding-system)))
- (if magit-process-ensure-unix-line-ending
- (cons (coding-system-change-eol-conversion fro 'unix)
- (coding-system-change-eol-conversion to 'unix))
- (cons fro to))))
-
-(defvar magit-credential-hook nil
- "Hook run before Git needs credentials.")
-
-(defvar magit-credential-cache-daemon-process nil)
-
-(defun magit-maybe-start-credential-cache-daemon ()
- "Maybe start a `git-credential-cache--daemon' process.
-
-If such a process is already running or if the value of option
-`magit-credential-cache-daemon-socket' is nil, then do nothing.
-Otherwise start the process passing the value of that options
-as argument."
- (unless (or (not magit-credential-cache-daemon-socket)
- (process-live-p magit-credential-cache-daemon-process)
- (memq magit-credential-cache-daemon-process
- (list-system-processes)))
- (setq magit-credential-cache-daemon-process
- (or (--first (let* ((attr (process-attributes it))
- (comm (cdr (assq 'comm attr)))
- (user (cdr (assq 'user attr))))
- (and (string= comm "git-credential-cache--daemon")
- (string= user user-login-name)))
- (list-system-processes))
- (condition-case nil
- (start-process "git-credential-cache--daemon"
- " *git-credential-cache--daemon*"
- magit-git-executable
- "credential-cache--daemon"
- magit-credential-cache-daemon-socket)
- ;; Some Git implementations (e.g. Windows) won't have
- ;; this program; if we fail the first time, stop trying.
- ((debug error)
- (remove-hook 'magit-credential-hook
- #'magit-maybe-start-credential-cache-daemon)))))))
-
-(add-hook 'magit-credential-hook #'magit-maybe-start-credential-cache-daemon)
-
-(defun tramp-sh-handle-start-file-process--magit-tramp-process-environment
- (fn name buffer program &rest args)
- (if magit-tramp-process-environment
- (apply fn name buffer
- (car magit-tramp-process-environment)
- (append (cdr magit-tramp-process-environment)
- (cons program args)))
- (apply fn name buffer program args)))
-
-(advice-add 'tramp-sh-handle-start-file-process :around
- 'tramp-sh-handle-start-file-process--magit-tramp-process-environment)
-
-(defun tramp-sh-handle-process-file--magit-tramp-process-environment
- (fn program &optional infile destination display &rest args)
- (if magit-tramp-process-environment
- (apply fn "env" infile destination display
- (append magit-tramp-process-environment
- (cons program args)))
- (apply fn program infile destination display args)))
-
-(advice-add 'tramp-sh-handle-process-file :around
- 'tramp-sh-handle-process-file--magit-tramp-process-environment)
-
-(defvar magit-mode-line-process-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "<mode-line> <mouse-1>")
- 'magit-process-buffer)
- map)
- "Keymap for `mode-line-process'.")
-
-(defun magit-process-set-mode-line (program args)
- "Display the git command (sans arguments) in the mode line."
- (when (equal program magit-git-executable)
- (setq args (nthcdr (length magit-git-global-arguments) args)))
- (let ((str (concat " " (propertize
- (concat (file-name-nondirectory program)
- (and args (concat " " (car args))))
- 'mouse-face 'highlight
- 'keymap magit-mode-line-process-map
- 'help-echo "mouse-1: Show process buffer"
- 'font-lock-face 'magit-mode-line-process))))
- (magit-repository-local-set 'mode-line-process str)
- (dolist (buf (magit-mode-get-buffers))
- (with-current-buffer buf
- (setq mode-line-process str)))
- (force-mode-line-update t)))
-
-(defun magit-process-set-mode-line-error-status (&optional error str)
- "Apply an error face to the string set by `magit-process-set-mode-line'.
-
-If ERROR is supplied, include it in the `mode-line-process' tooltip.
-
-If STR is supplied, it replaces the `mode-line-process' text."
- (setq str (or str (magit-repository-local-get 'mode-line-process)))
- (when str
- (setq error (format "%smouse-1: Show process buffer"
- (if (stringp error)
- (concat error "\n\n")
- "")))
- (setq str (concat " " (propertize
- (substring-no-properties str 1)
- 'mouse-face 'highlight
- 'keymap magit-mode-line-process-map
- 'help-echo error
- 'font-lock-face 'magit-mode-line-process-error)))
- (magit-repository-local-set 'mode-line-process str)
- (dolist (buf (magit-mode-get-buffers))
- (with-current-buffer buf
- (setq mode-line-process str)))
- (force-mode-line-update t)
- ;; We remove any error status from the mode line when a magit
- ;; buffer is refreshed (see `magit-refresh-buffer'), but we must
- ;; ensure that we ignore any refreshes during the remainder of the
- ;; current command -- otherwise a newly-set error status would be
- ;; removed before it was seen. We set a flag which prevents the
- ;; status from being removed prior to the next command, so that
- ;; the error status is guaranteed to remain visible until then.
- (let ((repokey (magit-repository-local-repository)))
- ;; The following closure captures the repokey value, and is
- ;; added to `pre-command-hook'.
- (cl-labels ((enable-magit-process-unset-mode-line
- () ;; Remove ourself from the hook variable, so
- ;; that we only run once.
- (remove-hook 'pre-command-hook
- #'enable-magit-process-unset-mode-line)
- ;; Clear the inhibit flag for the repository in
- ;; which we set it.
- (magit-repository-local-set
- 'inhibit-magit-process-unset-mode-line nil repokey)))
- ;; Set the inhibit flag until the next command is invoked.
- (magit-repository-local-set
- 'inhibit-magit-process-unset-mode-line t repokey)
- (add-hook 'pre-command-hook
- #'enable-magit-process-unset-mode-line)))))
-
-(defun magit-process-unset-mode-line-error-status ()
- "Remove any current error status from the mode line."
- (let ((status (or mode-line-process
- (magit-repository-local-get 'mode-line-process))))
- (when (and status
- (eq (get-text-property 1 'font-lock-face status)
- 'magit-mode-line-process-error))
- (magit-process-unset-mode-line))))
-
-(defun magit-process-unset-mode-line (&optional directory)
- "Remove the git command from the mode line."
- (let ((default-directory (or directory default-directory)))
- (unless (magit-repository-local-get 'inhibit-magit-process-unset-mode-line)
- (magit-repository-local-set 'mode-line-process nil)
- (dolist (buf (magit-mode-get-buffers))
- (with-current-buffer buf (setq mode-line-process nil)))
- (force-mode-line-update t))))
-
-(defvar magit-process-error-message-regexps
- (list "^\\*ERROR\\*: Canceled by user$"
- "^\\(?:error\\|fatal\\|git\\): \\(.*\\)$"
- "^\\(Cannot rebase:.*\\)$"))
-
-(define-error 'magit-git-error "Git error")
-
-(defun magit-process-error-summary (process-buf section)
- "A one-line error summary from the given SECTION."
- (or (and (buffer-live-p process-buf)
- (with-current-buffer process-buf
- (and (oref section content)
- (save-excursion
- (goto-char (oref section end))
- (run-hook-wrapped
- 'magit-process-error-message-regexps
- (lambda (re)
- (save-excursion
- (and (re-search-backward
- re (oref section start) t)
- (or (match-string-no-properties 1)
- (and (not magit-process-raise-error)
- 'suppressed))))))))))
- "Git failed"))
-
-(defun magit-process-error-tooltip (process-buf section)
- "Returns the text from SECTION of the PROCESS-BUF buffer.
-
-Limited by `magit-process-error-tooltip-max-lines'."
- (and (integerp magit-process-error-tooltip-max-lines)
- (> magit-process-error-tooltip-max-lines 0)
- (buffer-live-p process-buf)
- (with-current-buffer process-buf
- (save-excursion
- (goto-char (or (oref section content)
- (oref section start)))
- (buffer-substring-no-properties
- (point)
- (save-excursion
- (forward-line magit-process-error-tooltip-max-lines)
- (goto-char
- (if (> (point) (oref section end))
- (oref section end)
- (point)))
- ;; Remove any trailing whitespace.
- (when (re-search-backward "[^[:space:]\n]"
- (oref section start) t)
- (forward-char 1))
- (point)))))))
-
-(defvar-local magit-this-error nil)
-
-(defvar magit-process-finish-apply-ansi-colors nil)
-
-(defun magit-process-finish (arg &optional process-buf command-buf
- default-dir section)
- (unless (integerp arg)
- (setq process-buf (process-buffer arg))
- (setq command-buf (process-get arg 'command-buf))
- (setq default-dir (process-get arg 'default-dir))
- (setq section (process-get arg 'section))
- (setq arg (process-exit-status arg)))
- (when (fboundp 'dired-uncache)
- (dired-uncache default-dir))
- (when (buffer-live-p process-buf)
- (with-current-buffer process-buf
- (let ((inhibit-read-only t)
- (marker (oref section start)))
- (goto-char marker)
- (save-excursion
- (delete-char 3)
- (set-marker-insertion-type marker nil)
- (insert (propertize (format "%3s" arg)
- 'magit-section section
- 'font-lock-face (if (= arg 0)
- 'magit-process-ok
- 'magit-process-ng)))
- (set-marker-insertion-type marker t))
- (when magit-process-finish-apply-ansi-colors
- (ansi-color-apply-on-region (oref section content)
- (oref section end)))
- (if (= (oref section end)
- (+ (line-end-position) 2))
- (save-excursion
- (goto-char (1+ (line-end-position)))
- (delete-char -1)
- (oset section content nil))
- (let ((buf (magit-process-buffer t)))
- (when (and (= arg 0)
- (not (--any-p (eq (window-buffer it) buf)
- (window-list))))
- (magit-section-hide section)))))))
- (if (= arg 0)
- ;; Unset the `mode-line-process' value upon success.
- (magit-process-unset-mode-line default-dir)
- ;; Otherwise process the error.
- (let ((msg (magit-process-error-summary process-buf section)))
- ;; Change `mode-line-process' to an error face upon failure.
- (if magit-process-display-mode-line-error
- (magit-process-set-mode-line-error-status
- (or (magit-process-error-tooltip process-buf section)
- msg))
- (magit-process-unset-mode-line default-dir))
- ;; Either signal the error, or else display the error summary in
- ;; the status buffer and with a message in the echo area.
- (cond
- (magit-process-raise-error
- (signal 'magit-git-error (list (format "%s (in %s)" msg default-dir))))
- ((not (eq msg 'suppressed))
- (when (buffer-live-p process-buf)
- (with-current-buffer process-buf
- (when-let ((status-buf (magit-get-mode-buffer 'magit-status-mode)))
- (with-current-buffer status-buf
- (setq magit-this-error msg)))))
- (message "%s ... [%s buffer %s for details]" msg
- (if-let ((key (and (buffer-live-p command-buf)
- (with-current-buffer command-buf
- (car (where-is-internal
- 'magit-process-buffer))))))
- (format "Hit %s to see" (key-description key))
- "See")
- (buffer-name process-buf))))))
- arg)
-
-(defun magit-process-display-buffer (process)
- (when (process-live-p process)
- (let ((buf (process-buffer process)))
- (cond ((not (buffer-live-p buf)))
- ((= magit-process-popup-time 0)
- (if (minibufferp)
- (switch-to-buffer-other-window buf)
- (pop-to-buffer buf)))
- ((> magit-process-popup-time 0)
- (run-with-timer magit-process-popup-time nil
- (lambda (p)
- (when (eq (process-status p) 'run)
- (let ((buf (process-buffer p)))
- (when (buffer-live-p buf)
- (if (minibufferp)
- (switch-to-buffer-other-window buf)
- (pop-to-buffer buf))))))
- process))))))
-
-(defun magit--log-action (summary line list)
- (let (heading lines)
- (if (cdr list)
- (progn (setq heading (funcall summary list))
- (setq lines (mapcar line list)))
- (setq heading (funcall line (car list))))
- (with-current-buffer (magit-process-buffer t)
- (goto-char (1- (point-max)))
- (let ((inhibit-read-only t))
- (magit-insert-section (message)
- (magit-insert-heading (concat " * " heading))
- (when lines
- (dolist (line lines)
- (insert line "\n"))
- (insert "\n"))))
- (let ((inhibit-message t))
- (when heading
- (setq lines (cons heading lines)))
- (message (mapconcat #'identity lines "\n"))))))
-
-;;; _
-(provide 'magit-process)
-;;; magit-process.el ends here
diff --git a/elpa/magit-20200728.45/magit-pull.el b/elpa/magit-20200728.45/magit-pull.el
deleted file mode 100644
index 91939d7..0000000
--- a/elpa/magit-20200728.45/magit-pull.el
+++ /dev/null
@@ -1,164 +0,0 @@
-;;; magit-pull.el --- update local objects and refs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements pull commands.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-pull-or-fetch nil
- "Whether `magit-pull' also offers some fetch suffixes."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'boolean)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-pull "magit-pull" nil t)
-(transient-define-prefix magit-pull ()
- "Pull from another repository."
- :man-page "git-pull"
- [:description
- (lambda () (if magit-pull-or-fetch "Pull arguments" "Arguments"))
- ("-r" "Rebase local commits" ("-r" "--rebase"))
- ("-A" "Autostash" "--autostash" :level 7)]
- [:description
- (lambda ()
- (if-let ((branch (magit-get-current-branch)))
- (concat
- (propertize "Pull into " 'face 'transient-heading)
- (propertize branch 'face 'magit-branch-local)
- (propertize " from" 'face 'transient-heading))
- (propertize "Pull from" 'face 'transient-heading)))
- ("p" magit-pull-from-pushremote)
- ("u" magit-pull-from-upstream)
- ("e" "elsewhere" magit-pull-branch)]
- ["Fetch from"
- :if-non-nil magit-pull-or-fetch
- ("f" "remotes" magit-fetch-all-no-prune)
- ("F" "remotes and prune" magit-fetch-all-prune)]
- ["Fetch"
- :if-non-nil magit-pull-or-fetch
- ("o" "another branch" magit-fetch-branch)
- ("s" "explicit refspec" magit-fetch-refspec)
- ("m" "submodules" magit-fetch-modules)]
- ["Configure"
- ("r" magit-branch.<branch>.rebase :if magit-get-current-branch)
- ("C" "variables..." magit-branch-configure)]
- (interactive)
- (transient-setup 'magit-pull nil nil :scope (magit-get-current-branch)))
-
-(defun magit-pull-arguments ()
- (transient-args 'magit-pull))
-
-;;;###autoload (autoload 'magit-pull-from-pushremote "magit-pull" nil t)
-(transient-define-suffix magit-pull-from-pushremote (args)
- "Pull from the push-remote of the current branch.
-
-With a prefix argument or when the push-remote is either not
-configured or unusable, then let the user first configure the
-push-remote."
- :if 'magit-get-current-branch
- :description 'magit-pull--pushbranch-description
- (interactive (list (magit-pull-arguments)))
- (pcase-let ((`(,branch ,remote)
- (magit--select-push-remote "pull from there")))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "pull" args remote branch)))
-
-(defun magit-pull--pushbranch-description ()
- ;; Also used by `magit-rebase-onto-pushremote'.
- (let* ((branch (magit-get-current-branch))
- (target (magit-get-push-branch branch t))
- (remote (magit-get-push-remote branch))
- (v (magit--push-remote-variable branch t)))
- (cond
- (target)
- ((member remote (magit-list-remotes))
- (format "%s, replacing non-existent" v))
- (remote
- (format "%s, replacing invalid" v))
- (t
- (format "%s, setting that" v)))))
-
-;;;###autoload (autoload 'magit-pull-from-upstream "magit-pull" nil t)
-(transient-define-suffix magit-pull-from-upstream (args)
- "Pull from the upstream of the current branch.
-
-With a prefix argument or when the upstream is either not
-configured or unusable, then let the user first configure
-the upstream."
- :if 'magit-get-current-branch
- :description 'magit-pull--upstream-description
- (interactive (list (magit-pull-arguments)))
- (let* ((branch (or (magit-get-current-branch)
- (user-error "No branch is checked out")))
- (remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge")))
- (when (or current-prefix-arg
- (not (or (magit-get-upstream-branch branch)
- (magit--unnamed-upstream-p remote merge))))
- (magit-set-upstream-branch
- branch (magit-read-upstream-branch
- branch (format "Set upstream of %s and pull from there" branch)))
- (setq remote (magit-get "branch" branch "remote"))
- (setq merge (magit-get "branch" branch "merge")))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-with-editor "pull" args remote merge)))
-
-(defun magit-pull--upstream-description ()
- (when-let ((branch (magit-get-current-branch)))
- (or (magit-get-upstream-branch branch)
- (let ((remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge"))
- (u (magit--propertize-face "@{upstream}" 'bold)))
- (cond
- ((magit--unnamed-upstream-p remote merge)
- (format "%s of %s"
- (magit--propertize-face merge 'magit-branch-remote)
- (magit--propertize-face remote 'bold)))
- ((magit--valid-upstream-p remote merge)
- (concat u ", replacing non-existent"))
- ((or remote merge)
- (concat u ", replacing invalid"))
- (t
- (concat u ", setting that")))))))
-
-;;;###autoload
-(defun magit-pull-branch (source args)
- "Pull from a branch read in the minibuffer."
- (interactive (list (magit-read-remote-branch "Pull" nil nil nil t)
- (magit-pull-arguments)))
- (run-hooks 'magit-credential-hook)
- (pcase-let ((`(,remote . ,branch)
- (magit-get-tracked source)))
- (magit-run-git-with-editor "pull" args remote branch)))
-
-;;; _
-(provide 'magit-pull)
-;;; magit-pull.el ends here
diff --git a/elpa/magit-20200728.45/magit-push.el b/elpa/magit-20200728.45/magit-push.el
deleted file mode 100644
index 8783205..0000000
--- a/elpa/magit-20200728.45/magit-push.el
+++ /dev/null
@@ -1,331 +0,0 @@
-;;; magit-push.el --- update remote objects and refs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements push commands.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-push "magit-push" nil t)
-(transient-define-prefix magit-push ()
- "Push to another repository."
- :man-page "git-push"
- ["Arguments"
- ("-f" "Force with lease" (nil "--force-with-lease"))
- ("-F" "Force" ("-f" "--force"))
- ("-h" "Disable hooks" "--no-verify")
- ("-n" "Dry run" ("-n" "--dry-run"))
- (5 "-u" "Set upstream" "--set-upstream")
- (7 "-t" "Follow tags" "--follow-tags")]
- [:if magit-get-current-branch
- :description (lambda ()
- (format (propertize "Push %s to" 'face 'transient-heading)
- (propertize (magit-get-current-branch)
- 'face 'magit-branch-local)))
- ("p" magit-push-current-to-pushremote)
- ("u" magit-push-current-to-upstream)
- ("e" "elsewhere" magit-push-current)]
- ["Push"
- [("o" "another branch" magit-push-other)
- ("r" "explicit refspecs" magit-push-refspecs)
- ("m" "matching branches" magit-push-matching)]
- [("T" "a tag" magit-push-tag)
- ("t" "all tags" magit-push-tags)
- (6 "n" "a note ref" magit-push-notes-ref)]]
- ["Configure"
- ("C" "Set variables..." magit-branch-configure)])
-
-(defun magit-push-arguments ()
- (transient-args 'magit-push))
-
-(defun magit-git-push (branch target args)
- (run-hooks 'magit-credential-hook)
- ;; If the remote branch already exists, then we do not have to
- ;; qualify the target, which we prefer to avoid doing because
- ;; using the default namespace is wrong in obscure cases.
- (pcase-let ((namespace (if (magit-get-tracked target) "" "refs/heads/"))
- (`(,remote . ,target)
- (magit-split-branch-name target)))
- (magit-run-git-async "push" "-v" args remote
- (format "%s:%s%s" branch namespace target))))
-
-;;;###autoload (autoload 'magit-push-current-to-pushremote "magit-push" nil t)
-(transient-define-suffix magit-push-current-to-pushremote (args)
- "Push the current branch to its push-remote.
-
-When the push-remote is not configured, then read the push-remote
-from the user, set it, and then push to it. With a prefix
-argument the push-remote can be changed before pushed to it."
- :if 'magit-get-current-branch
- :description 'magit-push--pushbranch-description
- (interactive (list (magit-push-arguments)))
- (pcase-let ((`(,branch ,remote)
- (magit--select-push-remote "push there")))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" "-v" args remote
- (format "refs/heads/%s:refs/heads/%s"
- branch branch)))) ; see #3847 and #3872
-
-(defun magit-push--pushbranch-description ()
- (let* ((branch (magit-get-current-branch))
- (target (magit-get-push-branch branch t))
- (remote (magit-get-push-remote branch))
- (v (magit--push-remote-variable branch t)))
- (cond
- (target)
- ((member remote (magit-list-remotes))
- (format "%s, creating it"
- (magit--propertize-face (concat remote "/" branch)
- 'magit-branch-remote)))
- (remote
- (format "%s, replacing invalid" v))
- (t
- (format "%s, setting that" v)))))
-
-;;;###autoload (autoload 'magit-push-current-to-upstream "magit-push" nil t)
-(transient-define-suffix magit-push-current-to-upstream (args)
- "Push the current branch to its upstream branch.
-
-With a prefix argument or when the upstream is either not
-configured or unusable, then let the user first configure
-the upstream."
- :if 'magit-get-current-branch
- :description 'magit-push--upstream-description
- (interactive (list (magit-push-arguments)))
- (let* ((branch (or (magit-get-current-branch)
- (user-error "No branch is checked out")))
- (remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge")))
- (when (or current-prefix-arg
- (not (or (magit-get-upstream-branch branch)
- (magit--unnamed-upstream-p remote merge)
- (magit--valid-upstream-p remote merge))))
- (let* ((branches (-union (--map (concat it "/" branch)
- (magit-list-remotes))
- (magit-list-remote-branch-names)))
- (upstream (magit-completing-read
- (format "Set upstream of %s and push there" branch)
- branches nil nil nil 'magit-revision-history
- (or (car (member (magit-remote-branch-at-point) branches))
- (car (member "origin/master" branches)))))
- (upstream (or (magit-get-tracked upstream)
- (magit-split-branch-name upstream))))
- (setq remote (car upstream))
- (setq merge (cdr upstream))
- (unless (string-prefix-p "refs/" merge)
- ;; User selected a non-existent remote-tracking branch.
- ;; It is very likely, but not certain, that this is the
- ;; correct thing to do. It is even more likely that it
- ;; is what the user wants to happen.
- (setq merge (concat "refs/heads/" merge))))
- (cl-pushnew "--set-upstream" args :test #'equal))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" "-v" args remote (concat branch ":" merge))))
-
-(defun magit-push--upstream-description ()
- (when-let ((branch (magit-get-current-branch)))
- (or (magit-get-upstream-branch branch)
- (let ((remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge"))
- (u (magit--propertize-face "@{upstream}" 'bold)))
- (cond
- ((magit--unnamed-upstream-p remote merge)
- (format "%s as %s"
- (magit--propertize-face remote 'bold)
- (magit--propertize-face merge 'magit-branch-remote)))
- ((magit--valid-upstream-p remote merge)
- (format "%s creating %s"
- (magit--propertize-face remote 'magit-branch-remote)
- (magit--propertize-face merge 'magit-branch-remote)))
- ((or remote merge)
- (concat u ", creating it and replacing invalid"))
- (t
- (concat u ", creating it")))))))
-
-;;;###autoload
-(defun magit-push-current (target args)
- "Push the current branch to a branch read in the minibuffer."
- (interactive
- (--if-let (magit-get-current-branch)
- (list (magit-read-remote-branch (format "Push %s to" it)
- nil nil it 'confirm)
- (magit-push-arguments))
- (user-error "No branch is checked out")))
- (magit-git-push (magit-get-current-branch) target args))
-
-;;;###autoload
-(defun magit-push-other (source target args)
- "Push an arbitrary branch or commit somewhere.
-Both the source and the target are read in the minibuffer."
- (interactive
- (let ((source (magit-read-local-branch-or-commit "Push")))
- (list source
- (magit-read-remote-branch
- (format "Push %s to" source) nil
- (if (magit-local-branch-p source)
- (or (magit-get-push-branch source)
- (magit-get-upstream-branch source))
- (and (magit-rev-ancestor-p source "HEAD")
- (or (magit-get-push-branch)
- (magit-get-upstream-branch))))
- source 'confirm)
- (magit-push-arguments))))
- (magit-git-push source target args))
-
-(defvar magit-push-refspecs-history nil)
-
-;;;###autoload
-(defun magit-push-refspecs (remote refspecs args)
- "Push one or multiple REFSPECS to a REMOTE.
-Both the REMOTE and the REFSPECS are read in the minibuffer. To
-use multiple REFSPECS, separate them with commas. Completion is
-only available for the part before the colon, or when no colon
-is used."
- (interactive
- (list (magit-read-remote "Push to remote")
- (split-string (magit-completing-read-multiple
- "Push refspec,s"
- (cons "HEAD" (magit-list-local-branch-names))
- nil nil 'magit-push-refspecs-history)
- crm-default-separator t)
- (magit-push-arguments)))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" "-v" args remote refspecs))
-
-;;;###autoload
-(defun magit-push-matching (remote &optional args)
- "Push all matching branches to another repository.
-If multiple remotes exist, then read one from the user.
-If just one exists, use that without requiring confirmation."
- (interactive (list (magit-read-remote "Push matching branches to" nil t)
- (magit-push-arguments)))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" "-v" args remote ":"))
-
-;;;###autoload
-(defun magit-push-tags (remote &optional args)
- "Push all tags to another repository.
-If only one remote exists, then push to that. Otherwise prompt
-for a remote, offering the remote configured for the current
-branch as default."
- (interactive (list (magit-read-remote "Push tags to remote" nil t)
- (magit-push-arguments)))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" remote "--tags" args))
-
-;;;###autoload
-(defun magit-push-tag (tag remote &optional args)
- "Push a tag to another repository."
- (interactive
- (let ((tag (magit-read-tag "Push tag")))
- (list tag (magit-read-remote (format "Push %s to remote" tag) nil t)
- (magit-push-arguments))))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" remote tag args))
-
-;;;###autoload
-(defun magit-push-notes-ref (ref remote &optional args)
- "Push a notes ref to another repository."
- (interactive
- (let ((note (magit-notes-read-ref "Push notes" nil nil)))
- (list note
- (magit-read-remote (format "Push %s to remote" note) nil t)
- (magit-push-arguments))))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" remote ref args))
-
-;;;###autoload
-(defun magit-push-implicitly (args)
- "Push somewhere without using an explicit refspec.
-
-This command simply runs \"git push -v [ARGS]\". ARGS are the
-arguments specified in the popup buffer. No explicit refspec
-arguments are used. Instead the behavior depends on at least
-these Git variables: `push.default', `remote.pushDefault',
-`branch.<branch>.pushRemote', `branch.<branch>.remote',
-`branch.<branch>.merge', and `remote.<remote>.push'.
-
-The function `magit-push-implicitly--desc' attempts to predict
-what this command will do. The value it returns is displayed in
-the popup buffer."
- (interactive (list (magit-push-arguments)))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" "-v" args))
-
-(defun magit-push-implicitly--desc ()
- (let ((default (magit-get "push.default")))
- (unless (equal default "nothing")
- (or (when-let ((remote (or (magit-get-remote)
- (magit-remote-p "origin")))
- (refspec (magit-get "remote" remote "push")))
- (format "%s using %s"
- (magit--propertize-face remote 'magit-branch-remote)
- (magit--propertize-face refspec 'bold)))
- (--when-let (and (not (magit-get-push-branch))
- (magit-get-upstream-branch))
- (format "%s aka %s\n"
- (magit-branch-set-face it)
- (magit--propertize-face "@{upstream}" 'bold)))
- (--when-let (magit-get-push-branch)
- (format "%s aka %s\n"
- (magit-branch-set-face it)
- (magit--propertize-face "pushRemote" 'bold)))
- (--when-let (magit-get-@{push}-branch)
- (format "%s aka %s\n"
- (magit-branch-set-face it)
- (magit--propertize-face "@{push}" 'bold)))
- (format "using %s (%s is %s)\n"
- (magit--propertize-face "git push" 'bold)
- (magit--propertize-face "push.default" 'bold)
- (magit--propertize-face default 'bold))))))
-
-;;;###autoload
-(defun magit-push-to-remote (remote args)
- "Push to REMOTE without using an explicit refspec.
-The REMOTE is read in the minibuffer.
-
-This command simply runs \"git push -v [ARGS] REMOTE\". ARGS
-are the arguments specified in the popup buffer. No refspec
-arguments are used. Instead the behavior depends on at least
-these Git variables: `push.default', `remote.pushDefault',
-`branch.<branch>.pushRemote', `branch.<branch>.remote',
-`branch.<branch>.merge', and `remote.<remote>.push'."
- (interactive (list (magit-read-remote "Push to remote")
- (magit-push-arguments)))
- (run-hooks 'magit-credential-hook)
- (magit-run-git-async "push" "-v" args remote))
-
-(defun magit-push-to-remote--desc ()
- (format "using %s\n" (magit--propertize-face "git push <remote>" 'bold)))
-
-;;; _
-(provide 'magit-push)
-;;; magit-push.el ends here
diff --git a/elpa/magit-20200728.45/magit-reflog.el b/elpa/magit-20200728.45/magit-reflog.el
deleted file mode 100644
index 5576cdc..0000000
--- a/elpa/magit-20200728.45/magit-reflog.el
+++ /dev/null
@@ -1,213 +0,0 @@
-;;; magit-reflog.el --- inspect ref history -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for looking at Git reflogs.
-
-;;; Code:
-
-(require 'magit-core)
-(require 'magit-log)
-
-(eval-when-compile
- (require 'subr-x))
-
-;;; Options
-
-(defcustom magit-reflog-limit 256
- "Maximal number of entries initially shown in reflog buffers.
-The limit in the current buffer can be changed using \"+\"
-and \"-\"."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'number)
-
-(defcustom magit-reflog-margin
- (list (nth 0 magit-log-margin)
- (nth 1 magit-log-margin)
- 'magit-log-margin-width nil
- (nth 4 magit-log-margin))
- "Format of the margin in `magit-reflog-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-log
- :group 'magit-margin
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set-after '(magit-log-margin)
- :set (apply-partially #'magit-margin-set-variable 'magit-reflog-mode))
-
-;;; Faces
-
-(defface magit-reflog-commit '((t :foreground "green"))
- "Face for commit commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-amend '((t :foreground "magenta"))
- "Face for amend commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-merge '((t :foreground "green"))
- "Face for merge, checkout and branch commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-checkout '((t :foreground "blue"))
- "Face for checkout commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-reset '((t :foreground "red"))
- "Face for reset commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-rebase '((t :foreground "magenta"))
- "Face for rebase commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-cherry-pick '((t :foreground "green"))
- "Face for cherry-pick commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-remote '((t :foreground "cyan"))
- "Face for pull and clone commands in reflogs."
- :group 'magit-faces)
-
-(defface magit-reflog-other '((t :foreground "cyan"))
- "Face for other commands in reflogs."
- :group 'magit-faces)
-
-;;; Commands
-
-;;;###autoload
-(defun magit-reflog-current ()
- "Display the reflog of the current branch.
-If `HEAD' is detached, then show the reflog for that instead."
- (interactive)
- (magit-reflog-setup-buffer (or (magit-get-current-branch) "HEAD")))
-
-;;;###autoload
-(defun magit-reflog-other (ref)
- "Display the reflog of a branch or another ref."
- (interactive (list (magit-read-local-branch-or-ref "Show reflog for")))
- (magit-reflog-setup-buffer ref))
-
-;;;###autoload
-(defun magit-reflog-head ()
- "Display the `HEAD' reflog."
- (interactive)
- (magit-reflog-setup-buffer "HEAD"))
-
-;;; Mode
-
-(defvar magit-reflog-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-log-mode-map)
- (define-key map "\C-c\C-n" 'undefined)
- (define-key map "L" 'magit-margin-settings)
- map)
- "Keymap for `magit-reflog-mode'.")
-
-(define-derived-mode magit-reflog-mode magit-mode "Magit Reflog"
- "Mode for looking at Git reflog.
-
-This mode is documented in info node `(magit)Reflog'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \
-to visit the commit at point.
-
-Type \\[magit-cherry-pick] to apply the commit at point.
-Type \\[magit-reset] to reset `HEAD' to the commit at point.
-
-\\{magit-reflog-mode-map}"
- :group 'magit-log
- (hack-dir-local-variables-non-file-buffer))
-
-(defun magit-reflog-setup-buffer (ref)
- (require 'magit)
- (magit-setup-buffer #'magit-reflog-mode nil
- (magit-buffer-refname ref)
- (magit-buffer-log-args (list (format "-n%s" magit-reflog-limit)))))
-
-(defun magit-reflog-refresh-buffer ()
- (magit-set-header-line-format (concat "Reflog for " magit-buffer-refname))
- (magit-insert-section (reflogbuf)
- (magit-git-wash (apply-partially 'magit-log-wash-log 'reflog)
- "reflog" "show" "--format=%h%x00%aN%x00%gd%x00%gs" "--date=raw"
- magit-buffer-log-args magit-buffer-refname "--")))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-reflog-mode))
- magit-buffer-refname)
-
-(defvar magit-reflog-labels
- '(("commit" . magit-reflog-commit)
- ("amend" . magit-reflog-amend)
- ("merge" . magit-reflog-merge)
- ("checkout" . magit-reflog-checkout)
- ("branch" . magit-reflog-checkout)
- ("reset" . magit-reflog-reset)
- ("rebase" . magit-reflog-rebase)
- ("cherry-pick" . magit-reflog-cherry-pick)
- ("initial" . magit-reflog-commit)
- ("pull" . magit-reflog-remote)
- ("clone" . magit-reflog-remote)
- ("autosave" . magit-reflog-commit)
- ("restart" . magit-reflog-reset)))
-
-(defun magit-reflog-format-subject (subject)
- (let* ((match (string-match magit-reflog-subject-re subject))
- (command (and match (match-string 1 subject)))
- (option (and match (match-string 2 subject)))
- (type (and match (match-string 3 subject)))
- (label (if (string= command "commit")
- (or type command)
- command))
- (text (if (string= command "commit")
- label
- (mapconcat #'identity
- (delq nil (list command option type))
- " "))))
- (format "%-16s "
- (magit--propertize-face
- text (or (cdr (assoc label magit-reflog-labels))
- 'magit-reflog-other)))))
-
-;;; _
-(provide 'magit-reflog)
-;;; magit-reflog.el ends here
diff --git a/elpa/magit-20200728.45/magit-refs.el b/elpa/magit-20200728.45/magit-refs.el
deleted file mode 100644
index c5de567..0000000
--- a/elpa/magit-20200728.45/magit-refs.el
+++ /dev/null
@@ -1,758 +0,0 @@
-;;; magit-refs.el --- listing references -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for listing references in a buffer.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Options
-
-(defgroup magit-refs nil
- "Inspect and manipulate Git branches and tags."
- :link '(info-link "(magit)References Buffer")
- :group 'magit-modes)
-
-(defcustom magit-refs-mode-hook nil
- "Hook run after entering Magit-Refs mode."
- :package-version '(magit . "2.1.0")
- :group 'magit-refs
- :type 'hook)
-
-(defcustom magit-refs-sections-hook
- '(magit-insert-error-header
- magit-insert-branch-description
- magit-insert-local-branches
- magit-insert-remote-branches
- magit-insert-tags)
- "Hook run to insert sections into a references buffer."
- :package-version '(magit . "2.1.0")
- :group 'magit-refs
- :type 'hook)
-
-(defcustom magit-refs-show-commit-count nil
- "Whether to show commit counts in Magit-Refs mode buffers.
-
-all Show counts for branches and tags.
-branch Show counts for branches only.
-nil Never show counts.
-
-To change the value in an existing buffer use the command
-`magit-refs-show-commit-count'"
- :package-version '(magit . "2.1.0")
- :group 'magit-refs
- :safe (lambda (val) (memq val '(all branch nil)))
- :type '(choice (const all :tag "For branches and tags")
- (const branch :tag "For branches only")
- (const nil :tag "Never")))
-(put 'magit-refs-show-commit-count 'safe-local-variable 'symbolp)
-(put 'magit-refs-show-commit-count 'permanent-local t)
-
-(defcustom magit-refs-pad-commit-counts nil
- "Whether to pad all counts on all sides in `magit-refs-mode' buffers.
-
-If this is nil, then some commit counts are displayed right next
-to one of the branches that appear next to the count, without any
-space in between. This might look bad if the branch name faces
-look too similar to `magit-dimmed'.
-
-If this is non-nil, then spaces are placed on both sides of all
-commit counts."
- :package-version '(magit . "2.12.0")
- :group 'magit-refs
- :type 'boolean)
-
-(defvar magit-refs-show-push-remote nil
- "Whether to show the push-remotes of local branches.
-Also show the commits that the local branch is ahead and behind
-the push-target. Unfortunately there is a bug in Git that makes
-this useless (the commits ahead and behind the upstream are
-shown), so this isn't enabled yet.")
-
-(defcustom magit-refs-show-remote-prefix nil
- "Whether to show the remote prefix in lists of remote branches.
-
-This is redundant because the name of the remote is already shown
-in the heading preceding the list of its branches."
- :package-version '(magit . "2.12.0")
- :group 'magit-refs
- :type 'boolean)
-
-(defcustom magit-refs-margin
- (list nil
- (nth 1 magit-log-margin)
- 'magit-log-margin-width nil
- (nth 4 magit-log-margin))
- "Format of the margin in `magit-refs-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-refs
- :group 'magit-margin
- :safe (lambda (val) (memq val '(all branch nil)))
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set-after '(magit-log-margin)
- :set (apply-partially #'magit-margin-set-variable 'magit-refs-mode))
-
-(defcustom magit-refs-margin-for-tags nil
- "Whether to show information about tags in the margin.
-
-This is disabled by default because it is slow if there are many
-tags."
- :package-version '(magit . "2.9.0")
- :group 'magit-refs
- :group 'magit-margin
- :type 'boolean)
-
-(defcustom magit-refs-primary-column-width (cons 16 32)
- "Width of the focus column in `magit-refs-mode' buffers.
-
-The primary column is the column that contains the name of the
-branch that the current row is about.
-
-If this is an integer, then the column is that many columns wide.
-Otherwise it has to be a cons-cell of two integers. The first
-specifies the minimal width, the second the maximal width. In that
-case the actual width is determined using the length of the names
-of the shown local branches. (Remote branches and tags are not
-taken into account when calculating to optimal width.)"
- :package-version '(magit . "2.12.0")
- :group 'magit-refs
- :type '(choice (integer :tag "Constant wide")
- (cons :tag "Wide constrains"
- (integer :tag "Minimum")
- (integer :tag "Maximum"))))
-
-(defcustom magit-refs-focus-column-width 5
- "Width of the focus column in `magit-refs-mode' buffers.
-
-The focus column is the first column, which marks one
-branch (usually the current branch) as the focused branch using
-\"*\" or \"@\". For each other reference, this column optionally
-shows how many commits it is ahead of the focused branch and \"<\", or
-if it isn't ahead then the commits it is behind and \">\", or if it
-isn't behind either, then a \"=\".
-
-This column may also display only \"*\" or \"@\" for the focused
-branch, in which case this option is ignored. Use \"L v\" to
-change the verbosity of this column."
- :package-version '(magit . "2.12.0")
- :group 'magit-refs
- :type 'integer)
-
-(defcustom magit-refs-filter-alist nil
- "Alist controlling which refs are omitted from `magit-refs-mode' buffers.
-
-The purpose of this option is to forgo displaying certain refs
-based on their name. If you want to not display any refs of a
-certain type, then you should remove the appropriate function
-from `magit-refs-sections-hook' instead.
-
-All keys are tried in order until one matches. Then its value
-is used and subsequent elements are ignored. If the value is
-non-nil, then the reference is displayed, otherwise it is not.
-If no element matches, then the reference is displayed.
-
-A key can either be a regular expression that the refname has to
-match, or a function that takes the refname as only argument and
-returns a boolean. A remote branch such as \"origin/master\" is
-displayed as just \"master\", however for this comparison the
-former is used."
- :package-version '(magit . "2.12.0")
- :group 'magit-refs
- :type '(alist :key-type (choice :tag "Key" regexp function)
- :value-type (boolean :tag "Value"
- :on "show (non-nil)"
- :off "omit (nil)")))
-
-(defcustom magit-visit-ref-behavior nil
- "Control how `magit-visit-ref' behaves in `magit-refs-mode' buffers.
-
-By default `magit-visit-ref' behaves like `magit-show-commit',
-in all buffers, including `magit-refs-mode' buffers. When the
-type of the section at point is `commit' then \"RET\" is bound to
-`magit-show-commit', and when the type is either `branch' or
-`tag' then it is bound to `magit-visit-ref'.
-
-\"RET\" is one of Magit's most essential keys and at least by
-default it should behave consistently across all of Magit,
-especially because users quickly learn that it does something
-very harmless; it shows more information about the thing at point
-in another buffer.
-
-However \"RET\" used to behave differently in `magit-refs-mode'
-buffers, doing surprising things, some of which cannot really be
-described as \"visit this thing\". If you have grown accustomed
-to such inconsistent, but to you useful, behavior, then you can
-restore that by adding one or more of the below symbols to the
-value of this option. But keep in mind that by doing so you
-don't only introduce inconsistencies, you also lose some
-functionality and might have to resort to `M-x magit-show-commit'
-to get it back.
-
-`magit-visit-ref' looks for these symbols in the order in which
-they are described here. If the presence of a symbol applies to
-the current situation, then the symbols that follow do not affect
-the outcome.
-
-`focus-on-ref'
-
- With a prefix argument update the buffer to show commit counts
- and lists of cherry commits relative to the reference at point
- instead of relative to the current buffer or `HEAD'.
-
- Instead of adding this symbol, consider pressing \"C-u y o RET\".
-
-`create-branch'
-
- If point is on a remote branch, then create a new local branch
- with the same name, use the remote branch as its upstream, and
- then check out the local branch.
-
- Instead of adding this symbol, consider pressing \"b c RET RET\",
- like you would do in other buffers.
-
-`checkout-any'
-
- Check out the reference at point. If that reference is a tag
- or a remote branch, then this results in a detached `HEAD'.
-
- Instead of adding this symbol, consider pressing \"b b RET\",
- like you would do in other buffers.
-
-`checkout-branch'
-
- Check out the local branch at point.
-
- Instead of adding this symbol, consider pressing \"b b RET\",
- like you would do in other buffers."
- :package-version '(magit . "2.9.0")
- :group 'magit-refs
- :group 'magit-commands
- :options '(focus-on-ref create-branch checkout-any checkout-branch)
- :type '(list :convert-widget custom-hook-convert-widget))
-
-;;; Mode
-
-(defvar magit-refs-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-mode-map)
- (define-key map "\C-y" 'magit-refs-set-show-commit-count)
- (define-key map "L" 'magit-margin-settings)
- map)
- "Keymap for `magit-refs-mode'.")
-
-(define-derived-mode magit-refs-mode magit-mode "Magit Refs"
- "Mode which lists and compares references.
-
-This mode is documented in info node `(magit)References Buffer'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-section-toggle] to expand or hide the section at point.
-Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \
-to visit the commit or branch at point.
-
-Type \\[magit-branch] to see available branch commands.
-Type \\[magit-merge] to merge the branch or commit at point.
-Type \\[magit-cherry-pick] to apply the commit at point.
-Type \\[magit-reset] to reset `HEAD' to the commit at point.
-
-\\{magit-refs-mode-map}"
- :group 'magit-refs
- (hack-dir-local-variables-non-file-buffer)
- (setq imenu-create-index-function
- #'magit-imenu--refs-create-index-function))
-
-(defun magit-refs-setup-buffer (ref args)
- (magit-setup-buffer #'magit-refs-mode nil
- (magit-buffer-upstream ref)
- (magit-buffer-arguments args)))
-
-(defun magit-refs-refresh-buffer ()
- (setq magit-set-buffer-margin-refresh (not (magit-buffer-margin-p)))
- (unless (magit-rev-verify magit-buffer-upstream)
- (setq magit-refs-show-commit-count nil))
- (magit-set-header-line-format
- (format "%s %s" magit-buffer-upstream
- (mapconcat #'identity magit-buffer-arguments " ")))
- (magit-insert-section (branchbuf)
- (magit-run-section-hook 'magit-refs-sections-hook))
- (add-hook 'kill-buffer-hook 'magit-preserve-section-visibility-cache))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-refs-mode))
- (cons magit-buffer-upstream magit-buffer-arguments))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-show-refs "magit-refs" nil t)
-(transient-define-prefix magit-show-refs (&optional transient)
- "List and compare references in a dedicated buffer."
- :man-page "git-branch"
- :value (lambda ()
- (magit-show-refs-arguments magit-prefix-use-buffer-arguments))
- ["Arguments"
- (magit-for-each-ref:--contains)
- ("=m" "Merged" "--merged=" magit-transient-read-revision)
- ("-m" "Merged to HEAD" "--merged")
- ("-M" "Merged to master" "--merged=master")
- ("=n" "Not merged" "--no-merged=" magit-transient-read-revision)
- ("-n" "Not merged to HEAD" "--no-merged")
- ("-N" "Not merged to master" "--no-merged=master")
- (magit-for-each-ref:--sort)]
- ["Actions"
- ("y" "Show refs, comparing them with HEAD" magit-show-refs-head)
- ("c" "Show refs, comparing them with current branch" magit-show-refs-current)
- ("o" "Show refs, comparing them with other branch" magit-show-refs-other)]
- (interactive (list (or (derived-mode-p 'magit-refs-mode)
- current-prefix-arg)))
- (if transient
- (transient-setup 'magit-show-refs)
- (magit-refs-setup-buffer "HEAD" (magit-show-refs-arguments))))
-
-(defun magit-show-refs-arguments (&optional use-buffer-args)
- (unless use-buffer-args
- (setq use-buffer-args magit-direct-use-buffer-arguments))
- (let (args)
- (cond
- ((eq transient-current-command 'magit-show-refs)
- (setq args (transient-args 'magit-show-refs)))
- ((eq major-mode 'magit-refs-mode)
- (setq args magit-buffer-arguments))
- ((and (memq use-buffer-args '(always selected))
- (when-let ((buffer (magit-get-mode-buffer
- 'magit-refs-mode nil
- (eq use-buffer-args 'selected))))
- (setq args (buffer-local-value 'magit-buffer-arguments buffer))
- t)))
- (t
- (setq args (alist-get 'magit-show-refs transient-values))))
- args))
-
-(transient-define-argument magit-for-each-ref:--contains ()
- :description "Contains"
- :class 'transient-option
- :key "-c"
- :argument "--contains="
- :reader 'magit-transient-read-revision)
-
-(transient-define-argument magit-for-each-ref:--sort ()
- :description "Sort"
- :class 'transient-option
- :key "-s"
- :argument "--sort="
- :reader 'magit-read-ref-sort)
-
-(defun magit-read-ref-sort (prompt initial-input _history)
- (magit-completing-read prompt
- '("-committerdate" "-authordate"
- "committerdate" "authordate")
- nil nil initial-input))
-
-;;;###autoload
-(defun magit-show-refs-head (&optional args)
- "List and compare references in a dedicated buffer.
-Compared with `HEAD'."
- (interactive (list (magit-show-refs-arguments)))
- (magit-refs-setup-buffer "HEAD" args))
-
-;;;###autoload
-(defun magit-show-refs-current (&optional args)
- "List and compare references in a dedicated buffer.
-Compare with the current branch or `HEAD' if it is detached."
- (interactive (list (magit-show-refs-arguments)))
- (magit-refs-setup-buffer (magit-get-current-branch) args))
-
-;;;###autoload
-(defun magit-show-refs-other (&optional ref args)
- "List and compare references in a dedicated buffer.
-Compared with a branch read from the user."
- (interactive (list (magit-read-other-branch "Compare with")
- (magit-show-refs-arguments)))
- (magit-refs-setup-buffer ref args))
-
-(defun magit-refs-set-show-commit-count ()
- "Change for which refs the commit count is shown."
- (interactive)
- (setq-local magit-refs-show-commit-count
- (magit-read-char-case "Show commit counts for " nil
- (?a "[a]ll refs" 'all)
- (?b "[b]ranches only" t)
- (?n "[n]othing" nil)))
- (magit-refresh))
-
-(defun magit-visit-ref ()
- "Visit the reference or revision at point in another buffer.
-If there is no revision at point or with a prefix argument prompt
-for a revision.
-
-This command behaves just like `magit-show-commit', except if
-point is on a reference in a `magit-refs-mode' buffer (a buffer
-listing branches and tags), in which case the behavior may be
-different, but only if you have customized the option
-`magit-visit-ref-behavior' (which see)."
- (interactive)
- (if (and (derived-mode-p 'magit-refs-mode)
- (magit-section-match '(branch tag)))
- (let ((ref (oref (magit-current-section) value)))
- (cond (current-prefix-arg
- (cond ((memq 'focus-on-ref magit-visit-ref-behavior)
- (magit-refs-setup-buffer ref (magit-show-refs-arguments)))
- (magit-visit-ref-behavior
- ;; Don't prompt for commit to visit.
- (let ((current-prefix-arg nil))
- (call-interactively #'magit-show-commit)))))
- ((and (memq 'create-branch magit-visit-ref-behavior)
- (magit-section-match [branch remote]))
- (let ((branch (cdr (magit-split-branch-name ref))))
- (if (magit-branch-p branch)
- (if (magit-rev-eq branch ref)
- (magit-call-git "checkout" branch)
- (setq branch (propertize branch 'face 'magit-branch-local))
- (setq ref (propertize ref 'face 'magit-branch-remote))
- (pcase (prog1 (read-char-choice (format (propertize "\
-Branch %s already exists.
- [c]heckout %s as-is
- [r]reset %s to %s and checkout %s
- [a]bort " 'face 'minibuffer-prompt) branch branch branch ref branch)
- '(?c ?r ?a))
- (message "")) ; otherwise prompt sticks
- (?c (magit-call-git "checkout" branch))
- (?r (magit-call-git "checkout" "-B" branch ref))
- (?a (user-error "Abort"))))
- (magit-call-git "checkout" "-b" branch ref))
- (setq magit-buffer-upstream branch)
- (magit-refresh)))
- ((or (memq 'checkout-any magit-visit-ref-behavior)
- (and (memq 'checkout-branch magit-visit-ref-behavior)
- (magit-section-match [branch local])))
- (magit-call-git "checkout" ref)
- (setq magit-buffer-upstream ref)
- (magit-refresh))
- (t
- (call-interactively #'magit-show-commit))))
- (call-interactively #'magit-show-commit)))
-
-;;; Sections
-
-(defvar magit-remote-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-delete-thing] 'magit-remote-remove)
- (define-key map "R" 'magit-remote-rename)
- map)
- "Keymap for `remote' sections.")
-
-(defvar magit-branch-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-visit-ref)
- (define-key map [remap magit-delete-thing] 'magit-branch-delete)
- (define-key map "R" 'magit-branch-rename)
- map)
- "Keymap for `branch' sections.")
-
-(defvar magit-tag-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-visit-ref)
- (define-key map [remap magit-delete-thing] 'magit-tag-delete)
- map)
- "Keymap for `tag' sections.")
-
-(defun magit-insert-branch-description ()
- "Insert header containing the description of the current branch.
-Insert a header line with the name and description of the
-current branch. The description is taken from the Git variable
-`branch.<NAME>.description'; if that is undefined then no header
-line is inserted at all."
- (when-let ((branch (magit-get-current-branch))
- (desc (magit-get "branch" branch "description"))
- (desc (split-string desc "\n")))
- (when (equal (car (last desc)) "")
- (setq desc (butlast desc)))
- (magit-insert-section (branchdesc branch t)
- (magit-insert-heading branch ": " (car desc))
- (when (cdr desc)
- (insert (mapconcat 'identity (cdr desc) "\n"))
- (insert "\n\n")))))
-
-(defun magit-insert-tags ()
- "Insert sections showing all tags."
- (when-let ((tags (magit-git-lines "tag" "--list" "-n" magit-buffer-arguments)))
- (let ((_head (magit-rev-parse "HEAD")))
- (magit-insert-section (tags)
- (magit-insert-heading "Tags:")
- (dolist (tag tags)
- (string-match "^\\([^ \t]+\\)[ \t]+\\([^ \t\n].*\\)?" tag)
- (let ((tag (match-string 1 tag))
- (msg (match-string 2 tag)))
- (when (magit-refs--insert-refname-p tag)
- (magit-insert-section (tag tag t)
- (magit-insert-heading
- (magit-refs--format-focus-column tag 'tag)
- (propertize tag 'font-lock-face 'magit-tag)
- (make-string (max 1 (- magit-refs-primary-column-width
- (length tag)))
- ?\s)
- (and msg (magit-log-propertize-keywords nil msg)))
- (when (and magit-refs-margin-for-tags (magit-buffer-margin-p))
- (magit-refs--format-margin tag))
- (magit-refs--insert-cherry-commits tag)))))
- (insert ?\n)
- (magit-make-margin-overlay nil t)))))
-
-(defun magit-insert-remote-branches ()
- "Insert sections showing all remote-tracking branches."
- (dolist (remote (magit-list-remotes))
- (magit-insert-section (remote remote)
- (magit-insert-heading
- (let ((pull (magit-get "remote" remote "url"))
- (push (magit-get "remote" remote "pushurl")))
- (format (propertize "Remote %s (%s):"
- 'font-lock-face 'magit-section-heading)
- (propertize remote 'font-lock-face 'magit-branch-remote)
- (concat pull (and pull push ", ") push))))
- (let (head)
- (dolist (line (magit-git-lines "for-each-ref" "--format=\
-%(symref:short)%00%(refname:short)%00%(refname)%00%(subject)"
- (concat "refs/remotes/" remote)
- magit-buffer-arguments))
- (pcase-let ((`(,head-branch ,branch ,ref ,msg)
- (-replace "" nil (split-string line "\0"))))
- (if head-branch
- (progn (cl-assert (equal branch (concat remote "/HEAD")))
- (setq head head-branch))
- (when (magit-refs--insert-refname-p branch)
- (magit-insert-section (branch branch t)
- (let ((headp (equal branch head))
- (abbrev (if magit-refs-show-remote-prefix
- branch
- (substring branch (1+ (length remote))))))
- (magit-insert-heading
- (magit-refs--format-focus-column branch)
- (magit-refs--propertize-branch
- abbrev ref (and headp 'magit-branch-remote-head))
- (make-string (max 1 (- magit-refs-primary-column-width
- (length abbrev)))
- ?\s)
- (and msg (magit-log-propertize-keywords nil msg))))
- (when (magit-buffer-margin-p)
- (magit-refs--format-margin branch))
- (magit-refs--insert-cherry-commits branch)))))))
- (insert ?\n)
- (magit-make-margin-overlay nil t))))
-
-(defun magit-insert-local-branches ()
- "Insert sections showing all local branches."
- (magit-insert-section (local nil)
- (magit-insert-heading "Branches:")
- (dolist (line (magit-refs--format-local-branches))
- (pcase-let ((`(,branch . ,strings) line))
- (magit-insert-section
- ((eval (if branch 'branch 'commit))
- (or branch (magit-rev-parse "HEAD"))
- t)
- (apply #'magit-insert-heading strings)
- (when (magit-buffer-margin-p)
- (magit-refs--format-margin branch))
- (magit-refs--insert-cherry-commits branch))))
- (insert ?\n)
- (magit-make-margin-overlay nil t)))
-
-(defun magit-refs--format-local-branches ()
- (let ((lines (-keep 'magit-refs--format-local-branch
- (magit-git-lines
- "for-each-ref"
- (concat "--format=\
-%(HEAD)%00%(refname:short)%00%(refname)%00\
-%(upstream:short)%00%(upstream)%00%(upstream:track)%00"
- (if magit-refs-show-push-remote "\
-%(push:remotename)%00%(push)%00%(push:track)%00%(subject)"
- "%00%00%00%(subject)"))
- "refs/heads"
- magit-buffer-arguments))))
- (unless (magit-get-current-branch)
- (push (magit-refs--format-local-branch
- (concat "*\0\0\0\0\0\0\0\0" (magit-rev-format "%s")))
- lines))
- (setq-local magit-refs-primary-column-width
- (let ((def (default-value 'magit-refs-primary-column-width)))
- (if (atom def)
- def
- (pcase-let ((`(,min . ,max) def))
- (min max (apply #'max min (mapcar #'car lines)))))))
- (mapcar (pcase-lambda (`(,_ ,branch ,focus ,branch-desc ,u:ahead ,p:ahead
- ,u:behind ,upstream ,p:behind ,push ,msg))
- (list branch focus branch-desc u:ahead p:ahead
- (make-string (max 1 (- magit-refs-primary-column-width
- (length (concat branch-desc
- u:ahead
- p:ahead
- u:behind))))
- ?\s)
- u:behind upstream p:behind push
- msg))
- lines)))
-
-(defun magit-refs--format-local-branch (line)
- (pcase-let ((`(,head ,branch ,ref ,upstream ,u:ref ,u:track
- ,push ,p:ref ,p:track ,msg)
- (-replace "" nil (split-string line "\0"))))
- (when (or (not branch)
- (magit-refs--insert-refname-p branch))
- (let* ((headp (equal head "*"))
- (pushp (and push
- magit-refs-show-push-remote
- (magit-rev-verify p:ref)
- (not (equal p:ref u:ref))))
- (branch-desc
- (if branch
- (magit-refs--propertize-branch
- branch ref (and headp 'magit-branch-current))
- (magit--propertize-face "(detached)"
- 'font-lock-warning-face)))
- (u:ahead (and u:track
- (string-match "ahead \\([0-9]+\\)" u:track)
- (magit--propertize-face
- (concat (and magit-refs-pad-commit-counts " ")
- (match-string 1 u:track)
- ">")
- 'magit-dimmed)))
- (u:behind (and u:track
- (string-match "behind \\([0-9]+\\)" u:track)
- (magit--propertize-face
- (concat "<"
- (match-string 1 u:track)
- (and magit-refs-pad-commit-counts " "))
- 'magit-dimmed)))
- (p:ahead (and pushp p:track
- (string-match "ahead \\([0-9]+\\)" p:track)
- (magit--propertize-face
- (concat (match-string 1 p:track)
- ">"
- (and magit-refs-pad-commit-counts " "))
- 'magit-branch-remote)))
- (p:behind (and pushp p:track
- (string-match "behind \\([0-9]+\\)" p:track)
- (magit--propertize-face
- (concat "<"
- (match-string 1 p:track)
- (and magit-refs-pad-commit-counts " "))
- 'magit-dimmed))))
- (list (1+ (length (concat branch-desc u:ahead p:ahead u:behind)))
- branch
- (magit-refs--format-focus-column branch headp)
- branch-desc u:ahead p:ahead u:behind
- (and upstream
- (concat (if (equal u:track "[gone]")
- (magit--propertize-face upstream 'error)
- (magit-refs--propertize-branch upstream u:ref))
- " "))
- (and pushp
- (concat p:behind
- (magit--propertize-face
- push 'magit-branch-remote)
- " "))
- (and msg (magit-log-propertize-keywords nil msg)))))))
-
-(defun magit-refs--format-focus-column (ref &optional type)
- (let ((focus magit-buffer-upstream)
- (width (if magit-refs-show-commit-count
- magit-refs-focus-column-width
- 1)))
- (format
- (format "%%%ss " width)
- (cond ((or (equal ref focus)
- (and (eq type t)
- (equal focus "HEAD")))
- (magit--propertize-face (concat (if (equal focus "HEAD") "@" "*")
- (make-string (1- width) ?\s))
- 'magit-section-heading))
- ((if (eq type 'tag)
- (eq magit-refs-show-commit-count 'all)
- magit-refs-show-commit-count)
- (pcase-let ((`(,behind ,ahead)
- (magit-rev-diff-count magit-buffer-upstream ref)))
- (magit--propertize-face
- (cond ((> ahead 0) (concat "<" (number-to-string ahead)))
- ((> behind 0) (concat (number-to-string behind) ">"))
- (t "="))
- 'magit-dimmed)))
- (t "")))))
-
-(defun magit-refs--propertize-branch (branch ref &optional head-face)
- (let ((face (cdr (cl-find-if (pcase-lambda (`(,re . ,_))
- (string-match-p re ref))
- magit-ref-namespaces))))
- (magit--propertize-face
- branch (if head-face (list face head-face) face))))
-
-(defun magit-refs--insert-refname-p (refname)
- (--if-let (-first (pcase-lambda (`(,key . ,_))
- (if (functionp key)
- (funcall key refname)
- (string-match-p key refname)))
- magit-refs-filter-alist)
- (cdr it)
- t))
-
-(defun magit-refs--insert-cherry-commits (ref)
- (magit-insert-section-body
- (let ((start (point))
- (magit-insert-section--current nil))
- (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry)
- "cherry" "-v" (magit-abbrev-arg) magit-buffer-upstream ref)
- (if (= (point) start)
- (message "No cherries for %s" ref)
- (magit-make-margin-overlay nil t)))))
-
-(defun magit-refs--format-margin (commit)
- (save-excursion
- (goto-char (line-beginning-position 0))
- (let ((line (magit-rev-format "%ct%cN" commit)))
- (magit-log-format-margin commit
- (substring line 10)
- (substring line 0 10)))))
-
-;;; _
-(provide 'magit-refs)
-;;; magit-refs.el ends here
diff --git a/elpa/magit-20200728.45/magit-remote.el b/elpa/magit-20200728.45/magit-remote.el
deleted file mode 100644
index 5d2bf80..0000000
--- a/elpa/magit-20200728.45/magit-remote.el
+++ /dev/null
@@ -1,348 +0,0 @@
-;;; magit-remote.el --- transfer Git commits -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements remote commands.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-remote-add-set-remote.pushDefault 'ask-if-unset
- "Whether to set the value of `remote.pushDefault' after adding a remote.
-
-If `ask', then always ask. If `ask-if-unset', then ask, but only
-if the variable isn't set already. If nil, then don't ever set.
-If the value is a string, then set without asking, provided that
-the name of the added remote is equal to that string and the
-variable isn't already set."
- :package-version '(magit . "2.4.0")
- :group 'magit-commands
- :type '(choice (const :tag "ask if unset" ask-if-unset)
- (const :tag "always ask" ask)
- (string :tag "set if named")
- (const :tag "don't set")))
-
-(defcustom magit-remote-direct-configure t
- "Whether the command `magit-remote' shows Git variables.
-When set to nil, no variables are displayed by this transient
-command, instead the sub-transient `magit-remote-configure'
-has to be used to view and change remote related variables."
- :package-version '(magit . "2.12.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defcustom magit-prefer-push-default nil
- "Whether to prefer `remote.pushDefault' over per-branch variables."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'boolean)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-remote "magit-remote" nil t)
-(transient-define-prefix magit-remote (remote)
- "Add, configure or remove a remote."
- :man-page "git-remote"
- :value '("-f")
- ["Variables"
- :if (lambda ()
- (and magit-remote-direct-configure
- (oref transient--prefix scope)))
- ("u" magit-remote.<remote>.url)
- ("U" magit-remote.<remote>.fetch)
- ("s" magit-remote.<remote>.pushurl)
- ("S" magit-remote.<remote>.push)
- ("O" magit-remote.<remote>.tagopt)]
- ["Arguments for add"
- ("-f" "Fetch after add" "-f")]
- ["Actions"
- [("a" "Add" magit-remote-add)
- ("r" "Rename" magit-remote-rename)
- ("k" "Remove" magit-remote-remove)]
- [("C" "Configure..." magit-remote-configure)
- ("p" "Prune stale branches" magit-remote-prune)
- ("P" "Prune stale refspecs" magit-remote-prune-refspecs)]]
- (interactive (list (magit-get-current-remote)))
- (transient-setup 'magit-remote nil nil :scope remote))
-
-(defun magit-read-url (prompt &optional initial-input)
- (let ((url (magit-read-string-ns prompt initial-input)))
- (if (string-prefix-p "~" url)
- (expand-file-name url)
- url)))
-
-;;;###autoload
-(defun magit-remote-add (remote url &optional args)
- "Add a remote named REMOTE and fetch it."
- (interactive
- (let ((origin (magit-get "remote.origin.url"))
- (remote (magit-read-string-ns "Remote name")))
- (list remote
- (magit-read-url
- "Remote url"
- (and origin
- (string-match "\\([^:/]+\\)/[^/]+\\(\\.git\\)?\\'" origin)
- (replace-match remote t t origin 1)))
- (transient-args 'magit-remote))))
- (if (pcase (list magit-remote-add-set-remote.pushDefault
- (magit-get "remote.pushDefault"))
- (`(,(pred stringp) ,_) t)
- ((or `(ask ,_) `(ask-if-unset nil))
- (y-or-n-p (format "Set `remote.pushDefault' to \"%s\"? " remote))))
- (progn (magit-call-git "remote" "add" args remote url)
- (setf (magit-get "remote.pushDefault") remote)
- (magit-refresh))
- (magit-run-git-async "remote" "add" args remote url)))
-
-;;;###autoload
-(defun magit-remote-rename (old new)
- "Rename the remote named OLD to NEW."
- (interactive
- (let ((remote (magit-read-remote "Rename remote")))
- (list remote (magit-read-string-ns (format "Rename %s to" remote)))))
- (unless (string= old new)
- (magit-call-git "remote" "rename" old new)
- (magit-remote--cleanup-push-variables old new)
- (magit-refresh)))
-
-;;;###autoload
-(defun magit-remote-remove (remote)
- "Delete the remote named REMOTE."
- (interactive (list (magit-read-remote "Delete remote")))
- (magit-call-git "remote" "rm" remote)
- (magit-remote--cleanup-push-variables remote)
- (magit-refresh))
-
-(defun magit-remote--cleanup-push-variables (remote &optional new-name)
- (magit-with-toplevel
- (when (equal (magit-get "remote.pushDefault") remote)
- (magit-set new-name "remote.pushDefault"))
- (dolist (var (magit-git-lines "config" "--name-only"
- "--get-regexp" "^branch\.[^.]*\.pushRemote"
- (format "^%s$" remote)))
- (magit-call-git "config" (and (not new-name) "--unset") var new-name))))
-
-(defconst magit--refspec-re "\\`\\(\\+\\)?\\([^:]+\\):\\(.*\\)\\'")
-
-;;;###autoload
-(defun magit-remote-prune (remote)
- "Remove stale remote-tracking branches for REMOTE."
- (interactive (list (magit-read-remote "Prune stale branches of remote")))
- (magit-run-git-async "remote" "prune" remote))
-
-;;;###autoload
-(defun magit-remote-prune-refspecs (remote)
- "Remove stale refspecs for REMOTE.
-
-A refspec is stale if there no longer exists at least one branch
-on the remote that would be fetched due to that refspec. A stale
-refspec is problematic because its existence causes Git to refuse
-to fetch according to the remaining non-stale refspecs.
-
-If only stale refspecs remain, then offer to either delete the
-remote or to replace the stale refspecs with the default refspec.
-
-Also remove the remote-tracking branches that were created due to
-the now stale refspecs. Other stale branches are not removed."
- (interactive (list (magit-read-remote "Prune refspecs of remote")))
- (let* ((tracking-refs (magit-list-remote-branches remote))
- (remote-refs (magit-remote-list-refs remote))
- (variable (format "remote.%s.fetch" remote))
- (refspecs (magit-get-all variable))
- stale)
- (dolist (refspec refspecs)
- (when (string-match magit--refspec-re refspec)
- (let ((theirs (match-string 2 refspec))
- (ours (match-string 3 refspec)))
- (unless (if (string-match "\\*" theirs)
- (let ((re (replace-match ".*" t t theirs)))
- (--some (string-match-p re it) remote-refs))
- (member theirs remote-refs))
- (push (cons refspec
- (if (string-match "\\*" ours)
- (let ((re (replace-match ".*" t t ours)))
- (--filter (string-match-p re it) tracking-refs))
- (list (car (member ours tracking-refs)))))
- stale)))))
- (if (not stale)
- (message "No stale refspecs for remote %S" remote)
- (if (= (length stale)
- (length refspecs))
- (magit-read-char-case
- (format "All of %s's refspecs are stale. " remote) nil
- (?s "replace with [d]efault refspec"
- (magit-set-all
- (list (format "+refs/heads/*:refs/remotes/%s/*" remote))
- variable))
- (?r "[r]emove remote"
- (magit-call-git "remote" "rm" remote))
- (?a "or [a]abort"
- (user-error "Abort")))
- (if (if (= (length stale) 1)
- (pcase-let ((`(,refspec . ,refs) (car stale)))
- (magit-confirm 'prune-stale-refspecs
- (format "Prune stale refspec %s and branch %%s" refspec)
- (format "Prune stale refspec %s and %%i branches" refspec)
- nil refs))
- (magit-confirm 'prune-stale-refspecs nil
- (format "Prune %%i stale refspecs and %i branches"
- (length (cl-mapcan (lambda (s) (copy-sequence (cdr s)))
- stale)))
- nil
- (mapcar (pcase-lambda (`(,refspec . ,refs))
- (concat refspec "\n"
- (mapconcat (lambda (b) (concat " " b))
- refs "\n")))
- stale)))
- (pcase-dolist (`(,refspec . ,refs) stale)
- (magit-call-git "config" "--unset" variable
- (regexp-quote refspec))
- (magit--log-action
- (lambda (refs)
- (format "Deleting %i branches" (length refs)))
- (lambda (ref)
- (format "Deleting branch %s (was %s)" ref
- (magit-rev-parse "--short" ref)))
- refs)
- (dolist (ref refs)
- (magit-call-git "update-ref" "-d" ref)))
- (user-error "Abort")))
- (magit-refresh))))
-
-;;;###autoload
-(defun magit-remote-set-head (remote &optional branch)
- "Set the local representation of REMOTE's default branch.
-Query REMOTE and set the symbolic-ref refs/remotes/<remote>/HEAD
-accordingly. With a prefix argument query for the branch to be
-used, which allows you to select an incorrect value if you fancy
-doing that."
- (interactive
- (let ((remote (magit-read-remote "Set HEAD for remote")))
- (list remote
- (and current-prefix-arg
- (magit-read-remote-branch (format "Set %s/HEAD to" remote)
- remote nil nil t)))))
- (magit-run-git "remote" "set-head" remote (or branch "--auto")))
-
-;;;###autoload
-(defun magit-remote-unset-head (remote)
- "Unset the local representation of REMOTE's default branch.
-Delete the symbolic-ref \"refs/remotes/<remote>/HEAD\"."
- (interactive (list (magit-read-remote "Unset HEAD for remote")))
- (magit-run-git "remote" "set-head" remote "--delete"))
-
-;;; Configure
-
-;;;###autoload (autoload 'magit-remote-configure "magit-remote" nil t)
-(transient-define-prefix magit-remote-configure (remote)
- "Configure a remote."
- :man-page "git-remote"
- [:description
- (lambda ()
- (concat
- (propertize "Configure " 'face 'transient-heading)
- (propertize (oref transient--prefix scope) 'face 'magit-branch-remote)))
- ("u" magit-remote.<remote>.url)
- ("U" magit-remote.<remote>.fetch)
- ("s" magit-remote.<remote>.pushurl)
- ("S" magit-remote.<remote>.push)
- ("O" magit-remote.<remote>.tagopt)]
- (interactive
- (list (or (and (not current-prefix-arg)
- (not (and magit-remote-direct-configure
- (eq transient-current-command 'magit-remote)))
- (magit-get-current-remote))
- (magit--read-remote-scope))))
- (transient-setup 'magit-remote-configure nil nil :scope remote))
-
-(defun magit--read-remote-scope (&optional obj)
- (magit-read-remote
- (if obj
- (format "Set %s for remote"
- (format (oref obj variable) "<name>"))
- "Configure remote")))
-
-(transient-define-infix magit-remote.<remote>.url ()
- :class 'magit--git-variable:urls
- :scope 'magit--read-remote-scope
- :variable "remote.%s.url"
- :multi-value t
- :history-key 'magit-remote.<remote>.*url)
-
-(transient-define-infix magit-remote.<remote>.fetch ()
- :class 'magit--git-variable
- :scope 'magit--read-remote-scope
- :variable "remote.%s.fetch"
- :multi-value t)
-
-(transient-define-infix magit-remote.<remote>.pushurl ()
- :class 'magit--git-variable:urls
- :scope 'magit--read-remote-scope
- :variable "remote.%s.pushurl"
- :multi-value t
- :history-key 'magit-remote.<remote>.*url
- :seturl-arg "--push")
-
-(transient-define-infix magit-remote.<remote>.push ()
- :class 'magit--git-variable
- :scope 'magit--read-remote-scope
- :variable "remote.%s.push")
-
-(transient-define-infix magit-remote.<remote>.tagopt ()
- :class 'magit--git-variable:choices
- :scope 'magit--read-remote-scope
- :variable "remote.%s.tagOpt"
- :choices '("--no-tags" "--tags"))
-
-;;; Transfer Utilities
-
-(defun magit--push-remote-variable (&optional branch short)
- (unless branch
- (setq branch (magit-get-current-branch)))
- (magit--propertize-face
- (if (or (not branch) magit-prefer-push-default)
- (if short "pushDefault" "remote.pushDefault")
- (if short "pushRemote" (format "branch.%s.pushRemote" branch)))
- 'bold))
-
-(defun magit--select-push-remote (prompt-suffix)
- (let* ((branch (or (magit-get-current-branch)
- (user-error "No branch is checked out")))
- (remote (magit-get-push-remote branch)))
- (when (or current-prefix-arg
- (not remote)
- (not (member remote (magit-list-remotes))))
- (setq remote
- (magit-read-remote (format "Set %s and %s"
- (magit--push-remote-variable)
- prompt-suffix)))
- (setf (magit-get (magit--push-remote-variable branch)) remote))
- (list branch remote)))
-
-;;; _
-(provide 'magit-remote)
-;;; magit-remote.el ends here
diff --git a/elpa/magit-20200728.45/magit-repos.el b/elpa/magit-20200728.45/magit-repos.el
deleted file mode 100644
index b59de62..0000000
--- a/elpa/magit-20200728.45/magit-repos.el
+++ /dev/null
@@ -1,338 +0,0 @@
-;;; magit-repos.el --- listing repositories -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for listing repositories. This
-;; includes getting a Lisp list of known repositories as well as a
-;; mode for listing repositories in a buffer.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit-core)
-
-(declare-function magit-status-setup-buffer "magit-status" (directory))
-
-(defvar x-stretch-cursor)
-
-;;; Options
-
-(defcustom magit-repository-directories nil
- "List of directories that are or contain Git repositories.
-
-Each element has the form (DIRECTORY . DEPTH). DIRECTORY has
-to be a directory or a directory file-name, a string. DEPTH,
-an integer, specifies the maximum depth to look for Git
-repositories. If it is 0, then only add DIRECTORY itself.
-
-This option controls which repositories are being listed by
-`magit-list-repositories'. It also affects `magit-status'
-\(which see) in potentially surprising ways."
- :package-version '(magit . "3.0.0")
- :group 'magit-essentials
- :type '(repeat (cons directory (integer :tag "Depth"))))
-
-(defgroup magit-repolist nil
- "List repositories in a buffer."
- :link '(info-link "(magit)Repository List")
- :group 'magit-modes)
-
-(defcustom magit-repolist-mode-hook '(hl-line-mode)
- "Hook run after entering Magit-Repolist mode."
- :package-version '(magit . "2.9.0")
- :group 'magit-repolist
- :type 'hook
- :get 'magit-hook-custom-get
- :options '(hl-line-mode))
-
-(defcustom magit-repolist-columns
- '(("Name" 25 magit-repolist-column-ident nil)
- ("Version" 25 magit-repolist-column-version nil)
- ("B<U" 3 magit-repolist-column-unpulled-from-upstream
- ((:right-align t)
- (:help-echo "Upstream changes not in branch")))
- ("B>U" 3 magit-repolist-column-unpushed-to-upstream
- ((:right-align t)
- (:help-echo "Local changes not in upstream")))
- ("Path" 99 magit-repolist-column-path nil))
- "List of columns displayed by `magit-list-repositories'.
-
-Each element has the form (HEADER WIDTH FORMAT PROPS).
-
-HEADER is the string displayed in the header. WIDTH is the width
-of the column. FORMAT is a function that is called with one
-argument, the repository identification (usually its basename),
-and with `default-directory' bound to the toplevel of its working
-tree. It has to return a string to be inserted or nil. PROPS is
-an alist that supports the keys `:right-align' and `:pad-right'.
-Some entries also use `:help-echo', but `tabulated-list' does not
-actually support that yet."
- :package-version '(magit . "2.12.0")
- :group 'magit-repolist
- :type `(repeat (list :tag "Column"
- (string :tag "Header Label")
- (integer :tag "Column Width")
- (function :tag "Inserter Function")
- (repeat :tag "Properties"
- (list (choice :tag "Property"
- (const :right-align)
- (const :pad-right)
- (symbol))
- (sexp :tag "Value"))))))
-
-(defcustom magit-repolist-column-flag-alist
- '((magit-untracked-files . "N")
- (magit-unstaged-files . "U")
- (magit-staged-files . "S"))
- "Association list of predicates and flags for `magit-repolist-column-flag'.
-
-Each element is of the form (FUNCTION . FLAG). Each FUNCTION is
-called with no arguments, with `default-directory' bound to the
-top level of a repository working tree, until one of them returns
-a non-nil value. FLAG corresponding to that function is returned
-as the value of `magit-repolist-column-flag'."
- :package-version '(magit . "3.0.0")
- :group 'magit-repolist
- :type '(alist :key-type (function :tag "Predicate Function")
- :value-type (string :tag "Flag")))
-
-;;; List Repositories
-;;;; Command
-;;;###autoload
-(defun magit-list-repositories ()
- "Display a list of repositories.
-
-Use the options `magit-repository-directories' to control which
-repositories are displayed."
- (interactive)
- (if magit-repository-directories
- (with-current-buffer (get-buffer-create "*Magit Repositories*")
- (magit-repolist-mode)
- (magit-repolist-refresh)
- (tabulated-list-print)
- (switch-to-buffer (current-buffer)))
- (message "You need to customize `magit-repository-directories' %s"
- "before you can list repositories")))
-
-;;;; Mode
-
-(defvar magit-repolist-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map tabulated-list-mode-map)
- (define-key map (kbd "C-m") 'magit-repolist-status)
- map)
- "Local keymap for Magit-Repolist mode buffers.")
-
-(defun magit-repolist-status (&optional _button)
- "Show the status for the repository at point."
- (interactive)
- (--if-let (tabulated-list-get-id)
- (magit-status-setup-buffer (expand-file-name it))
- (user-error "There is no repository at point")))
-
-(define-derived-mode magit-repolist-mode tabulated-list-mode "Repos"
- "Major mode for browsing a list of Git repositories."
- (setq-local x-stretch-cursor nil)
- (setq tabulated-list-padding 0)
- (setq tabulated-list-sort-key (cons "Path" nil))
- (setq tabulated-list-format
- (vconcat (mapcar (pcase-lambda (`(,title ,width ,_fn ,props))
- (nconc (list title width t)
- (-flatten props)))
- magit-repolist-columns)))
- (tabulated-list-init-header)
- (add-hook 'tabulated-list-revert-hook 'magit-repolist-refresh nil t)
- (setq imenu-prev-index-position-function
- 'magit-imenu--repolist-prev-index-position-function)
- (setq imenu-extract-index-name-function
- 'magit-imenu--repolist-extract-index-name-function))
-
-(defun magit-repolist-refresh ()
- (setq tabulated-list-entries
- (mapcar (pcase-lambda (`(,id . ,path))
- (let ((default-directory path))
- (list path
- (vconcat (--map (or (funcall (nth 2 it) id) "")
- magit-repolist-columns)))))
- (magit-list-repos-uniquify
- (--map (cons (file-name-nondirectory (directory-file-name it))
- it)
- (magit-list-repos))))))
-
-;;;; Columns
-
-(defun magit-repolist-column-ident (id)
- "Insert the identification of the repository.
-Usually this is just its basename."
- id)
-
-(defun magit-repolist-column-path (_id)
- "Insert the absolute path of the repository."
- (abbreviate-file-name default-directory))
-
-(defun magit-repolist-column-version (_id)
- "Insert a description of the repository's `HEAD' revision."
- (when-let ((v (or (magit-git-string "describe" "--tags" "--dirty")
- ;; If there are no tags, use the date in MELPA format.
- (magit-git-string "show" "--no-patch" "--format=%cd-g%h"
- "--date=format:%Y%m%d.%H%M"))))
- (save-match-data
- (when (string-match "-dirty\\'" v)
- (magit--put-face (1+ (match-beginning 0)) (length v) 'error v))
- (if (and v (string-match "\\`[0-9]" v))
- (concat " " v)
- v))))
-
-(defun magit-repolist-column-branch (_id)
- "Insert the current branch."
- (magit-get-current-branch))
-
-(defun magit-repolist-column-upstream (_id)
- "Insert the upstream branch of the current branch."
- (magit-get-upstream-branch))
-
-(defun magit-repolist-column-flag (_id)
- "Insert a flag as specified by `magit-repolist-column-flag-alist'.
-
-By default this indicates whether there are uncommitted changes.
-- N if there is at least one untracked file.
-- U if there is at least one unstaged file.
-- S if there is at least one staged file.
-Only one letter is shown, the first that applies."
- (-some (pcase-lambda (`(,fun . ,flag))
- (and (funcall fun) flag))
- magit-repolist-column-flag-alist))
-
-(defun magit-repolist-column-unpulled-from-upstream (_id)
- "Insert number of upstream commits not in the current branch."
- (--when-let (magit-get-upstream-branch)
- (let ((n (cadr (magit-rev-diff-count "HEAD" it))))
- (magit--propertize-face
- (number-to-string n) (if (> n 0) 'bold 'shadow)))))
-
-(defun magit-repolist-column-unpulled-from-pushremote (_id)
- "Insert number of commits in the push branch but not the current branch."
- (--when-let (magit-get-push-branch nil t)
- (let ((n (cadr (magit-rev-diff-count "HEAD" it))))
- (magit--propertize-face
- (number-to-string n) (if (> n 0) 'bold 'shadow)))))
-
-(defun magit-repolist-column-unpushed-to-upstream (_id)
- "Insert number of commits in the current branch but not its upstream."
- (--when-let (magit-get-upstream-branch)
- (let ((n (car (magit-rev-diff-count "HEAD" it))))
- (magit--propertize-face
- (number-to-string n) (if (> n 0) 'bold 'shadow)))))
-
-(defun magit-repolist-column-unpushed-to-pushremote (_id)
- "Insert number of commits in the current branch but not its push branch."
- (--when-let (magit-get-push-branch nil t)
- (let ((n (car (magit-rev-diff-count "HEAD" it))))
- (magit--propertize-face
- (number-to-string n) (if (> n 0) 'bold 'shadow)))))
-
-(defun magit-repolist-column-branches (_id)
- "Insert number of branches."
- (let ((n (length (magit-list-local-branches))))
- (magit--propertize-face (number-to-string n) (if (> n 1) 'bold 'shadow))))
-
-(defun magit-repolist-column-stashes (_id)
- "Insert number of stashes."
- (let ((n (length (magit-list-stashes))))
- (magit--propertize-face (number-to-string n) (if (> n 0) 'bold 'shadow))))
-
-;;; Read Repository
-
-(defun magit-read-repository (&optional read-directory-name)
- "Read a Git repository in the minibuffer, with completion.
-
-The completion choices are the basenames of top-levels of
-repositories found in the directories specified by option
-`magit-repository-directories'. In case of name conflicts
-the basenames are prefixed with the name of the respective
-parent directories. The returned value is the actual path
-to the selected repository.
-
-If READ-DIRECTORY-NAME is non-nil or no repositories can be
-found based on the value of `magit-repository-directories',
-then read an arbitrary directory using `read-directory-name'
-instead."
- (if-let ((repos (and (not read-directory-name)
- magit-repository-directories
- (magit-repos-alist))))
- (let ((reply (magit-completing-read "Git repository" repos)))
- (file-name-as-directory
- (or (cdr (assoc reply repos))
- (if (file-directory-p reply)
- (expand-file-name reply)
- (user-error "Not a repository or a directory: %s" reply)))))
- (file-name-as-directory
- (read-directory-name "Git repository: "
- (or (magit-toplevel) default-directory)))))
-
-(defun magit-list-repos ()
- (cl-mapcan (pcase-lambda (`(,dir . ,depth))
- (magit-list-repos-1 dir depth))
- magit-repository-directories))
-
-(defun magit-list-repos-1 (directory depth)
- (cond ((file-readable-p (expand-file-name ".git" directory))
- (list (file-name-as-directory directory)))
- ((and (> depth 0) (magit-file-accessible-directory-p directory))
- (--mapcat (and (file-directory-p it)
- (magit-list-repos-1 it (1- depth)))
- (directory-files directory t
- directory-files-no-dot-files-regexp t)))))
-
-(defun magit-list-repos-uniquify (alist)
- (let (result (dict (make-hash-table :test 'equal)))
- (dolist (a (delete-dups alist))
- (puthash (car a) (cons (cdr a) (gethash (car a) dict)) dict))
- (maphash
- (lambda (key value)
- (if (= (length value) 1)
- (push (cons key (car value)) result)
- (setq result
- (append result
- (magit-list-repos-uniquify
- (--map (cons (concat
- key "\\"
- (file-name-nondirectory
- (directory-file-name
- (substring it 0 (- (1+ (length key)))))))
- it)
- value))))))
- dict)
- result))
-
-(defun magit-repos-alist ()
- (magit-list-repos-uniquify
- (--map (cons (file-name-nondirectory (directory-file-name it)) it)
- (magit-list-repos))))
-
-;;; _
-(provide 'magit-repos)
-;;; magit-repos.el ends here
diff --git a/elpa/magit-20200728.45/magit-reset.el b/elpa/magit-20200728.45/magit-reset.el
deleted file mode 100644
index 82d0e9a..0000000
--- a/elpa/magit-20200728.45/magit-reset.el
+++ /dev/null
@@ -1,135 +0,0 @@
-;;; magit-reset.el --- reset fuctionality -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements reset commands.
-
-;;; Code:
-
-(require 'magit)
-
-;;;###autoload (autoload 'magit-reset "magit" nil t)
-(transient-define-prefix magit-reset ()
- "Reset the `HEAD', index and/or worktree to a previous state."
- :man-page "git-reset"
- ["Reset"
- ("m" "mixed (HEAD and index)" magit-reset-mixed)
- ("s" "soft (HEAD only)" magit-reset-soft)
- ("h" "hard (HEAD, index and files)" magit-reset-hard)
- ("k" "keep (HEAD and index, keeping uncommitted)" magit-reset-keep)
- ("i" "index (only)" magit-reset-index)
- ("w" "worktree (only)" magit-reset-worktree)
- ""
- ("f" "a file" magit-file-checkout)])
-
-;;;###autoload
-(defun magit-reset-mixed (commit)
- "Reset the `HEAD' and index to COMMIT, but not the working tree.
-\n(git reset --mixed COMMIT)"
- (interactive (list (magit-reset-read-branch-or-commit "Reset %s to")))
- (magit-reset-internal "--mixed" commit))
-
-;;;###autoload
-(defun magit-reset-soft (commit)
- "Reset the `HEAD' to COMMIT, but not the index and working tree.
-\n(git reset --soft REVISION)"
- (interactive (list (magit-reset-read-branch-or-commit "Soft reset %s to")))
- (magit-reset-internal "--soft" commit))
-
-;;;###autoload
-(defun magit-reset-hard (commit)
- "Reset the `HEAD', index, and working tree to COMMIT.
-\n(git reset --hard REVISION)"
- (interactive (list (magit-reset-read-branch-or-commit
- (concat (magit--propertize-face "Hard" 'bold)
- " reset %s to"))))
- (magit-reset-internal "--hard" commit))
-
-;;;###autoload
-(defun magit-reset-keep (commit)
- "Reset the `HEAD' and index to COMMIT, while keeping uncommitted changes.
-\n(git reset --keep REVISION)"
- (interactive (list (magit-reset-read-branch-or-commit "Reset %s to")))
- (magit-reset-internal "--keep" commit))
-
-;;;###autoload
-(defun magit-reset-index (commit)
- "Reset the index to COMMIT.
-Keep the `HEAD' and working tree as-is, so if COMMIT refers to the
-head this effectively unstages all changes.
-\n(git reset COMMIT .)"
- (interactive (list (magit-read-branch-or-commit "Reset index to")))
- (magit-reset-internal nil commit "."))
-
-;;;###autoload
-(defun magit-reset-worktree (commit)
- "Reset the worktree to COMMIT.
-Keep the `HEAD' and index as-is."
- (interactive (list (magit-read-branch-or-commit "Reset worktree to")))
- (magit-wip-commit-before-change nil " before reset")
- (magit-with-temp-index commit nil
- (magit-call-git "checkout-index" "--all" "--force"))
- (magit-wip-commit-after-apply nil " after reset")
- (magit-refresh))
-
-;;;###autoload
-(defun magit-reset-quickly (commit &optional hard)
- "Reset the `HEAD' and index to COMMIT, and possibly the working tree.
-With a prefix argument reset the working tree otherwise don't.
-\n(git reset --mixed|--hard COMMIT)"
- (interactive (list (magit-reset-read-branch-or-commit
- (if current-prefix-arg
- (concat (magit--propertize-face "Hard" 'bold)
- " reset %s to")
- "Reset %s to"))
- current-prefix-arg))
- (magit-reset-internal (if hard "--hard" "--mixed") commit))
-
-(defun magit-reset-read-branch-or-commit (prompt)
- "Prompt for and return a ref to reset HEAD to.
-
-PROMPT is a format string, where either the current branch name
-or \"detached head\" will be substituted for %s."
- (magit-read-branch-or-commit
- (format prompt (or (magit-get-current-branch) "detached head"))))
-
-(defun magit-reset-internal (arg commit &optional path)
- (when (and (not (member arg '("--hard" nil)))
- (equal (magit-rev-parse commit)
- (magit-rev-parse "HEAD~")))
- (with-temp-buffer
- (magit-git-insert "show" "-s" "--format=%B" "HEAD")
- (when git-commit-major-mode
- (funcall git-commit-major-mode))
- (git-commit-setup-font-lock)
- (git-commit-save-message)))
- (let ((cmd (if (and (equal commit "HEAD") (not arg)) "unstage" "reset")))
- (magit-wip-commit-before-change nil (concat " before " cmd))
- (magit-run-git "reset" arg commit "--" path)
- (when (equal cmd "unstage")
- (magit-wip-commit-after-apply nil " after unstage"))))
-
-;;; _
-(provide 'magit-reset)
-;;; magit-reset.el ends here
diff --git a/elpa/magit-20200728.45/magit-section.el b/elpa/magit-20200728.45/magit-section.el
deleted file mode 100644
index 6310725..0000000
--- a/elpa/magit-20200728.45/magit-section.el
+++ /dev/null
@@ -1,1733 +0,0 @@
-;;; magit-section.el --- Sections for read-only buffers -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Package-Requires: ((emacs "25.1") (dash "20200524"))
-;; Keywords: tools
-;; Homepage: https://github.com/magit/magit
-
-;; Magit-Section 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, or (at your option)
-;; any later version.
-;;
-;; Magit-Section 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This package implements the main user interface of Magit — the
-;; collapsible sections that make up its buffers. This package used
-;; to be distributed as part of Magit but now it can also be used by
-;; other packages that have nothing to do with Magit or Git.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-(require 'eieio)
-
-(eval-when-compile
- (require 'benchmark)
- (require 'subr-x))
-
-;;; Hooks
-
-(defvar magit-section-movement-hook nil
- "Hook run by `magit-section-goto'.
-That function in turn is used by all section movement commands.")
-
-(defvar magit-section-highlight-hook
- '(magit-section-highlight
- magit-section-highlight-selection)
- "Functions used to highlight the current section.
-Each function is run with the current section as only argument
-until one of them returns non-nil.")
-
-(defvar magit-section-unhighlight-hook nil
- "Functions used to unhighlight the previously current section.
-Each function is run with the current section as only argument
-until one of them returns non-nil. Most sections are properly
-unhighlighted without requiring a specialized unhighlighter,
-diff-related sections being the only exception.")
-
-(defvar magit-section-set-visibility-hook
- '(magit-section-cached-visibility)
- "Hook used to set the initial visibility of a section.
-Stop at the first function that returns non-nil. The returned
-value should be `show', `hide' or nil. If no function returns
-non-nil, determine the visibility as usual, i.e. use the
-hardcoded section specific default (see `magit-insert-section').")
-
-(defvar magit-section-goto-successor-hook nil
- "Hook used to go to the same section as was current before a refresh.
-This is only used if the standard mechanism for doing so did not
-succeed.")
-
-;;; Options
-
-(defgroup magit-section nil
- "Expandable sections."
- :link '(info-link "(magit)Sections")
- :group 'extensions)
-
-(defcustom magit-section-show-child-count t
- "Whether to append the number of children to section headings.
-This only applies to sections for which doing so makes sense."
- :package-version '(magit . "2.1.0")
- :group 'magit-section
- :type 'boolean)
-
-(defcustom magit-section-cache-visibility t
- "Whether to cache visibility of sections.
-
-Sections always retain their visibility state when they are being
-recreated during a refresh. But if a section disappears and then
-later reappears again, then this option controls whether this is
-the case.
-
-If t, then cache the visibility of all sections. If a list of
-section types, then only do so for matching sections. If nil,
-then don't do so for any sections."
- :package-version '(magit . "2.12.0")
- :group 'magit-section
- :type '(choice (const :tag "Don't cache visibility" nil)
- (const :tag "Cache visibility of all sections" t)
- (repeat :tag "Cache visibility for section types" symbol)))
-
-(defcustom magit-section-initial-visibility-alist
- '((stashes . hide))
- "Alist controlling the initial visibility of sections.
-
-Each element maps a section type or lineage to the initial
-visibility state for such sections. The state has to be one of
-`show' or `hide', or a function that returns one of these symbols.
-A function is called with the section as the only argument.
-
-Use the command `magit-describe-section' to determine a section's
-lineage or type. The vector in the output is the section lineage
-and the type is the first element of that vector. Wildcards can
-be used, see `magit-section-match'.
-
-Currently this option is only used to override hardcoded defaults,
-but in the future it will also be used set the defaults.
-
-An entry whose key is `magit-status-initial-section' specifies
-the visibility of the section `magit-status-goto-initial-section'
-jumps to. This does not only override defaults, but also other
-entries of this alist."
- :package-version '(magit . "2.12.0")
- :group 'magit-section
- :type '(alist :key-type (sexp :tag "Section type/lineage")
- :value-type (choice (const hide)
- (const show)
- function)))
-
-(defcustom magit-section-visibility-indicator
- (if (window-system)
- '(magit-fringe-bitmap> . magit-fringe-bitmapv)
- '("…" . t))
- "Whether and how to indicate that a section can be expanded/collapsed.
-
-If nil, then don't show any indicators.
-Otherwise the value has to have one of these two forms:
-
-\(EXPANDABLE-BITMAP . COLLAPSIBLE-BITMAP)
-
- Both values have to be variables whose values are fringe
- bitmaps. In this case every section that can be expanded or
- collapsed gets an indicator in the left fringe.
-
- To provide extra padding around the indicator, set
- `left-fringe-width' in `magit-mode-hook'.
-
-\(STRING . BOOLEAN)
-
- In this case STRING (usually an ellipsis) is shown at the end
- of the heading of every collapsed section. Expanded sections
- get no indicator. The cdr controls whether the appearance of
- these ellipsis take section highlighting into account. Doing
- so might potentially have an impact on performance, while not
- doing so is kinda ugly."
- :package-version '(magit . "3.0.0")
- :group 'magit-section
- :type '(choice (const :tag "No indicators" nil)
- (cons :tag "Use +- fringe indicators"
- (const magit-fringe-bitmap+)
- (const magit-fringe-bitmap-))
- (cons :tag "Use >v fringe indicators"
- (const magit-fringe-bitmap>)
- (const magit-fringe-bitmapv))
- (cons :tag "Use bold >v fringe indicators)"
- (const magit-fringe-bitmap-bold>)
- (const magit-fringe-bitmap-boldv))
- (cons :tag "Use custom fringe indicators"
- (variable :tag "Expandable bitmap variable")
- (variable :tag "Collapsible bitmap variable"))
- (cons :tag "Use ellipses at end of headings"
- (string :tag "Ellipsis" "…")
- (choice :tag "Use face kludge"
- (const :tag "Yes (potentially slow)" t)
- (const :tag "No (kinda ugly)" nil)))))
-
-(defcustom magit-keep-region-overlay nil
- "Whether to keep the region overlay when there is a valid selection.
-
-By default Magit removes the regular region overlay if, and only
-if, that region constitutes a valid selection as understood by
-Magit commands. Otherwise it does not remove that overlay, and
-the region looks like it would in other buffers.
-
-There are two types of such valid selections: hunk-internal
-regions and regions that select two or more sibling sections.
-In such cases Magit removes the region overlay and instead
-highlights a slightly larger range. All text (for hunk-internal
-regions) or the headings of all sections (for sibling selections)
-that are inside that range (not just inside the region) are acted
-on by commands such as the staging command. This buffer range
-begins at the beginning of the line on which the region begins
-and ends at the end of the line on which the region ends.
-
-Because Magit acts on this larger range and not the region, it is
-actually quite important to visualize that larger range. If we
-don't do that, then one might think that these commands act on
-the region instead. If you want to *also* visualize the region,
-then set this option to t. But please note that when the region
-does *not* constitute a valid selection, then the region is
-*always* visualized as usual, and that it is usually under such
-circumstances that you want to use a non-magit command to act on
-the region.
-
-Besides keeping the region overlay, setting this option to t also
-causes all face properties, except for `:foreground', to be
-ignored for the faces used to highlight headings of selected
-sections. This avoids the worst conflicts that result from
-displaying the region and the selection overlays at the same
-time. We are not interested in dealing with other conflicts.
-In fact we *already* provide a way to avoid all of these
-conflicts: *not* changing the value of this option.
-
-It should be clear by now that we consider it a mistake to set
-this to display the region when the Magit selection is also
-visualized, but since it has been requested a few times and
-because it doesn't cost much to offer this option we do so.
-However that might change. If the existence of this option
-starts complicating other things, then it will be removed."
- :package-version '(magit . "2.3.0")
- :group 'magit-section
- :type 'boolean)
-
-(defcustom magit-section-disable-line-numbers t
- "In Magit buffers, whether to disable modes that display line numbers.
-
-Some users who turn on `global-display-line-numbers-mode' (or
-`global-nlinum-mode' or `global-linum-mode') expect line numbers
-to be displayed everywhere except in Magit buffers. Other users
-do not expect Magit buffers to be treated differently. At least
-in theory users in the first group should not use the global mode,
-but that ship has sailed, thus this option."
- :package-version '(magit . "3.0.0")
- :group 'magit-section
- :type 'boolean)
-
-;;; Faces
-
-(defgroup magit-section-faces nil
- "Faces used by Magit-Section."
- :group 'magit-section
- :group 'faces)
-
-(defface magit-section-highlight
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey95")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey20"))
- "Face for highlighting the current section."
- :group 'magit-section-faces)
-
-(defface magit-section-heading
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :foreground "DarkGoldenrod4"
- :weight bold)
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :foreground "LightGoldenrod2"
- :weight bold))
- "Face for section headings."
- :group 'magit-section-faces)
-
-(defface magit-section-secondary-heading
- `((t ,@(and (>= emacs-major-version 27) '(:extend t))
- :weight bold))
- "Face for section headings of some secondary headings."
- :group 'magit-section-faces)
-
-(defface magit-section-heading-selection
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :foreground "salmon4")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :foreground "LightSalmon3"))
- "Face for selected section headings."
- :group 'magit-section-faces)
-
-;;; Classes
-
-(defvar magit--current-section-hook nil
- "Internal variable used for `magit-describe-section'.")
-
-(defvar magit--section-type-alist nil)
-
-(defclass magit-section ()
- ((keymap :initform nil :allocation :class)
- (type :initform nil :initarg :type)
- (value :initform nil :initarg :value)
- (start :initform nil :initarg :start)
- (content :initform nil)
- (end :initform nil)
- (hidden :initform nil)
- (washer :initform nil)
- (process :initform nil)
- (heading-highlight-face :initform nil)
- (inserter :initform (symbol-value 'magit--current-section-hook))
- (parent :initform nil :initarg :parent)
- (children :initform nil)))
-
-;;; Mode
-
-(defvar symbol-overlay-inhibit-map)
-
-(defvar magit-section-mode-map
- (let ((map (make-keymap)))
- (suppress-keymap map t)
- (define-key map (kbd "C-i") 'magit-section-toggle)
- (define-key map [C-tab] 'magit-section-cycle)
- (define-key map [M-tab] 'magit-section-cycle)
- ;; [backtab] is the most portable binding for Shift+Tab.
- (define-key map [backtab] 'magit-section-cycle-global)
- (define-key map (kbd "^") 'magit-section-up)
- (define-key map (kbd "p") 'magit-section-backward)
- (define-key map (kbd "n") 'magit-section-forward)
- (define-key map (kbd "M-p") 'magit-section-backward-sibling)
- (define-key map (kbd "M-n") 'magit-section-forward-sibling)
- (define-key map "1" 'magit-section-show-level-1)
- (define-key map "2" 'magit-section-show-level-2)
- (define-key map "3" 'magit-section-show-level-3)
- (define-key map "4" 'magit-section-show-level-4)
- (define-key map (kbd "M-1") 'magit-section-show-level-1-all)
- (define-key map (kbd "M-2") 'magit-section-show-level-2-all)
- (define-key map (kbd "M-3") 'magit-section-show-level-3-all)
- (define-key map (kbd "M-4") 'magit-section-show-level-4-all)
- map))
-
-(define-derived-mode magit-section-mode special-mode "Magit-Sections"
- "Parent major mode from which major modes with Magit-like sections inherit.
-
-Magit-Section is documented in info node `(magit-section)'."
- :group 'magit-section
- (buffer-disable-undo)
- (setq truncate-lines t)
- (setq buffer-read-only t)
- (setq-local line-move-visual t) ; see #1771
- ;; Turn off syntactic font locking, but not by setting
- ;; `font-lock-defaults' because that would enable font locking, and
- ;; not all magit plugins may be ready for that (see #3950).
- (setq-local font-lock-syntactic-face-function #'ignore)
- (setq show-trailing-whitespace nil)
- (setq-local symbol-overlay-inhibit-map t)
- (setq list-buffers-directory (abbreviate-file-name default-directory))
- ;; (hack-dir-local-variables-non-file-buffer)
- (make-local-variable 'text-property-default-nonsticky)
- (push (cons 'keymap t) text-property-default-nonsticky)
- (add-hook 'post-command-hook #'magit-section-update-highlight t t)
- (add-hook 'deactivate-mark-hook #'magit-section-update-highlight t t)
- (setq-local redisplay-highlight-region-function
- 'magit-section--highlight-region)
- (setq-local redisplay-unhighlight-region-function
- 'magit-section--unhighlight-region)
- (when magit-section-disable-line-numbers
- (when (bound-and-true-p global-linum-mode)
- (linum-mode -1))
- (when (and (fboundp 'nlinum-mode)
- (bound-and-true-p global-nlinum-mode))
- (nlinum-mode -1))
- (when (and (fboundp 'display-line-numbers-mode)
- (bound-and-true-p global-display-line-numbers-mode))
- (display-line-numbers-mode -1)))
- (when (fboundp 'magit-preserve-section-visibility-cache)
- (add-hook 'kill-buffer-hook #'magit-preserve-section-visibility-cache)))
-
-;;; Core
-
-(defvar-local magit-root-section nil
- "The root section in the current buffer.
-All other sections are descendants of this section. The value
-of this variable is set by `magit-insert-section' and you should
-never modify it.")
-(put 'magit-root-section 'permanent-local t)
-
-(defun magit-current-section ()
- "Return the section at point."
- (or (get-text-property (point) 'magit-section) magit-root-section))
-
-(defun magit-section-ident (section)
- "Return an unique identifier for SECTION.
-The return value has the form ((TYPE . VALUE)...)."
- (with-slots (type value parent) section
- (cons (cons type
- (cond ((eieio-object-p value)
- (magit-section-ident-value value))
- ((not (memq type '(unpulled unpushed))) value)
- ((string-match-p "@{upstream}" value) value)
- ;; Unfortunately Git chokes on "@{push}" when
- ;; the value of `push.default' does not allow a
- ;; 1:1 mapping. Arbitrary commands may consult
- ;; the section value so we cannot use "@{push}".
- ;; But `unpushed' and `unpulled' sections should
- ;; keep their identity when switching branches
- ;; so we have to use another value here.
- ((string-match-p "\\`\\.\\." value) "..@{push}")
- (t "@{push}..")))
- (and parent
- (magit-section-ident parent)))))
-
-(cl-defgeneric magit-section-ident-value (value)
- "Return a constant representation of VALUE.
-VALUE is the value of a `magit-section' object. If that is an
-object itself, then that is not suitable to be used to identify
-the section because two objects may represent the same thing but
-not be equal. If possible a method should be added for such
-objects, which returns a value that is equal. Otherwise the
-catch-all method is used, which just returns the argument
-itself.")
-
-(cl-defmethod magit-section-ident-value (arg) arg)
-
-(defun magit-get-section (ident &optional root)
- "Return the section identified by IDENT.
-IDENT has to be a list as returned by `magit-section-ident'.
-If optional ROOT is non-nil, then search in that section tree
-instead of in the one whose root `magit-root-section' is."
- (setq ident (reverse ident))
- (let ((section (or root magit-root-section)))
- (when (eq (car (pop ident))
- (oref section type))
- (while (and ident
- (pcase-let* ((`(,type . ,value) (car ident))
- (value (magit-section-ident-value value)))
- (setq section
- (cl-find-if (lambda (section)
- (and (eq (oref section type) type)
- (equal (magit-section-ident-value
- (oref section value))
- value)))
- (oref section children)))))
- (pop ident))
- section)))
-
-(defun magit-section-lineage (section)
- "Return the lineage of SECTION.
-The return value has the form (TYPE...)."
- (cons (oref section type)
- (when-let ((parent (oref section parent)))
- (magit-section-lineage parent))))
-
-(defvar magit-insert-section--current nil "For internal use only.")
-(defvar magit-insert-section--parent nil "For internal use only.")
-(defvar magit-insert-section--oldroot nil "For internal use only.")
-
-;;; Commands
-;;;; Movement
-
-(defun magit-section-forward ()
- "Move to the beginning of the next visible section."
- (interactive)
- (if (eobp)
- (user-error "No next section")
- (let ((section (magit-current-section)))
- (if (oref section parent)
- (let ((next (and (not (oref section hidden))
- (not (= (oref section end)
- (1+ (point))))
- (car (oref section children)))))
- (while (and section (not next))
- (unless (setq next (car (magit-section-siblings section 'next)))
- (setq section (oref section parent))))
- (if next
- (magit-section-goto next)
- (user-error "No next section")))
- (magit-section-goto 1)))))
-
-(defun magit-section-backward ()
- "Move to the beginning of the current or the previous visible section.
-When point is at the beginning of a section then move to the
-beginning of the previous visible section. Otherwise move to
-the beginning of the current section."
- (interactive)
- (if (bobp)
- (user-error "No previous section")
- (let ((section (magit-current-section)) children)
- (cond
- ((and (= (point)
- (1- (oref section end)))
- (setq children (oref section children)))
- (magit-section-goto (car (last children))))
- ((and (oref section parent)
- (not (= (point)
- (oref section start))))
- (magit-section-goto section))
- (t
- (let ((prev (car (magit-section-siblings section 'prev))))
- (if prev
- (while (and (not (oref prev hidden))
- (setq children (oref prev children)))
- (setq prev (car (last children))))
- (setq prev (oref section parent)))
- (cond (prev
- (magit-section-goto prev))
- ((oref section parent)
- (user-error "No previous section"))
- ;; Eob special cases.
- ((not (get-text-property (1- (point)) 'invisible))
- (magit-section-goto -1))
- (t
- (goto-char (previous-single-property-change
- (1- (point)) 'invisible))
- (forward-line -1)
- (magit-section-goto (magit-current-section))))))))))
-
-(defun magit-section-up ()
- "Move to the beginning of the parent section."
- (interactive)
- (--if-let (oref (magit-current-section) parent)
- (magit-section-goto it)
- (user-error "No parent section")))
-
-(defun magit-section-forward-sibling ()
- "Move to the beginning of the next sibling section.
-If there is no next sibling section, then move to the parent."
- (interactive)
- (let ((current (magit-current-section)))
- (if (oref current parent)
- (--if-let (car (magit-section-siblings current 'next))
- (magit-section-goto it)
- (magit-section-forward))
- (magit-section-goto 1))))
-
-(defun magit-section-backward-sibling ()
- "Move to the beginning of the previous sibling section.
-If there is no previous sibling section, then move to the parent."
- (interactive)
- (let ((current (magit-current-section)))
- (if (oref current parent)
- (--if-let (car (magit-section-siblings current 'prev))
- (magit-section-goto it)
- (magit-section-backward))
- (magit-section-goto -1))))
-
-(defun magit-section-goto (arg)
- (if (integerp arg)
- (progn (forward-line arg)
- (setq arg (magit-current-section)))
- (goto-char (oref arg start)))
- (run-hook-with-args 'magit-section-movement-hook arg))
-
-(defun magit-section-set-window-start (section)
- "Ensure the beginning of SECTION is visible."
- (unless (pos-visible-in-window-p (oref section end))
- (set-window-start (selected-window) (oref section start))))
-
-(defmacro magit-define-section-jumper (name heading type &optional value)
- "Define an interactive function to go some section.
-Together TYPE and VALUE identify the section.
-HEADING is the displayed heading of the section."
- (declare (indent defun))
- `(defun ,name (&optional expand) ,(format "\
-Jump to the section \"%s\".
-With a prefix argument also expand it." heading)
- (interactive "P")
- (--if-let (magit-get-section
- (cons (cons ',type ,value)
- (magit-section-ident magit-root-section)))
- (progn (goto-char (oref it start))
- (when expand
- (with-local-quit (magit-section-show it))
- (recenter 0)))
- (message ,(format "Section \"%s\" wasn't found" heading)))))
-
-;;;; Visibility
-
-(defun magit-section-show (section)
- "Show the body of the current section."
- (interactive (list (magit-current-section)))
- (oset section hidden nil)
- (magit-section--maybe-wash section)
- (when-let ((beg (oref section content)))
- (remove-overlays beg (oref section end) 'invisible t))
- (magit-section-maybe-update-visibility-indicator section)
- (magit-section-maybe-cache-visibility section)
- (dolist (child (oref section children))
- (if (oref child hidden)
- (magit-section-hide child)
- (magit-section-show child))))
-
-(defun magit-section--maybe-wash (section)
- (when-let ((washer (oref section washer)))
- (oset section washer nil)
- (let ((inhibit-read-only t)
- (magit-insert-section--parent section)
- (content (oref section content)))
- (save-excursion
- (if (and content (< content (oref section end)))
- (funcall washer section) ; already partially washed (hunk)
- (goto-char (oref section end))
- (oset section content (point-marker))
- (funcall washer)
- (oset section end (point-marker)))))
- (magit-section-update-highlight)))
-
-(defun magit-section-hide (section)
- "Hide the body of the current section."
- (interactive (list (magit-current-section)))
- (if (eq section magit-root-section)
- (user-error "Cannot hide root section")
- (oset section hidden t)
- (when-let ((beg (oref section content)))
- (let ((end (oref section end)))
- (remove-overlays beg end 'invisible t)
- (let ((o (make-overlay beg end)))
- (overlay-put o 'evaporate t)
- (overlay-put o 'invisible t))))
- (magit-section-maybe-update-visibility-indicator section)
- (magit-section-maybe-cache-visibility section)))
-
-(defun magit-section-toggle (section)
- "Toggle visibility of the body of the current section."
- (interactive (list (magit-current-section)))
- (if (eq section magit-root-section)
- (user-error "Cannot hide root section")
- (goto-char (oref section start))
- (if (oref section hidden)
- (magit-section-show section)
- (magit-section-hide section))))
-
-(defun magit-section-toggle-children (section)
- "Toggle visibility of bodies of children of the current section."
- (interactive (list (magit-current-section)))
- (goto-char (oref section start))
- (let* ((children (oref section children))
- (show (--any-p (oref it hidden) children)))
- (dolist (c children)
- (oset c hidden show)))
- (magit-section-show section))
-
-(defun magit-section-show-children (section &optional depth)
- "Recursively show the bodies of children of the current section.
-With a prefix argument show children that deep and hide deeper
-children."
- (interactive (list (magit-current-section)))
- (magit-section-show-children-1 section depth)
- (magit-section-show section))
-
-(defun magit-section-show-children-1 (section &optional depth)
- (dolist (child (oref section children))
- (oset child hidden nil)
- (if depth
- (if (> depth 0)
- (magit-section-show-children-1 child (1- depth))
- (magit-section-hide child))
- (magit-section-show-children-1 child))))
-
-(defun magit-section-hide-children (section)
- "Recursively hide the bodies of children of the current section."
- (interactive (list (magit-current-section)))
- (mapc 'magit-section-hide (oref section children)))
-
-(defun magit-section-show-headings (section)
- "Recursively show headings of children of the current section.
-Only show the headings, previously shown text-only bodies are
-hidden."
- (interactive (list (magit-current-section)))
- (magit-section-show-headings-1 section)
- (magit-section-show section))
-
-(defun magit-section-show-headings-1 (section)
- (dolist (child (oref section children))
- (oset child hidden nil)
- (when (or (oref child children)
- (not (oref child content)))
- (magit-section-show-headings-1 child))))
-
-(defun magit-section-cycle (section)
- "Cycle visibility of current section and its children."
- (interactive (list (magit-current-section)))
- (goto-char (oref section start))
- (if (oref section hidden)
- (progn (magit-section-show section)
- (magit-section-hide-children section))
- (let ((children (oref section children)))
- (cond ((and (--any-p (oref it hidden) children)
- (--any-p (oref it children) children))
- (magit-section-show-headings section))
- ((-any-p 'magit-section-hidden-body children)
- (magit-section-show-children section))
- (t
- (magit-section-hide section))))))
-
-(defun magit-section-cycle-global ()
- "Cycle visibility of all sections in the current buffer."
- (interactive)
- (let ((children (oref magit-root-section children)))
- (cond ((and (--any-p (oref it hidden) children)
- (--any-p (oref it children) children))
- (magit-section-show-headings magit-root-section))
- ((-any-p 'magit-section-hidden-body children)
- (magit-section-show-children magit-root-section))
- (t
- (mapc 'magit-section-hide children)))))
-
-(defun magit-section-hidden-body (section &optional pred)
- (--if-let (oref section children)
- (funcall (or pred '-any-p) 'magit-section-hidden-body it)
- (and (oref section content)
- (oref section hidden))))
-
-(defun magit-section-invisible-p (section)
- "Return t if the SECTION's body is invisible.
-When the body of an ancestor of SECTION is collapsed then
-SECTION's body (and heading) obviously cannot be visible."
- (or (oref section hidden)
- (--when-let (oref section parent)
- (magit-section-invisible-p it))))
-
-(defun magit-section-show-level (level)
- "Show surrounding sections up to LEVEL.
-If LEVEL is negative, show up to the absolute value.
-Sections at higher levels are hidden."
- (if (< level 0)
- (let ((s (magit-current-section)))
- (setq level (- level))
- (while (> (1- (length (magit-section-ident s))) level)
- (setq s (oref s parent))
- (goto-char (oref s start)))
- (magit-section-show-children magit-root-section (1- level)))
- (cl-do* ((s (magit-current-section)
- (oref s parent))
- (i (1- (length (magit-section-ident s)))
- (cl-decf i)))
- ((cond ((< i level) (magit-section-show-children s (- level i 1)) t)
- ((= i level) (magit-section-hide s) t))
- (magit-section-goto s)))))
-
-(defun magit-section-show-level-1 ()
- "Show surrounding sections on first level."
- (interactive)
- (magit-section-show-level 1))
-
-(defun magit-section-show-level-1-all ()
- "Show all sections on first level."
- (interactive)
- (magit-section-show-level -1))
-
-(defun magit-section-show-level-2 ()
- "Show surrounding sections up to second level."
- (interactive)
- (magit-section-show-level 2))
-
-(defun magit-section-show-level-2-all ()
- "Show all sections up to second level."
- (interactive)
- (magit-section-show-level -2))
-
-(defun magit-section-show-level-3 ()
- "Show surrounding sections up to third level."
- (interactive)
- (magit-section-show-level 3))
-
-(defun magit-section-show-level-3-all ()
- "Show all sections up to third level."
- (interactive)
- (magit-section-show-level -3))
-
-(defun magit-section-show-level-4 ()
- "Show surrounding sections up to fourth level."
- (interactive)
- (magit-section-show-level 4))
-
-(defun magit-section-show-level-4-all ()
- "Show all sections up to fourth level."
- (interactive)
- (magit-section-show-level -4))
-
-;;;; Auxiliary
-
-(defun magit-describe-section-briefly (section &optional ident)
- "Show information about the section at point.
-With a prefix argument show the section identity instead of the
-section lineage. This command is intended for debugging purposes."
- (interactive (list (magit-current-section) current-prefix-arg))
- (let ((str (format "#<%s %S %S %s-%s>"
- (eieio-object-class section)
- (let ((val (oref section value)))
- (cond ((stringp val)
- (substring-no-properties val))
- ((and (eieio-object-p val)
- (fboundp 'cl-prin1-to-string))
- (cl-prin1-to-string val))
- (t
- val)))
- (if ident
- (magit-section-ident section)
- (apply #'vector (magit-section-lineage section)))
- (when-let ((m (oref section start)))
- (marker-position m))
- (when-let ((m (oref section end)))
- (marker-position m)))))
- (if (called-interactively-p 'any)
- (message "%s" str)
- str)))
-
-(cl-defmethod cl-print-object ((section magit-section) stream)
- "Print `magit-describe-section' result of SECTION."
- ;; Used by debug and edebug as of Emacs 26.
- (princ (magit-describe-section-briefly section) stream))
-
-(defun magit-describe-section (section &optional interactive-p)
- "Show information about the section at point."
- (interactive (list (magit-current-section) t))
- (let ((inserter-section section))
- (while (and inserter-section (not (oref inserter-section inserter)))
- (setq inserter-section (oref inserter-section parent)))
- (when (and inserter-section (oref inserter-section inserter))
- (setq section inserter-section)))
- (pcase (oref section inserter)
- (`((,hook ,fun) . ,src-src)
- (help-setup-xref `(magit-describe-section ,section) interactive-p)
- (with-help-window (help-buffer)
- (with-current-buffer standard-output
- (insert (format-message
- "%s\n is inserted by `%s'\n from `%s'"
- (magit-describe-section-briefly section)
- (make-text-button (symbol-name fun) nil
- :type 'help-function
- 'help-args (list fun))
- (make-text-button (symbol-name hook) nil
- :type 'help-variable
- 'help-args (list hook))))
- (pcase-dolist (`(,hook ,fun) src-src)
- (insert (format-message
- ",\n called by `%s'\n from `%s'"
- (make-text-button (symbol-name fun) nil
- :type 'help-function
- 'help-args (list fun))
- (make-text-button (symbol-name hook) nil
- :type 'help-variable
- 'help-args (list hook)))))
- (insert ".\n\n")
- (insert
- (format-message
- "`%s' is "
- (make-text-button (symbol-name fun) nil
- :type 'help-function 'help-args (list fun))))
- (describe-function-1 fun))))
- (_ (message "%s, inserter unknown"
- (magit-describe-section-briefly section)))))
-
-;;; Match
-
-(cl-defun magit-section-match
- (condition &optional (section (magit-current-section)))
- "Return t if SECTION matches CONDITION.
-
-SECTION defaults to the section at point. If SECTION is not
-specified and there also is no section at point, then return
-nil.
-
-CONDITION can take the following forms:
- (CONDITION...) matches if any of the CONDITIONs matches.
- [CLASS...] matches if the section's class is the same
- as the first CLASS or a subclass of that;
- the section's parent class matches the
- second CLASS; and so on.
- [* CLASS...] matches sections that match [CLASS...] and
- also recursively all their child sections.
- CLASS matches if the section's class is the same
- as CLASS or a subclass of that; regardless
- of the classes of the parent sections.
-
-Each CLASS should be a class symbol, identifying a class that
-derives from `magit-section'. For backward compatibility CLASS
-can also be a \"type symbol\". A section matches such a symbol
-if the value of its `type' slot is `eq'. If a type symbol has
-an entry in `magit--section-type-alist', then a section also
-matches that type if its class is a subclass of the class that
-corresponds to the type as per that alist.
-
-Note that it is not necessary to specify the complete section
-lineage as printed by `magit-describe-section-briefly', unless
-of course you want to be that precise."
- (and section (magit-section-match-1 condition section)))
-
-(defun magit-section-match-1 (condition section)
- (cl-assert condition)
- (and section
- (if (listp condition)
- (--first (magit-section-match-1 it section) condition)
- (magit-section-match-2 (if (symbolp condition)
- (list condition)
- (cl-coerce condition 'list))
- section))))
-
-(defun magit-section-match-2 (condition section)
- (if (eq (car condition) '*)
- (or (magit-section-match-2 (cdr condition) section)
- (when-let ((parent (oref section parent)))
- (magit-section-match-2 condition parent)))
- (and (let ((c (car condition)))
- (if (class-p c)
- (cl-typep section c)
- (if-let ((class (cdr (assq c magit--section-type-alist))))
- (cl-typep section class)
- (eq (oref section type) c))))
- (or (not (setq condition (cdr condition)))
- (when-let ((parent (oref section parent)))
- (magit-section-match-2 condition parent))))))
-
-(defun magit-section-value-if (condition &optional section)
- "If the section at point matches CONDITION, then return its value.
-
-If optional SECTION is non-nil then test whether that matches
-instead. If there is no section at point and SECTION is nil,
-then return nil. If the section does not match, then return
-nil.
-
-See `magit-section-match' for the forms CONDITION can take."
- (when-let ((section (or section (magit-current-section))))
- (and (magit-section-match condition section)
- (oref section value))))
-
-(defmacro magit-section-when (condition &rest body)
- "If the section at point matches CONDITION, evaluate BODY.
-
-If the section matches, then evaluate BODY forms sequentially
-with `it' bound to the section and return the value of the last
-form. If there are no BODY forms, then return the value of the
-section. If the section does not match or if there is no section
-at point, then return nil.
-
-See `magit-section-match' for the forms CONDITION can take."
- (declare (obsolete
- "instead use `magit-section-match' or `magit-section-value-if'."
- "Magit 2.90.0")
- (indent 1)
- (debug (sexp body)))
- `(--when-let (magit-current-section)
- ;; Quoting CONDITION here often leads to double-quotes, which
- ;; isn't an issue because `magit-section-match-1' implicitly
- ;; deals with that. We shouldn't force users of this function
- ;; to not quote CONDITION because that would needlessly break
- ;; backward compatibility.
- (when (magit-section-match ',condition it)
- ,@(or body '((oref it value))))))
-
-(defmacro magit-section-case (&rest clauses)
- "Choose among clauses on the type of the section at point.
-
-Each clause looks like (CONDITION BODY...). The type of the
-section is compared against each CONDITION; the BODY forms of the
-first match are evaluated sequentially and the value of the last
-form is returned. Inside BODY the symbol `it' is bound to the
-section at point. If no clause succeeds or if there is no
-section at point, return nil.
-
-See `magit-section-match' for the forms CONDITION can take.
-Additionally a CONDITION of t is allowed in the final clause, and
-matches if no other CONDITION match, even if there is no section
-at point."
- (declare (indent 0)
- (debug (&rest (sexp body))))
- `(let* ((it (magit-current-section)))
- (cond ,@(mapcar (lambda (clause)
- `(,(or (eq (car clause) t)
- `(and it
- (magit-section-match-1 ',(car clause) it)))
- ,@(cdr clause)))
- clauses))))
-
-(defun magit-section-match-assoc (section alist)
- "Return the value associated with SECTION's type or lineage in ALIST."
- (-some (pcase-lambda (`(,key . ,val))
- (and (magit-section-match-1 key section) val))
- alist))
-
-;;; Create
-
-(defvar magit-insert-section-hook nil
- "Hook run after `magit-insert-section's BODY.
-Avoid using this hook and only ever do so if you know
-what you are doing and are sure there is no other way.")
-
-(defmacro magit-insert-section (&rest args)
- "Insert a section at point.
-
-TYPE is the section type, a symbol which is prefixed with the
-name of the package. (For historic reasons the types used by
-Magit and Forge do not use a package prefix.) Many commands
-that act on the current section behave differently depending
-on its type.
-
-Optional VALUE is the value of the section, usually a string
-that is required when acting on the section.
-
-When optional HIDE is non-nil collapse the section body by
-default, i.e. when first creating the section, but not when
-refreshing the buffer. Else expand it by default. This can be
-overwritten using `magit-section-set-visibility-hook'. When a
-section is recreated during a refresh, then the visibility of
-predecessor is inherited and HIDE is ignored (but the hook is
-still honored).
-
-BODY is any number of forms that actually insert the section's
-heading and body. Optional NAME, if specified, has to be a
-symbol, which is then bound to the object of the section being
-inserted.
-
-Before BODY is evaluated the `start' of the section object is set
-to the value of `point' and after BODY was evaluated its `end' is
-set to the new value of `point'; BODY is responsible for moving
-`point' forward.
-
-If it turns out inside BODY that the section is empty, then
-`magit-cancel-section' can be used to abort and remove all traces
-of the partially inserted section. This can happen when creating
-a section by washing Git's output and Git didn't actually output
-anything this time around.
-
-For historic reasons, if a variable `magit-TYPE-section-map'
-or `forge-TYPE-section-map' exists, then use that as the
-text-property `keymap' of all text belonging to the section (but
-this may be overwritten in subsections). TYPE can also have the
-form `(eval FORM)' in which case FORM is evaluated at runtime.
-
-\(fn [NAME] (TYPE &optional VALUE HIDE) &rest BODY)"
- (declare (indent defun)
- (debug ([&optional symbolp]
- (&or [("eval" form) &optional form form]
- [symbolp &optional form form])
- body)))
- (let ((tp (cl-gensym "type"))
- (s* (and (symbolp (car args))
- (pop args)))
- (s (cl-gensym "section")))
- `(let* ((,tp ,(let ((type (nth 0 (car args))))
- (if (eq (car-safe type) 'eval)
- (cadr type)
- `',type)))
- (,s (funcall (if (class-p ,tp)
- ,tp
- (or (cdr (assq ,tp magit--section-type-alist))
- 'magit-section))
- :type
- (if (class-p ,tp)
- (or (car (rassq ,tp magit--section-type-alist))
- (error "BUG: No entry for %s in %s" ,tp
- 'magit--section-type-alist))
- ,tp)
- :value ,(nth 1 (car args))
- :start (point-marker)
- :parent magit-insert-section--parent)))
- (oset ,s hidden
- (if-let ((value (run-hook-with-args-until-success
- 'magit-section-set-visibility-hook ,s)))
- (eq value 'hide)
- (if-let ((incarnation (and magit-insert-section--oldroot
- (magit-get-section
- (magit-section-ident ,s)
- magit-insert-section--oldroot))))
- (oref incarnation hidden)
- (if-let ((value (magit-section-match-assoc
- ,s magit-section-initial-visibility-alist)))
- (progn
- (when (functionp value)
- (setq value (funcall value ,s)))
- (eq value 'hide))
- ,(nth 2 (car args))))))
- (let ((magit-insert-section--current ,s)
- (magit-insert-section--parent ,s)
- (magit-insert-section--oldroot
- (or magit-insert-section--oldroot
- (unless magit-insert-section--parent
- (prog1 magit-root-section
- (setq magit-root-section ,s))))))
- (catch 'cancel-section
- ,@(if s*
- `((let ((,s* ,s))
- ,@(cdr args)))
- (cdr args))
- ;; `magit-insert-section-hook' should *not* be run with
- ;; `magit-run-section-hook' because it's a hook that runs
- ;; on section insertion, not a section inserting hook.
- (run-hooks 'magit-insert-section-hook)
- (magit-insert-child-count ,s)
- (set-marker-insertion-type (oref ,s start) t)
- (let* ((end (oset ,s end (point-marker)))
- (class-map (oref-default ,s keymap))
- (magit-map (intern (format "magit-%s-section-map"
- (oref ,s type))))
- (forge-map (intern (format "forge-%s-section-map"
- (oref ,s type))))
- (map (or (and class-map (symbol-value class-map))
- (and (boundp magit-map) (symbol-value magit-map))
- (and (boundp forge-map) (symbol-value forge-map)))))
- (save-excursion
- (goto-char (oref ,s start))
- (while (< (point) end)
- (let ((next (or (next-single-property-change
- (point) 'magit-section)
- end)))
- (unless (get-text-property (point) 'magit-section)
- (put-text-property (point) next 'magit-section ,s)
- (when map
- (put-text-property (point) next 'keymap map)))
- (goto-char next)))))
- (if (eq ,s magit-root-section)
- (let ((magit-section-cache-visibility nil))
- (magit-section-show ,s))
- (oset (oref ,s parent) children
- (nconc (oref (oref ,s parent) children)
- (list ,s)))))
- ,s))))
-
-(defun magit-cancel-section ()
- "Cancel inserting the section that is currently being inserted.
-Remove all traces of that section."
- (when magit-insert-section--current
- (if (not (oref magit-insert-section--current parent))
- (insert "(empty)\n")
- (delete-region (oref magit-insert-section--current start)
- (point))
- (setq magit-insert-section--current nil)
- (throw 'cancel-section nil))))
-
-(defun magit-insert-heading (&rest args)
- "Insert the heading for the section currently being inserted.
-
-This function should only be used inside `magit-insert-section'.
-
-When called without any arguments, then just set the `content'
-slot of the object representing the section being inserted to
-a marker at `point'. The section should only contain a single
-line when this function is used like this.
-
-When called with arguments ARGS, which have to be strings, or
-nil, then insert those strings at point. The section should not
-contain any text before this happens and afterwards it should
-again only contain a single line. If the `face' property is set
-anywhere inside any of these strings, then insert all of them
-unchanged. Otherwise use the `magit-section-heading' face for
-all inserted text.
-
-The `content' property of the section object is the end of the
-heading (which lasts from `start' to `content') and the beginning
-of the the body (which lasts from `content' to `end'). If the
-value of `content' is nil, then the section has no heading and
-its body cannot be collapsed. If a section does have a heading,
-then its height must be exactly one line, including a trailing
-newline character. This isn't enforced, you are responsible for
-getting it right. The only exception is that this function does
-insert a newline character if necessary."
- (declare (indent defun))
- (when args
- (let ((heading (apply #'concat args)))
- (insert (if (or (text-property-not-all 0 (length heading)
- 'font-lock-face nil heading)
- (text-property-not-all 0 (length heading)
- 'face nil heading))
- heading
- (propertize heading 'font-lock-face 'magit-section-heading)))))
- (unless (bolp)
- (insert ?\n))
- (when (fboundp 'magit-maybe-make-margin-overlay)
- (magit-maybe-make-margin-overlay))
- (oset magit-insert-section--current content (point-marker)))
-
-(defmacro magit-insert-section-body (&rest body)
- "Use BODY to insert the section body, once the section is expanded.
-If the section is expanded when it is created, then this is
-like `progn'. Otherwise BODY isn't evaluated until the section
-is explicitly expanded."
- (declare (indent 0))
- (let ((f (cl-gensym))
- (s (cl-gensym)))
- `(let ((,f (lambda () ,@body))
- (,s magit-insert-section--current))
- (if (oref ,s hidden)
- (oset ,s washer
- (lambda ()
- (funcall ,f)
- (magit-section-maybe-remove-visibility-indicator ,s)))
- (funcall ,f)))))
-
-(defun magit-insert-headers (hook)
- (let* ((header-sections nil)
- (magit-insert-section-hook
- (cons (lambda ()
- (push magit-insert-section--current
- header-sections))
- (if (listp magit-insert-section-hook)
- magit-insert-section-hook
- (list magit-insert-section-hook)))))
- (magit-run-section-hook hook)
- (when header-sections
- (insert "\n")
- ;; Make the first header into the parent of the rest.
- (when (cdr header-sections)
- (cl-callf nreverse header-sections)
- (let* ((1st-header (pop header-sections))
- (header-parent (oref 1st-header parent)))
- (oset header-parent children (list 1st-header))
- (oset 1st-header children header-sections)
- (oset 1st-header content (oref (car header-sections) start))
- (oset 1st-header end (oref (car (last header-sections)) end))
- (dolist (sub-header header-sections)
- (oset sub-header parent 1st-header)))))))
-
-(defun magit-insert-child-count (section)
- "Modify SECTION's heading to contain number of child sections.
-
-If `magit-section-show-child-count' is non-nil and the SECTION
-has children and its heading ends with \":\", then replace that
-with \" (N)\", where N is the number of child sections.
-
-This function is called by `magit-insert-section' after that has
-evaluated its BODY. Admittedly that's a bit of a hack."
- ;; This has to be fast, not pretty!
- (let (content count)
- (when (and magit-section-show-child-count
- (setq count (length (oref section children)))
- (> count 0)
- (setq content (oref section content))
- (eq (char-before (1- content)) ?:))
- (save-excursion
- (goto-char (- content 2))
- (insert (format " (%s)" count))
- (delete-char 1)))))
-
-;;; Highlight
-
-(defvar-local magit-section-highlight-overlays nil)
-(defvar-local magit-section-highlighted-section nil)
-(defvar-local magit-section-highlighted-sections nil)
-(defvar-local magit-section-unhighlight-sections nil)
-(defun magit-section-update-highlight ()
- (let ((section (magit-current-section)))
- (unless (eq section magit-section-highlighted-section)
- (let ((inhibit-read-only t)
- (deactivate-mark nil)
- (selection (magit-region-sections)))
- (mapc #'delete-overlay magit-section-highlight-overlays)
- (setq magit-section-highlight-overlays nil)
- (setq magit-section-unhighlight-sections
- magit-section-highlighted-sections)
- (setq magit-section-highlighted-sections nil)
- (unless (eq section magit-root-section)
- (run-hook-with-args-until-success
- 'magit-section-highlight-hook section selection))
- (dolist (s magit-section-unhighlight-sections)
- (run-hook-with-args-until-success
- 'magit-section-unhighlight-hook s selection))
- (restore-buffer-modified-p nil)
- (unless (eq magit-section-highlighted-section section)
- (setq magit-section-highlighted-section
- (and (not (oref section hidden))
- section)))))
- (magit-section-maybe-paint-visibility-ellipses)))
-
-(defun magit-section-highlight (section selection)
- "Highlight SECTION and if non-nil all sections in SELECTION.
-This function works for any section but produces undesirable
-effects for diff related sections, which by default are
-highlighted using `magit-diff-highlight'. Return t."
- (when-let ((face (oref section heading-highlight-face)))
- (dolist (section (or selection (list section)))
- (magit-section-make-overlay
- (oref section start)
- (or (oref section content)
- (oref section end))
- face)))
- (cond (selection
- (magit-section-make-overlay (oref (car selection) start)
- (oref (car (last selection)) end)
- 'magit-section-highlight)
- (magit-section-highlight-selection nil selection))
- (t
- (magit-section-make-overlay (oref section start)
- (oref section end)
- 'magit-section-highlight)))
- t)
-
-(defun magit-section-highlight-selection (_ selection)
- "Highlight the section-selection region.
-If SELECTION is non-nil, then it is a list of sections selected by
-the region. The headings of these sections are then highlighted.
-
-This is a fallback for people who don't want to highlight the
-current section and therefore removed `magit-section-highlight'
-from `magit-section-highlight-hook'.
-
-This function is necessary to ensure that a representation of
-such a region is visible. If neither of these functions were
-part of the hook variable, then such a region would be
-invisible."
- (when (and selection
- (not (and (eq this-command 'mouse-drag-region))))
- (dolist (section selection)
- (magit-section-make-overlay (oref section start)
- (or (oref section content)
- (oref section end))
- 'magit-section-heading-selection))
- t))
-
-(defun magit-section-make-overlay (start end face)
- ;; Yes, this doesn't belong here. But the alternative of
- ;; spreading this hack across the code base is even worse.
- (when (and magit-keep-region-overlay
- (memq face '(magit-section-heading-selection
- magit-diff-file-heading-selection
- magit-diff-hunk-heading-selection)))
- (setq face (list :foreground (face-foreground face))))
- (let ((ov (make-overlay start end nil t)))
- (overlay-put ov 'font-lock-face face)
- (overlay-put ov 'evaporate t)
- (push ov magit-section-highlight-overlays)
- ov))
-
-(defun magit-section-goto-successor (section line char arg)
- (let ((ident (magit-section-ident section)))
- (--if-let (magit-get-section ident)
- (let ((start (oref it start)))
- (goto-char start)
- (unless (eq it magit-root-section)
- (ignore-errors
- (forward-line line)
- (forward-char char))
- (unless (eq (magit-current-section) it)
- (goto-char start))))
- (or (run-hook-with-args-until-success
- 'magit-section-goto-successor-hook section arg)
- (goto-char (--if-let (magit-section-goto-successor-1 section)
- (if (eq (oref it type) 'button)
- (point-min)
- (oref it start))
- (point-min)))))))
-
-(defun magit-section-goto-successor-1 (section)
- (or (--when-let (pcase (oref section type)
- (`staged 'unstaged)
- (`unstaged 'staged)
- (`unpushed 'unpulled)
- (`unpulled 'unpushed))
- (magit-get-section `((,it) (status))))
- (--when-let (car (magit-section-siblings section 'next))
- (magit-get-section (magit-section-ident it)))
- (--when-let (car (magit-section-siblings section 'prev))
- (magit-get-section (magit-section-ident it)))
- (--when-let (oref section parent)
- (or (magit-get-section (magit-section-ident it))
- (magit-section-goto-successor-1 it)))))
-
-;;; Region
-
-(defvar-local magit-section--region-overlays nil)
-
-(defun magit-section--delete-region-overlays ()
- (mapc #'delete-overlay magit-section--region-overlays)
- (setq magit-section--region-overlays nil))
-
-(defun magit-section--highlight-region (start end window rol)
- (magit-section--delete-region-overlays)
- (if (and (not magit-keep-region-overlay)
- (or (magit-region-sections)
- (run-hook-with-args-until-success 'magit-region-highlight-hook
- (magit-current-section)))
- (not (= (line-number-at-pos start)
- (line-number-at-pos end)))
- ;; (not (eq (car-safe last-command-event) 'mouse-movement))
- )
- (funcall (default-value 'redisplay-unhighlight-region-function) rol)
- (funcall (default-value 'redisplay-highlight-region-function)
- start end window rol)))
-
-(defun magit-section--unhighlight-region (rol)
- (setq magit-section-highlighted-section nil)
- (magit-section--delete-region-overlays)
- (funcall (default-value 'redisplay-unhighlight-region-function) rol))
-
-;;; Visibility
-
-(defvar-local magit-section-visibility-cache nil)
-(put 'magit-section-visibility-cache 'permanent-local t)
-
-(defun magit-section-cached-visibility (section)
- "Set SECTION's visibility to the cached value."
- (cdr (assoc (magit-section-ident section)
- magit-section-visibility-cache)))
-
-(cl-defun magit-section-cache-visibility
- (&optional (section magit-insert-section--current))
- ;; Emacs 25's `alist-get' lacks TESTFN.
- (let* ((id (magit-section-ident section))
- (elt (assoc id magit-section-visibility-cache))
- (val (if (oref section hidden) 'hide 'show)))
- (if elt
- (setcdr elt val)
- (push (cons id val) magit-section-visibility-cache))))
-
-(cl-defun magit-section-maybe-cache-visibility
- (&optional (section magit-insert-section--current))
- (when (or (eq magit-section-cache-visibility t)
- (memq (oref section type)
- magit-section-cache-visibility))
- (magit-section-cache-visibility section)))
-
-(defun magit-section-maybe-update-visibility-indicator (section)
- (when magit-section-visibility-indicator
- (let ((beg (oref section start))
- (cnt (oref section content))
- (end (oref section end)))
- (when (and cnt (or (not (= cnt end)) (oref section washer)))
- (let ((eoh (save-excursion
- (goto-char beg)
- (line-end-position))))
- (cond
- ((symbolp (car-safe magit-section-visibility-indicator))
- ;; It would make more sense to put the overlay only on the
- ;; location we actually don't put it on, but then inserting
- ;; before that location (while taking care not to mess with
- ;; the overlay) would cause the fringe bitmap to disappear
- ;; (but not other effects of the overlay).
- (let ((ov (magit--overlay-at (1+ beg) 'magit-vis-indicator 'fringe)))
- (unless ov
- (setq ov (make-overlay (1+ beg) eoh))
- (overlay-put ov 'evaporate t)
- (overlay-put ov 'magit-vis-indicator 'fringe))
- (overlay-put
- ov 'before-string
- (propertize "fringe" 'display
- (list 'left-fringe
- (if (oref section hidden)
- (car magit-section-visibility-indicator)
- (cdr magit-section-visibility-indicator))
- (face-foreground 'fringe))))))
- ((stringp (car-safe magit-section-visibility-indicator))
- (let ((ov (magit--overlay-at (1- eoh) 'magit-vis-indicator 'eoh)))
- (cond ((oref section hidden)
- (unless ov
- (setq ov (make-overlay (1- eoh) eoh))
- (overlay-put ov 'evaporate t)
- (overlay-put ov 'magit-vis-indicator 'eoh))
- (overlay-put ov 'after-string
- (car magit-section-visibility-indicator)))
- (ov
- (delete-overlay ov)))))))))))
-
-(defvar-local magit--ellipses-sections nil)
-
-(defun magit-section-maybe-paint-visibility-ellipses ()
- ;; This is needed because we hide the body instead of "the body
- ;; except the final newline and additionally the newline before
- ;; the body"; otherwise we could use `buffer-invisibility-spec'.
- (when (stringp (car-safe magit-section-visibility-indicator))
- (let* ((sections (append magit--ellipses-sections
- (setq magit--ellipses-sections
- (or (magit-region-sections)
- (list (magit-current-section))))))
- (beg (--map (oref it start) sections))
- (end (--map (oref it end) sections)))
- (when (region-active-p)
- ;; This ensures that the region face is removed from ellipses
- ;; when the region becomes inactive, but fails to ensure that
- ;; all ellipses within the active region use the region face,
- ;; because the respective overlay has not yet been updated at
- ;; this time. The magit-selection face is always applied.
- (push (region-beginning) beg)
- (push (region-end) end))
- (setq beg (apply #'min beg))
- (setq end (apply #'max end))
- (dolist (ov (overlays-in beg end))
- (when (eq (overlay-get ov 'magit-vis-indicator) 'eoh)
- (overlay-put
- ov 'after-string
- (propertize
- (car magit-section-visibility-indicator) 'font-lock-face
- (let ((pos (overlay-start ov)))
- (delq nil (nconc (--map (overlay-get it 'font-lock-face)
- (overlays-at pos))
- (list (get-char-property
- pos 'font-lock-face))))))))))))
-
-(defun magit-section-maybe-remove-visibility-indicator (section)
- (when (and magit-section-visibility-indicator
- (= (oref section content)
- (oref section end)))
- (dolist (o (overlays-in (oref section start)
- (save-excursion
- (goto-char (oref section start))
- (1+ (line-end-position)))))
- (when (overlay-get o 'magit-vis-indicator)
- (delete-overlay o)))))
-
-;;; Utilities
-
-(cl-defun magit-section-selected-p (section &optional (selection nil sselection))
- (and (not (eq section magit-root-section))
- (or (eq section (magit-current-section))
- (memq section (if sselection
- selection
- (setq selection (magit-region-sections))))
- (--when-let (oref section parent)
- (magit-section-selected-p it selection)))))
-
-(defun magit-section-parent-value (section)
- (when-let ((parent (oref section parent)))
- (oref parent value)))
-
-(defun magit-section-siblings (section &optional direction)
- "Return a list of the sibling sections of SECTION.
-
-If optional DIRECTION is `prev', then return siblings that come
-before SECTION. If it is `next', then return siblings that come
-after SECTION. For all other values, return all siblings
-excluding SECTION itself."
- (when-let ((parent (oref section parent)))
- (let ((siblings (oref parent children)))
- (pcase direction
- (`prev (cdr (member section (reverse siblings))))
- (`next (cdr (member section siblings)))
- (_ (remq section siblings))))))
-
-(defun magit-region-values (&optional condition multiple)
- "Return a list of the values of the selected sections.
-
-Return the values that themselves would be returned by
-`magit-region-sections' (which see)."
- (--map (oref it value)
- (magit-region-sections condition multiple)))
-
-(defun magit-region-sections (&optional condition multiple)
- "Return a list of the selected sections.
-
-When the region is active and constitutes a valid section
-selection, then return a list of all selected sections. This is
-the case when the region begins in the heading of a section and
-ends in the heading of the same section or in that of a sibling
-section. If optional MULTIPLE is non-nil, then the region cannot
-begin and end in the same section.
-
-When the selection is not valid, then return nil. In this case,
-most commands that can act on the selected sections will instead
-act on the section at point.
-
-When the region looks like it would in any other buffer then
-the selection is invalid. When the selection is valid then the
-region uses the `magit-section-highlight' face. This does not
-apply to diffs where things get a bit more complicated, but even
-here if the region looks like it usually does, then that's not
-a valid selection as far as this function is concerned.
-
-If optional CONDITION is non-nil, then the selection not only
-has to be valid; all selected sections additionally have to match
-CONDITION, or nil is returned. See `magit-section-match' for the
-forms CONDITION can take."
- (when (region-active-p)
- (let* ((rbeg (region-beginning))
- (rend (region-end))
- (sbeg (get-text-property rbeg 'magit-section))
- (send (get-text-property rend 'magit-section)))
- (when (and send
- (not (eq send magit-root-section))
- (not (and multiple (eq send sbeg))))
- (let ((siblings (cons sbeg (magit-section-siblings sbeg 'next)))
- sections)
- (when (and (memq send siblings)
- (magit-section-position-in-heading-p sbeg rbeg)
- (magit-section-position-in-heading-p send rend))
- (while siblings
- (push (car siblings) sections)
- (when (eq (pop siblings) send)
- (setq siblings nil)))
- (setq sections (nreverse sections))
- (when (or (not condition)
- (--all-p (magit-section-match condition it) sections))
- sections)))))))
-
-(defun magit-section-position-in-heading-p (&optional section pos)
- "Return t if POSITION is inside the heading of SECTION.
-POSITION defaults to point and SECTION defaults to the
-current section."
- (unless section
- (setq section (magit-current-section)))
- (unless pos
- (setq pos (point)))
- (and section
- (>= pos (oref section start))
- (< pos (or (oref section content)
- (oref section end)))
- t))
-
-(defun magit-section-internal-region-p (&optional section)
- "Return t if the region is active and inside SECTION's body.
-If optional SECTION is nil, use the current section."
- (and (region-active-p)
- (or section (setq section (magit-current-section)))
- (let ((beg (get-text-property (region-beginning) 'magit-section)))
- (and (eq beg (get-text-property (region-end) 'magit-section))
- (eq beg section)))
- (not (or (magit-section-position-in-heading-p section (region-beginning))
- (magit-section-position-in-heading-p section (region-end))))
- t))
-
-(defun magit-section--backward-protected ()
- "Move to the beginning of the current or the previous visible section.
-Same as `magit-section-backward' but for non-interactive use.
-Suppress `magit-section-movement-hook', and return a boolean to
-indicate whether a section was found, instead of raising an error
-if not."
- (condition-case nil
- (let ((magit-section-movement-hook nil))
- (magit-section-backward)
- t)
- (user-error nil)))
-
-(defun magit-section--backward-find (predicate)
- "Move to the first previous section satisfying PREDICATE.
-PREDICATE does not take any parameter and should not move
-point."
- (let (found)
- (while (and (setq found (magit-section--backward-protected))
- (not (funcall predicate))))
- found))
-
-(defun magit-wash-sequence (function)
- "Repeatedly call FUNCTION until it returns nil or eob is reached.
-FUNCTION has to move point forward or return nil."
- (while (and (not (eobp)) (funcall function))))
-
-(defun magit-add-section-hook (hook function &optional at append local)
- "Add to the value of section hook HOOK the function FUNCTION.
-
-Add FUNCTION at the beginning of the hook list unless optional
-APPEND is non-nil, in which case FUNCTION is added at the end.
-If FUNCTION already is a member, then move it to the new location.
-
-If optional AT is non-nil and a member of the hook list, then
-add FUNCTION next to that instead. Add before or after AT, or
-replace AT with FUNCTION depending on APPEND. If APPEND is the
-symbol `replace', then replace AT with FUNCTION. For any other
-non-nil value place FUNCTION right after AT. If nil, then place
-FUNCTION right before AT. If FUNCTION already is a member of the
-list but AT is not, then leave FUNCTION where ever it already is.
-
-If optional LOCAL is non-nil, then modify the hook's buffer-local
-value rather than its global value. This makes the hook local by
-copying the default value. That copy is then modified.
-
-HOOK should be a symbol. If HOOK is void, it is first set to nil.
-HOOK's value must not be a single hook function. FUNCTION should
-be a function that takes no arguments and inserts one or multiple
-sections at point, moving point forward. FUNCTION may choose not
-to insert its section(s), when doing so would not make sense. It
-should not be abused for other side-effects. To remove FUNCTION
-again use `remove-hook'."
- (unless (boundp hook)
- (error "Cannot add function to undefined hook variable %s" hook))
- (unless (default-boundp hook)
- (set-default hook nil))
- (let ((value (if local
- (if (local-variable-p hook)
- (symbol-value hook)
- (unless (local-variable-if-set-p hook)
- (make-local-variable hook))
- (copy-sequence (default-value hook)))
- (default-value hook))))
- (if at
- (when (setq at (member at value))
- (setq value (delq function value))
- (cond ((eq append 'replace)
- (setcar at function))
- (append
- (push function (cdr at)))
- (t
- (push (car at) (cdr at))
- (setcar at function))))
- (setq value (delq function value)))
- (unless (member function value)
- (setq value (if append
- (append value (list function))
- (cons function value))))
- (when (eq append 'replace)
- (setq value (delq at value)))
- (if local
- (set hook value)
- (set-default hook value))))
-
-(defvar-local magit-disabled-section-inserters nil)
-
-(defun magit-disable-section-inserter (fn)
- "Disable the section inserter FN in the current repository.
-It is only intended for use in \".dir-locals.el\" and
-\".dir-locals-2.el\". Also see info node `(magit)Per-Repository
-Configuration'."
- (cl-pushnew fn magit-disabled-section-inserters))
-
-(put 'magit-disable-section-inserter 'safe-local-eval-function t)
-
-(defun magit-run-section-hook (hook &rest args)
- "Run HOOK with ARGS, warning about invalid entries."
- (let ((entries (symbol-value hook)))
- (unless (listp entries)
- (setq entries (list entries)))
- (--when-let (-remove #'functionp entries)
- (message "`%s' contains entries that are no longer valid.
-%s\nUsing standard value instead. Please re-configure hook variable."
- hook
- (mapconcat (lambda (sym) (format " `%s'" sym)) it "\n"))
- (sit-for 5)
- (setq entries (eval (car (get hook 'standard-value)))))
- (dolist (entry entries)
- (let ((magit--current-section-hook (cons (list hook entry)
- magit--current-section-hook)))
- (unless (memq entry magit-disabled-section-inserters)
- (if (bound-and-true-p magit-refresh-verbose)
- (message " %-50s %s" entry
- (benchmark-elapse (apply entry args)))
- (apply entry args)))))))
-
-(cl-defun magit--overlay-at (pos prop &optional (val nil sval) testfn)
- (cl-find-if (lambda (o)
- (let ((p (overlay-properties o)))
- (and (plist-member p prop)
- (or (not sval)
- (funcall (or testfn #'eql)
- (plist-get p prop)
- val)))))
- (overlays-at pos t)))
-
-;;; _
-(provide 'magit-section)
-;;; magit-section.el ends here
diff --git a/elpa/magit-20200728.45/magit-sequence.el b/elpa/magit-20200728.45/magit-sequence.el
deleted file mode 100644
index 456a539..0000000
--- a/elpa/magit-20200728.45/magit-sequence.el
+++ /dev/null
@@ -1,1042 +0,0 @@
-;;; magit-sequence.el --- history manipulation in Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2011-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Support for Git commands that replay commits and help the user make
-;; changes along the way. Supports `cherry-pick', `revert', `rebase',
-;; `rebase--interactive' and `am'.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;; For `magit-rebase--todo'.
-(declare-function git-rebase-current-line "git-rebase" ())
-(eval-when-compile
- (cl-pushnew 'action-type eieio--known-slot-names)
- (cl-pushnew 'action eieio--known-slot-names)
- (cl-pushnew 'action-options eieio--known-slot-names)
- (cl-pushnew 'target eieio--known-slot-names))
-
-;;; Options
-;;;; Faces
-
-(defface magit-sequence-pick
- '((t :inherit default))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-stop
- '((((class color) (background light)) :foreground "DarkOliveGreen4")
- (((class color) (background dark)) :foreground "DarkSeaGreen2"))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-part
- '((((class color) (background light)) :foreground "Goldenrod4")
- (((class color) (background dark)) :foreground "LightGoldenrod2"))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-head
- '((((class color) (background light)) :foreground "SkyBlue4")
- (((class color) (background dark)) :foreground "LightSkyBlue1"))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-drop
- '((((class color) (background light)) :foreground "IndianRed")
- (((class color) (background dark)) :foreground "IndianRed"))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-done
- '((t :inherit magit-hash))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-onto
- '((t :inherit magit-sequence-done))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-(defface magit-sequence-exec
- '((t :inherit magit-hash))
- "Face used in sequence sections."
- :group 'magit-faces)
-
-;;; Common
-
-;;;###autoload
-(defun magit-sequencer-continue ()
- "Resume the current cherry-pick or revert sequence."
- (interactive)
- (if (magit-sequencer-in-progress-p)
- (if (magit-anything-unstaged-p t)
- (user-error "Cannot continue due to unstaged changes")
- (magit-run-git-sequencer
- (if (magit-revert-in-progress-p) "revert" "cherry-pick") "--continue"))
- (user-error "No cherry-pick or revert in progress")))
-
-;;;###autoload
-(defun magit-sequencer-skip ()
- "Skip the stopped at commit during a cherry-pick or revert sequence."
- (interactive)
- (if (magit-sequencer-in-progress-p)
- (progn (magit-call-git "reset" "--hard")
- (magit-sequencer-continue))
- (user-error "No cherry-pick or revert in progress")))
-
-;;;###autoload
-(defun magit-sequencer-abort ()
- "Abort the current cherry-pick or revert sequence.
-This discards all changes made since the sequence started."
- (interactive)
- (if (magit-sequencer-in-progress-p)
- (magit-run-git-sequencer
- (if (magit-revert-in-progress-p) "revert" "cherry-pick") "--abort")
- (user-error "No cherry-pick or revert in progress")))
-
-(defun magit-sequencer-in-progress-p ()
- (or (magit-cherry-pick-in-progress-p)
- (magit-revert-in-progress-p)))
-
-;;; Cherry-Pick
-
-(defvar magit-perl-executable "perl"
- "The Perl executable.")
-
-;;;###autoload (autoload 'magit-cherry-pick "magit-sequence" nil t)
-(transient-define-prefix magit-cherry-pick ()
- "Apply or transplant commits."
- :man-page "git-cherry-pick"
- :value '("--ff")
- :incompatible '(("--ff" "-x"))
- ["Arguments"
- :if-not magit-sequencer-in-progress-p
- (magit-cherry-pick:--mainline)
- ("=s" magit-merge:--strategy)
- ("-F" "Attempt fast-forward" "--ff")
- ("-x" "Reference cherry in commit message" "-x")
- ("-e" "Edit commit messages" ("-e" "--edit"))
- ("-s" "Add Signed-off-by lines" ("-s" "--signoff"))
- (5 magit:--gpg-sign)]
- [:if-not magit-sequencer-in-progress-p
- ["Apply here"
- ("A" "Pick" magit-cherry-copy)
- ("a" "Apply" magit-cherry-apply)
- ("h" "Harvest" magit-cherry-harvest)]
- ["Apply elsewhere"
- ("d" "Donate" magit-cherry-donate)
- ("n" "Spinout" magit-cherry-spinout)
- ("s" "Spinoff" magit-cherry-spinoff)]]
- ["Actions"
- :if magit-sequencer-in-progress-p
- ("A" "Continue" magit-sequencer-continue)
- ("s" "Skip" magit-sequencer-skip)
- ("a" "Abort" magit-sequencer-abort)])
-
-(transient-define-argument magit-cherry-pick:--mainline ()
- :description "Replay merge relative to parent"
- :class 'transient-option
- :shortarg "-m"
- :argument "--mainline="
- :reader 'transient-read-number-N+)
-
-(defun magit-cherry-pick-read-args (prompt)
- (list (or (nreverse (magit-region-values 'commit))
- (magit-read-other-branch-or-commit prompt))
- (transient-args 'magit-cherry-pick)))
-
-(defun magit--cherry-move-read-args (verb away fn)
- (declare (indent defun))
- (let ((commits (or (nreverse (magit-region-values 'commit))
- (list (funcall (if away
- 'magit-read-branch-or-commit
- 'magit-read-other-branch-or-commit)
- (format "%s cherry" (capitalize verb))))))
- (current (magit-get-current-branch)))
- (unless current
- (user-error "Cannot %s cherries while HEAD is detached" verb))
- (let ((reachable (magit-rev-ancestor-p (car commits) current))
- (msg "Cannot %s cherries that %s reachable from HEAD"))
- (pcase (list away reachable)
- (`(nil t) (user-error msg verb "are"))
- (`(t nil) (user-error msg verb "are not"))))
- `(,commits
- ,@(funcall fn commits)
- ,(transient-args 'magit-cherry-pick))))
-
-(defun magit--cherry-spinoff-read-args (verb)
- (magit--cherry-move-read-args verb t
- (lambda (commits)
- (magit-branch-read-args
- (format "Create branch from %s cherries" (length commits))
- (magit-get-upstream-branch)))))
-
-;;;###autoload
-(defun magit-cherry-copy (commits &optional args)
- "Copy COMMITS from another branch onto the current branch.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then pick all of them,
-without prompting."
- (interactive (magit-cherry-pick-read-args "Cherry-pick"))
- (magit--cherry-pick commits args))
-
-;;;###autoload
-(defun magit-cherry-apply (commits &optional args)
- "Apply the changes in COMMITS but do not commit them.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then apply all of them,
-without prompting."
- (interactive (magit-cherry-pick-read-args "Apply changes from commit"))
- (magit--cherry-pick commits (cons "--no-commit" (remove "--ff" args))))
-
-;;;###autoload
-(defun magit-cherry-harvest (commits branch &optional args)
- "Move COMMITS from another BRANCH onto the current branch.
-Remove the COMMITS from BRANCH and stay on the current branch.
-If a conflict occurs, then you have to fix that and finish the
-process manually."
- (interactive
- (magit--cherry-move-read-args "harvest" nil
- (lambda (commits)
- (list (let ((branches (magit-list-containing-branches (car commits))))
- (pcase (length branches)
- (0 nil)
- (1 (car branches))
- (_ (magit-completing-read
- (format "Remove %s cherries from branch" (length commits))
- branches nil t))))))))
- (magit--cherry-move commits branch (magit-get-current-branch) args nil t))
-
-;;;###autoload
-(defun magit-cherry-donate (commits branch &optional args)
- "Move COMMITS from the current branch onto another existing BRANCH.
-Remove COMMITS from the current branch and stay on that branch.
-If a conflict occurs, then you have to fix that and finish the
-process manually."
- (interactive
- (magit--cherry-move-read-args "donate" t
- (lambda (commits)
- (list (magit-read-other-branch (format "Move %s cherries to branch"
- (length commits)))))))
- (magit--cherry-move commits (magit-get-current-branch) branch args))
-
-;;;###autoload
-(defun magit-cherry-spinout (commits branch start-point &optional args)
- "Move COMMITS from the current branch onto a new BRANCH.
-Remove COMMITS from the current branch and stay on that branch.
-If a conflict occurs, then you have to fix that and finish the
-process manually."
- (interactive (magit--cherry-spinoff-read-args "spinout"))
- (magit--cherry-move commits (magit-get-current-branch) branch args
- start-point))
-
-;;;###autoload
-(defun magit-cherry-spinoff (commits branch start-point &optional args)
- "Move COMMITS from the current branch onto a new BRANCH.
-Remove COMMITS from the current branch and checkout BRANCH.
-If a conflict occurs, then you have to fix that and finish
-the process manually."
- (interactive (magit--cherry-spinoff-read-args "spinoff"))
- (magit--cherry-move commits (magit-get-current-branch) branch args
- start-point t))
-
-(defun magit--cherry-move (commits src dst args
- &optional start-point checkout-dst)
- (let ((current (magit-get-current-branch)))
- (unless (magit-branch-p dst)
- (let ((magit-process-raise-error t))
- (magit-call-git "branch" dst start-point))
- (--when-let (magit-get-indirect-upstream-branch start-point)
- (magit-call-git "branch" "--set-upstream-to" it dst)))
- (unless (equal dst current)
- (let ((magit-process-raise-error t))
- (magit-call-git "checkout" dst)))
- (if (not src) ; harvest only
- (magit--cherry-pick commits args)
- (let ((tip (car (last commits)))
- (keep (concat (car commits) "^")))
- (magit--cherry-pick commits args)
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (> (process-exit-status process) 0)
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (cond
- ((magit-rev-equal tip src)
- (magit-call-git "update-ref"
- "-m" (format "reset: moving to %s" keep)
- (magit-ref-fullname src)
- keep tip)
- (if (not checkout-dst)
- (magit-run-git "checkout" src)
- (magit-refresh)))
- (t
- (magit-git "checkout" src)
- (let ((process-environment process-environment))
- (push (format "%s=%s -i -ne '/^pick (%s)/ or print'"
- "GIT_SEQUENCE_EDITOR"
- magit-perl-executable
- (mapconcat #'magit-rev-abbrev commits "|"))
- process-environment)
- (magit-run-git-sequencer "rebase" "-i" keep))
- (when checkout-dst
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (> (process-exit-status process) 0)
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (magit-run-git "checkout" dst))))))))))))))))
-
-(defun magit--cherry-pick (commits args &optional revert)
- (let ((command (if revert "revert" "cherry-pick")))
- (when (stringp commits)
- (setq commits (if (string-match-p "\\.\\." commits)
- (split-string commits "\\.\\.")
- (list commits))))
- (magit-run-git-sequencer
- (if revert "revert" "cherry-pick")
- (pcase-let ((`(,merge ,non-merge)
- (-separate 'magit-merge-commit-p commits)))
- (cond
- ((not merge)
- (--remove (string-prefix-p "--mainline=" it) args))
- (non-merge
- (user-error "Cannot %s merge and non-merge commits at once"
- command))
- ((--first (string-prefix-p "--mainline=" it) args)
- args)
- (t
- (cons (format "--mainline=%s"
- (read-number "Replay merges relative to parent: "))
- args))))
- commits)))
-
-(defun magit-cherry-pick-in-progress-p ()
- ;; .git/sequencer/todo does not exist when there is only one commit left.
- (file-exists-p (magit-git-dir "CHERRY_PICK_HEAD")))
-
-;;; Revert
-
-;;;###autoload (autoload 'magit-revert "magit-sequence" nil t)
-(transient-define-prefix magit-revert ()
- "Revert existing commits, with or without creating new commits."
- :man-page "git-revert"
- :value '("--edit")
- ["Arguments"
- :if-not magit-sequencer-in-progress-p
- (magit-cherry-pick:--mainline)
- ("-e" "Edit commit message" ("-e" "--edit"))
- ("-E" "Don't edit commit message" "--no-edit")
- ("=s" magit-merge:--strategy)
- ("-s" "Add Signed-off-by lines" ("-s" "--signoff"))
- (5 magit:--gpg-sign)]
- ["Actions"
- :if-not magit-sequencer-in-progress-p
- ("V" "Revert commit(s)" magit-revert-and-commit)
- ("v" "Revert changes" magit-revert-no-commit)]
- ["Actions"
- :if magit-sequencer-in-progress-p
- ("V" "Continue" magit-sequencer-continue)
- ("s" "Skip" magit-sequencer-skip)
- ("a" "Abort" magit-sequencer-abort)])
-
-(defun magit-revert-read-args (prompt)
- (list (or (magit-region-values 'commit)
- (magit-read-branch-or-commit prompt))
- (transient-args 'magit-revert)))
-
-;;;###autoload
-(defun magit-revert-and-commit (commit &optional args)
- "Revert COMMIT by creating a new commit.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then revert all of them,
-without prompting."
- (interactive (magit-revert-read-args "Revert commit"))
- (magit--cherry-pick commit args t))
-
-;;;###autoload
-(defun magit-revert-no-commit (commit &optional args)
- "Revert COMMIT by applying it in reverse to the worktree.
-Prompt for a commit, defaulting to the commit at point. If
-the region selects multiple commits, then revert all of them,
-without prompting."
- (interactive (magit-revert-read-args "Revert changes"))
- (magit--cherry-pick commit (cons "--no-commit" args) t))
-
-(defun magit-revert-in-progress-p ()
- ;; .git/sequencer/todo does not exist when there is only one commit left.
- (file-exists-p (magit-git-dir "REVERT_HEAD")))
-
-;;; Patch
-
-;;;###autoload (autoload 'magit-am "magit-sequence" nil t)
-(transient-define-prefix magit-am ()
- "Apply patches received by email."
- :man-page "git-am"
- :value '("--3way")
- ["Arguments"
- :if-not magit-am-in-progress-p
- ("-3" "Fall back on 3way merge" ("-3" "--3way"))
- (magit-apply:-p)
- ("-c" "Remove text before scissors line" ("-c" "--scissors"))
- ("-k" "Inhibit removal of email cruft" ("-k" "--keep"))
- ("-b" "Limit removal of email cruft" "--keep-non-patch")
- ("-d" "Use author date as committer date" "--committer-date-is-author-date")
- ("-D" "Use committer date as author date" "--ignore-date")
- ("-s" "Add Signed-off-by lines" ("-s" "--signoff"))
- (5 magit:--gpg-sign)]
- ["Apply"
- :if-not magit-am-in-progress-p
- ("m" "maildir" magit-am-apply-maildir)
- ("w" "patches" magit-am-apply-patches)
- ("a" "plain patch" magit-patch-apply)]
- ["Actions"
- :if magit-am-in-progress-p
- ("w" "Continue" magit-am-continue)
- ("s" "Skip" magit-am-skip)
- ("a" "Abort" magit-am-abort)])
-
-(defun magit-am-arguments ()
- (transient-args 'magit-am))
-
-(transient-define-argument magit-apply:-p ()
- :description "Remove leading slashes from paths"
- :class 'transient-option
- :argument "-p"
- :reader 'transient-read-number-N+)
-
-;;;###autoload
-(defun magit-am-apply-patches (&optional files args)
- "Apply the patches FILES."
- (interactive (list (or (magit-region-values 'file)
- (list (let ((default (magit-file-at-point)))
- (read-file-name
- (if default
- (format "Apply patch (%s): " default)
- "Apply patch: ")
- nil default))))
- (magit-am-arguments)))
- (magit-run-git-sequencer "am" args "--"
- (--map (magit-convert-filename-for-git
- (expand-file-name it))
- files)))
-
-;;;###autoload
-(defun magit-am-apply-maildir (&optional maildir args)
- "Apply the patches from MAILDIR."
- (interactive (list (read-file-name "Apply mbox or Maildir: ")
- (magit-am-arguments)))
- (magit-run-git-sequencer "am" args (magit-convert-filename-for-git
- (expand-file-name maildir))))
-
-;;;###autoload
-(defun magit-am-continue ()
- "Resume the current patch applying sequence."
- (interactive)
- (if (magit-am-in-progress-p)
- (if (magit-anything-unstaged-p t)
- (error "Cannot continue due to unstaged changes")
- (magit-run-git-sequencer "am" "--continue"))
- (user-error "Not applying any patches")))
-
-;;;###autoload
-(defun magit-am-skip ()
- "Skip the stopped at patch during a patch applying sequence."
- (interactive)
- (if (magit-am-in-progress-p)
- (magit-run-git-sequencer "am" "--skip")
- (user-error "Not applying any patches")))
-
-;;;###autoload
-(defun magit-am-abort ()
- "Abort the current patch applying sequence.
-This discards all changes made since the sequence started."
- (interactive)
- (if (magit-am-in-progress-p)
- (magit-run-git "am" "--abort")
- (user-error "Not applying any patches")))
-
-(defun magit-am-in-progress-p ()
- (file-exists-p (magit-git-dir "rebase-apply/applying")))
-
-;;; Rebase
-
-;;;###autoload (autoload 'magit-rebase "magit-sequence" nil t)
-(transient-define-prefix magit-rebase ()
- "Transplant commits and/or modify existing commits."
- :man-page "git-rebase"
- ["Arguments"
- :if-not magit-rebase-in-progress-p
- ("-k" "Keep empty commits" "--keep-empty")
- ("-p" "Preserve merges" ("-p" "--preserve-merges"))
- (7 magit-merge:--strategy)
- ("-d" "Lie about committer date" "--committer-date-is-author-date")
- ("-a" "Autosquash" "--autosquash")
- ("-A" "Autostash" "--autostash")
- ("-i" "Interactive" ("-i" "--interactive"))
- ("-h" "Disable hooks" "--no-verify")
- (7 magit-rebase:--exec)
- (5 magit:--gpg-sign)
- (5 "-r" "Rebase merges" "--rebase-merges=" magit-rebase-merges-select-mode)]
- [:if-not magit-rebase-in-progress-p
- :description (lambda ()
- (format (propertize "Rebase %s onto" 'face 'transient-heading)
- (propertize (or (magit-get-current-branch) "HEAD")
- 'face 'magit-branch-local)))
- ("p" magit-rebase-onto-pushremote)
- ("u" magit-rebase-onto-upstream)
- ("e" "elsewhere" magit-rebase-branch)]
- ["Rebase"
- :if-not magit-rebase-in-progress-p
- [("i" "interactively" magit-rebase-interactive)
- ("s" "a subset" magit-rebase-subset)]
- [("m" "to modify a commit" magit-rebase-edit-commit)
- ("w" "to reword a commit" magit-rebase-reword-commit)
- ("k" "to remove a commit" magit-rebase-remove-commit)
- ("f" "to autosquash" magit-rebase-autosquash)
- (6 "t" "to change dates" magit-reshelve-since)]]
- ["Actions"
- :if magit-rebase-in-progress-p
- ("r" "Continue" magit-rebase-continue)
- ("s" "Skip" magit-rebase-skip)
- ("e" "Edit" magit-rebase-edit)
- ("a" "Abort" magit-rebase-abort)])
-
-(transient-define-argument magit-rebase:--exec ()
- :description "Run command after commits"
- :class 'transient-option
- :shortarg "-x"
- :argument "--exec="
- :reader #'read-shell-command)
-
-(defun magit-rebase-merges-select-mode (&rest _ignore)
- (magit-read-char-case nil t
- (?n "[n]o-rebase-cousins" "no-rebase-cousins")
- (?r "[r]ebase-cousins" "rebase-cousins")))
-
-(defun magit-rebase-arguments ()
- (transient-args 'magit-rebase))
-
-(defun magit-git-rebase (target args)
- (magit-run-git-sequencer "rebase" args target))
-
-;;;###autoload (autoload 'magit-rebase-onto-pushremote "magit-sequence" nil t)
-(transient-define-suffix magit-rebase-onto-pushremote (args)
- "Rebase the current branch onto its push-remote branch.
-
-With a prefix argument or when the push-remote is either not
-configured or unusable, then let the user first configure the
-push-remote."
- :if 'magit-get-current-branch
- :description 'magit-pull--pushbranch-description
- (interactive (list (magit-rebase-arguments)))
- (pcase-let ((`(,branch ,remote)
- (magit--select-push-remote "rebase onto that")))
- (magit-git-rebase (concat remote "/" branch) args)))
-
-;;;###autoload (autoload 'magit-rebase-onto-upstream "magit-sequence" nil t)
-(transient-define-suffix magit-rebase-onto-upstream (args)
- "Rebase the current branch onto its upstream branch.
-
-With a prefix argument or when the upstream is either not
-configured or unusable, then let the user first configure
-the upstream."
- :if 'magit-get-current-branch
- :description 'magit-rebase--upstream-description
- (interactive (list (magit-rebase-arguments)))
- (let* ((branch (or (magit-get-current-branch)
- (user-error "No branch is checked out")))
- (upstream (magit-get-upstream-branch branch)))
- (when (or current-prefix-arg (not upstream))
- (setq upstream
- (magit-read-upstream-branch
- branch (format "Set upstream of %s and rebase onto that" branch)))
- (magit-set-upstream-branch branch upstream))
- (magit-git-rebase upstream args)))
-
-(defun magit-rebase--upstream-description ()
- (when-let ((branch (magit-get-current-branch)))
- (or (magit-get-upstream-branch branch)
- (let ((remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge"))
- (u (magit--propertize-face "@{upstream}" 'bold)))
- (cond
- ((magit--unnamed-upstream-p remote merge)
- (concat u ", replacing unnamed"))
- ((magit--valid-upstream-p remote merge)
- (concat u ", replacing non-existent"))
- ((or remote merge)
- (concat u ", replacing invalid"))
- (t
- (concat u ", setting that")))))))
-
-;;;###autoload
-(defun magit-rebase-branch (target args)
- "Rebase the current branch onto a branch read in the minibuffer.
-All commits that are reachable from `HEAD' but not from the
-selected branch TARGET are being rebased."
- (interactive (list (magit-read-other-branch-or-commit "Rebase onto")
- (magit-rebase-arguments)))
- (message "Rebasing...")
- (magit-git-rebase target args)
- (message "Rebasing...done"))
-
-;;;###autoload
-(defun magit-rebase-subset (newbase start args)
- "Rebase a subset of the current branch's history onto a new base.
-Rebase commits from START to `HEAD' onto NEWBASE.
-START has to be selected from a list of recent commits."
- (interactive (list (magit-read-other-branch-or-commit
- "Rebase subset onto" nil
- (magit-get-upstream-branch))
- nil
- (magit-rebase-arguments)))
- (if start
- (progn (message "Rebasing...")
- (magit-run-git-sequencer "rebase" "--onto" newbase start args)
- (message "Rebasing...done"))
- (magit-log-select
- `(lambda (commit)
- (magit-rebase-subset ,newbase (concat commit "^") (list ,@args)))
- (concat "Type %p on a commit to rebase it "
- "and commits above it onto " newbase ","))))
-
-(defvar magit-rebase-interactive-include-selected t)
-
-(defun magit-rebase-interactive-1
- (commit args message &optional editor delay-edit-confirm noassert confirm)
- (declare (indent 2))
- (when commit
- (if (eq commit :merge-base)
- (setq commit (--if-let (magit-get-upstream-branch)
- (magit-git-string "merge-base" it "HEAD")
- nil))
- (unless (magit-rev-ancestor-p commit "HEAD")
- (user-error "%s isn't an ancestor of HEAD" commit))
- (if (magit-commit-parents commit)
- (when (or (not (eq this-command 'magit-rebase-interactive))
- magit-rebase-interactive-include-selected)
- (setq commit (concat commit "^")))
- (setq args (cons "--root" args)))))
- (when (and commit (not noassert))
- (setq commit (magit-rebase-interactive-assert
- commit delay-edit-confirm
- (--some (string-prefix-p "--rebase-merges" it) args))))
- (if (and commit (not confirm))
- (let ((process-environment process-environment))
- (when editor
- (push (concat "GIT_SEQUENCE_EDITOR="
- (if (functionp editor)
- (funcall editor commit)
- editor))
- process-environment))
- (magit-run-git-sequencer "rebase" "-i" args
- (unless (member "--root" args) commit)))
- (magit-log-select
- `(lambda (commit)
- (magit-rebase-interactive-1 commit (list ,@args)
- ,message ,editor ,delay-edit-confirm ,noassert))
- message)))
-
-(defvar magit--rebase-published-symbol nil)
-(defvar magit--rebase-public-edit-confirmed nil)
-
-(defun magit-rebase-interactive-assert
- (since &optional delay-edit-confirm rebase-merges)
- (let* ((commit (magit-rebase--target-commit since))
- (branches (magit-list-publishing-branches commit)))
- (setq magit--rebase-public-edit-confirmed
- (delete (magit-toplevel) magit--rebase-public-edit-confirmed))
- (when (and branches
- (or (not delay-edit-confirm)
- ;; The user might have stopped at a published commit
- ;; merely to add new commits *after* it. Try not to
- ;; ask users whether they really want to edit public
- ;; commits, when they don't actually intend to do so.
- (not (--all-p (magit-rev-equal it commit) branches))))
- (let ((m1 "Some of these commits have already been published to ")
- (m2 ".\nDo you really want to modify them"))
- (magit-confirm (or magit--rebase-published-symbol 'rebase-published)
- (concat m1 "%s" m2)
- (concat m1 "%i public branches" m2)
- nil branches))
- (push (magit-toplevel) magit--rebase-public-edit-confirmed)))
- (if (and (magit-git-lines "rev-list" "--merges" (concat since "..HEAD"))
- (not rebase-merges))
- (magit-read-char-case "Proceed despite merge in rebase range? " nil
- (?c "[c]ontinue" since)
- (?s "[s]elect other" nil)
- (?a "[a]bort" (user-error "Quit")))
- since))
-
-(defun magit-rebase--target-commit (since)
- (if (string-suffix-p "^" since)
- ;; If SINCE is "REV^", then the user selected
- ;; "REV", which is the first commit that will
- ;; be replaced. (from^..to] <=> [from..to]
- (substring since 0 -1)
- ;; The "--root" argument is being used.
- since))
-
-;;;###autoload
-(defun magit-rebase-interactive (commit args)
- "Start an interactive rebase sequence."
- (interactive (list (magit-commit-at-point)
- (magit-rebase-arguments)))
- (magit-rebase-interactive-1 commit args
- "Type %p on a commit to rebase it and all commits above it,"
- nil t))
-
-;;;###autoload
-(defun magit-rebase-autosquash (args)
- "Combine squash and fixup commits with their intended targets."
- (interactive (list (magit-rebase-arguments)))
- (magit-rebase-interactive-1 :merge-base
- (nconc (list "--autosquash" "--keep-empty") args)
- "Type %p on a commit to squash into it and then rebase as necessary,"
- "true" nil t))
-
-;;;###autoload
-(defun magit-rebase-edit-commit (commit args)
- "Edit a single older commit using rebase."
- (interactive (list (magit-commit-at-point)
- (magit-rebase-arguments)))
- (magit-rebase-interactive-1 commit args
- "Type %p on a commit to edit it,"
- (apply-partially #'magit-rebase--perl-editor 'edit)
- t))
-
-;;;###autoload
-(defun magit-rebase-reword-commit (commit args)
- "Reword a single older commit using rebase."
- (interactive (list (magit-commit-at-point)
- (magit-rebase-arguments)))
- (magit-rebase-interactive-1 commit args
- "Type %p on a commit to reword its message,"
- (apply-partially #'magit-rebase--perl-editor 'reword)))
-
-;;;###autoload
-(defun magit-rebase-remove-commit (commit args)
- "Remove a single older commit using rebase."
- (interactive (list (magit-commit-at-point)
- (magit-rebase-arguments)))
- (magit-rebase-interactive-1 commit args
- "Type %p on a commit to remove it,"
- (apply-partially #'magit-rebase--perl-editor 'remove)
- nil nil t))
-
-(defun magit-rebase--perl-editor (action since)
- (let ((commit (magit-rev-abbrev (magit-rebase--target-commit since))))
- (format "%s -i -p -e '++$x if not $x and s/^pick %s/%s %s/'"
- magit-perl-executable
- commit
- (cl-case action
- (edit "edit")
- (remove "# pick")
- (reword "reword")
- (t (error "unknown action: %s" action)))
- commit)))
-
-;;;###autoload
-(defun magit-rebase-continue (&optional noedit)
- "Restart the current rebasing operation.
-In some cases this pops up a commit message buffer for you do
-edit. With a prefix argument the old message is reused as-is."
- (interactive "P")
- (if (magit-rebase-in-progress-p)
- (if (magit-anything-unstaged-p t)
- (user-error "Cannot continue rebase with unstaged changes")
- (when (and (magit-anything-staged-p)
- (file-exists-p (magit-git-dir "rebase-merge"))
- (not (member (magit-toplevel)
- magit--rebase-public-edit-confirmed)))
- (magit-commit-amend-assert
- (magit-file-line (magit-git-dir "rebase-merge/orig-head"))))
- (if noedit
- (let ((process-environment process-environment))
- (push "GIT_EDITOR=true" process-environment)
- (magit-run-git-async (magit--rebase-resume-command) "--continue")
- (set-process-sentinel magit-this-process
- #'magit-sequencer-process-sentinel)
- magit-this-process)
- (magit-run-git-sequencer (magit--rebase-resume-command) "--continue")))
- (user-error "No rebase in progress")))
-
-;;;###autoload
-(defun magit-rebase-skip ()
- "Skip the current commit and restart the current rebase operation."
- (interactive)
- (unless (magit-rebase-in-progress-p)
- (user-error "No rebase in progress"))
- (magit-run-git-sequencer (magit--rebase-resume-command) "--skip"))
-
-;;;###autoload
-(defun magit-rebase-edit ()
- "Edit the todo list of the current rebase operation."
- (interactive)
- (unless (magit-rebase-in-progress-p)
- (user-error "No rebase in progress"))
- (magit-run-git-sequencer "rebase" "--edit-todo"))
-
-;;;###autoload
-(defun magit-rebase-abort ()
- "Abort the current rebase operation, restoring the original branch."
- (interactive)
- (unless (magit-rebase-in-progress-p)
- (user-error "No rebase in progress"))
- (magit-confirm 'abort-rebase "Abort this rebase")
- (magit-run-git (magit--rebase-resume-command) "--abort"))
-
-(defun magit-rebase-in-progress-p ()
- "Return t if a rebase is in progress."
- (or (file-exists-p (magit-git-dir "rebase-merge"))
- (file-exists-p (magit-git-dir "rebase-apply/onto"))))
-
-(defun magit--rebase-resume-command ()
- (if (file-exists-p (magit-git-dir "rebase-recursive")) "rbr" "rebase"))
-
-;;; Sections
-
-(defun magit-insert-sequencer-sequence ()
- "Insert section for the on-going cherry-pick or revert sequence.
-If no such sequence is in progress, do nothing."
- (let ((picking (magit-cherry-pick-in-progress-p)))
- (when (or picking (magit-revert-in-progress-p))
- (magit-insert-section (sequence)
- (magit-insert-heading (if picking "Cherry Picking" "Reverting"))
- (when-let ((lines
- (cdr (magit-file-lines (magit-git-dir "sequencer/todo")))))
- (dolist (line (nreverse lines))
- (when (string-match
- "^\\(pick\\|revert\\) \\([^ ]+\\) \\(.*\\)$" line)
- (magit-bind-match-strings (cmd hash msg) line
- (magit-insert-section (commit hash)
- (insert (propertize cmd 'font-lock-face 'magit-sequence-pick)
- " " (propertize hash 'font-lock-face 'magit-hash)
- " " msg "\n"))))))
- (magit-sequence-insert-sequence
- (magit-file-line (magit-git-dir (if picking
- "CHERRY_PICK_HEAD"
- "REVERT_HEAD")))
- (magit-file-line (magit-git-dir "sequencer/head")))
- (insert "\n")))))
-
-(defun magit-insert-am-sequence ()
- "Insert section for the on-going patch applying sequence.
-If no such sequence is in progress, do nothing."
- (when (magit-am-in-progress-p)
- (magit-insert-section (rebase-sequence)
- (magit-insert-heading "Applying patches")
- (let ((patches (nreverse (magit-rebase-patches)))
- patch commit)
- (while patches
- (setq patch (pop patches))
- (setq commit (magit-commit-p
- (cadr (split-string (magit-file-line patch)))))
- (cond ((and commit patches)
- (magit-sequence-insert-commit
- "pick" commit 'magit-sequence-pick))
- (patches
- (magit-sequence-insert-am-patch
- "pick" patch 'magit-sequence-pick))
- (commit
- (magit-sequence-insert-sequence commit "ORIG_HEAD"))
- (t
- (magit-sequence-insert-am-patch
- "stop" patch 'magit-sequence-stop)
- (magit-sequence-insert-sequence nil "ORIG_HEAD")))))
- (insert ?\n))))
-
-(defun magit-sequence-insert-am-patch (type patch face)
- (magit-insert-section (file patch)
- (let ((title
- (with-temp-buffer
- (insert-file-contents patch nil nil 4096)
- (unless (re-search-forward "^Subject: " nil t)
- (goto-char (point-min)))
- (buffer-substring (point) (line-end-position)))))
- (insert (propertize type 'font-lock-face face)
- ?\s (propertize (file-name-nondirectory patch)
- 'font-lock-face 'magit-hash)
- ?\s title
- ?\n))))
-
-(defun magit-insert-rebase-sequence ()
- "Insert section for the on-going rebase sequence.
-If no such sequence is in progress, do nothing."
- (when (magit-rebase-in-progress-p)
- (let* ((interactive (file-directory-p (magit-git-dir "rebase-merge")))
- (dir (if interactive "rebase-merge/" "rebase-apply/"))
- (name (-> (concat dir "head-name") magit-git-dir magit-file-line))
- (onto (-> (concat dir "onto") magit-git-dir magit-file-line))
- (onto (or (magit-rev-name onto name)
- (magit-rev-name onto "refs/heads/*") onto))
- (name (or (magit-rev-name name "refs/heads/*") name)))
- (magit-insert-section (rebase-sequence)
- (magit-insert-heading (format "Rebasing %s onto %s" name onto))
- (if interactive
- (magit-rebase-insert-merge-sequence onto)
- (magit-rebase-insert-apply-sequence onto))
- (insert ?\n)))))
-
-(defun magit-rebase--todo ()
- "Return `git-rebase-action' instances for remaining rebase actions.
-These are ordered in that the same way they'll be sorted in the
-status buffer (i.e. the reverse of how they will be applied)."
- (let ((comment-start (or (magit-get "core.commentChar") "#"))
- lines)
- (with-temp-buffer
- (insert-file-contents (magit-git-dir "rebase-merge/git-rebase-todo"))
- (while (not (eobp))
- (let ((ln (git-rebase-current-line)))
- (when (oref ln action-type)
- (push ln lines)))
- (forward-line)))
- lines))
-
-(defun magit-rebase-insert-merge-sequence (onto)
- (dolist (line (magit-rebase--todo))
- (with-slots (action-type action action-options target) line
- (pcase action-type
- (`commit
- (magit-sequence-insert-commit action target 'magit-sequence-pick))
- ((or (or `exec `label)
- (and `merge (guard (not action-options))))
- (insert (propertize action 'font-lock-face 'magit-sequence-onto) "\s"
- (propertize target 'font-lock-face 'git-rebase-label) "\n"))
- (`merge
- (if-let ((hash (and (string-match "-[cC] \\([^ ]+\\)" action-options)
- (match-string 1 action-options))))
- (magit-insert-section (commit hash)
- (magit-insert-heading
- (propertize "merge" 'font-lock-face 'magit-sequence-pick)
- "\s"
- (magit-format-rev-summary hash) "\n"))
- (error "failed to parse merge message hash"))))))
- (magit-sequence-insert-sequence
- (magit-file-line (magit-git-dir "rebase-merge/stopped-sha"))
- onto
- (--when-let (magit-file-lines (magit-git-dir "rebase-merge/done"))
- (cadr (split-string (car (last it)))))))
-
-(defun magit-rebase-insert-apply-sequence (onto)
- (let ((rewritten
- (--map (car (split-string it))
- (magit-file-lines (magit-git-dir "rebase-apply/rewritten"))))
- (stop (magit-file-line (magit-git-dir "rebase-apply/original-commit"))))
- (dolist (patch (nreverse (cdr (magit-rebase-patches))))
- (let ((hash (cadr (split-string (magit-file-line patch)))))
- (unless (or (member hash rewritten)
- (equal hash stop))
- (magit-sequence-insert-commit "pick" hash 'magit-sequence-pick)))))
- (magit-sequence-insert-sequence
- (magit-file-line (magit-git-dir "rebase-apply/original-commit"))
- onto))
-
-(defun magit-rebase-patches ()
- (directory-files (magit-git-dir "rebase-apply") t "^[0-9]\\{4\\}$"))
-
-(defun magit-sequence-insert-sequence (stop onto &optional orig)
- (let ((head (magit-rev-parse "HEAD")) done)
- (setq onto (if onto (magit-rev-parse onto) head))
- (setq done (magit-git-lines "log" "--format=%H" (concat onto "..HEAD")))
- (when (and stop (not (member (magit-rev-parse stop) done)))
- (let ((id (magit-patch-id stop)))
- (--if-let (--first (equal (magit-patch-id it) id) done)
- (setq stop it)
- (cond
- ((--first (magit-rev-equal it stop) done)
- ;; The commit's testament has been executed.
- (magit-sequence-insert-commit "void" stop 'magit-sequence-drop))
- ;; The faith of the commit is still undecided...
- ((magit-anything-unmerged-p)
- ;; ...and time travel isn't for the faint of heart.
- (magit-sequence-insert-commit "join" stop 'magit-sequence-part))
- ((magit-anything-modified-p t)
- ;; ...and the dust hasn't settled yet...
- (magit-sequence-insert-commit
- (let* ((magit--refresh-cache nil)
- (staged (magit-commit-tree "oO" nil "HEAD"))
- (unstaged (magit-commit-worktree "oO" "--reset")))
- (cond
- ;; ...but we could end up at the same tree just by committing.
- ((or (magit-rev-equal staged stop)
- (magit-rev-equal unstaged stop)) "goal")
- ;; ...but the changes are still there, untainted.
- ((or (equal (magit-patch-id staged) id)
- (equal (magit-patch-id unstaged) id)) "same")
- ;; ...and some changes are gone and/or others were added.
- (t "work")))
- stop 'magit-sequence-part))
- ;; The commit is definitely gone...
- ((--first (magit-rev-equal it stop) done)
- ;; ...but all of its changes are still in effect.
- (magit-sequence-insert-commit "poof" stop 'magit-sequence-drop))
- (t
- ;; ...and some changes are gone and/or other changes were added.
- (magit-sequence-insert-commit "gone" stop 'magit-sequence-drop)))
- (setq stop nil))))
- (dolist (rev done)
- (apply 'magit-sequence-insert-commit
- (cond ((equal rev stop)
- ;; ...but its reincarnation lives on.
- ;; Or it didn't die in the first place.
- (list (if (and (equal rev head)
- (equal (magit-patch-id rev)
- (magit-patch-id orig)))
- "stop" ; We haven't done anything yet.
- "like") ; There are new commits.
- rev (if (equal rev head)
- 'magit-sequence-head
- 'magit-sequence-stop)))
- ((equal rev head)
- (list "done" rev 'magit-sequence-head))
- (t
- (list "done" rev 'magit-sequence-done)))))
- (magit-sequence-insert-commit "onto" onto
- (if (equal onto head)
- 'magit-sequence-head
- 'magit-sequence-onto))))
-
-(defun magit-sequence-insert-commit (type hash face)
- (magit-insert-section (commit hash)
- (magit-insert-heading
- (propertize type 'font-lock-face face) "\s"
- (magit-format-rev-summary hash) "\n")))
-
-;;; _
-(provide 'magit-sequence)
-;;; magit-sequence.el ends here
diff --git a/elpa/magit-20200728.45/magit-stash.el b/elpa/magit-20200728.45/magit-stash.el
deleted file mode 100644
index d4e358c..0000000
--- a/elpa/magit-20200728.45/magit-stash.el
+++ /dev/null
@@ -1,546 +0,0 @@
-;;; magit-stash.el --- stash support for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Support for Git stashes.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-(require 'magit-reflog)
-
-;;; Options
-
-(defgroup magit-stash nil
- "List stashes and show stash diffs."
- :group 'magit-modes)
-
-;;;; Diff options
-
-(defcustom magit-stash-sections-hook
- '(magit-insert-stash-notes
- magit-insert-stash-worktree
- magit-insert-stash-index
- magit-insert-stash-untracked)
- "Hook run to insert sections into stash diff buffers."
- :package-version '(magit . "2.1.0")
- :group 'magit-stash
- :type 'hook)
-
-;;;; Log options
-
-(defcustom magit-stashes-margin
- (list (nth 0 magit-log-margin)
- (nth 1 magit-log-margin)
- 'magit-log-margin-width nil
- (nth 4 magit-log-margin))
- "Format of the margin in `magit-stashes-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-stash
- :group 'magit-margin
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set-after '(magit-log-margin)
- :set (apply-partially #'magit-margin-set-variable 'magit-stashes-mode))
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-stash "magit-stash" nil t)
-(transient-define-prefix magit-stash ()
- "Stash uncommitted changes."
- :man-page "git-stash"
- ["Arguments"
- ("-u" "Also save untracked files" ("-u" "--include-untracked"))
- ("-a" "Also save untracked and ignored files" ("-a" "--all"))]
- [["Stash"
- ("z" "both" magit-stash-both)
- ("i" "index" magit-stash-index)
- ("w" "worktree" magit-stash-worktree)
- ("x" "keeping index" magit-stash-keep-index)]
- ["Snapshot"
- ("Z" "both" magit-snapshot-both)
- ("I" "index" magit-snapshot-index)
- ("W" "worktree" magit-snapshot-worktree)
- ("r" "to wip ref" magit-wip-commit)]
- ["Use"
- ("a" "Apply" magit-stash-apply)
- ("p" "Pop" magit-stash-pop)
- ("k" "Drop" magit-stash-drop)]
- ["Inspect"
- ("l" "List" magit-stash-list)
- ("v" "Show" magit-stash-show)]
- ["Transform"
- ("b" "Branch" magit-stash-branch)
- ("B" "Branch here" magit-stash-branch-here)
- ("f" "Format patch" magit-stash-format-patch)]])
-
-(defun magit-stash-arguments ()
- (transient-args 'magit-stash))
-
-;;;###autoload
-(defun magit-stash-both (message &optional include-untracked)
- "Create a stash of the index and working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'."
- (interactive (magit-stash-read-args))
- (magit-stash-save message t t include-untracked t))
-
-;;;###autoload
-(defun magit-stash-index (message)
- "Create a stash of the index only.
-Unstaged and untracked changes are not stashed. The stashed
-changes are applied in reverse to both the index and the
-worktree. This command can fail when the worktree is not clean.
-Applying the resulting stash has the inverse effect."
- (interactive (list (magit-stash-read-message)))
- (magit-stash-save message t nil nil t 'worktree))
-
-;;;###autoload
-(defun magit-stash-worktree (message &optional include-untracked)
- "Create a stash of unstaged changes in the working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'."
- (interactive (magit-stash-read-args))
- (magit-stash-save message nil t include-untracked t 'index))
-
-;;;###autoload
-(defun magit-stash-keep-index (message &optional include-untracked)
- "Create a stash of the index and working tree, keeping index intact.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'."
- (interactive (magit-stash-read-args))
- (magit-stash-save message t t include-untracked t 'index))
-
-(defun magit-stash-read-args ()
- (list (magit-stash-read-message)
- (magit-stash-read-untracked)))
-
-(defun magit-stash-read-untracked ()
- (let ((prefix (prefix-numeric-value current-prefix-arg))
- (args (magit-stash-arguments)))
- (cond ((or (= prefix 16) (member "--all" args)) 'all)
- ((or (= prefix 4) (member "--include-untracked" args)) t))))
-
-(defun magit-stash-read-message ()
- (let* ((default (format "On %s: "
- (or (magit-get-current-branch) "(no branch)")))
- (input (magit-read-string "Stash message" default)))
- (if (equal input default)
- (concat default (magit-rev-format "%h %s"))
- input)))
-
-;;;###autoload
-(defun magit-snapshot-both (&optional include-untracked)
- "Create a snapshot of the index and working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'."
- (interactive (magit-snapshot-read-args))
- (magit-snapshot-save t t include-untracked t))
-
-;;;###autoload
-(defun magit-snapshot-index ()
- "Create a snapshot of the index only.
-Unstaged and untracked changes are not stashed."
- (interactive)
- (magit-snapshot-save t nil nil t))
-
-;;;###autoload
-(defun magit-snapshot-worktree (&optional include-untracked)
- "Create a snapshot of unstaged changes in the working tree.
-Untracked files are included according to infix arguments.
-One prefix argument is equivalent to `--include-untracked'
-while two prefix arguments are equivalent to `--all'."
- (interactive (magit-snapshot-read-args))
- (magit-snapshot-save nil t include-untracked t))
-
-(defun magit-snapshot-read-args ()
- (list (magit-stash-read-untracked)))
-
-(defun magit-snapshot-save (index worktree untracked &optional refresh)
- (magit-stash-save (concat "WIP on " (magit-stash-summary))
- index worktree untracked refresh t))
-
-;;;###autoload
-(defun magit-stash-apply (stash)
- "Apply a stash to the working tree.
-Try to preserve the stash index. If that fails because there
-are staged changes, apply without preserving the stash index."
- (interactive (list (magit-read-stash "Apply stash")))
- (if (= (magit-call-git "stash" "apply" "--index" stash) 0)
- (magit-refresh)
- (magit-run-git "stash" "apply" stash)))
-
-(defun magit-stash-pop (stash)
- "Apply a stash to the working tree and remove it from stash list.
-Try to preserve the stash index. If that fails because there
-are staged changes, apply without preserving the stash index
-and forgo removing the stash."
- (interactive (list (magit-read-stash "Pop stash")))
- (if (= (magit-call-git "stash" "apply" "--index" stash) 0)
- (magit-stash-drop stash)
- (magit-run-git "stash" "apply" stash)))
-
-;;;###autoload
-(defun magit-stash-drop (stash)
- "Remove a stash from the stash list.
-When the region is active offer to drop all contained stashes."
- (interactive
- (list (--if-let (magit-region-values 'stash)
- (magit-confirm 'drop-stashes nil "Drop %i stashes" nil it)
- (magit-read-stash "Drop stash"))))
- (dolist (stash (if (listp stash)
- (nreverse (prog1 stash (setq stash (car stash))))
- (list stash)))
- (message "Deleted refs/%s (was %s)" stash
- (magit-rev-parse "--short" stash))
- (magit-call-git "rev-parse" stash)
- (magit-call-git "reflog" "delete" "--updateref" "--rewrite" stash))
- (when-let ((ref (and (string-match "\\(.+\\)@{[0-9]+}$" stash)
- (match-string 1 stash))))
- (unless (string-match "^refs/" ref)
- (setq ref (concat "refs/" ref)))
- (unless (magit-rev-verify (concat ref "@{0}"))
- (magit-run-git "update-ref" "-d" ref)))
- (magit-refresh))
-
-;;;###autoload
-(defun magit-stash-clear (ref)
- "Remove all stashes saved in REF's reflog by deleting REF."
- (interactive (let ((ref (or (magit-section-value-if 'stashes) "refs/stash")))
- (magit-confirm t (format "Drop all stashes in %s" ref))
- (list ref)))
- (magit-run-git "update-ref" "-d" ref))
-
-;;;###autoload
-(defun magit-stash-branch (stash branch)
- "Create and checkout a new BRANCH from STASH."
- (interactive (list (magit-read-stash "Branch stash")
- (magit-read-string-ns "Branch name")))
- (magit-run-git "stash" "branch" branch stash))
-
-;;;###autoload
-(defun magit-stash-branch-here (stash branch)
- "Create and checkout a new BRANCH and apply STASH.
-The branch is created using `magit-branch-and-checkout', using the
-current branch or `HEAD' as the start-point."
- (interactive (list (magit-read-stash "Branch stash")
- (magit-read-string-ns "Branch name")))
- (let ((inhibit-magit-refresh t))
- (magit-branch-and-checkout branch (or (magit-get-current-branch) "HEAD")))
- (magit-stash-apply stash))
-
-;;;###autoload
-(defun magit-stash-format-patch (stash)
- "Create a patch from STASH"
- (interactive (list (magit-read-stash "Create patch from stash")))
- (with-temp-file (magit-rev-format "0001-%f.patch" stash)
- (magit-git-insert "stash" "show" "-p" stash))
- (magit-refresh))
-
-;;; Plumbing
-
-(defun magit-stash-save (message index worktree untracked
- &optional refresh keep noerror ref)
- (if (or (and index (magit-staged-files t))
- (and worktree (magit-unstaged-files t))
- (and untracked (magit-untracked-files (eq untracked 'all))))
- (magit-with-toplevel
- (magit-stash-store message (or ref "refs/stash")
- (magit-stash-create message index worktree untracked))
- (if (eq keep 'worktree)
- (with-temp-buffer
- (magit-git-insert "diff" "--cached")
- (magit-run-git-with-input
- "apply" "--reverse" "--cached" "--ignore-space-change" "-")
- (magit-run-git-with-input
- "apply" "--reverse" "--ignore-space-change" "-"))
- (unless (eq keep t)
- (if (eq keep 'index)
- (magit-call-git "checkout" "--" ".")
- (magit-call-git "reset" "--hard" "HEAD" "--"))
- (when untracked
- (magit-call-git "clean" "--force" "-d"
- (and (eq untracked 'all) "-x")))))
- (when refresh
- (magit-refresh)))
- (unless noerror
- (user-error "No %s changes to save" (cond ((not index) "unstaged")
- ((not worktree) "staged")
- (t "local"))))))
-
-(defun magit-stash-store (message ref commit)
- (magit-update-ref ref message commit t))
-
-(defun magit-stash-create (message index worktree untracked)
- (unless (magit-rev-parse "--verify" "HEAD")
- (error "You do not have the initial commit yet"))
- (let ((magit-git-global-arguments (nconc (list "-c" "commit.gpgsign=false")
- magit-git-global-arguments))
- (default-directory (magit-toplevel))
- (summary (magit-stash-summary))
- (head "HEAD"))
- (when (and worktree (not index))
- (setq head (or (magit-commit-tree "pre-stash index" nil "HEAD")
- (error "Cannot save the current index state"))))
- (or (setq index (magit-commit-tree (concat "index on " summary) nil head))
- (error "Cannot save the current index state"))
- (and untracked
- (setq untracked (magit-untracked-files (eq untracked 'all)))
- (setq untracked (magit-with-temp-index nil nil
- (or (and (magit-update-files untracked)
- (magit-commit-tree
- (concat "untracked files on " summary)))
- (error "Cannot save the untracked files")))))
- (magit-with-temp-index index "-m"
- (when worktree
- (or (magit-update-files (magit-git-items "diff" "-z" "--name-only" head))
- (error "Cannot save the current worktree state")))
- (or (magit-commit-tree message nil head index untracked)
- (error "Cannot save the current worktree state")))))
-
-(defun magit-stash-summary ()
- (concat (or (magit-get-current-branch) "(no branch)")
- ": " (magit-rev-format "%h %s")))
-
-;;; Sections
-
-(defvar magit-stashes-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-delete-thing] 'magit-stash-clear)
- map)
- "Keymap for `stashes' section.")
-
-(defvar magit-stash-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-stash-show)
- (define-key map [remap magit-delete-thing] 'magit-stash-drop)
- (define-key map "a" 'magit-stash-apply)
- (define-key map "A" 'magit-stash-pop)
- map)
- "Keymap for `stash' sections.")
-
-(magit-define-section-jumper magit-jump-to-stashes
- "Stashes" stashes "refs/stash")
-
-(cl-defun magit-insert-stashes (&optional (ref "refs/stash")
- (heading "Stashes:"))
- "Insert `stashes' section showing reflog for \"refs/stash\".
-If optional REF is non-nil, show reflog for that instead.
-If optional HEADING is non-nil, use that as section heading
-instead of \"Stashes:\"."
- (let ((verified (magit-rev-verify ref))
- (autostash
- (and (magit-rebase-in-progress-p)
- (magit-file-line
- (magit-git-dir
- (-> (if (file-directory-p (magit-git-dir "rebase-merge"))
- "rebase-merge/autostash"
- "rebase-apply/autostash")))))))
- (when (or autostash verified)
- (magit-insert-section (stashes ref)
- (magit-insert-heading heading)
- (when autostash
- (pcase-let ((`(,author ,date ,msg)
- (split-string
- (car (magit-git-lines
- "show" "-q" "--format=%aN%x00%at%x00%s"
- autostash))
- "\0")))
- (magit-insert-section (stash autostash)
- (insert (propertize "AUTOSTASH" 'font-lock-face 'magit-hash))
- (insert " " msg "\n")
- (save-excursion
- (backward-char)
- (magit-log-format-margin autostash author date)))))
- (if verified
- (magit-git-wash (apply-partially 'magit-log-wash-log 'stash)
- "reflog" "--format=%gd%x00%aN%x00%at%x00%gs" ref)
- (insert ?\n)
- (save-excursion
- (backward-char)
- (magit-make-margin-overlay)))))))
-
-;;; List Stashes
-
-;;;###autoload
-(defun magit-stash-list ()
- "List all stashes in a buffer."
- (interactive)
- (magit-stashes-setup-buffer))
-
-(define-derived-mode magit-stashes-mode magit-reflog-mode "Magit Stashes"
- "Mode for looking at lists of stashes."
- :group 'magit-log
- (hack-dir-local-variables-non-file-buffer))
-
-(defun magit-stashes-setup-buffer ()
- (magit-setup-buffer #'magit-stashes-mode nil
- (magit-buffer-refname "refs/stash")))
-
-(defun magit-stashes-refresh-buffer ()
- (magit-insert-section (stashesbuf)
- (magit-insert-heading (if (equal magit-buffer-refname "refs/stash")
- "Stashes:"
- (format "Stashes [%s]:" magit-buffer-refname)))
- (magit-git-wash (apply-partially 'magit-log-wash-log 'stash)
- "reflog" "--format=%gd%x00%aN%x00%at%x00%gs" magit-buffer-refname)))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-stashes-mode))
- magit-buffer-refname)
-
-(defvar magit--update-stash-buffer nil)
-
-(defun magit-stashes-maybe-update-stash-buffer (&optional _)
- "When moving in the stashes buffer, update the stash buffer.
-If there is no stash buffer in the same frame, then do nothing."
- (when (derived-mode-p 'magit-stashes-mode)
- (magit--maybe-update-stash-buffer)))
-
-(defun magit--maybe-update-stash-buffer ()
- (when-let ((stash (magit-section-value-if 'stash))
- (buffer (magit-get-mode-buffer 'magit-stash-mode nil t)))
- (if magit--update-stash-buffer
- (setq magit--update-stash-buffer (list stash buffer))
- (setq magit--update-stash-buffer (list stash buffer))
- (run-with-idle-timer
- magit-update-other-window-delay nil
- (let ((args (with-current-buffer buffer
- (let ((magit-direct-use-buffer-arguments 'selected))
- (magit-show-commit--arguments)))))
- (lambda ()
- (pcase-let ((`(,stash ,buf) magit--update-stash-buffer))
- (setq magit--update-stash-buffer nil)
- (when (buffer-live-p buf)
- (let ((magit-display-buffer-noselect t))
- (apply #'magit-stash-show stash args))))
- (setq magit--update-stash-buffer nil)))))))
-
-;;; Show Stash
-
-;;;###autoload
-(defun magit-stash-show (stash &optional args files)
- "Show all diffs of a stash in a buffer."
- (interactive (cons (or (and (not current-prefix-arg)
- (magit-stash-at-point))
- (magit-read-stash "Show stash"))
- (pcase-let ((`(,args ,files)
- (magit-diff-arguments 'magit-stash-mode)))
- (list (delete "--stat" args) files))))
- (magit-stash-setup-buffer stash args files))
-
-(define-derived-mode magit-stash-mode magit-diff-mode "Magit Stash"
- "Mode for looking at individual stashes."
- :group 'magit-diff
- (hack-dir-local-variables-non-file-buffer))
-
-(defun magit-stash-setup-buffer (stash args files)
- (magit-setup-buffer #'magit-stash-mode nil
- (magit-buffer-revision stash)
- (magit-buffer-range (format "%s^..%s" stash stash))
- (magit-buffer-diff-args args)
- (magit-buffer-diff-files files)))
-
-(defun magit-stash-refresh-buffer ()
- (magit-set-header-line-format
- (concat (capitalize magit-buffer-revision) " "
- (propertize (magit-rev-format "%s" magit-buffer-revision)
- 'font-lock-face
- (list :weight 'normal :foreground
- (face-attribute 'default :foreground)))))
- (setq magit-buffer-revision-hash (magit-rev-parse magit-buffer-revision))
- (magit-insert-section (stash)
- (magit-run-section-hook 'magit-stash-sections-hook)))
-
-(cl-defmethod magit-buffer-value (&context (major-mode magit-stash-mode))
- magit-buffer-revision)
-
-(defun magit-stash-insert-section (commit range message &optional files)
- (magit-insert-section (commit commit)
- (magit-insert-heading message)
- (magit--insert-diff "diff" range "-p" "--no-prefix" magit-buffer-diff-args
- "--" (or files magit-buffer-diff-files))))
-
-(defun magit-insert-stash-notes ()
- "Insert section showing notes for a stash.
-This shows the notes for stash@{N} but not for the other commits
-that make up the stash."
- (magit-insert-section section (note)
- (magit-insert-heading "Notes")
- (magit-git-insert "notes" "show" magit-buffer-revision)
- (if (= (point)
- (oref section content))
- (magit-cancel-section)
- (insert "\n"))))
-
-(defun magit-insert-stash-index ()
- "Insert section showing staged changes of the stash."
- (magit-stash-insert-section
- (format "%s^2" magit-buffer-revision)
- (format "%s^..%s^2" magit-buffer-revision magit-buffer-revision)
- "Staged"))
-
-(defun magit-insert-stash-worktree ()
- "Insert section showing unstaged changes of the stash."
- (magit-stash-insert-section
- magit-buffer-revision
- (format "%s^2..%s" magit-buffer-revision magit-buffer-revision)
- "Unstaged"))
-
-(defun magit-insert-stash-untracked ()
- "Insert section showing the untracked files commit of the stash."
- (let ((stash magit-buffer-revision)
- (rev (concat magit-buffer-revision "^3")))
- (when (magit-rev-verify rev)
- (magit-stash-insert-section (format "%s^3" stash)
- (format "%s^..%s^3" stash stash)
- "Untracked files"
- (magit-git-items "ls-tree" "-z" "--name-only"
- "-r" "--full-tree" rev)))))
-
-;;; _
-(provide 'magit-stash)
-;;; magit-stash.el ends here
diff --git a/elpa/magit-20200728.45/magit-status.el b/elpa/magit-20200728.45/magit-status.el
deleted file mode 100644
index c7a6760..0000000
--- a/elpa/magit-20200728.45/magit-status.el
+++ /dev/null
@@ -1,846 +0,0 @@
-;;; magit-status.el --- the grand overview -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements the status buffer.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-;;; Options
-
-(defgroup magit-status nil
- "Inspect and manipulate Git repositories."
- :link '(info-link "(magit)Status Buffer")
- :group 'magit-modes)
-
-(defcustom magit-status-mode-hook nil
- "Hook run after entering Magit-Status mode."
- :group 'magit-status
- :type 'hook)
-
-(defcustom magit-status-headers-hook
- '(magit-insert-error-header
- magit-insert-diff-filter-header
- magit-insert-head-branch-header
- magit-insert-upstream-branch-header
- magit-insert-push-branch-header
- magit-insert-tags-header)
- "Hook run to insert headers into the status buffer.
-
-This hook is run by `magit-insert-status-headers', which in turn
-has to be a member of `magit-status-sections-hook' to be used at
-all."
- :package-version '(magit . "2.1.0")
- :group 'magit-status
- :type 'hook
- :options '(magit-insert-error-header
- magit-insert-diff-filter-header
- magit-insert-repo-header
- magit-insert-remote-header
- magit-insert-head-branch-header
- magit-insert-upstream-branch-header
- magit-insert-push-branch-header
- magit-insert-tags-header))
-
-(defcustom magit-status-sections-hook
- '(magit-insert-status-headers
- magit-insert-merge-log
- magit-insert-rebase-sequence
- magit-insert-am-sequence
- magit-insert-sequencer-sequence
- magit-insert-bisect-output
- magit-insert-bisect-rest
- magit-insert-bisect-log
- magit-insert-untracked-files
- magit-insert-unstaged-changes
- magit-insert-staged-changes
- magit-insert-stashes
- magit-insert-unpushed-to-pushremote
- magit-insert-unpushed-to-upstream-or-recent
- magit-insert-unpulled-from-pushremote
- magit-insert-unpulled-from-upstream)
- "Hook run to insert sections into a status buffer."
- :package-version '(magit . "2.12.0")
- :group 'magit-status
- :type 'hook)
-
-(defcustom magit-status-initial-section '(1)
- "The section point is placed on when a status buffer is created.
-
-When such a buffer is merely being refreshed or being shown again
-after it was merely buried, then this option has no effect.
-
-If this is nil, then point remains on the very first section as
-usual. Otherwise it has to be a list of integers and section
-identity lists. The members of that list are tried in order
-until a matching section is found.
-
-An integer means to jump to the nth section, 1 for example
-jumps over the headings. To get a section's \"identity list\"
-use \\[universal-argument] \\[magit-describe-section-briefly].
-
-If, for example, you want to jump to the commits that haven't
-been pulled from the upstream, or else the second section, then
-use: (((unpulled . \"..@{upstream}\") (status)) 1).
-
-See option `magit-section-initial-visibility-alist' for how to
-control the initial visibility of the jumped to section."
- :package-version '(magit . "2.90.0")
- :group 'magit-status
- :type '(choice (const :tag "as usual" nil)
- (repeat (choice (number :tag "nth top-level section")
- (sexp :tag "section identity")))))
-
-(defcustom magit-status-goto-file-position nil
- "Whether to go to position corresponding to file position.
-
-If this is non-nil and the current buffer is visiting a file,
-then `magit-status' tries to go to the position in the status
-buffer that corresponds to the position in the file-visiting
-buffer. This jumps into either the diff of unstaged changes
-or the diff of staged changes.
-
-If the previously current buffer does not visit a file, or if
-the file has neither unstaged nor staged changes then this has
-no effect.
-
-The command `magit-status-here' tries to go to that position,
-regardless of the value of this option."
- :package-version '(magit . "3.0.0")
- :group 'magit-status
- :type 'boolean)
-
-(defcustom magit-status-show-hashes-in-headers nil
- "Whether headers in the status buffer show hashes.
-The functions which respect this option are
-`magit-insert-head-branch-header',
-`magit-insert-upstream-branch-header', and
-`magit-insert-push-branch-header'."
- :package-version '(magit . "2.4.0")
- :group 'magit-status
- :type 'boolean)
-
-(defcustom magit-status-margin
- (list nil
- (nth 1 magit-log-margin)
- 'magit-log-margin-width nil
- (nth 4 magit-log-margin))
- "Format of the margin in `magit-status-mode' buffers.
-
-The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH).
-
-If INIT is non-nil, then the margin is shown initially.
-STYLE controls how to format the author or committer date.
- It can be one of `age' (to show the age of the commit),
- `age-abbreviated' (to abbreviate the time unit to a character),
- or a string (suitable for `format-time-string') to show the
- actual date. Option `magit-log-margin-show-committer-date'
- controls which date is being displayed.
-WIDTH controls the width of the margin. This exists for forward
- compatibility and currently the value should not be changed.
-AUTHOR controls whether the name of the author is also shown by
- default.
-AUTHOR-WIDTH has to be an integer. When the name of the author
- is shown, then this specifies how much space is used to do so."
- :package-version '(magit . "2.9.0")
- :group 'magit-status
- :group 'magit-margin
- :type magit-log-margin--custom-type
- :initialize 'magit-custom-initialize-reset
- :set-after '(magit-log-margin)
- :set (apply-partially #'magit-margin-set-variable 'magit-status-mode))
-
-(defcustom magit-status-use-buffer-arguments 'selected
- "Whether `magit-status' reuses arguments when the buffer already exists.
-
-This option has no effect when merely refreshing the status
-buffer using `magit-refresh'.
-
-Valid values are:
-
-`always': Always use the set of arguments that is currently
- active in the status buffer, provided that buffer exists
- of course.
-`selected': Use the set of arguments from the status
- buffer, but only if it is displayed in a window of the
- current frame. This is the default.
-`current': Use the set of arguments from the status buffer,
- but only if it is the current buffer.
-`never': Never use the set of arguments from the status
- buffer."
- :package-version '(magit . "3.0.0")
- :group 'magit-buffers
- :group 'magit-commands
- :type '(choice
- (const :tag "always use args from buffer" always)
- (const :tag "use args from buffer if displayed in frame" selected)
- (const :tag "use args from buffer if it is current" current)
- (const :tag "never use args from buffer" never)))
-
-;;; Commands
-
-;;;###autoload
-(defun magit-init (directory)
- "Initialize a Git repository, then show its status.
-
-If the directory is below an existing repository, then the user
-has to confirm that a new one should be created inside. If the
-directory is the root of the existing repository, then the user
-has to confirm that it should be reinitialized.
-
-Non-interactively DIRECTORY is (re-)initialized unconditionally."
- (interactive
- (let ((directory (file-name-as-directory
- (expand-file-name
- (read-directory-name "Create repository in: ")))))
- (when-let ((toplevel (magit-toplevel directory)))
- (setq toplevel (expand-file-name toplevel))
- (unless (y-or-n-p (if (file-equal-p toplevel directory)
- (format "Reinitialize existing repository %s? "
- directory)
- (format "%s is a repository. Create another in %s? "
- toplevel directory)))
- (user-error "Abort")))
- (list directory)))
- ;; `git init' does not understand the meaning of "~"!
- (magit-call-git "init" (magit-convert-filename-for-git
- (expand-file-name directory)))
- (magit-status-setup-buffer directory))
-
-;;;###autoload
-(defun magit-status (&optional directory cache)
- "Show the status of the current Git repository in a buffer.
-
-If the current directory isn't located within a Git repository,
-then prompt for an existing repository or an arbitrary directory,
-depending on option `magit-repository-directories', and show the
-status of the selected repository instead.
-
-* If that option specifies any existing repositories, then offer
- those for completion and show the status buffer for the
- selected one.
-
-* Otherwise read an arbitrary directory using regular file-name
- completion. If the selected directory is the top-level of an
- existing working tree, then show the status buffer for that.
-
-* Otherwise offer to initialize the selected directory as a new
- repository. After creating the repository show its status
- buffer.
-
-These fallback behaviors can also be forced using one or more
-prefix arguments:
-
-* With two prefix arguments (or more precisely a numeric prefix
- value of 16 or greater) read an arbitrary directory and act on
- it as described above. The same could be accomplished using
- the command `magit-init'.
-
-* With a single prefix argument read an existing repository, or
- if none can be found based on `magit-repository-directories',
- then fall back to the same behavior as with two prefix
- arguments."
- (interactive
- (let ((magit--refresh-cache (list (cons 0 0))))
- (list (and (or current-prefix-arg (not (magit-toplevel)))
- (magit-read-repository
- (>= (prefix-numeric-value current-prefix-arg) 16)))
- magit--refresh-cache)))
- (let ((magit--refresh-cache (or cache (list (cons 0 0)))))
- (if directory
- (let ((toplevel (magit-toplevel directory)))
- (setq directory (file-name-as-directory
- (expand-file-name directory)))
- (if (and toplevel (file-equal-p directory toplevel))
- (magit-status-setup-buffer directory)
- (when (y-or-n-p
- (if toplevel
- (format "%s is a repository. Create another in %s? "
- toplevel directory)
- (format "Create repository in %s? " directory)))
- ;; Creating a new repository invalidates cached values.
- (setq magit--refresh-cache nil)
- (magit-init directory))))
- (magit-status-setup-buffer default-directory))))
-
-(put 'magit-status 'interactive-only 'magit-status-setup-buffer)
-
-;;;###autoload
-(defalias 'magit 'magit-status
- "An alias for `magit-status' for better discoverability.
-
-Instead of invoking this alias for `magit-status' using
-\"M-x magit RET\", you should bind a key to `magit-status'
-and read the info node `(magit)Getting Started', which
-also contains other useful hints.")
-
-;;;###autoload
-(defun magit-status-here ()
- "Like `magit-status' but with non-nil `magit-status-goto-file-position'."
- (interactive)
- (let ((magit-status-goto-file-position t))
- (call-interactively #'magit-status)))
-
-(put 'magit-status-here 'interactive-only 'magit-status-setup-buffer)
-
-(defvar magit--remotes-using-recent-git nil)
-
-(defun magit--tramp-asserts (directory)
- (when-let ((remote (file-remote-p directory)))
- (unless (member remote magit--remotes-using-recent-git)
- (if-let ((version (let ((default-directory directory))
- (magit-git-version))))
- (if (version<= magit--minimal-git version)
- (push version magit--remotes-using-recent-git)
- (display-warning 'magit (format "\
-Magit requires Git >= %s, but on %s the version is %s.
-
-If multiple Git versions are installed on the host, then the
-problem might be that TRAMP uses the wrong executable.
-
-First check the value of `magit-git-executable'. Its value is
-used when running git locally as well as when running it on a
-remote host. The default value is \"git\", except on Windows
-where an absolute path is used for performance reasons.
-
-If the value already is just \"git\" but TRAMP never-the-less
-doesn't use the correct executable, then consult the info node
-`(tramp)Remote programs'.\n" magit--minimal-git remote version) :error))
- (display-warning 'magit (format "\
-Magit cannot find Git on %s.
-
-First check the value of `magit-git-executable'. Its value is
-used when running git locally as well as when running it on a
-remote host. The default value is \"git\", except on Windows
-where an absolute path is used for performance reasons.
-
-If the value already is just \"git\" but TRAMP never-the-less
-doesn't find the executable, then consult the info node
-`(tramp)Remote programs'.\n" remote) :error)))))
-
-;;; Mode
-
-(defvar magit-status-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-mode-map)
- (define-key map "j" 'magit-status-jump)
- (define-key map [remap dired-jump] 'magit-dired-jump)
- map)
- "Keymap for `magit-status-mode'.")
-
-(transient-define-prefix magit-status-jump ()
- "In a Magit-Status buffer, jump to a section."
- ["Jump to"
- [("z " "Stashes" magit-jump-to-stashes
- :if (lambda () (memq 'magit-insert-stashes magit-status-sections-hook)))
- ("t " "Tracked" magit-jump-to-tracked
- :if (lambda () (memq 'magit-insert-tracked-files magit-status-sections-hook)))
- ("n " "Untracked" magit-jump-to-untracked
- :if (lambda () (memq 'magit-insert-untracked-files magit-status-sections-hook)))
- ("u " "Unstaged" magit-jump-to-unstaged
- :if (lambda () (memq 'magit-insert-unstaged-changes magit-status-sections-hook)))
- ("s " "Staged" magit-jump-to-staged
- :if (lambda () (memq 'magit-insert-staged-changes magit-status-sections-hook)))]
- [("fu" "Unpulled from upstream" magit-jump-to-unpulled-from-upstream
- :if (lambda () (memq 'magit-insert-unpulled-from-upstream magit-status-sections-hook)))
- ("fp" "Unpulled from pushremote" magit-jump-to-unpulled-from-pushremote
- :if (lambda () (memq 'magit-insert-unpulled-from-pushremote magit-status-sections-hook)))
- ("pu" magit-jump-to-unpushed-to-upstream
- :if (lambda ()
- (or (memq 'magit-insert-unpushed-to-upstream-or-recent magit-status-sections-hook)
- (memq 'magit-insert-unpushed-to-upstream magit-status-sections-hook)))
- :description (lambda ()
- (let ((upstream (magit-get-upstream-branch)))
- (if (or (not upstream)
- (magit-rev-ancestor-p "HEAD" upstream))
- "Recent commits"
- "Unmerged into upstream"))))
- ("pp" "Unpushed to pushremote" magit-jump-to-unpushed-to-pushremote
- :if (lambda () (memq 'magit-insert-unpushed-to-pushremote magit-status-sections-hook)))
- ("a " "Assumed unstaged" magit-jump-to-assume-unchanged
- :if (lambda () (memq 'magit-insert-assume-unchanged-files magit-status-sections-hook)))
- ("w " "Skip worktree" magit-jump-to-skip-worktree
- :if (lambda () (memq 'magit-insert-skip-worktree-files magit-status-sections-hook)))]])
-
-(define-derived-mode magit-status-mode magit-mode "Magit"
- "Mode for looking at Git status.
-
-This mode is documented in info node `(magit)Status Buffer'.
-
-\\<magit-mode-map>\
-Type \\[magit-refresh] to refresh the current buffer.
-Type \\[magit-section-toggle] to expand or hide the section at point.
-Type \\[magit-visit-thing] to visit the change or commit at point.
-
-Type \\[magit-dispatch] to invoke major commands.
-
-Staging and applying changes is documented in info node
-`(magit)Staging and Unstaging' and info node `(magit)Applying'.
-
-\\<magit-hunk-section-map>Type \
-\\[magit-apply] to apply the change at point, \
-\\[magit-stage] to stage,
-\\[magit-unstage] to unstage, \
-\\[magit-discard] to discard, or \
-\\[magit-reverse] to reverse it.
-
-\\<magit-status-mode-map>\
-Type \\[magit-commit] to create a commit.
-
-\\{magit-status-mode-map}"
- :group 'magit-status
- (hack-dir-local-variables-non-file-buffer)
- (setq imenu-create-index-function
- 'magit-imenu--status-create-index-function))
-
-(put 'magit-status-mode 'magit-diff-default-arguments
- '("--no-ext-diff"))
-(put 'magit-status-mode 'magit-log-default-arguments
- '("-n256" "--decorate"))
-
-;;;###autoload
-(defun magit-status-setup-buffer (&optional directory)
- (unless directory
- (setq directory default-directory))
- (magit--tramp-asserts directory)
- (let* ((default-directory directory)
- (d (magit-diff--get-value 'magit-status-mode
- magit-status-use-buffer-arguments))
- (l (magit-log--get-value 'magit-status-mode
- magit-status-use-buffer-arguments))
- (file (and magit-status-goto-file-position
- (magit-file-relative-name)))
- (line (and file (line-number-at-pos)))
- (col (and file (current-column)))
- (buf (magit-setup-buffer #'magit-status-mode nil
- (magit-buffer-diff-args (nth 0 d))
- (magit-buffer-diff-files (nth 1 d))
- (magit-buffer-log-args (nth 0 l))
- (magit-buffer-log-files (nth 1 l)))))
- (when file
- (with-current-buffer buf
- (let ((staged (magit-get-section '((staged) (status)))))
- (if (and staged
- (cadr (magit-diff--locate-hunk file line staged)))
- (magit-diff--goto-position file line col staged)
- (let ((unstaged (magit-get-section '((unstaged) (status)))))
- (unless (and unstaged
- (magit-diff--goto-position file line col unstaged))
- (when staged
- (magit-diff--goto-position file line col staged))))))))
- buf))
-
-(defun magit-status-refresh-buffer ()
- (magit-git-exit-code "update-index" "--refresh")
- (magit-insert-section (status)
- (magit-run-section-hook 'magit-status-sections-hook)))
-
-(defun magit-status-goto-initial-section ()
- "In a `magit-status-mode' buffer, jump `magit-status-initial-section'.
-Actually doing so is deferred until `magit-refresh-buffer-hook'
-runs `magit-status-goto-initial-section-1'. That function then
-removes itself from the hook, so that this only happens when the
-status buffer is first created."
- (when (and magit-status-initial-section
- (derived-mode-p 'magit-status-mode))
- (add-hook 'magit-refresh-buffer-hook
- 'magit-status-goto-initial-section-1 nil t)))
-
-(defun magit-status-goto-initial-section-1 ()
- "In a `magit-status-mode' buffer, jump `magit-status-initial-section'.
-This function removes itself from `magit-refresh-buffer-hook'."
- (when-let ((section
- (--some (if (integerp it)
- (nth (1- it)
- (magit-section-siblings (magit-current-section)
- 'next))
- (magit-get-section it))
- magit-status-initial-section)))
- (goto-char (oref section start))
- (when-let ((vis (cdr (assq 'magit-status-initial-section
- magit-section-initial-visibility-alist))))
- (if (eq vis 'hide)
- (magit-section-hide section)
- (magit-section-show section))))
- (remove-hook 'magit-refresh-buffer-hook
- 'magit-status-goto-initial-section-1 t))
-
-(defun magit-status-maybe-update-revision-buffer (&optional _)
- "When moving in the status buffer, update the revision buffer.
-If there is no revision buffer in the same frame, then do nothing."
- (when (derived-mode-p 'magit-status-mode)
- (magit--maybe-update-revision-buffer)))
-
-(defun magit-status-maybe-update-stash-buffer (&optional _)
- "When moving in the status buffer, update the stash buffer.
-If there is no stash buffer in the same frame, then do nothing."
- (when (derived-mode-p 'magit-status-mode)
- (magit--maybe-update-stash-buffer)))
-
-(defun magit-status-maybe-update-blob-buffer (&optional _)
- "When moving in the status buffer, update the blob buffer.
-If there is no blob buffer in the same frame, then do nothing."
- (when (derived-mode-p 'magit-status-mode)
- (magit--maybe-update-blob-buffer)))
-
-;;; Sections
-;;;; Special Headers
-
-(defun magit-insert-status-headers ()
- "Insert header sections appropriate for `magit-status-mode' buffers.
-The sections are inserted by running the functions on the hook
-`magit-status-headers-hook'."
- (if (magit-rev-verify "HEAD")
- (magit-insert-headers 'magit-status-headers-hook)
- (insert "In the beginning there was darkness\n\n")))
-
-(defvar magit-error-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-process-buffer)
- map)
- "Keymap for `error' sections.")
-
-(defun magit-insert-error-header ()
- "Insert the message about the Git error that just occurred.
-
-This function is only aware of the last error that occur when Git
-was run for side-effects. If, for example, an error occurs while
-generating a diff, then that error won't be inserted. Refreshing
-the status buffer causes this section to disappear again."
- (when magit-this-error
- (magit-insert-section (error 'git)
- (insert (propertize (format "%-10s" "GitError! ")
- 'font-lock-face 'magit-section-heading))
- (insert (propertize magit-this-error
- 'font-lock-face 'font-lock-warning-face))
- (when-let ((key (car (where-is-internal 'magit-process-buffer))))
- (insert (format " [Type `%s' for details]" (key-description key))))
- (insert ?\n))
- (setq magit-this-error nil)))
-
-(defun magit-insert-diff-filter-header ()
- "Insert a header line showing the effective diff filters."
- (let ((ignore-modules (magit-ignore-submodules-p)))
- (when (or ignore-modules
- magit-buffer-diff-files)
- (insert (propertize (format "%-10s" "Filter! ")
- 'font-lock-face 'magit-section-heading))
- (when ignore-modules
- (insert ignore-modules)
- (when magit-buffer-diff-files
- (insert " -- ")))
- (when magit-buffer-diff-files
- (insert (mapconcat #'identity magit-buffer-diff-files " ")))
- (insert ?\n))))
-
-;;;; Reference Headers
-
-(defun magit-insert-head-branch-header (&optional branch)
- "Insert a header line about the current branch.
-If `HEAD' is detached, then insert information about that commit
-instead. The optional BRANCH argument is for internal use only."
- (let ((branch (or branch (magit-get-current-branch)))
- (output (magit-rev-format "%h %s" (or branch "HEAD"))))
- (string-match "^\\([^ ]+\\) \\(.*\\)" output)
- (magit-bind-match-strings (commit summary) output
- (when (equal summary "")
- (setq summary "(no commit message)"))
- (if branch
- (magit-insert-section (branch branch)
- (insert (format "%-10s" "Head: "))
- (when magit-status-show-hashes-in-headers
- (insert (propertize commit 'font-lock-face 'magit-hash) ?\s))
- (insert (propertize branch 'font-lock-face 'magit-branch-local))
- (insert ?\s)
- (insert (funcall magit-log-format-message-function branch summary))
- (insert ?\n))
- (magit-insert-section (commit commit)
- (insert (format "%-10s" "Head: "))
- (insert (propertize commit 'font-lock-face 'magit-hash))
- (insert ?\s)
- (insert (funcall magit-log-format-message-function nil summary))
- (insert ?\n))))))
-
-(defun magit-insert-upstream-branch-header (&optional branch upstream keyword)
- "Insert a header line about the upstream of the current branch.
-If no branch is checked out, then insert nothing. The optional
-arguments are for internal use only."
- (when-let ((branch (or branch (magit-get-current-branch))))
- (let ((remote (magit-get "branch" branch "remote"))
- (merge (magit-get "branch" branch "merge"))
- (rebase (magit-get "branch" branch "rebase")))
- (when (or remote merge)
- (unless upstream
- (setq upstream (magit-get-upstream-branch branch)))
- (magit-insert-section (branch upstream)
- (pcase rebase
- ("true")
- ("false" (setq rebase nil))
- (_ (setq rebase (magit-get-boolean "pull.rebase"))))
- (insert (format "%-10s" (or keyword (if rebase "Rebase: " "Merge: "))))
- (insert
- (if upstream
- (concat (and magit-status-show-hashes-in-headers
- (concat (propertize (magit-rev-format "%h" upstream)
- 'font-lock-face 'magit-hash)
- " "))
- upstream " "
- (funcall magit-log-format-message-function upstream
- (funcall magit-log-format-message-function nil
- (or (magit-rev-format "%s" upstream)
- "(no commit message)"))))
- (cond
- ((magit--unnamed-upstream-p remote merge)
- (concat (propertize merge 'font-lock-face 'magit-branch-remote)
- " from "
- (propertize remote 'font-lock-face 'bold)))
- ((magit--valid-upstream-p remote merge)
- (if (equal remote ".")
- (concat
- (propertize merge 'font-lock-face 'magit-branch-local)
- (propertize " does not exist"
- 'font-lock-face 'font-lock-warning-face))
- (concat
- (propertize merge 'font-lock-face 'magit-branch-remote)
- (propertize " does not exist on "
- 'font-lock-face 'font-lock-warning-face)
- (propertize remote 'font-lock-face 'magit-branch-remote))))
- (t
- (propertize "invalid upstream configuration"
- 'font-lock-face 'font-lock-warning-face)))))
- (insert ?\n))))))
-
-(defun magit-insert-push-branch-header ()
- "Insert a header line about the branch the current branch is pushed to."
- (when-let ((branch (magit-get-current-branch))
- (target (magit-get-push-branch branch)))
- (magit-insert-section (branch target)
- (insert (format "%-10s" "Push: "))
- (insert
- (if (magit-rev-verify target)
- (concat target " "
- (and magit-status-show-hashes-in-headers
- (concat (propertize (magit-rev-format "%h" target)
- 'font-lock-face 'magit-hash)
- " "))
- (funcall magit-log-format-message-function target
- (funcall magit-log-format-message-function nil
- (or (magit-rev-format "%s" target)
- "(no commit message)"))))
- (let ((remote (magit-get-push-remote branch)))
- (if (magit-remote-p remote)
- (concat target
- (propertize " does not exist"
- 'font-lock-face 'font-lock-warning-face))
- (concat remote
- (propertize " remote does not exist"
- 'font-lock-face 'font-lock-warning-face))))))
- (insert ?\n))))
-
-(defun magit-insert-tags-header ()
- "Insert a header line about the current and/or next tag."
- (let* ((this-tag (magit-get-current-tag nil t))
- (next-tag (magit-get-next-tag nil t))
- (this-cnt (cadr this-tag))
- (next-cnt (cadr next-tag))
- (this-tag (car this-tag))
- (next-tag (car next-tag))
- (both-tags (and this-tag next-tag t)))
- (when (or this-tag next-tag)
- (magit-insert-section (tag (or this-tag next-tag))
- (insert (format "%-10s" (if both-tags "Tags: " "Tag: ")))
- (cl-flet ((insert-count
- (tag count face)
- (insert (concat (propertize tag 'font-lock-face 'magit-tag)
- (and (> count 0)
- (format " (%s)"
- (propertize
- (format "%s" count)
- 'font-lock-face face)))))))
- (when this-tag (insert-count this-tag this-cnt 'magit-branch-local))
- (when both-tags (insert ", "))
- (when next-tag (insert-count next-tag next-cnt 'magit-tag)))
- (insert ?\n)))))
-
-;;;; Auxiliary Headers
-
-(defun magit-insert-user-header ()
- "Insert a header line about the current user."
- (let ((name (magit-get "user.name"))
- (email (magit-get "user.email")))
- (when (and name email)
- (magit-insert-section (user name)
- (insert (format "%-10s" "User: "))
- (insert (propertize name 'font-lock-face 'magit-log-author))
- (insert " <" email ">\n")))))
-
-(defun magit-insert-repo-header ()
- "Insert a header line showing the path to the repository top-level."
- (let ((topdir (magit-toplevel)))
- (magit-insert-section (repo topdir)
- (insert (format "%-10s%s\n" "Repo: " (abbreviate-file-name topdir))))))
-
-(defun magit-insert-remote-header ()
- "Insert a header line about the remote of the current branch.
-
-If no remote is configured for the current branch, then fall back
-showing the \"origin\" remote, or if that does not exist the first
-remote in alphabetic order."
- (when-let ((name (magit-get-some-remote))
- ;; Under certain configurations it's possible for url
- ;; to be nil, when name is not, see #2858.
- (url (magit-get "remote" name "url")))
- (magit-insert-section (remote name)
- (insert (format "%-10s" "Remote: "))
- (insert (propertize name 'font-lock-face 'magit-branch-remote) ?\s)
- (insert url ?\n))))
-
-;;;; File Sections
-
-(defvar magit-untracked-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-delete-thing] 'magit-discard)
- (define-key map "s" 'magit-stage)
- map)
- "Keymap for the `untracked' section.")
-
-(magit-define-section-jumper magit-jump-to-untracked "Untracked files" untracked)
-
-(defun magit-insert-untracked-files ()
- "Maybe insert a list or tree of untracked files.
-
-Do so depending on the value of `status.showUntrackedFiles'.
-Note that even if the value is `all', Magit still initially
-only shows directories. But the directory sections can then
-be expanded using \"TAB\".
-
-If the first element of `magit-buffer-diff-files' is a
-directory, then limit the list to files below that. The value
-value of that variable can be set using \"D -- DIRECTORY RET g\"."
- (let* ((show (or (magit-get "status.showUntrackedFiles") "normal"))
- (base (car magit-buffer-diff-files))
- (base (and base (file-directory-p base) base)))
- (unless (equal show "no")
- (if (equal show "all")
- (when-let ((files (magit-untracked-files nil base)))
- (magit-insert-section (untracked)
- (magit-insert-heading "Untracked files:")
- (magit-insert-files files base)
- (insert ?\n)))
- (when-let ((files
- (--mapcat (and (eq (aref it 0) ??)
- (list (substring it 3)))
- (magit-git-items "status" "-z" "--porcelain"
- (magit-ignore-submodules-p t)
- "--" base))))
- (magit-insert-section (untracked)
- (magit-insert-heading "Untracked files:")
- (dolist (file files)
- (magit-insert-section (file file)
- (insert (propertize file 'font-lock-face 'magit-filename) ?\n)))
- (insert ?\n)))))))
-
-(magit-define-section-jumper magit-jump-to-tracked "Tracked files" tracked)
-
-(defun magit-insert-tracked-files ()
- "Insert a tree of tracked files.
-
-If the first element of `magit-buffer-diff-files' is a
-directory, then limit the list to files below that. The value
-value of that variable can be set using \"D -- DIRECTORY RET g\"."
- (when-let ((files (magit-list-files)))
- (let* ((base (car magit-buffer-diff-files))
- (base (and base (file-directory-p base) base)))
- (magit-insert-section (tracked nil t)
- (magit-insert-heading "Tracked files:")
- (magit-insert-files files base)
- (insert ?\n)))))
-
-(defun magit-insert-ignored-files ()
- "Insert a tree of ignored files.
-
-If the first element of `magit-buffer-diff-files' is a
-directory, then limit the list to files below that. The value
-of that variable can be set using \"D -- DIRECTORY RET g\"."
- (when-let ((files (magit-ignored-files)))
- (let* ((base (car magit-buffer-diff-files))
- (base (and base (file-directory-p base) base)))
- (magit-insert-section (tracked nil t)
- (magit-insert-heading "Ignored files:")
- (magit-insert-files files base)
- (insert ?\n)))))
-
-(magit-define-section-jumper magit-jump-to-skip-worktree "Skip-worktree files" skip-worktree)
-
-(defun magit-insert-skip-worktree-files ()
- "Insert a tree of skip-worktree files.
-
-If the first element of `magit-buffer-diff-files' is a
-directory, then limit the list to files below that. The value
-of that variable can be set using \"D -- DIRECTORY RET g\"."
- (when-let ((files (magit-skip-worktree-files)))
- (let* ((base (car magit-buffer-diff-files))
- (base (and base (file-directory-p base) base)))
- (magit-insert-section (skip-worktree nil t)
- (magit-insert-heading "Skip-worktree files:")
- (magit-insert-files files base)
- (insert ?\n)))))
-
-(magit-define-section-jumper magit-jump-to-assume-unchanged "Assume-unchanged files" assume-unchanged)
-
-(defun magit-insert-assume-unchanged-files ()
- "Insert a tree of files that are assumed to be unchanged.
-
-If the first element of `magit-buffer-diff-files' is a
-directory, then limit the list to files below that. The value
-of that variable can be set using \"D -- DIRECTORY RET g\"."
- (when-let ((files (magit-assume-unchanged-files)))
- (let* ((base (car magit-buffer-diff-files))
- (base (and base (file-directory-p base) base)))
- (magit-insert-section (assume-unchanged nil t)
- (magit-insert-heading "Assume-unchanged files:")
- (magit-insert-files files base)
- (insert ?\n)))))
-
-(defun magit-insert-files (files directory)
- (while (and files (string-prefix-p (or directory "") (car files)))
- (let ((dir (file-name-directory (car files))))
- (if (equal dir directory)
- (let ((file (pop files)))
- (magit-insert-section (file file)
- (insert (propertize file 'font-lock-face 'magit-filename) ?\n)))
- (magit-insert-section (file dir t)
- (insert (propertize dir 'file 'magit-filename) ?\n)
- (magit-insert-heading)
- (setq files (magit-insert-files files dir))))))
- files)
-
-;;; _
-(provide 'magit-status)
-;;; magit-status.el ends here
diff --git a/elpa/magit-20200728.45/magit-submodule.el b/elpa/magit-20200728.45/magit-submodule.el
deleted file mode 100644
index ca15417..0000000
--- a/elpa/magit-20200728.45/magit-submodule.el
+++ /dev/null
@@ -1,664 +0,0 @@
-;;; magit-submodule.el --- submodule support for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2011-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit)
-
-(defvar x-stretch-cursor)
-;;; Options
-
-(defcustom magit-module-sections-hook
- '(magit-insert-modules-overview
- magit-insert-modules-unpulled-from-upstream
- magit-insert-modules-unpulled-from-pushremote
- magit-insert-modules-unpushed-to-upstream
- magit-insert-modules-unpushed-to-pushremote)
- "Hook run by `magit-insert-modules'.
-
-That function isn't part of `magit-status-sections-hook's default
-value, so you have to add it yourself for this hook to have any
-effect."
- :package-version '(magit . "2.11.0")
- :group 'magit-status
- :type 'hook)
-
-(defcustom magit-module-sections-nested t
- "Whether `magit-insert-modules' wraps inserted sections.
-
-If this is non-nil, then only a single top-level section
-is inserted. If it is nil, then all sections listed in
-`magit-module-sections-hook' become top-level sections."
- :package-version '(magit . "2.11.0")
- :group 'magit-status
- :type 'boolean)
-
-(defcustom magit-submodule-list-mode-hook '(hl-line-mode)
- "Hook run after entering Magit-Submodule-List mode."
- :package-version '(magit . "2.9.0")
- :group 'magit-repolist
- :type 'hook
- :get 'magit-hook-custom-get
- :options '(hl-line-mode))
-
-(defcustom magit-submodule-list-columns
- '(("Path" 25 magit-modulelist-column-path nil)
- ("Version" 25 magit-repolist-column-version nil)
- ("Branch" 20 magit-repolist-column-branch nil)
- ("B<U" 3 magit-repolist-column-unpulled-from-upstream ((:right-align t)))
- ("B>U" 3 magit-repolist-column-unpushed-to-upstream ((:right-align t)))
- ("B<P" 3 magit-repolist-column-unpulled-from-pushremote ((:right-align t)))
- ("B>P" 3 magit-repolist-column-unpushed-to-pushremote ((:right-align t)))
- ("B" 3 magit-repolist-column-branches ((:right-align t)))
- ("S" 3 magit-repolist-column-stashes ((:right-align t))))
- "List of columns displayed by `magit-list-submodules'.
-
-Each element has the form (HEADER WIDTH FORMAT PROPS).
-
-HEADER is the string displayed in the header. WIDTH is the width
-of the column. FORMAT is a function that is called with one
-argument, the repository identification (usually its basename),
-and with `default-directory' bound to the toplevel of its working
-tree. It has to return a string to be inserted or nil. PROPS is
-an alist that supports the keys `:right-align' and `:pad-right'."
- :package-version '(magit . "2.8.0")
- :group 'magit-repolist-mode
- :type `(repeat (list :tag "Column"
- (string :tag "Header Label")
- (integer :tag "Column Width")
- (function :tag "Inserter Function")
- (repeat :tag "Properties"
- (list (choice :tag "Property"
- (const :right-align)
- (const :pad-right)
- (symbol))
- (sexp :tag "Value"))))))
-
-(defcustom magit-submodule-remove-trash-gitdirs nil
- "Whether `magit-submodule-remove' offers to trash module gitdirs.
-
-If this is nil, then that command does not offer to do so unless
-a prefix argument is used. When this is t, then it does offer to
-do so even without a prefix argument.
-
-In both cases the action still has to be confirmed unless that is
-disabled using the option `magit-no-confirm'. Doing the latter
-and also setting this variable to t will lead to tears."
- :package-version '(magit . "2.90.0")
- :group 'magit-commands
- :type 'boolean)
-
-;;; Popup
-
-;;;###autoload (autoload 'magit-submodule "magit-submodule" nil t)
-(transient-define-prefix magit-submodule ()
- "Act on a submodule."
- :man-page "git-submodule"
- ["Arguments"
- ("-f" "Force" ("-f" "--force"))
- ("-r" "Recursive" "--recursive")
- ("-N" "Do not fetch" ("-N" "--no-fetch"))
- ("-C" "Checkout tip" "--checkout")
- ("-R" "Rebase onto tip" "--rebase")
- ("-M" "Merge tip" "--merge")
- ("-U" "Use upstream tip" "--remote")]
- ["One module actions"
- ("a" magit-submodule-add)
- ("r" magit-submodule-register)
- ("p" magit-submodule-populate)
- ("u" magit-submodule-update)
- ("s" magit-submodule-synchronize)
- ("d" magit-submodule-unpopulate)
- ("k" "Remove" magit-submodule-remove)]
- ["All modules actions"
- ("l" "List all modules" magit-list-submodules)
- ("f" "Fetch all modules" magit-fetch-modules)])
-
-(defun magit-submodule-arguments (&rest filters)
- (--filter (and (member it filters) it)
- (transient-args 'magit-submodule)))
-
-(defclass magit--git-submodule-suffix (transient-suffix)
- ())
-
-(cl-defmethod transient-format-description ((obj magit--git-submodule-suffix))
- (let ((value (delq nil (mapcar 'transient-infix-value transient--suffixes))))
- (replace-regexp-in-string
- "\\[--[^]]+\\]"
- (lambda (match)
- (format (propertize "[%s]" 'face 'transient-inactive-argument)
- (mapconcat (lambda (arg)
- (propertize arg 'face
- (if (member arg value)
- 'transient-argument
- 'transient-inactive-argument)))
- (save-match-data
- (split-string (substring match 1 -1) "|"))
- (propertize "|" 'face 'transient-inactive-argument))))
- (cl-call-next-method obj))))
-
-;;;###autoload (autoload 'magit-submodule-add "magit-submodule" nil t)
-(transient-define-suffix magit-submodule-add (url &optional path name args)
- "Add the repository at URL as a module.
-
-Optional PATH is the path to the module relative to the root of
-the superproject. If it is nil, then the path is determined
-based on the URL. Optional NAME is the name of the module. If
-it is nil, then PATH also becomes the name."
- :class 'magit--git-submodule-suffix
- :description "Add git submodule add [--force]"
- (interactive
- (magit-with-toplevel
- (let* ((url (magit-read-string-ns "Add submodule (remote url)"))
- (path (let ((read-file-name-function
- (if (or (eq read-file-name-function 'ido-read-file-name)
- (advice-function-member-p
- 'ido-read-file-name
- read-file-name-function))
- ;; The Ido variant doesn't work properly here.
- #'read-file-name-default
- read-file-name-function)))
- (directory-file-name
- (file-relative-name
- (read-directory-name
- "Add submodules at path: " nil nil nil
- (and (string-match "\\([^./]+\\)\\(\\.git\\)?$" url)
- (match-string 1 url))))))))
- (list url
- (directory-file-name path)
- (magit-submodule-read-name-for-path path)
- (magit-submodule-arguments "--force")))))
- (magit-submodule-add-1 url path name args))
-
-(defun magit-submodule-add-1 (url &optional path name args)
- (magit-with-toplevel
- (magit-submodule--maybe-reuse-gitdir name path)
- (magit-run-git-async "submodule" "add"
- (and name (list "--name" name))
- args "--" url path)
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (if (> (process-exit-status process) 0)
- (magit-process-sentinel process event)
- (process-put process 'inhibit-refresh t)
- (magit-process-sentinel process event)
- (unless (version< (magit-git-version) "2.12.0")
- (magit-call-git "submodule" "absorbgitdirs" path))
- (magit-refresh)))))))
-
-;;;###autoload
-(defun magit-submodule-read-name-for-path (path &optional prefer-short)
- (let* ((path (directory-file-name (file-relative-name path)))
- (name (file-name-nondirectory path)))
- (push (if prefer-short path name) minibuffer-history)
- (magit-read-string-ns
- "Submodule name" nil (cons 'minibuffer-history 2)
- (or (--keep (pcase-let ((`(,var ,val) (split-string it "=")))
- (and (equal val path)
- (cadr (split-string var "\\."))))
- (magit-git-lines "config" "--list" "-f" ".gitmodules"))
- (if prefer-short name path)))))
-
-;;;###autoload (autoload 'magit-submodule-register "magit-submodule" nil t)
-(transient-define-suffix magit-submodule-register (modules)
- "Register MODULES.
-
-With a prefix argument act on all suitable modules. Otherwise,
-if the region selects modules, then act on those. Otherwise, if
-there is a module at point, then act on that. Otherwise read a
-single module from the user."
- ;; This command and the underlying "git submodule init" do NOT
- ;; "initialize" modules. They merely "register" modules in the
- ;; super-projects $GIT_DIR/config file, the purpose of which is to
- ;; allow users to change such values before actually initializing
- ;; the modules.
- :description "Register git submodule init"
- (interactive
- (list (magit-module-confirm "Register" 'magit-module-no-worktree-p)))
- (magit-with-toplevel
- (magit-run-git-async "submodule" "init" "--" modules)))
-
-;;;###autoload (autoload 'magit-submodule-populate "magit-submodule" nil t)
-(transient-define-suffix magit-submodule-populate (modules)
- "Create MODULES working directories, checking out the recorded commits.
-
-With a prefix argument act on all suitable modules. Otherwise,
-if the region selects modules, then act on those. Otherwise, if
-there is a module at point, then act on that. Otherwise read a
-single module from the user."
- ;; This is the command that actually "initializes" modules.
- ;; A module is initialized when it has a working directory,
- ;; a gitlink, and a .gitmodules entry.
- :description "Populate git submodule update --init"
- (interactive
- (list (magit-module-confirm "Populate" 'magit-module-no-worktree-p)))
- (magit-with-toplevel
- (magit-run-git-async "submodule" "update" "--init" "--" modules)))
-
-;;;###autoload (autoload 'magit-submodule-update "magit-submodule" nil t)
-(transient-define-suffix magit-submodule-update (modules args)
- "Update MODULES by checking out the recorded commits.
-
-With a prefix argument act on all suitable modules. Otherwise,
-if the region selects modules, then act on those. Otherwise, if
-there is a module at point, then act on that. Otherwise read a
-single module from the user."
- ;; Unlike `git-submodule's `update' command ours can only update
- ;; "initialized" modules by checking out other commits but not
- ;; "initialize" modules by creating the working directories.
- ;; To do the latter we provide the "setup" command.
- :class 'magit--git-submodule-suffix
- :description "Update git submodule update [--force] [--no-fetch]
- [--remote] [--recursive] [--checkout|--rebase|--merge]"
- (interactive
- (list (magit-module-confirm "Update" 'magit-module-worktree-p)
- (magit-submodule-arguments
- "--force" "--remote" "--recursive" "--checkout" "--rebase" "--merge"
- "--no-fetch")))
- (magit-with-toplevel
- (magit-run-git-async "submodule" "update" args "--" modules)))
-
-;;;###autoload (autoload 'magit-submodule-synchronize "magit-submodule" nil t)
-(transient-define-suffix magit-submodule-synchronize (modules args)
- "Synchronize url configuration of MODULES.
-
-With a prefix argument act on all suitable modules. Otherwise,
-if the region selects modules, then act on those. Otherwise, if
-there is a module at point, then act on that. Otherwise read a
-single module from the user."
- :class 'magit--git-submodule-suffix
- :description "Synchronize git submodule sync [--recursive]"
- (interactive
- (list (magit-module-confirm "Synchronize" 'magit-module-worktree-p)
- (magit-submodule-arguments "--recursive")))
- (magit-with-toplevel
- (magit-run-git-async "submodule" "sync" args "--" modules)))
-
-;;;###autoload (autoload 'magit-submodule-unpopulate "magit-submodule" nil t)
-(transient-define-suffix magit-submodule-unpopulate (modules args)
- "Remove working directories of MODULES.
-
-With a prefix argument act on all suitable modules. Otherwise,
-if the region selects modules, then act on those. Otherwise, if
-there is a module at point, then act on that. Otherwise read a
-single module from the user."
- ;; Even though a package is "uninitialized" (it has no worktree)
- ;; the super-projects $GIT_DIR/config may never-the-less set the
- ;; module's url. This may happen if you `deinit' and then `init'
- ;; to register (NOT initialize). Because the purpose of `deinit'
- ;; is to remove the working directory AND to remove the url, this
- ;; command does not limit itself to modules that have no working
- ;; directory.
- :class 'magit--git-submodule-suffix
- :description "Unpopulate git submodule deinit [--force]"
- (interactive
- (list (magit-module-confirm "Unpopulate")
- (magit-submodule-arguments "--force")))
- (magit-with-toplevel
- (magit-run-git-async "submodule" "deinit" args "--" modules)))
-
-;;;###autoload
-(defun magit-submodule-remove (modules args trash-gitdirs)
- "Unregister MODULES and remove their working directories.
-
-For safety reasons, do not remove the gitdirs and if a module has
-uncommitted changes, then do not remove it at all. If a module's
-gitdir is located inside the working directory, then move it into
-the gitdir of the superproject first.
-
-With the \"--force\" argument offer to remove dirty working
-directories and with a prefix argument offer to delete gitdirs.
-Both actions are very dangerous and have to be confirmed. There
-are additional safety precautions in place, so you might be able
-to recover from making a mistake here, but don't count on it."
- (interactive
- (list (if-let ((modules (magit-region-values 'magit-module-section t)))
- (magit-confirm 'remove-modules nil "Remove %i modules" nil modules)
- (list (magit-read-module-path "Remove module")))
- (magit-submodule-arguments "--force")
- current-prefix-arg))
- (when (version< (magit-git-version) "2.12.0")
- (error "This command requires Git v2.12.0"))
- (when magit-submodule-remove-trash-gitdirs
- (setq trash-gitdirs t))
- (magit-with-toplevel
- (when-let
- ((modified
- (-filter (lambda (module)
- (let ((default-directory (file-name-as-directory
- (expand-file-name module))))
- (and (cddr (directory-files default-directory))
- (magit-anything-modified-p))))
- modules)))
- (if (member "--force" args)
- (if (magit-confirm 'remove-dirty-modules
- "Remove dirty module %s"
- "Remove %i dirty modules"
- t modified)
- (dolist (module modified)
- (let ((default-directory (file-name-as-directory
- (expand-file-name module))))
- (magit-git "stash" "push"
- "-m" "backup before removal of this module")))
- (setq modules (cl-set-difference modules modified)))
- (if (cdr modified)
- (message "Omitting %s modules with uncommitted changes: %s"
- (length modified)
- (mapconcat #'identity modified ", "))
- (message "Omitting module %s, it has uncommitted changes"
- (car modified)))
- (setq modules (cl-set-difference modules modified))))
- (when modules
- (let ((alist
- (and trash-gitdirs
- (--map (split-string it "\0")
- (magit-git-lines "submodule" "foreach" "-q"
- "printf \"$sm_path\\0$name\n\"")))))
- (magit-git "submodule" "absorbgitdirs" "--" modules)
- (magit-git "submodule" "deinit" args "--" modules)
- (magit-git "rm" args "--" modules)
- (when (and trash-gitdirs
- (magit-confirm 'trash-module-gitdirs
- "Trash gitdir of module %s"
- "Trash gitdirs of %i modules"
- t modules))
- (dolist (module modules)
- (if-let ((name (cadr (assoc module alist))))
- ;; Disregard if `magit-delete-by-moving-to-trash'
- ;; is nil. Not doing so would be too dangerous.
- (delete-directory (magit-git-dir
- (convert-standard-filename
- (concat "modules/" name)))
- t t)
- (error "BUG: Weird module name and/or path for %s" module)))))
- (magit-refresh))))
-
-;;; Sections
-
-;;;###autoload
-(defun magit-insert-modules ()
- "Insert submodule sections.
-Hook `magit-module-sections-hook' controls which module sections
-are inserted, and option `magit-module-sections-nested' controls
-whether they are wrapped in an additional section."
- (when-let ((modules (magit-list-module-paths)))
- (if magit-module-sections-nested
- (magit-insert-section (modules nil t)
- (magit-insert-heading
- (format "%s (%s)"
- (propertize "Modules"
- 'font-lock-face 'magit-section-heading)
- (length modules)))
- (magit-insert-section-body
- (magit--insert-modules)))
- (magit--insert-modules))))
-
-(defun magit--insert-modules (&optional _section)
- (magit-run-section-hook 'magit-module-sections-hook))
-
-;;;###autoload
-(defun magit-insert-modules-overview ()
- "Insert sections for all modules.
-For each section insert the path and the output of `git describe --tags',
-or, failing that, the abbreviated HEAD commit hash."
- (when-let ((modules (magit-list-module-paths)))
- (magit-insert-section (modules nil t)
- (magit-insert-heading
- (format "%s (%s)"
- (propertize "Modules overview"
- 'font-lock-face 'magit-section-heading)
- (length modules)))
- (magit-insert-section-body
- (magit--insert-modules-overview)))))
-
-(defvar magit-modules-overview-align-numbers t)
-
-(defun magit--insert-modules-overview (&optional _section)
- (magit-with-toplevel
- (let* ((modules (magit-list-module-paths))
- (path-format (format "%%-%is "
- (min (apply 'max (mapcar 'length modules))
- (/ (window-width) 2))))
- (branch-format (format "%%-%is " (min 25 (/ (window-width) 3)))))
- (dolist (module modules)
- (let ((default-directory
- (expand-file-name (file-name-as-directory module))))
- (magit-insert-section (magit-module-section module t)
- (insert (propertize (format path-format module)
- 'font-lock-face 'magit-diff-file-heading))
- (if (not (file-exists-p ".git"))
- (insert "(unpopulated)")
- (insert (format
- branch-format
- (--if-let (magit-get-current-branch)
- (propertize it 'font-lock-face 'magit-branch-local)
- (propertize "(detached)" 'font-lock-face 'warning))))
- (--if-let (magit-git-string "describe" "--tags")
- (progn (when (and magit-modules-overview-align-numbers
- (string-match-p "\\`[0-9]" it))
- (insert ?\s))
- (insert (propertize it 'font-lock-face 'magit-tag)))
- (--when-let (magit-rev-format "%h")
- (insert (propertize it 'font-lock-face 'magit-hash)))))
- (insert ?\n))))))
- (insert ?\n))
-
-(defvar magit-modules-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-list-submodules)
- map)
- "Keymap for `modules' sections.")
-
-(defvar magit-module-section-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-file-section-map)
- (define-key map (kbd "C-j") 'magit-submodule-visit)
- (define-key map [C-return] 'magit-submodule-visit)
- (define-key map [remap magit-visit-thing] 'magit-submodule-visit)
- (define-key map [remap magit-delete-thing] 'magit-submodule-unpopulate)
- (define-key map "K" 'magit-file-untrack)
- (define-key map "R" 'magit-file-rename)
- map)
- "Keymap for `module' sections.")
-
-(defun magit-submodule-visit (module &optional other-window)
- "Visit MODULE by calling `magit-status' on it.
-Offer to initialize MODULE if it's not checked out yet.
-With a prefix argument, visit in another window."
- (interactive (list (or (magit-section-value-if 'module)
- (magit-read-module-path "Visit module"))
- current-prefix-arg))
- (magit-with-toplevel
- (let ((path (expand-file-name module)))
- (cond
- ((file-exists-p (expand-file-name ".git" module))
- (magit-diff-visit-directory path other-window))
- ((y-or-n-p (format "Initialize submodule '%s' first?" module))
- (magit-run-git-async "submodule" "update" "--init" "--" module)
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (let ((magit-process-raise-error t))
- (magit-process-sentinel process event))
- (when (and (eq (process-status process) 'exit)
- (= (process-exit-status process) 0))
- (magit-diff-visit-directory path other-window)))))
- ((file-exists-p path)
- (dired-jump other-window (concat path "/.")))))))
-
-;;;###autoload
-(defun magit-insert-modules-unpulled-from-upstream ()
- "Insert sections for modules that haven't been pulled from the upstream.
-These sections can be expanded to show the respective commits."
- (magit--insert-modules-logs "Modules unpulled from @{upstream}"
- 'modules-unpulled-from-upstream
- "HEAD..@{upstream}"))
-
-;;;###autoload
-(defun magit-insert-modules-unpulled-from-pushremote ()
- "Insert sections for modules that haven't been pulled from the push-remote.
-These sections can be expanded to show the respective commits."
- (magit--insert-modules-logs "Modules unpulled from @{push}"
- 'modules-unpulled-from-pushremote
- "HEAD..@{push}"))
-
-;;;###autoload
-(defun magit-insert-modules-unpushed-to-upstream ()
- "Insert sections for modules that haven't been pushed to the upstream.
-These sections can be expanded to show the respective commits."
- (magit--insert-modules-logs "Modules unmerged into @{upstream}"
- 'modules-unpushed-to-upstream
- "@{upstream}..HEAD"))
-
-;;;###autoload
-(defun magit-insert-modules-unpushed-to-pushremote ()
- "Insert sections for modules that haven't been pushed to the push-remote.
-These sections can be expanded to show the respective commits."
- (magit--insert-modules-logs "Modules unpushed to @{push}"
- 'modules-unpushed-to-pushremote
- "@{push}..HEAD"))
-
-(defun magit--insert-modules-logs (heading type range)
- "For internal use, don't add to a hook."
- (unless (magit-ignore-submodules-p)
- (when-let ((modules (magit-list-module-paths)))
- (magit-insert-section section ((eval type) nil t)
- (string-match "\\`\\(.+\\) \\([^ ]+\\)\\'" heading)
- (magit-insert-heading
- (propertize (match-string 1 heading)
- 'font-lock-face 'magit-section-heading)
- " "
- (propertize (match-string 2 heading)
- 'font-lock-face 'magit-branch-remote)
- ":")
- (magit-with-toplevel
- (dolist (module modules)
- (when (magit-module-worktree-p module)
- (let ((default-directory
- (expand-file-name (file-name-as-directory module))))
- (when (magit-file-accessible-directory-p default-directory)
- (magit-insert-section sec (magit-module-section module t)
- (magit-insert-heading
- (propertize module
- 'font-lock-face 'magit-diff-file-heading)
- ":")
- (magit-git-wash
- (apply-partially 'magit-log-wash-log 'module)
- "-c" "push.default=current" "log" "--oneline" range)
- (when (> (point)
- (oref sec content))
- (delete-char -1))))))))
- (if (> (point)
- (oref section content))
- (insert ?\n)
- (magit-cancel-section))))))
-
-;;; List
-
-;;;###autoload
-(defun magit-list-submodules ()
- "Display a list of the current repository's submodules."
- (interactive)
- (magit-display-buffer
- (or (magit-get-mode-buffer 'magit-submodule-list-mode)
- (magit-with-toplevel
- (magit-generate-new-buffer 'magit-submodule-list-mode))))
- (magit-submodule-list-mode)
- (magit-submodule-list-refresh)
- (tabulated-list-print))
-
-(defvar magit-submodule-list-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map magit-repolist-mode-map)
- map)
- "Local keymap for Magit-Submodule-List mode buffers.")
-
-(define-derived-mode magit-submodule-list-mode tabulated-list-mode "Modules"
- "Major mode for browsing a list of Git submodules."
- :group 'magit-repolist-mode
- (setq-local x-stretch-cursor nil)
- (setq tabulated-list-padding 0)
- (setq tabulated-list-sort-key (cons "Path" nil))
- (setq tabulated-list-format
- (vconcat (mapcar (pcase-lambda (`(,title ,width ,_fn ,props))
- (nconc (list title width t)
- (-flatten props)))
- magit-submodule-list-columns)))
- (tabulated-list-init-header)
- (add-hook 'tabulated-list-revert-hook 'magit-submodule-list-refresh nil t)
- (setq imenu-prev-index-position-function
- #'magit-imenu--submodule-prev-index-position-function)
- (setq imenu-extract-index-name-function
- #'magit-imenu--submodule-extract-index-name-function))
-
-(defun magit-submodule-list-refresh ()
- (setq tabulated-list-entries
- (-keep (lambda (module)
- (let ((default-directory
- (expand-file-name (file-name-as-directory module))))
- (and (file-exists-p ".git")
- (list module
- (vconcat
- (--map (or (funcall (nth 2 it) module) "")
- magit-submodule-list-columns))))))
- (magit-list-module-paths))))
-
-(defun magit-modulelist-column-path (path)
- "Insert the relative path of the submodule."
- path)
-
-;;; Utilities
-
-(defun magit-submodule--maybe-reuse-gitdir (name path)
- (let ((gitdir
- (magit-git-dir (convert-standard-filename (concat "modules/" name)))))
- (when (and (file-exists-p gitdir)
- (not (file-exists-p path)))
- (pcase (read-char-choice
- (concat
- gitdir " already exists.\n"
- "Type [u] to use the existing gitdir and create the working tree\n"
- " [r] to rename the existing gitdir and clone again\n"
- " [t] to trash the existing gitdir and clone again\n"
- " [C-g] to abort ")
- '(?u ?r ?t))
- (?u (magit-submodule--restore-worktree (expand-file-name path) gitdir))
- (?r (rename-file gitdir (concat gitdir "-"
- (format-time-string "%F-%T"))))
- (?t (delete-directory gitdir t t))))))
-
-(defun magit-submodule--restore-worktree (worktree gitdir)
- (make-directory worktree t)
- (with-temp-file (expand-file-name ".git" worktree)
- (insert "gitdir: " (file-relative-name gitdir worktree) "\n"))
- (let ((default-directory worktree))
- (magit-call-git "reset" "--hard" "HEAD" "--")))
-
-;;; _
-(provide 'magit-submodule)
-;;; magit-submodule.el ends here
diff --git a/elpa/magit-20200728.45/magit-subtree.el b/elpa/magit-20200728.45/magit-subtree.el
deleted file mode 100644
index 005e07e..0000000
--- a/elpa/magit-20200728.45/magit-subtree.el
+++ /dev/null
@@ -1,182 +0,0 @@
-;;; magit-subtree.el --- subtree support for Magit -*- lexical-binding: t -*-
-
-;; Copyright (C) 2011-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-subtree "magit-subtree" nil t)
-(transient-define-prefix magit-subtree ()
- "Import or export subtrees."
- :man-page "git-subtree"
- ["Actions"
- ("i" "Import" magit-subtree-import)
- ("e" "Export" magit-subtree-export)])
-
-;;;###autoload (autoload 'magit-subtree-import "magit-subtree" nil t)
-(transient-define-prefix magit-subtree-import ()
- "Import subtrees."
- :man-page "git-subtree"
- ["Arguments"
- (magit-subtree:--prefix)
- (magit-subtree:--message)
- ("-s" "Squash" "--squash")]
- ["Actions"
- [("a" "Add" magit-subtree-add)
- ("c" "Add commit" magit-subtree-add-commit)]
- [("m" "Merge" magit-subtree-merge)
- ("f" "Pull" magit-subtree-pull)]])
-
-;;;###autoload (autoload 'magit-subtree-export "magit-subtree" nil t)
-(transient-define-prefix magit-subtree-export ()
- "Export subtrees."
- :man-page "git-subtree"
- ["Arguments"
- (magit-subtree:--prefix)
- (magit-subtree:--annotate)
- (magit-subtree:--branch)
- (magit-subtree:--onto)
- ("-i" "Ignore joins" "--ignore-joins")
- ("-j" "Rejoin" "--rejoin")]
- ["Actions"
- ("p" "Push" magit-subtree-push)
- ("s" "Split" magit-subtree-split)])
-
-(transient-define-argument magit-subtree:--prefix ()
- :description "Prefix"
- :class 'transient-option
- :shortarg "-P"
- :argument "--prefix="
- :reader 'magit-subtree-read-prefix)
-
-(defun magit-subtree-read-prefix (prompt &optional default _history)
- (let* ((insert-default-directory nil)
- (topdir (magit-toplevel))
- (prefix (read-directory-name (concat prompt ": ") topdir default)))
- (if (file-name-absolute-p prefix)
- ;; At least `ido-mode's variant is not compatible.
- (if (string-prefix-p topdir prefix)
- (file-relative-name prefix topdir)
- (user-error "%s isn't inside the repository at %s" prefix topdir))
- prefix)))
-
-(transient-define-argument magit-subtree:--message ()
- :description "Message"
- :class 'transient-option
- :shortarg "-m"
- :argument "--message=")
-
-(transient-define-argument magit-subtree:--annotate ()
- :description "Annotate"
- :class 'transient-option
- :key "-a"
- :argument "--annotate=")
-
-(transient-define-argument magit-subtree:--branch ()
- :description "Branch"
- :class 'transient-option
- :shortarg "-b"
- :argument "--branch=")
-
-(transient-define-argument magit-subtree:--onto ()
- :description "Onto"
- :class 'transient-option
- :key "-o"
- :argument "--onto="
- :reader 'magit-transient-read-revision)
-
-(defun magit-subtree-prefix (transient prompt)
- (--if-let (--first (string-prefix-p "--prefix=" it)
- (transient-args transient))
- (substring it 9)
- (magit-subtree-read-prefix prompt)))
-
-(defun magit-subtree-arguments (transient)
- (--remove (string-prefix-p "--prefix=" it)
- (transient-args transient)))
-
-(defun magit-git-subtree (subcmd prefix &rest args)
- (magit-run-git-async "subtree" subcmd (concat "--prefix=" prefix) args))
-
-;;;###autoload
-(defun magit-subtree-add (prefix repository ref args)
- "Add REF from REPOSITORY as a new subtree at PREFIX."
- (interactive
- (cons (magit-subtree-prefix 'magit-subtree-import "Add subtree")
- (let ((remote (magit-read-remote-or-url "From repository")))
- (list remote
- (magit-read-refspec "Ref" remote)
- (magit-subtree-arguments 'magit-subtree-import)))))
- (magit-git-subtree "add" prefix args repository ref))
-
-;;;###autoload
-(defun magit-subtree-add-commit (prefix commit args)
- "Add COMMIT as a new subtree at PREFIX."
- (interactive
- (list (magit-subtree-prefix 'magit-subtree-import "Add subtree")
- (magit-read-string-ns "Commit")
- (magit-subtree-arguments 'magit-subtree-import)))
- (magit-git-subtree "add" prefix args commit))
-
-;;;###autoload
-(defun magit-subtree-merge (prefix commit args)
- "Merge COMMIT into the PREFIX subtree."
- (interactive
- (list (magit-subtree-prefix 'magit-subtree-import "Merge into subtree")
- (magit-read-string-ns "Commit")
- (magit-subtree-arguments 'magit-subtree-import)))
- (magit-git-subtree "merge" prefix args commit))
-
-;;;###autoload
-(defun magit-subtree-pull (prefix repository ref args)
- "Pull REF from REPOSITORY into the PREFIX subtree."
- (interactive
- (cons (magit-subtree-prefix 'magit-subtree-import "Pull into subtree")
- (let ((remote (magit-read-remote-or-url "From repository")))
- (list remote
- (magit-read-refspec "Ref" remote)
- (magit-subtree-arguments 'magit-subtree-import)))))
- (magit-git-subtree "pull" prefix args repository ref))
-
-;;;###autoload
-(defun magit-subtree-push (prefix repository ref args)
- "Extract the history of the subtree PREFIX and push it to REF on REPOSITORY."
- (interactive (list (magit-subtree-prefix 'magit-subtree-export "Push subtree")
- (magit-read-remote-or-url "To repository")
- (magit-read-string-ns "To reference")
- (magit-subtree-arguments 'magit-subtree-export)))
- (magit-git-subtree "push" prefix args repository ref))
-
-;;;###autoload
-(defun magit-subtree-split (prefix commit args)
- "Extract the history of the subtree PREFIX."
- (interactive (list (magit-subtree-prefix 'magit-subtree-export "Split subtree")
- (magit-read-string-ns "Commit")
- (magit-subtree-arguments 'magit-subtree-export)))
- (magit-git-subtree "split" prefix args commit))
-
-;;; _
-(provide 'magit-subtree)
-;;; magit-subtree.el ends here
diff --git a/elpa/magit-20200728.45/magit-tag.el b/elpa/magit-20200728.45/magit-tag.el
deleted file mode 100644
index e49e17e..0000000
--- a/elpa/magit-20200728.45/magit-tag.el
+++ /dev/null
@@ -1,213 +0,0 @@
-;;; magit-tag.el --- tag functionality -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements tag commands.
-
-;;; Code:
-
-(require 'magit)
-
-;;;###autoload (autoload 'magit-tag "magit" nil t)
-(transient-define-prefix magit-tag ()
- "Create or delete a tag."
- :man-page "git-tag"
- ["Arguments"
- ("-f" "Force" ("-f" "--force"))
- ("-a" "Annotate" ("-a" "--annotate"))
- ("-s" "Sign" ("-s" "--sign"))
- (magit-tag:--local-user)]
- [["Create"
- ("t" "tag" magit-tag-create)
- ("r" "release" magit-tag-release)]
- ["Do"
- ("k" "delete" magit-tag-delete)
- ("p" "prune" magit-tag-prune)]])
-
-(defun magit-tag-arguments ()
- (transient-args 'magit-tag))
-
-(transient-define-argument magit-tag:--local-user ()
- :description "Sign as"
- :class 'transient-option
- :shortarg "-u"
- :argument "--local-user="
- :reader 'magit-read-gpg-secret-key
- :history-key 'magit:--gpg-sign)
-
-;;;###autoload
-(defun magit-tag-create (name rev &optional args)
- "Create a new tag with the given NAME at REV.
-With a prefix argument annotate the tag.
-\n(git tag [--annotate] NAME REV)"
- (interactive (list (magit-read-tag "Tag name")
- (magit-read-branch-or-commit "Place tag on")
- (let ((args (magit-tag-arguments)))
- (when current-prefix-arg
- (cl-pushnew "--annotate" args))
- args)))
- (magit-run-git-with-editor "tag" args name rev))
-
-;;;###autoload
-(defun magit-tag-delete (tags)
- "Delete one or more tags.
-If the region marks multiple tags (and nothing else), then offer
-to delete those, otherwise prompt for a single tag to be deleted,
-defaulting to the tag at point.
-\n(git tag -d TAGS)"
- (interactive (list (--if-let (magit-region-values 'tag)
- (magit-confirm t nil "Delete %i tags" nil it)
- (magit-read-tag "Delete tag" t))))
- (magit-run-git "tag" "-d" tags))
-
-;;;###autoload
-(defun magit-tag-prune (tags remote-tags remote)
- "Offer to delete tags missing locally from REMOTE, and vice versa."
- (interactive
- (let* ((remote (magit-read-remote "Prune tags using remote"))
- (tags (magit-list-tags))
- (rtags (prog2 (message "Determining remote tags...")
- (magit-remote-list-tags remote)
- (message "Determining remote tags...done")))
- (ltags (-difference tags rtags))
- (rtags (-difference rtags tags)))
- (unless (or ltags rtags)
- (message "Same tags exist locally and remotely"))
- (unless (magit-confirm t
- "Delete %s locally"
- "Delete %i tags locally"
- 'noabort ltags)
- (setq ltags nil))
- (unless (magit-confirm t
- "Delete %s from remote"
- "Delete %i tags from remote"
- 'noabort rtags)
- (setq rtags nil))
- (list ltags rtags remote)))
- (when tags
- (magit-call-git "tag" "-d" tags))
- (when remote-tags
- (magit-run-git-async "push" remote (--map (concat ":" it) remote-tags))))
-
-(defvar magit-tag-version-regexp-alist
- '(("^[-._+ ]?snapshot\\.?$" . -4)
- ("^[-._+]$" . -4)
- ("^[-._+ ]?\\(cvs\\|git\\|bzr\\|svn\\|hg\\|darcs\\)\\.?$" . -4)
- ("^[-._+ ]?unknown\\.?$" . -4)
- ("^[-._+ ]?alpha\\.?$" . -3)
- ("^[-._+ ]?beta\\.?$" . -2)
- ("^[-._+ ]?\\(pre\\|rc\\)\\.?$" . -1))
- "Overrides `version-regexp-alist' for `magit-tag-release'.
-See also `magit-release-tag-regexp'.")
-
-(defvar magit-release-tag-regexp "\\`\
-\\(?1:\\(?:v\\(?:ersion\\)?\\|r\\(?:elease\\)?\\)?[-_]?\\)?\
-\\(?2:[0-9]+\\(?:\\.[0-9]+\\)*\
-\\(?:-[a-zA-Z0-9-]+\\(?:\\.[a-zA-Z0-9-]+\\)*\\)?\\)\\'"
- "Regexp used by `magit-tag-release' to parse release tags.
-
-The first submatch must match the prefix, if any. The second
-submatch must match the version string.
-
-If this matches versions that are not dot separated numbers,
-then `magit-tag-version-regexp-alist' has to contain entries
-for the separators allowed here.")
-
-;;;###autoload
-(defun magit-tag-release (tag msg &optional args)
- "Create a release tag.
-
-Assume that release tags match `magit-release-tag-regexp'.
-
-First prompt for the name of the new tag using the highest
-existing tag as initial input and leaving it to the user to
-increment the desired part of the version string.
-
-If `--annotate' is enabled, then prompt for the message of the
-new tag. Base the proposed tag message on the message of the
-highest tag, provided that that contains the corresponding
-version string and substituting the new version string for that.
-Otherwise propose something like \"Foo-Bar 1.2.3\", given, for
-example, a TAG \"v1.2.3\" and a repository located at something
-like \"/path/to/foo-bar\"."
- (interactive
- (save-match-data
- (pcase-let*
- ((`(,pver ,ptag ,pmsg) (car (magit--list-releases)))
- (tag (read-string "Create release tag: " ptag))
- (ver (and (string-match magit-release-tag-regexp tag)
- (match-string 2 tag)))
- (args (magit-tag-arguments)))
- (list tag
- (and (member "--annotate" args)
- (read-string
- (format "Message for %S: " tag)
- (cond ((and pver (string-match (regexp-quote pver) pmsg))
- (replace-match ver t t pmsg))
- ((and ptag (string-match (regexp-quote ptag) pmsg))
- (replace-match tag t t pmsg))
- (t (format "%s %s"
- (capitalize
- (file-name-nondirectory
- (directory-file-name (magit-toplevel))))
- ver)))))
- args))))
- (magit-run-git-async "tag" args (and msg (list "-m" msg)) tag)
- (set-process-sentinel
- magit-this-process
- (lambda (process event)
- (when (memq (process-status process) '(exit signal))
- (magit-process-sentinel process event)
- (magit-refs-setup-buffer "HEAD" (magit-show-refs-arguments))))))
-
-(defun magit--list-releases ()
- "Return a list of releases.
-The list is ordered, beginning with the highest release.
-Each release element has the form (VERSION TAG MESSAGE).
-`magit-release-tag-regexp' is used to determine whether
-a tag qualifies as a release tag."
- (save-match-data
- (mapcar
- #'cdr
- (nreverse
- (cl-sort (cl-mapcan
- (lambda (line)
- (and (string-match " +" line)
- (let ((tag (substring line 0 (match-beginning 0)))
- (msg (substring line (match-end 0))))
- (and (string-match magit-release-tag-regexp tag)
- (let ((ver (match-string 2 tag))
- (version-regexp-alist
- magit-tag-version-regexp-alist))
- (list (list (version-to-list ver)
- ver tag msg)))))))
- ;; Cannot rely on "--sort=-version:refname" because
- ;; that gets confused if the version prefix has changed.
- (magit-git-lines "tag" "-n"))
- ;; The inverse of this function does not exist.
- #'version-list-< :key #'car)))))
-
-;;; _
-(provide 'magit-tag)
-;;; magit-tag.el ends here
diff --git a/elpa/magit-20200728.45/magit-transient.el b/elpa/magit-20200728.45/magit-transient.el
deleted file mode 100644
index 830eb50..0000000
--- a/elpa/magit-20200728.45/magit-transient.el
+++ /dev/null
@@ -1,202 +0,0 @@
-;;; magit-transient.el --- support for transients -*- lexical-binding: t -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements Magit-specific prefix and suffix classes,
-;; and their methods.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'transient)
-
-(require 'magit-git)
-(require 'magit-mode)
-(require 'magit-process)
-
-;;; Classes
-
-(defclass magit--git-variable (transient-variable)
- ((scope :initarg :scope)))
-
-(defclass magit--git-variable:choices (magit--git-variable)
- ((choices :initarg :choices)
- (fallback :initarg :fallback :initform nil)
- (default :initarg :default :initform nil)))
-
-(defclass magit--git-variable:urls (magit--git-variable)
- ((seturl-arg :initarg :seturl-arg :initform nil)))
-
-;;; Methods
-;;;; Init
-
-(cl-defmethod transient-init-scope ((obj magit--git-variable))
- (oset obj scope
- (cond (transient--prefix
- (oref transient--prefix scope))
- ((slot-boundp obj 'scope)
- (funcall (oref obj scope) obj)))))
-
-(cl-defmethod transient-init-value ((obj magit--git-variable))
- (let ((variable (format (oref obj variable)
- (oref obj scope))))
- (oset obj variable variable)
- (oset obj value
- (cond ((oref obj multi-value)
- (magit-get-all variable))
- (t
- (magit-git-string "config" "--local" variable))))))
-
-;;;; Read
-
-(cl-defmethod transient-infix-read :around ((obj magit--git-variable:urls))
- (mapcar (lambda (url)
- (if (string-prefix-p "~" url)
- (expand-file-name url)
- url))
- (cl-call-next-method obj)))
-
-(cl-defmethod transient-infix-read ((obj magit--git-variable:choices))
- (let ((choices (oref obj choices)))
- (when (functionp choices)
- (setq choices (funcall choices)))
- (if-let ((value (oref obj value)))
- (cadr (member value choices))
- (car choices))))
-
-;;;; Readers
-
-(defun magit-transient-read-person (prompt initial-input history)
- (magit-completing-read
- prompt
- (mapcar (lambda (line)
- (save-excursion
- (and (string-match "\\`[\s\t]+[0-9]+\t" line)
- (list (substring line (match-end 0))))))
- (magit-git-lines "shortlog" "-n" "-s" "-e" "HEAD"))
- nil nil initial-input history))
-
-(defun magit-transient-read-revision (prompt initial-input history)
- (or (magit-completing-read prompt (cons "HEAD" (magit-list-refnames))
- nil nil initial-input history
- (or (magit-branch-or-commit-at-point)
- (magit-get-current-branch)))
- (user-error "Nothing selected")))
-
-;;;; Set
-
-(cl-defmethod transient-infix-set ((obj magit--git-variable) value)
- (let ((variable (oref obj variable)))
- (oset obj value value)
- (if (oref obj multi-value)
- (magit-set-all value variable)
- (magit-set value variable))
- (magit-refresh)
- (unless (or value transient--prefix)
- (message "Unset %s" variable))))
-
-(cl-defmethod transient-infix-set ((obj magit--git-variable:urls) values)
- (let ((previous (oref obj value))
- (seturl (oref obj seturl-arg))
- (remote (oref transient--prefix scope)))
- (oset obj value values)
- (dolist (v (-difference values previous))
- (magit-call-git "remote" "set-url" seturl "--add" remote v))
- (dolist (v (-difference previous values))
- (magit-call-git "remote" "set-url" seturl "--delete" remote
- (concat "^" (regexp-quote v) "$")))
- (magit-refresh)))
-
-;;;; Draw
-
-(cl-defmethod transient-format-description ((obj magit--git-variable))
- (or (oref obj description)
- (oref obj variable)))
-
-(cl-defmethod transient-format-value ((obj magit--git-variable))
- (if-let ((value (oref obj value)))
- (if (oref obj multi-value)
- (if (cdr value)
- (mapconcat (lambda (v)
- (concat "\n "
- (propertize v 'face 'transient-value)))
- value "")
- (propertize (car value) 'face 'transient-value))
- (propertize (car (split-string value "\n"))
- 'face 'transient-value))
- (propertize "unset" 'face 'transient-inactive-value)))
-
-(cl-defmethod transient-format-value ((obj magit--git-variable:choices))
- (let* ((variable (oref obj variable))
- (choices (oref obj choices))
- (local (magit-git-string "config" "--local" variable))
- (global (magit-git-string "config" "--global" variable))
- (default (oref obj default))
- (fallback (oref obj fallback))
- (fallback (and fallback
- (when-let ((val (magit-get fallback)))
- (concat fallback ":" val)))))
- (when (functionp choices)
- (setq choices (funcall choices)))
- (concat
- (propertize "[" 'face 'transient-inactive-value)
- (mapconcat (lambda (choice)
- (propertize choice 'face (if (equal choice local)
- (if (member choice choices)
- 'transient-value
- 'font-lock-warning-face)
- 'transient-inactive-value)))
- (if (and local (not (member local choices)))
- (cons local choices)
- choices)
- (propertize "|" 'face 'transient-inactive-value))
- (and (or global fallback default)
- (concat
- (propertize "|" 'face 'transient-inactive-value)
- (cond (global
- (propertize (concat "global:" global)
- 'face (cond (local
- 'transient-inactive-value)
- ((member global choices)
- 'transient-value)
- (t
- 'font-lock-warning-face))))
- (fallback
- (propertize fallback
- 'face (if local
- 'transient-inactive-value
- 'transient-value)))
- (default
- (propertize (concat "default:" default)
- 'face (if local
- 'transient-inactive-value
- 'transient-value))))))
- (propertize "]" 'face 'transient-inactive-value))))
-
-;;; _
-(provide 'magit-transient)
-;;; magit-transient.el ends here
-
diff --git a/elpa/magit-20200728.45/magit-utils.el b/elpa/magit-20200728.45/magit-utils.el
deleted file mode 100644
index d221b57..0000000
--- a/elpa/magit-20200728.45/magit-utils.el
+++ /dev/null
@@ -1,1214 +0,0 @@
-;;; magit-utils.el --- various utilities -*- lexical-binding: t; coding: utf-8 -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Contains code from GNU Emacs https://www.gnu.org/software/emacs,
-;; released under the GNU General Public License version 3 or later.
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library defines several utility functions used by several
-;; other libraries which cannot depend on one another (because
-;; circular dependencies are not good). Luckily most (all) of these
-;; functions have very little (nothing) to do with Git, so we not only
-;; have to do this, it even makes sense.
-
-;; Unfortunately there are also some options which are used by several
-;; libraries which cannot depend on one another, they are defined here
-;; too.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'crm)
-
-(eval-when-compile (require 'ido))
-(declare-function ido-completing-read+ "ido-completing-read+"
- (prompt collection &optional predicate
- require-match initial-input
- hist def inherit-input-method))
-(declare-function Info-get-token "info" (pos start all &optional errorstring))
-
-(eval-when-compile (require 'vc-git))
-(declare-function vc-git--run-command-string "vc-git" (file &rest args))
-
-(eval-when-compile (require 'which-func))
-(declare-function which-function "which-func" ())
-
-(defvar magit-wip-before-change-mode)
-
-;;; Options
-
-(defcustom magit-completing-read-function 'magit-builtin-completing-read
- "Function to be called when requesting input from the user.
-
-If you have enabled `ivy-mode' or `helm-mode', then you don't
-have to customize this option; `magit-builtin-completing-read'
-will work just fine. However, if you use Ido completion, then
-you do have to use `magit-ido-completing-read', because Ido is
-less well behaved than the former, more modern alternatives.
-
-If you would like to use Ivy or Helm completion with Magit but
-not enable the respective modes globally, then customize this
-option to use `ivy-completing-read' or
-`helm--completing-read-default'. If you choose to use
-`ivy-completing-read', note that the items may always be shown in
-alphabetical order, depending on your version of Ivy."
- :group 'magit-essentials
- :type '(radio (function-item magit-builtin-completing-read)
- (function-item magit-ido-completing-read)
- (function-item ivy-completing-read)
- (function-item helm--completing-read-default)
- (function :tag "Other function")))
-
-(defcustom magit-dwim-selection
- '((magit-stash-apply nil t)
- (magit-stash-branch nil t)
- (magit-stash-branch-here nil t)
- (magit-stash-format-patch nil t)
- (magit-stash-drop nil ask)
- (magit-stash-pop nil ask)
- (forge-browse-dwim nil t)
- (forge-browse-commit nil t)
- (forge-browse-branch nil t)
- (forge-browse-remote nil t)
- (forge-browse-issue nil t)
- (forge-browse-pullreq nil t)
- (forge-edit-topic-title nil t)
- (forge-edit-topic-state nil t)
- (forge-edit-topic-milestone nil t)
- (forge-edit-topic-labels nil t)
- (forge-edit-topic-marks nil t)
- (forge-edit-topic-assignees nil t)
- (forge-edit-topic-review-requests nil t)
- (forge-edit-topic-note nil t)
- (forge-pull-pullreq nil t)
- (forge-visit-issue nil t)
- (forge-visit-pullreq nil t))
- "When not to offer alternatives and ask for confirmation.
-
-Many commands by default ask the user to select from a list of
-possible candidates. They do so even when there is a thing at
-point that they can act on, which is then offered as the default.
-
-This option can be used to tell certain commands to use the thing
-at point instead of asking the user to select a candidate to act
-on, with or without confirmation.
-
-The value has the form ((COMMAND nil|PROMPT DEFAULT)...).
-
-- COMMAND is the command that should not prompt for a choice.
- To have an effect, the command has to use the function
- `magit-completing-read' or a utility function which in turn uses
- that function.
-
-- If the command uses `magit-completing-read' multiple times, then
- PROMPT can be used to only affect one of these uses. PROMPT, if
- non-nil, is a regular expression that is used to match against
- the PROMPT argument passed to `magit-completing-read'.
-
-- DEFAULT specifies how to use the default. If it is t, then
- the DEFAULT argument passed to `magit-completing-read' is used
- without confirmation. If it is `ask', then the user is given
- a chance to abort. DEFAULT can also be nil, in which case the
- entry has no effect."
- :package-version '(magit . "2.12.0")
- :group 'magit-commands
- :type '(repeat
- (list (symbol :tag "Command") ; It might not be fboundp yet.
- (choice (const :tag "for all prompts" nil)
- (regexp :tag "for prompts matching regexp"))
- (choice (const :tag "offer other choices" nil)
- (const :tag "require confirmation" ask)
- (const :tag "use default without confirmation" t)))))
-
-(defconst magit--confirm-actions
- '((const reverse) (const discard)
- (const rename) (const resurrect)
- (const untrack) (const trash)
- (const delete) (const abort-rebase)
- (const abort-merge) (const merge-dirty)
- (const drop-stashes) (const reset-bisect)
- (const kill-process) (const delete-unmerged-branch)
- (const delete-pr-branch) (const remove-modules)
- (const stage-all-changes) (const unstage-all-changes)
- (const safe-with-wip)))
-
-(defcustom magit-no-confirm nil
- "A list of symbols for actions Magit should not confirm, or t.
-
-Many potentially dangerous commands by default ask the user for
-confirmation. Each of the below symbols stands for an action
-which, when invoked unintentionally or without being fully aware
-of the consequences, could lead to tears. In many cases there
-are several commands that perform variations of a certain action,
-so we don't use the command names but more generic symbols.
-
-Applying changes:
-
- `discard' Discarding one or more changes (i.e. hunks or the
- complete diff for a file) loses that change, obviously.
-
- `reverse' Reverting one or more changes can usually be undone
- by reverting the reversion.
-
- `stage-all-changes', `unstage-all-changes' When there are both
- staged and unstaged changes, then un-/staging everything would
- destroy that distinction. Of course that also applies when
- un-/staging a single change, but then less is lost and one does
- that so often that having to confirm every time would be
- unacceptable.
-
-Files:
-
- `delete' When a file that isn't yet tracked by Git is deleted
- then it is completely lost, not just the last changes. Very
- dangerous.
-
- `trash' Instead of deleting a file it can also be move to the
- system trash. Obviously much less dangerous than deleting it.
-
- Also see option `magit-delete-by-moving-to-trash'.
-
- `resurrect' A deleted file can easily be resurrected by
- \"deleting\" the deletion, which is done using the same command
- that was used to delete the same file in the first place.
-
- `untrack' Untracking a file can be undone by tracking it again.
-
- `rename' Renaming a file can easily be undone.
-
-Sequences:
-
- `reset-bisect' Aborting (known to Git as \"resetting\") a
- bisect operation loses all information collected so far.
-
- `abort-rebase' Aborting a rebase throws away all already
- modified commits, but it's possible to restore those from the
- reflog.
-
- `abort-merge' Aborting a merge throws away all conflict
- resolutions which has already been carried out by the user.
-
- `merge-dirty' Merging with a dirty worktree can make it hard to
- go back to the state before the merge was initiated.
-
-References:
-
- `delete-unmerged-branch' Once a branch has been deleted it can
- only be restored using low-level recovery tools provided by
- Git. And even then the reflog is gone. The user always has
- to confirm the deletion of a branch by accepting the default
- choice (or selecting another branch), but when a branch has
- not been merged yet, also make sure the user is aware of that.
-
- `delete-pr-remote' When deleting a branch that was created from
- a pull-request and if no other branches still exist on that
- remote, then `magit-branch-delete' offers to delete the remote
- as well. This should be safe because it only happens if no
- other refs exist in the remotes namespace, and you can recreate
- the remote if necessary.
-
- `drop-stashes' Dropping a stash is dangerous because Git stores
- stashes in the reflog. Once a stash is removed, there is no
- going back without using low-level recovery tools provided by
- Git. When a single stash is dropped, then the user always has
- to confirm by accepting the default (or selecting another).
- This action only concerns the deletion of multiple stashes at
- once.
-
-Edit published history:
-
- Without adding these symbols here, you will be warned before
- editing commits that have already been pushed to one of the
- branches listed in `magit-published-branches'.
-
- `amend-published' Affects most commands that amend to \"HEAD\".
-
- `rebase-published' Affects commands that perform interactive
- rebases. This includes commands from the commit popup that
- modify a commit other than \"HEAD\", namely the various fixup
- and squash variants.
-
- `edit-published' Affects the commands `magit-edit-line-commit'
- and `magit-diff-edit-hunk-commit'. These two commands make
- it quite easy to accidentally edit a published commit, so you
- should think twice before configuring them not to ask for
- confirmation.
-
- To disable confirmation completely, add all three symbols here
- or set `magit-published-branches' to nil.
-
-Removing modules:
-
- `remove-modules' When you remove the working directory of a
- module that does not contain uncommitted changes, then that is
- safer than doing so when there are uncommitted changes and/or
- when you also remove the gitdir. Still, you don't want to do
- that by accident.
-
- `remove-dirty-modules' When you remove the working directory of
- a module that contains uncommitted changes, then those changes
- are gone for good. It is better to go to the module, inspect
- these changes and only if appropriate discard them manually.
-
- `trash-module-gitdirs' When you remove the gitdir of a module,
- then all unpushed changes are gone for good. It is very easy
- to forget that you have some unfinished work on an unpublished
- feature branch or even in a stash.
-
- Actually there are some safety precautions in place, that might
- help you out if you make an unwise choice here, but don't count
- on it. In case of emergency, stay calm and check the stash and
- the `trash-directory' for traces of lost work.
-
-Various:
-
- `kill-process' There seldom is a reason to kill a process.
-
-Global settings:
-
- Instead of adding all of the above symbols to the value of this
- option you can also set it to the atom `t', which has the same
- effect as adding all of the above symbols. Doing that most
- certainly is a bad idea, especially because other symbols might
- be added in the future. So even if you don't want to be asked
- for confirmation for any of these actions, you are still better
- of adding all of the respective symbols individually.
-
- When `magit-wip-before-change-mode' is enabled then these actions
- can fairly easily be undone: `discard', `reverse',
- `stage-all-changes', and `unstage-all-changes'. If and only if
- this mode is enabled, then `safe-with-wip' has the same effect
- as adding all of these symbols individually."
- :package-version '(magit . "2.1.0")
- :group 'magit-essentials
- :group 'magit-commands
- :type `(choice (const :tag "Always require confirmation" nil)
- (const :tag "Never require confirmation" t)
- (set :tag "Require confirmation except for"
- ;; `remove-dirty-modules' and
- ;; `trash-module-gitdirs' intentionally
- ;; omitted.
- ,@magit--confirm-actions)))
-
-(defcustom magit-slow-confirm '(drop-stashes)
- "Whether to ask user \"y or n\" or \"yes or no\" questions.
-
-When this is nil, then `y-or-n-p' is used when the user has to
-confirm a potentially destructive action. When this is t, then
-`yes-or-no-p' is used instead. If this is a list of symbols
-identifying actions, then `yes-or-no-p' is used for those,
-`y-or-no-p' for all others. The list of actions is the same as
-for `magit-no-confirm' (which see)."
- :package-version '(magit . "2.9.0")
- :group 'magit-miscellaneous
- :type `(choice (const :tag "Always ask \"yes or no\" questions" t)
- (const :tag "Always ask \"y or n\" questions" nil)
- (set :tag "Ask \"yes or no\" questions only for"
- ,@magit--confirm-actions)))
-
-(defcustom magit-no-message nil
- "A list of messages Magit should not display.
-
-Magit displays most echo area messages using `message', but a few
-are displayed using `magit-message' instead, which takes the same
-arguments as the former, FORMAT-STRING and ARGS. `magit-message'
-forgoes printing a message if any member of this list is a prefix
-of the respective FORMAT-STRING.
-
-If Magit prints a message which causes you grief, then please
-first investigate whether there is another option which can be
-used to suppress it. If that is not the case, then ask the Magit
-maintainers to start using `magit-message' instead of `message'
-in that case. We are not proactively replacing all uses of
-`message' with `magit-message', just in case someone *might* find
-some of these messages useless.
-
-Messages which can currently be suppressed using this option are:
-* \"Turning on magit-auto-revert-mode...\""
- :package-version '(magit . "2.8.0")
- :group 'magit-miscellaneous
- :type '(repeat string))
-
-(defcustom magit-ellipsis ?…
- "Character used to abbreviate text.
-
-Currently this is used to abbreviate author names in the margin
-and in process buffers to elide `magit-git-global-arguments'."
- :package-version '(magit . "2.1.0")
- :group 'magit-miscellaneous
- :type 'character)
-
-(defcustom magit-update-other-window-delay 0.2
- "Delay before automatically updating the other window.
-
-When moving around in certain buffers, then certain other
-buffers, which are being displayed in another window, may
-optionally be updated to display information about the
-section at point.
-
-When holding down a key to move by more than just one section,
-then that would update that buffer for each section on the way.
-To prevent that, updating the revision buffer is delayed, and
-this option controls for how long. For optimal experience you
-might have to adjust this delay and/or the keyboard repeat rate
-and delay of your graphical environment or operating system."
- :package-version '(magit . "2.3.0")
- :group 'magit-miscellaneous
- :type 'number)
-
-(defcustom magit-view-git-manual-method 'info
- "How links to Git documentation are followed from Magit's Info manuals.
-
-`info' Follow the link to the node in the `gitman' Info manual
- as usual. Unfortunately that manual is not installed by
- default on some platforms, and when it is then the nodes
- look worse than the actual manpages.
-
-`man' View the respective man-page using the `man' package.
-
-`woman' View the respective man-page using the `woman' package."
- :package-version '(magit . "2.9.0")
- :group 'magit-miscellaneous
- :type '(choice (const :tag "view info manual" info)
- (const :tag "view manpage using `man'" man)
- (const :tag "view manpage using `woman'" woman)))
-
-;;; User Input
-
-(defvar helm-completion-in-region-default-sort-fn)
-(defvar ivy-sort-functions-alist)
-
-(defvar magit-completing-read--silent-default nil)
-
-(defun magit-completing-read (prompt collection &optional
- predicate require-match initial-input
- hist def fallback)
- "Read a choice in the minibuffer, or use the default choice.
-
-This is the function that Magit commands use when they need the
-user to select a single thing to act on. The arguments have the
-same meaning as for `completing-read', except for FALLBACK, which
-is unique to this function and is described below.
-
-Instead of asking the user to choose from a list of possible
-candidates, this function may instead just return the default
-specified by DEF, with or without requiring user confirmation.
-Whether that is the case depends on PROMPT, `this-command' and
-`magit-dwim-selection'. See the documentation of the latter for
-more information.
-
-If it does use the default without the user even having to
-confirm that, then `magit-completing-read--silent-default' is set
-to t, otherwise nil.
-
-If it does read a value in the minibuffer, then this function
-acts similarly to `completing-read', except for the following:
-
-- COLLECTION must be a list of choices. A function is not
- supported.
-
-- If REQUIRE-MATCH is nil and the user exits without a choice,
- then nil is returned instead of an empty string.
-
-- If REQUIRE-MATCH is non-nil and the user exits without a
- choice, `user-error' is raised.
-
-- FALLBACK specifies a secondary default that is only used if
- the primary default DEF is nil. The secondary default is not
- subject to `magit-dwim-selection' — if DEF is nil but FALLBACK
- is not, then this function always asks the user to choose a
- candidate, just as if both defaults were nil.
-
-- \": \" is appended to PROMPT.
-
-- PROMPT is modified to end with \" (default DEF|FALLBACK): \"
- provided that DEF or FALLBACK is non-nil, that neither
- `ivy-mode' nor `helm-mode' is enabled, and that
- `magit-completing-read-function' is set to its default value of
- `magit-builtin-completing-read'."
- (setq magit-completing-read--silent-default nil)
- (if-let ((dwim (and def
- (nth 2 (-first (pcase-lambda (`(,cmd ,re ,_))
- (and (eq this-command cmd)
- (or (not re)
- (string-match-p re prompt))))
- magit-dwim-selection)))))
- (if (eq dwim 'ask)
- (if (y-or-n-p (format "%s %s? " prompt def))
- def
- (user-error "Abort"))
- (setq magit-completing-read--silent-default t)
- def)
- (unless def
- (setq def fallback))
- (let ((command this-command)
- (reply (funcall magit-completing-read-function
- (concat prompt ": ")
- (if (and def (not (member def collection)))
- (cons def collection)
- collection)
- predicate
- require-match initial-input hist def)))
- (setq this-command command)
- (if (string= reply "")
- (if require-match
- (user-error "Nothing selected")
- nil)
- reply))))
-
-(defun magit--completion-table (collection)
- (lambda (string pred action)
- (if (eq action 'metadata)
- '(metadata (display-sort-function . identity))
- (complete-with-action action collection string pred))))
-
-(defun magit-builtin-completing-read
- (prompt choices &optional predicate require-match initial-input hist def)
- "Magit wrapper for standard `completing-read' function."
- (unless (or (bound-and-true-p helm-mode)
- (bound-and-true-p ivy-mode))
- (setq prompt (magit-prompt-with-default prompt def))
- (setq choices (magit--completion-table choices)))
- (cl-letf (((symbol-function 'completion-pcm--all-completions)
- #'magit-completion-pcm--all-completions))
- (let ((ivy-sort-functions-alist nil))
- (completing-read prompt choices
- predicate require-match
- initial-input hist def))))
-
-(defun magit-completing-read-multiple
- (prompt choices &optional sep default hist keymap)
- "Read multiple items from CHOICES, separated by SEP.
-
-Set up the `crm' variables needed to read multiple values with
-`read-from-minibuffer'.
-
-SEP is a regexp matching characters that can separate choices.
-When SEP is nil, it defaults to `crm-default-separator'.
-DEFAULT, HIST, and KEYMAP are passed to `read-from-minibuffer'.
-When KEYMAP is nil, it defaults to `crm-local-completion-map'.
-
-Unlike `completing-read-multiple', the return value is not split
-into a list."
- (let* ((crm-separator (or sep crm-default-separator))
- (crm-completion-table (magit--completion-table choices))
- (choose-completion-string-functions
- '(crm--choose-completion-string))
- (minibuffer-completion-table #'crm--collection-fn)
- (minibuffer-completion-confirm t)
- (helm-completion-in-region-default-sort-fn nil)
- (input
- (cl-letf (((symbol-function 'completion-pcm--all-completions)
- #'magit-completion-pcm--all-completions))
- (read-from-minibuffer
- (concat prompt (and default (format " (%s)" default)) ": ")
- nil (or keymap crm-local-completion-map)
- nil hist default))))
- (when (string-equal input "")
- (or (setq input default)
- (user-error "Nothing selected")))
- input))
-
-(defun magit-completing-read-multiple*
- (prompt table &optional predicate require-match initial-input
- hist def inherit-input-method)
- "Read multiple strings in the minibuffer, with completion.
-Like `completing-read-multiple' but don't mess with order of
-TABLE. Also bind `helm-completion-in-region-default-sort-fn'
-to nil."
- (unwind-protect
- (cl-letf (((symbol-function 'completion-pcm--all-completions)
- #'magit-completion-pcm--all-completions))
- (add-hook 'choose-completion-string-functions
- 'crm--choose-completion-string)
- (let* ((minibuffer-completion-table #'crm--collection-fn)
- (minibuffer-completion-predicate predicate)
- ;; see completing_read in src/minibuf.c
- (minibuffer-completion-confirm
- (unless (eq require-match t) require-match))
- (crm-completion-table (magit--completion-table table))
- (map (if require-match
- crm-local-must-match-map
- crm-local-completion-map))
- (helm-completion-in-region-default-sort-fn nil)
- ;; If the user enters empty input, `read-from-minibuffer'
- ;; returns the empty string, not DEF.
- (input (read-from-minibuffer
- prompt initial-input map
- nil hist def inherit-input-method)))
- (and def (string-equal input "") (setq input def))
- ;; Remove empty strings in the list of read strings.
- (split-string input crm-separator t)))
- (remove-hook 'choose-completion-string-functions
- 'crm--choose-completion-string)))
-
-(defun magit-ido-completing-read
- (prompt choices &optional predicate require-match initial-input hist def)
- "Ido-based `completing-read' almost-replacement.
-
-Unfortunately `ido-completing-read' is not suitable as a
-drop-in replacement for `completing-read', instead we use
-`ido-completing-read+' from the third-party package by the
-same name."
- (if (require 'ido-completing-read+ nil t)
- (ido-completing-read+ prompt choices predicate require-match
- initial-input hist
- (or def (and require-match (car choices))))
- (display-warning 'magit "ido-completing-read+ is not installed
-
-To use Ido completion with Magit you need to install the
-third-party `ido-completing-read+' packages. Falling
-back to built-in `completing-read' for now." :error)
- (magit-builtin-completing-read prompt choices predicate require-match
- initial-input hist def)))
-
-(defun magit-prompt-with-default (prompt def)
- (if (and def (> (length prompt) 2)
- (string-equal ": " (substring prompt -2)))
- (format "%s (default %s): " (substring prompt 0 -2) def)
- prompt))
-
-(defvar magit-minibuffer-local-ns-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map minibuffer-local-map)
- (define-key map "\s" 'magit-whitespace-disallowed)
- (define-key map "\t" 'magit-whitespace-disallowed)
- map))
-
-(defun magit-whitespace-disallowed ()
- "Beep to tell the user that whitespace is not allowed."
- (interactive)
- (ding)
- (message "Whitespace isn't allowed here")
- (setq defining-kbd-macro nil)
- (force-mode-line-update))
-
-(defun magit-read-string (prompt &optional initial-input history default-value
- inherit-input-method no-whitespace)
- "Read a string from the minibuffer, prompting with string PROMPT.
-
-This is similar to `read-string', but
-* empty input is only allowed if DEFAULT-VALUE is non-nil in
- which case that is returned,
-* whitespace is not allowed and leading and trailing whitespace is
- removed automatically if NO-WHITESPACE is non-nil,
-* \": \" is appended to PROMPT, and
-* an invalid DEFAULT-VALUE is silently ignored."
- (when default-value
- (when (consp default-value)
- (setq default-value (car default-value)))
- (unless (stringp default-value)
- (setq default-value nil)))
- (let* ((minibuffer-completion-table nil)
- (val (read-from-minibuffer
- (magit-prompt-with-default (concat prompt ": ") default-value)
- initial-input (and no-whitespace magit-minibuffer-local-ns-map)
- nil history default-value inherit-input-method))
- (trim (lambda (regexp string)
- (save-match-data
- (if (string-match regexp string)
- (replace-match "" t t string)
- string)))))
- (when (and (string= val "") default-value)
- (setq val default-value))
- (when no-whitespace
- (setq val (funcall trim "\\`\\(?:[ \t\n\r]+\\)"
- (funcall trim "\\(?:[ \t\n\r]+\\)\\'" val))))
- (cond ((string= val "")
- (user-error "Need non-empty input"))
- ((and no-whitespace (string-match-p "[\s\t\n]" val))
- (user-error "Input contains whitespace"))
- (t val))))
-
-(defun magit-read-string-ns (prompt &optional initial-input history
- default-value inherit-input-method)
- "Call `magit-read-string' with non-nil NO-WHITESPACE."
- (magit-read-string prompt initial-input history default-value
- inherit-input-method t))
-
-(defmacro magit-read-char-case (prompt verbose &rest clauses)
- (declare (indent 2)
- (debug (form form &rest (characterp form body))))
- `(prog1 (pcase (read-char-choice
- (concat ,prompt
- ,(concat (mapconcat 'cadr clauses ", ")
- (and verbose ", or [C-g] to abort") " "))
- ',(mapcar 'car clauses))
- ,@(--map `(,(car it) ,@(cddr it)) clauses))
- (message "")))
-
-(defun magit-y-or-n-p (prompt &optional action)
- "Ask user a \"y or n\" or a \"yes or no\" question using PROMPT.
-Which kind of question is used depends on whether
-ACTION is a member of option `magit-slow-confirm'."
- (if (or (eq magit-slow-confirm t)
- (and action (member action magit-slow-confirm)))
- (yes-or-no-p prompt)
- (y-or-n-p prompt)))
-
-(defvar magit--no-confirm-alist
- '((safe-with-wip magit-wip-before-change-mode
- discard reverse stage-all-changes unstage-all-changes)))
-
-(cl-defun magit-confirm (action &optional prompt prompt-n noabort
- (items nil sitems))
- (declare (indent defun))
- (setq prompt-n (format (concat (or prompt-n prompt) "? ") (length items)))
- (setq prompt (format (concat (or prompt (magit-confirm-make-prompt action))
- "? ")
- (car items)))
- (or (cond ((and (not (eq action t))
- (or (eq magit-no-confirm t)
- (memq action magit-no-confirm)
- (cl-member-if (pcase-lambda (`(,key ,var . ,sub))
- (and (memq key magit-no-confirm)
- (memq action sub)
- (or (not var)
- (and (boundp var)
- (symbol-value var)))))
- magit--no-confirm-alist)))
- (or (not sitems) items))
- ((not sitems)
- (magit-y-or-n-p prompt action))
- ((= (length items) 1)
- (and (magit-y-or-n-p prompt action) items))
- ((> (length items) 1)
- (and (magit-y-or-n-p (concat (mapconcat #'identity items "\n")
- "\n\n" prompt-n)
- action)
- items)))
- (if noabort nil (user-error "Abort"))))
-
-(defun magit-confirm-files (action files &optional prompt)
- (when files
- (unless prompt
- (setq prompt (magit-confirm-make-prompt action)))
- (magit-confirm action
- (concat prompt " %s")
- (concat prompt " %i files")
- nil files)))
-
-(defun magit-confirm-make-prompt (action)
- (let ((prompt (symbol-name action)))
- (replace-regexp-in-string
- "-" " " (concat (upcase (substring prompt 0 1)) (substring prompt 1)))))
-
-(defun magit-read-number-string (prompt &optional default _history)
- "Like `read-number' but return value is a string.
-DEFAULT may be a number or a numeric string."
- (number-to-string
- (read-number prompt (if (stringp default)
- (string-to-number default)
- default))))
-
-;;; Debug Utilities
-
-;;;###autoload
-(defun magit-emacs-Q-command ()
- "Show a shell command that runs an uncustomized Emacs with only Magit loaded.
-See info node `(magit)Debugging Tools' for more information."
- (interactive)
- (let ((cmd (mapconcat
- #'shell-quote-argument
- `(,(concat invocation-directory invocation-name)
- "-Q" "--eval" "(setq debug-on-error t)"
- ,@(cl-mapcan
- (lambda (dir) (list "-L" dir))
- (delete-dups
- (cl-mapcan
- (lambda (lib)
- (let ((path (locate-library lib)))
- (cond
- (path
- (list (file-name-directory path)))
- ((not (equal lib "libgit"))
- (error "Cannot find mandatory dependency %s" lib)))))
- '(;; Like `LOAD_PATH' in `default.mk'.
- "dash"
- "libgit"
- "transient"
- "with-editor"
- ;; Obviously `magit' itself is needed too.
- "magit"
- ;; While this is part of the Magit repository,
- ;; it is distributed as a separate package.
- "git-commit"
- ;; Even though `async' is a dependency of the
- ;; `magit' package, it is not required here.
- ))))
- ;; Avoid Emacs bug#16406 by using full path.
- "-l" ,(file-name-sans-extension (locate-library "magit")))
- " ")))
- (message "Uncustomized Magit command saved to kill-ring, %s"
- "please run it in a terminal.")
- (kill-new cmd)))
-
-;;; Text Utilities
-
-(defmacro magit-bind-match-strings (varlist string &rest body)
- "Bind variables to submatches according to VARLIST then evaluate BODY.
-Bind the symbols in VARLIST to submatches of the current match
-data, starting with 1 and incrementing by 1 for each symbol. If
-the last match was against a string, then that has to be provided
-as STRING."
- (declare (indent 2) (debug (listp form body)))
- (let ((s (cl-gensym "string"))
- (i 0))
- `(let ((,s ,string))
- (let ,(save-match-data
- (--map (list it (list 'match-string (cl-incf i) s)) varlist))
- ,@body))))
-
-(defun magit-delete-line ()
- "Delete the rest of the current line."
- (delete-region (point) (1+ (line-end-position))))
-
-(defun magit-delete-match (&optional num)
- "Delete text matched by last search.
-If optional NUM is specified, only delete that subexpression."
- (delete-region (match-beginning (or num 0))
- (match-end (or num 0))))
-
-(defun magit-file-line (file)
- "Return the first line of FILE as a string."
- (when (file-regular-p file)
- (with-temp-buffer
- (insert-file-contents file)
- (buffer-substring-no-properties (point-min)
- (line-end-position)))))
-
-(defun magit-file-lines (file &optional keep-empty-lines)
- "Return a list of strings containing one element per line in FILE.
-Unless optional argument KEEP-EMPTY-LINES is t, trim all empty lines."
- (when (file-regular-p file)
- (with-temp-buffer
- (insert-file-contents file)
- (split-string (buffer-string) "\n" (not keep-empty-lines)))))
-
-(defun magit-set-header-line-format (string)
- "Set the header-line using STRING.
-Propertize STRING with the `magit-header-line'. If the `face'
-property of any part of STRING is already set, then that takes
-precedence. Also pad the left and right sides of STRING so that
-it aligns with the text area."
- (setq header-line-format
- (concat
- (propertize " " 'display '(space :align-to 0))
- string
- (propertize " " 'display
- `(space :width
- (+ left-fringe
- left-margin
- ,@(and (eq (car (window-current-scroll-bars))
- 'left)
- '(scroll-bar)))))))
- (magit--add-face-text-property 0 (1- (length header-line-format))
- 'magit-header-line t header-line-format))
-
-(defun magit-face-property-all (face string)
- "Return non-nil if FACE is present in all of STRING."
- (cl-loop for pos = 0 then (next-single-property-change
- pos 'font-lock-face string)
- unless pos
- return t
- for current = (get-text-property pos 'font-lock-face string)
- unless (if (consp current)
- (memq face current)
- (eq face current))
- return nil))
-
-(defun magit--add-face-text-property (beg end face &optional append object)
- "Like `add-face-text-property' but for `font-lock-face'."
- (cl-loop for pos = (next-single-property-change
- beg 'font-lock-face object end)
- for current = (get-text-property beg 'font-lock-face object)
- for newface = (if (listp current)
- (if append
- (append current (list face))
- (cons face current))
- (if append
- (list current face)
- (list face current)))
- do (progn (put-text-property beg pos 'font-lock-face newface object)
- (setq beg pos))
- while (< beg end)))
-
-(defun magit--propertize-face (string face)
- (propertize string 'face face 'font-lock-face face))
-
-(defun magit--put-face (beg end face string)
- (put-text-property beg end 'face face string)
- (put-text-property beg end 'font-lock-face face string))
-
-(defun magit--format-spec (format specification)
- "Like `format-spec' but preserve text properties in SPECIFICATION."
- (with-temp-buffer
- (insert format)
- (goto-char (point-min))
- (while (search-forward "%" nil t)
- (cond
- ;; Quoted percent sign.
- ((eq (char-after) ?%)
- (delete-char 1))
- ;; Valid format spec.
- ((looking-at "\\([-0-9.]*\\)\\([a-zA-Z]\\)")
- (let* ((num (match-string 1))
- (spec (string-to-char (match-string 2)))
- (val (assq spec specification)))
- (unless val
- (error "Invalid format character: `%%%c'" spec))
- (setq val (cdr val))
- ;; Pad result to desired length.
- (let ((text (format (concat "%" num "s") val)))
- ;; Insert first, to preserve text properties.
- (if (next-property-change 0 (concat " " text))
- ;; If the inserted text has properties, then preserve those.
- (insert text)
- ;; Otherwise preserve FORMAT's properties, like `format-spec'.
- (insert-and-inherit text))
- ;; Delete the specifier body.
- (delete-region (+ (match-beginning 0) (length text))
- (+ (match-end 0) (length text)))
- ;; Delete the percent sign.
- (delete-region (1- (match-beginning 0)) (match-beginning 0)))))
- ;; Signal an error on bogus format strings.
- (t
- (error "Invalid format string"))))
- (buffer-string)))
-
-;;; Missing from Emacs
-
-(defun magit-kill-this-buffer ()
- "Kill the current buffer."
- (interactive)
- (kill-buffer (current-buffer)))
-
-(defun magit--buffer-string (&optional min max trim)
- "Like `buffer-substring-no-properties' but the arguments are optional.
-
-This combines the benefits of `buffer-string', `buffer-substring'
-and `buffer-substring-no-properties' into one function that is
-not as painful to use as the latter. I.e. you can write
- (magit--buffer-string)
-instead of
- (buffer-substring-no-properties (point-min)
- (point-max))
-
-Optional MIN defaults to the value of `point-min'.
-Optional MAX defaults to the value of `point-max'.
-
-If optional TRIM is non-nil, then all leading and trailing
-whitespace is remove. If it is the newline character, then
-one trailing newline is added."
- ;; Lets write that one last time and be done with it:
- (let ((str (buffer-substring-no-properties (or min (point-min))
- (or max (point-max)))))
- (if trim
- (concat (string-trim str)
- (and (eq trim ?\n) "\n"))
- str)))
-
-;;; Kludges for Emacs Bugs
-
-(defun magit-file-accessible-directory-p (filename)
- "Like `file-accessible-directory-p' but work around an Apple bug.
-See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21573#17
-and https://github.com/magit/magit/issues/2295."
- (and (file-directory-p filename)
- (file-accessible-directory-p filename)))
-
-(when (version<= "25.1" emacs-version)
- (with-eval-after-load 'vc-git
- (defun vc-git-conflicted-files (directory)
- "Return the list of files with conflicts in DIRECTORY."
- (let* ((status
- (vc-git--run-command-string directory "diff-files"
- "--name-status"))
- (lines (when status (split-string status "\n" 'omit-nulls)))
- files)
- (dolist (line lines files)
- (when (string-match "\\([ MADRCU?!]\\)[ \t]+\\(.+\\)" line)
- (let ((state (match-string 1 line))
- (file (match-string 2 line)))
- (when (equal state "U")
- (push (expand-file-name file directory) files)))))))))
-
-(when (< emacs-major-version 27)
- (defun vc-git--call@bug21559 (fn buffer command &rest args)
- "Backport https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21559."
- (let ((process-environment process-environment))
- (when revert-buffer-in-progress-p
- (push "GIT_OPTIONAL_LOCKS=0" process-environment))
- (apply fn buffer command args)))
- (advice-add 'vc-git--call :around 'vc-git--call@bug21559)
-
- (defun vc-git-command@bug21559
- (fn buffer okstatus file-or-list &rest flags)
- "Backport https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21559."
- (let ((process-environment process-environment))
- (when revert-buffer-in-progress-p
- (push "GIT_OPTIONAL_LOCKS=0" process-environment))
- (apply fn buffer okstatus file-or-list flags)))
- (advice-add 'vc-git-command :around 'vc-git-command@bug21559)
-
- (defun auto-revert-handler@bug21559 (fn)
- "Backport https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21559."
- (let ((revert-buffer-in-progress-p t))
- (funcall fn)))
- (advice-add 'auto-revert-handler :around 'auto-revert-handler@bug21559)
- )
-
-;; `completion-pcm--all-completions' reverses the completion list. To
-;; preserve the order of our pre-sorted completions, we'll temporarily
-;; override it with the function below. bug#24676
-(defun magit-completion-pcm--all-completions (prefix pattern table pred)
- (if (completion-pcm--pattern-trivial-p pattern)
- (all-completions (concat prefix (car pattern)) table pred)
- (let* ((regex (completion-pcm--pattern->regex pattern))
- (case-fold-search completion-ignore-case)
- (completion-regexp-list (cons regex completion-regexp-list))
- (compl (all-completions
- (concat prefix
- (if (stringp (car pattern)) (car pattern) ""))
- table pred)))
- (if (not (functionp table))
- compl
- (let ((poss ()))
- (dolist (c compl)
- (when (string-match-p regex c) (push c poss)))
- ;; This `nreverse' call is the only code change made to the
- ;; `completion-pcm--all-completions' that shipped with Emacs 25.1.
- (nreverse poss))))))
-
-(defun magit-which-function ()
- "Return current function name based on point.
-
-This is a simple wrapper around `which-function', that resets
-Imenu's potentially outdated and therefore unreliable cache by
-setting `imenu--index-alist' to nil before calling that function."
- (setq imenu--index-alist nil)
- (which-function))
-
-;;; Kludges for Custom
-
-(defun magit-custom-initialize-reset (symbol exp)
- "Initialize SYMBOL based on EXP.
-Set the symbol, using `set-default' (unlike
-`custom-initialize-reset' which uses the `:set' function if any.)
-The value is either the symbol's current value
- (as obtained using the `:get' function), if any,
-or the value in the symbol's `saved-value' property if any,
-or (last of all) the value of EXP."
- (set-default-toplevel-value
- symbol
- (condition-case nil
- (let ((def (default-toplevel-value symbol))
- (getter (get symbol 'custom-get)))
- (if getter (funcall getter symbol) def))
- (error
- (eval (let ((sv (get symbol 'saved-value)))
- (if sv (car sv) exp)))))))
-
-(defun magit-hook-custom-get (symbol)
- (if (symbol-file symbol 'defvar)
- (default-toplevel-value symbol)
- ;;
- ;; Called by `custom-initialize-reset' on behalf of `symbol's
- ;; `defcustom', which is being evaluated for the first time to
- ;; set the initial value, but there's already a default value,
- ;; which most likely was established by one or more `add-hook'
- ;; calls.
- ;;
- ;; We combine the `standard-value' and the current value, while
- ;; preserving the order established by `:options', and return
- ;; the result of that to be used as the "initial" default value.
- ;;
- (let ((standard (eval (car (get symbol 'standard-value))))
- (current (default-toplevel-value symbol))
- (value nil))
- (dolist (fn (get symbol 'custom-options))
- (when (or (memq fn standard)
- (memq fn current))
- (push fn value)))
- (dolist (fn current)
- (unless (memq fn value)
- (push fn value)))
- (nreverse value))))
-
-;;; Kludges for Info Manuals
-
-;;;###autoload
-(defun Info-follow-nearest-node--magit-gitman (fn &optional fork)
- (let ((node (Info-get-token
- (point) "\\*note[ \n\t]+"
- "\\*note[ \n\t]+\\([^:]*\\):\\(:\\|[ \n\t]*(\\)?")))
- (if (and node (string-match "^(gitman)\\(.+\\)" node))
- (pcase magit-view-git-manual-method
- (`info (funcall fn fork))
- (`man (require 'man)
- (man (match-string 1 node)))
- (`woman (require 'woman)
- (woman (match-string 1 node)))
- (_
- (user-error "Invalid value for `magit-view-git-manual-method'")))
- (funcall fn fork))))
-
-;;;###autoload
-(advice-add 'Info-follow-nearest-node :around
- 'Info-follow-nearest-node--magit-gitman)
-
-;;;###autoload
-(defun org-man-export--magit-gitman (fn link description format)
- (if (and (eq format 'texinfo)
- (string-match-p "\\`git" link))
- (replace-regexp-in-string "%s" link "
-@ifinfo
-@ref{%s,,,gitman,}.
-@end ifinfo
-@ifhtml
-@html
-the <a href=\"http://git-scm.com/docs/%s\">%s(1)</a> manpage.
-@end html
-@end ifhtml
-@iftex
-the %s(1) manpage.
-@end iftex
-")
- (funcall fn link description format)))
-
-;;;###autoload
-(advice-add 'org-man-export :around
- 'org-man-export--magit-gitman)
-
-;;; Kludges for Package Managers
-
-(defun magit--straight-chase-links (filename)
- "Chase links in FILENAME until a name that is not a link.
-
-This is the same as `file-chase-links', except that it also
-handles fake symlinks that are created by the package manager
-straight.el on Windows.
-
-See <https://github.com/raxod502/straight.el/issues/520>."
- (when (and (bound-and-true-p straight-symlink-emulation-mode)
- (fboundp 'straight-chase-emulated-symlink))
- (when-let ((target (straight-chase-emulated-symlink filename)))
- (unless (eq target 'broken)
- (setq filename target))))
- (file-chase-links filename))
-
-;;; Bitmaps
-
-(when (fboundp 'define-fringe-bitmap)
- (define-fringe-bitmap 'magit-fringe-bitmap+
- [#b00000000
- #b00011000
- #b00011000
- #b01111110
- #b01111110
- #b00011000
- #b00011000
- #b00000000])
- (define-fringe-bitmap 'magit-fringe-bitmap-
- [#b00000000
- #b00000000
- #b00000000
- #b01111110
- #b01111110
- #b00000000
- #b00000000
- #b00000000])
-
- (define-fringe-bitmap 'magit-fringe-bitmap>
- [#b01100000
- #b00110000
- #b00011000
- #b00001100
- #b00011000
- #b00110000
- #b01100000
- #b00000000])
- (define-fringe-bitmap 'magit-fringe-bitmapv
- [#b00000000
- #b10000010
- #b11000110
- #b01101100
- #b00111000
- #b00010000
- #b00000000
- #b00000000])
-
- (define-fringe-bitmap 'magit-fringe-bitmap-bold>
- [#b11100000
- #b01110000
- #b00111000
- #b00011100
- #b00011100
- #b00111000
- #b01110000
- #b11100000])
- (define-fringe-bitmap 'magit-fringe-bitmap-boldv
- [#b10000001
- #b11000011
- #b11100111
- #b01111110
- #b00111100
- #b00011000
- #b00000000
- #b00000000])
- )
-
-;;; Miscellaneous
-
-(defun magit-message (format-string &rest args)
- "Display a message at the bottom of the screen, or not.
-Like `message', except that if the users configured option
-`magit-no-message' to prevent the message corresponding to
-FORMAT-STRING to be displayed, then don't."
- (unless (--first (string-prefix-p it format-string) magit-no-message)
- (apply #'message format-string args)))
-
-(defun magit-msg (format-string &rest args)
- "Display a message at the bottom of the screen, but don't log it.
-Like `message', except that `message-log-max' is bound to nil."
- (let ((message-log-max nil))
- (apply #'message format-string args)))
-
-(defmacro magit--with-temp-position (buf pos &rest body)
- (declare (indent 2))
- `(with-current-buffer ,buf
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (or ,pos 1))
- ,@body))))
-
-;;; _
-(provide 'magit-utils)
-;;; magit-utils.el ends here
diff --git a/elpa/magit-20200728.45/magit-wip.el b/elpa/magit-20200728.45/magit-wip.el
deleted file mode 100644
index b24f93c..0000000
--- a/elpa/magit-20200728.45/magit-wip.el
+++ /dev/null
@@ -1,456 +0,0 @@
-;;; magit-wip.el --- commit snapshots to work-in-progress refs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library defines tree global modes which automatically commit
-;; snapshots to branch-specific work-in-progress refs before and after
-;; making changes, and two commands which can be used to do so on
-;; demand.
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x))
-
-(require 'magit-core)
-(require 'magit-log)
-
-;;; Options
-
-(defgroup magit-wip nil
- "Automatically commit to work-in-progress refs."
- :link '(info-link "(magit)Wip Modes")
- :group 'magit-modes
- :group 'magit-essentials)
-
-(defgroup magit-wip-legacy nil
- "It is better to not use these modes individually."
- :link '(info-link "(magit)Legacy Wip Modes")
- :group 'magit-wip)
-
-(defcustom magit-wip-mode-lighter " Wip"
- "Lighter for Magit-Wip mode."
- :package-version '(magit . "2.90.0")
- :group 'magit-wip
- :type 'string)
-
-(defcustom magit-wip-after-save-local-mode-lighter ""
- "Lighter for Magit-Wip-After-Save-Local mode."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip-legacy
- :type 'string)
-
-(defcustom magit-wip-after-apply-mode-lighter ""
- "Lighter for Magit-Wip-After-Apply mode."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip-legacy
- :type 'string)
-
-(defcustom magit-wip-before-change-mode-lighter ""
- "Lighter for Magit-Wip-Before-Change mode."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip-legacy
- :type 'string)
-
-(defcustom magit-wip-initial-backup-mode-lighter ""
- "Lighter for Magit-Wip-Initial Backup mode."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip-legacy
- :type 'string)
-
-(defcustom magit-wip-merge-branch nil
- "Whether to merge the current branch into its wip ref.
-
-If non-nil and the current branch has new commits, then it is
-merged into the wip ref before creating a new wip commit. This
-makes it easier to inspect wip history and the wip commits are
-never garbage collected.
-
-If nil and the current branch has new commits, then the wip ref
-is reset to the tip of the branch before creating a new wip
-commit. With this setting wip commits are eventually garbage
-collected. This is currently the default."
- :package-version '(magit . "2.90.0")
- :group 'magit-wip
- :type 'boolean)
-
-(defcustom magit-wip-namespace "refs/wip/"
- "Namespace used for work-in-progress refs.
-The wip refs are named \"<namespace/>index/<branchref>\"
-and \"<namespace/>wtree/<branchref>\". When snapshots
-are created while the `HEAD' is detached then \"HEAD\"
-is used as `branch-ref'."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip
- :type 'string)
-
-;;; Modes
-
-(define-minor-mode magit-wip-mode
- "Save uncommitted changes to work-in-progress refs.
-
-Whenever appropriate (i.e. when dataloss would be a possibility
-otherwise) this mode causes uncommitted changes to be committed
-to dedicated work-in-progress refs.
-
-For historic reasons this mode is implemented on top of four
-other `magit-wip-*' modes, which can also be used individually,
-if you want finer control over when the wip refs are updated;
-but that is discouraged."
- :package-version '(magit . "2.90.0")
- :lighter magit-wip-mode-lighter
- :global t
- (let ((arg (if magit-wip-mode 1 -1)))
- (magit-wip-after-save-mode arg)
- (magit-wip-after-apply-mode arg)
- (magit-wip-before-change-mode arg)
- (magit-wip-initial-backup-mode arg)))
-
-(define-minor-mode magit-wip-after-save-local-mode
- "After saving, also commit to a worktree work-in-progress ref.
-
-After saving the current file-visiting buffer this mode also
-commits the changes to the worktree work-in-progress ref for
-the current branch.
-
-This mode should be enabled globally by turning on the globalized
-variant `magit-wip-after-save-mode'."
- :package-version '(magit . "2.1.0")
- :lighter magit-wip-after-save-local-mode-lighter
- (if magit-wip-after-save-local-mode
- (if (and buffer-file-name (magit-inside-worktree-p t))
- (add-hook 'after-save-hook 'magit-wip-commit-buffer-file t t)
- (setq magit-wip-after-save-local-mode nil)
- (user-error "Need a worktree and a file"))
- (remove-hook 'after-save-hook 'magit-wip-commit-buffer-file t)))
-
-(defun magit-wip-after-save-local-mode-turn-on ()
- (and buffer-file-name
- (magit-inside-worktree-p t)
- (magit-file-tracked-p buffer-file-name)
- (magit-wip-after-save-local-mode)))
-
-;;;###autoload
-(define-globalized-minor-mode magit-wip-after-save-mode
- magit-wip-after-save-local-mode magit-wip-after-save-local-mode-turn-on
- :package-version '(magit . "2.1.0")
- :group 'magit-wip)
-
-(defun magit-wip-commit-buffer-file (&optional msg)
- "Commit visited file to a worktree work-in-progress ref.
-
-Also see `magit-wip-after-save-mode' which calls this function
-automatically whenever a buffer visiting a tracked file is saved."
- (interactive)
- (--when-let (magit-wip-get-ref)
- (magit-with-toplevel
- (let ((file (file-relative-name buffer-file-name)))
- (magit-wip-commit-worktree
- it (list file)
- (format (cond (msg)
- ((called-interactively-p 'any)
- "wip-save %s after save")
- (t
- "autosave %s after save"))
- file))))))
-
-;;;###autoload
-(define-minor-mode magit-wip-after-apply-mode
- "Commit to work-in-progress refs.
-
-After applying a change using any \"apply variant\"
-command (apply, stage, unstage, discard, and reverse) commit the
-affected files to the current wip refs. For each branch there
-may be two wip refs; one contains snapshots of the files as found
-in the worktree and the other contains snapshots of the entries
-in the index."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip
- :lighter magit-wip-after-apply-mode-lighter
- :global t)
-
-(defun magit-wip-commit-after-apply (&optional files msg)
- (when magit-wip-after-apply-mode
- (magit-wip-commit files msg)))
-
-;;;###autoload
-(define-minor-mode magit-wip-before-change-mode
- "Commit to work-in-progress refs before certain destructive changes.
-
-Before invoking a revert command or an \"apply variant\"
-command (apply, stage, unstage, discard, and reverse) commit the
-affected tracked files to the current wip refs. For each branch
-there may be two wip refs; one contains snapshots of the files
-as found in the worktree and the other contains snapshots of the
-entries in the index.
-
-Only changes to files which could potentially be affected by the
-command which is about to be called are committed."
- :package-version '(magit . "2.1.0")
- :group 'magit-wip
- :lighter magit-wip-before-change-mode-lighter
- :global t)
-
-(defun magit-wip-commit-before-change (&optional files msg)
- (when magit-wip-before-change-mode
- (magit-with-toplevel
- (magit-wip-commit files msg))))
-
-(define-minor-mode magit-wip-initial-backup-mode
- "Before saving a buffer for the first time, commit to a wip ref."
- :package-version '(magit . "2.90.0")
- :group 'magit-wip
- :lighter magit-wip-initial-backup-mode-lighter
- :global t
- (if magit-wip-initial-backup-mode
- (add-hook 'before-save-hook 'magit-wip-commit-initial-backup)
- (remove-hook 'before-save-hook 'magit-wip-commit-initial-backup)))
-
-(defun magit--any-wip-mode-enabled-p ()
- "Return non-nil if any global wip mode is enabled."
- (or magit-wip-mode
- magit-wip-after-save-mode
- magit-wip-after-apply-mode
- magit-wip-before-change-mode
- magit-wip-initial-backup-mode))
-
-(defvar-local magit-wip-buffer-backed-up nil)
-(put 'magit-wip-buffer-backed-up 'permanent-local t)
-
-;;;###autoload
-(defun magit-wip-commit-initial-backup ()
- "Before saving, commit current file to a worktree wip ref.
-
-The user has to add this function to `before-save-hook'.
-
-Commit the current state of the visited file before saving the
-current buffer to that file. This backs up the same version of
-the file as `backup-buffer' would, but stores the backup in the
-worktree wip ref, which is also used by the various Magit Wip
-modes, instead of in a backup file as `backup-buffer' would.
-
-This function ignores the variables that affect `backup-buffer'
-and can be used along-side that function, which is recommended
-because this function only backs up files that are tracked in
-a Git repository."
- (when (and (not magit-wip-buffer-backed-up)
- buffer-file-name
- (magit-inside-worktree-p t)
- (magit-file-tracked-p buffer-file-name))
- (let ((magit-save-repository-buffers nil))
- (magit-wip-commit-buffer-file "autosave %s before save"))
- (setq magit-wip-buffer-backed-up t)))
-
-;;; Core
-
-(defun magit-wip-commit (&optional files msg)
- "Commit all tracked files to the work-in-progress refs.
-
-Interactively, commit all changes to all tracked files using
-a generic commit message. With a prefix-argument the commit
-message is read in the minibuffer.
-
-Non-interactively, only commit changes to FILES using MSG as
-commit message."
- (interactive (list nil (if current-prefix-arg
- (magit-read-string "Wip commit message")
- "wip-save tracked files")))
- (--when-let (magit-wip-get-ref)
- (magit-wip-commit-index it files msg)
- (magit-wip-commit-worktree it files msg)))
-
-(defun magit-wip-commit-index (ref files msg)
- (let* ((wipref (magit--wip-index-ref ref))
- (parent (magit-wip-get-parent ref wipref))
- (tree (magit-git-string "write-tree")))
- (magit-wip-update-wipref ref wipref tree parent files msg "index")))
-
-(defun magit-wip-commit-worktree (ref files msg)
- (let* ((wipref (magit--wip-wtree-ref ref))
- (parent (magit-wip-get-parent ref wipref))
- (tree (magit-with-temp-index parent (list "--reset" "-i")
- (if files
- ;; Note: `update-index' is used instead of `add'
- ;; because `add' will fail if a file is already
- ;; deleted in the temporary index.
- (magit-call-git
- "update-index" "--add" "--remove"
- (and (pcase (magit-repository-local-get
- 'update-index-has-ignore-sw-p 'unset)
- (`unset
- (let ((val (version<= "2.25.0"
- (magit-git-version))))
- (magit-repository-local-set
- 'update-index-has-ignore-sw-p val)
- val))
- (val val))
- "--ignore-skip-worktree-entries")
- "--" files)
- (magit-with-toplevel
- (magit-call-git "add" "-u" ".")))
- (magit-git-string "write-tree"))))
- (magit-wip-update-wipref ref wipref tree parent files msg "worktree")))
-
-(defun magit-wip-update-wipref (ref wipref tree parent files msg start-msg)
- (cond
- ((and (not (equal parent wipref))
- (or (not magit-wip-merge-branch)
- (not (magit-rev-verify wipref))))
- (setq start-msg (concat "start autosaving " start-msg))
- (magit-update-ref wipref start-msg
- (magit-git-string "commit-tree" "--no-gpg-sign"
- "-p" parent "-m" start-msg
- (concat parent "^{tree}")))
- (setq parent wipref))
- ((and magit-wip-merge-branch
- (or (not (magit-rev-ancestor-p ref wipref))
- (not (magit-rev-ancestor-p
- (concat (magit-git-string "log" "--format=%H"
- "-1" "--merges" wipref)
- "^2")
- ref))))
- (setq start-msg (format "merge %s into %s" ref start-msg))
- (magit-update-ref wipref start-msg
- (magit-git-string "commit-tree" "--no-gpg-sign"
- "-p" wipref "-p" ref
- "-m" start-msg
- (concat ref "^{tree}")))
- (setq parent wipref)))
- (when (magit-git-failure "diff-tree" "--quiet" parent tree "--" files)
- (unless (and msg (not (= (aref msg 0) ?\s)))
- (let ((len (length files)))
- (setq msg (concat
- (cond ((= len 0) "autosave tracked files")
- ((> len 1) (format "autosave %s files" len))
- (t (concat "autosave "
- (file-relative-name (car files)
- (magit-toplevel)))))
- msg))))
- (magit-update-ref wipref msg
- (magit-git-string "commit-tree" "--no-gpg-sign"
- "-p" parent "-m" msg tree))))
-
-(defun magit-wip-get-ref ()
- (let ((ref (or (magit-git-string "symbolic-ref" "HEAD") "HEAD")))
- (and (magit-rev-verify ref)
- ref)))
-
-(defun magit-wip-get-parent (ref wipref)
- (if (and (magit-rev-verify wipref)
- (equal (magit-git-string "merge-base" wipref ref)
- (magit-rev-verify ref)))
- wipref
- ref))
-
-(defun magit--wip-index-ref (&optional ref)
- (magit--wip-ref "index/" ref))
-
-(defun magit--wip-wtree-ref (&optional ref)
- (magit--wip-ref "wtree/" ref))
-
-(defun magit--wip-ref (namespace &optional ref)
- (concat magit-wip-namespace namespace
- (or (and ref (string-prefix-p "refs/" ref) ref)
- (when-let ((branch (and (not (equal ref "HEAD"))
- (or ref (magit-get-current-branch)))))
- (concat "refs/heads/" branch))
- "HEAD")))
-
-(defun magit-wip-maybe-add-commit-hook ()
- (when (and magit-wip-merge-branch
- (magit-wip-any-enabled-p))
- (add-hook 'git-commit-post-finish-hook 'magit-wip-commit nil t)))
-
-(defun magit-wip-any-enabled-p ()
- (or magit-wip-mode
- magit-wip-after-save-local-mode
- magit-wip-after-save-mode
- magit-wip-after-apply-mode
- magit-wip-before-change-mode
- magit-wip-initial-backup-mode))
-
-;;; Log
-
-(defun magit-wip-log-index (args files)
- "Show log for the index wip ref of the current branch."
- (interactive (magit-log-arguments))
- (magit-log-setup-buffer (list (magit--wip-index-ref)) args files))
-
-(defun magit-wip-log-worktree (args files)
- "Show log for the worktree wip ref of the current branch."
- (interactive (magit-log-arguments))
- (magit-log-setup-buffer (list (magit--wip-wtree-ref)) args files))
-
-(defun magit-wip-log-current (branch args files count)
- "Show log for the current branch and its wip refs.
-With a negative prefix argument only show the worktree wip ref.
-The absolute numeric value of the prefix argument controls how
-many \"branches\" of each wip ref are shown."
- (interactive
- (nconc (list (or (magit-get-current-branch) "HEAD"))
- (magit-log-arguments)
- (list (prefix-numeric-value current-prefix-arg))))
- (magit-wip-log branch args files count))
-
-(defun magit-wip-log (branch args files count)
- "Show log for a branch and its wip refs.
-With a negative prefix argument only show the worktree wip ref.
-The absolute numeric value of the prefix argument controls how
-many \"branches\" of each wip ref are shown."
- (interactive
- (nconc (list (magit-completing-read
- "Log branch and its wip refs"
- (-snoc (magit-list-local-branch-names) "HEAD")
- nil t nil 'magit-revision-history
- (or (magit-branch-at-point)
- (magit-get-current-branch)
- "HEAD")))
- (magit-log-arguments)
- (list (prefix-numeric-value current-prefix-arg))))
- (magit-log-setup-buffer (nconc (list branch)
- (magit-wip-log-get-tips
- (magit--wip-wtree-ref branch)
- (abs count))
- (and (>= count 0)
- (magit-wip-log-get-tips
- (magit--wip-index-ref branch)
- (abs count))))
- args files))
-
-(defun magit-wip-log-get-tips (wipref count)
- (when-let ((reflog (magit-git-lines "reflog" wipref)))
- (let (tips)
- (while (and reflog (> count 1))
- (setq reflog (cl-member "^[^ ]+ [^:]+: restart autosaving"
- reflog :test #'string-match-p))
- (when (and (cadr reflog)
- (string-match "^[^ ]+ \\([^:]+\\)" (cadr reflog)))
- (push (match-string 1 (cadr reflog)) tips))
- (setq reflog (cddr reflog))
- (cl-decf count))
- (cons wipref (nreverse tips)))))
-
-;;; _
-(provide 'magit-wip)
-;;; magit-wip.el ends here
diff --git a/elpa/magit-20200728.45/magit-worktree.el b/elpa/magit-20200728.45/magit-worktree.el
deleted file mode 100644
index 106e91b..0000000
--- a/elpa/magit-20200728.45/magit-worktree.el
+++ /dev/null
@@ -1,184 +0,0 @@
-;;; magit-worktree.el --- worktree support -*- lexical-binding: t -*-
-
-;; Copyright (C) 2010-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library implements support for `git-worktree'.
-
-;;; Code:
-
-(require 'magit)
-
-;;; Options
-
-(defcustom magit-worktree-read-directory-name-function 'read-directory-name
- "Function used to read a directory for worktree commands.
-This is called with one argument, the prompt, and can be used
-to e.g. use a base directory other than `default-directory'.
-Used by `magit-worktree-checkout' and `magit-worktree-branch'."
- :package-version '(magit . "3.0.0")
- :group 'magit-commands
- :type 'function)
-
-;;; Commands
-
-;;;###autoload (autoload 'magit-worktree "magit-worktree" nil t)
-(transient-define-prefix magit-worktree ()
- "Act on a worktree."
- :man-page "git-worktree"
- [["Create new"
- ("b" "worktree" magit-worktree-checkout)
- ("c" "branch and worktree" magit-worktree-branch)]
- ["Commands"
- ("m" "Move worktree" magit-worktree-move)
- ("k" "Delete worktree" magit-worktree-delete)
- ("g" "Visit worktree" magit-worktree-status)]])
-
-;;;###autoload
-(defun magit-worktree-checkout (path branch)
- "Checkout BRANCH in a new worktree at PATH."
- (interactive
- (let ((branch (magit-read-branch-or-commit "Checkout")))
- (list (funcall magit-worktree-read-directory-name-function
- (format "Checkout %s in new worktree: " branch))
- branch)))
- (magit-run-git "worktree" "add" (expand-file-name path) branch)
- (magit-diff-visit-directory path))
-
-;;;###autoload
-(defun magit-worktree-branch (path branch start-point &optional force)
- "Create a new BRANCH and check it out in a new worktree at PATH."
- (interactive
- `(,(funcall magit-worktree-read-directory-name-function
- "Create worktree: ")
- ,@(magit-branch-read-args "Create and checkout branch")
- ,current-prefix-arg))
- (magit-run-git "worktree" "add" (if force "-B" "-b")
- branch (expand-file-name path) start-point)
- (magit-diff-visit-directory path))
-
-;;;###autoload
-(defun magit-worktree-move (worktree path)
- "Move WORKTREE to PATH."
- (interactive
- (list (magit-completing-read "Move worktree"
- (cdr (magit-list-worktrees))
- nil t nil nil
- (magit-section-value-if 'worktree))
- (funcall magit-worktree-read-directory-name-function
- "Move worktree to: ")))
- (if (file-directory-p (expand-file-name ".git" worktree))
- (user-error "You may not move the main working tree")
- (let ((preexisting-directory (file-directory-p path)))
- (when (and (zerop (magit-call-git "worktree" "move" worktree
- (expand-file-name path)))
- (not (file-exists-p default-directory))
- (derived-mode-p 'magit-status-mode))
- (kill-buffer)
- (magit-diff-visit-directory
- (if preexisting-directory
- (concat (file-name-as-directory path)
- (file-name-nondirectory worktree))
- path)))
- (magit-refresh))))
-
-(defun magit-worktree-delete (worktree)
- "Delete a worktree, defaulting to the worktree at point.
-The primary worktree cannot be deleted."
- (interactive
- (list (magit-completing-read "Delete worktree"
- (cdr (magit-list-worktrees))
- nil t nil nil
- (magit-section-value-if 'worktree))))
- (if (file-directory-p (expand-file-name ".git" worktree))
- (user-error "Deleting %s would delete the shared .git directory" worktree)
- (let ((primary (file-name-as-directory (caar (magit-list-worktrees)))))
- (magit-confirm-files (if magit-delete-by-moving-to-trash 'trash 'delete)
- (list "worktree"))
- (when (file-exists-p worktree)
- (let ((delete-by-moving-to-trash magit-delete-by-moving-to-trash))
- (delete-directory worktree t magit-delete-by-moving-to-trash)))
- (if (file-exists-p default-directory)
- (magit-run-git "worktree" "prune")
- (let ((default-directory primary))
- (magit-run-git "worktree" "prune"))
- (when (derived-mode-p 'magit-status-mode)
- (kill-buffer)
- (magit-status-setup-buffer primary))))))
-
-(defun magit-worktree-status (worktree)
- "Show the status for the worktree at point.
-If there is no worktree at point, then read one in the
-minibuffer. If the worktree at point is the one whose
-status is already being displayed in the current buffer,
-then show it in Dired instead."
- (interactive
- (list (or (magit-section-value-if 'worktree)
- (magit-completing-read
- "Show status for worktree"
- (cl-delete (directory-file-name (magit-toplevel))
- (magit-list-worktrees)
- :test #'equal :key #'car)))))
- (magit-diff-visit-directory worktree))
-
-;;; Sections
-
-(defvar magit-worktree-section-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap magit-visit-thing] 'magit-worktree-status)
- (define-key map [remap magit-delete-thing] 'magit-worktree-delete)
- map)
- "Keymap for `worktree' sections.")
-
-(defun magit-insert-worktrees ()
- "Insert sections for all worktrees.
-If there is only one worktree, then insert nothing."
- (let ((worktrees (magit-list-worktrees)))
- (when (> (length worktrees) 1)
- (magit-insert-section (worktrees)
- (magit-insert-heading "Worktrees:")
- (let* ((cols
- (mapcar
- (pcase-lambda (`(,path ,barep ,commit ,branch))
- (cons (cond
- (branch (propertize
- branch 'font-lock-face 'magit-branch-local))
- (commit (propertize (magit-rev-abbrev commit)
- 'font-lock-face 'magit-hash))
- (barep "(bare)"))
- path))
- worktrees))
- (align (1+ (-max (--map (string-width (car it)) cols)))))
- (pcase-dolist (`(,head . ,path) cols)
- (magit-insert-section (worktree path)
- (insert head)
- (indent-to align)
- (insert (let ((r (file-relative-name path))
- (a (abbreviate-file-name path)))
- (if (< (string-width r) (string-width a)) r a)))
- (insert ?\n))))
- (insert ?\n)))))
-
-;;; _
-(provide 'magit-worktree)
-;;; magit-worktree.el ends here
diff --git a/elpa/magit-20200728.45/magit.el b/elpa/magit-20200728.45/magit.el
deleted file mode 100644
index 7516184..0000000
--- a/elpa/magit-20200728.45/magit.el
+++ /dev/null
@@ -1,610 +0,0 @@
-;;; magit.el --- A Git porcelain inside Emacs -*- lexical-binding: t; coding: utf-8 -*-
-
-;; Copyright (C) 2008-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file which
-;; lists all contributors. If not, see http://magit.vc/authors.
-
-;; Author: Marius Vollmer <marius.vollmer@gmail.com>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-;; Kyle Meyer <kyle@kyleam.com>
-;; Noam Postavsky <npostavs@users.sourceforge.net>
-;; Former-Maintainers:
-;; Nicolas Dudebout <nicolas.dudebout@gatech.edu>
-;; Peter J. Weisberg <pj@irregularexpressions.net>
-;; Phil Jackson <phil@shellarchive.co.uk>
-;; Rémi Vanicat <vanicat@debian.org>
-;; Yann Hodique <yann.hodique@gmail.com>
-
-;; Keywords: git tools vc
-;; Homepage: https://github.com/magit/magit
-
-;; Magit requires at least GNU Emacs 25.1 and Git 2.2.0.
-
-;; Magit 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, or (at your option)
-;; any later version.
-;;
-;; Magit 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; Magit is an interface to the version control system Git,
-;; implemented as an Emacs package. Magit aspires to be a complete
-;; Git porcelain. While we cannot (yet) claim, that Magit wraps and
-;; improves upon each and every Git command, it is complete enough to
-;; allow even experienced Git users to perform almost all of their
-;; daily version control tasks directly from within Emacs. While many
-;; fine Git clients exist, only Magit and Git itself deserve to be
-;; called porcelains.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-
-(require 'subr-x)
-
-(require 'with-editor)
-(require 'git-commit)
-(require 'magit-core)
-(require 'magit-diff)
-(require 'magit-log)
-(require 'magit-wip)
-(require 'magit-apply)
-(require 'magit-repos)
-
-(require 'format-spec)
-(require 'package nil t) ; used in `magit-version'
-
-(defconst magit--minimal-git "2.2.0")
-(defconst magit--minimal-emacs "25.1")
-
-;;; Faces
-
-(defface magit-header-line
- '((t :inherit magit-section-heading))
- "Face for the `header-line' in some Magit modes.
-Note that some modes, such as `magit-log-select-mode', have their
-own faces for the `header-line', or for parts of the
-`header-line'."
- :group 'magit-faces)
-
-(defface magit-header-line-key
- '((t :inherit font-lock-builtin-face))
- "Face for keys in the `header-line'."
- :group 'magit-faces)
-
-(defface magit-dimmed
- '((((class color) (background light)) :foreground "grey50")
- (((class color) (background dark)) :foreground "grey50"))
- "Face for text that shouldn't stand out."
- :group 'magit-faces)
-
-(defface magit-hash
- '((((class color) (background light)) :foreground "grey60")
- (((class color) (background dark)) :foreground "grey40"))
- "Face for the sha1 part of the log output."
- :group 'magit-faces)
-
-(defface magit-tag
- '((((class color) (background light)) :foreground "Goldenrod4")
- (((class color) (background dark)) :foreground "LightGoldenrod2"))
- "Face for tag labels shown in log buffer."
- :group 'magit-faces)
-
-(defface magit-branch-remote
- '((((class color) (background light)) :foreground "DarkOliveGreen4")
- (((class color) (background dark)) :foreground "DarkSeaGreen2"))
- "Face for remote branch head labels shown in log buffer."
- :group 'magit-faces)
-
-(defface magit-branch-remote-head
- '((((class color) (background light)) :inherit magit-branch-remote :box t)
- (((class color) (background dark)) :inherit magit-branch-remote :box t))
- "Face for current branch."
- :group 'magit-faces)
-
-(defface magit-branch-local
- '((((class color) (background light)) :foreground "SkyBlue4")
- (((class color) (background dark)) :foreground "LightSkyBlue1"))
- "Face for local branches."
- :group 'magit-faces)
-
-(defface magit-branch-current
- '((((class color) (background light)) :inherit magit-branch-local :box t)
- (((class color) (background dark)) :inherit magit-branch-local :box t))
- "Face for current branch."
- :group 'magit-faces)
-
-(defface magit-branch-upstream
- '((t :slant italic))
- "Face for upstream branch.
-This face is only used in logs and it gets combined
- with `magit-branch-local', `magit-branch-remote'
-and/or `magit-branch-remote-head'."
- :group 'magit-faces)
-
-(defface magit-head
- '((((class color) (background light)) :inherit magit-branch-local)
- (((class color) (background dark)) :inherit magit-branch-local))
- "Face for the symbolic ref `HEAD'."
- :group 'magit-faces)
-
-(defface magit-refname
- '((((class color) (background light)) :foreground "grey30")
- (((class color) (background dark)) :foreground "grey80"))
- "Face for refnames without a dedicated face."
- :group 'magit-faces)
-
-(defface magit-refname-stash
- '((t :inherit magit-refname))
- "Face for stash refnames."
- :group 'magit-faces)
-
-(defface magit-refname-wip
- '((t :inherit magit-refname))
- "Face for wip refnames."
- :group 'magit-faces)
-
-(defface magit-refname-pullreq
- '((t :inherit magit-refname))
- "Face for pullreq refnames."
- :group 'magit-faces)
-
-(defface magit-keyword
- '((t :inherit font-lock-string-face))
- "Face for parts of commit messages inside brackets."
- :group 'magit-faces)
-
-(defface magit-keyword-squash
- '((t :inherit font-lock-warning-face))
- "Face for squash! and fixup! keywords in commit messages."
- :group 'magit-faces)
-
-(defface magit-signature-good
- '((t :foreground "green"))
- "Face for good signatures."
- :group 'magit-faces)
-
-(defface magit-signature-bad
- '((t :foreground "red" :weight bold))
- "Face for bad signatures."
- :group 'magit-faces)
-
-(defface magit-signature-untrusted
- '((t :foreground "cyan"))
- "Face for good untrusted signatures."
- :group 'magit-faces)
-
-(defface magit-signature-expired
- '((t :foreground "orange"))
- "Face for signatures that have expired."
- :group 'magit-faces)
-
-(defface magit-signature-expired-key
- '((t :inherit magit-signature-expired))
- "Face for signatures made by an expired key."
- :group 'magit-faces)
-
-(defface magit-signature-revoked
- '((t :foreground "violet red"))
- "Face for signatures made by a revoked key."
- :group 'magit-faces)
-
-(defface magit-signature-error
- '((t :foreground "firebrick3"))
- "Face for signatures that cannot be checked (e.g. missing key)."
- :group 'magit-faces)
-
-(defface magit-cherry-unmatched
- '((t :foreground "cyan"))
- "Face for unmatched cherry commits."
- :group 'magit-faces)
-
-(defface magit-cherry-equivalent
- '((t :foreground "magenta"))
- "Face for equivalent cherry commits."
- :group 'magit-faces)
-
-(defface magit-filename
- '((t :weight normal))
- "Face for filenames."
- :group 'magit-faces)
-
-;;; Dispatch Popup
-
-;;;###autoload (autoload 'magit-dispatch "magit" nil t)
-(transient-define-prefix magit-dispatch ()
- "Invoke a Magit command from a list of available commands."
- ["Transient and dwim commands"
- [("A" "Apply" magit-cherry-pick)
- ("b" "Branch" magit-branch)
- ("B" "Bisect" magit-bisect)
- ("c" "Commit" magit-commit)
- ("C" "Clone" magit-clone)
- ("d" "Diff" magit-diff)
- ("D" "Diff (change)" magit-diff-refresh)
- ("e" "Ediff (dwim)" magit-ediff-dwim)
- ("E" "Ediff" magit-ediff)]
- [("f" "Fetch" magit-fetch)
- ("F" "Pull" magit-pull)
- ("l" "Log" magit-log)
- ("L" "Log (change)" magit-log-refresh)
- ("m" "Merge" magit-merge)
- ("M" "Remote" magit-remote)
- ("o" "Submodule" magit-submodule)
- ("O" "Subtree" magit-subtree)]
- [("P" "Push" magit-push)
- ("r" "Rebase" magit-rebase)
- ("t" "Tag" magit-tag)
- ("T" "Note" magit-notes)
- ("V" "Revert" magit-revert)
- ("w" "Apply patches" magit-am)
- ("W" "Format patches" magit-patch)
- ("X" "Reset" magit-reset)]
- [("y" "Show Refs" magit-show-refs)
- ("Y" "Cherries" magit-cherry)
- ("z" "Stash" magit-stash)
- ("!" "Run" magit-run)
- ("%" "Worktree" magit-worktree)]]
- ["Applying changes"
- :if-derived magit-mode
- [("a" "Apply" magit-apply)
- ("v" "Reverse" magit-reverse)
- ("k" "Discard" magit-discard)]
- [("s" "Stage" magit-stage)
- ("u" "Unstage" magit-unstage)]
- [("S" "Stage all" magit-stage-modified)
- ("U" "Unstage all" magit-unstage-all)]]
- ["Essential commands"
- :if-derived magit-mode
- ("g" " refresh current buffer" magit-refresh)
- ("<tab>" " toggle section at point" magit-section-toggle)
- ("<return>" "visit thing at point" magit-visit-thing)
- ("C-h m" " show all key bindings" describe-mode)])
-
-;;; Git Popup
-
-(defcustom magit-shell-command-verbose-prompt t
- "Whether to show the working directory when reading a command.
-This affects `magit-git-command', `magit-git-command-topdir',
-`magit-shell-command', and `magit-shell-command-topdir'."
- :package-version '(magit . "2.11.0")
- :group 'magit-commands
- :type 'boolean)
-
-(defvar magit-git-command-history nil)
-
-;;;###autoload (autoload 'magit-run "magit" nil t)
-(transient-define-prefix magit-run ()
- "Run git or another command, or launch a graphical utility."
-
-
- [["Run git subcommand"
- ("!" "in repository root" magit-git-command-topdir)
- ("p" "in working directory" magit-git-command)]
- ["Run shell command"
- ("s" "in repository root" magit-shell-command-topdir)
- ("S" "in working directory" magit-shell-command)]
- ["Launch"
- ("k" "gitk" magit-run-gitk)
- ("a" "gitk --all" magit-run-gitk-all)
- ("b" "gitk --branches" magit-run-gitk-branches)
- ("g" "git gui" magit-run-git-gui)]])
-
-;;;###autoload
-(defun magit-git-command (command)
- "Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. \"git \" is
-used as initial input, but can be deleted to run another command.
-
-With a prefix argument COMMAND is run in the top-level directory
-of the current working tree, otherwise in `default-directory'."
- (interactive (list (magit-read-shell-command nil "git ")))
- (magit--shell-command command))
-
-;;;###autoload
-(defun magit-git-command-topdir (command)
- "Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. \"git \" is
-used as initial input, but can be deleted to run another command.
-
-COMMAND is run in the top-level directory of the current
-working tree."
- (interactive (list (magit-read-shell-command t "git ")))
- (magit--shell-command command (magit-toplevel)))
-
-;;;###autoload
-(defun magit-shell-command (command)
- "Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. With a
-prefix argument COMMAND is run in the top-level directory of
-the current working tree, otherwise in `default-directory'."
- (interactive (list (magit-read-shell-command)))
- (magit--shell-command command))
-
-;;;###autoload
-(defun magit-shell-command-topdir (command)
- "Execute COMMAND asynchronously; display output.
-
-Interactively, prompt for COMMAND in the minibuffer. COMMAND
-is run in the top-level directory of the current working tree."
- (interactive (list (magit-read-shell-command t)))
- (magit--shell-command command (magit-toplevel)))
-
-(defun magit--shell-command (command &optional directory)
- (let ((default-directory (or directory default-directory))
- (process-environment process-environment))
- (push "GIT_PAGER=cat" process-environment)
- (magit-start-process shell-file-name nil
- shell-command-switch command))
- (magit-process-buffer))
-
-(defun magit-read-shell-command (&optional toplevel initial-input)
- (let ((default-directory
- (if (or toplevel current-prefix-arg)
- (or (magit-toplevel)
- (magit--not-inside-repository-error))
- default-directory)))
- (read-shell-command (if magit-shell-command-verbose-prompt
- (format "Async shell command in %s: "
- (abbreviate-file-name default-directory))
- "Async shell command: ")
- initial-input 'magit-git-command-history)))
-
-;;; Font-Lock Keywords
-
-(defconst magit-font-lock-keywords
- (eval-when-compile
- `((,(concat "(\\(magit-define-section-jumper\\)\\_>"
- "[ \t'\(]*"
- "\\(\\(?:\\sw\\|\\s_\\)+\\)?")
- (1 'font-lock-keyword-face)
- (2 'font-lock-function-name-face nil t))
- (,(concat "(" (regexp-opt '("magit-insert-section"
- "magit-section-case"
- "magit-bind-match-strings"
- "magit-with-temp-index"
- "magit-with-blob"
- "magit-with-toplevel") t)
- "\\_>")
- . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode magit-font-lock-keywords)
-
-;;; Version
-
-(defvar magit-version 'undefined
- "The version of Magit that you're using.
-Use the function by the same name instead of this variable.")
-
-;;;###autoload
-(defun magit-version (&optional print-dest)
- "Return the version of Magit currently in use.
-If optional argument PRINT-DEST is non-nil, output
-stream (interactively, the echo area, or the current buffer with
-a prefix argument), also print the used versions of Magit, Git,
-and Emacs to it."
- (interactive (list (if current-prefix-arg (current-buffer) t)))
- (let ((magit-git-global-arguments nil)
- (toplib (or load-file-name buffer-file-name))
- debug)
- (unless (and toplib
- (equal (file-name-nondirectory toplib) "magit.el"))
- (setq toplib (locate-library "magit.el")))
- (setq toplib (and toplib (magit--straight-chase-links toplib)))
- (push toplib debug)
- (when toplib
- (let* ((topdir (file-name-directory toplib))
- (gitdir (expand-file-name
- ".git" (file-name-directory
- (directory-file-name topdir))))
- (static (locate-library "magit-version.el" nil (list topdir)))
- (static (and static (magit--straight-chase-links static))))
- (or (progn
- (push 'repo debug)
- (when (and (file-exists-p gitdir)
- ;; It is a repo, but is it the Magit repo?
- (file-exists-p
- (expand-file-name "../lisp/magit.el" gitdir)))
- (push t debug)
- ;; Inside the repo the version file should only exist
- ;; while running make.
- (when (and static (not noninteractive))
- (ignore-errors (delete-file static)))
- (setq magit-version
- (let ((default-directory topdir))
- (magit-git-string "describe" "--tags" "--dirty")))))
- (progn
- (push 'static debug)
- (when (and static (file-exists-p static))
- (push t debug)
- (load-file static)
- magit-version))
- (when (featurep 'package)
- (push 'elpa debug)
- (ignore-errors
- (--when-let (assq 'magit package-alist)
- (push t debug)
- (setq magit-version
- (and (fboundp 'package-desc-version)
- (package-version-join
- (package-desc-version (cadr it))))))))
- (progn
- (push 'dirname debug)
- (let ((dirname (file-name-nondirectory
- (directory-file-name topdir))))
- (when (string-match "\\`magit-\\([0-9].*\\)" dirname)
- (setq magit-version (match-string 1 dirname)))))
- ;; If all else fails, just report the commit hash. It's
- ;; better than nothing and we cannot do better in the case
- ;; of e.g. a shallow clone.
- (progn
- (push 'hash debug)
- ;; Same check as above to see if it's really the Magit repo.
- (when (and (file-exists-p gitdir)
- (file-exists-p
- (expand-file-name "../lisp/magit.el" gitdir)))
- (setq magit-version
- (let ((default-directory topdir))
- (magit-git-string "rev-parse" "HEAD"))))))))
- (if (stringp magit-version)
- (when print-dest
- (princ (format "Magit %s, Git %s, Emacs %s, %s"
- (or magit-version "(unknown)")
- (or (let ((magit-git-debug
- (lambda (err)
- (display-warning '(magit git)
- err :error))))
- (magit-git-version t))
- "(unknown)")
- emacs-version
- system-type)
- print-dest))
- (setq debug (reverse debug))
- (setq magit-version 'error)
- (when magit-version
- (push magit-version debug))
- (unless (equal (getenv "TRAVIS") "true")
- ;; The repository is a sparse clone.
- (message "Cannot determine Magit's version %S" debug)))
- magit-version))
-
-;;; Debugging Tools
-
-(defun magit-debug-git-executable ()
- "Display a buffer with information about `magit-git-executable'.
-See info node `(magit)Debugging Tools' for more information."
- (interactive)
- (with-current-buffer (get-buffer-create "*magit-git-debug*")
- (pop-to-buffer (current-buffer))
- (erase-buffer)
- (insert (concat
- (format "magit-git-executable: %S" magit-git-executable)
- (and (not (file-name-absolute-p magit-git-executable))
- (format " [%S]" (executable-find magit-git-executable)))
- (format " (%s)\n"
- (let* ((errmsg nil)
- (magit-git-debug (lambda (err) (setq errmsg err))))
- (or (magit-git-version t) errmsg)))))
- (insert (format "exec-path: %S\n" exec-path))
- (--when-let (cl-set-difference
- (-filter #'file-exists-p (remq nil (parse-colon-path
- (getenv "PATH"))))
- (-filter #'file-exists-p (remq nil exec-path))
- :test #'file-equal-p)
- (insert (format " entries in PATH, but not in exec-path: %S\n" it)))
- (dolist (execdir exec-path)
- (insert (format " %s (%s)\n" execdir (car (file-attributes execdir))))
- (when (file-directory-p execdir)
- (dolist (exec (directory-files
- execdir t (concat
- "\\`git" (regexp-opt exec-suffixes) "\\'")))
- (insert (format " %s (%s)\n" exec
- (let* ((magit-git-executable exec)
- (errmsg nil)
- (magit-git-debug (lambda (err) (setq errmsg err))))
- (or (magit-git-version t) errmsg)))))))))
-
-;;; Startup Asserts
-
-(defun magit-startup-asserts ()
- (when-let ((val (getenv "GIT_DIR")))
- (setenv "GIT_DIR")
- (message "Magit unset $GIT_DIR (was %S). See \
-https://github.com/magit/magit/wiki/Don't-set-$GIT_DIR-and-alike" val))
- (when-let ((val (getenv "GIT_WORK_TREE")))
- (setenv "GIT_WORK_TREE")
- (message "Magit unset $GIT_WORK_TREE (was %S). See \
-https://github.com/magit/magit/wiki/Don't-set-$GIT_DIR-and-alike" val))
- (let ((version (magit-git-version)))
- (when (and version
- (version< version magit--minimal-git)
- (not (equal (getenv "TRAVIS") "true")))
- (display-warning 'magit (format "\
-Magit requires Git >= %s, you are using %s.
-
-If this comes as a surprise to you, because you do actually have
-a newer version installed, then that probably means that the
-older version happens to appear earlier on the `$PATH'. If you
-always start Emacs from a shell, then that can be fixed in the
-shell's init file. If you start Emacs by clicking on an icon,
-or using some sort of application launcher, then you probably
-have to adjust the environment as seen by graphical interface.
-For X11 something like ~/.xinitrc should work.
-
-If you use Tramp to work inside remote Git repositories, then you
-have to make sure a suitable Git is used on the remote machines
-too.\n" magit--minimal-git version) :error)))
- (when (version< emacs-version magit--minimal-emacs)
- (display-warning 'magit (format "\
-Magit requires Emacs >= %s, you are using %s.
-
-If this comes as a surprise to you, because you do actually have
-a newer version installed, then that probably means that the
-older version happens to appear earlier on the `$PATH'. If you
-always start Emacs from a shell, then that can be fixed in the
-shell's init file. If you start Emacs by clicking on an icon,
-or using some sort of application launcher, then you probably
-have to adjust the environment as seen by graphical interface.
-For X11 something like ~/.xinitrc should work.\n"
- magit--minimal-emacs emacs-version)
- :error)))
-
-;;; Loading Libraries
-
-(provide 'magit)
-
-(cl-eval-when (load eval)
- (require 'magit-status)
- (require 'magit-refs)
- (require 'magit-files)
- (require 'magit-reset)
- (require 'magit-branch)
- (require 'magit-merge)
- (require 'magit-tag)
- (require 'magit-worktree)
- (require 'magit-notes)
- (require 'magit-sequence)
- (require 'magit-commit)
- (require 'magit-remote)
- (require 'magit-clone)
- (require 'magit-fetch)
- (require 'magit-pull)
- (require 'magit-push)
- (require 'magit-bisect)
- (require 'magit-stash)
- (require 'magit-blame)
- (require 'magit-obsolete)
- (require 'magit-submodule)
- (unless (load "magit-autoloads" t t)
- (require 'magit-patch)
- (require 'magit-subtree)
- (require 'magit-ediff)
- (require 'magit-gitignore)
- (require 'magit-extras)
- (require 'git-rebase)
- (require 'magit-imenu)
- (require 'magit-bookmark)))
-
-(eval-after-load 'bookmark
- '(require 'magit-bookmark))
-
-(if after-init-time
- (progn (magit-startup-asserts)
- (magit-version))
- (add-hook 'after-init-hook #'magit-startup-asserts t)
- (add-hook 'after-init-hook #'magit-version t))
-
-;;; magit.el ends here
diff --git a/elpa/magit-20200728.45/magit.info b/elpa/magit-20200728.45/magit.info
deleted file mode 100644
index 63dd96e..0000000
--- a/elpa/magit-20200728.45/magit.info
+++ /dev/null
@@ -1,193 +0,0 @@
-This is magit.info, produced by makeinfo version 6.5 from magit.texi.
-
- Copyright (C) 2015-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Magit: (magit). Using Git from Emacs with Magit.
-END-INFO-DIR-ENTRY
-
-
-Indirect:
-magit.info-1: 754
-magit.info-2: 302557
-
-Tag Table:
-(Indirect)
-Node: Top754
-Node: Introduction6464
-Node: Installation11187
-Node: Installing from Melpa11517
-Node: Installing from the Git Repository12590
-Node: Post-Installation Tasks14938
-Node: Getting Started16223
-Node: Interface Concepts21672
-Node: Modes and Buffers22033
-Node: Switching Buffers23782
-Node: Naming Buffers28533
-Node: Quitting Windows31840
-Node: Automatic Refreshing of Magit Buffers33586
-Node: Automatic Saving of File-Visiting Buffers36438
-Node: Automatic Reverting of File-Visiting Buffers37623
-Node: Risk of Reverting Automatically42618
-Node: Sections45000
-Node: Section Movement45926
-Node: Section Visibility50836
-Node: Section Hooks56913
-Node: Section Types and Values59320
-Node: Section Options60623
-Node: Transient Commands61095
-Node: Transient Arguments and Buffer Variables62332
-Node: Completion Confirmation and the Selection69350
-Node: Action Confirmation69794
-Node: Completion and Confirmation77144
-Node: The Selection80330
-Node: The hunk-internal region83229
-Node: Support for Completion Frameworks84318
-Node: Additional Completion Options89225
-Node: Running Git89824
-Node: Viewing Git Output90097
-Node: Git Process Status91230
-Node: Running Git Manually92195
-Node: Git Executable94665
-Node: Global Git Arguments96947
-Node: Inspecting97753
-Node: Status Buffer98910
-Node: Status Sections102900
-Node: Status Header Sections108452
-Node: Status Module Sections111082
-Node: Status Options113587
-Node: Repository List115056
-Node: Logging118094
-Node: Refreshing Logs120657
-Node: Log Buffer122103
-Node: Log Margin125959
-Node: Select from Log129138
-Node: Reflog131363
-Node: Cherries133020
-Node: Diffing134868
-Node: Refreshing Diffs137949
-Node: Commands Available in Diffs141528
-Node: Diff Options144064
-Node: Revision Buffer149102
-Node: Ediffing152432
-Node: References Buffer156080
-Node: References Sections166600
-Node: Bisecting167461
-Node: Visiting Files and Blobs169274
-Node: General-Purpose Visit Commands169744
-Node: Visiting Files and Blobs from a Diff170700
-Node: Blaming174159
-Node: Manipulating180722
-Node: Creating Repository181064
-Node: Cloning Repository181619
-Node: Staging and Unstaging187024
-Node: Staging from File-Visiting Buffers191107
-Node: Applying192275
-Node: Committing194168
-Node: Initiating a Commit194751
-Node: Editing Commit Messages198136
-Node: Using the Revision Stack200939
-Node: Commit Pseudo Headers203990
-Node: Commit Mode and Hooks205326
-Node: Commit Message Conventions208264
-Node: Branching210392
-Node: The Two Remotes210618
-Node: Branch Commands213271
-Node: Branch Git Variables225652
-Node: Auxiliary Branch Commands231043
-Node: Merging232161
-Node: Resolving Conflicts236169
-Node: Rebasing241170
-Node: Editing Rebase Sequences246029
-Node: Information About In-Progress Rebase250357
-Ref: Information About In-Progress Rebase-Footnote-1259239
-Node: Cherry Picking259835
-Node: Reverting264166
-Node: Resetting265615
-Node: Stashing267481
-Node: Transferring272182
-Node: Remotes272404
-Node: Remote Commands272556
-Node: Remote Git Variables276637
-Node: Fetching277916
-Node: Pulling280403
-Node: Pushing281449
-Node: Plain Patches284919
-Node: Maildir Patches286410
-Node: Miscellaneous287924
-Node: Tagging288240
-Node: Notes290157
-Node: Submodules292529
-Node: Listing Submodules292747
-Node: Submodule Transient294153
-Node: Subtree296675
-Node: Worktree298651
-Node: Common Commands299756
-Node: Wip Modes302557
-Node: Wip Graph307490
-Node: Legacy Wip Modes309804
-Node: Minor Mode for Buffers Visiting Files312699
-Node: Minor Mode for Buffers Visiting Blobs319800
-Node: Customizing320613
-Node: Per-Repository Configuration322209
-Node: Essential Settings324464
-Node: Safety324788
-Node: Performance326549
-Node: Microsoft Windows Performance333692
-Node: MacOS Performance334883
-Ref: MacOS Performance-Footnote-1335898
-Node: Plumbing335980
-Node: Calling Git336809
-Node: Getting a Value from Git338334
-Node: Calling Git for Effect341420
-Node: Section Plumbing347942
-Node: Creating Sections348170
-Node: Section Selection352070
-Node: Matching Sections353869
-Node: Refreshing Buffers359842
-Node: Conventions362990
-Node: Theming Faces363182
-Node: FAQ371297
-Node: FAQ - How to ...?371739
-Node: How to show git's output?372124
-Node: How to install the gitman info manual?372878
-Node: How to show diffs for gpg-encrypted files?373848
-Node: How does branching and pushing work?374444
-Node: Can Magit be used as ediff-version-control-package?374807
-Node: Should I disable VC?376825
-Node: FAQ - Issues and Errors377443
-Node: Magit is slow378339
-Node: I changed several thousand files at once and now Magit is unusable378553
-Node: I am having problems committing379282
-Node: I am using MS Windows and cannot push with Magit379763
-Node: I am using OS X and SOMETHING works in shell but not in Magit380380
-Node: Expanding a file to show the diff causes it to disappear381211
-Node: Point is wrong in the COMMIT_EDITMSG buffer381792
-Node: The mode-line information isn't always up-to-date382838
-Node: A branch and tag sharing the same name breaks SOMETHING383901
-Node: My Git hooks work on the command-line but not inside Magit384787
-Node: git-commit-mode isn't used when committing from the command-line385633
-Node: Point ends up inside invisible text when jumping to a file-visiting buffer387900
-Node: Debugging Tools388698
-Node: Keystroke Index390877
-Node: Command Index424934
-Node: Function Index462032
-Node: Variable Index478311
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/magit-20200728.45/magit.info-1 b/elpa/magit-20200728.45/magit.info-1
deleted file mode 100644
index ad68c3c..0000000
--- a/elpa/magit-20200728.45/magit.info-1
+++ /dev/null
@@ -1,7817 +0,0 @@
-This is magit.info, produced by makeinfo version 6.5 from magit.texi.
-
- Copyright (C) 2015-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Magit: (magit). Using Git from Emacs with Magit.
-END-INFO-DIR-ENTRY
-
-
-File: magit.info, Node: Top, Next: Introduction, Up: (dir)
-
-Magit User Manual
-*****************
-
-Magit is an interface to the version control system Git, implemented as
-an Emacs package. Magit aspires to be a complete Git porcelain. While
-we cannot (yet) claim that Magit wraps and improves upon each and every
-Git command, it is complete enough to allow even experienced Git users
-to perform almost all of their daily version control tasks directly from
-within Emacs. While many fine Git clients exist, only Magit and Git
-itself deserve to be called porcelains.
-
-This manual is for Magit version 2.90.1 (v2.90.1-1023-g7d4bcd72+1).
-
- Copyright (C) 2015-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-* Menu:
-
-* Introduction::
-* Installation::
-* Getting Started::
-* Interface Concepts::
-* Inspecting::
-* Manipulating::
-* Transferring::
-* Miscellaneous::
-* Customizing::
-* Plumbing::
-* FAQ::
-* Debugging Tools::
-* Keystroke Index::
-* Command Index::
-* Function Index::
-* Variable Index::
-
-— The Detailed Node Listing —
-
-Installation
-
-* Installing from Melpa::
-* Installing from the Git Repository::
-* Post-Installation Tasks::
-
-Interface Concepts
-
-* Modes and Buffers::
-* Sections::
-* Transient Commands::
-* Transient Arguments and Buffer Variables::
-* Completion, Confirmation and the Selection: Completion Confirmation and the Selection.
-* Running Git::
-
-Modes and Buffers
-
-* Switching Buffers::
-* Naming Buffers::
-* Quitting Windows::
-* Automatic Refreshing of Magit Buffers::
-* Automatic Saving of File-Visiting Buffers::
-* Automatic Reverting of File-Visiting Buffers::
-
-
-Sections
-
-* Section Movement::
-* Section Visibility::
-* Section Hooks::
-* Section Types and Values::
-* Section Options::
-
-
-Completion, Confirmation and the Selection
-
-* Action Confirmation::
-* Completion and Confirmation::
-* The Selection::
-* The hunk-internal region::
-* Support for Completion Frameworks::
-* Additional Completion Options::
-
-
-Running Git
-
-* Viewing Git Output::
-* Git Process Status::
-* Running Git Manually::
-* Git Executable::
-* Global Git Arguments::
-
-
-Inspecting
-
-* Status Buffer::
-* Repository List::
-* Logging::
-* Diffing::
-* Ediffing::
-* References Buffer::
-* Bisecting::
-* Visiting Files and Blobs::
-* Blaming::
-
-Status Buffer
-
-* Status Sections::
-* Status Header Sections::
-* Status Module Sections::
-* Status Options::
-
-
-Logging
-
-* Refreshing Logs::
-* Log Buffer::
-* Log Margin::
-* Select from Log::
-* Reflog::
-* Cherries::
-
-
-Diffing
-
-* Refreshing Diffs::
-* Commands Available in Diffs::
-* Diff Options::
-* Revision Buffer::
-
-
-References Buffer
-
-* References Sections::
-
-
-Visiting Files and Blobs
-
-* General-Purpose Visit Commands::
-* Visiting Files and Blobs from a Diff::
-
-
-Manipulating
-
-* Creating Repository::
-* Cloning Repository::
-* Staging and Unstaging::
-* Applying::
-* Committing::
-* Branching::
-* Merging::
-* Resolving Conflicts::
-* Rebasing::
-* Cherry Picking::
-* Resetting::
-* Stashing::
-
-Staging and Unstaging
-
-* Staging from File-Visiting Buffers::
-
-
-Committing
-
-* Initiating a Commit::
-* Editing Commit Messages::
-
-
-Branching
-
-* The Two Remotes::
-* Branch Commands::
-* Branch Git Variables::
-* Auxiliary Branch Commands::
-
-
-Rebasing
-
-* Editing Rebase Sequences::
-* Information About In-Progress Rebase::
-
-
-Cherry Picking
-
-* Reverting::
-
-
-Transferring
-
-* Remotes::
-* Fetching::
-* Pulling::
-* Pushing::
-* Plain Patches::
-* Maildir Patches::
-
-Remotes
-
-* Remote Commands::
-* Remote Git Variables::
-
-
-Miscellaneous
-
-* Tagging::
-* Notes::
-* Submodules::
-* Subtree::
-* Worktree::
-* Common Commands::
-* Wip Modes::
-* Minor Mode for Buffers Visiting Files::
-* Minor Mode for Buffers Visiting Blobs::
-
-Submodules
-
-* Listing Submodules::
-* Submodule Transient::
-
-
-Wip Modes
-
-* Wip Graph::
-* Legacy Wip Modes::
-
-
-Customizing
-
-* Per-Repository Configuration::
-* Essential Settings::
-
-Essential Settings
-
-* Safety::
-* Performance::
-
-
-Plumbing
-
-* Calling Git::
-* Section Plumbing::
-* Refreshing Buffers::
-* Conventions::
-
-Calling Git
-
-* Getting a Value from Git::
-* Calling Git for Effect::
-
-
-Section Plumbing
-
-* Creating Sections::
-* Section Selection::
-* Matching Sections::
-
-
-Conventions
-
-* Theming Faces::
-
-
-FAQ
-
-* FAQ - How to ...?::
-* FAQ - Issues and Errors::
-
-FAQ - How to ...?
-
-* How to show git's output?::
-* How to install the gitman info manual?::
-* How to show diffs for gpg-encrypted files?::
-* How does branching and pushing work?::
-* Can Magit be used as ediff-version-control-package?::
-* Should I disable VC?::
-
-
-FAQ - Issues and Errors
-
-* Magit is slow::
-* I changed several thousand files at once and now Magit is unusable::
-* I am having problems committing::
-* I am using MS Windows and cannot push with Magit::
-* I am using OS X and SOMETHING works in shell, but not in Magit: I am using OS X and SOMETHING works in shell but not in Magit.
-* Expanding a file to show the diff causes it to disappear::
-* Point is wrong in the COMMIT_EDITMSG buffer::
-* The mode-line information isn't always up-to-date::
-* A branch and tag sharing the same name breaks SOMETHING::
-* My Git hooks work on the command-line but not inside Magit::
-* git-commit-mode isn't used when committing from the command-line::
-* Point ends up inside invisible text when jumping to a file-visiting buffer::
-
-
-
-
-File: magit.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-Magit is an interface to the version control system Git, implemented as
-an Emacs package. Magit aspires to be a complete Git porcelain. While
-we cannot (yet) claim that Magit wraps and improves upon each and every
-Git command, it is complete enough to allow even experienced Git users
-to perform almost all of their daily version control tasks directly from
-within Emacs. While many fine Git clients exist, only Magit and Git
-itself deserve to be called porcelains.
-
- Staging and otherwise applying changes is one of the most important
-features in a Git porcelain and here Magit outshines anything else,
-including Git itself. Git’s own staging interface (‘git add --patch’)
-is so cumbersome that many users only use it in exceptional cases. In
-Magit staging a hunk or even just part of a hunk is as trivial as
-staging all changes made to a file.
-
- The most visible part of Magit’s interface is the status buffer,
-which displays information about the current repository. Its content is
-created by running several Git commands and making their output
-actionable. Among other things, it displays information about the
-current branch, lists unpulled and unpushed changes and contains
-sections displaying the staged and unstaged changes. That might sound
-noisy, but, since sections are collapsible, it’s not.
-
- To stage or unstage a change one places the cursor on the change and
-then types ‘s’ or ‘u’. The change can be a file or a hunk, or when the
-region is active (i.e. when there is a selection) several files or
-hunks, or even just part of a hunk. The change or changes that these
-commands - and many others - would act on are highlighted.
-
- Magit also implements several other "apply variants" in addition to
-staging and unstaging. One can discard or reverse a change, or apply it
-to the working tree. Git’s own porcelain only supports this for staging
-and unstaging and you would have to do something like ‘git diff ... |
-??? | git apply ...’ to discard, revert, or apply a single hunk on the
-command line. In fact that’s exactly what Magit does internally (which
-is what lead to the term "apply variants").
-
- Magit isn’t just for Git experts, but it does assume some prior
-experience with Git as well as Emacs. That being said, many users have
-reported that using Magit was what finally taught them what Git is
-capable of and how to use it to its fullest. Other users wished they
-had switched to Emacs sooner so that they would have gotten their hands
-on Magit earlier.
-
- While one has to know the basic features of Emacs to be able to make
-full use of Magit, acquiring just enough Emacs skills doesn’t take long
-and is worth it, even for users who prefer other editors. Vim users are
-advised to give Evil (https://bitbucket.org/lyro/evil/wiki/Home), the
-"Extensible VI Layer for Emacs", and Spacemacs
-(https://github.com/syl20bnr/spacemacs), an "Emacs starter-kit focused
-on Evil" a try.
-
- Magit provides a consistent and efficient Git porcelain. After a
-short learning period, you will be able to perform most of your daily
-version control tasks faster than you would on the command line. You
-will likely also start using features that seemed too daunting in the
-past.
-
- Magit fully embraces Git. It exposes many advanced features using a
-simple but flexible interface instead of only wrapping the trivial ones
-like many GUI clients do. Of course Magit supports logging, cloning,
-pushing, and other commands that usually don’t fail in spectacular ways;
-but it also supports tasks that often cannot be completed in a single
-step. Magit fully supports tasks such as merging, rebasing,
-cherry-picking, reverting, and blaming by not only providing a command
-to initiate these tasks but also by displaying context sensitive
-information along the way and providing commands that are useful for
-resolving conflicts and resuming the sequence after doing so.
-
- Magit wraps and in many cases improves upon at least the following
-Git porcelain commands: ‘add’, ‘am’, ‘bisect’, ‘blame’, ‘branch’,
-‘checkout’, ‘cherry’, ‘cherry-pick’, ‘clean’, ‘clone’, ‘commit’,
-‘config’, ‘describe’, ‘diff’, ‘fetch’, ‘format-patch’, ‘init’, ‘log’,
-‘merge’, ‘merge-tree’, ‘mv’, ‘notes’, ‘pull’, ‘rebase’, ‘reflog’,
-‘remote’, ‘request-pull’, ‘reset’, ‘revert’, ‘rm’, ‘show’, ‘stash’,
-‘submodule’, ‘subtree’, ‘tag’, and ‘worktree.’ Many more Magit porcelain
-commands are implemented on top of Git plumbing commands.
-
-
-File: magit.info, Node: Installation, Next: Getting Started, Prev: Introduction, Up: Top
-
-2 Installation
-**************
-
-Magit can be installed using Emacs’ package manager or manually from its
-development repository.
-
-* Menu:
-
-* Installing from Melpa::
-* Installing from the Git Repository::
-* Post-Installation Tasks::
-
-
-File: magit.info, Node: Installing from Melpa, Next: Installing from the Git Repository, Up: Installation
-
-2.1 Installing from Melpa
-=========================
-
-Magit is available from Melpa and Melpa-Stable. If you haven’t used
-Emacs’ package manager before, then it is high time you familiarize
-yourself with it by reading the documentation in the Emacs manual, see
-*note (emacs)Packages::. Then add one of the archives to
-‘package-archives’:
-
- • To use Melpa:
-
- (require 'package)
- (add-to-list 'package-archives
- '("melpa" . "http://melpa.org/packages/") t)
-
- • To use Melpa-Stable:
-
- (require 'package)
- (add-to-list 'package-archives
- '("melpa-stable" . "http://stable.melpa.org/packages/") t)
-
- Once you have added your preferred archive, you need to update the
-local package list using:
-
- M-x package-refresh-contents RET
-
- Once you have done that, you can install Magit and its dependencies
-using:
-
- M-x package-install RET magit RET
-
- Now see *note Post-Installation Tasks::.
-
-
-File: magit.info, Node: Installing from the Git Repository, Next: Post-Installation Tasks, Prev: Installing from Melpa, Up: Installation
-
-2.2 Installing from the Git Repository
-======================================
-
-Magit depends on the ‘dash’, ‘transient’ and ‘with-editor’ libraries
-which are available from Melpa and Melpa-Stable. Install them using
-‘M-x package-install RET <package> RET’. Of course you may also install
-them manually from their repository.
-
- Then clone the Magit repository:
-
- $ git clone https://github.com/magit/magit.git ~/.emacs.d/site-lisp/magit
- $ cd ~/.emacs.d/site-lisp/magit
-
- Then compile the libraries and generate the info manuals:
-
- $ make
-
- If you haven’t installed ‘dash’, ‘transient’ and ‘with-editor’ from
-Melpa or at ‘/path/to/magit/../<package>’, then you have to tell ‘make’
-where to find them. To do so create the file ‘/path/to/magit/config.mk’
-with the following content before running ‘make’:
-
- LOAD_PATH = -L /path/to/magit/lisp
- LOAD_PATH += -L /path/to/dash
- LOAD_PATH += -L /path/to/transient
- LOAD_PATH += -L /path/to/with-editor
-
- Finally add this to your init file:
-
- (add-to-list 'load-path "~/.emacs.d/site-lisp/magit/lisp")
- (require 'magit)
-
- (with-eval-after-load 'info
- (info-initialize)
- (add-to-list 'Info-directory-list
- "~/.emacs.d/site-lisp/magit/Documentation/"))
-
- Note that you have to add the ‘lisp’ subdirectory to the ‘load-path’,
-not the top-level of the repository, and that elements of ‘load-path’
-should not end with a slash, while those of ‘Info-directory-list’
-should.
-
- Instead of requiring the feature ‘magit’, you could load just the
-autoload definitions, by loading the file ‘magit-autoloads.el’.
-
- (load "/path/to/magit/lisp/magit-autoloads")
-
- Instead of running Magit directly from the repository by adding that
-to the ‘load-path’, you might want to instead install it in some other
-directory using ‘sudo make install’ and setting ‘load-path’ accordingly.
-
- To update Magit use:
-
- $ git pull
- $ make
-
- At times it might be necessary to run ‘make clean all’ instead.
-
- To view all available targets use ‘make help’.
-
- Now see *note Post-Installation Tasks::.
-
-
-File: magit.info, Node: Post-Installation Tasks, Prev: Installing from the Git Repository, Up: Installation
-
-2.3 Post-Installation Tasks
-===========================
-
-After installing Magit you should verify that you are indeed using the
-Magit, Git, and Emacs releases you think you are using. It’s best to
-restart Emacs before doing so, to make sure you are not using an
-outdated value for ‘load-path’.
-
- M-x magit-version RET
-
- should display something like
-
- Magit 2.8.0, Git 2.10.2, Emacs 25.1.1, gnu/linux
-
- Then you might also want to read about options that many users likely
-want to customize. See *note Essential Settings::.
-
- To be able to follow cross references to Git manpages found in this
-manual, you might also have to manually install the ‘gitman’ info
-manual, or advice ‘Info-follow-nearest-node’ to instead open the actual
-manpage. See *note How to install the gitman info manual?::.
-
- If you are completely new to Magit then see *note Getting Started::.
-
- If you run into problems, then please see the *note FAQ::. Also see
-the *note Debugging Tools::.
-
- And last but not least please consider making a donation, to ensure
-that I can keep working on Magit. See <https://magit.vc/donations>.
-for various donation options.
-
-
-File: magit.info, Node: Getting Started, Next: Interface Concepts, Prev: Installation, Up: Top
-
-3 Getting Started
-*****************
-
-This short tutorial describes the most essential features that many
-Magitians use on a daily basis. It only scratches the surface but
-should be enough to get you started.
-
- IMPORTANT: It is safest if you clone some repository just for this
-tutorial. Alternatively you can use an existing local repository, but
-if you do that, then you should commit all uncommitted changes before
-proceeding.
-
- To display information about the current Git repository, type ‘M-x
-magit-status RET’. You will be using this command a lot, and should
-therefore give it a global key binding. This is what we recommend:
-
- (global-set-key (kbd "C-x g") 'magit-status)
-
- Most Magit commands are commonly invoked from the status buffer. It
-can be considered the primary interface for interacting with Git using
-Magit. Many other Magit buffers may exist at a given time, but they are
-often created from this buffer.
-
- Depending on what state your repository is in, this buffer may
-contain sections titled "Staged changes", "Unstaged changes", "Unmerged
-into origin/master", "Unpushed to origin/master", and many others.
-
- Since we are starting from a safe state, which you can easily return
-to (by doing a ‘git reset --hard PRE-MAGIT-STATE’), there currently are
-no staged or unstaged changes. Edit some files and save the changes.
-Then go back to the status buffer, while at the same time refreshing it,
-by typing ‘C-x g’. (When the status buffer, or any Magit buffer for
-that matter, is the current buffer, then you can also use just ‘g’ to
-refresh it).
-
- Move between sections using ‘p’ and ‘n’. Note that the bodies of
-some sections are hidden. Type ‘TAB’ to expand or collapse the section
-at point. You can also use ‘C-tab’ to cycle the visibility of the
-current section and its children. Move to a file section inside the
-section named "Unstaged changes" and type ‘s’ to stage the changes you
-have made to that file. That file now appears under "Staged changes".
-
- Magit can stage and unstage individual hunks, not just complete
-files. Move to the file you have just staged, expand it using ‘TAB’,
-move to one of the hunks using ‘n’, and unstage just that by typing ‘u’.
-Note how the staging (‘s’) and unstaging (‘u’) commands operate on the
-change at point. Many other commands behave the same way.
-
- You can also un-/stage just part of a hunk. Inside the body of a
-hunk section (move there using ‘C-n’), set the mark using ‘C-SPC’ and
-move down until some added and/or removed lines fall inside the region
-but not all of them. Again type ‘s’ to stage.
-
- It is also possible to un-/stage multiple files at once. Move to a
-file section, type ‘C-SPC’, move to the next file using ‘n’, and then
-‘s’ to stage both files. Note that both the mark and point have to be
-on the headings of sibling sections for this to work. If the region
-looks like it does in other buffers, then it doesn’t select Magit
-sections that can be acted on as a unit.
-
- And then of course you want to commit your changes. Type ‘c’. This
-shows the available commit commands and arguments in a buffer at the
-bottom of the frame. Each command and argument is prefixed with the key
-that invokes/sets it. Do not worry about this for now. We want to
-create a "normal" commit, which is done by typing ‘c’ again.
-
- Now two new buffers appear. One is for writing the commit message,
-the other shows a diff with the changes that you are about to committed.
-Write a message and then type ‘C-c C-c’ to actually create the commit.
-
- You probably don’t want to push the commit you just created because
-you just committed some random changes, but if that is not the case you
-could push it by typing ‘P’ to show all the available push commands and
-arguments and then ‘p’ to push to a branch with the same name as the
-local branch onto the remote configured as the push-remote. (If the
-push-remote is not configured yet, then you would first be prompted for
-the remote to push to.)
-
- So far we have mentioned the commit, push, and log transient prefix
-commands. These are probably among the transients you will be using the
-most, but many others exist. To show a transient that lists all other
-transients (as well as the various apply commands and some other
-essential commands), type ‘h’. Try a few.
-
- The key bindings in that transient correspond to the bindings in
-Magit buffers, including but not limited to the status buffer. So you
-could type ‘h d’ to bring up the diff transient, but once you remember
-that "d" stands for "diff", you would usually do so by just typing ‘d’.
-But this "prefix of prefixes" is useful even once you have memorized all
-the bindings, as it can provide easy access to Magit commands from
-non-Magit buffers. You should create a global key binding for this
-command too:
-
- (global-set-key (kbd "C-x M-g") 'magit-dispatch)
-
- In the same vein, you might also want to enable
-‘global-magit-file-mode’ to get some more Magit key bindings in regular
-file-visiting buffers (see *note Minor Mode for Buffers Visiting
-Files::).
-
- It is not necessary that you do so now, but if you stick with Magit,
-then it is highly recommended that you read the next section too.
-
-
-File: magit.info, Node: Interface Concepts, Next: Inspecting, Prev: Getting Started, Up: Top
-
-4 Interface Concepts
-********************
-
-* Menu:
-
-* Modes and Buffers::
-* Sections::
-* Transient Commands::
-* Transient Arguments and Buffer Variables::
-* Completion, Confirmation and the Selection: Completion Confirmation and the Selection.
-* Running Git::
-
-
-File: magit.info, Node: Modes and Buffers, Next: Sections, Up: Interface Concepts
-
-4.1 Modes and Buffers
-=====================
-
-Magit provides several major-modes. For each of these modes there
-usually exists only one buffer per repository. Separate modes and thus
-buffers exist for commits, diffs, logs, and some other things.
-
- Besides these special purpose buffers, there also exists an overview
-buffer, called the *status buffer*. It’s usually from this buffer that
-the user invokes Git commands, or creates or visits other buffers.
-
- In this manual we often speak about "Magit buffers". By that we mean
-buffers whose major-modes derive from ‘magit-mode’.
-
-‘M-x magit-toggle-buffer-lock’ (‘magit-toggle-buffer-lock’)
-
- This command locks the current buffer to its value or if the buffer
- is already locked, then it unlocks it.
-
- Locking a buffer to its value prevents it from being reused to
- display another value. The name of a locked buffer contains its
- value, which allows telling it apart from other locked buffers and
- the unlocked buffer.
-
- Not all Magit buffers can be locked to their values; for example,
- it wouldn’t make sense to lock a status buffer.
-
- There can only be a single unlocked buffer using a certain
- major-mode per repository. So when a buffer is being unlocked and
- another unlocked buffer already exists for that mode and
- repository, then the former buffer is instead deleted and the
- latter is displayed in its place.
-
-* Menu:
-
-* Switching Buffers::
-* Naming Buffers::
-* Quitting Windows::
-* Automatic Refreshing of Magit Buffers::
-* Automatic Saving of File-Visiting Buffers::
-* Automatic Reverting of File-Visiting Buffers::
-
-
-File: magit.info, Node: Switching Buffers, Next: Naming Buffers, Up: Modes and Buffers
-
-4.1.1 Switching Buffers
------------------------
-
- -- Function: magit-display-buffer buffer &optional display-function
-
- This function is a wrapper around ‘display-buffer’ and is used to
- display any Magit buffer. It displays BUFFER in some window and,
- unlike ‘display-buffer’, also selects that window, provided
- ‘magit-display-buffer-noselect’ is ‘nil’. It also runs the hooks
- mentioned below.
-
- If optional DISPLAY-FUNCTION is non-nil, then that is used to
- display the buffer. Usually that is ‘nil’ and the function
- specified by ‘magit-display-buffer-function’ is used.
-
- -- Variable: magit-display-buffer-noselect
-
- When this is non-nil, then ‘magit-display-buffer’ only displays the
- buffer but forgoes also selecting the window. This variable should
- not be set globally, it is only intended to be let-bound, by code
- that automatically updates "the other window". This is used for
- example when the revision buffer is updated when you move inside
- the log buffer.
-
- -- User Option: magit-display-buffer-function
-
- The function specified here is called by ‘magit-display-buffer’
- with one argument, a buffer, to actually display that buffer. This
- function should call ‘display-buffer’ with that buffer as first and
- a list of display actions as second argument.
-
- Magit provides several functions, listed below, that are suitable
- values for this option. If you want to use different rules, then a
- good way of doing that is to start with a copy of one of these
- functions and then adjust it to your needs.
-
- Instead of using a wrapper around ‘display-buffer’, that function
- itself can be used here, in which case the display actions have to
- be specified by adding them to ‘display-buffer-alist’ instead.
-
- To learn about display actions, see *note (elisp)Choosing Window::.
-
- -- Function: magit-display-buffer-traditional buffer
-
- This function is the current default value of the option
- ‘magit-display-buffer-function’. Before that option and this
- function were added, the behavior was hard-coded in many places all
- over the code base but now all the rules are contained in this one
- function (except for the "noselect" special case mentioned above).
-
- -- Function: magit-display-buffer-same-window-except-diff-v1
-
- This function displays most buffers in the currently selected
- window. If a buffer’s mode derives from ‘magit-diff-mode’ or
- ‘magit-process-mode’, it is displayed in another window.
-
- -- Function: magit-display-buffer-fullframe-status-v1
-
- This function fills the entire frame when displaying a status
- buffer. Otherwise, it behaves like
- ‘magit-display-buffer-traditional’.
-
- -- Function: magit-display-buffer-fullframe-status-topleft-v1
-
- This function fills the entire frame when displaying a status
- buffer. It behaves like ‘magit-display-buffer-fullframe-status-v1’
- except that it displays buffers that derive from ‘magit-diff-mode’
- or ‘magit-process-mode’ to the top or left of the current buffer
- rather than to the bottom or right. As a result, Magit buffers
- tend to pop up on the same side as they would if
- ‘magit-display-buffer-traditional’ were in use.
-
- -- Function: magit-display-buffer-fullcolumn-most-v1
-
- This function displays most buffers so that they fill the entire
- height of the frame. However, the buffer is displayed in another
- window if (1) the buffer’s mode derives from ‘magit-process-mode’,
- or (2) the buffer’s mode derives from ‘magit-diff-mode’, provided
- that the mode of the current buffer derives from ‘magit-log-mode’
- or ‘magit-cherry-mode’.
-
- -- User Option: magit-pre-display-buffer-hook
-
- This hook is run by ‘magit-display-buffer’ before displaying the
- buffer.
-
- -- Function: magit-save-window-configuration
-
- This function saves the current window configuration. Later when
- the buffer is buried, it may be restored by
- ‘magit-restore-window-configuration’.
-
- -- User Option: magit-post-display-buffer-hook
-
- This hook is run by ‘magit-display-buffer’ after displaying the
- buffer.
-
- -- Function: magit-maybe-set-dedicated
-
- This function remembers if a new window had to be created to
- display the buffer, or whether an existing window was reused. This
- information is later used by ‘magit-mode-quit-window’, to determine
- whether the window should be deleted when its last Magit buffer is
- buried.
-
-
-File: magit.info, Node: Naming Buffers, Next: Quitting Windows, Prev: Switching Buffers, Up: Modes and Buffers
-
-4.1.2 Naming Buffers
---------------------
-
- -- User Option: magit-generate-buffer-name-function
-
- The function used to generate the names of Magit buffers.
-
- Such a function should take the options
- ‘magit-uniquify-buffer-names’ as well as ‘magit-buffer-name-format’
- into account. If it doesn’t, then should be clearly stated in the
- doc-string. And if it supports %-sequences beyond those mentioned
- in the doc-string of the option ‘magit-buffer-name-format’, then
- its own doc-string should describe the additions.
-
- -- Function: magit-generate-buffer-name-default-function mode
-
- This function returns a buffer name suitable for a buffer whose
- major-mode is MODE and which shows information about the repository
- in which ‘default-directory’ is located.
-
- This function uses ‘magit-buffer-name-format’ and supporting all of
- the %-sequences mentioned the documentation of that option. It
- also respects the option ‘magit-uniquify-buffer-names’.
-
- -- User Option: magit-buffer-name-format
-
- The format string used to name Magit buffers.
-
- At least the following %-sequences are supported:
-
- • ‘%m’
-
- The name of the major-mode, but with the ‘-mode’ suffix
- removed.
-
- • ‘%M’
-
- Like ‘%m’ but abbreviate ‘magit-status-mode’ as ‘magit’.
-
- • ‘%v’
-
- The value the buffer is locked to, in parentheses, or an empty
- string if the buffer is not locked to a value.
-
- • ‘%V’
-
- Like ‘%v’, but the string is prefixed with a space, unless it
- is an empty string.
-
- • ‘%t’
-
- The top-level directory of the working tree of the repository,
- or if ‘magit-uniquify-buffer-names’ is non-nil an abbreviation
- of that.
-
- • ‘%x’
-
- If ‘magit-uniquify-buffer-names’ is nil "*", otherwise the
- empty string. Due to limitations of the ‘uniquify’ package,
- buffer names must end with the path.
-
- • ‘%T’
-
- Obsolete, use "%t%x" instead. Like ‘%t’, but append an
- asterisk if and only if ‘magit-uniquify-buffer-names’ is nil.
-
- The value should always contain ‘%m’ or ‘%M’, ‘%v’ or ‘%V’, and
- ‘%t’ (or the obsolete ‘%T’). If ‘magit-uniquify-buffer-names’ is
- non-nil, then the value must end with ‘%t’ or ‘%t%x’ (or the
- obsolete ‘%T’). See issue #2841.
-
- -- User Option: magit-uniquify-buffer-names
-
- This option controls whether the names of Magit buffers are
- uniquified. If the names are not being uniquified, then they
- contain the full path of the top-level of the working tree of the
- corresponding repository. If they are being uniquified, then they
- end with the basename of the top-level, or if that would conflict
- with the name used for other buffers, then the names of all these
- buffers are adjusted until they no longer conflict.
-
- This is done using the ‘uniquify’ package; customize its options to
- control how buffer names are uniquified.
-
-
-File: magit.info, Node: Quitting Windows, Next: Automatic Refreshing of Magit Buffers, Prev: Naming Buffers, Up: Modes and Buffers
-
-4.1.3 Quitting Windows
-----------------------
-
-‘q’ (‘magit-mode-bury-buffer’)
-
- This command buries the current Magit buffer.
-
- With a prefix argument, it instead kills the buffer. With a double
- prefix argument, also kills all other Magit buffers associated with
- the current project.
-
- -- User Option: magit-bury-buffer-function
-
- The function used to actually bury or kill the current buffer.
-
- ‘magit-mode-bury-buffer’ calls this function with one argument. If
- the argument is non-nil, then the function has to kill the current
- buffer. Otherwise it has to bury it alive. The default value
- currently is ‘magit-restore-window-configuration’.
-
- -- Function: magit-restore-window-configuration kill-buffer
-
- Bury or kill the current buffer using ‘quit-window’, which is
- called with KILL-BUFFER as first and the selected window as second
- argument.
-
- Then restore the window configuration that existed right before the
- current buffer was displayed in the selected frame. Unfortunately
- that also means that point gets adjusted in all the buffers, which
- are being displayed in the selected frame.
-
- -- Function: magit-mode-quit-window kill-buffer
-
- Bury or kill the current buffer using ‘quit-window’, which is
- called with KILL-BUFFER as first and the selected window as second
- argument.
-
- Then, if the window was originally created to display a Magit
- buffer and the buried buffer was the last remaining Magit buffer
- that was ever displayed in the window, then that is deleted.
-
-
-File: magit.info, Node: Automatic Refreshing of Magit Buffers, Next: Automatic Saving of File-Visiting Buffers, Prev: Quitting Windows, Up: Modes and Buffers
-
-4.1.4 Automatic Refreshing of Magit Buffers
--------------------------------------------
-
-After running a command which may change the state of the current
-repository, the current Magit buffer and the corresponding status buffer
-are refreshed. The status buffer can be automatically refreshed
-whenever a buffer is saved to a file inside the respective repository by
-adding a hook, like so:
-
- (add-hook 'after-save-hook 'magit-after-save-refresh-status t)
-
- Automatically refreshing Magit buffers ensures that the displayed
-information is up-to-date most of the time but can lead to a noticeable
-delay in big repositories. Other Magit buffers are not refreshed to
-keep the delay to a minimum and also because doing so can sometimes be
-undesirable.
-
- Buffers can also be refreshed explicitly, which is useful in buffers
-that weren’t current during the last refresh and after changes were made
-to the repository outside of Magit.
-
-‘g’ (‘magit-refresh’)
-
- This command refreshes the current buffer if its major mode derives
- from ‘magit-mode’ as well as the corresponding status buffer.
-
- If the option ‘magit-revert-buffers’ calls for it, then it also
- reverts all unmodified buffers that visit files being tracked in
- the current repository.
-
-‘G’ (‘magit-refresh-all’)
-
- This command refreshes all Magit buffers belonging to the current
- repository and also reverts all unmodified buffers that visit files
- being tracked in the current repository.
-
- The file-visiting buffers are always reverted, even if
- ‘magit-revert-buffers’ is nil.
-
- -- User Option: magit-refresh-buffer-hook
-
- This hook is run in each Magit buffer that was refreshed during the
- current refresh - normally the current buffer and the status
- buffer.
-
- -- User Option: magit-refresh-status-buffer
-
- When this option is non-nil, then the status buffer is
- automatically refreshed after running git for side-effects, in
- addition to the current Magit buffer, which is always refreshed
- automatically.
-
- Only set this to nil after exhausting all other options to improve
- performance.
-
- -- Function: magit-after-save-refresh-status
-
- This function is intended to be added to ‘after-save-hook’. After
- doing that the corresponding status buffer is refreshed whenever a
- buffer is saved to a file inside a repository.
-
- Note that refreshing a Magit buffer is done by re-creating its
- contents from scratch, which can be slow in large repositories. If
- you are not satisfied with Magit’s performance, then you should
- obviously not add this function to that hook.
-
-
-File: magit.info, Node: Automatic Saving of File-Visiting Buffers, Next: Automatic Reverting of File-Visiting Buffers, Prev: Automatic Refreshing of Magit Buffers, Up: Modes and Buffers
-
-4.1.5 Automatic Saving of File-Visiting Buffers
------------------------------------------------
-
-File-visiting buffers are by default saved at certain points in time.
-This doesn’t guarantee that Magit buffers are always up-to-date, but,
-provided one only edits files by editing them in Emacs and uses only
-Magit to interact with Git, one can be fairly confident. When in doubt
-or after outside changes, type ‘g’ (‘magit-refresh’) to save and refresh
-explicitly.
-
- -- User Option: magit-save-repository-buffers
-
- This option controls whether file-visiting buffers are saved before
- certain events.
-
- If this is non-nil then all modified file-visiting buffers
- belonging to the current repository may be saved before running
- commands, before creating new Magit buffers, and before explicitly
- refreshing such buffers. If this is ‘dontask’ then this is done
- without user intervention. If it is ‘t’ then the user has to
- confirm each save.
-
-
-File: magit.info, Node: Automatic Reverting of File-Visiting Buffers, Prev: Automatic Saving of File-Visiting Buffers, Up: Modes and Buffers
-
-4.1.6 Automatic Reverting of File-Visiting Buffers
---------------------------------------------------
-
-By default Magit automatically reverts buffers that are visiting files
-that are being tracked in a Git repository, after they have changed on
-disk. When using Magit one often changes files on disk by running Git,
-i.e. "outside Emacs", making this a rather important feature.
-
- For example, if you discard a change in the status buffer, then that
-is done by running ‘git apply --reverse ...’, and Emacs considers the
-file to have "changed on disk". If Magit did not automatically revert
-the buffer, then you would have to type ‘M-x revert-buffer RET RET’ in
-the visiting buffer before you could continue making changes.
-
- -- User Option: magit-auto-revert-mode
-
- When this mode is enabled, then buffers that visit tracked files
- are automatically reverted after the visited files change on disk.
-
- -- User Option: global-auto-revert-mode
-
- When this mode is enabled, then any file-visiting buffer is
- automatically reverted after the visited file changes on disk.
-
- If you like buffers that visit tracked files to be automatically
- reverted, then you might also like any buffer to be reverted, not
- just those visiting tracked files. If that is the case, then
- enable this mode _instead of_ ‘magit-auto-revert-mode’.
-
- -- User Option: magit-auto-revert-immediately
-
- This option controls whether Magit reverts buffers immediately.
-
- If this is non-nil and either ‘global-auto-revert-mode’ or
- ‘magit-auto-revert-mode’ is enabled, then Magit immediately reverts
- buffers by explicitly calling ‘auto-revert-buffers’ after running
- Git for side-effects.
-
- If ‘auto-revert-use-notify’ is non-nil (and file notifications are
- actually supported), then ‘magit-auto-revert-immediately’ does not
- have to be non-nil, because the reverts happen immediately anyway.
-
- If ‘magit-auto-revert-immediately’ and ‘auto-revert-use-notify’ are
- both ‘nil’, then reverts happen after ‘auto-revert-interval’
- seconds of user inactivity. That is not desirable.
-
- -- User Option: auto-revert-use-notify
-
- This option controls whether file notification functions should be
- used. Note that this variable unfortunately defaults to ‘t’ even
- on systems on which file notifications cannot be used.
-
- -- User Option: magit-auto-revert-tracked-only
-
- This option controls whether ‘magit-auto-revert-mode’ only reverts
- tracked files or all files that are located inside Git
- repositories, including untracked files and files located inside
- Git’s control directory.
-
- -- User Option: auto-revert-mode
-
- The global mode ‘magit-auto-revert-mode’ works by turning on this
- local mode in the appropriate buffers (but
- ‘global-auto-revert-mode’ is implemented differently). You can
- also turn it on or off manually, which might be necessary if Magit
- does not notice that a previously untracked file now is being
- tracked or vice-versa.
-
- -- User Option: auto-revert-stop-on-user-input
-
- This option controls whether the arrival of user input suspends the
- automatic reverts for ‘auto-revert-interval’ seconds.
-
- -- User Option: auto-revert-interval
-
- This option controls how many seconds Emacs waits for before
- resuming suspended reverts.
-
- -- User Option: auto-revert-buffer-list-filter
-
- This option specifies an additional filter used by
- ‘auto-revert-buffers’ to determine whether a buffer should be
- reverted or not.
-
- This option is provided by Magit, which also advises
- ‘auto-revert-buffers’ to respect it. Magit users who do not turn
- on the local mode ‘auto-revert-mode’ themselves, are best served by
- setting the value to ‘magit-auto-revert-repository-buffer-p’.
-
- However the default is nil, so as not to disturb users who do use
- the local mode directly. If you experience delays when running
- Magit commands, then you should consider using one of the
- predicates provided by Magit - especially if you also use Tramp.
-
- Users who do turn on ‘auto-revert-mode’ in buffers in which Magit
- doesn’t do that for them, should likely not use any filter. Users
- who turn on ‘global-auto-revert-mode’, do not have to worry about
- this option, because it is disregarded if the global mode is
- enabled.
-
- -- User Option: auto-revert-verbose
-
- This option controls whether Emacs reports when a buffer has been
- reverted.
-
- The options with the ‘auto-revert-’ prefix are located in the Custom
-group named ‘auto-revert’. The other, Magit-specific, options are
-located in the ‘magit’ group.
-
-* Menu:
-
-* Risk of Reverting Automatically::
-
-
-File: magit.info, Node: Risk of Reverting Automatically, Up: Automatic Reverting of File-Visiting Buffers
-
-Risk of Reverting Automatically
-...............................
-
-For the vast majority of users, automatically reverting file-visiting
-buffers after they have changed on disk is harmless.
-
- If a buffer is modified (i.e. it contains changes that haven’t been
-saved yet), then Emacs will refuse to automatically revert it. If you
-save a previously modified buffer, then that results in what is seen by
-Git as an uncommitted change. Git will then refuse to carry out any
-commands that would cause these changes to be lost. In other words, if
-there is anything that could be lost, then either Git or Emacs will
-refuse to discard the changes.
-
- However, if you use file-visiting buffers as a sort of ad hoc
-"staging area", then the automatic reverts could potentially cause data
-loss. So far I have heard from only one user who uses such a workflow.
-
- An example: You visit some file in a buffer, edit it, and save the
-changes. Then, outside of Emacs (or at least not using Magit or by
-saving the buffer) you change the file on disk again. At this point the
-buffer is the only place where the intermediate version still exists.
-You have saved the changes to disk, but that has since been overwritten.
-Meanwhile Emacs considers the buffer to be unmodified (because you have
-not made any changes to it since you last saved it to the visited file)
-and therefore would not object to it being automatically reverted. At
-this point an Auto-Revert mode would kick in. It would check whether
-the buffer is modified and since that is not the case it would revert
-it. The intermediate version would be lost. (Actually you could still
-get it back using the ‘undo’ command.)
-
- If your workflow depends on Emacs preserving the intermediate version
-in the buffer, then you have to disable all Auto-Revert modes. But
-please consider that such a workflow would be dangerous even without
-using an Auto-Revert mode, and should therefore be avoided. If Emacs
-crashes or if you quit Emacs by mistake, then you would also lose the
-buffer content. There would be no autosave file still containing the
-intermediate version (because that was deleted when you saved the
-buffer) and you would not be asked whether you want to save the buffer
-(because it isn’t modified).
-
-
-File: magit.info, Node: Sections, Next: Transient Commands, Prev: Modes and Buffers, Up: Interface Concepts
-
-4.2 Sections
-============
-
-Magit buffers are organized into nested sections, which can be collapsed
-and expanded, similar to how sections are handled in Org mode. Each
-section also has a type, and some sections also have a value. For each
-section type there can also be a local keymap, shared by all sections of
-that type.
-
- Taking advantage of the section value and type, many commands operate
-on the current section, or when the region is active and selects
-sections of the same type, all of the selected sections. Commands that
-only make sense for a particular section type (as opposed to just
-behaving differently depending on the type) are usually bound in section
-type keymaps.
-
-* Menu:
-
-* Section Movement::
-* Section Visibility::
-* Section Hooks::
-* Section Types and Values::
-* Section Options::
-
-
-File: magit.info, Node: Section Movement, Next: Section Visibility, Up: Sections
-
-4.2.1 Section Movement
-----------------------
-
-To move within a section use the usual keys (‘C-p’, ‘C-n’, ‘C-b’, ‘C-f’
-etc), whose global bindings are not shadowed. To move to another
-section use the following commands.
-
-‘p’ (‘magit-section-backward’)
-
- When not at the beginning of a section, then move to the beginning
- of the current section. At the beginning of a section, instead
- move to the beginning of the previous visible section.
-
-‘n’ (‘magit-section-forward’)
-
- Move to the beginning of the next visible section.
-
-‘M-p’ (‘magit-section-backward-siblings’)
-
- Move to the beginning of the previous sibling section. If there is
- no previous sibling section, then move to the parent section
- instead.
-
-‘M-n’ (‘magit-section-forward-siblings’)
-
- Move to the beginning of the next sibling section. If there is no
- next sibling section, then move to the parent section instead.
-
-‘^’ (‘magit-section-up’)
-
- Move to the beginning of the parent of the current section.
-
- The above commands all call the hook ‘magit-section-movement-hook’.
-Any of the functions listed below can be used as members of this hook.
-
- You might want to remove some of the functions that Magit adds using
-‘add-hook’. In doing so you have to make sure you do not attempt to
-remove function that haven’t even been added yet, for example:
-
- (with-eval-after-load 'magit-diff
- (remove-hook 'magit-section-movement-hook
- 'magit-hunk-set-window-start))
-
- -- Variable: magit-section-movement-hook
-
- This hook is run by all of the above movement commands, after
- arriving at the destination.
-
- -- Function: magit-hunk-set-window-start
-
- This hook function ensures that the beginning of the current
- section is visible, provided it is a ‘hunk’ section. Otherwise, it
- does nothing.
-
- Loading ‘magit-diff’ adds this function to the hook.
-
- -- Function: magit-section-set-window-start
-
- This hook function ensures that the beginning of the current
- section is visible, regardless of the section’s type. If you add
- this to ‘magit-section-movement-hook’, then you must remove the
- hunk-only variant in turn.
-
- -- Function: magit-log-maybe-show-more-commits
-
- This hook function only has an effect in log buffers, and ‘point’
- is on the "show more" section. If that is the case, then it
- doubles the number of commits that are being shown.
-
- Loading ‘magit-log’ adds this function to the hook.
-
- -- Function: magit-log-maybe-update-revision-buffer
-
- When moving inside a log buffer, then this function updates the
- revision buffer, provided it is already being displayed in another
- window of the same frame.
-
- Loading ‘magit-log’ adds this function to the hook.
-
- -- Function: magit-log-maybe-update-blob-buffer
-
- When moving inside a log buffer and another window of the same
- frame displays a blob buffer, then this function instead displays
- the blob buffer for the commit at point in that window.
-
- -- Function: magit-status-maybe-update-revision-buffer
-
- When moving inside a status buffer, then this function updates the
- revision buffer, provided it is already being displayed in another
- window of the same frame.
-
- -- Function: magit-status-maybe-update-stash-buffer
-
- When moving inside a status buffer, then this function updates the
- stash buffer, provided it is already being displayed in another
- window of the same frame.
-
- -- Function: magit-status-maybe-update-blob-buffer
-
- When moving inside a status buffer and another window of the same
- frame displays a blob buffer, then this function instead displays
- the blob buffer for the commit at point in that window.
-
- -- Function: magit-stashes-maybe-update-stash-buffer
-
- When moving inside a buffer listing stashes, then this function
- updates the stash buffer, provided it is already being displayed in
- another window of the same frame.
-
- -- User Option: magit-update-other-window-delay
-
- Delay before automatically updating the other window.
-
- When moving around in certain buffers, then certain other buffers,
- which are being displayed in another window, may optionally be
- updated to display information about the section at point.
-
- When holding down a key to move by more than just one section, then
- that would update that buffer for each section on the way. To
- prevent that, updating the revision buffer is delayed, and this
- option controls for how long. For optimal experience you might
- have to adjust this delay and/or the keyboard repeat rate and delay
- of your graphical environment or operating system.
-
-
-File: magit.info, Node: Section Visibility, Next: Section Hooks, Prev: Section Movement, Up: Sections
-
-4.2.2 Section Visibility
-------------------------
-
-Magit provides many commands for changing the visibility of sections,
-but all you need to get started are the next two.
-
-‘TAB’ (‘magit-section-toggle’)
-
- Toggle the visibility of the body of the current section.
-
-‘C-<tab>’ (‘magit-section-cycle’)
-
- Cycle the visibility of current section and its children.
-
-‘M-<tab>’ (‘magit-section-cycle-diffs’)
-
- Cycle the visibility of diff-related sections in the current
- buffer.
-
-‘S-<tab>’ (‘magit-section-cycle-global’)
-
- Cycle the visibility of all sections in the current buffer.
-
-‘1’ (‘magit-section-show-level-1’)
-‘2’ (‘magit-section-show-level-2’)
-‘3’ (‘magit-section-show-level-3’)
-‘4’ (‘magit-section-show-level-4’)
-
- Show sections surrounding the current section up to level N.
-
-‘M-1’ (‘magit-section-show-level-1-all’)
-‘M-2’ (‘magit-section-show-level-2-all’)
-‘M-3’ (‘magit-section-show-level-3-all’)
-‘M-4’ (‘magit-section-show-level-4-all’)
-
- Show all sections up to level N.
-
- Some functions, which are used to implement the above commands, are
-also exposed as commands themselves. By default no keys are bound to
-these commands, as they are generally perceived to be much less useful.
-But your mileage may vary.
-
- -- Command: magit-section-show
-
- Show the body of the current section.
-
- -- Command: magit-section-hide
-
- Hide the body of the current section.
-
- -- Command: magit-section-show-headings
-
- Recursively show headings of children of the current section. Only
- show the headings. Previously shown text-only bodies are hidden.
-
- -- Command: magit-section-show-children
-
- Recursively show the bodies of children of the current section.
- With a prefix argument show children down to the level of the
- current section, and hide deeper children.
-
- -- Command: magit-section-hide-children
-
- Recursively hide the bodies of children of the current section.
-
- -- Command: magit-section-toggle-children
-
- Toggle visibility of bodies of children of the current section.
-
- When a buffer is first created then some sections are shown expanded
-while others are not. This is hard coded. When a buffer is refreshed
-then the previous visibility is preserved. The initial visibility of
-certain sections can also be overwritten using the hook
-‘magit-section-set-visibility-hook’.
-
- -- User Option: magit-section-initial-visibility-alist
-
- This options can be used to override the initial visibility of
- sections. In the future it will also be used to define the
- defaults, but currently a section’s default is still hardcoded.
-
- The value is an alist. Each element maps a section type or lineage
- to the initial visibility state for such sections. The state has
- to be one of ‘show’ or ‘hide’, or a function that returns one of
- these symbols. A function is called with the section as the only
- argument.
-
- Use the command ‘magit-describe-section-briefly’ to determine a
- section’s lineage or type. The vector in the output is the section
- lineage and the type is the first element of that vector.
- Wildcards can be used, see ‘magit-section-match’.
-
- -- User Option: magit-section-cache-visibility
-
- This option controls for which sections the previous visibility
- state should be restored if a section disappears and later appears
- again. The value is a boolean or a list of section types. If t,
- then the visibility of all sections is cached. Otherwise this is
- only done for sections whose type matches one of the listed types.
-
- This requires that the function ‘magit-section-cached-visibility’
- is a member of ‘magit-section-set-visibility-hook’.
-
- -- Variable: magit-section-set-visibility-hook
-
- This hook is run when first creating a buffer and also when
- refreshing an existing buffer, and is used to determine the
- visibility of the section currently being inserted.
-
- Each function is called with one argument, the section being
- inserted. It should return ‘hide’ or ‘show’, or to leave the
- visibility undefined ‘nil’. If no function decides on the
- visibility and the buffer is being refreshed, then the visibility
- is preserved; or if the buffer is being created, then the hard
- coded default is used.
-
- Usually this should only be used to set the initial visibility but
- not during refreshes. If ‘magit-insert-section--oldroot’ is
- non-nil, then the buffer is being refreshed and these functions
- should immediately return ‘nil’.
-
- -- User Option: magit-section-visibility-indicator
-
- This option controls whether and how to indicate that a section can
- be expanded/collapsed.
-
- If nil, then no visibility indicators are shown. Otherwise the
- value has to have one of these two forms:
-
- • ‘(EXPANDABLE-BITMAP . COLLAPSIBLE-BITMAP)’
-
- Both values have to be variables whose values are fringe
- bitmaps. In this case every section that can be expanded or
- collapsed gets an indicator in the left fringe.
-
- To provide extra padding around the indicator, set
- ‘left-fringe-width’ in ‘magit-mode-hook’, e.g.:
-
- (add-hook 'magit-mode-hook (lambda ()
- (setq left-fringe-width 20)))
-
- • ‘(STRING . BOOLEAN)’
-
- In this case STRING (usually an ellipsis) is shown at the end
- of the heading of every collapsed section. Expanded sections
- get no indicator. The cdr controls whether the appearance of
- these ellipsis take section highlighting into account. Doing
- so might potentially have an impact on performance, while not
- doing so is kinda ugly.
-
-
-File: magit.info, Node: Section Hooks, Next: Section Types and Values, Prev: Section Visibility, Up: Sections
-
-4.2.3 Section Hooks
--------------------
-
-Which sections are inserted into certain buffers is controlled with
-hooks. This includes the status and the refs buffers. For other
-buffers, e.g. log and diff buffers, this is not possible. The command
-‘magit-describe-section’ can be used to see which hook (if any) was
-responsible for inserting the section at point.
-
- For buffers whose sections can be customized by the user, a hook
-variable called ‘magit-TYPE-sections-hook’ exists. This hook should be
-changed using ‘magit-add-section-hook’. Avoid using ‘add-hooks’ or the
-Custom interface.
-
- The various available section hook variables are described later in
-this manual along with the appropriate "section inserter functions".
-
- -- Function: magit-add-section-hook hook function &optional at append
- local
-
- Add the function FUNCTION to the value of section hook HOOK.
-
- Add FUNCTION at the beginning of the hook list unless optional
- APPEND is non-nil, in which case FUNCTION is added at the end. If
- FUNCTION already is a member then move it to the new location.
-
- If optional AT is non-nil and a member of the hook list, then add
- FUNCTION next to that instead. Add before or after AT, or replace
- AT with FUNCTION depending on APPEND. If APPEND is the symbol
- ‘replace’, then replace AT with FUNCTION. For any other non-nil
- value place FUNCTION right after AT. If nil, then place FUNCTION
- right before AT. If FUNCTION already is a member of the list but
- AT is not, then leave FUNCTION where ever it already is.
-
- If optional LOCAL is non-nil, then modify the hook’s buffer-local
- value rather than its global value. This makes the hook local by
- copying the default value. That copy is then modified.
-
- HOOK should be a symbol. If HOOK is void, it is first set to nil.
- HOOK’s value must not be a single hook function. FUNCTION should
- be a function that takes no arguments and inserts one or multiple
- sections at point, moving point forward. FUNCTION may choose not
- to insert its section(s), when doing so would not make sense. It
- should not be abused for other side-effects.
-
- To remove a function from a section hook, use ‘remove-hook’.
-
-
-File: magit.info, Node: Section Types and Values, Next: Section Options, Prev: Section Hooks, Up: Sections
-
-4.2.4 Section Types and Values
-------------------------------
-
-Each section has a type, for example ‘hunk’, ‘file’, and ‘commit’.
-Instances of certain section types also have a value. The value of a
-section of type ‘file’, for example, is a file name.
-
- Users usually do not have to worry about a section’s type and value,
-but knowing them can be handy at times.
-
-‘M-x magit-describe-section-briefly’ (‘magit-describe-section-briefly’)
-
- Show information about the section at point in the echo area, as
- "#<magit-section VALUE [TYPE PARENT-TYPE...] BEGINNING-END>".
-
- Many commands behave differently depending on the type of the section
-at point and/or somehow consume the value of that section. But that is
-only one of the reasons why the same key may do something different,
-depending on what section is current.
-
- Additionally for each section type a keymap *might* be defined, named
-‘magit-TYPE-section-map’. That keymap is used as text property keymap
-of all text belonging to any section of the respective type. If such a
-map does not exist for a certain type, then you can define it yourself,
-and it will automatically be used.
-
-
-File: magit.info, Node: Section Options, Prev: Section Types and Values, Up: Sections
-
-4.2.5 Section Options
----------------------
-
-This section describes options that have an effect on more than just a
-certain type of sections. As you can see there are not many of those.
-
- -- User Option: magit-section-show-child-count
-
- Whether to append the number of children to section headings. This
- only affects sections that could benefit from this information.
-
-
-File: magit.info, Node: Transient Commands, Next: Transient Arguments and Buffer Variables, Prev: Sections, Up: Interface Concepts
-
-4.3 Transient Commands
-======================
-
-Many Magit commands are implemented as *transient* commands. First the
-user invokes a *prefix* command, which causes its *infix* arguments and
-*suffix* commands to be displayed in the echo area. The user then
-optionally sets some infix arguments and finally invokes one of the
-suffix commands.
-
- This is implemented in the library ‘transient’. Earlier Magit
-releases used the package ‘magit-popup’ and even earlier versions
-library ‘magit-key-mode’.
-
- Transient is documented in *note (transient)Top::.
-
-‘C-c C-c’ (‘magit-dispatch’)
-
- This transient prefix command binds most of Magit’s other prefix
- commands as suffix commands and displays them in a temporary buffer
- until one of them is invoked. Invoking such a sub-prefix causes
- the suffixes of that command to be bound and displayed instead of
- those of ‘magit-dispatch’.
-
- This command is also, or especially, useful outside Magit buffers, so
-you should setup a global binding:
-
- (global-set-key (kbd "C-x M-g") 'magit-dispatch)
-
-
-File: magit.info, Node: Transient Arguments and Buffer Variables, Next: Completion Confirmation and the Selection, Prev: Transient Commands, Up: Interface Concepts
-
-4.4 Transient Arguments and Buffer Variables
-============================================
-
-The infix arguments of many of Magit’s transient prefix commands cease
-to have an effect once the ‘git’ command that is called with those
-arguments has returned. Commands that create a commit are a good
-example for this. If the user changes the arguments, then that only
-affects the next invocation of a suffix command. If the same transient
-prefix command is later invoked again, then the arguments are initially
-reset to the default value. This default value can be set for the
-current Emacs session or saved permanently, see *note (transient)Saving
-Values::. It is also possible to cycle through previously used sets of
-arguments using ‘M-p’ and ‘M-n’, see *note (transient)Using History::.
-
- However the infix arguments of many other transient commands continue
-to have an effect even after the ‘git’ command that was called with
-those arguments has returned. The most important commands like this are
-those that display a diff or log in a dedicated buffer. Their arguments
-obviously continue to have an effect for as long as the respective diff
-or log is being displayed. Furthermore the used arguments are stored in
-buffer-local variables for future reference.
-
- For commands in the second group it isn’t always desirable to reset
-their arguments to the global value when the transient prefix command is
-invoked again.
-
- As mentioned above, it is possible to cycle through previously used
-sets of arguments while a transient popup is visible. That means that
-we could always reset the infix arguments to the default because the set
-of arguments that is active in the existing buffer is only a few ‘M-p’
-away. Magit can be configured to behave like that, but because I expect
-that most users would not find that very convenient, it is not the
-default.
-
- Also note that it is possible to change the diff and log arguments
-used in the current buffer (including the status buffer, which contains
-both diff and log sections) using the respective "refresh" transient
-prefix commands on ‘D’ and ‘L’. (‘d’ and ‘l’ on the other hand are
-intended to change *what* diff or log is being displayed. It is
-possible to also change *how* the diff or log is being displayed at the
-same time, but if you only want to do the latter, then you should use
-the refresh variants.) Because these secondary diff and log transient
-prefixes are about *changing* the arguments used in the current buffer,
-they *always* start out with the set of arguments that are currently in
-effect in that buffer.
-
- Some commands are usually invoked directly even though they can also
-be invoked as the suffix of a transient prefix command. Most
-prominently ‘magit-show-commit’ is usually invoked by typing ‘RET’ while
-point is on a commit in a log, but it can also be invoked from the
-‘magit-diff’ transient prefix.
-
- When such a command is invoked directly, then it is important to
-reuse the arguments as specified by the respective buffer-local values,
-instead of using the default arguments. Imagine you press ‘RET’ in a
-log to display the commit at point in a different buffer and then use
-‘D’ to change how the diff is displayed in that buffer. And then you
-press ‘RET’ on another commit to show that instead and the diff
-arguments are reset to the default. Not cool; so Magit does not do that
-by default.
-
- -- User Option: magit-prefix-use-buffer-arguments
-
- This option controls whether the infix arguments initially shown in
- certain transient prefix commands are based on the arguments that
- are currently in effect in the buffer that their suffixes update.
-
- The ‘magit-diff’ and ‘magit-log’ transient prefix commands are
- affected by this option.
-
- -- User Option: magit-direct-use-buffer-arguments
-
- This option controls whether certain commands, when invoked
- directly (i.e. not as the suffix of a transient prefix command),
- use the arguments that are currently active in the buffer that they
- are about to update. The alternative is to use the default value
- for these arguments, which might change the arguments that are used
- in the buffer.
-
-Valid values for both of the above options are:
-
- • ‘always’: Always use the set of arguments that is currently active
- in the respective buffer, provided that buffer exists of course.
-
- • ‘selected’ or ‘t’: Use the set of arguments from the respective
- buffer, but only if it is displayed in a window of the current
- frame. This is the default for both variables.
-
- • ‘current’: Use the set of arguments from the respective buffer, but
- only if it is the current buffer.
-
- • ‘never’: Never use the set of arguments from the respective buffer.
-
-I am afraid it gets more complicated still:
-
- • The global diff and log arguments are set for each support mode
- individually. The diff arguments for example have different values
- in ‘magit-diff-mode’, ‘magit-revision-mode’,
- ‘magit-merge-preview-mode’ and ‘magit-status-mode’ buffers.
- Setting or saving the value for one mode does not change the value
- for other modes. The history however is shared.
-
- • When ‘magit-show-commit’ is invoked directly from a log buffer,
- then the file filter is picked up from that buffer, not from the
- revision buffer and or the mode’s global diff arguments.
-
- • Even though they are suffixes of the diff prefix
- ‘magit-show-commit’ and ‘magit-stash-show’ do not use the diff
- buffer used by the diff commands, instead they use the dedicated
- revision and stash buffers.
-
- At the time you invoke the diff prefix it is unknown to Magit which
- of the suffix commands you are going to invoke. While not certain,
- more often than not users invoke one of the commands that use the
- diff buffer, so the initial infix arguments are those used in that
- buffer. However if you invoke one of these commands directly, then
- Magit knows that it should use the arguments from the revision
- resp. stash buffer.
-
- • The log prefix also features reflog commands, but these commands do
- not use the log arguments.
-
- • If ‘magit-show-refs’ is invoked from a ‘magit-refs-mode’ buffer,
- then it acts as a refresh prefix and therefore unconditionally uses
- the buffer’s arguments as initial arguments. If it is invoked
- elsewhere with a prefix argument, then it acts as regular prefix
- and therefore respects ‘magit-prefix-use-buffer-arguments’. If it
- is invoked elsewhere without a prefix argument, then it acts as a
- direct command and therefore respects
- ‘magit-direct-use-buffer-arguments’.
-
-
-File: magit.info, Node: Completion Confirmation and the Selection, Next: Running Git, Prev: Transient Arguments and Buffer Variables, Up: Interface Concepts
-
-4.5 Completion, Confirmation and the Selection
-==============================================
-
-* Menu:
-
-* Action Confirmation::
-* Completion and Confirmation::
-* The Selection::
-* The hunk-internal region::
-* Support for Completion Frameworks::
-* Additional Completion Options::
-
-
-File: magit.info, Node: Action Confirmation, Next: Completion and Confirmation, Up: Completion Confirmation and the Selection
-
-4.5.1 Action Confirmation
--------------------------
-
-By default many actions that could potentially lead to data loss have to
-be confirmed. This includes many very common actions, so this can
-quickly become annoying. Many of these actions can be undone and if you
-have thought about how to undo certain mistakes, then it should be safe
-to disable confirmation for the respective actions.
-
- The option ‘magit-no-confirm’ can be used to tell Magit to perform
-certain actions without the user having to confirm them. Note that
-while this option can only be used to disable confirmation for a
-specific set of actions, the next section explains another way of
-telling Magit to ask fewer questions.
-
- -- User Option: magit-no-confirm
-
- The value of this option is a list of symbols, representing actions
- that do not have to be confirmed by the user before being carried
- out.
-
- By default many potentially dangerous commands ask the user for
- confirmation. Each of the below symbols stands for an action
- which, when invoked unintentionally or without being fully aware of
- the consequences, could lead to tears. In many cases there are
- several commands that perform variations of a certain action, so we
- don’t use the command names but more generic symbols.
-
- • Applying changes:
-
- • ‘discard’ Discarding one or more changes (i.e. hunks or
- the complete diff for a file) loses that change,
- obviously.
-
- • ‘reverse’ Reverting one or more changes can usually be
- undone by reverting the reversion.
-
- • ‘stage-all-changes’, ‘unstage-all-changes’ When there are
- both staged and unstaged changes, then un-/staging
- everything would destroy that distinction. Of course
- that also applies when un-/staging a single change, but
- then less is lost and one does that so often that having
- to confirm every time would be unacceptable.
-
- • Files:
-
- • ‘delete’ When a file that isn’t yet tracked by Git is
- deleted, then it is completely lost, not just the last
- changes. Very dangerous.
-
- • ‘trash’ Instead of deleting a file it can also be move to
- the system trash. Obviously much less dangerous than
- deleting it.
-
- Also see option ‘magit-delete-by-moving-to-trash’.
-
- • ‘resurrect’ A deleted file can easily be resurrected by
- "deleting" the deletion, which is done using the same
- command that was used to delete the same file in the
- first place.
-
- • ‘untrack’ Untracking a file can be undone by tracking it
- again.
-
- • ‘rename’ Renaming a file can easily be undone.
-
- • Sequences:
-
- • ‘reset-bisect’ Aborting (known to Git as "resetting") a
- bisect operation loses all information collected so far.
-
- • ‘abort-rebase’ Aborting a rebase throws away all already
- modified commits, but it’s possible to restore those from
- the reflog.
-
- • ‘abort-merge’ Aborting a merge throws away all conflict
- resolutions which have already been carried out by the
- user.
-
- • ‘merge-dirty’ Merging with a dirty worktree can make it
- hard to go back to the state before the merge was
- initiated.
-
- • References:
-
- • ‘delete-unmerged-branch’ Once a branch has been deleted,
- it can only be restored using low-level recovery tools
- provided by Git. And even then the reflog is gone. The
- user always has to confirm the deletion of a branch by
- accepting the default choice (or selecting another
- branch), but when a branch has not been merged yet, also
- make sure the user is aware of that.
-
- • ‘delete-pr-remote’ When deleting a branch that was
- created from a pull-request and if no other branches
- still exist on that remote, then ‘magit-branch-delete’
- offers to delete the remote as well. This should be safe
- because it only happens if no other refs exist in the
- remotes namespace, and you can recreate the remote if
- necessary.
-
- • ‘drop-stashes’ Dropping a stash is dangerous because Git
- stores stashes in the reflog. Once a stash is removed,
- there is no going back without using low-level recovery
- tools provided by Git. When a single stash is dropped,
- then the user always has to confirm by accepting the
- default (or selecting another). This action only
- concerns the deletion of multiple stashes at once.
-
- • Edit published history:
-
- Without adding these symbols here, you will be warned before
- editing commits that have already been pushed to one of the
- branches listed in ‘magit-published-branches’.
-
- • ‘amend-published’ Affects most commands that amend to
- "HEAD".
-
- • ‘rebase-published’ Affects commands that perform
- interactive rebases. This includes commands from the
- commit transient that modify a commit other than "HEAD",
- namely the various fixup and squash variants.
-
- • ‘edit-published’ Affects the commands
- ‘magit-edit-line-commit’ and
- ‘magit-diff-edit-hunk-commit’. These two commands make
- it quite easy to accidentally edit a published commit, so
- you should think twice before configuring them not to ask
- for confirmation.
-
- To disable confirmation completely, add all three symbols here
- or set ‘magit-published-branches’ to ‘nil’.
-
- • Various:
-
- • ‘kill-process’ There seldom is a reason to kill a
- process.
-
- • Global settings:
-
- Instead of adding all of the above symbols to the value of
- this option, you can also set it to the atom ‘t’, which has
- the same effect as adding all of the above symbols. Doing
- that most certainly is a bad idea, especially because other
- symbols might be added in the future. So even if you don’t
- want to be asked for confirmation for any of these actions,
- you are still better of adding all of the respective symbols
- individually.
-
- When ‘magit-wip-before-change-mode’ is enabled, then the
- following actions can be undone fairly easily: ‘discard’,
- ‘reverse’, ‘stage-all-changes’, and ‘unstage-all-changes’. If
- and only if this mode is enabled, then ‘safe-with-wip’ has the
- same effect as adding all of these symbols individually.
-
-
-File: magit.info, Node: Completion and Confirmation, Next: The Selection, Prev: Action Confirmation, Up: Completion Confirmation and the Selection
-
-4.5.2 Completion and Confirmation
----------------------------------
-
-Many Magit commands ask the user to select from a list of possible
-things to act on, while offering the most likely choice as the default.
-For many of these commands the default is the thing at point, provided
-that it actually is a valid thing to act on. For many commands that act
-on a branch, the current branch serves as the default if there is no
-branch at point.
-
- These commands combine asking for confirmation and asking for a
-target to act on into a single action. The user can confirm the default
-target using ‘RET’ or abort using ‘C-g’. This is similar to a
-‘y-or-n-p’ prompt, but the keys to confirm or abort differ.
-
- At the same time the user is also given the opportunity to select
-another target, which is useful because for some commands and/or in some
-situations you might want to select the action before selecting the
-target by moving to it.
-
- However you might find that for some commands you always want to use
-the default target, if any, or even that you want the command to act on
-the default without requiring any confirmation at all. The option
-‘magit-dwim-selection’ can be used to configure certain commands to that
-effect.
-
- Note that when the region is active then many commands act on the
-things that are selected using a mechanism based on the region, in many
-cases after asking for confirmation. This region-based mechanism is
-called the "selection" and is described in detail in the next section.
-When a selection exists that is valid for the invoked command, then that
-command never offers to act on something else, and whether it asks for
-confirmation is not controlled by this option.
-
- Also note that Magit asks for confirmation of certain actions that
-are not coupled with completion (or the selection). Such dialogs are
-also not affected by this option and are described in the previous
-section.
-
- -- User Option: magit-dwim-selection
-
- This option can be used to tell certain commands to use the thing at
-point instead of asking the user to select a candidate to act on, with
-or without confirmation.
-
- The value has the form ‘((COMMAND nil|PROMPT DEFAULT)...)’.
-
- • COMMAND is the command that should not prompt for a choice. To
- have an effect, the command has to use the function
- ‘magit-completing-read’ or a utility function which in turn uses
- that function.
-
- • If the command uses ‘magit-completing-read’ multiple times, then
- PROMPT can be used to only affect one of these uses. PROMPT, if
- non-nil, is a regular expression that is used to match against the
- PROMPT argument passed to ‘magit-completing-read’.
-
- • DEFAULT specifies how to use the default. If it is ‘t’, then the
- DEFAULT argument passed to ‘magit-completing-read’ is used without
- confirmation. If it is ‘ask’, then the user is given a chance to
- abort. DEFAULT can also be ‘nil’, in which case the entry has no
- effect.
-
-
-File: magit.info, Node: The Selection, Next: The hunk-internal region, Prev: Completion and Confirmation, Up: Completion Confirmation and the Selection
-
-4.5.3 The Selection
--------------------
-
-If the region is active, then many Magit commands act on the things that
-are selected using a mechanism based on the region instead of one single
-thing. When the region is not active, then these commands act on the
-thing at point or read a single thing to act on. This is described in
-the previous section — this section only covers how multiple things are
-selected, how that is visualized, and how certain commands behave when
-that is the case.
-
- Magit’s mechanism for selecting multiple things, or rather sections
-that represent these things, is based on the Emacs region, but the area
-that Magit considers to be selected is typically larger than the region
-and additional restrictions apply.
-
- Magit makes a distinction between a region that qualifies as forming
-a valid Magit selection and a region that does not. If the region does
-not qualify, then it is displayed as it is in other Emacs buffers. If
-the region does qualify as a Magit selection, then the selection is
-always visualized, while the region itself is only visualized if it
-begins and ends on the same line.
-
- For a region to qualify as a Magit selection, it must begin in the
-heading of one section and end in the heading of a sibling section.
-Note that if the end of the region is at the very beginning of section
-heading (i.e. at the very beginning of a line) then that section is
-considered to be *inside* the selection.
-
- This is not consistent with how the region is normally treated in
-Emacs — if the region ends at the beginning of a line, then that line is
-outside the region. Due to how Magit visualizes the selection, it
-should be obvious that this difference exists.
-
- Not every command acts on every valid selection. Some commands do
-not even consider the location of point, others may act on the section
-at point but not support acting on the selection, and even commands that
-do support the selection of course only do so if it selects things that
-they can act on.
-
- This is the main reason why the selection must include the section at
-point. Even if a selection exists, the invoked command may disregard
-it, in which case it may act on the current section only. It is much
-safer to only act on the current section but not the other selected
-sections than it is to act on the current section *instead* of the
-selected sections. The latter would be much more surprising and if the
-current section always is part of the selection, then that cannot
-happen.
-
- -- Variable: magit-keep-region-overlay
-
- This variable controls whether the region is visualized as usual
- even when a valid Magit selection or a hunk-internal region exists.
- See the doc-string for more information.
-
-
-File: magit.info, Node: The hunk-internal region, Next: Support for Completion Frameworks, Prev: The Selection, Up: Completion Confirmation and the Selection
-
-4.5.4 The hunk-internal region
-------------------------------
-
-Somewhat related to the Magit selection described in the previous
-section is the hunk-internal region.
-
- Like the selection, the hunk-internal region is based on the Emacs
-region but causes that region to not be visualized as it would in other
-Emacs buffers, and includes the line on which the region ends even if it
-ends at the very beginning of that line.
-
- Unlike the selection, which is based on a region that must begin in
-the heading of one section and ends in the section of a sibling section,
-the hunk-internal region must begin inside the *body* of a hunk section
-and end in the body of the *same* section.
-
- The hunk-internal region is honored by "apply" commands, which can,
-among other targets, act on a hunk. If the hunk-internal region is
-active, then such commands act only on the marked part of the hunk
-instead of on the complete hunk.
-
-
-File: magit.info, Node: Support for Completion Frameworks, Next: Additional Completion Options, Prev: The hunk-internal region, Up: Completion Confirmation and the Selection
-
-4.5.5 Support for Completion Frameworks
----------------------------------------
-
-The built-in option ‘completing-read-function’ specifies the low-level
-function used by ‘completing-read’ to ask a user to select from a list
-of choices. Its default value is ‘completing-read-default’.
-Alternative completion frameworks typically activate themselves by
-substituting their own implementation.
-
- Mostly for historic reasons Magit provides a similar option named
-‘magit-completing-read-function’, which only controls the low-level
-function used by ‘magit-completing-read’. This option also makes it
-possible to use a different completing mechanism for Magit than for the
-rest of Emacs, but doing that is not recommend.
-
- You most likely don’t have to customize the magit-specific option to
-use an alternative completion framework. For example, if you enable
-‘ivy-mode’, then Magit will respect that, and if you enable ‘helm-mode’,
-then you are done too.
-
- However if you want to use Ido, then ‘ido-mode’ won’t do the trick.
-You will also have to install the ‘ido-completing-read+’ package and use
-‘magit-ido-completing-read’ as ‘magit-completing-read-function’.
-
- -- User Option: magit-completing-read-function
-
- The value of this variable is the low-level function used to
- perform completion by code that uses ‘magit-completing-read’ (as
- opposed to the built-in ‘completing-read’).
-
- The default value, ‘magit-builtin-completing-read’, is suitable for
- the standard completion mechanism, ‘ivy-mode’, and ‘helm-mode’ at
- least.
-
- The built-in ‘completing-read’ and ‘completing-read-default’ are
- *not* suitable to be used here. ‘magit-builtin-completing-read’
- performs some additional work, and any function used in its place
- has to do the same.
-
- -- Function: magit-builtin-completing-read prompt choices &optional
- predicate require-match initial-input hist def
-
- This function performs completion using the built-in
- ‘completing-read’ and does some additional magit-specific work.
-
- -- Function: magit-ido-completing-read prompt choices &optional
- predicate require-match initial-input hist def
-
- This function performs completion using ‘ido-completing-read+’ from
- the package by the same name (which you have to explicitly install)
- and does some additional magit-specific work.
-
- We have to use ‘ido-completing-read+’ instead of the
- ‘ido-completing-read’ that comes with Ido itself, because the
- latter, while intended as a drop-in replacement, cannot serve that
- purpose because it violates too many of the implicit conventions.
-
- -- Function: magit-completing-read prompt choices &optional predicate
- require-match initial-input hist def fallback
-
- This is the function that Magit commands use when they need the
- user to select a single thing to act on. The arguments have the
- same meaning as for ‘completing-read’, except for FALLBACK, which
- is unique to this function and is described below.
-
- Instead of asking the user to choose from a list of possible
- candidates, this function may just return the default specified by
- DEF, with or without requiring user confirmation. Whether that is
- the case depends on PROMPT, ‘this-command’ and
- ‘magit-dwim-selection’. See the documentation of the latter for
- more information.
-
- If it does read a value in the minibuffer, then this function acts
- similar to ‘completing-read’, except for the following:
-
- • COLLECTION must be a list of choices. A function is not
- supported.
-
- • If REQUIRE-MATCH is ‘nil’ and the user exits without a choice,
- then ‘nil’ is returned instead of an empty string.
-
- • If REQUIRE-MATCH is non-nil and the users exits without a
- choice, an user-error is raised.
-
- • FALLBACK specifies a secondary default that is only used if
- the primary default DEF is ‘nil’. The secondary default is
- not subject to ‘magit-dwim-selection’ — if DEF is ‘nil’ but
- FALLBACK is not, then this function always asks the user to
- choose a candidate, just as if both defaults were ‘nil’.
-
- • ": " is appended to PROMPT.
-
- • PROMPT is modified to end with \" (default DEF|FALLBACK): \"
- provided that DEF or FALLBACK is non-nil, that neither
- ‘ivy-mode’ nor ‘helm-mode’ is enabled, and that
- ‘magit-completing-read-function’ is set to its default value
- of ‘magit-builtin-completing-read’.
-
-
-File: magit.info, Node: Additional Completion Options, Prev: Support for Completion Frameworks, Up: Completion Confirmation and the Selection
-
-4.5.6 Additional Completion Options
------------------------------------
-
- -- User Option: magit-list-refs-sortby
-
- For many commands that read a ref or refs from the user, the value
- of this option can be used to control the order of the refs. Valid
- values include any key accepted by the ‘--sort’ flag of ‘git
- for-each-ref’. By default, refs are sorted alphabetically by their
- full name (e.g., "refs/heads/master").
-
-
-File: magit.info, Node: Running Git, Prev: Completion Confirmation and the Selection, Up: Interface Concepts
-
-4.6 Running Git
-===============
-
-* Menu:
-
-* Viewing Git Output::
-* Git Process Status::
-* Running Git Manually::
-* Git Executable::
-* Global Git Arguments::
-
-
-File: magit.info, Node: Viewing Git Output, Next: Git Process Status, Up: Running Git
-
-4.6.1 Viewing Git Output
-------------------------
-
-Magit runs Git either for side-effects (e.g. when pushing) or to get
-some value (e.g. the name of the current branch).
-
- When Git is run for side-effects, the process output is logged in a
-per-repository log buffer, which can be consulted using the
-‘magit-process’ command when things don’t go as expected.
-
- The output/errors for up to ‘magit-process-log-max’ Git commands are
-retained.
-
-‘$’ (‘magit-process’)
-
- This commands displays the process buffer for the current
- repository.
-
- Inside that buffer, the usual key bindings for navigating and showing
-sections are available. There is one additional command.
-
-‘k’ (‘magit-process-kill’)
-
- This command kills the process represented by the section at point.
-
- -- User Option: magit-git-debug
-
- When this is non-nil then the output of all calls to git are logged
- in the process buffer. This is useful when debugging, otherwise it
- just negatively affects performance.
-
-
-File: magit.info, Node: Git Process Status, Next: Running Git Manually, Prev: Viewing Git Output, Up: Running Git
-
-4.6.2 Git Process Status
-------------------------
-
-When a Git process is running for side-effects, Magit displays an
-indicator in the mode line, using the ‘magit-mode-line-process’ face.
-
- If the Git process exits successfully, the process indicator is
-removed from the mode line immediately.
-
- In the case of a Git error, the process indicator is not removed, but
-is instead highlighted with the ‘magit-mode-line-process-error’ face,
-and the error details from the process buffer are provided as a tooltip
-for mouse users. This error indicator persists in the mode line until
-the next magit buffer refresh.
-
- If you do not wish process errors to be indicated in the mode line,
-customize the ‘magit-process-display-mode-line-error’ user option.
-
- Process errors are additionally indicated at the top of the status
-buffer.
-
-
-File: magit.info, Node: Running Git Manually, Next: Git Executable, Prev: Git Process Status, Up: Running Git
-
-4.6.3 Running Git Manually
---------------------------
-
-While Magit provides many Emacs commands to interact with Git, it does
-not cover everything. In those cases your existing Git knowledge will
-come in handy. Magit provides some commands for running arbitrary Git
-commands by typing them into the minibuffer, instead of having to switch
-to a shell.
-
-‘!’ (‘magit-run’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
-‘! !’ (‘magit-git-command-topdir’)
-
- This command reads a command from the user and executes it in the
- top-level directory of the current working tree.
-
- The string "git " is used as initial input when prompting the user
- for the command. It can be removed to run another command.
-
-‘! p’ (‘magit-git-command’)
-
- This command reads a command from the user and executes it in
- ‘default-directory’. With a prefix argument the command is
- executed in the top-level directory of the current working tree
- instead.
-
- The string "git " is used as initial input when prompting the user
- for the command. It can be removed to run another command.
-
-‘! s’ (‘magit-shell-command-topdir’)
-
- This command reads a command from the user and executes it in the
- top-level directory of the current working tree.
-
-‘! S’ (‘magit-shell-command’)
-
- This command reads a command from the user and executes it in
- ‘default-directory’. With a prefix argument the command is
- executed in the top-level directory of the current working tree
- instead.
-
- -- User Option: magit-shell-command-verbose-prompt
-
- Whether the prompt, used by the above commands when reading a shell
- command, shows the directory in which it will be run.
-
- These suffix commands start external gui tools.
-
-‘! k’ (‘magit-run-gitk’)
-
- This command runs ‘gitk’ in the current repository.
-
-‘! a’ (‘magit-run-gitk-all’)
-
- This command runs ‘gitk --all’ in the current repository.
-
-‘! b’ (‘magit-run-gitk-branches’)
-
- This command runs ‘gitk --branches’ in the current repository.
-
-‘! g’ (‘magit-run-git-gui’)
-
- This command runs ‘git gui’ in the current repository.
-
-
-File: magit.info, Node: Git Executable, Next: Global Git Arguments, Prev: Running Git Manually, Up: Running Git
-
-4.6.4 Git Executable
---------------------
-
-Except on MS Windows, Magit defaults to running Git without specifying
-the path to the git executable. Instead the first executable found by
-Emacs on ‘exec-path’ is used (whose value in turn is set based on the
-value of the environment variable ‘$PATH’ when Emacs was started).
-
- This has the advantage that it continues to work even when using
-Tramp to connect to a remote machine on which the executable is found in
-a different place. The downside is that if you have multiple versions
-of Git installed, then you might end up using another version than the
-one you think you are using.
-
-‘M-x magit-version’ (‘magit-version’)
-
- This command shows the currently used versions of Magit, Git, and
- Emacs in the echo area. Non-interactively this just returns the
- Magit version.
-
- When the ‘system-type’ is ‘windows-nt’, then ‘magit-git-executable’
-is set to an absolute path when Magit is first loaded. This is
-necessary because Git on that platform comes with several wrapper
-scripts for the actual git binary, which are also placed on ‘$PATH’, and
-using one of these wrappers instead of the binary would degrade
-performance horribly.
-
- If Magit doesn’t find the correct executable then you *can* work
-around that by setting ‘magit-git-executable’ to an absolute path. But
-note that doing so is a kludge. It is better to make sure the order in
-the environment variable ‘$PATH’ is correct, and that Emacs is started
-with that environment in effect. The command
-‘magit-debug-git-executable’ can be useful to find out where Emacs is
-searching for git. If you have to connect from Windows to a non-Windows
-machine, then you must change the value to "git".
-
- -- User Option: magit-git-executable
-
- The git executable used by Magit, either the full path to the
- executable or the string "git" to let Emacs find the executable
- itself, using the standard mechanism for doing such things.
-
-‘M-x magit-debug-git-executable’ (‘magit-debug-git-executable’)
-
- Display a buffer with information about ‘magit-git-executable’.
-
-
-File: magit.info, Node: Global Git Arguments, Prev: Git Executable, Up: Running Git
-
-4.6.5 Global Git Arguments
---------------------------
-
- -- User Option: magit-git-global-arguments
-
- The arguments set here are used every time the git executable is
- run as a subprocess. They are placed right after the executable
- itself and before the git command - as in ‘git HERE... COMMAND
- REST’. For valid arguments see *note (gitman)git::.
-
- Be careful what you add here, especially if you are using Tramp to
- connect to servers with ancient Git versions. Never remove
- anything that is part of the default value, unless you really know
- what you are doing. And think very hard before adding something;
- it will be used every time Magit runs Git for any purpose.
-
-
-File: magit.info, Node: Inspecting, Next: Manipulating, Prev: Interface Concepts, Up: Top
-
-5 Inspecting
-************
-
-The functionality provided by Magit can be roughly divided into three
-groups: inspecting existing data, manipulating existing data or adding
-new data, and transferring data. Of course that is a rather crude
-distinction that often falls short, but it’s more useful than no
-distinction at all. This section is concerned with inspecting data, the
-next two with manipulating and transferring it. Then follows a section
-about miscellaneous functionality, which cannot easily be fit into this
-distinction.
-
- Of course other distinctions make sense too, e.g. Git’s distinction
-between porcelain and plumbing commands, which for the most part is
-equivalent to Emacs’ distinction between interactive commands and
-non-interactive functions. All of the sections mentioned before are
-mainly concerned with the porcelain – Magit’s plumbing layer is
-described later.
-
-* Menu:
-
-* Status Buffer::
-* Repository List::
-* Logging::
-* Diffing::
-* Ediffing::
-* References Buffer::
-* Bisecting::
-* Visiting Files and Blobs::
-* Blaming::
-
-
-File: magit.info, Node: Status Buffer, Next: Repository List, Up: Inspecting
-
-5.1 Status Buffer
-=================
-
-While other Magit buffers contain e.g. one particular diff or one
-particular log, the status buffer contains the diffs for staged and
-unstaged changes, logs for unpushed and unpulled commits, lists of
-stashes and untracked files, and information related to the current
-branch.
-
- During certain incomplete operations – for example when a merge
-resulted in a conflict – additional information is displayed that helps
-proceeding with or aborting the operation.
-
- The command ‘magit-status’ displays the status buffer belonging to
-the current repository in another window. This command is used so often
-that it should be bound globally. We recommend using ‘C-x g’:
-
- (global-set-key (kbd "C-x g") 'magit-status)
-
-‘C-x g’ (‘magit-status’)
-
- When invoked from within an existing Git repository, then this
- command shows the status of that repository in a buffer.
-
- If the current directory isn’t located within a Git repository,
- then this command prompts for an existing repository or an
- arbitrary directory, depending on the option
- ‘magit-repository-directories’, and the status for the selected
- repository is shown instead.
-
- • If that option specifies any existing repositories, then the
- user is asked to select one of them.
-
- • Otherwise the user is asked to select an arbitrary directory
- using regular file-name completion. If the selected directory
- is the top-level directory of an existing working tree, then
- the status buffer for that is shown.
-
- • Otherwise the user is offered to initialize the selected
- directory as a new repository. After creating the repository
- its status buffer is shown.
-
- These fallback behaviors can also be forced using one or more
- prefix arguments:
-
- • With two prefix arguments (or more precisely a numeric prefix
- value of 16 or greater) an arbitrary directory is read, which
- is then acted on as described above. The same could be
- accomplished using the command ‘magit-init’.
-
- • With a single prefix argument an existing repository is read
- from the user, or if no repository can be found based on the
- value of ‘magit-repository-directories’, then the behavior is
- the same as with two prefix arguments.
-
- -- User Option: magit-repository-directories
-
- List of directories that are Git repositories or contain Git
- repositories.
-
- Each element has the form ‘(DIRECTORY . DEPTH)’. DIRECTORY has to
- be a directory or a directory file-name, a string. DEPTH, an
- integer, specifies the maximum depth to look for Git repositories.
- If it is 0, then only add DIRECTORY itself.
-
- This option controls which repositories are being listed by
- ‘magit-list-repositories’. It also affects ‘magit-status’ (which
- see) in potentially surprising ways (see above).
-
- -- Command: ido-enter-magit-status
-
- From an Ido prompt used to open a file, instead drop into
- ‘magit-status’. This is similar to ‘ido-magic-delete-char’, which,
- despite its name, usually causes a Dired buffer to be created.
-
- To make this command available, use something like:
-
- (add-hook 'ido-setup-hook
- (lambda ()
- (define-key ido-completion-map
- (kbd \"C-x g\") 'ido-enter-magit-status)))
-
- Starting with Emacs 25.1 the Ido keymaps are defined just once
- instead of every time Ido is invoked, so now you can modify it like
- pretty much every other keymap:
-
- (define-key ido-common-completion-map
- (kbd \"C-x g\") 'ido-enter-magit-status)
-
-* Menu:
-
-* Status Sections::
-* Status Header Sections::
-* Status Module Sections::
-* Status Options::
-
-
-File: magit.info, Node: Status Sections, Next: Status Header Sections, Up: Status Buffer
-
-5.1.1 Status Sections
----------------------
-
-The contents of status buffers is controlled using the hook
-‘magit-status-sections-hook’. See *note Section Hooks:: to learn about
-such hooks and how to customize them.
-
- -- User Option: magit-status-sections-hook
-
- Hook run to insert sections into a status buffer.
-
- The first function on that hook by default is
-‘magit-insert-status-headers’; it is described in the next section. By
-default the following functions are also members of that hook:
-
- -- Function: magit-insert-merge-log
-
- Insert section for the on-going merge. Display the heads that are
- being merged. If no merge is in progress, do nothing.
-
- -- Function: magit-insert-rebase-sequence
-
- Insert section for the on-going rebase sequence. If no such
- sequence is in progress, do nothing.
-
- -- Function: magit-insert-am-sequence
-
- Insert section for the on-going patch applying sequence. If no
- such sequence is in progress, do nothing.
-
- -- Function: magit-insert-sequencer-sequence
-
- Insert section for the on-going cherry-pick or revert sequence. If
- no such sequence is in progress, do nothing.
-
- -- Function: magit-insert-bisect-output
-
- While bisecting, insert section with output from ‘git bisect’.
-
- -- Function: magit-insert-bisect-rest
-
- While bisecting, insert section visualizing the bisect state.
-
- -- Function: magit-insert-bisect-log
-
- While bisecting, insert section logging bisect progress.
-
- -- Function: magit-insert-untracked-files
-
- Maybe insert a list or tree of untracked files.
-
- Do so depending on the value of ‘status.showUntrackedFiles’. Note
- that even if the value is ‘all’, Magit still initially only shows
- directories. But the directory sections can then be expanded using
- ‘TAB’.
-
- -- Function: magit-insert-unstaged-changes
-
- Insert section showing unstaged changes.
-
- -- Function: magit-insert-staged-changes
-
- Insert section showing staged changes.
-
- -- Function: magit-insert-stashes &optional ref heading
-
- Insert the ‘stashes’ section showing reflog for "refs/stash". If
- optional REF is non-nil show reflog for that instead. If optional
- HEADING is non-nil use that as section heading instead of
- "Stashes:".
-
- -- Function: magit-insert-unpulled-from-upstream
-
- Insert section showing commits that haven’t been pulled from the
- upstream branch yet.
-
- -- Function: magit-insert-unpulled-from-pushremote
-
- Insert section showing commits that haven’t been pulled from the
- push-remote branch yet.
-
- -- Function: magit-insert-unpushed-to-upstream
-
- Insert section showing commits that haven’t been pushed to the
- upstream yet.
-
- -- Function: magit-insert-unpushed-to-pushremote
-
- Insert section showing commits that haven’t been pushed to the
- push-remote yet.
-
- The following functions can also be added to the above hook:
-
- -- Function: magit-insert-tracked-files
-
- Insert a tree of tracked files.
-
- -- Function: magit-insert-ignored-files
-
- Insert a tree of ignored files. Its possible to limit the logs in
- the current buffer to a certain directory using ‘D = f <DIRECTORY>
- RET g’. If you do that, then that that also affects this command.
-
- The log filter can be used to limit to multiple files. In that
- case this function only respects the first of the files and only if
- it is a directory.
-
- -- Function: magit-insert-skip-worktree-files
-
- Insert a tree of skip-worktree files. If the first element of
- ‘magit-buffer-diff-files’ is a directory, then limit the list to
- files below that. The value of that variable can be set using ‘D
- -- DIRECTORY RET g’.
-
- -- Function: magit-insert-assumed-unchanged-files
-
- Insert a tree of files that are assumed to be unchanged. If the
- first element of ‘magit-buffer-diff-files’ is a directory, then
- limit the list to files below that. The value of that variable can
- be set using ‘D -- DIRECTORY RET g’.
-
- -- Function: magit-insert-unpulled-or-recent-commits
-
- Insert section showing unpulled or recent commits. If an upstream
- is configured for the current branch and it is ahead of the current
- branch, then show the missing commits. Otherwise, show the last
- ‘magit-log-section-commit-count’ commits.
-
- -- Function: magit-insert-recent-commits
-
- Insert section showing the last ‘magit-log-section-commit-count’
- commits.
-
- -- User Option: magit-log-section-commit-count
-
- How many recent commits ‘magit-insert-recent-commits’ and
- ‘magit-insert-unpulled-or-recent-commits’ (provided there are no
- unpulled commits) show.
-
- -- Function: magit-insert-unpulled-cherries
-
- Insert section showing unpulled commits. Like
- ‘magit-insert-unpulled-commits’ but prefix each commit that has not
- been applied yet (i.e. a commit with a patch-id not shared with
- any local commit) with "+", and all others with "-".
-
- -- Function: magit-insert-unpushed-cherries
-
- Insert section showing unpushed commits. Like
- ‘magit-insert-unpushed-commits’ but prefix each commit which has
- not been applied to upstream yet (i.e. a commit with a patch-id
- not shared with any upstream commit) with "+" and all others with
- "-".
-
- See *note References Buffer:: for some more section inserters, which
-could be used here.
-
-
-File: magit.info, Node: Status Header Sections, Next: Status Module Sections, Prev: Status Sections, Up: Status Buffer
-
-5.1.2 Status Header Sections
-----------------------------
-
-The contents of status buffers is controlled using the hook
-‘magit-status-sections-hook’ (see *note Status Sections::).
-
- By default ‘magit-insert-status-headers’ is the first member of that
-hook variable.
-
- -- Function: magit-insert-status-headers
-
- Insert headers sections appropriate for ‘magit-status-mode’
- buffers. The sections are inserted by running the functions on the
- hook ‘magit-status-headers-hook’.
-
- -- User Option: magit-status-headers-hook
-
- Hook run to insert headers sections into the status buffer.
-
- This hook is run by ‘magit-insert-status-headers’, which in turn
- has to be a member of ‘magit-status-sections-hook’ to be used at
- all.
-
- By default the following functions are members of the above hook:
-
- -- Function: magit-insert-error-header
-
- Insert a header line showing the message about the Git error that
- just occurred.
-
- This function is only aware of the last error that occur when Git
- was run for side-effects. If, for example, an error occurs while
- generating a diff, then that error won’t be inserted. Refreshing
- the status buffer causes this section to disappear again.
-
- -- Function: magit-insert-diff-filter-header
-
- Insert a header line showing the effective diff filters.
-
- -- Function: magit-insert-head-branch-header
-
- Insert a header line about the current branch or detached ‘HEAD’.
-
- -- Function: magit-insert-upstream-branch-header
-
- Insert a header line about the branch that is usually pulled into
- the current branch.
-
- -- Function: magit-insert-push-branch-header
-
- Insert a header line about the branch that the current branch is
- usually pushed to.
-
- -- Function: magit-insert-tags-header
-
- Insert a header line about the current and/or next tag, along with
- the number of commits between the tag and ‘HEAD’.
-
- The following functions can also be added to the above hook:
-
- -- Function: magit-insert-repo-header
-
- Insert a header line showing the path to the repository top-level.
-
- -- Function: magit-insert-remote-header
-
- Insert a header line about the remote of the current branch.
-
- If no remote is configured for the current branch, then fall back
- showing the "origin" remote, or if that does not exist the first
- remote in alphabetic order.
-
- -- Function: magit-insert-user-header
-
- Insert a header line about the current user.
-
-
-File: magit.info, Node: Status Module Sections, Next: Status Options, Prev: Status Header Sections, Up: Status Buffer
-
-5.1.3 Status Module Sections
-----------------------------
-
-The contents of status buffers is controlled using the hook
-‘magit-status-sections-hook’ (see *note Status Sections::).
-
- By default ‘magit-insert-modules’ is _not_ a member of that hook
-variable.
-
- -- Function: magit-insert-modules
-
- Insert submodule sections.
-
- Hook ‘magit-module-sections-hook’ controls which module sections
- are inserted, and option ‘magit-module-sections-nested’ controls
- whether they are wrapped in an additional section.
-
- -- User Option: magit-module-sections-hook
-
- Hook run by ‘magit-insert-modules’.
-
- -- User Option: magit-module-sections-nested
-
- This option controls whether ‘magit-insert-modules’ wraps inserted
- sections in an additional section.
-
- If this is non-nil, then only a single top-level section is
- inserted. If it is nil, then all sections listed in
- ‘magit-module-sections-hook’ become top-level sections.
-
- -- Function: magit-insert-modules-overview
-
- Insert sections for all submodules. For each section insert the
- path, the branch, and the output of ‘git describe --tags’, or,
- failing that, the abbreviated HEAD commit hash.
-
- Press ‘RET’ on such a submodule section to show its own status
- buffer. Press ‘RET’ on the "Modules" section to display a list of
- submodules in a separate buffer. This shows additional information
- not displayed in the super-repository’s status buffer.
-
- -- Function: magit-insert-modules-unpulled-from-upstream
-
- Insert sections for modules that haven’t been pulled from the
- upstream yet. These sections can be expanded to show the
- respective commits.
-
- -- Function: magit-insert-modules-unpulled-from-pushremote
-
- Insert sections for modules that haven’t been pulled from the
- push-remote yet. These sections can be expanded to show the
- respective commits.
-
- -- Function: magit-insert-modules-unpushed-to-upstream
-
- Insert sections for modules that haven’t been pushed to the
- upstream yet. These sections can be expanded to show the
- respective commits.
-
- -- Function: magit-insert-modules-unpushed-to-pushremote
-
- Insert sections for modules that haven’t been pushed to the
- push-remote yet. These sections can be expanded to show the
- respective commits.
-
-
-File: magit.info, Node: Status Options, Prev: Status Module Sections, Up: Status Buffer
-
-5.1.4 Status Options
---------------------
-
- -- User Option: magit-status-refresh-hook
-
- Hook run after a status buffer has been refreshed.
-
- -- User Option: magit-status-margin
-
- This option specifies whether the margin is initially shown in
- Magit-Status mode buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
- Also see the proceeding section for more options concerning status
-buffers.
-
-
-File: magit.info, Node: Repository List, Next: Logging, Prev: Status Buffer, Up: Inspecting
-
-5.2 Repository List
-===================
-
- -- Command: magit-list-repositories
-
- This command displays a list of repositories in a separate buffer.
-
- The options ‘magit-repository-directories’ and
- ‘magit-repository-directories-depth’ control which repositories are
- displayed.
-
- -- User Option: magit-repolist-columns
-
- This option controls what columns are displayed by the command
- ‘magit-list-repositories’ and how they are displayed.
-
- Each element has the form ‘(HEADER WIDTH FORMAT PROPS)’.
-
- HEADER is the string displayed in the header. WIDTH is the width
- of the column. FORMAT is a function that is called with one
- argument, the repository identification (usually its basename), and
- with ‘default-directory’ bound to the toplevel of its working tree.
- It has to return a string to be inserted or nil. PROPS is an alist
- that supports the keys ‘:right-align’ and ‘:pad-right’.
-
- The following functions can be added to the above option:
-
- -- Function: magit-repolist-column-ident
-
- This function inserts the identification of the repository.
- Usually this is just its basename.
-
- -- Function: magit-repolist-column-path
-
- This function inserts the absolute path of the repository.
-
- -- Function: magit-repolist-column-version
-
- This function inserts a description of the repository’s ‘HEAD’
- revision.
-
- -- Function: magit-repolist-column-branch
-
- This function inserts the name of the current branch.
-
- -- Function: magit-repolist-column-upstream
-
- This function inserts the name of the upstream branch of the
- current branch.
-
- -- Function: magit-repolist-column-branches
-
- This function inserts the number of branches.
-
- -- Function: magit-repolist-column-stashes
-
- This function inserts the number of stashes.
-
- -- Function: magit-repolist-column-flag
-
- This function inserts a flag as specified by
- ‘magit-repolist-column-flag-alist’.
-
- By default this indicates whether there are uncommitted changes.
-
- • ‘N’ if there is at least one untracked file.
-
- • ‘U’ if there is at least one unstaged file.
-
- • ‘S’ if there is at least one staged file.
-
- Only the first one of these that applies is shown.
-
- -- Function: magit-repolist-column-unpulled-from-upstream
-
- This function inserts the number of upstream commits not in the
- current branch.
-
- -- Function: magit-repolist-column-unpulled-from-pushremote
-
- This function inserts the number of commits in the push branch but
- not the current branch.
-
- -- Function: magit-repolist-column-unpushed-to-upstream
-
- This function inserts the number of commits in the current branch
- but not its upstream.
-
- -- Function: magit-repolist-column-unpushed-to-pushremote
-
- This function inserts the number of commits in the current branch
- but not its push branch.
-
-
-File: magit.info, Node: Logging, Next: Diffing, Prev: Repository List, Up: Inspecting
-
-5.3 Logging
-===========
-
-The status buffer contains logs for the unpushed and unpulled commits,
-but that obviously isn’t enough. The transient prefix command
-‘magit-log’, on ‘l’, features several suffix commands, which show a
-specific log in a separate log buffer.
-
- Like other transient prefix commands, ‘magit-log’ also features
-several infix arguments that can be changed before invoking one of the
-suffix commands. However, in the case of the log transient, these
-arguments may be taken from those currently in use in the current
-repository’s log buffer, depending on the value of
-‘magit-prefix-use-buffer-arguments’ (see *note Transient Arguments and
-Buffer Variables::).
-
- For information about the various arguments, see *note
-(gitman)git-log::.
-
- The switch ‘++order=VALUE’ is converted to one of
-‘--author-date-order’, ‘--date-order’, or ‘--topo-order’ before being
-passed to ‘git log’.
-
- The log transient also features several reflog commands. See *note
-Reflog::.
-
-‘l’ (‘magit-log’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘l l’ (‘magit-log-current’)
-
- Show log for the current branch. When ‘HEAD’ is detached or with a
- prefix argument, show log for one or more revs read from the
- minibuffer.
-
-‘l o’ (‘magit-log-other’)
-
- Show log for one or more revs read from the minibuffer. The user
- can input any revision or revisions separated by a space, or even
- ranges, but only branches, tags, and a representation of the commit
- at point are available as completion candidates.
-
-‘l h’ (‘magit-log-head’)
-
- Show log for ‘HEAD’.
-
-‘l L’ (‘magit-log-branches’)
-
- Show log for all local branches and ‘HEAD’.
-
-‘l b’ (‘magit-log-all-branches’)
-
- Show log for all local and remote branches and ‘HEAD’.
-
-‘l a’ (‘magit-log-all’)
-
- Show log for all references and ‘HEAD’.
-
- Two additional commands that show the log for the file or blob that
-is being visited in the current buffer exists, see *note Minor Mode for
-Buffers Visiting Files::. The command ‘magit-cherry’ also shows a log,
-see *note Cherries::.
-
-* Menu:
-
-* Refreshing Logs::
-* Log Buffer::
-* Log Margin::
-* Select from Log::
-* Reflog::
-* Cherries::
-
-
-File: magit.info, Node: Refreshing Logs, Next: Log Buffer, Up: Logging
-
-5.3.1 Refreshing Logs
----------------------
-
-The transient prefix command ‘magit-log-refresh’, on ‘L’, can be used to
-change the log arguments used in the current buffer, without changing
-which log is shown. This works in dedicated log buffers, but also in
-the status buffer.
-
-‘L’ (‘magit-log-refresh’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘L g’ (‘magit-log-refresh’)
-
- This suffix command sets the local log arguments for the current
- buffer.
-
-‘L s’ (‘magit-log-set-default-arguments’)
-
- This suffix command sets the default log arguments for buffers of
- the same type as that of the current buffer. Other existing
- buffers of the same type are not affected because their local
- values have already been initialized.
-
-‘L w’ (‘magit-log-save-default-arguments’)
-
- This suffix command sets the default log arguments for buffers of
- the same type as that of the current buffer, and saves the value
- for future sessions. Other existing buffers of the same type are
- not affected because their local values have already been
- initialized.
-
-‘L t’ (‘magit-toggle-margin’)
-
- Show or hide the margin.
-
-
-File: magit.info, Node: Log Buffer, Next: Log Margin, Prev: Refreshing Logs, Up: Logging
-
-5.3.2 Log Buffer
-----------------
-
-‘L’ (‘magit-log-refresh’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- See *note Refreshing Logs::.
-
-‘q’ (‘magit-log-bury-buffer’)
-
- Bury the current buffer or the revision buffer in the same frame.
- Like ‘magit-mode-bury-buffer’ (which see) but with a negative
- prefix argument instead bury the revision buffer, provided it is
- displayed in the current frame.
-
-‘C-c C-b’ (‘magit-go-backward’)
-
- Move backward in current buffer’s history.
-
-‘C-c C-f’ (‘magit-go-forward’)
-
- Move forward in current buffer’s history.
-
-‘C-c C-n’ (‘magit-log-move-to-parent’)
-
- Move to a parent of the current commit. By default, this is the
- first parent, but a numeric prefix can be used to specify another
- parent.
-
-‘SPC’ (‘magit-diff-show-or-scroll-up’)
-
- Update the commit or diff buffer for the thing at point.
-
- Either show the commit or stash at point in the appropriate buffer,
- or if that buffer is already being displayed in the current frame
- and contains information about that commit or stash, then instead
- scroll the buffer up. If there is no commit or stash at point,
- then prompt for a commit.
-
-‘DEL’ (‘magit-diff-show-or-scroll-down’)
-
- Update the commit or diff buffer for the thing at point.
-
- Either show the commit or stash at point in the appropriate buffer,
- or if that buffer is already being displayed in the current frame
- and contains information about that commit or stash, then instead
- scroll the buffer down. If there is no commit or stash at point,
- then prompt for a commit.
-
-‘=’ (‘magit-log-toggle-commit-limit’)
-
- Toggle the number of commits the current log buffer is limited to.
- If the number of commits is currently limited, then remove that
- limit. Otherwise set it to 256.
-
-‘+’ (‘magit-log-double-commit-limit’)
-
- Double the number of commits the current log buffer is limited to.
-
-‘-’ (‘magit-log-half-commit-limit’)
-
- Half the number of commits the current log buffer is limited to.
-
- -- User Option: magit-log-auto-more
-
- Insert more log entries automatically when moving past the last
- entry. Only considered when moving past the last entry with
- ‘magit-goto-*-section’ commands.
-
- -- User Option: magit-log-show-refname-after-summary
-
- Whether to show the refnames after the commit summaries. This is
- useful if you use really long branch names.
-
- Magit displays references in logs a bit differently from how Git does
-it.
-
- Local branches are blue and remote branches are green. Of course
-that depends on the used theme, as do the colors used for other types of
-references. The current branch has a box around it, as do remote
-branches that are their respective remote’s ‘HEAD’ branch.
-
- If a local branch and its push-target point at the same commit, then
-their names are combined to preserve space and to make that relationship
-visible. For example:
-
- origin/feature
- [green][blue-]
-
- instead of
-
- feature origin/feature
- [blue-] [green-------]
-
- Also note that while the transient features the ‘--show-signature’
-argument, that won’t actually be used when enabled, because Magit
-defaults to use just one line per commit. Instead the commit colorized
-to indicate the validity of the signed commit object, using the faces
-named ‘magit-signature-*’ (which see).
-
- For a description of ‘magit-log-margin’ see *note Log Margin::.
-
-
-File: magit.info, Node: Log Margin, Next: Select from Log, Prev: Log Buffer, Up: Logging
-
-5.3.3 Log Margin
-----------------
-
-In buffers which show one or more logs, it is possible to show
-additional information about each commit in the margin. The options
-used to configure the margin are named ‘magit-INFIX-margin’, where INFIX
-is the same as in the respective major-mode ‘magit-INFIX-mode’. In
-regular log buffers that would be ‘magit-log-margin’.
-
- -- User Option: magit-log-margin
-
- This option specifies whether the margin is initially shown in
- Magit-Log mode buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
- You can change the STYLE and AUTHOR-WIDTH of all ‘magit-INFIX-margin’
-options to the same values by customizing ‘magit-log-margin’ *before*
-‘magit’ is loaded. If you do that, then the respective values for the
-other options will default to what you have set for that variable.
-Likewise if you set INIT in ‘magit-log-margin’ to ‘nil’, then that is
-used in the default of all other options. But setting it to ‘t’, i.e.
-re-enforcing the default for that option, does not carry to other
-options.
-
- -- User Option: magit-log-margin-show-committer-date
-
- This option specifies whether to show the committer date in the
- margin. This option only controls whether the committer date is
- displayed instead of the author date. Whether some date is
- displayed in the margin and whether the margin is displayed at all
- is controlled by other options.
-
-‘L’ (‘magit-margin-settings’)
-
- This transient prefix command binds the following suffix commands,
- each of which changes the appearance of the margin in some way.
-
- In some buffers that support the margin, ‘L’ is instead bound to
-‘magit-log-refresh’, but that transient features the same commands, and
-then some other unrelated commands.
-
-‘L L’ (‘magit-toggle-margin’)
-
- This command shows or hides the margin.
-
-‘L l’ (‘magit-cycle-margin-style’)
-
- This command cycles the style used for the margin.
-
-‘L d’ (‘magit-toggle-margin-details’)
-
- This command shows or hides details in the margin.
-
-
-File: magit.info, Node: Select from Log, Next: Reflog, Prev: Log Margin, Up: Logging
-
-5.3.4 Select from Log
----------------------
-
-When the user has to select a recent commit that is reachable from
-‘HEAD’, using regular completion would be inconvenient (because most
-humans cannot remember hashes or "HEAD~5", at least not without double
-checking). Instead a log buffer is used to select the commit, which has
-the advantage that commits are presented in order and with the commit
-message.
-
- Such selection logs are used when selecting the beginning of a rebase
-and when selecting the commit to be squashed into.
-
- In addition to the key bindings available in all log buffers, the
-following additional key bindings are available in selection log
-buffers:
-
-‘C-c C-c’ (‘magit-log-select-pick’)
-
- Select the commit at point and act on it. Call
- ‘magit-log-select-pick-function’ with the selected commit as
- argument.
-
-‘C-c C-k’ (‘magit-log-select-quit’)
-
- Abort selecting a commit, don’t act on any commit.
-
- -- User Option: magit-log-select-margin
-
- This option specifies whether the margin is initially shown in
- Magit-Log-Select mode buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
-
-File: magit.info, Node: Reflog, Next: Cherries, Prev: Select from Log, Up: Logging
-
-5.3.5 Reflog
-------------
-
-Also see *note (gitman)git-reflog::.
-
- These reflog commands are available from the log transient. See
-*note Logging::.
-
-‘l r’ (‘magit-reflog-current’)
-
- Display the reflog of the current branch.
-
-‘l O’ (‘magit-reflog-other’)
-
- Display the reflog of a branch or another ref.
-
-‘l H’ (‘magit-reflog-head’)
-
- Display the ‘HEAD’ reflog.
-
- -- User Option: magit-reflog-margin
-
- This option specifies whether the margin is initially shown in
- Magit-Reflog mode buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
-
-File: magit.info, Node: Cherries, Prev: Reflog, Up: Logging
-
-5.3.6 Cherries
---------------
-
-Cherries are commits that haven’t been applied upstream (yet), and are
-usually visualized using a log. Each commit is prefixed with ‘-’ if it
-has an equivalent in the upstream and ‘+’ if it does not, i.e. if it is
-a cherry.
-
- The command ‘magit-cherry’ shows cherries for a single branch, but
-the references buffer (see *note References Buffer::) can show cherries
-for multiple "upstreams" at once.
-
- Also see *note (gitman)git-reflog::.
-
-‘Y’ (‘magit-cherry’)
-
- Show commits that are in a certain branch but that have not been
- merged in the upstream branch.
-
- -- User Option: magit-cherry-margin
-
- This option specifies whether the margin is initially shown in
- Magit-Cherry mode buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
-
-File: magit.info, Node: Diffing, Next: Ediffing, Prev: Logging, Up: Inspecting
-
-5.4 Diffing
-===========
-
-The status buffer contains diffs for the staged and unstaged commits,
-but that obviously isn’t enough. The transient prefix command
-‘magit-diff’, on ‘d’, features several suffix commands, which show a
-specific diff in a separate diff buffer.
-
- Like other transient prefix commands, ‘magit-diff’ also features
-several infix arguments that can be changed before invoking one of the
-suffix commands. However, in the case of the diff transient, these
-arguments may be taken from those currently in use in the current
-repository’s diff buffer, depending on the value of
-‘magit-prefix-use-buffer-arguments’ (see *note Transient Arguments and
-Buffer Variables::).
-
- Also see *note (gitman)git-diff::.
-
-‘d’ (‘magit-diff’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘d d’ (‘magit-diff-dwim’)
-
- Show changes for the thing at point.
-
-‘d r’ (‘magit-diff-range’)
-
- Show differences between two commits.
-
- RANGE should be a range (A..B or A...B) but can also be a single
- commit. If one side of the range is omitted, then it defaults to
- ‘HEAD’. If just a commit is given, then changes in the working
- tree relative to that commit are shown.
-
- If the region is active, use the revisions on the first and last
- line of the region. With a prefix argument, instead of diffing the
- revisions, choose a revision to view changes along, starting at the
- common ancestor of both revisions (i.e., use a "..." range).
-
-‘d w’ (‘magit-diff-working-tree’)
-
- Show changes between the current working tree and the ‘HEAD’
- commit. With a prefix argument show changes between the working
- tree and a commit read from the minibuffer.
-
-‘d s’ (‘magit-diff-staged’)
-
- Show changes between the index and the ‘HEAD’ commit. With a
- prefix argument show changes between the index and a commit read
- from the minibuffer.
-
-‘d u’ (‘magit-diff-unstaged’)
-
- Show changes between the working tree and the index.
-
-‘d p’ (‘magit-diff-paths’)
-
- Show changes between any two files on disk.
-
- All of the above suffix commands update the repository’s diff buffer.
-The diff transient also features two commands which show differences in
-another buffer:
-
-‘d c’ (‘magit-show-commit’)
-
- Show the commit at point. If there is no commit at point or with a
- prefix argument, prompt for a commit.
-
-‘d t’ (‘magit-stash-show’)
-
- Show all diffs of a stash in a buffer.
-
- Two additional commands that show the diff for the file or blob that
-is being visited in the current buffer exists, see *note Minor Mode for
-Buffers Visiting Files::.
-
-* Menu:
-
-* Refreshing Diffs::
-* Commands Available in Diffs::
-* Diff Options::
-* Revision Buffer::
-
-
-File: magit.info, Node: Refreshing Diffs, Next: Commands Available in Diffs, Up: Diffing
-
-5.4.1 Refreshing Diffs
-----------------------
-
-The transient prefix command ‘magit-diff-refresh’, on ‘D’, can be used
-to change the diff arguments used in the current buffer, without
-changing which diff is shown. This works in dedicated diff buffers, but
-also in the status buffer.
-
-‘D’ (‘magit-diff-refresh’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘D g’ (‘magit-diff-refresh’)
-
- This suffix command sets the local diff arguments for the current
- buffer.
-
-‘D s’ (‘magit-diff-set-default-arguments’)
-
- This suffix command sets the default diff arguments for buffers of
- the same type as that of the current buffer. Other existing
- buffers of the same type are not affected because their local
- values have already been initialized.
-
-‘D w’ (‘magit-diff-save-default-arguments’)
-
- This suffix command sets the default diff arguments for buffers of
- the same type as that of the current buffer, and saves the value
- for future sessions. Other existing buffers of the same type are
- not affected because their local values have already been
- initialized.
-
-‘D t’ (‘magit-diff-toggle-refine-hunk’)
-
- This command toggles hunk refinement on or off.
-
-‘D r’ (‘magit-diff-switch-range-type’)
-
- This command converts the diff range type from "revA..revB" to
- "revB...revA", or vice versa.
-
-‘D f’ (‘magit-diff-flip-revs’)
-
- This command swaps revisions in the diff range from "revA..revB" to
- "revB..revA", or vice versa.
-
-‘D F’ (‘magit-diff-toggle-file-filter’)
-
- This command toggles the file restriction of the diffs in the
- current buffer, allowing you to quickly switch between viewing all
- the changes in the commit and the restricted subset. As a special
- case, when this command is called from a log buffer, it toggles the
- file restriction in the repository’s revision buffer, which is
- useful when you display a revision from a log buffer that is
- restricted to a file or files.
-
- In addition to the above transient, which allows changing any of the
-supported arguments, there also exist some commands that change only a
-particular argument.
-
-‘-’ (‘magit-diff-less-context’)
-
- This command decreases the context for diff hunks by COUNT lines.
-
-‘+’ (‘magit-diff-more-context’)
-
- This command increases the context for diff hunks by COUNT lines.
-
-‘0’ (‘magit-diff-default-context’)
-
- This command resets the context for diff hunks to the default
- height.
-
- The following commands quickly change what diff is being displayed
-without having to using one of the diff transient.
-
-‘C-c C-d’ (‘magit-diff-while-committing’)
-
- While committing, this command shows the changes that are about to
- be committed. While amending, invoking the command again toggles
- between showing just the new changes or all the changes that will
- be committed.
-
- This binding is available in the diff buffer as well as the commit
- message buffer.
-
-‘C-c C-b’ (‘magit-go-backward’)
-
- This command moves backward in current buffer’s history.
-
-‘C-c C-f’ (‘magit-go-forward’)
-
- This command moves forward in current buffer’s history.
-
-
-File: magit.info, Node: Commands Available in Diffs, Next: Diff Options, Prev: Refreshing Diffs, Up: Diffing
-
-5.4.2 Commands Available in Diffs
----------------------------------
-
-Some commands are only available if point is inside a diff.
-
- ‘magit-diff-visit-file’ and related commands visit the appropriate
-version of the file that the diff at point is about. Likewise
-‘magit-diff-visit-worktree-file’ and related commands visit the worktree
-version of the file that the diff at point is about. See *note Visiting
-Files and Blobs from a Diff:: for more information and the key bindings.
-
-‘C-c C-t’ (‘magit-diff-trace-definition’)
-
- This command shows a log for the definition at point.
-
- -- User Option: magit-log-trace-definition-function
-
- The function specified by this option is used by
- ‘magit-log-trace-definition’ to determine the function at point.
- For major-modes that have special needs, you could set the local
- value using the mode’s hook.
-
-‘C-c C-e’ (‘magit-diff-edit-hunk-commit’)
-
- From a hunk, this command edits the respective commit and visits
- the file.
-
- First it visits the file being modified by the hunk at the correct
- location using ‘magit-diff-visit-file’. This actually visits a
- blob. When point is on a diff header, not within an individual
- hunk, then this visits the blob the first hunk is about.
-
- Then it invokes ‘magit-edit-line-commit’, which uses an interactive
- rebase to make the commit editable, or if that is not possible
- because the commit is not reachable from ‘HEAD’ by checking out
- that commit directly. This also causes the actual worktree file to
- be visited.
-
- Neither the blob nor the file buffer are killed when finishing the
- rebase. If that is undesirable, then it might be better to use
- ‘magit-rebase-edit-command’ instead of this command.
-
-‘j’ (‘magit-jump-to-diffstat-or-diff’)
-
- This command jumps to the diffstat or diff. When point is on a
- file inside the diffstat section, then jump to the respective diff
- section. Otherwise, jump to the diffstat section or a child
- thereof.
-
- The next two commands are not specific to Magit-Diff mode (or and
-Magit buffer for that matter), but it might be worth pointing out that
-they are available here too.
-
-‘SPC’ (‘scroll-up’)
-
- This command scrolls text upward.
-
-‘DEL’ (‘scroll-down’)
-
- This command scrolls text downward.
-
-
-File: magit.info, Node: Diff Options, Next: Revision Buffer, Prev: Commands Available in Diffs, Up: Diffing
-
-5.4.3 Diff Options
-------------------
-
- -- User Option: magit-diff-refine-hunk
-
- Whether to show word-granularity differences within diff hunks.
-
- • ‘nil’ Never show fine differences.
-
- • ‘t’ Show fine differences for the current diff hunk only.
-
- • ‘all’ Show fine differences for all displayed diff hunks.
-
- -- User Option: magit-diff-refine-ignore-whitespace
-
- Whether to ignore whitespace changes in word-granularity
- differences.
-
- -- User Option: magit-diff-adjust-tab-width
-
- Whether to adjust the width of tabs in diffs.
-
- Determining the correct width can be expensive if it requires
- opening large and/or many files, so the widths are cached in the
- variable ‘magit-diff--tab-width-cache’. Set that to nil to
- invalidate the cache.
-
- • ‘nil’ Never adjust tab width. Use ‘tab-width’s value from the
- Magit buffer itself instead.
-
- • ‘t’ If the corresponding file-visiting buffer exits, then use
- ‘tab-width’’s value from that buffer. Doing this is cheap, so
- this value is used even if a corresponding cache entry exists.
-
- • ‘always’ If there is no such buffer, then temporarily visit
- the file to determine the value.
-
- • NUMBER Like ‘always’, but don’t visit files larger than NUMBER
- bytes.
-
- -- User Option: magit-diff-paint-whitespace
-
- Specify where to highlight whitespace errors.
-
- See ‘magit-diff-highlight-trailing’,
- ‘magit-diff-highlight-indentation’. The symbol ‘t’ means in all
- diffs, ‘status’ means only in the status buffer, and nil means
- nowhere.
-
- • ‘nil’ Never highlight whitespace errors.
-
- • ‘t’ Highlight whitespace errors everywhere.
-
- • ‘uncommitted’ Only highlight whitespace errors in diffs
- showing uncommitted changes. For backward compatibility
- ‘status’ is treated as a synonym.
-
- -- User Option: magit-diff-paint-whitespace-lines
-
- Specify in what kind of lines to highlight whitespace errors.
-
- • ‘t’ Highlight only in added lines.
-
- • ‘both’ Highlight in added and removed lines.
-
- • ‘all’ Highlight in added, removed and context lines.
-
- -- User Option: magit-diff-highlight-trailing
-
- Whether to highlight whitespace at the end of a line in diffs.
- Used only when ‘magit-diff-paint-whitespace’ is non-nil.
-
- -- User Option: magit-diff-highlight-indentation
-
- This option controls whether to highlight the indentation in case
- it used the "wrong" indentation style. Indentation is only
- highlighted if ‘magit-diff-paint-whitespace’ is also non-nil.
-
- The value is an alist of the form ‘((REGEXP . INDENT)...)’. The
- path to the current repository is matched against each element in
- reverse order. Therefore if a REGEXP matches, then earlier
- elements are not tried.
-
- If the used INDENT is ‘tabs’, highlight indentation with tabs. If
- INDENT is an integer, highlight indentation with at least that many
- spaces. Otherwise, highlight neither.
-
- -- User Option: magit-diff-hide-trailing-cr-characters
-
- Whether to hide ^M characters at the end of a line in diffs.
-
- -- User Option: magit-diff-highlight-hunk-region-functions
-
- This option specifies the functions used to highlight the
- hunk-internal region.
-
- ‘magit-diff-highlight-hunk-region-dim-outside’ overlays the outside
- of the hunk internal selection with a face that causes the added
- and removed lines to have the same background color as context
- lines. This function should not be removed from the value of this
- option.
-
- ‘magit-diff-highlight-hunk-region-using-overlays’ and
- ‘magit-diff-highlight-hunk-region-using-underline’ emphasize the
- region by placing delimiting horizontal lines before and after it.
- Both of these functions have glitches which cannot be fixed due to
- limitations of Emacs’ display engine. For more information see
- <https://github.com/magit/magit/issues/2758> ff.
-
- Instead of, or in addition to, using delimiting horizontal lines,
- to emphasize the boundaries, you may which to emphasize the text
- itself, using ‘magit-diff-highlight-hunk-region-using-face’.
-
- In terminal frames it’s not possible to draw lines as the overlay
- and underline variants normally do, so there they fall back to
- calling the face function instead.
-
- -- User Option: magit-diff-unmarked-lines-keep-foreground
-
- This option controls whether added and removed lines outside the
- hunk-internal region only lose their distinct background color or
- also the foreground color. Whether the outside of the region is
- dimmed at all depends on
- ‘magit-diff-highlight-hunk-region-functions’.
-
-
-File: magit.info, Node: Revision Buffer, Prev: Diff Options, Up: Diffing
-
-5.4.4 Revision Buffer
----------------------
-
- -- User Option: magit-revision-insert-related-refs
-
- Whether to show related branches in revision buffers.
-
- • ‘nil’ Don’t show any related branches.
-
- • ‘t’ Show related local branches.
-
- • ‘all’ Show related local and remote branches.
-
- • ‘mixed’ Show all containing branches and local merged
- branches.
-
- -- User Option: magit-revision-show-gravatars
-
- Whether to show gravatar images in revision buffers.
-
- If ‘nil’, then don’t insert any gravatar images. If ‘t’, then
- insert both images. If ‘author’ or ‘committer’, then insert only
- the respective image.
-
- If you have customized the option ‘magit-revision-headers-format’
- and want to insert the images then you might also have to specify
- where to do so. In that case the value has to be a cons-cell of
- two regular expressions. The car specifies where to insert the
- author’s image. The top half of the image is inserted right after
- the matched text, the bottom half on the next line in the same
- column. The cdr specifies where to insert the committer’s image,
- accordingly. Either the car or the cdr may be nil."
-
- -- User Option: magit-revision-use-hash-sections
-
- Whether to turn hashes inside the commit message into sections.
-
- If non-nil, then hashes inside the commit message are turned into
- ‘commit’ sections. There is a trade off to be made between
- performance and reliability:
-
- • ‘slow’ calls git for every word to be absolutely sure.
-
- • ‘quick’ skips words less than seven characters long.
-
- • ‘quicker’ additionally skips words that don’t contain a
- number.
-
- • ‘quickest’ uses all words that are at least seven characters
- long and which contain at least one number as well as at least
- one letter.
-
- If nil, then no hashes are turned into sections, but you can still
- visit the commit at point using "RET".
-
- The diffs shown in the revision buffer may be automatically
-restricted to a subset of the changed files. If the revision buffer is
-displayed from a log buffer, the revision buffer will share the same
-file restriction as that log buffer (also see the command
-‘magit-diff-toggle-file-filter’).
-
- -- User Option: magit-revision-filter-files-on-follow
-
- Whether showing a commit from a log buffer honors the log’s file
- filter when the log arguments include ‘--follow’.
-
- When this option is nil, displaying a commit from a log ignores the
- log’s file filter if the log arguments include ‘--follow’. Doing
- so avoids showing an empty diff in revision buffers for commits
- before a rename event. In such cases, the ‘--patch’ argument of
- the log transient can be used to show the file-restricted diffs
- inline.
-
- Set this option to non-nil to keep the log’s file restriction even
- if ‘--follow’ is present in the log arguments.
-
- If the revision buffer is not displayed from a log buffer, the file
-restriction is determined as usual (see *note Transient Arguments and
-Buffer Variables::).
-
-
-File: magit.info, Node: Ediffing, Next: References Buffer, Prev: Diffing, Up: Inspecting
-
-5.5 Ediffing
-============
-
-This section describes how to enter Ediff from Magit buffers. For
-information on how to use Ediff itself, see *note (ediff)Top::.
-
-‘e’ (‘magit-ediff-dwim’)
-
- Compare, stage, or resolve using Ediff.
-
- This command tries to guess what file, and what commit or range the
- user wants to compare, stage, or resolve using Ediff. It might
- only be able to guess either the file, or range/commit, in which
- case the user is asked about the other. It might not always guess
- right, in which case the appropriate ‘magit-ediff-*’ command has to
- be used explicitly. If it cannot read the user’s mind at all, then
- it asks the user for a command to run.
-
-‘E’ (‘magit-ediff’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
-‘E r’ (‘magit-ediff-compare’)
-
- Compare two revisions of a file using Ediff.
-
- If the region is active, use the revisions on the first and last
- line of the region. With a prefix argument, instead of diffing the
- revisions, choose a revision to view changes along, starting at the
- common ancestor of both revisions (i.e., use a "..." range).
-
-‘E m’ (‘magit-ediff-resolve’)
-
- Resolve outstanding conflicts in a file using Ediff, defaulting to
- the file at point.
-
- Provided that the value of ‘merge.conflictstyle’ is ‘diff3’, you
- can view the file’s merge-base revision using ‘/’ in the Ediff
- control buffer.
-
- In the rare event that you want to manually resolve all conflicts,
- including those already resolved by Git, use
- ‘ediff-merge-revisions-with-ancestor’.
-
-‘E s’ (‘magit-ediff-stage’)
-
- Stage and unstage changes to a file using Ediff, defaulting to the
- file at point.
-
-‘E u’ (‘magit-ediff-show-unstaged’)
-
- Show unstaged changes to a file using Ediff.
-
-‘E i’ (‘magit-ediff-show-staged’)
-
- Show staged changes to a file using Ediff.
-
-‘E w’ (‘magit-ediff-show-working-tree’)
-
- Show changes in a file between ‘HEAD’ and working tree using Ediff.
-
-‘E c’ (‘magit-ediff-show-commit’)
-
- Show changes to a file introduced by a commit using Ediff.
-
-‘E z’ (‘magit-ediff-show-stash’)
-
- Show changes to a file introduced by a stash using Ediff.
-
- -- User Option: magit-ediff-dwim-show-on-hunks
-
- This option controls what command ‘magit-ediff-dwim’ calls when
- point is on uncommitted hunks. When nil, always run
- ‘magit-ediff-stage’. Otherwise, use ‘magit-ediff-show-staged’ and
- ‘magit-ediff-show-unstaged’ to show staged and unstaged changes,
- respectively.
-
- -- User Option: magit-ediff-show-stash-with-index
-
- This option controls whether ‘magit-ediff-show-stash’ includes a
- buffer containing the file’s state in the index at the time the
- stash was created. This makes it possible to tell which changes in
- the stash were staged.
-
- -- User Option: magit-ediff-quit-hook
-
- This hook is run after quitting an Ediff session that was created
- using a Magit command. The hook functions are run inside the Ediff
- control buffer, and should not change the current buffer.
-
- This is similar to ‘ediff-quit-hook’ but takes the needs of Magit
- into account. The regular ‘ediff-quit-hook’ is ignored by Ediff
- sessions that were created using a Magit command.
-
-
-File: magit.info, Node: References Buffer, Next: Bisecting, Prev: Ediffing, Up: Inspecting
-
-5.6 References Buffer
-=====================
-
-‘y’ (‘magit-show-refs’)
-
- This command lists branches and tags in a dedicated buffer.
-
- However if this command is invoked again from this buffer or if it
- is invoked with a prefix argument, then it acts as a transient
- prefix command, which binds the following suffix commands and some
- infix arguments.
-
- All of the following suffix commands list exactly the same branches
-and tags. The only difference the optional feature that can be enabled
-by changing the value of ‘magit-refs-show-commit-count’ (see below).
-These commands specify a different branch or commit against which all
-the other references are compared.
-
-‘y y’ (‘magit-show-refs-head’)
-
- This command lists branches and tags in a dedicated buffer. Each
- reference is being compared with ‘HEAD’.
-
-‘y c’ (‘magit-show-refs-current’)
-
- This command lists branches and tags in a dedicated buffer. Each
- reference is being compared with the current branch or ‘HEAD’ if it
- is detached.
-
-‘y o’ (‘magit-show-refs-other’)
-
- This command lists branches and tags in a dedicated buffer. Each
- reference is being compared with a branch read from the user.
-
- -- User Option: magit-refs-show-commit-count
-
- Whether to show commit counts in Magit-Refs mode buffers.
-
- • ‘all’ Show counts for branches and tags.
-
- • ‘branch’ Show counts for branches only.
-
- • ‘nil’ Never show counts.
-
- The default is ‘nil’ because anything else can be very expensive.
-
- -- User Option: magit-refs-pad-commit-counts
-
- Whether to pad all commit counts on all sides in Magit-Refs mode
- buffers.
-
- If this is nil, then some commit counts are displayed right next to
- one of the branches that appear next to the count, without any
- space in between. This might look bad if the branch name faces
- look too similar to ‘magit-dimmed’.
-
- If this is non-nil, then spaces are placed on both sides of all
- commit counts.
-
- -- User Option: magit-refs-show-remote-prefix
-
- Whether to show the remote prefix in lists of remote branches.
-
- Showing the prefix is redundant because the name of the remote is
- already shown in the heading preceding the list of its branches.
-
- -- User Option: magit-refs-primary-column-width
-
- Width of the primary column in ‘magit-refs-mode’ buffers. The
- primary column is the column that contains the name of the branch
- that the current row is about.
-
- If this is an integer, then the column is that many columns wide.
- Otherwise it has to be a cons-cell of two integers. The first
- specifies the minimal width, the second the maximal width. In that
- case the actual width is determined using the length of the names
- of the shown local branches. (Remote branches and tags are not
- taken into account when calculating to optimal width.)
-
- -- User Option: magit-refs-focus-column-width
-
- Width of the focus column in ‘magit-refs-mode’ buffers.
-
- The focus column is the first column, which marks one branch
- (usually the current branch) as the focused branch using ‘*’ or
- ‘@’. For each other reference, this column optionally shows how
- many commits it is ahead of the focused branch and ‘<’, or if it
- isn’t ahead then the commits it is behind and ‘>’, or if it isn’t
- behind either, then a ‘=’.
-
- This column may also display only ‘*’ or ‘@’ for the focused
- branch, in which case this option is ignored. Use ‘L v’ to change
- the verbosity of this column.
-
- -- User Option: magit-refs-margin
-
- This option specifies whether the margin is initially shown in
- Magit-Refs mode buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
- -- User Option: magit-refs-margin-for-tags
-
- This option specifies whether to show information about tags in the
- margin. This is disabled by default because it is slow if there
- are many tags.
-
- The following variables control how individual refs are displayed.
-If you change one of these variables (especially the "%c" part), then
-you should also change the others to keep things aligned. The following
-%-sequences are supported:
-
- • ‘%a’ Number of commits this ref has over the one we compare to.
-
- • ‘%b’ Number of commits the ref we compare to has over this one.
-
- • ‘%c’ Number of commits this ref has over the one we compare to.
- For the ref which all other refs are compared this is instead "@",
- if it is the current branch, or "#" otherwise.
-
- • ‘%C’ For the ref which all other refs are compared this is "@", if
- it is the current branch, or "#" otherwise. For all other refs "
- ".
-
- • ‘%h’ Hash of this ref’s tip.
-
- • ‘%m’ Commit summary of the tip of this ref.
-
- • ‘%n’ Name of this ref.
-
- • ‘%u’ Upstream of this local branch.
-
- • ‘%U’ Upstream of this local branch and additional local vs.
- upstream information.
-
- -- User Option: magit-refs-filter-alist
-
- The purpose of this option is to forgo displaying certain refs
- based on their name. If you want to not display any refs of a
- certain type, then you should remove the appropriate function from
- ‘magit-refs-sections-hook’ instead.
-
- This alist controls which tags and branches are omitted from being
- displayed in ‘magit-refs-mode’ buffers. If it is ‘nil’, then all
- refs are displayed (subject to ‘magit-refs-sections-hook’).
-
- All keys are tried in order until one matches. Then its value is
- used and subsequent elements are ignored. If the value is non-nil,
- then the reference is displayed, otherwise it is not. If no
- element matches, then the reference is displayed.
-
- A key can either be a regular expression that the refname has to
- match, or a function that takes the refname as only argument and
- returns a boolean. A remote branch such as "origin/master" is
- displayed as just "master", however for this comparison the former
- is used.
-
-‘RET’ (‘magit-visit-ref’)
-
- This command visits the reference or revision at point in another
- buffer. If there is no revision at point or with a prefix argument
- then it prompts for a revision.
-
- This command behaves just like ‘magit-show-commit’ as described
- above, except if point is on a reference in a ‘magit-refs-mode’
- buffer, in which case the behavior may be different, but only if
- you have customized the option ‘magit-visit-ref-behavior’.
-
- -- User Option: magit-visit-ref-behavior
-
- This option controls how ‘magit-visit-ref’ behaves in
- ‘magit-refs-mode’ buffers.
-
- By default ‘magit-visit-ref’ behaves like ‘magit-show-commit’, in
- all buffers, including ‘magit-refs-mode’ buffers. When the type of
- the section at point is ‘commit’ then "RET" is bound to
- ‘magit-show-commit’, and when the type is either ‘branch’ or ‘tag’
- then it is bound to ‘magit-visit-ref’.
-
- "RET" is one of Magit’s most essential keys and at least by default
- it should behave consistently across all of Magit, especially
- because users quickly learn that it does something very harmless;
- it shows more information about the thing at point in another
- buffer.
-
- However "RET" used to behave differently in ‘magit-refs-mode’
- buffers, doing surprising things, some of which cannot really be
- described as "visit this thing". If you’ve grown accustomed this
- behavior, you can restore it by adding one or more of the below
- symbols to the value of this option. But keep in mind that by
- doing so you don’t only introduce inconsistencies, you also lose
- some functionality and might have to resort to ‘M-x
- magit-show-commit’ to get it back.
-
- ‘magit-visit-ref’ looks for these symbols in the order in which
- they are described here. If the presence of a symbol applies to
- the current situation, then the symbols that follow do not affect
- the outcome.
-
- • ‘focus-on-ref’
-
- With a prefix argument update the buffer to show commit counts
- and lists of cherry commits relative to the reference at point
- instead of relative to the current buffer or ‘HEAD’.
-
- Instead of adding this symbol, consider pressing "C-u y o
- RET".
-
- • ‘create-branch’
-
- If point is on a remote branch, then create a new local branch
- with the same name, use the remote branch as its upstream, and
- then check out the local branch.
-
- Instead of adding this symbol, consider pressing "b c RET
- RET", like you would do in other buffers.
-
- • ‘checkout-any’
-
- Check out the reference at point. If that reference is a tag
- or a remote branch, then this results in a detached ‘HEAD’.
-
- Instead of adding this symbol, consider pressing "b b RET",
- like you would do in other buffers.
-
- • ‘checkout-branch’
-
- Check out the local branch at point.
-
- Instead of adding this symbol, consider pressing "b b RET",
- like you would do in other buffers.
-
-* Menu:
-
-* References Sections::
-
-
-File: magit.info, Node: References Sections, Up: References Buffer
-
-5.6.1 References Sections
--------------------------
-
-The contents of references buffers is controlled using the hook
-‘magit-refs-sections-hook’. See *note Section Hooks:: to learn about
-such hooks and how to customize them. All of the below functions are
-members of the default value. Note that it makes much less sense to
-customize this hook than it does for the respective hook used for the
-status buffer.
-
- -- User Option: magit-refs-sections-hook
-
- Hook run to insert sections into a references buffer.
-
- -- Function: magit-insert-local-branches
-
- Insert sections showing all local branches.
-
- -- Function: magit-insert-remote-branches
-
- Insert sections showing all remote-tracking branches.
-
- -- Function: magit-insert-tags
-
- Insert sections showing all tags.
-
-
-File: magit.info, Node: Bisecting, Next: Visiting Files and Blobs, Prev: References Buffer, Up: Inspecting
-
-5.7 Bisecting
-=============
-
-Also see *note (gitman)git-bisect::.
-
-‘B’ (‘magit-bisect’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
- When bisecting is not in progress, then the transient features the
-following suffix commands.
-
-‘B B’ (‘magit-bisect-start’)
-
- Start a bisect session.
-
- Bisecting a bug means to find the commit that introduced it. This
- command starts such a bisect session by asking for a known good and
- a bad commit.
-
-‘B s’ (‘magit-bisect-run’)
-
- Bisect automatically by running commands after each step.
-
- When bisecting in progress, then the transient instead features the
-following suffix commands.
-
-‘B b’ (‘magit-bisect-bad’)
-
- Mark the current commit as bad. Use this after you have asserted
- that the commit does contain the bug in question.
-
-‘B g’ (‘magit-bisect-good’)
-
- Mark the current commit as good. Use this after you have asserted
- that the commit does not contain the bug in question.
-
-‘B k’ (‘magit-bisect-skip’)
-
- Skip the current commit. Use this if for some reason the current
- commit is not a good one to test. This command lets Git choose a
- different one.
-
-‘B r’ (‘magit-bisect-reset’)
-
- After bisecting, cleanup bisection state and return to original
- ‘HEAD’.
-
- By default the status buffer shows information about the ongoing
-bisect session.
-
- -- User Option: magit-bisect-show-graph
-
- This option controls whether a graph is displayed for the log of
- commits that still have to be bisected.
-
-
-File: magit.info, Node: Visiting Files and Blobs, Next: Blaming, Prev: Bisecting, Up: Inspecting
-
-5.8 Visiting Files and Blobs
-============================
-
-Magit provides several commands that visit a file or blob (the version
-of a file that is stored in a certain commit). Actually it provides
-several *groups* of such commands and the several *variants* within each
-group.
-
-* Menu:
-
-* General-Purpose Visit Commands::
-* Visiting Files and Blobs from a Diff::
-
-
-File: magit.info, Node: General-Purpose Visit Commands, Next: Visiting Files and Blobs from a Diff, Up: Visiting Files and Blobs
-
-5.8.1 General-Purpose Visit Commands
-------------------------------------
-
-These commands can be used anywhere to open any blob. Currently no keys
-are bound to these commands by default, but that is likely to change.
-
- -- Command: magit-find-file
-
- This command reads a filename and revision from the user and visits
- the respective blob in a buffer. The buffer is displayed in the
- selected window.
-
- -- Command: magit-find-file-other-window
-
- This command reads a filename and revision from the user and visits
- the respective blob in a buffer. The buffer is displayed in
- another window.
-
- -- Command: magit-find-file-other-frame
-
- This command reads a filename and revision from the user and visits
- the respective blob in a buffer. The buffer is displayed in
- another frame.
-
-
-File: magit.info, Node: Visiting Files and Blobs from a Diff, Prev: General-Purpose Visit Commands, Up: Visiting Files and Blobs
-
-5.8.2 Visiting Files and Blobs from a Diff
-------------------------------------------
-
-These commands can only be used when point is inside a diff.
-
-‘RET’ (‘magit-diff-visit-file’)
-
- This command visits the appropriate version of the file that the
- diff at point is about.
-
- This commands visits the worktree version of the appropriate file.
- The location of point inside the diff determines which file is
- being visited. The visited version depends on what changes the
- diff is about.
-
- • If the diff shows uncommitted changes (i.e. staged or
- unstaged changes), then visit the file in the working tree
- (i.e. the same "real" file that ‘find-file’ would visit. In
- all other cases visit a "blob" (i.e. the version of a file as
- stored in some commit).
-
- • If point is on a removed line, then visit the blob for the
- first parent of the commit that removed that line, i.e. the
- last commit where that line still exists.
-
- • If point is on an added or context line, then visit the blob
- that adds that line, or if the diff shows from more than a
- single commit, then visit the blob from the last of these
- commits.
-
- In the file-visiting buffer this command goes to the line that
- corresponds to the line that point is on in the diff.
-
- The buffer is displayed in the selected window. With a prefix
- argument the buffer is displayed in another window instead.
-
- -- User Option: magit-diff-visit-previous-blob
-
- This option controls whether ‘magit-diff-visit-file’ may visit the
- previous blob. When this is ‘t’ (the default) and point is on a
- removed line in a diff for a committed change, then
- ‘magit-diff-visit-file’ visits the blob from the last revision
- which still had that line.
-
- Currently this is only supported for committed changes, for staged
- and unstaged changes ‘magit-diff-visit-file’ always visits the file
- in the working tree.
-
-‘C-<return>’ (‘magit-diff-visit-file-worktree’)
-
- This command visits the worktree version of the appropriate file.
- The location of point inside the diff determines which file is
- being visited. Unlike ‘magit-diff-visit-file’ it always visits the
- "real" file in the working tree, i.e the "current version" of the
- file.
-
- In the file-visiting buffer this command goes to the line that
- corresponds to the line that point is on in the diff. Lines that
- were added or removed in the working tree, the index and other
- commits in between are automatically accounted for.
-
- The buffer is displayed in the selected window. With a prefix
- argument the buffer is displayed in another window instead.
-
- Variants of the above two commands exist that instead visit the file
-in another window or in another frame. If you prefer such behavior,
-then you may want to change the above key bindings, but note that the
-above commands also use another window when invoked with a prefix
-argument.
-
- -- Command: magit-diff-visit-file-other-window
- -- Command: magit-diff-visit-file-other-frame
- -- Command: magit-diff-visit-worktree-file-other-window
- -- Command: magit-diff-visit-worktree-file-other-frame
-
-
-File: magit.info, Node: Blaming, Prev: Visiting Files and Blobs, Up: Inspecting
-
-5.9 Blaming
-===========
-
-Also see *note (gitman)git-blame::.
-
- To start blaming invoke the ‘magit-file-dispatch’ transient prefix
-command by pressing ‘C-c M-g’. (This is only the default binding and
-the recommended binding is ‘C-c g’. Also neither binding may be
-available if you disabled ‘global-magit-file-mode’. Also see *note
-Minor Mode for Buffers Visiting Files::.)
-
- The blaming suffix commands can be invoked from the dispatch
-transient. However if you want to set an infix argument, then you have
-to enter the blaming sub-transient first.
-
- The key bindings shown below assume that you enter the dispatch
-transient using the default binding.
-
-‘C-c M-g B’ (‘magit-blame’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- Note that not all of the following suffixes are available at all
-times. For example if ‘magit-blame-mode’ is not enabled, then the
-command whose purpose is to turn off that mode would not be of any use
-and therefore isn’t available.
-
-‘C-c M-g b’ (‘magit-blame-addition’)
-‘C-c M-g B b’ (‘magit-blame-addition’)
-
- This command augments each line or chunk of lines in the current
- file-visiting or blob-visiting buffer with information about what
- commits last touched these lines.
-
- If the buffer visits a revision of that file, then history up to
- that revision is considered. Otherwise, the file’s full history is
- considered, including uncommitted changes.
-
- If Magit-Blame mode is already turned on in the current buffer then
- blaming is done recursively, by visiting REVISION:FILE (using
- ‘magit-find-file’), where REVISION is a parent of the revision that
- added the current line or chunk of lines.
-
-‘C-c M-g r’ (‘magit-blame-removal’)
-‘C-c M-g B r’ (‘magit-blame-removal’)
-
- This command augments each line or chunk of lines in the current
- blob-visiting buffer with information about the revision that
- removes it. It cannot be used in file-visiting buffers.
-
- Like ‘magit-blame-addition’, this command can be used recursively.
-
-‘C-c M-g f’ (‘magit-blame-reverse’)
-‘C-c M-g B f’ (‘magit-blame-reverse’)
-
- This command augments each line or chunk of lines in the current
- file-visiting or blob-visiting buffer with information about the
- last revision in which a line still existed.
-
- Like ‘magit-blame-addition’, this command can be used recursively.
-
-‘C-c M-g e’ (‘magit-blame-echo’)
-‘C-c M-g B e’ (‘magit-blame-echo’)
-
- This command is like ‘magit-blame-addition’ except that it doesn’t
- turn on ‘read-only-mode’ and that it initially uses the
- visualization style specified by option ‘magit-blame-echo-style’.
-
- The following key bindings are available when Magit-Blame mode is
-enabled and Read-Only mode is not enabled. These commands are also
-available in other buffers; here only the behavior is described that is
-relevant in file-visiting buffers that are being blamed.
-
-‘RET’ (‘magit-show-commit’)
-
- This command shows the commit that last touched the line at point.
-
-‘SPC’ (‘magit-diff-show-or-scroll-up’)
-
- This command updates the commit buffer.
-
- This either shows the commit that last touched the line at point in
- the appropriate buffer, or if that buffer is already being
- displayed in the current frame and if that buffer contains
- information about that commit, then the buffer is scrolled up
- instead.
-
-‘DEL’ (‘magit-diff-show-or-scroll-down’)
-
- This command updates the commit buffer.
-
- This either shows the commit that last touched the line at point in
- the appropriate buffer, or if that buffer is already being
- displayed in the current frame and if that buffer contains
- information about that commit, then the buffer is scrolled down
- instead.
-
- The following key bindings are available when both Magit-Blame mode
-and Read-Only mode are enabled.
-
-‘b’ (‘magit-blame’)
-
- See above.
-
-‘n’ (‘magit-blame-next-chunk’)
-
- This command moves to the next chunk.
-
-‘N’ (‘magit-blame-next-chunk-same-commit’)
-
- This command moves to the next chunk from the same commit.
-
-‘p’ (‘magit-blame-previous-chunk’)
-
- This command moves to the previous chunk.
-
-‘P’ (‘magit-blame-previous-chunk-same-commit’)
-
- This command moves to the previous chunk from the same commit.
-
-‘q’ (‘magit-blame-quit’)
-
- This command turns off Magit-Blame mode. If the buffer was created
- during a recursive blame, then it also kills the buffer.
-
-‘M-w’ (‘magit-blame-copy-hash’)
-
- This command saves the hash of the current chunk’s commit to the
- kill ring.
-
- When the region is active, the command saves the region’s content
- instead of the hash, like ‘kill-ring-save’ would.
-
-‘c’ (‘magit-blame-cycle-style’)
-
- This command changes how blame information is visualized in the
- current buffer by cycling through the styles specified using the
- option ‘magit-blame-styles’.
-
- Blaming is also controlled using the following options.
-
- -- User Option: magit-blame-styles
-
- This option defines a list of styles used to visualize blame
- information. For now see its doc-string to learn more.
-
- -- User Option: magit-blame-echo-style
-
- This option specifies the blame visualization style used by the
- command ‘magit-blame-echo’. This must be a symbol that is used as
- the identifier for one of the styles defined in
- ‘magit-blame-styles’.
-
- -- User Option: magit-blame-time-format
-
- This option specifies the format string used to display times when
- showing blame information.
-
- -- User Option: magit-blame-read-only
-
- This option controls whether blaming a buffer also makes
- temporarily read-only.
-
- -- User Option: magit-blame-disable-modes
-
- This option lists incompatible minor-modes that should be disabled
- temporarily when a buffer contains blame information. They are
- enabled again when the buffer no longer shows blame information.
-
- -- User Option: magit-blame-goto-chunk-hook
-
- This hook is run when moving between chunks.
-
-
-File: magit.info, Node: Manipulating, Next: Transferring, Prev: Inspecting, Up: Top
-
-6 Manipulating
-**************
-
-* Menu:
-
-* Creating Repository::
-* Cloning Repository::
-* Staging and Unstaging::
-* Applying::
-* Committing::
-* Branching::
-* Merging::
-* Resolving Conflicts::
-* Rebasing::
-* Cherry Picking::
-* Resetting::
-* Stashing::
-
-
-File: magit.info, Node: Creating Repository, Next: Cloning Repository, Up: Manipulating
-
-6.1 Creating Repository
-=======================
-
-‘M-x magit-init’ (‘magit-init’)
-
- This command initializes a repository and then shows the status
- buffer for the new repository.
-
- If the directory is below an existing repository, then the user has
- to confirm that a new one should be created inside. If the
- directory is the root of the existing repository, then the user has
- to confirm that it should be reinitialized.
-
-
-File: magit.info, Node: Cloning Repository, Next: Staging and Unstaging, Prev: Creating Repository, Up: Manipulating
-
-6.2 Cloning Repository
-======================
-
-To clone a remote or local repository use ‘C’, which is bound to the
-command ‘magit-clone’. This command either act as a transient prefix
-command, which binds several infix arguments and suffix commands, or it
-can invoke ‘git clone’ directly, depending on whether a prefix argument
-is used and on the value of ‘magit-clone-always-transient’.
-
- -- User Option: magit-clone-always-transient
-
- This option controls whether the command ‘magit-clone’ always acts
- as a transient prefix command, regardless of whether a prefix
- argument is used or not. If ‘t’, then that command always acts as
- a transient prefix. If ‘nil’, then a prefix argument has to be
- used for it to act as a transient.
-
-‘C’ (‘magit-clone’)
-
- This command either acts as a transient prefix command as described
- above or does the same thing as ‘transient-clone-regular’ as
- described below.
-
- If it acts as a transient prefix, then it binds the following
- suffix commands and several infix arguments.
-
-‘C C’ (‘magit-clone-regular’)
-
- This command creates a regular clone of an existing repository.
- The repository and the target directory are read from the user.
-
-‘C s’ (‘magit-clone-shallow’)
-
- This command creates a shallow clone of an existing repository.
- The repository and the target directory are read from the user. By
- default the depth of the cloned history is a single commit, but
- with a prefix argument the depth is read from the user.
-
-‘C b’ (‘magit-clone-bare’)
-
- This command creates a bare clone of an existing repository. The
- repository and the target directory are read from the user.
-
-‘C m’ (‘magit-clone-mirror’)
-
- This command creates a mirror of an existing repository. The
- repository and the target directory are read from the user.
-
- The following suffixes are disabled by default. See *note
-(transient)Enabling and Disabling Suffixes:: for how to enable them.
-
-‘C d’ (‘magit-clone-shallow-since’)
-
- This command creates a shallow clone of an existing repository.
- Only commits that were committed after a date are cloned, which is
- read from the user. The repository and the target directory are
- also read from the user.
-
-‘C e’ (‘magit-clone-shallow-exclude’)
-
- This command creates a shallow clone of an existing repository.
- This reads a branch or tag from the user. Commits that are
- reachable from that are not cloned. The repository and the target
- directory are also read from the user.
-
- -- User Option: magit-clone-set-remote-head
-
- This option controls whether cloning causes the reference
- ‘refs/remotes/<remote>/HEAD’ to be created in the clone. The
- default is to delete the reference after running ‘git clone’, which
- insists on creating it. This is because the reference has not been
- found to be particularly useful as it is not automatically updated
- when the ‘HEAD’ of the remote changes. Setting this option to ‘t’
- preserves Git’s default behavior of creating the reference.
-
- -- User Option: magit-clone-set-remote.pushDefault
-
- This option controls whether the value of the Git variable
- ‘remote.pushDefault’ is set after cloning.
-
- • If ‘t’, then it is always set without asking.
-
- • If ‘ask’, then the users are asked every time they clone a
- repository.
-
- • If ‘nil’, then it is never set.
-
- -- User Option: magit-clone-default-directory
-
- This option control the default directory name used when reading
- the destination for a cloning operation.
-
- • If ‘nil’ (the default), then the value of ‘default-directory’
- is used.
-
- • If a directory, then that is used.
-
- • If a function, then that is called with the remote url as the
- only argument and the returned value is used.
-
- -- User Option: magit-clone-name-alist
-
- This option maps regular expressions, which match repository names,
- to repository urls, making it possible for users to enter short
- names instead of urls when cloning repositories.
-
- Each element has the form ‘(REGEXP HOSTNAME USER)’. When the user
- enters a name when a cloning command asks for a name or url, then
- that is looked up in this list. The first element whose REGEXP
- matches is used.
-
- The format specified by option ‘magit-clone-url-format’ is used to
- turn the name into an url, using HOSTNAME and the repository name.
- If the provided name contains a slash, then that is used.
- Otherwise if the name omits the owner of the repository, then the
- default user specified in the matched entry is used.
-
- If USER contains a dot, then it is treated as a Git variable and
- the value of that is used as the username. Otherwise it is used as
- the username itself.
-
- -- User Option: magit-clone-url-format
-
- The format specified by this option is used when turning repository
- names into urls. ‘%h’ is the hostname and ‘%n’ is the repository
- name, including the name of the owner.
-
-
-File: magit.info, Node: Staging and Unstaging, Next: Applying, Prev: Cloning Repository, Up: Manipulating
-
-6.3 Staging and Unstaging
-=========================
-
-Like Git, Magit can of course stage and unstage complete files. Unlike
-Git, it also allows users to gracefully un-/stage individual hunks and
-even just part of a hunk. To stage individual hunks and parts of hunks
-using Git directly, one has to use the very modal and rather clumsy
-interface of a ‘git add --interactive’ session.
-
- With Magit, on the other hand, one can un-/stage individual hunks by
-just moving point into the respective section inside a diff displayed in
-the status buffer or a separate diff buffer and typing ‘s’ or ‘u’. To
-operate on just parts of a hunk, mark the changes that should be
-un-/staged using the region and then press the same key that would be
-used to un-/stage. To stage multiple files or hunks at once use a
-region that starts inside the heading of such a section and ends inside
-the heading of a sibling section of the same type.
-
- Besides staging and unstaging, Magit also provides several other
-"apply variants" that can also operate on a file, multiple files at
-once, a hunk, multiple hunks at once, and on parts of a hunk. These
-apply variants are described in the next section.
-
- You can also use Ediff to stage and unstage. See *note Ediffing::.
-
-‘s’ (‘magit-stage’)
-
- Add the change at point to the staging area.
-
- With a prefix argument and an untracked file (or files) at point,
- stage the file but not its content. This makes it possible to
- stage only a subset of the new file’s changes.
-
-‘S’ (‘magit-stage-modified’)
-
- Stage all changes to files modified in the worktree. Stage all new
- content of tracked files and remove tracked files that no longer
- exist in the working tree from the index also. With a prefix
- argument also stage previously untracked (but not ignored) files.
-
-‘u’ (‘magit-unstage’)
-
- Remove the change at point from the staging area.
-
- Only staged changes can be unstaged. But by default this command
- performs an action that is somewhat similar to unstaging, when it
- is called on a committed change: it reverses the change in the
- index but not in the working tree.
-
-‘U’ (‘magit-unstage-all’)
-
- Remove all changes from the staging area.
-
- -- User Option: magit-unstage-committed
-
- This option controls whether ‘magit-unstage’ "unstages" committed
- changes by reversing them in the index but not the working tree.
- The alternative is to raise an error.
-
-‘M-x magit-reverse-in-index’ (‘magit-reverse-in-index’)
-
- This command reverses the committed change at point in the index
- but not the working tree. By default no key is bound directly to
- this command, but it is indirectly called when ‘u’
- (‘magit-unstage’) is pressed on a committed change.
-
- This allows extracting a change from ‘HEAD’, while leaving it in
- the working tree, so that it can later be committed using a
- separate commit. A typical workflow would be:
-
- • Optionally make sure that there are no uncommitted changes.
-
- • Visit the ‘HEAD’ commit and navigate to the change that should
- not have been included in that commit.
-
- • Type ‘u’ (‘magit-unstage’) to reverse it in the index. This
- assumes that ‘magit-unstage-committed-changes’ is non-nil.
-
- • Type ‘c e’ to extend ‘HEAD’ with the staged changes, including
- those that were already staged before.
-
- • Optionally stage the remaining changes using ‘s’ or ‘S’ and
- then type ‘c c’ to create a new commit.
-
-‘M-x magit-reset-index’ (‘magit-reset-index’)
-
- Reset the index to some commit. The commit is read from the user
- and defaults to the commit at point. If there is no commit at
- point, then it defaults to ‘HEAD’.
-
-* Menu:
-
-* Staging from File-Visiting Buffers::
-
-
-File: magit.info, Node: Staging from File-Visiting Buffers, Up: Staging and Unstaging
-
-6.3.1 Staging from File-Visiting Buffers
-----------------------------------------
-
-Fine-grained un-/staging has to be done from the status or a diff
-buffer, but it’s also possible to un-/stage all changes made to the file
-visited in the current buffer right from inside that buffer.
-
-‘M-x magit-stage-file’ (‘magit-stage-file’)
-
- When invoked inside a file-visiting buffer, then stage all changes
- to that file. In a Magit buffer, stage the file at point if any.
- Otherwise prompt for a file to be staged. With a prefix argument
- always prompt the user for a file, even in a file-visiting buffer
- or when there is a file section at point.
-
-‘M-x magit-unstage-file’ (‘magit-unstage-file’)
-
- When invoked inside a file-visiting buffer, then unstage all
- changes to that file. In a Magit buffer, unstage the file at point
- if any. Otherwise prompt for a file to be unstaged. With a prefix
- argument always prompt the user for a file, even in a file-visiting
- buffer or when there is a file section at point.
-
-
-File: magit.info, Node: Applying, Next: Committing, Prev: Staging and Unstaging, Up: Manipulating
-
-6.4 Applying
-============
-
-Magit provides several "apply variants": stage, unstage, discard,
-reverse, and "regular apply". At least when operating on a hunk they
-are all implemented using ‘git apply’, which is why they are called
-"apply variants".
-
- • Stage. Apply a change from the working tree to the index. The
- change also remains in the working tree.
-
- • Unstage. Remove a change from the index. The change remains in
- the working tree.
-
- • Discard. On a staged change, remove it from the working tree and
- the index. On an unstaged change, remove it from the working tree
- only.
-
- • Reverse. Reverse a change in the working tree. Both committed and
- staged changes can be reversed. Unstaged changes cannot be
- reversed. Discard them instead.
-
- • Apply. Apply a change to the working tree. Both committed and
- staged changes can be applied. Unstaged changes cannot be applied
- - as they already have been applied.
-
- The previous section described the staging and unstaging commands.
-What follows are the commands which implement the remaining apply
-variants.
-
-‘a’ (‘magit-apply’)
-
- Apply the change at point to the working tree.
-
- With a prefix argument fallback to a 3-way merge. Doing so causes
- the change to be applied to the index as well.
-
-‘k’ (‘magit-discard’)
-
- Remove the change at point from the working tree.
-
-‘v’ (‘magit-reverse’)
-
- Reverse the change at point in the working tree.
-
- With a prefix argument fallback to a 3-way merge. Doing so causes
- the change to be applied to the index as well.
-
- With a prefix argument all apply variants attempt a 3-way merge when
-appropriate (i.e. when ‘git apply’ is used internally).
-
-
-File: magit.info, Node: Committing, Next: Branching, Prev: Applying, Up: Manipulating
-
-6.5 Committing
-==============
-
-When the user initiates a commit, Magit calls ‘git commit’ without any
-arguments, so Git has to get it from the user. It creates the file
-‘.git/COMMIT_EDITMSG’ and then opens that file in an editor. Magit
-arranges for that editor to be the Emacsclient. Once the user finishes
-the editing session, the Emacsclient exits and Git creates the commit
-using the file’s content as message.
-
-* Menu:
-
-* Initiating a Commit::
-* Editing Commit Messages::
-
-
-File: magit.info, Node: Initiating a Commit, Next: Editing Commit Messages, Up: Committing
-
-6.5.1 Initiating a Commit
--------------------------
-
-Also see *note (gitman)git-commit::.
-
-‘c’ (‘magit-commit’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘c c’ (‘magit-commit-create’)
-
- Create a new commit on ‘HEAD’. With a prefix argument amend to the
- commit at ‘HEAD’ instead.
-
-‘c a’ (‘magit-commit-amend’)
-
- Amend the last commit.
-
-‘c e’ (‘magit-commit-extend’)
-
- Amend the last commit, without editing the message. With a prefix
- argument keep the committer date, otherwise change it. The option
- ‘magit-commit-extend-override-date’ can be used to inverse the
- meaning of the prefix argument.
-
- Non-interactively respect the optional OVERRIDE-DATE argument and
- ignore the option.
-
-‘c w’ (‘magit-commit-reword’)
-
- Reword the last commit, ignoring staged changes. With a prefix
- argument keep the committer date, otherwise change it. The option
- ‘magit-commit-reword-override-date’ can be used to inverse the
- meaning of the prefix argument.
-
- Non-interactively respect the optional OVERRIDE-DATE argument and
- ignore the option.
-
-‘c f’ (‘magit-commit-fixup’)
-
- Create a fixup commit.
-
- With a prefix argument the target commit has to be confirmed.
- Otherwise the commit at point may be used without confirmation
- depending on the value of option ‘magit-commit-squash-confirm’.
-
-‘c F’ (‘magit-commit-instant-fixup’)
-
- Create a fixup commit and instantly rebase.
-
-‘c s’ (‘magit-commit-squash’)
-
- Create a squash commit, without editing the squash message.
-
- With a prefix argument the target commit has to be confirmed.
- Otherwise the commit at point may be used without confirmation
- depending on the value of option ‘magit-commit-squash-confirm’.
-
-‘c S’ (‘magit-commit-instant-squash’)
-
- Create a squash commit and instantly rebase.
-
-‘c A’ (‘magit-commit-augment’)
-
- Create a squash commit, editing the squash message.
-
- With a prefix argument the target commit has to be confirmed.
- Otherwise the commit at point may be used without confirmation
- depending on the value of option ‘magit-commit-squash-confirm’.
-
- -- User Option: magit-commit-ask-to-stage
-
- Whether to ask to stage all unstaged changes when committing and
- nothing is staged.
-
- -- User Option: magit-commit-extend-override-date
-
- Whether using ‘magit-commit-extend’ changes the committer date.
-
- -- User Option: magit-commit-reword-override-date
-
- Whether using ‘magit-commit-reword’ changes the committer date.
-
- -- User Option: magit-commit-squash-confirm
-
- Whether the commit targeted by squash and fixup has to be
- confirmed. When non-nil then the commit at point (if any) is used
- as default choice. Otherwise it has to be confirmed. This option
- only affects ‘magit-commit-squash’ and ‘magit-commit-fixup’. The
- "instant" variants always require confirmation because making an
- error while using those is harder to recover from.
-
-
-File: magit.info, Node: Editing Commit Messages, Prev: Initiating a Commit, Up: Committing
-
-6.5.2 Editing Commit Messages
------------------------------
-
-After initiating a commit as described in the previous section, two new
-buffers appear. One shows the changes that are about to be committed,
-while the other is used to write the message.
-
- Commit messages are edited in an edit session - in the background
-‘git’ is waiting for the editor, in our case ‘emacsclient’, to save the
-commit message in a file (in most cases ‘.git/COMMIT_EDITMSG’) and then
-return. If the editor returns with a non-zero exit status then ‘git’
-does not create the commit. So the most important commands are those
-for finishing and aborting the commit.
-
-‘C-c C-c’ (‘with-editor-finish’)
-
- Finish the current editing session by returning with exit code 0.
- Git then creates the commit using the message it finds in the file.
-
-‘C-c C-k’ (‘with-editor-cancel’)
-
- Cancel the current editing session by returning with exit code 1.
- Git then cancels the commit, but leaves the file untouched.
-
- In addition to being used by ‘git commit’, messages may also be
-stored in a ring that persists until Emacs is closed. By default the
-message is stored at the beginning and the end of an edit session
-(regardless of whether the session is finished successfully or was
-canceled). It is sometimes useful to bring back messages from that
-ring.
-
-‘C-c M-s’ (‘git-commit-save-message’)
-
- Save the current buffer content to the commit message ring.
-
-‘M-p’ (‘git-commit-prev-message’)
-
- Cycle backward through the commit message ring, after saving the
- current message to the ring. With a numeric prefix ARG, go back
- ARG comments.
-
-‘M-n’ (‘git-commit-next-message’)
-
- Cycle forward through the commit message ring, after saving the
- current message to the ring. With a numeric prefix ARG, go back
- ARG comments.
-
- By default the diff for the changes that are about to be committed
-are automatically shown when invoking the commit. To prevent that,
-remove ‘magit-commit-diff’ from ‘server-switch-hook’.
-
- When amending to an existing commit it may be useful to show either
-the changes that are about to be added to that commit or to show those
-changes alongside those that have already been committed.
-
-‘C-c C-d’ (‘magit-diff-while-committing’)
-
- While committing, show the changes that are about to be committed.
- While amending, invoking the command again toggles between showing
- just the new changes or all the changes that will be committed.
-
-* Menu:
-
-* Using the Revision Stack::
-* Commit Pseudo Headers::
-* Commit Mode and Hooks::
-* Commit Message Conventions::
-
-
-File: magit.info, Node: Using the Revision Stack, Next: Commit Pseudo Headers, Up: Editing Commit Messages
-
-Using the Revision Stack
-........................
-
-‘C-c C-w’ (‘magit-pop-revision-stack’)
-
- This command inserts a representation of a revision into the
- current buffer. It can be used inside buffers used to write commit
- messages but also in other buffers such as buffers used to edit
- emails or ChangeLog files.
-
- By default this command pops the revision which was last added to
- the ‘magit-revision-stack’ and inserts it into the current buffer
- according to ‘magit-pop-revision-stack-format’. Revisions can be
- put on the stack using ‘magit-copy-section-value’ and
- ‘magit-copy-buffer-revision’.
-
- If the stack is empty or with a prefix argument it instead reads a
- revision in the minibuffer. By using the minibuffer history this
- allows selecting an item which was popped earlier or to insert an
- arbitrary reference or revision without first pushing it onto the
- stack.
-
- When reading the revision from the minibuffer, then it might not be
- possible to guess the correct repository. When this command is
- called inside a repository (e.g. while composing a commit
- message), then that repository is used. Otherwise (e.g. while
- composing an email) then the repository recorded for the top
- element of the stack is used (even though we insert another
- revision). If not called inside a repository and with an empty
- stack, or with two prefix arguments, then read the repository in
- the minibuffer too.
-
- -- User Option: magit-pop-revision-stack-format
-
- This option controls how the command ‘magit-pop-revision-stack’
- inserts a revision into the current buffer.
-
- The entries on the stack have the format ‘(HASH TOPLEVEL)’ and this
- option has the format ‘(POINT-FORMAT EOB-FORMAT INDEX-REGEXP)’, all
- of which may be nil or a string (though either one of EOB-FORMAT or
- POINT-FORMAT should be a string, and if INDEX-REGEXP is non-nil,
- then the two formats should be too).
-
- First INDEX-REGEXP is used to find the previously inserted entry,
- by searching backward from point. The first submatch must match
- the index number. That number is incremented by one, and becomes
- the index number of the entry to be inserted. If you don’t want to
- number the inserted revisions, then use nil for INDEX-REGEXP.
-
- If INDEX-REGEXP is non-nil then both POINT-FORMAT and EOB-FORMAT
- should contain \"%N\", which is replaced with the number that was
- determined in the previous step.
-
- Both formats, if non-nil and after removing %N, are then expanded
- using ‘git show --format=FORMAT ...’ inside TOPLEVEL.
-
- The expansion of POINT-FORMAT is inserted at point, and the
- expansion of EOB-FORMAT is inserted at the end of the buffer (if
- the buffer ends with a comment, then it is inserted right before
- that).
-
-
-File: magit.info, Node: Commit Pseudo Headers, Next: Commit Mode and Hooks, Prev: Using the Revision Stack, Up: Editing Commit Messages
-
-Commit Pseudo Headers
-.....................
-
-Some projects use pseudo headers in commit messages. Magit colorizes
-such headers and provides some commands to insert such headers.
-
- -- User Option: git-commit-known-pseudo-headers
-
- A list of Git pseudo headers to be highlighted.
-
-‘C-c C-i’ (‘git-commit-insert-pseudo-header’)
-
- Insert a commit message pseudo header.
-
-‘C-c C-a’ (‘git-commit-ack’)
-
- Insert a header acknowledging that you have looked at the commit.
-
-‘C-c C-r’ (‘git-commit-review’)
-
- Insert a header acknowledging that you have reviewed the commit.
-
-‘C-c C-s’ (‘git-commit-signoff’)
-
- Insert a header to sign off the commit.
-
-‘C-c C-t’ (‘git-commit-test’)
-
- Insert a header acknowledging that you have tested the commit.
-
-‘C-c C-o’ (‘git-commit-cc’)
-
- Insert a header mentioning someone who might be interested.
-
-‘C-c C-p’ (‘git-commit-reported’)
-
- Insert a header mentioning the person who reported the issue being
- fixed by the commit.
-
-‘C-c M-i’ (‘git-commit-suggested’)
-
- Insert a header mentioning the person who suggested the change.
-
-
-File: magit.info, Node: Commit Mode and Hooks, Next: Commit Message Conventions, Prev: Commit Pseudo Headers, Up: Editing Commit Messages
-
-Commit Mode and Hooks
-.....................
-
-‘git-commit-mode’ is a minor mode that is only used to establish certain
-key bindings. This makes it possible to use an arbitrary major mode in
-buffers used to edit commit messages. It is even possible to use
-different major modes in different repositories, which is useful when
-different projects impose different commit message conventions.
-
- -- User Option: git-commit-major-mode
-
- The value of this option is the major mode used to edit Git commit
- messages.
-
- Because ‘git-commit-mode’ is a minor mode, we don’t use its mode hook
-to setup the buffer, except for the key bindings. All other setup
-happens in the function ‘git-commit-setup’, which among other things
-runs the hook ‘git-commit-setup-hook’.
-
- -- User Option: git-commit-setup-hook
-
- Hook run at the end of ‘git-commit-setup’.
-
-The following functions are suitable for this hook:
-
- -- Function: git-commit-save-message
-
- Save the current buffer content to the commit message ring.
-
- -- Function: git-commit-setup-changelog-support
-
- After this function is called, ChangeLog entries are treated as
- paragraphs.
-
- -- Function: git-commit-turn-on-auto-fill
-
- Turn on ‘auto-fill-mode’ and set ‘fill-column’ to the value of
- ‘git-commit-fill-column’.
-
- -- Function: git-commit-turn-on-flyspell
-
- Turn on Flyspell mode. Also prevent comments from being checked
- and finally check current non-comment text.
-
- -- Function: git-commit-propertize-diff
-
- Propertize the diff shown inside the commit message buffer. Git
- inserts such diffs into the commit message template when the
- ‘--verbose’ argument is used. ‘magit-commit’ by default does not
- offer that argument because the diff that is shown in a separate
- buffer is more useful. But some users disagree, which is why this
- function exists.
-
- -- Function: bug-reference-mode
-
- Hyperlink bug references in the buffer.
-
- -- Function: with-editor-usage-message
-
- Show usage information in the echo area.
-
- -- User Option: git-commit-setup-hook
-
- Hook run after the user finished writing a commit message.
-
- This hook is only run after pressing ‘C-c C-c’ in a buffer used to
- edit a commit message. If a commit is created without the user
- typing a message into a buffer, then this hook is not run.
-
- This hook is not run until the new commit has been created. If
- doing so takes Git longer than one second, then this hook isn’t run
- at all. For certain commands such as ‘magit-rebase-continue’ this
- hook is never run because doing so would lead to a race condition.
-
- This hook is only run if ‘magit’ is available.
-
- Also see ‘magit-post-commit-hook’.
-
-
-File: magit.info, Node: Commit Message Conventions, Prev: Commit Mode and Hooks, Up: Editing Commit Messages
-
-Commit Message Conventions
-..........................
-
-Git-Commit highlights certain violations of commonly accepted commit
-message conventions. Certain violations even cause Git-Commit to ask
-you to confirm that you really want to do that. This nagging can of
-course be turned off, but the result of doing that usually is that
-instead of some code it’s now the human who is reviewing your commits
-who has to waste some time telling you to fix your commits.
-
- -- User Option: git-commit-summary-max-length
-
- The intended maximal length of the summary line of commit messages.
- Characters beyond this column are colorized to indicate that this
- preference has been violated.
-
- -- User Option: git-commit-fill-column
-
- Column beyond which automatic line-wrapping should happen in commit
- message buffers.
-
- -- User Option: git-commit-finish-query-functions
-
- List of functions called to query before performing commit.
-
- The commit message buffer is current while the functions are
- called. If any of them returns nil, then the commit is not
- performed and the buffer is not killed. The user should then fix
- the issue and try again.
-
- The functions are called with one argument. If it is non-nil then
- that indicates that the user used a prefix argument to force
- finishing the session despite issues. Functions should usually
- honor this wish and return non-nil.
-
- By default the only member is ‘git-commit-check-style-conventions’.
-
- -- Function: git-commit-check-style-conventions
-
- This function checks for violations of certain basic style
- conventions. For each violation it asks users if they want to
- proceed anyway.
-
- -- User Option: git-commit-style-convention-checks
-
- This option controls what conventions the function by the same name
- tries to enforce. The value is a list of self-explanatory symbols
- identifying certain conventions; ‘non-empty-second-line’ and
- ‘overlong-summary-line’.
-
-
-File: magit.info, Node: Branching, Next: Merging, Prev: Committing, Up: Manipulating
-
-6.6 Branching
-=============
-
-* Menu:
-
-* The Two Remotes::
-* Branch Commands::
-* Branch Git Variables::
-* Auxiliary Branch Commands::
-
-
-File: magit.info, Node: The Two Remotes, Next: Branch Commands, Up: Branching
-
-6.6.1 The Two Remotes
----------------------
-
-The upstream branch of some local branch is the branch into which the
-commits on that local branch should eventually be merged, usually
-something like ‘origin/master’. For the ‘master’ branch itself the
-upstream branch and the branch it is being pushed to, are usually the
-same remote branch. But for a feature branch the upstream branch and
-the branch it is being pushed to should differ.
-
- The commits on feature branches too should _eventually_ end up in a
-remote branch such as ‘origin/master’ or ‘origin/maint’. Such a branch
-should therefore be used as the upstream. But feature branches
-shouldn’t be pushed directly to such branches. Instead a feature branch
-‘my-feature’ is usually pushed to ‘my-fork/my-feature’ or if you are a
-contributor ‘origin/my-feature’. After the new feature has been
-reviewed, the maintainer merges the feature into ‘master’. And finally
-‘master’ (not ‘my-feature’ itself) is pushed to ‘origin/master’.
-
- But new features seldom are perfect on the first try, and so feature
-branches usually have to be reviewed, improved, and re-pushed several
-times. Pushing should therefore be easy to do, and for that reason many
-Git users have concluded that it is best to use the remote branch to
-which the local feature branch is being pushed as its upstream.
-
- But luckily Git has long ago gained support for a push-remote which
-can be configured separately from the upstream branch, using the
-variables ‘branch.<name>.pushRemote’ and ‘remote.pushDefault’. So we no
-longer have to choose which of the two remotes should be used as "the
-remote".
-
- Each of the fetching, pulling, and pushing transient commands
-features three suffix commands that act on the current branch and some
-other branch. Of these, ‘p’ is bound to a command which acts on the
-push-remote, ‘u’ is bound to a command which acts on the upstream, and
-‘e’ is bound to a command which acts on any other branch. The status
-buffer shows unpushed and unpulled commits for both the push-remote and
-the upstream.
-
- It’s fairly simple to configure these two remotes. The values of all
-the variables that are related to fetching, pulling, and pushing (as
-well as some other branch-related variables) can be inspected and
-changed using the command ‘magit-branch-configure’, which is available
-from many transient prefix commands that deal with branches. It is also
-possible to set the push-remote or upstream while pushing (see *note
-Pushing::).
-
-
-File: magit.info, Node: Branch Commands, Next: Branch Git Variables, Prev: The Two Remotes, Up: Branching
-
-6.6.2 Branch Commands
----------------------
-
-The transient prefix command ‘magit-branch’ is used to create and
-checkout branches, and to make changes to existing branches. It is not
-used to fetch, pull, merge, rebase, or push branches, i.e. this command
-deals with branches themselves, not with the commits reachable from
-them. Those features are available from separate transient command.
-
-‘b’ (‘magit-branch’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
- By default it also binds and displays the values of some
- branch-related Git variables and allows changing their values.
-
- -- User Option: magit-branch-direct-configure
-
- This option controls whether the transient command ‘magit-branch’
- can be used directly change the values Git variables. This
- defaults to ‘t’ (to avoid changing key bindings). When set to
- ‘nil’, then no variables are displayed by that transient command,
- and its suffix command ‘magit-branch-configure’ has to be used
- instead to view and change branch related variables.
-
-‘b C’ (‘magit-branch-configure’)
-‘f C’ (‘magit-branch-configure’)
-‘F C’ (‘magit-branch-configure’)
-‘P C’ (‘magit-branch-configure’)
-
- This transient prefix command binds commands that set the value of
- branch-related variables and displays them in a temporary buffer
- until the transient is exited.
-
- With a prefix argument, this command always prompts for a branch.
-
- Without a prefix argument this depends on whether it was invoked as
- a suffix of ‘magit-branch’ and on the
- ‘magit-branch-direct-configure’ option. If ‘magit-branch’ already
- displays the variables for the current branch, then it isn’t useful
- to invoke another transient that displays them for the same branch.
- In that case this command prompts for a branch.
-
- The variables are described in *note Branch Git Variables::.
-
-‘b b’ (‘magit-checkout’)
-
- Checkout a revision read in the minibuffer and defaulting to the
- branch or arbitrary revision at point. If the revision is a local
- branch then that becomes the current branch. If it is something
- else then ‘HEAD’ becomes detached. Checkout fails if the working
- tree or the staging area contain changes.
-
-‘b n’ (‘magit-branch-create’)
-
- Create a new branch. The user is asked for a branch or arbitrary
- revision to use as the starting point of the new branch. When a
- branch name is provided, then that becomes the upstream branch of
- the new branch. The name of the new branch is also read in the
- minibuffer.
-
- Also see option ‘magit-branch-prefer-remote-upstream’.
-
-‘b c’ (‘magit-branch-and-checkout’)
-
- This command creates a new branch like ‘magit-branch’, but then
- also checks it out.
-
- Also see option ‘magit-branch-prefer-remote-upstream’.
-
-‘b l’ (‘magit-branch-checkout’)
-
- This command checks out an existing or new local branch. It reads
- a branch name from the user offering all local branches and a
- subset of remote branches as candidates. Remote branches for which
- a local branch by the same name exists are omitted from the list of
- candidates. The user can also enter a completely new branch name.
-
- • If the user selects an existing local branch, then that is
- checked out.
-
- • If the user selects a remote branch, then it creates and
- checks out a new local branch with the same name, and
- configures the selected remote branch as the push target.
-
- • If the user enters a new branch name, then it creates and
- checks that out, after also reading the starting-point from
- the user.
-
- In the latter two cases the upstream is also set. Whether it is
- set to the chosen starting point or something else depends on the
- value of ‘magit-branch-adjust-remote-upstream-alist’.
-
-‘b s’ (‘magit-branch-spinoff’)
-
- This command creates and checks out a new branch starting at and
- tracking the current branch. That branch in turn is reset to the
- last commit it shares with its upstream. If the current branch has
- no upstream or no unpushed commits, then the new branch is created
- anyway and the previously current branch is not touched.
-
- This is useful to create a feature branch after work has already
- began on the old branch (likely but not necessarily "master").
-
- If the current branch is a member of the value of option
- ‘magit-branch-prefer-remote-upstream’ (which see), then the current
- branch will be used as the starting point as usual, but the
- upstream of the starting-point may be used as the upstream of the
- new branch, instead of the starting-point itself.
-
- If optional FROM is non-nil, then the source branch is reset to
- ‘FROM~’, instead of to the last commit it shares with its upstream.
- Interactively, FROM is only ever non-nil, if the region selects
- some commits, and among those commits, FROM is the commit that is
- the fewest commits ahead of the source branch.
-
- The commit at the other end of the selection actually does not
- matter, all commits between FROM and ‘HEAD’ are moved to the new
- branch. If FROM is not reachable from ‘HEAD’ or is reachable from
- the source branch’s upstream, then an error is raised.
-
-‘b S’ (‘magit-branch-spinout’)
-
- This command behaves like ‘magit-branch-spinoff’, except that it
- does not change the current branch. If there are any uncommitted
- changes, then it behaves exactly like ‘magit-branch-spinoff’.
-
-‘b x’ (‘magit-branch-reset’)
-
- This command resets a branch, defaulting to the branch at point, to
- the tip of another branch or any other commit.
-
- When the branch being reset is the current branch, then a hard
- reset is performed. If there are any uncommitted changes, then the
- user has to confirm the reset because those changes would be lost.
-
- This is useful when you have started work on a feature branch but
- realize it’s all crap and want to start over.
-
- When resetting to another branch and a prefix argument is used,
- then the target branch is set as the upstream of the branch that is
- being reset.
-
-‘b k’ (‘magit-branch-delete’)
-
- Delete one or multiple branches. If the region marks multiple
- branches, then offer to delete those. Otherwise, prompt for a
- single branch to be deleted, defaulting to the branch at point.
-
-‘b r’ (‘magit-branch-rename’)
-
- Rename a branch. The branch and the new name are read in the
- minibuffer. With prefix argument the branch is renamed even if
- that name conflicts with an existing branch.
-
- -- User Option: magit-branch-read-upstream-first
-
- When creating a branch, whether to read the upstream branch before
- the name of the branch that is to be created. The default is ‘t’,
- and I recommend you leave it at that.
-
- -- User Option: magit-branch-prefer-remote-upstream
-
- This option specifies whether remote upstreams are favored over
- local upstreams when creating new branches.
-
- When a new branch is created, then the branch, commit, or stash at
- point is suggested as the starting point of the new branch, or if
- there is no such revision at point the current branch. In either
- case the user may choose another starting point.
-
- If the chosen starting point is a branch, then it may also be set
- as the upstream of the new branch, depending on the value of the
- Git variable ‘branch.autoSetupMerge’. By default this is done for
- remote branches, but not for local branches.
-
- You might prefer to always use some remote branch as upstream. If
- the chosen starting point is (1) a local branch, (2) whose name
- matches a member of the value of this option, (3) the upstream of
- that local branch is a remote branch with the same name, and (4)
- that remote branch can be fast-forwarded to the local branch, then
- the chosen branch is used as starting point, but its own upstream
- is used as the upstream of the new branch.
-
- Members of this option’s value are treated as branch names that
- have to match exactly unless they contain a character that makes
- them invalid as a branch name. Recommended characters to use to
- trigger interpretation as a regexp are "*" and "^". Some other
- characters which you might expect to be invalid, actually are not,
- e.g. ".+$" are all perfectly valid. More precisely, if ‘git
- check-ref-format --branch STRING’ exits with a non-zero status,
- then treat STRING as a regexp.
-
- Assuming the chosen branch matches these conditions you would end
- up with with e.g.:
-
- feature --upstream--> origin/master
-
- instead of
-
- feature --upstream--> master --upstream--> origin/master
-
- Which you prefer is a matter of personal preference. If you do
- prefer the former, then you should add branches such as ‘master’,
- ‘next’, and ‘maint’ to the value of this options.
-
- -- User Option: magit-branch-adjust-remote-upstream-alist
-
- The value of this option is an alist of branches to be used as the
- upstream when branching a remote branch.
-
- When creating a local branch from an ephemeral branch located on a
- remote, e.g. a feature or hotfix branch, then that remote branch
- should usually not be used as the upstream branch, since the
- push-remote already allows accessing it and having both the
- upstream and the push-remote reference the same related branch
- would be wasteful. Instead a branch like "maint" or "master"
- should be used as the upstream.
-
- This option allows specifying the branch that should be used as the
- upstream when branching certain remote branches. The value is an
- alist of the form ‘((UPSTREAM . RULE)...)’. The first matching
- element is used, the following elements are ignored.
-
- UPSTREAM is the branch to be used as the upstream for branches
- specified by RULE. It can be a local or a remote branch.
-
- RULE can either be a regular expression, matching branches whose
- upstream should be the one specified by UPSTREAM. Or it can be a
- list of the only branches that should *not* use UPSTREAM; all other
- branches will. Matching is done after stripping the remote part of
- the name of the branch that is being branched from.
-
- If you use a finite set of non-ephemeral branches across all your
- repositories, then you might use something like:
-
- (("origin/master" "master" "next" "maint"))
-
- Or if the names of all your ephemeral branches contain a slash, at
- least in some repositories, then a good value could be:
-
- (("origin/master" . "/"))
-
- Of course you can also fine-tune:
-
- (("origin/maint" . "\\`hotfix/")
- ("origin/master" . "\\`feature/"))
-
- -- Command: magit-branch-orphan
-
- This command creates and checks out a new orphan branch with
- contents from a given revision.
-
- -- Command: magit-branch-or-checkout
-
- This command is a hybrid between ‘magit-checkout’ and
- ‘magit-branch-and-checkout’ and is intended as a replacement for
- the former in ‘magit-branch’.
-
- It first asks the user for an existing branch or revision. If the
- user input actually can be resolved as a branch or revision, then
- it checks that out, just like ‘magit-checkout’ would.
-
- Otherwise it creates and checks out a new branch using the input as
- its name. Before doing so it reads the starting-point for the new
- branch. This is similar to what ‘magit-branch-and-checkout’ does.
-
- To use this command instead of ‘magit-checkout’ add this to your
- init file:
-
- (transient-replace-suffix 'magit-branch 'magit-checkout
- '("b" "dwim" magit-branch-or-checkout))
-
-
-File: magit.info, Node: Branch Git Variables, Next: Auxiliary Branch Commands, Prev: Branch Commands, Up: Branching
-
-6.6.3 Branch Git Variables
---------------------------
-
-These variables can be set from the transient prefix command
-‘magit-branch-configure’. By default they can also be set from
-‘magit-branch’. See *note Branch Commands::.
-
- -- Variable: branch.NAME.merge
-
- Together with ‘branch.NAME.remote’ this variable defines the
- upstream branch of the local branch named NAME. The value of this
- variable is the full reference of the upstream _branch_.
-
- -- Variable: branch.NAME.remote
-
- Together with ‘branch.NAME.merge’ this variable defines the
- upstream branch of the local branch named NAME. The value of this
- variable is the name of the upstream _remote_.
-
- -- Variable: branch.NAME.rebase
-
- This variable controls whether pulling into the branch named NAME
- is done by rebasing or by merging the fetched branch.
-
- • When ‘true’ then pulling is done by rebasing.
-
- • When ‘false’ then pulling is done by merging.
-
- • When undefined then the value of ‘pull.rebase’ is used. The
- default of that variable is ‘false’.
-
- -- Variable: branch.NAME.pushRemote
-
- This variable specifies the remote that the branch named NAME is
- usually pushed to. The value has to be the name of an existing
- remote.
-
- It is not possible to specify the name of _branch_ to push the
- local branch to. The name of the remote branch is always the same
- as the name of the local branch.
-
- If this variable is undefined but ‘remote.pushDefault’ is defined,
- then the value of the latter is used. By default
- ‘remote.pushDefault’ is undefined.
-
- -- Variable: branch.NAME.description
-
- This variable can be used to describe the branch named NAME. That
- description is used e.g. when turning the branch into a series of
- patches.
-
- The following variables specify defaults which are used if the above
-branch-specific variables are not set.
-
- -- Variable: pull.rebase
-
- This variable specifies whether pulling is done by rebasing or by
- merging. It can be overwritten using ‘branch.NAME.rebase’.
-
- • When ‘true’ then pulling is done by rebasing.
-
- • When ‘false’ (the default) then pulling is done by merging.
-
- Since it is never a good idea to merge the upstream branch into a
- feature or hotfix branch and most branches are such branches, you
- should consider setting this to ‘true’, and ‘branch.master.rebase’
- to ‘false’.
-
- -- Variable: remote.pushDefault
-
- This variable specifies what remote the local branches are usually
- pushed to. This can be overwritten per branch using
- ‘branch.NAME.pushRemote’.
-
- The following variables are used during the creation of a branch and
-control whether the various branch-specific variables are automatically
-set at this time.
-
- -- Variable: branch.autoSetupMerge
-
- This variable specifies under what circumstances creating a branch
- NAME should result in the variables ‘branch.NAME.merge’ and
- ‘branch.NAME.remote’ being set according to the starting point used
- to create the branch. If the starting point isn’t a branch, then
- these variables are never set.
-
- • When ‘always’ then the variables are set regardless of whether
- the starting point is a local or a remote branch.
-
- • When ‘true’ (the default) then the variables are set when the
- starting point is a remote branch, but not when it is a local
- branch.
-
- • When ‘false’ then the variables are never set.
-
- -- Variable: branch.autoSetupRebase
-
- This variable specifies whether creating a branch NAME should
- result in the variable ‘branch.NAME.rebase’ being set to ‘true’.
-
- • When ‘always’ then the variable is set regardless of whether
- the starting point is a local or a remote branch.
-
- • When ‘local’ then the variable are set when the starting point
- is a local branch, but not when it is a remote branch.
-
- • When ‘remote’ then the variable are set when the starting
- point is a remote branch, but not when it is a local branch.
-
- • When ‘never’ (the default) then the variable is never set.
-
- Note that the respective commands always change the repository-local
-values. If you want to change the global value, which is used when the
-local value is undefined, then you have to do so on the command line,
-e.g.:
-
- git config --global remote.autoSetupMerge always
-
- For more information about these variables you should also see
-
- *note (gitman)git-config::. Also see *note (gitman)git-branch::. ,
-*note (gitman)git-checkout::. and *note Pushing::.
-
- -- User Option: magit-prefer-remote-upstream
-
- This option controls whether commands that read a branch from the
- user and then set it as the upstream branch, offer a local or a
- remote branch as default completion candidate, when they have the
- choice.
-
- This affects all commands that use ‘magit-read-upstream-branch’ or
- ‘magit-read-starting-point’, which includes all commands that
- change the upstream and many which create new branches.
-
-
-File: magit.info, Node: Auxiliary Branch Commands, Prev: Branch Git Variables, Up: Branching
-
-6.6.4 Auxiliary Branch Commands
--------------------------------
-
-These commands are not available from the transient ‘magit-branch’ by
-default.
-
- -- Command: magit-branch-shelve
-
- This command shelves a branch. This is done by deleting the
- branch, and creating a new reference "refs/shelved/BRANCH-NAME"
- pointing at the same commit as the branch pointed at. If the
- deleted branch had a reflog, then that is preserved as the reflog
- of the new reference.
-
- This is useful if you want to move a branch out of sight, but are
- not ready to completely discard it yet.
-
- -- Command: magit-branch-unshelve
-
- This command unshelves a branch that was previously shelved using
- ‘magit-branch-shelve’. This is done by deleting the reference
- "refs/shelved/BRANCH-NAME" and creating a branch "BRANCH-NAME"
- pointing at the same commit as the deleted reference pointed at.
- If the deleted reference had a reflog, then that is restored as the
- reflog of the branch.
-
-
-File: magit.info, Node: Merging, Next: Resolving Conflicts, Prev: Branching, Up: Manipulating
-
-6.7 Merging
-===========
-
-Also see *note (gitman)git-merge::. For information on how to resolve
-merge conflicts see the next section.
-
-‘m’ (‘magit-merge’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- When no merge is in progress, then the transient features the
-following suffix commands.
-
-‘m m’ (‘magit-merge-plain’)
-
- This command merges another branch or an arbitrary revision into
- the current branch. The branch or revision to be merged is read in
- the minibuffer and defaults to the branch at point.
-
- Unless there are conflicts or a prefix argument is used, then the
- resulting merge commit uses a generic commit message, and the user
- does not get a chance to inspect or change it before the commit is
- created. With a prefix argument this does not actually create the
- merge commit, which makes it possible to inspect how conflicts were
- resolved and to adjust the commit message.
-
-‘m e’ (‘magit-merge-editmsg’)
-
- This command merges another branch or an arbitrary revision into
- the current branch and opens a commit message buffer, so that the
- user can make adjustments. The commit is not actually created
- until the user finishes with ‘C-c C-c’.
-
-‘m n’ (‘magit-merge-nocommit’)
-
- This command merges another branch or an arbitrary revision into
- the current branch, but does not actually create the merge commit.
- The user can then further adjust the merge, even when automatic
- conflict resolution succeeded and/or adjust the commit message.
-
-‘m a’ (‘magit-merge-absorb’)
-
- This command merges another local branch into the current branch
- and then removes the former.
-
- Before the source branch is merged, it is first force pushed to its
- push-remote, provided the respective remote branch already exists.
- This ensures that the respective pull-request (if any) won’t get
- stuck on some obsolete version of the commits that are being
- merged. Finally, if ‘magit-branch-pull-request’ was used to create
- the merged branch, then the respective remote branch is also
- removed.
-
-‘m i’ (‘magit-merge-into’)
-
- This command merges the current branch into another local branch
- and then removes the former. The latter becomes the new current
- branch.
-
- Before the source branch is merged, it is first force pushed to its
- push-remote, provided the respective remote branch already exists.
- This ensures that the respective pull-request (if any) won’t get
- stuck on some obsolete version of the commits that are being
- merged. Finally, if ‘magit-branch-pull-request’ was used to create
- the merged branch, then the respective remote branch is also
- removed.
-
-‘m s’ (‘magit-merge-squash’)
-
- This command squashes the changes introduced by another branch or
- an arbitrary revision into the current branch. This only applies
- the changes made by the squashed commits. No information is
- preserved that would allow creating an actual merge commit.
- Instead of this command you should probably use a command from the
- apply transient.
-
-‘m p’ (‘magit-merge-preview’)
-
- This command shows a preview of merging another branch or an
- arbitrary revision into the current branch.
-
- When a merge is in progress, then the transient instead features the
-following suffix commands.
-
-‘m m’ (‘magit-merge’)
-
- After the user resolved conflicts, this command proceeds with the
- merge. If some conflicts weren’t resolved, then this command
- fails.
-
-‘m a’ (‘magit-merge-abort’)
-
- This command aborts the current merge operation.
-
-
-File: magit.info, Node: Resolving Conflicts, Next: Rebasing, Prev: Merging, Up: Manipulating
-
-6.8 Resolving Conflicts
-=======================
-
-When merging branches (or otherwise combining or changing history)
-conflicts can occur. If you edited two completely different parts of
-the same file in two branches and then merge one of these branches into
-the other, then Git can resolve that on its own, but if you edit the
-same area of a file, then a human is required to decide how the two
-versions, or "sides of the conflict", are to be combined into one.
-
- Here we can only provide a brief introduction to the subject and
-point you toward some tools that can help. If you are new to this, then
-please also consult Git’s own documentation as well as other resources.
-
- If a file has conflicts and Git cannot resolve them by itself, then
-it puts both versions into the affected file along with special markers
-whose purpose is to denote the boundaries of the unresolved part of the
-file and between the different versions. These boundary lines begin
-with the strings consisting of six times the same character, one of ‘<’,
-‘|’, ‘=’ and ‘>’ and are followed by information about the source of the
-respective versions, e.g.:
-
- <<<<<<< HEAD
- Take the blue pill.
- =======
- Take the red pill.
- >>>>>>> feature
-
- In this case you have chosen to take the red pill on one branch and
-on another you picked the blue pill. Now that you are merging these two
-diverging branches, Git cannot possibly know which pill you want to
-take.
-
- To resolve that conflict you have to create a version of the affected
-area of the file by keeping only one of the sides, possibly by editing
-it in order to bring in the changes from the other side, remove the
-other versions as well as the markers, and then stage the result. A
-possible resolution might be:
-
- Take both pills.
-
- Often it is useful to see not only the two sides of the conflict but
-also the "original" version from before the same area of the file was
-modified twice on different branches. Instruct Git to insert that
-version as well by running this command once:
-
- git config --global merge.conflictStyle diff3
-
- The above conflict might then have looked like this:
-
- <<<<<<< HEAD
- Take the blue pill.
- ||||||| merged common ancestors
- Take either the blue or the red pill, but not both.
- =======
- Take the red pill.
- >>>>>>> feature
-
- If that were the case, then the above conflict resolution would not
-have been correct, which demonstrates why seeing the original version
-alongside the conflicting versions can be useful.
-
- You can perform the conflict resolution completely by hand, but Emacs
-also provides some packages that help in the process: Smerge, Ediff
-(*note (ediff)Top::), and Emerge (*note (emacs)Emerge::). Magit does
-not provide its own tools for conflict resolution, but it does make
-using Smerge and Ediff more convenient. (Ediff supersedes Emerge, so
-you probably don’t want to use the latter anyway.)
-
- In the Magit status buffer, files with unresolved conflicts are
-listed in the "Unstaged changes" and/or "Staged changes" sections. They
-are prefixed with the word "unmerged", which in this context essentially
-is a synonym for "unresolved".
-
- Pressing ‘RET’ while point is on such a file section shows a buffer
-visiting that file, turns on ‘smerge-mode’ in that buffer, and places
-point inside the first area with conflicts. You should then resolve
-that conflict using regular edit commands and/or Smerge commands.
-
- Unfortunately Smerge does not have a manual, but you can get a list
-of commands and binding ‘C-c ^ C-h’ and press ‘RET’ while point is on a
-command name to read its documentation.
-
- Normally you would edit one version and then tell Smerge to keep only
-that version. Use ‘C-c ^ m’ (‘smerge-keep-mine’) to keep the ‘HEAD’
-version or ‘C-c ^ o’ (‘smerge-keep-other’) to keep the version that
-follows "|||||||". Then use ‘C-c ^ n’ to move to the next conflicting
-area in the same file. Once you are done resolving conflicts, return to
-the Magit status buffer. The file should now be shown as "modified", no
-longer as "unmerged", because Smerge automatically stages the file when
-you save the buffer after resolving the last conflict.
-
- Alternatively you could use Ediff, which uses separate buffers for
-the different versions of the file. To resolve conflicts in a file
-using Ediff press ‘e’ while point is on such a file in the status
-buffer.
-
- Ediff can be used for other purposes as well. For more information
-on how to enter Ediff from Magit, see *note Ediffing::. Explaining how
-to use Ediff is beyond the scope of this manual, instead see *note
-(ediff)Top::.
-
- If you are unsure whether you should Smerge or Ediff, then use the
-former. It is much easier to understand and use, and except for truly
-complex conflicts, the latter is usually overkill.
-
-
-File: magit.info, Node: Rebasing, Next: Cherry Picking, Prev: Resolving Conflicts, Up: Manipulating
-
-6.9 Rebasing
-============
-
-Also see *note (gitman)git-rebase::. For information on how to resolve
-conflicts that occur during rebases see the preceding section.
-
-‘r’ (‘magit-rebase’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- When no rebase is in progress, then the transient features the
-following suffix commands.
-
- Using one of these commands _starts_ a rebase sequence. Git might
-then stop somewhere along the way, either because you told it to do so,
-or because applying a commit failed due to a conflict. When that
-happens, then the status buffer shows information about the rebase
-sequence which is in progress in a section similar to a log section.
-See *note Information About In-Progress Rebase::.
-
- For information about the upstream and the push-remote, see *note The
-Two Remotes::.
-
-‘r p’ (‘magit-rebase-onto-pushremote’)
-
- This command rebases the current branch onto its push-remote.
-
- With a prefix argument or when the push-remote is either not
- configured or unusable, then let the user first configure the
- push-remote.
-
-‘r u’ (‘magit-rebase-onto-upstream’)
-
- This command rebases the current branch onto its upstream branch.
-
- With a prefix argument or when the upstream is either not
- configured or unusable, then let the user first configure the
- upstream.
-
-‘r e’ (‘magit-rebase-branch’)
-
- This command rebases the current branch onto a branch read in the
- minibuffer. All commits that are reachable from head but not from
- the selected branch TARGET are being rebased.
-
-‘r s’ (‘magit-rebase-subset’)
-
- This command starts a non-interactive rebase sequence to transfer
- commits from START to ‘HEAD’ onto NEWBASE. START has to be
- selected from a list of recent commits.
-
- By default Magit uses the ‘--autostash’ argument, which causes
-uncommitted changes to be stored in a stash before the rebase begins.
-These changes are restored after the rebase completes and if possible
-the stash is removed. If the stash does not apply cleanly, then the
-stash is not removed. In case something goes wrong when resolving the
-conflicts, this allows you to start over.
-
- Even though one of the actions is dedicated to interactive rebases,
-the transient also features the infix argument ‘--interactive’. This
-can be used to turn one of the other, non-interactive rebase variants
-into an interactive rebase.
-
- For example if you want to clean up a feature branch and at the same
-time rebase it onto ‘master’, then you could use ‘r-iu’. But we
-recommend that you instead do that in two steps. First use ‘ri’ to
-cleanup the feature branch, and then in a second step ‘ru’ to rebase it
-onto ‘master’. That way if things turn out to be more complicated than
-you thought and/or you make a mistake and have to start over, then you
-only have to redo half the work.
-
- Explicitly enabling ‘--interactive’ won’t have an effect on the
-following commands as they always use that argument anyway, even if it
-is not enabled in the transient.
-
-‘r i’ (‘magit-rebase-interactive’)
-
- This command starts an interactive rebase sequence.
-
-‘r f’ (‘magit-rebase-autosquash’)
-
- This command combines squash and fixup commits with their intended
- targets.
-
-‘r m’ (‘magit-rebase-edit-commit’)
-
- This command starts an interactive rebase sequence that lets the
- user edit a single older commit.
-
-‘r w’ (‘magit-rebase-reword-commit’)
-
- This command starts an interactive rebase sequence that lets the
- user reword a single older commit.
-
-‘r k’ (‘magit-rebase-remove-commit’)
-
- This command removes a single older commit using rebase.
-
- When a rebase is in progress, then the transient instead features the
-following suffix commands.
-
-‘r r’ (‘magit-rebase-continue’)
-
- This command restart the current rebasing operation.
-
- In some cases this pops up a commit message buffer for you do edit.
- With a prefix argument the old message is reused as-is.
-
-‘r s’ (‘magit-rebase-skip’)
-
- This command skips the current commit and restarts the current
- rebase operation.
-
-‘r e’ (‘magit-rebase-edit’)
-
- This command lets the user edit the todo list of the current rebase
- operation.
-
-‘r a’ (‘magit-rebase-abort’)
-
- This command aborts the current rebase operation, restoring the
- original branch.
-
-* Menu:
-
-* Editing Rebase Sequences::
-* Information About In-Progress Rebase::
-
-
-File: magit.info, Node: Editing Rebase Sequences, Next: Information About In-Progress Rebase, Up: Rebasing
-
-6.9.1 Editing Rebase Sequences
-------------------------------
-
-‘C-c C-c’ (‘with-editor-finish’)
-
- Finish the current editing session by returning with exit code 0.
- Git then uses the rebase instructions it finds in the file.
-
-‘C-c C-k’ (‘with-editor-cancel’)
-
- Cancel the current editing session by returning with exit code 1.
- Git then forgoes starting the rebase sequence.
-
-‘RET’ (‘git-rebase-show-commit’)
-
- Show the commit on the current line in another buffer and select
- that buffer.
-
-‘SPC’ (‘git-rebase-show-or-scroll-up’)
-
- Show the commit on the current line in another buffer without
- selecting that buffer. If the revision buffer is already visible
- in another window of the current frame, then instead scroll that
- window up.
-
-‘DEL’ (‘git-rebase-show-or-scroll-down’)
-
- Show the commit on the current line in another buffer without
- selecting that buffer. If the revision buffer is already visible
- in another window of the current frame, then instead scroll that
- window down.
-
-‘p’ (‘git-rebase-backward-line’)
-
- Move to previous line.
-
-‘n’ (‘forward-line’)
-
- Move to next line.
-
-‘M-p’ (‘git-rebase-move-line-up’)
-
- Move the current commit (or command) up.
-
-‘M-n’ (‘git-rebase-move-line-down’)
-
- Move the current commit (or command) down.
-
-‘r’ (‘git-rebase-reword’)
-
- Edit message of commit on current line.
-
-‘e’ (‘git-rebase-edit’)
-
- Stop at the commit on the current line.
-
-‘s’ (‘git-rebase-squash’)
-
- Meld commit on current line into previous commit, and edit message.
-
-‘f’ (‘git-rebase-fixup’)
-
- Meld commit on current line into previous commit, discarding the
- current commit’s message.
-
-‘k’ (‘git-rebase-kill-line’)
-
- Kill the current action line.
-
-‘c’ (‘git-rebase-pick’)
-
- Use commit on current line.
-
-‘x’ (‘git-rebase-exec’)
-
- Insert a shell command to be run after the proceeding commit.
-
- If there already is such a command on the current line, then edit
- that instead. With a prefix argument insert a new command even
- when there already is one on the current line. With empty input
- remove the command on the current line, if any.
-
-‘b’ (‘git-rebase-break’)
-
- Insert a break action before the current line, instructing Git to
- return control to the user.
-
-‘y’ (‘git-rebase-insert’)
-
- Read an arbitrary commit and insert it below current line.
-
-‘C-x u’ (‘git-rebase-undo’)
-
- Undo some previous changes. Like ‘undo’ but works in read-only
- buffers.
-
- -- User Option: git-rebase-auto-advance
-
- Whether to move to next line after changing a line.
-
- -- User Option: git-rebase-show-instructions
-
- Whether to show usage instructions inside the rebase buffer.
-
- -- User Option: git-rebase-confirm-cancel
-
- Whether confirmation is required to cancel.
-
- When a rebase is performed with the ‘--rebase-merges’ option, the
-sequence will include a few other types of actions and the following
-commands become relevant.
-
-‘l’ (‘git-rebase-label’)
-
- This commands inserts a label action or edits the one at point.
-
-‘t’ (‘git-rebase-reset’)
-
- This command inserts a reset action or edits the one at point. The
- prompt will offer the labels that are currently present in the
- buffer.
-
-‘MM’ (‘git-rebase-merge’)
-
- The command inserts a merge action or edits the one at point. The
- prompt will offer the labels that are currently present in the
- buffer. Specifying a message to reuse via ‘-c’ or ‘-C’ is not
- supported; an editor will always be invoked for the merge.
-
-‘Mt’ (‘git-rebase-merge-toggle-editmsg’)
-
- This command toggles between the ‘-C’ and ‘-c’ options of the merge
- action at point. These options both specify a commit whose message
- should be reused. The lower-case variant instructs Git to invoke
- the editor when creating the merge, allowing the user to edit the
- message.
-
-
-File: magit.info, Node: Information About In-Progress Rebase, Prev: Editing Rebase Sequences, Up: Rebasing
-
-6.9.2 Information About In-Progress Rebase
-------------------------------------------
-
-While a rebase sequence is in progress, the status buffer features a
-section that lists the commits that have already been applied as well as
-the commits that still have to be applied.
-
- The commits are split in two halves. When rebase stops at a commit,
-either because the user has to deal with a conflict or because s/he
-explicitly requested that rebase stops at that commit, then point is
-placed on the commit that separates the two groups, i.e. on ‘HEAD’.
-The commits above it have not been applied yet, while the ‘HEAD’ and the
-commits below it have already been applied. In between these two groups
-of applied and yet-to-be applied commits, there sometimes is a commit
-which has been dropped.
-
- Each commit is prefixed with a word and these words are additionally
-shown in different colors to indicate the status of the commits.
-
- The following colors are used:
-
- • Yellow commits have not been applied yet.
-
- • Gray commits have already been applied.
-
- • The blue commit is the ‘HEAD’ commit.
-
- • The green commit is the commit the rebase sequence stopped at. If
- this is the same commit as ‘HEAD’ (e.g. because you haven’t done
- anything yet after rebase stopped at the commit, then this commit
- is shown in blue, not green). There can only be a green *and* a
- blue commit at the same time, if you create one or more new commits
- after rebase stops at a commit.
-
- • Red commits have been dropped. They are shown for reference only,
- e.g. to make it easier to diff.
-
- Of course these colors are subject to the color-theme in use.
-
- The following words are used:
-
- • Commits prefixed with ‘pick’, ‘reword’, ‘edit’, ‘squash’, and
- ‘fixup’ have not been applied yet. These words have the same
- meaning here as they do in the buffer used to edit the rebase
- sequence. See *note Editing Rebase Sequences::. When the
- ‘--rebase-merges’ option was specified, ‘reset’, ‘label’, and
- ‘merge’ lines may also be present.
-
- • Commits prefixed with ‘done’ and ‘onto’ have already been applied.
- It is possible for such a commit to be the ‘HEAD’, in which case it
- is blue. Otherwise it is grey.
-
- • The commit prefixed with ‘onto’ is the commit on top of which
- all the other commits are being re-applied. This commit
- itself did not have to be re-applied, it is the commit rebase
- did rewind to before starting to re-apply other commits.
-
- • Commits prefixed with ‘done’ have already been re-applied.
- This includes commits that have been re-applied but also new
- commits that you have created during the rebase.
-
- • All other commits, those not prefixed with any of the above words,
- are in some way related to the commit at which rebase stopped.
-
- To determine whether a commit is related to the stopped-at commit
- their hashes, trees and patch-ids (1) are being compared. The
- commit message is not used for this purpose.
-
- Generally speaking commits that are related to the stopped-at
- commit can have any of the used colors, though not all color/word
- combinations are possible.
-
- Words used for stopped-at commits are:
-
- • When a commit is prefixed with ‘void’, then that indicates
- that Magit knows for sure that all the changes in that commit
- have been applied using several new commits. This commit is
- no longer reachable from ‘HEAD’, and it also isn’t one of the
- commits that will be applied when resuming the session.
-
- • When a commit is prefixed with ‘join’, then that indicates
- that the rebase sequence stopped at that commit due to a
- conflict - you now have to join (merge) the changes with what
- has already been applied. In a sense this is the commit
- rebase stopped at, but while its effect is already in the
- index and in the worktree (with conflict markers), the commit
- itself has not actually been applied yet (it isn’t the
- ‘HEAD’). So it is shown in yellow, like the other commits
- that still have to be applied.
-
- • When a commit is prefixed with ‘stop’ or a _blue_ or _green_
- ‘same’, then that indicates that rebase stopped at this
- commit, that it is still applied or has been applied again,
- and that at least its patch-id is unchanged.
-
- • When a commit is prefixed with ‘stop’, then that
- indicates that rebase stopped at that commit because you
- requested that earlier, and its patch-id is unchanged.
- It might even still be the exact same commit.
-
- • When a commit is prefixed with a _blue_ or _green_
- ‘same’, then that indicates that while its tree or hash
- changed, its patch-id did not. If it is blue, then it is
- the ‘HEAD’ commit (as always for blue). When it is
- green, then it no longer is ‘HEAD’ because other commit
- have been created since (but before continuing the
- rebase).
-
- • When a commit is prefixed with ‘goal’, a _yellow_ ‘same,’ or
- ‘work’, then that indicates that rebase applied that commit
- but that you then reset ‘HEAD’ to an earlier commit (likely to
- split it up into multiple commits), and that there are some
- uncommitted changes remaining which likely (but not
- necessarily) originate from that commit.
-
- • When a commit is prefixed with ‘goal’, then that
- indicates that it is still possible to create a new
- commit with the exact same tree (the "goal") without
- manually editing any files, by committing the index, or
- by staging all changes and then committing that. This is
- the case when the original tree still exists in the index
- or worktree in untainted form.
-
- • When a commit is prefixed with a yellow ‘same’, then that
- indicates that it is no longer possible to create a
- commit with the exact same tree, but that it is still
- possible to create a commit with the same patch-id. This
- would be the case if you created a new commit with other
- changes, but the changes from the original commit still
- exist in the index or working tree in untainted form.
-
- • When a commit is prefixed with ‘work’, then that
- indicates that you reset ‘HEAD’ to an earlier commit, and
- that there are some staged and/or unstaged changes
- (likely, but not necessarily) originating from that
- commit. However it is no longer possible to create a new
- commit with the same tree or at least the same patch-id
- because you have already made other changes.
-
- • When a commit is prefixed with ‘poof’ or ‘gone’, then that
- indicates that rebase applied that commit but that you then
- reset ‘HEAD’ to an earlier commit (likely to split it up into
- multiple commits), and that there are no uncommitted changes.
-
- • When a commit is prefixed with ‘poof’, then that
- indicates that it is no longer reachable from ‘HEAD’, but
- that it has been replaced with one or more commits, which
- together have the exact same effect.
-
- • When a commit is prefixed with ‘gone’, then that
- indicates that it is no longer reachable from ‘HEAD’ and
- that we also cannot determine whether its changes are
- still in effect in one or more new commits. They might
- be, but if so, then there must also be other changes
- which makes it impossible to know for sure.
-
- Do not worry if you do not fully understand the above. That’s okay,
-you will acquire a good enough understanding through practice.
-
- For other sequence operations such as cherry-picking, a similar
-section is displayed, but they lack some of the features described
-above, due to limitations in the git commands used to implement them.
-Most importantly these sequences only support "picking" a commit but not
-other actions such as "rewording", and they do not keep track of the
-commits which have already been applied.
-
- ---------- Footnotes ----------
-
- (1) The patch-id is a hash of the _changes_ introduced by a commit.
-It differs from the hash of the commit itself, which is a hash of the
-result of applying that change (i.e. the resulting trees and blobs) as
-well as author and committer information, the commit message, and the
-hashes of the parents of the commit. The patch-id hash on the other
-hand is created only from the added and removed lines, even line numbers
-and whitespace changes are ignored when calculating this hash. The
-patch-ids of two commits can be used to answer the question "Do these
-commits make the same change?".
-
-
-File: magit.info, Node: Cherry Picking, Next: Resetting, Prev: Rebasing, Up: Manipulating
-
-6.10 Cherry Picking
-===================
-
-Also see *note (gitman)git-cherry-pick::.
-
-‘A’ (‘magit-cherry-pick’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- When no cherry-pick or revert is in progress, then the transient
-features the following suffix commands.
-
-‘A A’ (‘magit-cherry-copy’)
-
- This command copies COMMITS from another branch onto the current
- branch. If the region selects multiple commits, then those are
- copied, without prompting. Otherwise the user is prompted for a
- commit or range, defaulting to the commit at point.
-
-‘A a’ (‘magit-cherry-apply’)
-
- This command applies the changes in COMMITS from another branch
- onto the current branch. If the region selects multiple commits,
- then those are used, without prompting. Otherwise the user is
- prompted for a commit or range, defaulting to the commit at point.
-
- This command also has a top-level binding, which can be invoked
- without using the transient by typing ‘a’ at the top-level.
-
- The following commands not only apply some commits to some branch,
-but also remove them from some other branch. The removal is performed
-using either ‘git-update-ref’ or if necessary ‘git-rebase’. Both
-applying commits as well as removing them using ‘git-rebase’ can lead to
-conflicts. If that happens, then these commands abort and you not only
-have to resolve the conflicts but also finish the process the same way
-you would have to if these commands didn’t exist at all.
-
-‘A h’ (‘magit-cherry-harvest’)
-
- This command moves the selected COMMITS that must be located on
- another BRANCH onto the current branch instead, removing them from
- the former. When this command succeeds, then the same branch is
- current as before.
-
- Applying the commits on the current branch or removing them from
- the other branch can lead to conflicts. When that happens, then
- this command stops and you have to resolve the conflicts and then
- finish the process manually.
-
-‘A d’ (‘magit-cherry-donate’)
-
- This command moves the selected COMMITS from the current branch
- onto another existing BRANCH, removing them from the former. When
- this command succeeds, then the same branch is current as before.
-
- Applying the commits on the other branch or removing them from the
- current branch can lead to conflicts. When that happens, then this
- command stops and you have to resolve the conflicts and then finish
- the process manually.
-
-‘A n’ (‘magit-cherry-spinout’)
-
- This command moves the selected COMMITS from the current branch
- onto a new branch BRANCH, removing them from the former. When this
- command succeeds, then the same branch is current as before.
-
- Applying the commits on the other branch or removing them from the
- current branch can lead to conflicts. When that happens, then this
- command stops and you have to resolve the conflicts and then finish
- the process manually.
-
-‘A s’ (‘magit-cherry-spinoff’)
-
- This command moves the selected COMMITS from the current branch
- onto a new branch BRANCH, removing them from the former. When this
- command succeeds, then the new branch is checked out.
-
- Applying the commits on the other branch or removing them from the
- current branch can lead to conflicts. When that happens, then this
- command stops and you have to resolve the conflicts and then finish
- the process manually.
-
- When a cherry-pick or revert is in progress, then the transient
-instead features the following suffix commands.
-
-‘A A’ (‘magit-sequence-continue’)
-
- Resume the current cherry-pick or revert sequence.
-
-‘A s’ (‘magit-sequence-skip’)
-
- Skip the stopped at commit during a cherry-pick or revert sequence.
-
-‘A a’ (‘magit-sequence-abort’)
-
- Abort the current cherry-pick or revert sequence. This discards
- all changes made since the sequence started.
-
-* Menu:
-
-* Reverting::
-
-
-File: magit.info, Node: Reverting, Up: Cherry Picking
-
-6.10.1 Reverting
-----------------
-
-‘V’ (‘magit-revert’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- When no cherry-pick or revert is in progress, then the transient
-features the following suffix commands.
-
-‘V V’ (‘magit-revert-and-commit’)
-
- Revert a commit by creating a new commit. Prompt for a commit,
- defaulting to the commit at point. If the region selects multiple
- commits, then revert all of them, without prompting.
-
-‘V v’ (‘magit-revert-no-commit’)
-
- Revert a commit by applying it in reverse to the working tree.
- Prompt for a commit, defaulting to the commit at point. If the
- region selects multiple commits, then revert all of them, without
- prompting.
-
- When a cherry-pick or revert is in progress, then the transient
-instead features the following suffix commands.
-
-‘V A’ (‘magit-sequence-continue’)
-
- Resume the current cherry-pick or revert sequence.
-
-‘V s’ (‘magit-sequence-skip’)
-
- Skip the stopped at commit during a cherry-pick or revert sequence.
-
-‘V a’ (‘magit-sequence-abort’)
-
- Abort the current cherry-pick or revert sequence. This discards
- all changes made since the sequence started.
-
-
-File: magit.info, Node: Resetting, Next: Stashing, Prev: Cherry Picking, Up: Manipulating
-
-6.11 Resetting
-==============
-
-Also see *note (gitman)git-reset::.
-
-‘x’ (‘magit-reset-quickly’)
-
- Reset the ‘HEAD’ and index to some commit read from the user and
- defaulting to the commit at point, and possibly also reset the
- working tree. With a prefix argument reset the working tree
- otherwise don’t.
-
-‘X m’ (‘magit-reset-mixed’)
-
- Reset the ‘HEAD’ and index to some commit read from the user and
- defaulting to the commit at point. The working tree is kept as-is.
-
-‘X s’ (‘magit-reset-soft’)
-
- Reset the ‘HEAD’ to some commit read from the user and defaulting
- to the commit at point. The index and the working tree are kept
- as-is.
-
-‘X h’ (‘magit-reset-hard’)
-
- Reset the ‘HEAD’, index, and working tree to some commit read from
- the user and defaulting to the commit at point.
-
-‘X k’ (‘magit-reset-keep’)
-
- Reset the ‘HEAD’, index, and working tree to some commit read from
- the user and defaulting to the commit at point. Uncommitted
- changes are kept as-is.
-
-‘X i’ (‘magit-reset-index’)
-
- Reset the index to some commit read from the user and defaulting to
- the commit at point. Keep the ‘HEAD’ and working tree as-is, so if
- the commit refers to the ‘HEAD’, then this effectively unstages all
- changes.
-
-‘X w’ (‘magit-reset-worktree’)
-
- Reset the working tree to some commit read from the user and
- defaulting to the commit at point. Keep the ‘HEAD’ and index
- as-is.
-
-‘X f’ (‘magit-file-checkout’)
-
- Update file in the working tree and index to the contents from a
- revision. Both the revision and file are read from the user.
-
-
-File: magit.info, Node: Stashing, Prev: Resetting, Up: Manipulating
-
-6.12 Stashing
-=============
-
-Also see *note (gitman)git-stash::.
-
-‘z’ (‘magit-stash’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘z z’ (‘magit-stash-both’)
-
- Create a stash of the index and working tree. Untracked files are
- included according to infix arguments. One prefix argument is
- equivalent to ‘--include-untracked’ while two prefix arguments are
- equivalent to ‘--all’.
-
-‘z i’ (‘magit-stash-index’)
-
- Create a stash of the index only. Unstaged and untracked changes
- are not stashed.
-
-‘z w’ (‘magit-stash-worktree’)
-
- Create a stash of unstaged changes in the working tree. Untracked
- files are included according to infix arguments. One prefix
- argument is equivalent to ‘--include-untracked’ while two prefix
- arguments are equivalent to ‘--all’.
-
-‘z x’ (‘magit-stash-keep-index’)
-
- Create a stash of the index and working tree, keeping index intact.
- Untracked files are included according to infix arguments. One
- prefix argument is equivalent to ‘--include-untracked’ while two
- prefix arguments are equivalent to ‘--all’.
-
-‘z Z’ (‘magit-snapshot-both’)
-
- Create a snapshot of the index and working tree. Untracked files
- are included according to infix arguments. One prefix argument is
- equivalent to ‘--include-untracked’ while two prefix arguments are
- equivalent to ‘--all’.
-
-‘z I’ (‘magit-snapshot-index’)
-
- Create a snapshot of the index only. Unstaged and untracked
- changes are not stashed.
-
-‘z W’ (‘magit-snapshot-worktree’)
-
- Create a snapshot of unstaged changes in the working tree.
- Untracked files are included according to infix arguments. One
- prefix argument is equivalent to ‘--include-untracked’ while two
- prefix arguments are equivalent to ‘--all’-.
-
-‘z a’ (‘magit-stash-apply’)
-
- Apply a stash to the working tree. Try to preserve the stash
- index. If that fails because there are staged changes, apply
- without preserving the stash index.
-
-‘z p’ (‘magit-stash-pop’)
-
- Apply a stash to the working tree and remove it from stash list.
- Try to preserve the stash index. If that fails because there are
- staged changes, apply without preserving the stash index and forgo
- removing the stash.
-
-‘z k’ (‘magit-stash-drop’)
-
- Remove a stash from the stash list. When the region is active,
- offer to drop all contained stashes.
-
-‘z v’ (‘magit-stash-show’)
-
- Show all diffs of a stash in a buffer.
-
-‘z b’ (‘magit-stash-branch’)
-
- Create and checkout a new BRANCH from STASH. The branch starts at
- the commit that was current when the stash was created.
-
-‘z B’ (‘magit-stash-branch-here’)
-
- Create and checkout a new BRANCH using ‘magit-branch’ with the
- current branch or ‘HEAD’ as the starting-point. Then apply STASH,
- dropping it if it applies cleanly.
-
-‘z f’ (‘magit-stash-format-patch’)
-
- Create a patch from STASH.
-
-‘k’ (‘magit-stash-clear’)
-
- Remove all stashes saved in REF’s reflog by deleting REF.
-
-‘z l’ (‘magit-stash-list’)
-
- List all stashes in a buffer.
-
- -- User Option: magit-stashes-margin
-
- This option specifies whether the margin is initially shown in
- stashes buffers and how it is formatted.
-
- The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’.
-
- • If INIT is non-nil, then the margin is shown initially.
-
- • STYLE controls how to format the author or committer date. It
- can be one of ‘age’ (to show the age of the commit),
- ‘age-abbreviated’ (to abbreviate the time unit to a
- character), or a string (suitable for ‘format-time-string’) to
- show the actual date. Option
- ‘magit-log-margin-show-committer-date’ controls which date is
- being displayed.
-
- • WIDTH controls the width of the margin. This exists for
- forward compatibility and currently the value should not be
- changed.
-
- • AUTHOR controls whether the name of the author is also shown
- by default.
-
- • AUTHOR-WIDTH has to be an integer. When the name of the
- author is shown, then this specifies how much space is used to
- do so.
-
-
-File: magit.info, Node: Transferring, Next: Miscellaneous, Prev: Manipulating, Up: Top
-
-7 Transferring
-**************
-
-* Menu:
-
-* Remotes::
-* Fetching::
-* Pulling::
-* Pushing::
-* Plain Patches::
-* Maildir Patches::
-
-
-File: magit.info, Node: Remotes, Next: Fetching, Up: Transferring
-
-7.1 Remotes
-===========
-
-* Menu:
-
-* Remote Commands::
-* Remote Git Variables::
-
-
-File: magit.info, Node: Remote Commands, Next: Remote Git Variables, Up: Remotes
-
-7.1.1 Remote Commands
----------------------
-
-The transient prefix command ‘magit-remote’ is used to add remotes and
-to make changes to existing remotes. This command only deals with
-remotes themselves, not with branches or the transfer of commits. Those
-features are available from separate transient commands.
-
- Also see *note (gitman)git-remote::.
-
-‘M’ (‘magit-remote’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
- By default it also binds and displays the values of some
- remote-related Git variables and allows changing their values.
-
- -- User Option: magit-remote-direct-configure
-
- This option controls whether remote-related Git variables are
- accessible directly from the transient ‘magit-remote’.
-
- If ‘t’ (the default) and a local branch is checked out, then
- ‘magit-remote’ features the variables for the upstream remote of
- that branch, or if ‘HEAD’ is detached, for ‘origin’, provided that
- exists.
-
- If ‘nil’, then ‘magit-remote-configure’ has to be used to do so.
-
-‘M C’ (‘magit-remote-configure’)
-
- This transient prefix command binds commands that set the value of
- remote-related variables and displays them in a temporary buffer
- until the transient is exited.
-
- With a prefix argument, this command always prompts for a remote.
-
- Without a prefix argument this depends on whether it was invoked as
- a suffix of ‘magit-remote’ and on the
- ‘magit-remote-direct-configure’ option. If ‘magit-remote’ already
- displays the variables for the upstream, then it does not make
- sense to invoke another transient that displays them for the same
- remote. In that case this command prompts for a remote.
-
- The variables are described in *note Remote Git Variables::.
-
-‘M a’ (‘magit-remote-add’)
-
- This command add a remote and fetches it. The remote name and url
- are read in the minibuffer.
-
-‘M r’ (‘magit-remote-rename’)
-
- This command renames a remote. Both the old and the new names are
- read in the minibuffer.
-
-‘M u’ (‘magit-remote-set-url’)
-
- This command changes the url of a remote. Both the remote and the
- new url are read in the minibuffer.
-
-‘M k’ (‘magit-remote-remove’)
-
- This command deletes a remote, read in the minibuffer.
-
-‘M p’ (‘magit-remote-prune’)
-
- This command removes stale remote-tracking branches for a remote
- read in the minibuffer.
-
-‘M P’ (‘magit-remote-prune-refspecs’)
-
- This command removes stale refspecs for a remote read in the
- minibuffer.
-
- A refspec is stale if there no longer exists at least one branch on
- the remote that would be fetched due to that refspec. A stale
- refspec is problematic because its existence causes Git to refuse
- to fetch according to the remaining non-stale refspecs.
-
- If only stale refspecs remain, then this command offers to either
- delete the remote or to replace the stale refspecs with the default
- refspec ("+refs/heads/*:refs/remotes/REMOTE/*").
-
- This command also removes the remote-tracking branches that were
- created due to the now stale refspecs. Other stale branches are
- not removed.
-
- -- User Option: magit-remote-add-set-remote.pushDefault
-
- This option controls whether the user is asked whether they want to
- set ‘remote.pushDefault’ after adding a remote.
-
- If ‘ask’, then users is always ask. If ‘ask-if-unset’, then the
- user is only if the variable isn’t set already. If ‘nil’, then the
- user isn’t asked and the variable isn’t set. If the value is a
- string, then the variable is set without the user being asked,
- provided that the name of the added remote is equal to that string
- and the variable isn’t already set.
-
-
-File: magit.info, Node: Remote Git Variables, Prev: Remote Commands, Up: Remotes
-
-7.1.2 Remote Git Variables
---------------------------
-
-These variables can be set from the transient prefix command
-‘magit-remote-configure’. By default they can also be set from
-‘magit-remote’. See *note Remote Commands::.
-
- -- Variable: remote.NAME.url
-
- This variable specifies the url of the remote named NAME. It can
- have multiple values.
-
- -- Variable: remote.NAME.fetch
-
- The refspec used when fetching from the remote named NAME. It can
- have multiple values.
-
- -- Variable: remote.NAME.pushurl
-
- This variable specifies the url used for fetching from the remote
- named NAME. If it is not specified, then ‘remote.NAME.url’ is used
- instead. It can have multiple values.
-
- -- Variable: remote.NAME.push
-
- The refspec used when pushing to the remote named NAME. It can
- have multiple values.
-
- -- Variable: remote.NAME.tagOpts
-
- This variable specifies what tags are fetched by default. If the
- value is ‘--no-tags’ then no tags are fetched. If the value is
- ‘--tags’, then all tags are fetched. If this variable has no
- value, then only tags are fetched that are reachable from fetched
- branches.
-
-
-File: magit.info, Node: Fetching, Next: Pulling, Prev: Remotes, Up: Transferring
-
-7.2 Fetching
-============
-
-Also see *note (gitman)git-fetch::. For information about the upstream
-and the push-remote, see *note The Two Remotes::.
-
-‘f’ (‘magit-fetch’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘f p’ (‘magit-fetch-from-pushremote’)
-
- This command fetches from the current push-remote.
-
- With a prefix argument or when the push-remote is either not
- configured or unusable, then let the user first configure the
- push-remote.
-
-‘f u’ (‘magit-fetch-from-upstream’)
-
- This command fetch from the upstream of the current branch.
-
- If the upstream is configured for the current branch and names an
- existing remote, then use that. Otherwise try to use another
- remote: If only a single remote is configured, then use that.
- Otherwise if a remote named "origin" exists, then use that.
-
- If no remote can be determined, then this command is not available
- from the ‘magit-fetch’ transient prefix and invoking it directly
- results in an error.
-
-‘f e’ (‘magit-fetch-other’)
-
- This command fetch from a repository read from the minibuffer.
-
-‘f o’ (‘magit-fetch-branch’)
-
- This command fetches a branch from a remote, both of which are read
- from the minibuffer.
-
-‘f r’ (‘magit-fetch-refspec’)
-
- This command fetches from a remote using an explicit refspec, both
- of which are read from the minibuffer.
-
-‘f a’ (‘magit-fetch-all’)
-
- This command fetches from all remotes.
-
-‘f m’ (‘magit-submodule-fetch’)
-
- This command fetches all submodules. With a prefix argument it
- fetches all remotes of all submodules.
-
- -- User Option: magit-pull-or-fetch
-
- By default fetch and pull commands are available from separate
- transient prefix command. Setting this to ‘t’ adds some (but not
- all) of the above suffix commands to the ‘magit-pull’ transient.
-
- If you do that, then you might also want to change the key binding
- for these prefix commands, e.g.:
-
- (setq magit-pull-or-fetch t)
- (define-key magit-mode-map "f" 'magit-pull) ; was magit-fetch
- (define-key magit-mode-map "F" nil) ; was magit-pull
-
-
-File: magit.info, Node: Pulling, Next: Pushing, Prev: Fetching, Up: Transferring
-
-7.3 Pulling
-===========
-
-Also see *note (gitman)git-pull::. For information about the upstream
-and the push-remote, see *note The Two Remotes::.
-
-‘F’ (‘magit-pull’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
-‘F p’ (‘magit-pull-from-pushremote’)
-
- This command pulls from the push-remote of the current branch.
-
- With a prefix argument or when the push-remote is either not
- configured or unusable, then let the user first configure the
- push-remote.
-
-‘F u’ (‘magit-pull-from-upstream’)
-
- This command pulls from the upstream of the current branch.
-
- With a prefix argument or when the upstream is either not
- configured or unusable, then let the user first configure the
- upstream.
-
-‘F e’ (‘magit-pull-branch’)
-
- This command pulls from a branch read in the minibuffer.
-
-
-File: magit.info, Node: Pushing, Next: Plain Patches, Prev: Pulling, Up: Transferring
-
-7.4 Pushing
-===========
-
-Also see *note (gitman)git-push::. For information about the upstream
-and the push-remote, see *note The Two Remotes::.
-
-‘P’ (‘magit-push’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘P p’ (‘magit-push-current-to-pushremote’)
-
- This command pushes the current branch to its push-remote.
-
- With a prefix argument or when the push-remote is either not
- configured or unusable, then let the user first configure the
- push-remote.
-
-‘P u’ (‘magit-push-current-to-upstream’)
-
- This command pushes the current branch to its upstream branch.
-
- With a prefix argument or when the upstream is either not
- configured or unusable, then let the user first configure the
- upstream.
-
-‘P e’ (‘magit-push-current’)
-
- This command pushes the current branch to a branch read in the
- minibuffer.
-
-‘P o’ (‘magit-push-other’)
-
- This command pushes an arbitrary branch or commit somewhere. Both
- the source and the target are read in the minibuffer.
-
-‘P r’ (‘magit-push-refspecs’)
-
- This command pushes one or multiple refspecs to a remote, both of
- which are read in the minibuffer.
-
- To use multiple refspecs, separate them with commas. Completion is
- only available for the part before the colon, or when no colon is
- used.
-
-‘P m’ (‘magit-push-matching’)
-
- This command pushes all matching branches to another repository.
-
- If only one remote exists, then push to that. Otherwise prompt for
- a remote, offering the remote configured for the current branch as
- default.
-
-‘P t’ (‘magit-push-tags’)
-
- This command pushes all tags to another repository.
-
- If only one remote exists, then push to that. Otherwise prompt for
- a remote, offering the remote configured for the current branch as
- default.
-
-‘P T’ (‘magit-push-tag’)
-
- This command pushes a tag to another repository.
-
- Two more push commands exist, which by default are not available from
-the push transient. See their doc-strings for instructions on how to
-add them to the transient.
-
- -- Command: magit-push-implicitly args
-
- This command pushes somewhere without using an explicit refspec.
-
- This command simply runs ‘git push -v [ARGS]’. ARGS are the infix
- arguments. No explicit refspec arguments are used. Instead the
- behavior depends on at least these Git variables: ‘push.default’,
- ‘remote.pushDefault’, ‘branch.<branch>.pushRemote’,
- ‘branch.<branch>.remote’, ‘branch.<branch>.merge’, and
- ‘remote.<remote>.push’.
-
- -- Command: magit-push-to-remote remote args
-
- This command pushes to the remote REMOTE without using an explicit
- refspec. The remote is read in the minibuffer.
-
- This command simply runs ‘git push -v [ARGS] REMOTE’. ARGS are the
- infix arguments. No refspec arguments are used. Instead the
- behavior depends on at least these Git variables: ‘push.default’,
- ‘remote.pushDefault’, ‘branch.<branch>.pushRemote’,
- ‘branch.<branch>.remote’, ‘branch.<branch>.merge’, and
- ‘remote.<remote>.push’.
-
-
-File: magit.info, Node: Plain Patches, Next: Maildir Patches, Prev: Pushing, Up: Transferring
-
-7.5 Plain Patches
-=================
-
-‘W’ (‘magit-patch’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘W c’ (‘magit-patch-create’)
-
- This command creates patches for a set commits. If the region
- marks several commits, then it creates patches for all of them.
- Otherwise it functions as a transient prefix command, which
- features several infix arguments and binds itself as a suffix
- command. When this command is invoked as a suffix of itself, then
- it creates a patch using the specified infix arguments.
-
-‘w a’ (‘magit-patch-apply’)
-
- This command applies a patch. This is a transient prefix command,
- which features several infix arguments and binds itself as a suffix
- command. When this command is invoked as a suffix of itself, then
- it applies a patch using the specified infix arguments.
-
-‘W s’ (‘magit-patch-save’)
-
- This command creates a patch from the current diff.
-
- Inside ‘magit-diff-mode’ or ‘magit-revision-mode’ buffers, ‘C-x
- C-w’ is also bound to this command.
-
- It is also possible to save a plain patch file by using ‘C-x C-w’
-inside a ‘magit-diff-mode’ or ‘magit-revision-mode’ buffer.
-
-
-File: magit.info, Node: Maildir Patches, Prev: Plain Patches, Up: Transferring
-
-7.6 Maildir Patches
-===================
-
-Also see *note (gitman)git-am::. and *note (gitman)git-apply::.
-
-‘w’ (‘magit-am’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘w w’ (‘magit-am-apply-patches’)
-
- This command applies one or more patches. If the region marks
- files, then those are applied as patches. Otherwise this command
- reads a file-name in the minibuffer, defaulting to the file at
- point.
-
-‘w m’ (‘magit-am-apply-maildir’)
-
- This command applies patches from a maildir.
-
-‘w a’ (‘magit-patch-apply’)
-
- This command applies a plain patch. For a longer description see
- *note Plain Patches::. This command is only available from the
- ‘magit-am’ transient for historic reasons.
-
- When an "am" operation is in progress, then the transient instead
-features the following suffix commands.
-
-‘w w’ (‘magit-am-continue’)
-
- This command resumes the current patch applying sequence.
-
-‘w s’ (‘magit-am-skip’)
-
- This command skips the stopped at patch during a patch applying
- sequence.
-
-‘w a’ (‘magit-am-abort’)
-
- This command aborts the current patch applying sequence. This
- discards all changes made since the sequence started.
-
-
-File: magit.info, Node: Miscellaneous, Next: Customizing, Prev: Transferring, Up: Top
-
-8 Miscellaneous
-***************
-
-* Menu:
-
-* Tagging::
-* Notes::
-* Submodules::
-* Subtree::
-* Worktree::
-* Common Commands::
-* Wip Modes::
-* Minor Mode for Buffers Visiting Files::
-* Minor Mode for Buffers Visiting Blobs::
-
-
-File: magit.info, Node: Tagging, Next: Notes, Up: Miscellaneous
-
-8.1 Tagging
-===========
-
-Also see *note (gitman)git-tag::.
-
-‘t’ (‘magit-tag’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘t t’ (‘magit-tag-create’)
-
- This command creates a new tag with the given NAME at REV. With a
- prefix argument it creates an annotate tag.
-
-‘t r’ (‘magit-tag-release’)
-
- This commands creates a release tag. It assumes that release tags
- match ‘magit-release-tag-regexp’.
-
- First it prompts for the name of the new tag using the highest
- existing tag as initial input and leaving it to the user to
- increment the desired part of the version string. If you use
- unconventional release tags or version numbers (e.g.,
- ‘v1.2.3-custom.1’), you can set the ‘magit-release-tag-regexp’ and
- ‘magit-tag-version-regexp-alist’ variables.
-
- If ‘--annotate’ is enabled then it prompts for the message of the
- new tag. The proposed tag message is based on the message of the
- highest tag, provided that that contains the corresponding version
- string and substituting the new version string for that. Otherwise
- it proposes something like "Foo-Bar 1.2.3", given, for example, a
- TAG "v1.2.3" and a repository located at something like
- "/path/to/foo-bar".
-
-‘t k’ (‘magit-tag-delete’)
-
- This command deletes one or more tags. If the region marks
- multiple tags (and nothing else), then it offers to delete those.
- Otherwise, it prompts for a single tag to be deleted, defaulting to
- the tag at point.
-
-‘t p’ (‘magit-tag-prune’)
-
- This command offers to delete tags missing locally from REMOTE, and
- vice versa.
-
-
-File: magit.info, Node: Notes, Next: Submodules, Prev: Tagging, Up: Miscellaneous
-
-8.2 Notes
-=========
-
-Also see *note (gitman)git-notes::.
-
-‘T’ (‘magit-notes’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
-‘T T’ (‘magit-notes-edit’)
-
- Edit the note attached to a commit, defaulting to the commit at
- point.
-
- By default use the value of Git variable ‘core.notesRef’ or
- "refs/notes/commits" if that is undefined.
-
-‘T r’ (‘magit-notes-remove’)
-
- Remove the note attached to a commit, defaulting to the commit at
- point.
-
- By default use the value of Git variable ‘core.notesRef’ or
- "refs/notes/commits" if that is undefined.
-
-‘T p’ (‘magit-notes-prune’)
-
- Remove notes about unreachable commits.
-
- It is possible to merge one note ref into another. That may result
-in conflicts which have to resolved in the temporary worktree
-".git/NOTES_MERGE_WORKTREE".
-
-‘T m’ (‘magit-notes-merge’)
-
- Merge the notes of a ref read from the user into the current notes
- ref. The current notes ref is the value of Git variable
- ‘core.notesRef’ or "refs/notes/commits" if that is undefined.
-
- When a notes merge is in progress then the transient features the
-following suffix commands, instead of those listed above.
-
-‘T c’ (‘magit-notes-merge-commit’)
-
- Commit the current notes ref merge, after manually resolving
- conflicts.
-
-‘T a’ (‘magit-notes-merge-abort’)
-
- Abort the current notes ref merge.
-
- The following variables control what notes reference ‘magit-notes-*’,
-‘git notes’ and ‘git show’ act on and display. Both the local and
-global values are displayed and can be modified.
-
- -- Variable: core.notesRef
-
- This variable specifies the notes ref that is displayed by default
- and which commands act on by default.
-
- -- Variable: notes.displayRef
-
- This variable specifies additional notes ref to be displayed in
- addition to the ref specified by ‘core.notesRef’. It can have
- multiple values and may end with ‘*’ to display all refs in the
- ‘refs/notes/’ namespace (or ‘**’ if some names contain slashes).
-
-
-File: magit.info, Node: Submodules, Next: Subtree, Prev: Notes, Up: Miscellaneous
-
-8.3 Submodules
-==============
-
-Also see *note (gitman)git-submodule::.
-
-* Menu:
-
-* Listing Submodules::
-* Submodule Transient::
-
-
-File: magit.info, Node: Listing Submodules, Next: Submodule Transient, Up: Submodules
-
-8.3.1 Listing Submodules
-------------------------
-
-The command ‘magit-list-submodules’ displays a list of the current
-repository’s submodules in a separate buffer. It’s also possible to
-display information about submodules directly in the status buffer of
-the super-repository by adding ‘magit-insert-modules’ to the hook
-‘magit-status-sections-hook’ as described in *note Status Module
-Sections::.
-
- -- Command: magit-list-submodules
-
- This command displays a list of the current repository’s submodules
- in a separate buffer.
-
- It can be invoked by pressing ‘RET’ on the section titled
- "Modules".
-
- -- User Option: magit-submodule-list-columns
-
- This option controls what columns are displayed by the command
- ‘magit-list-submodules’ and how they are displayed.
-
- Each element has the form ‘(HEADER WIDTH FORMAT PROPS)’.
-
- HEADER is the string displayed in the header. WIDTH is the width
- of the column. FORMAT is a function that is called with one
- argument, the repository identification (usually its basename), and
- with ‘default-directory’ bound to the toplevel of its working tree.
- It has to return a string to be inserted or nil. PROPS is an alist
- that supports the keys ‘:right-align’ and ‘:pad-right’.
-
-
-File: magit.info, Node: Submodule Transient, Prev: Listing Submodules, Up: Submodules
-
-8.3.2 Submodule Transient
--------------------------
-
-‘o’ (‘magit-submodule’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- Some of the below commands default to act on the modules that are
-selected using the region. For brevity their description talk about
-"the selected modules", but if no modules are selected, then they act on
-the current module instead, or if point isn’t on a module, then the read
-a single module to act on. With a prefix argument these commands ignore
-the selection and the current module and instead act on all suitable
-modules.
-
-‘o a’ (‘magit-submodule-add’)
-
- This commands adds the repository at URL as a module. Optional
- PATH is the path to the module relative to the root of the
- super-project. If it is nil then the path is determined based on
- URL.
-
-‘o r’ (‘magit-submodule-register’)
-
- This command registers the selected modules by copying their urls
- from ".gitmodules" to "$GIT_DIR/config". These values can then be
- edited before running ‘magit-submodule-populate’. If you don’t
- need to edit any urls, then use the latter directly.
-
-‘o p’ (‘magit-submodule-populate’)
-
- This command creates the working directory or directories of the
- selected modules, checking out the recorded commits.
-
-‘o u’ (‘magit-submodule-update’)
-
- This command updates the selected modules checking out the recorded
- commits.
-
-‘o s’ (‘magit-submodule-synchronize’)
-
- This command synchronizes the urls of the selected modules, copying
- the values from ".gitmodules" to the ".git/config" of the
- super-project as well those of the modules.
-
-‘o d’ (‘magit-submodule-unpopulate’)
-
- This command removes the working directory of the selected modules.
-
-‘o l’ (‘magit-list-submodules’)
-
- This command displays a list of the current repository’s modules.
-
-‘o f’ (‘magit-fetch-modules’)
-
- This command fetches all modules.
-
- Option ‘magit-fetch-modules-jobs’ controls how many submodules are
- being fetched in parallel. Also fetch the super-repository,
- because ‘git fetch’ does not support not doing that. With a prefix
- argument fetch all remotes.
-
-
-File: magit.info, Node: Subtree, Next: Worktree, Prev: Submodules, Up: Miscellaneous
-
-8.4 Subtree
-===========
-
-Also see *note (gitman)git-subtree::.
-
-‘O’ (‘magit-subtree’)
-
- This transient prefix command binds the two sub-transients; one for
- importing a subtree and one for exporting a subtree.
-
-‘O i’ (‘magit-subtree-import’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- The suffixes of this command import subtrees.
-
- If the ‘--prefix’ argument is set, then the suffix commands use
- that prefix without prompting the user. If it is unset, then they
- read the prefix in the minibuffer.
-
-‘O i a’ (‘magit-subtree-add’)
-
- This command adds COMMIT from REPOSITORY as a new subtree at
- PREFIX.
-
-‘O i c’ (‘magit-subtree-add-commit’)
-
- This command add COMMIT as a new subtree at PREFIX.
-
-‘O i m’ (‘magit-subtree-merge’)
-
- This command merges COMMIT into the PREFIX subtree.
-
-‘O i f’ (‘magit-subtree-pull’)
-
- This command pulls COMMIT from REPOSITORY into the PREFIX subtree.
-
-‘O e’ (‘magit-subtree-export’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- The suffixes of this command export subtrees.
-
- If the ‘--prefix’ argument is set, then the suffix commands use
- that prefix without prompting the user. If it is unset, then they
- read the prefix in the minibuffer.
-
-‘O e p’ (‘magit-subtree-push’)
-
- This command extract the history of the subtree PREFIX and pushes
- it to REF on REPOSITORY.
-
-‘O e s’ (‘magit-subtree-split’)
-
- This command extracts the history of the subtree PREFIX.
-
-
-File: magit.info, Node: Worktree, Next: Common Commands, Prev: Subtree, Up: Miscellaneous
-
-8.5 Worktree
-============
-
-Also see *note (gitman)git-worktree::.
-
-‘%’ (‘magit-worktree’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
-‘% b’ (‘magit-worktree-checkout’)
-
- Checkout BRANCH in a new worktree at PATH.
-
-‘% c’ (‘magit-worktree-branch’)
-
- Create a new BRANCH and check it out in a new worktree at PATH.
-
-‘% m’ (‘magit-worktree-move’)
-
- Move an existing worktree to a new PATH.
-
-‘% k’ (‘magit-worktree-delete’)
-
- Delete a worktree, defaulting to the worktree at point. The
- primary worktree cannot be deleted.
-
-‘% g’ (‘magit-worktree-status’)
-
- Show the status for the worktree at point.
-
- If there is no worktree at point, then read one in the minibuffer.
- If the worktree at point is the one whose status is already being
- displayed in the current buffer, then show it in Dired instead.
-
-
-File: magit.info, Node: Common Commands, Next: Wip Modes, Prev: Worktree, Up: Miscellaneous
-
-8.6 Common Commands
-===================
-
-These are some of the commands that can be used in all buffers whose
-major-modes derive from ‘magit-mode’. There are other common commands
-beside the ones below, but these didn’t fit well anywhere else.
-
-‘C-w’ (‘magit-copy-section-value’)
-
- This command saves the value of the current section to the
- ‘kill-ring’, and, provided that the current section is a commit,
- branch, or tag section, it also pushes the (referenced) revision to
- the ‘magit-revision-stack’.
-
- When the current section is a branch or a tag, and a prefix
- argument is used, then it saves the revision at its tip to the
- ‘kill-ring’ instead of the reference name.
-
- When the region is active, this command saves that to the
- ‘kill-ring’, like ‘kill-ring-save’ would, instead of behaving as
- described above. If a prefix argument is used and the region is
- within a hunk, it strips the outer diff marker column before saving
- the text.
-
-‘M-w’ (‘magit-copy-buffer-revision’)
-
- This command saves the revision being displayed in the current
- buffer to the ‘kill-ring’ and also pushes it to the
- ‘magit-revision-stack’. It is mainly intended for use in
- ‘magit-revision-mode’ buffers, the only buffers where it is always
- unambiguous exactly which revision should be saved.
-
- Most other Magit buffers usually show more than one revision, in
- some way or another, so this command has to select one of them, and
- that choice might not always be the one you think would have been
- the best pick.
-
- Outside of Magit ‘M-w’ and ‘C-w’ are usually bound to
-‘kill-ring-save’ and ‘kill-region’, and these commands would also be
-useful in Magit buffers. Therefore when the region is active, then both
-of these commands behave like ‘kill-ring-save’ instead of as described
-above.
-
diff --git a/elpa/magit-20200728.45/magit.info-2 b/elpa/magit-20200728.45/magit.info-2
deleted file mode 100644
index 8df6f30..0000000
--- a/elpa/magit-20200728.45/magit.info-2
+++ /dev/null
@@ -1,3526 +0,0 @@
-This is magit.info, produced by makeinfo version 6.5 from magit.texi.
-
- Copyright (C) 2015-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Magit: (magit). Using Git from Emacs with Magit.
-END-INFO-DIR-ENTRY
-
-
-File: magit.info, Node: Wip Modes, Next: Minor Mode for Buffers Visiting Files, Prev: Common Commands, Up: Miscellaneous
-
-8.7 Wip Modes
-=============
-
-Git keeps *committed* changes around long enough for users to recover
-changes they have accidentally deleted. It does so by not garbage
-collecting any committed but no longer referenced objects for a certain
-period of time, by default 30 days.
-
- But Git does *not* keep track of *uncommitted* changes in the working
-tree and not even the index (the staging area). Because Magit makes it
-so convenient to modify uncommitted changes, it also makes it easy to
-shoot yourself in the foot in the process.
-
- For that reason Magit provides a global mode that saves *tracked*
-files to work-in-progress references after or before certain actions.
-(At present untracked files are never saved and for technical reasons
-nothing is saved before the first commit has been created).
-
- Two separate work-in-progress references are used to track the state
-of the index and of the working tree: ‘refs/wip/index/<branchref>’ and
-‘refs/wip/wtree/<branchref>’, where ‘<branchref>’ is the full ref of the
-current branch, e.g. ‘refs/heads/master’. When the ‘HEAD’ is detached
-then ‘HEAD’ is used in place of ‘<branchref>’.
-
- Checking out another branch (or detaching ‘HEAD’) causes the use of
-different wip refs for subsequent changes.
-
- -- User Option: magit-wip-mode
-
- When this mode is enabled, then uncommitted changes are committed
- to dedicated work-in-progress refs whenever appropriate (i.e. when
- dataloss would be a possibility otherwise).
-
- Setting this variable directly does not take effect; either use the
- Custom interface to do so or call the respective mode function.
-
- For historic reasons this mode is implemented on top of four other
- ‘magit-wip-*’ modes, which can also be used individually, if you
- want finer control over when the wip refs are updated; but that is
- discouraged. See *note Legacy Wip Modes::.
-
- To view the log for a branch and its wip refs use the commands
-‘magit-wip-log’ and ‘magit-wip-log-current’. You should use ‘--graph’
-when using these commands.
-
- -- Command: magit-wip-log
-
- This command shows the log for a branch and its wip refs. With a
- negative prefix argument only the worktree wip ref is shown.
-
- The absolute numeric value of the prefix argument controls how many
- "branches" of each wip ref are shown. This is only relevant if the
- value of ‘magit-wip-merge-branch’ is ‘nil’.
-
- -- Command: magit-wip-log-current
-
- This command shows the log for the current branch and its wip refs.
- With a negative prefix argument only the worktree wip ref is shown.
-
- The absolute numeric value of the prefix argument controls how many
- "branches" of each wip ref are shown. This is only relevant if the
- value of ‘magit-wip-merge-branch’ is ‘nil’.
-
-‘X w’ (‘magit-reset-worktree’)
-
- This command resets the working tree to some commit read from the
- user and defaulting to the commit at point, while keeping the
- ‘HEAD’ and index as-is.
-
- This can be used to restore files to the state committed to a wip
- ref. Note that this will discard any unstaged changes that might
- have existed before invoking this command (but of course only after
- committing that to the working tree wip ref).
-
- Note that even if you enable ‘magit-wip-mode’ this won’t give you
-perfect protection. The most likely scenario for losing changes despite
-the use of ‘magit-wip-mode’ is making a change outside Emacs and then
-destroying it also outside Emacs. In some such a scenario, Magit, being
-an Emacs package, didn’t get the opportunity to keep you from shooting
-yourself in the foot.
-
- When you are unsure whether Magit did commit a change to the wip
-refs, then you can explicitly request that all changes to all tracked
-files are being committed.
-
-‘M-x magit-wip-commit’ (‘magit-wip-commit’)
-
- This command commits all changes to all tracked files to the index
- and working tree work-in-progress refs. Like the modes described
- above, it does not commit untracked files, but it does check all
- tracked files for changes. Use this command when you suspect that
- the modes might have overlooked a change made outside Emacs/Magit.
-
- -- User Option: magit-wip-namespace
-
- The namespace used for work-in-progress refs. It has to end with a
- slash. The wip refs are named ‘<namespace>index/<branchref>’ and
- ‘<namespace>wtree/<branchref>’. When snapshots are created while
- the ‘HEAD’ is detached then ‘HEAD’ is used in place of
- ‘<branchref>’.
-
- -- User Option: magit-wip-mode-lighter
-
- Mode-line lighter for ‘magit-wip--mode’.
-
-* Menu:
-
-* Wip Graph::
-* Legacy Wip Modes::
-
-
-File: magit.info, Node: Wip Graph, Next: Legacy Wip Modes, Up: Wip Modes
-
-8.7.1 Wip Graph
----------------
-
- -- User Option: magit-wip-merge-branch
-
- This option controls whether the current branch is merged into the
- wip refs after a new commit was created on the branch.
-
- If non-nil and the current branch has new commits, then it is
- merged into the wip ref before creating a new wip commit. This
- makes it easier to inspect wip history and the wip commits are
- never garbage collected.
-
- If nil and the current branch has new commits, then the wip ref is
- reset to the tip of the branch before creating a new wip commit.
- With this setting wip commits are eventually garbage collected.
-
- When ‘magit-wip-merge-branch’ is ‘t’, then the history looks like
-this:
-
- *--*--*--*--*--* refs/wip/index/refs/heads/master
- / / /
- A-----B-----C refs/heads/master
-
- When ‘magit-wip-merge-branch’ is ‘nil’, then creating a commit on the
-real branch and then making a change causes the wip refs to be recreated
-to fork from the new commit. But the old commits on the wip refs are
-not lost. They are still available from the reflog. To make it easier
-to see when the fork point of a wip ref was changed, an additional
-commit with the message "restart autosaving" is created on it (‘xxO’
-commits below are such boundary commits).
-
- Starting with
-
- BI0---BI1 refs/wip/index/refs/heads/master
- /
- A---B refs/heads/master
- \
- BW0---BW1 refs/wip/wtree/refs/heads/master
-
- and committing the staged changes and editing and saving a file would
-result in
-
- BI0---BI1 refs/wip/index/refs/heads/master
- /
- A---B---C refs/heads/master
- \ \
- \ CW0---CW1 refs/wip/wtree/refs/heads/master
- \
- BW0---BW1 refs/wip/wtree/refs/heads/master@{2}
-
- The fork-point of the index wip ref is not changed until some change
-is being staged. Likewise just checking out a branch or creating a
-commit does not change the fork-point of the working tree wip ref. The
-fork-points are not adjusted until there actually is a change that
-should be committed to the respective wip ref.
-
-
-File: magit.info, Node: Legacy Wip Modes, Prev: Wip Graph, Up: Wip Modes
-
-8.7.2 Legacy Wip Modes
-----------------------
-
-It is recommended that you use the mode ‘magit-wip-mode’ (which see) and
-ignore the existence of the following modes, which are preserved for
-historic reasons.
-
- Setting the following variables directly does not take effect; either
-use the Custom interface to do so or call the respective mode functions.
-
- -- User Option: magit-wip-after-save-mode
-
- When this mode is enabled, then saving a buffer that visits a file
- tracked in a Git repository causes its current state to be
- committed to the working tree wip ref for the current branch.
-
- -- User Option: magit-wip-after-apply-mode
-
- When this mode is enabled, then applying (i.e. staging, unstaging,
- discarding, reversing, and regularly applying) a change to a file
- tracked in a Git repository causes its current state to be
- committed to the index and/or working tree wip refs for the current
- branch.
-
- If you only ever edit files using Emacs and only ever interact with
-Git using Magit, then the above two modes should be enough to protect
-each and every change from accidental loss. In practice nobody does
-that. Two additional modes exists that do commit to the wip refs before
-making changes that could cause the loss of earlier changes.
-
- -- User Option: magit-wip-before-change-mode
-
- When this mode is enabled, then certain commands commit the
- existing changes to the files they are about to make changes to.
-
- -- User Option: magit-wip-initial-backup-mode
-
- When this mode is enabled, then the current version of a file is
- committed to the worktree wip ref before the buffer visiting that
- file is saved for the first time since the buffer was created.
-
- This backs up the same version of the file that ‘backup-buffer’
- would save. While ‘backup-buffer’ uses a backup file, this mode
- uses the same worktree wip ref as used by the other Magit Wip
- modes. Like ‘backup-buffer’, it only does this once; unless you
- kill the buffer and visit the file again only one backup will be
- created per Emacs session.
-
- This mode ignores the variables that affect ‘backup-buffer’ and can
- be used along-side that function, which is recommended because it
- only backs up files that are tracked in a Git repository.
-
- -- User Option: magit-wip-after-save-local-mode-lighter
-
- Mode-line lighter for ‘magit-wip-after-save-local-mode’.
-
- -- User Option: magit-wip-after-apply-mode-lighter
-
- Mode-line lighter for ‘magit-wip-after-apply-mode’.
-
- -- User Option: magit-wip-before-change-mode-lighter
-
- Mode-line lighter for ‘magit-wip-before-change-mode’.
-
- -- User Option: magit-wip-initial-backup-mode-lighter
-
- Mode-line lighter for ‘magit-wip-initial-backup-mode’.
-
-
-File: magit.info, Node: Minor Mode for Buffers Visiting Files, Next: Minor Mode for Buffers Visiting Blobs, Prev: Wip Modes, Up: Miscellaneous
-
-8.8 Minor Mode for Buffers Visiting Files
-=========================================
-
-The minor-mode ‘magit-file-mode’ enables certain Magit features in
-file-visiting buffers belonging to a Git repository. The globalized
-variant ‘global-magit-file-mode’ enables the local mode in all such
-buffers. It is enabled by default. Currently the local mode only
-establishes a few key bindings, but this might be extended in the
-future.
-
- -- User Option: global-magit-file-mode
-
- Whether to establish certain Magit key bindings in all
- file-visiting buffers belonging to any Git repository. This is
- enabled by default. This globalized mode turns on the local
- minor-mode ‘magit-file-mode’ in all suitable buffers.
-
- -- Variable: magit-file-mode-map
-
- This keymap is used by the local minor-mode ‘magit-file-mode’ and
- establishes the key bindings described below.
-
- Note that the default binding for ‘magit-file-dispatch’ is very
- cumbersome to use and that we recommend that you add a better
- binding.
-
- Instead of ‘C-c M-g’ I would have preferred to use ‘C-c g’ because
- (1) it is similar to ‘C-x g’ (the recommended global binding for
- ‘~magit-status’), (2) we cannot use ‘C-c C-g’ because we have been
- recommending that that be bound to ‘magit-dispatch’ for a long
- time, (3) we cannot use ‘C-x C-g’ because that is a convenient way
- of aborting the incomplete key sequence ‘C-x’, and most importantly
- (4) it would make it much easier to type the next key (a suffix
- binding) because most of those are letters.
-
- For example ‘C-c g b’ is much easier to type than ‘C-c M-g b’. For
- suffix bindings that use uppercase letters, the default is just
- horrible—having to use e.g. ‘C-c M-g B’ (‘Control+c Meta+g
- Shift+b’) would drive anyone up the walls (or to Vim).
-
- However ‘C-c LETTER’ bindings are reserved for users (see *note
- (elisp)Key Binding Conventions::). Packages are forbidden from
- using those. Doing so anyway is considered heresy. Therefore if
- you want a better binding, you have to add it yourself:
-
- (define-key magit-file-mode-map
- (kbd "C-c g") 'magit-file-dispatch)
-
- The key bindings shown below assume that you have not improved the
-binding for ‘magit-file-dispatch’.
-
-‘C-c M-g’ (‘magit-file-dispatch’)
-
- This transient prefix command binds the following suffix commands
- and displays them in a temporary buffer until a suffix is invoked.
-
-‘C-c M-g s’ (‘magit-stage-file’)
-
- Stage all changes to the file being visited in the current buffer.
-
-‘C-c M-g u’ (‘magit-unstage-file’)
-
- Unstage all changes to the file being visited in the current
- buffer.
-
-‘C-c M-g c’ (‘magit-commit’)
-
- This transient prefix command binds the following suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked. See *note Initiating a
- Commit::.
-
-‘C-c M-g D’ (‘magit-diff’)
-
- This transient prefix command binds several diff suffix commands
- and infix arguments and displays them in a temporary buffer until a
- suffix is invoked. See *note Diffing::.
-
- This is the same command that ‘d’ is bound to in Magit buffers. If
- this command is invoked from a file-visiting buffer, then the
- initial value of the option (‘--’) that limits the diff to certain
- file(s) is set to the visited file.
-
-‘C-c M-g d’ (‘magit-diff-buffer-file’)
-
- This command shows the diff for the file of blob that the current
- buffer visits.
-
- -- User Option: magit-diff-buffer-file-locked
-
- This option controls whether ‘magit-diff-buffer-file’ uses a
- dedicated buffer. See *note Modes and Buffers::.
-
-‘C-c M-g L’ (‘magit-log’)
-
- This transient prefix command binds several log suffix commands and
- infix arguments and displays them in a temporary buffer until a
- suffix is invoked. See *note Logging::.
-
- This is the same command that ‘l’ is bound to in Magit buffers. If
- this command is invoked from a file-visiting buffer, then the
- initial value of the option (‘--’) that limits the log to certain
- file(s) is set to the visited file.
-
-‘C-c M-g l’ (‘magit-log-buffer-file’)
-
- This command shows the log for the file of blob that the current
- buffer visits. Renames are followed when a prefix argument is used
- or when ‘--follow’ is an active log argument. When the region is
- active, the log is restricted to the selected line range.
-
-‘C-c M-g t’ (‘magit-log-trace-definition’)
-
- This command shows the log for the definition at point.
-
- -- User Option: magit-log-buffer-file-locked
-
- This option controls whether ‘magit-log-buffer-file’ uses a
- dedicated buffer. See *note Modes and Buffers::.
-
-‘C-c M-g B’ (‘magit-blame’)
-
- This transient prefix command binds all blaming suffix commands
- along with the appropriate infix arguments and displays them in a
- temporary buffer until a suffix is invoked.
-
- For more information about this and the following commands also see
- *note Blaming::.
-
- In addition to the ‘magit-blame’ sub-transient, the dispatch
-transient also binds several blaming suffix commands directly. See
-*note Blaming:: for information about those commands and bindings.
-
-‘C-c M-g e’ (‘magit-edit-line-commit’)
-
- This command makes the commit editable that added the current line.
-
- With a prefix argument it makes the commit editable that removes
- the line, if any. The commit is determined using ‘git blame’ and
- made editable using ‘git rebase --interactive’ if it is reachable
- from ‘HEAD’, or by checking out the commit (or a branch that points
- at it) otherwise.
-
-‘C-c M-g p’ (‘magit-blob-previous’)
-
- Visit the previous blob which modified the current file.
-
- There are a few additional commands that operate on a single file but
-are not enabled in the file transient command by default:
-
- -- Command: magit-file-rename
-
- This command renames a file read from the user.
-
- -- Command: magit-file-delete
-
- This command deletes a file read from the user.
-
- -- Command: magit-file-untrack
-
- This command untracks a file read from the user.
-
- -- Command: magit-file-checkout
-
- This command updates a file in the working tree and index to the
- contents from a revision. Both the revision and file are read from
- the user.
-
- To enable them invoke the transient (‘C-c M-g’), enter "edit mode"
-(‘C-x l’), set the "transient level" (‘C-x l’ again), enter ‘5’, and
-leave edit mode (‘C-g’). Also see *note (transient)Enabling and
-Disabling Suffixes::.
-
-
-File: magit.info, Node: Minor Mode for Buffers Visiting Blobs, Prev: Minor Mode for Buffers Visiting Files, Up: Miscellaneous
-
-8.9 Minor Mode for Buffers Visiting Blobs
-=========================================
-
-The ‘magit-blob-mode’ enables certain Magit features in blob-visiting
-buffers. Such buffers can be created using ‘magit-find-file’ and some
-of the commands mentioned below, which also take care of turning on this
-minor mode. Currently this mode only establishes a few key bindings,
-but this might be extended.
-
-‘p’ (‘magit-blob-previous’)
-
- Visit the previous blob which modified the current file.
-
-‘n’ (‘magit-blob-next’)
-
- Visit the next blob which modified the current file.
-
-‘q’ (‘magit-kill-this-buffer’)
-
- Kill the current buffer.
-
-
-File: magit.info, Node: Customizing, Next: Plumbing, Prev: Miscellaneous, Up: Top
-
-9 Customizing
-*************
-
-Both Git and Emacs are highly customizable. Magit is both a Git
-porcelain as well as an Emacs package, so it makes sense to customize it
-using both Git variables as well as Emacs options. However this
-flexibility doesn’t come without problems, including but not limited to
-the following.
-
- • Some Git variables automatically have an effect in Magit without
- requiring any explicit support. Sometimes that is desirable - in
- other cases, it breaks Magit.
-
- When a certain Git setting breaks Magit but you want to keep using
- that setting on the command line, then that can be accomplished by
- overriding the value for Magit only by appending something like
- ‘("-c" "some.variable=compatible-value")’ to
- ‘magit-git-global-arguments’.
-
- • Certain settings like ‘fetch.prune=true’ are respected by Magit
- commands (because they simply call the respective Git command) but
- their value is not reflected in the respective transient buffers.
- In this case the ‘--prune’ argument in ‘magit-fetch’ might be
- active or inactive, but that doesn’t keep the Git variable from
- being honored by the suffix commands anyway. So pruning might
- happen despite the ‘--prune’ arguments being displayed in a way
- that seems to indicate that no pruning will happen.
-
- I intend to address these and similar issues in a future release.
-
-* Menu:
-
-* Per-Repository Configuration::
-* Essential Settings::
-
-
-File: magit.info, Node: Per-Repository Configuration, Next: Essential Settings, Up: Customizing
-
-9.1 Per-Repository Configuration
-================================
-
-Magit can be configured on a per-repository level using both Git
-variables as well as Emacs options.
-
- To set a Git variable for one repository only, simply set it in
-‘/path/to/repo/.git/config’ instead of ‘$HOME/.gitconfig’ or
-‘/etc/gitconfig’. See *note (gitman)git-config::.
-
- Similarly, Emacs options can be set for one repository only by
-editing ‘/path/to/repo/.dir-locals.el’. See *note (emacs)Directory
-Variables::. For example to disable automatic refreshes of
-file-visiting buffers in just one huge repository use this:
-
- • ‘/path/to/huge/repo/.dir-locals.el’
-
- ((nil . ((magit-refresh-buffers . nil))))
-
- It might only be costly to insert certain information into Magit
-buffers for repositories that are exceptionally large, in which case you
-can disable the respective section inserters just for that repository:
-
- • ‘/path/to/tag/invested/repo/.dir-locals.el’
-
- ((magit-status-mode
- . ((eval . (magit-disable-section-inserter 'magit-insert-tags-header)))))
-
- -- Function: magit-disable-section-inserter fn
-
- This function disables the section inserter FN in the current
- repository. It is only intended for use in ‘.dir-locals.el’ and
- ‘.dir-locals-2.el’.
-
- If you want to apply the same settings to several, but not all,
-repositories then keeping the repository-local config files in sync
-would quickly become annoying. To avoid that you can create config
-files for certain classes of repositories (e.g. "huge repositories")
-and then include those files in the per-repository config files. For
-example:
-
- • ‘/path/to/huge/repo/.git/config’
-
- [include]
- path = /path/to/huge-gitconfig
-
- • ‘/path/to/huge-gitconfig’
-
- [status]
- showUntrackedFiles = no
-
- • ‘$HOME/.emacs.d/init.el’
-
- (dir-locals-set-class-variables 'huge-git-repository
- '((nil . ((magit-refresh-buffers . nil)))))
-
- (dir-locals-set-directory-class
- "/path/to/huge/repo/" 'huge-git-repository)
-
-
-File: magit.info, Node: Essential Settings, Prev: Per-Repository Configuration, Up: Customizing
-
-9.2 Essential Settings
-======================
-
-The next two sections list and discuss several variables that many users
-might want to customize, for safety and/or performance reasons.
-
-* Menu:
-
-* Safety::
-* Performance::
-
-
-File: magit.info, Node: Safety, Next: Performance, Up: Essential Settings
-
-9.2.1 Safety
-------------
-
-This section discusses various variables that you might want to change
-(or *not* change) for safety reasons.
-
- Git keeps *committed* changes around long enough for users to recover
-changes they have accidentally been deleted. It does not do the same
-for *uncommitted* changes in the working tree and not even the index
-(the staging area). Because Magit makes it so easy to modify
-uncommitted changes, it also makes it easy to shoot yourself in the foot
-in the process. For that reason Magit provides three global modes that
-save *tracked* files to work-in-progress references after or before
-certain actions. See *note Wip Modes::.
-
- These modes are not enabled by default because of performance
-concerns. Instead a lot of potentially destructive commands require
-confirmation every time they are used. In many cases this can be
-disabled by adding a symbol to ‘magit-no-confirm’ (see *note Completion
-and Confirmation::). If you enable the various wip modes then you
-should add ‘safe-with-wip’ to this list.
-
- Similarly it isn’t necessary to require confirmation before moving a
-file to the system trash - if you trashed a file by mistake then you can
-recover it from there. Option ‘magit-delete-by-moving-to-trash’
-controls whether the system trash is used, which is the case by default.
-Nevertheless, ‘trash’ isn’t a member of ‘magit-no-confirm’ - you might
-want to change that.
-
- By default buffers visiting files are automatically reverted when the
-visited file changes on disk. This isn’t as risky as it might seem, but
-to make an informed decision you should see *note Risk of Reverting
-Automatically::.
-
-
-File: magit.info, Node: Performance, Prev: Safety, Up: Essential Settings
-
-9.2.2 Performance
------------------
-
-After Magit has run ‘git’ for side-effects, it also refreshes the
-current Magit buffer and the respective status buffer. This is
-necessary because otherwise outdated information might be displayed
-without the user noticing. Magit buffers are updated by recreating
-their content from scratch, which makes updating simpler and less
-error-prone, but also more costly. Keeping it simple and just
-re-creating everything from scratch is an old design decision and
-departing from that will require major refactoring.
-
- I plan to do that in time for the next major release. I also intend
-to create logs and diffs asynchronously, which should also help a lot
-but also requires major refactoring.
-
- Meanwhile you can tell Magit to only automatically refresh the
-current Magit buffer, but not the status buffer. If you do that, then
-the status buffer is only refreshed automatically if it is the current
-buffer.
-
- (setq magit-refresh-status-buffer nil)
-
- You should also check whether any third-party packages have added
-anything to ‘magit-refresh-buffer-hook’, ‘magit-status-refresh-hook’,
-‘magit-pre-refresh-hook’, and ‘magit-post-refresh-hook’. If so, then
-check whether those additions impact performance significantly.
-
- Magit can be told to refresh buffers verbosely using ‘M-x
-magit-toggle-verbose-refresh’. Enabling this helps figuring out which
-sections are bottlenecks. The additional output can be found in the
-‘*Messages*’ buffer.
-
- Magit also reverts buffers for visited files located inside the
-current repository when the visited file changes on disk. That is
-implemented on top of ‘auto-revert-mode’ from the built-in library
-‘autorevert’. To figure out whether that impacts performance, check
-whether performance is significantly worse, when many buffers exist
-and/or when some buffers visit files using TRAMP. If so, then this
-should help.
-
- (setq auto-revert-buffer-list-filter
- 'magit-auto-revert-repository-buffer-p)
-
- For alternative approaches see *note Automatic Reverting of
-File-Visiting Buffers::.
-
- If you have enabled any features that are disabled by default, then
-you should check whether they impact performance significantly. It’s
-likely that they were not enabled by default because it is known that
-they reduce performance at least in large repositories.
-
- If performance is only slow inside certain unusually large
-repositories, then you might want to disable certain features on a
-per-repository or per-repository-class basis only. See *note
-Per-Repository Configuration::. For example it takes a long time to
-determine the next and current tag in repository with exceptional
-numbers of tags. It would therefore be a good idea to disable
-‘magit-insert-tags-headers’, as explained at the mentioned node.
-
-* Menu:
-
-* Microsoft Windows Performance::
-* MacOS Performance::
-
-Log Performance
-...............
-
-When showing logs, Magit limits the number of commits initially shown in
-the hope that this avoids unnecessary work. When using ‘--graph’ is
-used, then this unfortunately does not have the desired effect for large
-histories. Junio, Git’s maintainer, said on the git mailing list
-(<http://www.spinics.net/lists/git/msg232230.html>): "‘--graph’ wants to
-compute the whole history and the max-count only affects the output
-phase after ‘--graph’ does its computation".
-
- In other words, it’s not that Git is slow at outputting the
-differences, or that Magit is slow at parsing the output - the problem
-is that Git first goes outside and has a smoke.
-
- We actually work around this issue by limiting the number of commits
-not only by using ‘-<N>’ but by also using a range. But unfortunately
-that’s not always possible.
-
- When more than a few thousand commits are shown, then the use of
-‘--graph’ can slow things down.
-
- Using ‘--color --graph’ is even slower. Magit uses code that is part
-of Emacs to turn control characters into faces. That code is pretty
-slow and this is quite noticeable when showing a log with many branches
-and merges. For that reason ‘--color’ is not enabled by default
-anymore. Consider leaving it at that.
-
-Diff Performance
-................
-
-If diffs are slow, then consider turning off some optional diff features
-by setting all or some of the following variables to ‘nil’:
-‘magit-diff-highlight-indentation’, ‘magit-diff-highlight-trailing’,
-‘magit-diff-paint-whitespace’, ‘magit-diff-highlight-hunk-body’, and
-‘magit-diff-refine-hunk’.
-
- When showing a commit instead of some arbitrary diff, then some
-additional information is displayed. Calculating this information can
-be quite expensive given certain circumstances. If looking at a commit
-using ‘magit-revision-mode’ takes considerably more time than looking at
-the same commit in ‘magit-diff-mode’, then consider setting
-‘magit-revision-insert-related-refs’ to ‘nil’.
-
- When you are often confronted with diffs that contain deleted files,
-then you might want to enable the ‘--irreversible-delete’ argument. If
-you do that then diffs still show that a file was deleted but without
-also showing the complete deleted content of the file. This argument is
-not available by default, see *note (transient)Enabling and Disabling
-Suffixes::. Once you have done that you should enable it and save that
-setting, see *note (transient)Saving Values::. You should do this in
-both the diff (‘d’) and the diff refresh (‘D’) transient popups.
-
-Refs Buffer Performance
-.......................
-
-When refreshing the "references buffer" is slow, then that’s usually
-because several hundred refs are being displayed. The best way to
-address that is to display fewer refs, obviously.
-
- If you are not, or only mildly, interested in seeing the list of
-tags, then start by not displaying them:
-
- (remove-hook 'magit-refs-sections-hook 'magit-insert-tags)
-
- Then you should also make sure that the listed remote branches
-actually all exist. You can do so by pruning branches which no longer
-exist using ‘f-pa’.
-
-Committing Performance
-......................
-
-When you initiate a commit, then Magit by default automatically shows a
-diff of the changes you are about to commit. For large commits this can
-take a long time, which is especially distracting when you are
-committing large amounts of generated data which you don’t actually
-intend to inspect before committing. This behavior can be turned off
-using:
-
- (remove-hook 'server-switch-hook 'magit-commit-diff)
-
- Then you can type ‘C-c C-d’ to show the diff when you actually want
-to see it, but only then. Alternatively you can leave the hook alone
-and just type ‘C-g’ in those cases when it takes too long to generate
-the diff. If you do that, then you will end up with a broken diff
-buffer, but doing it this way has the advantage that you usually get to
-see the diff, which is useful because it increases the odds that you
-spot potential issues.
-
-
-File: magit.info, Node: Microsoft Windows Performance, Next: MacOS Performance, Up: Performance
-
-Microsoft Windows Performance
-.............................
-
-In order to update the status buffer, ‘git’ has to be run a few dozen
-times. That is problematic on Microsoft Windows, because that operating
-system is exceptionally slow at starting processes. Sadly this is an
-issue that can only be fixed by Microsoft itself, and they don’t appear
-to be particularly interested in doing so.
-
- Beside the subprocess issue, there are also other Windows-specific
-performance issues. Some of these have workarounds. The maintainers of
-"Git for Windows" try to improve performance on Windows. Always use the
-latest release in order to benefit from the latest performance tweaks.
-Magit too tries to work around some Windows-specific issues.
-
- According to some sources, setting the following Git variables can
-also help.
-
- git config --global core.preloadindex true # default since v2.1
- git config --global core.fscache true # default since v2.8
- git config --global gc.auto 256
-
- You should also check whether an anti-virus program is affecting
-performance.
-
-
-File: magit.info, Node: MacOS Performance, Prev: Microsoft Windows Performance, Up: Performance
-
-MacOS Performance
-.................
-
-Before Emacs 26.1 child processes were created using ‘fork’ on macOS.
-That needlessly copied GUI resources, which is expensive. The result
-was that forking took about 30 times as long on Darwin than on Linux,
-and because Magit starts many ‘git’ processes that made quite a
-difference.
-
- So make sure that you are using at least Emacs 26.1, in which case
-the faster ‘vfork’ will be used. (The creation of child processes still
-takes about twice as long on Darwin compared to Linux.) See (1) for
-more information.
-
- On Catalina, and potentially other macOS releases, there may be a
-performance problem where any action takes 20 times longer on Darwin
-than on Linux. This can be fixed by setting ‘magit-git-executable’ to
-the absolute path of the ‘git’ executable, instead of relying on
-resolving the ‘$PATH’.
-
- ---------- Footnotes ----------
-
- (1)
-<https://lists.gnu.org/archive/html/bug-gnu-emacs/2017-04/msg00201.html>
-
-
-File: magit.info, Node: Plumbing, Next: FAQ, Prev: Customizing, Up: Top
-
-10 Plumbing
-***********
-
-The following sections describe how to use several of Magit’s core
-abstractions to extend Magit itself or implement a separate extension.
-
- A few of the low-level features used by Magit have been factored out
-into separate libraries/packages, so that they can be used by other
-packages, without having to depend on Magit. See *note
-(with-editor)Top:: for information about ‘with-editor’. ‘transient’
-doesn’t have a manual yet.
-
- If you are trying to find an unused key that you can bind to a
-command provided by your own Magit extension, then checkout
-<https://github.com/magit/magit/wiki/Plugin-Dispatch-Key-Registry>.
-
-* Menu:
-
-* Calling Git::
-* Section Plumbing::
-* Refreshing Buffers::
-* Conventions::
-
-
-File: magit.info, Node: Calling Git, Next: Section Plumbing, Up: Plumbing
-
-10.1 Calling Git
-================
-
-Magit provides many specialized functions for calling Git. All of these
-functions are defined in either ‘magit-git.el’ or ‘magit-process.el’ and
-have one of the prefixes ‘magit-run-’, ‘magit-call-’, ‘magit-start-’, or
-‘magit-git-’ (which is also used for other things).
-
- All of these functions accept an indefinite number of arguments,
-which are strings that specify command line arguments for Git (or in
-some cases an arbitrary executable). These arguments are flattened
-before being passed on to the executable; so instead of strings they can
-also be lists of strings and arguments that are ‘nil’ are silently
-dropped. Some of these functions also require a single mandatory
-argument before these command line arguments.
-
- Roughly speaking, these functions run Git either to get some value or
-for side-effects. The functions that return a value are useful to
-collect the information necessary to populate a Magit buffer, while the
-others are used to implement Magit commands.
-
- The functions in the value-only group always run synchronously, and
-they never trigger a refresh. The function in the side-effect group can
-be further divided into subgroups depending on whether they run Git
-synchronously or asynchronously, and depending on whether they trigger a
-refresh when the executable has finished.
-
-* Menu:
-
-* Getting a Value from Git::
-* Calling Git for Effect::
-
-
-File: magit.info, Node: Getting a Value from Git, Next: Calling Git for Effect, Up: Calling Git
-
-10.1.1 Getting a Value from Git
--------------------------------
-
-These functions run Git in order to get a value, an exit status, or
-output. Of course you could also use them to run Git commands that have
-side-effects, but that should be avoided.
-
- -- Function: magit-git-exit-code &rest args
-
- Executes git with ARGS and returns its exit code.
-
- -- Function: magit-git-success &rest args
-
- Executes git with ARGS and returns ‘t’ if the exit code is ‘0’,
- ‘nil’ otherwise.
-
- -- Function: magit-git-failure &rest args
-
- Executes git with ARGS and returns ‘t’ if the exit code is ‘1’,
- ‘nil’ otherwise.
-
- -- Function: magit-git-true &rest args
-
- Executes git with ARGS and returns ‘t’ if the first line printed by
- git is the string "true", ‘nil’ otherwise.
-
- -- Function: magit-git-false &rest args
-
- Executes git with ARGS and returns ‘t’ if the first line printed by
- git is the string "false", ‘nil’ otherwise.
-
- -- Function: magit-git-insert &rest args
-
- Executes git with ARGS and inserts its output at point.
-
- -- Function: magit-git-string &rest args
-
- Executes git with ARGS and returns the first line of its output.
- If there is no output or if it begins with a newline character,
- then this returns ‘nil’.
-
- -- Function: magit-git-lines &rest args
-
- Executes git with ARGS and returns its output as a list of lines.
- Empty lines anywhere in the output are omitted.
-
- -- Function: magit-git-items &rest args
-
- Executes git with ARGS and returns its null-separated output as a
- list. Empty items anywhere in the output are omitted.
-
- If the value of option ‘magit-git-debug’ is non-nil and git exits
- with a non-zero exit status, then warn about that in the echo area
- and add a section containing git’s standard error in the current
- repository’s process buffer.
-
- If an error occurs when using one of the above functions, then that
-is usually due to a bug, i.e. using an argument which is not actually
-supported. Such errors are usually not reported, but when they occur we
-need to be able to debug them.
-
- -- User Option: magit-git-debug
-
- Whether to report errors that occur when using ‘magit-git-insert’,
- ‘magit-git-string’, ‘magit-git-lines’, or ‘magit-git-items’. This
- does not actually raise an error. Instead a message is shown in
- the echo area, and git’s standard error is insert into a new
- section in the current repository’s process buffer.
-
- -- Function: magit-git-str &rest args
-
- This is a variant of ‘magit-git-string’ that ignores the option
- ‘magit-git-debug’. It is mainly intended to be used while handling
- errors in functions that do respect that option. Using such a
- function while handing an error could cause yet another error and
- therefore lead to an infinite recursion. You probably won’t ever
- need to use this function.
-
-
-File: magit.info, Node: Calling Git for Effect, Prev: Getting a Value from Git, Up: Calling Git
-
-10.1.2 Calling Git for Effect
------------------------------
-
-These functions are used to run git to produce some effect. Most Magit
-commands that actually run git do so by using such a function.
-
- Because we do not need to consume git’s output when using these
-functions, their output is instead logged into a per-repository buffer,
-which can be shown using ‘$’ from a Magit buffer or ‘M-x magit-process’
-elsewhere.
-
- These functions can have an effect in two distinct ways. Firstly,
-running git may change something, i.e. create or push a new commit.
-Secondly, that change may require that Magit buffers are refreshed to
-reflect the changed state of the repository. But refreshing isn’t
-always desirable, so only some of these functions do perform such a
-refresh after git has returned.
-
- Sometimes it is useful to run git asynchronously. For example, when
-the user has just initiated a push, then there is no reason to make her
-wait until that has completed. In other cases it makes sense to wait
-for git to complete before letting the user do something else. For
-example after staging a change it is useful to wait until after the
-refresh because that also automatically moves to the next change.
-
- -- Function: magit-call-git &rest args
-
- Calls git synchronously with ARGS.
-
- -- Function: magit-call-process program &rest args
-
- Calls PROGRAM synchronously with ARGS.
-
- -- Function: magit-run-git &rest args
-
- Calls git synchronously with ARGS and then refreshes.
-
- -- Function: magit-run-git-with-input input &rest args
-
- Calls git synchronously with ARGS and sends it INPUT on standard
- input.
-
- INPUT should be a buffer or the name of an existing buffer. The
- content of that buffer is used as the process’s standard input.
- After the process returns a refresh is performed.
-
- As a special case, INPUT may also be nil. In that case the content
- of the current buffer is used as standard input and *no* refresh is
- performed.
-
- This function actually runs git asynchronously. But then it waits
- for the process to return, so the function itself is synchronous.
-
- -- Function: magit-run-git-with-logfile file &rest args
-
- Calls git synchronously with ARGS. The process’s output is saved
- in FILE. This is rarely useful and so this function might be
- removed in the future.
-
- This function actually runs git asynchronously. But then it waits
- for the process to return, so the function itself is synchronous.
-
- -- Function: magit-git &rest args
-
- Calls git synchronously with ARGS for side-effects only. This
- function does not refresh the buffer.
-
- -- Function: magit-git-wash washer &rest args
-
- Execute Git with ARGS, inserting washed output at point. Actually
- first insert the raw output at point. If there is no output call
- ‘magit-cancel-section’. Otherwise temporarily narrow the buffer to
- the inserted text, move to its beginning, and then call function
- WASHER with ARGS as its sole argument.
-
- And now for the asynchronous variants.
-
- -- Function: magit-run-git-async &rest args
-
- Start Git, prepare for refresh, and return the process object.
- ARGS is flattened and then used as arguments to Git.
-
- Display the command line arguments in the echo area.
-
- After Git returns some buffers are refreshed: the buffer that was
- current when this function was called (if it is a Magit buffer and
- still alive), as well as the respective Magit status buffer.
- Unmodified buffers visiting files that are tracked in the current
- repository are reverted if ‘magit-revert-buffers’ is non-nil.
-
- -- Function: magit-run-git-with-editor &rest args
-
- Export GIT_EDITOR and start Git. Also prepare for refresh and
- return the process object. ARGS is flattened and then used as
- arguments to Git.
-
- Display the command line arguments in the echo area.
-
- After Git returns some buffers are refreshed: the buffer that was
- current when this function was called (if it is a Magit buffer and
- still alive), as well as the respective Magit status buffer.
-
- -- Function: magit-start-git &rest args
-
- Start Git, prepare for refresh, and return the process object.
-
- If INPUT is non-nil, it has to be a buffer or the name of an
- existing buffer. The buffer content becomes the processes standard
- input.
-
- Option ‘magit-git-executable’ specifies the Git executable and
- option ‘magit-git-global-arguments’ specifies constant arguments.
- The remaining arguments ARGS specify arguments to Git. They are
- flattened before use.
-
- After Git returns, some buffers are refreshed: the buffer that was
- current when this function was called (if it is a Magit buffer and
- still alive), as well as the respective Magit status buffer.
- Unmodified buffers visiting files that are tracked in the current
- repository are reverted if ‘magit-revert-buffers’ is non-nil.
-
- -- Function: magit-start-process &rest args
-
- Start PROGRAM, prepare for refresh, and return the process object.
-
- If optional argument INPUT is non-nil, it has to be a buffer or the
- name of an existing buffer. The buffer content becomes the
- processes standard input.
-
- The process is started using ‘start-file-process’ and then setup to
- use the sentinel ‘magit-process-sentinel’ and the filter
- ‘magit-process-filter’. Information required by these functions is
- stored in the process object. When this function returns the
- process has not started to run yet so it is possible to override
- the sentinel and filter.
-
- After the process returns, ‘magit-process-sentinel’ refreshes the
- buffer that was current when ‘magit-start-process’ was called (if
- it is a Magit buffer and still alive), as well as the respective
- Magit status buffer. Unmodified buffers visiting files that are
- tracked in the current repository are reverted if
- ‘magit-revert-buffers’ is non-nil.
-
- -- Variable: magit-this-process
-
- The child process which is about to start. This can be used to
- change the filter and sentinel.
-
- -- Variable: magit-process-raise-error
-
- When this is non-nil, then ‘magit-process-sentinel’ raises an error
- if git exits with a non-zero exit status. For debugging purposes.
-
-
-File: magit.info, Node: Section Plumbing, Next: Refreshing Buffers, Prev: Calling Git, Up: Plumbing
-
-10.2 Section Plumbing
-=====================
-
-* Menu:
-
-* Creating Sections::
-* Section Selection::
-* Matching Sections::
-
-
-File: magit.info, Node: Creating Sections, Next: Section Selection, Up: Section Plumbing
-
-10.2.1 Creating Sections
-------------------------
-
- -- Macro: magit-insert-section &rest args
-
- Insert a section at point.
-
- TYPE is the section type, a symbol. Many commands that act on the
- current section behave differently depending on that type. Also if
- a variable ‘magit-TYPE-section-map’ exists, then use that as the
- text-property ‘keymap’ of all text belonging to the section (but
- this may be overwritten in subsections). TYPE can also have the
- form ‘(eval FORM)’ in which case FORM is evaluated at runtime.
-
- Optional VALUE is the value of the section, usually a string that
- is required when acting on the section.
-
- When optional HIDE is non-nil collapse the section body by default,
- i.e. when first creating the section, but not when refreshing the
- buffer. Otherwise, expand it by default. This can be overwritten
- using ‘magit-section-set-visibility-hook’. When a section is
- recreated during a refresh, then the visibility of predecessor is
- inherited and HIDE is ignored (but the hook is still honored).
-
- BODY is any number of forms that actually insert the section’s
- heading and body. Optional NAME, if specified, has to be a symbol,
- which is then bound to the struct of the section being inserted.
-
- Before BODY is evaluated the ‘start’ of the section object is set
- to the value of ‘point’ and after BODY was evaluated its ‘end’ is
- set to the new value of ‘point’; BODY is responsible for moving
- ‘point’ forward.
-
- If it turns out inside BODY that the section is empty, then
- ‘magit-cancel-section’ can be used to abort and remove all traces
- of the partially inserted section. This can happen when creating a
- section by washing Git’s output and Git didn’t actually output
- anything this time around.
-
- -- Function: magit-insert-heading &rest args
-
- Insert the heading for the section currently being inserted.
-
- This function should only be used inside ‘magit-insert-section’.
-
- When called without any arguments, then just set the ‘content’ slot
- of the object representing the section being inserted to a marker
- at ‘point’. The section should only contain a single line when
- this function is used like this.
-
- When called with arguments ARGS, which have to be strings, then
- insert those strings at point. The section should not contain any
- text before this happens and afterwards it should again only
- contain a single line. If the ‘face’ property is set anywhere
- inside any of these strings, then insert all of them unchanged.
- Otherwise use the ‘magit-section-heading’ face for all inserted
- text.
-
- The ‘content’ property of the section struct is the end of the
- heading (which lasts from ‘start’ to ‘content’) and the beginning
- of the body (which lasts from ‘content’ to ‘end’). If the value of
- ‘content’ is nil, then the section has no heading and its body
- cannot be collapsed. If a section does have a heading then its
- height must be exactly one line, including a trailing newline
- character. This isn’t enforced; you are responsible for getting it
- right. The only exception is that this function does insert a
- newline character if necessary.
-
- -- Function: magit-cancel-section
-
- Cancel the section currently being inserted. This exits the
- innermost call to ‘magit-insert-section’ and removes all traces of
- what has already happened inside that call.
-
- -- Function: magit-define-section-jumper sym title &optional value
-
- Define an interactive function to go to section SYM. TITLE is the
- displayed title of the section.
-
-
-File: magit.info, Node: Section Selection, Next: Matching Sections, Prev: Creating Sections, Up: Section Plumbing
-
-10.2.2 Section Selection
-------------------------
-
- -- Function: magit-current-section
-
- Return the section at point.
-
- -- Function: magit-region-sections &optional condition multiple
-
- Return a list of the selected sections.
-
- When the region is active and constitutes a valid section
- selection, then return a list of all selected sections. This is
- the case when the region begins in the heading of a section and
- ends in the heading of the same section or in that of a sibling
- section. If optional MULTIPLE is non-nil, then the region cannot
- begin and end in the same section.
-
- When the selection is not valid, then return nil. In this case,
- most commands that can act on the selected sections will instead
- act on the section at point.
-
- When the region looks like it would in any other buffer then the
- selection is invalid. When the selection is valid then the region
- uses the ‘magit-section-highlight’ face. This does not apply to
- diffs where things get a bit more complicated, but even here if the
- region looks like it usually does, then that’s not a valid
- selection as far as this function is concerned.
-
- If optional CONDITION is non-nil, then the selection not only has
- to be valid; all selected sections additionally have to match
- CONDITION, or nil is returned. See ‘magit-section-match’ for the
- forms CONDITION can take.
-
- -- Function: magit-region-values &optional condition multiple
-
- Return a list of the values of the selected sections.
-
- Return the values that themselves would be returned by
- ‘magit-region-sections’ (which see).
-
-
-File: magit.info, Node: Matching Sections, Prev: Section Selection, Up: Section Plumbing
-
-10.2.3 Matching Sections
-------------------------
-
-‘M-x magit-describe-section-briefly’ (‘magit-describe-section-briefly’)
-
- Show information about the section at point. This command is
- intended for debugging purposes.
-
- -- Function: magit-section-ident section
-
- Return an unique identifier for SECTION. The return value has the
- form ‘((TYPE . VALUE)...)’.
-
- -- Function: magit-get-section ident &optional root
-
- Return the section identified by IDENT. IDENT has to be a list as
- returned by ‘magit-section-ident’.
-
- -- Function: magit-section-match condition &optional section
-
- Return ‘t’ if SECTION matches CONDITION. SECTION defaults to the
- section at point. If SECTION is not specified and there also is no
- section at point, then return ‘nil’.
-
- CONDITION can take the following forms:
- • ‘(CONDITION...)’
-
- matches if any of the CONDITIONs matches.
-
- • ‘[CLASS...]’
-
- matches if the section’s class is the same as the first CLASS
- or a subclass of that; the section’s parent class matches the
- second CLASS; and so on.
-
- • ‘[* CLASS...]’
-
- matches sections that match ‘[CLASS...]’ and also recursively
- all their child sections.
-
- • ‘CLASS’
-
- matches if the section’s class is the same as CLASS or a
- subclass of that; regardless of the classes of the parent
- sections.
-
- Each CLASS should be a class symbol, identifying a class that
- derives from ‘magit-section’. For backward compatibility CLASS can
- also be a "type symbol". A section matches such a symbol if the
- value of its ‘type’ slot is ‘eq’. If a type symbol has an entry in
- ‘magit--section-type-alist’, then a section also matches that type
- if its class is a subclass of the class that corresponds to the
- type as per that alist.
-
- Note that it is not necessary to specify the complete section
- lineage as printed by ‘magit-describe-section-briefly’, unless of
- course you want to be that precise.
-
- -- Function: magit-section-value-if condition &optional section
-
- If the section at point matches CONDITION, then return its value.
-
- If optional SECTION is non-nil then test whether that matches
- instead. If there is no section at point and SECTION is nil, then
- return nil. If the section does not match, then return nil.
-
- See ‘magit-section-match’ for the forms CONDITION can take.
-
- -- Function: magit-section-case &rest clauses
-
- Choose among clauses on the type of the section at point.
-
- Each clause looks like (CONDITION BODY...). The type of the
- section is compared against each CONDITION; the BODY forms of the
- first match are evaluated sequentially and the value of the last
- form is returned. Inside BODY the symbol ‘it’ is bound to the
- section at point. If no clause succeeds or if there is no section
- at point return nil.
-
- See ‘magit-section-match’ for the forms CONDITION can take.
- Additionally a CONDITION of t is allowed in the final clause and
- matches if no other CONDITION match, even if there is no section at
- point.
-
- -- Variable: magit-root-section
-
- The root section in the current buffer. All other sections are
- descendants of this section. The value of this variable is set by
- ‘magit-insert-section’ and you should never modify it.
-
- For diff related sections a few additional tools exist.
-
- -- Function: magit-diff-type &optional section
-
- Return the diff type of SECTION.
-
- The returned type is one of the symbols ‘staged’, ‘unstaged’,
- ‘committed’, or ‘undefined’. This type serves a similar purpose as
- the general type common to all sections (which is stored in the
- ‘type’ slot of the corresponding ‘magit-section’ struct) but takes
- additional information into account. When the SECTION isn’t
- related to diffs and the buffer containing it also isn’t a
- diff-only buffer, then return nil.
-
- Currently the type can also be one of ‘tracked’ and ‘untracked’,
- but these values are not handled explicitly in every place they
- should be. A possible fix could be to just return nil here.
-
- The section has to be a ‘diff’ or ‘hunk’ section, or a section
- whose children are of type ‘diff’. If optional SECTION is nil,
- return the diff type for the current section. In buffers whose
- major mode is ‘magit-diff-mode’ SECTION is ignored and the type is
- determined using other means. In ‘magit-revision-mode’ buffers the
- type is always ‘committed’.
-
- -- Function: magit-diff-scope &optional section strict
-
- Return the diff scope of SECTION or the selected section(s).
-
- A diff’s "scope" describes what part of a diff is selected, it is a
- symbol, one of ‘region’, ‘hunk’, ‘hunks’, ‘file’, ‘files’, or
- ‘list’. Do not confuse this with the diff "type", as returned by
- ‘magit-diff-type’.
-
- If optional SECTION is non-nil, then return the scope of that,
- ignoring the sections selected by the region. Otherwise return the
- scope of the current section, or if the region is active and
- selects a valid group of diff related sections, the type of these
- sections, i.e. ‘hunks’ or ‘files’. If SECTION (or if the current
- section that is nil) is a ‘hunk’ section and the region starts and
- ends inside the body of a that section, then the type is ‘region’.
-
- If optional STRICT is non-nil then return nil if the diff type of
- the section at point is ‘untracked’ or the section at point is not
- actually a ‘diff’ but a ‘diffstat’ section.
-
-
-File: magit.info, Node: Refreshing Buffers, Next: Conventions, Prev: Section Plumbing, Up: Plumbing
-
-10.3 Refreshing Buffers
-=======================
-
-All commands that create a new Magit buffer or change what is being
-displayed in an existing buffer do so by calling ‘magit-mode-setup’.
-Among other things, that function sets the buffer local values of
-‘default-directory’ (to the top-level of the repository),
-‘magit-refresh-function’, and ‘magit-refresh-args’.
-
- Buffers are refreshed by calling the function that is the local value
-of ‘magit-refresh-function’ (a function named ‘magit-*-refresh-buffer’,
-where ‘*’ may be something like ‘diff’) with the value of
-‘magit-refresh-args’ as arguments.
-
- -- Macro: magit-mode-setup buffer switch-func mode refresh-func
- &optional refresh-args
-
- This function displays and selects BUFFER, turns on MODE, and
- refreshes a first time.
-
- This function displays and optionally selects BUFFER by calling
- ‘magit-mode-display-buffer’ with BUFFER, MODE and SWITCH-FUNC as
- arguments. Then it sets the local value of
- ‘magit-refresh-function’ to REFRESH-FUNC and that of
- ‘magit-refresh-args’ to REFRESH-ARGS. Finally it creates the
- buffer content by calling REFRESH-FUNC with REFRESH-ARGS as
- arguments.
-
- All arguments are evaluated before switching to BUFFER.
-
- -- Function: magit-mode-display-buffer buffer mode &optional
- switch-function
-
- This function display BUFFER in some window and select it. BUFFER
- may be a buffer or a string, the name of a buffer. The buffer is
- returned.
-
- Unless BUFFER is already displayed in the selected frame, store the
- previous window configuration as a buffer local value, so that it
- can later be restored by ‘magit-mode-bury-buffer’.
-
- The buffer is displayed and selected using SWITCH-FUNCTION. If
- that is ‘nil’ then ‘pop-to-buffer’ is used if the current buffer’s
- major mode derives from ‘magit-mode’. Otherwise ‘switch-to-buffer’
- is used.
-
- -- Variable: magit-refresh-function
-
- The value of this buffer-local variable is the function used to
- refresh the current buffer. It is called with ‘magit-refresh-args’
- as arguments.
-
- -- Variable: magit-refresh-args
-
- The list of arguments used by ‘magit-refresh-function’ to refresh
- the current buffer. ‘magit-refresh-function’ is called with these
- arguments.
-
- The value is usually set using ‘magit-mode-setup’, but in some
- cases it’s also useful to provide commands that can change the
- value. For example, the ‘magit-diff-refresh’ transient can be used
- to change any of the arguments used to display the diff, without
- having to specify again which differences should be shown, but
- ‘magit-diff-more-context’, ‘magit-diff-less-context’ and
- ‘magit-diff-default-context’ change just the ‘-U<N>’ argument. In
- both case this is done by changing the value of this variable and
- then calling this ‘magit-refresh-function’.
-
-
-File: magit.info, Node: Conventions, Prev: Refreshing Buffers, Up: Plumbing
-
-10.4 Conventions
-================
-
-Also see *note Completion and Confirmation::.
-
-* Menu:
-
-* Theming Faces::
-
-
-File: magit.info, Node: Theming Faces, Up: Conventions
-
-10.4.1 Theming Faces
---------------------
-
-The default theme uses blue for local branches, green for remote
-branches, and goldenrod (brownish yellow) for tags. When creating a new
-theme, you should probably follow that example. If your theme already
-uses other colors, then stick to that.
-
- In older releases these reference faces used to have a background
-color and a box around them. The basic default faces no longer do so,
-to make Magit buffers much less noisy, and you should follow that
-example at least with regards to boxes. (Boxes were used in the past to
-work around a conflict between the highlighting overlay and text
-property backgrounds. That’s no longer necessary because highlighting
-no longer causes other background colors to disappear.) Alternatively
-you can keep the background color and/or box, but then have to take
-special care to adjust ‘magit-branch-current’ accordingly. By default
-it looks mostly like ‘magit-branch-local’, but with a box (by default
-the former is the only face that uses a box, exactly so that it sticks
-out). If the former also uses a box, then you have to make sure that it
-differs in some other way from the latter.
-
- The most difficult faces to theme are those related to diffs,
-headings, highlighting, and the region. There are faces that fall into
-all four groups - expect to spend some time getting this right.
-
- The ‘region’ face in the default theme, in both the light and dark
-variants, as well as in many other themes, distributed with Emacs or by
-third-parties, is very ugly. It is common to use a background color
-that really sticks out, which is ugly but if that were the only problem
-then it would be acceptable. Unfortunately many themes also set the
-foreground color, which ensures that all text within the region is
-readable. Without doing that there might be cases where some foreground
-color is too close to the region background color to still be readable.
-But it also means that text within the region loses all syntax
-highlighting.
-
- I consider the work that went into getting the ‘region’ face right to
-be a good indicator for the general quality of a theme. My
-recommendation for the ‘region’ face is this: use a background color
-slightly different from the background color of the ‘default’ face, and
-do not set the foreground color at all. So for a light theme you might
-use a light (possibly tinted) gray as the background color of ‘default’
-and a somewhat darker gray for the background of ‘region’. That should
-usually be enough to not collide with the foreground color of any other
-face. But if some other faces also set a light gray as background
-color, then you should also make sure it doesn’t collide with those (in
-some cases it might be acceptable though).
-
- Magit only uses the ‘region’ face when the region is "invalid" by its
-own definition. In a Magit buffer the region is used to either select
-multiple sibling sections, so that commands which support it act on all
-of these sections instead of just the current section, or to select
-lines within a single hunk section. In all other cases, the section is
-considered invalid and Magit won’t act on it. But such invalid sections
-happen, either because the user has not moved point enough yet to make
-it valid or because she wants to use a non-magit command to act on the
-region, e.g. ‘kill-region’.
-
- So using the regular ‘region’ face for invalid sections is a feature.
-It tells the user that Magit won’t be able to act on it. It’s
-acceptable if that face looks a bit odd and even (but less so) if it
-collides with the background colors of section headings and other things
-that have a background color.
-
- Magit highlights the current section. If a section has subsections,
-then all of them are highlighted. This is done using faces that have
-"highlight" in their names. For most sections,
-‘magit-section-highlight’ is used for both the body and the heading.
-Like the ‘region’ face, it should only set the background color to
-something similar to that of ‘default’. The highlight background color
-must be different from both the ‘region’ background color and the
-‘default’ background color.
-
- For diff related sections Magit uses various faces to highlight
-different parts of the selected section(s). Note that hunk headings,
-unlike all other section headings, by default have a background color,
-because it is useful to have very visible separators between hunks.
-That face ‘magit-diff-hunk-heading’, should be different from both
-‘magit-diff-hunk-heading-highlight’ and ‘magit-section-highlight’, as
-well as from ‘magit-diff-context’ and ‘magit-diff-context-highlight’.
-By default we do that by changing the foreground color. Changing the
-background color would lead to complications, and there are already
-enough we cannot get around. (Also note that it is generally a good
-idea for section headings to always be bold, but only for sections that
-have subsections).
-
- When there is a valid region selecting diff-related sibling sections,
-i.e. multiple files or hunks, then the bodies of all these sections use
-the respective highlight faces, but additionally the headings instead
-use one of the faces ‘magit-diff-file-heading-selection’ or
-‘magit-diff-hunk-heading-selection’. These faces have to be different
-from the regular highlight variants to provide explicit visual
-indication that the region is active.
-
- When theming diff related faces, start by setting the option
-‘magit-diff-refine-hunk’ to ‘all’. You might personally prefer to only
-refine the current hunk or not use hunk refinement at all, but some of
-the users of your theme want all hunks to be refined, so you have to
-cater to that.
-
- (Also turn on ‘magit-diff-highlight-indentation’,
-‘magit-diff-highlight-trailing’, and ‘magit-diff-paint-whitespace’; and
-insert some whitespace errors into the code you use for testing.)
-
- For e.g. "added lines" you have to adjust three faces:
-‘magit-diff-added’, ‘magit-diff-added-highlight’, and
-‘smerge-refined-added’. Make sure that the latter works well with both
-of the former, as well as ‘smerge-other’ and ‘diff-added’. Then do the
-same for the removed lines, context lines, lines added by us, and lines
-added by them. Also make sure the respective added, removed, and
-context faces use approximately the same saturation for both the
-highlighted and unhighlighted variants. Also make sure the file and
-diff headings work nicely with context lines (e.g. make them look
-different). Line faces should set both the foreground and the
-background color. For example, for added lines use two different
-greens.
-
- It’s best if the foreground color of both the highlighted and the
-unhighlighted variants are the same, so you will need to have to find a
-color that works well on the highlight and unhighlighted background, the
-refine background, and the highlight context background. When there is
-an hunk internal region, then the added- and removed-lines background
-color is used only within that region. Outside the region the
-highlighted context background color is used. This makes it easier to
-see what is being staged. With an hunk internal region the hunk heading
-is shown using ‘magit-diff-hunk-heading-selection’, and so are the thin
-lines that are added around the lines that fall within the region. The
-background color of that has to be distinct enough from the various
-other involved background colors.
-
- Nobody said this would be easy. If your theme restricts itself to a
-certain set of colors, then you should make an exception here.
-Otherwise it would be impossible to make the diffs look good in each and
-every variation. Actually you might want to just stick to the default
-definitions for these faces. You have been warned. Also please note
-that if you do not get this right, this will in some cases look to users
-like bugs in Magit - so please do it right or not at all.
-
-
-File: magit.info, Node: FAQ, Next: Debugging Tools, Prev: Plumbing, Up: Top
-
-Appendix A FAQ
-**************
-
-The next two nodes lists frequently asked questions. For a list of
-frequently *and recently* asked questions, i.e. questions that haven’t
-made it into the manual yet, see
-<https://github.com/magit/magit/wiki/FAQ>.
-
- Please also use the *note Debugging Tools::.
-
-* Menu:
-
-* FAQ - How to ...?::
-* FAQ - Issues and Errors::
-
-
-File: magit.info, Node: FAQ - How to ...?, Next: FAQ - Issues and Errors, Up: FAQ
-
-A.1 FAQ - How to ...?
-=====================
-
-* Menu:
-
-* How to show git's output?::
-* How to install the gitman info manual?::
-* How to show diffs for gpg-encrypted files?::
-* How does branching and pushing work?::
-* Can Magit be used as ediff-version-control-package?::
-* Should I disable VC?::
-
-
-File: magit.info, Node: How to show git's output?, Next: How to install the gitman info manual?, Up: FAQ - How to ...?
-
-A.1.1 How to show git’s output?
--------------------------------
-
-To show the output of recently run git commands, press ‘$’ (or, if that
-isn’t available, ‘M-x magit-process-buffer’). This will show a buffer
-containing a section per git invocation; as always press ‘TAB’ to expand
-or collapse them.
-
- By default, git’s output is only inserted into the process buffer if
-it is run for side-effects. When the output is consumed in some way,
-also inserting it into the process buffer would be too expensive. For
-debugging purposes, it’s possible to do so anyway by setting
-‘magit-git-debug’ to ‘t’.
-
-
-File: magit.info, Node: How to install the gitman info manual?, Next: How to show diffs for gpg-encrypted files?, Prev: How to show git's output?, Up: FAQ - How to ...?
-
-A.1.2 How to install the gitman info manual?
---------------------------------------------
-
-Git’s manpages can be exported as an info manual called ‘gitman’.
-Magit’s own info manual links to nodes in that manual instead of the
-actual manpages because Info doesn’t support linking to manpages.
-
- Unfortunately some distributions do not install the ‘gitman’ manual
-by default and you will have to install a separate documentation package
-to get it.
-
- Magit patches Info adding the ability to visit links to the ‘gitman’
-Info manual by instead viewing the respective manpage. If you prefer
-that approach, then set the value of ‘magit-view-git-manual-method’ to
-one of the supported packages ‘man’ or ‘woman’, e.g.:
-
- (setq magit-view-git-manual-method 'man)
-
-
-File: magit.info, Node: How to show diffs for gpg-encrypted files?, Next: How does branching and pushing work?, Prev: How to install the gitman info manual?, Up: FAQ - How to ...?
-
-A.1.3 How to show diffs for gpg-encrypted files?
-------------------------------------------------
-
-Git supports showing diffs for encrypted files, but has to be told to do
-so. Since Magit just uses Git to get the diffs, configuring Git also
-affects the diffs displayed inside Magit.
-
- git config --global diff.gpg.textconv "gpg --no-tty --decrypt"
- echo "*.gpg filter=gpg diff=gpg" > .gitattributes
-
-
-File: magit.info, Node: How does branching and pushing work?, Next: Can Magit be used as ediff-version-control-package?, Prev: How to show diffs for gpg-encrypted files?, Up: FAQ - How to ...?
-
-A.1.4 How does branching and pushing work?
-------------------------------------------
-
-Please see *note Branching:: and
-<http://emacsair.me/2016/01/18/magit-2.4>
-
-
-File: magit.info, Node: Can Magit be used as ediff-version-control-package?, Next: Should I disable VC?, Prev: How does branching and pushing work?, Up: FAQ - How to ...?
-
-A.1.5 Can Magit be used as ‘ediff-version-control-package’?
------------------------------------------------------------
-
-No, it cannot. For that to work the functions ‘ediff-magit-internal’
-and ‘ediff-magit-merge-internal’ would have to be implemented, and they
-are not. These two functions are only used by the three commands
-‘ediff-revision’, ‘ediff-merge-revisions-with-ancestor’, and
-‘ediff-merge-revisions’.
-
- These commands only delegate the task of populating buffers with
-certain revisions to the "internal" functions. The equally important
-task of determining which revisions are to be compared/merged is not
-delegated. Instead this is done without any support whatsoever from the
-version control package/system - meaning that the user has to enter the
-revisions explicitly. Instead of implementing ‘ediff-magit-internal’ we
-provide ‘magit-ediff-compare’, which handles both tasks like it is 2005.
-
- The other commands ‘ediff-merge-revisions’ and
-‘ediff-merge-revisions-with-ancestor’ are normally not what you want
-when using a modern version control system like Git. Instead of letting
-the user resolve only those conflicts which Git could not resolve on its
-own, they throw away all work done by Git and then expect the user to
-manually merge all conflicts, including those that had already been
-resolved. That made sense back in the days when version control systems
-couldn’t merge (or so I have been told), but not anymore. Once in a
-blue moon you might actually want to see all conflicts, in which case
-you *can* use these commands, which then use ‘ediff-vc-merge-internal’.
-So we don’t actually have to implement ‘ediff-magit-merge-internal’.
-Instead we provide the more useful command ‘magit-ediff-resolve’ which
-only shows yet-to-be resolved conflicts.
-
-
-File: magit.info, Node: Should I disable VC?, Prev: Can Magit be used as ediff-version-control-package?, Up: FAQ - How to ...?
-
-A.1.6 Should I disable VC?
---------------------------
-
-If you don’t use VC (the built-in version control interface) then you
-might be tempted to disable it, not least because we used to recommend
-that you do that.
-
- We no longer recommend that you disable VC. Doing so would break
-useful third-party packages (such as ‘diff-hl’), which depend on VC
-being enabled.
-
- If you choose to disable VC anyway, then you can do so by changing
-the value of ‘vc-handled-backends’.
-
-
-File: magit.info, Node: FAQ - Issues and Errors, Prev: FAQ - How to ...?, Up: FAQ
-
-A.2 FAQ - Issues and Errors
-===========================
-
-* Menu:
-
-* Magit is slow::
-* I changed several thousand files at once and now Magit is unusable::
-* I am having problems committing::
-* I am using MS Windows and cannot push with Magit::
-* I am using OS X and SOMETHING works in shell, but not in Magit: I am using OS X and SOMETHING works in shell but not in Magit.
-* Expanding a file to show the diff causes it to disappear::
-* Point is wrong in the COMMIT_EDITMSG buffer::
-* The mode-line information isn't always up-to-date::
-* A branch and tag sharing the same name breaks SOMETHING::
-* My Git hooks work on the command-line but not inside Magit::
-* git-commit-mode isn't used when committing from the command-line::
-* Point ends up inside invisible text when jumping to a file-visiting buffer::
-
-
-File: magit.info, Node: Magit is slow, Next: I changed several thousand files at once and now Magit is unusable, Up: FAQ - Issues and Errors
-
-A.2.1 Magit is slow
--------------------
-
-See *note Performance::.
-
-
-File: magit.info, Node: I changed several thousand files at once and now Magit is unusable, Next: I am having problems committing, Prev: Magit is slow, Up: FAQ - Issues and Errors
-
-A.2.2 I changed several thousand files at once and now Magit is unusable
-------------------------------------------------------------------------
-
-Magit is *currently* not expected to work under such conditions. It
-sure would be nice if it did, and v2.5 will hopefully be a big step into
-that direction. But it might take until v3.1 to accomplish fully
-satisfactory performance, because that requires some heavy refactoring.
-
- But for now we recommend you use the command line to complete this
-one commit. Also see *note Performance::.
-
-
-File: magit.info, Node: I am having problems committing, Next: I am using MS Windows and cannot push with Magit, Prev: I changed several thousand files at once and now Magit is unusable, Up: FAQ - Issues and Errors
-
-A.2.3 I am having problems committing
--------------------------------------
-
-That likely means that Magit is having problems finding an appropriate
-emacsclient executable. See *note (with-editor)Configuring
-With-Editor:: and *note (with-editor)Debugging::.
-
-
-File: magit.info, Node: I am using MS Windows and cannot push with Magit, Next: I am using OS X and SOMETHING works in shell but not in Magit, Prev: I am having problems committing, Up: FAQ - Issues and Errors
-
-A.2.4 I am using MS Windows and cannot push with Magit
-------------------------------------------------------
-
-It’s almost certain that Magit is only incidental to this issue. It is
-much more likely that this is a configuration issue, even if you can
-push on the command line.
-
- Detailed setup instructions can be found at
-<https://github.com/magit/magit/wiki/Pushing-with-Magit-from-Windows>.
-
-
-File: magit.info, Node: I am using OS X and SOMETHING works in shell but not in Magit, Next: Expanding a file to show the diff causes it to disappear, Prev: I am using MS Windows and cannot push with Magit, Up: FAQ - Issues and Errors
-
-A.2.5 I am using OS X and SOMETHING works in shell, but not in Magit
---------------------------------------------------------------------
-
-This usually occurs because Emacs doesn’t have the same environment
-variables as your shell. Try installing and configuring
-<https://github.com/purcell/exec-path-from-shell>. By default it
-synchronizes ‘$PATH’, which helps Magit find the same ‘git’ as the one
-you are using on the shell.
-
- If SOMETHING is "passphrase caching with gpg-agent for commit and/or
-tag signing", then you’ll also need to synchronize ‘$GPG_AGENT_INFO’.
-
-
-File: magit.info, Node: Expanding a file to show the diff causes it to disappear, Next: Point is wrong in the COMMIT_EDITMSG buffer, Prev: I am using OS X and SOMETHING works in shell but not in Magit, Up: FAQ - Issues and Errors
-
-A.2.6 Expanding a file to show the diff causes it to disappear
---------------------------------------------------------------
-
-This is probably caused by a change of a ‘diff.*’ Git variable. You
-probably set that variable for a reason, and should therefore only undo
-that setting in Magit by customizing ‘magit-git-global-arguments’.
-
-
-File: magit.info, Node: Point is wrong in the COMMIT_EDITMSG buffer, Next: The mode-line information isn't always up-to-date, Prev: Expanding a file to show the diff causes it to disappear, Up: FAQ - Issues and Errors
-
-A.2.7 Point is wrong in the ‘COMMIT_EDITMSG’ buffer
----------------------------------------------------
-
-Neither Magit nor ‘git-commit‘ fiddle with point in the buffer used to
-write commit messages, so something else must be doing it.
-
- You have probably globally enabled a mode which does restore point in
-file-visiting buffers. It might be a bit surprising, but when you write
-a commit message, then you are actually editing a file.
-
- So you have to figure out which package is doing. ‘saveplace’,
-‘pointback’, and ‘session’ are likely candidates. These snippets might
-help:
-
- (setq session-name-disable-regexp "\\(?:\\`'\\.git/[A-Z_]+\\'\\)")
-
- (with-eval-after-load 'pointback
- (lambda ()
- (when (or git-commit-mode git-rebase-mode)
- (pointback-mode -1))))
-
-
-File: magit.info, Node: The mode-line information isn't always up-to-date, Next: A branch and tag sharing the same name breaks SOMETHING, Prev: Point is wrong in the COMMIT_EDITMSG buffer, Up: FAQ - Issues and Errors
-
-A.2.8 The mode-line information isn’t always up-to-date
--------------------------------------------------------
-
-Magit is not responsible for the version control information that is
-being displayed in the mode-line and looks something like ‘Git-master’.
-The built-in "Version Control" package, also known as "VC", updates that
-information, and can be told to do so more often:
-
- (setq auto-revert-check-vc-info t)
-
- But doing so isn’t good for performance. For more (overly
-optimistic) information see *note (emacs)VC Mode Line::.
-
- If you don’t really care about seeing this information in the
-mode-line, but just don’t want to see _incorrect_ information, then
-consider simply not displaying it in the mode-line:
-
- (setq-default mode-line-format
- (delete '(vc-mode vc-mode) mode-line-format))
-
-
-File: magit.info, Node: A branch and tag sharing the same name breaks SOMETHING, Next: My Git hooks work on the command-line but not inside Magit, Prev: The mode-line information isn't always up-to-date, Up: FAQ - Issues and Errors
-
-A.2.9 A branch and tag sharing the same name breaks SOMETHING
--------------------------------------------------------------
-
-Or more generally, ambiguous refnames break SOMETHING.
-
- Magit assumes that refs are named non-ambiguously across the
-"refs/heads/", "refs/tags/", and "refs/remotes/" namespaces (i.e., all
-the names remain unique when those prefixes are stripped). We consider
-ambiguous refnames unsupported and recommend that you use a
-non-ambiguous naming scheme. However, if you do work with a repository
-that has ambiguous refnames, please report any issues you encounter so
-that we can investigate whether there is a simple fix.
-
-
-File: magit.info, Node: My Git hooks work on the command-line but not inside Magit, Next: git-commit-mode isn't used when committing from the command-line, Prev: A branch and tag sharing the same name breaks SOMETHING, Up: FAQ - Issues and Errors
-
-A.2.10 My Git hooks work on the command-line but not inside Magit
------------------------------------------------------------------
-
-When Magit calls ‘git’ it adds a few global arguments including
-‘--literal-pathspecs’ and the ‘git’ process started by Magit then passes
-that setting on to other ‘git’ process it starts itself. It does so by
-setting the environment variable ‘GIT_LITERAL_PATHSPECS’, not by calling
-subprocesses with the ‘--literal-pathspecs’ argument. You can therefore
-override this setting in hook scripts using ‘unset
-GIT_LITERAL_PATHSPECS’.
-
-
-File: magit.info, Node: git-commit-mode isn't used when committing from the command-line, Next: Point ends up inside invisible text when jumping to a file-visiting buffer, Prev: My Git hooks work on the command-line but not inside Magit, Up: FAQ - Issues and Errors
-
-A.2.11 ‘git-commit-mode’ isn’t used when committing from the command-line
--------------------------------------------------------------------------
-
-The reason for this is that ‘git-commit.el’ has not been loaded yet
-and/or that the server has not been started yet. These things have
-always already been taken care of when you commit from Magit because in
-order to do so, Magit has to be loaded and doing that involves loading
-‘git-commit’ and starting the server.
-
- If you want to commit from the command-line, then you have to take
-care of these things yourself. Your ‘init.el’ file should contain:
-
- (require 'git-commit)
- (server-mode)
-
- Instead of ‘(require ’git-commit)‘ you may also use:
-
- (load "/path/to/magit-autoloads.el")
-
- You might want to do that because loading ‘git-commit’ causes large
-parts of Magit to be loaded.
-
- There are also some variations of ‘(server-mode)’ that you might want
-to try. Personally I use:
-
- (use-package server
- :config (or (server-running-p) (server-mode)))
-
- Now you can use:
-
- $ emacs&
- $ EDITOR=emacsclient git commit
-
- However you cannot use:
-
- $ killall emacs
- $ EDITOR="emacsclient --alternate-editor emacs" git commit
-
- This will actually end up using ‘emacs’, not ‘emacsclient’. If you
-do this, then can still edit the commit message but ‘git-commit-mode’
-won’t be used and you have to exit ‘emacs’ to finish the process.
-
- Tautology ahead. If you want to be able to use ‘emacsclient’ to
-connect to a running ‘emacs’ instance, even though no ‘emacs’ instance
-is running, then you cannot use ‘emacsclient’ directly.
-
- Instead you have to create a script that does something like this:
-
- Try to use ‘emacsclient’ (without using ‘--alternate-editor’). If
-that succeeds, do nothing else. Otherwise start ‘emacs &’ (and
-‘init.el’ must call ‘server-start’) and try to use ‘emacsclient’ again.
-
-
-File: magit.info, Node: Point ends up inside invisible text when jumping to a file-visiting buffer, Prev: git-commit-mode isn't used when committing from the command-line, Up: FAQ - Issues and Errors
-
-A.2.12 Point ends up inside invisible text when jumping to a file-visiting buffer
----------------------------------------------------------------------------------
-
-This can happen when you type ‘RET’ on a hunk to visit the respective
-file at the respective position. One solution to this problem is to use
-‘global-reveal-mode’. It makes sure that text around point is always
-visible. If that is too drastic for your taste, then you may instead
-use ‘magit-diff-visit-file-hook’ to reveal the text, possibly using
-‘reveal-post-command’ or for Org buffers ‘org-reveal’.
-
-
-File: magit.info, Node: Debugging Tools, Next: Keystroke Index, Prev: FAQ, Up: Top
-
-B Debugging Tools
-*****************
-
-Magit and its dependencies provide a few debugging tools, and we
-appreciate it very much if you use those tools before reporting an
-issue. Please include all relevant output when reporting an issue.
-
-‘M-x magit-version’ (‘magit-version’)
-
- This command shows the currently used versions of Magit, Git, and
- Emacs in the echo area. Non-interactively this just returns the
- Magit version.
-
-‘M-x magit-emacs-Q-command’ (‘magit-emacs-Q-command’)
-
- This command shows a debugging shell command in the echo area and
- adds it to the kill ring. Paste that command into a shell and run
- it.
-
- This shell command starts ‘emacs’ with only ‘magit’ and its
- dependencies loaded. Neither your configuration nor other
- installed packages are loaded. This makes it easier to determine
- whether some issue lays with Magit or something else.
-
- If you run Magit from its Git repository, then you should be able
- to use ‘make emacs-Q’ instead of the output of this command.
-
-‘M-x magit-toggle-verbose-refresh’ (‘magit-toggle-verbose-refresh’)
-
- This command toggles whether Magit refreshes buffers verbosely.
- Enabling this helps figuring out which sections are bottlenecks.
- The additional output can be found in the ‘*Messages*’ buffer.
-
-‘M-x magit-debug-git-executable’ (‘magit-debug-git-executable’)
-
- This command displays a buffer containing information about the
- available and used ‘git’ executable(s), and can be useful when
- investigating ‘exec-path’ issues.
-
- Also see *note Git Executable::.
-
-‘M-x with-editor-debug’ (‘with-editor-debug’)
-
- This command displays a buffer containing information about the
- available and used ‘emacsclient’ executable(s), and can be useful
- when investigating why Magit (or rather ‘with-editor’) cannot find
- an appropriate ‘emacsclient’ executable.
-
- Also see *note (with-editor)Debugging::.
-
- Please also see the *note FAQ::.
-
-
-File: magit.info, Node: Keystroke Index, Next: Command Index, Prev: Debugging Tools, Up: Top
-
-Appendix C Keystroke Index
-**************************
-
-
-* Menu:
-
-* !: Running Git Manually.
- (line 12)
-* ! !: Running Git Manually.
- (line 17)
-* ! a: Running Git Manually.
- (line 58)
-* ! b: Running Git Manually.
- (line 62)
-* ! g: Running Git Manually.
- (line 66)
-* ! k: Running Git Manually.
- (line 54)
-* ! p: Running Git Manually.
- (line 25)
-* ! s: Running Git Manually.
- (line 35)
-* ! S: Running Git Manually.
- (line 40)
-* $: Viewing Git Output. (line 16)
-* %: Worktree. (line 8)
-* % b: Worktree. (line 13)
-* % c: Worktree. (line 17)
-* % g: Worktree. (line 30)
-* % k: Worktree. (line 25)
-* % m: Worktree. (line 21)
-* +: Log Buffer. (line 61)
-* + <1>: Refreshing Diffs. (line 69)
-* -: Log Buffer. (line 65)
-* - <1>: Refreshing Diffs. (line 65)
-* 0: Refreshing Diffs. (line 73)
-* 1: Section Visibility. (line 26)
-* 2: Section Visibility. (line 27)
-* 3: Section Visibility. (line 28)
-* 4: Section Visibility. (line 29)
-* =: Log Buffer. (line 55)
-* ^: Section Movement. (line 31)
-* a: Applying. (line 33)
-* A: Cherry Picking. (line 8)
-* A A: Cherry Picking. (line 17)
-* A a: Cherry Picking. (line 24)
-* A A <1>: Cherry Picking. (line 90)
-* A a <1>: Cherry Picking. (line 98)
-* A d: Cherry Picking. (line 54)
-* A h: Cherry Picking. (line 42)
-* A n: Cherry Picking. (line 65)
-* A s: Cherry Picking. (line 76)
-* A s <1>: Cherry Picking. (line 94)
-* B: Bisecting. (line 8)
-* b: Blaming. (line 105)
-* b <1>: Branch Commands. (line 12)
-* b <2>: Editing Rebase Sequences.
- (line 85)
-* B B: Bisecting. (line 16)
-* B b: Bisecting. (line 31)
-* b b: Branch Commands. (line 49)
-* b C: Branch Commands. (line 29)
-* b c: Branch Commands. (line 67)
-* B g: Bisecting. (line 36)
-* B k: Bisecting. (line 41)
-* b k: Branch Commands. (line 147)
-* b l: Branch Commands. (line 74)
-* b n: Branch Commands. (line 57)
-* B r: Bisecting. (line 47)
-* b r: Branch Commands. (line 153)
-* B s: Bisecting. (line 24)
-* b s: Branch Commands. (line 97)
-* b S: Branch Commands. (line 125)
-* b x: Branch Commands. (line 131)
-* c: Blaming. (line 138)
-* C: Cloning Repository. (line 20)
-* c <1>: Initiating a Commit. (line 8)
-* c <2>: Editing Rebase Sequences.
- (line 72)
-* c a: Initiating a Commit. (line 19)
-* c A: Initiating a Commit. (line 67)
-* C b: Cloning Repository. (line 41)
-* C C: Cloning Repository. (line 29)
-* c c: Initiating a Commit. (line 14)
-* C d: Cloning Repository. (line 54)
-* C e: Cloning Repository. (line 61)
-* c e: Initiating a Commit. (line 23)
-* c f: Initiating a Commit. (line 43)
-* c F: Initiating a Commit. (line 51)
-* C m: Cloning Repository. (line 46)
-* C s: Cloning Repository. (line 34)
-* c s: Initiating a Commit. (line 55)
-* c S: Initiating a Commit. (line 63)
-* c w: Initiating a Commit. (line 33)
-* C-<return>: Visiting Files and Blobs from a Diff.
- (line 51)
-* C-<tab>: Section Visibility. (line 13)
-* C-c C-a: Commit Pseudo Headers.
- (line 17)
-* C-c C-b: Log Buffer. (line 21)
-* C-c C-b <1>: Refreshing Diffs. (line 91)
-* C-c C-c: Transient Commands. (line 18)
-* C-c C-c <1>: Select from Log. (line 20)
-* C-c C-c <2>: Editing Commit Messages.
- (line 17)
-* C-c C-c <3>: Editing Rebase Sequences.
- (line 6)
-* C-c C-d: Refreshing Diffs. (line 81)
-* C-c C-d <1>: Editing Commit Messages.
- (line 58)
-* C-c C-e: Commands Available in Diffs.
- (line 25)
-* C-c C-f: Log Buffer. (line 25)
-* C-c C-f <1>: Refreshing Diffs. (line 95)
-* C-c C-i: Commit Pseudo Headers.
- (line 13)
-* C-c C-k: Select from Log. (line 26)
-* C-c C-k <1>: Editing Commit Messages.
- (line 22)
-* C-c C-k <2>: Editing Rebase Sequences.
- (line 11)
-* C-c C-n: Log Buffer. (line 29)
-* C-c C-o: Commit Pseudo Headers.
- (line 33)
-* C-c C-p: Commit Pseudo Headers.
- (line 37)
-* C-c C-r: Commit Pseudo Headers.
- (line 21)
-* C-c C-s: Commit Pseudo Headers.
- (line 25)
-* C-c C-t: Commands Available in Diffs.
- (line 14)
-* C-c C-t <1>: Commit Pseudo Headers.
- (line 29)
-* C-c C-w: Using the Revision Stack.
- (line 6)
-* C-c M-g: Minor Mode for Buffers Visiting Files.
- (line 54)
-* C-c M-g B: Blaming. (line 21)
-* C-c M-g b: Blaming. (line 32)
-* C-c M-g B <1>: Minor Mode for Buffers Visiting Files.
- (line 123)
-* C-c M-g B b: Blaming. (line 33)
-* C-c M-g B e: Blaming. (line 67)
-* C-c M-g B f: Blaming. (line 58)
-* C-c M-g B r: Blaming. (line 49)
-* C-c M-g c: Minor Mode for Buffers Visiting Files.
- (line 68)
-* C-c M-g D: Minor Mode for Buffers Visiting Files.
- (line 75)
-* C-c M-g d: Minor Mode for Buffers Visiting Files.
- (line 86)
-* C-c M-g e: Blaming. (line 66)
-* C-c M-g e <1>: Minor Mode for Buffers Visiting Files.
- (line 136)
-* C-c M-g f: Blaming. (line 57)
-* C-c M-g L: Minor Mode for Buffers Visiting Files.
- (line 96)
-* C-c M-g l: Minor Mode for Buffers Visiting Files.
- (line 107)
-* C-c M-g p: Minor Mode for Buffers Visiting Files.
- (line 146)
-* C-c M-g r: Blaming. (line 48)
-* C-c M-g s: Minor Mode for Buffers Visiting Files.
- (line 59)
-* C-c M-g t: Minor Mode for Buffers Visiting Files.
- (line 114)
-* C-c M-g u: Minor Mode for Buffers Visiting Files.
- (line 63)
-* C-c M-i: Commit Pseudo Headers.
- (line 42)
-* C-c M-s: Editing Commit Messages.
- (line 34)
-* C-w: Common Commands. (line 10)
-* C-x g: Status Buffer. (line 22)
-* C-x u: Editing Rebase Sequences.
- (line 94)
-* d: Diffing. (line 21)
-* D: Refreshing Diffs. (line 11)
-* d c: Diffing. (line 69)
-* d d: Diffing. (line 27)
-* D f: Refreshing Diffs. (line 46)
-* D F: Refreshing Diffs. (line 51)
-* D g: Refreshing Diffs. (line 17)
-* d p: Diffing. (line 61)
-* d r: Diffing. (line 31)
-* D r: Refreshing Diffs. (line 41)
-* d s: Diffing. (line 51)
-* D s: Refreshing Diffs. (line 22)
-* d t: Diffing. (line 74)
-* D t: Refreshing Diffs. (line 37)
-* d u: Diffing. (line 57)
-* d w: Diffing. (line 45)
-* D w: Refreshing Diffs. (line 29)
-* DEL: Log Buffer. (line 45)
-* DEL <1>: Commands Available in Diffs.
- (line 60)
-* DEL <2>: Blaming. (line 92)
-* DEL <3>: Editing Rebase Sequences.
- (line 28)
-* e: Ediffing. (line 9)
-* E: Ediffing. (line 21)
-* e <1>: Editing Rebase Sequences.
- (line 55)
-* E c: Ediffing. (line 65)
-* E i: Ediffing. (line 57)
-* E m: Ediffing. (line 35)
-* E r: Ediffing. (line 26)
-* E s: Ediffing. (line 48)
-* E u: Ediffing. (line 53)
-* E w: Ediffing. (line 61)
-* E z: Ediffing. (line 69)
-* f: Editing Rebase Sequences.
- (line 63)
-* f <1>: Fetching. (line 9)
-* F: Pulling. (line 9)
-* f a: Fetching. (line 50)
-* f C: Branch Commands. (line 30)
-* F C: Branch Commands. (line 31)
-* f e: Fetching. (line 36)
-* F e: Pulling. (line 30)
-* f m: Fetching. (line 54)
-* f o: Fetching. (line 40)
-* f p: Fetching. (line 15)
-* F p: Pulling. (line 14)
-* f r: Fetching. (line 45)
-* f u: Fetching. (line 23)
-* F u: Pulling. (line 22)
-* g: Automatic Refreshing of Magit Buffers.
- (line 24)
-* G: Automatic Refreshing of Magit Buffers.
- (line 33)
-* j: Commands Available in Diffs.
- (line 45)
-* k: Viewing Git Output. (line 24)
-* k <1>: Applying. (line 40)
-* k <2>: Editing Rebase Sequences.
- (line 68)
-* k <3>: Stashing. (line 96)
-* l: Logging. (line 29)
-* L: Refreshing Logs. (line 11)
-* L <1>: Log Buffer. (line 6)
-* L <2>: Log Margin. (line 57)
-* l <1>: Editing Rebase Sequences.
- (line 115)
-* l a: Logging. (line 60)
-* l b: Logging. (line 56)
-* L d: Log Margin. (line 74)
-* L g: Refreshing Logs. (line 17)
-* l h: Logging. (line 48)
-* l H: Reflog. (line 19)
-* l l: Logging. (line 35)
-* l L: Logging. (line 52)
-* L L: Log Margin. (line 66)
-* L l: Log Margin. (line 70)
-* l o: Logging. (line 41)
-* l O: Reflog. (line 15)
-* l r: Reflog. (line 11)
-* L s: Refreshing Logs. (line 22)
-* L t: Refreshing Logs. (line 37)
-* L w: Refreshing Logs. (line 29)
-* m: Merging. (line 9)
-* M: Remote Commands. (line 13)
-* m a: Merging. (line 45)
-* m a <1>: Merging. (line 95)
-* M a: Remote Commands. (line 50)
-* M C: Remote Commands. (line 33)
-* m e: Merging. (line 31)
-* m i: Merging. (line 58)
-* M k: Remote Commands. (line 65)
-* m m: Merging. (line 18)
-* m m <1>: Merging. (line 89)
-* m n: Merging. (line 38)
-* m p: Merging. (line 81)
-* M p: Remote Commands. (line 69)
-* M P: Remote Commands. (line 74)
-* M r: Remote Commands. (line 55)
-* m s: Merging. (line 72)
-* M u: Remote Commands. (line 60)
-* M-1: Section Visibility. (line 33)
-* M-2: Section Visibility. (line 34)
-* M-3: Section Visibility. (line 35)
-* M-4: Section Visibility. (line 36)
-* M-<tab>: Section Visibility. (line 17)
-* M-n: Section Movement. (line 26)
-* M-n <1>: Editing Commit Messages.
- (line 44)
-* M-n <2>: Editing Rebase Sequences.
- (line 47)
-* M-p: Section Movement. (line 20)
-* M-p <1>: Editing Commit Messages.
- (line 38)
-* M-p <2>: Editing Rebase Sequences.
- (line 43)
-* M-w: Blaming. (line 130)
-* M-w <1>: Common Commands. (line 27)
-* M-x magit-debug-git-executable: Git Executable. (line 45)
-* M-x magit-debug-git-executable <1>: Debugging Tools. (line 36)
-* M-x magit-describe-section-briefly: Section Types and Values.
- (line 13)
-* M-x magit-describe-section-briefly <1>: Matching Sections. (line 6)
-* M-x magit-emacs-Q-command: Debugging Tools. (line 16)
-* M-x magit-init: Creating Repository. (line 6)
-* M-x magit-reset-index: Staging and Unstaging.
- (line 87)
-* M-x magit-reverse-in-index: Staging and Unstaging.
- (line 62)
-* M-x magit-stage-file: Staging from File-Visiting Buffers.
- (line 10)
-* M-x magit-toggle-buffer-lock: Modes and Buffers. (line 17)
-* M-x magit-toggle-verbose-refresh: Debugging Tools. (line 30)
-* M-x magit-unstage-file: Staging from File-Visiting Buffers.
- (line 18)
-* M-x magit-version: Git Executable. (line 17)
-* M-x magit-version <1>: Debugging Tools. (line 10)
-* M-x magit-wip-commit: Wip Modes. (line 88)
-* M-x with-editor-debug: Debugging Tools. (line 44)
-* MM: Editing Rebase Sequences.
- (line 125)
-* Mt: Editing Rebase Sequences.
- (line 132)
-* n: Section Movement. (line 16)
-* n <1>: Blaming. (line 109)
-* N: Blaming. (line 113)
-* n <2>: Editing Rebase Sequences.
- (line 39)
-* n <3>: Minor Mode for Buffers Visiting Blobs.
- (line 16)
-* o: Submodule Transient. (line 6)
-* O: Subtree. (line 8)
-* o a: Submodule Transient. (line 20)
-* o d: Submodule Transient. (line 50)
-* O e: Subtree. (line 42)
-* O e p: Subtree. (line 54)
-* O e s: Subtree. (line 59)
-* o f: Submodule Transient. (line 58)
-* O i: Subtree. (line 13)
-* O i a: Subtree. (line 25)
-* O i c: Subtree. (line 30)
-* O i f: Subtree. (line 38)
-* O i m: Subtree. (line 34)
-* o l: Submodule Transient. (line 54)
-* o p: Submodule Transient. (line 34)
-* o r: Submodule Transient. (line 27)
-* o s: Submodule Transient. (line 44)
-* o u: Submodule Transient. (line 39)
-* p: Section Movement. (line 10)
-* p <1>: Blaming. (line 117)
-* P: Blaming. (line 121)
-* p <2>: Editing Rebase Sequences.
- (line 35)
-* P <1>: Pushing. (line 9)
-* p <3>: Minor Mode for Buffers Visiting Blobs.
- (line 12)
-* P C: Branch Commands. (line 32)
-* P e: Pushing. (line 31)
-* P m: Pushing. (line 50)
-* P o: Pushing. (line 36)
-* P p: Pushing. (line 15)
-* P r: Pushing. (line 41)
-* P t: Pushing. (line 58)
-* P T: Pushing. (line 66)
-* P u: Pushing. (line 23)
-* q: Quitting Windows. (line 6)
-* q <1>: Log Buffer. (line 14)
-* q <2>: Blaming. (line 125)
-* q <3>: Minor Mode for Buffers Visiting Blobs.
- (line 20)
-* r: Rebasing. (line 9)
-* r <1>: Editing Rebase Sequences.
- (line 51)
-* r a: Rebasing. (line 123)
-* r e: Rebasing. (line 44)
-* r e <1>: Rebasing. (line 118)
-* r f: Rebasing. (line 84)
-* r i: Rebasing. (line 80)
-* r k: Rebasing. (line 99)
-* r m: Rebasing. (line 89)
-* r p: Rebasing. (line 28)
-* r r: Rebasing. (line 106)
-* r s: Rebasing. (line 50)
-* r s <1>: Rebasing. (line 113)
-* r u: Rebasing. (line 36)
-* r w: Rebasing. (line 94)
-* RET: References Buffer. (line 181)
-* RET <1>: Visiting Files and Blobs from a Diff.
- (line 8)
-* RET <2>: Blaming. (line 78)
-* RET <3>: Editing Rebase Sequences.
- (line 16)
-* s: Staging and Unstaging.
- (line 28)
-* S: Staging and Unstaging.
- (line 36)
-* s <1>: Editing Rebase Sequences.
- (line 59)
-* S-<tab>: Section Visibility. (line 22)
-* SPC: Log Buffer. (line 35)
-* SPC <1>: Commands Available in Diffs.
- (line 56)
-* SPC <2>: Blaming. (line 82)
-* SPC <3>: Editing Rebase Sequences.
- (line 21)
-* t: Editing Rebase Sequences.
- (line 119)
-* t <1>: Tagging. (line 8)
-* T: Notes. (line 8)
-* T a: Notes. (line 52)
-* T c: Notes. (line 47)
-* t k: Tagging. (line 39)
-* T m: Notes. (line 38)
-* t p: Tagging. (line 46)
-* T p: Notes. (line 30)
-* t r: Tagging. (line 19)
-* T r: Notes. (line 22)
-* t t: Tagging. (line 14)
-* T T: Notes. (line 14)
-* TAB: Section Visibility. (line 9)
-* u: Staging and Unstaging.
- (line 43)
-* U: Staging and Unstaging.
- (line 52)
-* v: Applying. (line 44)
-* V: Reverting. (line 6)
-* V A: Reverting. (line 31)
-* V a: Reverting. (line 39)
-* V s: Reverting. (line 35)
-* V V: Reverting. (line 15)
-* V v: Reverting. (line 21)
-* W: Plain Patches. (line 6)
-* w: Maildir Patches. (line 8)
-* w a: Plain Patches. (line 21)
-* w a <1>: Maildir Patches. (line 25)
-* w a <2>: Maildir Patches. (line 43)
-* W c: Plain Patches. (line 12)
-* w m: Maildir Patches. (line 21)
-* W s: Plain Patches. (line 28)
-* w s: Maildir Patches. (line 38)
-* w w: Maildir Patches. (line 14)
-* w w <1>: Maildir Patches. (line 34)
-* x: Editing Rebase Sequences.
- (line 76)
-* x <1>: Resetting. (line 8)
-* X f: Resetting. (line 50)
-* X h: Resetting. (line 26)
-* X i: Resetting. (line 37)
-* X k: Resetting. (line 31)
-* X m: Resetting. (line 15)
-* X s: Resetting. (line 20)
-* X w: Resetting. (line 44)
-* X w <1>: Wip Modes. (line 66)
-* Y: Cherries. (line 17)
-* y: References Buffer. (line 6)
-* y <1>: Editing Rebase Sequences.
- (line 90)
-* y c: References Buffer. (line 26)
-* y o: References Buffer. (line 32)
-* y y: References Buffer. (line 21)
-* z: Stashing. (line 8)
-* z a: Stashing. (line 59)
-* z b: Stashing. (line 81)
-* z B: Stashing. (line 86)
-* z f: Stashing. (line 92)
-* z i: Stashing. (line 21)
-* z I: Stashing. (line 47)
-* z k: Stashing. (line 72)
-* z l: Stashing. (line 100)
-* z p: Stashing. (line 65)
-* z v: Stashing. (line 77)
-* z w: Stashing. (line 26)
-* z W: Stashing. (line 52)
-* z x: Stashing. (line 33)
-* z z: Stashing. (line 14)
-* z Z: Stashing. (line 40)
-
-
-File: magit.info, Node: Command Index, Next: Function Index, Prev: Keystroke Index, Up: Top
-
-Appendix D Command Index
-************************
-
-
-* Menu:
-
-* forward-line: Editing Rebase Sequences.
- (line 39)
-* git-commit-ack: Commit Pseudo Headers.
- (line 17)
-* git-commit-cc: Commit Pseudo Headers.
- (line 33)
-* git-commit-insert-pseudo-header: Commit Pseudo Headers.
- (line 13)
-* git-commit-next-message: Editing Commit Messages.
- (line 44)
-* git-commit-prev-message: Editing Commit Messages.
- (line 38)
-* git-commit-reported: Commit Pseudo Headers.
- (line 37)
-* git-commit-review: Commit Pseudo Headers.
- (line 21)
-* git-commit-save-message: Editing Commit Messages.
- (line 34)
-* git-commit-signoff: Commit Pseudo Headers.
- (line 25)
-* git-commit-suggested: Commit Pseudo Headers.
- (line 42)
-* git-commit-test: Commit Pseudo Headers.
- (line 29)
-* git-rebase-backward-line: Editing Rebase Sequences.
- (line 35)
-* git-rebase-break: Editing Rebase Sequences.
- (line 85)
-* git-rebase-edit: Editing Rebase Sequences.
- (line 55)
-* git-rebase-exec: Editing Rebase Sequences.
- (line 76)
-* git-rebase-fixup: Editing Rebase Sequences.
- (line 63)
-* git-rebase-insert: Editing Rebase Sequences.
- (line 90)
-* git-rebase-kill-line: Editing Rebase Sequences.
- (line 68)
-* git-rebase-label: Editing Rebase Sequences.
- (line 115)
-* git-rebase-merge: Editing Rebase Sequences.
- (line 125)
-* git-rebase-merge-toggle-editmsg: Editing Rebase Sequences.
- (line 132)
-* git-rebase-move-line-down: Editing Rebase Sequences.
- (line 47)
-* git-rebase-move-line-up: Editing Rebase Sequences.
- (line 43)
-* git-rebase-pick: Editing Rebase Sequences.
- (line 72)
-* git-rebase-reset: Editing Rebase Sequences.
- (line 119)
-* git-rebase-reword: Editing Rebase Sequences.
- (line 51)
-* git-rebase-show-commit: Editing Rebase Sequences.
- (line 16)
-* git-rebase-show-or-scroll-down: Editing Rebase Sequences.
- (line 28)
-* git-rebase-show-or-scroll-up: Editing Rebase Sequences.
- (line 21)
-* git-rebase-squash: Editing Rebase Sequences.
- (line 59)
-* git-rebase-undo: Editing Rebase Sequences.
- (line 94)
-* ido-enter-magit-status: Status Buffer. (line 72)
-* magit-am: Maildir Patches. (line 8)
-* magit-am-abort: Maildir Patches. (line 43)
-* magit-am-apply-maildir: Maildir Patches. (line 21)
-* magit-am-apply-patches: Maildir Patches. (line 14)
-* magit-am-continue: Maildir Patches. (line 34)
-* magit-am-skip: Maildir Patches. (line 38)
-* magit-apply: Applying. (line 33)
-* magit-bisect: Bisecting. (line 8)
-* magit-bisect-bad: Bisecting. (line 31)
-* magit-bisect-good: Bisecting. (line 36)
-* magit-bisect-reset: Bisecting. (line 47)
-* magit-bisect-run: Bisecting. (line 24)
-* magit-bisect-skip: Bisecting. (line 41)
-* magit-bisect-start: Bisecting. (line 16)
-* magit-blame: Blaming. (line 21)
-* magit-blame <1>: Blaming. (line 105)
-* magit-blame <2>: Minor Mode for Buffers Visiting Files.
- (line 123)
-* magit-blame-addition: Blaming. (line 32)
-* magit-blame-addition <1>: Blaming. (line 33)
-* magit-blame-copy-hash: Blaming. (line 130)
-* magit-blame-cycle-style: Blaming. (line 138)
-* magit-blame-echo: Blaming. (line 66)
-* magit-blame-echo <1>: Blaming. (line 67)
-* magit-blame-next-chunk: Blaming. (line 109)
-* magit-blame-next-chunk-same-commit: Blaming. (line 113)
-* magit-blame-previous-chunk: Blaming. (line 117)
-* magit-blame-previous-chunk-same-commit: Blaming. (line 121)
-* magit-blame-quit: Blaming. (line 125)
-* magit-blame-removal: Blaming. (line 48)
-* magit-blame-removal <1>: Blaming. (line 49)
-* magit-blame-reverse: Blaming. (line 57)
-* magit-blame-reverse <1>: Blaming. (line 58)
-* magit-blob-next: Minor Mode for Buffers Visiting Blobs.
- (line 16)
-* magit-blob-previous: Minor Mode for Buffers Visiting Files.
- (line 146)
-* magit-blob-previous <1>: Minor Mode for Buffers Visiting Blobs.
- (line 12)
-* magit-branch: Branch Commands. (line 12)
-* magit-branch-and-checkout: Branch Commands. (line 67)
-* magit-branch-checkout: Branch Commands. (line 74)
-* magit-branch-configure: Branch Commands. (line 29)
-* magit-branch-configure <1>: Branch Commands. (line 30)
-* magit-branch-configure <2>: Branch Commands. (line 31)
-* magit-branch-configure <3>: Branch Commands. (line 32)
-* magit-branch-create: Branch Commands. (line 57)
-* magit-branch-delete: Branch Commands. (line 147)
-* magit-branch-or-checkout: Branch Commands. (line 257)
-* magit-branch-orphan: Branch Commands. (line 252)
-* magit-branch-rename: Branch Commands. (line 153)
-* magit-branch-reset: Branch Commands. (line 131)
-* magit-branch-shelve: Auxiliary Branch Commands.
- (line 9)
-* magit-branch-spinoff: Branch Commands. (line 97)
-* magit-branch-spinout: Branch Commands. (line 125)
-* magit-branch-unshelve: Auxiliary Branch Commands.
- (line 20)
-* magit-checkout: Branch Commands. (line 49)
-* magit-cherry: Cherries. (line 17)
-* magit-cherry-apply: Cherry Picking. (line 24)
-* magit-cherry-copy: Cherry Picking. (line 17)
-* magit-cherry-donate: Cherry Picking. (line 54)
-* magit-cherry-harvest: Cherry Picking. (line 42)
-* magit-cherry-pick: Cherry Picking. (line 8)
-* magit-cherry-spinoff: Cherry Picking. (line 76)
-* magit-cherry-spinout: Cherry Picking. (line 65)
-* magit-clone: Cloning Repository. (line 20)
-* magit-clone-bare: Cloning Repository. (line 41)
-* magit-clone-mirror: Cloning Repository. (line 46)
-* magit-clone-regular: Cloning Repository. (line 29)
-* magit-clone-shallow: Cloning Repository. (line 34)
-* magit-clone-shallow-exclude: Cloning Repository. (line 61)
-* magit-clone-shallow-since: Cloning Repository. (line 54)
-* magit-commit: Initiating a Commit. (line 8)
-* magit-commit <1>: Minor Mode for Buffers Visiting Files.
- (line 68)
-* magit-commit-amend: Initiating a Commit. (line 19)
-* magit-commit-augment: Initiating a Commit. (line 67)
-* magit-commit-create: Initiating a Commit. (line 14)
-* magit-commit-extend: Initiating a Commit. (line 23)
-* magit-commit-fixup: Initiating a Commit. (line 43)
-* magit-commit-instant-fixup: Initiating a Commit. (line 51)
-* magit-commit-instant-squash: Initiating a Commit. (line 63)
-* magit-commit-reword: Initiating a Commit. (line 33)
-* magit-commit-squash: Initiating a Commit. (line 55)
-* magit-copy-buffer-revision: Common Commands. (line 27)
-* magit-copy-section-value: Common Commands. (line 10)
-* magit-cycle-margin-style: Log Margin. (line 70)
-* magit-debug-git-executable: Git Executable. (line 45)
-* magit-debug-git-executable <1>: Debugging Tools. (line 36)
-* magit-describe-section-briefly: Section Types and Values.
- (line 13)
-* magit-describe-section-briefly <1>: Matching Sections. (line 6)
-* magit-diff: Diffing. (line 21)
-* magit-diff <1>: Minor Mode for Buffers Visiting Files.
- (line 75)
-* magit-diff-buffer-file: Minor Mode for Buffers Visiting Files.
- (line 86)
-* magit-diff-default-context: Refreshing Diffs. (line 73)
-* magit-diff-dwim: Diffing. (line 27)
-* magit-diff-edit-hunk-commit: Commands Available in Diffs.
- (line 25)
-* magit-diff-flip-revs: Refreshing Diffs. (line 46)
-* magit-diff-less-context: Refreshing Diffs. (line 65)
-* magit-diff-more-context: Refreshing Diffs. (line 69)
-* magit-diff-paths: Diffing. (line 61)
-* magit-diff-range: Diffing. (line 31)
-* magit-diff-refresh: Refreshing Diffs. (line 11)
-* magit-diff-refresh <1>: Refreshing Diffs. (line 17)
-* magit-diff-save-default-arguments: Refreshing Diffs. (line 29)
-* magit-diff-set-default-arguments: Refreshing Diffs. (line 22)
-* magit-diff-show-or-scroll-down: Log Buffer. (line 45)
-* magit-diff-show-or-scroll-down <1>: Blaming. (line 92)
-* magit-diff-show-or-scroll-up: Log Buffer. (line 35)
-* magit-diff-show-or-scroll-up <1>: Blaming. (line 82)
-* magit-diff-staged: Diffing. (line 51)
-* magit-diff-switch-range-type: Refreshing Diffs. (line 41)
-* magit-diff-toggle-file-filter: Refreshing Diffs. (line 51)
-* magit-diff-toggle-refine-hunk: Refreshing Diffs. (line 37)
-* magit-diff-trace-definition: Commands Available in Diffs.
- (line 14)
-* magit-diff-unstaged: Diffing. (line 57)
-* magit-diff-visit-file: Visiting Files and Blobs from a Diff.
- (line 8)
-* magit-diff-visit-file-other-frame: Visiting Files and Blobs from a Diff.
- (line 74)
-* magit-diff-visit-file-other-window: Visiting Files and Blobs from a Diff.
- (line 73)
-* magit-diff-visit-file-worktree: Visiting Files and Blobs from a Diff.
- (line 51)
-* magit-diff-visit-worktree-file-other-frame: Visiting Files and Blobs from a Diff.
- (line 76)
-* magit-diff-visit-worktree-file-other-window: Visiting Files and Blobs from a Diff.
- (line 75)
-* magit-diff-while-committing: Refreshing Diffs. (line 81)
-* magit-diff-while-committing <1>: Editing Commit Messages.
- (line 58)
-* magit-diff-working-tree: Diffing. (line 45)
-* magit-discard: Applying. (line 40)
-* magit-dispatch: Transient Commands. (line 18)
-* magit-ediff: Ediffing. (line 21)
-* magit-ediff-compare: Ediffing. (line 26)
-* magit-ediff-dwim: Ediffing. (line 9)
-* magit-ediff-resolve: Ediffing. (line 35)
-* magit-ediff-show-commit: Ediffing. (line 65)
-* magit-ediff-show-staged: Ediffing. (line 57)
-* magit-ediff-show-stash: Ediffing. (line 69)
-* magit-ediff-show-unstaged: Ediffing. (line 53)
-* magit-ediff-show-working-tree: Ediffing. (line 61)
-* magit-ediff-stage: Ediffing. (line 48)
-* magit-edit-line-commit: Minor Mode for Buffers Visiting Files.
- (line 136)
-* magit-emacs-Q-command: Debugging Tools. (line 16)
-* magit-fetch: Fetching. (line 9)
-* magit-fetch-all: Fetching. (line 50)
-* magit-fetch-branch: Fetching. (line 40)
-* magit-fetch-from-pushremote: Fetching. (line 15)
-* magit-fetch-from-upstream: Fetching. (line 23)
-* magit-fetch-modules: Submodule Transient. (line 58)
-* magit-fetch-other: Fetching. (line 36)
-* magit-fetch-refspec: Fetching. (line 45)
-* magit-file-checkout: Resetting. (line 50)
-* magit-file-checkout <1>: Minor Mode for Buffers Visiting Files.
- (line 165)
-* magit-file-delete: Minor Mode for Buffers Visiting Files.
- (line 157)
-* magit-file-dispatch: Minor Mode for Buffers Visiting Files.
- (line 54)
-* magit-file-rename: Minor Mode for Buffers Visiting Files.
- (line 153)
-* magit-file-untrack: Minor Mode for Buffers Visiting Files.
- (line 161)
-* magit-find-file: General-Purpose Visit Commands.
- (line 9)
-* magit-find-file-other-frame: General-Purpose Visit Commands.
- (line 21)
-* magit-find-file-other-window: General-Purpose Visit Commands.
- (line 15)
-* magit-git-command: Running Git Manually.
- (line 25)
-* magit-git-command-topdir: Running Git Manually.
- (line 17)
-* magit-go-backward: Log Buffer. (line 21)
-* magit-go-backward <1>: Refreshing Diffs. (line 91)
-* magit-go-forward: Log Buffer. (line 25)
-* magit-go-forward <1>: Refreshing Diffs. (line 95)
-* magit-init: Creating Repository. (line 6)
-* magit-jump-to-diffstat-or-diff: Commands Available in Diffs.
- (line 45)
-* magit-kill-this-buffer: Minor Mode for Buffers Visiting Blobs.
- (line 20)
-* magit-list-repositories: Repository List. (line 6)
-* magit-list-submodules: Listing Submodules. (line 13)
-* magit-list-submodules <1>: Submodule Transient. (line 54)
-* magit-log: Logging. (line 29)
-* magit-log <1>: Minor Mode for Buffers Visiting Files.
- (line 96)
-* magit-log-all: Logging. (line 60)
-* magit-log-all-branches: Logging. (line 56)
-* magit-log-branches: Logging. (line 52)
-* magit-log-buffer-file: Minor Mode for Buffers Visiting Files.
- (line 107)
-* magit-log-bury-buffer: Log Buffer. (line 14)
-* magit-log-current: Logging. (line 35)
-* magit-log-double-commit-limit: Log Buffer. (line 61)
-* magit-log-half-commit-limit: Log Buffer. (line 65)
-* magit-log-head: Logging. (line 48)
-* magit-log-move-to-parent: Log Buffer. (line 29)
-* magit-log-other: Logging. (line 41)
-* magit-log-refresh: Refreshing Logs. (line 11)
-* magit-log-refresh <1>: Refreshing Logs. (line 17)
-* magit-log-refresh <2>: Log Buffer. (line 6)
-* magit-log-save-default-arguments: Refreshing Logs. (line 29)
-* magit-log-select-pick: Select from Log. (line 20)
-* magit-log-select-quit: Select from Log. (line 26)
-* magit-log-set-default-arguments: Refreshing Logs. (line 22)
-* magit-log-toggle-commit-limit: Log Buffer. (line 55)
-* magit-log-trace-definition: Minor Mode for Buffers Visiting Files.
- (line 114)
-* magit-margin-settings: Log Margin. (line 57)
-* magit-merge: Merging. (line 9)
-* magit-merge <1>: Merging. (line 89)
-* magit-merge-abort: Merging. (line 95)
-* magit-merge-absorb: Merging. (line 45)
-* magit-merge-editmsg: Merging. (line 31)
-* magit-merge-into: Merging. (line 58)
-* magit-merge-nocommit: Merging. (line 38)
-* magit-merge-plain: Merging. (line 18)
-* magit-merge-preview: Merging. (line 81)
-* magit-merge-squash: Merging. (line 72)
-* magit-mode-bury-buffer: Quitting Windows. (line 6)
-* magit-notes: Notes. (line 8)
-* magit-notes-edit: Notes. (line 14)
-* magit-notes-merge: Notes. (line 38)
-* magit-notes-merge-abort: Notes. (line 52)
-* magit-notes-merge-commit: Notes. (line 47)
-* magit-notes-prune: Notes. (line 30)
-* magit-notes-remove: Notes. (line 22)
-* magit-patch: Plain Patches. (line 6)
-* magit-patch-apply: Plain Patches. (line 21)
-* magit-patch-apply <1>: Maildir Patches. (line 25)
-* magit-patch-create: Plain Patches. (line 12)
-* magit-patch-save: Plain Patches. (line 28)
-* magit-pop-revision-stack: Using the Revision Stack.
- (line 6)
-* magit-process: Viewing Git Output. (line 16)
-* magit-process-kill: Viewing Git Output. (line 24)
-* magit-pull: Pulling. (line 9)
-* magit-pull-branch: Pulling. (line 30)
-* magit-pull-from-pushremote: Pulling. (line 14)
-* magit-pull-from-upstream: Pulling. (line 22)
-* magit-push: Pushing. (line 9)
-* magit-push-current: Pushing. (line 31)
-* magit-push-current-to-pushremote: Pushing. (line 15)
-* magit-push-current-to-upstream: Pushing. (line 23)
-* magit-push-implicitly args: Pushing. (line 74)
-* magit-push-matching: Pushing. (line 50)
-* magit-push-other: Pushing. (line 36)
-* magit-push-refspecs: Pushing. (line 41)
-* magit-push-tag: Pushing. (line 66)
-* magit-push-tags: Pushing. (line 58)
-* magit-push-to-remote remote args: Pushing. (line 85)
-* magit-rebase: Rebasing. (line 9)
-* magit-rebase-abort: Rebasing. (line 123)
-* magit-rebase-autosquash: Rebasing. (line 84)
-* magit-rebase-branch: Rebasing. (line 44)
-* magit-rebase-continue: Rebasing. (line 106)
-* magit-rebase-edit: Rebasing. (line 118)
-* magit-rebase-edit-commit: Rebasing. (line 89)
-* magit-rebase-interactive: Rebasing. (line 80)
-* magit-rebase-onto-pushremote: Rebasing. (line 28)
-* magit-rebase-onto-upstream: Rebasing. (line 36)
-* magit-rebase-remove-commit: Rebasing. (line 99)
-* magit-rebase-reword-commit: Rebasing. (line 94)
-* magit-rebase-skip: Rebasing. (line 113)
-* magit-rebase-subset: Rebasing. (line 50)
-* magit-reflog-current: Reflog. (line 11)
-* magit-reflog-head: Reflog. (line 19)
-* magit-reflog-other: Reflog. (line 15)
-* magit-refresh: Automatic Refreshing of Magit Buffers.
- (line 24)
-* magit-refresh-all: Automatic Refreshing of Magit Buffers.
- (line 33)
-* magit-remote: Remote Commands. (line 13)
-* magit-remote-add: Remote Commands. (line 50)
-* magit-remote-configure: Remote Commands. (line 33)
-* magit-remote-prune: Remote Commands. (line 69)
-* magit-remote-prune-refspecs: Remote Commands. (line 74)
-* magit-remote-remove: Remote Commands. (line 65)
-* magit-remote-rename: Remote Commands. (line 55)
-* magit-remote-set-url: Remote Commands. (line 60)
-* magit-reset-hard: Resetting. (line 26)
-* magit-reset-index: Staging and Unstaging.
- (line 87)
-* magit-reset-index <1>: Resetting. (line 37)
-* magit-reset-keep: Resetting. (line 31)
-* magit-reset-mixed: Resetting. (line 15)
-* magit-reset-quickly: Resetting. (line 8)
-* magit-reset-soft: Resetting. (line 20)
-* magit-reset-worktree: Resetting. (line 44)
-* magit-reset-worktree <1>: Wip Modes. (line 66)
-* magit-reverse: Applying. (line 44)
-* magit-reverse-in-index: Staging and Unstaging.
- (line 62)
-* magit-revert: Reverting. (line 6)
-* magit-revert-and-commit: Reverting. (line 15)
-* magit-revert-no-commit: Reverting. (line 21)
-* magit-run: Running Git Manually.
- (line 12)
-* magit-run-git-gui: Running Git Manually.
- (line 66)
-* magit-run-gitk: Running Git Manually.
- (line 54)
-* magit-run-gitk-all: Running Git Manually.
- (line 58)
-* magit-run-gitk-branches: Running Git Manually.
- (line 62)
-* magit-section-backward: Section Movement. (line 10)
-* magit-section-backward-siblings: Section Movement. (line 20)
-* magit-section-cycle: Section Visibility. (line 13)
-* magit-section-cycle-diffs: Section Visibility. (line 17)
-* magit-section-cycle-global: Section Visibility. (line 22)
-* magit-section-forward: Section Movement. (line 16)
-* magit-section-forward-siblings: Section Movement. (line 26)
-* magit-section-hide: Section Visibility. (line 49)
-* magit-section-hide-children: Section Visibility. (line 64)
-* magit-section-show: Section Visibility. (line 45)
-* magit-section-show-children: Section Visibility. (line 58)
-* magit-section-show-headings: Section Visibility. (line 53)
-* magit-section-show-level-1: Section Visibility. (line 26)
-* magit-section-show-level-1-all: Section Visibility. (line 33)
-* magit-section-show-level-2: Section Visibility. (line 27)
-* magit-section-show-level-2-all: Section Visibility. (line 34)
-* magit-section-show-level-3: Section Visibility. (line 28)
-* magit-section-show-level-3-all: Section Visibility. (line 35)
-* magit-section-show-level-4: Section Visibility. (line 29)
-* magit-section-show-level-4-all: Section Visibility. (line 36)
-* magit-section-toggle: Section Visibility. (line 9)
-* magit-section-toggle-children: Section Visibility. (line 68)
-* magit-section-up: Section Movement. (line 31)
-* magit-sequence-abort: Cherry Picking. (line 98)
-* magit-sequence-abort <1>: Reverting. (line 39)
-* magit-sequence-continue: Cherry Picking. (line 90)
-* magit-sequence-continue <1>: Reverting. (line 31)
-* magit-sequence-skip: Cherry Picking. (line 94)
-* magit-sequence-skip <1>: Reverting. (line 35)
-* magit-shell-command: Running Git Manually.
- (line 40)
-* magit-shell-command-topdir: Running Git Manually.
- (line 35)
-* magit-show-commit: Diffing. (line 69)
-* magit-show-commit <1>: Blaming. (line 78)
-* magit-show-refs: References Buffer. (line 6)
-* magit-show-refs-current: References Buffer. (line 26)
-* magit-show-refs-head: References Buffer. (line 21)
-* magit-show-refs-other: References Buffer. (line 32)
-* magit-snapshot-both: Stashing. (line 40)
-* magit-snapshot-index: Stashing. (line 47)
-* magit-snapshot-worktree: Stashing. (line 52)
-* magit-stage: Staging and Unstaging.
- (line 28)
-* magit-stage-file: Staging from File-Visiting Buffers.
- (line 10)
-* magit-stage-file <1>: Minor Mode for Buffers Visiting Files.
- (line 59)
-* magit-stage-modified: Staging and Unstaging.
- (line 36)
-* magit-stash: Stashing. (line 8)
-* magit-stash-apply: Stashing. (line 59)
-* magit-stash-both: Stashing. (line 14)
-* magit-stash-branch: Stashing. (line 81)
-* magit-stash-branch-here: Stashing. (line 86)
-* magit-stash-clear: Stashing. (line 96)
-* magit-stash-drop: Stashing. (line 72)
-* magit-stash-format-patch: Stashing. (line 92)
-* magit-stash-index: Stashing. (line 21)
-* magit-stash-keep-index: Stashing. (line 33)
-* magit-stash-list: Stashing. (line 100)
-* magit-stash-pop: Stashing. (line 65)
-* magit-stash-show: Diffing. (line 74)
-* magit-stash-show <1>: Stashing. (line 77)
-* magit-stash-worktree: Stashing. (line 26)
-* magit-status: Status Buffer. (line 22)
-* magit-submodule: Submodule Transient. (line 6)
-* magit-submodule-add: Submodule Transient. (line 20)
-* magit-submodule-fetch: Fetching. (line 54)
-* magit-submodule-populate: Submodule Transient. (line 34)
-* magit-submodule-register: Submodule Transient. (line 27)
-* magit-submodule-synchronize: Submodule Transient. (line 44)
-* magit-submodule-unpopulate: Submodule Transient. (line 50)
-* magit-submodule-update: Submodule Transient. (line 39)
-* magit-subtree: Subtree. (line 8)
-* magit-subtree-add: Subtree. (line 25)
-* magit-subtree-add-commit: Subtree. (line 30)
-* magit-subtree-export: Subtree. (line 42)
-* magit-subtree-import: Subtree. (line 13)
-* magit-subtree-merge: Subtree. (line 34)
-* magit-subtree-pull: Subtree. (line 38)
-* magit-subtree-push: Subtree. (line 54)
-* magit-subtree-split: Subtree. (line 59)
-* magit-tag: Tagging. (line 8)
-* magit-tag-create: Tagging. (line 14)
-* magit-tag-delete: Tagging. (line 39)
-* magit-tag-prune: Tagging. (line 46)
-* magit-tag-release: Tagging. (line 19)
-* magit-toggle-buffer-lock: Modes and Buffers. (line 17)
-* magit-toggle-margin: Refreshing Logs. (line 37)
-* magit-toggle-margin <1>: Log Margin. (line 66)
-* magit-toggle-margin-details: Log Margin. (line 74)
-* magit-toggle-verbose-refresh: Debugging Tools. (line 30)
-* magit-unstage: Staging and Unstaging.
- (line 43)
-* magit-unstage-all: Staging and Unstaging.
- (line 52)
-* magit-unstage-file: Staging from File-Visiting Buffers.
- (line 18)
-* magit-unstage-file <1>: Minor Mode for Buffers Visiting Files.
- (line 63)
-* magit-version: Git Executable. (line 17)
-* magit-version <1>: Debugging Tools. (line 10)
-* magit-visit-ref: References Buffer. (line 181)
-* magit-wip-commit: Wip Modes. (line 88)
-* magit-wip-log: Wip Modes. (line 48)
-* magit-wip-log-current: Wip Modes. (line 57)
-* magit-worktree: Worktree. (line 8)
-* magit-worktree-branch: Worktree. (line 17)
-* magit-worktree-checkout: Worktree. (line 13)
-* magit-worktree-delete: Worktree. (line 25)
-* magit-worktree-move: Worktree. (line 21)
-* magit-worktree-status: Worktree. (line 30)
-* scroll-down: Commands Available in Diffs.
- (line 60)
-* scroll-up: Commands Available in Diffs.
- (line 56)
-* with-editor-cancel: Editing Commit Messages.
- (line 22)
-* with-editor-cancel <1>: Editing Rebase Sequences.
- (line 11)
-* with-editor-debug: Debugging Tools. (line 44)
-* with-editor-finish: Editing Commit Messages.
- (line 17)
-* with-editor-finish <1>: Editing Rebase Sequences.
- (line 6)
-
-
-File: magit.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top
-
-Appendix E Function Index
-*************************
-
-
-* Menu:
-
-* bug-reference-mode: Commit Mode and Hooks.
- (line 56)
-* git-commit-check-style-conventions: Commit Message Conventions.
- (line 40)
-* git-commit-propertize-diff: Commit Mode and Hooks.
- (line 47)
-* git-commit-save-message: Commit Mode and Hooks.
- (line 28)
-* git-commit-setup-changelog-support: Commit Mode and Hooks.
- (line 32)
-* git-commit-turn-on-auto-fill: Commit Mode and Hooks.
- (line 37)
-* git-commit-turn-on-flyspell: Commit Mode and Hooks.
- (line 42)
-* ido-enter-magit-status: Status Buffer. (line 72)
-* magit-add-section-hook: Section Hooks. (line 20)
-* magit-after-save-refresh-status: Automatic Refreshing of Magit Buffers.
- (line 58)
-* magit-branch-or-checkout: Branch Commands. (line 257)
-* magit-branch-orphan: Branch Commands. (line 252)
-* magit-branch-shelve: Auxiliary Branch Commands.
- (line 9)
-* magit-branch-unshelve: Auxiliary Branch Commands.
- (line 20)
-* magit-builtin-completing-read: Support for Completion Frameworks.
- (line 42)
-* magit-call-git: Calling Git for Effect.
- (line 28)
-* magit-call-process: Calling Git for Effect.
- (line 32)
-* magit-cancel-section: Creating Sections. (line 71)
-* magit-completing-read: Support for Completion Frameworks.
- (line 60)
-* magit-current-section: Section Selection. (line 6)
-* magit-define-section-jumper: Creating Sections. (line 77)
-* magit-diff-scope: Matching Sections. (line 118)
-* magit-diff-type: Matching Sections. (line 95)
-* magit-diff-visit-file-other-frame: Visiting Files and Blobs from a Diff.
- (line 74)
-* magit-diff-visit-file-other-window: Visiting Files and Blobs from a Diff.
- (line 73)
-* magit-diff-visit-worktree-file-other-frame: Visiting Files and Blobs from a Diff.
- (line 76)
-* magit-diff-visit-worktree-file-other-window: Visiting Files and Blobs from a Diff.
- (line 75)
-* magit-disable-section-inserter: Per-Repository Configuration.
- (line 31)
-* magit-display-buffer: Switching Buffers. (line 6)
-* magit-display-buffer-fullcolumn-most-v1: Switching Buffers. (line 75)
-* magit-display-buffer-fullframe-status-topleft-v1: Switching Buffers.
- (line 65)
-* magit-display-buffer-fullframe-status-v1: Switching Buffers.
- (line 59)
-* magit-display-buffer-same-window-except-diff-v1: Switching Buffers.
- (line 53)
-* magit-display-buffer-traditional: Switching Buffers. (line 45)
-* magit-file-checkout: Minor Mode for Buffers Visiting Files.
- (line 165)
-* magit-file-delete: Minor Mode for Buffers Visiting Files.
- (line 157)
-* magit-file-rename: Minor Mode for Buffers Visiting Files.
- (line 153)
-* magit-file-untrack: Minor Mode for Buffers Visiting Files.
- (line 161)
-* magit-find-file: General-Purpose Visit Commands.
- (line 9)
-* magit-find-file-other-frame: General-Purpose Visit Commands.
- (line 21)
-* magit-find-file-other-window: General-Purpose Visit Commands.
- (line 15)
-* magit-generate-buffer-name-default-function: Naming Buffers.
- (line 17)
-* magit-get-section: Matching Sections. (line 16)
-* magit-git: Calling Git for Effect.
- (line 65)
-* magit-git-exit-code: Getting a Value from Git.
- (line 10)
-* magit-git-failure: Getting a Value from Git.
- (line 19)
-* magit-git-false: Getting a Value from Git.
- (line 29)
-* magit-git-insert: Getting a Value from Git.
- (line 34)
-* magit-git-items: Getting a Value from Git.
- (line 49)
-* magit-git-lines: Getting a Value from Git.
- (line 44)
-* magit-git-str: Getting a Value from Git.
- (line 72)
-* magit-git-string: Getting a Value from Git.
- (line 38)
-* magit-git-success: Getting a Value from Git.
- (line 14)
-* magit-git-true: Getting a Value from Git.
- (line 24)
-* magit-git-wash: Calling Git for Effect.
- (line 70)
-* magit-hunk-set-window-start: Section Movement. (line 51)
-* magit-ido-completing-read: Support for Completion Frameworks.
- (line 48)
-* magit-insert-am-sequence: Status Sections. (line 28)
-* magit-insert-assumed-unchanged-files: Status Sections. (line 117)
-* magit-insert-bisect-log: Status Sections. (line 46)
-* magit-insert-bisect-output: Status Sections. (line 38)
-* magit-insert-bisect-rest: Status Sections. (line 42)
-* magit-insert-diff-filter-header: Status Header Sections.
- (line 38)
-* magit-insert-error-header: Status Header Sections.
- (line 28)
-* magit-insert-head-branch-header: Status Header Sections.
- (line 42)
-* magit-insert-heading: Creating Sections. (line 42)
-* magit-insert-ignored-files: Status Sections. (line 100)
-* magit-insert-local-branches: References Sections. (line 17)
-* magit-insert-merge-log: Status Sections. (line 18)
-* magit-insert-modules: Status Module Sections.
- (line 12)
-* magit-insert-modules-overview: Status Module Sections.
- (line 33)
-* magit-insert-modules-unpulled-from-pushremote: Status Module Sections.
- (line 50)
-* magit-insert-modules-unpulled-from-upstream: Status Module Sections.
- (line 44)
-* magit-insert-modules-unpushed-to-pushremote: Status Module Sections.
- (line 62)
-* magit-insert-modules-unpushed-to-upstream: Status Module Sections.
- (line 56)
-* magit-insert-push-branch-header: Status Header Sections.
- (line 51)
-* magit-insert-rebase-sequence: Status Sections. (line 23)
-* magit-insert-recent-commits: Status Sections. (line 131)
-* magit-insert-remote-branches: References Sections. (line 21)
-* magit-insert-remote-header: Status Header Sections.
- (line 67)
-* magit-insert-repo-header: Status Header Sections.
- (line 63)
-* magit-insert-section: Creating Sections. (line 6)
-* magit-insert-sequencer-sequence: Status Sections. (line 33)
-* magit-insert-skip-worktree-files: Status Sections. (line 110)
-* magit-insert-staged-changes: Status Sections. (line 63)
-* magit-insert-stashes: Status Sections. (line 67)
-* magit-insert-status-headers: Status Header Sections.
- (line 12)
-* magit-insert-tags: References Sections. (line 25)
-* magit-insert-tags-header: Status Header Sections.
- (line 56)
-* magit-insert-tracked-files: Status Sections. (line 96)
-* magit-insert-unpulled-cherries: Status Sections. (line 142)
-* magit-insert-unpulled-from-pushremote: Status Sections. (line 79)
-* magit-insert-unpulled-from-upstream: Status Sections. (line 74)
-* magit-insert-unpulled-or-recent-commits: Status Sections. (line 124)
-* magit-insert-unpushed-cherries: Status Sections. (line 149)
-* magit-insert-unpushed-to-pushremote: Status Sections. (line 89)
-* magit-insert-unpushed-to-upstream: Status Sections. (line 84)
-* magit-insert-unstaged-changes: Status Sections. (line 59)
-* magit-insert-untracked-files: Status Sections. (line 50)
-* magit-insert-upstream-branch-header: Status Header Sections.
- (line 46)
-* magit-insert-user-header: Status Header Sections.
- (line 75)
-* magit-list-repositories: Repository List. (line 6)
-* magit-list-submodules: Listing Submodules. (line 13)
-* magit-log-maybe-show-more-commits: Section Movement. (line 66)
-* magit-log-maybe-update-blob-buffer: Section Movement. (line 82)
-* magit-log-maybe-update-revision-buffer: Section Movement. (line 74)
-* magit-maybe-set-dedicated: Switching Buffers. (line 100)
-* magit-mode-display-buffer: Refreshing Buffers. (line 33)
-* magit-mode-quit-window: Quitting Windows. (line 34)
-* magit-mode-setup: Refreshing Buffers. (line 17)
-* magit-push-implicitly: Pushing. (line 74)
-* magit-push-to-remote: Pushing. (line 85)
-* magit-region-sections: Section Selection. (line 10)
-* magit-region-values: Section Selection. (line 37)
-* magit-repolist-column-branch: Repository List. (line 44)
-* magit-repolist-column-branches: Repository List. (line 53)
-* magit-repolist-column-flag: Repository List. (line 61)
-* magit-repolist-column-ident: Repository List. (line 30)
-* magit-repolist-column-path: Repository List. (line 35)
-* magit-repolist-column-stashes: Repository List. (line 57)
-* magit-repolist-column-unpulled-from-pushremote: Repository List.
- (line 81)
-* magit-repolist-column-unpulled-from-upstream: Repository List.
- (line 76)
-* magit-repolist-column-unpushed-to-pushremote: Repository List.
- (line 91)
-* magit-repolist-column-unpushed-to-upstream: Repository List.
- (line 86)
-* magit-repolist-column-upstream: Repository List. (line 48)
-* magit-repolist-column-version: Repository List. (line 39)
-* magit-restore-window-configuration: Quitting Windows. (line 23)
-* magit-run-git: Calling Git for Effect.
- (line 36)
-* magit-run-git-async: Calling Git for Effect.
- (line 80)
-* magit-run-git-with-editor: Calling Git for Effect.
- (line 93)
-* magit-run-git-with-input: Calling Git for Effect.
- (line 40)
-* magit-run-git-with-logfile: Calling Git for Effect.
- (line 56)
-* magit-save-window-configuration: Switching Buffers. (line 89)
-* magit-section-case: Matching Sections. (line 71)
-* magit-section-hide: Section Visibility. (line 49)
-* magit-section-hide-children: Section Visibility. (line 64)
-* magit-section-ident: Matching Sections. (line 11)
-* magit-section-match: Matching Sections. (line 21)
-* magit-section-set-window-start: Section Movement. (line 59)
-* magit-section-show: Section Visibility. (line 45)
-* magit-section-show-children: Section Visibility. (line 58)
-* magit-section-show-headings: Section Visibility. (line 53)
-* magit-section-toggle-children: Section Visibility. (line 68)
-* magit-section-value-if: Matching Sections. (line 61)
-* magit-start-git: Calling Git for Effect.
- (line 105)
-* magit-start-process: Calling Git for Effect.
- (line 124)
-* magit-stashes-maybe-update-stash-buffer: Section Movement. (line 106)
-* magit-status-maybe-update-blob-buffer: Section Movement. (line 100)
-* magit-status-maybe-update-revision-buffer: Section Movement.
- (line 88)
-* magit-status-maybe-update-stash-buffer: Section Movement. (line 94)
-* magit-wip-log: Wip Modes. (line 48)
-* magit-wip-log-current: Wip Modes. (line 57)
-* with-editor-usage-message: Commit Mode and Hooks.
- (line 60)
-
-
-File: magit.info, Node: Variable Index, Prev: Function Index, Up: Top
-
-Appendix F Variable Index
-*************************
-
-
-* Menu:
-
-* auto-revert-buffer-list-filter: Automatic Reverting of File-Visiting Buffers.
- (line 81)
-* auto-revert-interval: Automatic Reverting of File-Visiting Buffers.
- (line 76)
-* auto-revert-mode: Automatic Reverting of File-Visiting Buffers.
- (line 62)
-* auto-revert-stop-on-user-input: Automatic Reverting of File-Visiting Buffers.
- (line 71)
-* auto-revert-use-notify: Automatic Reverting of File-Visiting Buffers.
- (line 49)
-* auto-revert-verbose: Automatic Reverting of File-Visiting Buffers.
- (line 103)
-* branch.autoSetupMerge: Branch Git Variables.
- (line 81)
-* branch.autoSetupRebase: Branch Git Variables.
- (line 98)
-* branch.NAME.description: Branch Git Variables.
- (line 48)
-* branch.NAME.merge: Branch Git Variables.
- (line 10)
-* branch.NAME.pushRemote: Branch Git Variables.
- (line 34)
-* branch.NAME.rebase: Branch Git Variables.
- (line 22)
-* branch.NAME.remote: Branch Git Variables.
- (line 16)
-* core.notesRef: Notes. (line 60)
-* git-commit-fill-column: Commit Message Conventions.
- (line 19)
-* git-commit-finish-query-functions: Commit Message Conventions.
- (line 24)
-* git-commit-known-pseudo-headers: Commit Pseudo Headers.
- (line 9)
-* git-commit-major-mode: Commit Mode and Hooks.
- (line 12)
-* git-commit-setup-hook: Commit Mode and Hooks.
- (line 22)
-* git-commit-setup-hook <1>: Commit Mode and Hooks.
- (line 64)
-* git-commit-style-convention-checks: Commit Message Conventions.
- (line 46)
-* git-commit-summary-max-length: Commit Message Conventions.
- (line 13)
-* git-rebase-auto-advance: Editing Rebase Sequences.
- (line 99)
-* git-rebase-confirm-cancel: Editing Rebase Sequences.
- (line 107)
-* git-rebase-show-instructions: Editing Rebase Sequences.
- (line 103)
-* global-auto-revert-mode: Automatic Reverting of File-Visiting Buffers.
- (line 22)
-* global-magit-file-mode: Minor Mode for Buffers Visiting Files.
- (line 13)
-* magit-auto-revert-immediately: Automatic Reverting of File-Visiting Buffers.
- (line 32)
-* magit-auto-revert-mode: Automatic Reverting of File-Visiting Buffers.
- (line 17)
-* magit-auto-revert-tracked-only: Automatic Reverting of File-Visiting Buffers.
- (line 55)
-* magit-bisect-show-graph: Bisecting. (line 55)
-* magit-blame-disable-modes: Blaming. (line 168)
-* magit-blame-echo-style: Blaming. (line 151)
-* magit-blame-goto-chunk-hook: Blaming. (line 174)
-* magit-blame-read-only: Blaming. (line 163)
-* magit-blame-styles: Blaming. (line 146)
-* magit-blame-time-format: Blaming. (line 158)
-* magit-branch-adjust-remote-upstream-alist: Branch Commands. (line 210)
-* magit-branch-direct-configure: Branch Commands. (line 20)
-* magit-branch-prefer-remote-upstream: Branch Commands. (line 165)
-* magit-branch-read-upstream-first: Branch Commands. (line 159)
-* magit-buffer-name-format: Naming Buffers. (line 27)
-* magit-bury-buffer-function: Quitting Windows. (line 14)
-* magit-cherry-margin: Cherries. (line 22)
-* magit-clone-always-transient: Cloning Repository. (line 12)
-* magit-clone-default-directory: Cloning Repository. (line 90)
-* magit-clone-name-alist: Cloning Repository. (line 103)
-* magit-clone-set-remote-head: Cloning Repository. (line 68)
-* magit-clone-set-remote.pushDefault: Cloning Repository. (line 78)
-* magit-clone-url-format: Cloning Repository. (line 124)
-* magit-commit-ask-to-stage: Initiating a Commit. (line 75)
-* magit-commit-extend-override-date: Initiating a Commit. (line 80)
-* magit-commit-reword-override-date: Initiating a Commit. (line 84)
-* magit-commit-squash-confirm: Initiating a Commit. (line 88)
-* magit-completing-read-function: Support for Completion Frameworks.
- (line 27)
-* magit-diff-adjust-tab-width: Diff Options. (line 21)
-* magit-diff-buffer-file-locked: Minor Mode for Buffers Visiting Files.
- (line 91)
-* magit-diff-hide-trailing-cr-characters: Diff Options. (line 90)
-* magit-diff-highlight-hunk-region-functions: Diff Options. (line 94)
-* magit-diff-highlight-indentation: Diff Options. (line 75)
-* magit-diff-highlight-trailing: Diff Options. (line 70)
-* magit-diff-paint-whitespace: Diff Options. (line 43)
-* magit-diff-paint-whitespace-lines: Diff Options. (line 60)
-* magit-diff-refine-hunk: Diff Options. (line 6)
-* magit-diff-refine-ignore-whitespace: Diff Options. (line 16)
-* magit-diff-unmarked-lines-keep-foreground: Diff Options. (line 120)
-* magit-diff-visit-previous-blob: Visiting Files and Blobs from a Diff.
- (line 39)
-* magit-direct-use-buffer-arguments: Transient Arguments and Buffer Variables.
- (line 73)
-* magit-display-buffer-function: Switching Buffers. (line 27)
-* magit-display-buffer-noselect: Switching Buffers. (line 18)
-* magit-dwim-selection: Completion and Confirmation.
- (line 42)
-* magit-ediff-dwim-show-on-hunks: Ediffing. (line 73)
-* magit-ediff-quit-hook: Ediffing. (line 88)
-* magit-ediff-show-stash-with-index: Ediffing. (line 81)
-* magit-file-mode-map: Minor Mode for Buffers Visiting Files.
- (line 20)
-* magit-generate-buffer-name-function: Naming Buffers. (line 6)
-* magit-git-debug: Viewing Git Output. (line 28)
-* magit-git-debug <1>: Getting a Value from Git.
- (line 64)
-* magit-git-executable: Git Executable. (line 39)
-* magit-git-global-arguments: Global Git Arguments.
- (line 6)
-* magit-keep-region-overlay: The Selection. (line 52)
-* magit-list-refs-sortby: Additional Completion Options.
- (line 6)
-* magit-log-auto-more: Log Buffer. (line 69)
-* magit-log-buffer-file-locked: Minor Mode for Buffers Visiting Files.
- (line 118)
-* magit-log-margin: Log Margin. (line 12)
-* magit-log-margin-show-committer-date: Log Margin. (line 49)
-* magit-log-section-commit-count: Status Sections. (line 136)
-* magit-log-select-margin: Select from Log. (line 30)
-* magit-log-show-refname-after-summary: Log Buffer. (line 75)
-* magit-log-trace-definition-function: Commands Available in Diffs.
- (line 18)
-* magit-module-sections-hook: Status Module Sections.
- (line 20)
-* magit-module-sections-nested: Status Module Sections.
- (line 24)
-* magit-no-confirm: Action Confirmation. (line 18)
-* magit-pop-revision-stack-format: Using the Revision Stack.
- (line 35)
-* magit-post-display-buffer-hook: Switching Buffers. (line 95)
-* magit-pre-display-buffer-hook: Switching Buffers. (line 84)
-* magit-prefer-remote-upstream: Branch Git Variables.
- (line 126)
-* magit-prefix-use-buffer-arguments: Transient Arguments and Buffer Variables.
- (line 64)
-* magit-process-raise-error: Calling Git for Effect.
- (line 151)
-* magit-pull-or-fetch: Fetching. (line 59)
-* magit-reflog-margin: Reflog. (line 23)
-* magit-refresh-args: Refreshing Buffers. (line 55)
-* magit-refresh-buffer-hook: Automatic Refreshing of Magit Buffers.
- (line 42)
-* magit-refresh-function: Refreshing Buffers. (line 49)
-* magit-refresh-status-buffer: Automatic Refreshing of Magit Buffers.
- (line 48)
-* magit-refs-filter-alist: References Buffer. (line 159)
-* magit-refs-focus-column-width: References Buffer. (line 82)
-* magit-refs-margin: References Buffer. (line 97)
-* magit-refs-margin-for-tags: References Buffer. (line 125)
-* magit-refs-pad-commit-counts: References Buffer. (line 49)
-* magit-refs-primary-column-width: References Buffer. (line 69)
-* magit-refs-sections-hook: References Sections. (line 13)
-* magit-refs-show-commit-count: References Buffer. (line 37)
-* magit-refs-show-remote-prefix: References Buffer. (line 62)
-* magit-remote-add-set-remote.pushDefault: Remote Commands. (line 92)
-* magit-remote-direct-configure: Remote Commands. (line 21)
-* magit-repolist-columns: Repository List. (line 14)
-* magit-repository-directories: Status Buffer. (line 58)
-* magit-revision-filter-files-on-follow: Revision Buffer. (line 64)
-* magit-revision-insert-related-refs: Revision Buffer. (line 6)
-* magit-revision-show-gravatars: Revision Buffer. (line 19)
-* magit-revision-use-hash-sections: Revision Buffer. (line 36)
-* magit-root-section: Matching Sections. (line 87)
-* magit-save-repository-buffers: Automatic Saving of File-Visiting Buffers.
- (line 13)
-* magit-section-cache-visibility: Section Visibility. (line 95)
-* magit-section-initial-visibility-alist: Section Visibility. (line 78)
-* magit-section-movement-hook: Section Movement. (line 46)
-* magit-section-set-visibility-hook: Section Visibility. (line 106)
-* magit-section-show-child-count: Section Options. (line 9)
-* magit-section-visibility-indicator: Section Visibility. (line 124)
-* magit-shell-command-verbose-prompt: Running Git Manually.
- (line 47)
-* magit-stashes-margin: Stashing. (line 104)
-* magit-status-headers-hook: Status Header Sections.
- (line 18)
-* magit-status-margin: Status Options. (line 10)
-* magit-status-refresh-hook: Status Options. (line 6)
-* magit-status-sections-hook: Status Sections. (line 10)
-* magit-submodule-list-columns: Listing Submodules. (line 21)
-* magit-this-process: Calling Git for Effect.
- (line 146)
-* magit-uniquify-buffer-names: Naming Buffers. (line 74)
-* magit-unstage-committed: Staging and Unstaging.
- (line 56)
-* magit-update-other-window-delay: Section Movement. (line 112)
-* magit-visit-ref-behavior: References Buffer. (line 192)
-* magit-wip-after-apply-mode: Legacy Wip Modes. (line 19)
-* magit-wip-after-apply-mode-lighter: Legacy Wip Modes. (line 59)
-* magit-wip-after-save-local-mode-lighter: Legacy Wip Modes. (line 55)
-* magit-wip-after-save-mode: Legacy Wip Modes. (line 13)
-* magit-wip-before-change-mode: Legacy Wip Modes. (line 33)
-* magit-wip-before-change-mode-lighter: Legacy Wip Modes. (line 63)
-* magit-wip-initial-backup-mode: Legacy Wip Modes. (line 38)
-* magit-wip-initial-backup-mode-lighter: Legacy Wip Modes. (line 67)
-* magit-wip-merge-branch: Wip Graph. (line 6)
-* magit-wip-mode: Wip Modes. (line 30)
-* magit-wip-mode-lighter: Wip Modes. (line 104)
-* magit-wip-namespace: Wip Modes. (line 96)
-* notes.displayRef: Notes. (line 65)
-* pull.rebase: Branch Git Variables.
- (line 57)
-* remote.NAME.fetch: Remote Git Variables.
- (line 15)
-* remote.NAME.push: Remote Git Variables.
- (line 26)
-* remote.NAME.pushurl: Remote Git Variables.
- (line 20)
-* remote.NAME.tagOpts: Remote Git Variables.
- (line 31)
-* remote.NAME.url: Remote Git Variables.
- (line 10)
-* remote.pushDefault: Branch Git Variables.
- (line 71)
-
diff --git a/elpa/memoize-20200103.2036/memoize-autoloads.el b/elpa/memoize-20200103.2036/memoize-autoloads.el
deleted file mode 100644
index 2431db0..0000000
--- a/elpa/memoize-20200103.2036/memoize-autoloads.el
+++ /dev/null
@@ -1,22 +0,0 @@
-;;; memoize-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "memoize" "memoize.el" (0 0 0 0))
-;;; Generated autoloads from memoize.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "memoize" '("defmemoize" "memoize")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; memoize-autoloads.el ends here
diff --git a/elpa/memoize-20200103.2036/memoize-pkg.el b/elpa/memoize-20200103.2036/memoize-pkg.el
deleted file mode 100644
index 2d54425..0000000
--- a/elpa/memoize-20200103.2036/memoize-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "memoize" "20200103.2036" "Memoization functions" 'nil :commit "51b075935ca7070f62fae1d69fe0ff7d8fa56fdd" :authors '(("Christopher Wellons" . "mosquitopsu@gmail.com")) :maintainer '("Christopher Wellons" . "mosquitopsu@gmail.com") :url "https://github.com/skeeto/emacs-memoize")
diff --git a/elpa/memoize-20200103.2036/memoize.el b/elpa/memoize-20200103.2036/memoize.el
deleted file mode 100644
index 6dce48a..0000000
--- a/elpa/memoize-20200103.2036/memoize.el
+++ /dev/null
@@ -1,190 +0,0 @@
-;;; memoize.el --- Memoization functions -*- lexical-binding: t; -*-
-
-;; This is free and unencumbered software released into the public domain.
-
-;; Author: Christopher Wellons <mosquitopsu@gmail.com>
-;; URL: https://github.com/skeeto/emacs-memoize
-;; Package-Version: 20200103.2036
-;; Package-Commit: 51b075935ca7070f62fae1d69fe0ff7d8fa56fdd
-;; Version: 1.1
-
-;;; Commentary:
-
-;; `memoize' accepts a symbol or a function. When given a symbol, the
-;; symbol's function definition is memoized and installed overtop of
-;; the original function definition. When given a function, it returns
-;; a memoized version of that function.
-
-;; (memoize 'my-expensive-function)
-
-;; `defmemoize' defines a memoized function directly, behaving just
-;; like `defun'.
-
-;; (defmemoize my-expensive-function (n)
-;; (if (zerop n)
-;; 1
-;; (* n (my-expensive-function (1- n)))))
-
-;; Memoizing an interactive function will render that function
-;; non-interactive. It would be easy to fix this problem when it comes
-;; to non-byte-compiled functions, but recovering the interactive
-;; definition from a byte-compiled function is more complex than I
-;; care to deal with. Besides, interactive functions are always used
-;; for their side effects anyway.
-
-;; There's no way to memoize nil returns, but why would your expensive
-;; functions do all that work just to return nil? :-)
-
-;; Memoization takes up memory, which should be freed at some point.
-;; Because of this, all memoization has a timeout from when the last
-;; access was. The default timeout is set by
-;; `memoize-default-timeout'. It can be overridden by using the
-;; `memoize' function, but the `defmemoize' macro will always just use
-;; the default timeout.
-
-;; If you wait to byte-compile the function until *after* it is
-;; memoized then the function and memoization wrapper both get
-;; compiled at once, so there's no special reason to do them
-;; separately. But there really isn't much advantage to compiling the
-;; memoization wrapper anyway.
-
-;;; Code:
-
-(require 'cl-lib)
-
-(defvar memoize-default-timeout "2 hours"
- "The amount of time after which to remove a memoization.
-This represents the time after last use of the memoization after
-which the value is expired. Setting this to nil means to never
-expire, which will cause a memory leak, but may be acceptable for
-very careful uses.")
-
-(defun memoize (func &optional timeout)
- "Memoize FUNC: a closure, lambda, or symbol.
-
-If argument is a symbol then install the memoized function over
-the original function. The TIMEOUT value, a timeout string as
-used by `run-at-time' will determine when the value expires, and
-will apply after the last access (unless another access
-happens)."
- (cl-typecase func
- (symbol
- (when (get func :memoize-original-function)
- (user-error "%s is already memoized" func))
- (put func :memoize-original-documentation (documentation func))
- (put func 'function-documentation
- (concat (documentation func) " (memoized)"))
- (put func :memoize-original-function (symbol-function func))
- (fset func (memoize--wrap (symbol-function func) timeout))
- func)
- (function (memoize--wrap func timeout))))
-
-(defun memoize-restore (func)
- "Restore the original, non-memoized definition of FUNC.
-FUNC should be a symbol which has been memoized with `memoize'."
- (unless (get func :memoize-original-function)
- (user-error "%s is not memoized" func))
- (fset func (get func :memoize-original-function))
- (put func :memoize-original-function nil)
- (put func 'function-documentation
- (get func :memoize-original-documentation))
- (put func :memoize-original-documentation nil))
-
-(defun memoize--wrap (func timeout)
- "Return the memoized version of FUNC.
-TIMEOUT specifies how long the values last from last access. A
-nil timeout will cause the values to never expire, which will
-cause a memory leak as memoize is use, so use the nil value with
-care."
- (let ((table (make-hash-table :test 'equal))
- (timeouts (make-hash-table :test 'equal)))
- (lambda (&rest args)
- (let ((value (gethash args table)))
- (unwind-protect
- (or value (puthash args (apply func args) table))
- (let ((existing-timer (gethash args timeouts))
- (timeout-to-use (or timeout memoize-default-timeout)))
- (when existing-timer
- (cancel-timer existing-timer))
- (when timeout-to-use
- (puthash args
- (run-at-time timeout-to-use nil
- (lambda ()
- (remhash args table))) timeouts))))))))
-
-(defmacro defmemoize (name arglist &rest body)
- "Create a memoize'd function. NAME, ARGLIST, DOCSTRING and BODY
-have the same meaning as in `defun'."
- (declare (indent 2) (doc-string 3) (debug defun))
- `(progn
- (defun ,name ,arglist
- ,@body)
- (memoize (quote ,name))))
-
-(defun memoize-by-buffer-contents (func)
- "Memoize the given function by buffer contents.
-If argument is a symbol then install the memoized function over
-the original function."
- (cl-typecase func
- (symbol
- (put func 'function-documentation
- (concat (documentation func) " (memoized by buffer contents)"))
- (fset func (memoize-by-buffer-contents--wrap (symbol-function func)))
- func)
- (function (memoize-by-buffer-contents--wrap func))))
-
-(defun memoize-by-buffer-contents--wrap (func)
- "Return the memoization based on the buffer contents of FUNC.
-
-This form of memoization will be based off the current buffer
-contents. A different memoization is stored for all buffer
-contents, although old contents and no-longer-existant buffers
-will get garbage collected."
- ;; We need 3 tables here to properly garbage collect. First is the
- ;; table for the memoization itself, `memoization-table'. It holds a
- ;; cons of the content hash and the function arguments.
- ;;
- ;; Buffer contents change often, though, so we want these entries to
- ;; be automatically garbage collected when the buffer changes or the
- ;; buffer goes away. To keep the entries around, we need to tie the
- ;; content hash to the buffer, so that the content hash string
- ;; doesn't go away until the buffer does. We do that with the
- ;; `buffer-to-contents-table'.
- ;;
- ;; But even if the buffer content does change, we need to expire the
- ;; memoization entries for that particular buffer content. So we
- ;; have a `contents-to-memoization-table' that we use to tie the
- ;; content hash to the memoization conses used as keys in the
- ;; `memoization-table'.
- ;;
- ;; If a buffer's value changes, we make sure the next time we put a
- ;; new value at the `buffer-to-contents-table', which causes the
- ;; hash string to disappear. This causes the hash-string to
- ;; disappear from the `contents-to-memoization-table', which causes
- ;; the memoizations based on that content string to disappear from
- ;; the `memoization-table'.
- (let ((memoization-table (make-hash-table :test 'equal :weakness 'key))
- (buffer-to-contents-table (make-hash-table :weakness 'key))
- (contents-to-memoization-table (make-hash-table :weakness 'key)))
- (lambda (&rest args)
- (let* ((bufhash (secure-hash 'md5 (buffer-string)))
- (memokey (cons bufhash args))
- (value (gethash memokey memoization-table)))
- (or value
- (progn
- (puthash (current-buffer) bufhash buffer-to-contents-table)
- (puthash bufhash memokey contents-to-memoization-table)
- (puthash memokey (apply func args) memoization-table)))))))
-
-(defmacro defmemoize-by-buffer-contents (name arglist &rest body)
- "Create a memoize'd-by-buffer-contents function. NAME, ARGLIST,
-DOCSTRING and BODY have the same meaning as in `defun'."
- (declare (indent defun))
- `(progn
- (defun ,name ,arglist
- ,@body)
- (memoize-by-buffer-contents (quote ,name))))
-
-(provide 'memoize)
-
-;;; memoize.el ends here
diff --git a/elpa/mixed-pitch-20200511.2052/mixed-pitch-autoloads.el b/elpa/mixed-pitch-20200511.2052/mixed-pitch-autoloads.el
deleted file mode 100644
index 80bd045..0000000
--- a/elpa/mixed-pitch-20200511.2052/mixed-pitch-autoloads.el
+++ /dev/null
@@ -1,31 +0,0 @@
-;;; mixed-pitch-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "mixed-pitch" "mixed-pitch.el" (0 0 0 0))
-;;; Generated autoloads from mixed-pitch.el
-
-(autoload 'mixed-pitch-mode "mixed-pitch" "\
-Change the default face of the current buffer to a variable pitch, while keeping some faces fixed pitch.
-
-See the variable `mixed-pitch-fixed-pitch-faces' for a list of
-which faces remain fixed pitch. The height and pitch of faces is
-inherited from `variable-pitch' and `default'.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mixed-pitch" '("mixed-pitch-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; mixed-pitch-autoloads.el ends here
diff --git a/elpa/mixed-pitch-20200511.2052/mixed-pitch-pkg.el b/elpa/mixed-pitch-20200511.2052/mixed-pitch-pkg.el
deleted file mode 100644
index 941b404..0000000
--- a/elpa/mixed-pitch-20200511.2052/mixed-pitch-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "mixed-pitch" "20200511.2052" "Use a variable pitch, keeping fixed pitch where it's sensible" '((emacs "24.3")) :commit "1cad46fddf741ed7ec5fc477d70e079e908e9ce6" :authors '(("J. Alexander Branham" . "branham@utexas.edu")) :maintainer '("J. Alexander Branham" . "branham@utexas.edu") :url "https://gitlab.com/jabranham/mixed-pitch")
diff --git a/elpa/mixed-pitch-20200511.2052/mixed-pitch.el b/elpa/mixed-pitch-20200511.2052/mixed-pitch.el
deleted file mode 100644
index c0dbf6f..0000000
--- a/elpa/mixed-pitch-20200511.2052/mixed-pitch.el
+++ /dev/null
@@ -1,182 +0,0 @@
-;;; mixed-pitch.el --- Use a variable pitch, keeping fixed pitch where it's sensible -*- lexical-binding: t; -*-
-
-;;; Copyright (C) 2017, 2018 by J. Alexander Branham
-
-;; Author: J. Alexander Branham <branham@utexas.edu>
-;; Maintainer: J. Alexander Branham <branham@utexas.edu>
-;; URL: https://gitlab.com/jabranham/mixed-pitch
-;; Package-Version: 20200511.2052
-;; Package-Commit: 1cad46fddf741ed7ec5fc477d70e079e908e9ce6
-;; Version: 1.1.0
-;; Package-Requires: ((emacs "24.3"))
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-;;
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see
-;; <http://www.gnu.org/licenses/>
-
-
-;;; Commentary:
-
-;; `mixed-pitch-mode' is a minor mode that enables mixing variable-pitch and
-;; fixed-pitch fonts in the same buffer. The list
-;; `mixed-pitch-fixed-pitch-faces' defines the faces that are kept fixed-pitch,
-;; everything else becomes variable-pitch.
-
-;; Original idea came from https://ogbe.net/blog/toggle-serif.html
-;; Shared with permission.
-
-;; Usage:
-;; (require 'mixed-pitch)
-;; (mixed-pitch-mode)
-;; Or, to apply mixed-pitch-mode in all text modes:
-;; (add-hook 'text-mode-hook #'mixed-pitch-mode)
-
-;;; Code:
-
-(require 'face-remap)
-
-(defgroup mixed-pitch nil
- "Mix variable and fixed pitch in a single buffer."
- :tag "Mixed pitch"
- :prefix "mixed-pitch"
- :group 'mixed-pitch)
-
-(defcustom mixed-pitch-fixed-pitch-faces
- '(diff-added
- diff-context
- diff-file-header
- diff-function
- diff-header
- diff-hunk-header
- diff-removed
- font-latex-math-face
- font-latex-sedate-face
- font-latex-warning-face
- font-latex-sectioning-5-face
- font-lock-builtin-face
- font-lock-comment-delimiter-face
- font-lock-constant-face
- font-lock-doc-face
- font-lock-function-name-face
- font-lock-keyword-face
- font-lock-negation-char-face
- font-lock-preprocessor-face
- font-lock-regexp-grouping-backslash
- font-lock-regexp-grouping-construct
- font-lock-string-face
- font-lock-type-face
- font-lock-variable-name-face
- markdown-code-face
- markdown-gfm-checkbox-face
- markdown-inline-code-face
- markdown-language-info-face
- markdown-language-keyword-face
- markdown-math-face
- message-header-name
- message-header-to
- message-header-cc
- message-header-newsgroups
- message-header-xheader
- message-header-subject
- message-header-other
- mu4e-header-key-face
- mu4e-header-value-face
- mu4e-link-face
- mu4e-contact-face
- mu4e-compose-separator-face
- mu4e-compose-header-face
- org-block
- org-block-begin-line
- org-block-end-line
- org-document-info-keyword
- org-code
- org-indent
- org-latex-and-related
- org-checkbox
- org-formula
- org-meta-line
- org-table
- org-verbatim)
- "This is a list holding names of faces that will not be variable pitch when function `mixed-pitch-mode' is enabled."
- :type '(repeat face)
- :package-version '(mixed-pitch . "1.1.1")
- :group 'mixed-pitch)
-
-(defcustom mixed-pitch-variable-pitch-cursor 'bar
- "If non-nil, function `mixed-pitch-mode' changes the cursor.
-When disabled, switch back to what it was before.
-
-See `cursor-type' for a list of acceptable types."
- :type 'symbol
- :group 'mixed-pitch)
-
-(defcustom mixed-pitch-set-height nil
- "If non-nil, set the height of the face.
-
-When nil, only set the family."
- :type 'boolean
- :package-version '(mixed-pitch . "1.1.0")
- :group 'mixed-pitch)
-
-(defvar-local mixed-pitch-fixed-cookie nil)
-(defvar-local mixed-pitch-variable-cookie nil)
-(defvar-local mixed-pitch-cursor-type nil)
-
-;;;###autoload
-(define-minor-mode mixed-pitch-mode
- "Change the default face of the current buffer to a variable pitch, while keeping some faces fixed pitch.
-
-See the variable `mixed-pitch-fixed-pitch-faces' for a list of
-which faces remain fixed pitch. The height and pitch of faces is
-inherited from `variable-pitch' and `default'."
- :lighter " MPM"
- (let ((var-pitch (face-attribute 'variable-pitch :family))
- (var-height (face-attribute 'variable-pitch :height))
- (fix-pitch (face-attribute 'default :family))
- (fix-height (face-attribute 'default :height)))
- ;; Turn mixed-pitch-mode on:
- (if mixed-pitch-mode
- (progn
- ;; remember cursor type
- (when mixed-pitch-variable-pitch-cursor
- (setq mixed-pitch-cursor-type cursor-type))
- ;; remap default face to variable pitch
- (setq mixed-pitch-variable-cookie
- (if mixed-pitch-set-height
- (face-remap-add-relative
- 'default :family var-pitch :height var-height)
- (face-remap-add-relative 'default :family var-pitch)))
- (setq mixed-pitch-fixed-cookie nil)
- ;; keep fonts in `mixed-pitch-fixed-pitch-faces' as fixed-pitch.
- (dolist (face mixed-pitch-fixed-pitch-faces)
- (add-to-list 'mixed-pitch-fixed-cookie
- (if mixed-pitch-set-height
- (face-remap-add-relative
- face :family fix-pitch :height fix-height)
- (face-remap-add-relative face :family fix-pitch))))
- ;; Change the cursor if the user requested:
- (when mixed-pitch-variable-pitch-cursor (setq cursor-type mixed-pitch-variable-pitch-cursor)))
- ;; Turn mixed-pitch-mode off:
- (progn (face-remap-remove-relative mixed-pitch-variable-cookie)
- (dolist (cookie mixed-pitch-fixed-cookie)
- (face-remap-remove-relative cookie))
- ;; Restore the cursor if we changed it:
- (when mixed-pitch-variable-pitch-cursor
- (setq cursor-type mixed-pitch-cursor-type))))))
-
-(provide 'mixed-pitch)
-;;; mixed-pitch.el ends here
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f002.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f002.xpm
deleted file mode 100644
index b933dde..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f002.xpm
+++ /dev/null
@@ -1,104 +0,0 @@
-/* XPM */
-static char * FontAwesome_f002_xpm[] = {
-"19 21 80 1",
-" c #FFFFFF",
-". c #F6F6F6",
-"+ c #AFAFAF",
-"@ c #6B6B6B",
-"# c #4E4E4E",
-"$ c #525252",
-"% c #717171",
-"& c #B9B9B9",
-"* c #FBFBFB",
-"= c #A2A2A2",
-"- c #1A1A1A",
-"; c #000000",
-"> c #282828",
-", c #BABABA",
-"' c #FEFEFE",
-") c #6F6F6F",
-"! c #010101",
-"~ c #919191",
-"{ c #8C8C8C",
-"] c #303030",
-"^ c #959595",
-"/ c #C8C8C8",
-"( c #C1C1C1",
-"_ c #8E8E8E",
-": c #202020",
-"< c #B1B1B1",
-"[ c #E2E2E2",
-"} c #080808",
-"| c #757575",
-"1 c #FAFAFA",
-"2 c #F3F3F3",
-"3 c #595959",
-"4 c #1C1C1C",
-"5 c #7A7A7A",
-"6 c #464646",
-"7 c #A0A0A0",
-"8 c #2F2F2F",
-"9 c #CBCBCB",
-"0 c #A6A6A6",
-"a c #565656",
-"b c #0E0E0E",
-"c c #070707",
-"d c #F9F9F9",
-"e c #DDDDDD",
-"f c #343434",
-"g c #0F0F0F",
-"h c #EAEAEA",
-"i c #323232",
-"j c #232323",
-"k c #DBDBDB",
-"l c #B5B5B5",
-"m c #656565",
-"n c #4C4C4C",
-"o c #8D8D8D",
-"p c #B3B3B3",
-"q c #F0F0F0",
-"r c #5C5C5C",
-"s c #D6D6D6",
-"t c #FCFCFC",
-"u c #CECECE",
-"v c #545454",
-"w c #5B5B5B",
-"x c #F5F5F5",
-"y c #373737",
-"z c #0A0A0A",
-"A c #999999",
-"B c #606060",
-"C c #363636",
-"D c #989898",
-"E c #6C6C6C",
-"F c #292929",
-"G c #0D0D0D",
-"H c #181818",
-"I c #3E3E3E",
-"J c #E8E8E8",
-"K c #5D5D5D",
-"L c #979797",
-"M c #626262",
-"N c #818181",
-"O c #D1D1D1",
-" ",
-" ",
-" .+@#$%&* ",
-" =-;;;;;;>, ",
-" ');;;;;;;;;!~ ",
-" {;;;]^/(_:;;;< ",
-"[};;|1 23;;4. ",
-"5;;6' .>;;7 ",
-"8;;9 0;;a ",
-"b;cd e;;f ",
-"};g' h;;i ",
-"j;;k l;;3 ",
-"m;;% 'n;;o ",
-"/;;!p ~;;gq ",
-" r;;;@st1uv;;;w ",
-" xy;;;;zc;;;;;;A ",
-" xB;;;;;;;}C;;;D ",
-" uEFGHI5JtK;;;L ",
-" tK;;;<",
-" tK;;M",
-" tN6O"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f013.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f013.xpm
deleted file mode 100644
index 2ddcaf1..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f013.xpm
+++ /dev/null
@@ -1,100 +0,0 @@
-/* XPM */
-static char * FontAwesome_f013_xpm[] = {
-"17 21 76 1",
-" c #FFFFFF",
-". c #ECECEC",
-"+ c #4E4E4E",
-"@ c #474747",
-"# c #EEEEEE",
-"$ c #EDEDED",
-"% c #FDFDFD",
-"& c #BABABA",
-"* c #000000",
-"= c #BDBDBD",
-"- c #FCFCFC",
-"; c #E8E8E8",
-"> c #C1C1C1",
-", c #141414",
-"' c #494949",
-") c #EAEAEA",
-"! c #767676",
-"~ c #797979",
-"{ c #E9E9E9",
-"] c #101010",
-"^ c #CFCFCF",
-"/ c #D0D0D0",
-"( c #0C0C0C",
-"_ c #030303",
-": c #D7D7D7",
-"< c #020202",
-"[ c #C9C9C9",
-"} c #818181",
-"| c #878787",
-"1 c #FAFAFA",
-"2 c #7C7C7C",
-"3 c #2B2B2B",
-"4 c #C0C0C0",
-"5 c #F1F1F1",
-"6 c #BFBFBF",
-"7 c #7F7F7F",
-"8 c #FEFEFE",
-"9 c #343434",
-"0 c #040404",
-"a c #090909",
-"b c #E1E1E1",
-"c c #E0E0E0",
-"d c #0D0D0D",
-"e c #434343",
-"f c #404040",
-"g c #3F3F3F",
-"h c #323232",
-"i c #313131",
-"j c #8E8E8E",
-"k c #585858",
-"l c #171717",
-"m c #111111",
-"n c #4B4B4B",
-"o c #A0A0A0",
-"p c #080808",
-"q c #7A7A7A",
-"r c #AAAAAA",
-"s c #9D9D9D",
-"t c #525252",
-"u c #484848",
-"v c #ACACAC",
-"w c #9E9E9E",
-"x c #F3F3F3",
-"y c #3A3A3A",
-"z c #353535",
-"A c #393939",
-"B c #2C2C2C",
-"C c #8B8B8B",
-"D c #9F9F9F",
-"E c #9C9C9C",
-"F c #8D8D8D",
-"G c #C7C7C7",
-"H c #C6C6C6",
-"I c #9A9A9A",
-"J c #939393",
-"K c #F9F9F9",
-" ",
-" ",
-" .+@+# ",
-" $% &***= -; ",
-" >,')!***~{@]^ ",
-" /(**_*****_**,: ",
-" ><***********_[ ",
-" }***********| ",
-" 12***34563***78 ",
-"90***ab ca***de",
-"*****f g*****",
-"*****h i*****",
-"jkl***= =***mn}",
-" o***pqr~p***s ",
-" 8t***********u% ",
-" v*************w ",
-" xy**za***aA**B# ",
-" 5eC8D***E8Fn) ",
-" G***H ",
-" 1IJIK ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f016.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f016.xpm
deleted file mode 100644
index aaf3fed..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f016.xpm
+++ /dev/null
@@ -1,59 +0,0 @@
-/* XPM */
-static char * FontAwesome_f016_xpm[] = {
-"17 21 35 1",
-" c #F5F5F5",
-". c #DBDBDB",
-"+ c #F8F8F8",
-"@ c #FFFFFF",
-"# c #2A2A2A",
-"$ c #000000",
-"% c #070707",
-"& c #7C7C7C",
-"* c #FDFDFD",
-"= c #9A9A9A",
-"- c #B7B7B7",
-"; c #525252",
-"> c #636363",
-", c #D7D7D7",
-"' c #999999",
-") c #020202",
-"! c #616161",
-"~ c #FCFCFC",
-"{ c #ADADAD",
-"] c #060606",
-"^ c #5F5F5F",
-"/ c #BFBFBF",
-"( c #0E0E0E",
-"_ c #828282",
-": c #7B7B7B",
-"< c #939393",
-"[ c #545454",
-"} c #181818",
-"| c #555555",
-"1 c #5A5A5A",
-"2 c #6B6B6B",
-"3 c #010101",
-"4 c #676767",
-"5 c #232323",
-"6 c #666666",
-" ..........+@@@@@",
-"#$$$$$$$$$$%&*@@@",
-"$=--------$;$>*@@",
-"$,@@@@@@@@$,')!~@",
-"$,@@@@@@@@$,@{]^~",
-"$,@@@@@@@@$,@@/(_",
-"$,@@@@@@@@$:<<<[}",
-"$,@@@@@@@@|$$$$$$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$1222222222222213",
-"45555555555555556"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f021.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f021.xpm
deleted file mode 100644
index b7027d6..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f021.xpm
+++ /dev/null
@@ -1,106 +0,0 @@
-/* XPM */
-static char * FontAwesome_f021_xpm[] = {
-"17 21 82 1",
-" c #FFFFFF",
-". c #D2D2D2",
-"+ c #8B8B8B",
-"@ c #616161",
-"# c #515151",
-"$ c #646464",
-"% c #8F8F8F",
-"& c #DBDBDB",
-"* c #D4D4D4",
-"= c #414141",
-"- c #000000",
-"; c #B2B2B2",
-"> c #2B2B2B",
-", c #AAAAAA",
-"' c #060606",
-") c #0E0E0E",
-"! c #747474",
-"~ c #030303",
-"{ c #BABABA",
-"] c #020202",
-"^ c #0F0F0F",
-"/ c #6F6F6F",
-"( c #B5B5B5",
-"_ c #CCCCCC",
-": c #A5A5A5",
-"< c #696969",
-"[ c #050505",
-"} c #F7F7F7",
-"| c #181818",
-"1 c #3A3A3A",
-"2 c #E4E4E4",
-"3 c #191919",
-"4 c #A1A1A1",
-"5 c #242424",
-"6 c #EFEFEF",
-"7 c #8C8C8C",
-"8 c #363636",
-"9 c #ACACAC",
-"0 c #C2C2C2",
-"a c #010101",
-"b c #9F9F9F",
-"c c #999999",
-"d c #FCFCFC",
-"e c #F0F0F0",
-"f c #949494",
-"g c #A4A4A4",
-"h c #676767",
-"i c #4B4B4B",
-"j c #DCDCDC",
-"k c #F4F4F4",
-"l c #575757",
-"m c #0B0B0B",
-"n c #D6D6D6",
-"o c #939393",
-"p c #565656",
-"q c #0A0A0A",
-"r c #C1C1C1",
-"s c #0D0D0D",
-"t c #0C0C0C",
-"u c #979797",
-"v c #FDFDFD",
-"w c #B7B7B7",
-"x c #161616",
-"y c #3B3B3B",
-"z c #FEFEFE",
-"A c #2A2A2A",
-"B c #666666",
-"C c #8D8D8D",
-"D c #767676",
-"E c #313131",
-"F c #E1E1E1",
-"G c #141414",
-"H c #B1B1B1",
-"I c #333333",
-"J c #292929",
-"K c #6B6B6B",
-"L c #D5D5D5",
-"M c #F8F8F8",
-"N c #929292",
-"O c #1E1E1E",
-"P c #878787",
-"Q c #CFCFCF",
-" ",
-" ",
-" .+@#$%& ",
-" *=-------#& ;>",
-" ,'---------)!~-",
-" {]--^/(_:<[-----",
-"}|--12 *3----",
-"4--56 7-----",
-"8--9 0-----a",
-"b%cd ef%%%%g",
-" ",
-" ",
-"hiiii#j kli@",
-"-----mn o--p",
-"----qr ns--0",
-"----tuv wx--yz",
-"------ABCDE---|F ",
-"-GHI---------J& ",
-"KL MNO-----3P} ",
-" zQ:fgQv ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f023.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f023.xpm
deleted file mode 100644
index 633ec07..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f023.xpm
+++ /dev/null
@@ -1,72 +0,0 @@
-/* XPM */
-static char * FontAwesome_f023_xpm[] = {
-"14 21 48 1",
-" c #FFFFFF",
-". c #F1F1F1",
-"+ c #959595",
-"@ c #616161",
-"# c #595959",
-"$ c #8C8C8C",
-"% c #E5E5E5",
-"& c #C0C0C0",
-"* c #1D1D1D",
-"= c #000000",
-"- c #101010",
-"; c #A8A8A8",
-"> c #E4E4E4",
-", c #111111",
-"' c #1F1F1F",
-") c #797979",
-"! c #808080",
-"~ c #2D2D2D",
-"{ c #040404",
-"] c #CDCDCD",
-"^ c #626262",
-"/ c #313131",
-"( c #F3F3F3",
-"_ c #FAFAFA",
-": c #4D4D4D",
-"< c #3F3F3F",
-"[ c #262626",
-"} c #B0B0B0",
-"| c #D4D4D4",
-"1 c #080808",
-"2 c #D9D9D9",
-"3 c #FDFDFD",
-"4 c #DCDCDC",
-"5 c #DBDBDB",
-"6 c #F2F2F2",
-"7 c #7D7D7D",
-"8 c #585858",
-"9 c #676767",
-"0 c #666666",
-"a c #E6E6E6",
-"b c #9F9F9F",
-"c c #7B7B7B",
-"d c #939393",
-"e c #6F6F6F",
-"f c #D3D3D3",
-"g c #181818",
-"h c #030303",
-"i c #B8B8B8",
-" ",
-" ",
-" .+@#$% ",
-" &*====-; ",
-" >,=')!~={] ",
-" ^=/( _:=< ",
-" [=} |=1_ ",
-" ==2 3==4 ",
-" ==5 ==5 ",
-"67==899999==0a",
-"b============c",
-"d============e",
-"d============e",
-"d============e",
-"d============e",
-"d============e",
-"d============e",
-"fghhhhhhhhhh-i",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f03c.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f03c.xpm
deleted file mode 100644
index ae08343..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f03c.xpm
+++ /dev/null
@@ -1,59 +0,0 @@
-/* XPM */
-static char * FontAwesome_f03c_xpm[] = {
-"20 21 35 1",
-" c #FFFFFF",
-". c #535353",
-"+ c #434343",
-"@ c #000000",
-"# c #060606",
-"$ c #E8E8E8",
-"% c #DFDFDF",
-"& c #BEBEBE",
-"* c #AEAEAE",
-"= c #8F8F8F",
-"- c #9F9F9F",
-"; c #8A8A8A",
-"> c #232323",
-", c #8B8B8B",
-"' c #B5B5B5",
-") c #979797",
-"! c #A7A7A7",
-"~ c #575757",
-"{ c #E7E7E7",
-"] c #D7D7D7",
-"^ c #E2E2E2",
-"/ c #4F4F4F",
-"( c #F9F9F9",
-"_ c #282828",
-": c #040404",
-"< c #4D4D4D",
-"[ c #7B7B7B",
-"} c #F8F8F8",
-"| c #747474",
-"1 c #4B4B4B",
-"2 c #5B5B5B",
-"3 c #2F2F2F",
-"4 c #1F1F1F",
-"5 c #131313",
-"6 c #030303",
-" ",
-" ",
-".++++++++++++++++++.",
-"@@@@@@@@@@@@@@@@@@@@",
-"#@@@@@@@@@@@@@@@@@@#",
-"$%%%%%%%%%%%%%%%%%%$",
-"& *===========-",
-"@; >@@@@@@@@@@@@",
-"@@; >@@@@@@@@@@@@",
-"@@@, ')))))))))))!",
-"@@@~ {]]]]]]]]]]]^",
-"@@/( _@@@@@@@@@@@:",
-"@<( >@@@@@@@@@@@@",
-"[} |111111111112",
-" ",
-"34444444444444444443",
-"@@@@@@@@@@@@@@@@@@@@",
-"56666666666666666665",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f044.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f044.xpm
deleted file mode 100644
index 16f7c42..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f044.xpm
+++ /dev/null
@@ -1,110 +0,0 @@
-/* XPM */
-static char * FontAwesome_f044_xpm[] = {
-"20 21 86 1",
-" c #FFFFFF",
-". c #BFBFBF",
-"+ c #5E5E5E",
-"@ c #434343",
-"# c #515151",
-"$ c #A2A2A2",
-"% c #E6E6E6",
-"& c #787878",
-"* c #CCCCCC",
-"= c #B1B1B1",
-"- c #010101",
-"; c #2D2D2D",
-"> c #4B4B4B",
-", c #444444",
-"' c #ACACAC",
-") c #FAFAFA",
-"! c #2B2B2B",
-"~ c #000000",
-"{ c #0B0B0B",
-"] c #C4C4C4",
-"^ c #313131",
-"/ c #767676",
-"( c #FEFEFE",
-"_ c #F4F4F4",
-": c #B3B3B3",
-"< c #A3A3A3",
-"[ c #0C0C0C",
-"} c #E3E3E3",
-"| c #040404",
-"1 c #D0D0D0",
-"2 c #F6F6F6",
-"3 c #020202",
-"4 c #ABABAB",
-"5 c #9F9F9F",
-"6 c #CDCDCD",
-"7 c #D7D7D7",
-"8 c #F8F8F8",
-"9 c #484848",
-"0 c #1F1F1F",
-"a c #7F7F7F",
-"b c #050505",
-"c c #B9B9B9",
-"d c #9B9B9B",
-"e c #909090",
-"f c #F9F9F9",
-"g c #4D4D4D",
-"h c #0A0A0A",
-"i c #525252",
-"j c #868686",
-"k c #FCFCFC",
-"l c #585858",
-"m c #1E1E1E",
-"n c #FDFDFD",
-"o c #232323",
-"p c #6A6A6A",
-"q c #646464",
-"r c #202020",
-"s c #A9A9A9",
-"t c #5D5D5D",
-"u c #C3C3C3",
-"v c #B7B7B7",
-"w c #505050",
-"x c #FBFBFB",
-"y c #EBEBEB",
-"z c #565656",
-"A c #454545",
-"B c #D5D5D5",
-"C c #090909",
-"D c #3A3A3A",
-"E c #D8D8D8",
-"F c #212121",
-"G c #DFDFDF",
-"H c #CACACA",
-"I c #F5F5F5",
-"J c #878787",
-"K c #727272",
-"L c #8F8F8F",
-"M c #818181",
-"N c #1A1A1A",
-"O c #595959",
-"P c #808080",
-"Q c #1D1D1D",
-"R c #030303",
-"S c #111111",
-"T c #606060",
-"U c #F1F1F1",
-" ",
-" ",
-" .+@@@@@@@@@#$ %&* ",
-"=-;>>>>>>>>>,')!~{] ",
-"^/( _:<-~[}",
-"|1 2@345-~6",
-"~7 890abcde ",
-"~7 fg0eb~h% ",
-"~7 )i0eb~~j ",
-"~7 klmeb~~& ",
-"~7 n+~ob~~p( ",
-"~7 qrsh~~tn ",
-"~7 ~u(v~wx$y ",
-"~7 ~~*zA8 b7 ",
-"~B ~~CD_ n~E ",
-"F5 GGG2 H3I ",
-"JCKLLLLLLLLLMNO ",
-"xPQRRRRRRRRRSTU ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f046.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f046.xpm
deleted file mode 100644
index f05c910..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f046.xpm
+++ /dev/null
@@ -1,100 +0,0 @@
-/* XPM */
-static char * FontAwesome_f046_xpm[] = {
-"19 20 77 1",
-" c #FFFFFF",
-". c #F7F7F7",
-"+ c #B3B3B3",
-"@ c #919191",
-"# c #8F8F8F",
-"$ c #939393",
-"% c #C2C2C2",
-"& c #E1E1E1",
-"* c #282828",
-"= c #000000",
-"- c #3D3D3D",
-"; c #C5C5C5",
-"> c #5D5D5D",
-", c #E3E3E3",
-"' c #4D4D4D",
-") c #1B1B1B",
-"! c #CBCBCB",
-"~ c #FEFEFE",
-"{ c #FBFBFB",
-"] c #FCFCFC",
-"^ c #BABABA",
-"/ c #0A0A0A",
-"( c #202020",
-"_ c #E0E0E0",
-": c #0C0C0C",
-"< c #858585",
-"[ c #070707",
-"} c #808080",
-"| c #AAAAAA",
-"1 c #050505",
-"2 c #353535",
-"3 c #EFEFEF",
-"4 c #7B7B7B",
-"5 c #9A9A9A",
-"6 c #A1A1A1",
-"7 c #030303",
-"8 c #363636",
-"9 c #F0F0F0",
-"0 c #6B6B6B",
-"a c #979797",
-"b c #989898",
-"c c #010101",
-"d c #E2E2E2",
-"e c #A3A3A3",
-"f c #373737",
-"g c #6E6E6E",
-"h c #040404",
-"i c #5A5A5A",
-"j c #383838",
-"k c #F1F1F1",
-"l c #656565",
-"m c #393939",
-"n c #707070",
-"o c #9C9C9C",
-"p c #5E5E5E",
-"q c #3A3A3A",
-"r c #F2F2F2",
-"s c #575757",
-"t c #3B3B3B",
-"u c #515151",
-"v c #3C3C3C",
-"w c #F3F3F3",
-"x c #909090",
-"y c #1F1F1F",
-"z c #626262",
-"A c #FAFAFA",
-"B c #A8A8A8",
-"C c #F4F4F4",
-"D c #CECECE",
-"E c #B0B0B0",
-"F c #888888",
-"G c #1C1C1C",
-"H c #252525",
-"I c #F5F5F5",
-"J c #FDFDFD",
-"K c #4C4C4C",
-"L c #DFDFDF",
-" ",
-" .+@########$% ",
-"&*===========- ;>, ",
-"')!~ {]^/=(_",
-":< +[===}",
-"=$ |1===23",
-"=$ ~45 67===89 ",
-"=$ 0==a bc===89 ",
-"=$d===ce #====f9 ",
-"=$ g===hi====jk ",
-"=$ ~l=======mkno ",
-"=$ ~p=====qr =# ",
-"=$ ]s===tr =# ",
-"=$ {u=vw =x ",
-"yz ABC D=E ",
-"Fcz$$$$$$$$$<GHI ",
-"JFy=========:KL ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f047.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f047.xpm
deleted file mode 100644
index b211b31..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f047.xpm
+++ /dev/null
@@ -1,76 +0,0 @@
-/* XPM */
-static char * FontAwesome_f047_xpm[] = {
-"21 21 52 1",
-" c #FFFFFF",
-". c #F2F2F2",
-"+ c #7F7F7F",
-"@ c #020202",
-"# c #9E9E9E",
-"$ c #000000",
-"% c #010101",
-"& c #9F9F9F",
-"* c #A0A0A0",
-"= c #F3F3F3",
-"- c #030303",
-"; c #1C1C1C",
-"> c #E9E9E9",
-", c #DBDBDB",
-"' c #1D1D1D",
-") c #EEEEEE",
-"! c #232323",
-"~ c #919191",
-"{ c #A2A2A2",
-"] c #898989",
-"^ c #A9A9A9",
-"/ c #474747",
-"( c #6B6B6B",
-"_ c #0E0E0E",
-": c #C0C0C0",
-"< c #C6C6C6",
-"[ c #090909",
-"} c #151515",
-"| c #DDDDDD",
-"1 c #BCBCBC",
-"2 c #323232",
-"3 c #B7B7B7",
-"4 c #181818",
-"5 c #D4D4D4",
-"6 c #4B4B4B",
-"7 c #272727",
-"8 c #CFCFCF",
-"9 c #D3D3D3",
-"0 c #C4C4C4",
-"a c #FEFEFE",
-"b c #A5A5A5",
-"c c #939393",
-"d c #131313",
-"e c #B5B5B5",
-"f c #0B0B0B",
-"g c #BFBFBF",
-"h c #0A0A0A",
-"i c #171717",
-"j c #D6D6D6",
-"k c #161616",
-"l c #D5D5D5",
-"m c #3F3F3F",
-" . ",
-" +@# ",
-" +$$%& ",
-" +$$$$%* ",
-" =-$$$$$; ",
-" >,$$',) ",
-" $$! ",
-" ~{ $$! ]^ ",
-" +$/ $$! !%* ",
-" +$$'(((($$_((((_$%* ",
-"#$$$$$$$$$$$$$$$$$$%:",
-"<[$$$$$$$$$$$$$$$$$}|",
-" 1[$23333$$433334$}5 ",
-" 1[6 $$! 7}5 ",
-" 89 $$! 0| ",
-" $$! ",
-" abc$$dce ",
-" =f$$$$$! ",
-" gh$$$ij ",
-" gh$kl ",
-" :m5 "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f059.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f059.xpm
deleted file mode 100644
index 616a04a..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f059.xpm
+++ /dev/null
@@ -1,109 +0,0 @@
-/* XPM */
-static char * FontAwesome_f059_xpm[] = {
-"17 21 85 1",
-" c #FFFFFF",
-". c #DBDBDB",
-"+ c #8D8D8D",
-"@ c #626262",
-"# c #4E4E4E",
-"$ c #DCDCDC",
-"% c #E0E0E0",
-"& c #555555",
-"* c #000000",
-"= c #575757",
-"- c #E1E1E1",
-"; c #C4C4C4",
-"> c #141414",
-", c #C5C5C5",
-"' c #D8D8D8",
-") c #0F0F0F",
-"! c #4D4D4D",
-"~ c #AEAEAE",
-"{ c #D1D1D1",
-"] c #B4B4B4",
-"^ c #5F5F5F",
-"/ c #101010",
-"( c #DADADA",
-"_ c #FEFEFE",
-": c #373737",
-"< c #8F8F8F",
-"[ c #B2B2B2",
-"} c #010101",
-"| c #393939",
-"1 c #434343",
-"2 c #FBFBFB",
-"3 c #D2D2D2",
-"4 c #F9F9F9",
-"5 c #686868",
-"6 c #B5B5B5",
-"7 c #5C5C5C",
-"8 c #060606",
-"9 c #989898",
-"0 c #F1F1F1",
-"a c #343434",
-"b c #3E3E3E",
-"c c #ABABAB",
-"d c #5E5E5E",
-"e c #212121",
-"f c #040404",
-"g c #232323",
-"h c #080808",
-"i c #1A1A1A",
-"j c #C6C6C6",
-"k c #E7E7E7",
-"l c #242424",
-"m c #090909",
-"n c #BFBFBF",
-"o c #151515",
-"p c #2D2D2D",
-"q c #E5E5E5",
-"r c #0B0B0B",
-"s c #2E2E2E",
-"t c #727272",
-"u c #313131",
-"v c #474747",
-"w c #747474",
-"x c #EAEAEA",
-"y c #D3D3D3",
-"z c #606060",
-"A c #EBEBEB",
-"B c #636363",
-"C c #F3F3F3",
-"D c #2F2F2F",
-"E c #767676",
-"F c #939393",
-"G c #303030",
-"H c #F4F4F4",
-"I c #ECECEC",
-"J c #414141",
-"K c #424242",
-"L c #EDEDED",
-"M c #FCFCFC",
-"N c #9E9E9E",
-"O c #262626",
-"P c #9F9F9F",
-"Q c #D6D6D6",
-"R c #ACACAC",
-"S c #999999",
-"T c #D7D7D7",
-" ",
-" ",
-" .+@#@+$ ",
-" %&*******=- ",
-" ;>*********>, ",
-" ')***!~{]^***/( ",
-"_:***< [}**|_",
-"]***1 234 5***6",
-"7***890a*b c***d",
-"e*****)*f+ 9***g",
-"h******ij kl***m",
-")******[ no****/",
-"p******' qr*****s",
-"t******uvu******w",
-"{}*****x x*****}y",
-" z*****A A*****B ",
-" CD****EFE****GH ",
-" IJ*********KL ",
-" MNO*****OPM ",
-" _QRSRT_ ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f05a.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f05a.xpm
deleted file mode 100644
index 799f34e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f05a.xpm
+++ /dev/null
@@ -1,93 +0,0 @@
-/* XPM */
-static char * FontAwesome_f05a_xpm[] = {
-"17 21 69 1",
-" c #FFFFFF",
-". c #DBDBDB",
-"+ c #8D8D8D",
-"@ c #626262",
-"# c #4E4E4E",
-"$ c #DCDCDC",
-"% c #E0E0E0",
-"& c #555555",
-"* c #000000",
-"= c #575757",
-"- c #E1E1E1",
-"; c #C4C4C4",
-"> c #141414",
-", c #C8C8C8",
-"' c #EBEBEB",
-") c #C5C5C5",
-"! c #D8D8D8",
-"~ c #0F0F0F",
-"{ c #101010",
-"] c #DADADA",
-"^ c #FEFEFE",
-"/ c #373737",
-"( c #767676",
-"_ c #939393",
-": c #393939",
-"< c #B4B4B4",
-"[ c #B5B5B5",
-"} c #5C5C5C",
-"| c #434343",
-"1 c #5E5E5E",
-"2 c #212121",
-"3 c #535353",
-"4 c #232323",
-"5 c #080808",
-"6 c #191919",
-"7 c #7E7E7E",
-"8 c #F5F5F5",
-"9 c #090909",
-"0 c #2D2D2D",
-"a c #2E2E2E",
-"b c #727272",
-"c c #747474",
-"d c #D1D1D1",
-"e c #010101",
-"f c #3C3C3C",
-"g c #EAEAEA",
-"h c #FDFDFD",
-"i c #3D3D3D",
-"j c #D3D3D3",
-"k c #606060",
-"l c #636363",
-"m c #F3F3F3",
-"n c #2F2F2F",
-"o c #1F1F1F",
-"p c #929292",
-"q c #303030",
-"r c #F4F4F4",
-"s c #ECECEC",
-"t c #414141",
-"u c #424242",
-"v c #EDEDED",
-"w c #FCFCFC",
-"x c #9E9E9E",
-"y c #262626",
-"z c #9F9F9F",
-"A c #D6D6D6",
-"B c #ACACAC",
-"C c #999999",
-"D c #D7D7D7",
-" ",
-" ",
-" .+@#@+$ ",
-" %&*******=- ",
-" ;>***,',***>) ",
-" !~****' '****{] ",
-"^/*****(_(*****:^",
-"<***************[",
-"}****|^ ]******1",
-"2****3 '******4",
-"5****678 '******9",
-"~******' '******{",
-"0******' '******a",
-"b******' '******c",
-"de***fgh hgi***ej",
-" k***3 3***l ",
-" mn**op___po**qr ",
-" st*********uv ",
-" wxy*****yzw ",
-" ^ABCBD^ ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f066.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f066.xpm
deleted file mode 100644
index f948469..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f066.xpm
+++ /dev/null
@@ -1,76 +0,0 @@
-/* XPM */
-static char * FontAwesome_f066_xpm[] = {
-"17 21 52 1",
-" c #FFFFFF",
-". c #ECECEC",
-"+ c #979797",
-"@ c #FEFEFE",
-"# c #303030",
-"$ c #000000",
-"% c #6E6E6E",
-"& c #D8D8D8",
-"* c #939393",
-"= c #FDFDFD",
-"- c #2F2F2F",
-"; c #505050",
-"> c #808080",
-", c #676767",
-"' c #EAEAEA",
-") c #4F4F4F",
-"! c #F9F9F9",
-"~ c #7F7F7F",
-"{ c #0F0F0F",
-"] c #515151",
-"^ c #525252",
-"/ c #FAFAFA",
-"( c #606060",
-"_ c #686868",
-": c #EFEFEF",
-"< c #DBDBDB",
-"[ c #DDDDDD",
-"} c #B4B4B4",
-"| c #252525",
-"1 c #232323",
-"2 c #4E4E4E",
-"3 c #202020",
-"4 c #929292",
-"5 c #A4A4A4",
-"6 c #020202",
-"7 c #8D8D8D",
-"8 c #E1E1E1",
-"9 c #222222",
-"0 c #E0E0E0",
-"a c #212121",
-"b c #434343",
-"c c #DFDFDF",
-"d c #656565",
-"e c #A8A8A8",
-"f c #030303",
-"g c #888888",
-"h c #282828",
-"i c #666666",
-"j c #D9D9D9",
-"k c #F4F4F4",
-"l c #AEAEAE",
-"m c #040404",
-" ",
-" ",
-" .+@",
-" .#$%",
-" &*= .-$$;",
-" >$,'-$$)!",
-" ~$${$$]! ",
-" ~$$$$^/ ",
-" ~$$$$(= ",
-" ~$$$$$_ ",
-" :<<<<[}|11112 ",
-" 3$$$$$4 ",
-" 56$$$$~ ",
-" 7$$$$~ ",
-" 89$$$$~ ",
-" 0a$$b6$~ ",
-"c3$$d=efg ",
-"h$$i= jk ",
-"lm,= ",
-" j= ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f071.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f071.xpm
deleted file mode 100644
index b8f92b5..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f071.xpm
+++ /dev/null
@@ -1,87 +0,0 @@
-/* XPM */
-static char * FontAwesome_f071_xpm[] = {
-"20 21 63 1",
-" c #FFFFFF",
-". c #F5F5F5",
-"+ c #D5D5D5",
-"@ c #0F0F0F",
-"# c #464646",
-"$ c #000000",
-"% c #474747",
-"& c #BCBCBC",
-"* c #BDBDBD",
-"= c #FDFDFD",
-"- c #333333",
-"; c #A6A6A6",
-"> c #A7A7A7",
-", c #F8F8F8",
-"' c #212121",
-") c #353535",
-"! c #6B6B6B",
-"~ c #222222",
-"{ c #F9F9F9",
-"] c #909090",
-"^ c #929292",
-"/ c #919191",
-"( c #F0F0F0",
-"_ c #131313",
-": c #888888",
-"< c #878787",
-"[ c #141414",
-"} c #F1F1F1",
-"| c #7B7B7B",
-"1 c #7F7F7F",
-"2 c #7E7E7E",
-"3 c #7C7C7C",
-"4 c #E5E5E5",
-"5 c #090909",
-"6 c #767676",
-"7 c #757575",
-"8 c #0A0A0A",
-"9 c #E6E6E6",
-"0 c #656565",
-"a c #6C6C6C",
-"b c #666666",
-"c c #D6D6D6",
-"d c #020202",
-"e c #101010",
-"f c #030303",
-"g c #D7D7D7",
-"h c #4F4F4F",
-"i c #0D0D0D",
-"j c #505050",
-"k c #C4C4C4",
-"l c #6A6A6A",
-"m c #C5C5C5",
-"n c #FEFEFE",
-"o c #3A3A3A",
-"p c #3B3B3B",
-"q c #AFAFAF",
-"r c #2C2C2C",
-"s c #939393",
-"t c #B0B0B0",
-"u c #363636",
-"v c #373737",
-"w c #E8E8E8",
-"x c #9A9A9A",
-" .. ",
-" +@@+ ",
-" #$$% ",
-" &$$$$* ",
-" =-$$$$-= ",
-" ;$$$$$$> ",
-" ,'$)!!)$~{ ",
-" ]$$^ /$$/ ",
-" (_$$: <$$[} ",
-" |$$$1 2$$$3 ",
-" 45$$$6 7$$$89 ",
-" 0$$$$a !$$$$b ",
-" cd$$$$e%%@$$$$fg ",
-" h$$$$$i%%i$$$$$j ",
-" k$$$$$$l l$$$$$$m ",
-"no$$$$$$! !$$$$$$pn",
-"q$$$$$$$rssr$$$$$$$t",
-")$$$$$$$$$$$$$$$$$$u",
-"v$$$$$$$$$$$$$$$$$$v",
-"wxssssssssssssssssxw",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f073.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f073.xpm
deleted file mode 100644
index 8f16195..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f073.xpm
+++ /dev/null
@@ -1,74 +0,0 @@
-/* XPM */
-static char * FontAwesome_f073_xpm[] = {
-"19 21 50 1",
-" c #FFFFFF",
-". c #F0F0F0",
-"+ c #DBDBDB",
-"@ c #F8F8F8",
-"# c #F1F1F1",
-"$ c #F7F7F7",
-"% c #FEFEFE",
-"& c #717171",
-"* c #010101",
-"= c #000000",
-"- c #4F4F4F",
-"; c #8C8C8C",
-"> c #030303",
-", c #333333",
-"' c #E3E3E3",
-") c #9B9B9B",
-"! c #A1A1A1",
-"~ c #0B0B0B",
-"{ c #0A0A0A",
-"] c #828282",
-"^ c #B7B7B7",
-"/ c #E5E5E5",
-"( c #F5F5F5",
-"_ c #B8B8B8",
-": c #9A9A9A",
-"< c #D7D7D7",
-"[ c #BDBDBD",
-"} c #3A3A3A",
-"| c #262626",
-"1 c #FCFCFC",
-"2 c #FBFBFB",
-"3 c #D8D8D8",
-"4 c #D4D4D4",
-"5 c #1E1E1E",
-"6 c #343434",
-"7 c #191919",
-"8 c #373737",
-"9 c #3F3F3F",
-"0 c #4B4B4B",
-"a c #6B6B6B",
-"b c #7F7F7F",
-"c c #A7A7A7",
-"d c #C7C7C7",
-"e c #0D0D0D",
-"f c #5A5A5A",
-"g c #E4E4E4",
-"h c #909090",
-"i c #242424",
-"j c #232323",
-"k c #707070",
-" .+@ #+$ ",
-" %&*=- ;>=, ",
-" '=)!~ {]^=/ ",
-"(_:= <=^^^^=< =:[@ ",
-"}=== <======< ===|1",
-"====23======4 ====3",
-"====56======78====<",
-"==================<",
-"=< = = = =<",
-"=< = = = =<",
-"=< = = = =<",
-"=9000=000=000=000=<",
-"=< = = = =<",
-"=< = = = =<",
-"=< = = = =<",
-"=abbb=bbb=bbb=bbb=<",
-"=cddd=ddd=ddd=ddd=<",
-"=< = = = =<",
-"=< = = = =<",
-"efaaa=aaa=aaa=aaa=g",
-"hijjjjjjjjjjjjjjjk "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f092.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f092.xpm
deleted file mode 100644
index b291a42..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f092.xpm
+++ /dev/null
@@ -1,93 +0,0 @@
-/* XPM */
-static char * FontAwesome_f092_xpm[] = {
-"17 21 69 1",
-" c #FFFFFF",
-". c #DEDEDE",
-"+ c #757575",
-"@ c #4B4B4B",
-"# c #474747",
-"$ c #686868",
-"% c #CBCBCB",
-"& c #C8C8C8",
-"* c #090909",
-"= c #000000",
-"- c #030303",
-"; c #BABABA",
-"> c #393939",
-", c #353535",
-"' c #050505",
-") c #171717",
-"! c #020202",
-"~ c #1B1B1B",
-"{ c #C0C0C0",
-"] c #626262",
-"^ c #6B6B6B",
-"/ c #898989",
-"( c #707070",
-"_ c #565656",
-": c #BCBCBC",
-"< c #FEFEFE",
-"[ c #242424",
-"} c #D3D3D3",
-"| c #3A3A3A",
-"1 c #151515",
-"2 c #E9E9E9",
-"3 c #5E5E5E",
-"4 c #828282",
-"5 c #A7A7A7",
-"6 c #F3F3F3",
-"7 c #878787",
-"8 c #CFCFCF",
-"9 c #484848",
-"0 c #8C8C8C",
-"a c #979797",
-"b c #696969",
-"c c #555555",
-"d c #3D3D3D",
-"e c #959595",
-"f c #A1A1A1",
-"g c #4E4E4E",
-"h c #040404",
-"i c #C4C4C4",
-"j c #595959",
-"k c #0B0B0B",
-"l c #858585",
-"m c #0F0F0F",
-"n c #F4F4F4",
-"o c #F2F2F2",
-"p c #A9A9A9",
-"q c #575757",
-"r c #060606",
-"s c #939393",
-"t c #ABABAB",
-"u c #525252",
-"v c #363636",
-"w c #272727",
-"x c #E1E1E1",
-"y c #FCFCFC",
-"z c #949494",
-"A c #E4E4E4",
-"B c #EDEDED",
-"C c #B5B5B5",
-"D c #F6F6F6",
-" ",
-" ",
-" .+@##########$% ",
-"&*=============-;",
-">===============,",
-"'===)!======~==='",
-"===={.]^/(_:<[===",
-"====} |===",
-"===12 3===",
-"===4 }===",
-"===5 6===",
-"===7 8===",
-"===9< 0===",
-"====a< &*===",
-"==bc=de fg=====",
-"==hijkl 7======",
-"m==[8no p=====m",
-"q====rs t=====u",
-"2v====s t====wx",
-" y{aszA BessCD ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f09c.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f09c.xpm
deleted file mode 100644
index a618800..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f09c.xpm
+++ /dev/null
@@ -1,60 +0,0 @@
-/* XPM */
-static char * FontAwesome_f09c_xpm[] = {
-"19 21 36 1",
-" c #FFFFFF",
-". c #CDCDCD",
-"+ c #7B7B7B",
-"@ c #515151",
-"# c #8B8B8B",
-"$ c #030303",
-"% c #000000",
-"& c #BBBBBB",
-"* c #484848",
-"= c #888888",
-"- c #BCBCBC",
-"; c #353535",
-"> c #646464",
-", c #FEFEFE",
-"' c #636363",
-") c #363636",
-"! c #F9F9F9",
-"~ c #050505",
-"{ c #DBDBDB",
-"] c #DADADA",
-"^ c #DCDCDC",
-"/ c #FDFDFD",
-"( c #D5D5D5",
-"_ c #6E6E6E",
-": c #676767",
-"< c #585858",
-"[ c #535353",
-"} c #2A2A2A",
-"| c #4D4D4D",
-"1 c #3A3A3A",
-"2 c #F4F4F4",
-"3 c #474747",
-"4 c #1F1F1F",
-"5 c #999999",
-"6 c #090909",
-"7 c #6D6D6D",
-" ",
-" ",
-" .+@+. ",
-" #$%%%$# ",
-" &%%*=*%%- ",
-" ;%>, ,'%) ",
-" !~%{ ]%~!",
-" ^%%/ /%%^",
-" {%% %%{",
-"(_::::::<%%:& %%{",
-"[%%%%%%%%%%%} |12",
-"3%%%%%%%%%%%4 ",
-"3%%%%%%%%%%%4 ",
-"3%%%%%%%%%%%4 ",
-"3%%%%%%%%%%%4 ",
-"3%%%%%%%%%%%4 ",
-"3%%%%%%%%%%%4 ",
-"56$$$$$$$$$$7 ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f0c7.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f0c7.xpm
deleted file mode 100644
index 26ab418..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f0c7.xpm
+++ /dev/null
@@ -1,61 +0,0 @@
-/* XPM */
-static char * FontAwesome_f0c7_xpm[] = {
-"17 21 37 1",
-" c #FFFFFF",
-". c #848484",
-"+ c #434343",
-"@ c #575757",
-"# c #B3B3B3",
-"$ c #030303",
-"% c #3F3F3F",
-"& c #000000",
-"* c #3A3A3A",
-"= c #4B4B4B",
-"- c #1D1D1D",
-"; c #7D7D7D",
-"> c #FEFEFE",
-", c #D7D7D7",
-"' c #D6D6D6",
-") c #8C8C8C",
-"! c #787878",
-"~ c #A1A1A1",
-"{ c #737373",
-"] c #080808",
-"^ c #8F8F8F",
-"/ c #E9E9E9",
-"( c #FBFBFB",
-"_ c #9D9D9D",
-": c #1B1B1B",
-"< c #E7E7E7",
-"[ c #E8E8E8",
-"} c #B9B9B9",
-"| c #979797",
-"1 c #676767",
-"2 c #838383",
-"3 c #DBDBDB",
-"4 c #040404",
-"5 c #D3D3D3",
-"6 c #111111",
-"7 c #121212",
-"8 c #C9C9C9",
-" ",
-" ",
-".++++++++++@# ",
-"$%%&&&&*=*&-&;> ",
-"&,,&&&&> >&')&!> ",
-"&,,&&&& &, ~${>",
-"&,,&&&& &, #]^",
-"&,,&&&&/(/&, _:",
-"&,<&&&&&&&&[ ,&",
-"&, }||||||} ,&",
-"&, ,&",
-"&, ,&",
-"&,>1+++++++++2 ,&",
-"&,3&========%4 ,&",
-"&,,& ,& ,&",
-"&,,& ,& ,&",
-"&,,& ,& ,&",
-"&55&((((((((5&(5&",
-"6&&&&&&&&&&&&&&&7",
-"8|||||||||||||||8",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f0f6.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f0f6.xpm
deleted file mode 100644
index 947a3c8..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f0f6.xpm
+++ /dev/null
@@ -1,66 +0,0 @@
-/* XPM */
-static char * FontAwesome_f0f6_xpm[] = {
-"17 21 42 1",
-" c #F5F5F5",
-". c #DBDBDB",
-"+ c #F8F8F8",
-"@ c #FFFFFF",
-"# c #2A2A2A",
-"$ c #000000",
-"% c #070707",
-"& c #7C7C7C",
-"* c #FDFDFD",
-"= c #9A9A9A",
-"- c #B7B7B7",
-"; c #525252",
-"> c #636363",
-", c #D7D7D7",
-"' c #999999",
-") c #020202",
-"! c #616161",
-"~ c #FCFCFC",
-"{ c #ADADAD",
-"] c #060606",
-"^ c #5F5F5F",
-"/ c #BFBFBF",
-"( c #0E0E0E",
-"_ c #828282",
-": c #7B7B7B",
-"< c #939393",
-"[ c #545454",
-"} c #181818",
-"| c #555555",
-"1 c #8B8B8B",
-"2 c #6B6B6B",
-"3 c #A6A6A6",
-"4 c #4B4B4B",
-"5 c #232323",
-"6 c #727272",
-"7 c #474747",
-"8 c #8C8C8C",
-"9 c #717171",
-"0 c #5A5A5A",
-"a c #010101",
-"b c #676767",
-"c c #666666",
-" ..........+@@@@@",
-"#$$$$$$$$$$%&*@@@",
-"$=--------$;$>*@@",
-"$,@@@@@@@@$,')!~@",
-"$,@@@@@@@@$,@{]^~",
-"$,@@@@@@@@$,@@/(_",
-"$,@@@@@@@@$:<<<[}",
-"$,@@@@@@@@|$$$$$$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@122222223@@,$",
-"$,@@455555556@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@277777771@@,$",
-"$,@@277777778@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@455555559@@,$",
-"$,@@122222223@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$022222222222220a",
-"b555555555555555c"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f11c.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f11c.xpm
deleted file mode 100644
index b86f0e7..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f11c.xpm
+++ /dev/null
@@ -1,68 +0,0 @@
-/* XPM */
-static char * FontAwesome_f11c_xpm[] = {
-"22 21 44 1",
-" c #FFFFFF",
-". c #8C8C8C",
-"+ c #202020",
-"@ c #1F1F1F",
-"# c #6A6A6A",
-"$ c #0C0C0C",
-"% c #5D5D5D",
-"& c #6F6F6F",
-"* c #000000",
-"= c #E3E3E3",
-"- c #D7D7D7",
-"; c #FEFEFE",
-"> c #FBFBFB",
-", c #D9D9D9",
-"' c #010101",
-") c #020202",
-"! c #DBDBDB",
-"~ c #F1F1F1",
-"{ c #9A9A9A",
-"] c #F3F3F3",
-"^ c #E1E1E1",
-"/ c #DADADA",
-"( c #DDDDDD",
-"_ c #E7E7E7",
-": c #232323",
-"< c #272727",
-"[ c #F7F7F7",
-"} c #BBBBBB",
-"| c #C9C9C9",
-"1 c #BEBEBE",
-"2 c #C1C1C1",
-"3 c #D0D0D0",
-"4 c #F6F6F6",
-"5 c #B6B6B6",
-"6 c #B3B3B3",
-"7 c #FCFCFC",
-"8 c #DFDFDF",
-"9 c #070707",
-"0 c #787878",
-"a c #8F8F8F",
-"b c #737373",
-"c c #040404",
-"d c #030303",
-"e c #4F4F4F",
-" ",
-" ",
-" ",
-" ",
-" ",
-".+@@@@@@@@@@@@@@@@@@# ",
-"$%&&&&&&&&&&&&&&&&&&*=",
-"*-;> ;> > > >; >; *-",
-"*-,' ,' )!)!', ', *-",
-"*-~{ ~{ {]{]{~ *- *-",
-"*->--^ />(>(>_---*- *-",
-"*--**: *-*-*-<****- *-",
-"*-[}}| 1[2[2[3}}}}[ *-",
-"*-45 466666664 54 *-",
-"*--* -*******- *- *-",
-"*-7^ 788888887 ^7 *-",
-"90aaaaaaaaaaaaaaaaaa*8",
-"bcdddddddddddddddddde;",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f128.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f128.xpm
deleted file mode 100644
index a422c02..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f128.xpm
+++ /dev/null
@@ -1,71 +0,0 @@
-/* XPM */
-static char * FontAwesome_f128_xpm[] = {
-"12 21 47 1",
-" c #FFFFFF",
-". c #EBEBEB",
-"+ c #C9C9C9",
-"@ c #C0C0C0",
-"# c #D6D6D6",
-"$ c #494949",
-"% c #020202",
-"& c #000000",
-"* c #3C3C3C",
-"= c #C8C8C8",
-"- c #BFBFBF",
-"; c #0A0A0A",
-"> c #010101",
-", c #B2B2B2",
-"' c #EDEDED",
-") c #161616",
-"! c #E2E2E2",
-"~ c #F7F7F7",
-"{ c #535353",
-"] c #727272",
-"^ c #E6E6E6",
-"/ c #878787",
-"( c #909090",
-"_ c #FEFEFE",
-": c #929292",
-"< c #888888",
-"[ c #DADADA",
-"} c #B1B1B1",
-"| c #212121",
-"1 c #C1C1C1",
-"2 c #F1F1F1",
-"3 c #5A5A5A",
-"4 c #676767",
-"5 c #5D5D5D",
-"6 c #070707",
-"7 c #A1A1A1",
-"8 c #090909",
-"9 c #ACACAC",
-"0 c #616161",
-"a c #4B4B4B",
-"b c #606060",
-"c c #FDFDFD",
-"d c #777777",
-"e c #767676",
-"f c #131313",
-"g c #030303",
-"h c #121212",
-" ",
-" ",
-" ",
-" .+@. ",
-" #$%&&&*= ",
-" -;&&&&&&>, ",
-"')&&&&&&&&;!",
-"~{&&]^./&&&(",
-" _:<_ [&&&/",
-" }|&&&1",
-" 23&&&&4 ",
-" 5&&&67 ",
-" 8&&&9 ",
-" 0aabc ",
-" d44e ",
-" &&&& ",
-" &&&& ",
-" fggh ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f179.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f179.xpm
deleted file mode 100644
index b070646..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f179.xpm
+++ /dev/null
@@ -1,94 +0,0 @@
-/* XPM */
-static char * FontAwesome_f179_xpm[] = {
-"16 21 70 1",
-" c #FFFFFF",
-". c #F7F7F7",
-"+ c #CBCBCB",
-"@ c #444444",
-"# c #5F5F5F",
-"$ c #C7C7C7",
-"% c #0A0A0A",
-"& c #000000",
-"* c #919191",
-"= c #3E3E3E",
-"- c #232323",
-"; c #F3F3F3",
-"> c #F6F6F6",
-", c #010101",
-"' c #CECECE",
-") c #C0C0C0",
-"! c #606060",
-"~ c #303030",
-"{ c #4C4C4C",
-"] c #787878",
-"^ c #9F9F9F",
-"/ c #757575",
-"( c #797979",
-"_ c #4D4D4D",
-": c #1C1C1C",
-"< c #242424",
-"[ c #6A6A6A",
-"} c #E5E5E5",
-"| c #999999",
-"1 c #030303",
-"2 c #1D1D1D",
-"3 c #DBDBDB",
-"4 c #DFDFDF",
-"5 c #050505",
-"6 c #343434",
-"7 c #EFEFEF",
-"8 c #676767",
-"9 c #101010",
-"0 c #ECECEC",
-"a c #313131",
-"b c #6E6E6E",
-"c c #0D0D0D",
-"d c #151515",
-"e c #747474",
-"f c #3C3C3C",
-"g c #1A1A1A",
-"h c #5C5C5C",
-"i c #FCFCFC",
-"j c #C6C6C6",
-"k c #404040",
-"l c #393939",
-"m c #8B8B8B",
-"n c #B4B4B4",
-"o c #161616",
-"p c #F4F4F4",
-"q c #727272",
-"r c #ABABAB",
-"s c #FBFBFB",
-"t c #484848",
-"u c #222222",
-"v c #3F3F3F",
-"w c #121212",
-"x c #939393",
-"y c #FDFDFD",
-"z c #B7B7B7",
-"A c #AAAAAA",
-"B c #E8E8E8",
-"C c #FEFEFE",
-"D c #A9A9A9",
-"E c #D3D3D3",
-" . ",
-" +@# ",
-" $%&* ",
-" =&-; ",
-" >,-' ",
-" )!~{]^/(_:<[} ",
-" |1&&&&&&&&&&&23",
-"45&&&&&&&&&&&&67",
-"8&&&&&&&&&&&&90 ",
-"a&&&&&&&&&&&&b ",
-"c&&&&&&&&&&&&* ",
-"d&&&&&&&&&&&&e ",
-"f&&&&&&&&&&&&g. ",
-"8&&&&&&&&&&&&&hi",
-"j&&&&&&&&&&&&&&k",
-" l&&&&&&&&&&&&&m",
-" n&&&&&&&&&&&&op",
-" q&&&&&&&&&&,r ",
-" st&&&uvw&&&x ",
-" yzAB C3DE ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f17a.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f17a.xpm
deleted file mode 100644
index 2e4661a..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f17a.xpm
+++ /dev/null
@@ -1,72 +0,0 @@
-/* XPM */
-static char * FontAwesome_f17a_xpm[] = {
-"19 21 48 1",
-" c #FFFFFF",
-". c #FDFDFD",
-"+ c #E3E3E3",
-"@ c #C1C1C1",
-"# c #9E9E9E",
-"$ c #7B7B7B",
-"% c #585858",
-"& c #F5F5F5",
-"* c #E0E0E0",
-"= c #919191",
-"- c #6E6E6E",
-"; c #4C4C4C",
-"> c #292929",
-", c #070707",
-"' c #000000",
-") c #C6C6C6",
-"! c #A4A4A4",
-"~ c #818181",
-"{ c #5F5F5F",
-"] c #3C3C3C",
-"^ c #1A1A1A",
-"/ c #373737",
-"( c #A3A3A3",
-"_ c #DBDBDB",
-": c #E2E2E2",
-"< c #F2F2F2",
-"[ c #131313",
-"} c #464646",
-"| c #AAAAAA",
-"1 c #A1A1A1",
-"2 c #7F7F7F",
-"3 c #5C5C5C",
-"4 c #3A3A3A",
-"5 c #171717",
-"6 c #F4F4F4",
-"7 c #D2D2D2",
-"8 c #C4C4C4",
-"9 c #D1D1D1",
-"0 c #696969",
-"a c #242424",
-"b c #040404",
-"c c #FCFCFC",
-"d c #DFDFDF",
-"e c #BDBDBD",
-"f c #9B9B9B",
-"g c #787878",
-"h c #565656",
-"i c #343434",
-" ",
-" ",
-" .+@#$%",
-" &**=-;>,'''''",
-")!~{]^'/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"_______:<__________",
-"[[[[[[[}|[[[[[[[[[[",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"'''''''/(''''''''''",
-"12345''/(''''''''''",
-" 67890}ab''''''",
-" cdefghi"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f17c.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f17c.xpm
deleted file mode 100644
index a6d38d8..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f17c.xpm
+++ /dev/null
@@ -1,140 +0,0 @@
-/* XPM */
-static char * FontAwesome_f17c_xpm[] = {
-"18 21 116 2",
-" c #FFFFFF",
-". c #FEFEFE",
-"+ c #E8E8E8",
-"@ c #F5F5F5",
-"# c #D4D4D4",
-"$ c #262626",
-"% c #000000",
-"& c #010101",
-"* c #545454",
-"= c #F6F6F6",
-"- c #414141",
-"; c #8A8A8A",
-"> c #111111",
-", c #090909",
-"' c #020202",
-") c #303030",
-"! c #040404",
-"~ c #F4F4F4",
-"{ c #767676",
-"] c #CFCFCF",
-"^ c #8D8D8D",
-"/ c #C0C0C0",
-"( c #717171",
-"_ c #BCBCBC",
-": c #565656",
-"< c #969696",
-"[ c #CDCDCD",
-"} c #F2F2F2",
-"| c #C2C2C2",
-"1 c #353535",
-"2 c #707070",
-"3 c #E5E5E5",
-"4 c #575757",
-"5 c #818181",
-"6 c #5D5D5D",
-"7 c #9D9D9D",
-"8 c #3B3B3B",
-"9 c #4E4E4E",
-"0 c #FAFAFA",
-"a c #5F5F5F",
-"b c #181818",
-"c c #E4E4E4",
-"d c #686868",
-"e c #C7C7C7",
-"f c #ACACAC",
-"g c #888888",
-"h c #151515",
-"i c #F8F8F8",
-"j c #161616",
-"k c #030303",
-"l c #CACACA",
-"m c #464646",
-"n c #404040",
-"o c #939393",
-"p c #1E1E1E",
-"q c #363636",
-"r c #FDFDFD",
-"s c #DDDDDD",
-"t c #0E0E0E",
-"u c #EEEEEE",
-"v c #3D3D3D",
-"w c #B4B4B4",
-"x c #868686",
-"y c #6E6E6E",
-"z c #1B1B1B",
-"A c #6A6A6A",
-"B c #656565",
-"C c #232323",
-"D c #1D1D1D",
-"E c #A0A0A0",
-"F c #373737",
-"G c #9A9A9A",
-"H c #2D2D2D",
-"I c #555555",
-"J c #383838",
-"K c #DEDEDE",
-"L c #DBDBDB",
-"M c #313131",
-"N c #EAEAEA",
-"O c #AFAFAF",
-"P c #474747",
-"Q c #F3F3F3",
-"R c #C6C6C6",
-"S c #212121",
-"T c #0D0D0D",
-"U c #CBCBCB",
-"V c #B0B0B0",
-"W c #F1F1F1",
-"X c #C8C8C8",
-"Y c #EDEDED",
-"Z c #A9A9A9",
-"` c #BDBDBD",
-" . c #FCFCFC",
-".. c #B6B6B6",
-"+. c #959595",
-"@. c #626262",
-"#. c #A2A2A2",
-"$. c #A8A8A8",
-"%. c #BEBEBE",
-"&. c #E3E3E3",
-"*. c #D5D5D5",
-"=. c #C4C4C4",
-"-. c #2A2A2A",
-";. c #222222",
-">. c #292929",
-",. c #2E2E2E",
-"'. c #1C1C1C",
-"). c #919191",
-"!. c #D7D7D7",
-"~. c #ABABAB",
-"{. c #F9F9F9",
-"]. c #D6D6D6",
-"^. c #C1C1C1",
-"/. c #595959",
-"(. c #C9C9C9",
-"_. c #7B7B7B",
-" . + @ ",
-" # $ % & * = ",
-" - % % % % ; ",
-" > , % ' ) ! ~ ",
-" % { ' ] ^ % / ",
-" % ( _ : % < ",
-" % [ } | 1 2 ",
-" 3 % 4 5 6 7 8 9 0 ",
-" a b c d e f % g ",
-" [ & h i j k l ",
-" m h n o p q r ",
-" s % t u u t v w ",
-" x , y z A B ",
-" C D E F G H ",
-" I J K L M - 8 ",
-" N O P Q R S T U r ",
-"V # B 1 W X } Y N ",
-"Z Q S [ ` / 3 . ",
-".. +.@.#.$.d & %. . &.0 ",
-"l / *.r =.-.;.>.,.'.). !.~.i ",
-" {.].^./.(. 0 _.{ ~. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f188.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f188.xpm
deleted file mode 100644
index 88d1c62..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f188.xpm
+++ /dev/null
@@ -1,96 +0,0 @@
-/* XPM */
-static char * FontAwesome_f188_xpm[] = {
-"19 21 72 1",
-" c #FFFFFF",
-". c #E5E5E5",
-"+ c #A9A9A9",
-"@ c #E6E6E6",
-"# c #9F9F9F",
-"$ c #090909",
-"% c #000000",
-"& c #0A0A0A",
-"* c #A2A2A2",
-"= c #D2D2D2",
-"- c #040404",
-"; c #060606",
-"> c #D6D6D6",
-", c #CACACA",
-"' c #828282",
-") c #888888",
-"! c #C8C8C8",
-"~ c #A1A1A1",
-"{ c #484848",
-"] c #0B0B0B",
-"^ c #C2C2C2",
-"/ c #EBEBEB",
-"( c #DFDFDF",
-"_ c #ECECEC",
-": c #BFBFBF",
-"< c #4C4C4C",
-"[ c #EFEFEF",
-"} c #363636",
-"| c #878787",
-"1 c #8F8F8F",
-"2 c #858585",
-"3 c #3A3A3A",
-"4 c #F1F1F1",
-"5 c #F0F0F0",
-"6 c #202020",
-"7 c #010101",
-"8 c #222222",
-"9 c #F2F2F2",
-"0 c #3B3B3B",
-"a c #B7B7B7",
-"b c #3F3F3F",
-"c c #D7D7D7",
-"d c #313131",
-"e c #353535",
-"f c #1B1B1B",
-"g c #BBBBBB",
-"h c #323232",
-"i c #5B5B5B",
-"j c #636363",
-"k c #969696",
-"l c #9C9C9C",
-"m c #AAAAAA",
-"n c #0E0E0E",
-"o c #181818",
-"p c #1F1F1F",
-"q c #DCDCDC",
-"r c #151515",
-"s c #2D2D2D",
-"t c #E0E0E0",
-"u c #686868",
-"v c #B9B9B9",
-"w c #212121",
-"x c #696969",
-"y c #E1E1E1",
-"z c #DBDBDB",
-"A c #1C1C1C",
-"B c #909090",
-"C c #E3E3E3",
-"D c #DDDDDD",
-"E c #949494",
-"F c #FEFEFE",
-"G c #FCFCFC",
-" ",
-" .++@ ",
-" #$%%&* ",
-" =-%%%%;> ",
-" #, '%%%%%%) !~ ",
-" {]^ /((((((_ :&< ",
-" [}]|111111112&34 ",
-" 56%%%%77%%%%89 ",
-" 0%%%%aa%%%%b ",
-" 0%%%%aa%%%%b ",
-"_ccd%%%%aa%%%%ecc_ ",
-"f%%%%%%%aa%%%%%%%f ",
-">ggh%%%%aa%%%%}ggc ",
-" i%%%%aa%%%%j ",
-" k%%%%aa%%%%l ",
-" m%%%%aa%%%%= ",
-" ,&hn%%aa%%nop( ",
-" qrs5tu8vvwxyzApt ",
-" BwC D8E ",
-" FG G ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f18e.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f18e.xpm
deleted file mode 100644
index c719fbf..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f18e.xpm
+++ /dev/null
@@ -1,128 +0,0 @@
-/* XPM */
-static char * FontAwesome_f18e_xpm[] = {
-"18 21 104 2",
-" c #FFFFFF",
-". c #EDEDED",
-"+ c #A5A5A5",
-"@ c #6B6B6B",
-"# c #525252",
-"$ c #565656",
-"% c #717171",
-"& c #B1B1B1",
-"* c #F4F4F4",
-"= c #F0F0F0",
-"- c #737373",
-"; c #070707",
-"> c #000000",
-", c #121212",
-"' c #898989",
-") c #FAFAFA",
-"! c #D7D7D7",
-"~ c #252525",
-"{ c #0B0B0B",
-"] c #2B2B2B",
-"^ c #272727",
-"/ c #060606",
-"( c #3D3D3D",
-"_ c #E9E9E9",
-": c #E4E4E4",
-"< c #1B1B1B",
-"[ c #181818",
-"} c #A9A9A9",
-"| c #F9F9F9",
-"1 c #F2F2F2",
-"2 c #929292",
-"3 c #353535",
-"4 c #F5F5F5",
-"5 c #FEFEFE",
-"6 c #464646",
-"7 c #454545",
-"8 c #ECECEC",
-"9 c #FCFCFC",
-"0 c #DDDDDD",
-"a c #707070",
-"b c #BCBCBC",
-"c c #151515",
-"d c #EAEAEA",
-"e c #EFEFEF",
-"f c #242424",
-"g c #DEDEDE",
-"h c #D0D0D0",
-"i c #050505",
-"j c #040404",
-"k c #E0E0E0",
-"l c #616161",
-"m c #A2A2A2",
-"n c #EBEBEB",
-"o c #1E1E1E",
-"p c #787878",
-"q c #8B8B8B",
-"r c #232323",
-"s c #D8D8D8",
-"t c #626262",
-"u c #1D1D1D",
-"v c #DCDCDC",
-"w c #CFCFCF",
-"x c #4C4C4C",
-"y c #080808",
-"z c #9F9F9F",
-"A c #313131",
-"B c #0F0F0F",
-"C c #4A4A4A",
-"D c #F8F8F8",
-"E c #EEEEEE",
-"F c #383838",
-"G c #2F2F2F",
-"H c #E6E6E6",
-"I c #F3F3F3",
-"J c #B7B7B7",
-"K c #A8A8A8",
-"L c #4B4B4B",
-"M c #BDBDBD",
-"N c #585858",
-"O c #777777",
-"P c #7B7B7B",
-"Q c #505050",
-"R c #A1A1A1",
-"S c #D9D9D9",
-"T c #030303",
-"U c #CCCCCC",
-"V c #F1F1F1",
-"W c #BBBBBB",
-"X c #A0A0A0",
-"Y c #0C0C0C",
-"Z c #9C9C9C",
-"` c #444444",
-" . c #606060",
-".. c #B0B0B0",
-"+. c #494949",
-"@. c #696969",
-"#. c #F6F6F6",
-"$. c #5F5F5F",
-"%. c #010101",
-"&. c #808080",
-"*. c #FDFDFD",
-"=. c #3F3F3F",
-"-. c #B5B5B5",
-";. c #9D9D9D",
-" ",
-" ",
-" . + @ # $ % & * ",
-" = - ; > > > > > > , ' ) ",
-" ! ~ > > > { ] ^ / > > > ( _ ",
-" : < > > [ } | 1 2 { > > 3 4 ",
-"5 6 > > 7 8 9 0 ] > > a ",
-"b > > c d e f g h i > j k ",
-"l > > m n > o 0 p > > q ",
-"r > j * s @ @ @ t > > u v w > > x ",
-"y > u z > > > > > > > < d * > > A ",
-"B > [ z > > > > > > > C D E > > F ",
-"G > > H I J J J K > > L D M > > N ",
-"O > > P n > x D 5 Q > > R ",
-"S T > T U 4 @ D + > > c V ",
-" % > > < W 5 X Y > > Z ",
-" | ` > > > .W k 0 ..+.> > > @.5 ",
-" #.$.> > > > > > > > > %.&.*. ",
-" 5 W =.%.> > > > / Q h ",
-" n -.;.X W 1 ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ad.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ad.xpm
deleted file mode 100644
index fac2813..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ad.xpm
+++ /dev/null
@@ -1,67 +0,0 @@
-/* XPM */
-static char * FontAwesome_f1ad_xpm[] = {
-"17 21 43 1",
-" c #EEEEEE",
-". c #DBDBDB",
-"+ c #F4F4F4",
-"@ c #FFFFFF",
-"# c #121212",
-"$ c #000000",
-"% c #363636",
-"& c #232323",
-"* c #373737",
-"= c #2F2F2F",
-"- c #3B3B3B",
-"; c #1D1D1D",
-"> c #F9F9F9",
-", c #D3D3D3",
-"' c #FBFBFB",
-") c #171717",
-"! c #141414",
-"~ c #1A1A1A",
-"{ c #040404",
-"] c #5B5B5B",
-"^ c #454545",
-"/ c #575757",
-"( c #191919",
-"_ c #CACACA",
-": c #F3F3F3",
-"< c #0A0A0A",
-"[ c #828282",
-"} c #6F6F6F",
-"| c #868686",
-"1 c #ACACAC",
-"2 c #CFCFCF",
-"3 c #0F0F0F",
-"4 c #A6A6A6",
-"5 c #8D8D8D",
-"6 c #AAAAAA",
-"7 c #8E8E8E",
-"8 c #ABABAB",
-"9 c #CECECE",
-"0 c #6B6B6B",
-"a c #878787",
-"b c #D7D7D7",
-"c c #494949",
-"d c #696969",
-" ..............+@",
-"#$$$$$$$$$$$$$$%@",
-"$$$$$$$$$$$$$$$&@",
-"$$$*$=-$=-$=-$$&@",
-"$$;>$,'$,'$,'$$&@",
-"$$$)$!~$!~$!~$$&@",
-"$${]$^/$^/$^/$$&@",
-"$$( $_:$_:$_:$$&@",
-"$$$$$$$$$$$$$$$&@",
-"$$<[$}|$}|$}|$$&@",
-"$$!_$12$12$12$$&@",
-"$$$$$$$$$$$$$$$&@",
-"$$34$56$56$56$$&@",
-"$$34$78$78$78$$&@",
-"$$$$$$$$$$$$$$$&@",
-"$$!_$$$$$$$19$$&@",
-"$$<[$^000/$}a$$&@",
-"$$$$$b@@@@$$$$$&@",
-"$$$$$b@@@@$$$$$&@",
-"$$$$$^000/$$$$$&@",
-"c&&&&&&&&&&&&&&d@"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1c6.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1c6.xpm
deleted file mode 100644
index 4357348..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1c6.xpm
+++ /dev/null
@@ -1,86 +0,0 @@
-/* XPM */
-static char * FontAwesome_f1c6_xpm[] = {
-"17 21 62 1",
-" c #F3F3F3",
-". c #D7D7D7",
-"+ c #F0F0F0",
-"@ c #FFFFFF",
-"# c #272727",
-"$ c #000000",
-"% c #343434",
-"& c #B8B8B8",
-"* c #9D9D9D",
-"= c #BBBBBB",
-"- c #696969",
-"; c #111111",
-"> c #767676",
-", c #FAFAFA",
-"' c #BFBFBF",
-") c #4B4B4B",
-"! c #E2E2E2",
-"~ c #E8E8E8",
-"{ c #565656",
-"] c #3A3A3A",
-"^ c #B1B1B1",
-"/ c #1B1B1B",
-"( c #121212",
-"_ c #B5B5B5",
-": c #E4E4E4",
-"< c #424242",
-"[ c #686868",
-"} c #020202",
-"| c #A7A7A7",
-"1 c #A1A1A1",
-"2 c #868686",
-"3 c #787878",
-"4 c #8F8F8F",
-"5 c #404040",
-"6 c #1F1F1F",
-"7 c #2B2B2B",
-"8 c #FCFCFC",
-"9 c #707070",
-"0 c #0B0B0B",
-"a c #030303",
-"b c #676767",
-"c c #FEFEFE",
-"d c #DBDBDB",
-"e c #B9B9B9",
-"f c #A4A4A4",
-"g c #7E7E7E",
-"h c #6E6E6E",
-"i c #474747",
-"j c #383838",
-"k c #0A0A0A",
-"l c #848484",
-"m c #AEAEAE",
-"n c #232323",
-"o c #454545",
-"p c #626262",
-"q c #050505",
-"r c #262626",
-"s c #151515",
-"t c #9B9B9B",
-"u c #010101",
-"v c #6B6B6B",
-"w c #6A6A6A",
-" ........+@@@@@@@",
-"#$$$$$$$$$%&@@@@@",
-"$*====$*$-;$>,@@@",
-"$.@@@')!$.~{$]!@@",
-"$.@@@#@@$.@@^/(_@",
-"$.@@@:<@$.@@@+[}|",
-"$.@@@12@$34444456",
-"$.@@@78@90aaaaa}$",
-"$.@@@@#@@@@@@@@.$",
-"$.@@@b'@@@@@@@@.$",
-"$.@@c$&c@@@@@@@.$",
-"$.@@d$$e@@@@@@@.$",
-"$.@@f$$g@@@@@@@.$",
-"$.@@h$$i@@@@@@@.$",
-"$.@@j$$;c@@@@@@.$",
-"$.@@klm$!@@@@@@.$",
-"$.@@nopq @@@@@@.$",
-"$.@@'rst@@@@@@@.$",
-"$.@@@@@@@@@@@@@.$",
-"u{bbbbbbbbbbbbb{u",
-"v###############w"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1d2.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1d2.xpm
deleted file mode 100644
index 26d46ce..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1d2.xpm
+++ /dev/null
@@ -1,108 +0,0 @@
-/* XPM */
-static char * FontAwesome_f1d2_xpm[] = {
-"17 21 84 1",
-" c #FFFFFF",
-". c #C9C9C9",
-"+ c #686868",
-"@ c #474747",
-"# c #656565",
-"$ c #C6C6C6",
-"% c #B9B9B9",
-"& c #030303",
-"* c #000000",
-"= c #020202",
-"- c #B7B7B7",
-"; c #333333",
-"> c #343434",
-", c #050505",
-"' c #AEAEAE",
-") c #BABABA",
-"! c #0B0B0B",
-"~ c #616161",
-"{ c #0A0A0A",
-"] c #6F6F6F",
-"^ c #EBEBEB",
-"/ c #C4C4C4",
-"( c #BBBBBB",
-"_ c #E5E5E5",
-": c #E7E7E7",
-"< c #F0F0F0",
-"[ c #1F1F1F",
-"} c #080808",
-"| c #F7F7F7",
-"1 c #767676",
-"2 c #F8F8F8",
-"3 c #B0B0B0",
-"4 c #9C9C9C",
-"5 c #646464",
-"6 c #0C0C0C",
-"7 c #111111",
-"8 c #FEFEFE",
-"9 c #0F0F0F",
-"0 c #E6E6E6",
-"a c #6A6A6A",
-"b c #636363",
-"c c #070707",
-"d c #B3B3B3",
-"e c #ECECEC",
-"f c #D6D6D6",
-"g c #101010",
-"h c #626262",
-"i c #5B5B5B",
-"j c #CBCBCB",
-"k c #515151",
-"l c #484848",
-"m c #0D0D0D",
-"n c #575757",
-"o c #121212",
-"p c #151515",
-"q c #EDEDED",
-"r c #202020",
-"s c #AAAAAA",
-"t c #DBDBDB",
-"u c #FCFCFC",
-"v c #939393",
-"w c #171717",
-"x c #161616",
-"y c #131313",
-"z c #181818",
-"A c #EEEEEE",
-"B c #EAEAEA",
-"C c #010101",
-"D c #DEDEDE",
-"E c #E3E3E3",
-"F c #FDFDFD",
-"G c #797979",
-"H c #0E0E0E",
-"I c #4E4E4E",
-"J c #505050",
-"K c #525252",
-"L c #1D1D1D",
-"M c #242424",
-"N c #212121",
-"O c #DDDDDD",
-"P c #F4F4F4",
-"Q c #B2B2B2",
-"R c #AFAFAF",
-"S c #F2F2F2",
-" ",
-" ",
-" .+@@@@@@@@@@@#$ ",
-"%&*************=-",
-";***************>",
-",********'******,",
-"*********)*&!****",
-"***********~ {***",
-"***]^/(_&:=< :[**",
-"**}|12 3* *4 56**",
-"**7890 a* *b c***",
-"***de fg* *h c***",
-"***ijkc** *l hm**",
-"***#fno*& *pq8r**",
-"***st_uv*w**{x***",
-"**y8z,AB*********",
-"m*CDEeFG********H",
-"I**6JKL*********I",
-"DM*************NO",
-" PQvvvvvvvvvvvRS ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1de.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1de.xpm
deleted file mode 100644
index ef015cb..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1de.xpm
+++ /dev/null
@@ -1,71 +0,0 @@
-/* XPM */
-static char * FontAwesome_f1de_xpm[] = {
-"18 21 47 1",
-" c #FFFFFF",
-". c #DFDFDF",
-"+ c #B3B3B3",
-"@ c #B5B5B5",
-"# c #F4F4F4",
-"$ c #3B3B3B",
-"% c #000000",
-"& c #8C8C8C",
-"* c #1F1F1F",
-"= c #424242",
-"- c #333333",
-"; c #606060",
-"> c #6F6F6F",
-", c #858585",
-"' c #6C6C6C",
-") c #5D5D5D",
-"! c #030303",
-"~ c #050505",
-"{ c #A8A8A8",
-"] c #C2C2C2",
-"^ c #676767",
-"/ c #C4C4C4",
-"( c #D7D7D7",
-"_ c #5B5B5B",
-": c #DDDDDD",
-"< c #272727",
-"[ c #BBBBBB",
-"} c #C5C5C5",
-"| c #B0B0B0",
-"1 c #4B4B4B",
-"2 c #B2B2B2",
-"3 c #CBCBCB",
-"4 c #252525",
-"5 c #585858",
-"6 c #8F8F8F",
-"7 c #7F7F7F",
-"8 c #131313",
-"9 c #AEAEAE",
-"0 c #A0A0A0",
-"a c #494949",
-"b c #2A2A2A",
-"c c #A3A3A3",
-"d c #171717",
-"e c #F2F2F2",
-"f c #9D9D9D",
-"g c #979797",
-"h c #C0C0C0",
-" ",
-" ",
-" ",
-" .++@# ",
-" $%%%& ",
-"**=-%%%;*********=",
-">>,-%%%'>>>>>>>>>,",
-" )!!~{ ",
-" ",
-" ]^^^/ ",
-"((((((((((_%%%_((:",
-"%%%%%%%%%%_%%%_%%<",
-"[[[[[[[[[[_%%%_[[}",
-" |1112 ",
-" ",
-" 34**5 ",
-"66667%%%8966666660",
-"!!!!5%%%8a!!!!!!!b",
-" c%%%d ",
-" efggh ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ec.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ec.xpm
deleted file mode 100644
index 6f8efd1..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f1ec.xpm
+++ /dev/null
@@ -1,103 +0,0 @@
-/* XPM */
-static char * FontAwesome_f1ec_xpm[] = {
-"20 21 79 1",
-" c #FEFEFE",
-". c #DCDCDC",
-"+ c #DBDBDB",
-"@ c #FAFAFA",
-"# c #FFFFFF",
-"$ c #535353",
-"% c #000000",
-"& c #2C2C2C",
-"* c #FDFDFD",
-"= c #020202",
-"- c #737373",
-"; c #B7B7B7",
-"> c #8D8D8D",
-", c #DADADA",
-"' c #D7D7D7",
-") c #D6D6D6",
-"! c #565656",
-"~ c #939393",
-"{ c #6B6B6B",
-"] c #5A5A5A",
-"^ c #E3E3E3",
-"/ c #797979",
-"( c #545454",
-"_ c #D5D5D5",
-": c #7A7A7A",
-"< c #757575",
-"[ c #E5E5E5",
-"} c #747474",
-"| c #BCBCBC",
-"1 c #C6C6C6",
-"2 c #C5C5C5",
-"3 c #E4E4E4",
-"4 c #BBBBBB",
-"5 c #E2E2E2",
-"6 c #434343",
-"7 c #C0C0C0",
-"8 c #5D5D5D",
-"9 c #3B3B3B",
-"0 c #B2B2B2",
-"a c #3A3A3A",
-"b c #595959",
-"c c #C2C2C2",
-"d c #585858",
-"e c #2D2D2D",
-"f c #9B9B9B",
-"g c #414141",
-"h c #232323",
-"i c #424242",
-"j c #3D3D3D",
-"k c #9D9D9D",
-"l c #DFDFDF",
-"m c #C1C1C1",
-"n c #E1E1E1",
-"o c #FBFBFB",
-"p c #989898",
-"q c #707070",
-"r c #F2F2F2",
-"s c #6F6F6F",
-"t c #999999",
-"u c #0B0B0B",
-"v c #060606",
-"w c #090909",
-"x c #4F4F4F",
-"y c #111111",
-"z c #030303",
-"A c #A2A2A2",
-"B c #C9C9C9",
-"C c #A6A6A6",
-"D c #A5A5A5",
-"E c #CACACA",
-"F c #A1A1A1",
-"G c #A7A7A7",
-"H c #0D0D0D",
-"I c #505050",
-"J c #121212",
-"K c #0F0F0F",
-"L c #525252",
-"M c #909090",
-"N c #242424",
-" .+++++++++++++++@##",
-"$%%%%%%%%%%%%%%%%&*#",
-"=-;;;;;;;;;;;;;;>%,#",
-"%'###############%'#",
-"%'###############%'#",
-"%)##############*%'#",
-"%!~~~~~~~~~~~~~~{%'#",
-"%%%%%%%%%%%%%%%%%%'#",
-"%]^/%(__$%:^]%<[}%'#",
-"%|#^%1##2%3#4%5#5%'#",
-"%678%900a%876%bcd%'#",
-"%%%%%%%%%%%%%%%%%%'#",
-"%efg%h>>h%ife%jkj%'#",
-"%;#l%m##7%l#;%5#n%'#",
-"%-op%qrrs%to-%###%'#",
-"%%u%%%vv%%%u%%###%'#",
-"%wxy%ziiz%yxw%###%'#",
-"%A#B%C##D%E#F%###%'#",
-"%A#E%G##C%E#A%1#1%'#",
-"HwIJ%z66z%JIw%KLK%3#",
-"MNhhhhhhhhhhhhhhhq##"};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f21b.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f21b.xpm
deleted file mode 100644
index 93c6f21..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f21b.xpm
+++ /dev/null
@@ -1,98 +0,0 @@
-/* XPM */
-static char * FontAwesome_f21b_xpm[] = {
-"17 21 74 1",
-" c #FFFFFF",
-". c #FEFEFE",
-"+ c #F3F3F3",
-"@ c #4F4F4F",
-"# c #060606",
-"$ c #585858",
-"% c #515151",
-"& c #AAAAAA",
-"* c #000000",
-"= c #AEAEAE",
-"- c #3E3E3E",
-"; c #434343",
-"> c #F7F7F7",
-", c #7A7A7A",
-"' c #2B2B2B",
-") c #2D2D2D",
-"! c #7D7D7D",
-"~ c #F9F9F9",
-"{ c #E4E4E4",
-"] c #2F2F2F",
-"^ c #333333",
-"/ c #E9E9E9",
-"( c #C0C0C0",
-"_ c #5E5E5E",
-": c #5D5D5D",
-"< c #3F3F3F",
-"[ c #C1C1C1",
-"} c #D7D7D7",
-"| c #B0B0B0",
-"1 c #C8C8C8",
-"2 c #AFAFAF",
-"3 c #E3E3E3",
-"4 c #020202",
-"5 c #272727",
-"6 c #909090",
-"7 c #2C2C2C",
-"8 c #E6E6E6",
-"9 c #484848",
-"0 c #7B7B7B",
-"a c #030303",
-"b c #797979",
-"c c #8E8E8E",
-"d c #818181",
-"e c #757575",
-"f c #767676",
-"g c #808080",
-"h c #9C9C9C",
-"i c #EEEEEE",
-"j c #0C0C0C",
-"k c #5C5C5C",
-"l c #505050",
-"m c #5B5B5B",
-"n c #131313",
-"o c #F5F5F5",
-"p c #9F9F9F",
-"q c #919191",
-"r c #ABABAB",
-"s c #6C6C6C",
-"t c #F6F6F6",
-"u c #CCCCCC",
-"v c #2A2A2A",
-"w c #CBCBCB",
-"x c #494949",
-"y c #565656",
-"z c #727272",
-"A c #313131",
-"B c #7E7E7E",
-"C c #202020",
-"D c #252525",
-"E c #ECECEC",
-"F c #B1B1B1",
-"G c #949494",
-"H c #939393",
-"I c #B2B2B2",
-" .+ +. ",
-" .@#$$#%. ",
-" &******= ",
-" -******; ",
-" >,'********)!~ ",
-" {]**********^/ ",
-" (*_:<<:_*[ ",
-" }*| 11 2*} ",
-" 34**567)65**48 ",
-" @**********9 ",
-" 0**a****a**b ",
-" c***de**fg***h ",
-"ij***k.ll.m***no ",
-"p****7 qq '****r ",
-"s****a>:_ta****b ",
-"l*****uv'w*****: ",
-"x*****q44q*****y ",
-"z*****A**A*****B ",
-"8C************DE ",
-" oFGHHHHHHHHGI> ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f27b.xpm b/elpa/mode-icons-20190627.2121/icons/FontAwesome-f27b.xpm
deleted file mode 100644
index f6c0c89..0000000
--- a/elpa/mode-icons-20190627.2121/icons/FontAwesome-f27b.xpm
+++ /dev/null
@@ -1,123 +0,0 @@
-/* XPM */
-static char * FontAwesome_f27b_xpm[] = {
-"20 21 99 2",
-" c #FFFFFF",
-". c #FBFBFB",
-"+ c #D8D8D8",
-"@ c #C4C4C4",
-"# c #B8B8B8",
-"$ c #C8C8C8",
-"% c #E3E3E3",
-"& c #EEEEEE",
-"* c #979797",
-"= c #3F3F3F",
-"- c #0A0A0A",
-"; c #000000",
-"> c #1D1D1D",
-", c #686868",
-"' c #D0D0D0",
-") c #8B8B8B",
-"! c #0E0E0E",
-"~ c #050505",
-"{ c #595959",
-"] c #989898",
-"^ c #C3C3C3",
-"/ c #D6D6D6",
-"( c #585858",
-"_ c #5E5E5E",
-": c #EBEBEB",
-"< c #EFEFEF",
-"[ c #444444",
-"} c #111111",
-"| c #7D7D7D",
-"1 c #E7E7E7",
-"2 c #E6E6E6",
-"3 c #101010",
-"4 c #262626",
-"5 c #E0E0E0",
-"6 c #FCFCFC",
-"7 c #464646",
-"8 c #2F2F2F",
-"9 c #E1E1E1",
-"0 c #DFDFDF",
-"a c #2D2D2D",
-"b c #313131",
-"c c #F8F8F8",
-"d c #9D9D9D",
-"e c #161616",
-"f c #E4E4E4",
-"g c #151515",
-"h c #929292",
-"i c #373737",
-"j c #828282",
-"k c #D2D2D2",
-"l c #888888",
-"m c #353535",
-"n c #0C0C0C",
-"o c #494949",
-"p c #252525",
-"q c #C7C7C7",
-"r c #181818",
-"s c #BBBBBB",
-"t c #6E6E6E",
-"u c #4C4C4C",
-"v c #4A4A4A",
-"w c #6F6F6F",
-"x c #BCBCBC",
-"y c #666666",
-"z c #FEFEFE",
-"A c #D5D5D5",
-"B c #6B6B6B",
-"C c #4B4B4B",
-"D c #030303",
-"E c #BABABA",
-"F c #C5C5C5",
-"G c #B7B7B7",
-"H c #656565",
-"I c #A1A1A1",
-"J c #626262",
-"K c #FAFAFA",
-"L c #606060",
-"M c #474747",
-"N c #424242",
-"O c #707070",
-"P c #818181",
-"Q c #696969",
-"R c #454545",
-"S c #202020",
-"T c #ABABAB",
-"U c #1E1E1E",
-"V c #8C8C8C",
-"W c #070707",
-"X c #080808",
-"Y c #0F0F0F",
-"Z c #6A6A6A",
-"` c #B5B5B5",
-" . c #919191",
-".. c #515151",
-"+. c #232323",
-"@. c #565656",
-"#. c #3C3C3C",
-"$. c #B4B4B4",
-"%. c #6D6D6D",
-" ",
-" ",
-" ",
-" . + @ # $ % ",
-" & * = - ; ; ; ; ; > , ' ",
-" . ) ! ~ { ] ^ / / ^ ] ( ~ ; _ : ",
-" < [ } | 1 2 | 3 4 5 ",
-"6 7 8 9 0 a b c ",
-"d e 2 f g h ",
-"i ) 0 j k k j 0 k j 0 l m ",
-"n $ o ; p p ; o p ; o q n ",
-"r s t ; u v ; w v ; w x e ",
-"o y z A 6 6 A z 6 A z B C ",
-"s D E F ~ G ",
-"z H - I z G 3 J ",
-" K L ; M 1 z # N ; L K ",
-" y ; 1 k O P l Q R > ; S T z ",
-" K U M . V W X Y W e b Z ` 6 ",
-" .; ..+.; @.1 ",
-" G D ; ; #.$. ",
-" %.v l 5 "};
diff --git a/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-ea12.xpm b/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-ea12.xpm
deleted file mode 100644
index 19d9cdd..0000000
--- a/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-ea12.xpm
+++ /dev/null
@@ -1,80 +0,0 @@
-/* XPM */
-static char * IcoMoon_Free_ea12_xpm[] = {
-"20 21 56 1",
-" c #FFFFFF",
-". c #5C5C5C",
-"+ c #000000",
-"@ c #5B5B5B",
-"# c #3D3D3D",
-"$ c #FAFAFA",
-"% c #F9F9F9",
-"& c #383838",
-"* c #3F3F3F",
-"= c #B5B5B5",
-"- c #D7D7D7",
-"; c #D9D9D9",
-"> c #D8D8D8",
-", c #E1E1E1",
-"' c #E3E3E3",
-") c #2C2C2C",
-"! c #FEFEFE",
-"~ c #E8E8E8",
-"{ c #3B3B3B",
-"] c #A5A5A5",
-"^ c #B7B7B7",
-"/ c #FBFBFB",
-"( c #707070",
-"_ c #0F0F0F",
-": c #EFEFEF",
-"< c #E9E9E9",
-"[ c #070707",
-"} c #B6B6B6",
-"| c #C6C6C6",
-"1 c #A6A6A6",
-"2 c #CACACA",
-"3 c #1C1C1C",
-"4 c #060606",
-"5 c #B4B4B4",
-"6 c #C2C2C2",
-"7 c #C3C3C3",
-"8 c #9D9D9D",
-"9 c #B3B3B3",
-"0 c #F6F6F6",
-"a c #2B2B2B",
-"b c #151515",
-"c c #686868",
-"d c #050505",
-"e c #B1B1B1",
-"f c #D2D2D2",
-"g c #080808",
-"h c #AFAFAF",
-"i c #949494",
-"j c #040404",
-"k c #ADADAD",
-"l c #4F4F4F",
-"m c #ABABAB",
-"n c #ECECEC",
-"o c #1F1F1F",
-"p c #A9A9A9",
-"q c #F2F2F2",
-" .+++@ ++++#$%&+++* ",
-" +=-=+ +=--+;>+---, ",
-" +- -+ +- +--+ ",
-" +- -+ +- +'-+ ",
-" +++++ ++++)!-+ ",
-" +=-=+ +=--+~-+ ",
-" +- -+ +- +--+ ",
-" +- -+ +=--+>>+---, ",
-" +- -+ ++++{%%&+++* ",
-" ",
-" ]^ ",
-" /(+_: ",
-" <*+[} ",
-" |1 23+45 ",
-" 6[47 8[+49 ",
-" 0a+b;c++de ",
-" fg+d++dh ",
-" i+++jk ",
-" l+jm ",
-" nop ",
-" q "};
diff --git a/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabd.xpm b/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabd.xpm
deleted file mode 100644
index f2e93f9..0000000
--- a/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabd.xpm
+++ /dev/null
@@ -1,141 +0,0 @@
-/* XPM */
-static char * IcoMoon_Free_eabd_xpm[] = {
-"21 21 117 2",
-" c #FFFFFF",
-". c #FEFEFE",
-"+ c #D5D5D5",
-"@ c #ABABAB",
-"# c #929292",
-"$ c #8E8E8E",
-"% c #A2A2A2",
-"& c #CDCDCD",
-"* c #FBFBFB",
-"= c #919191",
-"- c #1F1F1F",
-"; c #000000",
-"> c #242424",
-", c #B4B4B4",
-"' c #F9F9F9",
-") c #4A4A4A",
-"! c #939393",
-"~ c #757575",
-"{ c #010101",
-"] c #BCBCBC",
-"^ c #DDDDDD",
-"/ c #040404",
-"( c #2A2A2A",
-"_ c #FDFDFD",
-": c #7B7B7B",
-"< c #C3C3C3",
-"[ c #373737",
-"} c #7E7E7E",
-"| c #121212",
-"1 c #141414",
-"2 c #404040",
-"3 c #F4F4F4",
-"4 c #5F5F5F",
-"5 c #828282",
-"6 c #090909",
-"7 c #151515",
-"8 c #CACACA",
-"9 c #D2D2D2",
-"0 c #181818",
-"a c #232323",
-"b c #EEEEEE",
-"c c #5C5C5C",
-"d c #9F9F9F",
-"e c #F2F2F2",
-"f c #A4A4A4",
-"g c #0A0A0A",
-"h c #F3F3F3",
-"i c #B6B6B6",
-"j c #636363",
-"k c #FAFAFA",
-"l c #060606",
-"m c #F1F1F1",
-"n c #818181",
-"o c #070707",
-"p c #D8D8D8",
-"q c #FCFCFC",
-"r c #BEBEBE",
-"s c #767676",
-"t c #0E0E0E",
-"u c #020202",
-"v c #989898",
-"w c #252525",
-"x c #050505",
-"y c #131313",
-"z c #808080",
-"A c #737373",
-"B c #2D2D2D",
-"C c #A8A8A8",
-"D c #F8F8F8",
-"E c #323232",
-"F c #333333",
-"G c #E7E7E7",
-"H c #AAAAAA",
-"I c #2B2B2B",
-"J c #1D1D1D",
-"K c #6A6A6A",
-"L c #E9E9E9",
-"M c #C4C4C4",
-"N c #353535",
-"O c #030303",
-"P c #595959",
-"Q c #0D0D0D",
-"R c #898989",
-"S c #9D9D9D",
-"T c #949494",
-"U c #6D6D6D",
-"V c #565656",
-"W c #A6A6A6",
-"X c #D1D1D1",
-"Y c #CFCFCF",
-"Z c #7D7D7D",
-"` c #515151",
-" . c #414141",
-".. c #505050",
-"+. c #DADADA",
-"@. c #292929",
-"#. c #8D8D8D",
-"$. c #E6E6E6",
-"%. c #616161",
-"&. c #4F4F4F",
-"*. c #2C2C2C",
-"=. c #C7C7C7",
-"-. c #1A1A1A",
-";. c #D7D7D7",
-">. c #878787",
-",. c #0C0C0C",
-"'. c #525252",
-"). c #C8C8C8",
-"!. c #9E9E9E",
-"~. c #F0F0F0",
-"{. c #5B5B5B",
-"]. c #3B3B3B",
-"^. c #ECECEC",
-"/. c #1C1C1C",
-"(. c #C5C5C5",
-"_. c #8F8F8F",
-":. c #C2C2C2",
-" . + @ # $ % & . ",
-" * = - ; ; ; ; ; ; > , ",
-" ' ) ; ; ; ; ; ; ; ; ; ; ! ",
-" ~ ; ; ; ; ; ; ; ; ; ; ; { ] ",
-" ^ / ; ; ; ; ; ; ; ; ; ; ; ; ( _ ",
-" : ; ; ; ; ; ; ; ; ; ; ; ; ; ; < ",
-" [ ; ; ; ; ; ; ; ; ; ; ; ; ; ; } ",
-" | ; ; ; ; ; ; ; ; 1 ; ; ; ; ; 2 ",
-" 3 ; ; 4 5 6 ; ; 7 8 9 0 ; ; ; a ",
-" b ; c d ; ; % . e f ; ; ; g ",
-" h ; i 8 j k l ; m n o p e ; ; ; ; . ",
-" q { r s ; $ t u v w ; ! _ x ; ; ; * ",
-" y z ! ; 1 A ~ B ; ; C p ; ; ; ; D ",
-" - g E F G _ H B o I ; ; ; ; D ",
-" J u K L _ M N ; ; ; ; b ",
-" k O P = Q P R S T U - V W ; ; ; ; X ",
-" Y ; t M < Z ` ...K H +.@.; ; ; ; #. ",
-" ! ; ; x s q $.K g %.&.; ; ; *._ ",
-" ) ; > =.-.) & ;.>.,.'.). !.; ; ; ; W ",
-"~.o ; {. $.&.o { ].] ^.O ; ; ; /.m ",
-"+ A A (. _ * _.A A A A :."};
diff --git a/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabf.xpm b/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabf.xpm
deleted file mode 100644
index 185b00b..0000000
--- a/elpa/mode-icons-20190627.2121/icons/IcoMoon-Free-eabf.xpm
+++ /dev/null
@@ -1,94 +0,0 @@
-/* XPM */
-static char * IcoMoon_Free_eabf_xpm[] = {
-"21 21 70 1",
-" c #5B5B5B",
-". c #000000",
-"+ c #484848",
-"@ c #FFFFFF",
-"# c #1D1D1D",
-"$ c #D4D4D4",
-"% c #D7D7D7",
-"& c #BFBFBF",
-"* c #F4F4F4",
-"= c #989898",
-"- c #E3E3E3",
-"; c #F3F3F3",
-"> c #2D2D2D",
-", c #080808",
-"' c #F2F2F2",
-") c #CCCCCC",
-"! c #F7F7F7",
-"~ c #0E0E0E",
-"{ c #F8F8F8",
-"] c #454545",
-"^ c #060606",
-"/ c #A3A3A3",
-"( c #111111",
-"_ c #FDFDFD",
-": c #818181",
-"< c #020202",
-"[ c #9E9E9E",
-"} c #525252",
-"| c #B0B0B0",
-"1 c #A7A7A7",
-"2 c #EBEBEB",
-"3 c #D5D5D5",
-"4 c #171717",
-"5 c #181818",
-"6 c #B9B9B9",
-"7 c #040404",
-"8 c #8D8D8D",
-"9 c #272727",
-"0 c #B3B3B3",
-"a c #EFEFEF",
-"b c #D8D8D8",
-"c c #F1F1F1",
-"d c #5D5D5D",
-"e c #B8B8B8",
-"f c #676767",
-"g c #A2A2A2",
-"h c #AAAAAA",
-"i c #FEFEFE",
-"j c #D1D1D1",
-"k c #6F6F6F",
-"l c #282828",
-"m c #0A0A0A",
-"n c #A6A6A6",
-"o c #696969",
-"p c #0C0C0C",
-"q c #9D9D9D",
-"r c #393939",
-"s c #ADADAD",
-"t c #424242",
-"u c #252525",
-"v c #7F7F7F",
-"w c #EDEDED",
-"x c #353535",
-"y c #4F4F4F",
-"z c #7A7A7A",
-"A c #E2E2E2",
-"B c #949494",
-"C c #7C7C7C",
-"D c #2B2B2B",
-"E c #F9F9F9",
-" ..................+@",
-"..........#$%%%%%%&.*",
-"..........=@@@@@@@-.;",
-"....>....,'@@@@)!@-.;",
-"...~{....]@@@@@^/@-.;",
-"...(_....:@@@@@<[@-.;",
-"....}....|@@@@@12@-.;",
-".........3@@@@@@@@-.;",
-".........;@@@@@@@@-.;",
-"........^@@@@@@@@@-.;",
-".........456@@@@@@-.;",
-"...........1@@@@@@-.;",
-"..789......0@@@@)a-.;",
-"..,bcd.....e@@2f.g-.;",
-"...~hijklm.neop~qi-.;",
-".....rs;@@_t.uvw@@-.;",
-".......^xy9zAi@@@@-.;",
-"...........B@@@@@@-.;",
-"...........C@@@@@@-.;",
-"r..................Di",
-"Eb%%%%%%%%%%%%%%%%%!@"};
diff --git a/elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.png b/elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.png
deleted file mode 100644
index fafd95d..0000000
--- a/elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.png
+++ /dev/null
Binary files differ
diff --git a/elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.xpm b/elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.xpm
deleted file mode 100644
index b8ca27b..0000000
--- a/elpa/mode-icons-20190627.2121/icons/Lua-Logo_16x16.xpm
+++ /dev/null
@@ -1,94 +0,0 @@
-/* XPM */
-static char * Lua_Logo_16x16_xpm[] = {
-"16 16 75 1",
-" c None",
-". c #00005D",
-"+ c #000073",
-"@ c #00004F",
-"# c #00007A",
-"$ c #00007E",
-"% c #000072",
-"& c #000049",
-"* c #000070",
-"= c #00007B",
-"- c #00007D",
-"; c #020271",
-"> c #010149",
-", c #000067",
-"' c #00005A",
-") c #00005C",
-"! c #00007C",
-"~ c #292992",
-"{ c #9393C8",
-"] c #8A8AC2",
-"^ c #1E1E6B",
-"/ c #040480",
-"( c #A0A0CE",
-"_ c #FEFEFE",
-": c #FCFCFD",
-"< c #8787C1",
-"[ c #010147",
-"} c #050580",
-"| c #A6A6D2",
-"1 c #FDFDFE",
-"2 c #8D8DC5",
-"3 c #010170",
-"4 c #2C2C94",
-"5 c #0C0C84",
-"6 c #313196",
-"7 c #A3A3D0",
-"8 c #9A9ACC",
-"9 c #242490",
-"0 c #6464B0",
-"a c #1C1C8B",
-"b c #252590",
-"c c #0A0A83",
-"d c #2D2D95",
-"e c #5151A6",
-"f c #1F1F8D",
-"g c #6464B1",
-"h c #1C1C8C",
-"i c #01017E",
-"j c #6363AF",
-"k c #6161AF",
-"l c #4949A2",
-"m c #6666B1",
-"n c #6060AE",
-"o c #6969B3",
-"p c #39399A",
-"q c #6B6BB3",
-"r c #333397",
-"s c #7171B7",
-"t c #6E6EB5",
-"u c #5E5EAD",
-"v c #6969B2",
-"w c #00006F",
-"x c #000047",
-"y c #383899",
-"z c #5656A9",
-"A c #43439F",
-"B c #3F3F9D",
-"C c #5454A8",
-"D c #38389A",
-"E c #4343A0",
-"F c #5151A7",
-"G c #4D4DA3",
-"H c #040448",
-"I c #000059",
-"J c #000045",
-" ",
-" .+@",
-" #$%",
-" &*=-=;> ,#'",
-" )!$$$~{]^ ",
-" &!$$$/(_:<[ ",
-" *$$$$}|_123 ",
-" =45$$$6789= ",
-" !0a$bc9def! ",
-" =ghijaklmn# ",
-" *ophqrstuvw ",
-" xyzABCDEFGH ",
-" '!$$$$$!I ",
-" xw=-=wJ ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/R.xpm b/elpa/mode-icons-20190627.2121/icons/R.xpm
deleted file mode 100644
index c775643..0000000
--- a/elpa/mode-icons-20190627.2121/icons/R.xpm
+++ /dev/null
@@ -1,140 +0,0 @@
-/* XPM */
-static char * C:\tmp\R_xpm[] = {
-"16 16 121 2",
-" c None",
-". c #CCDAE9",
-"+ c #A5C9F0",
-"@ c #B1DAF4",
-"# c #B0D9F4",
-"$ c #9BC7E4",
-"% c #8EB7EA",
-"& c #8F9EE3",
-"* c #534AD1",
-"= c #5552D1",
-"- c #544FD2",
-"; c #514ED2",
-"> c #504ED2",
-", c #504CD3",
-"' c #6D82D4",
-") c #8EA8E3",
-"! c #4A76D4",
-"~ c #0053D4",
-"{ c #1F3EE0",
-"] c #6693E0",
-"^ c #7D9CE1",
-"/ c #7A9CE1",
-"( c #889CE1",
-"_ c #6B80DC",
-": c #2854D2",
-"< c #586AD4",
-"[ c #80A7E3",
-"} c #5A82D4",
-"| c #2265D3",
-"1 c #B1D8EB",
-"2 c #0000FF",
-"3 c #526ED0",
-"4 c #A66FEA",
-"5 c #4079D2",
-"6 c #5573D4",
-"7 c #2365D4",
-"8 c #93BCDE",
-"9 c #001B9D",
-"0 c #4589DB",
-"a c #6273D4",
-"b c #6972D3",
-"c c #2164D3",
-"d c #95BEDE",
-"e c #001AA5",
-"f c #6681DC",
-"g c #5170D1",
-"h c #7E9CE4",
-"i c #96C1DD",
-"j c #3861D9",
-"k c #8BA7E3",
-"l c #6C8BD4",
-"m c #2468D4",
-"n c #6071D4",
-"o c #3E5DD3",
-"p c #A1BDE0",
-"q c #CFDFEC",
-"r c #C4DDF3",
-"s c #AAC4E9",
-"t c #4153E6",
-"u c #507CE6",
-"v c #A5BCF1",
-"w c #002BB1",
-"x c #7693DB",
-"y c #688FE3",
-"z c #69A0DF",
-"A c #6AA1E1",
-"B c #245FD0",
-"C c #1C20E0",
-"D c #8CB5EB",
-"E c #3B63C5",
-"F c #001EA3",
-"G c #A4CBEB",
-"H c #5F8ADB",
-"I c #6993E0",
-"J c #7798D1",
-"K c #91B9E8",
-"L c #001D91",
-"M c #81A7E3",
-"N c #9EC6E6",
-"O c #0015A0",
-"P c #3252D6",
-"Q c #607FD3",
-"R c #4E7AD7",
-"S c #73A7E3",
-"T c #5C82D4",
-"U c #0018A3",
-"V c #0623D4",
-"W c #5C6DD4",
-"X c #2B57D4",
-"Y c #5884D4",
-"Z c #749CE3",
-"` c #5C83D4",
-" . c #3556D4",
-".. c #5676D4",
-"+. c #5876D4",
-"@. c #152ED4",
-"#. c #749BE3",
-"$. c #5C84D4",
-"%. c #1E62D3",
-"&. c #93BDDE",
-"*. c #0632D4",
-"=. c #5B86D4",
-"-. c #527CD3",
-";. c #4F7CD4",
-">. c #0007D7",
-",. c #83ACE4",
-"'. c #6668D4",
-"). c #89B0E5",
-"!. c #BEE1FB",
-"~. c #0014A4",
-"{. c #255CD3",
-"]. c #A4C7F0",
-"^. c #96BDE6",
-"/. c #1D2FCA",
-"(. c #5077CA",
-"_. c #0D3ED7",
-":. c #0018BB",
-"<. c #0015A4",
-"[. c #00159E",
-"}. c #0015A1",
-"|. c #0028A5",
-" . + @ # # # # # # $ ",
-" % & * = - ; ; > > , ' ",
-" ) ! ~ { ] ^ / ( ( _ : < ",
-" [ } | 1 2 2 2 2 2 3 4 5 6 ",
-" [ } 7 8 9 0 a b ",
-" [ } c d e f g h ",
-" [ } c i j k l ",
-" [ } m n o p q r s t u v w ",
-" [ } m x y z A B C D E F ",
-" [ } c G H 2 2 I J K L ",
-" M } c N O P Q R ",
-" S T 7 d U V W X Y ",
-" Z ` 7 d U ...+.@. ",
-" #.$.%.&.U *.=.-.;.>. ",
-" ,.'.).!.~. {.].^./. ",
-" (._.:.<. [.}.|. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/autohotkey.xpm b/elpa/mode-icons-20190627.2121/icons/autohotkey.xpm
deleted file mode 100644
index 6811de1..0000000
--- a/elpa/mode-icons-20190627.2121/icons/autohotkey.xpm
+++ /dev/null
@@ -1,173 +0,0 @@
-/* XPM */
-static char * e:\EmacsPortable_App\Data\src\mode_icons\icons\autohotkey_xpm[] = {
-"16 16 154 2",
-" c None",
-". c #78B178",
-"+ c #63B063",
-"@ c #47A447",
-"# c #3CA03C",
-"$ c #389F38",
-"% c #339D33",
-"& c #2E9C2E",
-"* c #2A9A2A",
-"= c #259925",
-"- c #209720",
-"; c #1B951B",
-"> c #158315",
-", c #99DA99",
-"' c #A8E2A8",
-") c #7DD37D",
-"! c #52C552",
-"~ c #45C045",
-"{ c #3FBF3F",
-"] c #39BD39",
-"^ c #34BB34",
-"/ c #2EB92E",
-"( c #28B728",
-"_ c #22B522",
-": c #1CB31C",
-"< c #17B217",
-"[ c #10A410",
-"} c #6FB16F",
-"| c #9FDE9F",
-"1 c #9CDE9C",
-"2 c #6CCD6C",
-"3 c #42BF42",
-"4 c #3DBF3D",
-"5 c #18B218",
-"6 c #1DB31D",
-"7 c #17B117",
-"8 c #11AF11",
-"9 c #0BAD0B",
-"0 c #047804",
-"a c #58AD58",
-"b c #70CF70",
-"c c #65CA65",
-"d c #46C046",
-"e c #E0F5E0",
-"f c #70BC70",
-"g c #34BC34",
-"h c #3BBD3B",
-"i c #F0F7F0",
-"j c #129F12",
-"k c #0BAC0B",
-"l c #04A404",
-"m c #008100",
-"n c #44A544",
-"o c #4EC34E",
-"p c #47C147",
-"q c #FFFFFF",
-"r c #8AB98A",
-"s c #2EBB2E",
-"t c #87D687",
-"u c #058505",
-"v c #009C00",
-"w c #007B00",
-"x c #3DA33D",
-"y c #44C044",
-"z c #2DB92D",
-"A c #81B381",
-"B c #28B928",
-"C c #92D992",
-"D c #F8F2F8",
-"E c #008E00",
-"F c #009B00",
-"G c #009400",
-"H c #007500",
-"I c #39A239",
-"J c #28B628",
-"K c #7AAD7A",
-"L c #20B720",
-"M c #16B116",
-"N c #0AAD0A",
-"O c #8FD98F",
-"P c #F0E9F0",
-"Q c #008A00",
-"R c #008D00",
-"S c #007000",
-"T c #34A034",
-"U c #21B421",
-"V c #A6C9A6",
-"W c #9DDF9D",
-"X c #CCEDCC",
-"Y c #F4FAF4",
-"Z c #DED8DE",
-"` c #008600",
-" . c #006900",
-".. c #2F9F2F",
-"+. c #1AB21A",
-"@. c #E1DBE1",
-"#. c #B4BAB4",
-"$. c #CCD2CC",
-"%. c #CBC6CB",
-"&. c #007F00",
-"*. c #006400",
-"=. c #2B9D2B",
-"-. c #7CA27C",
-";. c #0B7E0B",
-">. c #019201",
-",. c #00A300",
-"'. c #86C986",
-"). c #BFBBBF",
-"!. c #008000",
-"~. c #007800",
-"{. c #005D00",
-"]. c #269B26",
-"^. c #23B523",
-"/. c #539C53",
-"(. c #0BAE0B",
-"_. c #80BE80",
-":. c #BCB8BC",
-"<. c #007900",
-"[. c #005800",
-"}. c #219A21",
-"|. c #29B729",
-"1. c #439443",
-"2. c #04A504",
-"3. c #7AB57A",
-"4. c #BAB6BA",
-"5. c #007100",
-"6. c #005200",
-"7. c #1C981C",
-"8. c #0DAE0D",
-"9. c #96B796",
-"0. c #278C27",
-"a. c #526852",
-"b. c #006200",
-"c. c #004C00",
-"d. c #179317",
-"e. c #03A703",
-"f. c #009D00",
-"g. c #005B00",
-"h. c #004100",
-"i. c #0D5B0D",
-"j. c #11B411",
-"k. c #005400",
-"l. c #075F07",
-"m. c #048B04",
-"n. c #008300",
-"o. c #007D00",
-"p. c #007700",
-"q. c #006B00",
-"r. c #006500",
-"s. c #005F00",
-"t. c #005900",
-"u. c #005300",
-"v. c #004D00",
-"w. c #004600",
-" . + @ # $ % & * = - ; > ",
-" , ' ) ! ~ { ] ^ / ( _ : < [ ",
-"} | 1 2 3 4 ] ^ / ( 5 6 7 8 9 0 ",
-"a b c d e f g / ( h i j 8 k l m ",
-"n o p ^ q r s ( _ t q u k l v w ",
-"x y { z q A B _ : C D E l F G H ",
-"I { ] J q K L M N O P Q v G R S ",
-"T ] ^ U q V W X Y q Z Q G R ` .",
-"..^ / +.q q q @.#.$.%.` R ` &.*.",
-"=./ ( +.q -.;.>.,.'.).!.` &.~.{.",
-"].( _ ^.q /.(.l F _.:.<.&.~.S [.",
-"}._ : |.q 1.2.v G 3.4.5.~.S .6.",
-"7.: 7 8.9.;.v G R 0.a.H S .b.c.",
-"d.7 8 k e.f.G R ` &.w S .b.g.h.",
-"i.j.k l F G R ` &.~.5. .b.g.k. ",
-" l.m.n.o.p.5.q.r.s.t.u.v.w. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/bash.xpm b/elpa/mode-icons-20190627.2121/icons/bash.xpm
deleted file mode 100644
index 80fdfe3..0000000
--- a/elpa/mode-icons-20190627.2121/icons/bash.xpm
+++ /dev/null
@@ -1,59 +0,0 @@
-/* XPM */
-static char *bash[] = {
-/* columns rows colors chars-per-pixel */
-"16 16 37 1 ",
-" c #000000",
-". c #010101",
-"X c #030303",
-"o c #040404",
-"O c #060606",
-"+ c #060606",
-"@ c #070707",
-"# c #080808",
-"$ c #090909",
-"% c #0B0B0B",
-"& c #131313",
-"* c #151515",
-"= c #121212",
-"- c #1e1e1e",
-"; c #222222",
-": c #313131",
-"> c #ACACAC",
-", c #C0C0C0",
-"< c #b4b4b4",
-"1 c #C3C3C3",
-"2 c #b7b7b7",
-"3 c #bdbdbd",
-"4 c #CCCCCC",
-"5 c #c4c4c4",
-"6 c #D8D8D8",
-"7 c #d0d0d0",
-"8 c #d3d3d3",
-"9 c #E2E2E2",
-"0 c #dedede",
-"q c #E6E6E6",
-"w c #E7E7E7",
-"e c #F1F1F1",
-"r c #F5F5F5",
-"t c #f4f4f4",
-"y c #FDFDFD",
-"u c #FFFFFF",
-"i c #000000",
-/* pixels */
-"iiiiiiiiiiiiiiii",
-"iiiiiiiiiiiiiiii",
-" ",
-" 6e*+eq ;e, ",
-" qu=@ur :u4 ",
-" 3yuuyyuuy9 :u4 ",
-" 4uuuuuuuu0 :u4 ",
-" XOquuuurOo :u4 ",
-" #%wuuuur%$ ;r1 ",
-" 4uuuuuuuu0 ",
-" 2tuuttuut8 .$@ ",
-" qu=@ur :u4 ",
-" <7&O75 -7> ",
-" ",
-"iiiiiiiiiiiiiiii",
-"iiiiiiiiiiiiiiii"
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/bibtex.xpm b/elpa/mode-icons-20190627.2121/icons/bibtex.xpm
deleted file mode 100644
index a3129fd..0000000
--- a/elpa/mode-icons-20190627.2121/icons/bibtex.xpm
+++ /dev/null
@@ -1,26 +0,0 @@
-/* XPM */
-static char * e:\EmacsPortable_App\Data\src\mode_icons\icons\bibtex_xpm[] = {
-"16 16 7 1",
-" c #FFFFFF",
-". c #EDEBEE",
-"+ c #ECEBEF",
-"@ c #EDEBEF",
-"# c #808080",
-"$ c #000080",
-"% c #000000",
-"############# ",
-"# ## ",
-"# # # ",
-"# $$$ $ #%%%",
-"# $ $ $ $ @%",
-"# $ $ $ @%",
-"# $$$ $ $$$ @%",
-"# $ $ $ $ $ @%",
-"# $ $ $ $ $ @%",
-"# $$$ $ $$$ @%",
-"# @%",
-"# @%",
-"#. ++++ @%",
-"#%%@@@@#%%%%# @%",
-" #%%%% %#@%",
-" %%%"};
diff --git a/elpa/mode-icons-20190627.2121/icons/c.xpm b/elpa/mode-icons-20190627.2121/icons/c.xpm
deleted file mode 100644
index 2a2f020..0000000
--- a/elpa/mode-icons-20190627.2121/icons/c.xpm
+++ /dev/null
@@ -1,76 +0,0 @@
-/* XPM */
-static char *c_icon_2[] = {
-/* columns rows colors chars-per-pixel */
-"20 20 50 1 ",
-" c #283593",
-". c #293694",
-"X c #2A3896",
-"o c #2C3A97",
-"O c #2E3B96",
-"+ c #2C3A99",
-"@ c #2E3C9B",
-"# c #323F9B",
-"$ c #33409C",
-"% c #3342A2",
-"& c #3646A7",
-"* c #3848AA",
-"= c #3949AA",
-"- c #3B4BAC",
-"; c #3E4EAD",
-": c #3F4FAE",
-"> c #4651A2",
-", c #4453AF",
-"< c #4755AD",
-"1 c #4B5BB5",
-"2 c #4F5DB4",
-"3 c #4E5DB6",
-"4 c #5362BA",
-"5 c #5A69BE",
-"6 c #5B6ABE",
-"7 c #5C6BBF",
-"8 c #6069AF",
-"9 c #6C77BC",
-"0 c #616FC1",
-"q c #727EC4",
-"w c #7A84C6",
-"e c #7380C8",
-"r c #848FCE",
-"t c #8691CF",
-"y c #8D96CE",
-"u c #989ECB",
-"i c #9FA6D1",
-"p c #AFB4D6",
-"a c #B3B8D9",
-"s c #B1B8E0",
-"d c #C2C8E7",
-"f c #C6CBE8",
-"g c #D4D7E9",
-"h c #DEE1F2",
-"j c #E5E7F3",
-"k c #EEF0F7",
-"l c #FCFCFD",
-"z c #FDFDFE",
-"x c #FEFEFE",
-"c c None",
-/* pixels */
-"cccccccccccccccccccc",
-"ccccccccc77ccccccccc",
-"ccccccc77777cccccccc",
-"cccccc77777777cccccc",
-"cccc777tdhhdt777cccc",
-"cc7770fxxxxxxf0771cc",
-"cc777fxxxxxxxxf4:*cc",
-"cc77txxzseeszjw***cc",
-"cc77dxxs7775q;****cc",
-"cc77hxxe773-******cc",
-"cc77hxxe2#@&******cc",
-"cc77dxxi .9,****cc",
-"cc77rxxlu>>ulky=**cc",
-"cc6<oaxxxxxxxxaX%*cc",
-"cc$ OaxxxxxxaO +cc",
-"cccc 8pggp8 cccc",
-"cccccc cccccc",
-"cccccccc cccccccc",
-"ccccccccc ccccccccc",
-"cccccccccccccccccccc"
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/cl.xpm b/elpa/mode-icons-20190627.2121/icons/cl.xpm
deleted file mode 100644
index d7dd0f8..0000000
--- a/elpa/mode-icons-20190627.2121/icons/cl.xpm
+++ /dev/null
@@ -1,276 +0,0 @@
-/* XPM */
-static char * cl_xpm[] = {
-"23 16 257 2",
-" c None",
-". c #122C44",
-"+ c #112B43",
-"@ c #112B44",
-"# c #132D45",
-"$ c #132F48",
-"% c #14304A",
-"& c #133049",
-"* c #132F49",
-"= c #122C45",
-"- c #122C46",
-"; c #122D45",
-"> c #132E46",
-", c #14314C",
-"' c #14324D",
-") c #15334E",
-"! c #15344F",
-"~ c #14324E",
-"{ c #15324D",
-"] c #13304B",
-"^ c #14304B",
-"/ c #14314B",
-"( c #112E49",
-"_ c #244054",
-": c #233F54",
-"< c #12304D",
-"[ c #103050",
-"} c #0D2E4F",
-"| c #123352",
-"1 c #183854",
-"2 c #214059",
-"3 c #163653",
-"4 c #163553",
-"5 c #163552",
-"6 c #153452",
-"7 c #1A3954",
-"8 c #4D686E",
-"9 c #6D857F",
-"0 c #203E56",
-"a c #143350",
-"b c #112F4B",
-"c c #305065",
-"d c #678280",
-"e c #8AA291",
-"f c #3F5E6D",
-"g c #2E4E65",
-"h c #678380",
-"i c #41606D",
-"j c #193C5A",
-"k c #183A59",
-"l c #183959",
-"m c #173959",
-"n c #163857",
-"o c #143656",
-"p c #163757",
-"q c #123454",
-"r c #91A894",
-"s c #768F87",
-"t c #1E3E5A",
-"u c #163756",
-"v c #173754",
-"w c #6D8580",
-"x c #B8CCAA",
-"y c #CDE0B4",
-"z c #99B19C",
-"A c #D0E2B5",
-"B c #38596D",
-"C c #7F998F",
-"D c #627F81",
-"E c #173B5D",
-"F c #193D5E",
-"G c #1A3E5E",
-"H c #1C405F",
-"I c #33546A",
-"J c #537179",
-"K c #2E4F67",
-"L c #A2B89F",
-"M c #406070",
-"N c #14395B",
-"O c #183C5D",
-"P c #193C5D",
-"Q c #193C5C",
-"R c #183958",
-"S c #8CA595",
-"T c #385B71",
-"U c #A5BCA2",
-"V c #C8DAB1",
-"W c #D4E5B6",
-"X c #4F6F7B",
-"Y c #668384",
-"Z c #5B797F",
-"` c #1E4264",
-" . c #2C506A",
-".. c #55737C",
-"+. c #A5BBA1",
-"@. c #B4C9A8",
-"#. c #8CA697",
-"$. c #9AB29D",
-"%. c #B7CCA9",
-"&. c #506F7A",
-"*. c #153B5F",
-"=. c #1A3F61",
-"-. c #1A3F60",
-";. c #1A3E60",
-">. c #A7BDA2",
-",. c #466777",
-"'. c #32556E",
-"). c #6A8787",
-"!. c #AAC0A4",
-"~. c #C9DCB2",
-"{. c #C3D7AF",
-"]. c #77948D",
-"^. c #89A396",
-"/. c #B6CBAA",
-"(. c #B9CDAB",
-"_. c #75918C",
-":. c #53737E",
-"<. c #76928E",
-"[. c #3C5E73",
-"}. c #678486",
-"|. c #839D93",
-"1. c #31556D",
-"2. c #163C62",
-"3. c #1A4064",
-"4. c #1B4164",
-"5. c #A8BDA1",
-"6. c #839E94",
-"7. c #274C6A",
-"8. c #32566F",
-"9. c #30546D",
-"0. c #54747D",
-"a. c #7F9990",
-"b. c #95AD9A",
-"c. c #87A194",
-"d. c #5B7A80",
-"e. c #406275",
-"f. c #809B92",
-"g. c #CCDFB6",
-"h. c #CDE0B6",
-"i. c #4F6F7C",
-"j. c #7C9790",
-"k. c #A5BDA4",
-"l. c #77928E",
-"m. c #34566E",
-"n. c #173D62",
-"o. c #194063",
-"p. c #92A995",
-"q. c #D3E6B9",
-"r. c #BCD0AE",
-"s. c #C1D5B0",
-"t. c #A9BFA4",
-"u. c #4A6B79",
-"v. c #153C61",
-"w. c #1D4365",
-"x. c #31546D",
-"y. c #6B8988",
-"z. c #B5CAAA",
-"A. c #D3E5B8",
-"B. c #D6E8BA",
-"C. c #C8DCB4",
-"D. c #8FA899",
-"E. c #7E9A91",
-"F. c #A7BEA4",
-"G. c #C6DAB2",
-"H. c #9BB39E",
-"I. c #5F7E82",
-"J. c #3A5C71",
-"K. c #1C4264",
-"L. c #BCCFAB",
-"M. c #D2E4B7",
-"N. c #D1E3B6",
-"O. c #CCDEB4",
-"P. c #6E8A8A",
-"Q. c #718E8B",
-"R. c #A7BEA3",
-"S. c #D3E5B7",
-"T. c #C4D7B1",
-"U. c #CBDDB4",
-"V. c #D0E2B6",
-"W. c #D3E6B8",
-"X. c #D0E3B6",
-"Y. c #BED3AE",
-"Z. c #BFD2AE",
-"`. c #8DA492",
-" + c #C9DCB1",
-".+ c #D0E1B4",
-"++ c #CFE1B4",
-"@+ c #93AB9A",
-"#+ c #CDDFB3",
-"$+ c #93AC99",
-"%+ c #3D5F73",
-"&+ c #9BB39D",
-"*+ c #A1B8A0",
-"=+ c #C2D6AE",
-"-+ c #CFE1B5",
-";+ c #CCDFB4",
-">+ c #6F8C89",
-",+ c #79958E",
-"'+ c #698687",
-")+ c #BED1AD",
-"!+ c #D4E6B7",
-"~+ c #ABC1A3",
-"{+ c #94AA95",
-"]+ c #C2D4AC",
-"^+ c #CBDDB1",
-"/+ c #6E8B89",
-"(+ c #8CA695",
-"_+ c #D9E8B7",
-":+ c #617E82",
-"<+ c #92AA98",
-"[+ c #D1E3B4",
-"}+ c #B5CAA7",
-"|+ c #87A193",
-"1+ c #B5CAA8",
-"2+ c #96AE9A",
-"3+ c #98B09C",
-"4+ c #486878",
-"5+ c #52717C",
-"6+ c #738F8B",
-"7+ c #59777C",
-"8+ c #869E8E",
-"9+ c #A7BC9F",
-"0+ c #ADC2A3",
-"a+ c #D5E5B4",
-"b+ c #B8CBA8",
-"c+ c #51717B",
-"d+ c #BFD1AB",
-"e+ c #CADCB0",
-"f+ c #A4BA9F",
-"g+ c #56757E",
-"h+ c #9BB29B",
-"i+ c #496A78",
-"j+ c #3E6074",
-"k+ c #A0B79E",
-"l+ c #88A293",
-"m+ c #99B09A",
-"n+ c #708B87",
-"o+ c #7A938A",
-"p+ c #A6BB9E",
-"q+ c #92AA97",
-"r+ c #486877",
-"s+ c #648183",
-"t+ c #A0B69D",
-"u+ c #5F7D81",
-"v+ c #3D6072",
-"w+ c #C6D8AD",
-"x+ c #476776",
-"y+ c #4B6C78",
-"z+ c #4F6D76",
-"A+ c #769089",
-"B+ c #80998D",
-"C+ c #819A8E",
-"D+ c #95AC97",
-"E+ c #8BA393",
-"F+ c #A0B59B",
-"G+ c #93AB96",
-"H+ c #668282",
-" . . . . + @ + . # ",
-" $ % & * * % = - . . ; > $ ",
-" , ' ) ! ~ { { ' , , ] ^ / ^ ( _ : ",
-" < [ } | 1 2 3 4 4 3 5 5 5 6 7 8 9 0 a ",
-" b c d e f g h i j k l m n o p q r s t u v ",
-" w x y z A B C D E F G H I J K L M N O P Q R ",
-" S T U V W X Y Z ` ...+.@.#.$.%.&.*.=.=.-.;.",
-" >.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.4.",
-" 5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.n.o.",
-" p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.",
-" L.A.M.N.O.P.Q.R./.M.M.M.S.T.U.M.V.W.X.Y.Z.",
-" `. +.+++@+_.#+$+%+&+#+*+=+-+;+>+,+'+)+!+~+",
-" {+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+z L.7+",
-" 8+9+0+a+b+c+d+e+f+g+h+i+j+k+J.l+m+n+ ",
-" o+p+q+r+s+Y t+J.t+u+v+w+x+y+ ",
-" z+A+B+C+D+E+F+G+C+H+ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/cmd.xpm b/elpa/mode-icons-20190627.2121/icons/cmd.xpm
deleted file mode 100644
index e4348dc..0000000
--- a/elpa/mode-icons-20190627.2121/icons/cmd.xpm
+++ /dev/null
@@ -1,46 +0,0 @@
-/* XPM */
-static char * d:\EmacsPortable_App\Data\src\mode_icons\icons\cmd_xpm[] = {
-"16 16 27 1",
-" g None",
-". g #FFFFFF",
-"+ g #000000",
-"@ g #505050",
-"# g #989898",
-"$ g #6B6B6B",
-"% g #E8E8E8",
-"& g #111111",
-"* g #F6F6F6",
-"= g #080808",
-"- g #FDFDFD",
-"; g #BBBBBB",
-"> g #353535",
-", g #8D8D8D",
-"' g #5A5A5A",
-") g #5F5F5F",
-"! g #7E7E7E",
-"~ g #323232",
-"{ g #A3A3A3",
-"] g #FAFAFA",
-"^ g #0A0A0A",
-"/ g #FBFBFB",
-"( g #070707",
-"_ g #C3C3C3",
-": g #646464",
-"< g #A8A8A8",
-"[ g #606060",
-"................",
-".++++++++++++++.",
-".++++++++++++++.",
-"................",
-".++++++++++++++.",
-".++++++++++++++.",
-".+@#$+++%&+++++.",
-".+*=-+++;>+++++.",
-".+.+++++,'+++++.",
-".+.+++.+)!+++++.",
-".+.+.+++~{+++++.",
-".+]^/+++(_+++++.",
-".+:<[+.++_+++++.",
-".++++++++++...;.",
-".++++++++++++++.",
-"................"};
diff --git a/elpa/mode-icons-20190627.2121/icons/coffee.xpm b/elpa/mode-icons-20190627.2121/icons/coffee.xpm
deleted file mode 100644
index fc46a34..0000000
--- a/elpa/mode-icons-20190627.2121/icons/coffee.xpm
+++ /dev/null
@@ -1,80 +0,0 @@
-/* XPM */
-static char * coffee_xpm[] = {
-"16 16 61 1",
-" c None",
-". c #272737",
-"+ c #1F1F2E",
-"@ c #535363",
-"# c #393948",
-"$ c #30303F",
-"% c #171726",
-"& c #616170",
-"* c #5B5B6A",
-"= c #242534",
-"- c #1D1D2D",
-"; c #0F0F1F",
-"> c #505060",
-", c #494959",
-"' c #414251",
-") c #383848",
-"! c #302F3F",
-"~ c #282837",
-"{ c #202130",
-"] c #1A1A29",
-"^ c #141423",
-"/ c #101020",
-"( c #0F0F1E",
-"_ c #4E4E5D",
-": c #4B4B5A",
-"< c #454555",
-"[ c #434352",
-"} c #40404F",
-"| c #3B3B49",
-"1 c #353544",
-"2 c #2E2E3D",
-"3 c #272736",
-"4 c #20202F",
-"5 c #10101F",
-"6 c #3A3A49",
-"7 c #353644",
-"8 c #323141",
-"9 c #2D2D3C",
-"0 c #262736",
-"a c #212130",
-"b c #1B1A2A",
-"c c #151625",
-"d c #111120",
-"e c #2D2D3D",
-"f c #2C2C3B",
-"g c #292938",
-"h c #252433",
-"i c #201F2F",
-"j c #161625",
-"k c #121120",
-"l c #262635",
-"m c #242433",
-"n c #1D1D2C",
-"o c #151524",
-"p c #121221",
-"q c #1E1D2D",
-"r c #191928",
-"s c #171625",
-"t c #141422",
-"u c #171727",
-"v c #131322",
-" ",
-" ",
-" .+ ",
-" @ #$ % ",
-" &* =- ;;",
-" >,')!~{]^/( ",
-" _:< ;( ",
-" [}|1234]^5((( ",
-" 6#7890abcd(((; ",
-"$ efghi]jk(((( ",
-"0l m4n]op((((; ",
-" q rst/((((( ",
-" u vd(((((( ",
-" ;(((((; ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/compile.xpm b/elpa/mode-icons-20190627.2121/icons/compile.xpm
deleted file mode 100644
index 728548e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/compile.xpm
+++ /dev/null
@@ -1,115 +0,0 @@
-/* XPM */
-static char * compile_xpm[] = {
-"15 16 96 2",
-" c None",
-". c #795157",
-"+ c #684758",
-"@ c #66485A",
-"# c #765057",
-"$ c #9F664E",
-"% c #D88443",
-"& c #E58B40",
-"* c #945F51",
-"= c #9B6350",
-"- c #B77349",
-"; c #CA7D44",
-"> c #D07F44",
-", c #533C5E",
-"' c #5F435C",
-") c #CA7D46",
-"! c #6F4D58",
-"~ c #69475A",
-"{ c #B4704A",
-"] c #6B4B59",
-"^ c #EB8E3E",
-"/ c #FD983B",
-"( c #6E4C59",
-"_ c #AE6F4B",
-": c #543D5F",
-"< c #845755",
-"[ c #C97B45",
-"} c #583E5D",
-"| c #E38A3F",
-"1 c #AD6E4C",
-"2 c #9C6350",
-"3 c #FF993A",
-"4 c #F4933C",
-"5 c #F2933D",
-"6 c #AF6E4B",
-"7 c #A1674E",
-"8 c #D98542",
-"9 c #E48A40",
-"0 c #8C5C51",
-"a c #5C425C",
-"b c #B1704A",
-"c c #9B634F",
-"d c #734E57",
-"e c #895A52",
-"f c #5F445C",
-"g c #775058",
-"h c #6D4B59",
-"i c #8A5A52",
-"j c #F3923C",
-"k c #E88D3E",
-"l c #A86A4C",
-"m c #8B5A52",
-"n c #F5933C",
-"o c #FC973A",
-"p c #E68C3F",
-"q c #FB973B",
-"r c #B67249",
-"s c #5E425C",
-"t c #AA6C4C",
-"u c #966050",
-"v c #724D57",
-"w c #7C5355",
-"x c #6B495A",
-"y c #684959",
-"z c #7A5156",
-"A c #915E52",
-"B c #EF903E",
-"C c #E78C3F",
-"D c #9E654E",
-"E c #DA8442",
-"F c #925F50",
-"G c #66465A",
-"H c #BE7547",
-"I c #704E59",
-"J c #ED8F3D",
-"K c #724D59",
-"L c #B5724A",
-"M c #61455B",
-"N c #C07848",
-"O c #D18144",
-"P c #4C3A60",
-"Q c #5C415E",
-"R c #CC7D45",
-"S c #704C58",
-"T c #BC7648",
-"U c #835854",
-"V c #C87B44",
-"W c #4A3860",
-"X c #5B415D",
-"Y c #E18941",
-"Z c #AD6C4C",
-"` c #A2684F",
-" . c #8D5C51",
-".. c #885953",
-"+. c #755056",
-"@. c #6D4B58",
-" ",
-" . + @ # ",
-" $ % & * ",
-" = - ; > , ' ) ! ",
-" ~ { ] ^ / ( _ : < [ } | 1 ",
-" 2 3 3 4 5 3 3 6 7 8 9 0 ",
-" a 3 b c 3 d e f g h ",
-"i j / k j l ",
-"m n o p q r ",
-" s 3 t u 3 v w x y z ",
-" A 3 3 B C 3 3 r D E p F ",
-" G H I J / K L M N O P Q R S ",
-" D T U V W X Y Z ",
-" ` E & . ",
-" ..M +.@. ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/cpp.xpm b/elpa/mode-icons-20190627.2121/icons/cpp.xpm
deleted file mode 100644
index 8d06c23..0000000
--- a/elpa/mode-icons-20190627.2121/icons/cpp.xpm
+++ /dev/null
@@ -1,106 +0,0 @@
-/* XPM */
-static char *cpp[] = {
-/* columns rows colors chars-per-pixel */
-"18 20 80 1 ",
-" c #004482",
-". c #004483",
-"X c #024684",
-"o c #044784",
-"O c #004A89",
-"+ c #004A8A",
-"@ c #074C8A",
-"# c #15538C",
-"$ c #18568E",
-"% c #19568E",
-"& c #005395",
-"* c #005598",
-"= c #005698",
-"- c #00599C",
-"; c #045C9D",
-": c #055C9E",
-"> c #175793",
-", c #1D5D99",
-"< c #1E5E9A",
-"1 c #1164A3",
-"2 c #1164A5",
-"3 c #1365A6",
-"4 c #1466A4",
-"5 c #1F6DAC",
-"6 c #2974AC",
-"7 c #2B75AD",
-"8 c #3F7BAC",
-"9 c #4982BC",
-"0 c #638DB3",
-"q c #648DB3",
-"w c #7197BA",
-"e c #7297BA",
-"r c #4988C3",
-"t c #4A89C4",
-"y c #548CC5",
-"u c #568DC6",
-"i c #5A93CB",
-"p c #649AC7",
-"a c #6C9FC6",
-"s c #6499D1",
-"d c #659AD2",
-"f c #679BD3",
-"g c #689CD3",
-"h c #71A3C8",
-"j c #6EA0D5",
-"k c #72A3D6",
-"l c #73A3D6",
-"z c #75A4D7",
-"x c #87AACC",
-"c c #89B2D1",
-"v c #8EB6D3",
-"b c #8FB6D3",
-"n c #9EBFE3",
-"m c #BDCFDF",
-"M c #BECFDF",
-"N c #A7C5E5",
-"B c #A8C6E6",
-"V c #A9C7E6",
-"C c #ADC9E7",
-"Z c #C1D7E7",
-"A c #CAD8E5",
-"S c #CEDBE7",
-"D c #CFDBE7",
-"F c #C7DAE9",
-"G c #D4E3F3",
-"H c #D5E3F3",
-"J c #DDE9F5",
-"K c #DFEAF6",
-"L c #E0EAF6",
-"P c #E0EBF6",
-"I c #E9EFF4",
-"U c #ECF3F8",
-"Y c #EFF4F9",
-"T c #EEF4FA",
-"R c #F9FAFC",
-"E c #FAFCFE",
-"W c #FBFCFE",
-"Q c #FCFDFE",
-"! c white",
-"~ c None",
-/* pixels */
-"~~~~~~~~dd~~~~~~~~",
-"~~~~~~dddddd~~~~~~",
-"~~~~dddddddddd~~~~",
-"~~dddddddddddddd~~",
-"~ddddfnHTTGnfdddd~",
-"ddddkJ!!!!!!Jlddt3",
-"dddgL!!!!!!!!Pi5--",
-"dddN!!QCzzCQYh:---",
-"dddK!!Vdddsp4-----",
-"dddE!!jddr2--cc6Z6",
-"dddW!!ju<+=--vb7F7",
-"dddP!!xX .81-----",
-"dddB!!Rw##eRUa;---",
-"dd9>S!!!!!!!!D@&--",
-"y, $A!!!!!!A% O*",
-"~ oqMIIm0o ~",
-"~~ ~~",
-"~~~~ ~~~~",
-"~~~~~~ ~~~~~~",
-"~~~~~~~~ ~~~~~~~~"
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/csharp.xpm b/elpa/mode-icons-20190627.2121/icons/csharp.xpm
deleted file mode 100644
index 7d899a9..0000000
--- a/elpa/mode-icons-20190627.2121/icons/csharp.xpm
+++ /dev/null
@@ -1,197 +0,0 @@
-/* XPM */
-static char *cs[] = {
-/* columns rows colors chars-per-pixel */
-"19 20 171 2 ",
-" c #280063",
-". c #290163",
-"X c #290262",
-"o c #290064",
-"O c #290164",
-"+ c #290065",
-"@ c #2A0065",
-"# c #2A0264",
-"$ c #290066",
-"% c #2A0066",
-"& c #2A0067",
-"* c #2A0068",
-"= c #2B0068",
-"- c #2B0069",
-"; c #2B006A",
-": c #2C0069",
-"> c #2C006B",
-", c #2D026A",
-"< c #2C006C",
-"1 c #2D006D",
-"2 c #2E036C",
-"3 c #2D006E",
-"4 c #2D006F",
-"5 c #2E0071",
-"6 c #2E0171",
-"7 c #2F0074",
-"8 c #300076",
-"9 c #320079",
-"0 c #320179",
-"q c #310278",
-"w c #31007A",
-"e c #340278",
-"r c #32007C",
-"t c #32007D",
-"y c #33007F",
-"u c #3F1679",
-"i c #48227D",
-"p c #350281",
-"a c #340082",
-"s c #390087",
-"d c #390089",
-"f c #39008A",
-"g c #39008B",
-"h c #39008C",
-"j c #39008D",
-"k c #39008E",
-"l c #39008F",
-"z c #370091",
-"x c #390090",
-"c c #390091",
-"v c #390092",
-"b c #390093",
-"n c #390094",
-"m c #390095",
-"M c #390096",
-"N c #390097",
-"B c #390098",
-"V c #390099",
-"C c #410D8E",
-"Z c #48188F",
-"A c #4B1F8C",
-"S c #491C8E",
-"D c #40079F",
-"F c #431090",
-"G c #4B1898",
-"H c #4D238C",
-"J c #4A12A3",
-"K c #5727A9",
-"L c #5E30A5",
-"P c #683CA6",
-"I c #6235AD",
-"U c #6937AE",
-"Y c #663AAE",
-"T c #6637B2",
-"R c #663BB1",
-"E c #6E39B9",
-"W c #6D39BB",
-"Q c #684995",
-"! c #69479A",
-"~ c #6C41AE",
-"^ c #7251A2",
-"/ c #7553A6",
-"( c #6F46B0",
-") c #7645B8",
-"_ c #7A48BB",
-"` c #7D49C3",
-"' c #9172C7",
-"] c #9462D2",
-"[ c #9565D3",
-"{ c #9765D3",
-"} c #9667D3",
-"| c #9867D4",
-" . c #9868D4",
-".. c #9968D4",
-"X. c #9868D5",
-"o. c #9969D5",
-"O. c #996AD5",
-"+. c #996BD6",
-"@. c #9A6BD6",
-"#. c #9A6CD6",
-"$. c #9B6DD7",
-"%. c #9B6ED7",
-"&. c #9C6ED6",
-"*. c #9C6FD7",
-"=. c #9C70D8",
-"-. c #9D72D8",
-";. c #9E72D9",
-":. c #9E73D9",
-">. c #9F74D9",
-",. c #9F74DA",
-"<. c #9F75DA",
-"1. c #9F76DA",
-"2. c #A076DA",
-"3. c #A076DB",
-"4. c #A077DB",
-"5. c #A078DB",
-"6. c #A178DB",
-"7. c #A179DB",
-"8. c #A37ADA",
-"9. c #A17ADC",
-"0. c #A27ADC",
-"q. c #A27BDC",
-"w. c #A27CDC",
-"e. c #A37CDC",
-"r. c #A27CDD",
-"t. c #A27DDD",
-"y. c #A37DDD",
-"u. c #A37EDD",
-"i. c #A18DBD",
-"p. c #A18DBF",
-"a. c #A681DD",
-"s. c #A983D9",
-"d. c #A881DC",
-"f. c #A882DC",
-"g. c #B09AD4",
-"h. c #B3A3C9",
-"j. c #B6A2D6",
-"k. c #BFADDD",
-"l. c #B594E1",
-"z. c #BC9EE4",
-"x. c #BDA0E5",
-"c. c #C2B1DE",
-"v. c #C2B1DF",
-"b. c #C0A3E5",
-"n. c #C5ACE7",
-"m. c #CBB5EB",
-"M. c #D1BDEC",
-"N. c #D2BEEC",
-"B. c #D3BFEC",
-"V. c #D2C7E1",
-"C. c #D3CAE0",
-"Z. c #D3C0ED",
-"A. c #D4C2EE",
-"S. c #E1DAEB",
-"D. c #E4DEEE",
-"F. c #E5DFEF",
-"G. c #E4D7F3",
-"H. c #E2DAF0",
-"J. c #E5D9F4",
-"K. c #E5DAF5",
-"L. c #E9DFF6",
-"P. c #E7E2EE",
-"I. c #F4EFFA",
-"U. c #F9F7FC",
-"Y. c #FBFAFD",
-"T. c #FCFAFD",
-"R. c #FCFBFE",
-"E. c #FEFDFE",
-"W. c #FFFEFF",
-"Q. c #FFFFFF",
-"!. c None",
-/* pixels */
-"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
-"!.!.!.!.!.!.!.!.w.q.7.!.!.!.!.!.!.!.!.",
-"!.!.!.!.!.!.t.r.0.6.3.,.:.!.!.!.!.!.!.",
-"!.!.!.!.u.t.q.9.5.1.,.;.=.%.#.!.!.!.!.",
-"!.!.!.u.w.q.7.a.x.n.z.8.%.#.O. .!.!.!.",
-"!.u.y.r.0.e.A.R.Q.Q.Q.R.N.&.| { ] E !.",
-"!.y.q.9.0.K.Q.Q.Q.Q.Q.Q.Q.J...` J N !.",
-"!.q.7.4.m.Q.Q.R.Z.b.M.Y.Q.H.T B N m !.",
-"!.7.3.<.I.Q.W.l.@.o.| s.' R I M n v !.",
-"!.2.,.d.Q.Q.L.+.o.[ W D K v.k.b v x !.",
-"!.>.-.f.Q.Q.G.X._ F z V Y c.g.c l j !.",
-"!.-.*.*.U.Q.T.P y t w S ( ~ L k j g !.",
-"!.*.$.+.B.Q.Q.D./ H ^ S.E.j.G h f d !.",
-"!.#.} U Z F.Q.Q.Q.Q.Q.Q.Q.P.u 9 s s !.",
-"!.) C a y A V.Q.Q.Q.Q.Q.C.i = $ * e !.",
-"!.!.p y r w q ! p.h.i.Q , & + X !.!.",
-"!.!.!.!.0 8 7 5 4 1 > - & o . !.!.!.!.",
-"!.!.!.!.!.!.6 3 < ; = % O !.!.!.!.!.!.",
-"!.!.!.!.!.!.!.2 : & @ # !.!.!.!.!.!.!.",
-"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!."
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/css.xpm b/elpa/mode-icons-20190627.2121/icons/css.xpm
deleted file mode 100644
index 5c9f676..0000000
--- a/elpa/mode-icons-20190627.2121/icons/css.xpm
+++ /dev/null
@@ -1,91 +0,0 @@
-/* XPM */
-static char * css_xpm[] = {
-"16 16 72 1",
-" c None",
-". c #264EE4",
-"+ c #264DE4",
-"@ c #2652E6",
-"# c #2756E9",
-"$ c #2754E8",
-"% c #264DE5",
-"& c #2859EB",
-"* c #2965F1",
-"= c #285EED",
-"- c #7A90E7",
-"; c #C4CBEA",
-"> c #ADBFF3",
-", c #D4E0FC",
-"' c #82A5F7",
-") c #275CEC",
-"! c #254CE3",
-"~ c #6D86E7",
-"{ c #DEE7FD",
-"] c #FFFFFF",
-"^ c #87A9F7",
-"/ c #285AEB",
-"( c #264DE3",
-"_ c #264CE4",
-": c #6792F5",
-"< c #739AF6",
-"[ c #2757EA",
-"} c #4365E5",
-"| c #9CACE8",
-"1 c #92AAF1",
-"2 c #A9C1F9",
-"3 c #C8D7FB",
-"4 c #608DF5",
-"5 c #2755E8",
-"6 c #4869E6",
-"7 c #EBEBEB",
-"8 c #C5D1F5",
-"9 c #4B7EF3",
-"0 c #2653E7",
-"a c #284EE4",
-"b c #4D6DE5",
-"c c #3E60E5",
-"d c #A0BBF9",
-"e c #3870F2",
-"f c #2751E6",
-"g c #E8E8EB",
-"h c #A3B1E8",
-"i c #B3C9FA",
-"j c #FAFBFF",
-"k c #2A66F1",
-"l c #264FE5",
-"m c #D8DCEA",
-"n c #E5E6EB",
-"o c #B5BFE9",
-"p c #86A1F0",
-"q c #C4D5FB",
-"r c #F8FAFF",
-"s c #E7EEFD",
-"t c #2965F0",
-"u c #6983E6",
-"v c #A7B5E9",
-"w c #DCDFEB",
-"x c #EDF2FE",
-"y c #B5CAFA",
-"z c #7199F6",
-"A c #2862F0",
-"B c #426DEC",
-"C c #2B66F1",
-"D c #2964F1",
-"E c #285DEC",
-"F c #285BEC",
-"G c #264EE5",
-" ",
-" ",
-" .+++++@####$+ ",
-" %+++++&****=+ ",
-" ++-;;;>,,,')+ ",
-" !+~;;;>,{]^/( ",
-" _+++++&*:]<[+ ",
-" +}|||123]45 ",
-" +67778]]]90 ",
-" +abc+&*d]ef ",
-" +agh+&*ijkl ",
-" ++mnopqrst+ ",
-" ++uvw8xyzA+ ",
-" .+++aBC*DE+ ",
-" (++++[F$.+( ",
-" G++ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/cygwin.xpm b/elpa/mode-icons-20190627.2121/icons/cygwin.xpm
deleted file mode 100644
index a2379c0..0000000
--- a/elpa/mode-icons-20190627.2121/icons/cygwin.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * d:\EmacsPortable_App\Data\src\mode_icons\icons\cygwin_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #00FF00",
-" ",
-" ........... ",
-" .............. ",
-" .......... ",
-" .... ",
-" ... ",
-" ... +++++ ",
-" ... ++++++++ ",
-" ... ++++++++ ",
-" ... +++++ ",
-" ... ",
-" .... ",
-" .......... ",
-" .............. ",
-" ........... ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/dart.xpm b/elpa/mode-icons-20190627.2121/icons/dart.xpm
deleted file mode 100644
index 31306f0..0000000
--- a/elpa/mode-icons-20190627.2121/icons/dart.xpm
+++ /dev/null
@@ -1,67 +0,0 @@
-/* XPM */
-static char * dart_xpm[] = {
-"16 16 48 1",
-" c None",
-". c #39C0FF",
-"+ c #3CC2FF",
-"@ c #3AC1FF",
-"# c #3AC0FF",
-"$ c #3FC3FF",
-"% c #41C4FF",
-"& c #2A97D6",
-"* c #37ABE6",
-"= c #39ADE7",
-"- c #32A6E2",
-"; c #2A8CC6",
-"> c #1D94D3",
-", c #02589C",
-"' c #03589C",
-") c #02589B",
-"! c #02599C",
-"~ c #207BB7",
-"{ c #2AB6F6",
-"] c #1E95D3",
-"^ c #03599C",
-"/ c #04599C",
-"( c #01589B",
-"_ c #1F7AB6",
-": c #2BB7F6",
-"< c #1F95D3",
-"[ c #2CB7F6",
-"} c #055A9D",
-"| c #015699",
-"1 c #01579B",
-"2 c #207AB6",
-"3 c #2096D4",
-"4 c #065A9D",
-"5 c #015698",
-"6 c #2DB7F6",
-"7 c #015598",
-"8 c #257EB9",
-"9 c #2BB6F6",
-"0 c #28B4F5",
-"a c #1E94D3",
-"b c #02589A",
-"c c #01579A",
-"d c #025597",
-"e c #3BC0FE",
-"f c #3FC3FE",
-"g c #40C3FE",
-"h c #3DC2FF",
-"i c #40C4FF",
-" .+@ ",
-" #$%%%+ ",
-" &*======- ",
-" ;>,'''''')! ",
-" ~{]^////'')) ",
-" (_::</////'')) ",
-" )_:[[<}}}//'))|",
-"1)2:[[[34}//'')5",
-"1)2:[[[63}//'')5",
-"1)_:[[[[[<//'))7",
-" )_::[[[[[<^'))7",
-" 89::[[[[:]^)17",
-" 0{::::::{abcd",
-" efgggggff ",
-" h%%%%%ii ",
-" +$$$$$$ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/dim.xpm b/elpa/mode-icons-20190627.2121/icons/dim.xpm
deleted file mode 100644
index efa88f6..0000000
--- a/elpa/mode-icons-20190627.2121/icons/dim.xpm
+++ /dev/null
@@ -1,67 +0,0 @@
-/* XPM */
-static char * dim_xpm[] = {
-"15 16 48 1",
-" c None",
-". c #060606",
-"+ c #000000",
-"@ c #050505",
-"# c #020202",
-"$ c #595959",
-"% c #868686",
-"& c #787878",
-"* c #4F4F4F",
-"= c #282828",
-"- c #CCCCCC",
-"; c #8C8C8C",
-"> c #404040",
-", c #FFFFFF",
-"' c #F9F9F9",
-") c #D6D6D6",
-"! c #262626",
-"~ c #DADADA",
-"{ c #272727",
-"] c #FEFEFE",
-"^ c #2C2C2C",
-"/ c #282827",
-"( c #010101",
-"_ c #D2D2D2",
-": c #040404",
-"< c #5A5A5A",
-"[ c #F3F3F3",
-"} c #525252",
-"| c #474747",
-"1 c #FBFBFB",
-"2 c #747474",
-"3 c #878787",
-"4 c #757575",
-"5 c #585858",
-"6 c #8D8D8D",
-"7 c #505050",
-"8 c #D0D0D0",
-"9 c #252525",
-"0 c #D4D4D4",
-"a c #DDDDDD",
-"b c #222222",
-"c c #2E2E2E",
-"d c #C9C9C9",
-"e c #818181",
-"f c #3C3C3C",
-"g c #F4F4F4",
-"h c #5C5C5C",
-"i c #838383",
-" ",
-" . ++ @ ",
-" #$%&*+ ",
-" +=-;>,')!+ ",
-" =~{++,,,]^ ",
-" .#-/+(+,,,,_:@",
-" <;+((+,,,,[} ",
-" +%|+(#+,,,,12+",
-" +3|+##+,,,,14+",
-" 56+#(+,,,,[7 ",
-" @+89+#+,,,,0#@",
-" {ab++,,,,^ ",
-" +cdef,g0^+ ",
-" @hi27# ",
-" @ ++ @ ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/docker.xpm b/elpa/mode-icons-20190627.2121/icons/docker.xpm
deleted file mode 100644
index cb77838..0000000
--- a/elpa/mode-icons-20190627.2121/icons/docker.xpm
+++ /dev/null
@@ -1,97 +0,0 @@
-/* XPM */
-static char * docker__xpm[] = {
-"16 16 78 1",
-" c None",
-". c #327587",
-"+ c #2D96B3",
-"@ c #2D6A79",
-"# c #267183",
-"$ c #327A90",
-"% c #2D7487",
-"& c #238BA7",
-"* c #247286",
-"= c #197D94",
-"- c #2E8AA5",
-"; c #278198",
-"> c #18839C",
-", c #28A8D4",
-"' c #346D81",
-") c #1B839B",
-"! c #287F97",
-"~ c #2D89A3",
-"{ c #1C7C93",
-"] c #257C93",
-"^ c #2D8CA7",
-"/ c #20798F",
-"( c #237487",
-"_ c #2B9CC5",
-": c #1A9EC7",
-"< c #0D9BC5",
-"[ c #2A687A",
-"} c #306B7F",
-"| c #1F85A0",
-"1 c #2B8099",
-"2 c #2D87A3",
-"3 c #217F98",
-"4 c #287E96",
-"5 c #2D8BA7",
-"6 c #237D95",
-"7 c #267990",
-"8 c #327B94",
-"9 c #1BA1CB",
-"0 c #1688A8",
-"a c #217992",
-"b c #1587A7",
-"c c #1FBFF5",
-"d c #25BDF2",
-"e c #25BEF3",
-"f c #25BEF4",
-"g c #25C1F6",
-"h c #16B9ED",
-"i c #0D96BD",
-"j c #206880",
-"k c #0098C6",
-"l c #039BC6",
-"m c #129FC6",
-"n c #069DC7",
-"o c #039BC7",
-"p c #039CC7",
-"q c #0291BD",
-"r c #018BB8",
-"s c #167EA1",
-"t c #0C8AAE",
-"u c #218DAD",
-"v c #3193AF",
-"w c #0C9EC7",
-"x c #0293BF",
-"y c #008BB8",
-"z c #038BB7",
-"A c #2A6173",
-"B c #AFC4C7",
-"C c #D9EEF0",
-"D c #6BBFD7",
-"E c #008EBC",
-"F c #008FBC",
-"G c #028DBA",
-"H c #147A9C",
-"I c #6B8288",
-"J c #8FA3A7",
-"K c #487F90",
-"L c #18728F",
-"M c #22687F",
-" ",
-" ",
-" ",
-" .+ ",
-" @#$%& ",
-" *=-;> ,' ",
-" )!~{]^/( _:<[",
-" }|1234567 890a ",
-"bcdeeefdefghi ",
-"jkllmnopppqr ",
-" stuvwplxyzA ",
-" BCDEFEGH ",
-" IJKLM ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/e-palm_tree.xpm b/elpa/mode-icons-20190627.2121/icons/e-palm_tree.xpm
deleted file mode 100644
index 091213f..0000000
--- a/elpa/mode-icons-20190627.2121/icons/e-palm_tree.xpm
+++ /dev/null
@@ -1,83 +0,0 @@
-/* XPM */
-static char * e_palm_tree_xpm[] = {
-"22 22 58 1",
-" c None",
-". c #75A843",
-"+ c #7DB54A",
-"@ c #78AD46",
-"# c #75A943",
-"$ c #83BF4F",
-"% c #82BE4E",
-"& c #7FB84C",
-"* c #76AA44",
-"= c #7FB84B",
-"- c #82BD4E",
-"; c #7BB248",
-"> c #80BA4D",
-", c #83BE4F",
-"' c #7DB549",
-") c #76AA43",
-"! c #78AA46",
-"~ c #7FB44E",
-"{ c #83AA55",
-"] c #7F9157",
-"^ c #798154",
-"/ c #757555",
-"( c #7EA551",
-"_ c #83C04F",
-": c #83B353",
-"< c #847C63",
-"[ c #847167",
-"} c #7C6A5F",
-"| c #716156",
-"1 c #7C9852",
-"2 c #83AD55",
-"3 c #847665",
-"4 c #847166",
-"5 c #76655A",
-"6 c #6C624F",
-"7 c #7FAC4F",
-"8 c #8A705A",
-"9 c #77604E",
-"0 c #69584B",
-"a c #8E6C4E",
-"b c #84654A",
-"c c #7E6147",
-"d c #7D6046",
-"e c #87674A",
-"f c #906E4F",
-"g c #916F50",
-"h c #836449",
-"i c #826348",
-"j c #8C6B4D",
-"k c #86664A",
-"l c #88674B",
-"m c #8B6A4C",
-"n c #846549",
-"o c #8C6A4D",
-"p c #8D6B4D",
-"q c #87674B",
-"r c #816248",
-"s c #947151",
-" ",
-" .. ",
-" ... .... ",
-" ..... .... ",
-" ..... ... ",
-" +@#... .... $$ ",
-" $$$%&@.. ..*=$$$$$$ ",
-" $$$$$$-;#..@>$$$$$$$ ",
-" $$$$$$,')!~$$$$$ ",
-" $$${]^/(_$ ",
-" $$_:<[}|1_$$$ ",
-" $$$_234567_$$$ ",
-" $$$$$ 890 $$$ ",
-" $$ abc $ ",
-" def ",
-" gah ",
-" ijg ",
-" ajh ",
-" klm ",
-" nmo ",
-" apqn ",
-" ras "};
diff --git a/elpa/mode-icons-20190627.2121/icons/elixir.xpm b/elpa/mode-icons-20190627.2121/icons/elixir.xpm
deleted file mode 100644
index 36fed10..0000000
--- a/elpa/mode-icons-20190627.2121/icons/elixir.xpm
+++ /dev/null
@@ -1,126 +0,0 @@
-/* XPM */
-static char *elixir[] = {
-/* columns rows colors chars-per-pixel */
-"16 16 104 2 ",
-" c #471F5B",
-". c #48215B",
-"X c #4D295F",
-"o c #4E2A5F",
-"O c #4D2361",
-"+ c #4E2961",
-"@ c #4F2C60",
-"# c #532C66",
-"$ c #503060",
-"% c #543462",
-"& c #543762",
-"* c #543264",
-"= c #583667",
-"- c #563864",
-"; c #593A67",
-": c #573369",
-"> c #583669",
-", c #59326D",
-"< c #5D3F6B",
-"1 c #5B3371",
-"2 c #5F3D70",
-"3 c #5C4167",
-"4 c #5F426C",
-"5 c #5F416E",
-"6 c #61446F",
-"7 c #644C6E",
-"8 c #644572",
-"9 c #654873",
-"0 c #654E70",
-"q c #674F72",
-"w c #674875",
-"e c #684A77",
-"r c #684C76",
-"t c #66407A",
-"y c #6A4C78",
-"u c #6D4F7B",
-"i c #6C4D7C",
-"p c #6F4F7F",
-"a c #6E5578",
-"s c #6E557A",
-"d c #6E5878",
-"f c #71577D",
-"g c #725C7B",
-"h c #71587D",
-"j c #745C7F",
-"k c #745D7F",
-"l c #755E7F",
-"z c #735581",
-"x c #735681",
-"c c #735184",
-"v c #765587",
-"b c #735980",
-"n c #755D80",
-"m c #765C83",
-"M c #775B84",
-"N c #795B87",
-"B c #785E84",
-"V c #7A5F87",
-"C c #78548B",
-"Z c #7A588B",
-"A c #7B5F88",
-"S c #786381",
-"D c #7A6087",
-"F c #7D628A",
-"G c #7C6488",
-"H c #7E6888",
-"J c #806A89",
-"K c #836F8B",
-"L c #83708B",
-"P c #88778E",
-"I c #867A8A",
-"U c #826490",
-"Y c #846594",
-"T c #886D96",
-"R c #896999",
-"E c #8A7396",
-"W c #8B7297",
-"Q c #8B7496",
-"! c #8B7B91",
-"~ c #8E729B",
-"^ c #9070A1",
-"/ c #9575A5",
-"( c #8F8493",
-") c #908494",
-"_ c #9A89A2",
-"` c #9C8AA5",
-"' c #A091A6",
-"] c #A59CA8",
-"[ c #A389B1",
-"{ c #A993B4",
-"} c #AAA2AD",
-"| c #ABA1AE",
-" . c #ADA6AF",
-".. c #ACA0B1",
-"X. c #AFA8B1",
-"o. c #B2A2BA",
-"O. c #B7AEBA",
-"+. c #B9A7C3",
-"@. c #BFB2C4",
-"#. c #C5B5CD",
-"$. c #C4BAC9",
-"%. c #D2C7D7",
-"&. c #D9D4DB",
-"*. c None",
-/* pixels */
-"*.*.*.*.*.*.*.*./ *.*.*.*.*.*.*.",
-"*.*.*.*.*.*.*.1 Y *.*.*.*.*.*.*.",
-"*.*.*.*.*.*.# O c *.*.*.*.*.*.*.",
-"*.*.*.*.*.G @ t *.*.*.*.*.*.*.",
-"*.*.*.*.*.h $ . , ~ *.*.*.*.*.*.",
-"*.*.*.*.` 9 - X : p *.*.*.*.*.*.",
-"*.*.*.*.Q > < * 8 2 A *.*.*.*.*.",
-"*.*.*.*.F + 5 4 s y i F *.*.*.*.",
-"*.*.*.W M o = a S n m x e *.*.*.",
-"*.*.*.U V ; % g P K H B w *.*.*.",
-"*.*.*.Z N r & 7 ! L k b u *.*.*.",
-"*.*.*.C v z 6 3 q j f M D *.*.*.",
-"*.*.*.*.R T E l 0 d J _ ' *.*.*.",
-"*.*.*.*.^ { o...) I ( } | *.*.*.",
-"*.*.*.*.*.[ +.@.O.] X. .*.*.*.*.",
-"*.*.*.*.*.*.#.%.$.&.*.*.*.*.*.*."
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/emacs.xpm b/elpa/mode-icons-20190627.2121/icons/emacs.xpm
deleted file mode 100644
index 30183a4..0000000
--- a/elpa/mode-icons-20190627.2121/icons/emacs.xpm
+++ /dev/null
@@ -1,189 +0,0 @@
-/* XPM */
-static char * emacs_xpm[] = {
-"16 16 170 2",
-" c None",
-". c #5551AB",
-"+ c #5652AB",
-"@ c #5853AC",
-"# c #504CA8",
-"$ c #4C47A7",
-"% c #5752AA",
-"& c #534FA8",
-"* c #5652A8",
-"= c #6460AF",
-"- c #6E6BB5",
-"; c #8380BF",
-"> c #928FC7",
-", c #9794CA",
-"' c #8784C3",
-") c #5A55AE",
-"! c #5753AA",
-"~ c #6D6AB3",
-"{ c #9593C8",
-"] c #9D9BCC",
-"^ c #9895CA",
-"/ c #9A97CB",
-"( c #A2A0CF",
-"_ c #BBB9DB",
-": c #F4F4F8",
-"< c #D1D0E8",
-"[ c #5E59AF",
-"} c #5854A9",
-"| c #5954A9",
-"1 c #5955A9",
-"2 c #BCBADC",
-"3 c #F6F5FA",
-"4 c #EFEEF7",
-"5 c #F0F0F7",
-"6 c #E9E8F4",
-"7 c #DFDFEE",
-"8 c #D8D8EB",
-"9 c #F2F2F9",
-"0 c #FAFAFD",
-"a c #7B77BB",
-"b c #4F4BA7",
-"c c #5A57AA",
-"d c #6461AF",
-"e c #A19FCE",
-"f c #F0F0F8",
-"g c #E3E3F1",
-"h c #B9B8DA",
-"i c #B9B8DB",
-"j c #BCBBDC",
-"k c #C3C2E0",
-"l c #CBCAE5",
-"m c #AAA8D3",
-"n c #5F5BAC",
-"o c #5651A8",
-"p c #5955AA",
-"q c #5956AA",
-"r c #5C59AB",
-"s c #6B68B3",
-"t c #7C7ABB",
-"u c #B8B7DB",
-"v c #EBEAF5",
-"w c #B1B0D7",
-"x c #908EC6",
-"y c #908DC5",
-"z c #8581C0",
-"A c #726FB6",
-"B c #5E5BAC",
-"C c #5B56AA",
-"D c #5B57AB",
-"E c #5653A8",
-"F c #7574B8",
-"G c #8280BE",
-"H c #B0AED7",
-"I c #E1E1EF",
-"J c #BDBBDD",
-"K c #8481BF",
-"L c #7571B7",
-"M c #6A68B2",
-"N c #625FAD",
-"O c #5C58AB",
-"P c #5B57AA",
-"Q c #7A78BB",
-"R c #ADACD5",
-"S c #C8C7E3",
-"T c #D4D3E9",
-"U c #D0CFE7",
-"V c #D5D5EA",
-"W c #ECEDF6",
-"X c #7B79BB",
-"Y c #6664B0",
-"Z c #625FAE",
-"` c #5551A7",
-" . c #918EC7",
-".. c #F3F3FA",
-"+. c #F5F4FA",
-"@. c #F4F3F9",
-"#. c #E7E6F3",
-"$. c #C7C7E2",
-"%. c #B2B0D7",
-"&. c #B3B2D8",
-"*. c #9593C9",
-"=. c #6663AF",
-"-. c #5F5DAD",
-";. c #5B59AB",
-">. c #534FA6",
-",. c #F4F3FA",
-"'. c #C9C8E4",
-"). c #7675B9",
-"!. c #6C6AB3",
-"~. c #706EB5",
-"{. c #716FB6",
-"]. c #6E6CB4",
-"^. c #6968B1",
-"/. c #6462AF",
-"(. c #5B58AB",
-"_. c #5A56AA",
-":. c #5855A9",
-"<. c #6D6BB4",
-"[. c #D1D0E7",
-"}. c #F2F1F8",
-"|. c #B7B6DA",
-"1. c #6765B0",
-"2. c #6F6EB5",
-"3. c #7B7ABB",
-"4. c #807EBE",
-"5. c #807EBD",
-"6. c #7876B9",
-"7. c #615EAE",
-"8. c #5754A8",
-"9. c #6A67B2",
-"0. c #B4B3D8",
-"a. c #EAEAF4",
-"b. c #DADAEC",
-"c. c #B0B0D6",
-"d. c #9998CB",
-"e. c #8988C2",
-"f. c #7F7EBD",
-"g. c #7978BA",
-"h. c #7472B8",
-"i. c #6B68B2",
-"j. c #5D5AAC",
-"k. c #5755A8",
-"l. c #8A88C2",
-"m. c #C9C7E3",
-"n. c #E4E4F2",
-"o. c #EAE9F4",
-"p. c #E0E0EF",
-"q. c #CECEE6",
-"r. c #AFAED6",
-"s. c #8A89C3",
-"t. c #6865B1",
-"u. c #615FAE",
-"v. c #918FC6",
-"w. c #AAA9D4",
-"x. c #B9B8DC",
-"y. c #CDCCE5",
-"z. c #F5F5FA",
-"A. c #FFFFFF",
-"B. c #E7E7F3",
-"C. c #706DB5",
-"D. c #7E7CBC",
-"E. c #908FC5",
-"F. c #9C9BCC",
-"G. c #A2A1CF",
-"H. c #A09ECE",
-"I. c #9390C6",
-"J. c #7977BA",
-"K. c #5D59AB",
-"L. c #5552A8",
-"M. c #5451A7",
-" . + @ . # $ ",
-" % & * = - ; > , ' ) ",
-" ! * ~ { ] ^ / ( _ : < [ ",
-" } | 1 2 3 4 5 6 7 8 9 0 a b ",
-" } c d e f g h i j k l m n o ",
-"p q r s t u v w x y z A B C 1 ! ",
-"q D E B F G H I J K L M N O q } ",
-"P * Q R S T U V W S X Y Z r c 1 ",
-"` ...+.@.#.$.u %.&.*.=.-.;.P p ",
-">.&.,.f '.).!.~.{.].^./.B r (._.",
-":.<.[.}.|.1.2.3.4.5.6.<.7.r (._.",
-" 8.9.0.a.b.c.d.e.f.g.h.i.j.c ",
-" j.q k.l.m.n.o.p.q.r.s.t.r D ",
-" r u.h.v.w.x.y.z.A.B.C.} ",
-" B !.D.E.F.G.H.I.J.K. ",
-" :.8.8.8.L.M. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/emmet.xpm b/elpa/mode-icons-20190627.2121/icons/emmet.xpm
deleted file mode 100644
index beb5867..0000000
--- a/elpa/mode-icons-20190627.2121/icons/emmet.xpm
+++ /dev/null
@@ -1,140 +0,0 @@
-/* XPM */
-static char *uhq3t_9aeym[] = {
-/* columns rows colors chars-per-pixel */
-"18 18 116 2 ",
-" c #19181D",
-". c #19181E",
-"X c #1A191E",
-"o c #1A1A1E",
-"O c #1B1B1F",
-"+ c #1C1B1F",
-"@ c #1C1C1F",
-"# c #1B1920",
-"$ c #1B1A20",
-"% c #1B1B20",
-"& c #1C1B20",
-"* c #1C1C20",
-"= c #1D1D20",
-"- c #1C1C21",
-"; c #1D1D21",
-": c #1D1E20",
-"> c #1E1E22",
-", c #1E1F22",
-"< c #1E1E23",
-"1 c #1F1F23",
-"2 c #1E2020",
-"3 c #1F2220",
-"4 c #1F2023",
-"5 c #1F2024",
-"6 c #202320",
-"7 c #212520",
-"8 c #222721",
-"9 c #202025",
-"0 c #202125",
-"q c #222226",
-"w c #222327",
-"e c #232626",
-"r c #232922",
-"t c #242A20",
-"y c #242A21",
-"u c #252C21",
-"i c #262E21",
-"p c #232328",
-"a c #242429",
-"s c #24252A",
-"d c #25252B",
-"f c #25262B",
-"g c #27272C",
-"h c #28282D",
-"j c #29292E",
-"k c #292A2F",
-"l c #293322",
-"z c #293422",
-"x c #2A3622",
-"c c #2D3B22",
-"v c #2F3E22",
-"b c #2B312D",
-"n c #2B322D",
-"m c #2B2C31",
-"M c #2C2C32",
-"N c #2D2E34",
-"B c #2E3530",
-"V c #2F3036",
-"C c #303137",
-"Z c #313238",
-"A c #313339",
-"S c #33343A",
-"D c #34363C",
-"F c #35363C",
-"G c #36373D",
-"H c #314323",
-"J c #344823",
-"K c #354923",
-"L c #364B23",
-"P c #395124",
-"I c #3B5324",
-"U c #3C5624",
-"Y c #3A463B",
-"T c #3D4A3D",
-"R c #3E4C3E",
-"E c #404F3F",
-"W c #476A26",
-"Q c #496D26",
-"! c #4D7526",
-"~ c #517B27",
-"^ c #517C27",
-"/ c #537F27",
-"( c #383940",
-") c #383A40",
-"_ c #393A41",
-"` c #393B42",
-"' c #3A3B42",
-"] c #3A3C42",
-"[ c #3A3C43",
-"{ c #3B3C43",
-"} c #3B3D44",
-"| c #3C3E44",
-" . c #3C3E45",
-".. c #3D3E45",
-"X. c #3D3F46",
-"o. c #3E3F46",
-"O. c #475845",
-"+. c #475946",
-"@. c #5C7658",
-"#. c #558327",
-"$. c #5B8D28",
-"%. c #5C8F28",
-"&. c #5E9329",
-"*. c #619929",
-"=. c #629B29",
-"-. c #639B29",
-";. c #639C29",
-":. c #66A12A",
-">. c #6CAC2B",
-",. c #70B32B",
-"<. c #75BD2C",
-"1. c #6D8F67",
-"2. c #89B57F",
-"3. c #94C689",
-"4. c #98CB8C",
-"5. c #AFECA1",
-/* pixels */
-" . .| .....X...} } X... . ... . ...",
-" . .| ...` C h a s k S } ........X.",
-" . . ...F a - O @ + O ; g ( X. . ...",
-".. ...F 0 + * * * * O X o a ) o.X...",
-" . .] a O * & % * , n O.R O j | ....",
-" . .V * # % 8 u e 1.4.5.@.. > D X.| ",
-"| } d 6 I ^ -.#.r T +.3.E X @ m .} ",
-" ._ 9 7 $.,.P y * B 2.b O O f | } ",
-"X.( 1 $ i &.! x v : 4 Y 4 * * p [ | ",
-"X.) 5 * $ z ;.<./ * J t % * @ a { } ",
-"..[ w * * $ c >.~ 2 %.K # * O h .} ",
-" . .k O * * $ H :.Q =.l % * * V .. .",
-" . .F < * * * $ L ,.*.3 * * q _ . .",
-".... .M * * * * % U W & * ; C X. . .",
-" .X.X.[ j - * * * = 6 O > N | ..X. .",
-"X...X.X.} V w ; * * > s S .X... ...",
-"....X..... .' D Z A G } .. ...X... .",
-" ..... . ...X.X.X.X.o.X. . . . ... ."
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/emoji.png b/elpa/mode-icons-20190627.2121/icons/emoji.png
deleted file mode 100644
index bbdc348..0000000
--- a/elpa/mode-icons-20190627.2121/icons/emoji.png
+++ /dev/null
Binary files differ
diff --git a/elpa/mode-icons-20190627.2121/icons/emoji.xpm b/elpa/mode-icons-20190627.2121/icons/emoji.xpm
deleted file mode 100644
index e0bcdd4..0000000
--- a/elpa/mode-icons-20190627.2121/icons/emoji.xpm
+++ /dev/null
@@ -1,251 +0,0 @@
-/* XPM */
-static char * emoji_xpm[] = {
-"16 16 232 2",
-" c None",
-". c #EEEEE8",
-"+ c #F9F8E8",
-"@ c #D8FFFF",
-"# c #EBF0F6",
-"$ c #EFE0D6",
-"% c #EEDED2",
-"& c #E8E9F1",
-"* c #C9FCFF",
-"= c #FFF9FC",
-"- c #DEDFDF",
-"; c #FFFFFF",
-"> c #E8F2F3",
-", c #D5FFFF",
-"' c #F0E4D4",
-") c #F5C584",
-"! c #F9BD63",
-"~ c #F9BE63",
-"{ c #F4C280",
-"] c #EADBCD",
-"^ c #BBF7FF",
-"/ c #D4DDE5",
-"( c #E7F1F5",
-"_ c #E0FFFF",
-": c #F3D5B2",
-"< c #FCCE7B",
-"[ c #FEE7B5",
-"} c #FFF0C9",
-"| c #FFF0CA",
-"1 c #FEE8B8",
-"2 c #FDCF7D",
-"3 c #EFCFA9",
-"4 c #C5E5FF",
-"5 c #D7DAE4",
-"6 c #B5FFFF",
-"7 c #F3D8BA",
-"8 c #FDDD91",
-"9 c #FFF0C2",
-"0 c #FFEAB5",
-"a c #FFE8B1",
-"b c #FFE8B1",
-"c c #FFEAB5",
-"d c #FFEFC2",
-"e c #FDDE95",
-"f c #EDD0AE",
-"g c #99E2FF",
-"h c #EFEBEE",
-"i c #FDCB5A",
-"j c #FFD876",
-"k c #FFD87B",
-"l c #FFD877",
-"m c #FDCD5F",
-"n c #E1DAD6",
-"o c #82FFFF",
-"p c #F2CB9E",
-"q c #FED44F",
-"r c #DBAF4A",
-"s c #DAAE4B",
-"t c #FBD251",
-"u c #ECC491",
-"v c #7ED6FF",
-"w c #DEFBFF",
-"x c #F4BE73",
-"y c #BF8E36",
-"z c #C99534",
-"A c #CF9A34",
-"B c #BC8B37",
-"C c #FCB122",
-"D c #C0CFF1",
-"E c #DFE6FF",
-"F c #F3AE25",
-"G c #C69736",
-"H c #C29636",
-"I c #F0AD27",
-"J c #C6C8D6",
-"K c #D6E0FF",
-"L c #EABB30",
-"M c #8AB1A8",
-"N c #80AEAF",
-"O c #E6BB35",
-"P c #BEC2D7",
-"Q c #FFFDFF",
-"R c #CDC096",
-"S c #C0EEFF",
-"T c #C2EEFF",
-"U c #C3BB96",
-"V c #D3C5D4",
-"W c #FFFFE4",
-"X c #79B7DF",
-"Y c #97D5F8",
-"Z c #C5EEFF",
-"` c #B2A5A2",
-" . c #BCB0AD",
-".. c #6D92B0",
-"+. c #BCE8FF",
-"@. c #A3DBFA",
-"#. c #E6D0C2",
-"$. c #FFFFEB",
-"%. c #96B3CA",
-"&. c #67BCEA",
-"*. c #7F7F5B",
-"=. c #8D5628",
-"-. c #8E592B",
-";. c #83794F",
-">. c #65B9E5",
-",. c #8DADC5",
-"'. c #CEBCAE",
-"). c #CCC2BC",
-"!. c #869DB8",
-"~. c #FDDD1E",
-"{. c #D5AE2D",
-"]. c #B3782B",
-"^. c #B27228",
-"/. c #B27227",
-"(. c #B2772A",
-"_. c #CFA82E",
-":. c #FFDF1E",
-"<. c #8199B4",
-"[. c #B2AEAB",
-"}. c #E4D1C4",
-"|. c #8FFF00",
-"1. c #FFD4A0",
-"2. c #E1CAB6",
-"3. c #FED836",
-"4. c #F7D427",
-"5. c #F5D327",
-"6. c #FFD934",
-"7. c #D4BFA8",
-"8. c #A4776B",
-"9. c #B7A396",
-"0. c #C5D0E0",
-"a. c #DCD4BE",
-"b. c #AFB6DF",
-"c. c #CFB9A5",
-"d. c #E1C27D",
-"e. c #EAC96C",
-"f. c #EAC96C",
-"g. c #E2C27B",
-"h. c #CCB69E",
-"i. c #A3A6CA",
-"j. c #FFFFB3",
-"k. c #C2D0DD",
-"l. c #000000",
-"m. c #FFFFFF",
-"n. c #A19EA2",
-"o. c #E6E4D9",
-"p. c #FFFFFD",
-"q. c #5F87FF",
-"r. c #8F9BE5",
-"s. c #8D99DE",
-"t. c #5C7DF5",
-"u. c #0000FF",
-"v. c #E0E1E9",
-"w. c #9B9999",
-"x. c #F7BC66",
-"y. c #F8BC63",
-"z. c #F7B655",
-"A. c #F9B651",
-"B. c #F9B040",
-"C. c #FAB03B",
-"D. c #F6B351",
-"E. c #FFE58A",
-"F. c #FFD97B",
-"G. c #FFD97B",
-"H. c #FFD87B",
-"I. c #FFE488",
-"J. c #F8B149",
-"K. c #FCB029",
-"L. c #F4C84F",
-"M. c #FFCF4A",
-"N. c #FECE4B",
-"O. c #FECE4B",
-"P. c #FFCE4A",
-"Q. c #F7CA4F",
-"R. c #FDB327",
-"S. c #FFB220",
-"T. c #F9B934",
-"U. c #FFBF2E",
-"V. c #FCB92E",
-"W. c #FCB82E",
-"X. c #FFBF2E",
-"Y. c #FABA32",
-"Z. c #F3BB6A",
-"`. c #F6BE64",
-" + c #907B46",
-".+ c #926426",
-"++ c #AD7A28",
-"@+ c #F6B432",
-"#+ c #FBB732",
-"$+ c #B27F2A",
-"%+ c #936525",
-"&+ c #8D7845",
-"*+ c #F7BD5E",
-"=+ c #F8C161",
-"-+ c #59869D",
-";+ c #E8B120",
-">+ c #E2B32C",
-",+ c #F7C42F",
-"'+ c #FAC72F",
-")+ c #DFB32C",
-"!+ c #EDB51D",
-"~+ c #5F8692",
-"{+ c #F8C05A",
-"]+ c #78B1C0",
-"^+ c #91B6C0",
-"/+ c #B8955C",
-"(+ c #CAA254",
-"_+ c #C79F4A",
-":+ c #C79F4A",
-"<+ c #CBA353",
-"[+ c #BE975C",
-"}+ c #8FAFB7",
-"|+ c #79B5C9",
-"1+ c #6B95B6",
-"2+ c #CDCED7",
-"3+ c #DFE0E9",
-"4+ c #E4E4EE",
-"5+ c #D5D7E0",
-"6+ c #73B5E0",
-"7+ c #71B0D8",
-"8+ c #8B410C",
-"9+ c #936334",
-"0+ c #946336",
-"a+ c #89410E",
-"b+ c #73B3DD",
-"c+ c #AAA272",
-"d+ c #B2A66A",
-"e+ c #E8C572",
-"f+ c #EBC725",
-"g+ c #EBC625",
-"h+ c #E9C56C",
-"i+ c #FFFFFF",
-" ",
-" ' ) x.! ~ y.{ ] ",
-" : z.< [ } | 1 2 A.3 ",
-" 7 B.8 9 0 a b c d e C.f ",
-" D.i E.j k F.G.H.l I.m J.n ",
-" p K.q r L.M.N.O.P.Q.s t R.u ",
-" x S.y z T.U.V.W.X.Y.A B C Z. ",
-" `.F G +.+++@+#+$+%+&+H I *+ ",
-" =+L M -+;+>+,+'+)+!+~+N O {+ ",
-" R ]+S ^+/+(+_+:+<+[+}+T |+U ",
-" X Y Z 1+` 2+3+4+5+ ...+.@.6+ ",
-" %.7+&.*.8+=.9+0+-.a+;.>.b+,. ",
-" !.c+~.{.].^./.(._.:.d+<. ",
-" 2.e+3.4.f+g+5.6.h+7. ",
-" c.d.e.f.g.h. ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/erlang.xpm b/elpa/mode-icons-20190627.2121/icons/erlang.xpm
deleted file mode 100644
index 1b6f59f..0000000
--- a/elpa/mode-icons-20190627.2121/icons/erlang.xpm
+++ /dev/null
@@ -1,25 +0,0 @@
-/* XPM */
-static char *erlang[] = {
-/* columns rows colors chars-per-pixel */
-"16 16 3 1 ",
-" c #A90533",
-". c #AA0533",
-"X c None",
-/* pixels */
-"XXXXXXXXXXXXXXXX",
-" XXXXX..XXXXX ",
-" XXXXX XXXXX ",
-" XXXXXXXXXXXXXX ",
-".XXXXXXXXXXXXXX.",
-".XXXXXXXXXXXXXX.",
-".XXXXX ",
-".XXXXX ",
-" XXXXX .X ",
-" .XXXXX XXX ",
-" XXXXXXX.XXXX. ",
-"XXXXXXXXXXXXXXXX",
-"XXXXXXXXXXXXXXXX",
-" XX.XXXX.XX.XXXX",
-"XXXXXXXXXXXXXXXX",
-"XXXXXXXXXXXXXXXX"
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/ext-png.xpm b/elpa/mode-icons-20190627.2121/icons/ext-png.xpm
deleted file mode 100644
index 074f7bb..0000000
--- a/elpa/mode-icons-20190627.2121/icons/ext-png.xpm
+++ /dev/null
@@ -1,70 +0,0 @@
-/* XPM */
-static char * ext_png_xpm[] = {
-"18 21 46 1",
-" c #F7F7F7",
-". c #DCDCDC",
-"+ c #DBDBDB",
-"@ c #F2F2F2",
-"# c #FFFFFF",
-"$ c #282828",
-"% c #000000",
-"& c #020202",
-"* c #5C5C5C",
-"= c #F5F5F5",
-"- c #6A6A6A",
-"; c #B7B7B7",
-"> c #444444",
-", c #090909",
-"' c #414141",
-") c #939393",
-"! c #BABABA",
-"~ c #424242",
-"{ c #F6F6F6",
-"] c #616161",
-"^ c #555555",
-"/ c #030303",
-"( c #F3F3F3",
-"_ c #434343",
-": c #0C0C0C",
-"< c #111111",
-"[ c #A0A0A0",
-"} c #131313",
-"| c #A1A1A1",
-"1 c #878787",
-"2 c #1A1A1A",
-"3 c #EFEFEF",
-"4 c #070707",
-"5 c #EEEEEE",
-"6 c #A9A9A9",
-"7 c #0F0F0F",
-"8 c #121212",
-"9 c #A5A5A5",
-"0 c #E1E1E1",
-"a c #010101",
-"b c #3B3B3B",
-"c c #161616",
-"d c #BCBCBC",
-"e c #535353",
-"f c #8F8F8F",
-"g c #676767",
-" .+++++++++@######",
-"$%%%%%%%%%%&*=####",
-"%-;;;;;;;;%>,'=###",
-"%)########%)!,~{##",
-"%)########%)#!,>{#",
-"%)########%)##!,]#",
-"%)########%^)))>/(",
-"%)########_%%%%%%+",
-"%)#############;%+",
-"%)#############;%+",
-"%)#:<[#%}|#12/#;%+",
-"%)#%34#%5%#%(%#;%+",
-"%)#%#%#%#%#%#%#;%+",
-"%)#%#%#%#%#/(%#;%+",
-"%)#%3%#%#%#67%#;%+",
-"%)#%89#%#%##0a#;%+",
-"%)#%#######bcd#;%+",
-"%)#############;%+",
-"%)#############;%+",
-"%efffffffffffffg%.",
-"_%%%%%%%%%%%%%%%$ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/ext-tex.xpm b/elpa/mode-icons-20190627.2121/icons/ext-tex.xpm
deleted file mode 100644
index 53be473..0000000
--- a/elpa/mode-icons-20190627.2121/icons/ext-tex.xpm
+++ /dev/null
@@ -1,77 +0,0 @@
-/* XPM */
-static char * ext_tex_xpm[] = {
-"17 21 53 1",
-" c #F5F5F5",
-". c #DBDBDB",
-"+ c #F8F8F8",
-"@ c #FFFFFF",
-"# c #2A2A2A",
-"$ c #000000",
-"% c #070707",
-"& c #7C7C7C",
-"* c #FDFDFD",
-"= c #9A9A9A",
-"- c #B7B7B7",
-"; c #525252",
-"> c #636363",
-", c #D7D7D7",
-"' c #999999",
-") c #020202",
-"! c #616161",
-"~ c #FCFCFC",
-"{ c #ADADAD",
-"] c #060606",
-"^ c #5F5F5F",
-"/ c #BFBFBF",
-"( c #0E0E0E",
-"_ c #828282",
-": c #7B7B7B",
-"< c #939393",
-"[ c #545454",
-"} c #181818",
-"| c #555555",
-"1 c #0B0B0B",
-"2 c #A9A9A9",
-"3 c #6A6A6A",
-"4 c #A0A0A0",
-"5 c #2B2B2B",
-"6 c #B1B1B1",
-"7 c #050505",
-"8 c #F4F4F4",
-"9 c #818181",
-"0 c #808080",
-"a c #D8D8D8",
-"b c #D5D5D5",
-"c c #010101",
-"d c #EEEEEE",
-"e c #EDEDED",
-"f c #9D9D9D",
-"g c #A4A4A4",
-"h c #656565",
-"i c #969696",
-"j c #5A5A5A",
-"k c #6B6B6B",
-"l c #676767",
-"m c #232323",
-"n c #666666",
-" ..........+@@@@@",
-"#$$$$$$$$$$%&*@@@",
-"$=--------$;$>*@@",
-"$,@@@@@@@@$,')!~@",
-"$,@@@@@@@@$,@{]^~",
-"$,@@@@@@@@$,@@/(_",
-"$,@@@@@@@@$:<<<[}",
-"$,@@@@@@@@|$$$$$$",
-"$,@@@@@@@@@@@@@,$",
-"$,@$@@@@@@@@@@@,$",
-"$,@$1@234@565@@,$",
-"$,@$@@78)@9}0@@,$",
-"$,@$@@$$$@a$b@@,$",
-"$,@$@@$@@@a$b@@,$",
-"$,@cd@7ec@9}0@@,$",
-"$,@f7@ghi@565@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$jkkkkkkkkkkkkkjc",
-"lmmmmmmmmmmmmmmmn"};
diff --git a/elpa/mode-icons-20190627.2121/icons/ext-xpm.xpm b/elpa/mode-icons-20190627.2121/icons/ext-xpm.xpm
deleted file mode 100644
index 07d5f77..0000000
--- a/elpa/mode-icons-20190627.2121/icons/ext-xpm.xpm
+++ /dev/null
@@ -1,76 +0,0 @@
-/* XPM */
-static char * ext_xpm_xpm[] = {
-"17 21 52 1",
-" c #F5F5F5",
-". c #DBDBDB",
-"+ c #F8F8F8",
-"@ c #FFFFFF",
-"# c #2A2A2A",
-"$ c #000000",
-"% c #070707",
-"& c #7C7C7C",
-"* c #FDFDFD",
-"= c #9A9A9A",
-"- c #B7B7B7",
-"; c #525252",
-"> c #636363",
-", c #D7D7D7",
-"' c #999999",
-") c #020202",
-"! c #616161",
-"~ c #FCFCFC",
-"{ c #ADADAD",
-"] c #060606",
-"^ c #5F5F5F",
-"/ c #BFBFBF",
-"( c #0E0E0E",
-"_ c #828282",
-": c #7B7B7B",
-"< c #939393",
-"[ c #545454",
-"} c #181818",
-"| c #555555",
-"1 c #2B2B2B",
-"2 c #B1B1B1",
-"3 c #0C0C0C",
-"4 c #111111",
-"5 c #A0A0A0",
-"6 c #141414",
-"7 c #2D2D2D",
-"8 c #1D1D1D",
-"9 c #888888",
-"0 c #818181",
-"a c #808080",
-"b c #EFEFEF",
-"c c #EEEEEE",
-"d c #D8D8D8",
-"e c #D5D5D5",
-"f c #121212",
-"g c #A5A5A5",
-"h c #5A5A5A",
-"i c #6B6B6B",
-"j c #010101",
-"k c #676767",
-"l c #232323",
-"m c #666666",
-" ..........+@@@@@",
-"#$$$$$$$$$$%&*@@@",
-"$=--------$;$>*@@",
-"$,@@@@@@@@$,')!~@",
-"$,@@@@@@@@$,@{]^~",
-"$,@@@@@@@@$,@@/(_",
-"$,@@@@@@@@$:<<<[}",
-"$,@@@@@@@@|$$$$$$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@121@345@$6789$",
-"$,@0}a@$b%@$c$c$$",
-"$,@d$e@$@$@$@$@$$",
-"$,@d$e@$@$@$@$@$$",
-"$,@0}a@$b$@$@$@$$",
-"$,@121@$fg@$@$@$$",
-"$,@@@@@$@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$,@@@@@@@@@@@@@,$",
-"$hiiiiiiiiiiiiihj",
-"klllllllllllllllm"};
diff --git a/elpa/mode-icons-20190627.2121/icons/flutter.xpm b/elpa/mode-icons-20190627.2121/icons/flutter.xpm
deleted file mode 100644
index 6faee40..0000000
--- a/elpa/mode-icons-20190627.2121/icons/flutter.xpm
+++ /dev/null
@@ -1,79 +0,0 @@
-/* XPM */
-static char * flutter_xpm[] = {
-"16 16 60 1",
-" c None",
-". c #000000",
-"+ c #54C5F8",
-"@ c #54C5F8",
-"# c #54C5F8",
-"$ c #54C5F8",
-"% c #54C5F8",
-"& c #54C5F8",
-"* c #54C5F8",
-"= c #54C5F8",
-"- c #29B6F6",
-"; c #3ABCF7",
-"> c #29B6F6",
-", c #29B6F6",
-"' c #0D6098",
-") c #29B6F6",
-"! c #01579B",
-"~ c #06568E",
-"{ c #01579B",
-"] c #01579B",
-"^ c #01579B",
-"/ c #54C5F8",
-"( c #29B6F6",
-"_ c #39BCF7",
-": c #229DD6",
-"< c #229CD5",
-"[ c #06548C",
-"} c #015598",
-"| c #229AD2",
-"1 c #065288",
-"2 c #015497",
-"3 c #01579A",
-"4 c #01579B",
-"5 c #2197CE",
-"6 c #064D81",
-"7 c #015292",
-"8 c #015699",
-"9 c #2092C7",
-"0 c #054675",
-"a c #014D8A",
-"b c #015394",
-"c c #015698",
-"d c #1F8BBD",
-"e c #043C64",
-"f c #01467D",
-"g c #014E8B",
-"h c #015393",
-"i c #01569A",
-"j c #1E89BA",
-"k c #032F4F",
-"l c #013B69",
-"m c #014D89",
-"n c #015395",
-"o c #032E4C",
-"p c #002F53",
-"q c #013F71",
-"r c #014F8D",
-"s c #033559",
-"t c #01457A",
-"u c #015599",
-" +++++ ",
-" ++++++ ",
-" ++++++ ",
-" ++++++ ",
-" ++++++ ",
-" ++++++ ",
-" ++++++ ",
-" ++++++ ++++ ",
-" +++++ +++++ ",
-" +++ ;++++ ",
-" --;++ ",
-" ----; ",
-" ---:c! ",
-" -56i!! ",
-" c!!!!! ",
-" !!!!! "};
diff --git a/elpa/mode-icons-20190627.2121/icons/flycheck.xpm b/elpa/mode-icons-20190627.2121/icons/flycheck.xpm
deleted file mode 100644
index d83581e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/flycheck.xpm
+++ /dev/null
@@ -1,228 +0,0 @@
-/* XPM */
-static char * flycheck_xpm[] = {
-"16 16 209 2",
-" c None",
-". c #FFFFFF",
-"+ c #FFD9D9",
-"@ c #FFCFCF",
-"# c #FFE7E7",
-"$ c #E4E4E4",
-"% c #CFCFCF",
-"& c #E2E2E2",
-"* c #E5E5E5",
-"= c #EAEAEA",
-"- c #FF3C3C",
-"; c #FF0000",
-"> c #FF8686",
-", c #6E6E6E",
-"' c #000000",
-") c #616161",
-"! c #727272",
-"~ c #8D8D8D",
-"{ c #FF4A4A",
-"] c #FF9494",
-"^ c #FF5858",
-"/ c #FFA2A2",
-"( c #080808",
-"_ c #E7E7E7",
-": c #F1F1F1",
-"< c #F2F2F2",
-"[ c #D4D4D4",
-"} c #FF6666",
-"| c #FFB1B1",
-"1 c #090909",
-"2 c #FF7474",
-"3 c #FFBFBF",
-"4 c #858585",
-"5 c #5F5F5F",
-"6 c #767676",
-"7 c #C6C6C6",
-"8 c #C7C7C7",
-"9 c #D6D6D6",
-"0 c #707070",
-"a c #383838",
-"b c #333333",
-"c c #717171",
-"d c #E1E1E1",
-"e c #9D9D9D",
-"f c #9A9A9A",
-"g c #FF8282",
-"h c #FFCDCD",
-"i c #898989",
-"j c #D8D8D8",
-"k c #5E5E5E",
-"l c #050505",
-"m c #EBEBEB",
-"n c #969696",
-"o c #282828",
-"p c #505050",
-"q c #5D5D5D",
-"r c #FF9090",
-"s c #FFDBDB",
-"t c #040404",
-"u c #7F7F7F",
-"v c #888888",
-"w c #030303",
-"x c #7B7B7B",
-"y c #F9F9F9",
-"z c #0F0F0F",
-"A c #4D4D4D",
-"B c #C2C2C2",
-"C c #0A0A0A",
-"D c #6D6D6D",
-"E c #939393",
-"F c #020202",
-"G c #FF9E9E",
-"H c #FFE9E9",
-"I c #111111",
-"J c #484848",
-"K c #1F1F1F",
-"L c #FEFEFE",
-"M c #B3B3B3",
-"N c #A9A9A9",
-"O c #2D2D2D",
-"P c #0E0E0E",
-"Q c #DADADA",
-"R c #A5A5A5",
-"S c #FFADAD",
-"T c #FFF7F7",
-"U c #373737",
-"V c #454545",
-"W c #A7A7A7",
-"X c #C1C1C1",
-"Y c #F7F7F7",
-"Z c #878787",
-"` c #FFBBBB",
-" . c #FF0505",
-".. c #646464",
-"+. c #F8F8F8",
-"@. c #626262",
-"#. c #B5B5B5",
-"$. c #8F8F8F",
-"%. c #575757",
-"&. c #959595",
-"*. c #FFC9C9",
-"=. c #FF1313",
-"-. c #656565",
-";. c #B2B2B2",
-">. c #BFBFBF",
-",. c #AEAEAE",
-"'. c #C9C9C9",
-"). c #FFD5D5",
-"!. c #C4C4C4",
-"~. c #5C5C5C",
-"{. c #1D1D1D",
-"]. c #DCDCDC",
-"^. c #999999",
-"/. c #FFAFAF",
-"(. c #FFE1E1",
-"_. c #242424",
-":. c #777777",
-"<. c #191919",
-"[. c #E8E8E8",
-"}. c #ECECEC",
-"|. c #989898",
-"1. c #FF5252",
-"2. c #FF9D9D",
-"3. c #B4B4B4",
-"4. c #424242",
-"5. c #F6F6F6",
-"6. c #838383",
-"7. c #B0B0B0",
-"8. c #131313",
-"9. c #848484",
-"0. c #A0A0A0",
-"a. c #737373",
-"b. c #161616",
-"c. c #A8A8A8",
-"d. c #EDEDED",
-"e. c #E0E0E0",
-"f. c #010101",
-"g. c #303030",
-"h. c #818181",
-"i. c #FF7E7E",
-"j. c #FF3F3F",
-"k. c #FFB5B5",
-"l. c #3F3F3F",
-"m. c #464646",
-"n. c #414141",
-"o. c #D7D7D7",
-"p. c #323232",
-"q. c #393939",
-"r. c #EFEFEF",
-"s. c #E6E6E6",
-"t. c #F3F3F3",
-"u. c #8E8E8E",
-"v. c #1A1A1A",
-"w. c #BBBBBB",
-"x. c #535353",
-"y. c #787878",
-"z. c #ABABAB",
-"A. c #FFF2F2",
-"B. c #FFB0B0",
-"C. c #FFFAFA",
-"D. c #FFACAC",
-"E. c #FFFBFB",
-"F. c #FFAAAA",
-"G. c #FFF9F9",
-"H. c #FFABAB",
-"I. c #FFF8F8",
-"J. c #FFB4B4",
-"K. c #FFEDED",
-"L. c #FFBEBE",
-"M. c #FFE6E6",
-"N. c #FFE4E4",
-"O. c #FFD3D3",
-"P. c #FFDADA",
-"Q. c #FFC8C8",
-"R. c #FFDDDD",
-"S. c #FFC6C6",
-"T. c #FFEAEA",
-"U. c #FFB8B8",
-"V. c #FFAEAE",
-"W. c #FFF6F6",
-"X. c #FFC1C1",
-"Y. c #FFC4C4",
-"Z. c #FFDEDE",
-"`. c #FFC5C5",
-" + c #FFE0E0",
-".+ c #FFC2C2",
-"++ c #FFEFEF",
-"@+ c #FFB6B6",
-"#+ c #FFF4F4",
-"$+ c #FFC0C0",
-"%+ c #FF7676",
-"&+ c #FFCACA",
-"*+ c #FF7878",
-"=+ c #FF7C7C",
-"-+ c #FF8080",
-";+ c #FF8C8C",
-">+ c #FF9C9C",
-",+ c #FF9797",
-"'+ c #FFA3A3",
-")+ c #FF8383",
-"!+ c #FFB9B9",
-"~+ c #FF7B7B",
-"{+ c #FF7979",
-"]+ c #FFC3C3",
-"^+ c #FF7A7A",
-"/+ c #FF9393",
-"(+ c #FF9898",
-"_+ c #FFA1A1",
-":+ c #FF8E8E",
-" ",
-" ",
-" ",
-" - - ",
-" - - ",
-" - - ",
-" - - ",
-" - - ",
-" - - ",
-" - - ",
-" ",
-" ",
-" - - ",
-" - - ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f107.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f107.xpm
deleted file mode 100644
index 7c99507..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f107.xpm
+++ /dev/null
@@ -1,97 +0,0 @@
-/* XPM */
-static char * font_mfizz_f107_xpm[] = {
-"20 21 73 1",
-" c #FFFFFF",
-". c #D1D1D1",
-"+ c #999999",
-"@ c #868686",
-"# c #969696",
-"$ c #BBBBBB",
-"% c #F9F9F9",
-"& c #C1C1C1",
-"* c #333333",
-"= c #000000",
-"- c #0F0F0F",
-"; c #838383",
-"> c #F8F8F8",
-", c #909090",
-"' c #020202",
-") c #464646",
-"! c #FAFAFA",
-"~ c #A1A1A1",
-"{ c #7F7F7F",
-"] c #EEEEEE",
-"^ c #131313",
-"/ c #4C4C4C",
-"( c #979797",
-"_ c #232323",
-": c #090909",
-"< c #E8E8E8",
-"[ c #919191",
-"} c #6B6B6B",
-"| c #EBEBEB",
-"1 c #121212",
-"2 c #8F8F8F",
-"3 c #484848",
-"4 c #080808",
-"5 c #EAEAEA",
-"6 c #5C5C5C",
-"7 c #595959",
-"8 c #565656",
-"9 c #242424",
-"0 c #2D2D2D",
-"a c #111111",
-"b c #434343",
-"c c #1A1A1A",
-"d c #292929",
-"e c #393939",
-"f c #050505",
-"g c #E4E4E4",
-"h c #A7A7A7",
-"i c #7C7C7C",
-"j c #8A8A8A",
-"k c #D2D2D2",
-"l c #767676",
-"m c #666666",
-"n c #898989",
-"o c #DEDEDE",
-"p c #040404",
-"q c #636363",
-"r c #C5C5C5",
-"s c #C3C3C3",
-"t c #474747",
-"u c #C7C7C7",
-"v c #828282",
-"w c #363636",
-"x c #5F5F5F",
-"y c #1C1C1C",
-"z c #DCDCDC",
-"A c #FEFEFE",
-"B c #878787",
-"C c #030303",
-"D c #E9E9E9",
-"E c #B4B4B4",
-"F c #8E8E8E",
-"G c #808080",
-"H c #A9A9A9",
-" .+@#$% ",
-" &*=====-;> ",
-" ,'========)! ",
-" ~==========={ ",
-"]^====/(;_===:< ",
-"[====} |1===2 ",
-"3===45 (678# ",
-"9===0 ",
-"a===b ",
-"c===d ",
-"e===fg hij+k ",
-"l====m >_===n ",
-"op====qrst====u ",
-" v===========w ",
-" x=========yz ",
-" AB^=====C6D ",
-" >EFGnHD ",
-" ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10a.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10a.xpm
deleted file mode 100644
index cfb38a1..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10a.xpm
+++ /dev/null
@@ -1,157 +0,0 @@
-/* XPM */
-static char * font_mfizz_f10a_xpm[] = {
-"22 21 133 2",
-" c #FFFFFF",
-". c #DADADA",
-"+ c #AEAEAE",
-"@ c #8B8B8B",
-"# c #909090",
-"$ c #A5A5A5",
-"% c #DDDDDD",
-"& c #FBFBFB",
-"* c #999999",
-"= c #292929",
-"- c #000000",
-"; c #2A2A2A",
-"> c #9C9C9C",
-", c #FDFDFD",
-"' c #DEDEDE",
-") c #303030",
-"! c #D5D5D5",
-"~ c #1C1C1C",
-"{ c #1F1F1F",
-"] c #0D0D0D",
-"^ c #121212",
-"/ c #D1D1D1",
-"( c #D0D0D0",
-"_ c #FCFCFC",
-": c #CFCFCF",
-"< c #808080",
-"[ c #BBBBBB",
-"} c #E2E2E2",
-"| c #B4B4B4",
-"1 c #606060",
-"2 c #050505",
-"3 c #1B1B1B",
-"4 c #EDEDED",
-"5 c #C1C1C1",
-"6 c #9D9D9D",
-"7 c #CDCDCD",
-"8 c #BEBEBE",
-"9 c #464646",
-"0 c #454545",
-"a c #757575",
-"b c #DCDCDC",
-"c c #D2D2D2",
-"d c #232323",
-"e c #626262",
-"f c #D6D6D6",
-"g c #2B2B2B",
-"h c #1A1A1A",
-"i c #E5E5E5",
-"j c #A1A1A1",
-"k c #F5F5F5",
-"l c #191919",
-"m c #0A0A0A",
-"n c #151515",
-"o c #030303",
-"p c #E7E7E7",
-"q c #A9A9A9",
-"r c #B6B6B6",
-"s c #010101",
-"t c #C9C9C9",
-"u c #868686",
-"v c #020202",
-"w c #A7A7A7",
-"x c #7D7D7D",
-"y c #666666",
-"z c #181818",
-"A c #E4E4E4",
-"B c #262626",
-"C c #171717",
-"D c #373737",
-"E c #515151",
-"F c #DBDBDB",
-"G c #3C3C3C",
-"H c #4E4E4E",
-"I c #0F0F0F",
-"J c #C0C0C0",
-"K c #333333",
-"L c #FAFAFA",
-"M c #8E8E8E",
-"N c #BFBFBF",
-"O c #5F5F5F",
-"P c #0E0E0E",
-"Q c #484848",
-"R c #787878",
-"S c #4B4B4B",
-"T c #111111",
-"U c #343434",
-"V c #F7F7F7",
-"W c #D7D7D7",
-"X c #EAEAEA",
-"Y c #282828",
-"Z c #141414",
-"` c #5B5B5B",
-" . c #A2A2A2",
-".. c #B3B3B3",
-"+. c #ADADAD",
-"@. c #797979",
-"#. c #CCCCCC",
-"$. c #040404",
-"%. c #B5B5B5",
-"&. c #A8A8A8",
-"*. c #161616",
-"=. c #DFDFDF",
-"-. c #D8D8D8",
-";. c #131313",
-">. c #A4A4A4",
-",. c #474747",
-"'. c #AAAAAA",
-"). c #9A9A9A",
-"!. c #5D5D5D",
-"~. c #676767",
-"{. c #222222",
-"]. c #8F8F8F",
-"^. c #4D4D4D",
-"/. c #C5C5C5",
-"(. c #F2F2F2",
-"_. c #1D1D1D",
-":. c #5C5C5C",
-"<. c #B2B2B2",
-"[. c #D9D9D9",
-"}. c #D3D3D3",
-"|. c #B0B0B0",
-"1. c #646464",
-"2. c #6D6D6D",
-"3. c #949494",
-"4. c #A0A0A0",
-"5. c #929292",
-"6. c #8D8D8D",
-"7. c #D4D4D4",
-"8. c #2C2C2C",
-"9. c #9B9B9B",
-"0. c #242424",
-"a. c #888888",
-"b. c #A6A6A6",
-" . + @ # $ % ",
-" & * = - - - - - - ; > , ",
-" ' ) - - - - - - - - - - ) . ",
-" ! ~ { ] - - - - - - - - - - ^ / ",
-" ( _ : < [ } ' | 1 2 - - - 3 4 ",
-" , 5 6 7 8 9 0 a b c d - - - e ",
-" f g - h i * j k l - - m > } n - - o % ",
-" p h - - q r s o t u - - - v [ w - - - x ",
-" y - - z , = - - 0 A v - - - B _ C - - D ",
-" n - - E F - - - - A G - - - - f H - - I ",
-" v - - 1 J - - - K L M - - - - N O - - s ",
-" P - - Q f - - - r R } s - - - F S - - T ",
-" U - - ^ V d - D W o X Q - - Y & Z - - ` ",
-" R - - - ...s +.@.- * #.$.- %.&.- - *.=. ",
-" -.s - - ;.A >.L ,.- B L '.).} h C !.% ",
-" ~.- - - {.( ].^.E /. _ , ",
-" (._.- - - 2 :.<.[.}.|.1.2.3.4.5.6., ",
-" f 3 - - - - - - - - - - - - ^ 7. ",
-" =.U - - - - - - - - - - 8.b ",
-" , 9.g - - - - - - 0.5.L ",
-" F $ M a.b./ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10c.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10c.xpm
deleted file mode 100644
index a583d0e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10c.xpm
+++ /dev/null
@@ -1,107 +0,0 @@
-/* XPM */
-static char * font_mfizz_f10c_xpm[] = {
-"20 21 83 1",
-" c #FFFFFF",
-". c #F4F4F4",
-"+ c #D7D7D7",
-"@ c #C9C9C9",
-"# c #D8D8D8",
-"$ c #FBFBFB",
-"% c #BABABA",
-"& c #434343",
-"* c #050505",
-"= c #000000",
-"- c #0A0A0A",
-"; c #545454",
-"> c #C8C8C8",
-", c #FEFEFE",
-"' c #717171",
-") c #363636",
-"! c #737373",
-"~ c #868686",
-"{ c #747474",
-"] c #393939",
-"^ c #010101",
-"/ c #CDCDCD",
-"( c #858585",
-"_ c #111111",
-": c #B9B9B9",
-"< c #CFCFCF",
-"[ c #3A3A3A",
-"} c #C3C3C3",
-"| c #E2E2E2",
-"1 c #BFBFBF",
-"2 c #FAFAFA",
-"3 c #EFEFEF",
-"4 c #7B7B7B",
-"5 c #4B4B4B",
-"6 c #B6B6B6",
-"7 c #D4D4D4",
-"8 c #9B9B9B",
-"9 c #F3F3F3",
-"0 c #8F8F8F",
-"a c #141414",
-"b c #C5C5C5",
-"c c #040404",
-"d c #7C7C7C",
-"e c #3B3B3B",
-"f c #0F0F0F",
-"g c #B3B3B3",
-"h c #F6F6F6",
-"i c #212121",
-"j c #242424",
-"k c #CACACA",
-"l c #F7F7F7",
-"m c #E8E8E8",
-"n c #404040",
-"o c #898989",
-"p c #949494",
-"q c #2B2B2B",
-"r c #A9A9A9",
-"s c #666666",
-"t c #656565",
-"u c #818181",
-"v c #B4B4B4",
-"w c #BCBCBC",
-"x c #0B0B0B",
-"y c #FDFDFD",
-"z c #525252",
-"A c #353535",
-"B c #EBEBEB",
-"C c #727272",
-"D c #C4C4C4",
-"E c #333333",
-"F c #121212",
-"G c #787878",
-"H c #C6C6C6",
-"I c #797979",
-"J c #1A1A1A",
-"K c #080808",
-"L c #191919",
-"M c #8B8B8B",
-"N c #F1F1F1",
-"O c #B1B1B1",
-"P c #8D8D8D",
-"Q c #808080",
-"R c #929292",
-" .+@#$ ",
-" %&*===-;> ",
-" ,'==)!~{]^^/ ",
-" (=_: <[} ",
-"|*^1 23 ",
-"4=5 $6 7# ",
-"]=8 9& 08 ",
-"a=b 9& 08 ",
-"c=7 de]feegheeijee",
-"f=k l9mn99$ 99op99",
-"q=r 9& 08 ",
-"s=t lu vw ",
-"b=x| y ",
-" z=AB hCD ",
-" 3E=FGvHvIJ=} ",
-" .'K=====LM2 ",
-" NOPQR}$ ",
-" ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10d.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10d.xpm
deleted file mode 100644
index af2b2ab..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f10d.xpm
+++ /dev/null
@@ -1,123 +0,0 @@
-/* XPM */
-static char * font_mfizz_f10d_xpm[] = {
-"21 21 99 2",
-" c #FFFFFF",
-". c #DCDCDC",
-"+ c #AFAFAF",
-"@ c #A8A8A8",
-"# c #C6C6C6",
-"$ c #FBFBFB",
-"% c #F5F5F5",
-"& c #B5B5B5",
-"* c #C9C9C9",
-"= c #393939",
-"- c #000000",
-"; c #181818",
-"> c #A3A3A3",
-", c #C8C8C8",
-"' c #E7E7E7",
-") c #6F6F6F",
-"! c #060606",
-"~ c #161616",
-"{ c #898989",
-"] c #CCCCCC",
-"^ c #D8D8D8",
-"/ c #242424",
-"( c #999999",
-"_ c #5F5F5F",
-": c #F3F3F3",
-"< c #E4E4E4",
-"[ c #E5E5E5",
-"} c #0B0B0B",
-"| c #E2E2E2",
-"1 c #EBEBEB",
-"2 c #1B1B1B",
-"3 c #090909",
-"4 c #969696",
-"5 c #232323",
-"6 c #202020",
-"7 c #777777",
-"8 c #9B9B9B",
-"9 c #9A9A9A",
-"0 c #434343",
-"a c #CBCBCB",
-"b c #FDFDFD",
-"c c #B9B9B9",
-"d c #323232",
-"e c #2D2D2D",
-"f c #010101",
-"g c #080808",
-"h c #484848",
-"i c #2F2F2F",
-"j c #030303",
-"k c #F0F0F0",
-"l c #EFEFEF",
-"m c #2E2E2E",
-"n c #737373",
-"o c #A5A5A5",
-"p c #F8F8F8",
-"q c #ABABAB",
-"r c #535353",
-"s c #E3E3E3",
-"t c #2B2B2B",
-"u c #151515",
-"v c #1A1A1A",
-"w c #5E5E5E",
-"x c #3E3E3E",
-"y c #EEEEEE",
-"z c #DFDFDF",
-"A c #ACACAC",
-"B c #757575",
-"C c #9C9C9C",
-"D c #989898",
-"E c #848484",
-"F c #F6F6F6",
-"G c #3F3F3F",
-"H c #050505",
-"I c #020202",
-"J c #2C2C2C",
-"K c #3C3C3C",
-"L c #BDBDBD",
-"M c #EDEDED",
-"N c #101010",
-"O c #171717",
-"P c #DDDDDD",
-"Q c #E0E0E0",
-"R c #141414",
-"S c #E8E8E8",
-"T c #252525",
-"U c #1F1F1F",
-"V c #A2A2A2",
-"W c #AEAEAE",
-"X c #111111",
-"Y c #868686",
-"Z c #8A8A8A",
-"` c #9F9F9F",
-" . c #BABABA",
-".. c #212121",
-"+. c #CECECE",
-"@. c #B4B4B4",
-"#. c #D1D1D1",
-"$. c #ADADAD",
-"%. c #F9F9F9",
-" ",
-" ",
-" . + @ # $ % & ",
-" * = - - - - ; > , $ ' ) ",
-" + ! ~ { ] ^ > / - ( _ : < ) ",
-" [ } ; | 1 2 3 1 _ : 1 4 5 6 ",
-" 7 - 8 9 0 a b c d e f - g h ",
-" i j k l - - m n o ) ",
-" } 6 p q r : s ) ",
-" j t _ : s ) ",
-" u v _ : s w @ ",
-" x f y 1 9 z _ A B e - - ",
-" { - C D - E F G H - I J K L ",
-" M N O P Q R } S l T U V y s ) ",
-" W j X Y , * Z O f ` _ : s ) ",
-" .e - - - - ..W _ : F +. ",
-" P .@.#.b $.%. ",
-" ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f115.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f115.xpm
deleted file mode 100644
index ebe233d..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f115.xpm
+++ /dev/null
@@ -1,87 +0,0 @@
-/* XPM */
-static char * font_mfizz_f115_xpm[] = {
-"20 21 63 1",
-" c #FFFFFF",
-". c #FDFDFD",
-"+ c #AEAEAE",
-"@ c #5E5E5E",
-"# c #A9A9A9",
-"$ c #020202",
-"% c #424242",
-"& c #D2D2D2",
-"* c #090909",
-"= c #000000",
-"- c #1F1F1F",
-"; c #F7F7F7",
-"> c #272727",
-", c #E1E1E1",
-"' c #808080",
-") c #7B7B7B",
-"! c #E5E5E5",
-"~ c #080808",
-"{ c #D8D8D8",
-"] c #777777",
-"^ c #292929",
-"/ c #EFEFEF",
-"( c #101010",
-"_ c #3D3D3D",
-": c #F6F6F6",
-"< c #B4B4B4",
-"[ c #494949",
-"} c #FCFCFC",
-"| c #676767",
-"1 c #878787",
-"2 c #343434",
-"3 c #0F0F0F",
-"4 c #F8F8F8",
-"5 c #BBBBBB",
-"6 c #060606",
-"7 c #A4A4A4",
-"8 c #1A1A1A",
-"9 c #B5B5B5",
-"0 c #4F4F4F",
-"a c #E2E2E2",
-"b c #ABABAB",
-"c c #030303",
-"d c #393939",
-"e c #FEFEFE",
-"f c #131313",
-"g c #CBCBCB",
-"h c #999999",
-"i c #505050",
-"j c #010101",
-"k c #BDBDBD",
-"l c #E7E7E7",
-"m c #2A2A2A",
-"n c #454545",
-"o c #8A8A8A",
-"p c #A8A8A8",
-"q c #282828",
-"r c #939393",
-"s c #8B8B8B",
-"t c #2B2B2B",
-"u c #CECECE",
-"v c #FBFBFB",
-"w c #EAEAEA",
-"x c #FAFAFA",
-" . ",
-" +@ ",
-" #$% ",
-" &*=- ",
-" ;>===, ",
-" '====) ",
-" !~====*{ ",
-" ]======^/ ",
-" ;(=======_: ",
-" <=========[} ",
-" |==========1 ",
-" 2==========34 ",
-" 3===========5 ",
-" 6===========7 ",
-" 8===========9 ",
-" 0===========a ",
-" b=c========d ",
-" edfbghij===k ",
-" lm=nopq=cr ",
-" ;stj=~iu ",
-" vwx "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f116.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f116.xpm
deleted file mode 100644
index 0011c72..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f116.xpm
+++ /dev/null
@@ -1,97 +0,0 @@
-/* XPM */
-static char * font_mfizz_f116_xpm[] = {
-"20 21 73 1",
-" c #FFFFFF",
-". c #8A8A8A",
-"+ c #5B5B5B",
-"@ c #8E8E8E",
-"# c #F9F9F9",
-"$ c #B2B2B2",
-"% c #A6A6A6",
-"& c #EBEBEB",
-"* c #A1A1A1",
-"= c #585858",
-"- c #838383",
-"; c #474747",
-"> c #000000",
-", c #CBCBCB",
-"' c #F5F5F5",
-") c #343434",
-"! c #111111",
-"~ c #E2E2E2",
-"{ c #030303",
-"] c #454545",
-"^ c #484848",
-"/ c #909090",
-"( c #828282",
-"_ c #3E3E3E",
-": c #464646",
-"< c #A7A7A7",
-"[ c #DBDBDB",
-"} c #7A7A7A",
-"| c #E6E6E6",
-"1 c #959595",
-"2 c #4A4A4A",
-"3 c #FEFEFE",
-"4 c #F7F7F7",
-"5 c #FCFCFC",
-"6 c #9B9B9B",
-"7 c #494949",
-"8 c #565656",
-"9 c #4E4E4E",
-"0 c #010101",
-"a c #050505",
-"b c #060606",
-"c c #070707",
-"d c #040404",
-"e c #F6F6F6",
-"f c #656565",
-"g c #4B4B4B",
-"h c #A0A0A0",
-"i c #171717",
-"j c #4C4C4C",
-"k c #7D7D7D",
-"l c #EAEAEA",
-"m c #6A6A6A",
-"n c #8B8B8B",
-"o c #151515",
-"p c #4D4D4D",
-"q c #1A1A1A",
-"r c #FAFAFA",
-"s c #7C7C7C",
-"t c #505050",
-"u c #FBFBFB",
-"v c #CACACA",
-"w c #8D8D8D",
-"x c #939393",
-"y c #2E2E2E",
-"z c #404040",
-"A c #3A3A3A",
-"B c #4F4F4F",
-"C c #5A5A5A",
-"D c #606060",
-"E c #F3F3F3",
-"F c #B1B1B1",
-"G c #535353",
-"H c #898989",
-" ",
-" ",
-" ",
-" ",
-".+@ #$%& *=-",
-";>, ')>>!~ ~{]",
-";^ />>>>( _:",
-";< &[[[[& };",
-";| 1^",
-"23 4'4#5 67",
-"8 9>>>>>0{abcd2",
-"^e f>>>>>>>>>>>g",
-";, h>>>>>>>0i>>j",
-";k la>>>>>>menop",
-";qr s>>>>>tu v9",
-";>w xyqz*3 uAB",
-"nCDE FGH",
-" ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f126.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f126.xpm
deleted file mode 100644
index ff4da89..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f126.xpm
+++ /dev/null
@@ -1,115 +0,0 @@
-/* XPM */
-static char * font_mfizz_f126_xpm[] = {
-"20 21 91 1",
-" c #FFFFFF",
-". c #818181",
-"+ c #5F5F5F",
-"@ c #8C8C8C",
-"# c #EDEDED",
-"$ c #626262",
-"% c #B6B6B6",
-"& c #BDBDBD",
-"* c #010101",
-"= c #000000",
-"- c #BABABA",
-"; c #707070",
-"> c #151515",
-", c #EBEBEB",
-"' c #686868",
-") c #1E1E1E",
-"! c #E7E7E7",
-"~ c #252525",
-"{ c #565656",
-"] c #F3F3F3",
-"^ c #1F1F1F",
-"/ c #636363",
-"( c #C5C5C5",
-"_ c #020202",
-": c #ACACAC",
-"< c #B7B7B7",
-"[ c #737373",
-"} c #161616",
-"| c #ABABAB",
-"1 c #838383",
-"2 c #656565",
-"3 c #1C1C1C",
-"4 c #272727",
-"5 c #575757",
-"6 c #CBCBCB",
-"7 c #030303",
-"8 c #F1F1F1",
-"9 c #1D1D1D",
-"0 c #616161",
-"a c #C7C7C7",
-"b c #ADADAD",
-"c c #828282",
-"d c #232323",
-"e c #848484",
-"f c #E8E8E8",
-"g c #404040",
-"h c #ECECEC",
-"i c #131313",
-"j c #767676",
-"k c #B5B5B5",
-"l c #585858",
-"m c #D0D0D0",
-"n c #0C0C0C",
-"o c #070707",
-"p c #525252",
-"q c #292929",
-"r c #1A1A1A",
-"s c #AEAEAE",
-"t c #7E7E7E",
-"u c #A8A8A8",
-"v c #C9C9C9",
-"w c #5E5E5E",
-"x c #676767",
-"y c #171717",
-"z c #A1A1A1",
-"A c #9F9F9F",
-"B c #EAEAEA",
-"C c #141414",
-"D c #787878",
-"E c #B3B3B3",
-"F c #C0C0C0",
-"G c #F6F6F6",
-"H c #242424",
-"I c #595959",
-"J c #545454",
-"K c #2A2A2A",
-"L c #191919",
-"M c #6B6B6B",
-"N c #C2C2C2",
-"O c #B0B0B0",
-"P c #CACACA",
-"Q c #5D5D5D",
-"R c #202020",
-"S c #6E6E6E",
-"T c #181818",
-"U c #929292",
-"V c #7B7B7B",
-"W c #A5A5A5",
-"X c #7C7C7C",
-"Y c #C8C8C8",
-"Z c #F5F5F5",
-" ",
-" ",
-".++@#$++% ",
-"&*==-;==>, ",
-" '==)!~=={ ",
-" ]^==/(_==: ",
-" -===<[==},|1111111",
-" 2==3!4==567======",
-" 89==0a_==bcdddddd",
-" e==7fg==}h ",
-" fi==jk====lmnoooo",
-" p==q!r=====st====",
-" u==7vw==dx==y!zAAA",
-" BC==DE==*FGH==I ",
-" J==K!L==M N*==O ",
-"|==7PQ==R] S==T# ",
-"UVVW#XVVY ZtVVF ",
-" ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f12b.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f12b.xpm
deleted file mode 100644
index e6da765..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f12b.xpm
+++ /dev/null
@@ -1,125 +0,0 @@
-/* XPM */
-static char * font_mfizz_f12b_xpm[] = {
-"21 21 101 2",
-" c #FFFFFF",
-". c #EBEBEB",
-"+ c #D5D5D5",
-"@ c #B3B3B3",
-"# c #B5B5B5",
-"$ c #919191",
-"% c #F2F2F2",
-"& c #313131",
-"* c #E4E4E4",
-"= c #333333",
-"- c #848484",
-"; c #D6D6D6",
-"> c #939393",
-", c #EEEEEE",
-"' c #D4D4D4",
-") c #1A1A1A",
-"! c #808080",
-"~ c #686868",
-"{ c #646464",
-"] c #F3F3F3",
-"^ c #292929",
-"/ c #6E6E6E",
-"( c #555555",
-"_ c #FDFDFD",
-": c #0D0D0D",
-"< c #D3D3D3",
-"[ c #2E2E2E",
-"} c #828282",
-"| c #8C8C8C",
-"1 c #7F7F7F",
-"2 c #080808",
-"3 c #E0E0E0",
-"4 c #6B6B6B",
-"5 c #E3E3E3",
-"6 c #161616",
-"7 c #C5C5C5",
-"8 c #F9F9F9",
-"9 c #FBFBFB",
-"0 c #DEDEDE",
-"a c #707070",
-"b c #878787",
-"c c #CDCDCD",
-"d c #868686",
-"e c #E1E1E1",
-"f c #BBBBBB",
-"g c #8B8B8B",
-"h c #CCCCCC",
-"i c #525252",
-"j c #3E3E3E",
-"k c #414141",
-"l c #444444",
-"m c #7A7A7A",
-"n c #6A6A6A",
-"o c #959595",
-"p c #CECECE",
-"q c #999999",
-"r c #ADADAD",
-"s c #A4A4A4",
-"t c #E8E8E8",
-"u c #A1A1A1",
-"v c #4C4C4C",
-"w c #F5F5F5",
-"x c #F8F8F8",
-"y c #5A5A5A",
-"z c #5E5E5E",
-"A c #676767",
-"B c #858585",
-"C c #B4B4B4",
-"D c #BABABA",
-"E c #BEBEBE",
-"F c #484848",
-"G c #575757",
-"H c #515151",
-"I c #373737",
-"J c #6F6F6F",
-"K c #A3A3A3",
-"L c #5D5D5D",
-"M c #9D9D9D",
-"N c #E7E7E7",
-"O c #A5A5A5",
-"P c #888888",
-"Q c #898989",
-"R c #ACACAC",
-"S c #EDEDED",
-"T c #E9E9E9",
-"U c #F7F7F7",
-"V c #3C3C3C",
-"W c #454545",
-"X c #545454",
-"Y c #4E4E4E",
-"Z c #535353",
-"` c #585858",
-" . c #717171",
-".. c #FEFEFE",
-"+. c #B2B2B2",
-"@. c #7B7B7B",
-"#. c #626262",
-"$. c #595959",
-"%. c #5F5F5F",
-"&. c #5B5B5B",
-"*. c #818181",
-" . ",
-" + @ ",
-" # $ ",
-" % & + ",
-" * = - ; > , ",
-" ' ) ! ~ { ] ",
-" ^ ! / ( ",
-" _ : < [ / ",
-" } | 1 2 3 ",
-" _ 4 5 6 7 8 9 ",
-" 0 a b c _ @ d e f g = h ",
-" @ i j k k l i m ; n o ",
-" p & q r s d ! t u v w ",
-" x > y z A B C D E ",
-" F = G H I J x ",
-" K L M N O P Q R S T g U ",
-" a V V W X y ( Y Z ` ( .C ",
-" ..+.@.#.$.y %.&.` *.< ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f148.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f148.xpm
deleted file mode 100644
index e9ecbfb..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f148.xpm
+++ /dev/null
@@ -1,124 +0,0 @@
-/* XPM */
-static char * font_mfizz_f148_xpm[] = {
-"21 21 100 2",
-" c #FFFFFF",
-". c #F8F8F8",
-"+ c #B5B5B5",
-"@ c #878787",
-"# c #AFAFAF",
-"$ c #FDFDFD",
-"% c #FAFAFA",
-"& c #D9D9D9",
-"* c #8D8D8D",
-"= c #303030",
-"- c #797979",
-"; c #BBBBBB",
-"> c #191919",
-", c #000000",
-"' c #5C5C5C",
-") c #272727",
-"! c #B3B3B3",
-"~ c #E0E0E0",
-"{ c #121212",
-"] c #CBCBCB",
-"^ c #C9C9C9",
-"/ c #505050",
-"( c #6F6F6F",
-"_ c #1E1E1E",
-": c #3D3D3D",
-"< c #525252",
-"[ c #757575",
-"} c #989898",
-"| c #010101",
-"1 c #848484",
-"2 c #1A1A1A",
-"3 c #ABABAB",
-"4 c #040404",
-"5 c #0B0B0B",
-"6 c #E5E5E5",
-"7 c #444444",
-"8 c #404040",
-"9 c #FCFCFC",
-"0 c #898989",
-"a c #101010",
-"b c #A1A1A1",
-"c c #D4D4D4",
-"d c #2C2C2C",
-"e c #393939",
-"f c #E4E4E4",
-"g c #C6C6C6",
-"h c #070707",
-"i c #535353",
-"j c #141414",
-"k c #222222",
-"l c #2B2B2B",
-"m c #020202",
-"n c #DFDFDF",
-"o c #545454",
-"p c #AEAEAE",
-"q c #050505",
-"r c #0F0F0F",
-"s c #FEFEFE",
-"t c #313131",
-"u c #8C8C8C",
-"v c #656565",
-"w c #C0C0C0",
-"x c #D0D0D0",
-"y c #5D5D5D",
-"z c #E3E3E3",
-"A c #F5F5F5",
-"B c #424242",
-"C c #343434",
-"D c #E7E7E7",
-"E c #3A3A3A",
-"F c #9C9C9C",
-"G c #C1C1C1",
-"H c #D2D2D2",
-"I c #767676",
-"J c #6E6E6E",
-"K c #616161",
-"L c #CDCDCD",
-"M c #B7B7B7",
-"N c #858585",
-"O c #8E8E8E",
-"P c #F4F4F4",
-"Q c #494949",
-"R c #F9F9F9",
-"S c #7B7B7B",
-"T c #E2E2E2",
-"U c #686868",
-"V c #969696",
-"W c #AAAAAA",
-"X c #939393",
-"Y c #060606",
-"Z c #212121",
-"` c #4B4B4B",
-" . c #F6F6F6",
-".. c #EAEAEA",
-"+. c #BDBDBD",
-"@. c #EFEFEF",
-"#. c #BFBFBF",
-"$. c #B6B6B6",
-"%. c #FBFBFB",
-"&. c #3F3F3F",
-" . + @ # $ ",
-" % & * = - ; > , , , ' ",
-" ) , , , , ! ~ { , , , , , ] ",
-" ^ / , , , ( ; _ , , , , , , : $ ",
-" < , , , [ } | , , , , , , , , 1 ",
-" 2 , , , 3 4 , , , , , , , , , 5 6 ",
-" ) , , , 7 , , , , , , , , , , , 8 9 ",
-" / , , , , , , , , , , , , , , , | 0 ",
-" & a , , , , , , , , , , , , , , b / ",
-" c d , , , , , , , , , , e 5 , f / ",
-" % g ^ h , i j , k l m n o , p * ",
-" q r s t , u v d w , x $ ",
-" 2 y z , _ A 1 B C D ",
-" E F G , H I J K L ",
-" / M s N O P Q R S T ",
-" U 9 V 2 W X ",
-" $ < s * Y Z ` . ",
-" ..+. @.#.f $. %.&.c ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f15b.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f15b.xpm
deleted file mode 100644
index 4690db3..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f15b.xpm
+++ /dev/null
@@ -1,96 +0,0 @@
-/* XPM */
-static char * font_mfizz_f15b_xpm[] = {
-"20 21 72 1",
-" c #FFFFFF",
-". c #FDFDFD",
-"+ c #CCCCCC",
-"@ c #FEFEFE",
-"# c #E3E3E3",
-"$ c #B8B8B8",
-"% c #8A8A8A",
-"& c #565656",
-"* c #161616",
-"= c #3D3D3D",
-"- c #C3C3C3",
-"; c #A8A8A8",
-"> c #8C8C8C",
-", c #6D6D6D",
-"' c #4D4D4D",
-") c #2C2C2C",
-"! c #090909",
-"~ c #000000",
-"{ c #424242",
-"] c #474747",
-"^ c #636363",
-"/ c #0E0E0E",
-"( c #3A3A3A",
-"_ c #727272",
-": c #BBBBBB",
-"< c #212121",
-"[ c #393939",
-"} c #505050",
-"| c #696969",
-"1 c #848484",
-"2 c #A1A1A1",
-"3 c #C1C1C1",
-"4 c #E4E4E4",
-"5 c #D6D6D6",
-"6 c #929292",
-"7 c #707070",
-"8 c #EEEEEE",
-"9 c #CECECE",
-"0 c #AEAEAE",
-"a c #646464",
-"b c #0D0D0D",
-"c c #464646",
-"d c #292929",
-"e c #0C0C0C",
-"f c #484848",
-"g c #4A4A4A",
-"h c #020202",
-"i c #3B3B3B",
-"j c #060606",
-"k c #414141",
-"l c #8D8D8D",
-"m c #F0F0F0",
-"n c #FBFBFB",
-"o c #C6C6C6",
-"p c #B9B9B9",
-"q c #D0D0D0",
-"r c #E9E9E9",
-"s c #FCFCFC",
-"t c #DDDDDD",
-"u c #B2B2B2",
-"v c #111111",
-"w c #BEBEBE",
-"x c #666666",
-"y c #262626",
-"z c #050505",
-"A c #141414",
-"B c #787878",
-"C c #404040",
-"D c #585858",
-"E c #8B8B8B",
-"F c #C8C8C8",
-"G c #EBEBEB",
-" .+ ",
-" @#$%&*= ",
-"-;>,')!~~~~~{ ",
-"~~~~~~~~~~~~] ",
-"~~~~~~~~~~~~^ ",
-"~~~~~~~~/(_:@ ",
-"<[}|1234 @567 ",
-" 890%a[b~~c ",
-"cde~~~~~~~~~f ",
-"~~~~~~~~~~~~g ",
-"~~~~~~~~~~hi: ",
-"~~~~j<kal:mno ",
-"2pqr@ stu1}v= ",
-"w21xcyz~~~~~{ ",
-"~~~~~~~~~~~~] ",
-"~~~~~~~~~~~~x ",
-"~~~~~~~~AkB3 ",
-"dCD7E;FG ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f166.xpm b/elpa/mode-icons-20190627.2121/icons/font-mfizz-f166.xpm
deleted file mode 100644
index 1259fae..0000000
--- a/elpa/mode-icons-20190627.2121/icons/font-mfizz-f166.xpm
+++ /dev/null
@@ -1,130 +0,0 @@
-/* XPM */
-static char * font_mfizz_f166_xpm[] = {
-"20 21 106 2",
-" c #FFFFFF",
-". c #D0D0D0",
-"+ c #8C8C8C",
-"@ c #D1D1D1",
-"# c #050505",
-"$ c #000000",
-"% c #060606",
-"& c #D4D4D4",
-"* c #F5F5F5",
-"= c #A0A0A0",
-"- c #4D4D4D",
-"; c #282828",
-"> c #161616",
-", c #484848",
-"' c #898989",
-") c #8D8D8D",
-"! c #E1E1E1",
-"~ c #BFBFBF",
-"{ c #030303",
-"] c #878787",
-"^ c #A8A8A8",
-"/ c #929292",
-"( c #0B0B0B",
-"_ c #DDDDDD",
-": c #474747",
-"< c #333333",
-"[ c #232323",
-"} c #585858",
-"| c #DFDFDF",
-"1 c #BABABA",
-"2 c #020202",
-"3 c #454545",
-"4 c #090909",
-"5 c #151515",
-"6 c #292929",
-"7 c #181818",
-"8 c #262626",
-"9 c #F4F4F4",
-"0 c #FDFDFD",
-"a c #C9C9C9",
-"b c #E6E6E6",
-"c c #F9F9F9",
-"d c #9E9E9E",
-"e c #111111",
-"f c #838383",
-"g c #BEBEBE",
-"h c #FBFBFB",
-"i c #D5D5D5",
-"j c #0F0F0F",
-"k c #1B1B1B",
-"l c #FEFEFE",
-"m c #252525",
-"n c #222222",
-"o c #8F8F8F",
-"p c #E5E5E5",
-"q c #909090",
-"r c #D6D6D6",
-"s c #202020",
-"t c #141414",
-"u c #818181",
-"v c #434343",
-"w c #EAEAEA",
-"x c #1A1A1A",
-"y c #171717",
-"z c #C1C1C1",
-"A c #9B9B9B",
-"B c #A9A9A9",
-"C c #A7A7A7",
-"D c #E9E9E9",
-"E c #3A3A3A",
-"F c #F2F2F2",
-"G c #8B8B8B",
-"H c #4E4E4E",
-"I c #EDEDED",
-"J c #0D0D0D",
-"K c #DEDEDE",
-"L c #FCFCFC",
-"M c #727272",
-"N c #464646",
-"O c #666666",
-"P c #E3E3E3",
-"Q c #757575",
-"R c #B1B1B1",
-"S c #8E8E8E",
-"T c #2D2D2D",
-"U c #010101",
-"V c #C6C6C6",
-"W c #F1F1F1",
-"X c #969696",
-"Y c #0A0A0A",
-"Z c #313131",
-"` c #121212",
-" . c #808080",
-".. c #6B6B6B",
-"+. c #3F3F3F",
-"@. c #494949",
-"#. c #0C0C0C",
-"$. c #C7C7C7",
-"%. c #1D1D1D",
-"&. c #949494",
-"*. c #888888",
-"=. c #9F9F9F",
-"-. c #ACACAC",
-";. c #D9D9D9",
-">. c #070707",
-",. c #D3D3D3",
-" . + . ",
-" @ # $ % & ",
-" * = - ; > , ' $ $ $ ) ",
-" ! ~ $ $ $ $ { ] $ $ $ ^ ",
-" / ( _ : $ $ $ $ < : [ } | ",
-" 1 2 $ 3 _ 4 5 6 ( $ $ 7 % 8 9 ",
-" 0 8 $ $ $ a b c d e $ $ $ f ",
-" g $ $ $ , h i j $ $ k l ",
-"g m n o ( $ % p q $ $ $ r ",
-"s $ $ t u $ v w x y y z ",
-"# $ $ $ A $ } 0 B C C D ",
-", $ $ E 3 $ [ a $ $ $ z ",
-"F G ' = $ $ $ B H $ $ 2 I ",
-" p { $ $ J K L M $ $ $ N ",
-" O $ $ J P Q d R S T $ $ $ U V ",
-" W ; $ X o $ $ $ $ $ Y Z ` . ",
-" b ..K ( $ $ $ $ +.@.#.3 F ",
-" $.%.$ $ $ 2 &.$ $ $ *. ",
-" l V =.) -.X $ $ $ M ",
-" ;.>.$ U g ",
-" ,.G V "};
diff --git a/elpa/mode-icons-20190627.2121/icons/github-octicons-f0c9.xpm b/elpa/mode-icons-20190627.2121/icons/github-octicons-f0c9.xpm
deleted file mode 100644
index 6809c86..0000000
--- a/elpa/mode-icons-20190627.2121/icons/github-octicons-f0c9.xpm
+++ /dev/null
@@ -1,64 +0,0 @@
-/* XPM */
-static char * github_octicons_f0c9_xpm[] = {
-"21 20 41 1",
-" c #FFFFFF",
-". c #D8D8D8",
-"+ c #848484",
-"@ c #7F7F7F",
-"# c #1F1F1F",
-"$ c #000000",
-"% c #1D1D1D",
-"& c #FEFEFE",
-"* c #FBFBFB",
-"= c #5F5F5F",
-"- c #9F9F9F",
-"; c #434343",
-"> c #F4F4F4",
-", c #292929",
-"' c #D9D9D9",
-") c #F8F8F8",
-"! c #111111",
-"~ c #3F3F3F",
-"{ c #727272",
-"] c #3E3E3E",
-"^ c #020202",
-"/ c #6A6A6A",
-"( c #F6F6F6",
-"_ c #717171",
-": c #050505",
-"< c #CBCBCB",
-"[ c #939393",
-"} c #A2A2A2",
-"| c #616161",
-"1 c #222222",
-"2 c #F1F1F1",
-"3 c #CCCCCC",
-"4 c #060606",
-"5 c #030303",
-"6 c #575757",
-"7 c #F0F0F0",
-"8 c #999999",
-"9 c #535353",
-"0 c #040404",
-"a c #FCFCFC",
-"b c #707070",
-" ",
-" ",
-" ",
-".+@@@@@@@@@@@@@@@@+. ",
-"#$$$$$$$$$$$$$$$$$$%&",
-"$$$$$$$$$$$$$$$$$$$$*",
-"$$@ =$$- $$@ ;$$$*",
-"$$@ >,= $$@ ;$$$*",
-"$$@ '> $$@ ;$$$*",
-"$$@ ) ) !~- {]^$*",
-"$$@ / (_ :< [$$*",
-"$$@ $}|~ $12 34$$*",
-"$$@ $5$~ $$6&71$$$*",
-"$$~@@$$$#@@$$$89$$$$*",
-"0$$$$$$$$$$$$$^$$$$^a",
-"{0$$$$$$$$$$$$$$$$5b ",
-" ",
-" ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/go.xpm b/elpa/mode-icons-20190627.2121/icons/go.xpm
deleted file mode 100644
index 326bd27..0000000
--- a/elpa/mode-icons-20190627.2121/icons/go.xpm
+++ /dev/null
@@ -1,113 +0,0 @@
-/* XPM */
-static char * favicon_golang_xpm[] = {
-"16 16 94 2",
-" c None",
-". c #3E616A",
-"+ c #45727E",
-"@ c #3A545B",
-"# c #3A545C",
-"$ c #579CAE",
-"% c #579CAF",
-"& c #5BA8BD",
-"* c #4D8392",
-"= c #3A5259",
-"- c #3B565D",
-"; c #3C5961",
-"> c #5AA3B7",
-", c #5CA6BB",
-"' c #3E626B",
-") c #90D3E7",
-"! c #A9E6F8",
-"~ c #90E3FC",
-"{ c #77E1FD",
-"] c #8EE3FC",
-"^ c #B3E8F8",
-"/ c #A6D8E7",
-"( c #3F626B",
-"_ c #59A0B4",
-": c #5FAEC4",
-"< c #3F636C",
-"[ c #62B4CA",
-"} c #6DCAE3",
-"| c #ADE5F7",
-"1 c #EBF4F6",
-"2 c #F9FCFD",
-"3 c #EFFBFF",
-"4 c #A2E9FE",
-"5 c #94E6FD",
-"6 c #E1F2F7",
-"7 c #F7FAFA",
-"8 c #FAFEFF",
-"9 c #D4F1FB",
-"0 c #77CFE7",
-"a c #64B8CF",
-"b c #45707C",
-"c c #78CEE6",
-"d c #A7C4CD",
-"e c #383838",
-"f c #D6D6D6",
-"g c #FFFFFF",
-"h c #D4F4FF",
-"i c #ACDBEA",
-"j c #393939",
-"k c #ABAAAA",
-"l c #FBFBFB",
-"m c #F8FDFF",
-"n c #95D6E9",
-"o c #487987",
-"p c #406670",
-"q c #7BD6EF",
-"r c #A8C5CE",
-"s c #D7D6D6",
-"t c #FEFFFF",
-"u c #D1EEF8",
-"v c #A9D5E3",
-"w c #ACABAB",
-"x c #96DBEF",
-"y c #416873",
-"z c #74D9F5",
-"A c #ADE9FB",
-"B c #EBF4F7",
-"C c #F9FCFC",
-"D c #EDEDED",
-"E c #6B6B6B",
-"F c #DFE1E0",
-"G c #F7F9FA",
-"H c #7BDBF5",
-"I c #72D9F5",
-"J c #79E2FE",
-"K c #96E7FE",
-"L c #ACE7F9",
-"M c #B9A7A0",
-"N c #A17867",
-"O c #9F7766",
-"P c #BAA39A",
-"Q c #B6E7F7",
-"R c #AAEBFE",
-"S c #82E3FE",
-"T c #76E1FE",
-"U c #76DFFB",
-"V c #B9A7A1",
-"W c #D0CBC9",
-"X c #D5CECB",
-"Y c #76DEFA",
-"Z c #79DFFB",
-"` c #BCE8F6",
-" . c #7BDFFB",
-".. c #75DEFB",
-" . . . . . . ",
-"+ @ # . $ % & & % * . = - + ",
-"; > , ' ) ! ~ { { ] ^ / ( _ : < ",
-". [ } | 1 2 3 4 5 6 7 8 9 0 a b ",
-" + c d e f g h i j k l m n o ",
-" p q r e s t u v j w l m x p ",
-" y z A B C D E j F G 8 h H y ",
-" y I J K L M N O P Q R S I y ",
-" y I T T U V W X V Y T T I y ",
-" y I T T T Z ` ` .T T T I y ",
-" y I T T T T ....T T T T I y ",
-" y I T T T T T T T T T T I y ",
-" y I T T T T T T T T T T I y ",
-" y I T T T T T T T T T T I y ",
-" y I T T T T T T T T T T I y ",
-" y I T T T T T T T T T T I y "};
diff --git a/elpa/mode-icons-20190627.2121/icons/golden.xpm b/elpa/mode-icons-20190627.2121/icons/golden.xpm
deleted file mode 100644
index 7e7ef28..0000000
--- a/elpa/mode-icons-20190627.2121/icons/golden.xpm
+++ /dev/null
@@ -1,103 +0,0 @@
-/* XPM */
-static char * e:\EmacsPortable_App\Data\src\mode_icons\icons\golden_xpm[] = {
-"25 16 84 1",
-" c None",
-". c #000000",
-"+ c #010101",
-"@ c #1B1B1B",
-"# c #505050",
-"$ c #4F4F4F",
-"% c #1F1F1F",
-"& c #020202",
-"* c #1E1E1E",
-"= c #303030",
-"- c #404040",
-"; c #434343",
-"> c #323232",
-", c #141414",
-"' c #090909",
-") c #FFFFFF",
-"! c #B1B1B1",
-"~ c #3A3A3A",
-"{ c #272727",
-"] c #717171",
-"^ c #B8B8B8",
-"/ c #FCFCFC",
-"( c #F6F6F6",
-"_ c #939393",
-": c #030303",
-"< c #595959",
-"[ c #F3F3F3",
-"} c #171717",
-"| c #878787",
-"1 c #101010",
-"2 c #767676",
-"3 c #F2F2F2",
-"4 c #F7F7F7",
-"5 c #585858",
-"6 c #575757",
-"7 c #6F6F6F",
-"8 c #060606",
-"9 c #333333",
-"0 c #CBCBCB",
-"a c #646464",
-"b c #858585",
-"c c #414141",
-"d c #FAFAFA",
-"e c #343434",
-"f c #0D0D0D",
-"g c #ECECEC",
-"h c #959595",
-"i c #3E3E3E",
-"j c #373737",
-"k c #D3D3D3",
-"l c #F4F4F4",
-"m c #080808",
-"n c #FEFEFE",
-"o c #F1F1F1",
-"p c #111111",
-"q c #292929",
-"r c #8B8B8B",
-"s c #252525",
-"t c #464646",
-"u c #161616",
-"v c #6E6E6E",
-"w c #BBBBBB",
-"x c #0B0B0B",
-"y c #8D8D8D",
-"z c #131313",
-"A c #040404",
-"B c #C5C5C5",
-"C c #747474",
-"D c #CDCDCD",
-"E c #BABABA",
-"F c #E6E6E6",
-"G c #181818",
-"H c #808080",
-"I c #B5B5B5",
-"J c #5D5D5D",
-"K c #2B2B2B",
-"L c #E5E5E5",
-"M c #606060",
-"N c #0A0A0A",
-"O c #232323",
-"P c #0E0E0E",
-"Q c #0F0F0F",
-"R c #212121",
-"S c #1C1C1C",
-".+++++++++++++++++++++++.",
-"+@#####$%..&*=-;>,..*##'.",
-"+-))))!~+{]^/))))(_>:<[}.",
-"+-)))|1@23)))))))))45:6}.",
-"+-))7890)))))))))))))a:'.",
-"+-)b8c3))))))))))))))de..",
-"+-!f>g))))))))))))))))h..",
-"+ij}k)))))))))))))))))lm.",
-"+}.2))))))))))))no)))))p.",
-"+.q()))))))))))rs1t4)))u.",
-"+.v)))))))))))wxe#.y)))z.",
-"+AB)))))))))))C:D4#E))F8.",
-"+Gn)))))))))))H.I)))))J..",
-"+K))))))))))))0pcg))LM:A.",
-"+NOOOOOOOOOOOOOP.QRSm.8A.",
-"........................."};
diff --git a/elpa/mode-icons-20190627.2121/icons/haml.xpm b/elpa/mode-icons-20190627.2121/icons/haml.xpm
deleted file mode 100644
index 2ff878c..0000000
--- a/elpa/mode-icons-20190627.2121/icons/haml.xpm
+++ /dev/null
@@ -1,96 +0,0 @@
-/* XPM */
-static char * haml_xpm[] = {
-"16 16 77 1",
-" c None",
-". c #6A674E",
-"+ c #0E0E0D",
-"@ c #6A664D",
-"# c #373528",
-"$ c #050504",
-"% c #C0B88E",
-"& c #746F53",
-"* c #DBD29E",
-"= c #353326",
-"- c #BFB889",
-"; c #474434",
-"> c #ABA47A",
-", c #B8B084",
-"' c #B1AB84",
-") c #868060",
-"! c #A59E77",
-"~ c #3E3C2D",
-"{ c #A59D77",
-"] c #ECE2A9",
-"^ c #A29C79",
-"/ c #C3BA8B",
-"( c #F5EBB0",
-"_ c #7B7659",
-": c #171717",
-"< c #605C45",
-"[ c #E3DAA2",
-"} c #E0D7A5",
-"| c #A29C77",
-"1 c #D0C795",
-"2 c #F2E8AD",
-"3 c #726D52",
-"4 c #09090C",
-"5 c #EFE6AF",
-"6 c #8D8765",
-"7 c #E9DFA7",
-"8 c #EBE1A8",
-"9 c #9E9772",
-"0 c #0A0A0A",
-"a c #99926D",
-"b c #F1E7AD",
-"c c #F4E9AE",
-"d c #605D47",
-"e c #101010",
-"f c #020202",
-"g c #9E9771",
-"h c #D2CA9B",
-"i c #080808",
-"j c #CDC69A",
-"k c #AAA37A",
-"l c #E7DEA6",
-"m c #817C61",
-"n c #030405",
-"o c #060606",
-"p c #5D5943",
-"q c #EAE0A8",
-"r c #2D2B21",
-"s c #959595",
-"t c #919191",
-"u c #424242",
-"v c #6A664C",
-"w c #E4DBA4",
-"x c #3A392F",
-"y c #CACACA",
-"z c #B5B5B5",
-"A c #D0C794",
-"B c #DCD29D",
-"C c #B3AC82",
-"D c #E4DAA3",
-"E c #CBC291",
-"F c #9F9872",
-"G c #9A9371",
-"H c #E8DEA6",
-"I c #C7BE8E",
-"J c #817B5E",
-"K c #7B7558",
-"L c #5A5641",
-" .+ ",
-" @#$ ",
-" %&* =-; ",
-" >,' )!~ ",
-" {] ^/(_: ",
-" <[}|1234 ",
-" 567889 0 ",
-" abcd ef ",
-" g]h i ",
-" jklmn o ",
-" p7qr stu ",
-" v(wx yz ",
-" ABC ",
-" DEF ",
-" GH7I ",
-" JKL "};
diff --git a/elpa/mode-icons-20190627.2121/icons/helm.xpm b/elpa/mode-icons-20190627.2121/icons/helm.xpm
deleted file mode 100644
index c771d5e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/helm.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * C:\tmp\EmacsPortable_App\Data\src\mode_icons\icons\helm_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" .. ",
-" .. ",
-" .. .... .. ",
-" ............ ",
-" ... ... ",
-" .. .. ",
-" .. .. .. ",
-".... .... ....",
-".... .... ....",
-" .. .. .. ",
-" .. .. ",
-" ... ... ",
-" ............ ",
-" .. .... .. ",
-" .. ",
-" .. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/hs.xpm b/elpa/mode-icons-20190627.2121/icons/hs.xpm
deleted file mode 100644
index 488a8eb..0000000
--- a/elpa/mode-icons-20190627.2121/icons/hs.xpm
+++ /dev/null
@@ -1,119 +0,0 @@
-/* XPM */
-static char * hs_xpm[] = {
-"16 16 100 2",
-" c None",
-". c #000000",
-"+ c #363636",
-"@ c #BCBCBC",
-"# c #B4B4B4",
-"$ c #B3B3B4",
-"% c #B3B3B3",
-"& c #414141",
-"* c #B7B7B7",
-"= c #F5F5F5",
-"- c #F1F1F1",
-"; c #F4F4F3",
-"> c #969FCC",
-", c #62814B",
-"' c #4C6863",
-") c #E3E5EA",
-"! c #F2F2F2",
-"~ c #9F9F9F",
-"{ c #030303",
-"] c #F1F0EE",
-"^ c #F7F6F1",
-"/ c #8C98B6",
-"( c #79A100",
-"_ c #527719",
-": c #E4E6E5",
-"< c #F4F3EF",
-"[ c #EFEFEE",
-"} c #EDEDED",
-"| c #9C9C9C",
-"1 c #F6F6F3",
-"2 c #8E98C7",
-"3 c #7180A0",
-"4 c #506583",
-"5 c #79A000",
-"6 c #5C801E",
-"7 c #6B7C9A",
-"8 c #6C7BA1",
-"9 c #BEC2D8",
-"0 c #EEEEEE",
-"a c #F9F8F7",
-"b c #425A7C",
-"c c #80A900",
-"d c #7DA500",
-"e c #789F00",
-"f c #7AA200",
-"g c #7CA400",
-"h c #6E9600",
-"i c #9FABAB",
-"j c #F9F8F5",
-"k c #4659A3",
-"l c #4D6C42",
-"m c #4F6E3E",
-"n c #6A8F13",
-"o c #4C6B44",
-"p c #415F4C",
-"q c #9AA4BF",
-"r c #F3F2F0",
-"s c #F2F0FA",
-"t c #828EB9",
-"u c #7BA300",
-"v c #54781C",
-"w c #DEDFEB",
-"x c #F0EEF6",
-"y c #F0EFEF",
-"z c #7F89C0",
-"A c #547526",
-"B c #2E4E3D",
-"C c #DEE0E6",
-"D c #EEEEED",
-"E c #F4F5F3",
-"F c #B9B4CD",
-"G c #B29BB5",
-"H c #AF98B4",
-"I c #977FB4",
-"J c #9E87B3",
-"K c #B19BB5",
-"L c #B09BB5",
-"M c #C5C1D4",
-"N c #F8FCF9",
-"O c #763F71",
-"P c #9D000D",
-"Q c #9A0013",
-"R c #9B0014",
-"S c #9B0013",
-"T c #9A0012",
-"U c #99000E",
-"V c #8E668F",
-"W c #F0F0EF",
-"X c #F9FAF7",
-"Y c #75689F",
-"Z c #763061",
-"` c #753264",
-" . c #723063",
-".. c #9184AF",
-"+. c #9B9B9B",
-"@. c #9E9E9E",
-"#. c #A4A5A1",
-"$. c #A4A8A5",
-"%. c #A2A3A0",
-"&. c #454545",
-" ",
-" . . . . . . . . . . . . . ",
-" . + @ # # $ % % # # # % & . ",
-" . * = - ; > , ' ) - - ! ~ { ",
-" . # - ] ^ / ( _ : < [ } | { ",
-" . # 1 2 3 4 5 6 7 8 9 0 | { ",
-" . # a b c d e f g h i 0 | { ",
-" . # j k l m 5 n o p q 0 | { ",
-" . # - r s t u v w x y } | { ",
-" . # - 0 r z A B C [ D } | { ",
-" . # E F G H I J K L M 0 | { ",
-" . # N O P Q R S T U V W | { ",
-" . % X Y Z ` ` ` ` ...W +.{ ",
-" . & @.#.$.$.$.$.$.$.%.+.&.. ",
-" . . { { { { { { { { { { . ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/html.xpm b/elpa/mode-icons-20190627.2121/icons/html.xpm
deleted file mode 100644
index 5d8089f..0000000
--- a/elpa/mode-icons-20190627.2121/icons/html.xpm
+++ /dev/null
@@ -1,117 +0,0 @@
-/* XPM */
-static char * html_xpm[] = {
-"15 16 98 2",
-" c None",
-". c #E44D26",
-"+ c #E34C25",
-"@ c #E34B25",
-"# c #EA5827",
-"$ c #F06328",
-"% c #E75227",
-"& c #E45A36",
-"* c #E45935",
-"= c #EB6538",
-"- c #F2713A",
-"; c #F2723B",
-"> c #F16428",
-", c #E65226",
-"' c #E3431A",
-") c #EBF4F7",
-"! c #EBF2F4",
-"~ c #EAF2F3",
-"{ c #F8FFFF",
-"] c #FFFFFF",
-"^ c #F05D1C",
-"/ c #E44E26",
-"( c #E3451C",
-"_ c #EAE0DD",
-": c #EBECED",
-"< c #E9CBC3",
-"[ c #E9C8BF",
-"} c #F4D5CA",
-"| c #FBDDD0",
-"1 c #FBD4C3",
-"2 c #F16021",
-"3 c #E3481F",
-"4 c #E9C7BE",
-"5 c #E4532D",
-"6 c #EA5420",
-"7 c #F06022",
-"8 c #F16529",
-"9 c #E34921",
-"0 c #E8BAAE",
-"a c #EBEDED",
-"b c #E8AE9F",
-"c c #E79B88",
-"d c #F1A88F",
-"e c #F8B294",
-"f c #F5966D",
-"g c #F06226",
-"h c #E34A23",
-"i c #E8B1A3",
-"j c #EBEDEE",
-"k c #EAEDED",
-"l c #F8FAFB",
-"m c #FEFEFE",
-"n c #F9C0A7",
-"o c #EE5E26",
-"p c #E56544",
-"q c #E67E63",
-"r c #E68268",
-"s c #E6856C",
-"t c #EF9272",
-"u c #F69C76",
-"v c #F9C4AD",
-"w c #ED5D28",
-"x c #E68167",
-"y c #EAE1DE",
-"z c #E7957F",
-"A c #EA5927",
-"B c #F7B193",
-"C c #F69E78",
-"D c #EB5C28",
-"E c #E67D62",
-"F c #EBEEEF",
-"G c #E9C5BC",
-"H c #E56F50",
-"I c #E9511C",
-"J c #F38556",
-"K c #F59167",
-"L c #E57153",
-"M c #EBF6F8",
-"N c #EBECEC",
-"O c #EAEFF0",
-"P c #F48656",
-"Q c #E95627",
-"R c #E56746",
-"S c #E79681",
-"T c #F8FCFD",
-"U c #F7AC8C",
-"V c #F37B47",
-"W c #F06224",
-"X c #E75426",
-"Y c #E44C25",
-"Z c #E94F1B",
-"` c #F16528",
-" . c #EE6028",
-".. c #E54F26",
-"+. c #E95727",
-"@. c #EB5B27",
-"#. c #E75326",
-"$. c #E34C26",
-". . . . . . . + @ @ @ @ @ + . ",
-". . . . . . . # $ $ $ $ $ % . ",
-" . + & * * * = - - - ; > , ",
-" . ' ) ! ! ~ { ] ] ] ] ^ / ",
-" . ( _ : < [ } | | | 1 2 + ",
-" . 3 4 ! 5 3 6 7 7 7 7 8 @ ",
-" . 9 0 a b c d e e e f g @ ",
-" . h i j j k l ] ] m n o + ",
-" . . p q r s t u v ] e w + ",
-" . . x y z . A 8 B ] C D + ",
-" . . E F G H I J | ] K # . ",
-" . . L M N O { ] ] ] P Q . ",
-" . 9 R S [ T | U V W X ",
-" . . . Y 3 Z 7 ` 8 ... ",
-" . . . . . +.@.#.$.+ $. ",
-" . . + + . "};
diff --git a/elpa/mode-icons-20190627.2121/icons/icy.xpm b/elpa/mode-icons-20190627.2121/icons/icy.xpm
deleted file mode 100644
index 4751671..0000000
--- a/elpa/mode-icons-20190627.2121/icons/icy.xpm
+++ /dev/null
@@ -1,107 +0,0 @@
-/* XPM */
-static char * e:\EmacsPortable_App\Data\src\mode_icons\icons\icy_xpm[] = {
-"18 16 88 1",
-" c None",
-". c #777C80",
-"+ c #5F6C76",
-"@ c #62717B",
-"# c #898887",
-"$ c #767574",
-"% c #A6E4FF",
-"& c #A0DCFF",
-"* c #A1DEFF",
-"= c #A1DDFF",
-"- c #8ABFE5",
-"; c #557992",
-"> c #9CD6FF",
-", c #84B5D8",
-"' c #97CFF6",
-") c #85B6D8",
-"! c #9ED9FF",
-"~ c #9BD5FE",
-"{ c #98D1F9",
-"] c #5E8098",
-"^ c #97D0F9",
-"/ c #364047",
-"( c #729CB9",
-"_ c #95CDF4",
-": c #50728A",
-"< c #303940",
-"[ c #99D3FB",
-"} c #595A5C",
-"| c #729AB6",
-"1 c #65737D",
-"2 c #3B505F",
-"3 c #55768D",
-"4 c #666361",
-"5 c #46667C",
-"6 c #959290",
-"7 c #4F6270",
-"8 c #405A6C",
-"9 c #213340",
-"0 c #949799",
-"a c #91C8EF",
-"b c #596F80",
-"c c #777E84",
-"d c #5C676F",
-"e c #2F4351",
-"f c #F4F4F3",
-"g c #000000",
-"h c #2B2B2B",
-"i c #16191B",
-"j c #9DD7FF",
-"k c #454E54",
-"l c #344451",
-"m c #404649",
-"n c #939699",
-"o c #7F8283",
-"p c #A4E1FF",
-"q c #090E14",
-"r c #616161",
-"s c #4B4D4D",
-"t c #9CD7FF",
-"u c #7D8285",
-"v c #373636",
-"w c #96D0F9",
-"x c #9AD4FC",
-"y c #36393A",
-"z c #C8C8C8",
-"A c #828384",
-"B c #989898",
-"C c #6087A2",
-"D c #98D0F8",
-"E c #737475",
-"F c #BABABB",
-"G c #74A1C0",
-"H c #2C4150",
-"I c #95CDF5",
-"J c #B3B4B4",
-"K c #415A6D",
-"L c #384147",
-"M c #93CAF1",
-"N c #11191D",
-"O c #739EBC",
-"P c #393939",
-"Q c #B1B2B3",
-"R c #57748A",
-"S c #888888",
-"T c #2E3C46",
-"U c #010203",
-"V c #3E3E3D",
-"W c #C3C3C3",
-".+++++++++++++++@#",
-"$%&&&&&&&&*&&=&&- ",
-" ;>,')!~>{]^/(_>: ",
-" <[}|12>>345678>9 ",
-" 0a bcd&>efg hijk ",
-" l mnop>q r stu ",
-" r v wxy z A! ",
-" B CDE FG ",
-" HIJ K ",
-" LM N ",
-" .O P ",
-" QR S ",
-" T ",
-" U ",
-" V ",
-" W "};
diff --git a/elpa/mode-icons-20190627.2121/icons/infruby.xpm b/elpa/mode-icons-20190627.2121/icons/infruby.xpm
deleted file mode 100644
index e0cfba7..0000000
--- a/elpa/mode-icons-20190627.2121/icons/infruby.xpm
+++ /dev/null
@@ -1,243 +0,0 @@
-/* XPM */
-static char * inf_ruby_xpm[] = {
-"32 16 224 2",
-" c None",
-". c #E47A70",
-"+ c #E98B80",
-"@ c #DB6D63",
-"# c #C21609",
-"$ c #AA0C02",
-"% c #8F1008",
-"& c #090909",
-"* c #080808",
-"= c #DFA49C",
-"- c #C7463D",
-"; c #BE1002",
-"> c #C50600",
-", c #D31F12",
-"' c #E9A49A",
-") c #B8413A",
-"! c #9B0902",
-"~ c #8F120A",
-"{ c #80180E",
-"] c #070707",
-"^ c #616161",
-"/ c #6B6B6B",
-"( c #6C6C6C",
-"_ c #6D6D6D",
-": c #6E6E6E",
-"< c #626262",
-"[ c #CA6A62",
-"} c #B21F14",
-"| c #AD0500",
-"1 c #B71401",
-"2 c #BF1802",
-"3 c #CA2312",
-"4 c #E98976",
-"5 c #D45D4A",
-"6 c #A8170C",
-"7 c #92120C",
-"8 c #85130C",
-"9 c #3E3E3E",
-"0 c #303030",
-"a c #404040",
-"b c #313131",
-"c c #323232",
-"d c #3F3F3F",
-"e c #C76B62",
-"f c #AD1E16",
-"g c #A90C00",
-"h c #AF1501",
-"i c #B11401",
-"j c #B40D00",
-"k c #C83826",
-"l c #CC3926",
-"m c #C11803",
-"n c #BA1A09",
-"o c #991309",
-"p c #7F110A",
-"q c #3A3A3A",
-"r c #515151",
-"s c #D3D3D3",
-"t c #828282",
-"u c #2D2D2D",
-"v c #2F2F2F",
-"w c #2C2C2C",
-"x c #A9291C",
-"y c #A40D00",
-"z c #AA1601",
-"A c #AC1501",
-"B c #AD1000",
-"C c #B2190D",
-"D c #D4837C",
-"E c #AD1205",
-"F c #A90D00",
-"G c #A50F02",
-"H c #991004",
-"I c #8B0905",
-"J c #060606",
-"K c #363636",
-"L c #D8D8D8",
-"M c #3B3B3B",
-"N c #262626",
-"O c #2B2B2B",
-"P c #2A2A2A",
-"Q c #393939",
-"R c #9E352C",
-"S c #930600",
-"T c #A31701",
-"U c #A71701",
-"V c #A81200",
-"W c #A70A00",
-"X c #DC9386",
-"Y c #E3ABA1",
-"Z c #9B0200",
-"` c #A00A00",
-" . c #980D03",
-".. c #8A0F06",
-"+. c #930201",
-"@. c #A9A9A9",
-"#. c #BEBEBE",
-"$. c #252525",
-"%. c #292929",
-"&. c #282828",
-"*. c #373737",
-"=. c #8B0D02",
-"-. c #8A0D00",
-";. c #9A1401",
-">. c #A01000",
-",. c #A31203",
-"'. c #CC6453",
-"). c #E5775B",
-"!. c #D6573B",
-"~. c #9F1306",
-"{. c #940B01",
-"]. c #920F05",
-"^. c #8E0B05",
-"/. c #980000",
-"(. c #494949",
-"_. c #B4B4B4",
-":. c #474747",
-"<. c #222222",
-"[. c #272727",
-"}. c #343434",
-"|. c #EBB6B0",
-"1. c #B11705",
-"2. c #8A0D01",
-"3. c #870500",
-"4. c #9E241A",
-"5. c #C75E51",
-"6. c #C93424",
-"7. c #C1200F",
-"8. c #C02212",
-"9. c #9F1208",
-"0. c #8B0D04",
-"a. c #871108",
-"b. c #920502",
-"c. c #9A0000",
-"d. c #2E2E2E",
-"e. c #1C1C1C",
-"f. c #171717",
-"g. c #5B5B5B",
-"h. c #8A8A8A",
-"i. c #242424",
-"j. c #ED9F92",
-"k. c #DE7C70",
-"l. c #B73728",
-"m. c #B2645D",
-"n. c #CD8780",
-"o. c #B8231B",
-"p. c #B10C00",
-"q. c #B21105",
-"r. c #B21004",
-"s. c #A01005",
-"t. c #870E07",
-"u. c #871207",
-"v. c #960A03",
-"w. c #A30402",
-"x. c #050505",
-"y. c #202020",
-"z. c #1D1D1D",
-"A. c #1F1F1F",
-"B. c #1B1B1B",
-"C. c #191919",
-"D. c #232323",
-"E. c #CF341F",
-"F. c #EEBBB2",
-"G. c #F4B7A5",
-"H. c #F6B7A5",
-"I. c #BA3D34",
-"J. c #9A0500",
-"K. c #9F0E03",
-"L. c #A00D02",
-"M. c #A40D01",
-"N. c #9B0E03",
-"O. c #871007",
-"P. c #881205",
-"Q. c #9C1007",
-"R. c #212121",
-"S. c #AC1006",
-"T. c #C5392A",
-"U. c #EA6344",
-"V. c #D63F27",
-"W. c #A71008",
-"X. c #9C0B01",
-"Y. c #990D02",
-"Z. c #900D04",
-"`. c #970D06",
-" + c #951007",
-".+ c #841003",
-"++ c #9B1407",
-"@+ c #9F1008",
-"#+ c #AA1009",
-"$+ c #CD2614",
-"%+ c #BF1C11",
-"&+ c #A00C06",
-"*+ c #980C01",
-"=+ c #960D02",
-"-+ c #9C0D08",
-";+ c #B5100C",
-">+ c #BE1710",
-",+ c #9B1408",
-"'+ c #921204",
-")+ c #1E1E1E",
-"!+ c #9C1109",
-"~+ c #9A130C",
-"{+ c #A9100A",
-"]+ c #AB0C0A",
-"^+ c #9E0C04",
-"/+ c #940C00",
-"(+ c #8E0D03",
-"_+ c #9D0F07",
-":+ c #B1130C",
-"<+ c #BD180F",
-"[+ c #CB1F14",
-"}+ c #D42519",
-"|+ c #B02111",
-"1+ c #040404",
-"2+ c #353535",
-"3+ c #96170D",
-"4+ c #95140E",
-"5+ c #A30B08",
-"6+ c #9C0D05",
-"7+ c #981007",
-"8+ c #9A120A",
-"9+ c #9F140B",
-"0+ c #A4150A",
-"a+ c #A9170C",
-" ",
-" . + @ # $ % & * * * * * * * * * * & ",
-" = - ; > , ' ) ! ~ { ] ^ / ( _ _ : : : _ ( / < ] ",
-" [ } | 1 2 3 4 5 6 7 8 ] 9 0 a b c c c c c b 0 d ] ",
-" e f g h i j k l m n o p ] q r s t u v v v v u w q ] ",
-" x y z A B C D E F G H I J K t L M N O O O O P P Q ] ",
-" R S T U V W X Y Z ` ...+. J c 9 @.#.$.%.%.%.%.%.&.*.J ",
-" =.-.;.>.,.'.).!.~.{.].^./. J v (._.:.<.[.[.[.[.[.[.}.J ",
-" |.1.2.3.4.5.6.7.8.9.0.a.b.c. J d.e.f.e.g.h.h.i.$.$.$.c J ",
-" j.k.l.m.n.o.p.q.r.s.t.u.v.w. x.v y.z.A.B.C.C.z.D.<.<.v x. ",
-" E.F.G.H.I.J.K.L.M.N.O.P.Q. x.u y.R.R.A.A.A.A.R.R.y.u x. ",
-" S.T.U.V.W.X.Y.Z.0.`. +.+++ x.O A.A.A.A.A.A.A.A.A.A.O x. ",
-" @+#+$+%+&+*+=+Z.-+;+>+,+'+ x.%.z.z.z.)+)+)+)+z.z.z.%.x. ",
-" !+~+{+]+^+/+(+_+:+<+[+}+|+ 1+v }.}.2+2+2+2+2+2+2+}.v 1+ ",
-" 3+4+5+6+7+8+9+0+a+ 1+x.x.x.x.x.x.x.x.x.x.1+ ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/ivy.xpm b/elpa/mode-icons-20190627.2121/icons/ivy.xpm
deleted file mode 100644
index 664e294..0000000
--- a/elpa/mode-icons-20190627.2121/icons/ivy.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * c:\EmacsPortable_App\Data\src\mode_icons\icons\ivy_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" .. ",
-" .. ",
-" .... ",
-" .... ",
-" ...... ",
-" ...... ",
-" ....... ",
-".... ...... ....",
-"................",
-"............... ",
-" .............. ",
-" ............ ",
-" .......... ",
-" .... .... ",
-" .......... ",
-" ... ... "};
diff --git a/elpa/mode-icons-20190627.2121/icons/js.xpm b/elpa/mode-icons-20190627.2121/icons/js.xpm
deleted file mode 100644
index dade9d1..0000000
--- a/elpa/mode-icons-20190627.2121/icons/js.xpm
+++ /dev/null
@@ -1,67 +0,0 @@
-/* XPM */
-static char * js_xpm[] = {
-"16 16 48 1",
-" c None",
-". c #F7DF1E",
-"+ c #74690E",
-"@ c #837610",
-"# c #D4C01A",
-"$ c #5F560C",
-"% c #494209",
-"& c #9C8D13",
-"* c #322D06",
-"= c #2B2605",
-"- c #1E1B04",
-"; c #4A4209",
-"> c #161403",
-", c #DFC91B",
-"' c #F6DE1E",
-") c #080701",
-"! c #59500B",
-"~ c #F5DD1E",
-"{ c #E9D31C",
-"] c #655B0C",
-"^ c #000000",
-"/ c #2C2705",
-"( c #A89714",
-"_ c #272305",
-": c #948612",
-"< c #D1BD19",
-"[ c #2E2906",
-"} c #4D4609",
-"| c #AC9C15",
-"1 c #F2DB1D",
-"2 c #F4DC1E",
-"3 c #6D630D",
-"4 c #0D0B02",
-"5 c #4D4509",
-"6 c #020200",
-"7 c #827510",
-"8 c #BFAC17",
-"9 c #030300",
-"0 c #50490A",
-"a c #786C0F",
-"b c #E8D21C",
-"c c #6F650E",
-"d c #484109",
-"e c #7B6F0F",
-"f c #EFD81D",
-"g c #BBA917",
-"h c #847710",
-"i c #F1DA1D",
-"................",
-"................",
-"................",
-"................",
-"................",
-"................",
-"................",
-".......+@.#$%&..",
-".......*%.=-;>,.",
-".......*%')!~{..",
-".......*%.]^/(..",
-".......*%.'&_^:.",
-"....~<.[}'|12_%.",
-"....3456789*09a.",
-"....bcdef.g!%hi.",
-"................"};
diff --git a/elpa/mode-icons-20190627.2121/icons/msys.xpm b/elpa/mode-icons-20190627.2121/icons/msys.xpm
deleted file mode 100644
index d246d28..0000000
--- a/elpa/mode-icons-20190627.2121/icons/msys.xpm
+++ /dev/null
@@ -1,146 +0,0 @@
-/* XPM */
-static char * d:\EmacsPortable_App\Data\src\mode_icons\icons\msys_xpm[] = {
-"16 16 127 2",
-" c None",
-". c #7A536A",
-"+ c #4E92CF",
-"@ c #A4BDD8",
-"# c #89545B",
-"$ c #536B9B",
-"% c #5D9CD0",
-"& c #9DC2E6",
-"* c #676086",
-"= c #3F89CC",
-"- c #89C0E6",
-"; c #987984",
-"> c #6A4253",
-", c #4585C7",
-"' c #5DA5D9",
-") c #A8B7D4",
-"! c #7C3C4A",
-"~ c #4B94D4",
-"{ c #4D8ACA",
-"] c #75B3DF",
-"^ c #B4B0C4",
-"/ c #5D82B5",
-"( c #56A0D7",
-"_ c #6FAFDE",
-": c #B0BDD6",
-"< c #657AA7",
-"[ c #93B7DA",
-"} c #6280BC",
-"| c #7BA4D5",
-"1 c #C4DCF0",
-"2 c #7A556D",
-"3 c #69A9DE",
-"4 c #5E82C2",
-"5 c #8ABBE1",
-"6 c #BCC8DD",
-"7 c #66353E",
-"8 c #8BAFD8",
-"9 c #ABA3B5",
-"0 c #7875A0",
-"a c #83A4D5",
-"b c #D7F3FF",
-"c c #622122",
-"d c #778FB9",
-"e c #AFBACF",
-"f c #707BB0",
-"g c #95BDE2",
-"h c #D0E8F9",
-"i c #9B89A3",
-"j c #C2E1F9",
-"k c #864145",
-"l c #827091",
-"m c #8FA6D7",
-"n c #D9F0FD",
-"o c #AB8893",
-"p c #B8D7EF",
-"q c #82444D",
-"r c #7B85B1",
-"s c #A0BFE3",
-"t c #DCF2FD",
-"u c #99606A",
-"v c #B6D1EF",
-"w c #C0A3AA",
-"x c #8D5F73",
-"y c #9DABDC",
-"z c #D1E4F3",
-"A c #D5E8F6",
-"B c #C0A2AA",
-"C c #868AB2",
-"D c #B3C6E6",
-"E c #E1F4FD",
-"F c #B08D91",
-"G c #ABA9C5",
-"H c #DBE4EF",
-"I c #724344",
-"J c #773231",
-"K c #A6A9D9",
-"L c #D1E0F1",
-"M c #E3ECF3",
-"N c #784848",
-"O c #9C86AA",
-"P c #B2B6DF",
-"Q c #E3F2FA",
-"R c #DDD7D8",
-"S c #937379",
-"T c #ECF9FF",
-"U c #C6AAAC",
-"V c #A7829D",
-"W c #D9E0F0",
-"X c #DBD1D4",
-"Y c #77363B",
-"Z c #B6B6DC",
-"` c #BA9AA6",
-" . c #EDEFF3",
-".. c #8C6D6E",
-"+. c #B6969A",
-"@. c #B69196",
-"#. c #5D2A2D",
-"$. c #D6CEDA",
-"%. c #84494C",
-"&. c #4A2424",
-"*. c #965253",
-"=. c #E9DEDF",
-"-. c #A57379",
-";. c #57191A",
-">. c #804446",
-",. c #A48B8F",
-"'. c #B39193",
-"). c #7C3434",
-"!. c #E1D4D7",
-"~. c #A26F72",
-"{. c #531111",
-"]. c #F4EEF1",
-"^. c #914142",
-"/. c #E4D7D9",
-"(. c #CFB1B6",
-"_. c #5C1E1E",
-":. c #9C5659",
-"<. c #BFA4A5",
-"[. c #B7888C",
-"}. c #C69FA4",
-"|. c #602F2F",
-"1. c #D6BDC1",
-"2. c #220000",
-"3. c #B79094",
-"4. c #BB8E93",
-"5. c #411D1D",
-"6. c #A97378",
-" ",
-" . + @ # $ % & ",
-" * = - ; > , ' ) ",
-" ! ~ { ] ^ / ( _ : ",
-" < [ } | 1 2 3 4 5 6 ",
-" 7 8 9 0 a b c d e f g h ",
-" i j k l m n o p q r s t ",
-" u v w x y z A B C D E F ",
-" G H I J K L M N O P Q R ",
-"S T U V W X Y Z ` ...",
-"+.@. #.$.%. &.*.=.-. ",
-" ;.>.,.'.).!.~. ",
-" {.].^./.(._.:.<. ",
-" [.}.|.1. ",
-" 2.3.4.5.6. ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/octave.xpm b/elpa/mode-icons-20190627.2121/icons/octave.xpm
deleted file mode 100644
index c788a89..0000000
--- a/elpa/mode-icons-20190627.2121/icons/octave.xpm
+++ /dev/null
@@ -1,98 +0,0 @@
-/* XPM */
-static char * e:\EmacsPortable_App\Data\src\mode_icons\icons\octave_xpm[] = {
-"16 16 79 1",
-" c None",
-". c #48BBD8",
-"+ c #4DBEDA",
-"@ c #52C1DC",
-"# c #56C4DD",
-"$ c #38B0D3",
-"% c #3DB3D5",
-"& c #43B7D6",
-"* c #47BAD8",
-"= c #58C5DE",
-"- c #5CC7E0",
-"; c #2FAACF",
-"> c #34ADD0",
-", c #38B0D2",
-"' c #75B4B6",
-") c #DA7126",
-"! c #2AA7CD",
-"~ c #2EAACF",
-"{ c #32ADD0",
-"] c #FF7F2A",
-"^ c #F1711C",
-"/ c #0FA6DA",
-"( c #19A7D6",
-"_ c #1EABD8",
-": c #EE6E19",
-"< c #DE6D1E",
-"[ c #DD5D08",
-"} c #DD6A1A",
-"| c #DD6A1B",
-"1 c #DD6A1C",
-"2 c #E1610C",
-"3 c #5EC9E0",
-"4 c #ED6D18",
-"5 c #FF802B",
-"6 c #FF802A",
-"7 c #F77722",
-"8 c #EE6D18",
-"9 c #56C3DD",
-"0 c #EA6A15",
-"a c #FC7C27",
-"b c #FE7C25",
-"c c #FF7B22",
-"d c #F77119",
-"e c #51C0DC",
-"f c #7B7259",
-"g c #508081",
-"h c #38899C",
-"i c #4CBDDA",
-"j c #0190C3",
-"k c #0793C3",
-"l c #0E95C4",
-"m c #799A92",
-"n c #048FBF",
-"o c #0A92C1",
-"p c #0F96C4",
-"q c #FA7A25",
-"r c #EC6C17",
-"s c #068FC0",
-"t c #0B93C2",
-"u c #1197C4",
-"v c #169AC6",
-"w c #778474",
-"x c #FE7B24",
-"y c #EC6D18",
-"z c #0991C2",
-"A c #0D94C3",
-"B c #1398C5",
-"C c #189CC7",
-"D c #1EA0C9",
-"E c #22A3CD",
-"F c #429BAF",
-"G c #EA6E1B",
-"H c #F2711C",
-"I c #E3640F",
-"J c #1097C4",
-"K c #159AC6",
-"L c #1A9DC7",
-"M c #1FA0CA",
-"N c #25A4CD",
-" .+@# ",
-" $%&* =- ",
-" ;>, ') ",
-" !~{ ]^ ",
-" /(_ :< ",
-"[}|12 3 ",
-"45667 ",
-"4]]]7 ",
-"8]]]7 9",
-"0abcd e",
-" fgh i",
-" jkl m",
-" nop q5r",
-" stuv wx5y",
-" zABCDEFGHI",
-" JKLMN "};
diff --git a/elpa/mode-icons-20190627.2121/icons/org.xpm b/elpa/mode-icons-20190627.2121/icons/org.xpm
deleted file mode 100644
index 40dac9f..0000000
--- a/elpa/mode-icons-20190627.2121/icons/org.xpm
+++ /dev/null
@@ -1,170 +0,0 @@
-/* XPM */
-/* icon by Tina Russell, based on the work of Greg Newman and Christophe Bataillon */
-static char * org_mode_xpm[] = {
-"16 16 150 2",
-" c None",
-". c #554C41",
-"+ c #494138",
-"@ c #545249",
-"# c #524A40",
-"$ c #564C41",
-"% c #394A4C",
-"& c #565B53",
-"* c #64574D",
-"= c #31504B",
-"- c #484138",
-"; c #6B4737",
-"> c #6F5D50",
-", c #5D5147",
-"' c #6D4133",
-") c #5A776B",
-"! c #5D7468",
-"~ c #7C705E",
-"{ c #788272",
-"] c #688F81",
-"^ c #486C61",
-"/ c #744334",
-"( c #874F3D",
-"_ c #944D37",
-": c #904932",
-"< c #7A8A77",
-"[ c #72B5A5",
-"} c #6CA697",
-"| c #447C6C",
-"1 c #6B9F8F",
-"2 c #709F8F",
-"3 c #638E80",
-"4 c #5E8679",
-"5 c #5E8578",
-"6 c #4E7065",
-"7 c #7F4D3D",
-"8 c #9D5E4A",
-"9 c #A96752",
-"0 c #AB5A40",
-"a c #9C4930",
-"b c #896953",
-"c c #77AB9A",
-"d c #6CA895",
-"e c #689C89",
-"f c #629A85",
-"g c #7DB3A1",
-"h c #7AAE9D",
-"i c #71A293",
-"j c #6E9D8E",
-"k c #54796D",
-"l c #6A3F33",
-"m c #A05F4A",
-"n c #B7735C",
-"o c #B1654D",
-"p c #A34C31",
-"q c #924E35",
-"r c #7A5743",
-"s c #6C8B7B",
-"t c #72A898",
-"u c #78AC9A",
-"v c #76A897",
-"w c #72A292",
-"x c #73A493",
-"y c #659285",
-"z c #557B71",
-"A c #3A554D",
-"B c #8A503D",
-"C c #B4705A",
-"D c #B26C55",
-"E c #9B523B",
-"F c #98452C",
-"G c #7C7663",
-"H c #6D9585",
-"I c #628779",
-"J c #5B8275",
-"K c #5F8779",
-"L c #5D8577",
-"M c #415C53",
-"N c #3E5850",
-"O c #425F56",
-"P c #354D46",
-"Q c #8B523F",
-"R c #B16C56",
-"S c #A95A41",
-"T c #984A31",
-"U c #89523B",
-"V c #718D7D",
-"W c #75B0A0",
-"X c #5D877A",
-"Y c #446257",
-"Z c #864B39",
-"` c #A7583E",
-" . c #A54E32",
-".. c #954A31",
-"+. c #766956",
-"@. c #6E9282",
-"#. c #77A897",
-"$. c #5D8779",
-"%. c #425D54",
-"&. c #6F3927",
-"*. c #9F4B30",
-"=. c #96452C",
-"-. c #7C6450",
-";. c #6F8F7F",
-">. c #76A796",
-",. c #79AE9D",
-"'. c #689586",
-"). c #517468",
-"!. c #415E54",
-"~. c #4E322C",
-"{. c #7B4A35",
-"]. c #776452",
-"^. c #708575",
-"/. c #73AC9C",
-"(. c #78AB9B",
-"_. c #79AC9B",
-":. c #6E9E8D",
-"<. c #628D7E",
-"[. c #587D70",
-"}. c #435F56",
-"|. c #43433B",
-"1. c #5F8275",
-"2. c #74A190",
-"3. c #77A998",
-"4. c #79AD9B",
-"5. c #78AB9A",
-"6. c #71A393",
-"7. c #689587",
-"8. c #5F897B",
-"9. c #577E71",
-"0. c #436056",
-"a. c #395B54",
-"b. c #608B7D",
-"c. c #73A494",
-"d. c #6E9E8E",
-"e. c #669384",
-"f. c #628D7F",
-"g. c #5B8376",
-"h. c #587E72",
-"i. c #567B6E",
-"j. c #3E584F",
-"k. c #425950",
-"l. c #466258",
-"m. c #48675D",
-"n. c #4B6B61",
-"o. c #456259",
-"p. c #47645B",
-"q. c #48665D",
-"r. c #4B6A60",
-"s. c #49685E",
-" . + ",
-" @ # $ ",
-" % & * ",
-" = - ; > , ",
-" ' ) ! ~ { ] ^ ",
-" / ( _ : < [ } | 1 2 3 4 5 6 ",
-" 7 8 9 0 a b c d e f g h i j k ",
-"l m n o p q r s t u v w x y z A ",
-"B C D E F G H I J K L M N O P ",
-"Q R S T U V W X Y ",
-"Z ` ...+.@.#.$.%. ",
-"&.*.=.-.;.>.,.'.).!. ",
-"~.{.].^./.(._.:.<.[.}. ",
-" |.1.2.3.4.5.6.7.8.9.0. ",
-" a.b.c.5.d.e.f.g.h.i.j. ",
-" k.l.m.n.o.o.p.q.r.s. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/php.xpm b/elpa/mode-icons-20190627.2121/icons/php.xpm
deleted file mode 100644
index 8b316ef..0000000
--- a/elpa/mode-icons-20190627.2121/icons/php.xpm
+++ /dev/null
@@ -1,334 +0,0 @@
-/* XPM */
-static char * php_xpm[] = {
-"30 16 315 2",
-" c None",
-". c #D9D7E1",
-"+ c #CAC9D8",
-"@ c #B6B5CC",
-"# c #A5A4C3",
-"$ c #9697BA",
-"% c #8C8DB4",
-"& c #8283AE",
-"* c #787BA8",
-"= c #6D70A1",
-"- c #606598",
-"; c #5F6390",
-"> c #636588",
-", c #C7C5D6",
-"' c #BFBED5",
-") c #AAABCC",
-"! c #9193C0",
-"~ c #7E81B7",
-"{ c #767AB4",
-"] c #7478B3",
-"^ c #8185BE",
-"/ c #8488C0",
-"( c #777BB5",
-"_ c #777BB4",
-": c #777BB3",
-"< c #7579B1",
-"[ c #7275A9",
-"} c #6F709C",
-"| c #6A6A89",
-"1 c #626175",
-"2 c #A8A6C2",
-"3 c #9F9FC3",
-"4 c #8789BB",
-"5 c #6E73B1",
-"6 c #7075B1",
-"7 c #7379B2",
-"8 c #7377B3",
-"9 c #8387BD",
-"0 c #636474",
-"a c #595965",
-"b c #898CBC",
-"c c #7479B4",
-"d c #787CB7",
-"e c #787CB9",
-"f c #7376A9",
-"g c #656788",
-"h c #545463",
-"i c #9090B6",
-"j c #8083B6",
-"k c #7176B2",
-"l c #7578B4",
-"m c #787CB5",
-"n c #797DB5",
-"o c #7A7DB6",
-"p c #7B7FB8",
-"q c #757AB7",
-"r c #9193BF",
-"s c #070705",
-"t c #1F1F1E",
-"u c #878BBD",
-"v c #797DB7",
-"w c #797DB6",
-"x c #7B80BA",
-"y c #7D82C0",
-"z c #7174A7",
-"A c #50526A",
-"B c #2D2E36",
-"C c #7A7DA5",
-"D c #8182B0",
-"E c #757AB3",
-"F c #7579B5",
-"G c #7D80B1",
-"H c #6C6D86",
-"I c #57596B",
-"J c #58596C",
-"K c #6A6C86",
-"L c #8185B8",
-"M c #7F82A3",
-"N c #060607",
-"O c #28282A",
-"P c #5C5E70",
-"Q c #5B5C70",
-"R c #6E718E",
-"S c #8083B5",
-"T c #7A7DA1",
-"U c #5A5B6D",
-"V c #57596C",
-"W c #57586A",
-"X c #606177",
-"Y c #787B9F",
-"Z c #7F83BD",
-"` c #7B7FBB",
-" . c #4D4F6E",
-".. c #13141B",
-"+. c #7679A9",
-"@. c #767AB5",
-"#. c #7579B3",
-"$. c #74769C",
-"%. c #21211E",
-"&. c #10100C",
-"*. c #333334",
-"=. c #232221",
-"-. c #080803",
-";. c #5F606D",
-">. c #6F7082",
-",. c #040405",
-"'. c #212123",
-"). c #2D2E2F",
-"!. c #191916",
-"~. c #0E0D0B",
-"{. c #6C6D7E",
-"]. c #5A5B6A",
-"^. c #010000",
-"/. c #272727",
-"(. c #2F2F30",
-"_. c #0F0F0B",
-":. c #232321",
-"<. c #747798",
-"[. c #7C80BA",
-"}. c #7E83C1",
-"|. c #383A55",
-"1. c #64699A",
-"2. c #7679B2",
-"3. c #767AB3",
-"4. c #7D82BB",
-"5. c #686A89",
-"6. c #0D0C08",
-"7. c #4E4F5F",
-"8. c #8F92C1",
-"9. c #8487AD",
-"0. c #1D1E24",
-"a. c #1C1C1A",
-"b. c #4D4D4E",
-"c. c #010100",
-"d. c #7D7F97",
-"e. c #8487BA",
-"f. c #646579",
-"g. c #54545A",
-"h. c #43434C",
-"i. c #1A1B20",
-"j. c #8C90C0",
-"k. c #56576A",
-"l. c #000000",
-"m. c #565769",
-"n. c #7A7EB5",
-"o. c #7B80BB",
-"p. c #7276AD",
-"q. c #14151F",
-"r. c #64699D",
-"s. c #7E82B9",
-"t. c #5B5D73",
-"u. c #0E0E0A",
-"v. c #666887",
-"w. c #878BD1",
-"x. c #8F93C5",
-"y. c #25252D",
-"z. c #272726",
-"A. c #12110F",
-"B. c #8A8DB8",
-"C. c #7E83C4",
-"D. c #626479",
-"E. c #050505",
-"F. c #63646E",
-"G. c #2F2F31",
-"H. c #2F303B",
-"I. c #8C90C7",
-"J. c #8A8FD2",
-"K. c #62647C",
-"L. c #060501",
-"M. c #5A5B70",
-"N. c #7B7EB6",
-"O. c #7F83C0",
-"P. c #2D2F45",
-"Q. c #65699C",
-"R. c #787CB6",
-"S. c #777BB6",
-"T. c #7E81B5",
-"U. c #464755",
-"V. c #141313",
-"W. c #6C6D88",
-"X. c #8487B4",
-"Y. c #56576C",
-"Z. c #060606",
-"`. c #5B5B5C",
-" + c #8385B9",
-".+ c #8387BF",
-"++ c #45464F",
-"@+ c #0A0A0B",
-"#+ c #767783",
-"$+ c #111211",
-"%+ c #3F3F4A",
-"&+ c #8B8EB7",
-"*+ c #717496",
-"=+ c #24252B",
-"-+ c #1A1916",
-";+ c #75789A",
-">+ c #7A7EB8",
-",+ c #7E84C0",
-"'+ c #2F3047",
-")+ c #636593",
-"!+ c #7579B2",
-"~+ c #797DB8",
-"{+ c #7D80AF",
-"]+ c #36363E",
-"^+ c #232323",
-"/+ c #262627",
-"(+ c #181713",
-"_+ c #454650",
-":+ c #818292",
-"<+ c #0A0A07",
-"[+ c #4B4B53",
-"}+ c #8287C0",
-"|+ c #8387B9",
-"1+ c #2C2C29",
-"2+ c #171717",
-"3+ c #7F808C",
-"4+ c #141414",
-"5+ c #2C2C2E",
-"6+ c #696A82",
-"7+ c #7E82B7",
-"8+ c #767AB2",
-"9+ c #171722",
-"0+ c #6B6F9F",
-"a+ c #7A7EB9",
-"b+ c #7377A0",
-"c+ c #202020",
-"d+ c #202025",
-"e+ c #616276",
-"f+ c #5E5F77",
-"g+ c #686A87",
-"h+ c #8084B3",
-"i+ c #8486AF",
-"j+ c #63657E",
-"k+ c #797B9F",
-"l+ c #797EB9",
-"m+ c #8185B7",
-"n+ c #6C6E86",
-"o+ c #71738D",
-"p+ c #5F606E",
-"q+ c #070707",
-"r+ c #4F505E",
-"s+ c #61627C",
-"t+ c #76789D",
-"u+ c #7F83B8",
-"v+ c #8386C6",
-"w+ c #3F405E",
-"x+ c #64678F",
-"y+ c #6D70A2",
-"z+ c #7D81BC",
-"A+ c #6D708F",
-"B+ c #050500",
-"C+ c #444653",
-"D+ c #8C90C5",
-"E+ c #7D81BB",
-"F+ c #787CB4",
-"G+ c #7D81B9",
-"H+ c #7A7EB7",
-"I+ c #7C80B8",
-"J+ c #3B3C3E",
-"K+ c #111113",
-"L+ c #8082A8",
-"M+ c #8185C1",
-"N+ c #7B7FB9",
-"O+ c #8084C2",
-"P+ c #484B6E",
-"Q+ c #13141D",
-"R+ c #64668F",
-"S+ c #6E719E",
-"T+ c #7B7DA1",
-"U+ c #5D5E6F",
-"V+ c #77799B",
-"W+ c #7C81BA",
-"X+ c #7579B4",
-"Y+ c #7D81B4",
-"Z+ c #616379",
-"`+ c #8185B6",
-" @ c #7478B5",
-".@ c #8084C3",
-"+@ c #7073A9",
-"@@ c #393A56",
-"#@ c #151620",
-"$@ c #6A6C94",
-"%@ c #7375A5",
-"&@ c #787BB2",
-"*@ c #777CB6",
-"=@ c #767BB4",
-"-@ c #7C80B9",
-";@ c #7A7FBC",
-">@ c #7C80BD",
-",@ c #7175A9",
-"'@ c #4D4F70",
-")@ c #21222F",
-"!@ c #65678D",
-"~@ c #696D97",
-"{@ c #6F72A2",
-"]@ c #7477AD",
-"^@ c #777AB3",
-"/@ c #787CB8",
-"(@ c #787DB9",
-"_@ c #777BB7",
-":@ c #62658B",
-"<@ c #4B4D64",
-"[@ c #2F313A",
-"}@ c #666785",
-"|@ c #676888",
-"1@ c #696B8D",
-"2@ c #6C6D91",
-"3@ c #6C6D92",
-"4@ c #6D6E92",
-"5@ c #6B6D8F",
-"6@ c #696A8B",
-"7@ c #656682",
-"8@ c #5E5F75",
-"9@ c #555463",
-"0@ c #484750",
-" . + @ # $ % & * = - ; > ",
-" , ' ) ! ~ { ] ^ / ( { _ : < [ } | 1 ",
-" 2 3 4 ] 5 6 7 8 9 0 a b c { { ( d e d f g h ",
-" i j k l m n o p q r s t u v p ( m o w w x y z A B ",
-" C D E F G H I I J K L M N O P Q R S T U V W X Y Z ` ... ",
-" +.@.#.x $.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|. ",
-"1.2._ 3.4.5.6.7.8.9.0.a.b.c.d.e.f.^.g.h.i.M j.k.l.m.n.o.p.q.",
-"r.m 3.{ s.t.u.v.w.x.y.t z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.{ O.P.",
-"Q.R.3.S.T.U.V.W.X.Y.Z.`.V.G. +.+++@+#+$+%+&+*+=+-+;+>+{ ,+'+",
-")+!+( ~+{+]+c.^+/+(+_+:+<+[+}+|+1+2+3+l.4+5+a.z.6+7+_ >+8+9+",
-" 0+d a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+K.s+t+u+_ R.v+w+ ",
-" x+y+z+A+B+C+D+[.E+v F+G+H+3._ I+u J+K+L+M+G+N+{ ` O+P+Q+ ",
-" R+S+T+U+V+W+X+{ 3.3.{ { : 3.{ Y+>.Z+`+ @3.~+.@+@@@#@ ",
-" $@%@&@*@d ( ( _ 3.3.3.3.3.=@p -@~+;@>@,@'@)@ ",
-" !@~@{@]@^@( d /@e (@(@/@_@{ z :@<@[@ ",
-" }@|@1@2@3@4@5@6@7@8@9@0@ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/powershell.xpm b/elpa/mode-icons-20190627.2121/icons/powershell.xpm
deleted file mode 100644
index 3755955..0000000
--- a/elpa/mode-icons-20190627.2121/icons/powershell.xpm
+++ /dev/null
@@ -1,197 +0,0 @@
-/* XPM */
-static char * d:\EmacsPortable_App\Data\src\mode_icons\icons\powershell_xpm[] = {
-"16 16 178 2",
-" c None",
-". c #13B5D8",
-"+ c #13B6D9",
-"@ c #14B6D9",
-"# c #12B4D7",
-"$ c #13B2D5",
-"% c #12B1D3",
-"& c #13AFD2",
-"* c #14ADD0",
-"= c #14ABCE",
-"- c #14A9CC",
-"; c #14A8CA",
-"> c #14A6C8",
-", c #14A4C5",
-"' c #12BFE3",
-") c #A2E6F5",
-"! c #52CAE3",
-"~ c #10B8DC",
-"{ c #13B6DA",
-"] c #14B4D7",
-"^ c #14B1D4",
-"/ c #14AFD2",
-"( c #14ADCF",
-"_ c #14AACD",
-": c #14A6C7",
-"< c #13BEE2",
-"[ c #12BDE1",
-"} c #9BDDEC",
-"| c #FFFEFE",
-"1 c #21B8D9",
-"2 c #13B4D7",
-"3 c #14B2D5",
-"4 c #14A9CB",
-"5 c #14A2C4",
-"6 c #13B3D6",
-"7 c #13BBDF",
-"8 c #0AB5D9",
-"9 c #CDEBF2",
-"0 c #C3E8F1",
-"a c #0DAFD3",
-"b c #14B0D3",
-"c c #14AED0",
-"d c #14A7C9",
-"e c #14A4C6",
-"f c #14A1C2",
-"g c #13B7DB",
-"h c #13BADE",
-"i c #12B8DB",
-"j c #1BB2D4",
-"k c #F2F8FA",
-"l c #83D0E3",
-"m c #12AED1",
-"n c #14ACCE",
-"o c #14A5C7",
-"p c #13A3C4",
-"q c #159FC0",
-"r c #13B8DB",
-"s c #13B5D9",
-"t c #11B4D7",
-"u c #6DC9DE",
-"v c #F4FAFC",
-"w c #2BAFCC",
-"x c #14AACC",
-"y c #13A3C5",
-"z c #12BBDF",
-"A c #13B9DC",
-"B c #12B6DA",
-"C c #0EB0D4",
-"D c #C4EAF3",
-"E c #E6F2F6",
-"F c #1CA1C0",
-"G c #14A1C3",
-"H c #159FC1",
-"I c #13B9DD",
-"J c #12B7DA",
-"K c #23B7D8",
-"L c #C8ECF4",
-"M c #D7ECF2",
-"N c #33A7C3",
-"O c #13AACD",
-"P c #13A4C6",
-"Q c #14A2C3",
-"R c #159DBF",
-"S c #13ADCF",
-"T c #1AB5D7",
-"U c #C6EAF4",
-"V c #CFE5EB",
-"W c #25A7C5",
-"X c #05A4C8",
-"Y c #08A3C6",
-"Z c #09A0C4",
-"` c #14A3C4",
-" . c #15A0C2",
-".. c #149EBF",
-"+. c #159BBC",
-"@. c #16B4D7",
-"#. c #DCF1F7",
-"$. c #CDE9F1",
-"%. c #1BA3C2",
-"&. c #56C4DD",
-"*. c #CDEFF7",
-"=. c #C9ECF6",
-"-. c #B1E2EE",
-";. c #14A0C2",
-">. c #149EC0",
-",. c #159CBE",
-"'. c #159ABB",
-"). c #13B1D4",
-"!. c #17B2D5",
-"~. c #9DCFDC",
-"{. c #1FA7C6",
-"]. c #12ABCD",
-"^. c #3DB7D3",
-"/. c #80C6D7",
-"(. c #7EC4D7",
-"_. c #70BDD0",
-":. c #149FC1",
-"<. c #159DBE",
-"[. c #159ABC",
-"}. c #1599BA",
-"|. c #16B5D7",
-"1. c #16B2D5",
-"2. c #16AFD2",
-"3. c #16ABCD",
-"4. c #16A9CA",
-"5. c #15A6C8",
-"6. c #15A4C6",
-"7. c #15A2C3",
-"8. c #16A0C1",
-"9. c #169EBE",
-"0. c #169BBC",
-"a. c #1699B9",
-"b. c #AEC2C5",
-"c. c #AABFC2",
-"d. c #A9BEC0",
-"e. c #A7BCBE",
-"f. c #A8BDC0",
-"g. c #A6BBBE",
-"h. c #A5BABD",
-"i. c #A3B8BB",
-"j. c #AABDC0",
-"k. c #9FB5B7",
-"l. c #9DB3B5",
-"m. c #99AEB1",
-"n. c #B9CED1",
-"o. c #B5C9CC",
-"p. c #B4C8CB",
-"q. c #B3C7CA",
-"r. c #637A7E",
-"s. c #5F7679",
-"t. c #5F7579",
-"u. c #5E7579",
-"v. c #6E8387",
-"w. c #A7BBBF",
-"x. c #5C7377",
-"y. c #A5B8BA",
-"z. c #B8CDD0",
-"A. c #B6CACD",
-"B. c #9EB4B7",
-"C. c #9CB3B6",
-"D. c #9AB1B4",
-"E. c #99AFB3",
-"F. c #9DB2B5",
-"G. c #8EA4A8",
-"H. c #94ACAF",
-"I. c #91A9AD",
-"J. c #92A6A8",
-"K. c #A3B6B8",
-"L. c #A0B4B6",
-"M. c #9FB2B5",
-"N. c #9DB1B3",
-"O. c #9CAFB1",
-"P. c #9AAEB0",
-"Q. c #99ACAF",
-"R. c #96AAAC",
-"S. c #90A4A6",
-"T. c #94A9AA",
-"U. c #93A7AA",
-" . + @ # $ % & * = - ; > , ",
-" ' ' ) ! ~ { ] ^ / ( _ ; : ",
-" < [ } | 1 2 3 / ( _ 4 > 5 ",
-" 6 < 7 8 9 0 a b c = 4 d e f ",
-" g 7 h i j k l m n 4 ; o p q ",
-" [ h r s t u v w x ; o y f ",
-" z A B ] C D E F ; > e G H ",
-" I J 2 K L M N O d P Q H R ",
-" S i . T U V W X Y Z ` ...+. ",
-" & s @.#.$.%.&.*.=.-.;.>.,.'. ",
-" ).] !.~.{.].^./.(._.:.<.[.}. ",
-" |.1.2.( 3.4.5.6.7.8.9.0.a. ",
-" b.c.d.e.c.f.g.h.i.j.k.l.m. ",
-" n.o.p.q.r.s.t.u.v.w.x.x.m. ",
-"y.z.A.p.q.B.C.D.E.F.G.H.I.J. ",
-" K.L.M.N.N.O.P.Q.R.S.T.U. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/python.xpm b/elpa/mode-icons-20190627.2121/icons/python.xpm
deleted file mode 100644
index b7b6a23..0000000
--- a/elpa/mode-icons-20190627.2121/icons/python.xpm
+++ /dev/null
@@ -1,173 +0,0 @@
-/* XPM */
-static char * python_xpm[] = {
-"16 16 154 2",
-" c None",
-". c #4D8CBE",
-"+ c #4787B8",
-"@ c #4483B5",
-"# c #417FB1",
-"$ c #3E7BAD",
-"% c #3B77A8",
-"& c #508FBE",
-"* c #BBD3E5",
-"= c #73A2C7",
-"- c #3F7CAE",
-"; c #3C79A9",
-"> c #3975A6",
-", c #3672A2",
-"' c #4B8ABA",
-") c #A2C1DA",
-"! c #6698C0",
-"~ c #3F7DAE",
-"{ c #3C79AA",
-"] c #3976A5",
-"^ c #3772A2",
-"/ c #346E9E",
-"( c #4686B7",
-"_ c #4A85B5",
-": c #4782B3",
-"< c #3D7BAC",
-"[ c #3A76A7",
-"} c #3773A3",
-"| c #346F9E",
-"1 c #326C9B",
-"2 c #4B8BBE",
-"3 c #4888BA",
-"4 c #4585B7",
-"5 c #4381B3",
-"6 c #407DAF",
-"7 c #3D7AAB",
-"8 c #3873A3",
-"9 c #35709F",
-"0 c #286499",
-"a c #FFF46F",
-"b c #FFE872",
-"c c #FFE66E",
-"d c #4B8CBE",
-"e c #4889BB",
-"f c #4382B3",
-"g c #417FB0",
-"h c #3873A4",
-"i c #326C9C",
-"j c #306998",
-"k c #276499",
-"l c #FFF26E",
-"m c #FFE56D",
-"n c #FFE366",
-"o c #FFE162",
-"p c #4888BC",
-"q c #4685B8",
-"r c #4482B4",
-"s c #407FB1",
-"t c #3E7BAC",
-"u c #3B77A9",
-"v c #3974A4",
-"w c #3571A1",
-"x c #336D9D",
-"y c #306A99",
-"z c #2F6897",
-"A c #1F5F9B",
-"B c #FFEA68",
-"C c #FFE265",
-"D c #FFE05E",
-"E c #FFDE58",
-"F c #4687B9",
-"G c #3E7CAD",
-"H c #3B78A8",
-"I c #3472A6",
-"J c #2C6BA3",
-"K c #2A689F",
-"L c #26649B",
-"M c #25629A",
-"N c #1D5E9C",
-"O c #DCCE6E",
-"P c #FEE162",
-"Q c #FFDF5C",
-"R c #FFDD56",
-"S c #FFDB50",
-"T c #427FB2",
-"U c #3F7CAD",
-"V c #3C78A9",
-"W c #4B80A2",
-"X c #FFF86B",
-"Y c #FFF06F",
-"Z c #FFF070",
-"` c #FFEF6E",
-" . c #FFEC67",
-".. c #FFE762",
-"+. c #FEE060",
-"@. c #FFDE5A",
-"#. c #FFDD53",
-"$. c #FFDA4D",
-"%. c #FFD848",
-"&. c #4280B1",
-"*. c #3C7AAA",
-"=. c #3372A8",
-"-. c #FFF36D",
-";. c #FFE873",
-">. c #FFE772",
-",. c #FFE66F",
-"'. c #FFE469",
-"). c #FFE263",
-"!. c #FFDF5D",
-"~. c #FFDE57",
-"{. c #FFDC51",
-"]. c #FFD94B",
-"^. c #FFD745",
-"/. c #FFD540",
-"(. c #296AA7",
-"_. c #FFED70",
-":. c #FFE367",
-"<. c #FFE161",
-"[. c #FFDF5B",
-"}. c #FFDD55",
-"|. c #FFDA4F",
-"1. c #FFD849",
-"2. c #FFD743",
-"3. c #FFD43D",
-"4. c #FFD43A",
-"5. c #3B77A7",
-"6. c #2566A4",
-"7. c #FFEC6D",
-"8. c #FFE46A",
-"9. c #FFE264",
-"0. c #FFDC52",
-"a. c #FFD94C",
-"b. c #FFD846",
-"c. c #FFD43B",
-"d. c #FFD33A",
-"e. c #FEE368",
-"f. c #FFE262",
-"g. c #FFD641",
-"h. c #FFD43C",
-"i. c #FFE15F",
-"j. c #FFDE59",
-"k. c #FFDC53",
-"l. c #FFD847",
-"m. c #FFDA58",
-"n. c #FFE58C",
-"o. c #FFD33E",
-"p. c #FFD53F",
-"q. c #FFDF73",
-"r. c #FFF6D7",
-"s. c #FFD645",
-"t. c #FFD94A",
-"u. c #FFD643",
-"v. c #FFD33B",
-"w. c #FFD542",
-" . + @ # $ % ",
-" & * = # - ; > , ",
-" ' ) ! ~ { ] ^ / ",
-" ( _ : < [ } | 1 ",
-" 2 3 4 5 6 7 [ 8 9 1 0 a b c ",
-"d e ( f g < % h 9 i j k l m n o ",
-"p q r s t u v w x y z A B C D E ",
-"F @ g G H I J K L M N O P Q R S ",
-"@ T U V W X Y Z ` ...+.@.#.$.%.",
-"&.~ *.=.-.;.>.,.'.).!.~.{.].^./.",
-"U 7 [ (._.b m :.<.[.}.|.1.2.3.4.",
-" 5.} 6.7.8.9.D E 0.a.b./.c.d. ",
-" e.f.Q R $.%.g.h. ",
-" i.j.k.$.l.m.n.o. ",
-" R {.].^.p.q.r.s. ",
-" t.u.3.v.c.w. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/rails.xpm b/elpa/mode-icons-20190627.2121/icons/rails.xpm
deleted file mode 100644
index c5b6632..0000000
--- a/elpa/mode-icons-20190627.2121/icons/rails.xpm
+++ /dev/null
@@ -1,200 +0,0 @@
-/* XPM */
-static char * rails_xpm[] = {
-"14 16 181 2",
-" c None",
-". c #90152D",
-"+ c #99172E",
-"@ c #A12737",
-"# c #B4534B",
-"$ c #B4544B",
-"% c #B04B40",
-"& c #B04B43",
-"* c #B2524F",
-"= c #B25251",
-"- c #AE4B44",
-"; c #A8403F",
-"> c #A72333",
-", c #A42032",
-"' c #9D1F31",
-") c #B7343D",
-"! c #C0584C",
-"~ c #C96F60",
-"{ c #E8C4BB",
-"] c #D79685",
-"^ c #E1B4A5",
-"/ c #ECD0C1",
-"( c #D59684",
-"_ c #C5786C",
-": c #B33438",
-"< c #9B1E31",
-"[ c #AB2435",
-"} c #B6323B",
-"| c #C0594E",
-"1 c #C05749",
-"2 c #DA9E91",
-"3 c #F2E1D1",
-"4 c #FDFAF8",
-"5 c #FDF9F8",
-"6 c #F0D9D3",
-"7 c #F3E2DE",
-"8 c #C77371",
-"9 c #9C2132",
-"0 c #B52637",
-"a c #B32B35",
-"b c #DDA7A4",
-"c c #CC7F79",
-"d c #EFDAC1",
-"e c #E9CCAF",
-"f c #D59C84",
-"g c #BB6161",
-"h c #D89A94",
-"i c #D79188",
-"j c #BD5C51",
-"k c #B02536",
-"l c #B42E39",
-"m c #B1353B",
-"n c #B2373E",
-"o c #F7EDE1",
-"p c #F1DECD",
-"q c #EFDAC5",
-"r c #BE5C58",
-"s c #A31E24",
-"t c #A52927",
-"u c #D8A475",
-"v c #C7755A",
-"w c #A82434",
-"x c #B93544",
-"y c #BD5257",
-"z c #E6BDBF",
-"A c #F9F2EA",
-"B c #F6EBDF",
-"C c #E2B7AE",
-"D c #A9262D",
-"E c #A72029",
-"F c #A11621",
-"G c #D0926D",
-"H c #CA815D",
-"I c #921F30",
-"J c #C04D57",
-"K c #D59294",
-"L c #FEFDFD",
-"M c #FEFCFB",
-"N c #FCFAF6",
-"O c #CC7B7B",
-"P c #B7484C",
-"Q c #AA272E",
-"R c #A8222A",
-"S c #B8504B",
-"T c #CB7F62",
-"U c #8B1C2F",
-"V c #AD383C",
-"W c #D48D8E",
-"X c #FFFFFF",
-"Y c #D69396",
-"Z c #B43B42",
-"` c #AE2D34",
-" . c #AB2930",
-".. c #AB2C30",
-"+. c #CB7D5E",
-"@. c #931E30",
-"#. c #A1212E",
-"$. c #EBC8C6",
-"%. c #D08588",
-"&. c #BB4B50",
-"*. c #B1343A",
-"=. c #AF2E35",
-"-. c #BB5849",
-";. c #C87B5B",
-">. c #B24554",
-",. c #CEA5AC",
-"'. c #F0DEDF",
-"). c #DDA7A8",
-"!. c #B4393C",
-"~. c #B4393E",
-"{. c #B2353B",
-"]. c #BE6B53",
-"^. c #BC6450",
-"/. c #8D2030",
-"(. c #931B2D",
-"_. c #E2D9DC",
-":. c #F1DADA",
-"<. c #DFAAA9",
-"[. c #B63D3E",
-"}. c #B64042",
-"|. c #B53B40",
-"1. c #AE2636",
-"2. c #8B2332",
-"3. c #8E2233",
-"4. c #B88891",
-"5. c #C57F8A",
-"6. c #D49BA3",
-"7. c #E1B2B1",
-"8. c #E4B5B3",
-"9. c #B4373D",
-"0. c #B32A39",
-"a. c #B32336",
-"b. c #B42335",
-"c. c #A21F32",
-"d. c #87202F",
-"e. c #C3868F",
-"f. c #B65C68",
-"g. c #B53646",
-"h. c #CD828D",
-"i. c #9A1C2C",
-"j. c #B9535E",
-"k. c #CA6875",
-"l. c #B01C2E",
-"m. c #C96571",
-"n. c #D07D88",
-"o. c #C5717C",
-"p. c #861E2D",
-"q. c #E8CDD0",
-"r. c #E6C1C5",
-"s. c #D68A93",
-"t. c #E2A9B0",
-"u. c #A3525B",
-"v. c #C2898F",
-"w. c #DFBBBF",
-"x. c #A60616",
-"y. c #EAC4C8",
-"z. c #E1B1B7",
-"A. c #A7192A",
-"B. c #8C1F30",
-"C. c #DFC5C9",
-"D. c #D6979E",
-"E. c #D58891",
-"F. c #D3A4A9",
-"G. c #AB4D57",
-"H. c #C4838A",
-"I. c #DAB3B7",
-"J. c #DEA9AF",
-"K. c #DB969E",
-"L. c #EBCACD",
-"M. c #AF2032",
-"N. c #921B2E",
-"O. c #801226",
-"P. c #8E1327",
-"Q. c #8C0D1E",
-"R. c #8B0C1C",
-"S. c #8C0E20",
-"T. c #890818",
-"U. c #880616",
-"V. c #9C1125",
-"W. c #A11228",
-"X. c #93142D",
-" . + @ # $ % & * = - ; > ",
-" , ' ) ! ~ { ] ^ / ( _ : ",
-" < [ } | 1 2 3 4 5 6 7 8 ",
-" 9 0 a b c d e f g h i j ",
-" k l m n o p q r s t u v ",
-" w x y z A B C D E F G H ",
-" I J K L M N O P Q R S T ",
-" U V W X X X Y Z ` ...+. ",
-" @.#.$.X X X %.&.*.=.-.;. ",
-" >.,.'.X X X ).!.~.{.].^. ",
-" /.(._.X X X :.<.[.}.|.1. ",
-" 2.3.4.5.6.7.8.9.0.a.b.c. ",
-" d.e.f.g.h.i.j.k.l.m.n.o. ",
-" p.q.r.s.t.u.v.w.x.y.z.A. ",
-" B.C.D.E.F.G.H.I.J.K.L.M. ",
-" N.O.P.Q.R.S.R.T.U.V.W.X. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/rainbow.xpm b/elpa/mode-icons-20190627.2121/icons/rainbow.xpm
deleted file mode 100644
index 2318950..0000000
--- a/elpa/mode-icons-20190627.2121/icons/rainbow.xpm
+++ /dev/null
@@ -1,162 +0,0 @@
-/* XPM */
-static char * E:\EmacsPortable_App\Data\src\mode_icons\icons\rainbow_xpm[] = {
-"16 16 143 2",
-" c None",
-". c #9243C2",
-"+ c #B369D8",
-"@ c #BF77E0",
-"# c #C579E3",
-"$ c #872DB1",
-"% c #B36CD9",
-"& c #D888F1",
-"* c #F076FF",
-"= c #BD66FA",
-"- c #915DEF",
-"; c #AA93F6",
-"> c #41258E",
-", c #AA61D1",
-"' c #E285FA",
-") c #C75AFD",
-"! c #6558E6",
-"~ c #216AD4",
-"{ c #3385DE",
-"] c #489EE9",
-"^ c #84C6F7",
-"/ c #1F5C8F",
-"( c #C37EE3",
-"_ c #E262FF",
-": c #615BE5",
-"< c #2274D6",
-"[ c #54ADEF",
-"} c #6FDFFF",
-"| c #6FE1E5",
-"1 c #6ADA8D",
-"2 c #96EBA1",
-"3 c #307F52",
-"4 c #CF85ED",
-"5 c #BF4CFA",
-"6 c #2A6CD7",
-"7 c #4CA0EA",
-"8 c #71E5FF",
-"9 c #69D995",
-"0 c #58D208",
-"a c #6BD700",
-"b c #9FE625",
-"c c #C5F570",
-"d c #668D11",
-"e c #CA82E9",
-"f c #BD4EFA",
-"g c #256FD6",
-"h c #62C7F9",
-"i c #6DDED2",
-"j c #59D20B",
-"k c #8EE119",
-"l c #EAFB58",
-"m c #FFFF69",
-"n c #FFDF41",
-"o c #FFDF6F",
-"p c #9C7D11",
-"q c #B772DA",
-"r c #CF54FD",
-"s c #216BD4",
-"t c #66CEFD",
-"u c #6AD9AC",
-"v c #60D400",
-"w c #DCF74C",
-"x c #FFF65C",
-"y c #FFC31B",
-"z c #FF9F00",
-"A c #F37200",
-"B c #F78A50",
-"C c #902B00",
-"D c #9449C0",
-"E c #EE75FF",
-"F c #3B66DB",
-"G c #59B7F4",
-"H c #6ADABE",
-"I c #F1FF63",
-"J c #FED536",
-"K c #FFA300",
-"L c #EA440A",
-"M c #E63449",
-"N c #D83C47",
-"O c #D23C3D",
-"P c #940000",
-"Q c #CB82E9",
-"R c #8F52F0",
-"S c #3B8AE2",
-"T c #70E3F1",
-"U c #58D200",
-"V c #EFFD5E",
-"W c #FECB2A",
-"X c #FA9300",
-"Y c #E32027",
-"Z c #D1393C",
-"` c #8E0000",
-" . c #8E43B9",
-".. c #F174FF",
-"+. c #2969D5",
-"@. c #67D1FF",
-"#. c #63D64B",
-"$. c #B7EC37",
-"%. c #FFE546",
-"&. c #FC9D00",
-"*. c #E31D2D",
-"=. c #B82021",
-"-. c #B973DB",
-";. c #A75AF4",
-">. c #3888E1",
-",. c #6FE1E7",
-"'. c #FFFF71",
-"). c #FFAE00",
-"!. c #E5271B",
-"~. c #C1292B",
-"{. c #D483EE",
-"]. c #6457E7",
-"^. c #57B3F0",
-"/. c #67D77A",
-"(. c #ACE92F",
-"_. c #FFD73B",
-":. c #F47501",
-"<. c #DC3B46",
-"[. c #EA84FF",
-"}. c #3D61DB",
-"|. c #66CFFF",
-"1. c #5BD31C",
-"2. c #E6FB57",
-"3. c #FFBF13",
-"4. c #E83D1D",
-"5. c #C12A2A",
-"6. c #7D2DAC",
-"7. c #F87CFF",
-"8. c #0E60CF",
-"9. c #6AE5FF",
-"0. c #4ACE00",
-"a. c #FFAA00",
-"b. c #E7343F",
-"c. c #9A0000",
-"d. c #893AB8",
-"e. c #D06BDD",
-"f. c #5386C3",
-"g. c #8AD0EC",
-"h. c #73C132",
-"i. c #E4DF8B",
-"j. c #DCAC42",
-"k. c #C83F4E",
-"l. c #9C0000",
-" . + @ # $ ",
-" % & * = - ; > ",
-" , ' ) ! ~ { ] ^ / ",
-" ( _ : < [ } | 1 2 3 ",
-" 4 5 6 7 8 9 0 a b c d ",
-" e f g h i j k l m n o p ",
-" q r s t u v w x y z A B C ",
-" D E F G H v I J K L M N O P ",
-" Q R S T U V W X Y Z ` ",
-" ...+.@.#.$.%.&.*.=. ",
-" -.;.>.,.v '.).!.~. ",
-" {.].^./.(._.:.<. ",
-" [.}.|.1.2.3.4.5. ",
-"6.7.8.9.0.m a.b.c. ",
-"d.e.f.g.h.i.j.k.l. ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/react.xpm b/elpa/mode-icons-20190627.2121/icons/react.xpm
deleted file mode 100644
index cf5cbe3..0000000
--- a/elpa/mode-icons-20190627.2121/icons/react.xpm
+++ /dev/null
@@ -1,26 +0,0 @@
-/* XPM */
-static char * react_xpm[] = {
-"16 16 7 1",
-" c None",
-". c #4B4B4B",
-"+ c #282828",
-"@ c #61DAFB",
-"# c #006482",
-"$ c #006783",
-"% c #006784",
-" .++++++++++++. ",
-".+++@@++++@@+++.",
-"+++@+#@++@#+@+++",
-"+++@++#@@#++@+++",
-"+++@++@@@@++@+++",
-"++$@@@%++%@@@$++",
-"+@@@@%++++%@@@@+",
-"@++$@++@@++@$++@",
-"@++$@++@@++@$++@",
-"+@@@@%++++%@@@@+",
-"++$@@@%++%@@@$++",
-"+++@+#@@@@#+@+++",
-"+++@++#@@#++@+++",
-"+++@++@++@++@+++",
-".+++@@++++@@+++.",
-" .++++++++++++. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/ruby.xpm b/elpa/mode-icons-20190627.2121/icons/ruby.xpm
deleted file mode 100644
index f35ba49..0000000
--- a/elpa/mode-icons-20190627.2121/icons/ruby.xpm
+++ /dev/null
@@ -1,231 +0,0 @@
-/* XPM */
-static char * ruby_xpm[] = {
-"16 16 212 2",
-" c None",
-". c #E57E74",
-"+ c #EA8D82",
-"@ c #E38A82",
-"# c #CA271A",
-"$ c #BB0F02",
-"% c #A10D04",
-"& c #8C1009",
-"* c #E6B5AE",
-"= c #C5392E",
-"- c #BF0D00",
-"; c #C70C00",
-"> c #CF0D00",
-", c #EEA197",
-"' c #C96963",
-") c #A20700",
-"! c #990F07",
-"~ c #8B130B",
-"{ c #7E190F",
-"] c #D28076",
-"^ c #AD0B00",
-"/ c #B10900",
-"( c #BA1501",
-"_ c #C21903",
-": c #C70F00",
-"< c #E98A7A",
-"[ c #EEAD9D",
-"} c #B3291B",
-"| c #9A0F09",
-"1 c #93120C",
-"2 c #87130C",
-"3 c #CA6E63",
-"4 c #A60400",
-"5 c #AD1100",
-"6 c #B01401",
-"7 c #B31301",
-"8 c #B91401",
-"9 c #C31F0B",
-"0 c #D75440",
-"a c #CD2B12",
-"b c #C92713",
-"c c #AB180B",
-"d c #88130C",
-"e c #7E130B",
-"f c #CE8276",
-"g c #A10500",
-"h c #A91400",
-"i c #AC1501",
-"j c #AE1401",
-"k c #B00800",
-"l c #CA4D3F",
-"m c #C73D2E",
-"n c #B61100",
-"o c #B51505",
-"p c #B41404",
-"q c #9D1106",
-"r c #820E09",
-"s c #9A0C00",
-"t c #A31300",
-"u c #A71501",
-"v c #A91501",
-"w c #AB1501",
-"x c #AC0E00",
-"y c #B62718",
-"z c #E0ABA7",
-"A c #A81509",
-"B c #A60C00",
-"C c #A10D01",
-"D c #9A0D02",
-"E c #910F04",
-"F c #8F0603",
-"G c #A03C32",
-"H c #8E0600",
-"I c #9E1501",
-"J c #A41601",
-"K c #A71601",
-"L c #A71100",
-"M c #AB150A",
-"N c #E19C8F",
-"O c #F0C0B3",
-"P c #A11408",
-"Q c #9F0900",
-"R c #9E0D02",
-"S c #930D04",
-"T c #880E06",
-"U c #940100",
-"V c #8D0B00",
-"W c #860C00",
-"X c #931101",
-"Y c #A10F00",
-"Z c #A81C0D",
-"` c #D06A58",
-" . c #E37357",
-".. c #DD5D3F",
-"+. c #AA1F0F",
-"@. c #940A00",
-"#. c #940E04",
-"$. c #900F05",
-"%. c #8F0904",
-"&. c #990000",
-"*. c #EDBDB7",
-"=. c #B8210F",
-"-. c #8F1003",
-";. c #850A00",
-">. c #8C0200",
-",. c #A83224",
-"'. c #CC6255",
-"). c #CA3524",
-"!. c #C32412",
-"~. c #C52615",
-"{. c #AA170B",
-"]. c #8F0C03",
-"^. c #8B0F06",
-"/. c #871008",
-"(. c #950301",
-"_. c #9A0000",
-":. c #F0B2A7",
-"<. c #DC7266",
-"[. c #B92716",
-"}. c #951E14",
-"|. c #B7736E",
-"1. c #D18179",
-"2. c #B91A11",
-"3. c #B50F02",
-"4. c #B51306",
-"5. c #B51206",
-"6. c #AA1206",
-"7. c #8C0E06",
-"8. c #870F08",
-"9. c #891207",
-"0. c #980702",
-"a. c #A30402",
-"b. c #DA462F",
-"c. c #F4CFC9",
-"d. c #EEB5AA",
-"e. c #F0C1B5",
-"f. c #F3C5BB",
-"g. c #A71A13",
-"h. c #9D0700",
-"i. c #A40F03",
-"j. c #A70E02",
-"k. c #AB0E01",
-"l. c #A90E01",
-"m. c #8A0F07",
-"n. c #881108",
-"o. c #8B1205",
-"p. c #9E0E06",
-"q. c #B81507",
-"r. c #CE5748",
-"s. c #ED8A6E",
-"t. c #EB7656",
-"u. c #CF442F",
-"v. c #9E0703",
-"w. c #9D0C01",
-"x. c #980D02",
-"y. c #930D03",
-"z. c #980D03",
-"A. c #8E0F06",
-"B. c #8A1206",
-"C. c #891104",
-"D. c #A01308",
-"E. c #A20F08",
-"F. c #AF140B",
-"G. c #DB3B21",
-"H. c #DD391F",
-"I. c #9C0A04",
-"J. c #9B0C01",
-"K. c #990D02",
-"L. c #910D04",
-"M. c #870D05",
-"N. c #940C07",
-"O. c #AC0E09",
-"P. c #951207",
-"Q. c #830F02",
-"R. c #9D1508",
-"S. c #9E1108",
-"T. c #A00E09",
-"U. c #BB1B0F",
-"V. c #C41E12",
-"W. c #A80E0B",
-"X. c #9C0C03",
-"Y. c #960C00",
-"Z. c #A30D08",
-"`. c #BA110C",
-" + c #C41711",
-".+ c #C81C13",
-"++ c #9C1508",
-"@+ c #921304",
-"#+ c #9C1109",
-"$+ c #98140D",
-"%+ c #9E120B",
-"&+ c #AC0808",
-"*+ c #A30D0A",
-"=+ c #920C00",
-"-+ c #8E0E04",
-";+ c #9E0F08",
-">+ c #AF130C",
-",+ c #B7170E",
-"'+ c #C21C12",
-")+ c #D22317",
-"!+ c #DA291C",
-"~+ c #AE2212",
-"{+ c #97170C",
-"]+ c #8F190F",
-"^+ c #A20B0A",
-"/+ c #A10D07",
-"(+ c #9A0D04",
-"_+ c #981108",
-":+ c #9B120A",
-"<+ c #9F140B",
-"[+ c #A2150A",
-"}+ c #A7170C",
-" . + @ # $ % & ",
-" * = - ; > , ' ) ! ~ { ",
-" ] ^ / ( _ : < [ } | 1 2 ",
-" 3 4 5 6 7 8 9 0 a b c d e ",
-" f g h i j 6 k l m n o p q r ",
-" s t u v w x y z A B C D E F ",
-" G H I J K L M N O P Q R S T U ",
-" V W X I Y Z ` ...+.@.#.$.%.&.",
-"*.=.-.;.>.,.'.).!.~.{.].^./.(._.",
-":.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.",
-"b.c.d.e.f.g.h.i.j.k.l.m.n.o.p. ",
-"q.r.s.t.u.v.w.x.S y.z.A.B.C.D. ",
-"E.F.G.H.2.I.J.K.L.M.N.O.P.Q.R. ",
-"S.T.U.V.W.X.Y.y.L.Z.`. +.+++@+ ",
-"#+$+%+&+*+J.=+-+;+>+,+'+)+!+~+ ",
-" {+]+^+/+(+_+:+<+[+}+ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/rust.xpm b/elpa/mode-icons-20190627.2121/icons/rust.xpm
deleted file mode 100644
index 4eabcf0..0000000
--- a/elpa/mode-icons-20190627.2121/icons/rust.xpm
+++ /dev/null
@@ -1,63 +0,0 @@
-/* XPM */
-static char * favicon_rustlang_xpm[] = {
-"16 16 44 1",
-" c None",
-". c #666565",
-"+ c #000000",
-"@ c #030000",
-"# c #FEFEFE",
-"$ c #010000",
-"% c #868686",
-"& c #FFFFFF",
-"* c #787878",
-"= c #878686",
-"- c #2C2A2A",
-"; c #7F7F7F",
-"> c #808080",
-", c #3B3838",
-"' c #140F0F",
-") c #130E0E",
-"! c #3C3939",
-"~ c #7F7D7D",
-"{ c #EBEAEA",
-"] c #8B8B8B",
-"^ c #636262",
-"/ c #9D9C9C",
-"( c #0C0808",
-"_ c #676666",
-": c #080202",
-"< c #C1C1C1",
-"[ c #C7C7C7",
-"} c #1E1B1B",
-"| c #0D0909",
-"1 c #EEEEEE",
-"2 c #050000",
-"3 c #E7E5E5",
-"4 c #F2F2F2",
-"5 c #605F5F",
-"6 c #BFBFBF",
-"7 c #F3F3F3",
-"8 c #969696",
-"9 c #717070",
-"0 c #E4E3E3",
-"a c #151111",
-"b c #232020",
-"c c #D1CFCF",
-"d c #F7F6F6",
-"e c #797878",
-" .++. ",
-" ++@##@++ ",
-" ++$%&**&=+++ ",
-" +-&&&&&&&&-+ ",
-" +$;>>>>>>>&&++ ",
-".$,>')''''+>&!$.",
-"+#.&~+{&&{+]&.#+",
-"+^/&;+())(_&&/^+",
-"+:&&;+/<[}|&&1@+",
-"+2345+67&8+90a++",
-" +++$$$b&c$$+++ ",
-" ++#d&&&&&&d#++ ",
-" +^/&&&&&&/^+ ",
-" +#*#&&&&#e#+ ",
-" .++2::2++. ",
-" ++++ "};
diff --git a/elpa/mode-icons-20190627.2121/icons/sas.xpm b/elpa/mode-icons-20190627.2121/icons/sas.xpm
deleted file mode 100644
index c66904e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/sas.xpm
+++ /dev/null
@@ -1,106 +0,0 @@
-/* XPM */
-static char * E:\EmacsPortable_App\Data\src\mode_icons\icons\sas_xpm[] = {
-"15 16 87 1",
-" c None",
-". c #6095CB",
-"+ c #72A1D1",
-"@ c #4A85C4",
-"# c #3F7EC1",
-"$ c #4784C3",
-"% c #6497CC",
-"& c #88AFD8",
-"* c #6C9CCF",
-"= c #387ABF",
-"- c #3679BF",
-"; c #3A7BC0",
-"> c #3B7CC0",
-", c #377ABE",
-"' c #3C7DC0",
-") c #4381C2",
-"! c #3C7CC0",
-"~ c #6196CC",
-"{ c #3578BE",
-"] c #3A7CC0",
-"^ c #4280C2",
-"/ c #77A4D2",
-"( c #AAC6E4",
-"_ c #78A5D3",
-": c #6F9FD0",
-"< c #4985C4",
-"[ c #BAD1E9",
-"} c #407FC1",
-"| c #3E7EC1",
-"1 c #A9C5E3",
-"2 c #8CB2DA",
-"3 c #82ABD6",
-"4 c #4483C2",
-"5 c #3F7EC0",
-"6 c #3276BE",
-"7 c #4684C3",
-"8 c #85ADD8",
-"9 c #76A3D2",
-"0 c #3C7DC1",
-"a c #A9C6E2",
-"b c #81AAD6",
-"c c #3D7DC0",
-"d c #397BC0",
-"e c #3D7DC1",
-"f c #5D93CA",
-"g c #568FC9",
-"h c #3D7EC1",
-"i c #5A91CA",
-"j c #4D88C6",
-"k c #4080C1",
-"l c #6B9CCF",
-"m c #5D93CB",
-"n c #528BC7",
-"o c #568EC8",
-"p c #377ABF",
-"q c #689ACE",
-"r c #6799CE",
-"s c #4784C4",
-"t c #6296CC",
-"u c #568EC9",
-"v c #4482C3",
-"w c #4482C2",
-"x c #6195CC",
-"y c #3175BD",
-"z c #77A4D3",
-"A c #4D88C5",
-"B c #5890C9",
-"C c #578FC9",
-"D c #3477BD",
-"E c #5F94CB",
-"F c #4F89C6",
-"G c #6D9DD0",
-"H c #89B0D9",
-"I c #6D9ED0",
-"J c #568FC8",
-"K c #4A86C4",
-"L c #75A3D2",
-"M c #3F7FC1",
-"N c #4281C2",
-"O c #5C92CA",
-"P c #2D73BB",
-"Q c #558EC8",
-"R c #558DC7",
-"S c #5E93CB",
-"T c #5A90CA",
-"U c #6E9FD0",
-"V c #6E9ED0",
-" .+@#$%& ",
-" *=-;>,')'!~ ",
-" %{>]^/ (_ ",
-":{>><[ ",
-"}>>|1 23 ",
-"4]>5 '678 ",
-"9';0a bcdef ",
-" gh'i j>kl ",
-" m)=n op^q ",
-" r>p) s=>t",
-" uv=w x=y:",
-" zAB C=DE",
-" F{]=G",
-" H IJ{p]K ",
-" LvM,NO{P}QR ",
-" SlF$TUV "};
diff --git a/elpa/mode-icons-20190627.2121/icons/sass.xpm b/elpa/mode-icons-20190627.2121/icons/sass.xpm
deleted file mode 100644
index ff7a315..0000000
--- a/elpa/mode-icons-20190627.2121/icons/sass.xpm
+++ /dev/null
@@ -1,107 +0,0 @@
-/* XPM */
-static char * sass_xpm[] = {
-"16 16 88 1",
-" c None",
-". c #CD669A",
-"+ c #CD659A",
-"@ c #CD6599",
-"# c #CC6499",
-"$ c #CB6096",
-"% c #D06FA0",
-"& c #D57FAB",
-"* c #D682AC",
-"= c #D275A4",
-"- c #CA5E94",
-"; c #D379A7",
-"> c #EABCD3",
-", c #F6E3EC",
-"' c #F3DBE7",
-") c #F0D2E1",
-"! c #F5DFEA",
-"~ c #E4ABC8",
-"{ c #CB5E95",
-"] c #E4ACC8",
-"^ c #FEF9FB",
-"/ c #EDC8DA",
-"( c #D681AD",
-"_ c #D06E9F",
-": c #D173A3",
-"< c #F8EAF1",
-"[ c #D47BA9",
-"} c #CC6398",
-"| c #CD679B",
-"1 c #EEC9DB",
-"2 c #FAEFF5",
-"3 c #D786B0",
-"4 c #CC6298",
-"5 c #F7E5EE",
-"6 c #D47AA7",
-"7 c #CB6197",
-"8 c #EBC2D7",
-"9 c #F8E9F1",
-"0 c #D172A2",
-"a c #CB5F96",
-"b c #CF6A9D",
-"c c #E9BAD1",
-"d c #EDC7DB",
-"e c #CB5F95",
-"f c #FFFDFE",
-"g c #DA8BB2",
-"h c #D681AC",
-"i c #DB91B6",
-"j c #D887B0",
-"k c #E2A7C6",
-"l c #F0D0E0",
-"m c #E8B7D0",
-"n c #CF6B9E",
-"o c #FEFAFC",
-"p c #DA8CB4",
-"q c #D888B1",
-"r c #E1A3C2",
-"s c #DD95B9",
-"t c #D276A5",
-"u c #CE689C",
-"v c #CC6297",
-"w c #DA8EB4",
-"x c #F9EAF1",
-"y c #D47CA8",
-"z c #D683AD",
-"A c #EECADC",
-"B c #DE9ABC",
-"C c #DA8DB4",
-"D c #DA8EB5",
-"E c #D173A2",
-"F c #F8E9F0",
-"G c #DC93B8",
-"H c #E1A3C3",
-"I c #CE699C",
-"J c #F4DEEA",
-"K c #D886AF",
-"L c #EECBDC",
-"M c #D784AE",
-"N c #E9BDD3",
-"O c #EBBFD5",
-"P c #D47BA8",
-"Q c #CA5E95",
-"R c #E3A7C5",
-"S c #F2D4E3",
-"T c #EEC9DC",
-"U c #DB8FB5",
-"V c #CE6A9D",
-"W c #D681AB",
-" ....+@ ",
-" ...#$%&*=- ",
-" ...$;>,')!~{ ",
-" ...@]^/(%_:<[} ",
-" ..|1234+.+}56# ",
-"..7890a}#7bcde..",
-".#;fgehijklmn@..",
-".@nop7|qrstu....",
-"..vwxy+#4#......",
-"...7zABCDE#.....",
-"...+.>FsGH=.....",
-" .+IJKL0+M*.... ",
-" .aNO6A%|P%.... ",
-" QRSTU..#@... ",
-" VW:#...... ",
-" +..... "};
diff --git a/elpa/mode-icons-20190627.2121/icons/scheme.xpm b/elpa/mode-icons-20190627.2121/icons/scheme.xpm
deleted file mode 100644
index 721b32e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/scheme.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * scheme_xpm[] = {
-"13 16 3 1",
-" c None",
-". c #7d7d7d",
-"+ c #000000",
-" .... ",
-" .+++. ",
-".+..++. ",
-".+. .+. ",
-" . .+. ",
-" .+. ",
-" .++. ",
-" .+++. ",
-" .+++. ",
-" .++++. ",
-" .++.++. ",
-" .++..+. ",
-" .++. .+. . ",
-" .++. .++..+.",
-".++. .+++. ",
-" .. ... "};
diff --git a/elpa/mode-icons-20190627.2121/icons/slim.xpm b/elpa/mode-icons-20190627.2121/icons/slim.xpm
deleted file mode 100644
index 42f642f..0000000
--- a/elpa/mode-icons-20190627.2121/icons/slim.xpm
+++ /dev/null
@@ -1,163 +0,0 @@
-/* XPM */
-static char * slim_xpm[] = {
-"16 16 144 2",
-" c None",
-". c #6B6B66",
-"+ c #767772",
-"@ c #60615C",
-"# c #242621",
-"$ c #62635D",
-"% c #C4C6C2",
-"& c #C7C9C6",
-"* c #C4C6C3",
-"= c #ADAEAB",
-"- c #949590",
-"; c #A8A89F",
-"> c #C1C4C0",
-", c #CFD0CE",
-"' c #E5E6E4",
-") c #CACCC9",
-"! c #A8AAA7",
-"~ c #BBBCB7",
-"{ c #74746F",
-"] c #494A48",
-"^ c #3A3A3A",
-"/ c #93958C",
-"( c #C6C9C6",
-"_ c #D8D9D6",
-": c #E7E8E4",
-"< c #DFE1DD",
-"[ c #D4D6D3",
-"} c #C7C9C7",
-"| c #A5A6A0",
-"1 c #393939",
-"2 c #353635",
-"3 c #5B5C58",
-"4 c #3B3C3A",
-"5 c #383838",
-"6 c #878880",
-"7 c #CCCECC",
-"8 c #D6D8D5",
-"9 c #D5D4D1",
-"0 c #D1CFCC",
-"a c #D0D2CF",
-"b c #C6C8C6",
-"c c #3B3B39",
-"d c #3D3D3C",
-"e c #6F7069",
-"f c #9C9F99",
-"g c #C9CAC8",
-"h c #CACAC6",
-"i c #CBCAC8",
-"j c #BCBFBC",
-"k c #B8BAB5",
-"l c #767672",
-"m c #3D3D3D",
-"n c #3C3D3C",
-"o c #3B3B3B",
-"p c #7D7E77",
-"q c #B0B2AE",
-"r c #BABCB9",
-"s c #C2C3C0",
-"t c #C5C7C2",
-"u c #7F807A",
-"v c #3C3C3C",
-"w c #3F403F",
-"x c #363636",
-"y c #666664",
-"z c #A2A29F",
-"A c #9B9B98",
-"B c #60615F",
-"C c #3E3E3E",
-"D c #3E3E3D",
-"E c #444444",
-"F c #4B4B4B",
-"G c #4D4D4E",
-"H c #525252",
-"I c #373737",
-"J c #3F3F3F",
-"K c #474747",
-"L c #A1A1A1",
-"M c #8A8A8A",
-"N c #404040",
-"O c #787777",
-"P c #646464",
-"Q c #383938",
-"R c #4C4C4B",
-"S c #434343",
-"T c #424242",
-"U c #B5B6B5",
-"V c #7D7D7C",
-"W c #848384",
-"X c #B9B9B8",
-"Y c #727372",
-"Z c #A3A4A4",
-"` c #7F7F7E",
-" . c #A0A0A0",
-".. c #393938",
-"+. c #9F9F9F",
-"@. c #454645",
-"#. c #808080",
-"$. c #8C8D8C",
-"%. c #858585",
-"&. c #2B2B2B",
-"*. c #BABABA",
-"=. c #2D2D2C",
-"-. c #585858",
-";. c #5C5C5C",
-">. c #424241",
-",. c #3D3E3D",
-"'. c #575757",
-"). c #414141",
-"!. c #727272",
-"~. c #6B6B6A",
-"{. c #807F7F",
-"]. c #8D8F8E",
-"^. c #7B7B7B",
-"/. c #2F2F2F",
-"(. c #B5B5B4",
-"_. c #5A5A5A",
-":. c #434342",
-"<. c #363635",
-"[. c #757574",
-"}. c #737473",
-"|. c #545454",
-"1. c #595958",
-"2. c #515151",
-"3. c #686867",
-"4. c #343434",
-"5. c #454545",
-"6. c #898A85",
-"7. c #6D6D6B",
-"8. c #494947",
-"9. c #40403F",
-"0. c #414241",
-"a. c #444443",
-"b. c #484847",
-"c. c #6A6B67",
-"d. c #95948F",
-"e. c #C0C0B9",
-"f. c #B4B4AC",
-"g. c #ACACA6",
-"h. c #AAAAA4",
-"i. c #A8A9A4",
-"j. c #ACADA7",
-"k. c #AFB0AA",
-"l. c #B7B8B1",
-"m. c #BFC0B9",
-" . + @ # ",
-" $ % & * = - ",
-" ; > , ' ' ) ! ~ ",
-" { ] ^ / ( _ : < [ } | 1 2 3 ",
-" 4 5 1 6 7 8 9 0 a b - 5 1 c ",
-" d 1 1 e f g h i j k l 1 1 m ",
-" n ^ ^ o p q r s t u v 1 ^ w ",
-" d 5 5 5 x y z A B x 5 1 5 C ",
-" D 1 E F o G H I 1 ^ ^ ^ ^ J ",
-" m K L M N O P Q R 5 S T 5 J ",
-" d ^ U N J V W X Y Z ` .S C ",
-" D 5 ..+.@.#.$.%.&.*.=.-.;.>. ",
-" ,.'.).!.~.{.].^./.(.&._._.:. ",
-" <.o [.}.5 |.1.2.x 3.4.5.E d ",
-" 6.7.8.:.9.D n D J 0.a.b.c.d. ",
-" e.f.g.h.i.h.j.k.l.m. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/smartparens.xpm b/elpa/mode-icons-20190627.2121/icons/smartparens.xpm
deleted file mode 100644
index 08d8d84..0000000
--- a/elpa/mode-icons-20190627.2121/icons/smartparens.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * smartparens_xpm[] = {
-"16 16 10 1",
-" c None",
-". c #225A9B",
-"+ c #215A9B",
-"@ c #23599C",
-"# c #225A9C",
-"$ c #235A9B",
-"% c #22599B",
-"& c #235B9B",
-"* c #23599B",
-"= c #21599B",
-" ",
-" ",
-" .. +. ",
-" @.# .. ",
-" .. .. ",
-" .. .+ ",
-" ..$ .. ",
-" ..+ .. ",
-" %.+ .. ",
-" ..& .. ",
-" .. .. ",
-" .. #. ",
-" +.* .. ",
-" .. =. ",
-" ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/spacemacs.png b/elpa/mode-icons-20190627.2121/icons/spacemacs.png
deleted file mode 100644
index 59f5a08..0000000
--- a/elpa/mode-icons-20190627.2121/icons/spacemacs.png
+++ /dev/null
Binary files differ
diff --git a/elpa/mode-icons-20190627.2121/icons/spacemacs.xpm b/elpa/mode-icons-20190627.2121/icons/spacemacs.xpm
deleted file mode 100644
index 53c7f5c..0000000
--- a/elpa/mode-icons-20190627.2121/icons/spacemacs.xpm
+++ /dev/null
@@ -1,180 +0,0 @@
-/* XPM */
-static char * spacemacs_xpm[] = {
-"16 16 161 2",
-" c None",
-". c #EEEEEC",
-"+ c #EBE9E9",
-"@ c #E8E4E5",
-"# c #DBD7E0",
-"$ c #B3A8CB",
-"% c #A79BC5",
-"& c #A393C1",
-"* c #9B8BB9",
-"= c #9283B0",
-"- c #877AA7",
-"; c #AFA6CC",
-"> c #B4ADD0",
-", c #C5C0D7",
-"' c #DCD5DB",
-") c #BEB5D0",
-"! c #A99DC6",
-"~ c #A293C0",
-"{ c #B8ACC8",
-"] c #9385B0",
-"^ c #8275A1",
-"/ c #ADA4CB",
-"( c #B5AFD2",
-"_ c #BAB7D7",
-": c #BCBAD9",
-"< c #BCB9D8",
-"[ c #D0C9D6",
-"} c #BFB5CF",
-"| c #A699C4",
-"1 c #AC9EC3",
-"2 c #D7C6D5",
-"3 c #81719E",
-"4 c #7B6E9A",
-"5 c #B6ADCF",
-"6 c #B6AEC7",
-"7 c #B9B5D7",
-"8 c #C0C0DD",
-"9 c #B9B5D6",
-"0 c #C7BDD1",
-"a c #BCAFCB",
-"b c #A090BE",
-"c c #E7DCE1",
-"d c #8876A2",
-"e c #7B6D9A",
-"f c #726590",
-"g c #A89CC6",
-"h c #9F92AF",
-"i c #DEDCE2",
-"j c #CDCDE1",
-"k c #C0C0DC",
-"l c #B9B6D7",
-"m c #B1AACF",
-"n c #C5BACF",
-"o c #AFA0C4",
-"p c #E1D8DD",
-"q c #B4A4C1",
-"r c #7E709C",
-"s c #726591",
-"t c #9385AF",
-"u c #9687A1",
-"v c #E5E5E7",
-"w c #E6E6E9",
-"x c #D1CFE0",
-"y c #BFB9D6",
-"z c #AFA6CD",
-"A c #A99CC5",
-"B c #C4B7CB",
-"C c #DFD9DD",
-"D c #D6C6D4",
-"E c #7D6F9B",
-"F c #716490",
-"G c #9989B8",
-"H c #A394C1",
-"I c #A79BC4",
-"J c #523667",
-"K c #705B88",
-"L c #CAC7DC",
-"M c #E3E1E7",
-"N c #EAE8E6",
-"O c #E3DDDF",
-"P c #D7CED7",
-"Q c #D0C5D0",
-"R c #EAE3E1",
-"S c #EBDFE2",
-"T c #7A6D99",
-"U c #6F628E",
-"V c #635982",
-"W c #9485B2",
-"X c #9C8DBA",
-"Y c #A495C2",
-"Z c #6F5787",
-"` c #583C6D",
-" . c #A194BD",
-".. c #ADA3CB",
-"+. c #BDB4D2",
-"@. c #D8D3DC",
-"#. c #E6E0DF",
-"$. c #E3DBDA",
-"%. c #E0D5D5",
-"&. c #F2EAE7",
-"*. c #83769E",
-"=. c #6C5F8B",
-"-. c #615681",
-";. c #8D7CAB",
-">. c #9C8CBA",
-",. c #8773A3",
-"'. c #664C7C",
-"). c #806B9A",
-"!. c #A597C3",
-"~. c #9E8EBC",
-"{. c #AA9EC0",
-"]. c #CDC4CF",
-"^. c #E2D9D8",
-"/. c #E7DEDC",
-"(. c #AB9CB6",
-"_. c #685B87",
-":. c #8B7DA9",
-"<. c #8D7CAA",
-"[. c #705687",
-"}. c #755A8B",
-"|. c #9889B5",
-"1. c #9989B7",
-"2. c #8E7FAC",
-"3. c #8778A5",
-"4. c #968AAC",
-"5. c #D3C8CE",
-"6. c #B2A7BA",
-"7. c #625681",
-"8. c #8173A0",
-"9. c #8779A6",
-"0. c #8B7BA8",
-"a. c #755E8E",
-"b. c #776190",
-"c. c #8674A1",
-"d. c #8A7BA8",
-"e. c #8476A3",
-"f. c #766995",
-"g. c #726690",
-"h. c #877C9A",
-"i. c #7E719D",
-"j. c #786492",
-"k. c #786593",
-"l. c #7B6997",
-"m. c #8274A1",
-"n. c #7F719C",
-"o. c #746793",
-"p. c #6E618C",
-"q. c #665A85",
-"r. c #796D98",
-"s. c #756591",
-"t. c #766692",
-"u. c #786A97",
-"v. c #70638F",
-"w. c #6B5E89",
-"x. c #645883",
-"y. c #6C608B",
-"z. c #706590",
-"A. c #6D608B",
-"B. c #6C5F89",
-"C. c #695C87",
-"D. c #625682",
-" . . ",
-" . + @ # $ % & * = - ",
-" ; > , ' ) ! ~ { ] ^ ",
-" / ( _ : < [ } | 1 2 3 4 ",
-" 5 6 7 8 8 8 9 0 a b c d e f ",
-" g h i j k 8 l m n o p q r s ",
-" | t u v w x y z A B C D E F ",
-"G H I J K L M N O P Q R S T U V ",
-"W X Y Z ` ...+.@.#.$.%.&.*.=.-.",
-";.W >.,.'.).!.H ~.{.].^./.(._. ",
-" :.= <.[.}.|.1.W 2.3.4.5.6.7. ",
-" 8.9.0.a.b.c.2.d.e.r f.g.h.7. ",
-" E i.j.k.l.m.n.T o.p.q.7. ",
-" r.s.s.t.u.4 v.w.x.-. ",
-" y.z.A.B.C.x.7.7. ",
-" D.7.7.D. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/svg.xpm b/elpa/mode-icons-20190627.2121/icons/svg.xpm
deleted file mode 100644
index eb3a19e..0000000
--- a/elpa/mode-icons-20190627.2121/icons/svg.xpm
+++ /dev/null
@@ -1,71 +0,0 @@
-/* XPM */
-static char * svg_xpm[] = {
-"16 16 52 1",
-" c None",
-". c #000000",
-"+ c #160F05",
-"@ c #DD9933",
-"# c #DB9833",
-"$ c #130C04",
-"% c #38270D",
-"& c #2B1E0A",
-"* c #FFB13B",
-"= c #33230C",
-"- c #2D1F0A",
-"; c #36250C",
-"> c #3A280D",
-", c #F9AD3A",
-"' c #1B1306",
-") c #ECA437",
-"! c #E8A136",
-"~ c #1F1607",
-"{ c #FAAE3A",
-"] c #FEB03B",
-"^ c #35250C",
-"/ c #2F210B",
-"( c #BC822B",
-"_ c #090602",
-": c #EAA236",
-"< c #E6A035",
-"[ c #0A0702",
-"} c #BF852C",
-"| c #1E1507",
-"1 c #C1862D",
-"2 c #EFA637",
-"3 c #BE842C",
-"4 c #1D1407",
-"5 c #130D04",
-"6 c #34240C",
-"7 c #0C0803",
-"8 c #010100",
-"9 c #DE9A33",
-"0 c #EEA537",
-"a c #F3A938",
-"b c #F2A838",
-"c c #E09B34",
-"d c #F0A738",
-"e c #DC9933",
-"f c #140E05",
-"g c #C2872D",
-"h c #1C1306",
-"i c #2A1D0A",
-"j c #3B290E",
-"k c #201607",
-"l c #FBAE3A",
-"m c #140D04",
-" .. ",
-" +@#$ ",
-" .%&.%**=.-;. ",
-" >*,'.)!.~{]^ ",
-" /{*(_:<[}*,& ",
-" .|1*(2)}*34. ",
-" 56.71****}[.^$ ",
-"89*20a****b02*#.",
-"8c*20b****b0d*e.",
-" +;.[}****(_.%f ",
-" .4}*}2)g*(h. ",
-" /{*}[:<7g*,i ",
-" j*,h.)!.kl*; ",
-" .>-.%**=./%. ",
-" +c9m ",
-" 8. "};
diff --git a/elpa/mode-icons-20190627.2121/icons/term.xpm b/elpa/mode-icons-20190627.2121/icons/term.xpm
deleted file mode 100644
index d0e8200..0000000
--- a/elpa/mode-icons-20190627.2121/icons/term.xpm
+++ /dev/null
@@ -1,79 +0,0 @@
-/* XPM */
-static char * term_xpm[] = {
-"16 16 60 1",
-" c None",
-". c #090909",
-"+ c #080808",
-"@ c #070707",
-"# c #616161",
-"$ c #6B6B6B",
-"% c #6C6C6C",
-"& c #6D6D6D",
-"* c #6E6E6E",
-"= c #626262",
-"- c #3E3E3E",
-"; c #303030",
-"> c #404040",
-", c #313131",
-"' c #323232",
-") c #3F3F3F",
-"! c #3A3A3A",
-"~ c #515151",
-"{ c #D3D3D3",
-"] c #828282",
-"^ c #2D2D2D",
-"/ c #2F2F2F",
-"( c #2C2C2C",
-"_ c #060606",
-": c #363636",
-"< c #D8D8D8",
-"[ c #3B3B3B",
-"} c #262626",
-"| c #2B2B2B",
-"1 c #2A2A2A",
-"2 c #393939",
-"3 c #A9A9A9",
-"4 c #BEBEBE",
-"5 c #252525",
-"6 c #292929",
-"7 c #282828",
-"8 c #373737",
-"9 c #494949",
-"0 c #B4B4B4",
-"a c #474747",
-"b c #222222",
-"c c #272727",
-"d c #343434",
-"e c #2E2E2E",
-"f c #1C1C1C",
-"g c #171717",
-"h c #5B5B5B",
-"i c #8A8A8A",
-"j c #242424",
-"k c #050505",
-"l c #202020",
-"m c #1D1D1D",
-"n c #1F1F1F",
-"o c #1B1B1B",
-"p c #191919",
-"q c #232323",
-"r c #212121",
-"s c #1E1E1E",
-"t c #040404",
-"u c #353535",
-" ",
-" .++++++++++. ",
-" @#$%&&***&%$=@ ",
-" @-;>,''''',;)@ ",
-" @!~{]^////^(!@ ",
-" _:]<[}||||112@ ",
-" _'-3456666678_ ",
-" _/90abccccccd_ ",
-" _efgfhiij555'_ ",
-" k/lmnoppmqbb/k ",
-" k^lrrnnnnrrl^k ",
-" k|nnnnnnnnnn|k ",
-" k6mmmssssmmm6k ",
-" t/dduuuuuuud/t ",
-" tkkkkkkkkkkt ",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/xml.xpm b/elpa/mode-icons-20190627.2121/icons/xml.xpm
deleted file mode 100644
index db58ed3..0000000
--- a/elpa/mode-icons-20190627.2121/icons/xml.xpm
+++ /dev/null
@@ -1,91 +0,0 @@
-/* XPM */
-static char *xml[] = {
-/* columns rows colors chars-per-pixel */
-"16 16 69 1 ",
-" c #CE392C",
-". c #CE392D",
-"X c #CE3A2E",
-"o c #D2382B",
-"O c #D1382C",
-"+ c #D1392C",
-"@ c #D4392C",
-"# c #D7392C",
-"$ c #D9392D",
-"% c #D93A2D",
-"& c #DB3A2D",
-"* c #DE3B2E",
-"= c #DF3B2E",
-"- c #C73D31",
-"; c #CC3D31",
-": c #CE3C30",
-"> c #CF3D31",
-", c #D33D31",
-"< c #D23F33",
-"1 c #DD3D30",
-"2 c #E03B2E",
-"3 c #E03C2E",
-"4 c #E13C2E",
-"5 c #E23C2E",
-"6 c #E33C2E",
-"7 c #E73D2F",
-"8 c #E83D2F",
-"9 c #E93E30",
-"0 c #CF4337",
-"q c #CE453A",
-"w c #D14135",
-"e c #D94337",
-"r c #D04338",
-"t c #D1493E",
-"y c #D64B3F",
-"u c #D84B40",
-"i c #D84E43",
-"p c #D84F44",
-"a c #D9584D",
-"s c #DC6056",
-"d c #D9655C",
-"f c #DD6E65",
-"g c #E2756C",
-"h c #EB8D86",
-"j c #EB8E86",
-"k c #E99189",
-"l c #EC9088",
-"z c #ED9189",
-"x c #ED9D96",
-"c c #EF9D96",
-"v c #EF9F98",
-"b c #F0A6A0",
-"n c #F3ABA5",
-"m c #F3ACA6",
-"M c #F3ADA7",
-"N c #F7C4C0",
-"B c #FAE2E0",
-"V c #F9E4E2",
-"C c #FCEDEB",
-"Z c #FCEDEC",
-"A c #FDF2F1",
-"S c #FDF5F4",
-"D c #FCF6F5",
-"F c #FCFBFB",
-"G c #FEFAFA",
-"H c #FDFCFC",
-"J c #FEFDFD",
-"K c #FEFEFE",
-"L c #FFFFFF",
-/* pixels */
-"LLLLLLLLLLLLLLLL",
-"LLLLLLLLLLLLLLLL",
-"LLLLLLLLLVDLLLLL",
-"LLLLLLLLs7,LLLLL",
-"LLLLLLLJo9XLLLLL",
-"LLLAp<Sm891yBLLL",
-"LCi*99Z09=294uBL",
-"k*99&aH#9>d$995g",
-"t992zLl99lLn399;",
-"N.899,:9%Fw899+M",
-"LLc 8969rG29OjLL",
-"LLLLve98nKfhLLLL",
-"LLLLL-9@JLLLLLLL",
-"LLLLLxqbLLLLLLLL",
-"LLLLLLLLLLLLLLLL",
-"LLLLLLLLLLLLLLLL"
-};
diff --git a/elpa/mode-icons-20190627.2121/icons/yaml.xpm b/elpa/mode-icons-20190627.2121/icons/yaml.xpm
deleted file mode 100644
index 4cfeb31..0000000
--- a/elpa/mode-icons-20190627.2121/icons/yaml.xpm
+++ /dev/null
@@ -1,257 +0,0 @@
-/* XPM */
-static char * yaml_xpm[] = {
-"45 16 238 2",
-" c None",
-". c #F19932",
-"+ c #F2962B",
-"@ c #F2982E",
-"# c #F4B264",
-"$ c #F19427",
-"% c #F29528",
-"& c #F1A750",
-"* c #F2972D",
-"= c #F19C39",
-"- c #F2972B",
-"; c #F2AE5D",
-"> c #F29628",
-", c #F39424",
-"' c #EEA044",
-") c #F08E1B",
-"! c #F18F1C",
-"~ c #F09020",
-"{ c #F5B66B",
-"] c #F29629",
-"^ c #EF8D19",
-"/ c #ED8F1F",
-"( c #EDA651",
-"_ c #F09D3B",
-": c #F2911E",
-"< c #F2901D",
-"[ c #EF8F1D",
-"} c #F1972D",
-"| c #F19B38",
-"1 c #F2901C",
-"2 c #F08F1F",
-"3 c #F09F3E",
-"4 c #F1BD7E",
-"5 c #EE9225",
-"6 c #F28B13",
-"7 c #E99531",
-"8 c #E88715",
-"9 c #EE8B15",
-"0 c #EF901C",
-"a c #F5B366",
-"b c #F29627",
-"c c #EC8A16",
-"d c #E2871A",
-"e c #E29944",
-"f c #F0A043",
-"g c #F19120",
-"h c #F08F1B",
-"i c #EF8D17",
-"j c #EA8A18",
-"k c #EA932B",
-"l c #F09731",
-"m c #EF8E1A",
-"n c #EF8D18",
-"o c #F08F1A",
-"p c #EF9D3B",
-"q c #F1B977",
-"r c #F29424",
-"s c #F18F1B",
-"t c #ED8B16",
-"u c #E98D1F",
-"v c #E99F48",
-"w c #EF8810",
-"x c #E3912F",
-"y c #ED8B14",
-"z c #EF901D",
-"A c #F5B162",
-"B c #F39528",
-"C c #DF851A",
-"D c #DA9543",
-"E c #EFA144",
-"F c #F1911F",
-"G c #EF8C17",
-"H c #EE8B14",
-"I c #EE8A13",
-"J c #E78918",
-"K c #E7922B",
-"L c #EF972F",
-"M c #F0901D",
-"N c #F2B673",
-"O c #F39529",
-"P c #F08E1A",
-"Q c #ED8A15",
-"R c #E98813",
-"S c #E58B1F",
-"T c #E89C43",
-"U c #EE880F",
-"V c #E3902D",
-"W c #E88714",
-"X c #EF9121",
-"Y c #F2A142",
-"Z c #F39629",
-"` c #DF8419",
-" . c #F0A144",
-".. c #E98917",
-"+. c #E0861B",
-"@. c #E88E22",
-"#. c #ED8C16",
-"$. c #E88918",
-"%. c #E8922B",
-"&. c #EF972E",
-"*. c #E18921",
-"=. c #E4881B",
-"-. c #ED8A14",
-";. c #EF9120",
-">. c #F0A449",
-",. c #F3972C",
-"'. c #EE8C19",
-"). c #DD8013",
-"!. c #E38F2B",
-"~. c #E88C1F",
-"{. c #E79D44",
-"]. c #E29030",
-"^. c #ED8B15",
-"/. c #EF8E19",
-"(. c #F08F1C",
-"_. c #E88816",
-":. c #DF8316",
-"<. c #EFA043",
-"[. c #F2911F",
-"}. c #EB8A17",
-"|. c #D77E15",
-"1. c #E99938",
-"2. c #EE8F1B",
-"3. c #EF972D",
-"4. c #D59342",
-"5. c #E58616",
-"6. c #EE8C17",
-"7. c #EB8A18",
-"8. c #D77B10",
-"9. c #D68C37",
-"0. c #EC8C18",
-"a. c #EB8D1F",
-"b. c #E69D44",
-"c. c #EF901E",
-"d. c #E58614",
-"e. c #DD8014",
-"f. c #F3911E",
-"g. c #ED8B17",
-"h. c #D87E15",
-"i. c #ED9C3C",
-"j. c #E78716",
-"k. c #D59648",
-"l. c #DE8923",
-"m. c #E48515",
-"n. c #E18315",
-"o. c #D37B12",
-"p. c #D58C34",
-"q. c #EF8F1E",
-"r. c #EC8F1F",
-"s. c #E69C43",
-"t. c #F39220",
-"u. c #E68715",
-"v. c #DD8115",
-"w. c #ED9F43",
-"x. c #F3911F",
-"y. c #EE8C18",
-"z. c #D87F15",
-"A. c #CE7917",
-"B. c #EE9D3D",
-"C. c #D69548",
-"D. c #DB8824",
-"E. c #D27A14",
-"F. c #D4882F",
-"G. c #EF8F20",
-"H. c #F39425",
-"I. c #ED8B18",
-"J. c #EFA045",
-"K. c #F2901E",
-"L. c #EE8D18",
-"M. c #EF9E3E",
-"N. c #D69549",
-"O. c #F39526",
-"P. c #EE8C1A",
-"Q. c #E08416",
-"R. c #DB9746",
-"S. c #EEA34A",
-"T. c #D97F15",
-"U. c #CD7917",
-"V. c #EF962D",
-"W. c #E69C44",
-"X. c #F08B11",
-"Y. c #E99530",
-"Z. c #F29526",
-"`. c #E08315",
-" + c #DB933D",
-".+ c #ED8C18",
-"++ c #D98015",
-"@+ c #EF9E3F",
-"#+ c #E88917",
-"$+ c #E6902A",
-"%+ c #EE952C",
-"&+ c #E68816",
-"*+ c #F08C16",
-"=+ c #EF8E1B",
-"-+ c #ED9022",
-";+ c #EC9226",
-">+ c #F09428",
-",+ c #EF9428",
-"'+ c #ED9227",
-")+ c #ED9226",
-"!+ c #ED8F21",
-"~+ c #E68716",
-"{+ c #D57E18",
-"]+ c #D08936",
-"^+ c #E98A18",
-"/+ c #D27B16",
-"(+ c #ED9D3C",
-"_+ c #E58819",
-":+ c #D67F18",
-"<+ c #D78827",
-"[+ c #E18C2A",
-"}+ c #D88017",
-"|+ c #D39449",
-"1+ c #E7891A",
-"2+ c #DA841F",
-"3+ c #DE9742",
-"4+ c #E48310",
-"5+ c #E18414",
-"6+ c #E48614",
-"7+ c #E78817",
-"8+ c #E78818",
-"9+ c #E2861B",
-"0+ c #E48718",
-"a+ c #D07B17",
-"b+ c #CE842C",
-"c+ c #DC861E",
-"d+ c #CF7917",
-"e+ c #D57F1B",
-"f+ c #CF7C1B",
-"g+ c #D08228",
-"h+ c #CE7B1A",
-"i+ c #DA831C",
-"j+ c #CF7F1F",
-"k+ c #CE7812",
-"l+ c #CD7916",
-"m+ c #CE7916",
-"n+ c #D27B15",
-"o+ c #D38321",
-" ",
-" ",
-". + @ # $ % & * + = - ; > . , ' ",
-" ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 $ 1 5 ( 6 7 ",
-" 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x ",
-" 8 y z A B c C D E F G H I J K L i H H M N O P Q R S T U V ",
-" W 9 X Y Z c ` .: ..+.@.#.$.%.&.t *.=.-.;.>.,.'.).!.W ~.{.U ]. ",
-" ^./.(._.:. <.[.}.|. 1.2.j %.3._.4. 5.6.s 7.8.9. 0.a.b.U ]. ",
-" c.n d.e. <.f.g.h. i.c.j %.3.j.k. l.m.n.o.p. q.r.s.U ]. ",
-" t.u.v. w.x.y.z.A. B.c.j %.3.j.C. D.E.F. G.r.s.U ]. ",
-" H.I.:. J.K.L.z.A. M.c.j %.3.j.N. G.r.s.U ]. ",
-" O.P.Q.R.S.f.n T.U. M.c.j %.V.j.N. G.r.W.X.Y. ",
-" Z.I.`. + F .+++U. @+z #+$+%+&+N. q.a.W.*+=+-+;+>+,+'+)+;+ ",
-" !+~+{+]+ ^+m./+A. (+_+:+<+[+}+|+ 1+2+3+4+5+6+7+8+8+J 8+j.9+ ",
-" 0+a+b+ c+|.d+A. e+f+ g+h+ i+j+ k+l+l+m+m+m+m+m+m+n+o+",
-" "};
diff --git a/elpa/mode-icons-20190627.2121/icons/yas.xpm b/elpa/mode-icons-20190627.2121/icons/yas.xpm
deleted file mode 100644
index 8366117..0000000
--- a/elpa/mode-icons-20190627.2121/icons/yas.xpm
+++ /dev/null
@@ -1,68 +0,0 @@
-/* XPM */
-static char * yas_xpm[] = {
-"15 16 49 1",
-" c None",
-". c #2D5597",
-"+ c #3F78D4",
-"@ c #407AD7",
-"# c #305AA0",
-"$ c #3A71C8",
-"% c #498BF6",
-"& c #3C73CC",
-"* c #203F6E",
-"= c #223E6F",
-"- c #3768B8",
-"; c #498AF5",
-"> c #3668B8",
-", c #224172",
-"' c #3D75CE",
-") c #427DDE",
-"! c #4889F2",
-"~ c #4889F3",
-"{ c #3C71C9",
-"] c #3F78D5",
-"^ c #3566B3",
-"/ c #396BBF",
-"( c #4583E8",
-"_ c #2B5291",
-": c #29518E",
-"< c #3360AC",
-"[ c #427EE0",
-"} c #4787EE",
-"| c #396CBF",
-"1 c #417CDB",
-"2 c #3361AD",
-"3 c #407BD9",
-"4 c #4686EC",
-"5 c #396DC0",
-"6 c #3565B1",
-"7 c #396BBE",
-"8 c #4787EF",
-"9 c #4788F0",
-"0 c #2A508E",
-"a c #3B70C5",
-"b c #2C5292",
-"c c #2C5392",
-"d c #437FE1",
-"e c #26467F",
-"f c #294B87",
-"g c #4482E7",
-"h c #234276",
-"i c #26487F",
-"j c #3E76D1",
-" ",
-" .+@# ",
-" $%%& ",
-" **=-;%>,** ",
-"*')))!~))){ ",
-"*)%%%%%%%%] ",
-"*)%%%%%%%%] ",
-"*^/(%%%%%%]_: ",
-" <;%%%%%[[}| ",
-" :}%%%%%%%%1 ",
-" 2;%%%%%[345 ",
-"*67(%89%%%]0: ",
-"*)%;abc&%%] ",
-"*)%de fg%] ",
-"*')'h ij){ ",
-" *** *** "};
diff --git a/elpa/mode-icons-20190627.2121/mode-icons-autoloads.el b/elpa/mode-icons-20190627.2121/mode-icons-autoloads.el
deleted file mode 100644
index 35584fe..0000000
--- a/elpa/mode-icons-20190627.2121/mode-icons-autoloads.el
+++ /dev/null
@@ -1,41 +0,0 @@
-;;; mode-icons-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "mode-icons" "mode-icons.el" (0 0 0 0))
-;;; Generated autoloads from mode-icons.el
-
-(defvar mode-icons-mode nil "\
-Non-nil if Mode-Icons mode is enabled.
-See the `mode-icons-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `mode-icons-mode'.")
-
-(custom-autoload 'mode-icons-mode "mode-icons" nil)
-
-(autoload 'mode-icons-mode "mode-icons" "\
-Replace the name of the current major mode with an icon.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mode-icons" '("mode-icons")))
-
-;;;***
-
-;;;### (autoloads nil nil ("mode-icons-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; mode-icons-autoloads.el ends here
diff --git a/elpa/mode-icons-20190627.2121/mode-icons-pkg.el b/elpa/mode-icons-20190627.2121/mode-icons-pkg.el
deleted file mode 100644
index 91eb49a..0000000
--- a/elpa/mode-icons-20190627.2121/mode-icons-pkg.el
+++ /dev/null
@@ -1,13 +0,0 @@
-(define-package "mode-icons" "20190627.2121" "Show icons for modes"
- '((emacs "24")
- (cl-lib "0.5"))
- :commit "f16969f053f43bf706257673d0800de438d4e33b" :keywords
- '("multimedia")
- :authors
- '(("Tom Willemse" . "tom@ryuslash.org"))
- :maintainer
- '("Tom Willemse" . "tom@ryuslash.org")
- :url "http://ryuslash.org/projects/mode-icons.html")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/mode-icons-20190627.2121/mode-icons.el b/elpa/mode-icons-20190627.2121/mode-icons.el
deleted file mode 100644
index cfa68ec..0000000
--- a/elpa/mode-icons-20190627.2121/mode-icons.el
+++ /dev/null
@@ -1,1883 +0,0 @@
-;;; mode-icons.el --- Show icons for modes -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013, 2016 Tom Willemse
-;; 2016 Matthew L. Fidler
-
-;; Author: Tom Willemse <tom@ryuslash.org>
-;; Keywords: multimedia
-;; Version: 0.4.0
-;; URL: http://ryuslash.org/projects/mode-icons.html
-;; Package-Requires: ((emacs "24") (cl-lib "0.5"))
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package provides a globalized minor mode that replaces the
-;; major mode name in your mode-line and places like Ibuffer with an
-;; icon. Currently the following programming modes are supported,
-;; among others:
-;;
-;; - C
-;; - C++
-;; - C#
-;; - CSS
-;; - Coffee
-;; - Dart
-;; - Emacs-Lisp
-;; - HTML
-;; - Haml
-;; - JavaScript
-;; - Lisp
-;; - Lua
-;; - nXML
-;; - PHP
-;; - Python
-;; - React
-;; - Ruby
-;; - Rust
-;; - Sass/Scss
-;; - Scheme
-;; - Shell-script
-;; - Slim
-;; - Snippet
-;; - Web
-;; - Yaml
-;;
-;; To enable this minor mode add the following line to your init file:
-;;
-;; (mode-icons-mode)
-;;
-;; As of version 0.3.0 this project includes some icons which can use icon
-;; fonts instead of images. These fonts are:
-;;
-;; - Font Awesome, found at URL `http://fontawesome.io/'.
-;; - GitHub Octicons, found at URL `https://octicons.github.com/'.
-;; - Font Mfizz, found at URL `http://fizzed.com/oss/font-mfizz'.
-;; - IcoMoon, found at URL `https://icomoon.io/#icons-icomoon'.
-;;
-
-;;; Code:
-
-(declare-function comint-send-string "comint")
-(declare-function emojify-set-emoji-data "emojify")
-(declare-function ht-get "ht")
-(declare-function powerline-minor-modes "powerline")
-(declare-function powerline-raw "powerline-raw")
-(declare-function pl/add-text-property "powerline")
-(declare-function mode-icons--real-powerline-raw "powerline")
-(declare-function mode-icons--powerline-raw "mode-icons")
-(declare-function mode-icons--real-powerline-major-mode "powerline")
-(declare-function mode-icons--powerline-major-mode "mode-icons")
-
-(require 'cl-lib)
-(require 'color)
-(require 'emojify nil t)
-
-(defgroup mode-icons nil
- "Provide icons for major modes."
- :group 'editing-basics
- :group 'convenience)
-
-(defconst mode-icons--directory
- (if load-file-name
- (file-name-directory load-file-name)
- default-directory)
- "Where mode-icons was loaded from.")
-
-(defun mode-icons-get-icon-file (icon)
- "Get the location of ICON.
-
-ICON should be a file name with extension. The result is the
-absolute path to ICON."
- (expand-file-name icon (expand-file-name "icons" mode-icons--directory)))
-
-(defmacro mode-icons-save-buffer-state (&rest body)
- "Eval BODY saving buffer state.
-This macro restores the buffer state under the assumption that no
-significant modification has been made in BODY. A change is
-considered significant if it affects the buffer text in any way
-that isn't completely restored again. Changes in text properties
-like `face' or `syntax-table' are considered insignificant. This
-macro allows text properties to be changed, even in a read-only
-buffer.
-
-This macro should be placed around all calculations which set
-\"insignificant\" text properties in a buffer, even when the buffer is
-known to be writeable. That way, these text properties remain set
-even if the user undoes the command which set them.
-
-This macro should ALWAYS be placed around \"temporary\" internal buffer
-changes \(like adding a newline to calculate a text-property then
-deleting it again\), so that the user never sees them on his
-`buffer-undo-list'.
-
-However, any user-visible changes to the buffer \(like auto-newlines\)
-must not be within a `ergoemacs-save-buffer-state', since the user then
-wouldn't be able to undo them.
-
-The return value is the value of the last form in BODY.
-
-This was stole/modified from `c-save-buffer-state'"
- `(let* ((modified (buffer-modified-p)) (buffer-undo-list t)
- (inhibit-read-only t) (inhibit-point-motion-hooks t)
- before-change-functions after-change-functions
- deactivate-mark
- buffer-file-name buffer-file-truename ; Prevent primitives checking
- ; for file modification
- )
- (unwind-protect
- (progn ,@body)
- (and (not modified)
- (buffer-modified-p)
- (set-buffer-modified-p nil)))))
-
-(defcustom mode-icons
- `(("\\`CSS\\'" "css" xpm)
- ("\\`Coffee\\'" "coffee" xpm-bw)
- ("\\`Compilation\\'" "compile" xpm)
- ("\\`Dart\\'" "dart" xpm)
- ("\\`Flutter\\'" "flutter" xpm)
- ("\\`Elixir\\'" "elixir" xpm)
- ("\\`Erlang\\'" "erlang" xpm)
- ("\\`Emacs-Lisp\\'" "emacs" xpm)
- ("\\`Lisp Interaction\\'" "emacs" xpm)
- ("\\`HTML\\'" "html" xpm)
- ("\\`Haml\\'" "haml" xpm)
- ("\\`Image\\[imagemagick\\]\\'" "svg" xpm)
- ("\\`Inf-Ruby\\'" "infruby" xpm)
- ("\\`Java[Ss]cript\\'" "js" xpm)
- ("\\`Lisp\\'" "cl" xpm)
- ("\\`Lua\\'" "Lua-Logo_16x16" png)
- ("\\`nXML\\'" "xml" xpm)
- ("\\`Org\\'" "org" xpm)
- ("\\`PHP\\(\\|/.*\\)\\'" "php" xpm)
- ("\\`Projectile Rails Server\\'" "rails" xpm)
- ("\\`Python\\'" "python" xpm)
- ("\\` Emmet\\'" "emmet" xpm)
- ("\\`RJSX\\'" "react" xpm)
- ("\\`Ruby\\'" "ruby" xpm)
- ("\\`Rust\\'" "rust" xpm)
- ("\\`EnhRuby\\'" "ruby" xpm)
- ("\\`ESS\\[S\\]\\'" "R" xpm)
- ("\\`ESS\\[SAS\\]\\'" "sas" xpm)
- ("\\`ESS\\[BUGS\\]\\'" #xf188 FontAwesome)
- ("\\`iESS\\'" "R" xpm)
- ("\\`SCSS\\'" "sass" xpm)
- ("\\`Sass\\'" "sass" xpm)
- ("\\`Scheme" "scheme" xpm-bw)
- ("\\`Shell-script" "bash" xpm-bw)
- ("\\`Slim" "slim" xpm-bw)
- ("\\`Snippet" "yas" xpm)
- ("\\`Term\\'" "term" xpm)
- ("\\`Web\\'" "html" xpm)
- ("\\`XML\\'" "xml" xpm)
- ("\\`YAML\\'" "yaml" xpm)
- ("\\` ?YASnippet\\'" "yas" xpm)
- ("\\` ?yas\\'" "yas" xpm)
- ("\\` ?hs\\'" "hs" xpm)
- ("\\`Markdown\\'" #xf0c9 github-octicons)
- ("\\`GFM\\'" #xf0c9 github-octicons)
- ("\\`Scala\\'" #xf15b font-mfizz)
- ("\\`Magit\\'" #xf1d2 FontAwesome)
- ("\\` Pulls\\'" #xf092 FontAwesome)
- ("\\`Zip-Archive\\'" #xf1c6 FontAwesome)
- ("\\` ARev\\'" #xf021 FontAwesome)
- ("\\`Calc\\(ulator\\)?\\'" #xf1ec FontAwesome)
- ("\\`Debug.*\\'" #xf188 FontAwesome)
- ("\\`Debug.*\\'" #xf188 FontAwesome)
- ("\\`Calendar\\'" #xf073 FontAwesome)
- ("\\`Help\\'" #xf059 FontAwesome)
- ("\\`WoMan\\'" #xf05a FontAwesome)
- ("\\`C\\(/.*\\|\\)\\'" "c" xpm)
- ("\\`Custom\\'" #xf013 FontAwesome)
- ("\\`Go\\'" "go" xpm)
- ("\\` ?Rbow\\'" "rainbow" xpm)
- ("\\` ?ivy\\'" "ivy" xpm) ;; Icon created by Philipp Lehmann from the Noun Project https://thenounproject.com/search/?q=ivy&i=329756
- ("\\` ?ICY\\'" "icy" xpm) ;; http://www.clipartpal.com/clipart_pd/weather/ice_10206.html
- ("\\` ?Golden\\'" "golden" xpm-bw) ;; Icon created by Arthur Shlain from Noun Project
- ("\\`BibTeX\\'\\'" "bibtex" xpm-bw)
- ("\\`C[+][+]\\(/.*\\|\\)\\'" "cpp" xpm)
- ("\\`C[#]\\(/.*\\|\\)\\'" "csharp" xpm)
- ("\\`Haskell\\'" #xf126 font-mfizz)
- ("\\`Clojure\\'" #xf10b font-mfizz)
- ("\\`Java\\(/.*\\|\\)\\'" #xf12b font-mfizz)
- ("\\`C?Perl\\'" #xf148 font-mfizz)
- ("\\`Octave\\'" "octave" xpm)
- ("\\`AHK\\'" "autohotkey" xpm)
- ("\\`Info\\'" #xf05a FontAwesome)
- ("\\` ?Narrow\\'" #xf066 FontAwesome)
- ("\\`Dockerfile\\'" "docker" xpm)
- ("\\`Spacemacs buffer\\'" "spacemacs" png)
- ("\\` ?emoji\\'" "emoji" png)
- ("\\`Org-Agenda" #xf046 FontAwesome)
- ("\\`PS\\'" "powershell" xpm)
- (mode-icons-powershell-p "powershell" xpm)
- (mode-icons-cmd-p "cmd" xpm-bw)
- (mode-icons-msys-p "msys" xpm)
- (mode-icons-cygwin-p "cygwin" xpm)
- (read-only #xf023 FontAwesome)
- (writable #xf09c FontAwesome)
- (save #xf0c7 FontAwesome)
- (saved "" nil)
- (modified-outside #xf071 FontAwesome)
- (steal #xf21b FontAwesome)
- ;; Prefer finder icon since it looks like the old mac icon
- (apple #xeabf IcoMoon-Free)
- (apple #xf179 FontAwesome)
- (win #xf17a FontAwesome)
- ;; FIXME: use lsb_release to determine Linux variant and choose appropriate icon
- (unix #xeabd IcoMoon-Free) ;; Clear Tux (Unlike FontAwesome)
-
- ;; This icon is clearer than FontAwesome's Linux Penguin
- (unix #xf166 font-mfizz) ;; Use ubuntu, since I think it is the most common.
- (unix #xf17c FontAwesome) ;; Fall Back to FontAwesome
- (undecided #xf128 FontAwesome)
- ("Text\\'" #xf0f6 FontAwesome)
- ("\\` ?company\\'" #xf1ad FontAwesome)
- ("\\` ?AC\\'" #xf18e FontAwesome)
- ("\\` ?Fly\\'" #xea12 IcoMoon-Free)
- ;; ("\\` ?FlyC.*\\'" "flycheck" xpm)
- ("\\` ?SP\\(/s\\)?\\'" "smartparens" xpm)
- ("\\` ?Ergo" #xf11c FontAwesome)
- ("\\` ?drag\\'" #xf047 FontAwesome)
- ("\\` ?Helm\\'" "helm" xpm-bw) ;; By Noe Araujo, MX, https://thenounproject.com/term/helm/233101/
- ("\\`Messages\\'" #xf27b FontAwesome)
- ("\\`Conf" #xf1de FontAwesome)
- ("\\`Fundamental\\'" #xf016 FontAwesome)
- ("\\`Javascript-IDE\\'" "js" xpm)
- ("\\` Undo-Tree\\'" ":palm_tree:" emoji)
- ("\\`LaTeX\\'" "tex" ext)
- ("\\`Image\\[xpm\\]\\'" "xpm" ext)
- ("\\`Image\\[png\\]\\'" "png" ext)
- ("\\` ?AI\\'" #xf03c FontAwesome)
- ("\\` ?Isearch\\'" #xf002)
- (default #xf059 FontAwesome)
- ;; Diminished modes
- ("\\` ?\\(?:ElDoc\\|Anzu\\|SP\\|Guide\\|PgLn\\|Undo-Tree\\|Ergo.*\\|,\\|Isearch\\|Ind\\)\\'" nil nil))
- "Icons for major and minor modes.
-
-Each specificatioun is a list with the first element being the
-name of the major mode. The second the name of the icon file,
-without the extension. And the third being the type of icon."
- :type '(repeat
- (list (choice
- (string :tag "Regular Expression")
- (const :tag "Read Only Indicator" read-only)
- (const :tag "Writable Indicator" writable)
- (const :tag "Saved" saved)
- (const :tag "Save" save)
- (const :tag "Modified Outside Emacs" modified-outside)
- (const :tag "Locked By Someone Else" steal)
- (const :tag "Apple" apple)
- (const :tag "Windows" win)
- (const :tag "Unix" unix)
- (const :tag "Default Icon" default)
- (function :tag "Enriched minor mode"))
- (choice
- (string :tag "Icon Name")
- (integer :tag "Font Glyph Code")
- (const :tag "ess" nil))
- (choice
- (const :tag "text" nil)
- (const :tag "png" png)
- (const :tag "gif" gif)
- (const :tag "jpeg" jpeg)
- (const :tag "jpg" jpg)
- (const :tag "xbm" xbm)
- (const :tag "xpm" xpm)
- (const :tag "Black and White xpm that changes color to match the mode-line face" xpm-bw)
- (const :tag "Emoji" emoji)
- (const :tag "Mode Icons Generated file-type" ext)
- (symbol :tag "Font"))))
- :group 'mode-icons)
-
-(defun mode-icons-powershell-p (&optional match)
- "Is the current mode a powershell process?"
- (let ((proc (get-buffer-process (current-buffer))))
- (and proc (string-match-p (or match "powershell") (car (process-command proc))))))
-
-(defun mode-icons-cmd-p ()
- "Is the current mode a CMD shell?"
- (mode-icons-powershell-p "cmdproxy"))
-
-(defun mode-icons-cygwin-p ()
- "Is the current mode a CMD shell?"
- (mode-icons-powershell-p "cygwin"))
-
-(defun mode-icons-msys-p ()
- "Is the current mode a CMD shell?"
- (mode-icons-powershell-p "msys"))
-
-(defvar mode-icons-get-xpm-string (make-hash-table :test 'equal))
-(defun mode-icons-get-xpm-string (icon-path)
- "Get XPM file contents for ICON-PATH.
-If ICON-PATH is a string, return that."
- (or (and (file-exists-p icon-path)
- (or (gethash icon-path mode-icons-get-xpm-string)
- (puthash icon-path (mode-icons-save-buffer-state (with-temp-buffer (insert-file-contents icon-path) (buffer-string)))
- mode-icons-get-xpm-string)))
- (and (stringp icon-path) icon-path)))
-
-(defun mode-icons-get-icon-display-xpm-replace (icon-path rep-alist &optional name)
- "Get xpm image from ICON-PATH and replace REP-ALIST in file.
-When NAME is non-nil, also replace the internal xpm image name."
- (let ((case-fold-search t)
- (img (mode-icons-get-xpm-string icon-path))
- (i 0))
- (dolist (c rep-alist)
- (setq img (replace-regexp-in-string (regexp-quote (car c)) (format "COLOR<%d>" i) img t t)
- i (1+ i)))
- (let ((i 0))
- (dolist (c rep-alist)
- (setq img (replace-regexp-in-string (format "COLOR<%d>" i) (cdr c) img t t)
- i (1+ i))))
- (when name
- (setq img (replace-regexp-in-string "^[ ]*static[ ]+char[ ]+[*][ ]+.*?\\[" (concat "static char * " name "[") img t t)))
- img))
-
-(defun mode-icons-interpolate (c1 c2 &optional factor)
- "Interpolate between C1 and C2 by FACTOR.
-If FACTOR is unspecified, use 0.5"
- (let* ((factor (or factor 0.5))
- (red (+ (* (nth 0 c1) factor) (* (nth 0 c2) (- 1.0 factor))))
- (green (+ (* (nth 1 c1) factor) (* (nth 1 c2) (- 1.0 factor))))
- (blue (+ (* (nth 2 c1) factor) (* (nth 2 c2) (- 1.0 factor)))))
- (setq red (/ (round (* 256.0 red)) 256.0)
- green (/ (round (* 256.0 green)) 256.0)
- blue (/ (round (* 256.0 blue)) 256.0))
- (color-rgb-to-hex red green blue)))
-
-(defun mode-icons-interpolate-from-scale (foreground background)
- "Interpolate black to FOREGROUND and white to BACKGROUND.
-Grayscales are in between.
-Assumes that FOREGROUND and BACKGROUND are (r g b) lists."
- (let ((black '(0.0 0.0 0.0))
- (white '(1.0 1.0 1.0))
- lst tmp
- (i 0))
- (while (< i 256)
- (setq tmp (/ i 255.0))
- (push (cons (upcase (mode-icons-interpolate black white tmp))
- (upcase (mode-icons-interpolate foreground background tmp))) lst)
- (setq i (1+ i)))
- lst))
-
-(defvar mode-icons-get-icon-display-xpm-bw-face (make-hash-table)
- "Hash table of dynamic images.")
-
-(defun mode-icons-background-color (&optional face)
- "Get the background color of FACE.
-In order, will try to get the background color from:
-- FACE
-- `mode-line' face
-- `default' face
-- Assume white."
- (color-name-to-rgb (or (face-background (or face 'mode-line))
- (face-background 'mode-line)
- (face-background 'default)
- "white")))
-
-(defun mode-icons-foreground-color (&optional face)
- "Get the foreground color of FACE.
-In order, will try to get the foreground color from:
-- FACE
-- `mode-line' face
-- `default' face
-- Assume black."
- (color-name-to-rgb (or (face-foreground (or face 'mode-line))
- (face-foreground 'mode-line)
- (face-foreground 'default)
- "black")))
-
-(defun mode-icons-get-icon-display-xpm-bw-face (icon-path &optional face)
- "Change xpm at ICON-PATH to match FACE.
-The white is changed to the background color.
-The black is changed to the foreground color.
-Grayscale colors are also changed by `mode-icons-interpolate-from-scale'."
- (let* ((background (mode-icons-background-color face))
- (foreground (mode-icons-foreground-color face))
- (lst (mode-icons-interpolate-from-scale foreground background))
- (name (concat "mode_icons_bw_" (substring (mode-icons-interpolate background foreground 0.0) 1) "_"
- (substring (mode-icons-interpolate background foreground 1.0) 1) "_"
- (file-name-sans-extension (file-name-nondirectory icon-path))))
- (sym (intern name)))
- (or (gethash sym mode-icons-get-icon-display-xpm-bw-face)
- (puthash sym (mode-icons-get-icon-display-xpm-replace icon-path lst name) mode-icons-get-icon-display-xpm-bw-face))))
-
-(defun mode-icons-get-xpm-icon-colors (icon-path)
- "Get a list of rgb colors based on ICON-PATH xpm icon.
-ICON-PATH can be a XPM string or a XPM file."
- (let (colors)
- (mode-icons-save-buffer-state
- (with-temp-buffer
- (insert (mode-icons-get-xpm-string icon-path))
- (goto-char (point-min))
- (while (re-search-forward "#[0-9A-Fa-f]\\{6\\}" nil t)
- (push (color-name-to-rgb (match-string 0)) colors))))
- colors))
-
-(defun mode-icons-desaturate-colors (colors &optional foreground background)
- "Desaturate COLORS.
-
-If COLORS is an icon-path of an xpm file, use the colors from
-that file.
-
-When FOREGROUND and BACKGROUND are both non-nil, use
-`mode-icons-interpolate-from-scale' to change the grayscale to
-match the foreground (black) and background (white) colors.
-
-Assume that COLORS is a list of (r g b) values.
-
-Returns a replacement list for `mode-icons-get-icon-display-xpm-replace'"
- (if (and colors (stringp colors))
- (mode-icons-desaturate-colors (mode-icons-get-xpm-icon-colors colors) foreground background)
- (let (color-list
- val tmp
- (trans-alist (and foreground background (mode-icons-interpolate-from-scale foreground background))))
- (dolist (color colors)
- (setq val (+ (* 0.3 (nth 0 color)) (* 0.59 (nth 1 color)) (* 0.11 (nth 2 color)))
- val (upcase (color-rgb-to-hex val val val)))
- (when (and trans-alist (setq tmp (assoc val trans-alist)))
- (setq val (cdr tmp)))
- (push (cons (upcase (color-rgb-to-hex (nth 0 color) (nth 1 color) (nth 2 color))) val) color-list))
- color-list)))
-
-(defun mode-icons-desaturate-xpm (icon-path &optional face)
- "Desaturate the xpm at ICON-PATH.
-When FACE is non-nil, match the foreground and background colors
-in FACE instead of making the image black and white."
- (let* ((background (mode-icons-background-color face))
- (foreground (mode-icons-foreground-color face))
- (lst (mode-icons-desaturate-colors icon-path foreground background))
- (name (concat "mode_icons_desaturate_"
- (or (and background foreground
- (substring (mode-icons-interpolate background foreground 0.0) 1))
- "black") "_"
- (or (and background foreground
- (substring (mode-icons-interpolate background foreground 1.0) 1))
- "white") "_"
- (file-name-sans-extension (file-name-nondirectory icon-path))))
- (sym (intern name)))
- (or (gethash sym mode-icons-get-icon-display-xpm-bw-face)
- (puthash sym (mode-icons-get-icon-display-xpm-replace icon-path lst name) mode-icons-get-icon-display-xpm-bw-face))))
-
-
-(defcustom mode-icons-desaturate-inactive t
- "Should the inactive mode-line be desaturated.
-And changed to match the icon colors?
-This only works with xpm files."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-desaturate-active nil
- "Should the active mode-line be desaturated.
-And changed to match the icon colors?
-This only works with xpm files."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-grayscale-transform t
- "Should grayscale 'xpm-bw images match mode-line colors?"
- :type 'boolean
- :group 'mode-icons)
-
-(defvar mode-icons-get-icon-display (make-hash-table :test 'equal)
- "Hash table of `mode-icons-get-icon-display'.")
-
-(defun mode-icons--get-face (&optional face active)
- "If FACE is unspecified, use ACTIVE to determine the face.
-ACTIVE tells if current window is active."
- (or face (and active 'mode-line) 'mode-line-inactive))
-
-(defcustom mode-icons-line-height-adjust 0
- "The manual adjustment of the mode-line height for images."
- :type 'integer
- :group 'mode-icons)
-
-(defun mode-icons-line-height (&optional window)
- "Gets the height in pixels of WINDOW's mode-line, if accessible.
-This uses `window-mode-line-height' on emacs 24.4+. Otherwise it assumes 16.
-
-This function also adjusts the line height by `mode-icons-line-height-adjust'."
- (+ mode-icons-line-height-adjust
- (or (and (fboundp 'window-mode-line-height) (window-mode-line-height window)) 16)))
-
-(defun mode-icons-get-icon-display (icon type &optional face active)
- "Get the value for the display property of ICON having TYPE.
-
-ICON should be a string naming the file of the icon, without its
-extension. Type should be a symbol designating the file type for
-the icon.
-
-FACE should be the face for rendering black and white xpm icons
-specified by type 'xpm-bw.
-
-ACTIVE is an indicator that the current window is active."
- (let* ((face (mode-icons--get-face face active))
- (key (list icon type face active
- mode-icons-desaturate-inactive mode-icons-desaturate-active
- mode-icons-grayscale-transform custom-enabled-themes))
- tmp)
- (or (gethash key mode-icons-get-icon-display)
- (puthash key
- (cond
- ((memq type '(png xpm xpm-bw gif jpeg jpg xbm xpm))
- (let ((icon-path (mode-icons-get-icon-file
- (concat icon "." (or (and (eq type 'xpm-bw) "xpm")
- (symbol-name type))))))
- (cond
- ((and mode-icons-grayscale-transform (eq type 'xpm-bw))
- (create-image (mode-icons-get-icon-display-xpm-bw-face icon-path face)
- ;; Use imagemagick for rescaling...
- (or (and (fboundp 'imagemagick-types)
- (memq 'png (imagemagick-types)) 'imagemagick)
- 'xpm)
- t :ascent 'center
- :face face
- :xpm-bw t
- :height (mode-icons-line-height)
- :icon icon))
- ((eq type 'xpm-bw)
- (create-image icon-path
- (or (and (fboundp 'imagemagick-types)
- (memq 'png (imagemagick-types)) 'imagemagick)
- 'xpm)
- :height (mode-icons-line-height)
- :ascent 'center
- :face face
- :icon icon))
- ((and (eq type 'xpm)
- (or (and active mode-icons-desaturate-active)
- (and (not active) mode-icons-desaturate-inactive)))
- (create-image (mode-icons-desaturate-xpm icon-path face)
- (or (and (fboundp 'imagemagick-types)
- (memq 'png (imagemagick-types)) 'imagemagick)
- 'xpm) t
- :ascent 'center
- :height (mode-icons-line-height)
- :face face :icon icon))
- (t
- (create-image icon-path
- (or (and (fboundp 'imagemagick-types)
- (memq (or (and (eq type 'jpg) 'jpeg) type) (imagemagick-types))
- 'imagemagick)
- (or (and (eq type 'jpg) 'jpeg) type))
- nil
- :height (mode-icons-line-height)
- :ascent 'center :face face :icon icon)))))
- ((and (eq type 'emoji) (setq tmp (mode-icons--get-emoji " " (list "" icon type) face)))
- (get-text-property 0 'display tmp))
- ;; Shouldn't get here...
- ((and (eq type 'ext) (setq tmp (mode-icons--ext-available-p (list "" icon type))))
- (mode-icons-get-icon-display (concat "ext-" (downcase icon)) 'xpm-bw face active))
- ((and (image-type-available-p 'xpm)
- (setq tmp (mode-icons--get-font-xpm-file (list "" icon type)))
- (file-exists-p tmp))
- (setq tmp nil)
- (mode-icons-get-icon-display (mode-icons--get-font-xpm-file (list "" icon type) t) 'xpm-bw face active))
- (t nil))
- mode-icons-get-icon-display))))
-
-(defcustom mode-icons-minor-mode-base-text-properties
- '('help-echo nil
- 'mouse-face 'mode-line-highlight
- 'local-map mode-line-minor-mode-keymap)
- "List of text propeties to apply to every minor mode."
- :type '(repeat sexp)
- :group 'mode-icons)
-
-(defcustom mode-icons-major-mode-base-text-properties
- '('help-echo "Major mode\nmouse-1: Display major mode menu\nmouse-2: Show help for major mode\nmouse-3: Toggle minor modes"
- 'mouse-face 'mode-line-highlight
- 'local-map mode-line-major-mode-keymap)
- "List of text propeties to apply to every major mode."
- :type '(repeat sexp)
- :group 'mode-icons)
-
-(defcustom mode-icons-narrow-text-properties
- '('local-map
- '(keymap
- (mode-line keymap
- (mouse-2 . mode-line-widen)))
- 'mouse-face 'mode-line-highlight 'help-echo "mouse-2: Remove narrowing from buffer")
- "List of text propeties to apply to narrowing buffer indicator."
- :type '(repeat sexp)
- :group 'mode-icons)
-
-(defcustom mode-icons-read-only-text-properties
- '('mouse-face 'mode-line-highlight 'local-map
- '(keymap
- (mode-line keymap
- (mouse-1 . mode-line-toggle-read-only)))
- 'help-echo 'mode-line-read-only-help-echo)
- "List of text propeties to apply to read-only buffer indicator."
- :type '(repeat sexp)
- :group 'mode-icons)
-
-(defcustom mode-icons-modified-text-properties
- '('mouse-face 'mode-line-highlight
- 'local-map
- '(keymap
- (mode-line keymap
- (mouse-1 . mode-icons-save-steal-or-revert-buffer)
- (mouse-3 . mode-line-toggle-modified)))
- 'help-echo 'mode-icons-modified-help-echo)
- "List of text propeties to apply to read-only buffer indicator."
- :type '(repeat sexp)
- :group 'mode-icons)
-
-(defun mode-icons-save-steal-or-revert-buffer (event)
- "Save buffer OR revert file from mode line.
-Use EVENT to determine location."
- (interactive "e")
- (with-selected-window (posn-window (event-start event))
- (let* ((bfn (buffer-file-name))
- (revert-p (not (or (and bfn (file-remote-p buffer-file-name))
- (verify-visited-file-modtime (current-buffer)))))
- (steal-p (and (not (or (and bfn (file-remote-p buffer-file-name))
- (member (file-locked-p bfn) '(nil t)))))))
- (cond
- (revert-p (revert-buffer t t))
- (steal-p
- (message "To steal or ignore lock, start editing the file."))
- (t (call-interactively (key-binding (where-is-internal 'save-buffer global-map t))))))
- (force-mode-line-update)))
-
-(defun mode-icons-modified-help-echo (window _object _point)
- "Return help text specifying WINDOW's buffer modification status."
- (let* ((bfn (buffer-file-name))
- (revert-p (not (or (and bfn (file-remote-p buffer-file-name))
- (verify-visited-file-modtime (current-buffer)))))
- (steal-p (and (not (or (and bfn (file-remote-p buffer-file-name))
- (member (file-locked-p bfn) '(nil t))))))
- (mod-p (buffer-modified-p (window-buffer window))))
- (format "Buffer is %s\nmouse-1: %s Buffer\nmouse-3: Toggle modification state"
- (cond
- (steal-p
- "locked for editing by another user.")
- (revert-p
- "modified outside of emacs!")
- ((buffer-modified-p (window-buffer window))
- "modified")
- (t "unmodified"))
- (cond
- (steal-p
- "Echo about lock status of")
- (revert-p
- "Revert")
- (mod-p
- "Save")
- (t "")))))
-
-(defcustom mode-icons-read-only-text-properties
- '('mouse-face 'mode-line-highlight 'local-map
- '(keymap
- (mode-line keymap
- (mouse-1 . mode-line-toggle-read-only)))
- 'help-echo 'mode-line-read-only-help-echo)
- "List of text propeties to apply to read-only buffer indicator."
- :type '(repeat sexp)
- :group 'mode-icons)
-
-(defvar mode-icons-powerline-p nil)
-(defun mode-icons-need-update-p ()
- "Determine if the mode-icons need an update."
- (not (or (and (boundp 'rich-minority-mode) rich-minority-mode)
- (member 'sml/pos-id-separator mode-line-format)
- (string-match-p "powerline" (prin1-to-string mode-line-format)))))
-
-(defvar mode-icons-font-register-alist nil
- "Alist of characters supported.")
-
-(defun mode-icons-supported-font-p (char font)
- "Determine if the CHAR is supported in FONT.
-When DONT-REGISTER is non-nil, don't register the font.
-Otherwise, register the font for use in the mode-line and
-everywhere else."
- (if (memq font '(ext emoji xpm xbm jpg jpeg gif png nil)) nil
- (unless (boundp (intern (format "mode-icons-font-spec-%s" font)))
- (set (intern (format "mode-icons-font-spec-%s" font))
- (and (member (format "%s" font) (font-family-list))
- (font-spec :name (format "%s" font)))))
- (when (and (or (integerp char)
- (and (stringp char) (= 1 (length char))))
- (boundp (intern (format "mode-icons-font-spec-%s" font)))
- (symbol-value (intern (format "mode-icons-font-spec-%s" font))))
- (let* ((char (or (and (integerp char) char)
- (and (stringp char) (= 1 (length char))
- (aref (vconcat char) 0))))
- (found-char-p (assoc char mode-icons-font-register-alist))
- (char-font-p (and found-char-p (eq (cdr found-char-p) font))))
- (cond
- (char-font-p t)
- (found-char-p t)
- (t ;; not yet registered.
- (set-fontset-font t (cons char char) (symbol-value (intern (format "mode-icons-font-spec-%s" font))))
- (push (cons char font) mode-icons-font-register-alist)
- t))))))
-
-(defun mode-icons-supported-p (icon-spec)
- "Determine if ICON-SPEC is suppored on your system."
- (or
- (and (or (eq (nth 2 icon-spec) nil) (eq (nth 1 icon-spec) nil)) t)
- (and (eq (nth 2 icon-spec) 'emoji)
- (or (and (image-type-available-p 'png) (featurep 'emojify))
- (and (image-type-available-p 'xpm)
- (file-exists-p (mode-icons--get-emoji-xpm-file icon-spec)))))
- (and (eq (nth 2 icon-spec) 'jpg) (image-type-available-p 'jpeg))
- (and (eq (nth 2 icon-spec) 'xpm-bw) (image-type-available-p 'xpm))
- (and (eq (nth 2 icon-spec) 'ext) (image-type-available-p 'xpm)
- (mode-icons--ext-available-p icon-spec))
- (or (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec))
- (and (image-type-available-p 'xpm)
- (mode-icons--get-font-xpm-file icon-spec)
- (file-exists-p (mode-icons--get-font-xpm-file icon-spec))))
- (or (image-type-available-p (nth 2 icon-spec))
- (and (eq (nth 2 icon-spec) 'png)
- (and (image-type-available-p 'xpm)
- (file-exists-p (mode-icons--get-png-xpm-file icon-spec))))) ))
-
-(defvar emojify-emojis)
-
-(defvar mode-icons--gimp (executable-find "gimp")
- "Gimp to convert png to xpm.")
-
-(defvar mode-icons--gimp-inferior-args "-i -d -b -")
-
-(defvar mode-icons--stop-gimp-after nil
- "Seconds of idle time before mode-icons gimp is stopped.
-When nil, don't stop the gimp inferior mode.")
-
-(defvar mode-icons--stop-gimp-timer nil)
-
-(defun mode-icons--start-gimp-inferior ()
- "GIMP inferior process."
- (interactive)
- (when (file-exists-p mode-icons--gimp)
- (unless (get-buffer "*mode-icons-gimp*")
- (cl-letf (((symbol-function 'pop-to-buffer-same-window) (lambda(&rest _ignore))))
- (save-excursion
- (run-scheme (format "\"%s\" %s" mode-icons--gimp mode-icons--gimp-inferior-args))))
- (with-current-buffer (get-buffer "*scheme*")
- (rename-buffer "*mode-icons-gimp*")
- (set-process-query-on-exit-flag (get-buffer-process (get-buffer "*mode-icons-gimp*")) nil)))))
-
-(defvar mode-icons--gimp-ready-p nil)
-
-(defun mode-icons--gimp-ready-p ()
- "Determine if GIMP inferior process is ready."
- (if (file-exists-p mode-icons--gimp)
- (or mode-icons--gimp-ready-p
- (let (buf)
- (mode-icons--start-gimp-inferior)
- (and (setq buf (get-buffer "*mode-icons-gimp*"))
- (with-current-buffer buf
- (goto-char (point-min))
- (when (re-search-forward "ts>" nil t)
- (setq mode-icons--gimp-ready-p t))))))))
-
-(defvar mode-icons--stop-gimp-inferior nil)
-(defun mode-icons--stop-gimp-inferior ()
- "Stop the inferior gimp process."
- (interactive)
- (when (file-exists-p mode-icons--gimp)
- (let ((buf (get-buffer "*mode-icons-gimp*")))
- (cond
- ((and (mode-icons--gimp-ready-p) buf
- (get-buffer-process buf))
- (mode-icons--process-gimp "(gimp-quit 0)")
- (setq mode-icons--gimp-ready-p nil
- mode-icons--stop-gimp-inferior t)
- (run-with-idle-timer 1 nil #'mode-icons--stop-gimp-inferior))
- ((and buf (not (get-buffer-process buf)))
- (kill-buffer (get-buffer "*mode-icons-gimp*")))
- (t (run-with-idle-timer 1 nil #'mode-icons--stop-gimp-inferior))))))
-
-(defun mode-icons--process-gimp (scm)
- "Process gimp SCM (scheme)."
- (when mode-icons--stop-gimp-timer
- (cancel-timer mode-icons--stop-gimp-timer))
- (when (file-exists-p mode-icons--gimp)
- (if (mode-icons--gimp-ready-p)
- (progn
- (comint-send-string
- (with-current-buffer (get-buffer "*mode-icons-gimp*"))
- (concat scm "\n"))
- (when mode-icons--stop-gimp-after
- (setq mode-icons--stop-gimp-timer (run-with-timer mode-icons--stop-gimp-after nil #'mode-icons--stop-gimp-inferior))))
- (run-with-idle-timer 1 nil #'mode-icons--process-gimp scm))))
-
-(defvar mode-icons--generic-type-to-xpm-gimp-script
- (replace-regexp-in-string
- "[ \n\t]+" " "
- "(let* ((image-width 1024)
- (image-height 20)
- (buffer-image 1)
- (text \"%s\")
- (font-size 20)
- (font-name \"FontAwesome\")
- (xpm-image \"%s\")
- (font-size-2 10)
- (text-2 \"%s\")
- (font-name-2 \"Haettenschweiler\")
- (bg-color '(255 255 255))
- (fg-color '(0 0 0))
- (image (car (gimp-image-new 1024 16 0)))
- (layer (car (gimp-layer-new image image-width image-height RGB-IMAGE \"layer 1\" 100 NORMAL)))
- (layer2 (car (gimp-layer-new image image-width image-height RGB-IMAGE \"layer 2\" 100 NORMAL)))
- (out-text)
- (out-width)
- (out-height)
- (out-buffer)
- (drawable))
- (gimp-image-add-layer image layer 0)
- (gimp-context-set-background bg-color)
- (gimp-context-set-foreground fg-color)
- (gimp-layer-add-alpha layer)
- (gimp-drawable-fill layer TRANSPARENT-FILL)
- (gimp-image-add-layer image layer2 0)
- (gimp-layer-add-alpha layer2)
- (gimp-drawable-fill layer2 TRANSPARENT-FILL)
- (gimp-text-fontname image layer2 3 7 text-2 0 TRUE font-size-2 PIXELS font-name-2)
- (set! out-text (car (gimp-text-fontname image layer 0 0 text 0 TRUE font-size PIXELS font-name)))
- (set! out-width (car (gimp-drawable-width out-text)))
- (set! out-height (car (gimp-drawable-height out-text)))
- (set! out-buffer (* out-height (/ buffer-image 100)))
- (set! out-height (+ out-height out-buffer out-buffer))
- (set! out-width (+ out-width out-buffer out-buffer))
- (gimp-image-resize image out-width out-height 0 0)
- (gimp-layer-resize layer out-width out-height 0 0)
- (gimp-layer-set-offsets out-text out-buffer out-buffer)
- (gimp-image-flatten image)
- (set! drawable (car (gimp-image-get-active-layer image)))
- (file-xpm-save RUN-NONINTERACTIVE image drawable xpm-image xpm-image 127)
- (gimp-image-delete image))")
- "Generic Type script.")
-
-(defvar mode-icons--font-to-xpm-gimp-script
- (replace-regexp-in-string
- "[ \n\t]+" " "
- "(let* ((image-width 1024)
- (image-height 20)
- (buffer-image 1)
- (text \"%s\")
- (font-size 20)
- (font-name \"%s\")
- (xpm-image \"%s\")
- (bg-color '(255 255 255))
- (fg-color '(0 0 0))
- (image (car (gimp-image-new 1024 16 0)))
- (layer (car (gimp-layer-new image image-width image-height RGB-IMAGE \"layer 1\" 100 NORMAL)))
- (out-text)
- (out-width)
- (out-height)
- (out-buffer)
- (drawable))
- (gimp-image-add-layer image layer 0)
- (gimp-context-set-background bg-color)
- (gimp-context-set-foreground fg-color)
- (gimp-layer-add-alpha layer)
- (gimp-drawable-fill layer TRANSPARENT-FILL)
- (set! out-text (car (gimp-text-fontname image layer 0 0 text 0 TRUE font-size PIXELS font-name)))
-
- (set! out-width (car (gimp-drawable-width out-text)))
- (set! out-height (car (gimp-drawable-height out-text)))
- (set! out-buffer (* out-height (/ buffer-image 100)))
- (set! out-height (+ out-height out-buffer out-buffer))
- (set! out-width (+ out-width out-buffer out-buffer))
- (gimp-image-resize image out-width out-height 0 0)
- (gimp-layer-resize layer out-width out-height 0 0)
- (gimp-layer-set-offsets out-text out-buffer out-buffer)
- (gimp-image-flatten image)
- (set! drawable (car (gimp-image-get-active-layer image)))
- (file-xpm-save RUN-NONINTERACTIVE image drawable xpm-image xpm-image 127)
- (gimp-image-delete image))")
- "Gimp scheme script to convert a font character to xpm file.")
-
-(defvar mode-icons--convert-ext-to-xpm (make-hash-table :test 'equal))
-(defun mode-icons--convert-ext-to-xpm (ext)
- "Convert EXT to a xpm file."
- (let ((xpm (mode-icons-get-icon-file (concat "ext-" (downcase ext) ".xpm"))))
- (when (and mode-icons--gimp (file-exists-p mode-icons--gimp)
- xpm (not (gethash xpm mode-icons--convert-ext-to-xpm))
- (not (file-exists-p xpm)))
- (puthash xpm t mode-icons--convert-ext-to-xpm)
- (mode-icons--process-gimp
- (format mode-icons--generic-type-to-xpm-gimp-script (make-string 1 #xf016) xpm
- (downcase ext))))))
-
-(defun mode-icons--ext-available-p (icon-spec)
- "Determine if ICON-SPEC's ext is availble for display.
-If not, try `mode-icons--convert-ext-to-xpm'."
- (when (eq (nth 2 icon-spec) 'ext)
- (let ((xpm (mode-icons-get-icon-file (concat "ext-" (downcase (nth 1 icon-spec)) ".xpm"))))
- (if (file-readable-p xpm)
- xpm
- (mode-icons--convert-ext-to-xpm (nth 1 icon-spec))
- nil))))
-
-(defcustom mode-icons-generate-font-grayscale nil
- "Generate grayscale images for font icons.
-This is used instead of transparancy to capure the font's
-anti-aliasing. `mode-icons' will transform the colors to match
-the background instead."
- :type 'boolean
- :group 'mode-icons)
-
-(defvar mode-icons--convert-text-to-xpm (make-hash-table :test 'equal))
-(defun mode-icons--convert-text-to-xpm (text font xpm &optional face height)
- "Convert TEXT in FONT to XPM file using gimp.
-
-When FACE is non-nil, use the face background and foreground
-properties to render the font (its no longer transparent).
-
-When HEIGHT is non-nil, use the font HEIGHT (in pixels) instead
-of 20px."
- (when (and mode-icons--gimp (file-exists-p mode-icons--gimp)
- xpm (not (gethash xpm mode-icons--convert-text-to-xpm))
- (not (file-exists-p xpm)))
- (puthash xpm t mode-icons--convert-text-to-xpm)
- (let ((script (format mode-icons--font-to-xpm-gimp-script text font xpm))
- (background (mode-icons-background-color face))
- (foreground (mode-icons-foreground-color face)))
- (when face
- (setq background (mapcar (lambda(x)
- (round (* 255 x))) background)
- foreground (mapcar (lambda(x)
- (round (* 255 x))) foreground))
- (setq script (replace-regexp-in-string
- (regexp-quote "(bg-color '(255 255 255))")
- (format "(bg-color '%s)" background)
- script)
- script (replace-regexp-in-string
- (regexp-quote "(fg-color '(0 0 0))")
- (format "(fg-color '%s)" foreground)
- script)
- script (replace-regexp-in-string
- "TRANSPARENT-FILL" "BACKGROUND-FILL" script)
- script (replace-regexp-in-string
- (regexp-quote "(gimp-layer-add-alpha layer)") "" script)))
- (when height
- (setq script (replace-regexp-in-string
- (regexp-quote "(image-height 20)")
- (format "(image-height %s)" background)
- script)
- script (replace-regexp-in-string
- (regexp-quote "(font-size 20)")
- (format "(font-size %s)" background)
- script)
- script (replace-regexp-in-string
- "TRANSPARENT-FILL" "BACKGROUND-FILL" script)
- script (replace-regexp-in-string
- (regexp-quote "(gimp-layer-add-alpha layer)") "" script)))
- (when mode-icons-generate-font-grayscale
- (setq script (replace-regexp-in-string
- "TRANSPARENT-FILL" "BACKGROUND-FILL" script)
- script (replace-regexp-in-string
- (regexp-quote "(gimp-layer-add-alpha layer)") "" script)))
- (mode-icons--process-gimp script))))
-
-(defun mode-icons--get-font-xpm-file (icon-spec &optional icon-name)
- "Get the font icon equivalent xpm file name from ICON-SPEC.
-When ICON-NAME is non-nil, return the small icon name without the
-extension or directory."
- (let* ((xpm-int (or (and (stringp (nth 1 icon-spec))
- (= 1 (length (nth 1 icon-spec)))
- (aref (nth 1 icon-spec) 0))
- (and (integerp (nth 1 icon-spec))
- (nth 1 icon-spec))))
- (xpm-base (and (integerp xpm-int)
- (format "%s-%x" (nth 2 icon-spec)
- xpm-int))))
- (and xpm-base
- (if icon-name
- xpm-base
- (mode-icons-get-icon-file (concat xpm-base ".xpm"))))))
-
-(defun mode-icons--create-font-xpm-file (icon-spec)
- "Create a font-based xpm file based on ICON-SPEC."
- (mode-icons--convert-text-to-xpm
- (or (and (stringp (nth 1 icon-spec))
- (nth 1 icon-spec))
- (and (integerp (nth 1 icon-spec))
- (make-string 1 (nth 1 icon-spec))))
- (symbol-name (nth 2 icon-spec))
- (mode-icons--get-font-xpm-file icon-spec)))
-
-(defun mode-icons--convert-all-font-icons-to-xpm ()
- "Convert all font icons to xpm files."
- (interactive)
- (setq mode-icons--convert-text-to-xpm (make-hash-table :test 'equal))
- (dolist (icon-spec mode-icons)
- (when (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec))
- (mode-icons--create-font-xpm-file icon-spec))))
-
-(defvar mode-icons--png-to-xpm-gimp-script
- (replace-regexp-in-string
- "[ \n\t]+" " "
- "(let* ((png-image \"%s\")
- (xpm-image \"%s\")
- (image (car (file-png-load RUN-NONINTERACTIVE png-image png-image)))
- (drawable (car (gimp-image-get-active-layer image)))
- (width (car (gimp-image-width image)))
- (height (car (gimp-image-height image)))
- (new-height 16.0)
- (new-width (inexact->exact (round (* width (/ new-height height))))))
- (gimp-image-resize image 16 new-width 0 0)
- (set! drawable (car (gimp-image-get-active-layer image)))
- (file-xpm-save RUN-NONINTERACTIVE image drawable xpm-image xpm-image 127)
- (gimp-image-delete image))")
- "Gimp scheme script to convert png to xpm.")
-
-(defvar mode-icons--convert-png-to-xpm (make-hash-table :test 'equal)
- "Hash table to make sure you only convert once.")
-
-(defun mode-icons--convert-png-to-xpm (png xpm)
- "Covert PNG to a ?x16 XPM using `mode-icons--gimp'."
- (when (and mode-icons--gimp (file-exists-p mode-icons--gimp)
- xpm (not (gethash (list png xpm) mode-icons--convert-png-to-xpm))
- (not (file-exists-p xpm)))
- (puthash (list png xpm) t mode-icons--convert-png-to-xpm)
- (mode-icons--process-gimp (format mode-icons--png-to-xpm-gimp-script png xpm))))
-
-(defun mode-icons--get-png-xpm-file (icon-spec &optional icon-name)
- "Get the png->xpm file name from ICON-SPEC.
-
-When ICON-NAME is non-nil, return the mode-icons icon name."
- (if icon-name
- (nth 1 icon-spec)
- (mode-icons-get-icon-file (concat (nth 1 icon-spec) ".xpm"))))
-
-(defun mode-icons--convert-all-png-icons-to-xpm ()
- "Convert all png icons to xpm files."
- (interactive)
- (setq mode-icons--convert-png-to-xpm (make-hash-table :test 'equal))
- (dolist (icon-spec mode-icons)
- (when (eq 'png (nth 2 icon-spec))
- (mode-icons--convert-png-to-xpm
- (mode-icons-get-icon-file (concat (nth 1 icon-spec) ".png"))
- (mode-icons-get-icon-file (concat (nth 1 icon-spec) ".xpm"))))))
-
-(defun mode-icons--get-emoji-xpm-file (icon-spec &optional icon-name)
- "Get the emoji xpm file name from ICON-SPEC.
-This only supports emoji enclosed in a \":\" like :herb:.
-
-When ICON-NAME is non-nil, return the mode-icons icon name.
-For :herb: it would be e-herb."
- (let* ((xpm-base (nth 1 icon-spec))
- file)
- (when (char-equal (aref xpm-base 0) ?:)
- (setq file (substring xpm-base 1))
- (when (char-equal (aref (substring xpm-base -1) 0) ?:)
- (setq file (substring file 0 -1))
- (if icon-name
- (concat "e-" file)
- (mode-icons-get-icon-file (concat "e-" file ".xpm")))))))
-
-(defun mode-icons--get-png (mode icon-spec &optional face active)
- "Get MODE for png ICON-SPEC using FACE.
-If possible, convert the png file to an xpm file.
-ACTIVE is a flag telling if the current window is active."
- (let* ((xpm (mode-icons--get-png-xpm-file icon-spec))
- (xpm-name (mode-icons--get-png-xpm-file icon-spec t))
- (xpm-p (file-readable-p xpm))
- (png (mode-icons-get-icon-file (concat (nth 1 icon-spec) ".png")))
- (png-p (file-readable-p png))
- (face (mode-icons--get-face face active)))
- (if xpm-p
- (propertize (format "%s" mode) 'display
- (mode-icons-get-icon-display
- xpm-name 'xpm
- face active)
- 'face face
- 'mode-icons-p (list (nth 0 icon-spec) xpm-name 'xpm))
- (if (not png-p)
- (propertize (format "%s" mode)
- 'face face
- 'mode-icons-p icon-spec)
- (mode-icons--convert-png-to-xpm png xpm)
- (propertize (format "%s" mode)
- 'display
- (create-image png
- ;; use imagemagick if available and supports PNG images
- ;; (allows resizing images)
- (or (and (and (fboundp 'imagemagick-types)
- (memq 'png (imagemagick-types)))
- 'imagemagick) 'png)
- nil
- :height (mode-icons-line-height)
- :ascent 'center
- :heuristic-mask t
- :face face)
- 'face face
- 'mode-icons-p icon-spec)))))
-
-(defcustom mode-icons-prefer-xpm-over-emoji nil
- "Prefer generated xpms over fonts.
-If mode-icons has a generated font character, prefer that over
-the actual font."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-generate-emoji-xpms nil
- "Generate font compatibility xpms for fonts."
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons--get-emoji (mode icon-spec &optional face active)
- "Get MODE emoji for ICON-SPEC using FACE.
-ACTIVE is a flag for if the current window is active."
- (let* ((xpm (mode-icons--get-emoji-xpm-file icon-spec))
- (xpm-name (mode-icons--get-emoji-xpm-file icon-spec t))
- (xpm-p (file-readable-p xpm))
- (face (mode-icons--get-face face active)))
- (if (or (and mode-icons-prefer-xpm-over-emoji xpm-p)
- (and xpm-p (not (featurep 'emojify)))
- (and xpm-p (not (image-type-available-p 'png))))
- (propertize (format "%s" mode) 'display
- (mode-icons-get-icon-display
- xpm-name 'xpm face active)
- 'mode-icons-p (list (nth 0 icon-spec) xpm-name 'xpm))
- (unless emojify-emojis
- (emojify-set-emoji-data))
- (let* ((emoji (ht-get emojify-emojis (nth 1 icon-spec)))
- (image-file (expand-file-name (ht-get emoji "image") (if (fboundp 'emojify-image-dir)
- (emojify-image-dir)
- emojify-image-dir)))
- (image-type (intern (upcase (file-name-extension image-file)))))
- (if (not (file-exists-p image-file))
- (propertize (format "%s" mode)
- 'face face
- 'mode-icons-p icon-spec)
- (when mode-icons-generate-emoji-xpms
- (mode-icons--convert-png-to-xpm image-file xpm))
- (propertize (format "%s" mode)
- 'display
- (create-image image-file
- ;; use imagemagick if available and supports PNG images
- ;; (allows resizing images)
- (or (and (and (fboundp 'imagemagick-types)
- (memq image-type (imagemagick-types)))
- 'imagemagick) 'png)
- nil
- :ascent 'center
- :heuristic-mask t
- :face face
- ;; :background (emojify--get-image-background beg end)
- ;; no-op if imagemagick is not available
- :height (mode-icons-line-height))
- 'face face
- 'mode-icons-p icon-spec))))))
-
-(defcustom mode-icons-prefer-xpm-over-font nil
- "Prefer generated xpms over fonts.
-If mode-icons has a generated font character, prefer that over
-the actual font."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-generate-font-xpms nil
- "Generate font compatibility xpms for fonts."
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons--get-font (mode icon-spec &optional face active)
- "Get font for MODE based on ICON-SPEC, and FACE.
-ACTIVE if a flag for if the current window is active."
- ;; Use `compose-region' because it allows clickable text.
- (let* ((xpm (mode-icons--get-font-xpm-file icon-spec))
- (xpm-name (mode-icons--get-font-xpm-file icon-spec t))
- (xpm-p (file-readable-p xpm))
- (face (mode-icons--get-face face active)))
- (when (and (not xpm-p) mode-icons-generate-font-xpms)
- (mode-icons--create-font-xpm-file icon-spec))
- (if (and xpm-p (or mode-icons-prefer-xpm-over-font
- (not (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec)))))
- (propertize (format "%s" mode) 'display
- (mode-icons-get-icon-display
- xpm-name 'xpm face active)
- 'mode-icons-p (list (nth 0 icon-spec) xpm-name 'xpm-bw)
- 'face face)
- (mode-icons-save-buffer-state
- (with-temp-buffer
- (if (stringp mode)
- (insert mode)
- (insert (or (and (integerp (nth 1 icon-spec))
- (make-string 1 (nth 1 icon-spec)))
- (nth 1 icon-spec))))
- (compose-region (point-min) (point-max) (or (and (integerp (nth 1 icon-spec))
- (make-string 1 (nth 1 icon-spec)))
- (nth 1 icon-spec)))
- (put-text-property (point-min) (point-max)
- 'face face)
- (if (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec))
- (put-text-property (point-min) (point-max)
- 'mode-icons-p icon-spec)
- (put-text-property (point-min) (point-max)
- 'mode-icons-p (list (nth 0 icon-spec) xpm-name 'xpm-bw)))
- (buffer-string))))))
-
-(defun mode-icons-propertize-mode (mode icon-spec &optional face active)
- "Propertize MODE with ICON-SPEC.
-
-MODE should be a string, the name of the mode to propertize.
-ICON-SPEC should be a specification from `mode-icons'.
-FACE is the face to match when a xpm-bw image is used.
-ACTIVE is a flag to tell if the current window is active."
- (let (tmp new-icon-spec)
- (mode-icons-save-buffer-state ;; Otherwise may cause issues with trasient mark mode
- (cond
- ((and (stringp mode) (get-text-property 0 'mode-icons-p mode))
- mode)
- ((not (nth 1 icon-spec))
- "")
- ((and (stringp (nth 1 icon-spec)) (not (nth 2 icon-spec)))
- (propertize (nth 1 icon-spec) 'display (nth 1 icon-spec)
- 'mode-icons-p icon-spec))
- ((mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec))
- ;; (propertize mode 'display (nth 1 icon-spec) 'mode-icons-p t)
- ;;(mode-icons--get-font " AI" '("\\` ?AI\\'" 61500 FontAwesome) face active)
- (mode-icons--get-font mode icon-spec face active))
- ((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'emoji))
- (mode-icons--get-emoji mode icon-spec face active))
- ((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'png))
- (mode-icons--get-png mode icon-spec face active))
- ((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'ext))
- (propertize (format "%s" mode) 'display
- (mode-icons-get-icon-display
- (concat "ext-" (nth 1 icon-spec)) 'xpm-bw face active)
- 'mode-icons-p (list (nth 0 icon-spec)
- (concat "ext-" (nth 1 icon-spec))
- 'xpm-bw)))
- (t (setq tmp (mode-icons-get-icon-display (nth 1 icon-spec) (nth 2 icon-spec) face active))
- ;; (when (string= (nth 0 icon-spec) "\\` ?AI\\'")
- ;; (message "plist: %s" tmp))
- (cond
- ((and (plist-get (cdr tmp) :xpm-bw) (plist-get (cdr tmp) :icon))
- (setq new-icon-spec (list (nth 0 icon-spec) (plist-get (cdr tmp) :icon) 'xpm-bw)))
- ((and (eq (plist-get (cdr tmp) :type) 'xpm) (plist-get (cdr tmp) :icon))
- (setq new-icon-spec (list (nth 0 icon-spec) (plist-get (cdr tmp) :icon) 'xpm)))
- (t (setq new-icon-spec icon-spec)))
- (propertize (format "%s" mode) 'display tmp
- 'mode-icons-p new-icon-spec))))))
-
-(defvar mode-icons-get-icon-spec (make-hash-table :test 'equal)
- "Hash table of icon-specifications.")
-(defun mode-icons-get-icon-spec (mode &optional is-major-mode-p)
- "Get icon spec for MODE based on regular expression."
- (or (gethash mode mode-icons-get-icon-spec)
- (let* (case-fold-search
- (ignore-cache nil)
- (icon-spec (catch 'found-mode
- (dolist (item mode-icons)
- (when (and (mode-icons-supported-p item)
- (or
- (and
- (stringp (car item))
- (stringp mode)
- (string-match-p (car item) mode))
- (and
- (symbolp (car item))
- (symbolp mode)
- (eq mode (car item)))
- (and
- is-major-mode-p
- (symbolp (car item))
- (functionp (car item))
- (and (ignore-errors (funcall (car item)))
- (setq ignore-cache t)))))
- (throw 'found-mode item)))
- nil)))
- (when (and icon-spec (eq (nth 2 icon-spec) 'emoji)
- (file-exists-p (mode-icons--get-emoji-xpm-file icon-spec)))
- (setq icon-spec (list (nth 0 icon-spec) (mode-icons--get-emoji-xpm-file icon-spec t) 'xpm)))
- (unless ignore-cache
- (puthash mode icon-spec mode-icons-get-icon-spec))
- icon-spec)))
-
-(defcustom mode-icons-show-mode-name nil
- "Show Icon and `mode-name'."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-change-mode-name t
- "Change the `mode-name' variable.
-
-This allows functions like `ibuffer' or `helm-mode' to show the
-icon as well."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-use-default-icon nil
- "Use the 'default icon when icon-name cannot be found."
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons-get-mode-icon (mode &optional face active)
- "Get the icon for MODE, if there is one.
-FACE represents the face used when the icon is a xpm-bw image.
-ACTIVE represents if the window is active."
- (let* ((mode-name (format-mode-line mode))
- (icon-spec (mode-icons-get-icon-spec mode-name t))
- (face (mode-icons--get-face face active))
- ret)
- (when (and (not icon-spec) mode-icons-use-default-icon)
- (setq icon-spec (mode-icons-get-icon-spec 'default)))
- (if icon-spec
- (setq ret
- (if mode-icons-show-mode-name
- (concat (mode-icons-propertize-mode mode-name icon-spec face active) " " mode-name)
- (mode-icons-propertize-mode mode-name icon-spec face active)))
- (setq ret mode-name))
- ;; Don't hide major mode names...
- (when (string= ret "")
- (setq ret mode-name))
- ret))
-
-(defvar mode-icons-cached-mode-name nil
- "Cached mode name to restore when disabling mode-icons.")
-
-(defvar mode-icons--mode-name nil
- "Mode name displayed by mode-icons.")
-
-(defun mode-icons-set-mode-icon (mode)
- "Set the icon for MODE."
- (unless mode-icons-cached-mode-name
- (set (make-local-variable 'mode-icons-cached-mode-name)
- mode-name)
- (set (make-local-variable 'mode-icons--mode-name)
- (mode-icons-get-mode-icon mode nil t))
- (when mode-icons-change-mode-name
- (setq mode-name mode-icons--mode-name))))
-
-(defun mode-icons-major-mode-icons-undo ()
- "Undo the `mode-name' icons."
- (dolist (b (buffer-list))
- (with-current-buffer b
- (when mode-icons-cached-mode-name
- (setq mode-name mode-icons-cached-mode-name
- mode-icons-cached-mode-name nil)))))
-
-(defun mode-icons-major-mode-icons ()
- "Apply mode name icons on all buffers."
- (dolist (b (buffer-list))
- (with-current-buffer b
- (mode-icons-set-current-mode-icon))))
-
-(defun mode-icons-set-current-mode-icon ()
- "Set the icon for the current major mode."
- (mode-icons-set-mode-icon mode-name))
-
-(defvar mode-icons-set-minor-mode-icon-alist nil)
-
-(defun mode-icons-set-minor-mode-icon-undo (&optional dont-update)
- "Undo minor modes.
-When DONT-UPDATE is non-nil, don't call `force-mode-line-update'."
- (let (minor)
- (dolist (mode mode-icons-set-minor-mode-icon-alist)
- (setq minor (assq (car mode) minor-mode-alist))
- (when minor
- (setcdr minor (cdr mode)))))
- (setq mode-icons-set-minor-mode-icon-alist nil)
- (unless dont-update
- (force-mode-line-update)))
-
-(defcustom mode-icons-separate-images-with-spaces t
- "Separate minor-mode icons with spaces."
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons-set-minor-mode-icon (&optional dont-update)
- "Set the icon for the minor modes.
-When DONT-UPDATE is non-nil, don't call `force-mode-line-update'"
- (let (icon-spec mode-name minor cur-mode)
- (dolist (mode minor-mode-alist)
- (setq cur-mode
- (or (assq (car mode) mode-icons-set-minor-mode-icon-alist)
- mode))
- (setq mode-name (format-mode-line cur-mode)
- icon-spec (mode-icons-get-icon-spec mode-name))
- (when icon-spec
- (setq minor (assq (car cur-mode) minor-mode-alist))
- (when minor
- (or (assq (car cur-mode) mode-icons-set-minor-mode-icon-alist)
- (push (copy-sequence minor) mode-icons-set-minor-mode-icon-alist))
- (setq mode-name (replace-regexp-in-string "^ " "" mode-name)
- mode-name (mode-icons-propertize-mode mode-name icon-spec))
- (if (string= "" mode-name)
- (setcdr minor (list ""))
- (setcdr minor (list (concat (or (and mode-icons-separate-images-with-spaces " ") "")
- mode-name))))))))
- (unless dont-update
- (force-mode-line-update)))
-
-(defun mode-icons--generate-major-mode-item (&optional face)
- "Give rich strings needed for `major-mode' viewing.
-FACE is the face that the major mode item should be rendered in."
- (let* ((active (mode-icons--selected-window-active))
- (face (mode-icons--get-face face active)))
- (eval `(propertize ,(mode-icons--recolor-string (or mode-icons--mode-name mode-name) active face)
- 'face ',face
- ,@mode-icons-major-mode-base-text-properties))))
-
-;;; selected take from powerline
-(defvar mode-icons--selected-window (frame-selected-window)
- "Selected window.")
-
-(defun mode-icons--set-selected-window ()
- "Set the variable `mode-icons--selected-window' appropriately."
- (when (not (minibuffer-window-active-p (frame-selected-window)))
- (setq mode-icons--selected-window (frame-selected-window))))
-
-(defun mode-icons--unset-selected-window ()
- "Unsets the variable `mode-icons--selected-window' and update the modeline."
- (setq mode-icons--selected-window nil)
- (force-mode-line-update))
-
-(add-hook 'window-configuration-change-hook 'mode-icons--set-selected-window)
-
-;; focus-in-hook was introduced in emacs v24.4.
-;; Gets evaluated in the last frame's environment.
-;; (add-hook 'focus-in-hook 'mode-icons--set-selected-window)
-
-;; focus-out-hook was introduced in emacs v24.4.
-;; (add-hook 'focus-out-hook 'mode-icons--unset-selected-window)
-
-;; Executes after the window manager requests that the user's events
-;; be directed to a different frame.
-(defadvice handle-switch-frame
- (after mode-icons--set-selected-window-after-switch-frame activate)
- "Make `mode-icons' aware of selected window."
- (mode-icons--set-selected-window))
-
-(defadvice select-window (after mode-icons--select-window activate)
- "Make `mode-icons' aware of selected window."
- (mode-icons--set-selected-window))
-
-(defun mode-icons--selected-window-active ()
- "Return whether the current window is active."
- (eq mode-icons--selected-window (selected-window)))
-
-(defun mode-icons--property-substrings (str prop)
- "Return a list of substrings of STR when PROP change."
- ;; Taken from powerline by Donald Ephraim Curtis, Jason Milkins and
- ;; Nicolas Rougier
- (let ((beg 0) (end 0)
- (len (length str))
- (out))
- (while (< end (length str))
- (setq end (or (next-single-property-change beg prop str) len))
- (setq out (append out (list (substring str beg (setq beg end))))))
- out))
-
-(defun mode-icons--recolor-string (string &optional active face)
- "Recolor `mode-icons' in STRING.
-ACTIVE tells if the current window is active.
-FACE is the face to recolor the icon to."
- (let* ((face (mode-icons--get-face face active))
- icon-spec)
- (mapconcat
- (lambda(str)
- (cond
- ((get-text-property 0 'display str)
- (mode-icons--recolor-minor-mode-image str active face))
- ((and (setq icon-spec (get-text-property 0 'mode-icons-p str))
- (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec)))
- (mode-icons--get-font str icon-spec face active))
- (t
- str)))
- (mode-icons--property-substrings string 'mode-icons-p)
- "")))
-
-(defun mode-icons--recolor-minor-mode-image (mode active &optional face)
- "Recolor MODE image based on if the window is ACTIVE.
-Use FACE when specified."
- (let ((icon-spec (get-text-property 0 'mode-icons-p mode))
- (face (mode-icons--get-face face active)))
- (cond
- ((and icon-spec (memq (nth 2 icon-spec) '(xpm xpm-bw)))
- (propertize mode 'display (mode-icons-get-icon-display
- (nth 1 icon-spec) (nth 2 icon-spec) face active)
- 'face face
- 'mode-icons-p icon-spec))
- ((and icon-spec (memq (nth 2 icon-spec) '(emoji))
- (file-exists-p (mode-icons--get-emoji-xpm-file icon-spec)))
- (propertize mode 'display (mode-icons-get-icon-display
- (mode-icons--get-emoji-xpm-file icon-spec t)
- 'xpm face active) 'face face
- 'mode-icons-p icon-spec))
- (t (propertize mode 'face face)))))
-
-(defun mode-icons--generate-minor-mode-list (&optional face)
- "Extracts all rich strings necessary for the minor mode list.
-When FACE is non-nil, use FACE to render the `minor-mode-alist'."
- (let* ((active (mode-icons--selected-window-active))
- (face (mode-icons--get-face face active)))
- (delete " " (delete "" (mapcar (lambda(mode)
- (concat " " (eval `(propertize ,(mode-icons--recolor-minor-mode-image mode active face)
- ,@mode-icons-minor-mode-base-text-properties))))
- (split-string (format-mode-line minor-mode-alist)))))))
-
-(defun mode-icons--generate-narrow (&optional face)
- "Extracts all rich strings necessary for narrow indicator.
-When FACE is non-nil, use FACE to render the narrow indicator."
- (let* ((active (mode-icons--selected-window-active))
- (face (mode-icons--get-face active face))
- icon-spec)
- (delete " " (delete "" (mapcar (lambda(mode)
- (concat " " (eval `(propertize
- ,(if (setq icon-spec (mode-icons-get-icon-spec (concat " " mode)))
- (mode-icons--recolor-minor-mode-image
- (mode-icons-propertize-mode (concat " " mode) icon-spec face active)
- active face)
- mode)
- ,@mode-icons-narrow-text-properties))))
- (split-string (format-mode-line "%n")))))))
-
-
-(defcustom mode-icons-read-only-space t
- "Add Space after read-only icon."
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons--read-only-status (&optional face)
- "Get Read Only Status icon.
-FACE is the face to render the icon in."
- (let ((active (mode-icons--selected-window-active)))
- (eval `(propertize
- ,(let ((ro (format-mode-line "%1*"))
- icon-spec)
- (setq ro (or (cond
- ((string= "%" ro)
- (if (setq icon-spec (mode-icons-get-icon-spec 'read-only))
- (mode-icons-propertize-mode 'read-only icon-spec face active)
- ro))
- (t
- (if (setq icon-spec (mode-icons-get-icon-spec 'writable))
- (mode-icons-propertize-mode 'writable icon-spec face active)
- ro)))
- "")
- ro (mode-icons--recolor-minor-mode-image ro active face))
- (when (and mode-icons-read-only-space
- (not (string= ro "")))
- (setq ro (concat ro " ")))
- ro)
- ,@mode-icons-read-only-text-properties))))
-
-(defcustom mode-icons-modified-status-space t
- "Add Space to modified status."
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons--modified-status (&optional face)
- "Get modified status icon.
-FACE is the face to render the icon in."
- (let ((active (mode-icons--selected-window-active)))
- (eval `(propertize
- ,(or (ignore-errors
- (let* ((bfn (buffer-file-name))
- (nice-file-p (and (file-remote-p bfn)))
- (mod (or (and (not (or nice-file-p (verify-visited-file-modtime (current-buffer))))
- "!")
- (and (not (or nice-file-p (member (file-locked-p bfn) '(nil t))))
- "s")
- (format-mode-line "%1+")))
- icon-spec)
- (setq mod (or (cond
- ((not (stringp mod)) "")
- ((char-equal ?s (aref mod 0))
- (if (setq icon-spec (mode-icons-get-icon-spec 'steal))
- (mode-icons-propertize-mode 'steal icon-spec face active)
- mod))
- ((char-equal ?! (aref mod 0))
- (if (setq icon-spec (mode-icons-get-icon-spec 'modified-outside))
- (mode-icons-propertize-mode 'modified-outside icon-spec face active)
- mod))
- ((char-equal ?* (aref mod 0))
- (if (setq icon-spec (mode-icons-get-icon-spec 'save))
- (mode-icons-propertize-mode 'save icon-spec face active)
- mod))
- (t
- (if (setq icon-spec (mode-icons-get-icon-spec 'saved))
- (mode-icons-propertize-mode 'saved icon-spec face active)
- mod)))
- ""))
- (setq mod (mode-icons--recolor-minor-mode-image mod active face))
- (when (and mode-icons-modified-status-space
- (stringp mod)
- (not (string= mod "")))
- (setq mod (concat mod " ")))
- mod)) "")
- ,@mode-icons-modified-text-properties))))
-
-;; Based on rich-minority by Artur Malabarba
-(defvar mode-icons--backup-construct nil)
-(defvar mode-icons--mode-line-construct
- '(:eval (mode-icons--generate-minor-mode-list))
- "Construct used to replace `minor-mode-alist'.")
-
-(defvar mode-icons--major-backup-construct nil)
-(defvar mode-icons--major-construct
- '(:eval (mode-icons--generate-major-mode-item))
- "Construct used to replace `mode-name'.")
-
-(defvar mode-icons--narrow-backup-construct nil)
-(defvar mode-icons--narrow-construct
- '(:eval (mode-icons--generate-narrow))
- "Construct used to replace %n in `mode-line-modes'.")
-
-
-(defvar mode-icons--read-only-backup-construct nil)
-(defvar mode-icons--read-only-construct
- '(:eval (mode-icons--read-only-status))
- "Construct used to replace %1* in `mode-line-modified'.")
-
-
-(defvar mode-icons--modified-backup-construct nil)
-(defvar mode-icons--modified-construct
- '(:eval (mode-icons--modified-status))
- "Construct used to replace %1+ in `mode-line-modified'.")
-
-(defvar mode-icons--backup-eol-construct nil)
-(defvar mode-icons--eol-construct
- '(:eval (mode-icons--mode-line-eol-desc))
- "End of Line Construct.")
-
-(defcustom mode-icons-eol-space t
- "Add a space to the end of line specification."
- :type 'boolean
- :group 'mode-icons)
-
-(defcustom mode-icons-eol-text nil
- "Describe end of line type.
-\(Unix) -> LF
-\(DOS) -> CRLF
-\(Mac) -> CR"
- :type 'boolean
- :group 'mode-icons)
-
-(defun mode-icons--mode-line-eol-desc (&optional string face)
- "Modify `mode-line-eol-desc' to have icons.
-
-STRING is the string to modify, or if absent, the value from
-`mode-line-eol-desc'.
-
-FACE is the face that will be used to render the segment."
- (let* ((str (or string (mode-line-eol-desc)))
- (props (text-properties-at 0 str))
- (lt2 "")
- (active (mode-icons--selected-window-active))
- icon-spec)
- (setq str (or (cond
- ((string= "(Unix)" str)
- (setq lt2 " LF")
- (if (setq icon-spec (mode-icons-get-icon-spec 'unix))
- (mode-icons-propertize-mode 'unix icon-spec face active)
- str))
- ((or (string= str "(DOS)")
- (string= str "\\"))
- (setq lt2 " CRLF")
- (if (setq icon-spec (mode-icons-get-icon-spec 'win))
- (mode-icons-propertize-mode 'win icon-spec face active)
- str))
- ((string= str "(Mac)")
- (setq lt2 " CR")
- (if (setq icon-spec (mode-icons-get-icon-spec 'apple))
- (mode-icons-propertize-mode 'apple icon-spec face active)
- str))
- ((string= str ":")
- (setq lt2 " Undecided")
- (if (setq icon-spec (mode-icons-get-icon-spec 'undecided))
- (mode-icons-propertize-mode 'undecided icon-spec face active)
- str))
- (t str))
- ""))
- (setq str (mode-icons--recolor-minor-mode-image str active face))
- (when mode-icons-eol-text
- (setq str (concat str lt2)))
- (when (and mode-icons-eol-space
- (not (string= "" str)))
- (setq str (concat str " ")))
- (add-text-properties 0 (length str) props str)
- str))
-
-
-(defun mode-icons-fix (&optional enable)
- "Fix mode-icons.
-When ENABLE is non-nil, enable the changes to the mode line."
- (if enable
- (let ((place (or (member 'minor-mode-alist mode-line-modes)
- (cl-member-if
- (lambda (x) (and (listp x)
- (equal (car x) :propertize)
- (equal (cadr x) '("" minor-mode-alist))))
- mode-line-modes)))
- (place-major (cl-member-if
- (lambda(x)
- (and (listp x)
- (equal (car x) :propertize)
- (equal (cadr x) '("" mode-name))))
- mode-line-modes))
- (place-narrow (cl-member-if
- (lambda(x)
- (and (stringp x) (string= "%n" x)))
- mode-line-modes))
- (place-ro (cl-member-if
- (lambda(x)
- (and (stringp x) (string-match-p "%[0-9]*[*]" x)))
- mode-line-modified))
- (place-mod (cl-member-if
- (lambda(x)
- (and (stringp x) (string-match-p "%[0-9]*[+]" x)))
- mode-line-modified))
- (place-eol (cl-member-if
- (lambda(x)
- (and (listp x)
- (equal (car x) :eval)
- (eq (cl-caadr x) 'mode-line-eol-desc)))
- mode-line-mule-info)))
- (when place
- (setq mode-icons--backup-construct (car place))
- (setcar place mode-icons--mode-line-construct))
- (when place-major
- (setq mode-icons--major-backup-construct (car place-major))
- (setcar place-major mode-icons--major-construct))
- (when place-narrow
- (setq mode-icons--narrow-backup-construct (car place-narrow))
- (setcar place-narrow mode-icons--narrow-construct))
- (when place-ro
- (setq mode-icons--read-only-backup-construct (car place-ro))
- (setcar place-ro mode-icons--read-only-construct))
- (when place-mod
- (setq mode-icons--modified-backup-construct (car place-mod))
- (setcar place-mod mode-icons--modified-construct))
- (when place-eol
- (setq mode-icons--backup-eol-construct (car place-eol))
- (setcar place-eol mode-icons--eol-construct)))
- (let ((place (member mode-icons--mode-line-construct mode-line-modes))
- (place-major (member mode-icons--major-construct mode-line-modes))
- (place-narrow (member mode-icons--narrow-construct mode-line-modes))
- (place-ro (member mode-icons--read-only-construct mode-line-modified))
- (place-mod (member mode-icons--modified-construct mode-line-modified))
- (place-eol (member mode-icons--eol-construct mode-line-mule-info)))
- (when place
- (setcar place mode-icons--backup-construct))
- (when place-major
- (setcar place-major mode-icons--major-backup-construct))
- (when place-narrow
- (setcar place-narrow mode-icons--narrow-backup-construct))
- (when place-ro
- (setcar place-ro mode-icons--read-only-backup-construct))
- (when place-mod
- (setcar place-mod mode-icons--modified-backup-construct))
- (when place-eol
- (setcar place-eol mode-icons--backup-eol-construct)))))
-
-;;;###autoload
-(define-minor-mode mode-icons-mode
- "Replace the name of the current major mode with an icon."
- :global t
- (if mode-icons-mode
- (progn
- (add-hook 'after-change-major-mode-hook #'mode-icons-reset)
- (mode-icons-fix t)
- (mode-icons-set-minor-mode-icon)
- (mode-icons-major-mode-icons))
- (remove-hook 'after-change-major-mode-hook #'mode-icons-reset)
- (mode-icons-set-minor-mode-icon-undo)
- (mode-icons-major-mode-icons-undo)
- (mode-icons-fix)))
-
-(defun mode-icons-reset-hash ()
- "Reset `mode-icons-get-icon-spec' and `mode-icons-get-icon-display'."
- (interactive)
- (setq mode-icons-get-icon-spec (make-hash-table :test 'equal)
- mode-icons-get-icon-display (make-hash-table :test 'equal)))
-
-(defun mode-icons-reset ()
- "Reset mode-icons icons."
- (interactive)
- (when (and mode-icons-mode (not (minibufferp)))
- ;; Reset the major mode now.
- (mode-icons-set-current-mode-icon)
- ;; Reset the minor mode later, in case the mode turns on some
- ;; minor-modes.
- (run-with-idle-timer
- 0.1 nil `(lambda()
- ;; Reset the minor mode icons
- (when (buffer-live-p ,(current-buffer))
- (with-current-buffer ,(current-buffer)
- (mode-icons-set-minor-mode-icon)))))))
-
-(add-hook 'emacs-startup-hook #'mode-icons-reset)
-
-(defadvice isearch-mode (after mode-icons--reset-isearch-icon activate)
- "Make `mode-icons' aware of icon."
- (mode-icons-set-minor-mode-icon))
-
-(eval-after-load 'powerline
- '(progn
- (declare-function mode-icons--real-powerline-minor-modes "powerline")
- (fset 'mode-icons--real-powerline-minor-modes #'powerline-minor-modes)
- (defun mode-icons--powerline-minor-modes (&optional face pad)
- "Powerline minor modes is replaced by this function.
-FACE is the face to use.
-PAD is the padding around the minor modes.
-
-The original is called if `mode-icons-mode' is disabled. It is
-saved in `mode-icons--real-powerline-minor-modes'."
- (if mode-icons-mode
- (mode-icons--generate-minor-mode-list face)
- (mode-icons--real-powerline-minor-modes face pad)))
- (fset 'mode-icons--real-powerline-major-mode #'powerline-minor-modes)
- (defun mode-icons--powerline-major-mode (&optional face pad)
- "Powerline major modes is replaced by this function.
-FACE is the face to use.
-PAD is the padding around the minor modes.
-
-The original is called if `mode-icons-mode' is disabled. It is
-saved in `mode-icons--real-powerline-major-mode'."
- (if mode-icons-mode
- (powerline-raw (format-mode-line (mode-icons--generate-major-mode-item face) face) face pad)
- (mode-icons--real-powerline-major-mode face pad)))
- (fset 'powerline-major-mode #'mode-icons--powerline-major-mode)
- (fset 'mode-icons--real-powerline-raw #'powerline-raw)
- (defun mode-icons--powerline-raw (str &optional face pad)
- "Render STR as mode-line data using FACE and optionally PAD import on left (l) or right (r).
-This uses `mode-icons--recolor-string' when `mode-icons-mode' is enabled."
- (if mode-icons-mode
- (when str
- (let* ((rendered-str (format-mode-line str))
- (padded-str (concat
- (when (and (> (length rendered-str) 0) (eq pad 'l)) " ")
- (if (listp str) rendered-str str)
- (when (and (> (length rendered-str) 0) (eq pad 'r)) " "))))
- (if face
- (mode-icons--recolor-string (pl/add-text-property padded-str 'face face)
- (mode-icons--selected-window-active) face)
- padded-str)))
- (mode-icons--real-powerline-raw str face pad)))
- (fset 'powerline-raw #'mode-icons--powerline-raw)))
-
-
-(eval-after-load 'emojify
- '(progn
- (mode-icons-reset-hash)))
-
-(provide 'mode-icons)
-;;; mode-icons.el ends here
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
diff --git a/elpa/org-bullets-20200317.1740/org-bullets-autoloads.el b/elpa/org-bullets-20200317.1740/org-bullets-autoloads.el
deleted file mode 100644
index 127cbf7..0000000
--- a/elpa/org-bullets-20200317.1740/org-bullets-autoloads.el
+++ /dev/null
@@ -1,27 +0,0 @@
-;;; org-bullets-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "org-bullets" "org-bullets.el" (0 0 0 0))
-;;; Generated autoloads from org-bullets.el
-
-(autoload 'org-bullets-mode "org-bullets" "\
-Use UTF8 bullets in Org mode headings.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-bullets" '("org-bullets-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; org-bullets-autoloads.el ends here
diff --git a/elpa/org-bullets-20200317.1740/org-bullets-pkg.el b/elpa/org-bullets-20200317.1740/org-bullets-pkg.el
deleted file mode 100644
index 5e8e716..0000000
--- a/elpa/org-bullets-20200317.1740/org-bullets-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "org-bullets" "20200317.1740" "Show bullets in org-mode as UTF-8 characters" 'nil :commit "767f55feb58b840a5a04eabfc3fbbf0d257c4792" :authors '(("sabof")) :maintainer '("D. Williams" . "d.williams@posteo.net") :url "https://github.com/integral-dw/org-bullets")
diff --git a/elpa/org-bullets-20200317.1740/org-bullets.el b/elpa/org-bullets-20200317.1740/org-bullets.el
deleted file mode 100644
index 44ad4a8..0000000
--- a/elpa/org-bullets-20200317.1740/org-bullets.el
+++ /dev/null
@@ -1,138 +0,0 @@
-;;; org-bullets.el --- Show bullets in org-mode as UTF-8 characters
-
-;; Version: 0.3.0
-;; Package-Version: 20200317.1740
-;; Package-Commit: 767f55feb58b840a5a04eabfc3fbbf0d257c4792
-;; Author: sabof
-;; Maintainer: D. Williams <d.williams@posteo.net>
-;; Homepage: https://github.com/integral-dw/org-bullets
-
-;; This file is NOT part of GNU Emacs.
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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.
-
-;; For a full copy of the GNU General Public License
-;; see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Show org-mode bullets as UTF-8 characters.
-
-;; This is a legacy package maintained with a focus on preservation.
-;; It has an unofficial successor package (org-superstar). This means
-;; that new features will no longer be added, and backwards
-;; compatibility will be preserved.
-
-;; It's unofficial successor package is available on MELPA. You can
-;; also find it on GitHub:
-;; https://github.com/integral-dw/org-superstar-mode
-
-;;; Code:
-
-(require 'org)
-
-(defgroup org-bullets nil
- "Display bullets as UTF-8 characters."
- :group 'org-appearance)
-
-;; A nice collection of unicode bullets:
-;; http://nadeausoftware.com/articles/2007/11/latency_friendly_customized_bullets_using_unicode_characters
-(defcustom org-bullets-bullet-list
- '(;;; Large
- "◉"
- "○"
- "✸"
- "✿"
- ;; ♥ ● ◇ ✚ ✜ ☯ ◆ ♠ ♣ ♦ ☢ ❀ ◆ ◖ ▶
- ;;; Small
- ;; ► • ★ ▸
- )
- "List of bullets used in Org headings.
-It can contain any number of symbols, which will be repeated."
- :group 'org-bullets
- :type '(repeat (string :tag "Bullet character")))
-
-(defcustom org-bullets-face-name nil
- "Face used for bullets in Org mode headings.
-If set to the name of a face, that face is used.
-Otherwise the face of the heading level is used."
- :group 'org-bullets
- :type 'symbol)
-
-(defvar org-bullets-bullet-map (make-sparse-keymap))
-
-(defun org-bullets-level-char (level)
- "Return the desired bullet for the given heading LEVEL."
- (string-to-char
- (nth (mod (/ (1- level) (if org-odd-levels-only 2 1))
- (length org-bullets-bullet-list))
- org-bullets-bullet-list)))
-
-(defvar org-bullets--keywords
- `(("^\\*+ "
- (0 (let* ((level (- (match-end 0) (match-beginning 0) 1))
- (is-inline-task
- (and (boundp 'org-inlinetask-min-level)
- (>= level org-inlinetask-min-level))))
- (compose-region (- (match-end 0) 2)
- (- (match-end 0) 1)
- (org-bullets-level-char level))
- (when is-inline-task
- (compose-region (- (match-end 0) 3)
- (- (match-end 0) 2)
- (org-bullets-level-char level)))
- (when (facep org-bullets-face-name)
- (put-text-property (- (match-end 0)
- (if is-inline-task 3 2))
- (- (match-end 0) 1)
- 'face
- org-bullets-face-name))
- (put-text-property (match-beginning 0)
- (- (match-end 0) 2)
- 'face 'org-hide)
- (put-text-property (match-beginning 0)
- (match-end 0)
- 'keymap
- org-bullets-bullet-map)
- nil)))))
-
-;;;###autoload
-(define-minor-mode org-bullets-mode
- "Use UTF8 bullets in Org mode headings."
- nil nil nil
- (if org-bullets-mode
- (progn
- (font-lock-add-keywords nil org-bullets--keywords)
- (org-bullets--fontify-buffer))
- (save-excursion
- (goto-char (point-min))
- (font-lock-remove-keywords nil org-bullets--keywords)
- (while (re-search-forward "^\\*+ " nil t)
- (decompose-region (match-beginning 0) (match-end 0)))
- (org-bullets--fontify-buffer))))
-
-(defun org-bullets--fontify-buffer ()
- "Fontify the current buffer."
- (when font-lock-mode
- (if (and (fboundp 'font-lock-flush)
- (fboundp 'font-lock-ensure))
- (save-restriction
- (widen)
- (font-lock-flush)
- (font-lock-ensure))
- (with-no-warnings
- (font-lock-fontify-buffer)))))
-
-(provide 'org-bullets)
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-;;; org-bullets.el ends here
diff --git a/elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el b/elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el
deleted file mode 100644
index 331d245..0000000
--- a/elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el
+++ /dev/null
@@ -1,62 +0,0 @@
-;;; page-break-lines-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "page-break-lines" "page-break-lines.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from page-break-lines.el
-
-(autoload 'page-break-lines-mode "page-break-lines" "\
-Toggle Page Break Lines mode.
-
-In Page Break mode, page breaks (^L characters) are displayed as a
-horizontal line of `page-break-lines-char' characters.
-
-\(fn &optional ARG)" t nil)
-
-(define-obsolete-function-alias 'turn-on-page-break-lines-mode 'page-break-lines-mode)
-
-(autoload 'page-break-lines-mode-maybe "page-break-lines" "\
-Enable `page-break-lines-mode' in the current buffer if desired.
-When `major-mode' is listed in `page-break-lines-modes', then
-`page-break-lines-mode' will be enabled.
-
-\(fn)" nil nil)
-
-(defvar global-page-break-lines-mode nil "\
-Non-nil if Global Page-Break-Lines mode is enabled.
-See the `global-page-break-lines-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `global-page-break-lines-mode'.")
-
-(custom-autoload 'global-page-break-lines-mode "page-break-lines" nil)
-
-(autoload 'global-page-break-lines-mode "page-break-lines" "\
-Toggle Page-Break-Lines mode in all buffers.
-With prefix ARG, enable Global Page-Break-Lines mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Page-Break-Lines mode is enabled in all buffers where
-`page-break-lines-mode-maybe' would do it.
-See `page-break-lines-mode' for more information on Page-Break-Lines mode.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "page-break-lines" '("page-break-lines-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; page-break-lines-autoloads.el ends here
diff --git a/elpa/page-break-lines-20200305.244/page-break-lines-pkg.el b/elpa/page-break-lines-20200305.244/page-break-lines-pkg.el
deleted file mode 100644
index a9a9df0..0000000
--- a/elpa/page-break-lines-20200305.244/page-break-lines-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "page-break-lines" "20200305.244" "Display ^L page breaks as tidy horizontal lines" '((emacs "24.4")) :commit "314b397910b3d16bb7cbcc25098696348e678080" :keywords '("convenience" "faces") :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :url "https://github.com/purcell/page-break-lines")
diff --git a/elpa/page-break-lines-20200305.244/page-break-lines.el b/elpa/page-break-lines-20200305.244/page-break-lines.el
deleted file mode 100644
index 8780a17..0000000
--- a/elpa/page-break-lines-20200305.244/page-break-lines.el
+++ /dev/null
@@ -1,182 +0,0 @@
-;;; page-break-lines.el --- Display ^L page breaks as tidy horizontal lines -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2015 Steve Purcell
-
-;; Author: Steve Purcell <steve@sanityinc.com>
-;; URL: https://github.com/purcell/page-break-lines
-;; Package-Commit: 314b397910b3d16bb7cbcc25098696348e678080
-;; Package-Version: 20200305.244
-;; Package-X-Original-Version: 0
-;; Package-Requires: ((emacs "24.4"))
-;; Keywords: convenience, faces
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This library provides a global mode which displays form feed
-;; characters as horizontal rules.
-
-;; Install from Melpa or Marmalade, or add to `load-path' and use
-;; (require 'page-break-lines).
-
-;; Use `page-break-lines-mode' to enable the mode in specific buffers,
-;; or customize `page-break-lines-modes' and enable the mode globally with
-;; `global-page-break-lines-mode'.
-
-;; Issues and limitations:
-
-;; If `page-break-lines-char' is displayed at a different width to
-;; regular characters, the rule may be either too short or too long:
-;; rules may then wrap if `truncate-lines' is nil. On some systems,
-;; Emacs may erroneously choose a different font for the page break
-;; symbol, which choice can be overridden using code such as:
-
-;; (set-fontset-font "fontset-default"
-;; (cons page-break-lines-char page-break-lines-char)
-;; (face-attribute 'default :family))
-
-;; Use `describe-char' on a page break char to determine whether this
-;; is the case.
-
-;; Additionally, the use of `text-scale-increase' or
-;; `text-scale-decrease' will cause the rule width to be incorrect,
-;; because the reported window width (in characters) will continue to
-;; be the width in the frame's default font, not the scaled font used to
-;; display the rule.
-
-;; Adapted from code http://www.emacswiki.org/emacs/PageBreaks
-
-;;; Code:
-
-(defgroup page-break-lines nil
- "Display ugly ^L page breaks as tidy horizontal lines."
- :prefix "page-break-lines-"
- :group 'faces)
-
-(defcustom page-break-lines-char ?─
- "Character used to render page break lines."
- :type 'character
- :group 'page-break-lines)
-
-(defcustom page-break-lines-lighter " PgLn"
- "Mode-line indicator for `page-break-lines-mode'."
- :type '(choice (const :tag "No lighter" "") string)
- :group 'page-break-lines)
-
-(defcustom page-break-lines-max-width nil
- "If non-nil, maximum width (in characters) of page break indicator.
-If nil, indicator will span the width of the frame."
- :type '(choice integer (const :tag "Full width" nil))
- :group 'page-break-lines)
-
-(defcustom page-break-lines-modes
- '(emacs-lisp-mode lisp-mode scheme-mode compilation-mode outline-mode help-mode)
- "Modes in which to enable `page-break-lines-mode'."
- :type '(repeat symbol)
- :group 'page-break-lines)
-
-(defface page-break-lines
- '((t :inherit font-lock-comment-face :bold nil :italic nil))
- "Face used to colorize page break lines.
-If using :bold or :italic, please ensure `page-break-lines-char'
-is available in that variant of your font, otherwise it may be
-displayed as a junk character."
- :group 'page-break-lines)
-
-
-
-;;;###autoload
-(define-minor-mode page-break-lines-mode
- "Toggle Page Break Lines mode.
-
-In Page Break mode, page breaks (^L characters) are displayed as a
-horizontal line of `page-break-lines-char' characters."
- :lighter page-break-lines-lighter
- :group 'page-break-lines
- (page-break-lines--update-display-tables))
-
-;;;###autoload
-(define-obsolete-function-alias 'turn-on-page-break-lines-mode 'page-break-lines-mode)
-
-(dolist (hook '(window-configuration-change-hook
- window-size-change-functions
- after-setting-font-hook
- display-line-numbers-mode-hook))
- (add-hook hook 'page-break-lines--update-display-tables))
-
-
-
-(defun page-break-lines--update-display-table (window)
- "Modify a display-table that displays page-breaks prettily.
-If the buffer inside WINDOW has `page-break-lines-mode' enabled,
-its display table will be modified as necessary."
- (with-current-buffer (window-buffer window)
- (with-selected-window window
- (if page-break-lines-mode
- (progn
- (unless buffer-display-table
- (setq buffer-display-table (make-display-table)))
- (let ((default-height (face-attribute 'default :height nil 'default)))
- (set-face-attribute 'page-break-lines nil :height default-height)
- (let* ((cwidth (char-width page-break-lines-char))
- (wwidth-pix (- (window-width nil t)
- (if (and (bound-and-true-p display-line-numbers)
- (fboundp 'line-number-display-width))
- (line-number-display-width t)
- 0)))
- (width (- (/ wwidth-pix (frame-char-width) cwidth)
- (if (display-graphic-p) 0 1)))
- (width (if page-break-lines-max-width
- (min width page-break-lines-max-width)
- width))
- (glyph (make-glyph-code page-break-lines-char 'page-break-lines))
- (new-display-entry (vconcat (make-list width glyph))))
- (unless (equal new-display-entry (elt buffer-display-table ?\^L))
- (aset buffer-display-table ?\^L new-display-entry)))))
- (when (and (apply 'derived-mode-p page-break-lines-modes)
- buffer-display-table)
- (aset buffer-display-table ?\^L nil))))))
-
-(defun page-break-lines--update-display-tables (&optional frame)
- "Function called for updating display table in windows of FRAME."
- (unless (minibufferp)
- (mapc 'page-break-lines--update-display-table (window-list frame 'no-minibuffer))))
-
-
-
-;;;###autoload
-(defun page-break-lines-mode-maybe ()
- "Enable `page-break-lines-mode' in the current buffer if desired.
-When `major-mode' is listed in `page-break-lines-modes', then
-`page-break-lines-mode' will be enabled."
- (if (and (not (minibufferp))
- (apply 'derived-mode-p page-break-lines-modes))
- (page-break-lines-mode 1)))
-
-;;;###autoload
-(define-global-minor-mode global-page-break-lines-mode
- page-break-lines-mode page-break-lines-mode-maybe
- :require 'page-break-lines
- :group 'page-break-lines)
-
-
-(provide 'page-break-lines)
-
-;; Local Variables:
-;; coding: utf-8
-;; checkdoc-minor-mode: t
-;; End:
-
-;;; page-break-lines.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/README b/elpa/pdf-tools-20200512.1524/README
deleted file mode 100644
index 6738261..0000000
--- a/elpa/pdf-tools-20200512.1524/README
+++ /dev/null
@@ -1,381 +0,0 @@
-#+TITLE: PDF Tools README
-#+AUTHOR: Andreas Politz
-#+EMAIL: politza@fh-trier.de
-
-[[https://travis-ci.org/politza/pdf-tools.svg?branch%3Dmaster][https://travis-ci.org/politza/pdf-tools.svg?branch=master]]
-[[http://stable.melpa.org/#/pdf-tools][http://stable.melpa.org/packages/pdf-tools-badge.svg]]
-[[http://melpa.org/#/pdf-tools][http://melpa.org/packages/pdf-tools-badge.svg]]
-
-
-
-** About this package
- PDF Tools is, among other things, a replacement of DocView for PDF
- files. The key difference is that pages are not pre-rendered by
- e.g. ghostscript and stored in the file-system, but rather created
- on-demand and stored in memory.
-
- This rendering is performed by a special library named, for
- whatever reason, poppler, running inside a server program. This
- program is called ~epdfinfo~ and its job is to successively
- read requests from Emacs and produce the proper results, i.e. the
- PNG image of a PDF page.
-
- Actually, displaying PDF files is just one part of PDF Tools.
- Since poppler can provide us with all kinds of information about a
- document and is also able to modify it, there is a lot more we can
- do with it. [[http://www.dailymotion.com/video/x2bc1is_pdf-tools-tourdeforce_tech?forcedQuality%3Dhd720][Watch]]
-
- Please read also about [[#known-problems][known problems.]]
-
-** Features
- + View :: View PDF documents in a buffer with DocView-like
- bindings.
- + Isearch :: Interactively search PDF documents like any other
- buffer, either for a string or a PCRE.
- + Occur :: List lines matching a string or regexp in one or more
- PDF documents.
- + Follow ::
- Click on highlighted links, moving to some part of a different
- page, some external file, a website or any other URI. Links may
- also be followed by keyboard commands.
- + Annotations :: Display and list text and markup annotations (like
- underline), edit their contents and attributes
- (e.g. color), move them around, delete them or
- create new ones and then save the modifications
- back to the PDF file.
- + Attachments :: Save files attached to the PDF-file or list them
- in a dired buffer.
- + Outline :: Use imenu or a special buffer to examine and navigate
- the PDF's outline.
- + SyncTeX :: Jump from a position on a page directly to the TeX
- source and vice versa.
- + Virtual ::
- Use a collection of documents as if it were one, big single PDF.
-
- + Misc ::
- - Display PDF's metadata.
- - Mark a region and kill the text from the PDF.
- - Keep track of visited pages via a history.
- - Apply a color filter for reading in low light conditions.
-
-** Installation
- The package may be installed via melpa and it will try to build the
- server part when it is activated the first time. Though the next
- section regarding build-prerequisites is still relevant, the rest
- of the installation instructions assume a build from within a git
- repository. (The melpa package has a different directory
- structure.)
-
-*** Server Prerequisites
- You'll need GNU Emacs \ge 24.3 and some form of a GNU/Linux OS.
- Other operating systems are currently not supported (patches
- welcome). The following instructions assume a Debian-based
- system. (The prerequisites may be installed automatically on this
- kind of systems, see [[#compilation][Compilation]] .)
-
- First make sure a suitable build-system is installed. We need at
- least a C/C++ compiler (both ~gcc~ and ~g++~), ~make~, ~automake~
- and ~autoconf~.
-
- Next we need to install a few libraries PDF Tools depends on, some
- of which are probably already on your system.
-#+begin_src sh
- $ sudo aptitude install libpng-dev zlib1g-dev
- $ sudo aptitude install libpoppler-glib-dev
- $ sudo aptitude install libpoppler-private-dev
-#+end_src
- On some older Ubuntu systems, the final command will possibly give
- an error. This should be no problem, since in some versions this
- package was contained in the main package ~libpoppler-dev~. Also
- note, that ~zlib1g-dev~ was for a long time called ~libz-dev~,
- which it still may be on your system.
-
- Debian wheezy comes with libpoppler version 0.18, which is pretty
- old. The minimally required version is 0.16, but some features of
- PDF Tools depend on a more recent version of this library. See
- the following table for what they are and what version they
- require.
-
- | You want to ... | Required version |
- |-------------------------------------------+------------------|
- | ... create and modify text annotations. | \ge 0.19.4 |
- | ... search case-sensitive. | \ge 0.22 |
- | ... create and modify markup annotations. | \ge 0.26 |
- |-------------------------------------------+------------------|
-
- In case you decide to install libpoppler from source, make sure
- to run its configure script with the ~--enable-xpdf-headers~
- option.
-
- Finally there is one feature (following links of a PDF document by
- plain keystrokes) which requires imagemagick's convert utility.
- This requirement is optional and you may install it like so:
-#+begin_src sh
- $ sudo aptitude install imagemagick
-#+end_src
-**** Compiling on OS X
- Although OS X is not officially supported, it has been reported
- to have been successfully compiled. You will need to install
- poppler which you can get with homebrew via
-#+BEGIN_SRC sh
- $ brew install poppler automake
-#+END_SRC
-
- You will also have to help ~pkg-config~ find some libraries by
- setting ~PKG_CONFIG_PATH~, e.g.
-#+BEGIN_SRC sh
- $ export PKG_CONFIG_PATH=/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig
-#+END_SRC
- or likewise within Emacs using `setenv`.
-
- After that, compilation should proceed as normal.
-**** FreeBSD
- Although not officially supported, it has been reported that
- pdf-tools work well on FreeBSD. Instead of building pdf-tools, you
- can install one of the OS packages with, e.g.
-#+BEGIN_SRC sh
- $ pkg install pdf-tools-emacs26
-#+END_SRC
- To see the current list of pdf-tools packages for FreeBSD visit
- [[https://repology.org/metapackages/?search=pdf-tools&inrepo=freebsd][the Repology list]].
-
- To build pdf-tools from either melpa or directly from the source
- repository, install the dependencies with
-#+BEGIN_SRC sh
- $ pkg install autotools gmake poppler-glib
-#+END_SRC
-
- If you choose not to install from melpa, you must substitute
- ~gmake~ for ~make~ in the instructions below.
-**** Compiling on Centos
- It is possible to compile pdf-tools on Centos. Install poppler the dependencies with:
-#+BEGIN_SRC sh
- $ yum install poppler-devel poppler-glib-devel
-#+END_SRC
-
-**** Compiling on Fedora
-#+BEGIN_SRC sh
- $ sudo dnf install make automake autoconf gcc gcc-c++ ImageMagick libpng-devel zlib-devel poppler-glib-devel
-#+END_SRC
-
-**** Compiling on Alpine Linux
-#+BEGIN_SRC sh
- $ apk add build-base g++ gcc automake autoconf libpng-dev glib-dev poppler-dev
-#+END_SRC
-
-**** Compiling on Windows
- PDF Tools can be built and used on Windows using the MSYS2
- compiler. This will work with native (not cygwin) Windows builds of
- emacs. This includes the standard binaries provided by the GNU
- project, those available as MSYS2 packages and numerous third-party
- binaries. It has been tested with emacs 25.1. Instructions are
- provided under [[#compilation-and-installation-on-windows][Compilation and installation on Windows]], below.
- PDF Tools will successfully compile using Cygwin, but it will not be
- able to open PDFs properly due to the way binaries compiled with Cygwin
- handle file paths.
-
-*** Compilation
- :PROPERTIES:
- :CUSTOM_ID: compilation
- :END:
- Now it's time to compile the source.
-#+begin_src sh
- $ cd /path/to/pdf-tools
- $ make install-server-deps # optional
- $ make -s
-#+end_src
- The ~make install-server-deps~ command will try to install all
- necessary programs and libraries to build the package, though
- it'll only work, if ~sudo~ and ~apt-get~ are available.
-
- This should compile the source code and create a Emacs Lisp
- Package in the root directory of the project. The configure script
- also tells you at the very end, which features, depending on the
- libpoppler version, will be available. These commands should give
- no error, otherwise you are in trouble.
-**** Compilation and installation on Windows
- If using the GNU binaries for Windows, support for PNG and zlib
- must first be installed by copying the appropriate dlls into
- emacs' ~bin/~ directory. Most third-party binaries come with this
- already done.
-
- First, install [[http://www.msys2.org/][install MSYS2]] and update
- the package database and core packages using the instructions
- provided. Then, to compile PDF tools itself:
-
- 1. Open msys2 shell
-
- 2. Update and install dependencies, skipping any you already have
- #+BEGIN_SRC sh
- $ pacman -Syu
- $ pacman -S base-devel
- $ pacman -S mingw-w64-x86_64-toolchain
- $ pacman -S mingw-w64-x86_64-zlib
- $ pacman -S mingw-w64-x86_64-libpng
- $ pacman -S mingw-w64-x86_64-poppler
- $ pacman -S mingw-w64-x86_64-imagemagick
- #+END_SRC
-
- 3. Install PDF tools in Emacs, but do not try to compile the
- server. Instead, get a separate copy of the source somewhere
- else.
- #+BEGIN_SRC sh
- $ git clone https://github.com/politza/pdf-tools
- #+END_SRC
-
- 4. Open mingw64 shell (*Note:* You must use mingw64.exe and not msys2.exe)
-
- 5. Compile pdf-tools
- #+BEGIN_SRC sh
- $ cd /path/to/pdf-tools
- $ make -s
- #+END_SRC
-
- 6. This should produce a file ~server/epdfinfo.exe~. Copy this file
- into the ~pdf-tools/~ installation directory in your Emacs.
-
- 7. Start Emacs and activate the package.
- #+BEGIN_SRC
- M-x pdf-tools-install RET
- #+END_SRC
-
- 8. Test.
- #+BEGIN_SRC
- M-x pdf-info-check-epdfinfo RET
- #+END_SRC
-
- If this is successful, ~(pdf-tools-install)~ can be added to Emacs'
- config. Note that libraries from other GNU utilities, such as Git
- for Windows, may interfere with those needed by PDF Tools.
- ~pdf-info-check-epdinfo~ will succeed, but errors occur when trying
- to view a PDF file. This can be fixed by ensuring that the MSYS
- libraries are always preferred in emacs:
-
- #+BEGIN_SRC emacs-lisp
- (setenv "PATH" (concat "C:\\msys64\\mingw64\\bin;" (getenv "PATH")))
- #+END_SRC
-
-*** ELisp Prerequisites
- This package depends on the following Elisp packages, which should
- be installed before installing the Pdf Tools package.
-
- | Package | Required version |
- |-----------+----------------------------------|
- | [[https://elpa.gnu.org/packages/let-alist.html][let-alist]] | >= 1.0.4 (comes with Emacs 25.2) |
- | [[http://melpa.org/#/tablist][tablist]] | >= 0.70 |
- |-----------+----------------------------------|
-
-*** Installing
- If ~make~ produced the ELP file ~pdf-tools-${VERSION}.tar~ you are
- fine. This package contains all the necessary files for Emacs
- and may be installed by either using
-#+begin_src sh
- $ make install-package
-#+end_src
- or executing the Emacs command
-#+begin_src elisp
- M-x package-install-file RET pdf-tools-${VERSION}.tar RET
-#+end_src
-
- To complete the installation process, you need to activate the
- package by putting
-#+begin_src elisp
- (pdf-tools-install)
-#+end_src
- somewhere in your ~.emacs~. Alternatively, and if you care about
- start-up time, you may want to use
-#+begin_src elisp
- (pdf-loader-install)
-#+end_src
- instead. Next you probably want to take a look at the various
- features of what you've just installed. The following two commands
- might be of help for doing so.
-#+begin_src elisp
- M-x pdf-tools-help RET
- M-x pdf-tools-customize RET
-#+end_src
-
-*** Updating
- Some day you might want to update this package via ~git pull~ and
- then reinstall it. Sometimes this may fail, especially if
- Lisp-Macros are involved and the version hasn't changed. To avoid
- this kind of problems, you should delete the old package via
- ~list-packages~, restart Emacs and then reinstall the package.
-
- This also applies when updating via package and melpa.
-
-** Known problems
- :PROPERTIES:
- :CUSTOM_ID: known-problems
- :END:
-
-*** linum-mode
- PDF Tools does not work well together with ~linum-mode~ and
- activating it in a ~pdf-view-mode~, e.g. via ~global-linum-mode~,
- might make Emacs choke.
-
-*** auto-revert
- Autorevert works by polling the file-system every
- ~auto-revert-interval~ seconds, optionally combined with some
- event-based reverting via [[https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Notifications.html][file notification]]. But this currently
- does not work reliably, such that Emacs may revert the PDF-buffer
- while the corresponding file is still being written to (e.g. by
- LaTeX), leading to a potential error.
-
- With a recent [[https://www.gnu.org/software/auctex/][auctex]] installation, you might want to put the
- following somewhere in your dotemacs, which will revert the PDF-buffer
- *after* the TeX compilation has finished.
-#+BEGIN_SRC emacs-lisp
- (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
-#+END_SRC
-** Some keybindings
-
-| Navigation | |
-|--------------------------------------------+-----------------------|
-| Scroll Up / Down by page-full | ~space~ / ~backspace~ |
-| Scroll Up / Down by line | ~C-n~ / ~C-p~ |
-| Scroll Right / Left | ~C-f~ / ~C-b~ |
-| Top of Page / Bottom of Page | ~<~ / ~>~ |
-| Next Page / Previous Page | ~n~ / ~p~ |
-| First Page / Last Page | ~M-<~ / ~M->~ |
-| Incremental Search Forward / Backward | ~C-s~ / ~C-r~ |
-| Occur (list all lines containing a phrase) | ~M-s o~ |
-| Jump to Occur Line | ~RETURN~ |
-| Pick a Link and Jump | ~F~ |
-| Incremental Search in Links | ~f~ |
-| History Back / Forwards | ~B~ / ~N~ |
-| Display Outline | ~o~ |
-| Jump to Section from Outline | ~RETURN~ |
-| Jump to Page | ~M-g g~ |
-
-| Display | |
-|------------------------------------------+-----------------|
-| Zoom in / Zoom out | ~+~ / ~-~ |
-| Fit Height / Fit Width / Fit Page | ~H~ / ~W~ / ~P~ |
-| Trim margins (set slice to bounding box) | ~s b~ |
-| Reset margins | ~s r~ |
-| Reset Zoom | 0 |
-
-| Annotations | |
-|-------------------------------+-------------------------------------------------|
-| List Annotations | ~C-c C-a l~ |
-| Jump to Annotations from List | ~SPACE~ |
-| Mark Annotation for Deletion | ~d~ |
-| Delete Marked Annotations | ~x~ |
-| Unmark Annotations | ~u~ |
-| Close Annotation List | ~q~ |
-| Add and edit annotations | via Mouse selection and left-click context menu |
-
-| Syncing with Auctex | |
-|----------------------------------+-------------|
-| jump to PDF location from source | ~C-c C-g~ |
-| jump source location from PDF | ~C-mouse-1~ |
-
-| Miscellaneous | |
-|-----------------------------------------------+-----------|
-| Refresh File (e.g., after recompiling source) | ~g~ |
-| Print File | ~C-c C-p~ |
-
-# Local Variables:
-# mode: org
-# End:
diff --git a/elpa/pdf-tools-20200512.1524/epdfinfo b/elpa/pdf-tools-20200512.1524/epdfinfo
deleted file mode 100755
index faff532..0000000
--- a/elpa/pdf-tools-20200512.1524/epdfinfo
+++ /dev/null
Binary files differ
diff --git a/elpa/pdf-tools-20200512.1524/pdf-annot.el b/elpa/pdf-tools-20200512.1524/pdf-annot.el
deleted file mode 100644
index efde0ec..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-annot.el
+++ /dev/null
@@ -1,1790 +0,0 @@
-;;; pdf-annot.el --- Annotation support for PDF files. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords:
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-
-
-(require 'pdf-view)
-(require 'pdf-info)
-(require 'pdf-cache)
-(require 'pdf-misc)
-(require 'facemenu) ;; list-colors-duplicates
-(require 'faces) ;; color-values
-(require 'org) ;; org-create-formula-image
-(require 'tablist)
-(require 'cl-lib)
-
-
-;; * ================================================================== *
-;; * Customizations
-;; * ================================================================== *
-
-(defgroup pdf-annot nil
- "Annotation support for PDF documents."
- :group 'pdf-tools)
-
-(defcustom pdf-annot-activate-handler-functions nil
- "A list of functions to activate a annotation.
-
-The functions on this hook will be called when some annotation is
-activated, usually by a mouse-click. Each one is called with the
-annotation as a single argument and it should return a non-nil
-value if it has `handled' it. If no such function exists, the
-default handler `pdf-annot-default-handler' will be
-called.
-
-This hook is meant to allow for custom annotations. FIXME:
-Implement and describe basic org example."
- :group 'pdf-annot
- :type 'hook)
-
-(defcustom pdf-annot-default-text-annotation-properties nil
- "Alist of initial properties for new text annotations."
- :group 'pdf-annot
- :type '(alist :key-type symbol :value-type sexp))
-
-(defcustom pdf-annot-default-markup-annotation-properties nil
- "Alist of initial properties for new markup annotations."
- :group 'pdf-annot
- :type '(alist :key-type symbol :value-type sexp))
-
-(make-obsolete-variable 'pdf-annot-default-text-annotation-properties
- 'pdf-annot-default-annotation-properties
- "0.90")
-
-(make-obsolete-variable 'pdf-annot-default-markup-annotation-properties
- 'pdf-annot-default-annotation-properties
- "0.90")
-
-(defcustom pdf-annot-default-annotation-properties
- `((t (label . ,user-full-name))
- (text (icon . "Note")
- (color . "#ff0000"))
- (highlight (color . "yellow"))
- (squiggly (color . "orange"))
- (strike-out(color . "red"))
- (underline (color . "blue")))
- "An alist of initial properties for new annotations.
-
-The alist contains a sub-alist for each of the currently available
-annotation types, i.e. text, highlight, squiggly, strike-out and
-underline. Additionally a sub-alist with a key of t acts as a default
-entry.
-
-Each of these sub-alists contain default property-values of newly
-added annotations of its respective type.
-
-Some of the most important properties and their types are label
-\(a string\), contents \(a string\), color \(a color\) and, for
-text-annotations only, icon \(one of the standard icon-types, see
-`pdf-annot-standard-text-icons'\).
-
-For example a value of
-
- \(\(t \(color . \"red\"\)
- \(label . \"Joe\"\)
- \(highlight \(color . \"green\"\)\)
-
-would use a green color for highlight and a red one for other
-annotations. Additionally the label for all annotations is set
-to \"Joe\"."
-
- :group 'pdf-annot
- :type (let* ((label '(cons :tag "Label" (const label) string))
- (contents '(cons :tag "Contents" (const contents) string))
- (color '(cons :tag "Color" (const color) color))
- (icon `(cons :tag "Icon"
- (const icon)
- (choice
- ,@(mapcar (lambda (icon)
- `(const ,icon))
- '("Note" "Comment" "Key" "Help" "NewParagraph"
- "Paragraph" "Insert" "Cross" "Circle")))))
- (other '(repeat
- :tag "Other properties"
- (cons :tag "Property"
- (symbol :tag "Key ")
- (sexp :tag "Value"))))
- (text-properties
- `(set ,label ,contents ,color ,icon ,other))
- (markup-properties
- `(set ,label ,contents ,color))
- (all-properties
- `(set ,label ,contents ,color ,icon ,other)))
- `(set
- (cons :tag "All Annotations" (const t) ,all-properties)
- (cons :tag "Text Annotations" (const text) ,text-properties)
- (cons :tag "Highlight Annotations" (const highlight) ,markup-properties)
- (cons :tag "Underline Annotations" (const underline) ,markup-properties)
- (cons :tag "Squiggly Annotations" (const squiggly) ,markup-properties)
- (cons :tag "Strike-out Annotations" (const strike-out) ,markup-properties))))
-
-(defcustom pdf-annot-print-annotation-functions
- '(pdf-annot-print-annotation-latex-maybe)
- "A alist of functions for printing annotations, e.g. for the tooltip.
-
-The functions receive the annotation as single argument and
-should return either a string or nil. The first string returned
-will be used.
-
-If all of them return nil, the default function
-`pdf-annot-print-annotation-default' is used."
- :group 'pdf-annot
- :type 'hook)
-
-(defcustom pdf-annot-latex-string-predicate
- (lambda (str)
- (and str (string-match "\\`[[:space:]\n]*[$\\]" str)))
- "A predicate for recognizing LaTeX fragments.
-
-It receives a string and should return non-nil, if string is a
-LaTeX fragment."
- :group 'pdf-annot
- :type 'function)
-
-(defcustom pdf-annot-latex-header
- (concat org-format-latex-header
- "\n\\setlength{\\textwidth}{12cm}")
- "Header used when latex compiling annotations.
-
-The default value is `org-format-latex-header' + \
-\"\\n\\\\setlength{\\\\textwidth}{12cm}\"."
- :group 'pdf-annot
- :type 'string)
-
-(defcustom pdf-annot-tweak-tooltips t
- "Whether this package should tweak some settings regarding tooltips.
-
-If this variable has a non-nil value,
-
-`x-gtk-use-system-tooltips' is set to nil if appropriate, in
-order to display text properties;
-
-`tooltip-hide-delay' is set to infinity, in order to not being
-annoyed while reading the annotations."
- :group 'pdf-annot
- :type 'boolean)
-
-(defcustom pdf-annot-activate-created-annotations nil
- "Whether to activate (i.e. edit) created annotations."
- :group 'pdf-annot
- :type 'boolean)
-
-(defcustom pdf-annot-attachment-display-buffer-action nil
- "The display action used when displaying attachments."
- :group 'pdf-annot
- :type display-buffer--action-custom-type)
-
-(defconst pdf-annot-annotation-types
- '(3d caret circle file
- free-text highlight ink line link movie poly-line polygon popup
- printer-mark screen sound square squiggly stamp strike-out text
- trap-net underline unknown watermark widget)
- "Complete list of annotation types.")
-
-(defcustom pdf-annot-list-listed-types
- (if (pdf-info-markup-annotations-p)
- (list 'text 'file 'squiggly 'highlight 'underline 'strike-out)
- (list 'text 'file))
- "A list of annotation types displayed in the list buffer."
- :group 'pdf-annot
- :type `(set ,@(mapcar (lambda (type)
- (list 'const type))
- pdf-annot-annotation-types)))
-
-
-;; * ================================================================== *
-;; * Variables and Macros
-;; * ================================================================== *
-
-(defvar pdf-annot-color-history nil
- "A list of recently used colors for annotations.")
-
-(defvar-local pdf-annot-modified-functions nil
- "Functions to call, when an annotation was modified.
-
-A function on this hook should accept one argument: A CLOSURE
-containing inserted, changed and deleted annotations.
-
-It may access theses annotations by calling CLOSURE with one of
-these arguments:
-
-`:inserted' The list of recently added annotations.
-
-`:deleted' The list of recently deleted annotations.
-
-`:changed' The list of recently changed annotations.
-
-`t' The union of recently added, deleted or changed annotations.
-
-`nil' Just returns nil.
-
-Any other argument signals an error.")
-
-(defconst pdf-annot-text-annotation-size '(24 . 24)
- "The Size of text and file annotations in PDF points.
-
-These values are hard-coded in poppler. And while the size of
-these annotations may be changed, i.e. the edges property, it has
-no effect on the rendering.")
-
-(defconst pdf-annot-markup-annotation-types
- '(text link free-text line square
- circle polygon poly-line highlight underline squiggly
- strike-out stamp caret ink file sound)
- "List of defined markup annotation types.")
-
-(defconst pdf-annot-standard-text-icons
- '("Note" "Comment" "Key" "Help" "NewParagraph"
- "Paragraph" "Insert" "Cross" "Circle")
- "A list of standard icon properties for text annotations.")
-
-(defvar pdf-annot-inhibit-modification-hooks nil
- "Non-nil, if running `pdf-annot-modified-functions' should be
- inhibited after some annotation has changed.")
-
-(defvar-local pdf-annot-delayed-modified-annotations nil
- "A plist of not yet propagated modifications.
-
-It contains three entries :change, :delete and :insert. Each one
-having a list of annotations as value.")
-
-(defvar-local pdf-annot--attachment-file-alist nil
- "Alist mapping attachment ids to unique relative filenames.")
-
-(defmacro pdf-annot-with-atomic-modifications (&rest body)
- "Execute BODY joining multiple modifications.
-
-The effect is, that `pdf-annot-modified-functions' will be called
-only once at the end of BODY.
-
-BODY should not modify annotations in a different then the
-current buffer, because that won't run the hooks properly."
- (declare (indent 0) (debug t))
- `(unwind-protect
- (save-current-buffer
- (let ((pdf-annot-inhibit-modification-hooks t))
- (progn ,@body)))
- (pdf-annot-run-modified-hooks)))
-
-
-;; * ================================================================== *
-;; * Minor mode
-;; * ================================================================== *
-
-(defcustom pdf-annot-minor-mode-map-prefix (kbd "C-c C-a")
- "The prefix to use for `pdf-annot-minor-mode-map'.
-
-Setting this after the package was loaded has no effect."
- :group 'pdf-annot
- :type 'key-sequence)
-
-(defvar pdf-annot-minor-mode-map
- (let ((kmap (make-sparse-keymap))
- (smap (make-sparse-keymap)))
- (define-key kmap pdf-annot-minor-mode-map-prefix smap)
- (define-key smap "l" 'pdf-annot-list-annotations)
- ;; (define-key smap "d" 'pdf-annot-toggle-display-annotations)
- (define-key smap "a" 'pdf-annot-attachment-dired)
- (when (pdf-info-writable-annotations-p)
- (define-key smap "D" 'pdf-annot-delete)
- (define-key smap "t" 'pdf-annot-add-text-annotation)
- (when (pdf-info-markup-annotations-p)
- (define-key smap "m" 'pdf-annot-add-markup-annotation)
- (define-key smap "s" 'pdf-annot-add-squiggly-markup-annotation)
- (define-key smap "u" 'pdf-annot-add-underline-markup-annotation)
- (define-key smap "o" 'pdf-annot-add-strikeout-markup-annotation)
- (define-key smap "h" 'pdf-annot-add-highlight-markup-annotation)))
- kmap)
- "Keymap used for `pdf-annot-minor-mode'.")
-
-(defvar savehist-minibuffer-history-variables)
-
-;;;###autoload
-(define-minor-mode pdf-annot-minor-mode
- "Support for PDF Annotations.
-
-\\{pdf-annot-minor-mode-map}"
- nil nil nil
- (cond
- (pdf-annot-minor-mode
- (when pdf-annot-tweak-tooltips
- (when (boundp 'x-gtk-use-system-tooltips)
- (setq x-gtk-use-system-tooltips nil))
- (setq tooltip-hide-delay 3600))
- (pdf-view-add-hotspot-function 'pdf-annot-hotspot-function 9)
- (add-hook 'pdf-info-close-document-hook
- 'pdf-annot-attachment-delete-base-directory nil t)
- (when (featurep 'savehist)
- (add-to-list 'savehist-minibuffer-history-variables
- 'pdf-annot-color-history)))
- (t
- (pdf-view-remove-hotspot-function 'pdf-annot-hotspot-function)
- (remove-hook 'pdf-info-close-document-hook
- 'pdf-annot-attachment-delete-base-directory t)))
- (pdf-view-redisplay t))
-
-(defun pdf-annot-create-context-menu (a)
- "Create a appropriate context menu for annotation A."
- (let ((menu (make-sparse-keymap)))
- ;; (when (and (bound-and-true-p pdf-misc-menu-bar-minor-mode)
- ;; (bound-and-true-p pdf-misc-install-popup-menu))
- ;; (set-keymap-parent menu
- ;; (lookup-key pdf-misc-menu-bar-minor-mode-map
- ;; [menu-bar pdf-tools]))
- ;; (define-key menu [sep-99] menu-bar-separator))
- (when (pdf-info-writable-annotations-p)
- (define-key menu [delete-annotation]
- `(menu-item "Delete annotation"
- ,(lambda ()
- (interactive)
- (pdf-annot-delete a)
- (message "Annotation deleted"))
- :help
- "Delete this annotation.")))
- (define-key menu [goto-annotation]
- `(menu-item "List annotation"
- ,(lambda ()
- (interactive)
- (pdf-annot-show-annotation a t)
- (pdf-annot-list-annotations)
- (pdf-annot-list-goto-annotation a))
- :help "Find this annotation in the list buffer."))
- (when (pdf-annot-text-annotation-p a)
- (define-key menu [change-text-icon]
- `(menu-item "Change icon"
- ,(pdf-annot-create-icon-submenu a)
- :help "Change the appearance of this annotation.")))
- (define-key menu [change-color]
- `(menu-item "Change color"
- ,(pdf-annot-create-color-submenu a)
- :help "Change the appearance of this annotation."))
- (define-key menu [activate-annotation]
- `(menu-item "Activate"
- ,(lambda ()
- (interactive)
- (pdf-annot-activate-annotation a))
- :help "Activate this annotation."))
- menu))
-
-(defun pdf-annot-create-color-submenu (a)
- (let ((menu (make-sparse-keymap)))
- (define-key menu [color-chooser]
- `(menu-item "Choose ..."
- ,(lambda ()
- (interactive)
- (list-colors-display
- nil "*Choose annotation color*"
- ;; list-colors-print does not like closures.
- (let ((callback (make-symbol "xcallback")))
- (fset callback
- (lambda (color)
- (pdf-annot-put a 'color color)
- (setq pdf-annot-color-history
- (cons color
- (remove color pdf-annot-color-history)))
- (quit-window t)))
- (list 'function callback))))))
- (dolist (color (butlast (reverse pdf-annot-color-history)
- (max 0 (- (length pdf-annot-color-history)
- 12))))
- (define-key menu (vector (intern (format "color-%s" color)))
- `(menu-item ,color
- ,(lambda nil
- (interactive)
- (pdf-annot-put a 'color color)))))
- menu))
-
-(defun pdf-annot-create-icon-submenu (a)
- (let ((menu (make-sparse-keymap)))
- (dolist (icon (reverse pdf-annot-standard-text-icons))
- (define-key menu (vector (intern (format "icon-%s" icon)))
- `(menu-item ,icon
- ,(lambda nil
- (interactive)
- (pdf-annot-put a 'icon icon)))))
- menu))
-
-;; * ================================================================== *
-;; * Annotation Basics
-;; * ================================================================== *
-
-(defun pdf-annot-create (alist &optional buffer)
- "Create a annotation from ALIST in BUFFER.
-
-ALIST should be a property list as returned by
-`pdf-cache-getannots'. BUFFER should be the buffer of the
-corresponding PDF document. It defaults to the current buffer."
-
- (cons `(buffer . ,(or buffer (current-buffer)))
- alist))
-
-(defun pdf-annot-getannots (&optional pages types buffer)
- "Return a list of annotations on PAGES of TYPES in BUFFER.
-
-See `pdf-info-normalize-pages' for valid values of PAGES. TYPES
-may be a symbol or list of symbols denoting annotation types.
-
-PAGES defaults to all pages, TYPES to all types and BUFFER to the
-current buffer."
-
- (pdf-util-assert-pdf-buffer buffer)
- (unless buffer
- (setq buffer (current-buffer)))
- (unless (listp types)
- (setq types (list types)))
- (with-current-buffer buffer
- (let (result)
- (dolist (a (pdf-info-getannots pages))
- (when (or (null types)
- (memq (pdf-annot-get a 'type) types))
- (push (pdf-annot-create a) result)))
- result)))
-
-(defun pdf-annot-getannot (id &optional buffer)
- (pdf-annot-create
- (pdf-info-getannot id buffer)
- buffer))
-
-(defun pdf-annot-get (a property &optional default)
- "Get annotation A's value of PROPERTY.
-
-Return DEFAULT, if value is nil."
- (or (cdr (assq property a)) default))
-
-(defun pdf-annot-put (a property value)
- "Set annotation A's PROPERTY to VALUE.
-
-Unless VALUE is `equal' to the current value, sets A's buffer's
-modified flag and runs the hook `pdf-annot-modified-functions'.
-
-Signals an error, if PROPERTY is not modifiable.
-
-Returns the modified annotation."
-
- (declare (indent 2))
- (unless (equal value (pdf-annot-get a property))
- (unless (pdf-annot-property-modifiable-p a property)
- (error "Property `%s' is read-only for this annotation"
- property))
- (with-current-buffer (pdf-annot-get-buffer a)
- (setq a (pdf-annot-create
- (pdf-info-editannot
- (pdf-annot-get-id a)
- `((,property . ,value)))))
- (set-buffer-modified-p t)
- (pdf-annot-run-modified-hooks :change a)))
- a)
-
-(defun pdf-annot-run-modified-hooks (&optional operation &rest annotations)
- "Run `pdf-annot-modified-functions' using OPERATION on ANNOTATIONS.
-
-OPERATION should be one of nil, :change, :insert or :delete. If
-nil, annotations should be empty.
-
-Redisplay modified pages.
-
-If `pdf-annot-inhibit-modification-hooks' in non-nil, this just
-saves ANNOTATIONS and does not call the hooks until later, when
-the variable is nil and this function is called again."
-
- (unless (memq operation '(nil :insert :change :delete))
- (error "Invalid operation: %s" operation))
- (when (and (null operation) annotations)
- (error "Missing operation argument"))
-
- (when operation
- (let ((list (plist-get pdf-annot-delayed-modified-annotations operation)))
- (dolist (a annotations)
- (cl-pushnew a list :test 'pdf-annot-equal))
- (setq pdf-annot-delayed-modified-annotations
- (plist-put pdf-annot-delayed-modified-annotations
- operation list))))
- (unless pdf-annot-inhibit-modification-hooks
- (let* ((changed (plist-get pdf-annot-delayed-modified-annotations :change))
- (inserted (mapcar (lambda (a)
- (or (car (cl-member a changed :test 'pdf-annot-equal))
- a))
- (plist-get pdf-annot-delayed-modified-annotations :insert)))
- (deleted (plist-get pdf-annot-delayed-modified-annotations :delete))
- (union (cl-union (cl-union changed inserted :test 'pdf-annot-equal)
- deleted :test 'pdf-annot-equal))
- (closure (lambda (arg)
- (cl-ecase arg
- (:inserted (copy-sequence inserted))
- (:changed (copy-sequence changed))
- (:deleted (copy-sequence deleted))
- (t (copy-sequence union))
- (nil nil))))
- (pages (mapcar (lambda (a) (pdf-annot-get a 'page)) union)))
- (when union
- (unwind-protect
- (run-hook-with-args
- 'pdf-annot-modified-functions closure)
- (setq pdf-annot-delayed-modified-annotations nil)
- (apply 'pdf-view-redisplay-pages pages))))))
-
-(defun pdf-annot-equal (a1 a2)
- "Return non-nil, if annotations A1 and A2 are equal.
-
-Two annotations are equal, if they belong to the same buffer and
-have identical id properties."
- (and (eq (pdf-annot-get-buffer a1)
- (pdf-annot-get-buffer a2))
- (eq (pdf-annot-get-id a1)
- (pdf-annot-get-id a2))))
-
-(defun pdf-annot-get-buffer (a)
- "Return annotation A's buffer."
- (pdf-annot-get a 'buffer))
-
-(defun pdf-annot-get-id (a)
- "Return id property of annotation A."
- (pdf-annot-get a 'id))
-
-(defun pdf-annot-get-type (a)
- "Return type property of annotation A."
- (pdf-annot-get a 'type))
-
-(defun pdf-annot-get-display-edges (a)
- "Return a list of EDGES used for display for annotation A.
-
-This returns a list of \(LEFT TOP RIGHT BOT\) demarking the
-rectangles of the page where A is rendered."
-
- (or (pdf-annot-get a 'markup-edges)
- (list (pdf-annot-get a 'edges))))
-
-(defun pdf-annot-delete (a)
- "Delete annotation A.
-
-Sets A's buffer's modified flag and runs the hook
-`pdf-annot-modified-functions'.
-
-This function always returns nil."
- (interactive
- (list (pdf-annot-read-annotation
- "Click on the annotation you wish to delete")))
- (with-current-buffer (pdf-annot-get-buffer a)
- (pdf-info-delannot
- (pdf-annot-get-id a))
- (set-buffer-modified-p t)
- (pdf-annot-run-modified-hooks :delete a))
- (when (called-interactively-p 'any)
- (message "Annotation deleted"))
- nil)
-
-(defun pdf-annot-text-annotation-p (a)
- (eq 'text (pdf-annot-get a 'type)))
-
-(defun pdf-annot-markup-annotation-p (a)
- (not (null
- (memq (pdf-annot-get a 'type)
- pdf-annot-markup-annotation-types))))
-
-(defun pdf-annot-property-modifiable-p (a property)
- (or (memq property '(edges color flags contents))
- (and (pdf-annot-markup-annotation-p a)
- (memq property '(label opacity popup popup-is-open)))
- (and (pdf-annot-text-annotation-p a)
- (memq property '(icon is-open)))))
-
-(defun pdf-annot-activate-annotation (a)
- (or (run-hook-with-args-until-success
- 'pdf-annot-activate-handler-functions
- a)
- (pdf-annot-default-activate-handler a)))
-
-(defun pdf-annot-default-activate-handler (a)
- (cond
- ((pdf-annot-has-attachment-p a)
- (pdf-annot-pop-to-attachment a))
- (t (pdf-annot-edit-contents a))))
-
-
-;; * ================================================================== *
-;; * Handling attachments
-;; * ================================================================== *
-
-(defun pdf-annot-has-attachment-p (a)
- "Return non-nil if annotation A's has data attached."
- (eq 'file (pdf-annot-get a 'type)))
-
-(defun pdf-annot-get-attachment (a &optional do-save)
- "Retrieve annotation A's attachment.
-
-The DO-SAVE argument is given to
-`pdf-info-getattachment-from-annot', which see."
- (unless (pdf-annot-has-attachment-p a)
- (error "Annotation has no data attached: %s" a))
- (pdf-info-getattachment-from-annot
- (pdf-annot-get-id a)
- do-save
- (pdf-annot-get-buffer a)))
-
-(defun pdf-annot-attachment-base-directory ()
- "Return the base directory for saving attachments."
- (let ((dir (pdf-util-expand-file-name "attachments")))
- (unless (file-exists-p dir)
- (make-directory dir))
- dir))
-
-(defun pdf-annot-attachment-delete-base-directory ()
- "Delete all saved attachment files of the current buffer."
- (setq pdf-annot--attachment-file-alist nil)
- (delete-directory (pdf-annot-attachment-base-directory) t))
-
-(defun pdf-annot-attachment-unique-filename (attachment)
- "Return a unique absolute filename for ATTACHMENT."
- (let* ((filename (or (cdr (assq 'filename attachment))
- "attachment"))
- (id (cdr (assq 'id attachment)))
- (unique
- (or (cdr (assoc id pdf-annot--attachment-file-alist))
- (let* ((sans-ext
- (expand-file-name
- (concat (file-name-as-directory ".")
- (file-name-sans-extension filename))
- (pdf-annot-attachment-base-directory)))
- (ext (file-name-extension filename))
- (newname (concat sans-ext "." ext))
- (i 0))
- (while (rassoc newname pdf-annot--attachment-file-alist)
- (setq newname (format "%s-%d.%s" sans-ext (cl-incf i) ext)))
- (push (cons id newname) pdf-annot--attachment-file-alist)
- newname)))
- (directory (file-name-directory unique)))
- (unless (file-exists-p directory)
- (make-directory directory t))
- unique))
-
-
-(defun pdf-annot-attachment-save (attachment &optional regenerate-p)
- "Save ATTACHMENT's data to a unique filename and return it's name.
-
-If REGENERATE-P is non-nil, copy attachment's file even if the
-copy already exists.
-
-Signal an error, if ATTACHMENT has no, or a non-existing, `file'
-property, i.e. it was retrieved with an unset do-save argument.
-See `pdf-info-getattachments'"
-
- (let ((datafile (cdr (assq 'file attachment))))
- (unless (and datafile
- (file-exists-p datafile))
- (error "Attachment's file property is invalid"))
- (let* ((filename
- (pdf-annot-attachment-unique-filename attachment)))
- (when (or regenerate-p
- (not (file-exists-p filename)))
- (copy-file datafile filename nil nil t t))
- filename)))
-
-(defun pdf-annot-find-attachment-noselect (a)
- "Find annotation A's attachment in a buffer, without selecting it.
-
-Signals an error, if A has no data attached."
- (let ((attachment (pdf-annot-get-attachment a t)))
- (unwind-protect
- (find-file-noselect
- (pdf-annot-attachment-save attachment))
- (let ((tmpfile (cdr (assq 'file attachment))))
- (when (and tmpfile
- (file-exists-p tmpfile))
- (delete-file tmpfile))))))
-
-(defun pdf-annot-attachment-dired (&optional regenerate-p)
- "List all attachments in a dired buffer.
-
-If REGENERATE-P is non-nil, create attachment's files even if
-they already exist. Interactively REGENERATE-P is non-nil if a
-prefix argument was given.
-
-Return the dired buffer."
- (interactive (list current-prefix-arg))
- (let ((attachments (pdf-info-getattachments t)))
- (unwind-protect
- (progn
- (dolist (a (pdf-annot-getannots nil 'file))
- (push (pdf-annot-get-attachment a t)
- attachments ))
- (dolist (att attachments)
- (pdf-annot-attachment-save att regenerate-p))
- (unless attachments
- (error "Document has no data attached"))
- (dired (pdf-annot-attachment-base-directory)))
- (dolist (att attachments)
- (let ((tmpfile (cdr (assq 'file att))))
- (when (and tmpfile (file-exists-p tmpfile))
- (delete-file tmpfile)))))))
-
-(defun pdf-annot-display-attachment (a &optional display-action select-window-p)
- "Display file annotation A's data in a buffer.
-
-DISPLAY-ACTION should be a valid `display-buffer' action. If
-nil, `pdf-annot-attachment-display-buffer-action' is used.
-
-Select the window, if SELECT-WINDOW-P is non-nil.
-
-Return the window attachment is displayed in."
-
- (interactive
- (list (pdf-annot-read-annotation
- "Select a file annotation by clicking on it")))
- (let* ((buffer (pdf-annot-find-attachment-noselect a))
- (window (display-buffer
- buffer (or display-action
- pdf-annot-attachment-display-buffer-action))))
- (when select-window-p
- (select-window window))
- window))
-
-(defun pdf-annot-pop-to-attachment (a)
- "Display annotation A's attachment in a window and select it."
- (interactive
- (list (pdf-annot-read-annotation
- "Select a file annotation by clicking on it")))
- (pdf-annot-display-attachment a nil t))
-
-
-;; * ================================================================== *
-;; * Interfacing with the display
-;; * ================================================================== *
-
-(defun pdf-annot-image-position (a &optional image-size)
- "Return the position of annotation A in image coordinates.
-
-IMAGE-SIZE should be a cons \(WIDTH . HEIGHT\) and defaults to
-the page-image of the selected window."
-
- (unless image-size
- (pdf-util-assert-pdf-window)
- (setq image-size (pdf-view-image-size)))
- (let ((e (pdf-util-scale
- (pdf-annot-get a 'edges)
- image-size)))
- (pdf-util-with-edges (e)
- `(,e-left . ,e-top))))
-
-(defun pdf-annot-image-set-position (a x y &optional image-size)
- "Set annotation A's position to X,Y in image coordinates.
-
-See `pdf-annot-image-position' for IMAGE-SIZE."
-
- (unless image-size
- (pdf-util-assert-pdf-window)
- (setq image-size (pdf-view-image-size)))
- (let* ((edges (pdf-annot-get a 'edges))
- (x (/ x (float (car image-size))))
- (y (/ y (float (cdr image-size)))))
- (pdf-util-with-edges (edges)
- (let* ((w edges-width)
- (h edges-height)
- (x (max 0 (min x (- 1 w))))
- (y (max 0 (min y (- 1 h)))))
- (pdf-annot-put a 'edges
- (list x y -1 -1))))))
-
-(defun pdf-annot-image-size (a &optional image-size)
- "Return the size of annotation A in image coordinates.
-
-Returns \(WIDTH . HEIGHT\).
-
-See `pdf-annot-image-position' for IMAGE-SIZE."
- (unless image-size
- (pdf-util-assert-pdf-window)
- (setq image-size (pdf-view-image-size)))
- (let ((edges (pdf-util-scale
- (pdf-annot-get a 'edges) image-size)))
- (pdf-util-with-edges (edges)
- (cons edges-width edges-height))))
-
-(defun pdf-annot-image-set-size (a &optional width height image-size)
- "Set annotation A's size in image to WIDTH and/or HEIGHT.
-
-See `pdf-annot-image-position' for IMAGE-SIZE."
- (unless image-size
- (pdf-util-assert-pdf-window)
- (setq image-size (pdf-view-image-size)))
- (let* ((edges (pdf-annot-get a 'edges))
- (w (and width
- (/ width (float (car image-size)))))
- (h (and height
- (/ height (float (cdr image-size))))))
- (pdf-util-with-edges (edges)
- (pdf-annot-put a 'edges
- (list edges-left
- edges-top
- (if w (+ edges-left w) edges-right)
- (if h (+ edges-top h) edges-bot))))))
-
-(defun pdf-annot-at-position (pos)
- "Return annotation at POS in the selected window.
-
-POS should be an absolute image position as a cons \(X . Y\).
-Alternatively POS may also be an event position, in which case
-`posn-window' and `posn-object-x-y' is used to find the image
-position.
-
-Return nil, if no annotation was found."
- (let (window)
- (when (posnp pos)
- (setq window (posn-window pos)
- pos (posn-object-x-y pos)))
- (save-selected-window
- (when window (select-window window))
- (let* ((annots (pdf-annot-getannots (pdf-view-current-page)))
- (size (pdf-view-image-size))
- (rx (/ (car pos) (float (car size))))
- (ry (/ (cdr pos) (float (cdr size))))
- (rpos (cons rx ry)))
- (or (cl-some (lambda (a)
- (and (cl-some
- (lambda (e)
- (pdf-util-edges-inside-p e rpos))
- (pdf-annot-get-display-edges a))
- a))
- annots)
- (error "No annotation at this position"))))))
-
-(defun pdf-annot-mouse-move (event &optional annot)
- "Start moving an annotation at EVENT's position.
-
-EVENT should be a mouse event originating the request and is used
-as a reference point.
-
-ANNOT is the annotation to operate on and defaults to the
-annotation at EVENT's start position.
-
-This function does not return until the operation is completed,
-i.e. a non mouse-movement event is read."
-
- (interactive "@e")
- (pdf-util-assert-pdf-window (posn-window (event-start event)))
- (select-window (posn-window (event-start event)))
- (let* ((mpos (posn-object-x-y (event-start event)))
- (a (or annot
- (pdf-annot-at-position mpos))))
- (unless a
- (error "No annotation at this position: %s" mpos))
- (let* ((apos (pdf-annot-image-position a))
- (offset (cons (- (car mpos) (car apos))
- (- (cdr mpos) (cdr apos))))
- (window (selected-window))
- make-pointer-invisible)
- (when (pdf-util-track-mouse-dragging (ev 0.1)
- (when (and (eq window (posn-window (event-start ev)))
- (eq 'image (car-safe (posn-object (event-start ev)))))
- (let ((pdf-view-inhibit-hotspots t)
- (pdf-annot-inhibit-modification-hooks t)
- (pdf-cache-image-inihibit t)
- (xy (posn-object-x-y (event-start ev))))
- (pdf-annot-image-set-position
- a (- (car xy) (car offset))
- (- (cdr xy) (cdr offset)))
- (pdf-view-redisplay))))
- (pdf-annot-run-modified-hooks)))
- nil))
-
-(defun pdf-annot-hotspot-function (page size)
- "Create image hotspots for page PAGE of size SIZE."
- (apply 'nconc (mapcar (lambda (a)
- (unless (eq (pdf-annot-get a 'type)
- 'link)
- (pdf-annot-create-hotspots a size)))
- (pdf-annot-getannots page))))
-
-(defun pdf-annot-create-hotspots (a size)
- "Return a list of image hotspots for annotation A."
- (let ((id (pdf-annot-get-id a))
- (edges (pdf-util-scale
- (pdf-annot-get-display-edges a)
- size 'round))
- (moveable-p (memq (pdf-annot-get a 'type)
- '(file text)))
- hotspots)
- (dolist (e edges)
- (pdf-util-with-edges (e)
- (push `((rect . ((,e-left . ,e-top) . (,e-right . ,e-bot)))
- ,id
- (pointer
- hand
- help-echo
- ,(pdf-annot-print-annotation a)))
- hotspots)))
- (pdf-annot-create-hotspot-binding id moveable-p a)
- hotspots))
-
-;; FIXME: Define a keymap as a template for this. Much cleaner.
-(defun pdf-annot-create-hotspot-binding (id moveable-p annotation)
- ;; Activating
- (local-set-key
- (vector id 'mouse-1)
- (lambda ()
- (interactive)
- (pdf-annot-activate-annotation annotation)))
- ;; Move
- (when moveable-p
- (local-set-key
- (vector id 'down-mouse-1)
- (lambda (ev)
- (interactive "@e")
- (pdf-annot-mouse-move ev annotation))))
- ;; Context Menu
- (local-set-key
- (vector id 'down-mouse-3)
- (lambda ()
- (interactive "@")
- (popup-menu (pdf-annot-create-context-menu annotation))))
- ;; Everything else
- (local-set-key
- (vector id t)
- 'pdf-util-image-map-mouse-event-proxy))
-
-(defun pdf-annot-show-annotation (a &optional highlight-p window)
- "Make annotation A visible.
-
-Turn to A's page in WINDOW, and scroll it if necessary.
-
-If HIGHLIGHT-P is non-nil, visually distinguish annotation A from
-other annotations."
-
- (save-selected-window
- (when window (select-window window))
- (pdf-util-assert-pdf-window)
- (let ((page (pdf-annot-get a 'page))
- (size (pdf-view-image-size)))
- (unless (= page (pdf-view-current-page))
- (pdf-view-goto-page page))
- (let ((edges (pdf-annot-get-display-edges a)))
- (when highlight-p
- (pdf-view-display-image
- (pdf-view-create-image
- (pdf-cache-renderpage-highlight
- page (car size)
- `("white" "steel blue" 0.35 ,@edges))
- :map (pdf-view-apply-hotspot-functions
- window page size))))
- (pdf-util-scroll-to-edges
- (pdf-util-scale-relative-to-pixel (car edges)))))))
-
-(defun pdf-annot-read-annotation (&optional prompt)
- "Let the user choose a annotation a mouse click using PROMPT."
- (pdf-annot-at-position
- (pdf-util-read-image-position
- (or prompt "Choose a annotation by clicking on it"))))
-
-
-;; * ================================================================== *
-;; * Creating annotations
-;; * ================================================================== *
-
-(defun pdf-annot-add-annotation (type edges &optional property-alist page)
- "Creates and adds a new annotation of type TYPE to the document.
-
-TYPE determines the kind of annotation to add and maybe one of
-`text', `squiggly', `underline', `strike-out' or `highlight'.
-
-EDGES determines where the annotation will appear on the page.
-If type is `text', this should be a single list of \(LEFT TOP
-RIGHT BOT\). Though, in this case only LEFT and TOP are used,
-since the size of text annotations is fixed. Otherwise EDGES may
-be a list of such elements. All values should be image relative
-coordinates, i.e. in the range \[0;1\].
-
-PROPERTY-ALIST is a list of annotation properties, which will be
-put on the created annotation.
-
-PAGE determines the page of the annotation. It defaults to the
-page currently displayed in the selected window.
-
-Signal an error, if PROPERTY-ALIST contains non-modifiable
-properties or PAGE is nil and the selected window does not
-display a PDF document or creating annotations of type TYPE is
-not supported.
-
-Set buffers modified flag and calls
-`pdf-annot-activate-annotation' if
-`pdf-annot-activate-created-annotations' is non-nil.
-
-Return the new annotation."
-
- (unless (memq type (pdf-info-creatable-annotation-types))
- (error "Unsupported annotation type: %s" type))
- (unless page
- (pdf-util-assert-pdf-window)
- (setq page (pdf-view-current-page)))
- (unless (consp (car-safe edges))
- (setq edges (list edges)))
- (when (and (eq type 'text)
- (> (length edges) 1))
- (error "Edges argument should be a single edge-list for text annotations"))
- (let* ((a (apply 'pdf-info-addannot
- page
- (if (eq type 'text)
- (car edges)
- (apply #'pdf-util-edges-union
- (apply #'append
- (mapcar
- (lambda (e)
- (pdf-info-getselection page e))
- edges))))
- type
- nil
- (if (not (eq type 'text)) edges)))
- (id (pdf-annot-get-id a)))
- (when property-alist
- (condition-case err
- (setq a (pdf-info-editannot id property-alist))
- (error
- (pdf-info-delannot id)
- (signal (car err) (cdr err)))))
- (setq a (pdf-annot-create a))
- (set-buffer-modified-p t)
- (pdf-annot-run-modified-hooks :insert a)
- (when pdf-annot-activate-created-annotations
- (pdf-annot-activate-annotation a))
- a))
-
-(defun pdf-annot-add-text-annotation (pos &optional icon property-alist)
- "Add a new text annotation at POS in the selected window.
-
-POS should be a image position object or a cons \(X . Y\), both
-being image coordinates.
-
-ICON determines how the annotation is displayed and should be
-listed in `pdf-annot-standard-text-icons'. Any other value is ok
-as well, but will render the annotation invisible.
-
-Adjust X and Y accordingly, if the position would render the
-annotation off-page.
-
-Merge ICON as a icon property with PROPERTY-ALIST and
-`pdf-annot-default-text-annotation-properties' and apply the
-result to the created annotation.
-
-See also `pdf-annot-add-annotation'.
-
-Return the new annotation."
-
- (interactive
- (let* ((posn (pdf-util-read-image-position
- "Click where a new text annotation should be added ..."))
- (window (posn-window posn)))
- (select-window window)
- (list posn)))
- (pdf-util-assert-pdf-window)
- (when (posnp pos)
- (setq pos (posn-object-x-y pos)))
- (let ((isize (pdf-view-image-size))
- (x (car pos))
- (y (cdr pos)))
- (unless (and (>= x 0)
- (< x (car isize)))
- (signal 'args-out-of-range (list pos)))
- (unless (and (>= y 0)
- (< y (cdr isize)))
- (signal 'args-out-of-range (list pos)))
- (let ((size (pdf-util-scale-points-to-pixel
- pdf-annot-text-annotation-size 'round)))
- (setcar size (min (car size) (car isize)))
- (setcdr size (min (cdr size) (cdr isize)))
- (cl-decf x (max 0 (- (+ x (car size)) (car isize))))
- (cl-decf y (max 0 (- (+ y (cdr size)) (cdr isize))))
- (pdf-annot-add-annotation
- 'text (pdf-util-scale-pixel-to-relative
- (list x y -1 -1))
- (pdf-annot-merge-alists
- (and icon `((icon . ,icon)))
- property-alist
- pdf-annot-default-text-annotation-properties
- (cdr (assq 'text pdf-annot-default-annotation-properties))
- (cdr (assq t pdf-annot-default-annotation-properties))
- `((color . ,(car pdf-annot-color-history))))))))
-
-(defun pdf-annot-mouse-add-text-annotation (ev)
- (interactive "@e")
- (pdf-annot-add-text-annotation
- (if (eq (car-safe ev)
- 'menu-bar)
- (let (echo-keystrokes)
- (message nil)
- (pdf-util-read-image-position
- "Click where a new text annotation should be added ..."))
- (event-start ev))))
-
-(defun pdf-annot-add-markup-annotation (list-of-edges type &optional color
- property-alist)
- "Add a new markup annotation in the selected window.
-
-LIST-OF-EDGES determines the marked up area and should be a list
-of \(LEFT TOP RIGHT BOT\), each value a relative coordinate.
-
-TYPE should be one of `squiggly', `underline', `strike-out' or
-`highlight'.
-
-Merge COLOR as a color property with PROPERTY-ALIST and
-`pdf-annot-default-markup-annotation-properties' and apply the
-result to the created annotation.
-
-See also `pdf-annot-add-annotation'.
-
-Return the new annotation."
- (interactive
- (list (pdf-view-active-region t)
- (let ((type (completing-read "Markup type (default highlight): "
- '("squiggly" "highlight" "underline" "strike-out")
- nil t)))
- (if (equal type "") 'highlight (intern type)))
- (pdf-annot-read-color)))
- (pdf-util-assert-pdf-window)
- (pdf-annot-add-annotation
- type
- list-of-edges
- (pdf-annot-merge-alists
- (and color `((color . ,color)))
- property-alist
- pdf-annot-default-markup-annotation-properties
- (cdr (assq type pdf-annot-default-annotation-properties))
- (cdr (assq t pdf-annot-default-annotation-properties))
- (when pdf-annot-color-history
- `((color . ,(car pdf-annot-color-history))))
- '((color . "#ffff00")))
- (pdf-view-current-page)))
-
-(defun pdf-annot-add-squiggly-markup-annotation (list-of-edges
- &optional color property-alist)
- "Add a new squiggly annotation in the selected window.
-
-See also `pdf-annot-add-markup-annotation'."
- (interactive (list (pdf-view-active-region t)))
- (pdf-annot-add-markup-annotation list-of-edges 'squiggly color property-alist))
-
-(defun pdf-annot-add-underline-markup-annotation (list-of-edges
- &optional color property-alist)
- "Add a new underline annotation in the selected window.
-
-See also `pdf-annot-add-markup-annotation'."
- (interactive (list (pdf-view-active-region t)))
- (pdf-annot-add-markup-annotation list-of-edges 'underline color property-alist))
-
-(defun pdf-annot-add-strikeout-markup-annotation (list-of-edges
- &optional color property-alist)
- "Add a new strike-out annotation in the selected window.
-
-See also `pdf-annot-add-markup-annotation'."
- (interactive (list (pdf-view-active-region t)))
- (pdf-annot-add-markup-annotation list-of-edges 'strike-out color property-alist))
-
-(defun pdf-annot-add-highlight-markup-annotation (list-of-edges
- &optional color property-alist)
- "Add a new highlight annotation in the selected window.
-
-See also `pdf-annot-add-markup-annotation'."
- (interactive (list (pdf-view-active-region t)))
- (pdf-annot-add-markup-annotation list-of-edges 'highlight color property-alist))
-
-(defun pdf-annot-read-color (&optional prompt)
- "Read and return a color using PROMPT.
-
-Offer `pdf-annot-color-history' as default values."
- (let* ((defaults (append
- (delq nil
- (list
- (cdr (assq 'color
- pdf-annot-default-markup-annotation-properties))
- (cdr (assq 'color
- pdf-annot-default-text-annotation-properties))))
- pdf-annot-color-history))
- (prompt
- (format "%s%s: "
- (or prompt "Color")
- (if defaults (format " (default %s)" (car defaults)) "")))
- (current-completing-read-function completing-read-function)
- (completing-read-function
- (lambda (prompt collection &optional predicate require-match
- initial-input _hist _def inherit-input-method)
- (funcall current-completing-read-function
- prompt collection predicate require-match
- initial-input 'pdf-annot-color-history
- defaults
- inherit-input-method))))
- (read-color prompt)))
-
-(defun pdf-annot-merge-alists (&rest alists)
- "Merge ALISTS into a single one.
-
-Suppresses successive duplicate entries of keys after the first
-occurrence in ALISTS."
-
- (let (merged)
- (dolist (elt (apply 'append alists))
- (unless (assq (car elt) merged)
- (push elt merged)))
- (nreverse merged)))
-
-
-
-;; * ================================================================== *
-;; * Displaying annotation contents
-;; * ================================================================== *
-
-(defun pdf-annot-print-property (a property)
- "Pretty print annotation A's property PROPERTY."
- (let ((value (pdf-annot-get a property)))
- (cl-case property
- (color
- (propertize (or value "")
- 'face (and value
- `(:background ,value))))
- ((created modified)
- (let ((date value))
- (if (null date)
- "No date"
- (current-time-string date))))
- ;; print verbatim
- (subject
- (or value "No subject"))
- (opacity
- (let ((opacity (or value 1.0)))
- (format "%d%%" (round (* 100 opacity)))))
- (t (format "%s" (or value ""))))))
-
-(defun pdf-annot-print-annotation (a)
- "Pretty print annotation A."
- (or (run-hook-with-args-until-success
- 'pdf-annot-print-annotation-functions a)
- (pdf-annot-print-annotation-default a)))
-
-(defun pdf-annot-print-annotation-default (a)
- "Default pretty printer for annotation A.
-
-The result consists of a header (as printed with
-`pdf-annot-print-annotation-header') a newline and A's contents
-property."
- (concat
- (pdf-annot-print-annotation-header a)
- "\n"
- (pdf-annot-get a 'contents)))
-
-(defun pdf-annot-print-annotation-header (a)
- "Emit a suitable header string for annotation A."
- (let ((header
- (cond
- ((eq 'file (pdf-annot-get a 'type))
- (let ((att (pdf-annot-get-attachment a)))
- (format "File attachment `%s' of %s"
- (or (cdr (assq 'filename att)) "unnamed")
- (if (cdr (assq 'size att))
- (format "size %s" (file-size-human-readable
- (cdr (assq 'size att))))
- "unknown size"))))
- (t
- (format "%s"
- (mapconcat
- 'identity
- (mapcar
- (lambda (property)
- (pdf-annot-print-property
- a property))
- `(subject
- label
- modified))
- ";"))))))
- (setq header (propertize header 'face 'header-line
- 'intangible t 'read-only t))
- ;; This `trick' makes the face apply in a tooltip.
- (propertize header 'display header)))
-
-(defun pdf-annot-print-annotation-latex-maybe (a)
- "Maybe print annotation A's content as a LaTeX fragment.
-
-See `pdf-annot-latex-string-predicate'."
- (when (and (functionp pdf-annot-latex-string-predicate)
- (funcall pdf-annot-latex-string-predicate
- (pdf-annot-get a 'contents)))
- (pdf-annot-print-annotation-latex a)))
-
-(defun pdf-annot-print-annotation-latex (a)
- "Print annotation A's content as a LaTeX fragment.
-
-This compiles A's contents as a LaTeX fragment and puts the
-resulting image as a display property on the contents, prefixed
-by a header."
-
- (let (tempfile)
- (unwind-protect
- (with-current-buffer (pdf-annot-get-buffer a)
- (let* ((page (pdf-annot-get a 'page))
- (header (pdf-annot-print-annotation-header a))
- (contents (pdf-annot-get a 'contents))
- (hash (sxhash (format
- "pdf-annot-print-annotation-latex%s%s%s"
- page header contents)))
- (data (pdf-cache-lookup-image page 0 nil hash))
- (org-format-latex-header
- pdf-annot-latex-header)
- (temporary-file-directory
- (pdf-util-expand-file-name "pdf-annot-print-annotation-latex")))
- (unless (file-directory-p temporary-file-directory)
- (make-directory temporary-file-directory))
- (unless data
- (setq tempfile (make-temp-file "pdf-annot" nil ".png"))
- ;; FIXME: Why is this with-temp-buffer needed (which it is) ?
- (with-temp-buffer
- (org-create-formula-image
- contents tempfile org-format-latex-options t))
- (setq data (pdf-util-munch-file tempfile))
- (if (and (> (length data) 3)
- (equal (substring data 1 4)
- "PNG"))
- (pdf-cache-put-image page 0 data hash)
- (setq data nil)))
- (concat
- header
- "\n"
- (if data
- (propertize
- contents 'display (pdf-view-create-image data))
- (propertize
- contents
- 'display
- (concat
- (propertize "Failed to compile latex fragment\n"
- 'face 'error)
- contents))))))
- (when (and tempfile
- (file-exists-p tempfile))
- (delete-file tempfile)))))
-
-
-;; * ================================================================== *
-;; * Editing annotation contents
-;; * ================================================================== *
-
-(defvar-local pdf-annot-edit-contents--annotation nil)
-(put 'pdf-annot-edit-contents--annotation 'permanent-local t)
-(defvar-local pdf-annot-edit-contents--buffer nil)
-
-(defcustom pdf-annot-edit-contents-setup-function
- (lambda (a)
- (let ((mode (if (funcall pdf-annot-latex-string-predicate
- (pdf-annot-get a 'contents))
- 'latex-mode
- 'text-mode)))
- (unless (derived-mode-p mode)
- (funcall mode))))
- "A function for setting up, e.g. the major-mode, of the edit buffer.
-
-The function receives one argument, the annotation whose contents
-is about to be edited in this buffer.
-
-The default value turns on `latex-mode' if
-`pdf-annot-latex-string-predicate' returns non-nil on the
-annotation's contents and otherwise `text-mode'. "
- :group 'pdf-annot
- :type 'function)
-
-(defcustom pdf-annot-edit-contents-display-buffer-action
- '((display-buffer-reuse-window
- display-buffer-split-below-and-attach)
- (inhibit-same-window . t)
- (window-height . 0.25))
- "Display action when showing the edit buffer."
- :group 'pdf-annot
- :type display-buffer--action-custom-type)
-
-(defvar pdf-annot-edit-contents-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (set-keymap-parent kmap text-mode-map)
- (define-key kmap (kbd "C-c C-c") 'pdf-annot-edit-contents-commit)
- (define-key kmap (kbd "C-c C-q") 'pdf-annot-edit-contents-abort)
- kmap))
-
-(define-minor-mode pdf-annot-edit-contents-minor-mode
- "Active when editing the contents of annotations."
- nil nil nil
- (when pdf-annot-edit-contents-minor-mode
- (message "%s"
- (substitute-command-keys
- "Press \\[pdf-annot-edit-contents-commit] to commit your changes, \\[pdf-annot-edit-contents-abort] to abandon them."))))
-
-(put 'pdf-annot-edit-contents-minor-mode 'permanent-local t)
-
-;; FIXME: Document pdf-annot-edit-* functions below.
-(defun pdf-annot-edit-contents-finalize (do-save &optional do-kill)
- (when (buffer-modified-p)
- (cond
- ((eq do-save 'ask)
- (save-window-excursion
- (display-buffer (current-buffer) nil (selected-frame))
- (when (y-or-n-p "Save changes to this annotation ?")
- (pdf-annot-edit-contents-save-annotation))))
- (do-save
- (pdf-annot-edit-contents-save-annotation)))
- (set-buffer-modified-p nil))
- (dolist (win (get-buffer-window-list))
- (quit-window do-kill win)))
-
-(defun pdf-annot-edit-contents-save-annotation ()
- (when pdf-annot-edit-contents--annotation
- (pdf-annot-put pdf-annot-edit-contents--annotation
- 'contents
- (buffer-substring-no-properties (point-min) (point-max)))
- (set-buffer-modified-p nil)))
-
-(defun pdf-annot-edit-contents-commit ()
- (interactive)
- (pdf-annot-edit-contents-finalize t))
-
-(defun pdf-annot-edit-contents-abort ()
- (interactive)
- (pdf-annot-edit-contents-finalize nil t))
-
-(defun pdf-annot-edit-contents-noselect (a)
- (with-current-buffer (pdf-annot-get-buffer a)
- (when (and (buffer-live-p pdf-annot-edit-contents--buffer)
- (not (eq a pdf-annot-edit-contents--annotation)))
- (with-current-buffer pdf-annot-edit-contents--buffer
- (pdf-annot-edit-contents-finalize 'ask)))
- (unless (buffer-live-p pdf-annot-edit-contents--buffer)
- (setq pdf-annot-edit-contents--buffer
- (with-current-buffer (get-buffer-create
- (format "*Edit Annotation %s*"
- (buffer-name)))
- (pdf-annot-edit-contents-minor-mode 1)
- (current-buffer))))
- (with-current-buffer pdf-annot-edit-contents--buffer
- (let ((inhibit-read-only t))
- (erase-buffer)
- (save-excursion (insert (pdf-annot-get a 'contents)))
- (set-buffer-modified-p nil))
- (setq pdf-annot-edit-contents--annotation a)
- (funcall pdf-annot-edit-contents-setup-function a)
- (current-buffer))))
-
-(defun pdf-annot-edit-contents (a)
- (select-window
- (display-buffer
- (pdf-annot-edit-contents-noselect a)
- pdf-annot-edit-contents-display-buffer-action)))
-
-(defun pdf-annot-edit-contents-mouse (ev)
- (interactive "@e")
- (let* ((pos (posn-object-x-y (event-start ev)))
- (a (and pos (pdf-annot-at-position pos))))
- (unless a
- (error "No annotation at this position"))
- (pdf-annot-edit-contents a)))
-
-
-
-;; * ================================================================== *
-;; * Listing annotations
-;; * ================================================================== *
-
-(defcustom pdf-annot-list-display-buffer-action
- '((display-buffer-reuse-window
- display-buffer-pop-up-window)
- (inhibit-same-window . t))
- "Display action used when displaying the list buffer."
- :group 'pdf-annot
- :type display-buffer--action-custom-type)
-
-(defcustom pdf-annot-list-format
- '((page . 3)
- (type . 10)
- (label . 24)
- (date . 24))
- "Annotation properties visible in the annotation list.
-
-It should be a list of \(PROPERTIZE. WIDTH\), where PROPERTY is a
-symbol naming one of supported properties to list and WIDTH its
-desired column-width.
-
-Currently supported properties are page, type, label, date and contents."
- :type '(alist :key-type (symbol))
- :options '((page (integer :value 3 :tag "Column Width"))
- (type (integer :value 10 :tag "Column Width" ))
- (label (integer :value 24 :tag "Column Width"))
- (date (integer :value 24 :tag "Column Width"))
- (contents (integer :value 56 :tag "Column Width")))
- :group 'pdf-annot)
-
-(defcustom pdf-annot-list-highlight-type nil
- "Whether to highlight \"Type\" column annotation list with annotation color."
- :group 'pdf-annot
- :type 'boolean)
-
-(defvar-local pdf-annot-list-buffer nil)
-
-(defvar-local pdf-annot-list-document-buffer nil)
-
-(defvar pdf-annot-list-mode-map
- (let ((km (make-sparse-keymap)))
- (define-key km (kbd "C-c C-f") 'pdf-annot-list-follow-minor-mode)
- (define-key km (kbd "SPC") 'pdf-annot-list-display-annotation-from-id)
- km))
-
-(defun pdf-annot-property-completions (property)
- "Return a list of completion candidates for annotation property PROPERTY.
-
-Return nil, if not available."
- (cl-case property
- (color (pdf-util-color-completions))
- (icon (copy-sequence pdf-annot-standard-text-icons))))
-
-(defun pdf-annot-compare-annotations (a1 a2)
- "Compare annotations A1 and A2.
-
-Return non-nil if A1's page is less than A2's one or if they
-belong to the same page and A1 is displayed above/left of A2."
- (let ((p1 (pdf-annot-get a1 'page))
- (p2 (pdf-annot-get a2 'page)))
- (or (< p1 p2)
- (and (= p1 p2)
- (let ((e1 (pdf-util-scale
- (car (pdf-annot-get-display-edges a1))
- '(1000 . 1000)))
- (e2 (pdf-util-scale
- (car (pdf-annot-get-display-edges a2))
- '(1000 . 1000))))
- (pdf-util-with-edges (e1 e2)
- (or (< e1-top e2-top)
- (and (= e1-top e2-top)
- (<= e1-left e2-left)))))))))
-
-(defun pdf-annot-list-entries ()
- (unless (buffer-live-p pdf-annot-list-document-buffer)
- (error "No PDF document associated with this buffer"))
- (mapcar 'pdf-annot-list-create-entry
- (sort (pdf-annot-getannots nil pdf-annot-list-listed-types
- pdf-annot-list-document-buffer)
- 'pdf-annot-compare-annotations)))
-
-(defun pdf-annot--make-entry-formatter (a)
- (lambda (fmt)
- (let ((entry-type (car fmt))
- (entry-width (cdr fmt))
- ;; Taken from css-mode.el
- (contrasty-color
- (lambda (name)
- (if (> (color-distance name "black") 292485)
- "black" "white")))
- (prune-newlines
- (lambda (str)
- (replace-regexp-in-string "\n" " " str t t))))
- (cl-ecase entry-type
- (date (pdf-annot-print-property a 'modified))
- (page (pdf-annot-print-property a 'page))
- (label (funcall prune-newlines
- (pdf-annot-print-property a 'label)))
- (contents
- (truncate-string-to-width
- (funcall prune-newlines
- (pdf-annot-print-property a 'contents))
- entry-width))
- (type
- (let ((color (pdf-annot-get a 'color))
- (type (pdf-annot-print-property a 'type)))
- (if pdf-annot-list-highlight-type
- (propertize
- type 'face
- `(:background ,color
- :foreground ,(funcall contrasty-color color)))
- type)))))))
-
-(defun pdf-annot-list-create-entry (a)
- "Create a `tabulated-list-entries' entry for annotation A."
- (list (pdf-annot-get-id a)
- (vconcat
- (mapcar (pdf-annot--make-entry-formatter a)
- pdf-annot-list-format))))
-
-(define-derived-mode pdf-annot-list-mode tablist-mode "Annots"
- (let* ((page-sorter
- (lambda (a b)
- (< (string-to-number (aref (cadr a) 0))
- (string-to-number (aref (cadr b) 0)))))
- (format-generator
- (lambda (format)
- (let ((field (car format))
- (width (cdr format)))
- (cl-case field
- (page `("Pg." 3 ,page-sorter :read-only t :right-alight t))
- (t (list
- (capitalize (symbol-name field))
- width t :read-only t)))))))
- (setq tabulated-list-entries 'pdf-annot-list-entries
- tabulated-list-format (vconcat
- (mapcar
- format-generator
- pdf-annot-list-format))
- tabulated-list-padding 2))
- (set-keymap-parent pdf-annot-list-mode-map tablist-mode-map)
- (use-local-map pdf-annot-list-mode-map)
- (when (assq 'type pdf-annot-list-format)
- (setq tablist-current-filter
- `(not (== "Type" "link"))))
- (tabulated-list-init-header))
-
-(defun pdf-annot-list-annotations ()
- "List annotations in a dired like buffer.
-
-\\{pdf-annot-list-mode-map}"
- (interactive)
- (pdf-util-assert-pdf-buffer)
- (let ((buffer (current-buffer)))
- (with-current-buffer (get-buffer-create
- (format "*%s's annots*"
- (file-name-sans-extension
- (buffer-name))))
- (delay-mode-hooks
- (unless (derived-mode-p 'pdf-annot-list-mode)
- (pdf-annot-list-mode))
- (setq pdf-annot-list-document-buffer buffer)
- (tabulated-list-print)
- (setq tablist-context-window-function
- (lambda (id) (pdf-annot-list-context-function id buffer))
- tablist-operations-function 'pdf-annot-list-operation-function)
- (let ((list-buffer (current-buffer)))
- (with-current-buffer buffer
- (setq pdf-annot-list-buffer list-buffer))))
- (run-mode-hooks)
- (pop-to-buffer
- (current-buffer)
- pdf-annot-list-display-buffer-action)
- (tablist-move-to-major-column)
- (tablist-display-context-window))
- (add-hook 'pdf-info-close-document-hook
- 'pdf-annot-list-update nil t)
- (add-hook 'pdf-annot-modified-functions
- 'pdf-annot-list-update nil t)))
-
-(defun pdf-annot-list-goto-annotation (a)
- (with-current-buffer (pdf-annot-get-buffer a)
- (unless (and (buffer-live-p pdf-annot-list-buffer)
- (get-buffer-window pdf-annot-list-buffer))
- (pdf-annot-list-annotations))
- (with-selected-window (get-buffer-window pdf-annot-list-buffer)
- (goto-char (point-min))
- (let ((id (pdf-annot-get-id a)))
- (while (and (not (eobp))
- (not (eq id (tabulated-list-get-id))))
- (forward-line))
- (unless (eq id (tabulated-list-get-id))
- (error "Unable to find annotation"))
- (when (invisible-p (point))
- (tablist-suspend-filter t))
- (tablist-move-to-major-column)))))
-
-
-(defun pdf-annot-list-update (&optional _fn)
- (when (buffer-live-p pdf-annot-list-buffer)
- (with-current-buffer pdf-annot-list-buffer
- (unless tablist-edit-column-minor-mode
- (tablist-revert))
- (tablist-context-window-update))))
-
-(defun pdf-annot-list-context-function (id buffer)
- (with-current-buffer (get-buffer-create "*Contents*")
- (set-window-buffer nil (current-buffer))
- (let ((inhibit-read-only t))
- (erase-buffer)
- (when id
- (save-excursion
- (insert
- (pdf-annot-print-annotation
- (pdf-annot-getannot id buffer)))))
- (read-only-mode 1))))
-
-(defun pdf-annot-list-operation-function (op &rest args)
- (cl-ecase op
- (supported-operations '(delete find-entry))
- (delete
- (cl-destructuring-bind (ids)
- args
- (when (buffer-live-p pdf-annot-list-document-buffer)
- (with-current-buffer pdf-annot-list-document-buffer
- (pdf-annot-with-atomic-modifications
- (dolist (a (mapcar 'pdf-annot-getannot ids))
- (pdf-annot-delete a)))))))
- (find-entry
- (cl-destructuring-bind (id)
- args
- (unless (buffer-live-p pdf-annot-list-document-buffer)
- (error "No PDF document associated with this buffer"))
- (let* ((buffer pdf-annot-list-document-buffer)
- (a (pdf-annot-getannot id buffer))
- (pdf-window (save-selected-window
- (or (get-buffer-window buffer)
- (display-buffer buffer))))
- window)
- (with-current-buffer buffer
- (pdf-annot-activate-annotation a)
- (setq window (selected-window)))
- ;; Make it so that quitting the edit window returns to the
- ;; list window.
- (unless (memq window (list (selected-window) pdf-window))
- (let* ((quit-restore
- (window-parameter window 'quit-restore)))
- (when quit-restore
- (setcar (nthcdr 2 quit-restore) (selected-window))))))))))
-
-(defvar pdf-annot-list-display-annotation--timer nil)
-
-(defun pdf-annot-list-display-annotation-from-id (id)
- (interactive (list (tabulated-list-get-id)))
- (when id
- (unless (buffer-live-p pdf-annot-list-document-buffer)
- (error "PDF buffer was killed"))
- (when (timerp pdf-annot-list-display-annotation--timer)
- (cancel-timer pdf-annot-list-display-annotation--timer))
- (setq pdf-annot-list-display-annotation--timer
- (run-with-idle-timer 0.1 nil
- (lambda (buffer a)
- (when (buffer-live-p buffer)
- (with-selected-window
- (or (get-buffer-window buffer)
- (display-buffer
- buffer
- '(nil (inhibit-same-window . t))))
- (pdf-annot-show-annotation a t))))
- pdf-annot-list-document-buffer
- (pdf-annot-getannot id pdf-annot-list-document-buffer)))))
-
-(define-minor-mode pdf-annot-list-follow-minor-mode
- "" nil nil nil
- (unless (derived-mode-p 'pdf-annot-list-mode)
- (error "No in pdf-annot-list-mode."))
- (cond
- (pdf-annot-list-follow-minor-mode
- (add-hook 'tablist-selection-changed-functions
- 'pdf-annot-list-display-annotation-from-id nil t)
- (let ((id (tabulated-list-get-id)))
- (when id
- (pdf-annot-list-display-annotation-from-id id))))
- (t
- (remove-hook 'tablist-selection-changed-functions
- 'pdf-annot-list-display-annotation-from-id t))))
-
-(provide 'pdf-annot)
-;;; pdf-annot.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-cache.el b/elpa/pdf-tools-20200512.1524/pdf-cache.el
deleted file mode 100644
index 9ed7241..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-cache.el
+++ /dev/null
@@ -1,456 +0,0 @@
-;;; pdf-cache.el --- Cache time-critical or frequent epdfinfo queries. -*- lexical-binding:t -*-
-
-;; Copyright (C) 2013 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, doc-view, pdf
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;;; Code:
-;;
-
-(require 'pdf-info)
-(require 'pdf-util)
-
-
-;; * ================================================================== *
-;; * Customiazations
-;; * ================================================================== *
-
-(defcustom pdf-cache-image-limit 64
- "Maximum number of cached PNG images per buffer."
- :type 'integer
- :group 'pdf-cache
- :group 'pdf-view)
-
-(defcustom pdf-cache-prefetch-delay 0.5
- "Idle time in seconds before prefetching images starts."
- :group 'pdf-view
- :type 'number)
-
-(defcustom pdf-cache-prefetch-pages-function
- 'pdf-cache-prefetch-pages-function-default
- "A function returning a list of pages to be prefetched.
-
-It is called with no arguments in the PDF window and should
-return a list of page-numbers, determining the pages that should
-be prefetched and their order."
- :group 'pdf-view
- :type 'function)
-
-
-;; * ================================================================== *
-;; * Simple Value cache
-;; * ================================================================== *
-
-(defvar-local pdf-cache--data nil)
-
-(defvar pdf-annot-modified-functions)
-
-(defun pdf-cache--initialize ()
- (unless pdf-cache--data
- (setq pdf-cache--data (make-hash-table))
- (add-hook 'pdf-info-close-document-hook 'pdf-cache-clear-data nil t)
- (add-hook 'pdf-annot-modified-functions
- 'pdf-cache--clear-data-of-annotations
- nil t)))
-
-(defun pdf-cache--clear-data-of-annotations (fn)
- (apply 'pdf-cache-clear-data-of-pages
- (mapcar (lambda (a)
- (cdr (assq 'page a)))
- (funcall fn t))))
-
-(defun pdf-cache--data-put (key value &optional page)
- "Put KEY with VALUE in the cache of PAGE, return value."
- (pdf-cache--initialize)
- (puthash page (cons (cons key value)
- (assq-delete-all
- key
- (gethash page pdf-cache--data)))
- pdf-cache--data)
- value)
-
-(defun pdf-cache--data-get (key &optional page)
- "Get value of KEY in the cache of PAGE.
-
-Returns a cons \(HIT . VALUE\), where HIT is non-nil if KEY was
-stored previously for PAGE and VALUE it's value. Otherwise HIT
-is nil and VALUE undefined."
- (pdf-cache--initialize)
- (let ((elt (assq key (gethash page pdf-cache--data))))
- (if elt
- (cons t (cdr elt))
- (cons nil nil))))
-
-(defun pdf-cache--data-clear (key &optional page)
- (pdf-cache--initialize)
- (puthash page
- (assq-delete-all key (gethash page pdf-cache--data))
- pdf-cache--data)
- nil)
-
-(defun pdf-cache-clear-data-of-pages (&rest pages)
- (when pdf-cache--data
- (dolist (page pages)
- (remhash page pdf-cache--data))))
-
-(defun pdf-cache-clear-data ()
- (interactive)
- (when pdf-cache--data
- (clrhash pdf-cache--data)))
-
-(defmacro define-pdf-cache-function (command &optional page-arg-p)
- "Define a simple data cache function.
-
-COMMAND is the name of the command, e.g. number-of-pages. It
-should have a corresponding pdf-info function. If PAGE-ARG-P is
-non-nil, define a one-dimensional cache indexed by the page
-number. Otherwise the value is constant for each document, like
-e.g. number-of-pages.
-
-Both args are unevaluated."
-
- (let ((args (if page-arg-p (list 'page)))
- (fn (intern (format "pdf-cache-%s" command)))
- (ifn (intern (format "pdf-info-%s" command)))
- (doc (format "Cached version of `pdf-info-%s', which see.
-
-Make sure, not to modify it's return value." command)))
- `(defun ,fn ,args
- ,doc
- (let ((hit-value (pdf-cache--data-get ',command ,(if page-arg-p 'page))))
- (if (car hit-value)
- (cdr hit-value)
- (pdf-cache--data-put
- ',command
- ,(if page-arg-p
- (list ifn 'page)
- (list ifn))
- ,(if page-arg-p 'page)))))))
-
-(define-pdf-cache-function pagelinks t)
-(define-pdf-cache-function number-of-pages)
-;; The boundingbox may change if annotations change.
-(define-pdf-cache-function boundingbox t)
-(define-pdf-cache-function textregions t)
-(define-pdf-cache-function pagesize t)
-
-
-;; * ================================================================== *
-;; * PNG image LRU cache
-;; * ================================================================== *
-
-(defvar pdf-cache-image-inihibit nil
- "Non-nil, if the image cache should be bypassed.")
-
-(defvar-local pdf-cache--image-cache nil)
-
-(defmacro pdf-cache--make-image (page width data hash)
- `(list ,page ,width ,data ,hash))
-(defmacro pdf-cache--image/page (img) `(nth 0 ,img))
-(defmacro pdf-cache--image/width (img) `(nth 1 ,img))
-(defmacro pdf-cache--image/data (img) `(nth 2 ,img))
-(defmacro pdf-cache--image/hash (img) `(nth 3 ,img))
-
-(defun pdf-cache--image-match (image page min-width &optional max-width hash)
- "Match IMAGE with specs.
-
-IMAGE should be a list as created by `pdf-cache--make-image'.
-
-Return non-nil, if IMAGE's page is the same as PAGE, it's width
-is at least MIN-WIDTH and at most MAX-WIDTH and it's stored
-hash-value is `eql' to HASH."
- (and (= (pdf-cache--image/page image)
- page)
- (or (null min-width)
- (>= (pdf-cache--image/width image)
- min-width))
- (or (null max-width)
- (<= (pdf-cache--image/width image)
- max-width))
- (eql (pdf-cache--image/hash image)
- hash)))
-
-(defun pdf-cache-lookup-image (page min-width &optional max-width hash)
- "Return PAGE's cached PNG data as a string or nil.
-
-Does not modify the cache. See also `pdf-cache-get-image'."
- (let ((image (car (cl-member
- (list page min-width max-width hash)
- pdf-cache--image-cache
- :test (lambda (spec image)
- (apply 'pdf-cache--image-match image spec))))))
- (and image
- (pdf-cache--image/data image))))
-
-(defun pdf-cache-get-image (page min-width &optional max-width hash)
- "Return PAGE's PNG data as a string.
-
-Return an image of at least MIN-WIDTH and, if non-nil, maximum
-width MAX-WIDTH and `eql' hash value.
-
-Remember that image was recently used.
-
-Returns nil, if no matching image was found."
- (let ((cache pdf-cache--image-cache)
- image)
- ;; Find it in the cache.
- (while (and (setq image (pop cache))
- (not (pdf-cache--image-match
- image page min-width max-width hash))))
- ;; Remove it and push it to the front.
- (when image
- (setq pdf-cache--image-cache
- (cons image (delq image pdf-cache--image-cache)))
- (pdf-cache--image/data image))))
-
-(defun pdf-cache-put-image (page width data &optional hash)
- "Cache image of PAGE with WIDTH, DATA and HASH.
-
-DATA should the string of a PNG image of width WIDTH and from
-page PAGE in the current buffer. See `pdf-cache-get-image' for
-the HASH argument.
-
-This function always returns nil."
- (unless pdf-cache--image-cache
- (add-hook 'pdf-info-close-document-hook 'pdf-cache-clear-images nil t)
- (add-hook 'pdf-annot-modified-functions
- 'pdf-cache--clear-images-of-annotations nil t))
- (push (pdf-cache--make-image page width data hash)
- pdf-cache--image-cache)
- ;; Forget old image(s).
- (when (> (length pdf-cache--image-cache)
- pdf-cache-image-limit)
- (if (> pdf-cache-image-limit 1)
- (setcdr (nthcdr (1- pdf-cache-image-limit)
- pdf-cache--image-cache)
- nil)
- (setq pdf-cache--image-cache nil)))
- nil)
-
-(defun pdf-cache-clear-images ()
- "Clear the image cache."
- (setq pdf-cache--image-cache nil))
-
-(defun pdf-cache-clear-images-if (fn)
- "Remove images from the cache according to FN.
-
-FN should be function accepting 4 Arguments \(PAGE WIDTH DATA
-HASH\). It should return non-nil, if the image should be removed
-from the cache."
- (setq pdf-cache--image-cache
- (cl-remove-if
- (lambda (image)
- (funcall
- fn
- (pdf-cache--image/page image)
- (pdf-cache--image/width image)
- (pdf-cache--image/data image)
- (pdf-cache--image/hash image)))
- pdf-cache--image-cache)))
-
-
-(defun pdf-cache--clear-images-of-annotations (fn)
- (apply 'pdf-cache-clear-images-of-pages
- (mapcar (lambda (a)
- (cdr (assq 'page a)))
- (funcall fn t))))
-
-(defun pdf-cache-clear-images-of-pages (&rest pages)
- (pdf-cache-clear-images-if
- (lambda (page &rest _) (memq page pages))))
-
-(defun pdf-cache-renderpage (page min-width &optional max-width)
- "Render PAGE according to MIN-WIDTH and MAX-WIDTH.
-
-Return the PNG data of an image as a string, such that it's width
-is at least MIN-WIDTH and, if non-nil, at most MAX-WIDTH.
-
-If such an image is not available in the cache, call
-`pdf-info-renderpage' to create one."
- (if pdf-cache-image-inihibit
- (pdf-info-renderpage page min-width)
- (or (pdf-cache-get-image page min-width max-width)
- (let ((data (pdf-info-renderpage page min-width)))
- (pdf-cache-put-image page min-width data)
- data))))
-
-(defun pdf-cache-renderpage-text-regions (page width single-line-p
- &rest selection)
- "Render PAGE according to WIDTH, SINGLE-LINE-P and SELECTION.
-
-See also `pdf-info-renderpage-text-regions' and
-`pdf-cache-renderpage'."
- (if pdf-cache-image-inihibit
- (apply 'pdf-info-renderpage-text-regions
- page width single-line-p nil selection)
- (let ((hash (sxhash
- (format "%S" (cons 'renderpage-text-regions
- (cons single-line-p selection))))))
- (or (pdf-cache-get-image page width width hash)
- (let ((data (apply 'pdf-info-renderpage-text-regions
- page width single-line-p nil selection)))
- (pdf-cache-put-image page width data hash)
- data)))))
-
-(defun pdf-cache-renderpage-highlight (page width &rest regions)
- "Highlight PAGE according to WIDTH and REGIONS.
-
-See also `pdf-info-renderpage-highlight' and
-`pdf-cache-renderpage'."
- (if pdf-cache-image-inihibit
- (apply 'pdf-info-renderpage-highlight
- page width nil regions)
- (let ((hash (sxhash
- (format "%S" (cons 'renderpage-highlight
- regions)))))
- (or (pdf-cache-get-image page width width hash)
- (let ((data (apply 'pdf-info-renderpage-highlight
- page width nil regions)))
- (pdf-cache-put-image page width data hash)
- data)))))
-
-
-;; * ================================================================== *
-;; * Prefetching images
-;; * ================================================================== *
-
-(defvar-local pdf-cache--prefetch-pages nil
- "Pages to be prefetched.")
-
-(defvar-local pdf-cache--prefetch-timer nil
- "Timer used when prefetching images.")
-
-(define-minor-mode pdf-cache-prefetch-minor-mode
- "Try to load images which will probably be needed in a while."
- nil nil nil
- (pdf-cache--prefetch-cancel)
- (cond
- (pdf-cache-prefetch-minor-mode
- (pdf-util-assert-pdf-buffer)
- (add-hook 'pre-command-hook 'pdf-cache--prefetch-stop nil t)
- ;; FIXME: Disable the time when the buffer is killed or it's
- ;; major-mode changes.
- (setq pdf-cache--prefetch-timer
- (run-with-idle-timer (or pdf-cache-prefetch-delay 1)
- t 'pdf-cache--prefetch-start (current-buffer))))
- (t
- (remove-hook 'pre-command-hook 'pdf-cache--prefetch-stop t))))
-
-(defun pdf-cache-prefetch-pages-function-default ()
- (let ((page (pdf-view-current-page)))
- (pdf-util-remove-duplicates
- (cl-remove-if-not
- (lambda (page)
- (and (>= page 1)
- (<= page (pdf-cache-number-of-pages))))
- (append
- ;; +1, -1, +2, -2, ...
- (let ((sign 1)
- (incr 1))
- (mapcar (lambda (_)
- (setq page (+ page (* sign incr))
- sign (- sign)
- incr (1+ incr))
- page)
- (number-sequence 1 16)))
- ;; First and last
- (list 1 (pdf-cache-number-of-pages))
- ;; Links
- (mapcar
- (apply-partially 'alist-get 'page)
- (cl-remove-if-not
- (lambda (link) (eq (alist-get 'type link) 'goto-dest))
- (pdf-cache-pagelinks
- (pdf-view-current-page)))))))))
-
-(defun pdf-cache--prefetch-pages (window image-width)
- (when (and (eq window (selected-window))
- (pdf-util-pdf-buffer-p))
- (let ((page (pop pdf-cache--prefetch-pages)))
- (while (and page
- (pdf-cache-lookup-image
- page
- image-width
- (if (not (pdf-view-use-scaling-p))
- image-width
- (* 2 image-width))))
- (setq page (pop pdf-cache--prefetch-pages)))
- (pdf-util-debug
- (when (null page)
- (message "Prefetching done.")))
- (when page
- (let* ((buffer (current-buffer))
- (pdf-info-asynchronous
- (lambda (status data)
- (when (and (null status)
- (eq window
- (selected-window))
- (eq buffer (window-buffer)))
- (with-current-buffer (window-buffer)
- (when (derived-mode-p 'pdf-view-mode)
- (pdf-cache-put-image
- page image-width data)
- (image-size (pdf-view-create-page page))
- (pdf-util-debug
- (message "Prefetched page %s." page))
- ;; Avoid max-lisp-eval-depth
- (run-with-timer
- 0.001 nil 'pdf-cache--prefetch-pages window image-width)))))))
- (condition-case err
- (pdf-info-renderpage page image-width)
- (error
- (pdf-cache-prefetch-minor-mode -1)
- (signal (car err) (cdr err)))))))))
-
-(defvar pdf-cache--prefetch-started-p nil
- "Guard against multiple prefetch starts.
-
-Used solely in `pdf-cache--prefetch-start'.")
-
-(defun pdf-cache--prefetch-start (buffer)
- "Start prefetching images in BUFFER."
- (when (and pdf-cache-prefetch-minor-mode
- (not pdf-cache--prefetch-started-p)
- (pdf-util-pdf-buffer-p)
- (not isearch-mode)
- (null pdf-cache--prefetch-pages)
- (eq (window-buffer) buffer)
- (fboundp pdf-cache-prefetch-pages-function))
- (let* ((pdf-cache--prefetch-started-p t)
- (pages (funcall pdf-cache-prefetch-pages-function)))
- (setq pdf-cache--prefetch-pages
- (butlast pages (max 0 (- (length pages)
- pdf-cache-image-limit))))
- (pdf-cache--prefetch-pages
- (selected-window)
- (car (pdf-view-desired-image-size))))))
-
-(defun pdf-cache--prefetch-stop ()
- "Stop prefetching images in current buffer."
- (setq pdf-cache--prefetch-pages nil))
-
-(defun pdf-cache--prefetch-cancel ()
- "Cancel prefetching images in current buffer."
- (pdf-cache--prefetch-stop)
- (when pdf-cache--prefetch-timer
- (cancel-timer pdf-cache--prefetch-timer))
- (setq pdf-cache--prefetch-timer nil))
-
-(provide 'pdf-cache)
-;;; pdf-cache.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-dev.el b/elpa/pdf-tools-20200512.1524/pdf-dev.el
deleted file mode 100644
index 7889c14..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-dev.el
+++ /dev/null
@@ -1,85 +0,0 @@
-;;; pdf-dev.el --- Mother's little development helper -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Andreas Politz
-
-;; Author: Andreas Politz <politza@hochschule-trier.de>
-;; Keywords:
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; This file is only meant for developers. The entry point is
-;; pdf-dev-minor-mode, which see.
-
-;;; Code:
-
-(defvar pdf-dev-root-directory
- (file-name-directory
- (directory-file-name
- (file-name-directory load-file-name))))
-
-(defun pdf-dev-reload ()
- "Reload lisp files from source."
- (interactive)
- (let ((default-directory (expand-file-name
- "lisp"
- pdf-dev-root-directory))
- loaded)
- (dolist (file (directory-files default-directory nil "\\`pdf-\\w*\\.el\\'"))
- (push file loaded)
- (load-file file))
- (message "Loaded %s" (mapconcat 'identity loaded " "))))
-
-(define-minor-mode pdf-dev-minor-mode
- "Make developing pdf-tools easier.
-
-It does the following:
-
-Quits the server and sets `pdf-info-epdfinfo-program' to
-../server/epdfinfo.
-
-Installs a `compilation-finish-functions' which will restart
-epdfinfo after a successful recompilation.
-
-Sets up `load-path' and reloads all PDF Tools lisp files."
- nil nil nil
- (let ((lisp-dir (expand-file-name "lisp" pdf-dev-root-directory)))
- (setq load-path (remove lisp-dir load-path))
- (cond
- (pdf-dev-minor-mode
- (add-hook 'compilation-finish-functions 'pdf-dev-compilation-finished)
- (add-to-list 'load-path lisp-dir)
- (setq pdf-info-epdfinfo-program
- (expand-file-name
- "epdfinfo"
- (expand-file-name "server" pdf-dev-root-directory)))
- (pdf-info-quit)
- (pdf-dev-reload))
- (t
- (remove-hook 'compilation-finish-functions 'pdf-dev-compilation-finished)))))
-
-(defun pdf-dev-compilation-finished (buffer status)
- (with-current-buffer buffer
- (when (and (equal status "finished\n")
- (file-equal-p
- (expand-file-name "server" pdf-dev-root-directory)
- default-directory))
- (message "Restarting epdfinfo server")
- (pdf-info-quit)
- (let ((pdf-info-restart-process-p t))
- (pdf-info-process-assert-running)))))
-
-(provide 'pdf-dev)
-;;; pdf-dev.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-history.el b/elpa/pdf-tools-20200512.1524/pdf-history.el
deleted file mode 100644
index 433d7e3..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-history.el
+++ /dev/null
@@ -1,170 +0,0 @@
-;;; pdf-history.el --- A simple stack-based history in PDF buffers. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-
-(require 'pdf-view)
-(require 'pdf-util)
-
-;;; Code:
-
-(defgroup pdf-history nil
- "A simple stack-based history."
- :group 'pdf-tools)
-
-(defvar-local pdf-history-stack nil
- "The stack of history items.")
-
-(defvar-local pdf-history-index nil
- "The current index into the `pdf-history-stack'.")
-
-(defvar pdf-history-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap (kbd "B") 'pdf-history-backward)
- (define-key kmap (kbd "N") 'pdf-history-forward)
- kmap)
- "Keymap used in `pdf-history-minor-mode'.")
-
-;;;###autoload
-(define-minor-mode pdf-history-minor-mode
- "Keep a history of previously visited pages.
-
-This is a simple stack-based history. Turning the page or
-following a link pushes the left-behind page on the stack, which
-may be navigated with the following keys.
-
-\\{pdf-history-minor-mode-map}"
- nil nil nil
- (pdf-util-assert-pdf-buffer)
- (pdf-history-clear)
- (cond
- (pdf-history-minor-mode
- (pdf-history-push)
- (add-hook 'pdf-view-after-change-page-hook
- 'pdf-history-before-change-page-hook nil t))
- (t
- (remove-hook 'pdf-view-after-change-page-hook
- 'pdf-history-before-change-page-hook t))))
-
-(defun pdf-history-before-change-page-hook ()
- "Push a history item, before leaving this page."
- (when (and pdf-history-minor-mode
- (not (bound-and-true-p pdf-isearch-active-mode))
- (pdf-view-current-page))
- (pdf-history-push)))
-
-(defun pdf-history-push ()
- "Push the current page on the stack.
-
-This function does nothing, if current stack item already
-represents the current page."
- (interactive)
- (let ((item (pdf-history-create-item)))
- (unless (and pdf-history-stack
- (equal (nth pdf-history-index
- pdf-history-stack) item))
- (setq pdf-history-stack
- (last pdf-history-stack
- (- (length pdf-history-stack)
- pdf-history-index))
- pdf-history-index 0)
- (push item pdf-history-stack))))
-
-(defun pdf-history-clear ()
- "Remove all history items."
- (interactive)
- (setq pdf-history-stack nil
- pdf-history-index 0)
- (pdf-history-push))
-
-(defun pdf-history-create-item ()
- "Create a history item representing the current page."
- (list
- (pdf-view-current-page)))
-
-(defun pdf-history-beginning-of-history-p ()
- "Return t, if at the beginning of the history."
- (= pdf-history-index 0))
-
-(defun pdf-history-end-of-history-p ()
- "Return t, if at the end of the history."
- (= pdf-history-index
- (1- (length pdf-history-stack))))
-
-(defun pdf-history-backward (n)
- "Go N-times backward in the history."
- (interactive "p")
- (cond
- ((and (> n 0)
- (pdf-history-end-of-history-p))
- (error "End of history"))
- ((and (< n 0)
- (pdf-history-beginning-of-history-p))
- (error "Beginning of history"))
- ((/= n 0)
- (let ((i (min (max 0 (+ pdf-history-index n))
- (1- (length pdf-history-stack)))))
- (prog1
- (- (+ pdf-history-index n) i)
- (pdf-history-goto i))))
- (t 0)))
-
-(defun pdf-history-forward (n)
- "Go N-times forward in the history."
- (interactive "p")
- (pdf-history-backward (- n)))
-
-(defun pdf-history-goto (n)
- "Go to item N in the history."
- (interactive "p")
- (when (null pdf-history-stack)
- (error "The history is empty"))
- (cond
- ((>= n (length pdf-history-stack))
- (error "End of history"))
- ((< n 0)
- (error "Beginning of history"))
- (t
- (setq pdf-history-index n)
- (pdf-view-goto-page
- (car (nth n pdf-history-stack))))))
-
-(defun pdf-history-debug ()
- "Visualize the history in the header-line."
- (interactive)
- (setq header-line-format
- '(:eval
- (let ((pages (mapcar 'car pdf-history-stack))
- (index pdf-history-index)
- header)
- (dotimes (i (length pages))
- (push (propertize
- (format "%s" (nth i pages))
- 'face
- (and (= i index) 'match))
- header))
- (concat
- "(" (format "%d" index) ") "
- (mapconcat 'identity (nreverse header) " | "))))))
-
-(provide 'pdf-history)
-
-;;; pdf-history.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-info.el b/elpa/pdf-tools-20200512.1524/pdf-info.el
deleted file mode 100644
index 0c345a2..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-info.el
+++ /dev/null
@@ -1,1744 +0,0 @@
-;;; pdf-info.el --- Extract info from pdf-files via a helper process. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; This library represents the Lisp side of the epdfinfo server. This
-;; program works on a command/response basis, but there should be no
-;; need to understand the protocol, since every command has a
-;; corresponding Lisp-function (see below under `High level
-;; interface').
-;;
-;; Most of these functions receive a file-or-buffer argument, which
-;; may be what it says and defaults to the current buffer. Also, most
-;; functions return some sort of alist, with, in most cases,
-;; straight-forward key-value-pairs. Though some may be only
-;; understandable in the context of Adobe's PDF spec \(Adobe
-;; PDF32000\) or the poppler documentation (e.g. annotation flags).
-;;
-;; If the poppler library is fairly recent (>= 0.19.4, older versions
-;; have a bug, which may corrupt the document), annotations maybe
-;; modified to a certain degree, deleted and text-annotations created.
-;; The state of these modifications is held in the server. In order
-;; to realize, annotations retrieved or created are referenced by a
-;; unique symbol. Saving these changes creates a new file, the
-;; original document is never touched.
-
-;;; Todo:
-;;
-;; + Close documents at some time (e.g. when the buffer is killed)
-;;
-
-;;; Code:
-
-(require 'tq)
-(require 'cl-lib)
-
-
-
-;; * ================================================================== *
-;; * Customizations
-;; * ================================================================== *
-
-(defgroup pdf-info nil
- "Extract infos from pdf-files via a helper process."
- :group 'pdf-tools)
-
-(defcustom pdf-info-epdfinfo-program
- (let ((executable (if (eq system-type 'windows-nt)
- "epdfinfo.exe" "epdfinfo"))
- (default-directory
- (or (and load-file-name
- (file-name-directory load-file-name))
- default-directory)))
- (cl-labels ((try-directory (directory)
- (and (file-directory-p directory)
- (file-executable-p (expand-file-name executable directory))
- (expand-file-name executable directory))))
- (or (executable-find executable)
- ;; This works if epdfinfo is in the same place as emacs and
- ;; the editor was started with an absolute path, i.e. it is
- ;; meant for Windows/Msys2.
- (and (stringp (car-safe command-line-args))
- (file-name-directory (car command-line-args))
- (try-directory
- (file-name-directory (car command-line-args))))
- ;; If we are running directly from the git repo.
- (try-directory (expand-file-name "../server"))
- ;; Fall back to epdfinfo in the directory of this file.
- (expand-file-name executable))))
- "Filename of the epdfinfo executable."
- :group 'pdf-info
- :type 'file)
-
-(defcustom pdf-info-epdfinfo-error-filename nil
- "Filename for error output of the epdfinfo executable.
-
-If nil, discard any error messages. Useful for debugging."
- :group 'pdf-info
- :type `(choice (const :tag "None" nil)
- ,@(when (file-directory-p "/tmp/")
- '((const "/tmp/epdfinfo.log")))
- (file)))
-
-(defcustom pdf-info-log nil
- "Whether to log the communication with the server.
-
-If this is non-nil, all communication with the epdfinfo program
-will be logged to the buffer \"*pdf-info-log*\"."
- :group 'pdf-info
- :type 'boolean)
-
-(defcustom pdf-info-log-entry-max 512
- "Maximum number of characters in a single log entry.
-
-This variable has no effect if `pdf-info-log' is nil."
- :group 'pdf-info
- :type 'integer)
-
-(defcustom pdf-info-restart-process-p 'ask
- "What to do when the epdfinfo server died.
-
-This should be one of
-nil -- do nothing,
-t -- automatically restart it or
-ask -- ask whether to restart or not.
-
-If it is `ask', the server quits and you answer no, this variable
-is set to nil."
- :group 'pdf-info
- :type '(choice (const :tag "Do nothing" nil)
- (const :tag "Restart silently" t)
- (const :tag "Always ask" ask)))
-
-(defcustom pdf-info-close-document-hook nil
- "A hook ran after a document was closed in the server.
-
-The hook is run in the documents buffer, if it exists. Otherwise
-in a `with-temp-buffer' form."
- :group 'pdf-info
- :type 'hook)
-
-
-
-;; * ================================================================== *
-;; * Variables
-;; * ================================================================== *
-
-(defvar pdf-info-asynchronous nil
- "If non-nil process queries asynchronously.
-
-More specifically the value should be a function of at 2
-arguments \(fn STATUS RESPONSE\), where STATUS is either nil, for
-a successful query, or the symbol error. RESPONSE is either the
-command's response or the error message. This does not work
-recursive, i.e. if function wants to make another asynchronous
-query it has to rebind this variable.
-
-Alternatively it may be a list \(FN . ARGS\), in which case FN
-will be invoked like \(apply FN STATUS RESPONSE ARGS\).
-
-Also, all pdf-info functions normally returning a response return
-nil.
-
-This variable should only be let-bound.")
-
-(defconst pdf-info-pdf-date-regexp
- ;; Adobe PDF32000.book, 7.9.4 Dates
- (eval-when-compile
- (concat
- ;; allow for preceding garbage
- ;;"\\`"
- "[dD]:"
- "\\([0-9]\\{4\\}\\)" ;year
- "\\(?:"
- "\\([0-9]\\{2\\}\\)" ;month
- "\\(?:"
- "\\([0-9]\\{2\\}\\)" ;day
- "\\(?:"
- "\\([0-9]\\{2\\}\\)" ;hour
- "\\(?:"
- "\\([0-9]\\{2\\}\\)" ;minutes
- "\\(?:"
- "\\([0-9]\\{2\\}\\)" ;seconds
- "\\)?\\)?\\)?\\)?\\)?"
- "\\(?:"
- "\\([+-Zz]\\)" ;UT delta char
- "\\(?:"
- "\\([0-9]\\{2\\}\\)" ;UT delta hours
- "\\(?:"
- "'"
- "\\([0-9]\\{2\\}\\)" ;UT delta minutes
- "\\)?\\)?\\)?"
- ;; "\\'"
- ;; allow for trailing garbage
- )))
-
-(defvar pdf-info--queue t
- "Internally used transmission-queue for the server.
-
-This variable is initially `t', telling the code starting the
-server, that it never ran.")
-
-
-;; * ================================================================== *
-;; * Process handling
-;; * ================================================================== *
-
-(defconst pdf-info-empty-page-data
- (eval-when-compile
- (concat
- "%PDF-1.0\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0"
- " obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</"
- "Type/Page/MediaBox[0 0 3 3]>>endobj\nxref\n0 4\n00000000"
- "0065535 f\n0000000010 00000 n\n0000000053 00000 n\n00000"
- "00102 00000 n\ntrailer<</Size 4/Root 1 0 R>>\nstartxref\n149\n%EOF"))
- "PDF data of an empty page.")
-
-(defun pdf-info-process ()
- "Return the process object or nil."
- (and pdf-info--queue
- (not (eq t pdf-info--queue))
- (tq-process pdf-info--queue)))
-
-(defun pdf-info-check-epdfinfo (&optional interactive-p)
- "Check if the server should be working properly.
-
-Signal an error if some problem was found. Message a
-confirmation, if INTERACTIVE-P is non-nil and no problems were
-found.
-
-Returns nil."
- (interactive "p")
- (let ((executable pdf-info-epdfinfo-program))
- (unless (stringp executable)
- (error "pdf-info-epdfinfo-program is unset or not a string"))
- (unless (file-executable-p executable)
- (error "pdf-info-epdfinfo-program is not executable"))
- (when pdf-info-epdfinfo-error-filename
- (unless (and (stringp pdf-info-epdfinfo-error-filename)
- (file-writable-p pdf-info-epdfinfo-error-filename))
- (error "pdf-info-epdfinfo-error-filename should contain writable filename")))
- (let* ((default-directory (expand-file-name "~/"))
- (cmdfile (make-temp-file "commands"))
- (pdffile (make-temp-file "empty.pdf"))
- (tempdir (make-temp-file "tmpdir" t))
- (process-environment (cons (concat "TMPDIR=" tempdir)
- process-environment)))
- (unwind-protect
- (with-temp-buffer
- (with-temp-file pdffile
- (set-buffer-multibyte nil)
- (insert pdf-info-empty-page-data))
- (with-temp-file cmdfile
- (insert (format "renderpage:%s:1:100\nquit\n"
- (pdf-info-query--escape pdffile))))
- (unless (= 0 (apply #'call-process
- executable cmdfile (current-buffer)
- nil (when pdf-info-epdfinfo-error-filename
- (list pdf-info-epdfinfo-error-filename))))
- (error "Error running `%s': %s"
- pdf-info-epdfinfo-program
- (buffer-string))))
- (when (file-exists-p cmdfile)
- (delete-file cmdfile))
- (when (file-exists-p pdffile)
- (delete-file pdffile))
- (when (file-exists-p tempdir)
- (delete-directory tempdir t)))))
- (when interactive-p
- (message "The epdfinfo program appears to be working."))
- nil)
-
-(defun pdf-info-process-assert-running (&optional force)
- "Assert a running process.
-
-If it never ran, i.e. `pdf-info-process' is t, start it
-unconditionally.
-
-Otherwise, if FORCE is non-nil start it, if it is not running.
-Else restart it with respect to the variable
-`pdf-info-restart-process-p', which see.
-
-If getting the process to run fails, this function throws an
-error."
- (interactive "P")
- (unless (and (processp (pdf-info-process))
- (eq (process-status (pdf-info-process))
- 'run))
- (when (pdf-info-process)
- (tq-close pdf-info--queue)
- (setq pdf-info--queue nil))
- (unless (or force
- (eq pdf-info--queue t)
- (and (eq pdf-info-restart-process-p 'ask)
- (not noninteractive)
- (y-or-n-p "The epdfinfo server quit, restart it ? "))
- (and pdf-info-restart-process-p
- (not (eq pdf-info-restart-process-p 'ask))))
-
- (when (eq pdf-info-restart-process-p 'ask)
- (setq pdf-info-restart-process-p nil))
- (error "The epdfinfo server quit"))
- (pdf-info-check-epdfinfo)
- (let* ((process-connection-type) ;Avoid 4096 Byte bug #12440.
- (default-directory "~")
- (proc (apply #'start-process
- "epdfinfo" " *epdfinfo*" pdf-info-epdfinfo-program
- (when pdf-info-epdfinfo-error-filename
- (list pdf-info-epdfinfo-error-filename)))))
- (with-current-buffer " *epdfinfo*"
- (erase-buffer))
- (set-process-query-on-exit-flag proc nil)
- (set-process-coding-system proc 'utf-8-unix 'utf-8-unix)
- (setq pdf-info--queue (tq-create proc))))
- pdf-info--queue)
-
-(defadvice tq-process-buffer (around bugfix activate)
- "Fix a bug in trunk where the wrong callback gets called."
- ;; FIXME: Make me iterative.
- (let ((tq (ad-get-arg 0)))
- (if (not (equal (car (process-command (tq-process tq)))
- pdf-info-epdfinfo-program))
- ad-do-it
- (let ((buffer (tq-buffer tq))
- done)
- (when (buffer-live-p buffer)
- (set-buffer buffer)
- (while (and (not done)
- (> (buffer-size) 0))
- (setq done t)
- (if (tq-queue-empty tq)
- (let ((buf (generate-new-buffer "*spurious*")))
- (copy-to-buffer buf (point-min) (point-max))
- (delete-region (point-min) (point))
- (pop-to-buffer buf nil)
- (error "Spurious communication from process %s, see buffer %s"
- (process-name (tq-process tq))
- (buffer-name buf)))
- (goto-char (point-min))
- (when (re-search-forward (tq-queue-head-regexp tq) nil t)
- (setq done nil)
- (let ((answer (buffer-substring (point-min) (point)))
- (fn (tq-queue-head-fn tq))
- (closure (tq-queue-head-closure tq)))
- (delete-region (point-min) (point))
- (tq-queue-pop tq)
- (condition-case-unless-debug err
- (funcall fn closure answer)
- (error
- (message "Error while processing tq callback: %s"
- (error-message-string err)))))))))))))
-
-
-;; * ================================================================== *
-;; * Sending and receiving
-;; * ================================================================== *
-
-(defun pdf-info-query (cmd &rest args)
- "Query the server using CMD and ARGS."
- (pdf-info-process-assert-running)
- (unless (symbolp cmd)
- (setq cmd (intern cmd)))
- (let* ((query (concat (mapconcat 'pdf-info-query--escape
- (cons cmd args) ":") "\n"))
- (callback
- (lambda (closure response)
- (cl-destructuring-bind (status &rest result)
- (pdf-info-query--parse-response cmd response)
- (pdf-info-query--log response)
- (let* (pdf-info-asynchronous)
- (if (functionp closure)
- (funcall closure status result)
- (apply (car closure) status result (cdr closure)))))))
- response status done
- (closure (or pdf-info-asynchronous
- (lambda (s r)
- (setq status s response r done t)))))
- (pdf-info-query--log query t)
- (tq-enqueue
- pdf-info--queue query "^\\.\n" closure callback)
- (unless pdf-info-asynchronous
- (while (and (not done)
- (eq (process-status (pdf-info-process))
- 'run))
- (accept-process-output (pdf-info-process) 0.01))
- (when (and (not done)
- (not (eq (process-status (pdf-info-process))
- 'run))
- (not (eq cmd 'quit)))
- (error "The epdfinfo server quit unexpectedly."))
- (cond
- ((null status) response)
- ((eq status 'error)
- (error "epdfinfo: %s" response))
- ((eq status 'interrupted)
- (error "epdfinfo: Command was interrupted"))
- (t
- (error "internal error: invalid response status"))))))
-
-(defun pdf-info-interrupt ()
- "FIXME: This command does currently nothing."
- (when (and (processp (pdf-info-process))
- (eq (process-status (pdf-info-process))
- 'run))
- (signal-process (pdf-info-process) 'SIGUSR1)))
-
-(defun pdf-info-query--escape (arg)
- "Escape ARG for transmission to the server."
- (if (null arg)
- (string)
- (with-current-buffer (get-buffer-create " *pdf-info-query--escape*")
- (erase-buffer)
- (insert (format "%s" arg))
- (goto-char 1)
- (while (not (eobp))
- (cond
- ((memq (char-after) '(?\\ ?:))
- (insert ?\\))
- ((eq (char-after) ?\n)
- (delete-char 1)
- (insert ?\\ ?n)
- (backward-char)))
- (forward-char))
- (buffer-substring-no-properties 1 (point-max)))))
-
-(defmacro pdf-info-query--read-record ()
- "Read a single record of the response in current buffer."
- `(let (records done (beg (point)))
- (while (not done)
- (cl-case (char-after)
- (?\\
- (delete-char 1)
- (if (not (eq (char-after) ?n))
- (forward-char)
- (delete-char 1)
- (insert ?\n)))
- ((?: ?\n)
- (push (buffer-substring-no-properties
- beg (point)) records)
- (forward-char)
- (setq beg (point)
- done (bolp)))
- (t (forward-char))))
- (nreverse records)))
-
-(defun pdf-info-query--parse-response (cmd response)
- "Parse one epdfinfo RESPONSE to CMD.
-
-Returns a cons \(STATUS . RESULT\), where STATUS is one of nil
-for a regular response, error for an error \(RESULT contains the
-error message\) or interrupted, i.e. the command was
-interrupted."
- (with-current-buffer
- (get-buffer-create " *pdf-info-query--parse-response*")
- (erase-buffer)
- (insert response)
- (goto-char 1)
- (cond
- ((looking-at "ERR\n")
- (forward-line)
- (cons 'error (buffer-substring-no-properties
- (point)
- (progn
- (re-search-forward "^\\.\n")
- (1- (match-beginning 0))))))
- ((looking-at "OK\n")
- (let (result)
- (forward-line)
- (while (not (and (= (char-after) ?.)
- (= (char-after (1+ (point))) ?\n)))
- (push (pdf-info-query--read-record) result))
- (cons nil (pdf-info-query--transform-response
- cmd (nreverse result)))))
- ((looking-at "INT\n")
- (cons 'interrupted nil))
- (t
- (cons 'error "Invalid server response")))))
-
-(defun pdf-info-query--transform-response (cmd response)
- "Transform a RESPONSE to CMD into a Lisp form."
- (cl-case cmd
- (open nil)
- (close (equal "1" (caar response)))
- (number-of-pages (string-to-number (caar response)))
- (charlayout
- (mapcar (lambda (elt)
- (cl-assert (= 1 (length (cadr elt))) t)
- `(,(aref (cadr elt) 0)
- ,(mapcar 'string-to-number
- (split-string (car elt) " " t))))
- response))
- (regexp-flags
- (mapcar (lambda (elt)
- (cons (intern (car elt))
- (string-to-number (cadr elt))))
- response))
- ((search-string search-regexp)
- (mapcar
- (lambda (r)
- `((page . ,(string-to-number (nth 0 r)))
- (text . ,(let (case-fold-search)
- (pdf-util-highlight-regexp-in-string
- (regexp-quote (nth 1 r)) (nth 2 r))))
- (edges . ,(mapcar (lambda (m)
- (mapcar 'string-to-number
- (split-string m " " t)))
- (cddr (cdr r))))))
- response))
- (outline
- (mapcar (lambda (r)
- `((depth . ,(string-to-number (pop r)))
- ,@(pdf-info-query--transform-action r)))
- response))
- (pagelinks
- (mapcar (lambda (r)
- `((edges .
- ,(mapcar 'string-to-number ;area
- (split-string (pop r) " " t)))
- ,@(pdf-info-query--transform-action r)))
- response))
- (metadata
- (let ((md (car response)))
- (if (= 1 (length md))
- (list (cons 'title (car md)))
- (list
- (cons 'title (pop md))
- (cons 'author (pop md))
- (cons 'subject (pop md))
- (cons 'keywords-raw (car md))
- (cons 'keywords (split-string (pop md) "[\t\n ]*,[\t\n ]*" t))
- (cons 'creator (pop md))
- (cons 'producer (pop md))
- (cons 'format (pop md))
- (cons 'created (pop md))
- (cons 'modified (pop md))))))
- (gettext
- (or (caar response) ""))
- (getselection
- (mapcar (lambda (line)
- (mapcar 'string-to-number
- (split-string (car line) " " t)))
- response))
- (features (mapcar 'intern (car response)))
- (pagesize
- (setq response (car response))
- (cons (round (string-to-number (car response)))
- (round (string-to-number (cadr response)))))
- ((getannot editannot addannot)
- (pdf-info-query--transform-annotation (car response)))
- (getannots
- (mapcar 'pdf-info-query--transform-annotation response))
- (getattachments
- (mapcar 'pdf-info-query--transform-attachment response))
- ((getattachment-from-annot)
- (pdf-info-query--transform-attachment (car response)))
- (boundingbox
- (mapcar 'string-to-number (car response)))
- (synctex-forward-search
- (let ((list (mapcar 'string-to-number (car response))))
- `((page . ,(car list))
- (edges . ,(cdr list)))))
- (synctex-backward-search
- `((filename . ,(caar response))
- (line . ,(string-to-number (cadr (car response))))
- (column . ,(string-to-number (cadr (cdar response))))))
- (delannot nil)
- ((save) (caar response))
- ((renderpage renderpage-text-regions renderpage-highlight)
- (pdf-util-munch-file (caar response)))
- ((setoptions getoptions)
- (let (options)
- (dolist (key-value response)
- (let ((key (intern (car key-value)))
- (value (cadr key-value)))
- (cl-case key
- ((:render/printed :render/usecolors)
- (setq value (equal value "1"))))
- (push value options)
- (push key options)))
- options))
- (pagelabels (mapcar 'car response))
- (ping (caar response))
- (t response)))
-
-
-(defun pdf-info-query--transform-action (action)
- "Transform ACTION response into a Lisp form."
- (let ((type (intern (pop action))))
- `((type . ,type)
- (title . ,(pop action))
- ,@(cl-case type
- (goto-dest
- `((page . ,(string-to-number (pop action)))
- (top . ,(and (> (length (car action)) 0)
- (string-to-number (pop action))))))
- (goto-remote
- `((filename . ,(pop action))
- (page . ,(string-to-number (pop action)))
- (top . ,(and (> (length (car action)) 0)
- (string-to-number (pop action))))))
- (t `((uri . ,(pop action))))))))
-
-(defun pdf-info-query--transform-annotation (a)
- (cl-labels ((not-empty (s)
- (if (not (equal s "")) s)))
- (let (a1 a2 a3)
- (cl-destructuring-bind (page edges type id flags color contents modified &rest rest)
- a
- (setq a1 `((page . ,(string-to-number page))
- (edges . ,(mapcar 'string-to-number
- (split-string edges " " t)))
- (type . ,(intern type))
- (id . ,(intern id))
- (flags . ,(string-to-number flags))
- (color . ,(not-empty color))
- (contents . ,contents)
- (modified . ,(pdf-info-parse-pdf-date modified))))
- (when rest
- (cl-destructuring-bind (label subject opacity popup-edges popup-is-open created
- &rest rest)
- rest
- (setq a2
- `((label . ,(not-empty label))
- (subject . ,(not-empty subject))
- (opacity . ,(let ((o (not-empty opacity)))
- (and o (string-to-number o))))
- (popup-edges . ,(let ((p (not-empty popup-edges)))
- (when p
- (mapcar 'string-to-number
- (split-string p " " t)))))
- (popup-is-open . ,(equal popup-is-open "1"))
- (created . ,(pdf-info-parse-pdf-date (not-empty created)))))
- (cond
- ((eq (cdr (assoc 'type a1)) 'text)
- (cl-destructuring-bind (icon state is-open)
- rest
- (setq a3
- `((icon . ,(not-empty icon))
- (state . ,(not-empty state))
- (is-open . ,(equal is-open "1"))))))
- ((memq (cdr (assoc 'type a1))
- '(squiggly highlight underline strike-out))
- (setq a3 `((markup-edges
- . ,(mapcar (lambda (r)
- (mapcar 'string-to-number
- (split-string r " " t)))
- rest)))))))))
- (append a1 a2 a3))))
-
-(defun pdf-info-query--transform-attachment (a)
- (cl-labels ((not-empty (s)
- (if (not (equal s "")) s)))
- (cl-destructuring-bind (id filename description size modified
- created checksum file)
- a
- `((id . ,(intern id))
- (filename . ,(not-empty filename))
- (description . ,(not-empty description))
- (size . ,(let ((n (string-to-number size)))
- (and (>= n 0) n)))
- (modified . ,(not-empty modified))
- (created . ,(not-empty created))
- (checksum . ,(not-empty checksum))
- (file . ,(not-empty file))))))
-
-(defun pdf-info-query--log (string &optional query-p)
- "Log STRING as query/response, depending on QUERY-P.
-
-This is a no-op, if `pdf-info-log' is nil."
- (when pdf-info-log
- (with-current-buffer (get-buffer-create "*pdf-info-log*")
- (buffer-disable-undo)
- (let ((pos (point-max))
- (window (get-buffer-window)))
- (save-excursion
- (goto-char (point-max))
- (unless (bolp)
- (insert ?\n))
- (insert
- (propertize
- (format-time-string "%H:%M:%S ")
- 'face
- (if query-p
- 'font-lock-keyword-face
- 'font-lock-function-name-face))
- (if (and (numberp pdf-info-log-entry-max)
- (> (length string)
- pdf-info-log-entry-max))
- (concat (substring string 0 pdf-info-log-entry-max)
- "...[truncated]\n")
- string)))
- (when (and (window-live-p window)
- (= pos (window-point window)))
- (set-window-point window (point-max)))))))
-
-
-
-;; * ================================================================== *
-;; * Utility functions
-;; * ================================================================== *
-
-(defvar doc-view-buffer-file-name)
-(defvar doc-view--buffer-file-name)
-
-(defun pdf-info--normalize-file-or-buffer (file-or-buffer)
- "Return the PDF file corresponding to FILE-OR-BUFFER.
-
-FILE-OR-BUFFER may be nil, a PDF buffer, the name of a PDF buffer
-or a PDF file."
- (unless file-or-buffer
- (setq file-or-buffer
- (current-buffer)))
- (when (bufferp file-or-buffer)
- (unless (buffer-live-p file-or-buffer)
- (error "Buffer is not live :%s" file-or-buffer))
- (with-current-buffer file-or-buffer
- (unless (setq file-or-buffer
- (cl-case major-mode
- (doc-view-mode
- (cond ((boundp 'doc-view-buffer-file-name)
- doc-view-buffer-file-name)
- ((boundp 'doc-view--buffer-file-name)
- doc-view--buffer-file-name)))
- (pdf-view-mode (pdf-view-buffer-file-name))
- (t (buffer-file-name))))
- (error "Buffer is not associated with any file :%s" (buffer-name)))))
- (unless (stringp file-or-buffer)
- (signal 'wrong-type-argument
- (list 'stringp 'bufferp 'null file-or-buffer)))
- ;; is file
- (when (file-remote-p file-or-buffer)
- (error "Processing remote files not supported :%s"
- file-or-buffer))
- ;; (unless (file-readable-p file-or-buffer)
- ;; (error "File not readable :%s" file-or-buffer))
- (expand-file-name file-or-buffer))
-
-(defun pdf-info-valid-page-spec-p (pages)
- "The type predicate for a valid page-spec."
- (not (not (ignore-errors (pdf-info-normalize-page-range pages)))))
-
-(defun pdf-info-normalize-page-range (pages)
- "Normalize PAGES for sending to the server.
-
-PAGES may be a single page number, a cons \(FIRST . LAST\), or
-nil, which stands for all pages.
-
-The result is a cons \(FIRST . LAST\), where LAST may be 0
-representing the final page."
- (cond
- ((natnump pages)
- (cons pages pages))
- ((null pages)
- (cons 1 0))
- ((and (natnump (car pages))
- (natnump (cdr pages)))
- pages)
- (t
- (signal 'wrong-type-argument
- (list 'pdf-info-valid-page-spec-p pages)))))
-
-(defun pdf-info-parse-pdf-date (date)
- (when (and date
- (string-match pdf-info-pdf-date-regexp date))
- (let ((year (match-string 1 date))
- (month (match-string 2 date))
- (day (match-string 3 date))
- (hour (match-string 4 date))
- (min (match-string 5 date))
- (sec (match-string 6 date))
- (ut-char (match-string 7 date))
- (ut-hour (match-string 8 date))
- (ut-min (match-string 9 date))
- (tz 0))
- (when (or (equal ut-char "+")
- (equal ut-char "-"))
- (when ut-hour
- (setq tz (* 3600 (string-to-number ut-hour))))
- (when ut-min
- (setq tz (+ tz (* 60 (string-to-number ut-min)))))
- (when (equal ut-char "-")
- (setq tz (- tz))))
- (encode-time
- (if sec (string-to-number sec) 0)
- (if min (string-to-number min) 0)
- (if hour (string-to-number hour) 0)
- (if day (string-to-number day) 1)
- (if month (string-to-number month) 1)
- (string-to-number year)
- tz))))
-
-(defmacro pdf-info-compose-queries (let-forms &rest body)
- "Let-bind each VAR to QUERIES results and evaluate BODY.
-
-All queries in each QUERIES form are run by the server in the
-order they appear and the results collected in a list, which is
-bound to VAR. Then BODY is evaluated and its value becomes the
-final result of all queries, unless at least one of them provoked
-an error. In this case BODY is ignored and the error is the
-result.
-
-This macro handles synchronous and asynchronous calls,
-i.e. `pdf-info-asynchronous' is non-nil, transparently.
-
-\(FN \(\(VAR QUERIES\)...\) BODY\)"
- (declare (indent 1)
- (debug ((&rest &or
- (symbolp &optional form)
- symbolp)
- body)))
- (unless (cl-every (lambda (form)
- (when (symbolp form)
- (setq form (list form)))
- (and (consp form)
- (symbolp (car form))
- (listp (cdr form))))
- let-forms)
- (error "Invalid let-form: %s" let-forms))
-
- (setq let-forms (mapcar (lambda (form)
- (if (symbolp form)
- (list form)
- form))
- let-forms))
- (let* ((status (make-symbol "status"))
- (response (make-symbol "response"))
- (first-error (make-symbol "first-error"))
- (done (make-symbol "done"))
- (callback (make-symbol "callback"))
- (results (make-symbol "results"))
- (push-fn (make-symbol "push-fn"))
- (terminal-fn (make-symbol "terminal-fn"))
- (buffer (make-symbol "buffer")))
- `(let* (,status
- ,response ,first-error ,done
- (,buffer (current-buffer))
- (,callback pdf-info-asynchronous)
- ;; Ensure a new alist on every invocation.
- (,results (mapcar 'copy-sequence
- ',(cl-mapcar (lambda (form)
- (list (car form)))
- let-forms)))
- (,push-fn (lambda (status result var)
- ;; Store result in alist RESULTS under key
- ;; VAR.
- (if status
- (unless ,first-error
- (setq ,first-error result))
- (let ((elt (assq var ,results)))
- (setcdr elt (append (cdr elt)
- (list result)))))))
- (,terminal-fn
- (lambda (&rest _)
- ;; Let-bind responses corresponding to their variables,
- ;; i.e. keys in alist RESULTS.
- (let (,@(mapcar (lambda (var)
- (list var (list 'cdr (list 'assq (list 'quote var)
- results))))
- (mapcar 'car let-forms)))
- (setq ,status (not (not ,first-error))
- ,response (or ,first-error
- (with-current-buffer ,buffer
- ,@body))
- ,done t)
- ;; Maybe invoke the CALLBACK (which was bound to
- ;; pdf-info-asynchronous).
- (when ,callback
- (if (functionp ,callback)
- (funcall ,callback ,status ,response)
- (apply (car ,callback)
- ,status ,response (cdr ,callback))))))))
- ;; Wrap each query in an asynchronous call, with its VAR as
- ;; callback argument, so the PUSH-FN can put it in the alist
- ;; RESULTS.
- ,@(mapcar (lambda (form)
- (list 'let (list
- (list 'pdf-info-asynchronous
- (list 'list push-fn (list 'quote (car form)))))
- (cadr form)))
- let-forms)
- ;; Request a no-op, just so we know that we are finished.
- (let ((pdf-info-asynchronous ,terminal-fn))
- (pdf-info-ping))
- ;; CALLBACK is the original value of pdf-info-asynchronous. If
- ;; nil, this is a synchronous query.
- (unless ,callback
- (while (and (not ,done)
- (eq (process-status (pdf-info-process))
- 'run))
- (accept-process-output (pdf-info-process) 0.01))
- (when (and (not ,done)
- (not (eq (process-status (pdf-info-process))
- 'run)))
- (error "The epdfinfo server quit unexpectedly."))
- (when ,status
- (error "epdfinfo: %s" ,response))
- ,response))))
-
-
-;; * ================================================================== *
-;; * Buffer local server instances
-;; * ================================================================== *
-
-(put 'pdf-info--queue 'permanent-local t)
-
-(defun pdf-info-make-local-server (&optional buffer force-restart-p)
- "Create a server instance local to BUFFER.
-
-Does nothing if BUFFER already has a local instance. Unless
-FORCE-RESTART-P is non-nil, then quit a potential process and
-restart it."
- (unless buffer
- (setq buffer (current-buffer)))
- (with-current-buffer buffer
- (unless (and
- (not force-restart-p)
- (local-variable-p 'pdf-info--queue)
- (processp (pdf-info-process))
- (eq (process-status (pdf-info-process))
- 'run))
- (when (and (local-variable-p 'pdf-info--queue)
- (processp (pdf-info-process)))
- (tq-close pdf-info--queue))
- (set (make-local-variable 'pdf-info--queue) nil)
- (pdf-info-process-assert-running t)
- (add-hook 'kill-buffer-hook 'pdf-info-kill-local-server nil t)
- pdf-info--queue)))
-
-(defun pdf-info-kill-local-server (&optional buffer)
- "Kill the local server in BUFFER.
-
-A No-op, if BUFFER has not running server instance."
- (save-current-buffer
- (when buffer
- (set-buffer buffer))
- (when (local-variable-p 'pdf-info--queue)
- (pdf-info-kill)
- (kill-local-variable 'pdf-info--queue)
- t)))
-
-(defun pdf-info-local-server-p (&optional buffer)
- "Return non-nil, if BUFFER has a running server instance."
- (unless buffer
- (setq buffer (current-buffer)))
- (setq buffer (get-buffer buffer))
- (and (buffer-live-p buffer)
- (local-variable-p 'pdf-info--queue buffer)))
-
-(defun pdf-info-local-batch-query (producer-fn
- consumer-fn
- sentinel-fn
- args)
- "Process a set of queries asynchronously in a local instance."
- (unless (pdf-info-local-server-p)
- (error "Create a local server first"))
- (let* ((buffer (current-buffer))
- (producer-symbol (make-symbol "producer"))
- (consumer-symbol (make-symbol "consumer"))
- (producer
- (lambda (args)
- (if (null args)
- (funcall sentinel-fn 'finished buffer)
- (let ((pdf-info-asynchronous
- (apply-partially
- (symbol-function consumer-symbol)
- args)))
- (cond
- ((pdf-info-local-server-p buffer)
- (with-current-buffer buffer
- (apply producer-fn (car args))))
- (t
- (funcall sentinel-fn 'error buffer)))))))
- (consumer (lambda (args status result)
- (if (not (pdf-info-local-server-p buffer))
- (funcall sentinel-fn 'error buffer)
- (with-current-buffer buffer
- (apply consumer-fn status result (car args)))
- (funcall (symbol-function producer-symbol)
- (cdr args))))))
- (fset producer-symbol producer)
- (fset consumer-symbol consumer)
- (funcall producer args)))
-
-
-
-;; * ================================================================== *
-;; * High level interface
-;; * ================================================================== *
-
-(defvar pdf-info-features nil)
-
-(defun pdf-info-features ()
- "Return a list of symbols describing compile-time features."
- (or pdf-info-features
- (setq pdf-info-features
- (let (pdf-info-asynchronous)
- (pdf-info-query 'features)))))
-
-(defun pdf-info-writable-annotations-p ()
- (not (null (memq 'writable-annotations (pdf-info-features)))))
-
-(defun pdf-info-markup-annotations-p ()
- (not (null (memq 'markup-annotations (pdf-info-features)))))
-
-(defmacro pdf-info-assert-writable-annotations ()
- `(unless (memq 'writable-annotations (pdf-info-features))
- (error "Writing annotations is not supported by this version of epdfinfo")))
-
-(defmacro pdf-info-assert-markup-annotations ()
- `(unless (memq 'markup-annotations (pdf-info-features))
- (error "Creating markup annotations is not supported by this version of epdfinfo")))
-
-(defun pdf-info-creatable-annotation-types ()
- (let ((features (pdf-info-features)))
- (cond
- ((not (memq 'writable-annotations features)) nil)
- ((memq 'markup-annotations features)
- (list 'text 'squiggly 'underline 'strike-out 'highlight))
- (t (list 'text)))))
-
-(defun pdf-info-open (&optional file-or-buffer password)
- "Open the document FILE-OR-BUFFER using PASSWORD.
-
-Generally, documents are opened and closed automatically on
-demand, so this function is rarely needed, unless a PASSWORD is
-set on the document.
-
-Manually opened documents are never closed automatically."
-
- (pdf-info-query
- 'open (pdf-info--normalize-file-or-buffer file-or-buffer)
- password))
-
-(defun pdf-info-close (&optional file-or-buffer)
- "Close the document FILE-OR-BUFFER.
-
-Returns t, if the document was actually open, otherwise nil.
-This command is rarely needed, see also `pdf-info-open'."
- (let* ((pdf (pdf-info--normalize-file-or-buffer file-or-buffer))
- (buffer (find-buffer-visiting pdf)))
- (prog1
- (pdf-info-query 'close pdf)
- (if (buffer-live-p buffer)
- (with-current-buffer buffer
- (run-hooks 'pdf-info-close-document-hook))
- (with-temp-buffer
- (run-hooks 'pdf-info-close-document-hook))))))
-
-(defun pdf-info-encrypted-p (&optional file-or-buffer)
- "Return non-nil if FILE-OR-BUFFER requires a password.
-
-Note: This function returns nil, if the document is encrypted,
-but was already opened (presumably using a password)."
-
- (condition-case err
- (pdf-info-open
- (pdf-info--normalize-file-or-buffer file-or-buffer))
- (error (or (string-match-p
- ":Document is encrypted\\'" (cadr err))
- (signal (car err) (cdr err))))))
-
-(defun pdf-info-metadata (&optional file-or-buffer)
- "Extract the metadata from the document FILE-OR-BUFFER.
-
-This returns an alist containing some information about the
-document."
- (pdf-info-query
- 'metadata
- (pdf-info--normalize-file-or-buffer file-or-buffer)))
-
-(defun pdf-info-search-string (string &optional pages file-or-buffer)
- "Search for STRING in PAGES of document FILE-OR-BUFFER.
-
-See `pdf-info-normalize-page-range' for valid PAGES formats.
-
-This function returns a list of matches. Each item is an alist
-containing keys PAGE, TEXT and EDGES, where PAGE and TEXT are the
-matched page resp. line. EDGES is a list containing a single
-edges element \(LEFT TOP RIGHT BOTTOM\). This is for consistency
-with `pdf-info-search-regexp', which may return matches with
-multiple edges.
-
-The TEXT contains `match' face properties on the matched parts.
-
-Search is case-insensitive, unless `case-fold-search' is nil and
-searching case-sensitive is supported by the server."
-
- (let ((pages (pdf-info-normalize-page-range pages)))
- (pdf-info-query
- 'search-string
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- (car pages)
- (cdr pages)
- string
- (if case-fold-search 1 0))))
-
-(defvar pdf-info-regexp-compile-flags nil
- "PCRE compile flags.
-
-Don't use this, but the equally named function.")
-
-(defvar pdf-info-regexp-match-flags nil
- "PCRE match flags.
-
-Don't use this, but the equally named function.")
-
-(defun pdf-info-regexp-compile-flags ()
- (or pdf-info-regexp-compile-flags
- (let* (pdf-info-asynchronous
- (flags (pdf-info-query 'regexp-flags))
- (match (cl-remove-if-not
- (lambda (flag)
- (string-match-p
- "\\`match-" (symbol-name (car flag))))
- flags))
- (compile (cl-set-difference flags match)))
- (setq pdf-info-regexp-compile-flags compile
- pdf-info-regexp-match-flags match)
- pdf-info-regexp-compile-flags)))
-
-(defun pdf-info-regexp-match-flags ()
- (or pdf-info-regexp-match-flags
- (progn
- (pdf-info-regexp-compile-flags)
- pdf-info-regexp-match-flags)))
-
-(defvar pdf-info-regexp-flags '(multiline)
- "Compile- and match-flags for the PCRE engine.
-
-This is a list of symbols denoting compile- and match-flags when
-searching for regular expressions.
-
-You should not change this directly, but rather `let'-bind it
-around a call to `pdf-info-search-regexp'.
-
-Valid compile-flags are:
-
-newline-crlf, newline-lf, newline-cr, dupnames, optimize,
-no-auto-capture, raw, ungreedy, dollar-endonly, anchored,
-extended, dotall, multiline and caseless.
-
-Note that the last one, caseless, is handled special, as it is
-always added if `case-fold-search' is non-nil.
-
-And valid match-flags:
-
-match-anchored, match-notbol, match-noteol, match-notempty,
-match-partial, match-newline-cr, match-newline-lf,
-match-newline-crlf and match-newline-any.
-
-See the glib documentation at url
-`https://developer.gnome.org/glib/stable/glib-Perl-compatible-regular-expressions.html'.")
-
-(defun pdf-info-search-regexp (pcre &optional pages
- no-error
- file-or-buffer)
- "Search for a PCRE on PAGES of document FILE-OR-BUFFER.
-
-See `pdf-info-normalize-page-range' for valid PAGES formats and
-`pdf-info-search-string' for its return value.
-
-Uses the flags in `pdf-info-regexp-flags', which see. If
-`case-fold-search' is non-nil, the caseless flag is added.
-
-If NO-ERROR is non-nil, catch errors due to invalid regexps and
-return nil. If it is the symbol `invalid-regexp', then re-signal
-this kind of error as a `invalid-regexp' error."
-
- (cl-labels ((orflags (flags alist)
- (cl-reduce
- (lambda (v flag)
- (let ((n
- (cdr (assq flag alist))))
- (if n (logior n v) v)))
- (cons 0 flags))))
- (let ((pages (pdf-info-normalize-page-range pages)))
- (condition-case err
- (pdf-info-query
- 'search-regexp
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- (car pages)
- (cdr pages)
- pcre
- (orflags `(,(if case-fold-search
- 'caseless)
- ,@pdf-info-regexp-flags)
- (pdf-info-regexp-compile-flags))
- (orflags pdf-info-regexp-flags
- (pdf-info-regexp-match-flags)))
- (error
- (let ((re
- (concat "\\`epdfinfo: *Invalid *regexp: *"
- ;; glib error
- "\\(?:Error while compiling regular expression"
- " *%s *\\)?\\(.*\\)")))
- (if (or (null no-error)
- (not (string-match
- (format re (regexp-quote pcre))
- (cadr err))))
- (signal (car err) (cdr err))
- (if (eq no-error 'invalid-regexp)
- (signal 'invalid-regexp
- (list (match-string 1 (cadr err))))))))))))
-
-(defun pdf-info-pagelinks (page &optional file-or-buffer)
- "Return a list of links on PAGE in document FILE-OR-BUFFER.
-
-This function returns a list of alists with the following keys.
-EDGES represents the relative bounding-box of the link , TYPE is
-the type of the action, TITLE is a, possibly empty, name for this
-action.
-
-TYPE may be one of
-
-goto-dest -- This is a internal link to some page. Each element
-contains additional keys PAGE and TOP, where PAGE is the page of
-the link and TOP its vertical position.
-
-goto-remote -- This a external link to some document. Same as
-goto-dest, with an additional FILENAME of the external PDF.
-
-uri -- A link in form of some URI. Alist contains additional key
-URI.
-
-In the first two cases, PAGE may be 0 and TOP nil, which means
-these data is unspecified."
- (cl-check-type page natnum)
- (pdf-info-query
- 'pagelinks
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page))
-
-(defun pdf-info-number-of-pages (&optional file-or-buffer)
- "Return the number of pages in document FILE-OR-BUFFER."
- (pdf-info-query 'number-of-pages
- (pdf-info--normalize-file-or-buffer
- file-or-buffer)))
-
-(defun pdf-info-outline (&optional file-or-buffer)
- "Return the PDF outline of document FILE-OR-BUFFER.
-
-This function returns a list of alists like `pdf-info-pagelinks'.
-Additionally every alist has a DEPTH (>= 1) entry with the depth
-of this element in the tree."
-
- (pdf-info-query
- 'outline
- (pdf-info--normalize-file-or-buffer file-or-buffer)))
-
-(defun pdf-info-gettext (page edges &optional selection-style
- file-or-buffer)
- "Get text on PAGE according to EDGES.
-
-EDGES should contain relative coordinates. The selection may
-extend over multiple lines, which works similar to a Emacs
-region. SELECTION-STYLE may be one of glyph, word or line and
-determines the smallest unit of the selected region.
-
-Return the text contained in the selection."
-
- (pdf-info-query
- 'gettext
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page
- (mapconcat 'number-to-string edges " ")
- (cl-case selection-style
- (glyph 0)
- (word 1)
- (line 2)
- (t 0))))
-
-(defun pdf-info-getselection (page edges &optional selection-style
- file-or-buffer)
- "Return the edges of the selection EDGES on PAGE.
-
-Arguments are the same as for `pdf-info-gettext'. Return a list
-of edges corresponding to the text that would be returned by the
-aforementioned function, when called with the same arguments."
-
- (pdf-info-query
- 'getselection
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page
- (mapconcat 'number-to-string edges " ")
- (cl-case selection-style
- (glyph 0)
- (word 1)
- (line 2)
- (t 0))))
-
-(defun pdf-info-textregions (page &optional file-or-buffer)
- "Return a list of edges describing PAGE's text-layout."
- (pdf-info-getselection
- page '(0 0 1 1) 'glyph file-or-buffer))
-
-(defun pdf-info-charlayout (page &optional edges-or-pos file-or-buffer)
- "Return the layout of characters of PAGE in/at EDGES-OR-POS.
-
-Returns a list of elements \(CHAR . \(LEFT TOP RIGHT BOT\)\) mapping
-character to their corresponding relative bounding-boxes.
-
-EDGES-OR-POS may be a region \(LEFT TOP RIGHT BOT\) restricting
-the returned value to include only characters fully contained in
-it. Or a cons \(LEFT . TOP\) which means to only include the
-character at this position. In this case the return value
-contains at most one element."
-
- ;; FIXME: Actually returns \(CHAR . LEFT ...\).
-
- (unless edges-or-pos
- (setq edges-or-pos '(0 0 1 1)))
- (when (numberp (cdr edges-or-pos))
- (setq edges-or-pos (list (car edges-or-pos)
- (cdr edges-or-pos)
- -1 -1)))
- (pdf-info-query
- 'charlayout
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page
- (mapconcat 'number-to-string edges-or-pos " ")))
-
-(defun pdf-info-pagesize (page &optional file-or-buffer)
- "Return the size of PAGE as a cons \(WIDTH . HEIGHT\)
-
-The size is in PDF points."
- (pdf-info-query
- 'pagesize
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page))
-
-(defun pdf-info-running-p ()
- "Return non-nil, if the server is running."
- (and (processp (pdf-info-process))
- (eq (process-status (pdf-info-process))
- 'run)))
-
-(defun pdf-info-quit (&optional timeout)
- "Quit the epdfinfo server.
-
-This blocks until all outstanding requests are answered. Unless
-TIMEOUT is non-nil, in which case we wait at most TIMEOUT seconds
-before killing the server."
- (cl-check-type timeout (or null number))
- (when (pdf-info-running-p)
- (let ((pdf-info-asynchronous
- (if timeout (lambda (&rest _))
- pdf-info-asynchronous)))
- (pdf-info-query 'quit)
- (when timeout
- (setq timeout (+ (float-time) (max 0 timeout)))
- (while (and (pdf-info-running-p)
- (> timeout (float-time)))
- (accept-process-output (pdf-info-process) 0.5 nil t)))))
- (when (processp (pdf-info-process))
- (tq-close pdf-info--queue))
- (setq pdf-info--queue nil))
-
-(defun pdf-info-kill ()
- "Kill the epdfinfo server.
-
-Immediately delete the server process, see also `pdf-info-quit',
-for a more sane way to exit the program."
- (when (processp (pdf-info-process))
- (tq-close pdf-info--queue))
- (setq pdf-info--queue nil))
-
-(defun pdf-info-getannots (&optional pages file-or-buffer)
- "Return the annotations on PAGE.
-
-See `pdf-info-normalize-page-range' for valid PAGES formats.
-
-This function returns the annotations for PAGES as a list of
-alists. Each element of this list describes one annotation and
-contains the following keys.
-
-page - Its page number.
-edges - Its area.
-type - A symbol describing the annotation's type.
-id - A document-wide unique symbol referencing this annotation.
-flags - Its flags, binary encoded.
-color - Its color in standard Emacs notation.
-contents - The text of this annotation.
-modified - The last modification date of this annotation.
-
-Additionally, if the annotation is a markup annotation, the
-following keys are present.
-
-label - The annotation's label.
-subject - The subject addressed.
-opacity - The level of relative opacity.
-popup-edges - The edges of a associated popup window or nil.
-popup-is-open - Whether this window should be displayed open.
-created - The date this markup annotation was created.
-
-If the annotation is also a markup text annotation, the alist
-contains the following keys.
-
-text-icon - A string describing the purpose of this annotation.
-text-state - A string, e.g. accepted or rejected." ;FIXME: Use symbols ?
-
- (let ((pages (pdf-info-normalize-page-range pages)))
- (pdf-info-query
- 'getannots
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- (car pages)
- (cdr pages))))
-
-(defun pdf-info-getannot (id &optional file-or-buffer)
- "Return the annotation for ID.
-
-ID should be a symbol, which was previously returned in a
-`pdf-info-getannots' query. Signal an error, if an annotation
-with ID is not available.
-
-See `pdf-info-getannots' for the kind of return value of this
-function."
- (pdf-info-query
- 'getannot
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- id))
-
-(defun pdf-info-addannot (page edges type &optional file-or-buffer &rest markup-edges)
- "Add a new annotation to PAGE with EDGES of TYPE.
-
-FIXME: TYPE may be one of `text', `markup-highlight', ... .
-FIXME: -1 = 24
-See `pdf-info-getannots' for the kind of value of this function
-returns."
- (pdf-info-assert-writable-annotations)
- (when (consp file-or-buffer)
- (push file-or-buffer markup-edges)
- (setq file-or-buffer nil))
- (apply
- 'pdf-info-query
- 'addannot
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page
- type
- (mapconcat 'number-to-string edges " ")
- (mapcar (lambda (me)
- (mapconcat 'number-to-string me " "))
- markup-edges)))
-
-(defun pdf-info-delannot (id &optional file-or-buffer)
- "Delete the annotation with ID in FILE-OR-BUFFER.
-
-ID should be a symbol, which was previously returned in a
-`pdf-info-getannots' query. Signal an error, if annotation ID
-does not exist."
- (pdf-info-assert-writable-annotations)
- (pdf-info-query
- 'delannot
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- id))
-
-(defun pdf-info-mvannot (id edges &optional file-or-buffer)
- "Move/Resize annotation ID to fit EDGES.
-
-ID should be a symbol, which was previously returned in a
-`pdf-info-getannots' query. Signal an error, if annotation ID
-does not exist.
-
-EDGES should be a list \(LEFT TOP RIGHT BOT\). RIGHT and/or BOT
-may also be negative, which means to keep the width
-resp. height."
- (pdf-info-editannot id `((edges . ,edges)) file-or-buffer))
-
-(defun pdf-info-editannot (id modifications &optional file-or-buffer)
- "Edit annotation ID, applying MODIFICATIONS.
-
-ID should be a symbol, which was previously returned in a
-`pdf-info-getannots' query.
-
-MODIFICATIONS is an alist of properties and their new values.
-
-The server must support modifying annotations for this to work."
-
- (pdf-info-assert-writable-annotations)
- (let ((edits
- (mapcar
- (lambda (elt)
- (cl-case (car elt)
- (color
- (list (car elt)
- (pdf-util-hexcolor (cdr elt))))
- (edges
- (list (car elt)
- (mapconcat 'number-to-string (cdr elt) " ")))
- ((popup-is-open is-open)
- (list (car elt) (if (cdr elt) 1 0)))
- (t
- (list (car elt) (cdr elt)))))
- modifications)))
- (apply 'pdf-info-query
- 'editannot
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- id
- (apply 'append edits))))
-
-(defun pdf-info-save (&optional file-or-buffer)
- "Save FILE-OR-BUFFER.
-
-This saves the document to a new temporary file, which is
-returned and owned by the caller."
- (pdf-info-assert-writable-annotations)
- (pdf-info-query
- 'save
- (pdf-info--normalize-file-or-buffer file-or-buffer)))
-
-(defun pdf-info-getattachment-from-annot (id &optional do-save file-or-buffer)
- "Return the attachment associated with annotation ID.
-
-ID should be a symbol which was previously returned in a
-`pdf-info-getannots' query, and referencing an attachment of type
-`file', otherwise an error is signaled.
-
-See `pdf-info-getattachments' for the kind of return value of this
-function and the meaning of DO-SAVE."
-
- (pdf-info-query
- 'getattachment-from-annot
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- id
- (if do-save 1 0)))
-
-(defun pdf-info-getattachments (&optional do-save file-or-buffer)
- "Return all document level attachments.
-
-If DO-SAVE is non-nil, save the attachments data to a local file,
-which is then owned by the caller, see below.
-
-This function returns a list of alists, where every element
-contains the following keys. All values, except for id, may be
-nil, i.e. not present.
-
-id - A symbol uniquely identifying this attachment.
-filename - The filename of this attachment.
-description - A description of this attachment.
-size - The size in bytes.
-modified - The last modification date.
-created - The date of creation.
-checksum - A MD5 checksum of this attachment's data.
-file - The name of a tempfile containing the data (only present if
- DO-SAVE is non-nil)."
-
- (pdf-info-query
- 'getattachments
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- (if do-save 1 0)))
-
-(defun pdf-info-synctex-forward-search (source &optional line column file-or-buffer)
- "Perform a forward search with synctex.
-
-SOURCE should be a LaTeX buffer or the absolute filename of a
-corresponding file. LINE and COLUMN represent the position in
-the buffer or file. Finally FILE-OR-BUFFER corresponds to the
-PDF document.
-
-Returns an alist with entries PAGE and relative EDGES describing
-the position in the PDF document corresponding to the SOURCE
-location."
-
- (let ((source (if (buffer-live-p (get-buffer source))
- (buffer-file-name (get-buffer source))
- source)))
- (pdf-info-query
- 'synctex-forward-search
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- source
- (or line 1)
- (or column 1))))
-
-(defun pdf-info-synctex-backward-search (page &optional x y file-or-buffer)
- "Perform a backward search with synctex.
-
-Find the source location corresponding to the coordinates
-\(X . Y\) on PAGE in FILE-OR-BUFFER.
-
-Returns an alist with entries FILENAME, LINE and COLUMN."
-
-
- (pdf-info-query
- 'synctex-backward-search
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page
- (or x 0)
- (or y 0)))
-
-(defun pdf-info-renderpage (page width &optional file-or-buffer &rest commands)
- "Render PAGE with width WIDTH.
-
-Return the data of the corresponding PNG image."
- (when (keywordp file-or-buffer)
- (push file-or-buffer commands)
- (setq file-or-buffer nil))
- (apply 'pdf-info-query
- 'renderpage
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page
- (* width (pdf-util-frame-scale-factor))
- (let (transformed)
- (while (cdr commands)
- (let ((kw (pop commands))
- (value (pop commands)))
- (setq value
- (cl-case kw
- ((:crop-to :highlight-line :highlight-region :highlight-text)
- (mapconcat 'number-to-string value " "))
- ((:foreground :background)
- (pdf-util-hexcolor value))
- (:alpha
- (number-to-string value))
- (otherwise value)))
- (push kw transformed)
- (push value transformed)))
- (when commands
- (error "Keyword is missing a value: %s" (car commands)))
- (nreverse transformed))))
-
-(defun pdf-info-renderpage-text-regions (page width single-line-p
- &optional file-or-buffer
- &rest regions)
- "Highlight text on PAGE with width WIDTH using REGIONS.
-
-REGIONS is a list determining foreground and background color and
-the regions to render. So each element should look like \(FG BG
-\(LEFT TOP RIGHT BOT\) \(LEFT TOP RIGHT BOT\) ... \) . The
-rendering is text-aware.
-
-If SINGLE-LINE-P is non-nil, the edges in REGIONS are each
-supposed to be limited to a single line in the document. Setting
-this, if applicable, avoids rendering problems.
-
-For the other args see `pdf-info-renderpage'.
-
-Return the data of the corresponding PNG image."
-
- (when (consp file-or-buffer)
- (push file-or-buffer regions)
- (setq file-or-buffer nil))
-
- (apply 'pdf-info-renderpage
- page width file-or-buffer
- (apply 'append
- (mapcar (lambda (elt)
- `(:foreground ,(pop elt)
- :background ,(pop elt)
- ,@(cl-mapcan (lambda (edges)
- `(,(if single-line-p
- :highlight-line
- :highlight-text)
- ,edges))
- elt)))
- regions))))
-
-(defun pdf-info-renderpage-highlight (page width
- &optional file-or-buffer
- &rest regions)
- "Highlight regions on PAGE with width WIDTH using REGIONS.
-
-REGIONS is a list determining the background color, a alpha value
-and the regions to render. So each element should look like \(FILL-COLOR
-STROKE-COLOR ALPHA \(LEFT TOP RIGHT BOT\) \(LEFT TOP RIGHT BOT\) ... \)
-.
-
-For the other args see `pdf-info-renderpage'.
-
-Return the data of the corresponding PNG image."
-
- (when (consp file-or-buffer)
- (push file-or-buffer regions)
- (setq file-or-buffer nil))
-
- (apply 'pdf-info-renderpage
- page width file-or-buffer
- (apply 'append
- (mapcar (lambda (elt)
- `(:background ,(pop elt)
- :foreground ,(pop elt)
- :alpha ,(pop elt)
- ,@(cl-mapcan (lambda (edges)
- `(:highlight-region ,edges))
- elt)))
- regions))))
-
-(defun pdf-info-boundingbox (page &optional file-or-buffer)
- "Return a bounding-box for PAGE.
-
-Returns a list \(LEFT TOP RIGHT BOT\)."
-
- (pdf-info-query
- 'boundingbox
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- page))
-
-(defun pdf-info-getoptions (&optional file-or-buffer)
- (pdf-info-query
- 'getoptions
- (pdf-info--normalize-file-or-buffer file-or-buffer)))
-
-(defun pdf-info-setoptions (&optional file-or-buffer &rest options)
- (when (symbolp file-or-buffer)
- (push file-or-buffer options)
- (setq file-or-buffer nil))
- (unless (= (% (length options) 2) 0)
- (error "Missing a option value"))
- (apply 'pdf-info-query
- 'setoptions
- (pdf-info--normalize-file-or-buffer file-or-buffer)
- (let (soptions)
- (while options
- (let ((key (pop options))
- (value (pop options)))
- (unless (and (keywordp key)
- (not (eq key :)))
- (error "Keyword expected: %s" key))
- (cl-case key
- ((:render/foreground :render/background)
- (push (pdf-util-hexcolor value)
- soptions))
- ((:render/usecolors :render/printed)
- (push (if value 1 0) soptions))
- (t (push value soptions)))
- (push key soptions)))
- soptions)))
-
-
-
-(defun pdf-info-pagelabels (&optional file-or-buffer)
- "Return a list of pagelabels.
-
-Returns a list of strings corresponding to the labels of the
-pages in FILE-OR-BUFFER."
-
- (pdf-info-query
- 'pagelabels
- (pdf-info--normalize-file-or-buffer file-or-buffer)))
-
-(defun pdf-info-ping (&optional message)
- "Ping the server using MESSAGE.
-
-Returns MESSAGE, which defaults to \"pong\"."
- (pdf-info-query 'ping (or message "pong")))
-
-(provide 'pdf-info)
-
-;;; pdf-info.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-isearch.el b/elpa/pdf-tools-20200512.1524/pdf-isearch.el
deleted file mode 100644
index 563e721..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-isearch.el
+++ /dev/null
@@ -1,831 +0,0 @@
-;;; pdf-isearch.el --- Isearch in pdf buffers. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;;; Todo:
-;;
-;; * Add the possibility to limit the search to a range of pages.
-
-(require 'cl-lib)
-(require 'pdf-util)
-(require 'pdf-info)
-(require 'pdf-misc)
-(require 'pdf-view)
-(require 'pdf-cache)
-(require 'let-alist)
-
-;;; Code:
-
-
-
-;; * ================================================================== *
-;; * Customizations
-;; * ================================================================== *
-
-(defgroup pdf-isearch nil
- "Isearch in pdf buffers."
- :group 'pdf-tools)
-
-(defface pdf-isearch-match
- '((((background dark)) (:inherit isearch))
- (((background light)) (:inherit isearch)))
- "Face used to determine the colors of the current match."
- :group 'pdf-isearch
- :group 'pdf-tools-faces)
-
-(defface pdf-isearch-lazy
- '((((background dark)) (:inherit lazy-highlight))
- (((background light)) (:inherit lazy-highlight)))
- "Face used to determine the colors of non-current matches."
- :group 'pdf-isearch
- :group 'pdf-tools-faces)
-
-(defface pdf-isearch-batch
- '((((background dark)) (:inherit match))
- (((background light)) (:inherit match)))
- "Face used to determine the colors in `pdf-isearch-batch-mode'."
- :group 'pdf-isearch
- :group 'pdf-tools-faces)
-
-(defcustom pdf-isearch-hyphenation-character "-­"
- "Characters used as hyphens when word searching."
- :group 'pdf-isearch
- :type 'string)
-
-(defvar pdf-isearch-search-fun-function nil
- "Search function used when searching.
-
-Like `isearch-search-fun-function', though it should return a
-function \(FN STRING &optional PAGES\), which in turn should
-return a result like `pdf-info-search-regexp'.")
-
-
-;; * ================================================================== *
-;; * Internal Variables
-;; * ================================================================== *
-
-(defvar-local pdf-isearch-current-page nil
- "The page that is currently searched.")
-
-(defvar-local pdf-isearch-current-match nil
- "A list ((LEFT TOP RIGHT BOT) ...) of the current match or nil.
-
-A match may contain more than one edges-element, e.g. when regexp
-searching across multiple lines.")
-
-(defvar-local pdf-isearch-current-matches nil
- "A list of matches of the last search.")
-
-(defvar-local pdf-isearch-current-parameter nil
- "A list of search parameter \(search-string regex-p case-fold word-search\).")
-
-
-;; * ================================================================== *
-;; * Modes
-;; * ================================================================== *
-
-(declare-function pdf-occur "pdf-occur.el")
-(declare-function pdf-sync-backward-search "pdf-sync.el")
-
-(defvar pdf-isearch-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap [remap occur] 'pdf-occur)
- kmap)
- "Keymap used in `pdf-isearch-minor-mode'.")
-
-(defvar pdf-isearch-active-mode-map
- (let ((kmap (make-sparse-keymap)))
- (set-keymap-parent kmap isearch-mode-map)
- (define-key kmap (kbd "C-d") 'pdf-view-dark-minor-mode)
- (define-key kmap (kbd "C-b") 'pdf-isearch-batch-mode)
- (define-key kmap (kbd "M-s o") 'pdf-isearch-occur)
- (define-key kmap (kbd "M-s s") 'pdf-isearch-sync-backward)
- kmap)
- "Keymap used in `pdf-isearch-active-mode'.
-
-This keymap is used, when isearching in PDF buffers. Its parent
-keymap is `isearch-mode-map'.")
-
-(put 'image-scroll-up 'isearch-scroll t)
-(put 'image-scroll-down 'isearch-scroll t)
-
-(define-minor-mode pdf-isearch-active-mode "" nil nil nil
- (cond
- (pdf-isearch-active-mode
- (set (make-local-variable 'isearch-mode-map)
- pdf-isearch-active-mode-map)
- (setq overriding-terminal-local-map
- isearch-mode-map))
- (t
- ;;(setq overriding-terminal-local-map nil) ?
- (kill-local-variable 'isearch-mode-map))))
-
-;;;###autoload
-(define-minor-mode pdf-isearch-minor-mode
- "Isearch mode for PDF buffer.
-
-When this mode is enabled \\[isearch-forward], among other keys,
-starts an incremental search in this PDF document. Since this mode
-uses external programs to highlight found matches via
-image-processing, proceeding to the next match may be slow.
-
-Therefore two isearch behaviours have been defined: Normal isearch and
-batch mode. The later one is a minor mode
-\(`pdf-isearch-batch-mode'\), which when activated inhibits isearch
-from stopping at and highlighting every single match, but rather
-display them batch-wise. Here a batch means a number of matches
-currently visible in the selected window.
-
-The kind of highlighting is determined by three faces
-`pdf-isearch-match' \(for the current match\), `pdf-isearch-lazy'
-\(for all other matches\) and `pdf-isearch-batch' \(when in batch
-mode\), which see.
-
-Colors may also be influenced by the minor-mode
-`pdf-view-dark-minor-mode'. If this is minor mode enabled, each face's
-dark colors, are used (see e.g. `frame-background-mode'), instead
-of the light ones.
-
-\\{pdf-isearch-minor-mode-map}
-While in `isearch-mode' the following keys are available. Note
-that not every isearch command work as expected.
-
-\\{pdf-isearch-active-mode-map}"
- :group 'pdf-isearch
- (pdf-util-assert-pdf-buffer)
- (cond
- (pdf-isearch-minor-mode
- (when (boundp 'character-fold-search)
- (setq-local character-fold-search nil))
- (set (make-local-variable 'isearch-search-fun-function)
- (lambda nil 'pdf-isearch-search-function))
- (set (make-local-variable 'isearch-push-state-function)
- 'pdf-isearch-push-state-function)
- (set (make-local-variable 'isearch-wrap-function)
- 'pdf-isearch-wrap-function)
- (set (make-local-variable 'isearch-lazy-highlight) nil)
- ;; Make our commands work in isearch-mode.
- (set (make-local-variable 'isearch-allow-scroll) t)
- (set (make-local-variable 'search-exit-option)
- ;; This maybe edit or t, but edit would suppress our cmds
- ;; in isearch-other-meta-char.
- (not (not search-exit-option)))
- ;; FIXME: Die Variable imagemagick-render-type entweder an anderer
- ;; Stelle global setzen oder nur irgendwo auf den
- ;; Performancegewinn hinweisen.
- (when (and (boundp 'imagemagick-render-type)
- (= 0 imagemagick-render-type))
- ;; This enormously speeds up rendering.
- (setq imagemagick-render-type 1))
- (add-hook 'isearch-mode-hook 'pdf-isearch-mode-initialize nil t)
- (add-hook 'isearch-mode-end-hook 'pdf-isearch-mode-cleanup nil t)
- (add-hook 'isearch-update-post-hook 'pdf-isearch-update nil t))
- (t
- (when (boundp 'character-fold-search)
- (kill-local-variable 'character-fold-search))
- (kill-local-variable 'search-exit-option)
- (kill-local-variable 'isearch-allow-scroll)
- (kill-local-variable 'isearch-search-fun-function)
- (kill-local-variable 'isearch-push-state-function)
- (kill-local-variable 'isearch-wrap-function)
- (kill-local-variable 'isearch-lazy-highlight)
- (remove-hook 'isearch-update-post-hook 'pdf-isearch-update t)
- (remove-hook 'isearch-mode-hook 'pdf-isearch-mode-initialize t)
- (remove-hook 'isearch-mode-end-hook 'pdf-isearch-mode-cleanup t))))
-
-(define-minor-mode pdf-isearch-batch-mode
- "Isearch PDF documents batch-wise.
-
-If this mode is enabled, isearching does not stop at every match,
-but rather moves to the next one not currently visible. This
-behaviour is much faster than ordinary isearch, since far less
-different images have to be displayed."
- nil nil nil
- :group 'pdf-isearch
- (when isearch-mode
- (pdf-isearch-redisplay)
- (pdf-isearch-message
- (if pdf-isearch-batch-mode "batch mode" "isearch mode"))))
-
-
-
-;; * ================================================================== *
-;; * Isearch interface
-;; * ================================================================== *
-
-(defvar pdf-isearch-filter-matches-function nil
- "A function for filtering isearch matches.
-
-The function receives one argument: a list of matches, each
-being a list of edges. It should return a subset of this list.
-Edge coordinates are in image-space.")
-
-(defvar pdf-isearch-narrow-to-page nil
- "Non-nil, if the search should be limited to the current page.")
-
-(defun pdf-isearch-search-function (string &rest _)
- "Search for STRING in the current PDF buffer.
-
-This is a Isearch interface function."
- (when (> (length string) 0)
- (let ((same-search-p (pdf-isearch-same-search-p))
- (oldpage pdf-isearch-current-page)
- (matches (pdf-isearch-search-page string))
- next-match)
- ;; matches is a list of list of edges ((x0 y1 x1 y2) ...),
- ;; sorted top to bottom ,left to right. Coordinates are in image
- ;; space.
- (unless isearch-forward
- (setq matches (reverse matches)))
- (when pdf-isearch-filter-matches-function
- (setq matches (funcall pdf-isearch-filter-matches-function matches)))
- ;; Where to go next ?
- (setq pdf-isearch-current-page (pdf-view-current-page)
- pdf-isearch-current-matches matches
- next-match
- (pdf-isearch-next-match
- oldpage pdf-isearch-current-page
- pdf-isearch-current-match matches
- same-search-p
- isearch-forward)
- pdf-isearch-current-parameter
- (list string isearch-regexp
- isearch-case-fold-search isearch-word))
- (cond
- (next-match
- (setq pdf-isearch-current-match next-match)
- (pdf-isearch-hl-matches next-match matches)
- (pdf-isearch-focus-match next-match)
- ;; Don't get off track.
- (when (or (and (bobp) (not isearch-forward))
- (and (eobp) isearch-forward))
- (goto-char (1+ (/ (buffer-size) 2))))
- ;; Signal success to isearch.
- (if isearch-forward
- (re-search-forward ".")
- (re-search-backward ".")))
- ((and (not pdf-isearch-narrow-to-page)
- (not (pdf-isearch-empty-match-p matches)))
- (let ((next-page (pdf-isearch-find-next-matching-page
- string pdf-isearch-current-page t)))
- (when next-page
- (pdf-view-goto-page next-page)
- (pdf-isearch-search-function string))))))))
-
-(defun pdf-isearch-push-state-function ()
- "Push the current search state.
-
-This is a Isearch interface function."
- (let ((hscroll (window-hscroll))
- (vscroll (window-vscroll))
- (parms pdf-isearch-current-parameter)
- (matches pdf-isearch-current-matches)
- (match pdf-isearch-current-match)
- (page pdf-isearch-current-page))
- (lambda (_state)
- (setq pdf-isearch-current-parameter parms
- pdf-isearch-current-matches matches
- pdf-isearch-current-match match
- pdf-isearch-current-page page)
-
- (pdf-view-goto-page pdf-isearch-current-page)
- (when pdf-isearch-current-match
- (pdf-isearch-hl-matches
- pdf-isearch-current-match
- pdf-isearch-current-matches))
- (image-set-window-hscroll hscroll)
- (image-set-window-vscroll vscroll))))
-
-(defun pdf-isearch-wrap-function ()
- "Go to first or last page.
-
-This is a Isearch interface function."
- (let ((page (if isearch-forward
- 1
- (pdf-cache-number-of-pages))))
- (unless (or pdf-isearch-narrow-to-page
- (= page (pdf-view-current-page)))
- (pdf-view-goto-page page)
- (let ((next-screen-context-lines 0))
- (if (= page 1)
- (image-scroll-down)
- (image-scroll-up)))))
- (setq pdf-isearch-current-match nil))
-
-(defun pdf-isearch-mode-cleanup ()
- "Cleanup after exiting Isearch.
-
-This is a Isearch interface function."
- (pdf-isearch-active-mode -1)
- (pdf-view-redisplay))
-
-(defun pdf-isearch-mode-initialize ()
- "Initialize isearching.
-
-This is a Isearch interface function."
- (pdf-isearch-active-mode 1)
- (setq pdf-isearch-current-page (pdf-view-current-page)
- pdf-isearch-current-match nil
- pdf-isearch-current-matches nil
- pdf-isearch-current-parameter nil)
- (goto-char (1+ (/ (buffer-size) 2))))
-
-(defun pdf-isearch-same-search-p (&optional ignore-search-string-p)
- "Return non-nil, if search parameter have not changed.
-
-Parameter inspected are `isearch-string' (unless
-IGNORE-SEARCH-STRING-P is t) and `isearch-case-fold-search'. If
-there was no previous search, this function returns t."
- (or (null pdf-isearch-current-parameter)
- (let ((parameter (list isearch-string
- isearch-regexp
- isearch-case-fold-search
- isearch-word)))
- (if ignore-search-string-p
- (equal (cdr pdf-isearch-current-parameter)
- (cdr parameter))
- (equal pdf-isearch-current-parameter
- parameter)))))
-
-(defun pdf-isearch-next-match (last-page this-page last-match
- all-matches continued-p
- forward-p)
- "Determine the next match."
- (funcall (if pdf-isearch-batch-mode
- 'pdf-isearch-next-match-batch
- 'pdf-isearch-next-match-isearch)
- last-page this-page last-match
- all-matches continued-p forward-p))
-
-(defun pdf-isearch-focus-match (current-match)
- "Make the CURRENT-MATCH visible in the window."
- (funcall (if pdf-isearch-batch-mode
- 'pdf-isearch-focus-match-batch
- 'pdf-isearch-focus-match-isearch)
- current-match))
-
-(defun pdf-isearch-redisplay ()
- "Redisplay the current highlighting."
- (pdf-isearch-hl-matches pdf-isearch-current-match
- pdf-isearch-current-matches))
-
-(defun pdf-isearch-update ()
- "Update search and redisplay, if necessary."
- (unless (pdf-isearch-same-search-p t)
- (setq pdf-isearch-current-parameter
- (list isearch-string isearch-regexp
- isearch-case-fold-search isearch-word)
- pdf-isearch-current-matches
- (pdf-isearch-search-page isearch-string))
- (pdf-isearch-redisplay)))
-
-(defun pdf-isearch-message (fmt &rest args)
- "Like `message', but Isearch friendly."
- (unless args (setq args (list fmt) fmt "%s"))
- (let ((msg (apply 'format fmt args)))
- (if (cl-some (lambda (buf)
- (buffer-local-value 'isearch-mode buf))
- (mapcar 'window-buffer (window-list)))
- (let ((isearch-message-suffix-add
- (format " [%s]" msg)))
- (isearch-message)
- (sit-for 1))
- (message "%s" msg))))
-
-(defun pdf-isearch-empty-match-p (matches)
- (and matches
- (cl-every
- (lambda (match)
- (cl-every (lambda (edges)
- (cl-every 'zerop edges))
- match))
- matches)))
-
-(defun pdf-isearch-occur ()
- "Run `occur' using the last search string or regexp."
- (interactive)
- (let ((case-fold-search isearch-case-fold-search)
- (regexp
- (cond
- ((functionp isearch-word)
- (funcall isearch-word isearch-string))
- (isearch-word (pdf-isearch-word-search-regexp
- isearch-string nil
- pdf-isearch-hyphenation-character))
- (isearch-regexp isearch-string))))
- (save-selected-window
- (pdf-occur (or regexp isearch-string) regexp))
- (isearch-message)))
-
-(defun pdf-isearch-sync-backward ()
- "Visit the source of the beginning of the current match."
- (interactive)
- (pdf-util-assert-pdf-window)
- (unless pdf-isearch-current-match
- (user-error "No current or recent match"))
- (when isearch-mode
- (isearch-exit))
- (cl-destructuring-bind (left top _right _bot)
- (car pdf-isearch-current-match)
- (pdf-sync-backward-search left top)))
-
-
-;; * ================================================================== *
-;; * Interface to epdfinfo
-;; * ================================================================== *
-
-(defun pdf-isearch-search-page (string &optional page)
- "Search STRING on PAGE in the current window.
-
-Returns a list of edges (LEFT TOP RIGHT BOTTOM) in PDF
-coordinates, sorted top to bottom, then left to right."
-
- (unless page (setq page (pdf-view-current-page)))
- (mapcar (lambda (match)
- (let-alist match
- (pdf-util-scale-relative-to-pixel .edges 'round)))
- (let ((case-fold-search isearch-case-fold-search))
- (funcall (pdf-isearch-search-fun)
- string page))))
-
-(defun pdf-isearch-search-fun ()
- (funcall (or pdf-isearch-search-fun-function
- 'pdf-isearch-search-fun-default)))
-
-(defun pdf-isearch-search-fun-default ()
- "Return default functions to use for the search."
- (cond
- ((eq isearch-word t)
- (lambda (string &optional pages)
- ;; Use lax versions to not fail at the end of the word while
- ;; the user adds and removes characters in the search string
- ;; (or when using nonincremental word isearch)
- (let ((lax (not (or isearch-nonincremental
- (null (car isearch-cmds))
- (eq (length isearch-string)
- (length (isearch--state-string
- (car isearch-cmds))))))))
- (pdf-info-search-regexp
- (pdf-isearch-word-search-regexp
- string lax pdf-isearch-hyphenation-character)
- pages 'invalid-regexp))))
- (isearch-regexp
- (lambda (string &optional pages)
- (pdf-info-search-regexp string pages 'invalid-regexp)))
- (t
- 'pdf-info-search-string)))
-
-
-(defun pdf-isearch-word-search-regexp (string &optional lax hyphenization-chars)
- "Return a PCRE which matches words, ignoring punctuation."
- (let ((hyphenization-regexp
- (and hyphenization-chars
- (format "(?:[%s]\\n)?"
- (replace-regexp-in-string
- "[]^\\\\-]" "\\\\\\&"
- hyphenization-chars t)))))
- (cond
- ((equal string "") "")
- ((string-match-p "\\`\\W+\\'" string) "\\W+")
- (t (concat
- (if (string-match-p "\\`\\W" string) "\\W+"
- (unless lax "\\b"))
- (mapconcat (lambda (word)
- (if hyphenization-regexp
- (mapconcat
- (lambda (ch)
- (pdf-util-pcre-quote (string ch)))
- (append word nil)
- hyphenization-regexp)
- (pdf-util-pcre-quote word)))
- (split-string string "\\W+" t) "\\W+")
- (if (string-match-p "\\W\\'" string) "\\W+"
- (unless lax "\\b")))))))
-
-(defun pdf-isearch-find-next-matching-page (string page &optional interactive-p)
- "Find STRING after or before page PAGE, according to FORWARD-P.
-
-If INTERACTIVE-P is non-nil, give some progress feedback.
-Returns the page number where STRING was found, or nil if there
-is no such page."
- ;; Do a exponentially expanding search.
- (let* ((incr 1)
- (pages (if isearch-forward
- (cons (1+ page)
- (1+ page))
- (cons (1- page)
- (1- page))))
- (fn (pdf-isearch-search-fun))
- matched-page
- reporter)
-
- (while (and (null matched-page)
- (or (and isearch-forward
- (<= (car pages)
- (pdf-cache-number-of-pages)))
- (and (not isearch-forward)
- (>= (cdr pages) 1))))
- (let* ((case-fold-search isearch-case-fold-search)
- (matches (funcall fn string pages)))
- (setq matched-page
- (alist-get 'page (if isearch-forward
- (car matches)
- (car (last matches))))))
- (setq incr (* incr 2))
- (cond (isearch-forward
- (setcar pages (1+ (cdr pages)))
- (setcdr pages (min (pdf-cache-number-of-pages)
- (+ (cdr pages) incr))))
- (t
- (setcdr pages (1- (car pages)))
- (setcar pages (max 1 (- (car pages)
- incr)))))
- (when interactive-p
- (when (and (not reporter)
- (= incr 8)) ;;Don't bother right away.
- (setq reporter
- (apply
- 'make-progress-reporter "Searching"
- (if isearch-forward
- (list (car pages) (pdf-cache-number-of-pages) nil 0)
- (list 1 (cdr pages) nil 0)))))
- (when reporter
- (progress-reporter-update
- reporter (if isearch-forward
- (- (cdr pages) page)
- (- page (car pages)))))))
- matched-page))
-
-
-
-;; * ================================================================== *
-;; * Isearch Behavior
-;; * ================================================================== *
-
-(defun pdf-isearch-next-match-isearch (last-page this-page last-match
- matches same-search-p
- forward)
- "Default function for choosing the next match.
-
-Implements default isearch behaviour, i.e. it stops at every
-match."
- (cond
- ((null last-match)
- ;; Goto first match from top or bottom of the window.
- (let* ((iedges (pdf-util-image-displayed-edges))
- (pos (pdf-util-with-edges (iedges)
- (if forward
- (list iedges-left iedges-top
- iedges-left iedges-top)
- (list iedges-right iedges-bot
- iedges-right iedges-bot)))))
- (pdf-isearch-closest-match (list pos) matches forward)))
- ((not (eq last-page this-page))
- ;; First match from top-left or bottom-right of the new
- ;; page.
- (car matches))
- (same-search-p
- ;; Next match after the last one.
- (if last-match
- (cadr (member last-match matches))))
- (matches
- ;; Next match of new search closest to the last one.
- (pdf-isearch-closest-match
- last-match matches forward))))
-
-(defun pdf-isearch-focus-match-isearch (match)
- "Make the image area in MATCH visible in the selected window."
- (pdf-util-scroll-to-edges (apply 'pdf-util-edges-union match)))
-
-(defun pdf-isearch-next-match-batch (last-page this-page last-match
- matches same-search-p
- forward-p)
- "Select the next match, unseen in the current search direction."
-
- (if (or (null last-match)
- (not same-search-p)
- (not (eq last-page this-page)))
- (pdf-isearch-next-match-isearch
- last-page this-page last-match matches same-search-p forward-p)
- (pdf-util-with-edges (match iedges)
- (let ((iedges (pdf-util-image-displayed-edges)))
- (car (cl-remove-if
- ;; Filter matches visible on screen.
- (lambda (edges)
- (let ((match (apply 'pdf-util-edges-union edges)))
- (and (<= match-right iedges-right)
- (<= match-bot iedges-bot)
- (>= match-left iedges-left)
- (>= match-top iedges-top))))
- (cdr (member last-match matches))))))))
-
-(defun pdf-isearch-focus-match-batch (match)
- "Make the image area in MATCH eagerly visible in the selected window."
- (pdf-util-scroll-to-edges (apply 'pdf-util-edges-union match) t))
-
-(cl-deftype pdf-isearch-match ()
- `(satisfies
- (lambda (match)
- (cl-every (lambda (edges)
- (and (consp edges)
- (= (length edges) 4)
- (cl-every 'numberp edges)))
- match))))
-
-(cl-deftype list-of (type)
- `(satisfies
- (lambda (l)
- (and (listp l)
- (cl-every (lambda (x)
- (cl-typep x ',type))
- l)))))
-
-(defun pdf-isearch-closest-match (match matches
- &optional forward-p)
- "Find the nearest element to MATCH in MATCHES.
-
-The direction in which to look is determined by FORWARD-P.
-
-MATCH should be a list of edges, MATCHES a list of such element;
-it is assumed to be ordered with respect to FORWARD-P."
-
-
- (cl-check-type match pdf-isearch-match)
- (cl-check-type matches (list-of pdf-isearch-match))
- (let ((matched (apply 'pdf-util-edges-union match)))
- (pdf-util-with-edges (matched)
- (cl-loop for next in matches do
- (let ((edges (apply 'pdf-util-edges-union next)))
- (pdf-util-with-edges (edges)
- (when (if forward-p
- (or (>= edges-top matched-bot)
- (and (or (>= edges-top matched-top)
- (>= edges-bot matched-bot))
- (>= edges-right matched-right)))
- (or (<= edges-bot matched-top)
- (and (or (<= edges-bot matched-bot)
- (<= edges-top matched-top))
- (<= edges-left matched-left))))
- (cl-return next))))))))
-
-
-
-;; * ================================================================== *
-;; * Display
-;; * ================================================================== *
-
-
-(defun pdf-isearch-current-colors ()
- "Return the current color set.
-
-The return value depends on `pdf-view-dark-minor-mode' and
-`pdf-isearch-batch-mode'. It is a list of four colors \(MATCH-FG
-MATCH-BG LAZY-FG LAZY-BG\)."
- (let ((dark-p pdf-view-dark-minor-mode))
- (cond
- (pdf-isearch-batch-mode
- (let ((colors (pdf-util-face-colors 'pdf-isearch-batch dark-p)))
- (list (car colors)
- (cdr colors)
- (car colors)
- (cdr colors))))
- (t
- (let ((match (pdf-util-face-colors 'pdf-isearch-match dark-p))
- (lazy (pdf-util-face-colors 'pdf-isearch-lazy dark-p)))
- (list (car match)
- (cdr match)
- (car lazy)
- (cdr lazy)))))))
-
-(defvar pdf-isearch--hl-matches-tick 0)
-
-(defun pdf-isearch-hl-matches (current matches &optional occur-hack-p)
- "Highlighting edges CURRENT and MATCHES."
- (cl-check-type current pdf-isearch-match)
- (cl-check-type matches (list-of pdf-isearch-match))
- (cl-destructuring-bind (fg1 bg1 fg2 bg2)
- (pdf-isearch-current-colors)
- (let* ((width (car (pdf-view-image-size)))
- (page (pdf-view-current-page))
- (window (selected-window))
- (buffer (current-buffer))
- (tick (cl-incf pdf-isearch--hl-matches-tick))
- (pdf-info-asynchronous
- (lambda (status data)
- (when (and (null status)
- (eq tick pdf-isearch--hl-matches-tick)
- (buffer-live-p buffer)
- (window-live-p window)
- (eq (window-buffer window)
- buffer))
- (with-selected-window window
- (when (and (derived-mode-p 'pdf-view-mode)
- (or isearch-mode
- occur-hack-p)
- (eq page (pdf-view-current-page)))
- (pdf-view-display-image
- (pdf-view-create-image data))))))))
- (pdf-info-renderpage-text-regions
- page width t nil
- `(,fg1 ,bg1 ,@(pdf-util-scale-pixel-to-relative
- current))
- `(,fg2 ,bg2 ,@(pdf-util-scale-pixel-to-relative
- (apply 'append
- (remove current matches))))))))
-
-
-;; * ================================================================== *
-;; * Debug
-;; * ================================================================== *
-
-;; The following isearch-search function is debuggable.
-;;
-(when nil
- (defun isearch-search ()
- ;; Do the search with the current search string.
- (if isearch-message-function
- (funcall isearch-message-function nil t)
- (isearch-message nil t))
- (if (and (eq isearch-case-fold-search t) search-upper-case)
- (setq isearch-case-fold-search
- (isearch-no-upper-case-p isearch-string isearch-regexp)))
- (condition-case lossage
- (let ((inhibit-point-motion-hooks
- ;; FIXME: equality comparisons on functions is asking for trouble.
- (and (eq isearch-filter-predicate 'isearch-filter-visible)
- search-invisible))
- (inhibit-quit nil)
- (case-fold-search isearch-case-fold-search)
- (retry t))
- (setq isearch-error nil)
- (while retry
- (setq isearch-success
- (isearch-search-string isearch-string nil t))
- ;; Clear RETRY unless the search predicate says
- ;; to skip this search hit.
- (if (or (not isearch-success)
- (bobp) (eobp)
- (= (match-beginning 0) (match-end 0))
- (funcall isearch-filter-predicate
- (match-beginning 0) (match-end 0)))
- (setq retry nil)))
- (setq isearch-just-started nil)
- (if isearch-success
- (setq isearch-other-end
- (if isearch-forward (match-beginning 0) (match-end 0)))))
-
- (quit (isearch-unread ?\C-g)
- (setq isearch-success nil))
-
- (invalid-regexp
- (setq isearch-error (car (cdr lossage)))
- (if (string-match
- "\\`Premature \\|\\`Unmatched \\|\\`Invalid "
- isearch-error)
- (setq isearch-error "incomplete input")))
-
- (search-failed
- (setq isearch-success nil)
- (setq isearch-error (nth 2 lossage)))
-
- ;; (error
- ;; ;; stack overflow in regexp search.
- ;; (setq isearch-error (format "%s" lossage)))
- )
-
- (if isearch-success
- nil
- ;; Ding if failed this time after succeeding last time.
- (and (isearch--state-success (car isearch-cmds))
- (ding))
- (if (functionp (isearch--state-pop-fun (car isearch-cmds)))
- (funcall (isearch--state-pop-fun (car isearch-cmds))
- (car isearch-cmds)))
- (goto-char (isearch--state-point (car isearch-cmds))))))
-
-
-(provide 'pdf-isearch)
-
-;;; pdf-isearch.el ends here
-
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
diff --git a/elpa/pdf-tools-20200512.1524/pdf-links.el b/elpa/pdf-tools-20200512.1524/pdf-links.el
deleted file mode 100644
index 24baa3c..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-links.el
+++ /dev/null
@@ -1,376 +0,0 @@
-;;; pdf-links.el --- Handle PDF links. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-
-(require 'pdf-info)
-(require 'pdf-util)
-(require 'pdf-misc)
-(require 'pdf-cache)
-(require 'pdf-isearch)
-(require 'let-alist)
-(require 'org)
-
-;;; Code:
-
-
-
-;; * ================================================================== *
-;; * Customizations
-;; * ================================================================== *
-
-(defgroup pdf-links nil
- "Following links in PDF documents."
- :group 'pdf-tools)
-
-(defface pdf-links-read-link
- '((((background dark)) (:background "red" :foreground "yellow"))
- (((background light)) (:background "red" :foreground "yellow")))
- "Face used to determine the colors when reading links."
- ;; :group 'pdf-links
- :group 'pdf-tools-faces)
-
-(defcustom pdf-links-read-link-convert-commands
- '(;;"-font" "FreeMono"
- "-pointsize" "%P"
- "-undercolor" "%f"
- "-fill" "%b"
- "-draw" "text %X,%Y '%c'")
-
- "The commands for the convert program, when decorating links for reading.
-See `pdf-util-convert' for an explanation of the format.
-
-Aside from the description there, two additional escape chars are
-available.
-
-%P -- The scaled font pointsize, i.e. IMAGE-WIDTH * SCALE (See
- `pdf-links-convert-pointsize-scale').
-%c -- String describing the current link key (e.g. AA, AB,
- etc.)."
- :group 'pdf-links
- :type '(repeat string)
- :link '(variable-link pdf-isearch-convert-commands)
- :link '(url-link "http://www.imagemagick.org/script/convert.php"))
-
-(defcustom pdf-links-convert-pointsize-scale 0.01
- "The scale factor for the -pointsize convert command.
-
-This determines the relative size of the font, when interactively
-reading links."
- :group 'pdf-links
- :type '(restricted-sexp :match-alternatives
- ((lambda (x) (and (numberp x)
- (<= x 1)
- (>= x 0))))))
-
-(defcustom pdf-links-browse-uri-function
- 'pdf-links-browse-uri-default
- "The function for handling uri links.
-
-This function should accept one argument, the URI to follow, and
-do something with it."
- :group 'pdf-links
- :type 'function)
-
-
-;; * ================================================================== *
-;; * Minor Mode
-;; * ================================================================== *
-
-(defvar pdf-links-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap (kbd "f") 'pdf-links-isearch-link)
- (define-key kmap (kbd "F") 'pdf-links-action-perform)
- kmap))
-
-;;;###autoload
-(define-minor-mode pdf-links-minor-mode
- "Handle links in PDF documents.\\<pdf-links-minor-mode-map>
-
-If this mode is enabled, most links in the document may be
-activated by clicking on them or by pressing \\[pdf-links-action-perform] and selecting
-one of the displayed keys, or by using isearch limited to
-links via \\[pdf-links-isearch-link].
-
-\\{pdf-links-minor-mode-map}"
-
- nil nil nil
- :group 'pdf-links
- (pdf-util-assert-pdf-buffer)
- (cond
- (pdf-links-minor-mode
- (pdf-view-add-hotspot-function 'pdf-links-hotspots-function 0))
- (t
- (pdf-view-remove-hotspot-function 'pdf-links-hotspots-function)))
- (pdf-view-redisplay t))
-
-(defun pdf-links-hotspots-function (page size)
- "Create hotspots for links on PAGE using SIZE."
-
- (let ((links (pdf-cache-pagelinks page))
- (id-fmt "link-%d-%d")
- (i 0)
- (pointer 'hand)
- hotspots)
- (dolist (l links)
- (let ((e (pdf-util-scale
- (cdr (assq 'edges l)) size 'round))
- (id (intern (format id-fmt page
- (cl-incf i)))))
- (push `((rect . ((,(nth 0 e) . ,(nth 1 e))
- . (,(nth 2 e) . ,(nth 3 e))))
- ,id
- (pointer
- ,pointer
- help-echo ,(pdf-links-action-to-string l)))
- hotspots)
- (local-set-key
- (vector id 'mouse-1)
- (lambda nil
- (interactive "@")
- (pdf-links-action-perform l)))
- (local-set-key
- (vector id t)
- 'pdf-util-image-map-mouse-event-proxy)))
- (nreverse hotspots)))
-
-(defun pdf-links-action-to-string (link)
- "Return a string representation of ACTION."
- (let-alist link
- (concat
- (cl-case .type
- (goto-dest
- (if (> .page 0)
- (format "Goto page %d" .page)
- "Destination not found"))
- (goto-remote
- (if (and .filename (file-exists-p .filename))
- (format "Goto %sfile '%s'"
- (if (> .page 0)
- (format "p.%d of " .page)
- "")
- .filename)
- (format "Link to nonexistent file '%s'" .filename)))
- (uri
- (if (> (length .uri) 0)
- (format "Link to uri '%s'" .uri)
- (format "Link to empty uri")))
- (t (format "Unrecognized link type: %s" .type)))
- (if (> (length .title) 0)
- (format " (%s)" .title)))))
-
-;;;###autoload
-(defun pdf-links-action-perform (link)
- "Follow LINK, depending on its type.
-
-This may turn to another page, switch to another PDF buffer or
-invoke `pdf-links-browse-uri-function'.
-
-Interactively, link is read via `pdf-links-read-link-action'.
-This function displays characters around the links in the current
-page and starts reading characters (ignoring case). After a
-sufficient number of characters have been read, the corresponding
-link's link is invoked. Additionally, SPC may be used to
-scroll the current page."
- (interactive
- (list (or (pdf-links-read-link-action "Activate link (SPC scrolls): ")
- (error "No link selected"))))
- (let-alist link
- (cl-case .type
- ((goto-dest goto-remote)
- (let ((window (selected-window)))
- (cl-case .type
- (goto-dest
- (unless (> .page 0)
- (error "Link points to nowhere")))
- (goto-remote
- (unless (and .filename (file-exists-p .filename))
- (error "Link points to nonexistent file %s" .filename))
- (setq window (display-buffer
- (or (find-buffer-visiting .filename)
- (find-file-noselect .filename))))))
- (with-selected-window window
- (when (derived-mode-p 'pdf-view-mode)
- (when (> .page 0)
- (pdf-view-goto-page .page))
- (when .top
- ;; Showing the tooltip delays displaying the page for
- ;; some reason (sit-for/redisplay don't help), do it
- ;; later.
- (run-with-idle-timer 0.001 nil
- (lambda ()
- (when (window-live-p window)
- (with-selected-window window
- (when (derived-mode-p 'pdf-view-mode)
- (pdf-util-tooltip-arrow .top)))))))))))
- (uri
- (funcall pdf-links-browse-uri-function .uri))
- (t
- (error "Unrecognized link type: %s" .type)))
- nil))
-
-(defun pdf-links-read-link-action (prompt)
- "Using PROMPT, interactively read a link-action.
-
-See `pdf-links-action-perform' for the interface."
-
- (pdf-util-assert-pdf-window)
- (let* ((links (pdf-cache-pagelinks
- (pdf-view-current-page)))
- (keys (pdf-links-read-link-action--create-keys
- (length links)))
- (key-strings (mapcar (apply-partially 'apply 'string)
- keys))
- (alist (cl-mapcar 'cons keys links))
- (size (pdf-view-image-size))
- (colors (pdf-util-face-colors
- 'pdf-links-read-link pdf-view-dark-minor-mode))
- (args (list
- :foreground (car colors)
- :background (cdr colors)
- :formats
- `((?c . ,(lambda (_edges) (pop key-strings)))
- (?P . ,(number-to-string
- (max 1 (* (cdr size)
- pdf-links-convert-pointsize-scale)))))
- :commands pdf-links-read-link-convert-commands
- :apply (pdf-util-scale-relative-to-pixel
- (mapcar (lambda (l) (cdr (assq 'edges l)))
- links)))))
- (unless links
- (error "No links on this page"))
- (unwind-protect
- (let ((image-data
- (pdf-cache-get-image
- (pdf-view-current-page)
- (car size) (car size) 'pdf-links-read-link-action)))
- (unless image-data
- (setq image-data (apply 'pdf-util-convert-page args ))
- (pdf-cache-put-image
- (pdf-view-current-page)
- (car size) image-data 'pdf-links-read-link-action))
- (pdf-view-display-image
- (create-image image-data (pdf-view-image-type) t))
- (pdf-links-read-link-action--read-chars prompt alist))
- (pdf-view-redisplay))))
-
-(defun pdf-links-read-link-action--read-chars (prompt alist)
- (catch 'done
- (let (key)
- (while t
- (let* ((chars (append (mapcar 'caar alist)
- (mapcar 'downcase (mapcar 'caar alist))
- (list ?\s)))
- (ch (read-char-choice prompt chars)))
- (setq ch (upcase ch))
- (cond
- ((= ch ?\s)
- (when (= (window-vscroll) (image-scroll-up))
- (image-scroll-down (window-vscroll))))
- (t
- (setq alist (delq nil (mapcar (lambda (elt)
- (and (eq ch (caar elt))
- (cons (cdar elt)
- (cdr elt))))
- alist))
- key (append key (list ch))
- prompt (concat prompt (list ch)))
- (when (= (length alist) 1)
- (message nil)
- (throw 'done (cdar alist))))))))))
-
-(defun pdf-links-read-link-action--create-keys (n)
- (when (> n 0)
- (let ((len (1+ (floor (log n 26))))
- keys)
- (dotimes (i n)
- (let (key)
- (dotimes (_x len)
- (push (+ (% i 26) ?A) key)
- (setq i (/ i 26)))
- (push key keys)))
- (nreverse keys))))
-
-(defun pdf-links-isearch-link ()
- (interactive)
- (let* (quit-p
- (isearch-mode-end-hook
- (cons (lambda nil
- (setq quit-p isearch-mode-end-hook-quit))
- isearch-mode-end-hook))
- (pdf-isearch-filter-matches-function
- 'pdf-links-isearch-link-filter-matches)
- (pdf-isearch-narrow-to-page t)
- (isearch-message-prefix-add "(Links)")
- pdf-isearch-batch-mode)
- (isearch-forward)
- (unless (or quit-p (null pdf-isearch-current-match))
- (let* ((page (pdf-view-current-page))
- (match (car pdf-isearch-current-match))
- (size (pdf-view-image-size))
- (links (sort (cl-remove-if
- (lambda (e)
- (= 0 (pdf-util-edges-intersection-area (car e) match)))
- (mapcar (lambda (l)
- (cons (pdf-util-scale (alist-get 'edges l) size)
- l))
- (pdf-cache-pagelinks page)))
- (lambda (e1 e2)
- (> (pdf-util-edges-intersection-area
- (alist-get 'edges e1) match)
- (pdf-util-edges-intersection-area
- (alist-get 'edges e2) match))))))
- (unless links
- (error "No link found at this position"))
- (pdf-links-action-perform (car links))))))
-
-(defun pdf-links-isearch-link-filter-matches (matches)
- (let ((links (pdf-util-scale
- (mapcar (apply-partially 'alist-get 'edges)
- (pdf-cache-pagelinks
- (pdf-view-current-page)))
- (pdf-view-image-size))))
- (cl-remove-if-not
- (lambda (m)
- (cl-some
- (lambda (edges)
- (cl-some (lambda (link)
- (pdf-util-with-edges (link edges)
- (let ((area (min (* link-width link-height)
- (* edges-width edges-height))))
- (> (/ (pdf-util-edges-intersection-area edges link)
- (float area)) 0.5))))
- links))
- m))
- matches)))
-
-(defun pdf-links-browse-uri-default (uri)
- "Open the string URI using Org.
-
-Wraps the URI in \[\[ ... \]\] and calls `org-open-link-from-string'
-on the resulting string."
- (cl-check-type uri string)
- (message "Opening `%s' with Org" uri)
- (org-open-link-from-string (format "[[%s]]" uri)))
-
-(provide 'pdf-links)
-
-;;; pdf-links.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-loader.el b/elpa/pdf-tools-20200512.1524/pdf-loader.el
deleted file mode 100644
index b1eab34..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-loader.el
+++ /dev/null
@@ -1,80 +0,0 @@
-;;; pdf-loader.el --- Minimal PDF Tools loader -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Andreas Politz
-
-;; Author: Andreas Politz <politza@hochschule-trier.de>
-;; Keywords:
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;
-
-;;; Code:
-
-(defconst pdf-loader--auto-mode-alist-item
- (copy-sequence "\\.[pP][dD][fF]\\'")
- "The item used in `auto-mode-alist'.")
-
-(defconst pdf-loader--magic-mode-alist-item
- (copy-sequence "%PDF")
- "The item used in`magic-mode-alist'.")
-
-
-(declare-function pdf-tools-install "pdf-tools.el")
-
-;;;###autoload
-(defun pdf-loader-install (&optional no-query-p skip-dependencies-p
- no-error-p force-dependencies-p)
- "Prepare Emacs for using PDF Tools.
-
-This function acts as a replacement for `pdf-tools-install' and
-makes Emacs load and use PDF Tools as soon as a PDF file is
-opened, but not sooner.
-
-The arguments are passed verbatim to `pdf-tools-install', which
-see."
- (let ((args (list no-query-p skip-dependencies-p
- no-error-p force-dependencies-p)))
- (if (featurep 'pdf-tools)
- (apply #'pdf-tools-install args)
- (pdf-loader--install
- (lambda ()
- (apply #'pdf-loader--load args))))))
-
-(defun pdf-loader--load (&rest args)
- (pdf-loader--uninstall)
- (save-selected-window
- (pdf-tools-install args)))
-
-(defun pdf-loader--install (loader)
- (pdf-loader--uninstall)
- (push (cons pdf-loader--auto-mode-alist-item loader)
- auto-mode-alist)
- (push (cons pdf-loader--magic-mode-alist-item loader)
- magic-mode-alist))
-
-(defun pdf-loader--uninstall ()
- (let ((elt (assoc pdf-loader--auto-mode-alist-item
- auto-mode-alist)))
- (when elt
- (setq auto-mode-alist (remove elt auto-mode-alist))))
- (let ((elt (assoc pdf-loader--magic-mode-alist-item
- magic-mode-alist)))
- (when elt
- (setq magic-mode-alist (remove elt magic-mode-alist)))))
-
-(provide 'pdf-loader)
-;;; pdf-loader.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-misc.el b/elpa/pdf-tools-20200512.1524/pdf-misc.el
deleted file mode 100644
index 73468db..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-misc.el
+++ /dev/null
@@ -1,287 +0,0 @@
-;;; pdf-misc.el --- Miscellaneous commands for PDF buffer.
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-
-
-(require 'pdf-view)
-(require 'pdf-util)
-(require 'imenu)
-
-
-
-(defvar pdf-misc-minor-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "I") 'pdf-misc-display-metadata)
- (define-key map (kbd "C-c C-p") 'pdf-misc-print-document)
- map)
- "Keymap used in `pdf-misc-minor-mode'.")
-
-;;;###autoload
-(define-minor-mode pdf-misc-minor-mode
- "FIXME: Not documented."
- nil nil nil)
-
-;;;###autoload
-(define-minor-mode pdf-misc-size-indication-minor-mode
- "Provide a working size indication in the mode-line."
- nil nil nil
- (pdf-util-assert-pdf-buffer)
- (cond
- (pdf-misc-size-indication-minor-mode
- (unless (assq 'pdf-misc-size-indication-minor-mode
- mode-line-position)
- (setq mode-line-position
- `((pdf-misc-size-indication-minor-mode
- (:eval (pdf-misc-size-indication)))
- ,@mode-line-position))))
- (t
- (setq mode-line-position
- (cl-remove 'pdf-misc-size-indication-minor-mode
- mode-line-position :key 'car-safe)))))
-
-(defun pdf-misc-size-indication ()
- "Return size indication string for the mode-line."
- (let ((top (= (window-vscroll nil t) 0))
- (bot (>= (+ (- (nth 3 (window-inside-pixel-edges))
- (nth 1 (window-inside-pixel-edges)))
- (window-vscroll nil t))
- (cdr (pdf-view-image-size t)))))
- (cond
- ((and top bot) " All")
- (top " Top")
- (bot " Bot")
- (t (format
- " %d%%%%"
- (ceiling
- (* 100 (/ (float (window-vscroll nil t))
- (cdr (pdf-view-image-size t))))))))))
-
-(defvar pdf-misc-menu-bar-minor-mode-map (make-sparse-keymap)
- "The keymap used in `pdf-misc-menu-bar-minor-mode'.")
-
-(easy-menu-define nil pdf-misc-menu-bar-minor-mode-map
- "Menu for PDF Tools."
- `("PDF Tools"
- ["Go Backward" pdf-history-backward
- :visible (bound-and-true-p pdf-history-minor-mode)
- :active (and (bound-and-true-p pdf-history-minor-mode)
- (not (pdf-history-end-of-history-p)))]
- ["Go Forward" pdf-history-forward
- :visible (bound-and-true-p pdf-history-minor-mode)
- :active (not (pdf-history-end-of-history-p))]
- ["--" nil
- :visible (derived-mode-p 'pdf-virtual-view-mode)]
- ["Next file" pdf-virtual-buffer-forward-file
- :visible (derived-mode-p 'pdf-virtual-view-mode)
- :active (pdf-virtual-document-next-file
- (pdf-view-current-page))]
- ["Previous file" pdf-virtual-buffer-backward-file
- :visible (derived-mode-p 'pdf-virtual-view-mode)
- :active (not (eq 1 (pdf-view-current-page)))]
- ["--" nil
- :visible (bound-and-true-p pdf-history-minor-mode)]
- ["Add text annotation" pdf-annot-mouse-add-text-annotation
- :visible (bound-and-true-p pdf-annot-minor-mode)
- :keys "\\[pdf-annot-add-text-annotation]"]
- ("Add markup annotation"
- :active (pdf-view-active-region-p)
- :visible (and (bound-and-true-p pdf-annot-minor-mode)
- (pdf-info-markup-annotations-p))
- ["highlight" pdf-annot-add-highlight-markup-annotation]
- ["squiggly" pdf-annot-add-squiggly-markup-annotation]
- ["underline" pdf-annot-add-underline-markup-annotation]
- ["strikeout" pdf-annot-add-strikeout-markup-annotation])
- ["--" nil :visible (bound-and-true-p pdf-annot-minor-mode)]
- ["Display Annotations" pdf-annot-list-annotations
- :help "List all annotations"
- :visible (bound-and-true-p pdf-annot-minor-mode)]
- ["Display Attachments" pdf-annot-attachment-dired
- :help "Display attachments in a dired buffer"
- :visible (featurep 'pdf-annot)]
- ["Display Metadata" pdf-misc-display-metadata
- :help "Display information about the document"
- :visible (featurep 'pdf-misc)]
- ["Display Outline" pdf-outline
- :help "Display documents outline"
- :visible (featurep 'pdf-outline)]
- "--"
- ("Render Options"
- ["Printed Mode" (lambda ()
- (interactive)
- (pdf-view-printer-minor-mode 'toggle))
- :style toggle
- :selected pdf-view-printer-minor-mode
- :help "Display the PDF as it would be printed."]
- ["Midnight Mode" (lambda ()
- (interactive)
- (pdf-view-midnight-minor-mode 'toggle))
- :style toggle
- :selected pdf-view-midnight-minor-mode
- :help "Apply a color-filter appropriate for past midnight reading."])
- "--"
- ["Copy region" pdf-view-kill-ring-save
- :keys "\\[kill-ring-save]"
- :active (pdf-view-active-region-p)]
- "--"
- ["Isearch document" isearch-forward
- :visible (bound-and-true-p pdf-isearch-minor-mode)]
- ["Occur document" pdf-occur
- :visible (featurep 'pdf-occur)]
- "--"
- ["Locate TeX source" pdf-sync-backward-search-mouse
- :visible (and (featurep 'pdf-sync)
- (equal last-command-event
- last-nonmenu-event))]
- ["--" nil :visible (and (featurep 'pdf-sync)
- (equal last-command-event
- last-nonmenu-event))]
- ["Print" pdf-misc-print-document
- :active (and (pdf-view-buffer-file-name)
- (file-readable-p (pdf-view-buffer-file-name)))]
- ["Create image" pdf-view-extract-region-image
- :help "Create an image of the page or the selected region(s)."]
- ["Create virtual PDF" pdf-virtual-buffer-create
- :help "Create a PDF containing all documents in this directory."
- :visible (bound-and-true-p pdf-virtual-global-minor-mode)]
- "--"
- ["Revert buffer" pdf-view-revert-buffer
- :visible (pdf-info-writable-annotations-p)]
- "--"
- ["Customize" pdf-tools-customize]))
-
-;;;###autoload
-(define-minor-mode pdf-misc-menu-bar-minor-mode
- "Display a PDF Tools menu in the menu-bar."
- nil nil nil
- (pdf-util-assert-pdf-buffer))
-
-(defvar pdf-misc-context-menu-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap [down-mouse-3] 'pdf-misc-popup-context-menu)
- kmap))
-
-;;;###autoload
-(define-minor-mode pdf-misc-context-menu-minor-mode
- "Provide a right-click context menu in PDF buffers.
-
-\\{pdf-misc-context-menu-minor-mode-map}"
- nil nil nil
- (pdf-util-assert-pdf-buffer))
-
-(defun pdf-misc-popup-context-menu (event)
- "Popup a context menu at position determined by EVENT."
- (interactive "@e")
- (popup-menu
- (cons 'keymap
- (cddr (lookup-key pdf-misc-menu-bar-minor-mode-map
- [menu-bar PDF\ Tools])))))
-
-(defun pdf-misc-display-metadata ()
- "Display all available metadata in a separate buffer."
- (interactive)
- (pdf-util-assert-pdf-buffer)
- (let* ((buffer (current-buffer))
- (md (pdf-info-metadata)))
- (with-current-buffer (get-buffer-create "*PDF-Metadata*")
- (let* ((inhibit-read-only t)
- (pad (apply' max (mapcar (lambda (d)
- (length (symbol-name (car d))))
- md)))
- (fmt (format "%%%ds:%%s\n" pad))
- window)
- (erase-buffer)
- (setq header-line-format (buffer-name buffer)
- buffer-read-only t)
- (font-lock-mode 1)
- (font-lock-add-keywords nil
- '(("^ *\\(\\(?:\\w\\|-\\)+\\):"
- (1 font-lock-keyword-face))))
- (dolist (d md)
- (let ((key (car d))
- (val (cdr d)))
- (cl-case key
- (keywords
- (setq val (mapconcat 'identity val ", "))))
- (let ((beg (+ (length (symbol-name key)) (point) 1))
- (fill-prefix
- (make-string (1+ pad) ?\s)))
- (insert (format fmt key val))
- (fill-region beg (point) )))))
- (goto-char 1)
- (display-buffer (current-buffer)))
- md))
-
-(defgroup pdf-misc nil
- "Miscellaneous options for PDF documents."
- :group 'pdf-tools)
-
-(define-obsolete-variable-alias 'pdf-misc-print-programm
- 'pdf-misc-print-program "1.0")
-(defcustom pdf-misc-print-programm nil
- "The program used for printing.
-
-It is called with one argument, the PDF file."
- :group 'pdf-misc
- :type 'file)
-
-(define-obsolete-variable-alias 'pdf-misc-print-programm-args
- 'pdf-misc-print-program-args "1.0")
-(defcustom pdf-misc-print-programm-args nil
- "List of additional arguments passed to `pdf-misc-print-program'."
- :group 'pdf-misc
- :type '(repeat string))
-
-(defun pdf-misc-print-programm (&optional interactive-p)
- (or (and pdf-misc-print-programm
- (executable-find pdf-misc-print-programm))
- (when interactive-p
- (let* ((default (car (delq nil (mapcar
- 'executable-find
- '("gtklp" "xpp" "gpr")))))
- buffer-file-name
- (program
- (expand-file-name
- (read-file-name
- "Print with: " default nil t nil 'file-executable-p))))
- (when (and program
- (executable-find program))
- (when (y-or-n-p "Save choice using customize ?")
- (customize-save-variable
- 'pdf-misc-print-program program))
- (setq pdf-misc-print-program program))))))
-
-(defun pdf-misc-print-document (filename &optional interactive-p)
- (interactive
- (list (pdf-view-buffer-file-name) t))
- (cl-check-type filename (and string file-readable))
- (let ((program (pdf-misc-print-program interactive-p))
- (args (append pdf-misc-print-programm-args (list filename))))
- (unless program
- (error "No print program available"))
- (apply #'start-process "printing" nil program args)
- (message "Print job started: %s %s"
- program (mapconcat #'identity args " "))))
-
-
-(provide 'pdf-misc)
-
-;;; pdf-misc.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-occur.el b/elpa/pdf-tools-20200512.1524/pdf-occur.el
deleted file mode 100644
index d0a781d..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-occur.el
+++ /dev/null
@@ -1,827 +0,0 @@
-;;; pdf-occur.el --- Display matching lines of PDF documents. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-
-(require 'pdf-tools)
-(require 'pdf-view)
-(require 'pdf-util)
-(require 'pdf-info)
-(require 'pdf-isearch)
-(require 'tablist)
-(require 'ibuf-ext)
-(require 'dired)
-(require 'let-alist)
-
-;;; Code:
-
-
-
-
-;; * ================================================================== *
-;; * Custom & Variables
-;; * ================================================================== *
-
-(defgroup pdf-occur nil
- "Display matching lines of PDF documents."
- :group 'pdf-tools)
-
-(defface pdf-occur-document-face
- '((default (:inherit font-lock-string-face)))
- "Face used to highlight documents in the list buffer."
- :group 'pdf-occur)
-
-(defface pdf-occur-page-face
- '((default (:inherit font-lock-type-face)))
- "Face used to highlight page numbers in the list buffer."
- :group 'pdf-occur)
-
-(defcustom pdf-occur-search-batch-size 16
- "Maximum number of pages searched in one query.
-
-Lower numbers will make Emacs more responsive when searching at
-the cost of slightly increased search time."
- :group 'pdf-occur
- :type 'integer)
-
-(defcustom pdf-occur-prefer-string-search nil
- "If non-nil, reverse the meaning of the regexp-p prefix-arg."
- :group 'pdf-occur
- :type 'boolean)
-
-(defvar pdf-occur-history nil
- "The history variable for search strings.")
-
-(defvar pdf-occur-search-pages-left nil
- "The total number of pages left to search.")
-
-(defvar pdf-occur-search-documents nil
- "The list of searched documents.
-
-Each element should be either the filename of a PDF document or a
-cons \(FILENAME . PAGES\), where PAGES is the list of pages to
-search. See `pdf-info-normalize-page-range' for it's format.")
-
-(defvar pdf-occur-number-of-matches 0
- "The number of matches in all searched documents.")
-
-(defvar pdf-occur-search-string nil
- "The currently used search string, resp. regexp.")
-
-(defvar pdf-occur-search-regexp-p nil
- "Non-nil, if searching for a regexp.")
-
-(defvar pdf-occur-buffer-mode-map
- (let ((kmap (make-sparse-keymap)))
- (set-keymap-parent kmap tablist-mode-map)
- (define-key kmap (kbd "RET") 'pdf-occur-goto-occurrence)
- (define-key kmap (kbd "C-o") 'pdf-occur-view-occurrence)
- (define-key kmap (kbd "SPC") 'pdf-occur-view-occurrence)
- (define-key kmap (kbd "C-c C-f") 'next-error-follow-minor-mode)
- (define-key kmap (kbd "g") 'pdf-occur-revert-buffer-with-args)
- (define-key kmap (kbd "K") 'pdf-occur-abort-search)
- (define-key kmap (kbd "D") 'pdf-occur-tablist-do-delete)
- (define-key kmap (kbd "x") 'pdf-occur-tablist-do-flagged-delete)
- (define-key kmap (kbd "A") 'pdf-occur-tablist-gather-documents)
- kmap)
- "The keymap used for `pdf-occur-buffer-mode'.")
-
-
-;; * ================================================================== *
-;; * High level functions
-;; * ================================================================== *
-
-(define-derived-mode pdf-occur-buffer-mode tablist-mode "PDFOccur"
- "Major mode for output from `pdf-occur`. \\<pdf-occur-buffer-mode-map>
-
-Some useful keys are:
-
-\\[pdf-occur-abort-search] - Abort the search.
-\\[pdf-occur-revert-buffer-with-args] - Restart the search.
-\\[universal-argument] \\[pdf-occur-revert-buffer-with-args] - Restart search with different regexp.
-\\[universal-argument] \\[universal-argument] \\[pdf-occur-revert-buffer-with-args] - Same, but do a plain string search.
-
-\\[tablist-push-regexp-filter] - Filter matches by regexp on current or prefix-th column.
-\\[tablist-pop-filter] - Remove last added filter.
-
-\\[pdf-occur-tablist-do-delete] - Remove the current file from the search.
-\\[pdf-occur-tablist-gather-documents] - Include marked files from displayed `dired'/`ibuffer' and
- `pdf-view-mode' buffers in the search.
-
-\\{pdf-occur-buffer-mode-map}"
- (setq-local case-fold-search case-fold-search)
- (setq-local next-error-function 'pdf-occur-next-error)
- (setq-local revert-buffer-function
- 'pdf-occur-revert-buffer)
- (setq next-error-last-buffer (current-buffer))
- (setq-local tabulated-list-sort-key nil)
- (setq-local tabulated-list-use-header-line t)
- (setq-local tablist-operations-function
- (lambda (op &rest _)
- (cl-case op
- (supported-operations '(find-entry))
- (find-entry
- (let ((display-buffer-overriding-action
- '(display-buffer-same-window)))
- (pdf-occur-goto-occurrence)))))))
-
-;;;###autoload
-(defun pdf-occur (string &optional regexp-p)
- "List lines matching STRING or PCRE.
-
-Interactively search for a regexp. Unless a prefix arg was given,
-in which case this functions performs a string search.
-
-If `pdf-occur-prefer-string-search' is non-nil, the meaning of
-the prefix-arg is inverted."
- (interactive
- (progn
- (pdf-util-assert-pdf-buffer)
- (list
- (pdf-occur-read-string
- (pdf-occur-want-regexp-search-p))
- (pdf-occur-want-regexp-search-p))))
- (pdf-util-assert-pdf-buffer)
- (pdf-occur-search (list (current-buffer)) string regexp-p))
-
-(defvar ibuffer-filtering-qualifiers)
-;;;###autoload
-(defun pdf-occur-multi-command ()
- "Perform `pdf-occur' on multiple buffer.
-
-For a programmatic search of multiple documents see
-`pdf-occur-search'."
- (interactive)
- (ibuffer)
- (with-current-buffer "*Ibuffer*"
- (pdf-occur-ibuffer-minor-mode)
- (unless (member '(derived-mode . pdf-view-mode)
- ibuffer-filtering-qualifiers)
- (ibuffer-filter-by-derived-mode 'pdf-view-mode))
- (message
- "%s"
- (substitute-command-keys
- "Mark a bunch of PDF buffers and type \\[pdf-occur-ibuffer-do-occur]"))
- (sit-for 3)))
-
-(defun pdf-occur-revert-buffer (&rest _)
- "Restart the search."
- (pdf-occur-assert-occur-buffer-p)
- (unless pdf-occur-search-documents
- (error "No documents to search"))
- (unless pdf-occur-search-string
- (error "Nothing to search for"))
- (let* ((2-columns-p (= 1 (length pdf-occur-search-documents)))
- (filename-width
- (min 24
- (apply 'max
- (mapcar 'length
- (mapcar 'pdf-occur-abbrev-document
- (mapcar 'car pdf-occur-search-documents))))))
- (page-sorter (tablist-generate-sorter
- (if 2-columns-p 0 1)
- '<
- 'string-to-number)))
- (setq tabulated-list-format
- (if 2-columns-p
- `[("Page" 4 ,page-sorter :right-align t)
- ("Line" 0 t)]
- `[("Document" ,filename-width t)
- ("Page" 4 ,page-sorter :right-align t)
- ("Line" 0 t)])
- tabulated-list-entries nil))
- (tabulated-list-revert)
- (pdf-occur-start-search
- pdf-occur-search-documents
- pdf-occur-search-string
- pdf-occur-search-regexp-p)
- (pdf-occur-update-header-line)
- (setq mode-line-process
- '(:propertize ":run" face compilation-mode-line-run)))
-
-(defun pdf-occur-revert-buffer-with-args (string &optional regexp-p documents)
- "Restart the search with modified arguments.
-
-Interactively just restart the search, unless a prefix was given.
-In this case read a new search string. With `C-u C-u' as prefix
-additionally invert the current state of
-`pdf-occur-search-regexp-p'."
- (interactive
- (progn
- (pdf-occur-assert-occur-buffer-p)
- (cond
- (current-prefix-arg
- (let ((regexp-p
- (if (equal current-prefix-arg '(16))
- (not pdf-occur-search-regexp-p)
- pdf-occur-search-regexp-p)))
- (list
- (pdf-occur-read-string regexp-p)
- regexp-p)))
- (t
- (list pdf-occur-search-string
- pdf-occur-search-regexp-p)))))
- (setq pdf-occur-search-string string
- pdf-occur-search-regexp-p regexp-p)
- (when documents
- (setq pdf-occur-search-documents
- (pdf-occur-normalize-documents documents)))
- (pdf-occur-revert-buffer))
-
-(defun pdf-occur-abort-search ()
- "Abort the current search.
-
-This immediately kills the search process."
- (interactive)
- (unless (pdf-occur-search-in-progress-p)
- (user-error "No search in progress"))
- (pdf-info-kill-local-server)
- (pdf-occur-search-finished t))
-
-
-;; * ================================================================== *
-;; * Finding occurrences
-;; * ================================================================== *
-
-
-(defun pdf-occur-goto-occurrence (&optional no-select-window-p)
- "Go to the occurrence at point.
-
-If EVENT is nil, use occurrence at current line. Select the
-PDF's window, unless NO-SELECT-WINDOW-P is non-nil.
-
-FIXME: EVENT not used at the moment."
- (interactive)
- (let ((item (tabulated-list-get-id)))
- (when item
- (let* ((doc (plist-get item :document))
- (page (plist-get item :page))
- (match (plist-get item :match-edges))
- (buffer (if (bufferp doc)
- doc
- (or (find-buffer-visiting doc)
- (find-file-noselect doc))))
- window)
- (if no-select-window-p
- (setq window (display-buffer buffer))
- (pop-to-buffer buffer)
- (setq window (selected-window)))
- (with-selected-window window
- (when page
- (pdf-view-goto-page page))
- ;; Abuse isearch.
- (when match
- (let ((pixel-match
- (pdf-util-scale-relative-to-pixel match))
- (pdf-isearch-batch-mode t))
- (pdf-isearch-hl-matches pixel-match nil t)
- (pdf-isearch-focus-match-batch pixel-match))))))))
-
-(defun pdf-occur-view-occurrence (&optional _event)
- "View the occurrence at EVENT.
-
-If EVENT is nil, use occurrence at current line."
- (interactive (list last-nonmenu-event))
- (pdf-occur-goto-occurrence t))
-
-(defun pdf-occur-next-error (&optional arg reset)
- "Move to the Nth (default 1) next match in an PDF Occur mode buffer.
-Compatibility function for \\[next-error] invocations."
- (interactive "p")
- ;; we need to run pdf-occur-find-match from within the Occur buffer
- (with-current-buffer
- ;; Choose the buffer and make it current.
- (if (next-error-buffer-p (current-buffer))
- (current-buffer)
- (next-error-find-buffer
- nil nil
- (lambda ()
- (eq major-mode 'pdf-occur-buffer-mode))))
- (when (bobp)
- (setq reset t))
- (if reset
- (goto-char (point-min))
- (beginning-of-line))
- (when (/= arg 0)
- (when (eobp)
- (forward-line -1))
- (when reset
- (cl-decf arg))
- (let ((line (line-number-at-pos))
- (limit (line-number-at-pos
- (if (>= arg 0)
- (1- (point-max))
- (point-min)))))
- (when (= line limit)
- (error "No more matches"))
- (forward-line
- (if (>= arg 0)
- (min arg (- limit line))
- (max arg (- limit line))))))
- ;; In case the *Occur* buffer is visible in a nonselected window.
- (tablist-move-to-major-column)
- (let ((win (get-buffer-window (current-buffer) t)))
- (if win (set-window-point win (point))))
- (pdf-occur-goto-occurrence)))
-
-
-;; * ================================================================== *
-;; * Integration with other modes
-;; * ================================================================== *
-
-;;;###autoload
-(define-minor-mode pdf-occur-global-minor-mode
- "Enable integration of Pdf Occur with other modes.
-
-This global minor mode enables (or disables)
-`pdf-occur-ibuffer-minor-mode' and `pdf-occur-dired-minor-mode'
-in all current and future ibuffer/dired buffer." nil nil nil
-:global t
- (let ((arg (if pdf-occur-global-minor-mode 1 -1)))
- (dolist (buf (buffer-list))
- (with-current-buffer buf
- (cond
- ((derived-mode-p 'dired-mode)
- (pdf-occur-dired-minor-mode arg))
- ((derived-mode-p 'ibuffer-mode)
- (pdf-occur-ibuffer-minor-mode arg)))))
- (cond
- (pdf-occur-global-minor-mode
- (add-hook 'dired-mode-hook 'pdf-occur-dired-minor-mode)
- (add-hook 'ibuffer-mode-hook 'pdf-occur-ibuffer-minor-mode))
- (t
- (remove-hook 'dired-mode-hook 'pdf-occur-dired-minor-mode)
- (remove-hook 'ibuffer-mode-hook 'pdf-occur-ibuffer-minor-mode)))))
-
-(defvar pdf-occur-ibuffer-minor-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap ibuffer-do-occur] 'pdf-occur-ibuffer-do-occur)
- map)
- "Keymap used in `pdf-occur-ibuffer-minor-mode'.")
-
-;;;###autoload
-(define-minor-mode pdf-occur-ibuffer-minor-mode
- "Hack into ibuffer's do-occur binding.
-
-This mode remaps `ibuffer-do-occur' to
-`pdf-occur-ibuffer-do-occur', which will start the PDF Tools
-version of `occur', if all marked buffer's are in `pdf-view-mode'
-and otherwise fallback to `ibuffer-do-occur'."
-
- nil nil nil)
-
-(defun pdf-occur-ibuffer-do-occur (&optional regexp-p)
- "Uses `pdf-occur-search', if appropriate.
-
-I.e. all marked buffers are in PDFView mode."
- (interactive
- (list (pdf-occur-want-regexp-search-p)))
- (let* ((buffer (or (ibuffer-get-marked-buffers)
- (and (ibuffer-current-buffer)
- (list (ibuffer-current-buffer)))))
- (pdf-only-p (cl-every
- (lambda (buf)
- (with-current-buffer buf
- (derived-mode-p 'pdf-view-mode)))
- buffer)))
- (if (not pdf-only-p)
- (call-interactively 'ibuffer-do-occur)
- (let ((regexp (pdf-occur-read-string regexp-p)))
- (pdf-occur-search buffer regexp regexp-p)))))
-
-(defvar pdf-occur-dired-minor-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap dired-do-search] 'pdf-occur-dired-do-search)
- map)
- "Keymap used in `pdf-occur-dired-minor-mode'.")
-
-;;;###autoload
-(define-minor-mode pdf-occur-dired-minor-mode
- "Hack into dired's `dired-do-search' binding.
-
-This mode remaps `dired-do-search' to
-`pdf-occur-dired-do-search', which will start the PDF Tools
-version of `occur', if all marked buffer's are in `pdf-view-mode'
-and otherwise fallback to `dired-do-search'."
-
- nil nil nil)
-
-(defun pdf-occur-dired-do-search ()
- "Uses `pdf-occur-search', if appropriate.
-
-I.e. all marked files look like PDF documents."
- (interactive)
- (let ((files (dired-get-marked-files)))
- (if (not (cl-every (lambda (file)
- (string-match-p
- (car pdf-tools-auto-mode-alist-entry)
- file))
- files))
- (call-interactively 'dired-do-search)
- (let* ((regex-p (pdf-occur-want-regexp-search-p))
- (regexp (pdf-occur-read-string regex-p)))
- (pdf-occur-search files regexp regex-p)))))
-
-
-
-;; * ================================================================== *
-;; * Search engine
-;; * ================================================================== *
-
-
-(defun pdf-occur-search (documents string &optional regexp-p)
- "Search DOCUMENTS for STRING.
-
-DOCUMENTS should be a list of buffers (objects, not names),
-filenames or conses \(BUFFER-OR-FILENAME . PAGES\), where PAGES
-determines the scope of the search of the respective document.
-See `pdf-info-normalize-page-range' for it's format.
-
-STRING is either the string to search for or, if REGEXP-P is
-non-nil, a Perl compatible regular expression (PCRE).
-
-Display the occur buffer and start the search asynchronously.
-
-Returns the window where the buffer is displayed."
-
- (unless documents
- (error "No documents to search"))
- (when (or (null string) (= (length string) 0))
- (error "Not searching for the empty string"))
- (with-current-buffer (get-buffer-create "*PDF-Occur*")
- (pdf-occur-buffer-mode)
- (setq-local pdf-occur-search-documents
- (pdf-occur-normalize-documents documents))
- (setq-local pdf-occur-search-string string)
- (setq-local pdf-occur-search-regexp-p regexp-p)
- (setq-local pdf-occur-search-pages-left 0)
- (setq-local pdf-occur-number-of-matches 0)
- (pdf-occur-revert-buffer)
- (display-buffer
- (current-buffer))))
-
-(defadvice tabulated-list-init-header (after update-header activate)
- "We want our own headers, thank you."
- (when (derived-mode-p 'pdf-occur-buffer-mode)
- (save-current-buffer
- (with-no-warnings (pdf-occur-update-header-line)))))
-
-(defun pdf-occur-create-entry (filename page &optional match)
- "Create a `tabulated-list-entries' entry for a search result.
-
-If match is nil, create a fake entry for documents w/o any
-matches linked with PAGE."
- (let* ((text (or (car match) "[No matches]"))
- (edges (cdr match))
- (displayed-text
- (if match
- (replace-regexp-in-string "\n" "\\n" text t t)
- (propertize text 'face 'font-lock-warning-face)))
- (displayed-page
- (if match
- (propertize (format "%d" page)
- 'face 'pdf-occur-page-face)
- ""))
- (displayed-document
- (propertize
- (pdf-occur-abbrev-document filename)
- 'face 'pdf-occur-document-face))
- (id `(:document ,filename
- :page ,page
- :match-text ,(if match text)
- :match-edges ,(if match edges))))
- (list id
- (if (= (length pdf-occur-search-documents) 1)
- (vector displayed-page displayed-text)
- (vector displayed-document
- displayed-page
- displayed-text)))))
-
-(defun pdf-occur-update-header-line ()
- (pdf-occur-assert-occur-buffer-p)
- (save-current-buffer
- ;;force-mode-line-update seems to sometimes spuriously change the
- ;;current buffer.
- (setq header-line-format
- `(:eval (concat
- (if (= (length pdf-occur-search-documents) 1)
- (format "%d match%s in document `%s'"
- pdf-occur-number-of-matches
- (if (/= 1 pdf-occur-number-of-matches) "es" "")
- (pdf-occur-abbrev-document
- (caar pdf-occur-search-documents)))
- (format "%d match%s in %d documents"
- pdf-occur-number-of-matches
- (if (/= 1 pdf-occur-number-of-matches) "es" "")
- (length pdf-occur-search-documents)))
- (if (pdf-occur-search-in-progress-p)
- (propertize
- (concat " ["
- (if (numberp pdf-occur-search-pages-left)
- (format "%d pages left"
- pdf-occur-search-pages-left)
- "Searching")
- "]")
- 'face 'compilation-mode-line-run)))))
- (force-mode-line-update)))
-
-(defun pdf-occur-search-finished (&optional abort-p)
- (setq pdf-occur-search-pages-left 0)
- (setq mode-line-process
- (if abort-p
- '(:propertize
- ":aborted" face compilation-mode-line-fail)
- '(:propertize
- ":exit" face compilation-mode-line-exit)))
- (let ((unmatched
- (mapcar (lambda (doc)
- (pdf-occur-create-entry doc 1))
- (cl-set-difference
- (mapcar 'car
- pdf-occur-search-documents)
- (mapcar (lambda (elt)
- (plist-get (car elt) :document))
- tabulated-list-entries)
- :test 'equal))))
- (when (and unmatched
- (> (length pdf-occur-search-documents) 1))
- (pdf-occur-insert-entries unmatched)))
- (tablist-apply-filter)
- (pdf-occur-update-header-line)
- (pdf-isearch-message
- (if abort-p
- "Search aborted."
- (format "Occur search finished with %d matches"
- pdf-occur-number-of-matches))))
-
-(defun pdf-occur-add-matches (filename matches)
- (pdf-occur-assert-occur-buffer-p)
- (when matches
- (let (entries)
- (dolist (match matches)
- (let-alist match
- (push (pdf-occur-create-entry filename .page (cons .text .edges))
- entries)))
- (setq entries (nreverse entries))
- (pdf-occur-insert-entries entries))))
-
-(defun pdf-occur-insert-entries (entries)
- "Insert tabulated-list ENTRIES at the end."
- (pdf-occur-assert-occur-buffer-p)
- (let ((inhibit-read-only t)
- (end-of-buffer (and (eobp) (not (bobp)))))
- (save-excursion
- (goto-char (point-max))
- (dolist (elt entries)
- (apply tabulated-list-printer elt))
- (set-buffer-modified-p nil))
- (when end-of-buffer
- (dolist (win (get-buffer-window-list))
- (set-window-point win (point-max))))
- (setq tabulated-list-entries
- (append tabulated-list-entries
- entries))))
-
-(defun pdf-occur-search-in-progress-p ()
- (and (numberp pdf-occur-search-pages-left)
- (> pdf-occur-search-pages-left 0)))
-
-(defun pdf-occur-start-search (documents string
- &optional regexp-p)
- (pdf-occur-assert-occur-buffer-p)
- (pdf-info-make-local-server nil t)
- (let ((batches (pdf-occur-create-batches
- documents (or pdf-occur-search-batch-size 1))))
- (pdf-info-local-batch-query
- (lambda (document pages)
- (if regexp-p
- (pdf-info-search-regexp string pages nil document)
- (pdf-info-search-string string pages document)))
- (lambda (status response document pages)
- (if status
- (error "%s" response)
- (when (numberp pdf-occur-search-pages-left)
- (cl-decf pdf-occur-search-pages-left
- (1+ (- (cdr pages) (car pages)))))
- (when (cl-member document pdf-occur-search-documents
- :key 'car
- :test 'equal)
- (cl-incf pdf-occur-number-of-matches
- (length response))
- (pdf-occur-add-matches document response)
- (pdf-occur-update-header-line))))
- (lambda (status buffer)
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (pdf-occur-search-finished (eq status 'killed)))))
- batches)
- (setq pdf-occur-number-of-matches 0)
- (setq pdf-occur-search-pages-left
- (apply '+ (mapcar (lambda (elt)
- (1+ (- (cdr (nth 1 elt))
- (car (nth 1 elt)))))
- batches)))))
-
-
-
-;; * ================================================================== *
-;; * Editing searched documents
-;; * ================================================================== *
-
-(defun pdf-occur-tablist-do-delete (&optional arg)
- "Delete ARG documents from the search list."
- (interactive "P")
- (when (pdf-occur-search-in-progress-p)
- (user-error "Can't delete while a search is in progress."))
- (let* ((items (tablist-get-marked-items arg))
- (documents (cl-remove-duplicates
- (mapcar (lambda (entry)
- (plist-get (car entry) :document))
- items)
- :test 'equal)))
- (unless documents
- (error "No documents selected"))
- (when (tablist-yes-or-no-p
- 'Stop\ searching
- nil (mapcar (lambda (d) (cons nil (vector d)))
- documents))
- (setq pdf-occur-search-documents
- (cl-remove-if (lambda (elt)
- (member (car elt) documents))
- pdf-occur-search-documents)
- tabulated-list-entries
- (cl-remove-if (lambda (elt)
- (when (member (plist-get (car elt) :document)
- documents)
- (when (plist-get (car elt) :match-edges)
- (cl-decf pdf-occur-number-of-matches))
- t))
- tabulated-list-entries))
- (tablist-revert)
- (pdf-occur-update-header-line)
- (tablist-move-to-major-column))))
-
-(defun pdf-occur-tablist-do-flagged-delete (&optional interactive)
- "Stop searching all documents marked with a D."
- (interactive "p")
- (let* ((tablist-marker-char ?D))
- (if (save-excursion
- (goto-char (point-min))
- (re-search-forward (tablist-marker-regexp) nil t))
- (pdf-occur-tablist-do-delete)
- (or (not interactive)
- (message "(No deletions requested)")))))
-
-(defun pdf-occur-tablist-gather-documents ()
- "Gather marked documents in windows.
-
-Examine all dired/ibuffer windows and offer to put marked files
-in the search list."
- (interactive)
- (let ((searched (mapcar 'car pdf-occur-search-documents))
- files)
- (dolist (win (window-list))
- (with-selected-window win
- (cond
- ((derived-mode-p 'dired-mode)
- (let ((marked (dired-get-marked-files nil nil nil t)))
- (when (> (length marked) 1)
- (when (eq t (car marked))
- (setq marked (cdr marked)))
- (setq files
- (append files marked nil)))))
- ((derived-mode-p 'ibuffer-mode)
- (dolist (fname (mapcar 'buffer-file-name
- (ibuffer-get-marked-buffers)))
- (when fname
- (push fname files))))
- ((and (derived-mode-p 'pdf-view-mode)
- (buffer-file-name))
- (push (buffer-file-name) files)))))
-
- (setq files
- (cl-sort ;Looks funny.
- (cl-set-difference
- (cl-remove-duplicates
- (cl-remove-if-not
- (lambda (file) (string-match-p
- (car pdf-tools-auto-mode-alist-entry)
- file))
- files)
- :test 'file-equal-p)
- searched
- :test 'file-equal-p)
- 'string-lessp))
- (if (null files)
- (message "No marked, new PDF files found in windows")
- (when (tablist-yes-or-no-p
- 'add nil (mapcar (lambda (file)
- (cons nil (vector file)))
- (cl-sort files 'string-lessp)))
- (setq pdf-occur-search-documents
- (append pdf-occur-search-documents
- (pdf-occur-normalize-documents files)))
- (message "Added %d file%s to the list of searched documents%s"
- (length files)
- (dired-plural-s (length files))
- (substitute-command-keys
- " - Hit \\[pdf-occur-revert-buffer-with-args]"))))))
-
-
-;; * ================================================================== *
-;; * Utilities
-;; * ================================================================== *
-
-(defun pdf-occur-read-string (&optional regexp-p)
- (read-string
- (concat
- (format "List lines %s"
- (if regexp-p "matching PCRE" "containing string"))
- (if pdf-occur-search-string
- (format " (default %s)" pdf-occur-search-string))
- ": ")
- nil 'pdf-occur-history pdf-occur-search-string))
-
-(defun pdf-occur-assert-occur-buffer-p ()
- (unless (derived-mode-p 'pdf-occur-buffer-mode)
- (error "Not in PDF occur buffer")))
-
-(defun pdf-occur-want-regexp-search-p ()
- (or (and current-prefix-arg
- pdf-occur-prefer-string-search)
- (and (null current-prefix-arg)
- (not pdf-occur-prefer-string-search))))
-
-;; FIXME: This will be confusing when searching documents with the
-;; same base file-name.
-(defun pdf-occur-abbrev-document (file-or-buffer)
- (if (bufferp file-or-buffer)
- (buffer-name file-or-buffer)
- (let ((abbrev (file-name-nondirectory file-or-buffer)))
- (if (> (length abbrev) 0)
- abbrev
- file-or-buffer))))
-
-(defun pdf-occur-create-batches (documents batch-size)
- (let (queries)
- (dolist (d documents)
- (let* ((file-or-buffer (car d))
- (pages (pdf-info-normalize-page-range (cdr d)))
- (first (car pages))
- (last (if (eq (cdr pages) 0)
- (pdf-info-number-of-pages file-or-buffer)
- (cdr pages)))
- (npages (1+ (- last first)))
- (nbatches (ceiling
- (/ (float npages) batch-size))))
- (dotimes (i nbatches)
- (push
- (list file-or-buffer
- (cons (+ first (* i batch-size))
- (min last (+ first (1- (* (1+ i) batch-size))))))
- queries))))
- (nreverse queries)))
-
-(defun pdf-occur-normalize-documents (documents)
- "Normalize list of documents.
-
-Replaces buffers with their associated filenames \(if
-applicable\) and ensures that every element looks like
-\(FILENAME-OR-BUFFER . PAGES\)."
- (cl-sort (mapcar (lambda (doc)
- (unless (consp doc)
- (setq doc (cons doc nil)))
- (when (and (bufferp (car doc))
- (buffer-file-name (car doc)))
- (setq doc (cons (buffer-file-name (car doc))
- (cdr doc))))
- (if (stringp (car doc))
- (cons (expand-file-name (car doc)) (cdr doc))
- doc))
- documents)
- (lambda (a b) (string-lessp
- (if (bufferp a) (buffer-name a) a)
- (if (bufferp b) (buffer-name b) b)))
- :key 'car))
-
-(provide 'pdf-occur)
-
-;;; pdf-occur.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-outline.el b/elpa/pdf-tools-20200512.1524/pdf-outline.el
deleted file mode 100644
index e141ca8..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-outline.el
+++ /dev/null
@@ -1,598 +0,0 @@
-;;; pdf-outline.el --- Outline for PDF buffer -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-
-(require 'outline)
-(require 'pdf-links)
-(require 'pdf-view)
-(require 'pdf-util)
-(require 'cl-lib)
-(require 'imenu)
-(require 'let-alist)
-
-;;; Code:
-
-;;
-;; User options
-;;
-
-(defgroup pdf-outline nil
- "Display a navigatable outline of a PDF document."
- :group 'pdf-tools)
-
-(defcustom pdf-outline-buffer-indent 2
- "The level of indent in the Outline buffer."
- :type 'integer
- :group 'pdf-outline)
-
-(defcustom pdf-outline-enable-imenu t
- "Whether `imenu' should be enabled in PDF documents."
- :group 'pdf-outline
- :type '(choice (const :tag "Yes" t)
- (const :tag "No" nil)))
-
-(defcustom pdf-outline-imenu-keep-order t
- "Whether `imenu' should be advised not to reorder the outline."
- :group 'pdf-outline
- :type '(choice (const :tag "Yes" t)
- (const :tag "No" nil)))
-
-(defcustom pdf-outline-imenu-use-flat-menus nil
- "Whether the constructed Imenu should be a list, rather than a tree."
- :group 'pdf-outline
- :type '(choice (const :tag "Yes" t)
- (const :tag "No" nil)))
-
-(defcustom pdf-outline-display-buffer-action '(nil . nil)
- "The display action used, when displaying the outline buffer."
- :group 'pdf-outline
- :type display-buffer--action-custom-type)
-
-(defcustom pdf-outline-display-labels nil
- "Whether the outline should display labels instead of page numbers.
-
-Usually a page's label is it's displayed page number."
- :group 'pdf-outline
- :type 'boolean)
-
-(defvar pdf-outline-minor-mode-map
- (let ((km (make-sparse-keymap)))
- (define-key km (kbd "o") 'pdf-outline)
- km)
- "Keymap used for `pdf-outline-minor-mode'.")
-
-(defvar pdf-outline-buffer-mode-map
- (let ((kmap (make-sparse-keymap)))
- (dotimes (i 10)
- (define-key kmap (vector (+ i ?0)) 'digit-argument))
- (define-key kmap "-" 'negative-argument)
- (define-key kmap (kbd "p") 'previous-line)
- (define-key kmap (kbd "n") 'next-line)
- (define-key kmap (kbd "b") 'outline-backward-same-level)
- (define-key kmap (kbd "d") 'hide-subtree)
- (define-key kmap (kbd "a") 'show-all)
- (define-key kmap (kbd "s") 'show-subtree)
- (define-key kmap (kbd "f") 'outline-forward-same-level)
- (define-key kmap (kbd "u") 'pdf-outline-up-heading)
- (define-key kmap (kbd "Q") 'hide-sublevels)
- (define-key kmap (kbd "<") 'beginning-of-buffer)
- (define-key kmap (kbd ">") 'pdf-outline-end-of-buffer)
- (define-key kmap (kbd "TAB") 'outline-toggle-children)
- (define-key kmap (kbd "RET") 'pdf-outline-follow-link)
- (define-key kmap (kbd "C-o") 'pdf-outline-display-link)
- (define-key kmap (kbd "SPC") 'pdf-outline-display-link)
- (define-key kmap [mouse-1] 'pdf-outline-mouse-display-link)
- (define-key kmap (kbd "o") 'pdf-outline-select-pdf-window)
- (define-key kmap (kbd ".") 'pdf-outline-move-to-current-page)
- ;; (define-key kmap (kbd "Q") 'pdf-outline-quit)
- (define-key kmap (kbd "C-c C-q") 'pdf-outline-quit-and-kill)
- (define-key kmap (kbd "q") 'quit-window)
- (define-key kmap (kbd "M-RET") 'pdf-outline-follow-link-and-quit)
- (define-key kmap (kbd "C-c C-f") 'pdf-outline-follow-mode)
- kmap)
- "Keymap used in `pdf-outline-buffer-mode'.")
-
-;;
-;; Internal Variables
-;;
-
-(define-button-type 'pdf-outline
- 'face nil
- 'keymap nil)
-
-(defvar-local pdf-outline-pdf-window nil
- "The PDF window corresponding to this outline buffer.")
-
-(defvar-local pdf-outline-pdf-document nil
- "The PDF filename or buffer corresponding to this outline
- buffer.")
-
-(defvar-local pdf-outline-follow-mode-last-link nil)
-
-;;
-;; Functions
-;;
-
-;;;###autoload
-(define-minor-mode pdf-outline-minor-mode
- "Display an outline of a PDF document.
-
-This provides a PDF's outline on the menu bar via imenu.
-Additionally the same outline may be viewed in a designated
-buffer.
-
-\\{pdf-outline-minor-mode-map}"
- nil nil nil
- (pdf-util-assert-pdf-buffer)
- (cond
- (pdf-outline-minor-mode
- (when pdf-outline-enable-imenu
- (pdf-outline-imenu-enable)))
- (t
- (when pdf-outline-enable-imenu
- (pdf-outline-imenu-disable)))))
-
-(define-derived-mode pdf-outline-buffer-mode outline-mode "PDF Outline"
- "View and traverse the outline of a PDF file.
-
-Press \\[pdf-outline-display-link] to display the PDF document,
-\\[pdf-outline-select-pdf-window] to select it's window,
-\\[pdf-outline-move-to-current-page] to move to the outline item
-of the current page, \\[pdf-outline-follow-link] to goto the
-corresponding page or \\[pdf-outline-follow-link-and-quit] to
-additionally quit the Outline.
-
-\\[pdf-outline-follow-mode] enters a variant of
-`next-error-follow-mode'. Most `outline-mode' commands are
-rebound to their respective last character.
-
-\\{pdf-outline-buffer-mode-map}"
- (setq-local outline-regexp "\\( *\\).")
- (setq-local outline-level
- (lambda nil (1+ (/ (length (match-string 1))
- pdf-outline-buffer-indent))))
-
- (toggle-truncate-lines 1)
- (setq buffer-read-only t)
- (when (> (count-lines 1 (point-max))
- (* 1.5 (frame-height)))
- (hide-sublevels 1))
- (message "%s"
- (substitute-command-keys
- (concat
- "Try \\[pdf-outline-display-link], "
- "\\[pdf-outline-select-pdf-window], "
- "\\[pdf-outline-move-to-current-page] or "
- "\\[pdf-outline-follow-link-and-quit]"))))
-
-(define-minor-mode pdf-outline-follow-mode
- "Display links as point moves."
- nil nil nil
- (setq pdf-outline-follow-mode-last-link nil)
- (cond
- (pdf-outline-follow-mode
- (add-hook 'post-command-hook 'pdf-outline-follow-mode-pch nil t))
- (t
- (remove-hook 'post-command-hook 'pdf-outline-follow-mode-pch t))))
-
-(defun pdf-outline-follow-mode-pch ()
- (let ((link (pdf-outline-link-at-pos (point))))
- (when (and link
- (not (eq link pdf-outline-follow-mode-last-link)))
- (setq pdf-outline-follow-mode-last-link link)
- (pdf-outline-display-link (point)))))
-
-;;;###autoload
-(defun pdf-outline (&optional buffer no-select-window-p)
- "Display an PDF outline of BUFFER.
-
-BUFFER defaults to the current buffer. Select the outline
-buffer, unless NO-SELECT-WINDOW-P is non-nil."
- (interactive (list nil (or current-prefix-arg
- (consp last-nonmenu-event))))
- (let ((win
- (display-buffer
- (pdf-outline-noselect buffer)
- pdf-outline-display-buffer-action)))
- (unless no-select-window-p
- (select-window win))))
-
-(defun pdf-outline-noselect (&optional buffer)
- "Create an PDF outline of BUFFER, but don't display it."
- (save-current-buffer
- (and buffer (set-buffer buffer))
- (pdf-util-assert-pdf-buffer)
- (let* ((pdf-buffer (current-buffer))
- (pdf-file (pdf-view-buffer-file-name))
- (pdf-window (and (eq pdf-buffer (window-buffer))
- (selected-window)))
- (bname (pdf-outline-buffer-name))
- (buffer-exists-p (get-buffer bname))
- (buffer (get-buffer-create bname)))
- (with-current-buffer buffer
- (unless buffer-exists-p
- (when (= 0 (save-excursion
- (pdf-outline-insert-outline pdf-buffer)))
- (kill-buffer buffer)
- (error "PDF has no outline"))
- (pdf-outline-buffer-mode))
- (set (make-local-variable 'other-window-scroll-buffer)
- pdf-buffer)
- (setq pdf-outline-pdf-window pdf-window
- pdf-outline-pdf-document (or pdf-file pdf-buffer))
- (current-buffer)))))
-
-(defun pdf-outline-buffer-name (&optional pdf-buffer)
- (unless pdf-buffer (setq pdf-buffer (current-buffer)))
- (let ((buf (format "*Outline %s*" (buffer-name pdf-buffer))))
- ;; (when (buffer-live-p (get-buffer buf))
- ;; (kill-buffer buf))
- buf))
-
-(defun pdf-outline-insert-outline (pdf-buffer)
- (let ((labels (and pdf-outline-display-labels
- (pdf-info-pagelabels pdf-buffer)))
- (nitems 0))
- (dolist (item (pdf-info-outline pdf-buffer))
- (let-alist item
- (when (eq .type 'goto-dest)
- (insert-text-button
- (concat
- (make-string (* (1- .depth) pdf-outline-buffer-indent) ?\s)
- .title
- (if (> .page 0)
- (format " (%s)"
- (if labels
- (nth (1- .page) labels)
- .page))
- "(invalid)"))
- 'type 'pdf-outline
- 'help-echo (pdf-links-action-to-string item)
- 'pdf-outline-link item)
- (newline)
- (cl-incf nitems))))
- nitems))
-
-(defun pdf-outline-get-pdf-window (&optional if-visible-p)
- (save-selected-window
- (let* ((buffer (cond
- ((buffer-live-p pdf-outline-pdf-document)
- pdf-outline-pdf-document)
- ((bufferp pdf-outline-pdf-document)
- (error "PDF buffer was killed"))
- (t
- (or
- (find-buffer-visiting
- pdf-outline-pdf-document)
- (find-file-noselect
- pdf-outline-pdf-document)))))
- (pdf-window
- (if (and (window-live-p pdf-outline-pdf-window)
- (eq buffer
- (window-buffer pdf-outline-pdf-window)))
- pdf-outline-pdf-window
- (or (get-buffer-window buffer)
- (and (null if-visible-p)
- (display-buffer
- buffer
- '(nil (inhibit-same-window . t))))))))
- (setq pdf-outline-pdf-window pdf-window))))
-
-
-;;
-;; Commands
-;;
-
-(defun pdf-outline-move-to-current-page ()
- "Move to the item corresponding to the current page.
-
-Open nodes as necessary."
- (interactive)
- (let (page)
- (with-selected-window (pdf-outline-get-pdf-window)
- (setq page (pdf-view-current-page)))
- (pdf-outline-move-to-page page)))
-
-(defun pdf-outline-quit-and-kill ()
- "Quit browsing the outline and kill it's buffer."
- (interactive)
- (pdf-outline-quit t))
-
-(defun pdf-outline-quit (&optional kill)
- "Quit browsing the outline buffer."
- (interactive "P")
- (let ((win (selected-window)))
- (pdf-outline-select-pdf-window t)
- (quit-window kill win)))
-
-(defun pdf-outline-up-heading (arg &optional invisible-ok)
- "Like `outline-up-heading', but `push-mark' first."
- (interactive "p")
- (let ((pos (point)))
- (outline-up-heading arg invisible-ok)
- (unless (= pos (point))
- (push-mark pos))))
-
-(defun pdf-outline-end-of-buffer ()
- "Move to the end of the outline buffer."
- (interactive)
- (let ((pos (point)))
- (goto-char (point-max))
- (when (and (eobp)
- (not (bobp))
- (null (button-at (point))))
- (forward-line -1))
- (unless (= pos (point))
- (push-mark pos))))
-
-(defun pdf-outline-link-at-pos (&optional pos)
- (unless pos (setq pos (point)))
- (let ((button (or (button-at pos)
- (button-at (1- pos)))))
- (and button
- (button-get button
- 'pdf-outline-link))))
-
-(defun pdf-outline-follow-link (&optional pos)
- "Select PDF window and move to the page corresponding to POS."
- (interactive)
- (unless pos (setq pos (point)))
- (let ((link (pdf-outline-link-at-pos pos)))
- (unless link
- (error "Nothing to follow here"))
- (select-window (pdf-outline-get-pdf-window))
- (pdf-links-action-perform link)))
-
-(defun pdf-outline-follow-link-and-quit (&optional pos)
- "Select PDF window and move to the page corresponding to POS.
-
-Then quit the outline window."
- (interactive)
- (let ((link (pdf-outline-link-at-pos (or pos (point)))))
- (pdf-outline-quit)
- (unless link
- (error "Nothing to follow here"))
- (pdf-links-action-perform link)))
-
-(defun pdf-outline-display-link (&optional pos)
- "Display the page corresponding to the link at POS."
- (interactive)
- (unless pos (setq pos (point)))
- (let ((inhibit-redisplay t)
- (link (pdf-outline-link-at-pos pos)))
- (unless link
- (error "Nothing to follow here"))
- (with-selected-window (pdf-outline-get-pdf-window)
- (pdf-links-action-perform link))
- (force-mode-line-update t)))
-
-(defun pdf-outline-mouse-display-link (event)
- "Display the page corresponding to the position of EVENT."
- (interactive "@e")
- (pdf-outline-display-link
- (posn-point (event-start event))))
-
-(defun pdf-outline-select-pdf-window (&optional no-create-p)
- "Display and select the PDF document window."
- (interactive)
- (let ((win (pdf-outline-get-pdf-window no-create-p)))
- (and (window-live-p win)
- (select-window win))))
-
-(defun pdf-outline-toggle-subtree ()
- "Toggle hidden state of the current complete subtree."
- (interactive)
- (save-excursion
- (outline-back-to-heading)
- (if (not (outline-invisible-p (line-end-position)))
- (hide-subtree)
- (show-subtree))))
-
-(defun pdf-outline-move-to-page (page)
- "Move to an outline item corresponding to PAGE."
- (interactive
- (list (or (and current-prefix-arg
- (prefix-numeric-value current-prefix-arg))
- (read-number "Page: "))))
- (goto-char (pdf-outline-position-of-page page))
- (save-excursion
- (while (outline-invisible-p)
- (outline-up-heading 1 t)
- (show-children)))
- (save-excursion
- (when (outline-invisible-p)
- (outline-up-heading 1 t)
- (show-children)))
- (back-to-indentation))
-
-(defun pdf-outline-position-of-page (page)
- (let (curpage)
- (save-excursion
- (goto-char (point-min))
- (while (and (setq curpage (alist-get 'page (pdf-outline-link-at-pos)))
- (< curpage page))
- (forward-line))
- (point))))
-
-
-
-;;
-;; Imenu Support
-;;
-
-
-;;;###autoload
-(defun pdf-outline-imenu-enable ()
- "Enable imenu in the current PDF buffer."
- (interactive)
- (pdf-util-assert-pdf-buffer)
- (setq-local imenu-create-index-function
- (if pdf-outline-imenu-use-flat-menus
- 'pdf-outline-imenu-create-index-flat
- 'pdf-outline-imenu-create-index-tree))
- (imenu-add-to-menubar "PDF Outline"))
-
-(defun pdf-outline-imenu-disable ()
- "Disable imenu in the current PDF buffer."
- (interactive)
- (pdf-util-assert-pdf-buffer)
- (setq-local imenu-create-index-function nil)
- (local-set-key [menu-bar index] nil)
- (when (eq pdf-view-mode-map
- (keymap-parent (current-local-map)))
- (use-local-map (keymap-parent (current-local-map)))))
-
-
-(defun pdf-outline-imenu-create-item (link &optional labels)
- (let-alist link
- (list (format "%s (%s)" .title (if labels
- (nth (1- .page) labels)
- .page))
- 0
- 'pdf-outline-imenu-activate-link
- link)))
-
-(defun pdf-outline-imenu-create-index-flat ()
- (let ((labels (and pdf-outline-display-labels
- (pdf-info-pagelabels)))
- index)
- (dolist (item (pdf-info-outline))
- (let-alist item
- (when (eq .type 'goto-dest)
- (push (pdf-outline-imenu-create-item item labels)
- index))))
- (nreverse index)))
-
-
-(defun pdf-outline-imenu-create-index-tree ()
- (pdf-outline-imenu-create-index-tree-1
- (pdf-outline-treeify-outline-list
- (cl-remove-if-not
- (lambda (type)
- (eq type 'goto-dest))
- (pdf-info-outline)
- :key (apply-partially 'alist-get 'type)))
- (and pdf-outline-display-labels
- (pdf-info-pagelabels))))
-
-(defun pdf-outline-imenu-create-index-tree-1 (nodes &optional labels)
- (mapcar (lambda (node)
- (let (children)
- (when (consp (caar node))
- (setq children (cdr node)
- node (car node)))
- (let ((item
- (pdf-outline-imenu-create-item node labels)))
- (if children
- (cons (alist-get 'title node)
- (cons item (pdf-outline-imenu-create-index-tree-1
- children labels)))
- item))))
- nodes))
-
-(defun pdf-outline-treeify-outline-list (list)
- (when list
- (let ((depth (alist-get 'depth (car list)))
- result)
- (while (and list
- (>= (alist-get 'depth (car list))
- depth))
- (when (= (alist-get 'depth (car list)) depth)
- (let ((item (car list)))
- (when (and (cdr list)
- (> (alist-get 'depth (cadr list))
- depth))
- (setq item
- (cons
- item
- (pdf-outline-treeify-outline-list (cdr list)))))
- (push item result)))
- (setq list (cdr list)))
- (reverse result))))
-
-(defun pdf-outline-imenu-activate-link (&rest args)
- ;; bug #14029
- (when (eq (nth 2 args) 'pdf-outline-imenu-activate-link)
- (setq args (cdr args)))
- (pdf-links-action-perform (nth 2 args)))
-
-(defadvice imenu--split-menu (around pdf-outline activate)
- "Advice to keep the original outline order.
-
- Calls `pdf-outline-imenu--split-menu' instead, if in a PDF
- buffer and `pdf-outline-imenu-keep-order' is non-nil."
- (if (not (and (pdf-util-pdf-buffer-p)
- pdf-outline-imenu-keep-order))
- ad-do-it
- (setq ad-return-value
- (pdf-outline-imenu--split-menu menulist title))))
-
-(defvar imenu--rescan-item)
-(defvar imenu-sort-function)
-(defvar imenu-create-index-function)
-(defvar imenu-max-items)
-
-(defun pdf-outline-imenu--split-menu (menulist title)
- "Replacement function for `imenu--split-menu'.
-
-This function does not move sub-menus to the top, therefore
-keeping the original outline order of the document. Also it does
-not call `imenu-sort-function'."
- (let ((menulist (copy-sequence menulist))
- keep-at-top)
- (if (memq imenu--rescan-item menulist)
- (setq keep-at-top (list imenu--rescan-item)
- menulist (delq imenu--rescan-item menulist)))
- (if (> (length menulist) imenu-max-items)
- (setq menulist
- (mapcar
- (lambda (menu)
- (cons (format "From: %s" (caar menu)) menu))
- (imenu--split menulist imenu-max-items))))
- (cons title
- (nconc (nreverse keep-at-top) menulist))))
-
-;; bugfix for imenu in Emacs 24.3 and below.
-(when (condition-case nil
- (progn (imenu--truncate-items '(("" 0))) nil)
- (error t))
- (eval-after-load "imenu"
- '(defun imenu--truncate-items (menulist)
- "Truncate all strings in MENULIST to `imenu-max-item-length'."
- (mapc (lambda (item)
- ;; Truncate if necessary.
- (when (and (numberp imenu-max-item-length)
- (> (length (car item)) imenu-max-item-length))
- (setcar item (substring (car item) 0 imenu-max-item-length)))
- (when (imenu--subalist-p item)
- (imenu--truncate-items (cdr item))))
- menulist))))
-
-
-
-(provide 'pdf-outline)
-
-;;; pdf-outline.el ends here
-
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
diff --git a/elpa/pdf-tools-20200512.1524/pdf-sync.el b/elpa/pdf-tools-20200512.1524/pdf-sync.el
deleted file mode 100644
index 54eb4fa..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-sync.el
+++ /dev/null
@@ -1,781 +0,0 @@
-;;; pdf-sync.el --- Use synctex to correlate LaTeX-Sources with PDF positions. -*- lexical-binding:t -*-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, doc-view, pdf
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; The backward search uses a heuristic, which is pretty simple, but
-;; effective: It extracts the text around the click-position in the
-;; PDF, normalizes it's whitespace, deletes certain notorious
-;; character and translates certain other character into their latex
-;; equivalents. This transformed text is split into a series of
-;; token. A similar operation is performed on the source code around
-;; the position synctex points at. These two sequences of token are
-;; aligned with a standard sequence alignment algorithm, resulting in
-;; an alist of matched and unmatched tokens. This is then used to
-;; find the corresponding word from the PDF file in the LaTeX buffer.
-
-
-(require 'pdf-view)
-(require 'pdf-info)
-(require 'pdf-util)
-(require 'let-alist)
-
-;;; Code:
-
-(defgroup pdf-sync nil
- "Jump from TeX sources to PDF pages and back."
- :group 'pdf-tools)
-
-(defcustom pdf-sync-forward-display-pdf-key "C-c C-g"
- "Key to jump from a TeX buffer to it's PDF file.
-
-This key is added to `TeX-source-correlate-method', when
-command `pdf-sync-minor-mode' is activated and this map is defined."
- :group 'pdf-sync
- :type 'key-sequence)
-
-(make-obsolete-variable
- 'pdf-sync-forward-display-pdf-key
- "Bound in Auctex's to C-c C-v, if TeX-source-correlate-mode is activate." "1.0")
-
-(defcustom pdf-sync-backward-hook nil
- "Hook ran after going to a source location.
-
-The hook is run in the TeX buffer."
- :group 'pdf-sync
- :type 'hook
- :options '(pdf-sync-backward-beginning-of-word))
-
-(defcustom pdf-sync-forward-hook nil
- "Hook ran after displaying the PDF buffer.
-
-The hook is run in the PDF's buffer."
- :group 'pdf-sync
- :type 'hook)
-
-(defcustom pdf-sync-forward-display-action nil
- "Display action used when displaying PDF buffers."
- :group 'pdf-sync
- :type 'display-buffer--action-custom-type)
-
-(defcustom pdf-sync-backward-display-action nil
- "Display action used when displaying TeX buffers."
- :group 'pdf-sync
- :type 'display-buffer--action-custom-type)
-
-(defcustom pdf-sync-locate-synctex-file-functions nil
- "A list of functions for locating the synctex database.
-
-Each function on this hook should accept a single argument: The
-absolute path of a PDF file. It should return the absolute path
-of the corresponding synctex database or nil, if it was unable to
-locate it."
- :group 'pdf-sync
- :type 'hook)
-
-(defvar pdf-sync-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap [double-mouse-1] 'pdf-sync-backward-search-mouse)
- (define-key kmap [C-mouse-1] 'pdf-sync-backward-search-mouse)
- kmap))
-
-(defcustom pdf-sync-backward-redirect-functions nil
- "List of functions which may redirect a backward search.
-
-Functions on this hook should accept three arguments, namely
-SOURCE, LINE and COLUMN, where SOURCE is the absolute filename of
-the source file and LINE and COLUMN denote the position in the
-file. COLUMN may be negative, meaning unspecified.
-
-These functions should either return nil, if no redirection is
-necessary. Or a list of the same structure, with some or all (or
-none) values modified.
-
-AUCTeX installs a function here which changes the backward search
-location for synthetic `TeX-region' files back to the equivalent
-position in the original tex file."
- :group 'pdf-sync
- :type '(repeat function))
-
-
-;;;###autoload
-(define-minor-mode pdf-sync-minor-mode
- "Correlate a PDF position with the TeX file.
-\\<pdf-sync-minor-mode-map>
-This works via SyncTeX, which means the TeX sources need to have
-been compiled with `--synctex=1'. In AUCTeX this can be done by
-setting `TeX-source-correlate-method' to 'synctex \(before AUCTeX
-is loaded\) and enabling `TeX-source-correlate-mode'.
-
-Then \\[pdf-sync-backward-search-mouse] in the PDF buffer will open the
-corresponding TeX location.
-
-If AUCTeX is your preferred tex-mode, this library arranges to
-bind `pdf-sync-forward-display-pdf-key' \(the default is `C-c C-g'\)
-to `pdf-sync-forward-search' in `TeX-source-correlate-map'. This
-function displays the PDF page corresponding to the current
-position in the TeX buffer. This function only works together
-with AUCTeX."
-
- nil nil nil
- (pdf-util-assert-pdf-buffer))
-
-
-;; * ================================================================== *
-;; * Backward search (PDF -> TeX)
-;; * ================================================================== *
-
-(defcustom pdf-sync-backward-use-heuristic t
- "Whether to apply a heuristic when backward searching.
-
-If nil, just go where Synctex tells us. Otherwise try to find
-the exact location of the clicked-upon text in the PDF."
- :group 'pdf-sync
- :type 'boolean)
-
-(defcustom pdf-sync-backward-text-translations
- '((88 "X" "sum")
- (94 "textasciicircum")
- (126 "textasciitilde")
- (169 "copyright" "textcopyright")
- (172 "neg" "textlnot")
- (174 "textregistered" "textregistered")
- (176 "textdegree")
- (177 "pm" "textpm")
- (181 "upmu" "mu")
- (182 "mathparagraph" "textparagraph" "P" "textparagraph")
- (215 "times")
- (240 "eth" "dh")
- (915 "Upgamma" "Gamma")
- (920 "Uptheta" "Theta")
- (923 "Uplambda" "Lambda")
- (926 "Upxi" "Xi")
- (928 "Uppi" "Pi")
- (931 "Upsigma" "Sigma")
- (933 "Upupsilon" "Upsilon")
- (934 "Upphi" "Phi")
- (936 "Uppsi" "Psi")
- (945 "upalpha" "alpha")
- (946 "upbeta" "beta")
- (947 "upgamma" "gamma")
- (948 "updelta" "delta")
- (949 "upvarepsilon" "varepsilon")
- (950 "upzeta" "zeta")
- (951 "upeta" "eta")
- (952 "uptheta" "theta")
- (953 "upiota" "iota")
- (954 "upkappa" "varkappa" "kappa")
- (955 "uplambda" "lambda")
- (957 "upnu" "nu")
- (958 "upxi" "xi")
- (960 "uppi" "pi")
- (961 "upvarrho" "uprho" "rho")
- (962 "varsigma")
- (963 "upvarsigma" "upsigma" "sigma")
- (964 "uptau" "tau")
- (965 "upupsilon" "upsilon")
- (966 "upphi" "phi")
- (967 "upchi" "chi")
- (968 "uppsi" "psi")
- (969 "upomega" "omega")
- (977 "upvartheta" "vartheta")
- (981 "upvarphi" "varphi")
- (8224 "dagger")
- (8225 "ddagger")
- (8226 "bullet")
- (8486 "Upomega" "Omega")
- (8501 "aleph")
- (8592 "mapsfrom" "leftarrow")
- (8593 "uparrow")
- (8594 "to" "mapsto" "rightarrow")
- (8595 "downarrow")
- (8596 "leftrightarrow")
- (8656 "shortleftarrow" "Leftarrow")
- (8657 "Uparrow")
- (8658 "Mapsto" "rightrightarrows" "Rightarrow")
- (8659 "Downarrow")
- (8660 "Leftrightarrow")
- (8704 "forall")
- (8706 "partial")
- (8707 "exists")
- (8709 "varnothing" "emptyset")
- (8710 "Updelta" "Delta")
- (8711 "nabla")
- (8712 "in")
- (8722 "-")
- (8725 "setminus")
- (8727 "*")
- (8734 "infty")
- (8743 "wedge")
- (8744 "vee")
- (8745 "cap")
- (8746 "cup")
- (8756 "therefore")
- (8757 "because")
- (8764 "thicksim" "sim")
- (8776 "thickapprox" "approx")
- (8801 "equiv")
- (8804 "leq")
- (8805 "geq")
- (8810 "lll")
- (8811 "ggg")
- (8814 "nless")
- (8815 "ngtr")
- (8822 "lessgtr")
- (8823 "gtrless")
- (8826 "prec")
- (8832 "nprec")
- (8834 "subset")
- (8835 "supset")
- (8838 "subseteq")
- (8839 "supseteq")
- (8853 "oplus")
- (8855 "otimes")
- (8869 "bot" "perp")
- (9702 "circ")
- (9792 "female" "venus")
- (9793 "earth")
- (9794 "male" "mars")
- (9824 "spadesuit")
- (9827 "clubsuit")
- (9829 "heartsuit")
- (9830 "diamondsuit"))
- "Alist mapping PDF character to a list of LaTeX macro names.
-
-Adding a character here with it's LaTeX equivalent names allows
-the heuristic backward search to find it's location in the source
-file. These strings should not match
-`pdf-sync-backward-source-flush-regexp'.
-
-Has no effect if `pdf-sync-backward-use-heuristic' is nil."
- :group 'pdf-sync
- :type '(alist :key-type character
- :value-type (repeat string)))
-
-(defconst pdf-sync-backward-text-flush-regexp
- "[][.·{}|\\]\\|\\C.\\|-\n+"
- "Regexp of ignored text when backward searching.")
-
-(defconst pdf-sync-backward-source-flush-regexp
- "\\(?:\\\\\\(?:begin\\|end\\|\\(?:eq\\)?ref\\|label\\|cite\\){[^}]*}\\)\\|[][\\&{}$_]"
- "Regexp of ignored source when backward searching.")
-
-(defconst pdf-sync-backward-context-limit 64
- "Number of character to include in the backward search.")
-
-(defun pdf-sync-backward-search-mouse (ev)
- "Go to the source corresponding to position at event EV."
- (interactive "@e")
- (let* ((posn (event-start ev))
- (image (posn-image posn))
- (xy (posn-object-x-y posn)))
- (unless image
- (error "Outside of image area"))
- (pdf-sync-backward-search (car xy) (cdr xy))))
-
-(defun pdf-sync-backward-search (x y)
- "Go to the source corresponding to image coordinates X, Y.
-
-Try to find the exact position, if
-`pdf-sync-backward-use-heuristic' is non-nil."
- (cl-destructuring-bind (source finder)
- (pdf-sync-backward-correlate x y)
- (pop-to-buffer (or (find-buffer-visiting source)
- (find-file-noselect source))
- pdf-sync-backward-display-action)
- (push-mark)
- (funcall finder)
- (run-hooks 'pdf-sync-backward-hook)))
-
-(defun pdf-sync-backward-correlate (x y)
- "Find the source corresponding to image coordinates X, Y.
-
-Returns a list \(SOURCE FINDER\), where SOURCE is the name of the
-TeX file and FINDER a function of zero arguments which, when
-called in the buffer of the aforementioned file, will try to move
-point to the correct position."
-
- (pdf-util-assert-pdf-window)
- (let ((size (pdf-view-image-size))
- (page (pdf-view-current-page)))
- (setq x (/ x (float (car size)))
- y (/ y (float (cdr size))))
- (let-alist (pdf-info-synctex-backward-search page x y)
- (let ((data (list (expand-file-name .filename)
- .line .column)))
- (cl-destructuring-bind (source line column)
- (or (save-selected-window
- (apply 'run-hook-with-args-until-success
- 'pdf-sync-backward-redirect-functions data))
- data)
- (list source
- (if (not pdf-sync-backward-use-heuristic)
- (lambda nil
- (pdf-util-goto-position line column))
- (let ((context (pdf-sync-backward--get-text-context page x y)))
- (lambda nil
- (pdf-sync-backward--find-position line column context))))))))))
-
-(defun pdf-sync-backward--find-position (line column context)
- (pdf-util-goto-position line column)
- (cl-destructuring-bind (windex chindex words)
- context
- (let* ((swords (pdf-sync-backward--get-source-context
- nil (* 6 pdf-sync-backward-context-limit)))
- (similarity-fn (lambda (text source)
- (if (if (consp text)
- (member source text)
- (equal text source))
- 1024 -1024)))
- (alignment
- (pdf-util-seq-alignment
- words swords similarity-fn 'infix)))
- (setq alignment (cl-remove-if-not 'car (cdr alignment)))
- (cl-assert (< windex (length alignment)))
-
- (let ((word (cdr (nth windex alignment))))
- (unless word
- (setq chindex 0
- word (cdr (nth (1+ windex) alignment))))
- (unless word
- (setq word (cdr (nth (1- windex) alignment))
- chindex (length word)))
- (when word
- (cl-assert (get-text-property 0 'position word) t)
- (goto-char (get-text-property 0 'position word))
- (forward-char chindex))))))
-
-(defun pdf-sync-backward--get-source-context (&optional position limit)
- (save-excursion
- (when position (goto-char position))
- (goto-char (line-beginning-position))
- (let* ((region
- (cond
- ((eq limit 'line)
- (cons (line-beginning-position)
- (line-end-position)))
-
- ;; Synctex usually jumps to the end macro, in case it
- ;; does not understand the environment.
- ((and (fboundp 'LaTeX-find-matching-begin)
- (looking-at " *\\\\\\(end\\){"))
- (cons (or (ignore-errors
- (save-excursion
- (LaTeX-find-matching-begin)
- (forward-line 1)
- (point)))
- (point))
- (point)))
- ((and (fboundp 'LaTeX-find-matching-end)
- (looking-at " *\\\\\\(begin\\){"))
- (goto-char (line-end-position))
- (cons (point)
- (or (ignore-errors
- (save-excursion
- (LaTeX-find-matching-end)
- (forward-line 0)
- (point)))
- (point))))
- (t (cons (point) (point)))))
- (begin (car region))
- (end (cdr region)))
- (when (numberp limit)
- (let ((delta (- limit (- end begin))))
- (when (> delta 0)
- (setq begin (max (point-min)
- (- begin (/ delta 2)))
- end (min (point-max)
- (+ end (/ delta 2)))))))
- (let ((string (buffer-substring-no-properties begin end)))
- (dotimes (i (length string))
- (put-text-property i (1+ i) 'position (+ begin i) string))
- (nth 2 (pdf-sync-backward--tokenize
- (pdf-sync-backward--source-strip-comments string)
- nil
- pdf-sync-backward-source-flush-regexp))))))
-
-(defun pdf-sync-backward--source-strip-comments (string)
- "Strip all standard LaTeX comments from string."
- (with-temp-buffer
- (save-excursion (insert string))
- (while (re-search-forward
- "^\\(?:[^\\\n]\\|\\(?:\\\\\\\\\\)\\)*\\(%.*\\)" nil t)
- (delete-region (match-beginning 1) (match-end 1)))
- (buffer-string)))
-
-(defun pdf-sync-backward--get-text-context (page x y)
- (cl-destructuring-bind (&optional char edges)
- (car (pdf-info-charlayout page (cons x y)))
- (when edges
- (setq x (nth 0 edges)
- y (nth 1 edges)))
- (let* ((prefix (pdf-info-gettext page (list 0 0 x y)))
- (suffix (pdf-info-gettext page (list x y 1 1)))
- (need-suffix-space-p (memq char '(?\s ?\n)))
- ;; Figure out whether we missed a space by matching the
- ;; prefix's suffix with the line's prefix. Due to the text
- ;; extraction in poppler, spaces are only inserted in
- ;; between words. This test may fail, if prefix and line
- ;; do not overlap, which may happen in various cases, but
- ;; we don't care.
- (need-prefix-space-p
- (and (not need-suffix-space-p)
- (memq
- (ignore-errors
- (aref (pdf-info-gettext page (list x y x y) 'line)
- (- (length prefix)
- (or (cl-position ?\n prefix :from-end t)
- -1)
- 1)))
- '(?\s ?\n)))))
- (setq prefix
- (concat
- (substring
- prefix (max 0 (min (1- (length prefix))
- (- (length prefix)
- pdf-sync-backward-context-limit))))
- (if need-prefix-space-p " "))
- suffix
- (concat
- (if need-suffix-space-p " ")
- (substring
- suffix 0 (max 0 (min (1- (length suffix))
- pdf-sync-backward-context-limit)))))
- (pdf-sync-backward--tokenize
- prefix suffix
- pdf-sync-backward-text-flush-regexp
- pdf-sync-backward-text-translations))))
-
-(defun pdf-sync-backward--tokenize (prefix &optional suffix flush-re translation)
- (with-temp-buffer
- (when prefix (insert prefix))
- (let* ((center (copy-marker (point)))
- (case-fold-search nil))
- (when suffix (insert suffix))
- (goto-char 1)
- ;; Delete ignored text.
- (when flush-re
- (save-excursion
- (while (re-search-forward flush-re nil t)
- (replace-match " " t t))))
- ;; Normalize whitespace.
- (save-excursion
- (while (re-search-forward "[ \t\f\n]+" nil t)
- (replace-match " " t t)))
- ;; Split words and non-words
- (save-excursion
- (while (re-search-forward "[^ ]\\b\\|[^ [:alnum:]]" nil t)
- (insert-before-markers " ")))
- ;; Replace character
- (let ((translate
- (lambda (string)
- (or (and (= (length string) 1)
- (cdr (assq (aref string 0)
- translation)))
- string)))
- words
- (windex -1)
- (chindex 0))
- (skip-chars-forward " ")
- (while (and (not (eobp))
- (<= (point) center))
- (cl-incf windex)
- (skip-chars-forward "^ ")
- (skip-chars-forward " "))
- (goto-char center)
- (when (eq ?\s (char-after))
- (skip-chars-backward " "))
- (setq chindex (- (skip-chars-backward "^ ")))
- (setq words (split-string (buffer-string)))
- (when translation
- (setq words (mapcar translate words)))
- (list windex chindex words)))))
-
-(defun pdf-sync-backward-beginning-of-word ()
- "Maybe move to the beginning of the word.
-
-Don't move if already at the beginning, or if not at a word
-character.
-
-This function is meant to be put on `pdf-sync-backward-hook', when
-word-level searching is desired."
- (interactive)
- (unless (or (looking-at "\\b\\w")
- (not (looking-back "\\w" (1- (point)))))
- (backward-word)))
-
-;; * ------------------------------------------------------------------ *
-;; * Debugging backward search
-;; * ------------------------------------------------------------------ *
-
-(defvar pdf-sync-backward-debug-trace nil)
-
-(defun pdf-sync-backward-debug-wrapper (fn-symbol fn &rest args)
- (cond
- ((eq fn-symbol 'pdf-sync-backward-search)
- (setq pdf-sync-backward-debug-trace nil)
- (apply fn args))
- (t
- (let ((retval (apply fn args)))
- (push `(,args . ,retval)
- pdf-sync-backward-debug-trace)
- retval))))
-
-(define-minor-mode pdf-sync-backward-debug-minor-mode
- "Aid in debugging the backward search."
- nil nil nil
- (if (and (fboundp 'advice-add)
- (fboundp 'advice-remove))
- (let ((functions
- '(pdf-sync-backward-search
- pdf-sync-backward--tokenize
- pdf-util-seq-alignment)))
- (cond
- (pdf-sync-backward-debug-minor-mode
- (dolist (fn functions)
- (advice-add fn :around (apply-partially 'pdf-sync-backward-debug-wrapper
- fn)
- `((name . ,(format "%s-debug" fn))))))
- (t
- (dolist (fn functions)
- (advice-remove fn (format "%s-debug" fn))))))
- (error "Need Emacs version >= 24.4")))
-
-(defun pdf-sync-backward-debug-explain ()
- "Explain the last backward search.
-
-Needs to have `pdf-sync-backward-debug-minor-mode' enabled."
-
- (interactive)
- (unless pdf-sync-backward-debug-trace
- (error "No last search or `pdf-sync-backward-debug-minor-mode' not enabled."))
-
- (with-current-buffer (get-buffer-create "*pdf-sync-backward trace*")
- (cl-destructuring-bind (text source alignment &rest ignored)
- (reverse pdf-sync-backward-debug-trace)
- (let* ((fill-column 68)
- (sep (format "\n%s\n" (make-string fill-column ?-)))
- (highlight '(:background "chartreuse" :foreground "black"))
- (or-sep "|")
- (inhibit-read-only t)
- (windex (nth 0 (cdr text)))
- (chindex (nth 1 (cdr text))))
- (erase-buffer)
- (font-lock-mode -1)
- (view-mode 1)
- (insert (propertize "Text Raw:" 'face 'font-lock-keyword-face))
- (insert sep)
- (insert (nth 0 (car text)))
- (insert (propertize "<|>" 'face highlight))
- (insert (nth 1 (car text)))
- (insert sep)
- (insert (propertize "Text Token:" 'face 'font-lock-keyword-face))
- (insert sep)
- (fill-region (point)
- (progn
- (insert
- (mapconcat (lambda (elt)
- (if (consp elt)
- (mapconcat 'identity elt or-sep)
- elt))
- (nth 2 (cdr text)) " "))
- (point)))
- (insert sep)
-
- (insert (propertize "Source Raw:" 'face 'font-lock-keyword-face))
- (insert sep)
- (insert (nth 0 (car source)))
- (insert sep)
- (insert (propertize "Source Token:" 'face 'font-lock-keyword-face))
- (insert sep)
- (fill-region (point)
- (progn (insert (mapconcat 'identity (nth 2 (cdr source)) " "))
- (point)))
- (insert sep)
-
- (insert (propertize "Alignment:" 'face 'font-lock-keyword-face))
- (insert (format " (windex=%d, chindex=%d" windex chindex))
- (insert sep)
- (save-excursion (newline 2))
- (let ((column 0)
- (index 0))
- (dolist (a (cdr (cdr alignment)))
- (let* ((source (cdr a))
- (text (if (consp (car a))
- (mapconcat 'identity (car a) or-sep)
- (car a)))
- (extend (max (length text)
- (length source))))
- (when (and (not (bolp))
- (> (+ column extend)
- fill-column))
- (forward-line 2)
- (newline 3)
- (forward-line -2)
- (setq column 0))
- (when text
- (insert (propertize text 'face
- (if (= index windex)
- highlight
- (if source 'match
- 'lazy-highlight)))))
- (move-to-column (+ column extend) t)
- (insert " ")
- (save-excursion
- (forward-line)
- (move-to-column column t)
- (when source
- (insert (propertize source 'face (if text
- 'match
- 'lazy-highlight))))
- (move-to-column (+ column extend) t)
- (insert " "))
- (cl-incf column (+ 1 extend))
- (when text (cl-incf index)))))
- (goto-char (point-max))
- (insert sep)
- (goto-char 1)
- (pop-to-buffer (current-buffer))))))
-
-
-;; * ================================================================== *
-;; * Forward search (TeX -> PDF)
-;; * ================================================================== *
-
-(defun pdf-sync-forward-search (&optional line column)
- "Display the PDF location corresponding to LINE, COLUMN."
- (interactive)
- (cl-destructuring-bind (pdf page _x1 y1 _x2 _y2)
- (pdf-sync-forward-correlate line column)
- (let ((buffer (or (find-buffer-visiting pdf)
- (find-file-noselect pdf))))
- (with-selected-window (display-buffer
- buffer pdf-sync-forward-display-action)
- (pdf-util-assert-pdf-window)
- (when page
- (pdf-view-goto-page page)
- (when y1
- (let ((top (* y1 (cdr (pdf-view-image-size)))))
- (pdf-util-tooltip-arrow (round top))))))
- (with-current-buffer buffer
- (run-hooks 'pdf-sync-forward-hook)))))
-
-(defun pdf-sync-forward-correlate (&optional line column)
- "Find the PDF location corresponding to LINE, COLUMN.
-
-Returns a list \(PDF PAGE X1 Y1 X2 Y2\), where PAGE, X1, Y1, X2
-and Y2 may be nil, if the destination could not be found."
- (unless (fboundp 'TeX-master-file)
- (error "This function works only with AUCTeX"))
- (unless line (setq line (line-number-at-pos)))
- (unless column (setq column (current-column)))
-
- (let* ((pdf (expand-file-name
- (with-no-warnings (TeX-master-file "pdf"))))
- (sfilename (pdf-sync-synctex-file-name
- (buffer-file-name) pdf)))
- (cons pdf
- (condition-case error
- (let-alist (pdf-info-synctex-forward-search
- (or sfilename
- (buffer-file-name))
- line column pdf)
- (cons .page .edges))
- (error
- (message "%s" (error-message-string error))
- (list nil nil nil nil nil))))))
-
-
-
-;; * ================================================================== *
-;; * Dealing with synctex files.
-;; * ================================================================== *
-
-(defun pdf-sync-locate-synctex-file (pdffile)
- "Locate the synctex database corresponding to PDFFILE.
-
-Returns either the absolute path of the database or nil.
-
-See also `pdf-sync-locate-synctex-file-functions'."
- (cl-check-type pdffile string)
- (setq pdffile (expand-file-name pdffile))
- (or (run-hook-with-args-until-success
- 'pdf-sync-locate-synctex-file-functions pdffile)
- (pdf-sync-locate-synctex-file-default pdffile)))
-
-(defun pdf-sync-locate-synctex-file-default (pdffile)
- "The default function for locating a synctex database for PDFFILE.
-
-See also `pdf-sync-locate-synctex-file'."
- (let ((default-directory
- (file-name-directory pdffile))
- (basename (file-name-sans-extension
- (file-name-nondirectory pdffile))))
- (cl-labels ((file-if-exists-p (file)
- (and (file-exists-p file)
- file)))
- (or (file-if-exists-p
- (expand-file-name (concat basename ".synctex.gz")))
- (file-if-exists-p
- (expand-file-name (concat basename ".synctex")))
- ;; Some pdftex quote the basename.
- (file-if-exists-p
- (expand-file-name (concat "\"" basename "\"" ".synctex.gz")))
- (file-if-exists-p
- (expand-file-name (concat "\"" basename "\"" ".synctex")))))))
-
-(defun pdf-sync-synctex-file-name (filename pdffile)
- "Find SyncTeX filename corresponding to FILENAME in the context of PDFFILE.
-
-This function consults the synctex.gz database of PDFFILE and
-searches for a filename, which is `file-equal-p' to FILENAME.
-The first such filename is returned, or nil if none was found."
-
- (when (file-exists-p filename)
- (setq filename (expand-file-name filename))
- (let* ((synctex (pdf-sync-locate-synctex-file pdffile))
- (basename (file-name-nondirectory filename))
- (regexp (format "^ *Input *: *[^:\n]+ *:\\(.*%s\\)$"
- (regexp-quote basename)))
- (jka-compr-verbose nil))
- (when (and synctex
- (file-readable-p synctex))
- (with-current-buffer (find-file-noselect synctex :nowarn)
- (unless (or (verify-visited-file-modtime)
- (buffer-modified-p))
- (revert-buffer :ignore-auto :noconfirm)
- (goto-char (point-min)))
- ;; Keep point in front of the found filename. It will
- ;; probably be queried for again next time.
- (let ((beg (point))
- (end (point-max)))
- (catch 'found
- (dotimes (_x 2)
- (while (re-search-forward regexp end t)
- (let ((syncname (match-string-no-properties 1)))
- (when (and (file-exists-p syncname)
- (file-equal-p filename syncname))
- (goto-char (point-at-bol))
- (throw 'found syncname))))
- (setq end beg
- beg (point-min))
- (goto-char beg)))))))))
-
-(provide 'pdf-sync)
-;;; pdf-sync.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-tools-autoloads.el b/elpa/pdf-tools-20200512.1524/pdf-tools-autoloads.el
deleted file mode 100644
index 2a17908..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-tools-autoloads.el
+++ /dev/null
@@ -1,430 +0,0 @@
-;;; pdf-tools-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "pdf-annot" "pdf-annot.el" (0 0 0 0))
-;;; Generated autoloads from pdf-annot.el
-
-(autoload 'pdf-annot-minor-mode "pdf-annot" "\
-Support for PDF Annotations.
-
-\\{pdf-annot-minor-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-annot" '("pdf-annot-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-cache" "pdf-cache.el" (0 0 0 0))
-;;; Generated autoloads from pdf-cache.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-cache" '("page" "pdf-cache-" "textregions" "boundingbox" "define-pdf-cache-function")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-dev" "pdf-dev.el" (0 0 0 0))
-;;; Generated autoloads from pdf-dev.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-dev" '("pdf-dev-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-history" "pdf-history.el" (0 0 0 0))
-;;; Generated autoloads from pdf-history.el
-
-(autoload 'pdf-history-minor-mode "pdf-history" "\
-Keep a history of previously visited pages.
-
-This is a simple stack-based history. Turning the page or
-following a link pushes the left-behind page on the stack, which
-may be navigated with the following keys.
-
-\\{pdf-history-minor-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-history" '("pdf-history-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-info" "pdf-info.el" (0 0 0 0))
-;;; Generated autoloads from pdf-info.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-info" '("pdf-info-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-isearch" "pdf-isearch.el" (0 0 0 0))
-;;; Generated autoloads from pdf-isearch.el
-
-(autoload 'pdf-isearch-minor-mode "pdf-isearch" "\
-Isearch mode for PDF buffer.
-
-When this mode is enabled \\[isearch-forward], among other keys,
-starts an incremental search in this PDF document. Since this mode
-uses external programs to highlight found matches via
-image-processing, proceeding to the next match may be slow.
-
-Therefore two isearch behaviours have been defined: Normal isearch and
-batch mode. The later one is a minor mode
-\(`pdf-isearch-batch-mode'), which when activated inhibits isearch
-from stopping at and highlighting every single match, but rather
-display them batch-wise. Here a batch means a number of matches
-currently visible in the selected window.
-
-The kind of highlighting is determined by three faces
-`pdf-isearch-match' (for the current match), `pdf-isearch-lazy'
-\(for all other matches) and `pdf-isearch-batch' (when in batch
-mode), which see.
-
-Colors may also be influenced by the minor-mode
-`pdf-view-dark-minor-mode'. If this is minor mode enabled, each face's
-dark colors, are used (see e.g. `frame-background-mode'), instead
-of the light ones.
-
-\\{pdf-isearch-minor-mode-map}
-While in `isearch-mode' the following keys are available. Note
-that not every isearch command work as expected.
-
-\\{pdf-isearch-active-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-isearch" '("pdf-isearch-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-links" "pdf-links.el" (0 0 0 0))
-;;; Generated autoloads from pdf-links.el
-
-(autoload 'pdf-links-minor-mode "pdf-links" "\
-Handle links in PDF documents.\\<pdf-links-minor-mode-map>
-
-If this mode is enabled, most links in the document may be
-activated by clicking on them or by pressing \\[pdf-links-action-perform] and selecting
-one of the displayed keys, or by using isearch limited to
-links via \\[pdf-links-isearch-link].
-
-\\{pdf-links-minor-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-links-action-perform "pdf-links" "\
-Follow LINK, depending on its type.
-
-This may turn to another page, switch to another PDF buffer or
-invoke `pdf-links-browse-uri-function'.
-
-Interactively, link is read via `pdf-links-read-link-action'.
-This function displays characters around the links in the current
-page and starts reading characters (ignoring case). After a
-sufficient number of characters have been read, the corresponding
-link's link is invoked. Additionally, SPC may be used to
-scroll the current page.
-
-\(fn LINK)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-links" '("pdf-links-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-loader" "pdf-loader.el" (0 0 0 0))
-;;; Generated autoloads from pdf-loader.el
-
-(autoload 'pdf-loader-install "pdf-loader" "\
-Prepare Emacs for using PDF Tools.
-
-This function acts as a replacement for `pdf-tools-install' and
-makes Emacs load and use PDF Tools as soon as a PDF file is
-opened, but not sooner.
-
-The arguments are passed verbatim to `pdf-tools-install', which
-see.
-
-\(fn &optional NO-QUERY-P SKIP-DEPENDENCIES-P NO-ERROR-P FORCE-DEPENDENCIES-P)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-loader" '("pdf-loader--")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-misc" "pdf-misc.el" (0 0 0 0))
-;;; Generated autoloads from pdf-misc.el
-
-(autoload 'pdf-misc-minor-mode "pdf-misc" "\
-FIXME: Not documented.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-misc-size-indication-minor-mode "pdf-misc" "\
-Provide a working size indication in the mode-line.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-misc-menu-bar-minor-mode "pdf-misc" "\
-Display a PDF Tools menu in the menu-bar.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-misc-context-menu-minor-mode "pdf-misc" "\
-Provide a right-click context menu in PDF buffers.
-
-\\{pdf-misc-context-menu-minor-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-misc" '("pdf-misc-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-occur" "pdf-occur.el" (0 0 0 0))
-;;; Generated autoloads from pdf-occur.el
-
-(autoload 'pdf-occur "pdf-occur" "\
-List lines matching STRING or PCRE.
-
-Interactively search for a regexp. Unless a prefix arg was given,
-in which case this functions performs a string search.
-
-If `pdf-occur-prefer-string-search' is non-nil, the meaning of
-the prefix-arg is inverted.
-
-\(fn STRING &optional REGEXP-P)" t nil)
-
-(autoload 'pdf-occur-multi-command "pdf-occur" "\
-Perform `pdf-occur' on multiple buffer.
-
-For a programmatic search of multiple documents see
-`pdf-occur-search'.
-
-\(fn)" t nil)
-
-(defvar pdf-occur-global-minor-mode nil "\
-Non-nil if Pdf-Occur-Global minor mode is enabled.
-See the `pdf-occur-global-minor-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `pdf-occur-global-minor-mode'.")
-
-(custom-autoload 'pdf-occur-global-minor-mode "pdf-occur" nil)
-
-(autoload 'pdf-occur-global-minor-mode "pdf-occur" "\
-Enable integration of Pdf Occur with other modes.
-
-This global minor mode enables (or disables)
-`pdf-occur-ibuffer-minor-mode' and `pdf-occur-dired-minor-mode'
-in all current and future ibuffer/dired buffer.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-occur-ibuffer-minor-mode "pdf-occur" "\
-Hack into ibuffer's do-occur binding.
-
-This mode remaps `ibuffer-do-occur' to
-`pdf-occur-ibuffer-do-occur', which will start the PDF Tools
-version of `occur', if all marked buffer's are in `pdf-view-mode'
-and otherwise fallback to `ibuffer-do-occur'.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-occur-dired-minor-mode "pdf-occur" "\
-Hack into dired's `dired-do-search' binding.
-
-This mode remaps `dired-do-search' to
-`pdf-occur-dired-do-search', which will start the PDF Tools
-version of `occur', if all marked buffer's are in `pdf-view-mode'
-and otherwise fallback to `dired-do-search'.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-occur" '("pdf-occur-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-outline" "pdf-outline.el" (0 0 0 0))
-;;; Generated autoloads from pdf-outline.el
-
-(autoload 'pdf-outline-minor-mode "pdf-outline" "\
-Display an outline of a PDF document.
-
-This provides a PDF's outline on the menu bar via imenu.
-Additionally the same outline may be viewed in a designated
-buffer.
-
-\\{pdf-outline-minor-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-outline "pdf-outline" "\
-Display an PDF outline of BUFFER.
-
-BUFFER defaults to the current buffer. Select the outline
-buffer, unless NO-SELECT-WINDOW-P is non-nil.
-
-\(fn &optional BUFFER NO-SELECT-WINDOW-P)" t nil)
-
-(autoload 'pdf-outline-imenu-enable "pdf-outline" "\
-Enable imenu in the current PDF buffer.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-outline" '("pdf-outline")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-sync" "pdf-sync.el" (0 0 0 0))
-;;; Generated autoloads from pdf-sync.el
-
-(autoload 'pdf-sync-minor-mode "pdf-sync" "\
-Correlate a PDF position with the TeX file.
-\\<pdf-sync-minor-mode-map>
-This works via SyncTeX, which means the TeX sources need to have
-been compiled with `--synctex=1'. In AUCTeX this can be done by
-setting `TeX-source-correlate-method' to 'synctex (before AUCTeX
-is loaded) and enabling `TeX-source-correlate-mode'.
-
-Then \\[pdf-sync-backward-search-mouse] in the PDF buffer will open the
-corresponding TeX location.
-
-If AUCTeX is your preferred tex-mode, this library arranges to
-bind `pdf-sync-forward-display-pdf-key' (the default is `C-c C-g')
-to `pdf-sync-forward-search' in `TeX-source-correlate-map'. This
-function displays the PDF page corresponding to the current
-position in the TeX buffer. This function only works together
-with AUCTeX.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-sync" '("pdf-sync-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-tools" "pdf-tools.el" (0 0 0 0))
-;;; Generated autoloads from pdf-tools.el
-
-(defvar pdf-tools-handle-upgrades t "\
-Whether PDF Tools should handle upgrading itself.")
-
-(custom-autoload 'pdf-tools-handle-upgrades "pdf-tools" t)
-
-(autoload 'pdf-tools-install "pdf-tools" "\
-Install PDF-Tools in all current and future PDF buffers.
-
-If the `pdf-info-epdfinfo-program' is not running or does not
-appear to be working, attempt to rebuild it. If this build
-succeeded, continue with the activation of the package.
-Otherwise fail silently, i.e. no error is signaled.
-
-Build the program (if necessary) without asking first, if
-NO-QUERY-P is non-nil.
-
-Don't attempt to install system packages, if SKIP-DEPENDENCIES-P
-is non-nil.
-
-Do not signal an error in case the build failed, if NO-ERROR-P is
-non-nil.
-
-Attempt to install system packages (even if it is deemed
-unnecessary), if FORCE-DEPENDENCIES-P is non-nil.
-
-Note that SKIP-DEPENDENCIES-P and FORCE-DEPENDENCIES-P are
-mutually exclusive.
-
-Note further, that you can influence the installation directory
-by setting `pdf-info-epdfinfo-program' to an appropriate
-value (e.g. ~/bin/epdfinfo) before calling this function.
-
-See `pdf-view-mode' and `pdf-tools-enabled-modes'.
-
-\(fn &optional NO-QUERY-P SKIP-DEPENDENCIES-P NO-ERROR-P FORCE-DEPENDENCIES-P)" t nil)
-
-(autoload 'pdf-tools-enable-minor-modes "pdf-tools" "\
-Enable MODES in the current buffer.
-
-MODES defaults to `pdf-tools-enabled-modes'.
-
-\(fn &optional MODES)" t nil)
-
-(autoload 'pdf-tools-help "pdf-tools" "\
-
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-tools" '("pdf-tools-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-util" "pdf-util.el" (0 0 0 0))
-;;; Generated autoloads from pdf-util.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-util" '("pdf-util-" "display-buffer-split-below-and-attach")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-view" "pdf-view.el" (0 0 0 0))
-;;; Generated autoloads from pdf-view.el
-
-(autoload 'pdf-view-bookmark-jump-handler "pdf-view" "\
-The bookmark handler-function interface for bookmark BMK.
-
-See also `pdf-view-bookmark-make-record'.
-
-\(fn BMK)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-view" '("pdf-view-")))
-
-;;;***
-
-;;;### (autoloads nil "pdf-virtual" "pdf-virtual.el" (0 0 0 0))
-;;; Generated autoloads from pdf-virtual.el
-
-(autoload 'pdf-virtual-edit-mode "pdf-virtual" "\
-Major mode when editing a virtual PDF buffer.
-
-\(fn)" t nil)
-
-(autoload 'pdf-virtual-view-mode "pdf-virtual" "\
-Major mode in virtual PDF buffers.
-
-\(fn)" t nil)
-
-(defvar pdf-virtual-global-minor-mode nil "\
-Non-nil if Pdf-Virtual-Global minor mode is enabled.
-See the `pdf-virtual-global-minor-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `pdf-virtual-global-minor-mode'.")
-
-(custom-autoload 'pdf-virtual-global-minor-mode "pdf-virtual" nil)
-
-(autoload 'pdf-virtual-global-minor-mode "pdf-virtual" "\
-Enable recognition and handling of VPDF files.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'pdf-virtual-buffer-create "pdf-virtual" "\
-
-
-\(fn &optional FILENAMES BUFFER-NAME DISPLAY-P)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pdf-virtual" '("pdf-virtual-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("pdf-tools-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; pdf-tools-autoloads.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-tools-pkg.el b/elpa/pdf-tools-20200512.1524/pdf-tools-pkg.el
deleted file mode 100644
index c5e9388..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-tools-pkg.el
+++ /dev/null
@@ -1,13 +0,0 @@
-(define-package "pdf-tools" "20200512.1524" "Support library for PDF documents."
- '((emacs "24.3")
- (tablist "1.0")
- (let-alist "1.0.4"))
- :commit "c510442ab89c8a9e9881230eeb364f4663f59e76" :keywords
- '("files" "multimedia")
- :authors
- '(("Andreas Politz" . "politza@fh-trier.de"))
- :maintainer
- '("Andreas Politz" . "politza@fh-trier.de"))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/pdf-tools-20200512.1524/pdf-tools.el b/elpa/pdf-tools-20200512.1524/pdf-tools.el
deleted file mode 100644
index 7c9144c..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-tools.el
+++ /dev/null
@@ -1,525 +0,0 @@
-;;; pdf-tools.el --- Support library for PDF documents. -*- lexical-binding:t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-;; Package: pdf-tools
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (tablist "1.0") (let-alist "1.0.4"))
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; PDF Tools is, among other things, a replacement of DocView for PDF
-;; files. The key difference is, that pages are not prerendered by
-;; e.g. ghostscript and stored in the file-system, but rather created
-;; on-demand and stored in memory.
-;;
-;; Note: This package requires external libraries and works currently
-;; only on GNU/Linux systems.
-;;
-;; Note: If you ever update it, you need to restart Emacs afterwards.
-;;
-;; To activate the package put
-;;
-;; (pdf-tools-install)
-;;
-;; somewhere in your .emacs.el .
-;;
-;; M-x pdf-tools-help RET
-;;
-;; gives some help on using the package and
-;;
-;; M-x pdf-tools-customize RET
-;;
-;; offers some customization options.
-
-;; Features:
-;;
-;; * View
-;; View PDF documents in a buffer with DocView-like bindings.
-;;
-;; * Isearch
-;; Interactively search PDF documents like any other buffer. (Though
-;; there is currently no regexp support.)
-;;
-;; * Follow links
-;; Click on highlighted links, moving to some part of a different
-;; page, some external file, a website or any other URI. Links may
-;; also be followed by keyboard commands.
-;;
-;; * Annotations
-;; Display and list text and markup annotations (like underline),
-;; edit their contents and attributes (e.g. color), move them around,
-;; delete them or create new ones and then save the modifications
-;; back to the PDF file.
-;;
-;; * Attachments
-;; Save files attached to the PDF-file or list them in a dired buffer.
-;;
-;; * Outline
-;; Use imenu or a special buffer to examine and navigate the PDF's
-;; outline.
-;;
-;; * SyncTeX
-;; Jump from a position on a page directly to the TeX source and
-;; vice-versa.
-;;
-;; * Misc
-;; + Display PDF's metadata.
-;; + Mark a region and kill the text from the PDF.
-;; + Search for occurrences of a string.
-;; + Keep track of visited pages via a history.
-
-;;; Code:
-
-(require 'pdf-view)
-(require 'pdf-util)
-(require 'pdf-info)
-(require 'cus-edit)
-(require 'compile)
-(require 'cl-lib)
-(require 'package)
-
-
-
-;; * ================================================================== *
-;; * Customizables
-;; * ================================================================== *
-
-(defgroup pdf-tools nil
- "Support library for PDF documents."
- :group 'data)
-
-(defgroup pdf-tools-faces nil
- "Faces determining the colors used in the pdf-tools package.
-
-In order to customize dark and light colors use
-`pdf-tools-customize-faces', or set `custom-face-default-form' to
-'all."
- :group 'pdf-tools)
-
-(defconst pdf-tools-modes
- '(pdf-history-minor-mode
- pdf-isearch-minor-mode
- pdf-links-minor-mode
- pdf-misc-minor-mode
- pdf-outline-minor-mode
- pdf-misc-size-indication-minor-mode
- pdf-misc-menu-bar-minor-mode
- pdf-annot-minor-mode
- pdf-sync-minor-mode
- pdf-misc-context-menu-minor-mode
- pdf-cache-prefetch-minor-mode
- pdf-view-auto-slice-minor-mode
- pdf-occur-global-minor-mode
- pdf-virtual-global-minor-mode))
-
-(defcustom pdf-tools-enabled-modes
- '(pdf-history-minor-mode
- pdf-isearch-minor-mode
- pdf-links-minor-mode
- pdf-misc-minor-mode
- pdf-outline-minor-mode
- pdf-misc-size-indication-minor-mode
- pdf-misc-menu-bar-minor-mode
- pdf-annot-minor-mode
- pdf-sync-minor-mode
- pdf-misc-context-menu-minor-mode
- pdf-cache-prefetch-minor-mode
- pdf-occur-global-minor-mode
- ;; pdf-virtual-global-minor-mode
- )
- "A list of automatically enabled minor-modes.
-
-PDF Tools is build as a series of minor-modes. This variable and
-the function `pdf-tools-install' merely serve as a convenient
-wrapper in order to load these modes in current and newly created
-PDF buffers."
- :group 'pdf-tools
- :type `(set ,@(mapcar (lambda (mode)
- `(function-item ,mode))
- pdf-tools-modes)))
-
-(defcustom pdf-tools-enabled-hook nil
- "A hook ran after PDF Tools is enabled in a buffer."
- :group 'pdf-tools
- :type 'hook)
-
-(defconst pdf-tools-auto-mode-alist-entry
- '("\\.[pP][dD][fF]\\'" . pdf-view-mode)
- "The entry to use for `auto-mode-alist'.")
-
-(defconst pdf-tools-magic-mode-alist-entry
- '("%PDF" . pdf-view-mode)
- "The entry to use for `magic-mode-alist'.")
-
-(defun pdf-tools-customize ()
- "Customize Pdf Tools."
- (interactive)
- (customize-group 'pdf-tools))
-
-(defun pdf-tools-customize-faces ()
- "Customize PDF Tool's faces."
- (interactive)
- (let ((buffer (format "*Customize Group: %s*"
- (custom-unlispify-tag-name 'pdf-tools-faces))))
- (when (buffer-live-p (get-buffer buffer))
- (with-current-buffer (get-buffer buffer)
- (rename-uniquely)))
- (customize-group 'pdf-tools-faces)
- (with-current-buffer buffer
- (set (make-local-variable 'custom-face-default-form) 'all))))
-
-
-;; * ================================================================== *
-;; * Installation
-;; * ================================================================== *
-
-;;;###autoload
-(defcustom pdf-tools-handle-upgrades t
- "Whether PDF Tools should handle upgrading itself."
- :group 'pdf-tools
- :type 'boolean)
-
-(make-obsolete-variable 'pdf-tools-handle-upgrades
- "Not used anymore" "0.90")
-
-(defconst pdf-tools-directory
- (or (and load-file-name
- (file-name-directory load-file-name))
- default-directory)
- "The directory from where this library was first loaded.")
-
-(defvar pdf-tools-msys2-directory nil)
-
-(defcustom pdf-tools-installer-os nil
- "Specifies which installer to use.
-
-If nil the installer is chosen automatically. This variable is
-useful if you have multiple installers present on your
-system (e.g. nix on arch linux)"
- :group 'pdf-tools
- :type 'string)
-
-(defun pdf-tools-identify-build-directory (directory)
- "Return non-nil, if DIRECTORY appears to contain the epdfinfo source.
-
-Returns the expanded directory-name of DIRECTORY or nil."
- (setq directory (file-name-as-directory
- (expand-file-name directory)))
- (and (file-exists-p (expand-file-name "autobuild" directory))
- (file-exists-p (expand-file-name "epdfinfo.c" directory))
- directory))
-
-(defun pdf-tools-locate-build-directory ()
- "Attempt to locate a source directory.
-
-Returns a appropriate directory or nil. See also
-`pdf-tools-identify-build-directory'."
- (cl-some #'pdf-tools-identify-build-directory
- (list default-directory
- (expand-file-name "build/server" pdf-tools-directory)
- (expand-file-name "server")
- (expand-file-name "../server" pdf-tools-directory))))
-
-(defun pdf-tools-msys2-directory (&optional noninteractive-p)
- "Locate the Msys2 installation directory.
-
-Ask the user if necessary and NONINTERACTIVE-P is nil.
-Returns always nil, unless `system-type' equals windows-nt."
- (cl-labels ((if-msys2-directory (directory)
- (and (stringp directory)
- (file-directory-p directory)
- (file-exists-p
- (expand-file-name "usr/bin/bash.exe" directory))
- directory)))
- (when (eq system-type 'windows-nt)
- (setq pdf-tools-msys2-directory
- (or pdf-tools-msys2-directory
- (cl-some #'if-msys2-directory
- (cl-mapcan
- (lambda (drive)
- (list (format "%c:/msys64" drive)
- (format "%c:/msys32" drive)))
- (number-sequence ?c ?z)))
- (unless (or noninteractive-p
- (not (y-or-n-p "Do you have Msys2 installed ? ")))
- (if-msys2-directory
- (read-directory-name
- "Please enter Msys2 installation directory: " nil nil t))))))))
-
-(defun pdf-tools-msys2-mingw-bin ()
- "Return the location of /mingw*/bin."
- (when (pdf-tools-msys2-directory)
- (let ((arch (intern (car (split-string system-configuration "-" t)))))
- (expand-file-name
- (format "./mingw%s/bin" (if (eq arch 'x86_64) "64" "32"))
- (pdf-tools-msys2-directory)))))
-
-(defun pdf-tools-find-bourne-shell ()
- "Locate a usable sh."
- (or (and (eq system-type 'windows-nt)
- (let* ((directory (pdf-tools-msys2-directory)))
- (when directory
- (expand-file-name "usr/bin/bash.exe" directory))))
- (executable-find "sh")))
-
-(defun pdf-tools-build-server (target-directory
- &optional
- skip-dependencies-p
- force-dependencies-p
- callback
- build-directory)
- "Build the epdfinfo program in the background.
-
-Install into TARGET-DIRECTORY, which should be a directory.
-
-If CALLBACK is non-nil, it should be a function. It is called
-with the compiled executable as the single argument or nil, if
-the build failed.
-
-Expect sources to be in BUILD-DIRECTORY. If nil, search for it
-using `pdf-tools-locate-build-directory'.
-
-See `pdf-tools-install' for the SKIP-DEPENDENCIES-P and
-FORCE-DEPENDENCIES-P arguments.
-
-Returns the buffer of the compilation process."
-
- (unless callback (setq callback #'ignore))
- (unless build-directory
- (setq build-directory (pdf-tools-locate-build-directory)))
- (cl-check-type target-directory file-directory)
- (setq target-directory (file-name-as-directory
- (expand-file-name target-directory)))
- (cl-check-type build-directory (and (not null) file-directory))
- (when (and skip-dependencies-p force-dependencies-p)
- (error "Can't simultaneously skip and force dependencies"))
- (let* ((compilation-auto-jump-to-first-error nil)
- (compilation-scroll-output t)
- (shell-file-name (pdf-tools-find-bourne-shell))
- (shell-command-switch "-c")
- (process-environment process-environment)
- (default-directory build-directory)
- (autobuild (shell-quote-argument
- (expand-file-name "autobuild" build-directory)))
- (msys2-p (equal "bash.exe" (file-name-nondirectory shell-file-name))))
- (unless shell-file-name
- (error "No suitable shell found"))
- (when msys2-p
- (push "BASH_ENV=/etc/profile" process-environment))
- (let ((executable
- (expand-file-name
- (concat "epdfinfo" (and (eq system-type 'windows-nt) ".exe"))
- target-directory))
- (compilation-buffer
- (compilation-start
- (format "%s -i %s%s%s"
- autobuild
- (shell-quote-argument target-directory)
- (cond
- (skip-dependencies-p " -D")
- (force-dependencies-p " -d")
- (t ""))
- (if pdf-tools-installer-os (concat " --os " pdf-tools-installer-os) ""))
- t)))
- ;; In most cases user-input is required, so select the window.
- (if (get-buffer-window compilation-buffer)
- (select-window (get-buffer-window compilation-buffer))
- (pop-to-buffer compilation-buffer))
- (with-current-buffer compilation-buffer
- (setq-local compilation-error-regexp-alist nil)
- (add-hook 'compilation-finish-functions
- (lambda (_buffer status)
- (funcall callback
- (and (equal status "finished\n")
- executable)))
- nil t)
- (current-buffer)))))
-
-
-;; * ================================================================== *
-;; * Initialization
-;; * ================================================================== *
-
-;;;###autoload
-(defun pdf-tools-install (&optional no-query-p skip-dependencies-p
- no-error-p force-dependencies-p)
- "Install PDF-Tools in all current and future PDF buffers.
-
-If the `pdf-info-epdfinfo-program' is not running or does not
-appear to be working, attempt to rebuild it. If this build
-succeeded, continue with the activation of the package.
-Otherwise fail silently, i.e. no error is signaled.
-
-Build the program (if necessary) without asking first, if
-NO-QUERY-P is non-nil.
-
-Don't attempt to install system packages, if SKIP-DEPENDENCIES-P
-is non-nil.
-
-Do not signal an error in case the build failed, if NO-ERROR-P is
-non-nil.
-
-Attempt to install system packages (even if it is deemed
-unnecessary), if FORCE-DEPENDENCIES-P is non-nil.
-
-Note that SKIP-DEPENDENCIES-P and FORCE-DEPENDENCIES-P are
-mutually exclusive.
-
-Note further, that you can influence the installation directory
-by setting `pdf-info-epdfinfo-program' to an appropriate
-value (e.g. ~/bin/epdfinfo) before calling this function.
-
-See `pdf-view-mode' and `pdf-tools-enabled-modes'."
- (interactive)
- (if (or (pdf-info-running-p)
- (ignore-errors (pdf-info-check-epdfinfo) t))
- (pdf-tools-install-noverify)
- (let ((target-directory
- (or (and (stringp pdf-info-epdfinfo-program)
- (file-name-directory
- pdf-info-epdfinfo-program))
- pdf-tools-directory)))
- (if (or no-query-p
- (y-or-n-p "Need to (re)build the epdfinfo program, do it now ?"))
- (pdf-tools-build-server
- target-directory
- skip-dependencies-p
- force-dependencies-p
- (lambda (executable)
- (let ((msg (format
- "Building the PDF Tools server %s"
- (if executable "succeeded" "failed"))))
- (if (not executable)
- (funcall (if no-error-p #'message #'error) "%s" msg)
- (message "%s" msg)
- (setq pdf-info-epdfinfo-program executable)
- (let ((pdf-info-restart-process-p t))
- (pdf-tools-install-noverify))))))
- (message "PDF Tools not activated")))))
-
-(defun pdf-tools-install-noverify ()
- "Like `pdf-tools-install', but skip checking `pdf-info-epdfinfo-program'."
- (add-to-list 'auto-mode-alist pdf-tools-auto-mode-alist-entry)
- (add-to-list 'magic-mode-alist pdf-tools-magic-mode-alist-entry)
- ;; FIXME: Generalize this sometime.
- (when (memq 'pdf-occur-global-minor-mode
- pdf-tools-enabled-modes)
- (pdf-occur-global-minor-mode 1))
- (when (memq 'pdf-virtual-global-minor-mode
- pdf-tools-enabled-modes)
- (pdf-virtual-global-minor-mode 1))
- (add-hook 'pdf-view-mode-hook 'pdf-tools-enable-minor-modes)
- (dolist (buf (buffer-list))
- (with-current-buffer buf
- (when (and (not (derived-mode-p 'pdf-view-mode))
- (pdf-tools-pdf-buffer-p)
- (buffer-file-name))
- (pdf-view-mode)))))
-
-(defun pdf-tools-uninstall ()
- "Uninstall PDF-Tools in all current and future PDF buffers."
- (interactive)
- (pdf-info-quit)
- (setq-default auto-mode-alist
- (remove pdf-tools-auto-mode-alist-entry auto-mode-alist))
- (setq-default magic-mode-alist
- (remove pdf-tools-magic-mode-alist-entry magic-mode-alist))
- (pdf-occur-global-minor-mode -1)
- (pdf-virtual-global-minor-mode -1)
- (remove-hook 'pdf-view-mode-hook 'pdf-tools-enable-minor-modes)
- (dolist (buf (buffer-list))
- (with-current-buffer buf
- (when (pdf-util-pdf-buffer-p buf)
- (pdf-tools-disable-minor-modes pdf-tools-modes)
- (normal-mode)))))
-
-(defun pdf-tools-pdf-buffer-p (&optional buffer)
- "Return non-nil if BUFFER contains a PDF document."
- (save-current-buffer
- (when buffer (set-buffer buffer))
- (save-excursion
- (save-restriction
- (widen)
- (goto-char 1)
- (looking-at "%PDF")))))
-
-(defun pdf-tools-assert-pdf-buffer (&optional buffer)
- (unless (pdf-tools-pdf-buffer-p buffer)
- (error "Buffer does not contain a PDF document")))
-
-(defun pdf-tools-set-modes-enabled (enable &optional modes)
- (dolist (m (or modes pdf-tools-enabled-modes))
- (let ((enabled-p (and (boundp m)
- (symbol-value m))))
- (unless (or (and enabled-p enable)
- (and (not enabled-p) (not enable)))
- (funcall m (if enable 1 -1))))))
-
-;;;###autoload
-(defun pdf-tools-enable-minor-modes (&optional modes)
- "Enable MODES in the current buffer.
-
-MODES defaults to `pdf-tools-enabled-modes'."
- (interactive)
- (pdf-util-assert-pdf-buffer)
- (pdf-tools-set-modes-enabled t modes)
- (run-hooks 'pdf-tools-enabled-hook))
-
-(defun pdf-tools-disable-minor-modes (&optional modes)
- "Disable MODES in the current buffer.
-
-MODES defaults to `pdf-tools-enabled-modes'."
- (interactive)
- (pdf-tools-set-modes-enabled nil modes))
-
-(declare-function pdf-occur-global-minor-mode "pdf-occur.el")
-(declare-function pdf-virtual-global-minor-mode "pdf-virtual.el")
-
-;;;###autoload
-(defun pdf-tools-help ()
- (interactive)
- (help-setup-xref (list #'pdf-tools-help)
- (called-interactively-p 'interactive))
- (with-help-window (help-buffer)
- (princ "PDF Tools Help\n\n")
- (princ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
- (dolist (m (cons 'pdf-view-mode
- (sort (copy-sequence pdf-tools-modes) 'string<)))
- (princ (format "`%s' is " m))
- (describe-function-1 m)
- (terpri) (terpri)
- (princ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"))))
-
-
-;; * ================================================================== *
-;; * Debugging
-;; * ================================================================== *
-
-(defvar pdf-tools-debug nil
- "Non-nil, if debugging PDF Tools.")
-
-(defun pdf-tools-toggle-debug ()
- (interactive)
- (setq pdf-tools-debug (not pdf-tools-debug))
- (when (called-interactively-p 'any)
- (message "Toggled debugging %s" (if pdf-tools-debug "on" "off"))))
-
-(provide 'pdf-tools)
-
-;;; pdf-tools.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-util.el b/elpa/pdf-tools-20200512.1524/pdf-util.el
deleted file mode 100644
index cdb0f26..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-util.el
+++ /dev/null
@@ -1,1346 +0,0 @@
-;;; pdf-util.el --- PDF Utility functions. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, multimedia
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;;; Todo:
-;;
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'format-spec)
-(require 'faces)
-
-;; These functions are only used after a PdfView window was asserted,
-;; which won't succeed, if pdf-view.el isn't loaded.
-(declare-function pdf-view-image-size "pdf-view")
-(declare-function pdf-view-image-offset "pdf-view")
-(declare-function pdf-view-current-image "pdf-view")
-(declare-function pdf-view-current-overlay "pdf-view")
-(declare-function pdf-cache-pagesize "pdf-cache")
-
-(declare-function pdf-view-image-type "pdf-view")
-
-
-
-;; * ================================================================== *
-;; * Compatibility with older Emacssen (< 25.1)
-;; * ================================================================== *
-
-;; The with-file-modes macro is only available in recent Emacs
-;; versions.
-(eval-when-compile
- (unless (fboundp 'with-file-modes)
- (defmacro with-file-modes (modes &rest body)
- "Execute BODY with default file permissions temporarily set to MODES.
-MODES is as for `set-default-file-modes'."
- (declare (indent 1) (debug t))
- (let ((umask (make-symbol "umask")))
- `(let ((,umask (default-file-modes)))
- (unwind-protect
- (progn
- (set-default-file-modes ,modes)
- ,@body)
- (set-default-file-modes ,umask)))))))
-
-(unless (fboundp 'alist-get) ;;25.1
- (defun alist-get (key alist &optional default remove)
- "Get the value associated to KEY in ALIST.
-DEFAULT is the value to return if KEY is not found in ALIST.
-REMOVE, if non-nil, means that when setting this element, we should
-remove the entry if the new value is `eql' to DEFAULT."
- (ignore remove) ;;Silence byte-compiler.
- (let ((x (assq key alist)))
- (if x (cdr x) default))))
-
-(require 'register)
-(unless (fboundp 'register-read-with-preview)
- (defalias 'register-read-with-preview 'read-char
- "Compatibility alias for pdf-tools."))
-
-;; In Emacs 24.3 window-width does not have a PIXELWISE argument.
-(defmacro pdf-util-window-pixel-width (&optional window)
- "Return the width of WINDOW in pixel."
- (if (< (cdr (subr-arity (symbol-function 'window-body-width))) 2)
- (let ((window* (make-symbol "window")))
- `(let ((,window* ,window))
- (* (window-body-width ,window*)
- (frame-char-width (window-frame ,window*)))))
- `(window-body-width ,window t)))
-
-;; In Emacs 24.3 image-mode-winprops leads to infinite recursion.
-(unless (or (> emacs-major-version 24)
- (and (= emacs-major-version 24)
- (>= emacs-minor-version 4)))
- (require 'image-mode)
- (defvar image-mode-winprops-original-function
- (symbol-function 'image-mode-winprops))
- (eval-after-load "image-mode"
- '(defun image-mode-winprops (&optional window cleanup)
- (if (not (eq major-mode 'pdf-view-mode))
- (funcall image-mode-winprops-original-function
- window cleanup)
- (cond ((null window)
- (setq window
- (if (eq (current-buffer) (window-buffer)) (selected-window) t)))
- ((eq window t))
- ((not (windowp window))
- (error "Not a window: %s" window)))
- (when cleanup
- (setq image-mode-winprops-alist
- (delq nil (mapcar (lambda (winprop)
- (let ((w (car-safe winprop)))
- (if (or (not (windowp w)) (window-live-p w))
- winprop)))
- image-mode-winprops-alist))))
- (let ((winprops (assq window image-mode-winprops-alist)))
- ;; For new windows, set defaults from the latest.
- (if winprops
- ;; Move window to front.
- (setq image-mode-winprops-alist
- (cons winprops (delq winprops image-mode-winprops-alist)))
- (setq winprops (cons window
- (copy-alist (cdar image-mode-winprops-alist))))
- ;; Add winprops before running the hook, to avoid inf-loops if the hook
- ;; triggers window-configuration-change-hook.
- (setq image-mode-winprops-alist
- (cons winprops image-mode-winprops-alist))
- (run-hook-with-args 'image-mode-new-window-functions winprops))
- winprops)))))
-
-
-
-;; * ================================================================== *
-;; * Transforming coordinates
-;; * ================================================================== *
-
-
-(defun pdf-util-scale (list-of-edges-or-pos scale &optional rounding-fn)
- "Scale LIST-OF-EDGES-OR-POS by SCALE.
-
-SCALE is a cons (SX . SY), by which edges/positions are scaled.
-If ROUNDING-FN is non-nil, it should be a function of one
-argument, a real value, returning a rounded
-value (e.g. `ceiling').
-
-The elements in LIST-OF-EDGES-OR-POS should be either a list
-\(LEFT TOP RIGHT BOT\) or a position \(X . Y\).
-
-LIST-OF-EDGES-OR-POS may also be a single such element.
-
-Return scaled list of edges if LIST-OF-EDGES-OR-POS was indeed a list,
-else return the scaled singleton."
-
- (let ((have-list-p (listp (car list-of-edges-or-pos))))
- (unless have-list-p
- (setq list-of-edges-or-pos (list list-of-edges-or-pos)))
- (let* ((sx (car scale))
- (sy (cdr scale))
- (result
- (mapcar
- (lambda (edges)
- (cond
- ((consp (cdr edges))
- (let ((e (list (* (nth 0 edges) sx)
- (* (nth 1 edges) sy)
- (* (nth 2 edges) sx)
- (* (nth 3 edges) sy))))
- (if rounding-fn
- (mapcar rounding-fn e)
- e)))
- (rounding-fn
- (cons (funcall rounding-fn (* (car edges) sx))
- (funcall rounding-fn (* (cdr edges) sy))))
- (t
- (cons (* (car edges) sx)
- (* (cdr edges) sy)))))
- list-of-edges-or-pos)))
- (if have-list-p
- result
- (car result)))))
-
-(defun pdf-util-scale-to (list-of-edges from to &optional rounding-fn)
- "Scale LIST-OF-EDGES in FROM basis to TO.
-
-FROM and TO should both be a cons \(WIDTH . HEIGHT\). See also
-`pdf-util-scale'."
-
- (pdf-util-scale list-of-edges
- (cons (/ (float (car to))
- (float (car from)))
- (/ (float (cdr to))
- (float (cdr from))))
- rounding-fn))
-
-(defun pdf-util-scale-pixel-to-points (list-of-pixel-edges
- &optional rounding-fn displayed-p window)
- "Scale LIST-OF-PIXEL-EDGES to point values.
-
-The result depends on the currently displayed page in WINDOW.
-See also `pdf-util-scale'."
- (pdf-util-assert-pdf-window window)
- (pdf-util-scale-to
- list-of-pixel-edges
- (pdf-view-image-size displayed-p window)
- (pdf-cache-pagesize (pdf-view-current-page window))
- rounding-fn))
-
-(defun pdf-util-scale-points-to-pixel (list-of-points-edges
- &optional rounding-fn displayed-p window)
- "Scale LIST-OF-POINTS-EDGES to point values.
-
-The result depends on the currently displayed page in WINDOW.
-See also `pdf-util-scale'."
- (pdf-util-assert-pdf-window window)
- (pdf-util-scale-to
- list-of-points-edges
- (pdf-cache-pagesize (pdf-view-current-page window))
- (pdf-view-image-size displayed-p window)
- rounding-fn))
-
-(defun pdf-util-scale-relative-to-points (list-of-relative-edges
- &optional rounding-fn window)
- "Scale LIST-OF-RELATIVE-EDGES to point values.
-
-The result depends on the currently displayed page in WINDOW.
-See also `pdf-util-scale'."
- (pdf-util-assert-pdf-window window)
- (pdf-util-scale-to
- list-of-relative-edges
- '(1.0 . 1.0)
- (pdf-cache-pagesize (pdf-view-current-page window))
- rounding-fn))
-
-(defun pdf-util-scale-points-to-relative (list-of-points-edges
- &optional rounding-fn window)
- "Scale LIST-OF-POINTS-EDGES to relative values.
-
-See also `pdf-util-scale'."
- (pdf-util-assert-pdf-window window)
- (pdf-util-scale-to
- list-of-points-edges
- (pdf-cache-pagesize (pdf-view-current-page window))
- '(1.0 . 1.0)
- rounding-fn))
-
-(defun pdf-util-scale-pixel-to-relative (list-of-pixel-edges
- &optional rounding-fn displayed-p window)
- "Scale LIST-OF-PIXEL-EDGES to relative values.
-
-The result depends on the currently displayed page in WINDOW.
-See also `pdf-util-scale'."
- (pdf-util-assert-pdf-window window)
- (pdf-util-scale-to
- list-of-pixel-edges
- (pdf-view-image-size displayed-p window)
- '(1.0 . 1.0)
- rounding-fn))
-
-
-(defun pdf-util-scale-relative-to-pixel (list-of-relative-edges
- &optional rounding-fn displayed-p window)
- "Scale LIST-OF-EDGES to match SIZE.
-
-The result depends on the currently displayed page in WINDOW.
-See also `pdf-util-scale'."
- (pdf-util-assert-pdf-window window)
- (pdf-util-scale-to
- list-of-relative-edges
- '(1.0 . 1.0)
- (pdf-view-image-size displayed-p window)
- rounding-fn))
-
-(defun pdf-util-translate (list-of-edges-or-pos
- offset &optional opposite-direction-p)
- "Translate LIST-OF-EDGES-OR-POS by OFFSET
-
-OFFSET should be a cons \(X . Y\), by which to translate
-LIST-OF-EDGES-OR-POS. If OPPOSITE-DIRECTION-P is non-nil
-translate by \(-X . -Y\).
-
-See `pdf-util-scale' for the LIST-OF-EDGES-OR-POS argument."
-
- (let ((have-list-p (listp (car list-of-edges-or-pos))))
- (unless have-list-p
- (setq list-of-edges-or-pos (list list-of-edges-or-pos)))
- (let* ((ox (if opposite-direction-p
- (- (car offset))
- (car offset)))
- (oy (if opposite-direction-p
- (- (cdr offset))
- (cdr offset)))
- (result
- (mapcar
- (lambda (edges)
- (cond
- ((consp (cdr edges))
- (list (+ (nth 0 edges) ox)
- (+ (nth 1 edges) oy)
- (+ (nth 2 edges) ox)
- (+ (nth 3 edges) oy)))
- (t
- (cons (+ (car edges) ox)
- (+ (cdr edges) oy)))))
- list-of-edges-or-pos)))
- (if have-list-p
- result
- (car result)))))
-
-(defun pdf-util-edges-transform (region elts &optional to-region-p)
- "Translate ELTS according to REGION.
-
-ELTS may be one edges list or a position or a list thereof.
-Translate each from region coordinates to (0 0 1 1) or the
-opposite, if TO-REGION-P is non-nil. All coordinates should be
-relative.
-
-Returns the translated list of elements or the single one
-depending on the input."
-
- (when elts
- (let ((have-list-p (consp (car-safe elts))))
- (unless have-list-p
- (setq elts (list elts)))
- (let ((result
- (if (null region)
- elts
- (mapcar (lambda (edges)
- (let ((have-pos-p (numberp (cdr edges))))
- (when have-pos-p
- (setq edges (list (car edges) (cdr edges)
- (car edges) (cdr edges))))
- (pdf-util-with-edges (edges region)
- (let ((newedges
- (mapcar (lambda (n)
- (min 1.0 (max 0.0 n)))
- (if to-region-p
- `(,(/ (- edges-left region-left)
- region-width)
- ,(/ (- edges-top region-top)
- region-height)
- ,(/ (- edges-right region-left)
- region-width)
- ,(/ (- edges-bot region-top)
- region-height))
- `(,(+ (* edges-left region-width)
- region-left)
- ,(+ (* edges-top region-height)
- region-top)
- ,(+ (* edges-right region-width)
- region-left)
- ,(+ (* edges-bot region-height)
- region-top))))))
- (if have-pos-p
- (cons (car newedges) (cadr newedges))
- newedges)))))
- elts))))
- (if have-list-p
- result
- (car result))))))
-
-(defmacro pdf-util-with-edges (list-of-edges &rest body)
- "Provide some convenient macros for the edges in LIST-OF-EDGES.
-
-LIST-OF-EDGES should be a list of variables \(X ...\), each one
-holding a list of edges. Inside BODY the symbols X-left, X-top,
-X-right, X-bot, X-width and X-height expand to their respective
-values."
-
- (declare (indent 1) (debug (sexp &rest form)))
- (unless (cl-every 'symbolp list-of-edges)
- (error "Argument should be a list of symbols"))
- (let ((list-of-syms
- (mapcar (lambda (edge)
- (cons edge (mapcar
- (lambda (kind)
- (intern (format "%s-%s" edge kind)))
- '(left top right bot width height))))
- list-of-edges)))
- (macroexpand-all
- `(cl-symbol-macrolet
- ,(apply 'nconc
- (mapcar
- (lambda (edge-syms)
- (let ((edge (nth 0 edge-syms))
- (syms (cdr edge-syms)))
- `((,(pop syms) (nth 0 ,edge))
- (,(pop syms) (nth 1 ,edge))
- (,(pop syms) (nth 2 ,edge))
- (,(pop syms) (nth 3 ,edge))
- (,(pop syms) (- (nth 2 ,edge)
- (nth 0 ,edge)))
- (,(pop syms) (- (nth 3 ,edge)
- (nth 1 ,edge))))))
- list-of-syms))
- ,@body))))
-
-
-;; * ================================================================== *
-;; * Scrolling
-;; * ================================================================== *
-
-(defun pdf-util-image-displayed-edges (&optional window displayed-p)
- "Return the visible region of the image in WINDOW.
-
-Returns a list of pixel edges."
- (pdf-util-assert-pdf-window)
- (let* ((edges (window-inside-pixel-edges window))
- (isize (pdf-view-image-size displayed-p window))
- (offset (if displayed-p
- `(0 . 0)
- (pdf-view-image-offset window)))
- (hscroll (* (window-hscroll window)
- (frame-char-width (window-frame window))))
- (vscroll (window-vscroll window t))
- (x0 (+ hscroll (car offset)))
- (y0 (+ vscroll (cdr offset)))
- (x1 (min (car isize)
- (+ x0 (- (nth 2 edges) (nth 0 edges)))))
- (y1 (min (cdr isize)
- (+ y0 (- (nth 3 edges) (nth 1 edges))))))
- (mapcar 'round (list x0 y0 x1 y1))))
-
-(defun pdf-util-required-hscroll (edges &optional eager-p context-pixel)
- "Return the amount of scrolling necessary, to make image EDGES visible.
-
-Scroll as little as necessary. Unless EAGER-P is non-nil, in
-which case scroll as much as possible.
-
-Keep CONTEXT-PIXEL pixel of the image visible at the bottom and
-top of the window. CONTEXT-PIXEL defaults to 0.
-
-Return the required hscroll in columns or nil, if scrolling is not
-needed."
-
- (pdf-util-assert-pdf-window)
- (unless context-pixel
- (setq context-pixel 0))
- (let* ((win (window-inside-pixel-edges))
- (image-width (car (pdf-view-image-size t)))
- (image-left (* (frame-char-width)
- (window-hscroll)))
- (edges (pdf-util-translate
- edges
- (pdf-view-image-offset) t)))
- (pdf-util-with-edges (win edges)
- (let* ((edges-left (- edges-left context-pixel))
- (edges-right (+ edges-right context-pixel)))
- (if (< edges-left image-left)
- (round (/ (max 0 (if eager-p
- (- edges-right win-width)
- edges-left))
- (frame-char-width)))
- (if (> (min image-width
- edges-right)
- (+ image-left win-width))
- (round (/ (min (- image-width win-width)
- (if eager-p
- edges-left
- (- edges-right win-width)))
- (frame-char-width)))))))))
-
-(defun pdf-util-required-vscroll (edges &optional eager-p context-pixel)
- "Return the amount of scrolling necessary, to make image EDGES visible.
-
-Scroll as little as necessary. Unless EAGER-P is non-nil, in
-which case scroll as much as possible.
-
-Keep CONTEXT-PIXEL pixel of the image visible at the bottom and
-top of the window. CONTEXT-PIXEL defaults to an equivalent pixel
-value of `next-screen-context-lines'.
-
-Return the required vscroll in lines or nil, if scrolling is not
-needed."
-
- (pdf-util-assert-pdf-window)
- (let* ((win (window-inside-pixel-edges))
- (image-height (cdr (pdf-view-image-size t)))
- (image-top (window-vscroll nil t))
- (edges (pdf-util-translate
- edges
- (pdf-view-image-offset) t)))
- (pdf-util-with-edges (win edges)
- (let* ((context-pixel (or context-pixel
- (* next-screen-context-lines
- (frame-char-height))))
- ;;Be careful not to modify edges.
- (edges-top (- edges-top context-pixel))
- (edges-bot (+ edges-bot context-pixel)))
- (if (< edges-top image-top)
- (round (/ (max 0 (if eager-p
- (- edges-bot win-height)
- edges-top))
- (float (frame-char-height))))
- (if (> (min image-height
- edges-bot)
- (+ image-top win-height))
- (round (/ (min (- image-height win-height)
- (if eager-p
- edges-top
- (- edges-bot win-height)))
- (float (frame-char-height))))))))))
-
-(defun pdf-util-scroll-to-edges (edges &optional eager-p)
- "Scroll window such that image EDGES are visible.
-
-Scroll as little as necessary. Unless EAGER-P is non-nil, in
-which case scroll as much as possible."
-
- (let ((vscroll (pdf-util-required-vscroll edges eager-p))
- (hscroll (pdf-util-required-hscroll edges eager-p)))
- (when vscroll
- (image-set-window-vscroll vscroll))
- (when hscroll
- (image-set-window-hscroll hscroll))))
-
-
-
-;; * ================================================================== *
-;; * Temporary files
-;; * ================================================================== *
-
-(defvar pdf-util--base-directory nil
- "Base directory for temporary files.")
-
-(defvar-local pdf-util--dedicated-directory nil
- "The relative name of buffer's dedicated directory.")
-
-(defun pdf-util-dedicated-directory ()
- "Return the name of a existing dedicated directory.
-
-The directory is exclusive to the current buffer. It will be
-automatically deleted, if Emacs or the current buffer are
-killed."
- (with-file-modes #o0700
- (unless (and pdf-util--base-directory
- (file-directory-p
- pdf-util--base-directory)
- (not (file-symlink-p
- pdf-util--base-directory)))
- (add-hook 'kill-emacs-hook
- (lambda nil
- (when (and pdf-util--base-directory
- (file-directory-p pdf-util--base-directory))
- (delete-directory pdf-util--base-directory t))))
- (setq pdf-util--base-directory
- (make-temp-file "pdf-tools-" t)))
- (unless (and pdf-util--dedicated-directory
- (file-directory-p pdf-util--dedicated-directory)
- (not (file-symlink-p
- pdf-util--base-directory)))
- (let ((temporary-file-directory
- pdf-util--base-directory))
- (setq pdf-util--dedicated-directory
- (make-temp-file (convert-standard-filename
- (concat (if buffer-file-name
- (file-name-nondirectory
- buffer-file-name)
- (buffer-name))
- "-"))
- t))
- (add-hook 'kill-buffer-hook 'pdf-util-delete-dedicated-directory
- nil t)))
- pdf-util--dedicated-directory))
-
-(defun pdf-util-delete-dedicated-directory ()
- "Delete current buffer's dedicated directory."
- (delete-directory (pdf-util-dedicated-directory) t))
-
-(defun pdf-util-expand-file-name (name)
- "Expand filename against current buffer's dedicated directory."
- (expand-file-name name (pdf-util-dedicated-directory)))
-
-(defun pdf-util-make-temp-file (prefix &optional dir-flag suffix)
- "Create a temporary file in current buffer's dedicated directory.
-
-See `make-temp-file' for the arguments."
- (let ((temporary-file-directory
- (pdf-util-dedicated-directory)))
- (make-temp-file (convert-standard-filename prefix) dir-flag suffix)))
-
-
-;; * ================================================================== *
-;; * Various
-;; * ================================================================== *
-
-(defmacro pdf-util-debug (&rest body)
- "Execute BODY only if debugging is enabled."
- (declare (indent 0) (debug t))
- `(when (bound-and-true-p pdf-tools-debug)
- ,@body))
-
-(defun pdf-util-pdf-buffer-p (&optional buffer)
- (and (or (null buffer)
- (buffer-live-p buffer))
- (save-current-buffer
- (and buffer (set-buffer buffer))
- (derived-mode-p 'pdf-view-mode))))
-
-(defun pdf-util-assert-pdf-buffer (&optional buffer)
- (unless (pdf-util-pdf-buffer-p buffer)
- (error "Buffer is not in PDFView mode")))
-
-(defun pdf-util-pdf-window-p (&optional window)
- (unless (or (null window)
- (window-live-p window))
- (signal 'wrong-type-argument (list 'window-live-p window)))
- (unless window (setq window (selected-window)))
- (and (window-live-p window)
- (with-selected-window window
- (pdf-util-pdf-buffer-p))))
-
-(defun pdf-util-assert-pdf-window (&optional window)
- (unless (pdf-util-pdf-window-p window)
- (error "Window's buffer is not in PdfView mode")))
-
-(defun pdf-util-munch-file (filename &optional multibyte-p)
- "Read contents from FILENAME and delete it.
-
-Return the file's content as a unibyte string, unless MULTIBYTE-P
-is non-nil."
- (unwind-protect
- (with-temp-buffer
- (set-buffer-multibyte multibyte-p)
- (insert-file-contents-literally filename)
- (buffer-substring-no-properties
- (point-min)
- (point-max)))
- (when (and filename
- (file-exists-p filename))
- (delete-file filename))))
-
-(defun pdf-util-hexcolor (color)
- "Return COLOR in hex-format.
-
-Signal an error, if color is invalid."
- (if (string-match "\\`#[[:xdigit:]]\\{6\\}\\'" color)
- color
- (let ((values (color-values color)))
- (unless values
- (signal 'wrong-type-argument (list 'color-defined-p color)))
- (apply 'format "#%02x%02x%02x"
- (mapcar (lambda (c) (lsh c -8))
- values)))))
-
-(defun pdf-util-highlight-regexp-in-string (regexp string &optional face)
- "Highlight all occurrences of REGEXP in STRING using FACE.
-
-FACE defaults to the `match' face. Returns the new fontified
-string."
- (with-temp-buffer
- (save-excursion (insert string))
- (while (and (not (eobp))
- (re-search-forward regexp nil t))
- (if (= (match-beginning 0)
- (match-end 0))
- (forward-char)
- (put-text-property
- (match-beginning 0)
- (point)
- 'face (or face 'match))))
- (buffer-string)))
-
-(defun pdf-util-color-completions ()
- "Return a fontified list of defined colors."
- (let ((color-list (list-colors-duplicates))
- colors)
- (dolist (cl color-list)
- (dolist (c (reverse cl))
- (push (propertize c 'face `(:background ,c))
- colors)))
- (nreverse colors)))
-
-(defun pdf-util-tooltip-in-window (text x y &optional window)
- (let* ((we (window-inside-absolute-pixel-edges window))
- (dx (round (+ x (nth 0 we))))
- (dy (round (+ y (nth 1 we))))
- (tooltip-frame-parameters
- `((left . ,dx)
- (top . ,dy)
- ,@tooltip-frame-parameters)))
- (tooltip-show text)))
-
-(defun pdf-util-tooltip-arrow (image-top &optional timeout)
- (pdf-util-assert-pdf-window)
- (when (floatp image-top)
- (setq image-top
- (round (* image-top (cdr (pdf-view-image-size))))))
- (let* (x-gtk-use-system-tooltips ;allow for display property in tooltip
- (dx (+ (or (car (window-margins)) 0)
- (car (window-fringes))))
- (dy image-top)
- (pos (list dx dy dx (+ dy (* 2 (frame-char-height)))))
- (vscroll
- (pdf-util-required-vscroll pos))
- (tooltip-frame-parameters
- `((border-width . 0)
- (internal-border-width . 0)
- ,@tooltip-frame-parameters))
- (tooltip-hide-delay (or timeout 3)))
- (when vscroll
- (image-set-window-vscroll vscroll))
- (setq dy (max 0 (- dy
- (cdr (pdf-view-image-offset))
- (window-vscroll nil t)
- (frame-char-height))))
- (when (overlay-get (pdf-view-current-overlay) 'before-string)
- (let* ((e (window-inside-pixel-edges))
- (xw (pdf-util-with-edges (e) e-width)))
- (cl-incf dx (/ (- xw (car (pdf-view-image-size t))) 2))))
- (pdf-util-tooltip-in-window
- (propertize
- " " 'display (propertize
- "\u2192" ;;right arrow
- 'display '(height 2)
- 'face `(:foreground
- "orange red"
- :background
- ,(if (bound-and-true-p pdf-view-midnight-minor-mode)
- (cdr pdf-view-midnight-colors)
- "white"))))
- dx dy)))
-
-(defvar pdf-util--face-colors-cache (make-hash-table))
-
-(defadvice enable-theme (after pdf-util-clear-faces-cache activate)
- (clrhash pdf-util--face-colors-cache))
-
-(defun pdf-util-face-colors (face &optional dark-p)
- "Return both colors of FACE as a cons.
-
-Look also in inherited faces. If DARK-P is non-nil, return dark
-colors, otherwise light."
- (let* ((bg (if dark-p 'dark 'light))
- (spec (list (get face 'face-defface-spec)
- (get face 'theme-face)
- (get face 'customized-face)))
- (cached (gethash face pdf-util--face-colors-cache)))
- (cl-destructuring-bind (&optional cspec color-alist)
- cached
- (or (and color-alist
- (equal cspec spec)
- (cdr (assq bg color-alist)))
- (let* ((this-bg (frame-parameter nil 'background-mode))
- (frame-background-mode bg)
- (f (and (not (eq bg this-bg))
- (x-create-frame-with-faces '((visibility . nil))))))
- (with-selected-frame (or f (selected-frame))
- (unwind-protect
- (let ((colors
- (cons (face-attribute face :foreground nil 'default)
- (face-attribute face :background nil 'default))))
- (puthash face `(,(mapcar 'copy-sequence spec)
- ((,bg . ,colors) ,@color-alist))
- pdf-util--face-colors-cache)
- colors)
- (when (and f (frame-live-p f))
- (delete-frame f)))))))))
-
-(defun pdf-util-window-attach (awindow &optional window)
- "Attach AWINDOW to WINDOW.
-
-This has the following effect. Whenever WINDOW, defaulting to
-the selected window, stops displaying the buffer it currently
-displays (e.g., by switching buffers or because it was deleted)
-AWINDOW is deleted."
- (unless window (setq window (selected-window)))
- (let ((buffer (window-buffer window))
- (hook (make-symbol "window-attach-hook")))
- (fset hook
- (lambda ()
- (when (or (not (window-live-p window))
- (not (eq buffer (window-buffer window))))
- (remove-hook 'window-configuration-change-hook
- hook)
- ;; Deleting windows inside wcch may cause errors in
- ;; windows.el .
- (run-with-timer
- 0 nil (lambda (win)
- (when (and (window-live-p win)
- (not (eq win (selected-window))))
- (delete-window win)))
- awindow))))
- (add-hook 'window-configuration-change-hook hook)))
-
-(defun display-buffer-split-below-and-attach (buf alist)
- "Display buffer action using `pdf-util-window-attach'."
- (let ((window (selected-window))
- (height (cdr (assq 'window-height alist)))
- newwin)
- (when height
- (when (floatp height)
- (setq height (round (* height (frame-height)))))
- (setq height (- (max height window-min-height))))
- (setq newwin (window--display-buffer
- buf
- (split-window-below height)
- 'window alist))
- (pdf-util-window-attach newwin window)
- newwin))
-
-(defun pdf-util-goto-position (line &optional column)
- "Goto LINE and COLUMN in the current buffer.
-
-COLUMN defaults to 0. Widen the buffer, if the position is
-outside the current limits."
- (let ((pos
- (when (> line 0)
- (save-excursion
- (save-restriction
- (widen)
- (goto-char 1)
- (when (= 0 (forward-line (1- line)))
- (when (and column (> column 0))
- (forward-char (1- column)))
- (point)))))))
- (when pos
- (when (or (< pos (point-min))
- (> pos (point-max)))
- (widen))
- (goto-char pos))))
-
-(defun pdf-util-seq-alignment (seq1 seq2 &optional similarity-fn alignment-type)
- "Return an alignment of sequences SEQ1 and SEQ2.
-
-SIMILARITY-FN should be a function. It is called with two
-arguments: One element from SEQ1 and one from SEQ2. It should
-return a number determining how similar the elements are, where
-higher values mean `more similar'. The default returns 1 if the
-elements are equal, else -1.
-
-ALIGNMENT-TYPE may be one of the symbols `prefix', `suffix',
-`infix' or nil. If it is `prefix', trailing elements in SEQ2 may
-be ignored. For example the alignment of
-
-\(0 1\) and \(0 1 2\)
-
-using prefix matching is 0, since the prefixes are equal and the
-trailing 2 is ignored. The other possible values have similar
-effects. The default is nil, which means to match the whole
-sequences.
-
-Return a cons \(VALUE . ALIGNMENT\), where VALUE says how similar
-the sequences are and ALIGNMENT is a list of \(E1 . E2\), where
-E1 is an element from SEQ1 or nil, likewise for E2. If one of
-them is nil, it means there is gap at this position in the
-respective sequence."
-
- (cl-macrolet ((make-matrix (rows columns)
- (list 'apply (list 'quote 'vector)
- (list 'cl-loop 'for 'i 'from 1 'to rows
- 'collect (list 'make-vector columns nil))))
- (mset (matrix row column newelt)
- (list 'aset (list 'aref matrix row) column newelt))
- (mref (matrix row column)
- (list 'aref (list 'aref matrix row) column)))
- (let* ((nil-value nil)
- (len1 (length seq1))
- (len2 (length seq2))
- (d (make-matrix (1+ len1) (1+ len2)))
- (prefix-p (memq alignment-type '(prefix infix)))
- (suffix-p (memq alignment-type '(suffix infix)))
- (similarity-fn (or similarity-fn
- (lambda (a b)
- (if (equal a b) 1 -1)))))
-
- (cl-loop for i from 0 to len1 do
- (mset d i 0 (- i)))
- (cl-loop for j from 0 to len2 do
- (mset d 0 j (if suffix-p 0 (- j))))
-
- (cl-loop for i from 1 to len1 do
- (cl-loop for j from 1 to len2 do
- (let ((max (max
- (1- (mref d (1- i) j))
- (+ (mref d i (1- j))
- (if (and prefix-p (= i len1)) 0 -1))
- (+ (mref d (1- i) (1- j))
- (funcall similarity-fn
- (elt seq1 (1- i))
- (elt seq2 (1- j)))))))
- (mset d i j max))))
-
- (let ((i len1)
- (j len2)
- alignment)
- (while (or (> i 0)
- (> j 0))
- (cond
- ((and (> i 0)
- (= (mref d i j)
- (1- (mref d (1- i) j))))
- (cl-decf i)
- (push (cons (elt seq1 i) nil-value) alignment))
- ((and (> j 0)
- (= (mref d i j)
- (+ (mref d i (1- j))
- (if (or (and (= i 0) suffix-p)
- (and (= i len1) prefix-p))
- 0 -1))))
- (cl-decf j)
- (push (cons nil-value (elt seq2 j)) alignment))
- (t
- (cl-assert (and (> i 0) (> j 0)) t)
- (cl-decf i)
- (cl-decf j)
- (push (cons (elt seq1 i)
- (elt seq2 j)) alignment))))
- (cons (mref d len1 len2) alignment)))))
-
-
-(defun pdf-util-pcre-quote (string)
- "Escape STRING for use as a PCRE.
-
-See also `regexp-quote'."
-
- (let ((to-escape
- (eval-when-compile (append "\0\\|()[]{}^$*+?." nil)))
- (chars (append string nil))
- escaped)
- (dolist (ch chars)
- (when (memq ch to-escape)
- (push ?\\ escaped))
- (push ch escaped))
- (apply 'string (nreverse escaped))))
-
-(defun pdf-util-frame-ppi ()
- "Return the PPI of the current frame."
- (let* ((props (frame-monitor-attributes))
- (px (nthcdr 2 (alist-get 'geometry props)))
- (mm (alist-get 'mm-size props))
- (dp (sqrt (+ (expt (nth 0 px) 2)
- (expt (nth 1 px) 2))))
- (di (sqrt (+ (expt (/ (nth 0 mm) 25.4) 2)
- (expt (/ (nth 1 mm) 25.4) 2)))))
- (/ dp di)))
-
-(defvar pdf-view-use-scaling)
-
-(defun pdf-util-frame-scale-factor ()
- "Return the frame scale factor depending on the image type used for display.
-When `pdf-view-use-scaling' is non-nil and imagemagick or
-image-io are used as the image type for display, return the
-backing-scale-factor of the frame if available. If a
-backing-scale-factor attribute isn't available, return 2 if the
-frame's PPI is larger than 180. Otherwise, return 1."
- (if (and pdf-view-use-scaling
- (memq (pdf-view-image-type) '(imagemagick image-io))
- (fboundp 'frame-monitor-attributes))
- (or (cdr (assq 'backing-scale-factor (frame-monitor-attributes)))
- (if (>= (pdf-util-frame-ppi) 180)
- 2
- 1))
- 1))
-
-
-;; * ================================================================== *
-;; * Imagemagick's convert
-;; * ================================================================== *
-
-(defcustom pdf-util-convert-program
- ;; Avoid using the MS Windows command convert.exe .
- (unless (memq system-type '(ms-dos windows-nt))
- (executable-find "convert"))
- "Absolute path to the convert program."
- :group 'pdf-tools
- :type 'executable)
-
-(defcustom pdf-util-fast-image-format nil
- "An image format appropriate for fast displaying.
-
-This should be a cons \(TYPE . EXT\) where type is the Emacs
-image-type and EXT the appropriate file extension starting with a
-dot. If nil, the value is determined automatically.
-
-Different formats have different properties, with respect to
-Emacs loading time, convert creation time and the file-size. In
-general, uncompressed formats are faster, but may need a fair
-amount of (temporary) disk space."
- :group 'pdf-tools
- :type '(cons symbol string))
-
-(defun pdf-util-assert-convert-program ()
- (unless (and pdf-util-convert-program
- (file-executable-p pdf-util-convert-program))
- (error "The pdf-util-convert-program is unset or non-executable")))
-
-(defun pdf-util-image-file-size (image-file)
- "Determine the size of the image in IMAGE-FILE.
-
-Returns a cons \(WIDTH . HEIGHT\)."
- (pdf-util-assert-convert-program)
- (with-temp-buffer
- (when (save-excursion
- (= 0 (call-process
- pdf-util-convert-program
- nil (current-buffer) nil
- image-file "-format" "%w %h" "info:")))
- (let ((standard-input (current-buffer)))
- (cons (read) (read))))))
-
-(defun pdf-util-convert (in-file out-file &rest spec)
- "Convert image IN-FILE to OUT-FILE according to SPEC.
-
-IN-FILE should be the name of a file containing an image. Write
-the result to OUT-FILE. The extension of this filename usually
-determines the resulting image-type.
-
-SPEC is a property list, specifying what the convert program
-should do with the image. All manipulations operate on a
-rectangle, see below.
-
-SPEC may contain the following keys, respectively values.
-
-`:foreground' Set foreground color for all following operations.
-
-`:background' Dito, for the background color.
-
-`:commands' A list of strings representing arguments to convert
-for image manipulations. It may contain %-escape characters, as
-follows.
-
-%f -- Expands to the foreground color.
-%b -- Expands to the background color.
-%g -- Expands to the geometry of the current rectangle, i.e. WxH+X+Y.
-%x -- Expands to the left edge of rectangle.
-%X -- Expands to the right edge of rectangle.
-%y -- Expands to the top edge of rectangle.
-%Y -- Expands to the bottom edge of rectangle.
-%w -- Expands to the width of rectangle.
-%h -- Expands to the height of rectangle.
-
-Keep in mind, that every element of this list is seen by convert
-as a single argument.
-
-`:formats' An alist of additional %-escapes. Every element
-should be a cons \(CHAR . STRING\) or \(CHAR . FUNCTION\). In
-the first case, all occurrences of %-CHAR in the above commands
-will be replaced by STRING. In the second case FUNCTION is
-called with the current rectangle and it should return the
-replacement string.
-
-`:apply' A list of rectangles \(\(LEFT TOP RIGHT BOT\) ...\) in
-IN-FILE coordinates. Each such rectangle triggers one execution
-of the last commands given earlier in SPEC. E.g. a call like
-
-\(pdf-util-convert
- image-file out-file
- :foreground \"black\"
- :background \"white\"
- :commands '\(\"-fill\" \"%f\" \"-draw\" \"rectangle %x,%y,%X,%Y\"\)
- :apply '\(\(0 0 10 10\) \(10 10 20 20\)\)
- :commands '\(\"-fill\" \"%b\" \"-draw\" \"rectangle %x,%y,%X,%Y\"\)
- :apply '\(\(10 0 20 10\) \(0 10 10 20\)\)\)
-
-would draw a 4x4 checkerboard pattern in the left corner of the
-image, while leaving the rest of it as it was.
-
-Returns OUT-FILE.
-
-See url `http://www.imagemagick.org/script/convert.php'."
- (pdf-util-assert-convert-program)
- (let* ((cmds (pdf-util-convert--create-commands spec))
- (status (apply 'call-process
- pdf-util-convert-program nil
- (get-buffer-create "*pdf-util-convert-output*")
- nil
- `(,in-file ,@cmds ,out-file))))
- (unless (and (numberp status) (= 0 status))
- (error "The convert program exited with error status: %s" status))
- out-file))
-
-(defun pdf-util-convert-asynch (in-file out-file &rest spec-and-callback)
- "Like `pdf-util-convert', but asynchronous.
-
-If the last argument is a function, it is installed as the
-process sentinel.
-
-Returns the convert process."
- (pdf-util-assert-convert-program)
- (let ((callback (car (last spec-and-callback)))
- spec)
- (if (functionp callback)
- (setq spec (butlast spec-and-callback))
- (setq spec spec-and-callback
- callback nil))
- (let* ((cmds (pdf-util-convert--create-commands spec))
- (proc
- (apply 'start-process "pdf-util-convert"
- (get-buffer-create "*pdf-util-convert-output*")
- pdf-util-convert-program
- `(,in-file ,@cmds ,out-file))))
- (when callback
- (set-process-sentinel proc callback))
- proc)))
-
-(defun pdf-util-convert-page (&rest specs)
- "Convert image of current page according to SPECS.
-
-Return the converted PNG image as a string. See also
-`pdf-util-convert'."
-
- (pdf-util-assert-pdf-window)
- (let ((in-file (make-temp-file "pdf-util-convert" nil ".png"))
- (out-file (make-temp-file "pdf-util-convert" nil ".png")))
- (unwind-protect
- (let ((image-data
- (plist-get (cdr (pdf-view-current-image)) :data)))
- (with-temp-file in-file
- (set-buffer-multibyte nil)
- (set-buffer-file-coding-system 'binary)
- (insert image-data))
- (pdf-util-munch-file
- (apply 'pdf-util-convert
- in-file out-file specs)))
- (when (file-exists-p in-file)
- (delete-file in-file))
- (when (file-exists-p out-file)
- (delete-file out-file)))))
-
-
-(defun pdf-util-convert--create-commands (spec)
- (let ((fg "red")
- (bg "red")
- formats result cmds s)
- (while (setq s (pop spec))
- (unless spec
- (error "Missing value in convert spec:%s" (cons s spec)))
- (cl-case s
- (:foreground
- (setq fg (pop spec)))
- (:background
- (setq bg (pop spec)))
- (:commands
- (setq cmds (pop spec)))
- (:formats
- (setq formats (append formats (pop spec) nil)))
- (:apply
- (dolist (m (pop spec))
- (pdf-util-with-edges (m)
- (let ((alist (append
- (mapcar (lambda (f)
- (cons (car f)
- (if (stringp (cdr f))
- (cdr f)
- (funcall (cdr f) m))))
- formats)
- `((?g . ,(format "%dx%d+%d+%d"
- m-width m-height
- m-left m-top))
- (?x . ,m-left)
- (?X . ,m-right)
- (?y . ,m-top)
- (?Y . ,m-bot)
- (?w . ,(- m-right m-left))
- (?h . ,(- m-bot m-top))
- (?f . ,fg)
- (?b . ,bg)))))
- (dolist (fmt cmds)
- (push (format-spec fmt alist) result))))))))
- (nreverse result)))
-
-;; FIXME: Check code below and document.
-
-(defun pdf-util-edges-p (obj &optional relative-p)
- "Return non-nil, if OBJ look like edges.
-
-If RELATIVE-P is non-nil, also check that all values <= 1."
-
- (and (consp obj)
- (ignore-errors (= 4 (length obj)))
- (cl-every (lambda (x)
- (and (numberp x)
- (>= x 0)
- (or (null relative-p)
- (<= x 1))))
- obj)))
-
-(defun pdf-util-edges-empty-p (edges)
- "Return non-nil, if EDGES area is empty."
- (pdf-util-with-edges (edges)
- (or (<= edges-width 0)
- (<= edges-height 0))))
-
-(defun pdf-util-edges-inside-p (edges pos &optional epsilon)
- (pdf-util-edges-contained-p
- edges
- (list (car pos) (cdr pos) (car pos) (cdr pos))
- epsilon))
-
-(defun pdf-util-edges-contained-p (edges contained &optional epsilon)
- (unless epsilon (setq epsilon 0))
- (pdf-util-with-edges (edges contained)
- (and (<= (- edges-left epsilon)
- contained-left)
- (>= (+ edges-right epsilon)
- contained-right)
- (<= (- edges-top epsilon)
- contained-top)
- (>= (+ edges-bot epsilon)
- contained-bot))))
-
-(defun pdf-util-edges-intersection (e1 e2)
- (pdf-util-with-edges (edges1 e1 e2)
- (let ((left (max e1-left e2-left))
- (top (max e1-top e2-top))
- (right (min e1-right e2-right))
- (bot (min e1-bot e2-bot)))
- (when (and (<= left right)
- (<= top bot))
- (list left top right bot)))))
-
-(defun pdf-util-edges-union (&rest edges)
- (if (null (cdr edges))
- (car edges)
- (list (apply 'min (mapcar 'car edges))
- (apply 'min (mapcar 'cadr edges))
- (apply 'max (mapcar 'cl-caddr edges))
- (apply 'max (mapcar 'cl-cadddr edges)))))
-
-(defun pdf-util-edges-intersection-area (e1 e2)
- (let ((inters (pdf-util-edges-intersection e1 e2)))
- (if (null inters)
- 0
- (pdf-util-with-edges (inters)
- (* inters-width inters-height)))))
-
-(defun pdf-util-read-image-position (prompt)
- "Read a image position using prompt.
-
-Return the event position object."
- (save-selected-window
- (let ((ev (pdf-util-read-click-event
- (propertize prompt 'face 'minibuffer-prompt)))
- (buffer (current-buffer)))
- (unless (mouse-event-p ev)
- (error "Not a mouse event"))
- (let ((posn (event-start ev)))
- (unless (and (eq (window-buffer
- (posn-window posn))
- buffer)
- (eq 'image (car-safe (posn-object posn))))
- (error "Invalid image position"))
- posn))))
-
-(defun pdf-util-read-click-event (&optional prompt seconds)
- (let ((down (read-event prompt seconds)))
- (unless (and (mouse-event-p down)
- (equal (event-modifiers down)
- '(down)))
- (error "No a mouse click event"))
- (let ((up (read-event prompt seconds)))
- (unless (and (mouse-event-p up)
- (equal (event-modifiers up)
- '(click)))
- (error "No a mouse click event"))
- up)))
-
-(defun pdf-util-image-map-mouse-event-proxy (event)
- "Set POS-OR-AREA in EVENT to 1 and unread it."
- (interactive "e")
- (setcar (cdr (cadr event)) 1)
- (setq unread-command-events (list event)))
-
-(defun pdf-util-image-map-divert-mouse-clicks (id &optional buttons)
- (dolist (kind '("" "down-" "drag-"))
- (dolist (b (or buttons '(2 3 4 5 6)))
- (local-set-key
- (vector id (intern (format "%smouse-%d" kind b)))
- 'pdf-util-image-map-mouse-event-proxy))))
-
-(defmacro pdf-util-do-events (event-resolution-unread-p condition &rest body)
- "Read EVENTs while CONDITION executing BODY.
-
-Process at most 1/RESOLUTION events per second. If UNREAD-p is
-non-nil, unread the final non-processed event.
-
-\(FN (EVENT RESOLUTION &optional UNREAD-p) CONDITION &rest BODY\)"
- (declare (indent 2) (debug ((symbolp form &optional form) form body)))
- (cl-destructuring-bind (event resolution &optional unread-p)
- event-resolution-unread-p
- (let ((*seconds (make-symbol "seconds"))
- (*timestamp (make-symbol "timestamp"))
- (*clock (make-symbol "clock"))
- (*unread-p (make-symbol "unread-p"))
- (*resolution (make-symbol "resolution")))
- `(let* ((,*unread-p ,unread-p)
- (,*resolution ,resolution)
- (,*seconds 0)
- (,*timestamp (float-time))
- (,*clock (lambda (&optional secs)
- (when secs
- (setq ,*seconds secs
- ,*timestamp (float-time)))
- (- (+ ,*timestamp ,*seconds)
- (float-time))))
- (,event (read-event)))
- (while ,condition
- (when (<= (funcall ,*clock) 0)
- (progn ,@body)
- (setq ,event nil)
- (funcall ,*clock ,*resolution))
- (setq ,event
- (or (read-event nil nil
- (and ,event
- (max 0 (funcall ,*clock))))
- ,event)))
- (when (and ,*unread-p ,event)
- (setq unread-command-events
- (append unread-command-events
- (list ,event))))))))
-
-(defmacro pdf-util-track-mouse-dragging (event-resolution &rest body)
- "Read mouse movement events executing BODY.
-
-See also `pdf-util-do-events'.
-
-This macro should be used inside a command bound to a down-mouse
-event. It evaluates to t, if at least one event was processed in
-BODY, otherwise nil. In the latter case, the only event (usually
-a mouse click event) is unread.
-
-\(FN (EVENT RESOLUTION) &rest BODY\)"
- (declare (indent 1) (debug ((symbolp form) body)))
- (let ((ran-once-p (make-symbol "ran-once-p")))
- `(let (,ran-once-p)
- (track-mouse
- (pdf-util-do-events (,@event-resolution t)
- (mouse-movement-p ,(car event-resolution))
- (setq ,ran-once-p t)
- ,@body))
- (when (and ,ran-once-p
- unread-command-events)
- (setq unread-command-events
- (butlast unread-command-events)))
- ,ran-once-p)))
-
-(defun pdf-util-remove-duplicates (list)
- "Remove duplicates from LIST stably using `equal'."
- (let ((ht (make-hash-table :test 'equal))
- result)
- (dolist (elt list (nreverse result))
- (unless (gethash elt ht)
- (push elt result)
- (puthash elt t ht)))))
-
-(provide 'pdf-util)
-
-;;; pdf-util.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-view.el b/elpa/pdf-tools-20200512.1524/pdf-view.el
deleted file mode 100644
index 433f5da..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-view.el
+++ /dev/null
@@ -1,1676 +0,0 @@
-;;; pdf-view.el --- View PDF documents. -*- lexical-binding:t -*-
-
-;; Copyright (C) 2013 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: files, doc-view, pdf
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Functions related to viewing PDF documents.
-
-;;; Code:
-
-(require 'image-mode)
-(require 'pdf-util)
-(require 'pdf-info)
-(require 'pdf-cache)
-(require 'jka-compr)
-(require 'bookmark)
-(require 'password-cache)
-
-(declare-function cua-copy-region "cua-base")
-
-
-;; * ================================================================== *
-;; * Customizations
-;; * ================================================================== *
-
-(defgroup pdf-view nil
- "View PDF documents."
- :group 'pdf-tools)
-
-(defcustom pdf-view-display-size 'fit-width
- "The desired size of displayed pages.
-
-This may be one of `fit-height', `fit-width', `fit-page' or a
-number as a scale factor applied to the document's size. Any
-other value behaves like `fit-width'."
- :group 'pdf-view
- :type '(choice number
- (const fit-height)
- (const fit-width)
- (const fit-page)))
-
-(make-variable-buffer-local 'pdf-view-display-size)
-
-(defcustom pdf-view-resize-factor 1.25
- "Fractional amount of resizing of one resize command."
- :group 'pdf-view
- :type 'number)
-
-(defcustom pdf-view-continuous t
- "In Continuous mode reaching the page edge advances to next/previous page.
-
-When non-nil, scrolling a line upward at the bottom edge of the page
-moves to the next page, and scrolling a line downward at the top edge
-of the page moves to the previous page."
- :type 'boolean
- :group 'pdf-view)
-
-(defcustom pdf-view-bounding-box-margin 0.05
- "Fractional margin used for slicing with the bounding-box."
- :group 'pdf-view
- :type 'number)
-
-(defcustom pdf-view-use-imagemagick nil
- "Whether imagemagick should be used for rendering.
-
-This variable has no effect, if imagemagick was not compiled into
-Emacs or if imagemagick is the only way to display PNG images.
-FIXME: Explain dis-/advantages of imagemagick and png."
- :group 'pdf-view
- :type 'boolean)
-
-(defcustom pdf-view-use-scaling nil
- "Whether images should be allowed to be scaled for rendering.
-
-This variable affects both the reuse of higher-resolution images
-as lower-resolution ones by down-scaling the image. As well as
-the rendering of higher-resolution for high-resolution displays,
-if available.
-
-It has no effect, unless either the imagemagick or image-io
-image-format is available."
- :group 'pdf-view
- :type 'boolean)
-
-(defface pdf-view-region
- '((((background dark)) (:inherit region))
- (((background light)) (:inherit region)))
- "Face used to determine the colors of the region."
- :group 'pdf-view
- :group 'pdf-tools-faces)
-
-(defface pdf-view-rectangle
- '((((background dark)) (:inherit highlight))
- (((background light)) (:inherit highlight)))
- "Face used to determine the colors of the highlighted rectangle."
- :group 'pdf-view
- :group 'pdf-tools-faces)
-
-(defcustom pdf-view-midnight-colors '("#839496" . "#002b36" )
- "Colors used when `pdf-view-midnight-minor-mode' is activated.
-
-This should be a cons \(FOREGROUND . BACKGROUND\) of colors."
- :group 'pdf-view
- :type '(cons (color :tag "Foreground")
- (color :tag "Background")))
-
-(defcustom pdf-view-change-page-hook nil
- "Hook run after changing to another page, but before displaying it.
-
-See also `pdf-view-before-change-page-hook' and
-`pdf-view-after-change-page-hook'."
- :group 'pdf-view
- :type 'hook)
-
-(defcustom pdf-view-before-change-page-hook nil
- "Hook run before changing to another page.
-
-See also `pdf-view-change-page-hook' and
-`pdf-view-after-change-page-hook'."
- :group 'pdf-view
- :type 'hook)
-
-(defcustom pdf-view-after-change-page-hook nil
- "Hook run after changing to and displaying another page.
-
-See also `pdf-view-change-page-hook' and
-`pdf-view-before-change-page-hook'."
- :group 'pdf-view
- :type 'hook)
-
-(defcustom pdf-view-use-dedicated-register t
- "Whether to use dedicated register for PDF positions.
-
-If this is non-nil, the commands `pdf-view-position-to-register'
-and `pdf-view-jump-to-register' use the buffer-local variable
-`pdf-view-register-alist' to store resp. retrieve marked
-positions. Otherwise the common variable `register-alist' is
-used."
- :group 'pdf-view
- :type 'boolean)
-
-(defcustom pdf-view-image-relief 0
- "Add a shadow rectangle around the page's image.
-
-See :relief property in Info node `(elisp) Image Descriptors'."
- :group 'pdf-view
- :type '(integer :tag "Pixel")
- :link '(info-link "(elisp) Image Descriptors"))
-
-(defcustom pdf-view-max-image-width 4800
- "Maximum width of any image displayed in pixel."
- :group 'pdf-view
- :type '(integer :tag "Pixel"))
-
-(defcustom pdf-view-use-unicode-ligther t
- "Whether to use unicode symbols in the mode-line
-
-On some systems finding a font which supports those symbols can
-take some time. If you don't want to spend that time waiting and
-don't care for a nicer looking mode-line, set this variable to
-nil.
-
-Note, that this option has only an effect when this library is
-loaded."
- :group 'pdf-view
- :type 'boolean)
-
-(defcustom pdf-view-incompatible-modes
- '(linum-mode linum-relative-mode helm-linum-relative-mode
- nlinum-mode nlinum-hl-mode nlinum-relative-mode yalinum-mode)
- "A list of modes incompatible with `pdf-view-mode'.
-
-Issue a warning, if one of them is active in a PDF buffer."
- :group 'pdf-view
- :type '(repeat symbol))
-
-
-;; * ================================================================== *
-;; * Internal variables and macros
-;; * ================================================================== *
-
-(defvar-local pdf-view-active-region nil
- "The active region as a list of edges.
-
-Edge values are relative coordinates.")
-
-(defvar-local pdf-view--have-rectangle-region nil
- "Non-nil if the region is currently rendered as a rectangle.
-
-This variable is set in `pdf-view-mouse-set-region' and used in
-`pdf-view-mouse-extend-region' to determine the right choice
-regarding display of the region in the later function.")
-
-(defvar-local pdf-view--buffer-file-name nil
- "Local copy of remote file or nil.")
-
-(defvar-local pdf-view--server-file-name nil
- "The servers notion of this buffer's filename.")
-
-(defvar-local pdf-view--next-page-timer nil
- "Timer used in `pdf-view-next-page-command'.")
-
-(defvar-local pdf-view--hotspot-functions nil
- "Alist of hotspot functions.")
-
-(defvar-local pdf-view-register-alist nil
- "Local, dedicated register for PDF positions.")
-
-(defmacro pdf-view-current-page (&optional window)
- ;;TODO: write documentation!
- `(image-mode-window-get 'page ,window))
-
-(defmacro pdf-view-current-overlay (&optional window)
- ;;TODO: write documentation!
- `(image-mode-window-get 'overlay ,window))
-
-(defmacro pdf-view-current-image (&optional window)
- ;;TODO: write documentation!
- `(image-mode-window-get 'image ,window))
-
-(defmacro pdf-view-current-slice (&optional window)
- ;;TODO: write documentation!
- `(image-mode-window-get 'slice ,window))
-
-(defmacro pdf-view-current-window-size (&optional window)
- ;;TODO: write documentation!
- `(image-mode-window-get 'window-size ,window))
-
-(defmacro pdf-view-window-needs-redisplay (&optional window)
- `(image-mode-window-get 'needs-redisplay ,window))
-
-(defun pdf-view-current-pagelabel (&optional window)
- (nth (1- (pdf-view-current-page window)) (pdf-info-pagelabels)))
-
-(defun pdf-view-active-region-p nil
- "Return t if there are active regions."
- (not (null pdf-view-active-region)))
-
-(defmacro pdf-view-assert-active-region ()
- "Signal an error if there are no active regions."
- `(unless (pdf-view-active-region-p)
- (error "The region is not active")))
-
-(defconst pdf-view-have-image-mode-pixel-vscroll
- (>= emacs-major-version 27)
- "Whether image-mode scrolls vertically by pixels.")
-
-
-;; * ================================================================== *
-;; * Major Mode
-;; * ================================================================== *
-
-(defvar pdf-view-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map image-mode-map)
- (define-key map (kbd "Q") 'kill-this-buffer)
- ;; Navigation in the document
- (define-key map (kbd "n") 'pdf-view-next-page-command)
- (define-key map (kbd "p") 'pdf-view-previous-page-command)
- (define-key map (kbd "<next>") 'forward-page)
- (define-key map (kbd "<prior>") 'backward-page)
- (define-key map [remap forward-page] 'pdf-view-next-page-command)
- (define-key map [remap backward-page] 'pdf-view-previous-page-command)
- (define-key map (kbd "SPC") 'pdf-view-scroll-up-or-next-page)
- (define-key map (kbd "S-SPC") 'pdf-view-scroll-down-or-previous-page)
- (define-key map (kbd "DEL") 'pdf-view-scroll-down-or-previous-page)
- (define-key map (kbd "C-n") 'pdf-view-next-line-or-next-page)
- (define-key map (kbd "<down>") 'pdf-view-next-line-or-next-page)
- (define-key map (kbd "C-p") 'pdf-view-previous-line-or-previous-page)
- (define-key map (kbd "<up>") 'pdf-view-previous-line-or-previous-page)
- (define-key map (kbd "M-<") 'pdf-view-first-page)
- (define-key map (kbd "M->") 'pdf-view-last-page)
- (define-key map [remap goto-line] 'pdf-view-goto-page)
- (define-key map (kbd "M-g l") 'pdf-view-goto-label)
- (define-key map (kbd "RET") 'image-next-line)
- ;; Zoom in/out.
- (define-key map "+" 'pdf-view-enlarge)
- (define-key map "=" 'pdf-view-enlarge)
- (define-key map "-" 'pdf-view-shrink)
- (define-key map "0" 'pdf-view-scale-reset)
- ;; Fit the image to the window
- (define-key map "W" 'pdf-view-fit-width-to-window)
- (define-key map "H" 'pdf-view-fit-height-to-window)
- (define-key map "P" 'pdf-view-fit-page-to-window)
- ;; Slicing the image
- (define-key map (kbd "s m") 'pdf-view-set-slice-using-mouse)
- (define-key map (kbd "s b") 'pdf-view-set-slice-from-bounding-box)
- (define-key map (kbd "s r") 'pdf-view-reset-slice)
- ;; Reconvert
- (define-key map (kbd "C-c C-c") 'doc-view-mode)
- (define-key map (kbd "g") 'revert-buffer)
- (define-key map (kbd "r") 'revert-buffer)
- ;; Region
- (define-key map [down-mouse-1] 'pdf-view-mouse-set-region)
- (define-key map [M-down-mouse-1] 'pdf-view-mouse-set-region-rectangle)
- (define-key map [C-down-mouse-1] 'pdf-view-mouse-extend-region)
- (define-key map [remap kill-region] 'pdf-view-kill-ring-save)
- (define-key map [remap kill-ring-save] 'pdf-view-kill-ring-save)
- (define-key map [remap mark-whole-buffer] 'pdf-view-mark-whole-page)
- ;; Other
- (define-key map (kbd "C-c C-d") 'pdf-view-dark-minor-mode)
- (define-key map (kbd "m") 'pdf-view-position-to-register)
- (define-key map (kbd "'") 'pdf-view-jump-to-register)
-
- (define-key map (kbd "C-c C-i") 'pdf-view-extract-region-image)
- ;; Rendering
- (define-key map (kbd "C-c C-r m") 'pdf-view-midnight-minor-mode)
- (define-key map (kbd "C-c C-r p") 'pdf-view-printer-minor-mode)
- map)
- "Keymap used by `pdf-view-mode' when displaying a doc as a set of images.")
-
-(define-derived-mode pdf-view-mode special-mode "PDFView"
- "Major mode in PDF buffers.
-
-PDFView Mode is an Emacs PDF viewer. It displays PDF files as
-PNG images in Emacs buffers."
- :group 'pdf-view
- :abbrev-table nil
- :syntax-table nil
- ;; Setup a local copy for remote files.
- (when (and (or jka-compr-really-do-compress
- (let ((file-name-handler-alist nil))
- (not (and buffer-file-name
- (file-readable-p buffer-file-name)))))
- (pdf-tools-pdf-buffer-p))
- (let ((tempfile (pdf-util-make-temp-file
- (concat (if buffer-file-name
- (file-name-nondirectory
- buffer-file-name)
- (buffer-name))
- "-"))))
- (write-region nil nil tempfile nil 'no-message)
- (setq-local pdf-view--buffer-file-name tempfile)))
- ;; Decryption needs to be done before any other function calls into
- ;; pdf-info.el (e.g. from the mode-line during redisplay during
- ;; waiting for process output).
- (pdf-view-decrypt-document)
-
- ;; Setup scroll functions
- (if (boundp 'mwheel-scroll-up-function) ; not --without-x build
- (setq-local mwheel-scroll-up-function
- #'pdf-view-scroll-up-or-next-page))
- (if (boundp 'mwheel-scroll-down-function)
- (setq-local mwheel-scroll-down-function
- #'pdf-view-scroll-down-or-previous-page))
-
- ;; Clearing overlays
- (add-hook 'change-major-mode-hook
- (lambda ()
- (remove-overlays (point-min) (point-max) 'pdf-view t))
- nil t)
- (remove-overlays (point-min) (point-max) 'pdf-view t) ;Just in case.
-
- ;; Setup other local variables.
- (setq-local mode-line-position
- '(" P" (:eval (number-to-string (pdf-view-current-page)))
- ;; Avoid errors during redisplay.
- "/" (:eval (or (ignore-errors
- (number-to-string (pdf-cache-number-of-pages)))
- "???"))))
- (setq-local auto-hscroll-mode nil)
- (setq-local pdf-view--server-file-name (pdf-view-buffer-file-name))
- ;; High values of scroll-conservatively seem to trigger
- ;; some display bug in xdisp.c:try_scrolling .
- (setq-local scroll-conservatively 0)
- (setq-local cursor-type nil)
- (setq-local buffer-read-only t)
- (setq-local view-read-only nil)
- (setq-local bookmark-make-record-function
- 'pdf-view-bookmark-make-record)
- (setq-local revert-buffer-function #'pdf-view-revert-buffer)
- ;; No auto-save at the moment.
- (setq-local buffer-auto-save-file-name nil)
- ;; Disable image rescaling.
- (when (boundp 'image-scaling-factor)
- (setq-local image-scaling-factor 1))
- ;; No undo at the moment.
- (unless buffer-undo-list
- (buffer-disable-undo))
- ;; Enable transient-mark-mode, so region deactivation when quitting
- ;; will work.
- (setq-local transient-mark-mode t)
- ;; In Emacs >= 24.4, `cua-copy-region' should have been advised when
- ;; loading pdf-view.el so as to make it work with
- ;; pdf-view-mode. Disable cua-mode if that is not the case.
- ;; FIXME: cua-mode is a global minor-mode, but setting cua-mode to
- ;; nil seems to do the trick.
- (when (and (bound-and-true-p cua-mode)
- (version< emacs-version "24.4"))
- (setq-local cua-mode nil))
-
- (add-hook 'window-configuration-change-hook
- 'pdf-view-redisplay-some-windows nil t)
- (add-hook 'deactivate-mark-hook 'pdf-view-deactivate-region nil t)
- (add-hook 'write-contents-functions
- 'pdf-view--write-contents-function nil t)
- (add-hook 'kill-buffer-hook 'pdf-view-close-document nil t)
- (pdf-view-add-hotspot-function
- 'pdf-view-text-regions-hotspots-function -9)
-
- ;; Keep track of display info
- (add-hook 'image-mode-new-window-functions
- 'pdf-view-new-window-function nil t)
- (image-mode-setup-winprops)
-
- ;; Issue a warning in the future about incompatible modes.
- (run-with-timer 1 nil (lambda (buffer)
- (when (buffer-live-p buffer)
- (pdf-view-check-incompatible-modes buffer)))
- (current-buffer)))
-
-(unless (version< emacs-version "24.4")
- (defun cua-copy-region--pdf-view-advice (&rest _)
- "If the current buffer is in `pdf-view' mode, call
-`pdf-view-kill-ring-save'."
- (when (eq major-mode 'pdf-view-mode)
- (pdf-view-kill-ring-save)
- t))
-
- (advice-add 'cua-copy-region
- :before-until
- #'cua-copy-region--pdf-view-advice))
-
-(defun pdf-view-check-incompatible-modes (&optional buffer)
- "Check BUFFER for incompatible modes, maybe issue a warning."
- (with-current-buffer (or buffer (current-buffer))
- (let ((modes
- (cl-remove-if-not
- (lambda (mode) (and (symbolp mode)
- (boundp mode)
- (symbol-value mode)))
- pdf-view-incompatible-modes)))
- (when modes
- (display-warning
- 'pdf-view
- (format "These modes are incompatible with `pdf-view-mode',
- please deactivate them (or customize pdf-view-incompatible-modes): %s"
- (mapconcat #'symbol-name modes ",")))))))
-
-(defun pdf-view-decrypt-document ()
- "Read a password, if the document is encrypted and open it."
- (interactive)
- (when (pdf-info-encrypted-p)
- (let ((prompt (format "Enter password for `%s': "
- (abbreviate-file-name
- (buffer-file-name))))
- (key (concat "/pdf-tools" (buffer-file-name)))
- (i 3)
- password)
- (while (and (> i 0)
- (pdf-info-encrypted-p))
- (setq i (1- i))
- (setq password (password-read prompt key))
- (setq prompt "Invalid password, try again: ")
- (ignore-errors (pdf-info-open nil password)))
- (pdf-info-open nil password)
- (password-cache-add key password)))
- nil)
-
-(defun pdf-view-buffer-file-name ()
- "Return the local filename of the PDF in the current buffer.
-
-This may be different from variable `buffer-file-name' when
-operating on a local copy of a remote file."
- (or pdf-view--buffer-file-name
- (buffer-file-name)))
-
-(defun pdf-view--write-contents-function ()
- "Function for `write-contents-functions' to save the buffer."
- (when (pdf-util-pdf-buffer-p)
- (let ((tempfile (pdf-info-save pdf-view--server-file-name)))
- (unwind-protect
- (progn
- ;; Order matters here: We need to first copy the new
- ;; content (tempfile) to the PDF, and then close the PDF.
- ;; Since while closing the file (and freeing its resources
- ;; in the process), it may be immediately reopened due to
- ;; redisplay happening inside the pdf-info-close function
- ;; (while waiting for a response from the process.).
- (copy-file tempfile (buffer-file-name) t)
- (pdf-info-close pdf-view--server-file-name)
-
- (when pdf-view--buffer-file-name
- (copy-file tempfile pdf-view--buffer-file-name t))
- (clear-visited-file-modtime)
- (set-buffer-modified-p nil)
- (setq pdf-view--server-file-name
- (pdf-view-buffer-file-name))
- t)
- (when (file-exists-p tempfile)
- (delete-file tempfile))))))
-
-(defun pdf-view-revert-buffer (&optional ignore-auto noconfirm)
- "Revert buffer while preserving current modes.
-
-Optional parameters IGNORE-AUTO and NOCONFIRM are defined as in
-`revert-buffer'."
- (interactive (list (not current-prefix-arg)))
- ;; Bind to default so that we can use pdf-view-revert-buffer as
- ;; revert-buffer-function. A binding of nil is needed in Emacs 24.3, but in
- ;; later versions the semantics that nil means the default function should
- ;; not relied upon.
- (let ((revert-buffer-function (when (fboundp #'revert-buffer--default)
- #'revert-buffer--default))
- (after-revert-hook
- (cons #'pdf-info-close
- after-revert-hook)))
- (prog1
- (revert-buffer ignore-auto noconfirm 'preserve-modes)
- (pdf-view-redisplay t))))
-
-(defun pdf-view-close-document ()
- "Return immediately after closing document.
-
-This function always succeeds. See also `pdf-info-close', which
-does not return immediately."
- (when (pdf-info-running-p)
- (let ((pdf-info-asynchronous 'ignore))
- (ignore-errors
- (pdf-info-close)))))
-
-
-;; * ================================================================== *
-;; * Scaling
-;; * ================================================================== *
-
-(defun pdf-view-fit-page-to-window ()
- "Fit PDF to window.
-
-Choose the larger of PDF's height and width, and fits that
-dimension to window."
- (interactive)
- (setq pdf-view-display-size 'fit-page)
- (image-set-window-vscroll 0)
- (image-set-window-hscroll 0)
- (pdf-view-redisplay t))
-
-(defun pdf-view-fit-height-to-window ()
- "Fit PDF height to window."
- (interactive)
- (setq pdf-view-display-size 'fit-height)
- (image-set-window-vscroll 0)
- (pdf-view-redisplay t))
-
-(defun pdf-view-fit-width-to-window ()
- "Fit PDF size to window."
- (interactive)
- (setq pdf-view-display-size 'fit-width)
- (image-set-window-hscroll 0)
- (pdf-view-redisplay t))
-
-(defun pdf-view-enlarge (factor)
- "Enlarge PDF by FACTOR.
-
-When called interactively, uses the value of
-`pdf-view-resize-factor'.
-
-For example, (pdf-view-enlarge 1.25) increases size by 25%."
- (interactive
- (list (float pdf-view-resize-factor)))
- (let* ((size (pdf-view-image-size))
- (pagesize (pdf-cache-pagesize
- (pdf-view-current-page)))
- (scale (/ (float (car size))
- (float (car pagesize)))))
- (setq pdf-view-display-size
- (* factor scale))
- (pdf-view-redisplay t)))
-
-(defun pdf-view-shrink (factor)
- "Shrink PDF by FACTOR.
-
-When called interactively, uses the value of
-`pdf-view-resize-factor'.
-
-For example, (pdf-view-shrink 1.25) decreases size by 20%."
- (interactive
- (list (float pdf-view-resize-factor)))
- (pdf-view-enlarge (/ 1.0 factor)))
-
-(defun pdf-view-scale-reset ()
- "Reset PDF to its default set."
- (interactive)
- (setq pdf-view-display-size 1.0)
- (pdf-view-redisplay t))
-
-
-
-;; * ================================================================== *
-;; * Moving by pages and scrolling
-;; * ================================================================== *
-
-(defun pdf-view-goto-page (page &optional window)
- "Go to PAGE in PDF.
-
-If optional parameter WINDOW, go to PAGE in all `pdf-view'
-windows."
- (interactive
- (list (if current-prefix-arg
- (prefix-numeric-value current-prefix-arg)
- (read-number "Page: "))))
- (unless (and (>= page 1)
- (<= page (pdf-cache-number-of-pages)))
- (error "No such page: %d" page))
- (unless window
- (setq window
- (if (pdf-util-pdf-window-p)
- (selected-window)
- t)))
- (save-selected-window
- ;; Select the window for the hooks below.
- (when (window-live-p window)
- (select-window window))
- (let ((changing-p
- (not (eq page (pdf-view-current-page window)))))
- (when changing-p
- (run-hooks 'pdf-view-before-change-page-hook)
- (setf (pdf-view-current-page window) page)
- (run-hooks 'pdf-view-change-page-hook))
- (when (window-live-p window)
- (pdf-view-redisplay window))
- (when changing-p
- (pdf-view-deactivate-region)
- (force-mode-line-update)
- (run-hooks 'pdf-view-after-change-page-hook))))
- nil)
-
-(defun pdf-view-next-page (&optional n)
- "View the next page in the PDF.
-
-Optional parameter N moves N pages forward."
- (interactive "p")
- (pdf-view-goto-page (+ (pdf-view-current-page)
- (or n 1))))
-
-(defun pdf-view-previous-page (&optional n)
- "View the previous page in the PDF.
-
-Optional parameter N moves N pages backward."
- (interactive "p")
- (pdf-view-next-page (- (or n 1))))
-
-(defun pdf-view-next-page-command (&optional n)
- "View the next page in the PDF.
-
-Optional parameter N moves N pages forward.
-
-This command is a wrapper for `pdf-view-next-page' that will
-indicate to the user if they are on the last page and more."
- (declare (interactive-only pdf-view-next-page))
- (interactive "p")
- (unless n (setq n 1))
- (when (> (+ (pdf-view-current-page) n)
- (pdf-cache-number-of-pages))
- (user-error "Last page"))
- (when (< (+ (pdf-view-current-page) n) 1)
- (user-error "First page"))
- (let ((pdf-view-inhibit-redisplay t))
- (pdf-view-goto-page
- (+ (pdf-view-current-page) n)))
- (force-mode-line-update)
- (sit-for 0)
- (when pdf-view--next-page-timer
- (cancel-timer pdf-view--next-page-timer)
- (setq pdf-view--next-page-timer nil))
- (if (or (not (input-pending-p))
- (and (> n 0)
- (= (pdf-view-current-page)
- (pdf-cache-number-of-pages)))
- (and (< n 0)
- (= (pdf-view-current-page) 1)))
- (pdf-view-redisplay)
- (setq pdf-view--next-page-timer
- (run-with-idle-timer 0.001 nil 'pdf-view-redisplay (selected-window)))))
-
-(defun pdf-view-previous-page-command (&optional n)
- "View the previous page in the PDF.
-
-Optional parameter N moves N pages backward.
-
-This command is a wrapper for `pdf-view-previous-page'."
- (declare (interactive-only pdf-view-previous-page))
- (interactive "p")
- (with-no-warnings
- (pdf-view-next-page-command (- (or n 1)))))
-
-(defun pdf-view-first-page ()
- "View the first page."
- (interactive)
- (pdf-view-goto-page 1))
-
-(defun pdf-view-last-page ()
- "View the last page."
- (interactive)
- (pdf-view-goto-page (pdf-cache-number-of-pages)))
-
-(defun pdf-view-scroll-up-or-next-page (&optional arg)
- "Scroll page up ARG lines if possible, else go to the next page.
-
-When `pdf-view-continuous' is non-nil, scrolling upward at the
-bottom edge of the page moves to the next page. Otherwise, go to
-next page only on typing SPC (ARG is nil)."
- (interactive "P")
- (if (or pdf-view-continuous (null arg))
- (let ((hscroll (window-hscroll))
- (cur-page (pdf-view-current-page)))
- (when (or (= (window-vscroll nil pdf-view-have-image-mode-pixel-vscroll)
- (image-scroll-up arg))
- ;; Workaround rounding/off-by-one issues.
- (memq pdf-view-display-size
- '(fit-height fit-page)))
- (pdf-view-next-page)
- (when (/= cur-page (pdf-view-current-page))
- (image-bob)
- (image-bol 1))
- (image-set-window-hscroll hscroll)))
- (image-scroll-up arg)))
-
-(defun pdf-view-scroll-down-or-previous-page (&optional arg)
- "Scroll page down ARG lines if possible, else go to the previous page.
-
-When `pdf-view-continuous' is non-nil, scrolling downward at the
-top edge of the page moves to the previous page. Otherwise, go
-to previous page only on typing DEL (ARG is nil)."
- (interactive "P")
- (if (or pdf-view-continuous (null arg))
- (let ((hscroll (window-hscroll))
- (cur-page (pdf-view-current-page)))
- (when (or (= (window-vscroll nil pdf-view-have-image-mode-pixel-vscroll)
- (image-scroll-down arg))
- ;; Workaround rounding/off-by-one issues.
- (memq pdf-view-display-size
- '(fit-height fit-page)))
- (pdf-view-previous-page)
- (when (/= cur-page (pdf-view-current-page))
- (image-eob)
- (image-bol 1))
- (image-set-window-hscroll hscroll)))
- (image-scroll-down arg)))
-
-(defun pdf-view-next-line-or-next-page (&optional arg)
- "Scroll upward by ARG lines if possible, else go to the next page.
-
-When `pdf-view-continuous' is non-nil, scrolling a line upward
-at the bottom edge of the page moves to the next page."
- (interactive "p")
- (if pdf-view-continuous
- (let ((hscroll (window-hscroll))
- (cur-page (pdf-view-current-page)))
- (when (= (window-vscroll nil pdf-view-have-image-mode-pixel-vscroll)
- (image-next-line arg))
- (pdf-view-next-page)
- (when (/= cur-page (pdf-view-current-page))
- (image-bob)
- (image-bol 1))
- (image-set-window-hscroll hscroll)))
- (image-next-line 1)))
-
-(defun pdf-view-previous-line-or-previous-page (&optional arg)
- "Scroll downward by ARG lines if possible, else go to the previous page.
-
-When `pdf-view-continuous' is non-nil, scrolling a line downward
-at the top edge of the page moves to the previous page."
- (interactive "p")
- (if pdf-view-continuous
- (let ((hscroll (window-hscroll))
- (cur-page (pdf-view-current-page)))
- (when (= (window-vscroll nil pdf-view-have-image-mode-pixel-vscroll)
- (image-previous-line arg))
- (pdf-view-previous-page)
- (when (/= cur-page (pdf-view-current-page))
- (image-eob)
- (image-bol 1))
- (image-set-window-hscroll hscroll)))
- (image-previous-line arg)))
-
-(defun pdf-view-goto-label (label)
- "Go to the page corresponding to LABEL.
-
-Usually, the label of a document's page is the same as its
-displayed page number."
- (interactive
- (list (let ((labels (pdf-info-pagelabels)))
- (completing-read "Goto label: " labels nil t))))
- (let ((index (cl-position label (pdf-info-pagelabels) :test 'equal)))
- (unless index
- (error "No such label: %s" label))
- (pdf-view-goto-page (1+ index))))
-
-
-;; * ================================================================== *
-;; * Slicing
-;; * ================================================================== *
-
-(defun pdf-view-set-slice (x y width height &optional window)
- ;; TODO: add WINDOW to docstring.
- "Set the slice of the pages that should be displayed.
-
-X, Y, WIDTH and HEIGHT should be relative coordinates, i.e. in
-\[0;1\]. To reset the slice use `pdf-view-reset-slice'."
- (unless (equal (pdf-view-current-slice window)
- (list x y width height))
- (setf (pdf-view-current-slice window)
- (mapcar (lambda (v)
- (max 0 (min 1 v)))
- (list x y width height)))
- (pdf-view-redisplay window)))
-
-(defun pdf-view-set-slice-using-mouse ()
- "Set the slice of the images that should be displayed.
-
-Set the slice by pressing `mouse-1' at its top-left corner and
-dragging it to its bottom-right corner. See also
-`pdf-view-set-slice' and `pdf-view-reset-slice'."
- (interactive)
- (let ((size (pdf-view-image-size))
- x y w h done)
- (while (not done)
- (let ((e (read-event
- (concat "Press mouse-1 at the top-left corner and "
- "drag it to the bottom-right corner!"))))
- (when (eq (car e) 'drag-mouse-1)
- (setq x (car (posn-object-x-y (event-start e))))
- (setq y (cdr (posn-object-x-y (event-start e))))
- (setq w (- (car (posn-object-x-y (event-end e))) x))
- (setq h (- (cdr (posn-object-x-y (event-end e))) y))
- (setq done t))))
- (apply 'pdf-view-set-slice
- (pdf-util-scale
- (list x y w h)
- (cons (/ 1.0 (float (car size)))
- (/ 1.0 (float (cdr size))))))))
-
-(defun pdf-view-set-slice-from-bounding-box (&optional window)
- ;; TODO: add WINDOW to docstring.
- "Set the slice from the page's bounding-box.
-
-The result is that the margins are almost completely cropped,
-much more accurate than could be done manually using
-`pdf-view-set-slice-using-mouse'.
-
-See also `pdf-view-bounding-box-margin'."
- (interactive)
- (let* ((bb (pdf-cache-boundingbox (pdf-view-current-page window)))
- (margin (max 0 (or pdf-view-bounding-box-margin 0)))
- (slice (list (- (nth 0 bb)
- (/ margin 2.0))
- (- (nth 1 bb)
- (/ margin 2.0))
- (+ (- (nth 2 bb) (nth 0 bb))
- margin)
- (+ (- (nth 3 bb) (nth 1 bb))
- margin))))
- (apply 'pdf-view-set-slice
- (append slice (and window (list window))))))
-
-(defun pdf-view-reset-slice (&optional window)
- ;; TODO: add WINDOW to doctring.
- "Reset the current slice.
-
-After calling this function the whole page will be visible
-again."
- (interactive)
- (when (pdf-view-current-slice window)
- (setf (pdf-view-current-slice window) nil)
- (pdf-view-redisplay window))
- nil)
-
-(define-minor-mode pdf-view-auto-slice-minor-mode
- "Automatically slice pages according to their bounding boxes.
-
-See also `pdf-view-set-slice-from-bounding-box'."
- nil nil nil
- (pdf-util-assert-pdf-buffer)
- (cond
- (pdf-view-auto-slice-minor-mode
- (dolist (win (get-buffer-window-list nil nil t))
- (when (pdf-util-pdf-window-p win)
- (pdf-view-set-slice-from-bounding-box win)))
- (add-hook 'pdf-view-change-page-hook
- 'pdf-view-set-slice-from-bounding-box nil t))
- (t
- (remove-hook 'pdf-view-change-page-hook
- 'pdf-view-set-slice-from-bounding-box t))))
-
-
-;; * ================================================================== *
-;; * Display
-;; * ================================================================== *
-
-(defvar pdf-view-inhibit-redisplay nil)
-(defvar pdf-view-inhibit-hotspots nil)
-
-(defun pdf-view-image-type ()
- "Return the image type that should be used.
-
-The return value is either `imagemagick' (if available and wanted
-or if png is not available) or `png'.
-
-Signal an error, if neither `imagemagick' nor `png' is available.
-
-See also `pdf-view-use-imagemagick'."
- (cond ((and pdf-view-use-imagemagick
- (fboundp 'imagemagick-types))
- 'imagemagick)
- ((image-type-available-p 'image-io)
- 'image-io)
- ((image-type-available-p 'png)
- 'png)
- ((fboundp 'imagemagick-types)
- 'imagemagick)
- (t
- (error "PNG image supported not compiled into Emacs"))))
-
-(defun pdf-view-use-scaling-p ()
- "Return t if scaling should be used."
- (and (memq (pdf-view-image-type)
- '(imagemagick image-io))
- pdf-view-use-scaling))
-
-(defmacro pdf-view-create-image (data &rest props)
- ;; TODO: add DATA and PROPS to docstring.
- "Like `create-image', but with set DATA-P and TYPE arguments."
- (declare (indent 1) (debug t))
- (let ((image-data (make-symbol "data")))
- `(let ((,image-data ,data))
- (apply #'create-image ,image-data (pdf-view-image-type) t ,@props
- (cl-list*
- :relief (or pdf-view-image-relief 0)
- (when (and (eq (framep-on-display) 'mac)
- (= (pdf-util-frame-scale-factor) 2))
- (list :data-2x ,image-data)))))))
-
-(defun pdf-view-create-page (page &optional window)
- "Create an image of PAGE for display on WINDOW."
- (let* ((size (pdf-view-desired-image-size page window))
- (data (pdf-cache-renderpage
- page (car size)
- (if (not (pdf-view-use-scaling-p))
- (car size)
- (* 2 (car size)))))
- (hotspots (pdf-view-apply-hotspot-functions
- window page size)))
- (pdf-view-create-image data
- :width (car size)
- :map hotspots
- :pointer 'arrow)))
-
-(defun pdf-view-image-size (&optional displayed-p window)
- ;; TODO: add WINDOW to docstring.
- "Return the size in pixel of the current image.
-
-If DISPLAYED-P is non-nil, return the size of the displayed
-image. These values may be different, if slicing is used."
- (if displayed-p
- (with-selected-window (or window (selected-window))
- (image-display-size
- (image-get-display-property) t))
- (image-size (pdf-view-current-image window) t)))
-
-(defun pdf-view-image-offset (&optional window)
- ;; TODO: add WINDOW to docstring.
- "Return the offset of the current image.
-
-It is equal to \(LEFT . TOP\) of the current slice in pixel."
- (let* ((slice (pdf-view-current-slice window)))
- (cond
- (slice
- (pdf-util-scale-relative-to-pixel
- (cons (nth 0 slice) (nth 1 slice))
- window))
- (t
- (cons 0 0)))))
-
-(defun pdf-view-display-page (page &optional window)
- "Display page PAGE in WINDOW."
- (setf (pdf-view-window-needs-redisplay window) nil)
- (pdf-view-display-image
- (pdf-view-create-page page window)
- window))
-
-(defun pdf-view-display-image (image &optional window inhibit-slice-p)
- ;; TODO: write documentation!
- (let ((ol (pdf-view-current-overlay window)))
- (when (window-live-p (overlay-get ol 'window))
- (let* ((size (image-size image t))
- (slice (if (not inhibit-slice-p)
- (pdf-view-current-slice window)))
- (displayed-width (floor
- (if slice
- (* (nth 2 slice)
- (car (image-size image)))
- (car (image-size image))))))
- (setf (pdf-view-current-image window) image)
- (move-overlay ol (point-min) (point-max))
- ;; In case the window is wider than the image, center the image
- ;; horizontally.
- (overlay-put ol 'before-string
- (when (> (window-width window)
- displayed-width)
- (propertize " " 'display
- `(space :align-to
- ,(/ (- (window-width window)
- displayed-width) 2)))))
- (overlay-put ol 'display
- (if slice
- (list (cons 'slice
- (pdf-util-scale slice size 'round))
- image)
- image))
- (let* ((win (overlay-get ol 'window))
- (hscroll (image-mode-window-get 'hscroll win))
- (vscroll (image-mode-window-get 'vscroll win)))
- ;; Reset scroll settings, in case they were changed.
- (if hscroll (set-window-hscroll win hscroll))
- (if vscroll (set-window-vscroll
- win vscroll pdf-view-have-image-mode-pixel-vscroll)))))))
-
-(defun pdf-view-redisplay (&optional window)
- "Redisplay page in WINDOW.
-
-If WINDOW is t, redisplay pages in all windows."
- (unless pdf-view-inhibit-redisplay
- (if (not (eq t window))
- (pdf-view-display-page
- (pdf-view-current-page window)
- window)
- (dolist (win (get-buffer-window-list nil nil t))
- (pdf-view-display-page
- (pdf-view-current-page win)
- win))
- (when (consp image-mode-winprops-alist)
- (dolist (window (mapcar #'car image-mode-winprops-alist))
- (unless (or (not (window-live-p window))
- (eq (current-buffer)
- (window-buffer window)))
- (setf (pdf-view-window-needs-redisplay window) t)))))
- (force-mode-line-update)))
-
-(defun pdf-view-redisplay-pages (&rest pages)
- "Redisplay PAGES in all windows."
- (pdf-util-assert-pdf-buffer)
- (dolist (window (get-buffer-window-list nil nil t))
- (when (memq (pdf-view-current-page window)
- pages)
- (pdf-view-redisplay window))))
-
-(defun pdf-view-maybe-redisplay-resized-windows ()
- "Redisplay some windows needing redisplay."
- (unless (or (numberp pdf-view-display-size)
- (pdf-view-active-region-p)
- (> (minibuffer-depth) 0))
- (dolist (window (get-buffer-window-list nil nil t))
- (let ((stored (pdf-view-current-window-size window))
- (size (cons (window-width window)
- (window-height window))))
- (unless (equal size stored)
- (setf (pdf-view-current-window-size window) size)
- (unless (or (null stored)
- (and (eq pdf-view-display-size 'fit-width)
- (eq (car size) (car stored)))
- (and (eq pdf-view-display-size 'fit-height)
- (eq (cdr size) (cdr stored))))
- (pdf-view-redisplay window)))))))
-
-(defun pdf-view-redisplay-some-windows ()
- (pdf-view-maybe-redisplay-resized-windows)
- (dolist (window (get-buffer-window-list nil nil t))
- (when (pdf-view-window-needs-redisplay window)
- (pdf-view-redisplay window))))
-
-(defun pdf-view-new-window-function (winprops)
- ;; TODO: write documentation!
- ;; (message "New window %s for buf %s" (car winprops) (current-buffer))
- (cl-assert (or (eq t (car winprops))
- (eq (window-buffer (car winprops)) (current-buffer))))
- (let ((ol (image-mode-window-get 'overlay winprops)))
- (if ol
- (progn
- (setq ol (copy-overlay ol))
- ;; `ol' might actually be dead.
- (move-overlay ol (point-min) (point-max)))
- (setq ol (make-overlay (point-min) (point-max) nil t))
- (overlay-put ol 'pdf-view t))
- (overlay-put ol 'window (car winprops))
- (unless (windowp (car winprops))
- ;; It's a pseudo entry. Let's make sure it's not displayed (the
- ;; `window' property is only effective if its value is a window).
- (cl-assert (eq t (car winprops)))
- (delete-overlay ol))
- (image-mode-window-put 'overlay ol winprops)
- ;; Clean up some overlays.
- (dolist (ov (overlays-in (point-min) (point-max)))
- (when (and (windowp (overlay-get ov 'window))
- (not (window-live-p (overlay-get ov 'window))))
- (delete-overlay ov)))
- (when (and (windowp (car winprops))
- (null (image-mode-window-get 'image winprops)))
- ;; We're not displaying an image yet, so let's do so. This
- ;; happens when the buffer is displayed for the first time.
- (with-selected-window (car winprops)
- (pdf-view-goto-page
- (or (image-mode-window-get 'page t) 1))))))
-
-(defun pdf-view-desired-image-size (&optional page window)
- ;; TODO: write documentation!
- (let* ((pagesize (pdf-cache-pagesize
- (or page (pdf-view-current-page window))))
- (slice (pdf-view-current-slice window))
- (width-scale (/ (/ (float (pdf-util-window-pixel-width window))
- (or (nth 2 slice) 1.0))
- (float (car pagesize))))
- (height (- (nth 3 (window-inside-pixel-edges window))
- (nth 1 (window-inside-pixel-edges window))
- 1))
- (height-scale (/ (/ (float height)
- (or (nth 3 slice) 1.0))
- (float (cdr pagesize))))
- (scale width-scale))
- (if (numberp pdf-view-display-size)
- (setq scale (float pdf-view-display-size))
- (cl-case pdf-view-display-size
- (fit-page
- (setq scale (min height-scale width-scale)))
- (fit-height
- (setq scale height-scale))
- (t
- (setq scale width-scale))))
- (let ((width (floor (* (car pagesize) scale)))
- (height (floor (* (cdr pagesize) scale))))
- (when (> width (max 1 (or pdf-view-max-image-width width)))
- (setq width pdf-view-max-image-width
- height (* height (/ (float pdf-view-max-image-width) width))))
- (cons (max 1 width) (max 1 height)))))
-
-(defun pdf-view-text-regions-hotspots-function (page size)
- "Return a list of hotspots for text regions on PAGE using SIZE.
-
-This will display a text cursor, when hovering over them."
- (local-set-key [pdf-view-text-region t]
- 'pdf-util-image-map-mouse-event-proxy)
- (mapcar (lambda (region)
- (let ((e (pdf-util-scale region size 'round)))
- `((rect . ((,(nth 0 e) . ,(nth 1 e))
- . (,(nth 2 e) . ,(nth 3 e))))
- pdf-view-text-region
- (pointer text))))
- (pdf-cache-textregions page)))
-
-(define-minor-mode pdf-view-dark-minor-mode
- "Mode for PDF documents with dark background.
-
-This tells the various modes to use their face's dark colors."
- nil nil nil
- (pdf-util-assert-pdf-buffer)
- ;; FIXME: This should really be run in a hook.
- (when (bound-and-true-p pdf-isearch-active-mode)
- (with-no-warnings
- (pdf-isearch-redisplay)
- (pdf-isearch-message
- (if pdf-view-dark-minor-mode "dark mode" "light mode")))))
-
-(define-minor-mode pdf-view-printer-minor-mode
- "Display the PDF as it would be printed."
- nil " Prn" nil
- (pdf-util-assert-pdf-buffer)
- (let ((enable (lambda ()
- (pdf-info-setoptions :render/printed t))))
- (cond
- (pdf-view-printer-minor-mode
- (add-hook 'after-save-hook enable nil t)
- (add-hook 'after-revert-hook enable nil t))
- (t
- (remove-hook 'after-save-hook enable t)
- (remove-hook 'after-revert-hook enable t))))
- (pdf-info-setoptions :render/printed pdf-view-printer-minor-mode)
- (pdf-cache-clear-images)
- (pdf-view-redisplay t))
-
-(define-minor-mode pdf-view-midnight-minor-mode
- "Apply a color-filter appropriate for past midnight reading.
-
-The colors are determined by the variable
-`pdf-view-midnight-colors', which see. "
-
- nil " Mid" nil
- (pdf-util-assert-pdf-buffer)
- ;; FIXME: Maybe these options should be passed stateless to pdf-info-renderpage ?
- (let ((enable (lambda ()
- (pdf-info-setoptions
- :render/foreground (or (car pdf-view-midnight-colors) "black")
- :render/background (or (cdr pdf-view-midnight-colors) "white")
- :render/usecolors t))))
- (cond
- (pdf-view-midnight-minor-mode
- (add-hook 'after-save-hook enable nil t)
- (add-hook 'after-revert-hook enable nil t)
- (funcall enable))
- (t
- (remove-hook 'after-save-hook enable t)
- (remove-hook 'after-revert-hook enable t)
- (pdf-info-setoptions :render/usecolors nil))))
- (pdf-cache-clear-images)
- (pdf-view-redisplay t))
-
-(when pdf-view-use-unicode-ligther
- ;; This check uses an implementation detail, which hopefully gets the
- ;; right answer.
- (and (fontp (char-displayable-p ?⎙))
- (setcdr (assq 'pdf-view-printer-minor-mode minor-mode-alist)
- (list " ⎙" )))
- (and (fontp (char-displayable-p ?🌙))
- (setcdr (assq 'pdf-view-midnight-minor-mode minor-mode-alist)
- (list " 🌙" ))))
-
-
-;; * ================================================================== *
-;; * Hotspot handling
-;; * ================================================================== *
-
-(defun pdf-view-add-hotspot-function (fn &optional layer)
- "Register FN as a hotspot function in the current buffer, using LAYER.
-
-FN will be called in the PDF buffer with the page-number and the
-image size \(WIDTH . HEIGHT\) as arguments. It should return a
-list of hotspots applicable to the the :map image-property.
-
-LAYER determines the order: Functions in a higher LAYER will
-supersede hotspots in lower ones."
- (push (cons (or layer 0) fn)
- pdf-view--hotspot-functions))
-
-(defun pdf-view-remove-hotspot-function (fn)
- "Unregister FN as a hotspot function in the current buffer."
- (setq pdf-view--hotspot-functions
- (cl-remove fn pdf-view--hotspot-functions
- :key 'cdr)))
-
-(defun pdf-view-sorted-hotspot-functions ()
- ;; TODO: write documentation!
- (mapcar 'cdr (cl-sort (copy-sequence pdf-view--hotspot-functions)
- '> :key 'car)))
-
-(defun pdf-view-apply-hotspot-functions (window page image-size)
- ;; TODO: write documentation!
- (unless pdf-view-inhibit-hotspots
- (save-selected-window
- (when window (select-window window))
- (apply 'nconc
- (mapcar (lambda (fn)
- (funcall fn page image-size))
- (pdf-view-sorted-hotspot-functions))))))
-
-
-;; * ================================================================== *
-;; * Region
-;; * ================================================================== *
-
-(defun pdf-view--push-mark ()
- ;; TODO: write documentation!
- (let (mark-ring)
- (push-mark-command nil))
- (setq deactivate-mark nil))
-
-(defun pdf-view-active-region (&optional deactivate-p)
- "Return the active region, a list of edges.
-
-Deactivate the region if DEACTIVATE-P is non-nil."
- (pdf-view-assert-active-region)
- (prog1
- pdf-view-active-region
- (when deactivate-p
- (pdf-view-deactivate-region))))
-
-(defun pdf-view-deactivate-region ()
- "Deactivate the region."
- (interactive)
- (when pdf-view-active-region
- (setq pdf-view-active-region nil)
- (deactivate-mark)
- (pdf-view-redisplay t)))
-
-(defun pdf-view-mouse-set-region (event &optional allow-extend-p
- rectangle-p)
- "Select a region of text using the mouse with mouse event EVENT.
-
-Allow for stacking of regions, if ALLOW-EXTEND-P is non-nil.
-
-Create a rectangular region, if RECTANGLE-P is non-nil.
-
-Stores the region in `pdf-view-active-region'."
- (interactive "@e")
- (setq pdf-view--have-rectangle-region rectangle-p)
- (unless (and (eventp event)
- (mouse-event-p event))
- (signal 'wrong-type-argument (list 'mouse-event-p event)))
- (unless (and allow-extend-p
- (or (null (get this-command 'pdf-view-region-window))
- (equal (get this-command 'pdf-view-region-window)
- (selected-window))))
- (pdf-view-deactivate-region))
- (put this-command 'pdf-view-region-window
- (selected-window))
- (let* ((window (selected-window))
- (pos (event-start event))
- (begin-inside-image-p t)
- (begin (if (posn-image pos)
- (posn-object-x-y pos)
- (setq begin-inside-image-p nil)
- (posn-x-y pos)))
- (abs-begin (posn-x-y pos))
- pdf-view-continuous
- region)
- (when (pdf-util-track-mouse-dragging (event 0.05)
- (let* ((pos (event-start event))
- (end (posn-object-x-y pos))
- (end-inside-image-p
- (and (eq window (posn-window pos))
- (posn-image pos))))
- (when (or end-inside-image-p
- begin-inside-image-p)
- (cond
- ((and end-inside-image-p
- (not begin-inside-image-p))
- ;; Started selection outside the image, setup begin.
- (let* ((xy (posn-x-y pos))
- (dxy (cons (- (car xy) (car begin))
- (- (cdr xy) (cdr begin))))
- (size (pdf-view-image-size t)))
- (setq begin (cons (max 0 (min (car size)
- (- (car end) (car dxy))))
- (max 0 (min (cdr size)
- (- (cdr end) (cdr dxy)))))
- ;; Store absolute position for later.
- abs-begin (cons (- (car xy)
- (- (car end)
- (car begin)))
- (- (cdr xy)
- (- (cdr end)
- (cdr begin))))
- begin-inside-image-p t)))
- ((and begin-inside-image-p
- (not end-inside-image-p))
- ;; Moved outside the image, setup end.
- (let* ((xy (posn-x-y pos))
- (dxy (cons (- (car xy) (car abs-begin))
- (- (cdr xy) (cdr abs-begin))))
- (size (pdf-view-image-size t)))
- (setq end (cons (max 0 (min (car size)
- (+ (car begin) (car dxy))))
- (max 0 (min (cdr size)
- (+ (cdr begin) (cdr dxy)))))))))
- (let ((iregion (if rectangle-p
- (list (min (car begin) (car end))
- (min (cdr begin) (cdr end))
- (max (car begin) (car end))
- (max (cdr begin) (cdr end)))
- (list (car begin) (cdr begin)
- (car end) (cdr end)))))
- (setq region
- (pdf-util-scale-pixel-to-relative iregion))
- (pdf-view-display-region
- (cons region pdf-view-active-region)
- rectangle-p)
- (pdf-util-scroll-to-edges iregion)))))
- (setq pdf-view-active-region
- (append pdf-view-active-region
- (list region)))
- (pdf-view--push-mark))))
-
-(defun pdf-view-mouse-extend-region (event)
- "Extend the currently active region with mouse event EVENT."
- (interactive "@e")
- (pdf-view-mouse-set-region
- event t pdf-view--have-rectangle-region))
-
-(defun pdf-view-mouse-set-region-rectangle (event)
- "Like `pdf-view-mouse-set-region' but displays as a rectangle.
-
-EVENT is the mouse event.
-
-This is more useful for commands like
-`pdf-view-extract-region-image'."
- (interactive "@e")
- (pdf-view-mouse-set-region event nil t))
-
-(defun pdf-view-display-region (&optional region rectangle-p)
- ;; TODO: write documentation!
- (unless region
- (pdf-view-assert-active-region)
- (setq region pdf-view-active-region))
- (let ((colors (pdf-util-face-colors
- (if rectangle-p 'pdf-view-rectangle 'pdf-view-region)
- (bound-and-true-p pdf-view-dark-minor-mode)))
- (page (pdf-view-current-page))
- (width (car (pdf-view-image-size))))
- (pdf-view-display-image
- (pdf-view-create-image
- (if rectangle-p
- (pdf-info-renderpage-highlight
- page width nil
- `(,(car colors) ,(cdr colors) 0.35 ,@region))
- (pdf-info-renderpage-text-regions
- page width nil nil
- `(,(car colors) ,(cdr colors) ,@region)))))))
-
-(defun pdf-view-kill-ring-save ()
- "Copy the region to the `kill-ring'."
- (interactive)
- (pdf-view-assert-active-region)
- (let* ((txt (pdf-view-active-region-text)))
- (pdf-view-deactivate-region)
- (kill-new (mapconcat 'identity txt "\n"))))
-
-(defun pdf-view-mark-whole-page ()
- "Mark the whole page."
- (interactive)
- (pdf-view-deactivate-region)
- (setq pdf-view-active-region
- (list (list 0 0 1 1)))
- (pdf-view--push-mark)
- (pdf-view-display-region))
-
-(defun pdf-view-active-region-text ()
- "Return the text of the active region as a list of strings."
- (pdf-view-assert-active-region)
- (mapcar
- (apply-partially 'pdf-info-gettext (pdf-view-current-page))
- pdf-view-active-region))
-
-(defun pdf-view-extract-region-image (regions &optional page size
- output-buffer no-display-p)
- ;; TODO: what is "resp."? Avoid contractions.
- "Create a PNG image of REGIONS.
-
-REGIONS should have the same form as `pdf-view-active-region',
-which see. PAGE and SIZE are the page resp. base-size of the
-image from which the image-regions will be created; they default
-to `pdf-view-current-page' resp. `pdf-view-image-size'.
-
-Put the image in OUTPUT-BUFFER, defaulting to \"*PDF region
-image*\" and display it, unless NO-DISPLAY-P is non-nil.
-
-In case of multiple regions, the resulting image is constructed
-by joining them horizontally. For this operation (and this only)
-the `convert' program is used."
-
- (interactive
- (list (if (pdf-view-active-region-p)
- (pdf-view-active-region t)
- '((0 0 1 1)))))
- (unless page
- (setq page (pdf-view-current-page)))
- (unless size
- (setq size (pdf-view-image-size)))
- (unless output-buffer
- (setq output-buffer (get-buffer-create "*PDF image*")))
- (let* ((images (mapcar (lambda (edges)
- (let ((file (make-temp-file "pdf-view"))
- (coding-system-for-write 'binary))
- (write-region
- (pdf-info-renderpage
- page (car size)
- :crop-to edges)
- nil file nil 'no-message)
- file))
- regions))
- result)
- (unwind-protect
- (progn
- (if (= (length images) 1)
- (setq result (car images))
- (setq result (make-temp-file "pdf-view"))
- ;; Join the images horizontally with a gap of 10 pixel.
- (pdf-util-convert
- "-noop" ;; workaround limitations of this function
- result
- :commands `("("
- ,@images
- "-background" "white"
- "-splice" "0x10+0+0"
- ")"
- "-gravity" "Center"
- "-append"
- "+gravity"
- "-chop" "0x10+0+0")
- :apply '((0 0 0 0))))
- (with-current-buffer output-buffer
- (let ((inhibit-read-only t))
- (erase-buffer))
- (set-buffer-multibyte nil)
- (insert-file-contents-literally result)
- (image-mode)
- (unless no-display-p
- (pop-to-buffer (current-buffer)))))
- (dolist (f (cons result images))
- (when (file-exists-p f)
- (delete-file f))))))
-
-;; * ================================================================== *
-;; * Bookmark + Register Integration
-;; * ================================================================== *
-
-(defun pdf-view-bookmark-make-record (&optional no-page no-slice no-size no-origin)
- ;; TODO: add NO-PAGE, NO-SLICE, NO-SIZE, NO-ORIGIN to the docstring.
- "Create a bookmark PDF record.
-
-The optional, boolean args exclude certain attributes."
- (let ((displayed-p (eq (current-buffer)
- (window-buffer))))
- (cons (buffer-name)
- (append (bookmark-make-record-default nil t 1)
- `(,(unless no-page
- (cons 'page (pdf-view-current-page)))
- ,(unless no-slice
- (cons 'slice (and displayed-p
- (pdf-view-current-slice))))
- ,(unless no-size
- (cons 'size pdf-view-display-size))
- ,(unless no-origin
- (cons 'origin
- (and displayed-p
- (let ((edges (pdf-util-image-displayed-edges nil t)))
- (pdf-util-scale-pixel-to-relative
- (cons (car edges) (cadr edges)) nil t)))))
- (handler . pdf-view-bookmark-jump-handler))))))
-
-;;;###autoload
-(defun pdf-view-bookmark-jump-handler (bmk)
- "The bookmark handler-function interface for bookmark BMK.
-
-See also `pdf-view-bookmark-make-record'."
- (let ((page (bookmark-prop-get bmk 'page))
- (slice (bookmark-prop-get bmk 'slice))
- (size (bookmark-prop-get bmk 'size))
- (origin (bookmark-prop-get bmk 'origin))
- (file (bookmark-prop-get bmk 'filename))
- (show-fn-sym (make-symbol "pdf-view-bookmark-after-jump-hook")))
- (fset show-fn-sym
- (lambda ()
- (remove-hook 'bookmark-after-jump-hook show-fn-sym)
- (unless (derived-mode-p 'pdf-view-mode)
- (pdf-view-mode))
- (with-selected-window
- (or (get-buffer-window (current-buffer) 0)
- (selected-window))
- (when size
- (setq-local pdf-view-display-size size))
- (when slice
- (apply 'pdf-view-set-slice slice))
- (when (numberp page)
- (pdf-view-goto-page page))
- (when origin
- (let ((size (pdf-view-image-size t)))
- (image-set-window-hscroll
- (round (/ (* (car origin) (car size))
- (frame-char-width))))
- (image-set-window-vscroll
- (round (/ (* (cdr origin) (cdr size))
- (if pdf-view-have-image-mode-pixel-vscroll
- 1
- (frame-char-height))))))))))
- (add-hook 'bookmark-after-jump-hook show-fn-sym)
- (set-buffer (or (find-buffer-visiting file)
- (find-file-noselect file)))))
-
-(defun pdf-view-bookmark-jump (bmk)
- "Switch to bookmark BMK.
-
-This function is like `bookmark-jump', but it always uses the
-selected window for display and does not run any hooks. Also, it
-works only with bookmarks created by
-`pdf-view-bookmark-make-record'."
-
- (let* ((file (bookmark-prop-get bmk 'filename))
- (buffer (or (find-buffer-visiting file)
- (find-file-noselect file))))
- (switch-to-buffer buffer)
- (let (bookmark-after-jump-hook)
- (pdf-view-bookmark-jump-handler bmk)
- (run-hooks 'bookmark-after-jump-hook))))
-
-(defun pdf-view-registerv-make ()
- "Create a PDF register entry of the current position."
- (registerv-make
- (pdf-view-bookmark-make-record nil t t)
- :print-func 'pdf-view-registerv-print-func
- :jump-func 'pdf-view-bookmark-jump
- :insert-func (lambda (bmk)
- (insert (format "%S" bmk)))))
-
-(defun pdf-view-registerv-print-func (bmk)
- "Print a textual representation of bookmark BMK.
-
-This function is used as the `:print-func' property with
-`registerv-make'."
- (let* ((file (bookmark-prop-get bmk 'filename))
- (buffer (find-buffer-visiting file))
- (page (bookmark-prop-get bmk 'page))
- (origin (bookmark-prop-get bmk 'origin)))
- (princ (format "PDF position: %s, page %d, %d%%"
- (if buffer
- (buffer-name buffer)
- file)
- (or page 1)
- (if origin
- (round (* 100 (cdr origin)))
- 0)))))
-
-(defmacro pdf-view-with-register-alist (&rest body)
- "Setup the proper binding for `register-alist' in BODY.
-
-This macro may not work as desired when it is nested. See also
-`pdf-view-use-dedicated-register'."
- (declare (debug t) (indent 0))
- (let ((dedicated-p (make-symbol "dedicated-p")))
- `(let* ((,dedicated-p pdf-view-use-dedicated-register)
- (register-alist
- (if ,dedicated-p
- pdf-view-register-alist
- register-alist)))
- (unwind-protect
- (progn ,@body)
- (when ,dedicated-p
- (setq pdf-view-register-alist register-alist))))))
-
-(defun pdf-view-position-to-register (register)
- "Store current PDF position in register REGISTER.
-
-See also `point-to-register'."
- (interactive
- (list (pdf-view-with-register-alist
- (register-read-with-preview "Position to register: "))))
- (pdf-view-with-register-alist
- (set-register register (pdf-view-registerv-make))))
-
-(defun pdf-view-jump-to-register (register &optional delete return-register)
- ;; TODO: add RETURN-REGISTER to the docstring.
- "Move point to a position stored in a REGISTER.
-
-Optional parameter DELETE is defined as in `jump-to-register'."
- (interactive
- (pdf-view-with-register-alist
- (list
- (register-read-with-preview "Jump to register: ")
- current-prefix-arg
- (and (or pdf-view-use-dedicated-register
- (local-variable-p 'register-alist))
- (characterp last-command-event)
- last-command-event))))
- (pdf-view-with-register-alist
- (let ((return-pos (and return-register
- (pdf-view-registerv-make))))
- (jump-to-register register delete)
- (when return-register
- (set-register return-register return-pos)))))
-
-(provide 'pdf-view)
-
-;;; pdf-view.el ends here
diff --git a/elpa/pdf-tools-20200512.1524/pdf-virtual.el b/elpa/pdf-tools-20200512.1524/pdf-virtual.el
deleted file mode 100644
index 5d6458f..0000000
--- a/elpa/pdf-tools-20200512.1524/pdf-virtual.el
+++ /dev/null
@@ -1,1038 +0,0 @@
-;;; pdf-virtual.el --- Virtual PDF documents -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Andreas Politz
-
-;; Author: Andreas Politz <politza@hochschule-trier.de>
-;; Keywords: multimedia, files
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; A virtual PDF is a collection of pages, or parts thereof, of
-;; arbitrary documents in one particular order. This library acts as
-;; an intermediate between pdf-info.el and all other packages, in
-;; order to transparently make this collection appear as one single
-;; document.
-;;
-;; The trickiest part is to make theses intermediate functions behave
-;; like the pdf-info-* equivalents in both the synchronous and
-;; asynchronous case.
-
-;;; Code:
-(eval-when-compile
- (unless (or (> emacs-major-version 24)
- (and (= emacs-major-version 24)
- (>= emacs-minor-version 4)))
- (error "pdf-virtual.el only works with Emacs >= 24.4")))
-
-(require 'let-alist)
-(require 'pdf-info)
-(require 'pdf-util)
-
-
-;; * ================================================================== *
-;; * Variables
-;; * ================================================================== *
-
-(defconst pdf-virtual-magic-mode-regexp "^ *;+ *%VPDF\\_>"
- "A regexp matching the first line in a vpdf file.")
-
-(defvar-local pdf-virtual-document nil
- "A list representing the virtual document.")
-
-(put 'pdf-virtual-document 'permanent-local t)
-
-(defvar pdf-virtual-adapter-alist nil
- "Alist of server functions.
-
-Each element looks like \(PDF-VIRTUAL-FN . PDF-INFO-FN\). This
-list is filled by the macro `pdf-virtual-define-adapter' and used
-to enable/disable the corresponding advices.")
-
-
-;; * ================================================================== *
-;; * VPDF datastructure
-;; * ================================================================== *
-
-(defun pdf-virtual-pagespec-normalize (page-spec &optional filename)
- "Normalize PAGE-SPEC using FILENAME.
-
-PAGE-SPEC should be as described in
-`pdf-virtual-document-create'. FILENAME is used to determine the
-last page number, if needed. The `current-buffer', if it is nil.
-
-Returns a list \(\(FIRST . LAST\) . REGION\)\)."
-
- (let ((page-spec (cond
- ((natnump page-spec)
- (list (cons page-spec page-spec)))
- ((null (car page-spec))
- (let ((npages (pdf-info-number-of-pages filename)))
- (cons (cons 1 npages)
- (cdr page-spec))))
- ((natnump (car page-spec))
- (cond
- ((natnump (cdr page-spec))
- (list page-spec))
- (t
- (cons (cons (car page-spec)
- (car page-spec))
- (cdr page-spec)))))
- (t page-spec))))
- (when (equal (cdr page-spec)
- '(0 0 1 1))
- (setq page-spec `((,(caar page-spec) . ,(cdar page-spec)))))
- page-spec))
-
-(cl-defstruct pdf-virtual-range
- ;; The PDF's filename.
- filename
- ;; First page in this range.
- first
- ;; Last page.
- last
- ;; The edges selected for these pages.
- region
- ;; The page-index corresponding to the first page in this range.
- index-start)
-
-(cl-defstruct pdf-virtual-document
- ;; Array of shared pdf-virtual-range structs, one element for each
- ;; page.
- page-array
- ;; An alist mapping filenames to a list of pages.
- file-map)
-
-(defun pdf-virtual-range-length (page)
- "Return the number of pages in PAGE."
- (1+ (- (pdf-virtual-range-last page)
- (pdf-virtual-range-first page))))
-
-(defun pdf-virtual-document-create (list &optional directory
- file-error-handler)
- "Create a virtual PDF from LIST using DIRECTORY.
-
-LIST should be a list of elements \(FILENAME . PAGE-SPECS\),
-where FILENAME is a PDF document and PAGE-SPECS is a list of
-PAGE-RANGE and/or \(PAGE-RANGE . EDGES\). In the later case,
-EDGES should be a list of relative coordinates \(LEFT TOP RIGHT
-BOT\) selecting a region of the page(s) in PAGE-RANGE. Giving no
-PAGE-SPECs at all is equivalent to all pages of FILENAME.
-
-See `pdf-info-normalize-page-range' for the valid formats of
-PAGE-RANGE.
-"
-
- (unless (cl-every 'consp list)
- (error "Every element should be a cons: %s" list))
- (unless (cl-every 'stringp (mapcar 'car list))
- (error "The car of every element should be a filename."))
- (unless (cl-every (lambda (elt)
- (cl-every (lambda (page)
- (or (pdf-info-valid-page-spec-p page)
- (and (consp page)
- (pdf-info-valid-page-spec-p (car page))
- (pdf-util-edges-p (cdr page) 'relative))))
- elt))
- (mapcar 'cdr list))
- (error
- "The cdr of every element should be a list of page-specs"))
- (let* ((doc (pdf-virtual-document--normalize
- list (or directory default-directory)
- file-error-handler))
- (npages 0)
- document file-map)
- (while doc
- (let* ((elt (pop doc))
- (filename (car elt))
- (mapelt (assoc filename file-map))
- (page-specs (cdr elt)))
- (if mapelt
- (setcdr mapelt (cons (1+ npages) (cdr mapelt)))
- (push (list filename (1+ npages)) file-map))
- (while page-specs
- (let* ((ps (pop page-specs))
- (first (caar ps))
- (last (cdar ps))
- (region (cdr ps))
- (clx (make-pdf-virtual-range
- :filename filename
- :first first
- :last last
- :region region
- :index-start npages)))
- (cl-incf npages (1+ (- last first)))
- (push (make-vector (1+ (- last first)) clx)
- document)))))
- (make-pdf-virtual-document
- :page-array (apply 'vconcat (nreverse document))
- :file-map (nreverse
- (mapcar (lambda (f)
- (setcdr f (nreverse (cdr f)))
- f)
- file-map)))))
-
-(defun pdf-virtual-document--normalize (list &optional directory
- file-error-handler)
- (unless file-error-handler
- (setq file-error-handler
- (lambda (filename err)
- (signal (car err)
- (append (cdr err) (list filename))))))
- (let ((default-directory
- (or directory default-directory)))
- (setq list (cl-remove-if-not
- (lambda (filename)
- (condition-case err
- (progn
- (unless (file-readable-p filename)
- (signal 'file-error
- (list "File not readable: " filename)))
- (pdf-info-open filename)
- t)
- (error
- (funcall file-error-handler filename err)
- nil)))
- list
- :key 'car))
- (let* ((file-attributes (make-hash-table :test 'equal))
- (file-equal-p (lambda (f1 f2)
- (let ((a1 (gethash f1 file-attributes))
- (a2 (gethash f2 file-attributes)))
- (if (and a1 a2)
- (equal a1 a2)
- (file-equal-p f1 f2)))))
- files normalized)
- ;; Optimize file-equal-p by caching file-attributes, which is slow
- ;; and would be called quadratic times otherwise. (We don't want
- ;; the same file under different names.)
- (dolist (f (mapcar 'car list))
- (unless (find-file-name-handler f 'file-equal-p)
- (puthash f (file-attributes f) file-attributes)))
- (dolist (elt list)
- (let ((file (cl-find (car elt) files :test file-equal-p)))
- (unless file
- (push (car elt) files)
- (setq file (car elt)))
- (let ((pages (mapcar (lambda (p)
- (pdf-virtual-pagespec-normalize p file))
- (or (cdr elt) '(nil))))
- newpages)
- (while pages
- (let* ((spec (pop pages))
- (first (caar spec))
- (last (cdar spec))
- (region (cdr spec)))
- (while (and pages
- (eq (1+ last)
- (caar (car pages)))
- (equal region (cdr (car pages))))
- (setq last (cdar (pop pages))))
- (push `((,first . ,last) . ,region) newpages)))
- (push (cons file (nreverse newpages))
- normalized))))
- (nreverse normalized))))
-
-(defmacro pdf-virtual-document-defun (name args &optional documentation &rest body)
- "Define a PDF Document function.
-
-Args are just like for `defun'. This macro will ensure, that the
-DOCUMENT argument, which should be last, is setup properly in
-case it is nil, i.e. check that the buffer passes
-`pdf-virtual-buffer-assert-p' and use the variable
-`pdf-virtual-document'."
-
- (declare (doc-string 3) (indent defun)
- (debug (&define name lambda-list
- [&optional stringp]
- def-body)))
- (unless (stringp documentation)
- (push documentation body)
- (setq documentation nil))
- (unless (memq '&optional args)
- (setq args (append (butlast args)
- (list '&optional)
- (last args))))
- (when (memq '&rest args)
- (error "&rest argument not supported"))
- (let ((doc-arg (car (last args)))
- (fn (intern (format "pdf-virtual-document-%s" name))))
- `(progn
- (put ',fn 'definition-name ',name)
- (defun ,fn
- ,args ,documentation
- (setq ,doc-arg
- (or ,doc-arg
- (progn (pdf-virtual-buffer-assert-p)
- pdf-virtual-document)))
- (cl-check-type ,doc-arg pdf-virtual-document)
- ,@body))))
-
-(pdf-virtual-document-defun filenames (doc)
- "Return the list of filenames in DOC."
- (mapcar 'car (pdf-virtual-document-file-map doc)))
-
-(pdf-virtual-document-defun normalize-pages (pages doc)
- "Normalize PAGES using DOC.
-
-Like `pdf-info-normalize-page-range', except 0 is replaced by
-DOC's last page."
-
- (setq pages (pdf-info-normalize-page-range pages))
- (if (eq 0 (cdr pages))
- `(,(car pages) . ,(pdf-virtual-document-number-of-pages doc))
- pages))
-
-(pdf-virtual-document-defun page (page doc)
- "Get PAGE of DOC.
-
-Returns a list \(FILENAME FILE-PAGE REGION\)."
- (let ((page (car (pdf-virtual-document-pages (cons page page) doc))))
- (when page
- (cl-destructuring-bind (filename first-last region)
- page
- (list filename (car first-last) region)))))
-
-(pdf-virtual-document-defun pages (pages doc)
- "Get PAGES of DOC.
-
-PAGES should be a cons \(FIRST . LAST\). Return a list of
-ranges corresponding to PAGES. Each element has the form
-
- \(FILENAME \(FILE-FIRT-PAGE . FILE-LAST-PAGE\) REGION\)
-.
-"
-
- (let ((begin (car pages))
- (end (cdr pages)))
- (unless (<= begin end)
- (error "begin should not exceed end: %s" (cons begin end)))
- (let ((arr (pdf-virtual-document-page-array doc))
- result)
- (when (or (< begin 1)
- (> end (length arr)))
- (signal 'args-out-of-range (list 'pages pages)))
- (while (<= begin end)
- (let* ((page (aref arr (1- begin)))
- (filename (pdf-virtual-range-filename page))
- (offset (- (1- begin)
- (pdf-virtual-range-index-start page)))
- (first (+ (pdf-virtual-range-first page)
- offset))
- (last (min (+ first (- end begin))
- (pdf-virtual-range-last page)))
- (region (pdf-virtual-range-region page)))
- (push `(,filename (,first . ,last) ,region) result)
- (cl-incf begin (1+ (- last first)))))
- (nreverse result))))
-
-(pdf-virtual-document-defun number-of-pages (doc)
- "Return the number of pages in DOC."
- (length (pdf-virtual-document-page-array doc)))
-
-(pdf-virtual-document-defun page-of (filename &optional file-page limit doc)
- "Return a page number displaying FILENAME's page FILE-PAGE in DOC.
-
-If FILE-PAGE is nil, return the first page displaying FILENAME.
-If LIMIT is non-nil, it should be a range \(FIRST . LAST\) in
-which the returned page should fall. This is useful if there are
-more than one page displaying FILE-PAGE. LIMIT is ignored, if
-FILE-PAGE is nil.
-
-Return nil if there is no matching page."
-
- (if (null file-page)
- (cadr (assoc filename (pdf-virtual-document-file-map doc)))
- (let ((pages (pdf-virtual-document-page-array doc)))
- (catch 'found
- (mapc
- (lambda (pn)
- (while (and (<= pn (length pages))
- (equal (pdf-virtual-range-filename (aref pages (1- pn)))
- filename))
- (let* ((page (aref pages (1- pn)))
- (first (pdf-virtual-range-first page))
- (last (pdf-virtual-range-last page)))
- (when (and (>= file-page first)
- (<= file-page last))
- (let ((r (+ (pdf-virtual-range-index-start page)
- (- file-page (pdf-virtual-range-first page))
- 1)))
- (when (or (null limit)
- (and (>= r (car limit))
- (<= r (cdr limit))))
- (throw 'found r))))
- (cl-incf pn (1+ (- last first))))))
- (cdr (assoc filename (pdf-virtual-document-file-map doc))))
- nil))))
-
-(pdf-virtual-document-defun find-matching-page (page predicate
- &optional
- backward-p doc)
- (unless (and (>= page 1)
- (<= page (length (pdf-virtual-document-page-array doc))))
- (signal 'args-out-of-range (list 'page page)))
- (let* ((pages (pdf-virtual-document-page-array doc))
- (i (1- page))
- (this (aref pages i))
- other)
- (while (and (< i (length pages))
- (>= i 0)
- (null other))
- (setq i
- (if backward-p
- (1- (pdf-virtual-range-index-start this))
- (+ (pdf-virtual-range-length this)
- (pdf-virtual-range-index-start this))))
- (when (and (< i (length pages))
- (>= i 0))
- (setq other (aref pages i))
- (unless (funcall predicate this other)
- (setq other nil))))
- other))
-
-(pdf-virtual-document-defun next-matching-page (page predicate doc)
- (pdf-virtual-document-find-matching-page page predicate nil doc))
-
-(pdf-virtual-document-defun previous-matching-page (page predicate doc)
- (declare (indent 1))
- (pdf-virtual-document-find-matching-page page predicate t doc))
-
-(pdf-virtual-document-defun next-file (page doc)
- "Return the next page displaying a different file than PAGE.
-
-PAGE should be a page-number."
- (let ((page (pdf-virtual-document-next-matching-page
- page
- (lambda (this other)
- (not (equal (pdf-virtual-range-filename this)
- (pdf-virtual-range-filename other)))))))
- (when page
- (1+ (pdf-virtual-range-index-start page)))))
-
-(pdf-virtual-document-defun previous-file (page doc)
- "Return the previous page displaying a different file than PAGE.
-
-PAGE should be a page-number."
- (let ((page (pdf-virtual-document-previous-matching-page
- page
- (lambda (this other)
- (not (equal (pdf-virtual-range-filename this)
- (pdf-virtual-range-filename other)))))))
- (when page
- (1+ (pdf-virtual-range-index-start page)))))
-
-
-;; * ================================================================== *
-;; * Modes
-;; * ================================================================== *
-
-(defvar pdf-virtual-edit-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map emacs-lisp-mode-map)
- (define-key map (kbd "C-c C-c") 'pdf-virtual-view-mode)
- map))
-
-
-;;;###autoload
-(define-derived-mode pdf-virtual-edit-mode emacs-lisp-mode "VPDF-Edit"
- "Major mode when editing a virtual PDF buffer."
- (buffer-enable-undo)
- (setq-local buffer-read-only nil)
- (unless noninteractive
- (message (substitute-command-keys "Press \\[pdf-virtual-view-mode] to view."))))
-
-;; FIXME: Provide filename/region from-windows-gathering functions.
-(defvar pdf-virtual-view-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map pdf-view-mode-map)
- (define-key map (kbd "C-c C-c") 'pdf-virtual-edit-mode)
- (define-key map [remap backward-paragraph] 'pdf-virtual-buffer-backward-file)
- (define-key map [remap forward-paragraph] 'pdf-virtual-buffer-forward-file)
- (define-key map (kbd "C-c C-c") 'pdf-virtual-edit-mode)
- map))
-
-;;;###autoload
-(define-derived-mode pdf-virtual-view-mode pdf-view-mode "VPDF-View"
- "Major mode in virtual PDF buffers."
- (setq-local write-contents-functions nil)
- (remove-hook 'kill-buffer-hook 'pdf-view-close-document t)
- (setq-local header-line-format
- `(:eval (pdf-virtual-buffer-current-file)))
- (unless noninteractive
- (message (substitute-command-keys "Press \\[pdf-virtual-edit-mode] to edit."))))
-
-;;;###autoload
-(define-minor-mode pdf-virtual-global-minor-mode
- "Enable recognition and handling of VPDF files."
- nil nil nil
- :global t
- (let ((elt `(,pdf-virtual-magic-mode-regexp . pdf-virtual-view-mode)))
- (cond
- (pdf-virtual-global-minor-mode
- (add-to-list 'magic-mode-alist elt))
- (t
- (setq magic-mode-alist
- (remove elt magic-mode-alist))))
- (dolist (elt pdf-virtual-adapter-alist)
- (let ((fn (car elt))
- (orig (cdr elt)))
- (advice-remove orig fn)
- (when pdf-virtual-global-minor-mode
- (advice-add orig :around fn))))))
-
-(advice-add 'pdf-virtual-view-mode
- :around 'pdf-virtual-view-mode-prepare)
-
-;; This needs to run before pdf-view-mode does its thing.
-(defun pdf-virtual-view-mode-prepare (fn)
- (let (list unreadable)
- (save-excursion
- (goto-char 1)
- (unless (looking-at pdf-virtual-magic-mode-regexp)
- (pdf-virtual-buffer-assert-p))
- (setq list (read (current-buffer))))
- (setq pdf-virtual-document
- (pdf-virtual-document-create
- list
- nil
- (lambda (filename _error)
- (push filename unreadable))))
- (when unreadable
- (display-warning
- 'pdf-virtual
- (format "Some documents could not be opened:\n%s"
- (mapconcat (lambda (f)
- (concat " " f))
- unreadable "\n"))))
- (if (= (pdf-virtual-document-number-of-pages) 0)
- (error "Docüment is empty.")
- (unless pdf-virtual-global-minor-mode
- (pdf-virtual-global-minor-mode 1))
- (funcall fn))))
-
-
-;; * ================================================================== *
-;; * Buffer handling
-;; * ================================================================== *
-
-;;;###autoload
-(defun pdf-virtual-buffer-create (&optional filenames buffer-name display-p)
- (interactive
- (list (directory-files default-directory nil "\\.pdf\\'")
- (read-string
- "Buffer name (default: all.vpdf): " nil nil "all.vpdf") t))
- (with-current-buffer (generate-new-buffer buffer-name)
- (insert ";; %VPDF 1.0\n\n")
- (insert ";; File Format
-;;
-;; FORMAT ::= ( FILES* )
-;; FILES ::= ( FILE . PAGE-SPEC* )
-;; PAGE-SPEC ::= PAGE | ( PAGE . REGION )
-;; PAGE ::= NUMBER | ( FIRST . LAST )
-;; REGION ::= ( LEFT TOP RIGHT BOT )
-;;
-;; 0 <= X <= 1, forall X in REGION .
-
-")
- (if (null filenames)
- (insert "nil\n")
- (insert "(")
- (dolist (f filenames)
- (insert (format "(%S)\n " f)))
- (delete-char -2)
- (insert ")\n"))
- (pdf-virtual-edit-mode)
- (when display-p
- (pop-to-buffer (current-buffer)))
- (current-buffer)))
-
-(defun pdf-virtual-buffer-p (&optional buffer)
- (save-current-buffer
- (when buffer (set-buffer buffer))
- (or (derived-mode-p 'pdf-virtual-view-mode 'pdf-virtual-edit-mode)
- pdf-virtual-document)))
-
-(defun pdf-virtual-view-window-p (&optional window)
- (save-selected-window
- (when window (select-window window))
- (derived-mode-p 'pdf-virtual-view-mode)))
-
-(defun pdf-virtual-filename-p (filename)
- (and (stringp filename)
- (file-exists-p filename)
- (with-temp-buffer
- (save-excursion (insert-file-contents filename nil 0 128))
- (looking-at pdf-virtual-magic-mode-regexp))))
-
-(defun pdf-virtual-buffer-assert-p (&optional buffer)
- (unless (pdf-virtual-buffer-p buffer)
- (error "Buffer is not a virtual PDF buffer")))
-
-(defun pdf-virtual-view-window-assert-p (&optional window)
- (unless (pdf-virtual-view-window-p window)
- (error "Window's buffer is not in `pdf-virtual-view-mode'.")))
-
-(defun pdf-virtual-buffer-current-file (&optional window)
- (pdf-virtual-view-window-assert-p window)
- (pdf-virtual-range-filename
- (aref (pdf-virtual-document-page-array
- pdf-virtual-document)
- (1- (pdf-view-current-page window)))))
-
-(defun pdf-virtual-buffer-forward-file (&optional n interactive-p)
- (interactive "p\np")
- (pdf-virtual-view-window-assert-p)
- (let* ((pn (pdf-view-current-page))
- (pages (pdf-virtual-document-page-array
- pdf-virtual-document))
- (page (aref pages (1- pn)))
- (first-filepage (1+ (pdf-virtual-range-index-start page))))
-
- (when (and (< n 0)
- (not (= first-filepage pn)))
- (cl-incf n))
- (setq pn first-filepage)
-
- (let (next)
- (while (and (> n 0)
- (setq next (pdf-virtual-document-next-file pn)))
- (setq pn next)
- (cl-decf n)))
- (let (previous)
- (while (and (< n 0)
- (setq previous (pdf-virtual-document-previous-file pn)))
- (setq pn previous)
- (cl-incf n)))
- (when interactive-p
- (when (< n 0)
- (message "First file."))
- (when (> n 0)
- (message "Last file.")))
- (pdf-view-goto-page pn)
- n))
-
-(defun pdf-virtual-buffer-backward-file (&optional n interactive-p)
- (interactive "p\np")
- (pdf-virtual-buffer-forward-file (- (or n 1)) interactive-p))
-
-
-;; * ================================================================== *
-;; * Helper functions
-;; * ================================================================== *
-
-
-(defmacro pdf-virtual-dopages (bindings pages &rest body)
- (declare (indent 2) (debug (sexp form &rest form)))
- (let ((page (make-symbol "page")))
- `(dolist (,page ,pages)
- (cl-destructuring-bind ,bindings
- ,page
- ,@body))))
-
-(defun pdf-virtual--perform-search (string pages &optional regexp-p no-error)
- (let* ((pages (pdf-virtual-document-normalize-pages pages))
- (file-pages (pdf-virtual-document-pages pages)))
- (pdf-info-compose-queries
- ((responses
- (pdf-virtual-dopages (filename pages _region)
- file-pages
- (if regexp-p
- (pdf-info-search-string string pages filename)
- ;; FIXME: no-error won't work with synchronous calls.
- (pdf-info-search-regexp string pages no-error filename)))))
- (let (result)
- (pdf-virtual-dopages (filename _ region)
- file-pages
- (let ((matches (pop responses)))
- (when region
- (setq matches
- (mapcar
- (lambda (m)
- (let-alist m
- `((edges . ,(pdf-util-edges-transform region .edges t))
- ,@m)))
- (pdf-virtual--filter-edges
- region matches
- (apply-partially 'alist-get 'edges)))))
- (dolist (m matches)
- (push `((page . ,(pdf-virtual-document-page-of
- filename (alist-get 'page m)
- pages))
- ,@m)
- result))))
- (nreverse result)))))
-
-(defun pdf-virtual--filter-edges (region elts &optional edges-key-fn)
- (if (null region)
- elts
- (cl-remove-if-not
- (lambda (edges)
- (or (null edges)
- (if (consp (car edges))
- (cl-some (apply-partially 'pdf-util-edges-intersection region) edges)
- (pdf-util-edges-intersection region edges))))
- elts
- :key edges-key-fn)))
-
-(defun pdf-virtual--transform-goto-dest (link filename region)
- (let-alist link
- (let ((local-page (pdf-virtual-document-page-of
- filename .page)))
- (if local-page
- `((type . ,'goto-dest)
- (title . , .title)
- (page . ,local-page)
- (top . ,(car (pdf-util-edges-transform
- region (cons .top .top) t))))
- `((type . ,'goto-remote)
- (title . , .title)
- (filename . ,filename)
- (page . , .page)
- (top . , .top))))))
-
-
-;; * ================================================================== *
-;; * Server adapter
-;; * ================================================================== *
-
-(defmacro pdf-virtual-define-adapter (name arglist &optional doc &rest body)
- ;; FIXME: Handle &optional + &rest argument.
- (declare (doc-string 3) (indent 2)
- (debug (&define name lambda-list
- [&optional stringp]
- def-body)))
- (unless (stringp doc)
- (push doc body)
- (setq doc nil))
- (let ((fn (intern (format "pdf-virtual-%s" name)))
- (base-fn (intern (format "pdf-info-%s" name)))
- (base-fn-arg (make-symbol "fn"))
- (true-file-or-buffer (make-symbol "true-file-or-buffer"))
- (args (cl-remove-if (lambda (elt)
- (memq elt '(&optional &rest)))
- arglist)))
- (unless (fboundp base-fn)
- (error "Base function is undefined: %s" base-fn))
- (unless (memq 'file-or-buffer arglist)
- (error "Argument list is missing a `file-or-buffer' argument: %s" arglist))
- `(progn
- (put ',fn 'definition-name ',name)
- (add-to-list 'pdf-virtual-adapter-alist ',(cons fn base-fn))
- (defun ,fn ,(cons base-fn-arg arglist)
- ,(format "%sPDF virtual adapter to `%s'.
-
-This function delegates to `%s', unless the FILE-OR-BUFFER
-argument denotes a VPDF document."
- (if doc (concat doc "\n\n") "")
- base-fn
- base-fn)
- (let ((,true-file-or-buffer
- (cond
- ((or (bufferp file-or-buffer)
- (stringp file-or-buffer)) file-or-buffer)
- ((or (null file-or-buffer)
- ,(not (null (memq '&rest arglist))))
- (current-buffer)))))
- (if (cond
- ((null ,true-file-or-buffer) t)
- ((bufferp ,true-file-or-buffer)
- (not (pdf-virtual-buffer-p ,true-file-or-buffer)))
- ((stringp ,true-file-or-buffer)
- (not (pdf-virtual-filename-p ,true-file-or-buffer))))
- (,(if (memq '&rest arglist) 'apply 'funcall) ,base-fn-arg ,@args)
- (when (stringp ,true-file-or-buffer)
- (setq ,true-file-or-buffer
- (find-file-noselect ,true-file-or-buffer)))
- (save-current-buffer
- (when (bufferp ,true-file-or-buffer)
- (set-buffer ,true-file-or-buffer))
- ,@body)))))))
-
-(define-error 'pdf-virtual-unsupported-operation
- "Operation not supported in VPDF buffer")
-
-(pdf-virtual-define-adapter open (&optional file-or-buffer password)
- (mapc (lambda (file)
- (pdf-info-open file password))
- (pdf-virtual-document-filenames)))
-
-(pdf-virtual-define-adapter close (&optional file-or-buffer)
- (let ((files (cl-remove-if 'find-buffer-visiting
- (pdf-virtual-document-filenames))))
- (pdf-info-compose-queries
- ((results (mapc 'pdf-info-close files)))
- (cl-some 'identity results))))
-
-(pdf-virtual-define-adapter metadata (&optional file-or-buffer)
- (pdf-info-compose-queries
- ((md (mapc 'pdf-info-metadata (pdf-virtual-document-filenames))))
- (apply 'cl-mapcar (lambda (&rest elts)
- (cons (caar elts)
- (cl-mapcar 'cdr elts)))
- md)))
-
-(pdf-virtual-define-adapter search-string (string &optional pages file-or-buffer)
- (pdf-virtual--perform-search
- string (pdf-virtual-document-normalize-pages pages)))
-
-(pdf-virtual-define-adapter search-regexp (pcre &optional
- pages no-error file-or-buffer)
- (pdf-virtual--perform-search
- pcre (pdf-virtual-document-normalize-pages pages) 'regexp no-error))
-
-(pdf-virtual-define-adapter pagelinks (page &optional file-or-buffer)
- (cl-destructuring-bind (filename ext-page region)
- (pdf-virtual-document-page page)
- (pdf-info-compose-queries
- ((links (pdf-info-pagelinks ext-page filename)))
- (mapcar
- (lambda (link)
- (let-alist link
- (if (not (eq .type 'goto-dest))
- link
- `((edges . ,(pdf-util-edges-transform region .edges t))
- ,@(pdf-virtual--transform-goto-dest link filename region)))))
- (pdf-virtual--filter-edges region (car links) 'car)))))
-
-(pdf-virtual-define-adapter number-of-pages (&optional file-or-buffer)
- (pdf-info-compose-queries nil (pdf-virtual-document-number-of-pages)))
-
-(pdf-virtual-define-adapter outline (&optional file-or-buffer)
- (let ((files (pdf-virtual-document-filenames)))
- (pdf-info-compose-queries
- ((outlines (mapc 'pdf-info-outline files)))
- (cl-mapcan
- (lambda (outline filename)
- `(((depth . 1)
- (type . goto-dest)
- (title . ,filename)
- (page . ,(pdf-virtual-document-page-of filename))
- (top . 0))
- ,@(delq
- nil
- (mapcar
- (lambda (item)
- (let-alist item
- (if (not (eq .type 'goto-dest))
- `((depth . ,(1+ .depth))
- ,@item)
- (cl-check-type filename string)
- (let ((page (pdf-virtual-document-page-of
- filename .page)))
- (when page
- `((depth . ,(1+ .depth))
- ,@(pdf-virtual--transform-goto-dest
- item filename
- (nth 2 (pdf-virtual-document-page page)))))))))
- outline))))
- outlines files))))
-
-(pdf-virtual-define-adapter gettext (page edges &optional
- selection-style file-or-buffer)
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (let ((edges (pdf-util-edges-transform region edges)))
- (pdf-info-gettext file-page edges selection-style filename))))
-
-(pdf-virtual-define-adapter getselection (page edges &optional
- selection-style file-or-buffer)
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (let ((edges (pdf-util-edges-transform region edges)))
- (pdf-info-compose-queries
- ((results (pdf-info-getselection file-page edges selection-style filename)))
- (pdf-util-edges-transform
- region
- (pdf-virtual--filter-edges region (car results)) t)))))
-
-(pdf-virtual-define-adapter charlayout (page &optional edges-or-pos file-or-buffer)
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (let ((edges-or-pos (pdf-util-edges-transform region edges-or-pos)))
- (pdf-info-compose-queries
- ((results (pdf-info-charlayout file-page edges-or-pos filename)))
- (mapcar (lambda (elt)
- `(,(car elt)
- . ,(pdf-util-edges-transform region (cdr elt) t)))
- (pdf-virtual--filter-edges region (car results) 'cadr))))))
-
-(pdf-virtual-define-adapter pagesize (page &optional file-or-buffer)
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (pdf-info-compose-queries
- ((result (pdf-info-pagesize file-page filename)))
- (if (null region)
- (car result)
- (pdf-util-with-edges (region)
- (pdf-util-scale
- (car result) (cons region-width region-height)))))))
-
-(pdf-virtual-define-adapter getannots (&optional pages file-or-buffer)
- (let* ((pages (pdf-virtual-document-normalize-pages pages))
- (file-pages (pdf-virtual-document-pages pages)))
- (pdf-info-compose-queries
- ((annotations
- (pdf-virtual-dopages (filename file-pages _region)
- file-pages
- (pdf-info-getannots file-pages filename))))
- (let ((page (car pages))
- result)
- (pdf-virtual-dopages (_filename file-pages region)
- file-pages
- (dolist (a (pop annotations))
- (let ((edges (delq nil `(,(cdr (assq 'edges a))
- ,@(cdr (assq 'markup-edges a))))))
- (when (pdf-virtual--filter-edges region edges)
- (let-alist a
- (setcdr (assq 'page a)
- (+ page (- .page (car file-pages))))
- (setcdr (assq 'id a)
- (intern (format "%s/%d" .id (cdr (assq 'page a)))))
- (when region
- (when .edges
- (setcdr (assq 'edges a)
- (pdf-util-edges-transform region .edges t)))
- (when .markup-edges
- (setcdr (assq 'markup-edges a)
- (pdf-util-edges-transform region .markup-edges t))))
- (push a result)))))
- (cl-incf page (1+ (- (cdr file-pages) (car file-pages)))))
- (nreverse result)))))
-
-(pdf-virtual-define-adapter getannot (id &optional file-or-buffer)
- (let ((name (symbol-name id))
- page)
- (save-match-data
- (when (string-match "\\(.*\\)/\\([0-9]+\\)\\'" name)
- (setq id (intern (match-string 1 name))
- page (string-to-number (match-string 2 name)))))
- (if page
- (cl-destructuring-bind (filename _ _)
- (pdf-virtual-document-page page)
- (pdf-info-compose-queries
- ((result (pdf-info-getannot id filename)))
- (let ((a (car result)))
- (cl-destructuring-bind (_ _ region)
- (pdf-virtual-document-page page)
- (setcdr (assq 'page a) page)
- (let-alist a
- (setcdr (assq 'id a)
- (intern (format "%s/%d" .id (cdr (assq 'page a)))))
- (when region
- (when .edges
- (setcdr (assq 'edges a)
- (pdf-util-edges-transform region .edges t)))
- (when .markup-edges
- (setcdr (assq 'markup-edges a)
- (pdf-util-edges-transform region .markup-edges t))))))
- a)))
- (pdf-info-compose-queries nil
- (error "No such annotation: %s" id)))))
-
-(pdf-virtual-define-adapter addannot (page edges type &optional
- file-or-buffer &rest markup-edges)
- (signal 'pdf-virtual-unsupported-operation (list 'addannot)))
-
-(pdf-virtual-define-adapter delannot (id &optional file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'delannot)))
-
-(pdf-virtual-define-adapter mvannot (id edges &optional file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'mvannot)))
-
-(pdf-virtual-define-adapter editannot (id modifications &optional file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'editannot)))
-
-(pdf-virtual-define-adapter save (&optional file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'save)))
-
-;;(defvar-local pdf-virtual-annotation-mapping nil)
-
-(pdf-virtual-define-adapter getattachment-from-annot
- (id &optional do-save file-or-buffer)
- (let ((name (symbol-name id))
- page)
- (save-match-data
- (when (string-match "\\(.*\\)/\\([0-9]+\\)\\'" name)
- (setq id (intern (match-string 1 name))
- page (string-to-number (match-string 2 name)))))
- (if page
- (cl-destructuring-bind (filename _ _)
- (pdf-virtual-document-page page)
- (pdf-info-getattachment-from-annot id do-save filename))
- (pdf-info-compose-queries nil
- (error "No such annotation: %s" id)))))
-
-(pdf-virtual-define-adapter getattachments (&optional do-save file-or-buffer)
- (pdf-info-compose-queries
- ((results (mapc
- (lambda (f)
- (pdf-info-getattachments do-save f))
- (pdf-virtual-document-filenames))))
- (apply 'append results)))
-
-(pdf-virtual-define-adapter synctex-forward-search
- (source &optional line column file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'synctex-forward-search)))
-
-(pdf-virtual-define-adapter synctex-backward-search (page &optional x y file-or-buffer)
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (cl-destructuring-bind (x &rest y)
- (pdf-util-edges-transform region (cons x y))
- (pdf-info-synctex-backward-search file-page x y filename))))
-
-(pdf-virtual-define-adapter renderpage (page width &optional file-or-buffer
- &rest commands)
- (when (keywordp file-or-buffer)
- (push file-or-buffer commands)
- (setq file-or-buffer nil))
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (when region
- (setq commands (append (list :crop-to region) commands)
- width (pdf-util-with-edges (region)
- (round (* width (max 1 (/ 1.0 (max 1e-6 region-width))))))))
- (apply 'pdf-info-renderpage file-page width filename commands)))
-
-(pdf-virtual-define-adapter boundingbox (page &optional file-or-buffer)
- (cl-destructuring-bind (filename file-page region)
- (pdf-virtual-document-page page)
- (pdf-info-compose-queries
- ((results (unless region (pdf-info-boundingbox file-page filename))))
- (if region
- (list 0 0 1 1)
- (car results)))))
-
-(pdf-virtual-define-adapter pagelabels (&optional file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'pagelabels)))
-
-(pdf-virtual-define-adapter setoptions (&optional file-or-buffer &rest options)
- (when (keywordp file-or-buffer)
- (push file-or-buffer options)
- (setq file-or-buffer nil))
- (pdf-info-compose-queries
- ((_ (dolist (f (pdf-virtual-document-filenames))
- (apply 'pdf-info-setoptions f options))))
- nil))
-
-(pdf-virtual-define-adapter getoptions (&optional file-or-buffer)
- (signal 'pdf-virtual-unsupported-operation (list 'getoptions)))
-
-(pdf-virtual-define-adapter encrypted-p (&optional file-or-buffer)
- nil)
-
-(provide 'pdf-virtual)
-;;; pdf-virtual.el ends here
diff --git a/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el b/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el
deleted file mode 100644
index 44ce6b5..0000000
--- a/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el
+++ /dev/null
@@ -1,127 +0,0 @@
-;;; pkg-info-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "pkg-info" "pkg-info.el" (0 0 0 0))
-;;; Generated autoloads from pkg-info.el
-
-(autoload 'pkg-info-library-original-version "pkg-info" "\
-Get the original version in the header of LIBRARY.
-
-The original version is stored in the X-Original-Version header.
-This header is added by the MELPA package archive to preserve
-upstream version numbers.
-
-LIBRARY is either a symbol denoting a named feature, or a library
-name as string.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-Return the version from the header of LIBRARY as list. Signal an
-error if the LIBRARY was not found or had no X-Original-Version
-header.
-
-See Info node `(elisp)Library Headers' for more information
-about library headers.
-
-\(fn LIBRARY &optional SHOW)" t nil)
-
-(autoload 'pkg-info-library-version "pkg-info" "\
-Get the version in the header of LIBRARY.
-
-LIBRARY is either a symbol denoting a named feature, or a library
-name as string.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-Return the version from the header of LIBRARY as list. Signal an
-error if the LIBRARY was not found or had no proper header.
-
-See Info node `(elisp)Library Headers' for more information
-about library headers.
-
-\(fn LIBRARY &optional SHOW)" t nil)
-
-(autoload 'pkg-info-defining-library-original-version "pkg-info" "\
-Get the original version of the library defining FUNCTION.
-
-The original version is stored in the X-Original-Version header.
-This header is added by the MELPA package archive to preserve
-upstream version numbers.
-
-If SHOW is non-nil, show the version in mini-buffer.
-
-This function is mainly intended to find the version of a major
-or minor mode, i.e.
-
- (pkg-info-defining-library-version 'flycheck-mode)
-
-Return the version of the library defining FUNCTION. Signal an
-error if FUNCTION is not a valid function, if its defining
-library was not found, or if the library had no proper version
-header.
-
-\(fn FUNCTION &optional SHOW)" t nil)
-
-(autoload 'pkg-info-defining-library-version "pkg-info" "\
-Get the version of the library defining FUNCTION.
-
-If SHOW is non-nil, show the version in mini-buffer.
-
-This function is mainly intended to find the version of a major
-or minor mode, i.e.
-
- (pkg-info-defining-library-version 'flycheck-mode)
-
-Return the version of the library defining FUNCTION. Signal an
-error if FUNCTION is not a valid function, if its defining
-library was not found, or if the library had no proper version
-header.
-
-\(fn FUNCTION &optional SHOW)" t nil)
-
-(autoload 'pkg-info-package-version "pkg-info" "\
-Get the version of an installed PACKAGE.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-Return the version as list, or nil if PACKAGE is not installed.
-
-\(fn PACKAGE &optional SHOW)" t nil)
-
-(autoload 'pkg-info-version-info "pkg-info" "\
-Obtain complete version info for LIBRARY and PACKAGE.
-
-LIBRARY is a symbol denoting a named feature, or a library name
-as string. PACKAGE is a symbol denoting an ELPA package. If
-omitted or nil, default to LIBRARY.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-When called interactively, prompt for LIBRARY. When called
-interactively with prefix argument, prompt for PACKAGE as well.
-
-Return a string with complete version information for LIBRARY.
-This version information contains the version from the headers of
-LIBRARY, and the version of the installed PACKAGE, the LIBRARY is
-part of. If PACKAGE is not installed, or if the PACKAGE version
-is the same as the LIBRARY version, do not include a package
-version.
-
-\(fn LIBRARY &optional PACKAGE SHOW)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pkg-info" '("pkg-info-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; pkg-info-autoloads.el ends here
diff --git a/elpa/pkg-info-20150517.1143/pkg-info-pkg.el b/elpa/pkg-info-20150517.1143/pkg-info-pkg.el
deleted file mode 100644
index d4b90e1..0000000
--- a/elpa/pkg-info-20150517.1143/pkg-info-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "pkg-info" "20150517.1143" "Information about packages" '((epl "0.8")) :commit "76ba7415480687d05a4353b27fea2ae02b8d9d61" :keywords '("convenience") :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Sebastian Wiesner" . "swiesner@lunaryorn.com") :url "https://github.com/lunaryorn/pkg-info.el")
diff --git a/elpa/pkg-info-20150517.1143/pkg-info.el b/elpa/pkg-info-20150517.1143/pkg-info.el
deleted file mode 100644
index 1017a37..0000000
--- a/elpa/pkg-info-20150517.1143/pkg-info.el
+++ /dev/null
@@ -1,332 +0,0 @@
-;;; pkg-info.el --- Information about packages -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2015 Sebastian Wiesner <swiesner@lunaryorn.com>
-
-;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
-;; URL: https://github.com/lunaryorn/pkg-info.el
-;; Package-Version: 20150517.1143
-;; Package-Commit: 76ba7415480687d05a4353b27fea2ae02b8d9d61
-;; Keywords: convenience
-;; Version: 0.7-cvs
-;; Package-Requires: ((epl "0.8"))
-
-;; This file is not part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This library extracts information from installed packages.
-
-;;;; Functions:
-
-;; `pkg-info-library-version' extracts the version from the header of a library.
-;;
-;; `pkg-info-defining-library-version' extracts the version from the header of a
-;; library defining a function.
-;;
-;; `pkg-info-package-version' gets the version of an installed package.
-;;
-;; `pkg-info-format-version' formats a version list as human readable string.
-;;
-;; `pkg-info-version-info' returns complete version information for a specific
-;; package.
-;;
-;; `pkg-info-get-melpa-recipe' gets the MELPA recipe for a package.
-;;
-;; `pkg-info-get-melpa-fetcher' gets the fetcher used to build a package on
-;; MELPA.
-;;
-;; `pkg-info-wiki-package-p' determines whether a package was build from
-;; EmacsWiki on MELPA.
-
-;;; Code:
-
-(require 'epl)
-
-(require 'lisp-mnt)
-(require 'find-func)
-(require 'json) ; `json-read'
-(require 'url-http) ; `url-http-parse-response'
-
-(defvar url-http-end-of-headers)
-
-
-;;; Version information
-(defun pkg-info-format-version (version)
- "Format VERSION as human-readable string.
-
-Return a human-readable string representing VERSION."
- ;; XXX: Find a better, more flexible way of formatting?
- (package-version-join version))
-
-(defsubst pkg-info--show-version-and-return (version show)
- "Show and return VERSION.
-
-When SHOW is non-nil, show VERSION in minibuffer.
-
-Return VERSION."
- (when show
- (message (if (listp version) (pkg-info-format-version version) version)))
- version)
-
-(defun pkg-info--read-library ()
- "Read a library from minibuffer."
- (completing-read "Load library: "
- (apply-partially 'locate-file-completion-table
- load-path
- (get-load-suffixes))))
-
-(defun pkg-info--read-function ()
- "Read a function name from minibuffer."
- (let ((input (completing-read "Function: " obarray #'boundp :require-match)))
- (if (string= input "") nil (intern input))))
-
-(defun pkg-info--read-package ()
- "Read a package name from minibuffer."
- (let* ((installed (epl-installed-packages))
- (names (sort (mapcar (lambda (pkg)
- (symbol-name (epl-package-name pkg)))
- installed)
- #'string<))
- (default (car names)))
- (completing-read "Installed package: " names nil 'require-match
- nil nil default)))
-
-(defun pkg-info-library-source (library)
- "Get the source file of LIBRARY.
-
-LIBRARY is either a symbol denoting a named feature, or a library
-name as string.
-
-Return the source file of LIBRARY as string."
- (find-library-name (if (symbolp library) (symbol-name library) library)))
-
-(defun pkg-info-defining-library (function)
- "Get the source file of the library defining FUNCTION.
-
-FUNCTION is a function symbol.
-
-Return the file name of the library as string. Signal an error
-if the library does not exist, or if the definition of FUNCTION
-was not found."
- (unless (functionp function)
- (signal 'wrong-type-argument (list 'functionp function)))
- (let ((library (symbol-file function 'defun)))
- (unless library
- (error "Can't find definition of %s" function))
- library))
-
-(defun pkg-info-x-original-version (file)
- "Read the X-Original-Version header from FILE.
-
-Return the value as version list, or return nil if FILE lacks
-this header. Signal an error, if the value of the header is not
-a valid version."
- (let ((version-str (with-temp-buffer
- (insert-file-contents file)
- (lm-header "X-Original-Version"))))
- (when version-str
- (version-to-list version-str))))
-
-;;;###autoload
-(defun pkg-info-library-original-version (library &optional show)
- "Get the original version in the header of LIBRARY.
-
-The original version is stored in the X-Original-Version header.
-This header is added by the MELPA package archive to preserve
-upstream version numbers.
-
-LIBRARY is either a symbol denoting a named feature, or a library
-name as string.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-Return the version from the header of LIBRARY as list. Signal an
-error if the LIBRARY was not found or had no X-Original-Version
-header.
-
-See Info node `(elisp)Library Headers' for more information
-about library headers."
- (interactive (list (pkg-info--read-library) t))
- (let ((version (pkg-info-x-original-version
- (pkg-info-library-source library))))
- (if version
- (pkg-info--show-version-and-return version show)
- (error "Library %s has no original version" library))))
-
-;;;###autoload
-(defun pkg-info-library-version (library &optional show)
- "Get the version in the header of LIBRARY.
-
-LIBRARY is either a symbol denoting a named feature, or a library
-name as string.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-Return the version from the header of LIBRARY as list. Signal an
-error if the LIBRARY was not found or had no proper header.
-
-See Info node `(elisp)Library Headers' for more information
-about library headers."
- (interactive (list (pkg-info--read-library) t))
- (let* ((source (pkg-info-library-source library))
- (version (epl-package-version (epl-package-from-file source))))
- (pkg-info--show-version-and-return version show)))
-
-;;;###autoload
-(defun pkg-info-defining-library-original-version (function &optional show)
- "Get the original version of the library defining FUNCTION.
-
-The original version is stored in the X-Original-Version header.
-This header is added by the MELPA package archive to preserve
-upstream version numbers.
-
-If SHOW is non-nil, show the version in mini-buffer.
-
-This function is mainly intended to find the version of a major
-or minor mode, i.e.
-
- (pkg-info-defining-library-version 'flycheck-mode)
-
-Return the version of the library defining FUNCTION. Signal an
-error if FUNCTION is not a valid function, if its defining
-library was not found, or if the library had no proper version
-header."
- (interactive (list (pkg-info--read-function) t))
- (pkg-info-library-original-version (pkg-info-defining-library function) show))
-
-;;;###autoload
-(defun pkg-info-defining-library-version (function &optional show)
- "Get the version of the library defining FUNCTION.
-
-If SHOW is non-nil, show the version in mini-buffer.
-
-This function is mainly intended to find the version of a major
-or minor mode, i.e.
-
- (pkg-info-defining-library-version 'flycheck-mode)
-
-Return the version of the library defining FUNCTION. Signal an
-error if FUNCTION is not a valid function, if its defining
-library was not found, or if the library had no proper version
-header."
- (interactive (list (pkg-info--read-function) t))
- (pkg-info-library-version (pkg-info-defining-library function) show))
-
-;;;###autoload
-(defun pkg-info-package-version (package &optional show)
- "Get the version of an installed PACKAGE.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-Return the version as list, or nil if PACKAGE is not installed."
- (interactive (list (pkg-info--read-package) t))
- (let* ((name (if (stringp package) (intern package) package))
- (package (car (epl-find-installed-packages name))))
- (unless package
- (error "Can't find installed package %s" name))
- (pkg-info--show-version-and-return (epl-package-version package) show)))
-
-;;;###autoload
-(defun pkg-info-version-info (library &optional package show)
- "Obtain complete version info for LIBRARY and PACKAGE.
-
-LIBRARY is a symbol denoting a named feature, or a library name
-as string. PACKAGE is a symbol denoting an ELPA package. If
-omitted or nil, default to LIBRARY.
-
-If SHOW is non-nil, show the version in the minibuffer.
-
-When called interactively, prompt for LIBRARY. When called
-interactively with prefix argument, prompt for PACKAGE as well.
-
-Return a string with complete version information for LIBRARY.
-This version information contains the version from the headers of
-LIBRARY, and the version of the installed PACKAGE, the LIBRARY is
-part of. If PACKAGE is not installed, or if the PACKAGE version
-is the same as the LIBRARY version, do not include a package
-version."
- (interactive (list (pkg-info--read-library)
- (when current-prefix-arg
- (pkg-info--read-package))
- t))
- (let* ((package (or package (if (stringp library) (intern library) library)))
- (orig-version (condition-case nil
- (pkg-info-library-original-version library)
- (error nil)))
- ;; If we have X-Original-Version, we assume that MELPA replaced the
- ;; library version with its generated version, so we use the
- ;; X-Original-Version header instead, and ignore the library version
- ;; header
- (lib-version (or orig-version (pkg-info-library-version library)))
- (pkg-version (condition-case nil
- (pkg-info-package-version package)
- (error nil)))
- (version (if (and pkg-version
- (not (version-list-= lib-version pkg-version)))
- (format "%s (package: %s)"
- (pkg-info-format-version lib-version)
- (pkg-info-format-version pkg-version))
- (pkg-info-format-version lib-version))))
- (pkg-info--show-version-and-return version show)))
-
-(defconst pkg-info-melpa-recipe-url "http://melpa.org/recipes.json"
- "The URL from which to fetch MELPA recipes.")
-
-(defvar pkg-info-melpa-recipes nil
- "An alist of MELPA recipes.")
-
-(defun pkg-info-retrieve-melpa-recipes ()
- "Retrieve MELPA recipes from MELPA archive."
- (let ((buffer (url-retrieve-synchronously pkg-info-melpa-recipe-url)))
- (with-current-buffer buffer
- (unwind-protect
- (let ((response-code (url-http-parse-response)))
- (unless (equal response-code 200)
- (error "Failed to retrieve MELPA recipes from %s (code %s)"
- pkg-info-melpa-recipe-url response-code))
- (goto-char url-http-end-of-headers)
- (json-read))
- (when (and buffer (buffer-live-p buffer))
- (kill-buffer buffer))))))
-
-(defun pkg-info-get-melpa-recipes ()
- "Get MELPA recipes."
- (setq pkg-info-melpa-recipes
- (or pkg-info-melpa-recipes
- (pkg-info-retrieve-melpa-recipes))))
-
-(defun pkg-info-get-melpa-recipe (package)
- "Get the MELPA recipe for PACKAGE.
-
-Return nil if PACKAGE is not on MELPA."
- (cdr (assq package (pkg-info-get-melpa-recipes))))
-
-(defun pkg-info-get-melpa-fetcher (package)
- "Get the MELPA fetcher for PACKAGE."
- (cdr (assq 'fetcher (pkg-info-get-melpa-recipe package))))
-
-(defun pkg-info-wiki-package-p (package)
- "Determine whether PACKAGE is build from the EmacsWiki."
- (equal (pkg-info-get-melpa-fetcher package) "wiki"))
-
-(provide 'pkg-info)
-
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; coding: utf-8
-;; End:
-
-;;; pkg-info.el ends here
diff --git a/elpa/popup-20200610.317/popup-autoloads.el b/elpa/popup-20200610.317/popup-autoloads.el
deleted file mode 100644
index 8389b0a..0000000
--- a/elpa/popup-20200610.317/popup-autoloads.el
+++ /dev/null
@@ -1,22 +0,0 @@
-;;; popup-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "popup" "popup.el" (0 0 0 0))
-;;; Generated autoloads from popup.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "popup" '("popup-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; popup-autoloads.el ends here
diff --git a/elpa/popup-20200610.317/popup-pkg.el b/elpa/popup-20200610.317/popup-pkg.el
deleted file mode 100644
index a10a314..0000000
--- a/elpa/popup-20200610.317/popup-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "popup" "20200610.317" "Visual Popup User Interface" '((cl-lib "0.5")) :commit "9d104d4bbbcb37bbc9d9ce762e74d41174683f86" :keywords '("lisp") :authors '(("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) :maintainer '("Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))
diff --git a/elpa/popup-20200610.317/popup.el b/elpa/popup-20200610.317/popup.el
deleted file mode 100644
index 71aa3f6..0000000
--- a/elpa/popup-20200610.317/popup.el
+++ /dev/null
@@ -1,1435 +0,0 @@
-;;; popup.el --- Visual Popup User Interface
-
-;; Copyright (C) 2009-2015 Tomohiro Matsuyama
-
-;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com>
-;; Keywords: lisp
-;; Package-Version: 20200610.317
-;; Package-Commit: 9d104d4bbbcb37bbc9d9ce762e74d41174683f86
-;; Version: 0.5.8
-;; Package-Requires: ((cl-lib "0.5"))
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; popup.el is a visual popup user interface library for Emacs. This
-;; provides a basic API and common UI widgets such as popup tooltips
-;; and popup menus.
-;; See README.markdown for more information.
-
-;;; Code:
-
-(require 'cl-lib)
-
-(defconst popup-version "0.5.8")
-
-
-
-;;; Utilities
-
-(defun popup-calculate-max-width (max-width)
- "Determines whether the width with MAX-WIDTH desired is character or window \
-proportion based, And return the result."
- (cl-typecase max-width
- (integer max-width)
- (float (* (ceiling (/ (round (* max-width (window-width))) 10.0)) 10))))
-
-(defvar popup-use-optimized-column-computation t
- "Use the optimized column computation routine.
-If there is a problem, please set it nil.")
-
-(defmacro popup-aif (test then &rest else)
- "Anaphoric if."
- (declare (indent 2))
- `(let ((it ,test))
- (if it ,then ,@else)))
-
-(defmacro popup-awhen (test &rest body)
- "Anaphoric when."
- (declare (indent 1))
- `(let ((it ,test))
- (when it ,@body)))
-
-(defun popup-x-to-string (x)
- "Convert any object to string efficiently.
-This is faster than `prin1-to-string' in many cases."
- (cl-typecase x
- (string x)
- (symbol (symbol-name x))
- (integer (number-to-string x))
- (float (number-to-string x))
- (t (format "%s" x))))
-
-(defun popup-substring-by-width (string width)
- "Return a cons cell of substring and remaining string by
-splitting with WIDTH."
- ;; Expand tabs into 4 spaces
- (setq string (replace-regexp-in-string "\t" " " string))
- (cl-loop with len = (length string)
- with w = 0
- for l from 0
- for c in (append string nil)
- while (<= (cl-incf w (char-width c)) width)
- finally return
- (if (< l len)
- (cons (substring string 0 l) (substring string l))
- (list string))))
-
-(defun popup-fill-string (string &optional width max-width justify squeeze)
- "Split STRING into fixed width strings and return a cons cell
-like \(WIDTH . ROWS). Here, the car WIDTH indicates the actual
-maxim width of ROWS.
-
-The argument WIDTH specifies the width of filling each
-paragraph. WIDTH nil means don't perform any justification and
-word wrap. Note that this function doesn't add any padding
-characters at the end of each row.
-
-MAX-WIDTH, if WIDTH is nil, specifies the maximum number of
-columns.
-
-The optional fourth argument JUSTIFY specifies which kind of
-justification to do: `full', `left', `right', `center', or
-`none' (equivalent to nil). A value of t means handle each
-paragraph as specified by its text properties.
-
-SQUEEZE nil means leave whitespaces other than line breaks
-untouched."
- (if (eq width 0)
- (error "Can't fill string with 0 width"))
- (if width
- (setq max-width width))
- (with-temp-buffer
- (let ((tab-width 4)
- (fill-column width)
- (left-margin 0)
- (kinsoku-limit 1)
- indent-tabs-mode
- row rows)
- (insert string)
- (untabify (point-min) (point-max))
- (if width
- (fill-region (point-min) (point-max) justify (not squeeze)))
- (goto-char (point-min))
- (setq width 0)
- (while (prog2
- (let ((line (buffer-substring
- (point) (progn (end-of-line) (point)))))
- (if max-width
- (while (progn
- (setq row (truncate-string-to-width line max-width)
- width (max width (string-width row)))
- (push row rows)
- (if (not (= (length row) (length line)))
- (setq line (substring line (length row))))))
- (setq width (max width (string-width line)))
- (push line rows)))
- (< (point) (point-max))
- (beginning-of-line 2)))
- (cons width (nreverse rows)))))
-
-(defmacro popup-save-buffer-state (&rest body)
- (declare (indent 0))
- `(save-excursion
- (let ((buffer-undo-list t)
- (inhibit-read-only t)
- (modified (buffer-modified-p)))
- (unwind-protect
- (progn ,@body)
- (set-buffer-modified-p modified)))))
-
-(defun popup-vertical-motion (column direction)
- "A portable version of `vertical-motion'."
- (when (bound-and-true-p display-line-numbers-mode)
- (setq column (- column (line-number-display-width 'columns))))
- (if (>= emacs-major-version 23)
- (vertical-motion (cons column direction))
- (vertical-motion direction)
- (move-to-column (+ (current-column) column))))
-
-(defun popup-last-line-of-buffer-p ()
- "Return non-nil if the cursor is at the last line of the
-buffer."
- (save-excursion (end-of-line) (/= (forward-line) 0)))
-
-(defun popup-lookup-key-by-event (function event)
- (or (funcall function (vector event))
- (if (symbolp event)
- (popup-aif (get event 'event-symbol-element-mask)
- (funcall function
- (vector (logior (or (get (car it) 'ascii-character)
- 0)
- (cadr it))))))))
-
-
-
-;;; Core
-
-(defgroup popup nil
- "Visual Popup User Interface"
- :group 'lisp
- :prefix "popup-")
-
-(defface popup-face
- '((t (:inherit default :background "lightgray" :foreground "black")))
- "Face for popup."
- :group 'popup)
-
-(defface popup-summary-face
- '((t (:inherit popup-face :foreground "dimgray")))
- "Face for popup summary."
- :group 'popup)
-
-(defface popup-scroll-bar-foreground-face
- '((t (:background "black")))
- "Foreground face for scroll-bar."
- :group 'popup)
-
-(defface popup-scroll-bar-background-face
- '((t (:background "gray")))
- "Background face for scroll-bar."
- :group 'popup)
-
-(defvar popup-instances nil
- "Popup instances.")
-
-(defvar popup-scroll-bar-foreground-char
- (propertize " " 'face 'popup-scroll-bar-foreground-face)
- "Foreground character for scroll-bar.")
-
-(defvar popup-scroll-bar-background-char
- (propertize " " 'face 'popup-scroll-bar-background-face)
- "Background character for scroll-bar.")
-
-(cl-defstruct popup
- point row column width height min-height direction overlays keymap
- parent depth
- face mouse-face selection-face summary-face
- margin-left margin-right margin-left-cancel scroll-bar symbol
- cursor offset scroll-top current-height list newlines
- pattern original-list invis-overlays)
-
-(defun popup-item-propertize (item &rest properties)
- "Same as `propertize' except that this avoids overriding
-existed value with `nil' property."
- (cl-loop for (k v) on properties by 'cddr
- if v append (list k v) into props
- finally return
- (apply 'propertize
- (popup-x-to-string item)
- props)))
-
-(defun popup-item-property (item property)
- "Same as `get-text-property' except that this returns nil if
-ITEM is not string."
- (if (stringp item)
- (get-text-property 0 property item)))
-
-(cl-defun popup-make-item (name
- &key
- value
- face
- mouse-face
- selection-face
- sublist
- document
- symbol
- summary)
- "Utility function to make popup item. See also
-`popup-item-propertize'."
- (popup-item-propertize name
- 'value value
- 'popup-face face
- 'popup-mouse-face mouse-face
- 'selection-face selection-face
- 'document document
- 'symbol symbol
- 'summary summary
- 'sublist sublist))
-
-(defsubst popup-item-value (item) (popup-item-property item 'value))
-(defsubst popup-item-value-or-self (item) (or (popup-item-value item) item))
-(defsubst popup-item-face (item) (popup-item-property item 'popup-face))
-(defsubst popup-item-mouse-face (item) (popup-item-property item 'popup-mouse-face))
-(defsubst popup-item-selection-face (item) (popup-item-property item 'selection-face))
-(defsubst popup-item-document (item) (popup-item-property item 'document))
-(defsubst popup-item-summary (item) (popup-item-property item 'summary))
-(defsubst popup-item-symbol (item) (popup-item-property item 'symbol))
-(defsubst popup-item-sublist (item) (popup-item-property item 'sublist))
-
-(defun popup-item-documentation (item)
- (let ((doc (popup-item-document item)))
- (if (functionp doc)
- (setq doc (funcall doc (popup-item-value-or-self item))))
- doc))
-
-(defun popup-item-show-help-1 (item)
- (let ((doc (popup-item-documentation item)))
- (when doc
- (with-current-buffer (get-buffer-create " *Popup Help*")
- (erase-buffer)
- (insert doc)
- (goto-char (point-min))
- (display-buffer (current-buffer)))
- t)))
-
-(defun popup-item-show-help-with-event-loop (item)
- (save-window-excursion
- (when (popup-item-show-help-1 item)
- (cl-loop do (clear-this-command-keys)
- for key = (read-key-sequence-vector nil)
- do
- (cl-case (key-binding key)
- (scroll-other-window
- (scroll-other-window))
- (scroll-other-window-down
- (scroll-other-window-down nil))
- (otherwise
- (setq unread-command-events (append key unread-command-events))
- (cl-return)))))))
-
-(defun popup-item-show-help (item &optional persist)
- "Display the documentation of ITEM with `display-buffer'. If
-PERSIST is nil, the documentation buffer will be closed
-automatically, meaning interal event loop ensures the buffer to
-be closed. Otherwise, the buffer will be just displayed as
-usual."
- (when item
- (if (not persist)
- (popup-item-show-help-with-event-loop item)
- (popup-item-show-help-1 item))))
-
-(defun popup-set-list (popup list)
- (popup-set-filtered-list popup list)
- (setf (popup-pattern popup) nil)
- (setf (popup-original-list popup) list))
-
-(defun popup-set-filtered-list (popup list)
- (let ((offset
- (if (> (popup-direction popup) 0)
- 0
- (max (- (popup-height popup) (length list)) 0))))
- (setf (popup-list popup) list
- (popup-offset popup) offset)))
-
-(defun popup-selected-item (popup)
- (nth (popup-cursor popup) (popup-list popup)))
-
-(defun popup-selected-line (popup)
- (- (popup-cursor popup) (popup-scroll-top popup)))
-
-(defun popup-line-overlay (popup line)
- (aref (popup-overlays popup) line))
-
-(defun popup-selected-line-overlay (popup)
- (popup-line-overlay popup (popup-selected-line popup)))
-
-(defun popup-hide-line (popup line)
- (let ((overlay (popup-line-overlay popup line)))
- (overlay-put overlay 'display nil)
- (overlay-put overlay 'after-string nil)))
-
-(defun popup-line-hidden-p (popup line)
- (let ((overlay (popup-line-overlay popup line)))
- (and (eq (overlay-get overlay 'display) nil)
- (eq (overlay-get overlay 'after-string) nil))))
-
-(cl-defun popup-set-line-item (popup
- line
- &key
- item
- face
- mouse-face
- margin-left
- margin-right
- scroll-bar-char
- symbol
- summary
- summary-face
- keymap)
- (let* ((overlay (popup-line-overlay popup line))
- (content (popup-create-line-string popup (popup-x-to-string item)
- :margin-left margin-left
- :margin-right margin-right
- :symbol symbol
- :summary summary
- :summary-face summary-face))
- (start 0)
- (prefix (overlay-get overlay 'prefix))
- (postfix (overlay-get overlay 'postfix))
- end)
- (put-text-property 0 (length content) 'popup-item item content)
- (put-text-property 0 (length content) 'keymap keymap content)
- ;; Overlap face properties
- (when (get-text-property start 'face content)
- (setq start (next-single-property-change start 'face content)))
- (while (and start (setq end (next-single-property-change start 'face content)))
- (put-text-property start end 'face face content)
- (setq start (next-single-property-change end 'face content)))
- (when start
- (put-text-property start (length content) 'face face content))
- (when mouse-face
- (put-text-property 0 (length content) 'mouse-face mouse-face content))
- (let ((prop (if (overlay-get overlay 'dangle)
- 'after-string
- 'display)))
- (overlay-put overlay
- prop
- (concat prefix
- content
- scroll-bar-char
- postfix)))))
-
-(cl-defun popup-create-line-string (popup
- string
- &key
- margin-left
- margin-right
- symbol
- summary
- summary-face)
- (let* ((popup-width (popup-width popup))
- (summary-width (string-width summary))
- (content-width (max
- (min popup-width (string-width string))
- (- popup-width
- (if (> summary-width 0)
- (+ summary-width 2)
- 0))))
- (string (car (popup-substring-by-width string content-width)))
- (string-width (string-width string))
- (spacing (max (- popup-width string-width summary-width)
- (if (> popup-width string-width) 1 0)))
- (truncated-summary
- (car (popup-substring-by-width
- summary (max (- popup-width string-width spacing) 0)))))
- (when summary-face
- (put-text-property 0 (length truncated-summary)
- 'face summary-face truncated-summary))
- (concat margin-left
- string
- (make-string spacing ? )
- truncated-summary
- symbol
- margin-right)))
-
-(defun popup-live-p (popup)
- "Return non-nil if POPUP is alive."
- (and popup (popup-overlays popup) t))
-
-(defun popup-child-point (popup &optional offset)
- (overlay-end
- (popup-line-overlay
- popup
- (or offset
- (popup-selected-line popup)))))
-
-(defun popup-calculate-direction (height row)
- "Return a proper direction when displaying a popup on this
-window. HEIGHT is the a height of the popup, and ROW is a line
-number at the point."
- (let* ((remaining-rows (- (max 1 (- (window-text-height)
- (if mode-line-format 1 0)
- (if header-line-format 1 0)))
- (count-lines (window-start) (point))))
- (enough-space-above (> row height))
- (enough-space-below (<= height remaining-rows)))
- (if (and enough-space-above
- (not enough-space-below))
- -1
- 1)))
-
-(cl-defun popup-create (point
- width
- height
- &key
- min-height
- max-width
- around
- (face 'popup-face)
- mouse-face
- (selection-face face)
- (summary-face 'popup-summary-face)
- scroll-bar
- margin-left
- margin-right
- symbol
- parent
- parent-offset
- keymap)
- "Create a popup instance at POINT with WIDTH and HEIGHT.
-
-MIN-HEIGHT is a minimal height of the popup. The default value is
-0.
-
-MAX-WIDTH is the maximum width of the popup. The default value is
-nil (no limit). If a floating point, the value refers to the ratio of
-the window. If an integer, limit is in characters.
-
-If AROUND is non-nil, the popup will be displayed around the
-point but not at the point.
-
-FACE is a background face of the popup. The default value is POPUP-FACE.
-
-SELECTION-FACE is a foreground (selection) face of the popup The
-default value is POPUP-FACE.
-
-If SCROLL-BAR is non-nil, the popup will have a scroll bar at the
-right.
-
-If MARGIN-LEFT is non-nil, the popup will have a margin at the
-left.
-
-If MARGIN-RIGHT is non-nil, the popup will have a margin at the
-right.
-
-SYMBOL is a single character which indicates a kind of the item.
-
-PARENT is a parent popup instance. If PARENT is omitted, the
-popup will be a root instance.
-
-PARENT-OFFSET is a row offset from the parent popup.
-
-KEYMAP is a keymap that will be put on the popup contents."
- (or margin-left (setq margin-left 0))
- (or margin-right (setq margin-right 0))
- (unless point
- (setq point
- (if parent (popup-child-point parent parent-offset) (point))))
- (when max-width
- (setq width (min width (popup-calculate-max-width max-width))))
- (save-excursion
- (goto-char point)
- (let* ((col-row (posn-col-row (posn-at-point)))
- (row (cdr col-row))
- (column (car col-row))
- (overlays (make-vector height nil))
- (popup-width (+ width
- (if scroll-bar 1 0)
- margin-left
- margin-right
- (if symbol 2 0)))
- margin-left-cancel
- (window (selected-window))
- (window-start (window-start))
- (window-hscroll (window-hscroll))
- (window-width (window-width))
- (right (+ column popup-width))
- (overflow (and (> right window-width)
- (>= right popup-width)))
- (foldable (and (null parent)
- (>= column popup-width)))
- (direction (or
- ;; Currently the direction of cascade popup won't be changed
- (and parent (popup-direction parent))
-
- ;; Calculate direction
- (popup-calculate-direction height row)))
- (depth (if parent (1+ (popup-depth parent)) 0))
- (newlines (max 0 (+ (- height (count-lines point (point-max))) (if around 1 0))))
- invis-overlays
- current-column)
- ;; Case: no newlines at the end of the buffer
- (when (> newlines 0)
- (popup-save-buffer-state
- (goto-char (point-max))
- (insert (make-string newlines ?\n))))
-
- ;; Case: the popup overflows
- (if overflow
- (if foldable
- (progn
- (cl-decf column (- popup-width margin-left margin-right))
- (unless around (move-to-column column)))
- (when (not truncate-lines)
- ;; Truncate.
- (let ((d (1+ (- popup-width (- window-width column)))))
- (cl-decf popup-width d)
- (cl-decf width d)))
- (cl-decf column margin-left))
- (cl-decf column margin-left))
-
- ;; Case: no space at the left
- (when (and (null parent)
- (< column 0))
- ;; Cancel margin left
- (setq column 0)
- (cl-decf popup-width margin-left)
- (setq margin-left-cancel t))
-
- (dotimes (i height)
- (let (overlay begin w (dangle t) (prefix "") (postfix ""))
- (when around
- (popup-vertical-motion column direction))
- (cl-loop for ov in (overlays-in (save-excursion
- (beginning-of-visual-line)
- (point))
- (save-excursion
- (end-of-visual-line)
- (point)))
- when (and (not (overlay-get ov 'popup))
- (not (overlay-get ov 'popup-item))
- (or (overlay-get ov 'invisible)
- (overlay-get ov 'display)))
- do (progn
- (push (list ov (overlay-get ov 'display)) invis-overlays)
- (overlay-put ov 'display "")))
- (setq around t)
- (setq current-column (car (posn-col-row (posn-at-point))))
-
- (when (< current-column column)
- ;; Extend short buffer lines by popup prefix (line of spaces)
- (setq prefix (make-string
- (+ (if (= current-column 0)
- (- window-hscroll current-column)
- 0)
- (- column current-column))
- ? )))
-
- (setq begin (point))
- (setq w (+ popup-width (length prefix)))
- (while (and (not (eolp)) (> w 0))
- (setq dangle nil)
- (cl-decf w (char-width (char-after)))
- (forward-char))
- (if (< w 0)
- (setq postfix (make-string (- w) ? )))
-
- (setq overlay (make-overlay begin (point)))
- (overlay-put overlay 'popup t)
- (overlay-put overlay 'window window)
- (overlay-put overlay 'dangle dangle)
- (overlay-put overlay 'prefix prefix)
- (overlay-put overlay 'postfix postfix)
- (overlay-put overlay 'width width)
- (aset overlays
- (if (> direction 0) i (- height i 1))
- overlay)))
- (cl-loop for p from (- 10000 (* depth 1000))
- for overlay in (nreverse (append overlays nil))
- do (overlay-put overlay 'priority p))
- (let ((it (make-popup :point point
- :row row
- :column column
- :width width
- :height height
- :min-height min-height
- :direction direction
- :parent parent
- :depth depth
- :face face
- :mouse-face mouse-face
- :selection-face selection-face
- :summary-face summary-face
- :margin-left margin-left
- :margin-right margin-right
- :margin-left-cancel margin-left-cancel
- :scroll-bar scroll-bar
- :symbol symbol
- :cursor 0
- :offset 0
- :scroll-top 0
- :current-height 0
- :list nil
- :newlines newlines
- :overlays overlays
- :invis-overlays invis-overlays
- :keymap keymap)))
- (push it popup-instances)
- it))))
-
-(defun popup-delete (popup)
- "Delete POPUP instance."
- (when (popup-live-p popup)
- (popup-hide popup)
- (mapc 'delete-overlay (popup-overlays popup))
- (setf (popup-overlays popup) nil)
- (setq popup-instances (delq popup popup-instances))
- ;; Restore newlines state
- (let ((newlines (popup-newlines popup)))
- (when (> newlines 0)
- (popup-save-buffer-state
- (goto-char (point-max))
- (dotimes (i newlines)
- (if (and (char-before)
- (= (char-before) ?\n))
- (delete-char -1)))))))
- nil)
-
-(defun popup-draw (popup)
- "Draw POPUP."
- (cl-loop for (ov olddisplay) in (popup-invis-overlays popup)
- do (overlay-put ov 'display ""))
-
- (cl-loop with height = (popup-height popup)
- with min-height = (popup-min-height popup)
- with popup-face = (popup-face popup)
- with mouse-face = (popup-mouse-face popup)
- with selection-face = (popup-selection-face popup)
- with summary-face-0 = (popup-summary-face popup)
- with list = (popup-list popup)
- with length = (length list)
- with thum-size = (max (/ (* height height) (max length 1)) 1)
- with page-size = (/ (+ 0.0 (max length 1)) height)
- with scroll-bar = (popup-scroll-bar popup)
- with margin-left = (make-string (if (popup-margin-left-cancel popup) 0 (popup-margin-left popup)) ? )
- with margin-right = (make-string (popup-margin-right popup) ? )
- with symbol = (popup-symbol popup)
- with cursor = (popup-cursor popup)
- with scroll-top = (popup-scroll-top popup)
- with offset = (popup-offset popup)
- with keymap = (popup-keymap popup)
- for o from offset
- for i from scroll-top
- while (< o height)
- for item in (nthcdr scroll-top list)
- for page-index = (* thum-size (/ o thum-size))
- for face = (if (= i cursor)
- (or (popup-item-selection-face item) selection-face)
- (or (popup-item-face item) popup-face))
- for summary-face = (unless (= i cursor) summary-face-0)
- for empty-char = (propertize " " 'face face)
- for scroll-bar-char = (if scroll-bar
- (cond
- ((and (not (eq scroll-bar :always))
- (<= page-size 1))
- empty-char)
- ((and (> page-size 1)
- (>= cursor (* page-index page-size))
- (< cursor (* (+ page-index thum-size) page-size)))
- popup-scroll-bar-foreground-char)
- (t
- popup-scroll-bar-background-char))
- "")
- for sym = (if symbol
- (concat " " (or (popup-item-symbol item) " "))
- "")
- for summary = (or (popup-item-summary item) "")
-
- do
- ;; Show line and set item to the line
- (popup-set-line-item popup o
- :item item
- :face face
- :mouse-face mouse-face
- :margin-left margin-left
- :margin-right margin-right
- :scroll-bar-char scroll-bar-char
- :symbol sym
- :summary summary
- :summary-face summary-face
- :keymap keymap)
-
- finally
- ;; Remember current height
- (setf (popup-current-height popup) (- o offset))
-
- ;; Hide remaining lines
- (let ((scroll-bar-char (if scroll-bar (propertize " " 'face popup-face) ""))
- (symbol (if symbol " " "")))
- (if (> (popup-direction popup) 0)
- (progn
- (when min-height
- (while (< o min-height)
- (popup-set-line-item popup o
- :item ""
- :face popup-face
- :margin-left margin-left
- :margin-right margin-right
- :scroll-bar-char scroll-bar-char
- :symbol symbol
- :summary "")
- (cl-incf o)))
- (while (< o height)
- (popup-hide-line popup o)
- (cl-incf o)))
- (cl-loop with h = (if min-height (- height min-height) offset)
- for o from 0 below offset
- if (< o h)
- do (popup-hide-line popup o)
- if (>= o h)
- do (popup-set-line-item popup o
- :item ""
- :face popup-face
- :margin-left margin-left
- :margin-right margin-right
- :scroll-bar-char scroll-bar-char
- :symbol symbol
- :summary ""))))))
-
-(defun popup-hide (popup)
- "Hide POPUP."
- (cl-loop for (ov olddisplay) in (popup-invis-overlays popup)
- do (overlay-put ov 'display olddisplay))
- (dotimes (i (popup-height popup))
- (popup-hide-line popup i)))
-
-(defun popup-hidden-p (popup)
- "Return non-nil if POPUP is hidden."
- (let ((hidden t))
- (when (popup-live-p popup)
- (dotimes (i (popup-height popup))
- (unless (popup-line-hidden-p popup i)
- (setq hidden nil))))
- hidden))
-
-(defun popup-jump (popup cursor)
- "Jump to a position specified by CURSOR of POPUP and draw."
- (let ((scroll-top (popup-scroll-top popup)))
- ;; Do not change page as much as possible.
- (unless (and (<= scroll-top cursor)
- (< cursor (+ scroll-top (popup-height popup))))
- (setf (popup-scroll-top popup) cursor))
- (setf (popup-cursor popup) cursor)
- (popup-draw popup)))
-
-(defun popup-select (popup i)
- "Select the item at I of POPUP and draw."
- (setq i (+ i (popup-offset popup)))
- (when (and (<= 0 i) (< i (popup-height popup)))
- (setf (popup-cursor popup) i)
- (popup-draw popup)
- t))
-
-(defun popup-next (popup)
- "Select the next item of POPUP and draw."
- (let ((height (popup-height popup))
- (cursor (1+ (popup-cursor popup)))
- (scroll-top (popup-scroll-top popup))
- (length (length (popup-list popup))))
- (cond
- ((>= cursor length)
- ;; Back to first page
- (setq cursor 0
- scroll-top 0))
- ((= cursor (+ scroll-top height))
- ;; Go to next page
- (setq scroll-top (min (1+ scroll-top) (max (- length height) 0)))))
- (setf (popup-cursor popup) cursor
- (popup-scroll-top popup) scroll-top)
- (popup-draw popup)))
-
-(defun popup-previous (popup)
- "Select the previous item of POPUP and draw."
- (let ((height (popup-height popup))
- (cursor (1- (popup-cursor popup)))
- (scroll-top (popup-scroll-top popup))
- (length (length (popup-list popup))))
- (cond
- ((< cursor 0)
- ;; Go to last page
- (setq cursor (1- length)
- scroll-top (max (- length height) 0)))
- ((= cursor (1- scroll-top))
- ;; Go to previous page
- (cl-decf scroll-top)))
- (setf (popup-cursor popup) cursor
- (popup-scroll-top popup) scroll-top)
- (popup-draw popup)))
-
-(defun popup-page-next (popup)
- "Select next item of POPUP per `popup-height' range.
-Pages down through POPUP."
- (dotimes (counter (1- (popup-height popup)))
- (popup-next popup)))
-
-(defun popup-page-previous (popup)
- "Select previous item of POPUP per `popup-height' range.
-Pages up through POPUP."
- (dotimes (counter (1- (popup-height popup)))
- (popup-previous popup)))
-
-(defun popup-scroll-down (popup &optional n)
- "Scroll down N of POPUP and draw."
- (let ((scroll-top (min (+ (popup-scroll-top popup) (or n 1))
- (- (length (popup-list popup)) (popup-height popup)))))
- (setf (popup-cursor popup) scroll-top
- (popup-scroll-top popup) scroll-top)
- (popup-draw popup)))
-
-(defun popup-scroll-up (popup &optional n)
- "Scroll up N of POPUP and draw."
- (let ((scroll-top (max (- (popup-scroll-top popup) (or n 1))
- 0)))
- (setf (popup-cursor popup) scroll-top
- (popup-scroll-top popup) scroll-top)
- (popup-draw popup)))
-
-
-
-;;; Popup Incremental Search
-
-(defface popup-isearch-match
- '((t (:inherit default :background "sky blue")))
- "Popup isearch match face."
- :group 'popup)
-
-(defvar popup-isearch-cursor-color "blue")
-
-(defvar popup-isearch-keymap
- (let ((map (make-sparse-keymap)))
- ;;(define-key map "\r" 'popup-isearch-done)
- (define-key map "\C-g" 'popup-isearch-cancel)
- (define-key map "\C-b" 'popup-isearch-close)
- (define-key map [left] 'popup-isearch-close)
- (define-key map "\C-h" 'popup-isearch-delete)
- (define-key map (kbd "DEL") 'popup-isearch-delete)
- (define-key map (kbd "C-y") 'popup-isearch-yank)
- map))
-
-(defvar popup-menu-show-quick-help-function 'popup-menu-show-quick-help
- "Function used for showing quick help by `popup-menu*'.")
-
-(defcustom popup-isearch-regexp-builder-function #'regexp-quote
- "Function used to construct a regexp from a pattern. You may for instance
- provide a function that replaces spaces by '.+' if you like helm or ivy style
- of completion."
- :type 'function)
-
-(defsubst popup-isearch-char-p (char)
- (and (integerp char)
- (<= 32 char)
- (<= char 126)))
-
-(defun popup-isearch-filter-list (pattern list)
- (cl-loop with regexp = (funcall popup-isearch-regexp-builder-function pattern)
- for item in list
- do
- (unless (stringp item)
- (setq item (popup-item-propertize (popup-x-to-string item)
- 'value item)))
- if (string-match regexp item)
- collect
- (let ((beg (match-beginning 0))
- (end (match-end 0)))
- (alter-text-property 0 (length item) 'face
- (lambda (prop)
- (unless (eq prop 'popup-isearch-match)
- prop))
- item)
- (put-text-property beg end
- 'face 'popup-isearch-match
- item)
- item)))
-
-(defun popup-isearch-prompt (popup pattern)
- (format "Pattern: %s" (if (= (length (popup-list popup)) 0)
- (propertize pattern 'face 'isearch-fail)
- pattern)))
-
-(defun popup-isearch-update (popup filter pattern &optional callback)
- (setf (popup-cursor popup) 0
- (popup-scroll-top popup) 0
- (popup-pattern popup) pattern)
- (let ((list (funcall filter pattern (popup-original-list popup))))
- (popup-set-filtered-list popup list)
- (if callback
- (funcall callback list)))
- (popup-draw popup))
-
-(cl-defun popup-isearch (popup
- &key
- (filter 'popup-isearch-filter-list)
- (cursor-color popup-isearch-cursor-color)
- (keymap popup-isearch-keymap)
- callback
- help-delay)
- "Start isearch on POPUP. This function is synchronized, meaning
-event loop waits for quiting of isearch.
-
-FILTER is function with two argumenst to perform popup items filtering.
-
-CURSOR-COLOR is a cursor color during isearch. The default value
-is `popup-isearch-cursor-color'.
-
-KEYMAP is a keymap which is used when processing events during
-event loop. The default value is `popup-isearch-keymap'.
-
-CALLBACK is a function taking one argument. `popup-isearch' calls
-CALLBACK, if specified, after isearch finished or isearch
-canceled. The arguments is whole filtered list of items.
-
-HELP-DELAY is a delay of displaying helps."
- (let ((list (popup-original-list popup))
- (pattern (or (popup-pattern popup) ""))
- (old-cursor-color (frame-parameter (selected-frame) 'cursor-color))
- prompt key binding)
- (unwind-protect
- (cl-block nil
- (if cursor-color
- (set-cursor-color cursor-color))
- (while t
- (setq prompt (popup-isearch-prompt popup pattern))
- (setq key (popup-menu-read-key-sequence keymap prompt help-delay))
- (if (null key)
- (unless (funcall popup-menu-show-quick-help-function popup nil :prompt prompt)
- (clear-this-command-keys)
- (push (read-event prompt) unread-command-events))
- (setq binding (lookup-key keymap key))
- (cond
- ((and (stringp key)
- (popup-isearch-char-p (aref key 0)))
- (setq pattern (concat pattern key)))
- ((eq binding 'popup-isearch-done)
- (cl-return nil))
- ((eq binding 'popup-isearch-cancel)
- (popup-isearch-update popup filter "" callback)
- (cl-return t))
- ((eq binding 'popup-isearch-close)
- (popup-isearch-update popup filter "" callback)
- (setq unread-command-events
- (append (listify-key-sequence key) unread-command-events))
- (cl-return nil))
- ((eq binding 'popup-isearch-delete)
- (if (> (length pattern) 0)
- (setq pattern (substring pattern 0 (1- (length pattern))))))
- ((eq binding 'popup-isearch-yank)
- (popup-isearch-update popup filter (car kill-ring) callback)
- (cl-return nil))
- (t
- (setq unread-command-events
- (append (listify-key-sequence key) unread-command-events))
- (cl-return nil)))
- (popup-isearch-update popup filter pattern callback))))
- (if old-cursor-color
- (set-cursor-color old-cursor-color)))))
-
-
-
-;;; Popup Tip
-
-(defface popup-tip-face
- '((t (:background "khaki1" :foreground "black")))
- "Face for popup tip."
- :group 'popup)
-
-(defvar popup-tip-max-width 80)
-
-(cl-defun popup-tip (string
- &key
- point
- (around t)
- width
- (height 15)
- min-height
- max-width
- truncate
- margin
- margin-left
- margin-right
- scroll-bar
- parent
- parent-offset
- nowait
- nostrip
- prompt
- &aux tip lines)
- "Show a tooltip of STRING at POINT. This function is
-synchronized unless NOWAIT specified. Almost all arguments are
-the same as in `popup-create', except for TRUNCATE, NOWAIT, and
-PROMPT.
-
-If TRUNCATE is non-nil, the tooltip can be truncated.
-
-If NOWAIT is non-nil, this function immediately returns the
-tooltip instance without entering event loop.
-
-If `NOSTRIP` is non-nil, `STRING` properties are not stripped.
-
-PROMPT is a prompt string when reading events during event loop."
- (if (bufferp string)
- (setq string (with-current-buffer string (buffer-string))))
-
- (unless nostrip
- ;; TODO strip text (mainly face) properties
- (setq string (substring-no-properties string)))
-
- (and (eq margin t) (setq margin 1))
- (or margin-left (setq margin-left margin))
- (or margin-right (setq margin-right margin))
-
- (let ((it (popup-fill-string string width popup-tip-max-width)))
- (setq width (car it)
- lines (cdr it)))
-
- (setq tip (popup-create point width height
- :min-height min-height
- :max-width max-width
- :around around
- :margin-left margin-left
- :margin-right margin-right
- :scroll-bar scroll-bar
- :face 'popup-tip-face
- :parent parent
- :parent-offset parent-offset))
-
- (unwind-protect
- (when (> (popup-width tip) 0) ; not to be corrupted
- (when (and (not (eq width (popup-width tip))) ; truncated
- (not truncate))
- ;; Refill once again to lines be fitted to popup width
- (setq width (popup-width tip))
- (setq lines (cdr (popup-fill-string string width width))))
-
- (popup-set-list tip lines)
- (popup-draw tip)
- (if nowait
- tip
- (clear-this-command-keys)
- (push (read-event prompt) unread-command-events)
- t))
- (unless nowait
- (popup-delete tip))))
-
-
-
-;;; Popup Menu
-
-(defface popup-menu-face
- '((t (:inherit popup-face)))
- "Face for popup menu."
- :group 'popup)
-
-(defface popup-menu-mouse-face
- '((t (:background "blue" :foreground "white")))
- "Face for popup menu."
- :group 'popup)
-
-(defface popup-menu-selection-face
- '((t (:inherit default :background "steelblue" :foreground "white")))
- "Face for popup menu selection."
- :group 'popup)
-
-(defface popup-menu-summary-face
- '((t (:inherit popup-summary-face)))
- "Face for popup summary."
- :group 'popup)
-
-(defvar popup-menu-show-tip-function 'popup-tip
- "Function used for showing tooltip by `popup-menu-show-quick-help'.")
-
-(defun popup-menu-show-help (menu &optional persist item)
- (popup-item-show-help (or item (popup-selected-item menu)) persist))
-
-(defun popup-menu-documentation (menu &optional item)
- (popup-item-documentation (or item (popup-selected-item menu))))
-
-(defun popup-menu-show-quick-help (menu &optional item &rest args)
- (let* ((point (plist-get args :point))
- (height (or (plist-get args :height) (popup-height menu)))
- (min-height (min height (popup-current-height menu)))
- (around nil)
- (parent-offset (popup-offset menu))
- (doc (popup-menu-documentation menu item)))
- (when (stringp doc)
- (if (popup-hidden-p menu)
- (setq around t
- menu nil
- parent-offset nil)
- (setq point nil))
- (let ((popup-use-optimized-column-computation nil)) ; To avoid wrong positioning
- (apply popup-menu-show-tip-function
- doc
- :point point
- :height height
- :min-height min-height
- :around around
- :parent menu
- :parent-offset parent-offset
- args)))))
-
-(defun popup-menu-item-of-mouse-event (event)
- (when (and (consp event)
- (memq (cl-first event) '(mouse-1 mouse-2 mouse-3 mouse-4 mouse-5)))
- (let* ((position (cl-second event))
- (object (elt position 4)))
- (when (consp object)
- (get-text-property (cdr object) 'popup-item (car object))))))
-
-(defun popup-menu-read-key-sequence (keymap &optional prompt timeout)
- (catch 'timeout
- (let ((timer (and timeout
- (run-with-timer timeout nil
- (lambda ()
- (if (zerop (length (this-command-keys)))
- (throw 'timeout nil))))))
- (old-global-map (current-global-map))
- (temp-global-map (make-sparse-keymap))
- (overriding-terminal-local-map (make-sparse-keymap)))
- (substitute-key-definition 'keyboard-quit 'keyboard-quit
- temp-global-map old-global-map)
- (define-key temp-global-map [menu-bar] (lookup-key old-global-map [menu-bar]))
- (define-key temp-global-map [tool-bar] (lookup-key old-global-map [tool-bar]))
- (set-keymap-parent overriding-terminal-local-map keymap)
- (if (current-local-map)
- (define-key overriding-terminal-local-map [menu-bar]
- (lookup-key (current-local-map) [menu-bar])))
- (unwind-protect
- (progn
- (use-global-map temp-global-map)
- (clear-this-command-keys)
- (with-temp-message prompt
- (read-key-sequence nil)))
- (use-global-map old-global-map)
- (if timer (cancel-timer timer))))))
-
-(defun popup-menu-fallback (event default))
-
-(cl-defun popup-menu-event-loop (menu
- keymap
- fallback
- &key
- prompt
- help-delay
- isearch
- isearch-filter
- isearch-cursor-color
- isearch-keymap
- isearch-callback
- &aux key binding)
- (cl-block nil
- (while (popup-live-p menu)
- (and isearch
- (popup-isearch menu
- :filter isearch-filter
- :cursor-color isearch-cursor-color
- :keymap isearch-keymap
- :callback isearch-callback
- :help-delay help-delay)
- (keyboard-quit))
- (setq key (popup-menu-read-key-sequence keymap prompt help-delay))
- (setq binding (and key (lookup-key keymap key)))
- (cond
- ((or (null key) (zerop (length key)))
- (unless (funcall popup-menu-show-quick-help-function menu nil :prompt prompt)
- (clear-this-command-keys)
- (push (read-event prompt) unread-command-events)))
- ((eq (lookup-key (current-global-map) key) 'keyboard-quit)
- (keyboard-quit)
- (cl-return))
- ((eq binding 'popup-close)
- (if (popup-parent menu)
- (cl-return)))
- ((memq binding '(popup-select popup-open))
- (let* ((item (or (popup-menu-item-of-mouse-event (elt key 0))
- (popup-selected-item menu)))
- (index (cl-position item (popup-list menu)))
- (sublist (popup-item-sublist item)))
- (unless index (cl-return))
- (if sublist
- (popup-aif (let (popup-use-optimized-column-computation)
- (popup-cascade-menu sublist
- :around nil
- :margin-left (popup-margin-left menu)
- :margin-right (popup-margin-right menu)
- :scroll-bar (popup-scroll-bar menu)
- :parent menu
- :parent-offset index
- :help-delay help-delay
- :isearch isearch
- :isearch-filter isearch-filter
- :isearch-cursor-color isearch-cursor-color
- :isearch-keymap isearch-keymap
- :isearch-callback isearch-callback))
- (and it (cl-return it)))
- (if (eq binding 'popup-select)
- (cl-return (popup-item-value-or-self item))))))
- ((eq binding 'popup-next)
- (popup-next menu))
- ((eq binding 'popup-previous)
- (popup-previous menu))
- ((eq binding 'popup-page-next)
- (popup-page-next menu))
- ((eq binding 'popup-page-previous)
- (popup-page-previous menu))
- ((eq binding 'popup-help)
- (popup-menu-show-help menu))
- ((eq binding 'popup-isearch)
- (popup-isearch menu
- :filter isearch-filter
- :cursor-color isearch-cursor-color
- :keymap isearch-keymap
- :callback isearch-callback
- :help-delay help-delay))
- ((commandp binding)
- (call-interactively binding))
- (t
- (funcall fallback key (key-binding key)))))))
-
-(defun popup-preferred-width (list)
- "Return the preferred width to show LIST beautifully."
- (cl-loop with tab-width = 4
- for item in list
- for summary = (popup-item-summary item)
- maximize (string-width (popup-x-to-string item)) into width
- if (stringp summary)
- maximize (+ (string-width summary) 2) into summary-width
- finally return
- (let ((total (+ (or width 0) (or summary-width 0))))
- (* (ceiling (/ total 10.0)) 10))))
-
-(defvar popup-menu-keymap
- (let ((map (make-sparse-keymap)))
- (define-key map "\r" 'popup-select)
- (define-key map "\C-f" 'popup-open)
- (define-key map [right] 'popup-open)
- (define-key map "\C-b" 'popup-close)
- (define-key map [left] 'popup-close)
-
- (define-key map "\C-n" 'popup-next)
- (define-key map [down] 'popup-next)
- (define-key map "\C-p" 'popup-previous)
- (define-key map [up] 'popup-previous)
-
- (define-key map [next] 'popup-page-next)
- (define-key map [prior] 'popup-page-previous)
-
- (define-key map [f1] 'popup-help)
- (define-key map (kbd "\C-?") 'popup-help)
-
- (define-key map "\C-s" 'popup-isearch)
-
- (define-key map [mouse-1] 'popup-select)
- (define-key map [mouse-4] 'popup-previous)
- (define-key map [mouse-5] 'popup-next)
- map))
-
-(cl-defun popup-menu* (list
- &key
- point
- (around t)
- (width (popup-preferred-width list))
- (height 15)
- max-width
- margin
- margin-left
- margin-right
- scroll-bar
- symbol
- parent
- parent-offset
- cursor
- (keymap popup-menu-keymap)
- (fallback 'popup-menu-fallback)
- help-delay
- nowait
- prompt
- isearch
- (isearch-filter 'popup-isearch-filter-list)
- (isearch-cursor-color popup-isearch-cursor-color)
- (isearch-keymap popup-isearch-keymap)
- isearch-callback
- initial-index
- &aux menu event)
- "Show a popup menu of LIST at POINT. This function returns a
-value of the selected item. Almost all arguments are the same as in
-`popup-create', except for KEYMAP, FALLBACK, HELP-DELAY, PROMPT,
-ISEARCH, ISEARCH-FILTER, ISEARCH-CURSOR-COLOR, ISEARCH-KEYMAP, and
-ISEARCH-CALLBACK.
-
-If KEYMAP is a keymap which is used when processing events during
-event loop.
-
-If FALLBACK is a function taking two arguments; a key and a
-command. FALLBACK is called when no special operation is found on
-the key. The default value is `popup-menu-fallback', which does
-nothing.
-
-HELP-DELAY is a delay of displaying helps.
-
-If NOWAIT is non-nil, this function immediately returns the menu
-instance without entering event loop.
-
-PROMPT is a prompt string when reading events during event loop.
-
-If ISEARCH is non-nil, do isearch as soon as displaying the popup
-menu.
-
-ISEARCH-FILTER is a filtering function taking two arguments:
-search pattern and list of items. Returns a list of matching items.
-
-ISEARCH-CURSOR-COLOR is a cursor color during isearch. The
-default value is `popup-isearch-cursor-color'.
-
-ISEARCH-KEYMAP is a keymap which is used when processing events
-during event loop. The default value is `popup-isearch-keymap'.
-
-ISEARCH-CALLBACK is a function taking one argument. `popup-menu'
-calls ISEARCH-CALLBACK, if specified, after isearch finished or
-isearch canceled. The arguments is whole filtered list of items.
-
-If `INITIAL-INDEX' is non-nil, this is an initial index value for
-`popup-select'. Only positive integer is valid."
- (and (eq margin t) (setq margin 1))
- (or margin-left (setq margin-left margin))
- (or margin-right (setq margin-right margin))
- (if (and scroll-bar
- (integerp margin-right)
- (> margin-right 0))
- ;; Make scroll-bar space as margin-right
- (cl-decf margin-right))
- (setq menu (popup-create point width height
- :max-width max-width
- :around around
- :face 'popup-menu-face
- :mouse-face 'popup-menu-mouse-face
- :selection-face 'popup-menu-selection-face
- :summary-face 'popup-menu-summary-face
- :margin-left margin-left
- :margin-right margin-right
- :scroll-bar scroll-bar
- :symbol symbol
- :parent parent
- :parent-offset parent-offset))
- (unwind-protect
- (progn
- (popup-set-list menu list)
- (if cursor
- (popup-jump menu cursor)
- (popup-draw menu))
- (when initial-index
- (dotimes (_i (min (- (length list) 1) initial-index))
- (popup-next menu)))
- (if nowait
- menu
- (popup-menu-event-loop menu keymap fallback
- :prompt prompt
- :help-delay help-delay
- :isearch isearch
- :isearch-filter isearch-filter
- :isearch-cursor-color isearch-cursor-color
- :isearch-keymap isearch-keymap
- :isearch-callback isearch-callback)))
- (unless nowait
- (popup-delete menu))))
-
-(defun popup-cascade-menu (list &rest args)
- "Same as `popup-menu' except that an element of LIST can be
-also a sub-menu if the element is a cons cell formed (ITEM
-. SUBLIST) where ITEM is an usual item and SUBLIST is a list of
-the sub menu."
- (apply 'popup-menu*
- (mapcar (lambda (item)
- (if (consp item)
- (popup-make-item (car item)
- :sublist (cdr item)
- :symbol ">")
- item))
- list)
- :symbol t
- args))
-
-(provide 'popup)
-;;; popup.el ends here
diff --git a/elpa/powerline-20200105.2053/powerline-autoloads.el b/elpa/powerline-20200105.2053/powerline-autoloads.el
deleted file mode 100644
index 8053204..0000000
--- a/elpa/powerline-20200105.2053/powerline-autoloads.el
+++ /dev/null
@@ -1,101 +0,0 @@
-;;; powerline-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "powerline" "powerline.el" (0 0 0 0))
-;;; Generated autoloads from powerline.el
-
-(autoload 'powerline-hud "powerline" "\
-Return an XPM of relative buffer location using FACE1 and FACE2 of optional WIDTH.
-
-\(fn FACE1 FACE2 &optional WIDTH)" nil nil)
-
-(autoload 'powerline-mouse "powerline" "\
-Return mouse handler for CLICK-GROUP given CLICK-TYPE and STRING.
-
-\(fn CLICK-GROUP CLICK-TYPE STRING)" nil nil)
-
-(autoload 'powerline-concat "powerline" "\
-Concatonate STRINGS and pad sides by spaces.
-
-\(fn &rest STRINGS)" nil nil)
-
-(autoload 'defpowerline "powerline" "\
-Create function NAME by wrapping BODY with powerline padding an propetization.
-
-\(fn NAME BODY)" nil t)
-
-(autoload 'powerline-raw "powerline" "\
-Render STR as mode-line data using FACE and optionally PAD import on left (l) or right (r).
-
-\(fn STR &optional FACE PAD)" nil nil)
-
-(autoload 'powerline-fill "powerline" "\
-Return empty space using FACE and leaving RESERVE space on the right.
-
-\(fn FACE RESERVE)" nil nil)
- (autoload 'powerline-major-mode "powerline")
- (autoload 'powerline-minor-modes "powerline")
- (autoload 'powerline-narrow "powerline")
- (autoload 'powerline-vc "powerline")
- (autoload 'powerline-encoding "powerline")
- (autoload 'powerline-buffer-size "powerline")
- (autoload 'powerline-buffer-id "powerline")
- (autoload 'powerline-process "powerline")
- (autoload 'powerline-selected-window-active "powerline")
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "powerline" '("pl/" "powerline-")))
-
-;;;***
-
-;;;### (autoloads nil "powerline-separators" "powerline-separators.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from powerline-separators.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "powerline-separators" '("powerline-image-apple-rgb" "pl/")))
-
-;;;***
-
-;;;### (autoloads nil "powerline-themes" "powerline-themes.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from powerline-themes.el
-
-(autoload 'powerline-default-theme "powerline-themes" "\
-Setup the default mode-line.
-
-\(fn)" t nil)
-
-(autoload 'powerline-center-theme "powerline-themes" "\
-Setup a mode-line with major and minor modes centered.
-
-\(fn)" t nil)
-
-(autoload 'powerline-vim-theme "powerline-themes" "\
-Setup a Vim-like mode-line.
-
-\(fn)" t nil)
-
-(autoload 'powerline-nano-theme "powerline-themes" "\
-Setup a nano-like mode-line.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "powerline-themes" '("powerline-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("powerline-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; powerline-autoloads.el ends here
diff --git a/elpa/powerline-20200105.2053/powerline-pkg.el b/elpa/powerline-20200105.2053/powerline-pkg.el
deleted file mode 100644
index c685d29..0000000
--- a/elpa/powerline-20200105.2053/powerline-pkg.el
+++ /dev/null
@@ -1,12 +0,0 @@
-(define-package "powerline" "20200105.2053" "Rewrite of Powerline"
- '((cl-lib "0.2"))
- :commit "edbb464eef680efc9d408730288c716cd4cac404" :keywords
- '("mode-line")
- :authors
- '(("Donald Ephraim Curtis" . "dcurtis@milkbox.net"))
- :maintainer
- '("Donald Ephraim Curtis" . "dcurtis@milkbox.net")
- :url "http://github.com/milkypostman/powerline/")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/powerline-20200105.2053/powerline-separators.el b/elpa/powerline-20200105.2053/powerline-separators.el
deleted file mode 100644
index ee560d4..0000000
--- a/elpa/powerline-20200105.2053/powerline-separators.el
+++ /dev/null
@@ -1,635 +0,0 @@
-;;; powerline-separators.el --- Separators for Powerline
-
-;; Copyright (C) 2012-2013 Donald Ephraim Curtis
-;; Copyright (C) 2013 Jason Milkins
-;; Copyright (C) 2012 Nicolas Rougier
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; Separators for Powerline.
-;; Included separators: alternate, arrow, arrow-fade, bar, box, brace, butt,
-;; chamfer, contour, curve, rounded, roundstub, slant, wave, zigzag, and nil.
-;;
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'color)
-
-(defvar powerline-image-apple-rgb
- (and (eq (window-system) 'ns)
- ns-use-srgb-colorspace
- (< 11
- (string-to-number
- (and (string-match "darwin\\([0-9]+\\)" system-configuration)
- (match-string-no-properties 1 system-configuration)))))
- "Boolean variable to determine whether to use Apple RGB colorspace to render images.
-
-t on macOS 10.7+ and `ns-use-srgb-colorspace' is t, nil otherwise.
-
-This variable is automatically set, there's no need to modify it.")
-
-(defun pl/interpolate (color1 color2)
- "Interpolate between COLOR1 and COLOR2.
-
-COLOR1 and COLOR2 must be supplied as hex strings with a leading #."
- (let* ((c1 (color-name-to-rgb color1))
- (c2 (color-name-to-rgb color2))
- (red (/ (+ (nth 0 c1) (nth 0 c2)) 2))
- (green (/ (+ (nth 1 c1) (nth 1 c2)) 2))
- (blue (/ (+ (nth 2 c1) (nth 2 c2)) 2)))
- (color-rgb-to-hex red green blue)))
-
-(defun pl/color-xyz-to-apple-rgb (X Y Z)
- "Convert CIE X Y Z colors to Apple RGB color space."
- (let ((r (+ (* 3.2404542 X) (* -1.5371385 Y) (* -0.4985314 Z)))
- (g (+ (* -0.9692660 X) (* 1.8760108 Y) (* 0.0415560 Z)))
- (b (+ (* 0.0556434 X) (* -0.2040259 Y) (* 1.0572252 Z))))
- (list (expt r (/ 1.8)) (expt g (/ 1.8)) (expt b (/ 1.8)))))
-
-(defun pl/color-srgb-to-apple-rgb (red green blue)
- "Convert RED GREEN BLUE colors from sRGB color space to Apple RGB.
-RED, GREEN and BLUE should be between 0.0 and 1.0, inclusive."
- (apply 'pl/color-xyz-to-apple-rgb (color-srgb-to-xyz red green blue)))
-
-(defun pl/hex-color (color)
- "Get the hexadecimal value of COLOR."
- (when color
- (let ((srgb-color (color-name-to-rgb color)))
- (if powerline-image-apple-rgb
- (apply 'color-rgb-to-hex (apply 'pl/color-srgb-to-apple-rgb srgb-color))
- (apply 'color-rgb-to-hex srgb-color)))))
-
-(defun pl/pattern (lst)
- "Turn LST into an infinite pattern."
- (when lst
- (let ((pattern (cl-copy-list lst)))
- (setcdr (last pattern) pattern))))
-
-(defun pl/pattern-to-string (pattern)
- "Convert a PATTERN into a string that can be used in an XPM."
- (concat "\"" (mapconcat 'number-to-string pattern "") "\","))
-
-(defun pl/reverse-pattern (pattern)
- "Reverse each line in PATTERN."
- (mapcar 'reverse pattern))
-
-(defun pl/row-pattern (fill total &optional fade)
- "Make a list that has FILL 0s out of TOTAL 1s with FADE 2s to the right of the fill."
- (unless fade
- (setq fade 0))
- (let ((fill (min fill total))
- (fade (min fade (max (- total fill) 0))))
- (append (make-list fill 0)
- (make-list fade 2)
- (make-list (- total fill fade) 1))))
-
-(defun pl/pattern-bindings-body (patterns height-exp pattern-height-sym
- second-pattern-height-sym)
- "Create let-var bindings and a function body from PATTERNS.
-The `car' and `cdr' parts of the result can be passed to the
-function `pl/wrap-defun' as its `let-vars' and `body' arguments,
-respectively. HEIGHT-EXP is an expression calculating the image
-height and it should contain a free variable `height'.
-PATTERN-HEIGHT-SYM and SECOND-PATTERN-HEIGHT-SYM are symbols used
-for let-var binding variables."
- (let* ((pattern (pl/pattern (mapcar 'pl/pattern-to-string (car patterns))))
- (header (mapcar 'pl/pattern-to-string (nth 1 patterns)))
- (footer (mapcar 'pl/pattern-to-string (nth 2 patterns)))
- (second-pattern (pl/pattern (mapcar 'pl/pattern-to-string (nth 3 patterns))))
- (center (mapcar 'pl/pattern-to-string (nth 4 patterns)))
- (reserve (+ (length header) (length footer) (length center))))
- (when pattern
- (cons `((,pattern-height-sym (max (- ,height-exp ,reserve) 0))
- (,second-pattern-height-sym (/ ,pattern-height-sym 2))
- (,pattern-height-sym ,(if second-pattern `(ceiling ,pattern-height-sym 2) `,pattern-height-sym)))
- (list (when header `(mapconcat 'identity ',header ""))
- `(mapconcat 'identity
- (cl-subseq ',pattern 0 ,pattern-height-sym) "")
- (when center `(mapconcat 'identity ',center ""))
- (when second-pattern
- `(mapconcat 'identity
- (cl-subseq ',second-pattern
- 0 ,second-pattern-height-sym) ""))
- (when footer `(mapconcat 'identity ',footer "")))))))
-
-(defun pl/pattern-defun (name dir width &rest patterns)
- "Create a powerline function of NAME in DIR with WIDTH for PATTERNS.
-
-PATTERNS is of the form (PATTERN HEADER FOOTER SECOND-PATTERN CENTER
-PATTERN-2X HEADER-2X FOOTER-2X SECOND-PATTERN-2X CENTER-2X).
-PATTERN is required, all other components are optional.
-The first 5 components are for the standard resolution image.
-The remaining ones are for the high resolution image where both
-width and height are doubled. If PATTERN-2X is nil or not given,
-then the remaining components are ignored and the standard
-resolution image with magnification and interpolation will be
-used in high resolution environments
-
-All generated functions generate the form:
-HEADER
-PATTERN ...
-CENTER
-SECOND-PATTERN ...
-FOOTER
-
-PATTERN and SECOND-PATTERN repeat infinitely to fill the space needed to generate a full height XPM.
-
-PATTERN, HEADER, FOOTER, SECOND-PATTERN, CENTER are of the form ((COLOR ...) (COLOR ...) ...).
-
-COLOR can be one of 0, 1, or 2, where 0 is the source color, 1 is the
-destination color, and 2 is the interpolated color between 0 and 1."
- (when (eq dir 'right)
- (setq patterns (mapcar 'pl/reverse-pattern patterns)))
- (let ((bindings-body (pl/pattern-bindings-body patterns
- 'height
- 'pattern-height
- 'second-pattern-height))
- (bindings-body-2x (pl/pattern-bindings-body (nthcdr 5 patterns)
- '(* height 2)
- 'pattern-height-2x
- 'second-pattern-height-2x)))
- (pl/wrap-defun name dir width
- (append (car bindings-body) (car bindings-body-2x))
- (cdr bindings-body) (cdr bindings-body-2x))))
-
-(defun pl/background-color (face)
- (face-attribute face
- (if (face-attribute face :inverse-video nil 'default)
- :foreground
- :background)
- nil
- 'default))
-
-(defun pl/wrap-defun (name dir width let-vars body &optional body-2x)
- "Generate a powerline function of NAME in DIR with WIDTH using LET-VARS and BODY."
- (let* ((src-face (if (eq dir 'left) 'face1 'face2))
- (dst-face (if (eq dir 'left) 'face2 'face1)))
- `(defun ,(intern (format "powerline-%s-%s" name (symbol-name dir)))
- (face1 face2 &optional height)
- (when window-system
- (unless height (setq height (pl/separator-height)))
- (let* ,(append `((color1 (when ,src-face
- (pl/hex-color (pl/background-color ,src-face))))
- (color2 (when ,dst-face
- (pl/hex-color (pl/background-color ,dst-face))))
- (colori (when (and color1 color2) (pl/interpolate color1 color2)))
- (color1 (or color1 "None"))
- (color2 (or color2 "None"))
- (colori (or colori "None")))
- let-vars)
- (apply 'create-image
- ,(append `(concat (format "/* XPM */ static char * %s_%s[] = { \"%s %s 3 1\", \"0 c %s\", \"1 c %s\", \"2 c %s\","
- ,(replace-regexp-in-string "-" "_" name)
- (symbol-name ',dir)
- ,width
- height
- color1
- color2
- colori))
- body
- '("};"))
- 'xpm t
- :ascent 'center
- :face (when (and face1 face2)
- ,dst-face)
- ,(and body-2x
- `(and (featurep 'mac)
- (list :data-2x
- ,(append `(concat (format "/* XPM */ static char * %s_%s_2x[] = { \"%s %s 3 1\", \"0 c %s\", \"1 c %s\", \"2 c %s\","
- ,(replace-regexp-in-string "-" "_" name)
- (symbol-name ',dir)
- (* ,width 2)
- (* height 2)
- color1
- color2
- colori))
- body-2x
- '("};")))))))))))
-
-(defmacro pl/alternate (dir)
- "Generate an alternating pattern XPM function for DIR."
- (pl/pattern-defun "alternate" dir 4
- '((2 2 1 1)
- (0 0 2 2))
- nil nil nil nil
- ;; 2x
- '((2 2 2 2 1 1 1 1)
- (2 2 2 2 1 1 1 1)
- (0 0 0 0 2 2 2 2)
- (0 0 0 0 2 2 2 2))))
-
-(defmacro pl/arrow (dir)
- "Generate an arrow XPM function for DIR."
- (let ((row-modifier (if (eq dir 'left) 'identity 'reverse)))
- (pl/wrap-defun "arrow" dir 'middle-width
- '((width (1- (/ height 2)))
- (middle-width (1- (ceiling height 2))))
- `((cl-loop for i from 0 to width
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width))))
- (when (cl-oddp height)
- (pl/pattern-to-string (make-list middle-width 0)))
- (cl-loop for i from width downto 0
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width)))))
- `((when (cl-evenp height)
- (pl/pattern-to-string (make-list (* middle-width 2) 1)))
- (cl-loop for i from 0 to (* middle-width 2)
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2)))))
- (cl-loop for i from (* middle-width 2) downto 0
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2)))))
- (when (cl-evenp height)
- (pl/pattern-to-string (make-list (* middle-width 2) 1)))))))
-
-(defmacro pl/arrow-fade (dir)
- "Generate an arrow-fade XPM function for DIR."
- (let* ((row-modifier (if (eq dir 'left) 'identity 'reverse)))
- (pl/wrap-defun "arrow-fade" dir 'middle-width
- '((width (1- (/ height 2)))
- (middle-width (1+ (ceiling height 2))))
- `((cl-loop for i from 0 to width
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width 2))))
- (when (cl-oddp height)
- (pl/pattern-to-string (,row-modifier (pl/row-pattern (1+ width) middle-width 2))))
- (cl-loop for i from width downto 0
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width 2)))))
- `((when (cl-evenp height)
- (pl/pattern-to-string (,row-modifier (pl/row-pattern 0 (* middle-width 2) (* 2 2)))))
- (cl-loop for i from 0 to (* (- middle-width 2) 2)
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2) (* 2 2)))))
- (cl-loop for i from (* (- middle-width 2) 2) downto 0
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2) (* 2 2)))))
- (when (cl-evenp height)
- (pl/pattern-to-string (,row-modifier (pl/row-pattern 0 (* middle-width 2) (* 2 2)))))))))
-
-(defmacro pl/bar (dir)
- "Generate a bar XPM function for DIR."
- (pl/pattern-defun "bar" dir 2
- '((2 2))))
-
-(defmacro pl/box (dir)
- "Generate a box XPM function for DIR."
- (pl/pattern-defun "box" dir 2
- '((0 0)
- (0 0)
- (1 1)
- (1 1))
- nil nil nil nil
- ;; 2x
- '((0 0 0 0)
- (0 0 0 0)
- (0 0 0 0)
- (0 0 0 0)
- (1 1 1 1)
- (1 1 1 1)
- (1 1 1 1)
- (1 1 1 1))))
-
-(defmacro pl/brace (dir)
- "Generate a brace XPM function for DIR."
- (pl/pattern-defun "brace" dir 4
- '((0 1 1 1))
- '((1 1 1 1)
- (2 1 1 1))
- '((2 1 1 1)
- (1 1 1 1))
- '((0 1 1 1))
- '((0 2 1 1)
- (0 2 1 1)
- (0 0 2 1)
- (0 0 0 0)
- (0 0 2 1)
- (0 2 1 1)
- (0 2 1 1))
- ;; 2x
- '((0 0 1 1 1 1 1 1))
- '((1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1)
- (2 1 1 1 1 1 1 1)
- (0 2 1 1 1 1 1 1))
- '((0 2 1 1 1 1 1 1)
- (2 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1))
- '((0 0 1 1 1 1 1 1))
- '((0 0 2 1 1 1 1 1)
- (0 0 0 1 1 1 1 1)
- (0 0 0 2 1 1 1 1)
- (0 0 0 0 1 1 1 1)
- (0 0 0 0 2 1 1 1)
- (0 0 0 0 0 2 1 1)
- (0 0 0 0 0 0 0 2)
- (0 0 0 0 0 0 0 2)
- (0 0 0 0 0 2 1 1)
- (0 0 0 0 2 1 1 1)
- (0 0 0 0 1 1 1 1)
- (0 0 0 2 1 1 1 1)
- (0 0 0 1 1 1 1 1)
- (0 0 2 1 1 1 1 1))))
-
-(defmacro pl/butt (dir)
- "Generate a butt XPM function for DIR."
- (pl/pattern-defun "butt" dir 3
- '((0 0 0))
- '((1 1 1)
- (0 1 1)
- (0 0 1))
- '((0 0 1)
- (0 1 1)
- (1 1 1))
- nil nil
- ;; 2x
- '((0 0 0 0 0 0))
- '((1 1 1 1 1 1)
- (0 1 1 1 1 1)
- (0 0 1 1 1 1)
- (0 0 0 1 1 1)
- (0 0 0 0 1 1)
- (0 0 0 0 0 1))
- '((0 0 0 0 0 1)
- (0 0 0 0 1 1)
- (0 0 0 1 1 1)
- (0 0 1 1 1 1)
- (0 1 1 1 1 1)
- (1 1 1 1 1 1))))
-
-(defmacro pl/chamfer (dir)
- "Generate a chamfer XPM function for DIR."
- (pl/pattern-defun "chamfer" dir 3
- '((0 0 0))
- '((1 1 1)
- (0 1 1)
- (0 0 1))
- nil nil nil
- ;; 2x
- '((0 0 0 0 0 0))
- '((1 1 1 1 1 1)
- (0 1 1 1 1 1)
- (0 0 1 1 1 1)
- (0 0 0 1 1 1)
- (0 0 0 0 1 1)
- (0 0 0 0 0 1))))
-
-(defmacro pl/contour (dir)
- "Generate a contour XPM function for DIR."
- (pl/pattern-defun "contour" dir 10
- '((0 0 0 0 0 1 1 1 1 1))
- '((1 1 1 1 1 1 1 1 1 1)
- (0 2 1 1 1 1 1 1 1 1)
- (0 0 2 1 1 1 1 1 1 1)
- (0 0 0 2 1 1 1 1 1 1)
- (0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 2 1 1 1 1 1))
- '((0 0 0 0 0 2 1 1 1 1)
- (0 0 0 0 0 0 1 1 1 1)
- (0 0 0 0 0 0 2 1 1 1)
- (0 0 0 0 0 0 0 2 1 1)
- (0 0 0 0 0 0 0 0 0 0))
- nil nil
- ;; 2x
- '((0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1))
- '((1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1))
- '((0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))))
-
-(defmacro pl/curve (dir)
- "Generate a curve XPM function for DIR."
- (pl/pattern-defun "curve" dir 4
- '((0 0 0 0))
- '((1 1 1 1)
- (2 1 1 1)
- (0 0 1 1)
- (0 0 2 1)
- (0 0 0 1)
- (0 0 0 2))
- '((0 0 0 2)
- (0 0 0 1)
- (0 0 2 1)
- (0 0 1 1)
- (2 1 1 1)
- (1 1 1 1))
- nil nil
- ;; 2x
- '((0 0 0 0 0 0 0 0))
- '((1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1)
- (0 0 1 1 1 1 1 1)
- (0 0 0 2 1 1 1 1)
- (0 0 0 0 2 1 1 1)
- (0 0 0 0 0 2 1 1)
- (0 0 0 0 0 0 1 1)
- (0 0 0 0 0 0 1 1)
- (0 0 0 0 0 0 0 1)
- (0 0 0 0 0 0 0 1)
- (0 0 0 0 0 0 0 1))
- '((0 0 0 0 0 0 0 1)
- (0 0 0 0 0 0 0 1)
- (0 0 0 0 0 0 0 1)
- (0 0 0 0 0 0 1 1)
- (0 0 0 0 0 0 1 1)
- (0 0 0 0 0 2 1 1)
- (0 0 0 0 2 1 1 1)
- (0 0 0 2 1 1 1 1)
- (0 0 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1)
- (1 1 1 1 1 1 1 1))))
-
-(defmacro pl/rounded (dir)
- "Generate a rounded XPM function for DIR."
- (pl/pattern-defun "rounded" dir 6
- '((0 0 0 0 0 0))
- '((2 1 1 1 1 1)
- (0 0 2 1 1 1)
- (0 0 0 0 1 1)
- (0 0 0 0 2 1)
- (0 0 0 0 0 1)
- (0 0 0 0 0 2))
- nil nil nil
- ;; 2x
- '((0 0 0 0 0 0 0 0 0 0 0 0))
- '((1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 2 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 2 1 1 1 1)
- (0 0 0 0 0 0 0 0 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 1 1)
- (0 0 0 0 0 0 0 0 0 0 1 1)
- (0 0 0 0 0 0 0 0 0 0 2 1)
- (0 0 0 0 0 0 0 0 0 0 0 1)
- (0 0 0 0 0 0 0 0 0 0 0 1))))
-
-(defmacro pl/roundstub (dir)
- "Generate a roundstub XPM function for DIR."
- (pl/pattern-defun "roundstub" dir 3
- '((0 0 0))
- '((1 1 1)
- (0 0 1)
- (0 0 2))
- '((0 0 2)
- (0 0 1)
- (1 1 1))
- nil nil
- ;; 2x
- '((0 0 0 0 0 0))
- '((1 1 1 1 1 1)
- (2 1 1 1 1 1)
- (0 0 0 2 1 1)
- (0 0 0 0 1 1)
- (0 0 0 0 0 1)
- (0 0 0 0 0 1))
- '((0 0 0 0 0 1)
- (0 0 0 0 0 1)
- (0 0 0 0 1 1)
- (0 0 0 2 1 1)
- (2 1 1 1 1 1)
- (1 1 1 1 1 1))))
-
-(defmacro pl/slant (dir)
- "Generate a slant XPM function for DIR."
- (let* ((row-modifier (if (eq dir 'left) 'identity 'reverse)))
- (pl/wrap-defun "slant" dir 'width
- '((width (1- (ceiling height 2))))
- `((cl-loop for i from 0 to (1- height)
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern (/ i 2) width)))))
- `((cl-loop for i from 0 to (1- (* height 2))
- concat (pl/pattern-to-string (,row-modifier (pl/row-pattern (/ i 2) (* width 2)))))))))
-
-(defmacro pl/wave (dir)
- "Generate a wave XPM function for DIR."
- (pl/pattern-defun "wave" dir 11
- '((0 0 0 0 0 0 1 1 1 1 1))
- '((2 1 1 1 1 1 1 1 1 1 1)
- (0 0 1 1 1 1 1 1 1 1 1)
- (0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 2 1 1 1 1 1 1 1)
- (0 0 0 0 1 1 1 1 1 1 1)
- (0 0 0 0 2 1 1 1 1 1 1)
- (0 0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 0 2 1 1 1 1 1))
- '((0 0 0 0 0 0 2 1 1 1 1)
- (0 0 0 0 0 0 0 1 1 1 1)
- (0 0 0 0 0 0 0 1 1 1 1)
- (0 0 0 0 0 0 0 2 1 1 1)
- (0 0 0 0 0 0 0 0 1 1 1)
- (0 0 0 0 0 0 0 0 2 1 1)
- (0 0 0 0 0 0 0 0 0 0 2))
- nil nil
- ;; 2x
- '((0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1))
- '((1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1))
- '((0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1)
- (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))))
-
-(defmacro pl/zigzag (dir)
- "Generate a zigzag pattern XPM function for DIR."
- (pl/pattern-defun "zigzag" dir 3
- '((1 1 1)
- (0 1 1)
- (0 0 1)
- (0 0 0)
- (0 0 1)
- (0 1 1))
- nil nil nil nil
- ;; 2x
- '((1 1 1 1 1 1)
- (0 1 1 1 1 1)
- (0 0 1 1 1 1)
- (0 0 0 1 1 1)
- (0 0 0 0 1 1)
- (0 0 0 0 0 1)
- (0 0 0 0 0 0)
- (0 0 0 0 0 1)
- (0 0 0 0 1 1)
- (0 0 0 1 1 1)
- (0 0 1 1 1 1)
- (0 1 1 1 1 1))))
-
-(defmacro pl/nil (dir)
- "Generate a XPM function that returns nil for DIR."
- `(defun ,(intern (format "powerline-nil-%s" (symbol-name dir)))
- (face1 face2 &optional height)
- nil))
-
-(defmacro pl/utf-8 (dir)
- "Generate function that returns raw utf-8 symbols."
- (let ((dir-name (symbol-name dir))
- (src-face (if (eq dir 'left) 'face1 'face2))
- (dst-face (if (eq dir 'left) 'face2 'face1)))
- `(defun ,(intern (format "powerline-utf-8-%s" dir-name))
- (face1 face2 &optional height)
- (powerline-raw
- (char-to-string ,(intern (format "powerline-utf-8-separator-%s"
- dir-name)))
- (list :foreground (pl/background-color ,src-face)
- :background (pl/background-color ,dst-face)
- :inverse-video nil)))))
-
-
-(provide 'powerline-separators)
-
-;;; powerline-separators.el ends here
diff --git a/elpa/powerline-20200105.2053/powerline-themes.el b/elpa/powerline-20200105.2053/powerline-themes.el
deleted file mode 100644
index 20b43e3..0000000
--- a/elpa/powerline-20200105.2053/powerline-themes.el
+++ /dev/null
@@ -1,294 +0,0 @@
-;;; powerline-themes.el --- Themes for Powerline
-
-;; Copyright (C) 2012-2013 Donald Ephraim Curtis
-;; Copyright (C) 2013 Jason Milkins
-;; Copyright (C) 2012 Nicolas Rougier
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; Themes for Powerline.
-;; Included themes: default, center, center-evil, vim, and nano.
-;;
-
-;;; Code:
-
-(defcustom powerline-display-buffer-size t
- "When non-nil, display the buffer size."
- :group 'powerline
- :type 'boolean)
-
-(defcustom powerline-display-mule-info t
- "When non-nil, display the mule info."
- :group 'powerline
- :type 'boolean)
-
-(defcustom powerline-display-hud t
- "When non-nil, display the hud."
- :group 'powerline
- :type 'boolean)
-
-;;;###autoload
-(defun powerline-default-theme ()
- "Setup the default mode-line."
- (interactive)
- (setq-default mode-line-format
- '("%e"
- (:eval
- (let* ((active (powerline-selected-window-active))
- (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
- (mode-line (if active 'mode-line 'mode-line-inactive))
- (face0 (if active 'powerline-active0 'powerline-inactive0))
- (face1 (if active 'powerline-active1 'powerline-inactive1))
- (face2 (if active 'powerline-active2 'powerline-inactive2))
- (separator-left (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (car powerline-default-separator-dir))))
- (separator-right (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (cdr powerline-default-separator-dir))))
- (lhs (list (powerline-raw "%*" face0 'l)
- (when powerline-display-buffer-size
- (powerline-buffer-size face0 'l))
- (when powerline-display-mule-info
- (powerline-raw mode-line-mule-info face0 'l))
- (powerline-buffer-id `(mode-line-buffer-id ,face0) 'l)
- (when (and (boundp 'which-func-mode) which-func-mode)
- (powerline-raw which-func-format face0 'l))
- (powerline-raw " " face0)
- (funcall separator-left face0 face1)
- (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
- (powerline-raw erc-modified-channels-object face1 'l))
- (powerline-major-mode face1 'l)
- (powerline-process face1)
- (powerline-minor-modes face1 'l)
- (powerline-narrow face1 'l)
- (powerline-raw " " face1)
- (funcall separator-left face1 face2)
- (powerline-vc face2 'r)
- (when (bound-and-true-p nyan-mode)
- (powerline-raw (list (nyan-create)) face2 'l))))
- (rhs (list (powerline-raw global-mode-string face2 'r)
- (funcall separator-right face2 face1)
- (unless window-system
- (powerline-raw (char-to-string #xe0a1) face1 'l))
- (powerline-raw "%4l" face1 'l)
- (powerline-raw ":" face1 'l)
- (powerline-raw "%3c" face1 'r)
- (funcall separator-right face1 face0)
- (powerline-raw " " face0)
- (powerline-raw "%6p" face0 'r)
- (when powerline-display-hud
- (powerline-hud face0 face2))
- (powerline-fill face0 0)
- )))
- (concat (powerline-render lhs)
- (powerline-fill face2 (powerline-width rhs))
- (powerline-render rhs)))))))
-
-;;;###autoload
-(defun powerline-center-theme ()
- "Setup a mode-line with major and minor modes centered."
- (interactive)
- (setq-default mode-line-format
- '("%e"
- (:eval
- (let* ((active (powerline-selected-window-active))
- (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
- (mode-line (if active 'mode-line 'mode-line-inactive))
- (face0 (if active 'powerline-active0 'powerline-inactive0))
- (face1 (if active 'powerline-active1 'powerline-inactive1))
- (face2 (if active 'powerline-active2 'powerline-inactive2))
- (separator-left (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (car powerline-default-separator-dir))))
- (separator-right (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (cdr powerline-default-separator-dir))))
- (lhs (list (powerline-raw "%*" face0 'l)
- (when powerline-display-buffer-size
- (powerline-buffer-size face0 'l))
- (powerline-buffer-id `(mode-line-buffer-id ,face0) 'l)
- (powerline-raw " " face0)
- (funcall separator-left face0 face1)
- (powerline-narrow face1 'l)
- (powerline-vc face1)))
- (rhs (list (powerline-raw global-mode-string face1 'r)
- (powerline-raw "%4l" face1 'r)
- (powerline-raw ":" face1)
- (powerline-raw "%3c" face1 'r)
- (funcall separator-right face1 face0)
- (powerline-raw " " face0)
- (powerline-raw "%6p" face0 'r)
- (when powerline-display-hud
- (powerline-hud face2 face1))
- (powerline-fill face0 0)))
- (center (list (powerline-raw " " face1)
- (funcall separator-left face1 face2)
- (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
- (powerline-raw erc-modified-channels-object face2 'l))
- (powerline-major-mode face2 'l)
- (powerline-process face2)
- (powerline-raw " :" face2)
- (powerline-minor-modes face2 'l)
- (powerline-raw " " face2)
- (funcall separator-right face2 face1))))
- (concat (powerline-render lhs)
- (powerline-fill-center face1 (/ (powerline-width center) 2.0))
- (powerline-render center)
- (powerline-fill face1 (powerline-width rhs))
- (powerline-render rhs)))))))
-
-(defun powerline-center-evil-theme ()
- "Setup a mode-line with major, evil, and minor modes centered."
- (interactive)
- (setq-default mode-line-format
- '("%e"
- (:eval
- (let* ((active (powerline-selected-window-active))
- (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
- (mode-line (if active 'mode-line 'mode-line-inactive))
- (face0 (if active 'powerline-active0 'powerline-inactive0))
- (face1 (if active 'powerline-active1 'powerline-inactive1))
- (face2 (if active 'powerline-active2 'powerline-inactive2))
- (separator-left (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (car powerline-default-separator-dir))))
- (separator-right (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (cdr powerline-default-separator-dir))))
- (lhs (list (powerline-raw "%*" face0 'l)
- (when powerline-display-buffer-size
- (powerline-buffer-size face0 'l))
- (powerline-buffer-id `(mode-line-buffer-id ,face0) 'l)
- (powerline-raw " " face0)
- (funcall separator-left face0 face1)
- (powerline-narrow face1 'l)
- (powerline-vc face1)))
- (rhs (list (powerline-raw global-mode-string face1 'r)
- (powerline-raw "%4l" face1 'r)
- (powerline-raw ":" face1)
- (powerline-raw "%3c" face1 'r)
- (funcall separator-right face1 face0)
- (powerline-raw " " face0)
- (powerline-raw "%6p" face0 'r)
- (when powerline-display-hud
- (powerline-hud face2 face1))))
- (center (append (list (powerline-raw " " face1)
- (funcall separator-left face1 face2)
- (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
- (powerline-raw erc-modified-channels-object face2 'l))
- (powerline-major-mode face2 'l)
- (powerline-process face2)
- (powerline-raw " " face2))
- (if (split-string (format-mode-line minor-mode-alist))
- (append (if evil-mode
- (list (funcall separator-right face2 face1)
- (powerline-raw evil-mode-line-tag face1 'l)
- (powerline-raw " " face1)
- (funcall separator-left face1 face2)))
- (list (powerline-minor-modes face2 'l)
- (powerline-raw " " face2)
- (funcall separator-right face2 face1)))
- (list (powerline-raw evil-mode-line-tag face2)
- (funcall separator-right face2 face1))))))
- (concat (powerline-render lhs)
- (powerline-fill-center face1 (/ (powerline-width center) 2.0))
- (powerline-render center)
- (powerline-fill face1 (powerline-width rhs))
- (powerline-render rhs)))))))
-
-;;;###autoload
-(defun powerline-vim-theme ()
- "Setup a Vim-like mode-line."
- (interactive)
- (setq-default mode-line-format
- '("%e"
- (:eval
- (let* ((active (powerline-selected-window-active))
- (mode-line (if active 'mode-line 'mode-line-inactive))
- (face0 (if active 'powerline-active0 'powerline-inactive0))
- (face1 (if active 'powerline-active1 'powerline-inactive1))
- (face2 (if active 'powerline-active2 'powerline-inactive2))
- (separator-left (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (car powerline-default-separator-dir))))
- (separator-right (intern (format "powerline-%s-%s"
- (powerline-current-separator)
- (cdr powerline-default-separator-dir))))
- (lhs (list (powerline-buffer-id `(mode-line-buffer-id ,face0) 'l)
- (powerline-raw "[" face0 'l)
- (powerline-major-mode face0)
- (powerline-process face0)
- (powerline-raw "]" face0)
- (when (buffer-modified-p)
- (powerline-raw "[+]" face0))
- (when buffer-read-only
- (powerline-raw "[RO]" face0))
- (powerline-raw "[%z]" face0)
- ;; (powerline-raw (concat "[" (mode-line-eol-desc) "]") face0)
- (when (and (boundp 'which-func-mode) which-func-mode)
- (powerline-raw which-func-format nil 'l))
- (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
- (powerline-raw erc-modified-channels-object face1 'l))
- (powerline-raw "[" face0 'l)
- (powerline-minor-modes face0)
- (powerline-raw "%n" face0)
- (powerline-raw "]" face0)
- (when (and vc-mode buffer-file-name)
- (let ((backend (vc-backend buffer-file-name)))
- (when backend
- (concat (powerline-raw "[" face0 'l)
- (powerline-raw (format "%s / %s" backend (vc-working-revision buffer-file-name backend)) face0)
- (powerline-raw "]" face0)))))))
- (rhs (list (powerline-raw '(10 "%i") face0)
- (powerline-raw global-mode-string face0 'r)
- (powerline-raw "%l," face0 'l)
- (powerline-raw (format-mode-line '(10 "%c")) face0)
- (powerline-raw (replace-regexp-in-string "%" "%%" (format-mode-line '(-3 "%p"))) face0 'r)
- (powerline-fill face0 0))))
- (concat (powerline-render lhs)
- (powerline-fill face0 (powerline-width rhs))
- (powerline-render rhs)))))))
-
-;;;###autoload
-(defun powerline-nano-theme ()
- "Setup a nano-like mode-line."
- (interactive)
- (setq-default mode-line-format
- '("%e"
- (:eval
- (let* ((active (powerline-selected-window-active))
- (face0 (if active 'powerline-active0 'powerline-inactive0))
- (lhs (list (powerline-raw (concat "GNU Emacs "
- (number-to-string
- emacs-major-version)
- "."
- (number-to-string
- emacs-minor-version))
- face0 'l)))
- (rhs (list (if (buffer-modified-p) (powerline-raw "Modified" face0 'r))
- (powerline-fill face0 0)))
- (center (list (powerline-raw "%b" face0))))
- (concat (powerline-render lhs)
- (powerline-fill-center face0 (/ (powerline-width center) 2.0))
- (powerline-render center)
- (powerline-fill face0 (powerline-width rhs))
- (powerline-render rhs)))))))
-
-
-(provide 'powerline-themes)
-
-;;; powerline-themes.el ends here
diff --git a/elpa/powerline-20200105.2053/powerline.el b/elpa/powerline-20200105.2053/powerline.el
deleted file mode 100644
index 7670e5a..0000000
--- a/elpa/powerline-20200105.2053/powerline.el
+++ /dev/null
@@ -1,617 +0,0 @@
-;;; powerline.el --- Rewrite of Powerline
-
-;; Copyright (C) 2012-2013 Donald Ephraim Curtis
-;; Copyright (C) 2013 Jason Milkins
-;; Copyright (C) 2012 Nicolas Rougier
-
-;; Author: Donald Ephraim Curtis <dcurtis@milkbox.net>
-;; URL: http://github.com/milkypostman/powerline/
-;; Version: 2.4
-;; Keywords: mode-line
-;; Package-Requires: ((cl-lib "0.2"))
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; Powerline is a library for customizing the mode-line that is based on the Vim
-;; Powerline. A collection of predefined themes comes with the package.
-;;
-
-;;; Code:
-
-(eval-and-compile (require 'powerline-themes))
-(eval-and-compile (require 'powerline-separators))
-
-(require 'cl-lib)
-
-(defgroup powerline nil
- "Powerline, a prettier mode line."
- :group 'mode-line)
-
-(defface powerline-active0 '((t (:inherit mode-line)))
- "Powerline face 0."
- :group 'powerline)
-
-(defface powerline-active1 '((t (:background "grey17" :foreground "white" :inherit mode-line)))
- "Powerline face 1."
- :group 'powerline)
-
-(defface powerline-active2 '((t (:background "grey40" :foreground "white" :inherit mode-line)))
- "Powerline face 2."
- :group 'powerline)
-
-(defface powerline-inactive0
- '((t (:inherit mode-line-inactive)))
- "Powerline face 0."
- :group 'powerline)
-
-(defface powerline-inactive1
- '((t (:background "grey11" :inherit mode-line-inactive)))
- "Powerline face 1."
- :group 'powerline)
-
-(defface powerline-inactive2
- '((t (:background "grey20" :inherit mode-line-inactive)))
- "Powerline face 2."
- :group 'powerline)
-
-(defface mode-line-buffer-id-inactive
- '((t (:inherit mode-line-buffer-id)))
- "Powerline mode-line face"
- :group 'powerline)
-
-(defcustom powerline-default-separator 'arrow
- "The separator to use for the default theme.
-
-Valid Values: alternate, arrow, arrow-fade, bar, box, brace,
-butt, chamfer, contour, curve, rounded, roundstub, wave, zigzag,
-slant, utf-8."
- :group 'powerline
- :type '(choice (const alternate)
- (const arrow)
- (const arrow-fade)
- (const bar)
- (const box)
- (const brace)
- (const butt)
- (const chamfer)
- (const contour)
- (const curve)
- (const rounded)
- (const roundstub)
- (const slant)
- (const wave)
- (const zigzag)
- (const utf-8)
- (const nil)))
-
-(defcustom powerline-utf-8-separator-left #xe0b0
- "The unicode character number for the left facing separator"
- :group 'powerline
- :type '(choice integer (const nil)))
-
-(defcustom powerline-utf-8-separator-right #xe0b2
- "The unicode character number for the right facing separator"
- :group 'powerline
- :type '(choice integer (const nil)))
-
-(defcustom powerline-default-separator-dir '(left . right)
- "The separator direction to use for the default theme.
-
-CONS of the form (DIR . DIR) denoting the lean of the
-separators for the left and right side of the powerline.
-
-DIR must be one of: left, right"
- :group 'powerline
- :type '(cons (choice :tag "Left Hand Side" (const left) (const right))
- (choice :tag "Right Hand Side" (const left) (const right))))
-
-(defcustom powerline-height nil
- "Override the mode-line height."
- :group 'powerline
- :type '(choice integer (const nil)))
-
-(defcustom powerline-text-scale-factor nil
- "Scale of mode-line font size to default text size.
-
-Smaller mode-line fonts will be a float value less that 1.
-Larger mode-line fonts require a float value greater than 1.
-
-This is needed to make sure that text is properly aligned."
- :group 'powerline
- :type '(choice float integer (const nil)))
-
-(defcustom powerline-buffer-size-suffix t
- "Display the buffer size suffix."
- :group 'powerline
- :type 'boolean)
-
-(defcustom powerline-gui-use-vcs-glyph nil
- "Display a unicode character to represent a version control system. Not always supported in GUI."
- :group 'powerline
- :type 'boolean)
-
-(defcustom powerline-narrowed-indicator "Narrow"
- "A string to display in the mode-line when the buffer is narrowed."
- :group 'powerline
- :type 'string)
-
-(defun pl/create-or-get-cache ()
- "Return a frame-local hash table that acts as a memoization cache for powerline. Create one if the frame doesn't have one yet."
- (let ((table (frame-parameter nil 'powerline-cache)))
- (if (hash-table-p table) table (pl/reset-cache))))
-
-(defun pl/reset-cache ()
- "Reset and return the frame-local hash table used for a memoization cache."
- (let ((table (make-hash-table :test 'equal)))
- ;; Store it as a frame-local variable
- (modify-frame-parameters nil `((powerline-cache . ,table)))
- table))
-
-(defun powerline-current-separator ()
- "Get the current default separator. Always returns utf-8 in non-gui mode."
- (if window-system
- powerline-default-separator
- 'utf-8))
-
-;;
-;; the frame-local powerline cache causes problems if included in a saved desktop,
-;; so delete it before the desktop is saved.
-;;
-;; see https://github.com/milkypostman/powerline/issues/58
-;;
-;; It is better to put the following code into your init file for Emacs 24.4 or later.
-;; (require 'frameset)
-;; (push '(powerline-cache . :never) frameset-filter-alist)
-;;
-(defun powerline-delete-cache (&optional frame)
- "Set the FRAME cache to nil."
- (set-frame-parameter frame 'powerline-cache nil))
-
-(defun powerline-desktop-save-delete-cache ()
- "Set all caches to nil unless `frameset-filter-alist' has :never for powerline-cache."
- (unless (and (boundp 'frameset-filter-alist)
- (eq (cdr (assq 'powerline-cache frameset-filter-alist))
- :never))
- (dolist (fr (frame-list)) (powerline-delete-cache fr))))
-
-(add-hook 'desktop-save-hook 'powerline-desktop-save-delete-cache)
-
-;; from memoize.el @ http://nullprogram.com/blog/2010/07/26/
-(defun pl/memoize (func)
- "Memoize FUNC.
-If argument is a symbol then install the memoized function over
-the original function. Use frame-local memoization."
- (cl-typecase func
- (symbol (fset func (pl/memoize-wrap-frame-local (symbol-function func))) func)
- (function (pl/memoize-wrap-frame-local func))))
-
-(defun pl/memoize-wrap-frame-local (func)
- "Return the memoized version of FUNC.
-The memoization cache is frame-local."
- (let ((funcid (cl-gensym)))
- `(lambda (&rest args)
- ,(concat (documentation func) (format "\n(memoized function %s)" funcid))
- (let* ((cache (pl/create-or-get-cache))
- (key (cons ',funcid args))
- (val (gethash key cache)))
- (if val
- val
- (puthash key (apply ,func args) cache))))))
-
-(defun pl/separator-height ()
- "Get default height for rendering separators."
- (or powerline-height (frame-char-height)))
-
-(defun powerline-reset ()
- "Reset memoized functions."
- (interactive)
- (pl/memoize (pl/alternate left))
- (pl/memoize (pl/alternate right))
- (pl/memoize (pl/arrow left))
- (pl/memoize (pl/arrow right))
- (pl/memoize (pl/arrow-fade left))
- (pl/memoize (pl/arrow-fade right))
- (pl/memoize (pl/bar left))
- (pl/memoize (pl/bar right))
- (pl/memoize (pl/box left))
- (pl/memoize (pl/box right))
- (pl/memoize (pl/brace left))
- (pl/memoize (pl/brace right))
- (pl/memoize (pl/butt left))
- (pl/memoize (pl/butt right))
- (pl/memoize (pl/chamfer left))
- (pl/memoize (pl/chamfer right))
- (pl/memoize (pl/contour left))
- (pl/memoize (pl/contour right))
- (pl/memoize (pl/curve left))
- (pl/memoize (pl/curve right))
- (pl/memoize (pl/rounded left))
- (pl/memoize (pl/rounded right))
- (pl/memoize (pl/roundstub left))
- (pl/memoize (pl/roundstub right))
- (pl/memoize (pl/slant left))
- (pl/memoize (pl/slant right))
- (pl/memoize (pl/wave left))
- (pl/memoize (pl/wave right))
- (pl/memoize (pl/zigzag left))
- (pl/memoize (pl/zigzag right))
- (pl/memoize (pl/nil left))
- (pl/memoize (pl/nil right))
- (pl/utf-8 left)
- (pl/utf-8 right)
- (pl/reset-cache))
-
-(powerline-reset)
-
-(defun pl/make-xpm (name color1 color2 data)
- "Return an XPM image with NAME using COLOR1 for enabled and COLOR2 for disabled bits specified in DATA."
- (when window-system
- (create-image
- (concat
- (format "/* XPM */
-static char * %s[] = {
-\"%i %i 2 1\",
-\". c %s\",
-\" c %s\",
-"
- (downcase (replace-regexp-in-string " " "_" name))
- (length (car data))
- (length data)
- (or (pl/hex-color color1) "None")
- (or (pl/hex-color color2) "None"))
- (let ((len (length data))
- (idx 0))
- (apply 'concat
- (mapcar #'(lambda (dl)
- (setq idx (+ idx 1))
- (concat
- "\""
- (concat
- (mapcar #'(lambda (d)
- (if (eq d 0)
- (string-to-char " ")
- (string-to-char ".")))
- dl))
- (if (eq idx len)
- "\"};"
- "\",\n")))
- data))))
- 'xpm t :ascent 'center)))
-
-(defun pl/percent-xpm
- (height pmax pmin winend winstart width color1 color2)
- "Generate percentage xpm of HEIGHT for PMAX to PMIN given WINEND and WINSTART with WIDTH and COLOR1 and COLOR2."
- (let* ((height- (1- height))
- (fillstart (round (* height- (/ (float winstart) (float pmax)))))
- (fillend (round (* height- (/ (float winend) (float pmax)))))
- (data nil)
- (i 0))
- (while (< i height)
- (setq data (cons
- (if (and (<= fillstart i)
- (<= i fillend))
- (append (make-list width 1))
- (append (make-list width 0)))
- data))
- (setq i (+ i 1)))
- (pl/make-xpm "percent" color1 color2 (reverse data))))
-
-(pl/memoize 'pl/percent-xpm)
-
-;;;###autoload
-(defun powerline-hud (face1 face2 &optional width)
- "Return an XPM of relative buffer location using FACE1 and FACE2 of optional WIDTH."
- (unless width (setq width 2))
- (let ((color1 (if face1 (face-background face1) "None"))
- (color2 (if face2 (face-background face2) "None"))
- (height (or powerline-height (frame-char-height)))
- pmax
- pmin
- (ws (window-start))
- (we (window-end)))
- (save-restriction
- (widen)
- (setq pmax (point-max))
- (setq pmin (point-min)))
- (pl/percent-xpm height pmax pmin we ws
- (* (frame-char-width) width) color1 color2)))
-
-;;;###autoload
-(defun powerline-mouse (click-group click-type string)
- "Return mouse handler for CLICK-GROUP given CLICK-TYPE and STRING."
- (cond ((eq click-group 'minor)
- (cond ((eq click-type 'menu)
- `(lambda (event)
- (interactive "@e")
- (minor-mode-menu-from-indicator ,string)))
- ((eq click-type 'help)
- `(lambda (event)
- (interactive "@e")
- (describe-minor-mode-from-indicator ,string)))
- (t
- `(lambda (event)
- (interactive "@e")
- nil))))
- (t
- `(lambda (event)
- (interactive "@e")
- nil))))
-
-;;;###autoload
-(defun powerline-concat (&rest strings)
- "Concatonate STRINGS and pad sides by spaces."
- (concat
- " "
- (mapconcat 'identity (delq nil strings) " ")
- " "))
-
-;;;###autoload
-(defmacro defpowerline (name body)
- "Create function NAME by wrapping BODY with powerline padding an propetization."
- `(defun ,name
- (&optional face pad)
- (powerline-raw ,body face pad)))
-
-(defun pl/property-substrings (str prop)
- "Return a list of substrings of STR when PROP change."
- (let ((beg 0) (end 0)
- (len (length str))
- (out))
- (while (< end (length str))
- (setq end (or (next-single-property-change beg prop str) len))
- (setq out (append out (list (substring str beg (setq beg end))))))
- out))
-
-(defun pl/assure-list (item)
- "Assure that ITEM is a list."
- (if (listp item)
- item
- (list item)))
-
-(defun pl/add-text-property (str prop val)
- (mapconcat
- (lambda (mm)
- (let ((cur (pl/assure-list (get-text-property 0 'face mm))))
- (propertize mm 'face (append cur (list val)))))
- (pl/property-substrings str prop)
- ""))
-
-;;;###autoload
-(defun powerline-raw (str &optional face pad)
- "Render STR as mode-line data using FACE and optionally PAD import on left (l) or right (r)."
- (when str
- (let* ((rendered-str (format-mode-line str))
- (padded-str (concat
- (when (and (> (length rendered-str) 0) (eq pad 'l)) " ")
- (if (listp str) rendered-str str)
- (when (and (> (length rendered-str) 0) (eq pad 'r)) " "))))
-
- (if face
- (pl/add-text-property padded-str 'face face)
- padded-str))))
-
-;;;###autoload
-(defun powerline-fill (face reserve)
- "Return empty space using FACE and leaving RESERVE space on the right."
- (unless reserve
- (setq reserve 20))
- (when powerline-text-scale-factor
- (setq reserve (* powerline-text-scale-factor reserve)))
- (when (and window-system (eq 'right (get-scroll-bar-mode)))
- (setq reserve (- reserve 3)))
- (propertize " "
- 'display `((space :align-to (- (+ right right-fringe right-margin) ,reserve)))
- 'face face))
-
-(defun powerline-fill-center (face reserve)
- "Return empty space using FACE to the center of remaining space leaving RESERVE space on the right."
- (unless reserve
- (setq reserve 20))
- (when powerline-text-scale-factor
- (setq reserve (* powerline-text-scale-factor reserve)))
- (propertize " "
- 'display `((space :align-to (- (+ center (.5 . right-margin)) ,reserve
- (.5 . left-margin))))
- 'face face))
-
-;;;###autoload (autoload 'powerline-major-mode "powerline")
-(defpowerline powerline-major-mode
- (propertize (format-mode-line mode-name)
- 'mouse-face 'mode-line-highlight
- 'help-echo "Major mode\n\ mouse-1: Display major mode menu\n\ mouse-2: Show help for major mode\n\ mouse-3: Toggle minor modes"
- 'local-map (let ((map (make-sparse-keymap)))
- (define-key map [mode-line down-mouse-1]
- `(menu-item ,(purecopy "Menu Bar") ignore
- :filter (lambda (_) (mouse-menu-major-mode-map))))
- (define-key map [mode-line mouse-2] 'describe-mode)
- (define-key map [mode-line down-mouse-3] mode-line-mode-menu)
- map)))
-
-;;;###autoload (autoload 'powerline-minor-modes "powerline")
-(defpowerline powerline-minor-modes
- (mapconcat (lambda (mm)
- (propertize mm
- 'mouse-face 'mode-line-highlight
- 'help-echo "Minor mode\n mouse-1: Display minor mode menu\n mouse-2: Show help for minor mode\n mouse-3: Toggle minor modes"
- 'local-map (let ((map (make-sparse-keymap)))
- (define-key map
- [mode-line down-mouse-1]
- (powerline-mouse 'minor 'menu mm))
- (define-key map
- [mode-line mouse-2]
- (powerline-mouse 'minor 'help mm))
- (define-key map
- [mode-line down-mouse-3]
- (powerline-mouse 'minor 'menu mm))
- (define-key map
- [header-line down-mouse-3]
- (powerline-mouse 'minor 'menu mm))
- map)))
- (split-string (format-mode-line minor-mode-alist))
- (propertize " " 'face face)))
-
-;;;###autoload (autoload 'powerline-narrow "powerline")
-(defpowerline powerline-narrow
- (when ;; (buffer-narrowed-p) introduced in Emacs 24.3.
- (/= (- (point-max) (point-min)) (buffer-size))
- (propertize powerline-narrowed-indicator
- 'mouse-face 'mode-line-highlight
- 'help-echo "mouse-1: Remove narrowing from the current buffer"
- 'local-map (make-mode-line-mouse-map
- 'mouse-1 'mode-line-widen))))
-
-;;;###autoload (autoload 'powerline-vc "powerline")
-(defpowerline powerline-vc
- (when (and (buffer-file-name (current-buffer)) vc-mode)
- (if (and window-system (not powerline-gui-use-vcs-glyph))
- (format-mode-line '(vc-mode vc-mode))
- (format " %s%s"
- (char-to-string #xe0a0)
- (format-mode-line '(vc-mode vc-mode))))))
-
-;;;###autoload (autoload 'powerline-encoding "powerline")
-(defpowerline powerline-encoding
- (let ((buf-coding (format "%s" buffer-file-coding-system)))
- (if (string-match "\\(dos\\|unix\\|mac\\)" buf-coding)
- (match-string 1 buf-coding)
- buf-coding)))
-
-
-;;;###autoload (autoload 'powerline-buffer-size "powerline")
-(defpowerline powerline-buffer-size
- (propertize
- (if powerline-buffer-size-suffix
- "%I"
- "%i")
- 'mouse-face 'mode-line-highlight
- 'local-map (make-mode-line-mouse-map
- 'mouse-1 (lambda () (interactive)
- (setq powerline-buffer-size-suffix
- (not powerline-buffer-size-suffix))
- (force-mode-line-update)))))
-
-;;;###autoload (autoload 'powerline-buffer-id "powerline")
-(defun powerline-buffer-id (&optional face pad)
- (powerline-raw
- (format-mode-line
- (concat " " (propertize
- (format-mode-line mode-line-buffer-identification)
- 'face face
- 'mouse-face 'mode-line-highlight
- 'help-echo "Buffer name\n\ mouse-1: Previous buffer\n\ mouse-3: Next buffer"
- 'local-map (let ((map (make-sparse-keymap)))
- (define-key map [mode-line mouse-1] 'mode-line-previous-buffer)
- (define-key map [mode-line mouse-3] 'mode-line-next-buffer)
- map))))
- face pad))
-
-;;;###autoload (autoload 'powerline-process "powerline")
-(defpowerline powerline-process
- (cond
- ((symbolp mode-line-process) (symbol-value mode-line-process))
- ((listp mode-line-process) (format-mode-line mode-line-process))
- (t mode-line-process)))
-
-(defvar pl/default-mode-line mode-line-format)
-
-(defvar pl/minibuffer-selected-window-list '())
-
-(defun pl/minibuffer-selected-window ()
- "Return the selected window when entereing the minibuffer."
- (when pl/minibuffer-selected-window-list
- (car pl/minibuffer-selected-window-list)))
-
-(defun pl/minibuffer-setup ()
- "Save the `minibuffer-selected-window' to `pl/minibuffer-selected-window'."
- (push (minibuffer-selected-window) pl/minibuffer-selected-window-list))
-
-(add-hook 'minibuffer-setup-hook 'pl/minibuffer-setup)
-
-(defun pl/minibuffer-exit ()
- "Set `pl/minibuffer-selected-window' to nil."
- (pop pl/minibuffer-selected-window-list))
-
-(add-hook 'minibuffer-exit-hook 'pl/minibuffer-exit)
-
-(defvar powerline-selected-window (frame-selected-window)
- "Selected window.")
-
-(defun powerline-set-selected-window ()
- "Set the variable `powerline-selected-window' appropriately."
- (when (not (minibuffer-window-active-p (frame-selected-window)))
- (setq powerline-selected-window (frame-selected-window))
- (force-mode-line-update)))
-
-(defun powerline-unset-selected-window ()
- "Unset the variable `powerline-selected-window' and update the mode line."
- (setq powerline-selected-window nil)
- (force-mode-line-update))
-
-(add-hook 'window-configuration-change-hook 'powerline-set-selected-window)
-
-;; focus-in-hook was introduced in emacs v24.4.
-;; Gets evaluated in the last frame's environment.
-(add-hook 'focus-in-hook 'powerline-set-selected-window)
-
-;; focus-out-hook was introduced in emacs v24.4.
-(add-hook 'focus-out-hook 'powerline-unset-selected-window)
-
-;; Executes after the window manager requests that the user's events
-;; be directed to a different frame.
-(defadvice handle-switch-frame (after powerline-handle-switch-frame activate)
- "Call `powerline-set-selected-window'."
- (powerline-set-selected-window))
-
-(add-hook 'buffer-list-update-hook #'powerline-set-selected-window)
-
-;;;###autoload (autoload 'powerline-selected-window-active "powerline")
-(defun powerline-selected-window-active ()
- "Return whether the current window is active."
- (eq powerline-selected-window (selected-window)))
-
-(defun powerline-revert ()
- "Revert to the default Emacs mode-line."
- (interactive)
- (setq-default mode-line-format pl/default-mode-line))
-
-(defun pl/render (item)
- "Render a powerline ITEM."
- (cond
- ((and (listp item) (eq 'image (car item)))
- (propertize " " 'display item
- 'face (plist-get (cdr item) :face)))
- (item item)))
-
-(defun powerline-render (values)
- "Render a list of powerline VALUES."
- (mapconcat 'pl/render values ""))
-
-(defun powerline-width (values)
- "Get the length of VALUES."
- (if values
- (let ((val (car values)))
- (+ (cond
- ((stringp val) (string-width (format-mode-line val)))
- ((and (listp val) (eq 'image (car val)))
- (car (image-size val)))
- (t 0))
- (powerline-width (cdr values))))
- 0))
-
-
-(provide 'powerline)
-
-;;; powerline.el ends here
diff --git a/elpa/projectile-20200710.947/projectile-autoloads.el b/elpa/projectile-20200710.947/projectile-autoloads.el
deleted file mode 100644
index db94ed8..0000000
--- a/elpa/projectile-20200710.947/projectile-autoloads.el
+++ /dev/null
@@ -1,635 +0,0 @@
-;;; projectile-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "projectile" "projectile.el" (0 0 0 0))
-;;; Generated autoloads from projectile.el
-
-(autoload 'projectile-version "projectile" "\
-Get the Projectile version as string.
-
-If called interactively or if SHOW-VERSION is non-nil, show the
-version in the echo area and the messages buffer.
-
-The returned string includes both, the version from package.el
-and the library version, if both a present and different.
-
-If the version number could not be determined, signal an error,
-if called interactively, or if SHOW-VERSION is non-nil, otherwise
-just return nil.
-
-\(fn &optional SHOW-VERSION)" t nil)
-
-(autoload 'projectile-invalidate-cache "projectile" "\
-Remove the current project's files from `projectile-projects-cache'.
-
-With a prefix argument PROMPT prompts for the name of the project whose cache
-to invalidate.
-
-\(fn PROMPT)" t nil)
-
-(autoload 'projectile-purge-file-from-cache "projectile" "\
-Purge FILE from the cache of the current project.
-
-\(fn FILE)" t nil)
-
-(autoload 'projectile-purge-dir-from-cache "projectile" "\
-Purge DIR from the cache of the current project.
-
-\(fn DIR)" t nil)
-
-(autoload 'projectile-cache-current-file "projectile" "\
-Add the currently visited file to the cache.
-
-\(fn)" t nil)
-
-(autoload 'projectile-discover-projects-in-directory "projectile" "\
-Discover any projects in DIRECTORY and add them to the projectile cache.
-This function is not recursive and only adds projects with roots
-at the top level of DIRECTORY.
-
-\(fn DIRECTORY)" t nil)
-
-(autoload 'projectile-discover-projects-in-search-path "projectile" "\
-Discover projects in `projectile-project-search-path'.
-Invoked automatically when `projectile-mode' is enabled.
-
-\(fn)" t nil)
-
-(autoload 'projectile-switch-to-buffer "projectile" "\
-Switch to a project buffer.
-
-\(fn)" t nil)
-
-(autoload 'projectile-switch-to-buffer-other-window "projectile" "\
-Switch to a project buffer and show it in another window.
-
-\(fn)" t nil)
-
-(autoload 'projectile-switch-to-buffer-other-frame "projectile" "\
-Switch to a project buffer and show it in another frame.
-
-\(fn)" t nil)
-
-(autoload 'projectile-display-buffer "projectile" "\
-Display a project buffer in another window without selecting it.
-
-\(fn)" t nil)
-
-(autoload 'projectile-project-buffers-other-buffer "projectile" "\
-Switch to the most recently selected buffer project buffer.
-Only buffers not visible in windows are returned.
-
-\(fn)" t nil)
-
-(autoload 'projectile-multi-occur "projectile" "\
-Do a `multi-occur' in the project's buffers.
-With a prefix argument, show NLINES of context.
-
-\(fn &optional NLINES)" t nil)
-
-(autoload 'projectile-find-other-file "projectile" "\
-Switch between files with the same name but different extensions.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable `projectile-other-file-alist'.
-
-\(fn &optional FLEX-MATCHING)" t nil)
-
-(autoload 'projectile-find-other-file-other-window "projectile" "\
-Switch between files with the same name but different extensions in other window.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable `projectile-other-file-alist'.
-
-\(fn &optional FLEX-MATCHING)" t nil)
-
-(autoload 'projectile-find-other-file-other-frame "projectile" "\
-Switch between files with the same name but different extensions in other frame.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable `projectile-other-file-alist'.
-
-\(fn &optional FLEX-MATCHING)" t nil)
-
-(autoload 'projectile-find-file-dwim "projectile" "\
-Jump to a project's files using completion based on context.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-If point is on a filename, Projectile first tries to search for that
-file in project:
-
-- If it finds just a file, it switches to that file instantly. This works even
-if the filename is incomplete, but there's only a single file in the current project
-that matches the filename at point. For example, if there's only a single file named
-\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete),
-`projectile-find-file-dwim' still switches to \"projectile/projectile.el\" immediately
- because this is the only filename that matches.
-
-- If it finds a list of files, the list is displayed for selecting. A list of
-files is displayed when a filename appears more than one in the project or the
-filename at point is a prefix of more than two files in a project. For example,
-if `projectile-find-file-dwim' is executed on a filepath like \"projectile/\", it lists
-the content of that directory. If it is executed on a partial filename like
- \"projectile/a\", a list of files with character 'a' in that directory is presented.
-
-- If it finds nothing, display a list of all files in project for selecting.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-file-dwim-other-window "projectile" "\
-Jump to a project's files using completion based on context in other window.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-If point is on a filename, Projectile first tries to search for that
-file in project:
-
-- If it finds just a file, it switches to that file instantly. This works even
-if the filename is incomplete, but there's only a single file in the current project
-that matches the filename at point. For example, if there's only a single file named
-\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete),
-`projectile-find-file-dwim-other-window' still switches to \"projectile/projectile.el\"
-immediately because this is the only filename that matches.
-
-- If it finds a list of files, the list is displayed for selecting. A list of
-files is displayed when a filename appears more than one in the project or the
-filename at point is a prefix of more than two files in a project. For example,
-if `projectile-find-file-dwim-other-window' is executed on a filepath like \"projectile/\", it lists
-the content of that directory. If it is executed on a partial filename
-like \"projectile/a\", a list of files with character 'a' in that directory
-is presented.
-
-- If it finds nothing, display a list of all files in project for selecting.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-file-dwim-other-frame "projectile" "\
-Jump to a project's files using completion based on context in other frame.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-If point is on a filename, Projectile first tries to search for that
-file in project:
-
-- If it finds just a file, it switches to that file instantly. This works even
-if the filename is incomplete, but there's only a single file in the current project
-that matches the filename at point. For example, if there's only a single file named
-\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete),
-`projectile-find-file-dwim-other-frame' still switches to \"projectile/projectile.el\"
-immediately because this is the only filename that matches.
-
-- If it finds a list of files, the list is displayed for selecting. A list of
-files is displayed when a filename appears more than one in the project or the
-filename at point is a prefix of more than two files in a project. For example,
-if `projectile-find-file-dwim-other-frame' is executed on a filepath like \"projectile/\", it lists
-the content of that directory. If it is executed on a partial filename
-like \"projectile/a\", a list of files with character 'a' in that directory
-is presented.
-
-- If it finds nothing, display a list of all files in project for selecting.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-file "projectile" "\
-Jump to a project's file using completion.
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-file-other-window "projectile" "\
-Jump to a project's file using completion and show it in another window.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-file-other-frame "projectile" "\
-Jump to a project's file using completion and show it in another frame.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-toggle-project-read-only "projectile" "\
-Toggle project read only.
-
-\(fn)" t nil)
-
-(autoload 'projectile-find-dir "projectile" "\
-Jump to a project's directory using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-dir-other-window "projectile" "\
-Jump to a project's directory in other window using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-dir-other-frame "projectile" "\
-Jump to a project's directory in other frame using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-test-file "projectile" "\
-Jump to a project's test file using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-\(fn &optional INVALIDATE-CACHE)" t nil)
-
-(autoload 'projectile-find-related-file-other-window "projectile" "\
-Open related file in other window.
-
-\(fn)" t nil)
-
-(autoload 'projectile-find-related-file-other-frame "projectile" "\
-Open related file in other frame.
-
-\(fn)" t nil)
-
-(autoload 'projectile-find-related-file "projectile" "\
-Open related file.
-
-\(fn)" t nil)
-
-(autoload 'projectile-related-files-fn-groups "projectile" "\
-Generate a related-files-fn which relates as KIND for files in each of GROUPS.
-
-\(fn KIND GROUPS)" nil nil)
-
-(autoload 'projectile-related-files-fn-extensions "projectile" "\
-Generate a related-files-fn which relates as KIND for files having EXTENSIONS.
-
-\(fn KIND EXTENSIONS)" nil nil)
-
-(autoload 'projectile-related-files-fn-test-with-prefix "projectile" "\
-Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-PREFIX.
-
-\(fn EXTENSION TEST-PREFIX)" nil nil)
-
-(autoload 'projectile-related-files-fn-test-with-suffix "projectile" "\
-Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-SUFFIX.
-
-\(fn EXTENSION TEST-SUFFIX)" nil nil)
-
-(autoload 'projectile-project-info "projectile" "\
-Display info for current project.
-
-\(fn)" t nil)
-
-(autoload 'projectile-find-implementation-or-test-other-window "projectile" "\
-Open matching implementation or test file in other window.
-
-\(fn)" t nil)
-
-(autoload 'projectile-find-implementation-or-test-other-frame "projectile" "\
-Open matching implementation or test file in other frame.
-
-\(fn)" t nil)
-
-(autoload 'projectile-toggle-between-implementation-and-test "projectile" "\
-Toggle between an implementation file and its test file.
-
-\(fn)" t nil)
-
-(autoload 'projectile-grep "projectile" "\
-Perform rgrep in the project.
-
-With a prefix ARG asks for files (globbing-aware) which to grep in.
-With prefix ARG of `-' (such as `M--'), default the files (without prompt),
-to `projectile-grep-default-files'.
-
-With REGEXP given, don't query the user for a regexp.
-
-\(fn &optional REGEXP ARG)" t nil)
-
-(autoload 'projectile-ag "projectile" "\
-Run an ag search with SEARCH-TERM in the project.
-
-With an optional prefix argument ARG SEARCH-TERM is interpreted as a
-regular expression.
-
-\(fn SEARCH-TERM &optional ARG)" t nil)
-
-(autoload 'projectile-ripgrep "projectile" "\
-Run a Ripgrep search with `SEARCH-TERM' at current project root.
-
-With an optional prefix argument ARG SEARCH-TERM is interpreted as a
-regular expression.
-
-\(fn SEARCH-TERM &optional ARG)" t nil)
-
-(autoload 'projectile-regenerate-tags "projectile" "\
-Regenerate the project's [e|g]tags.
-
-\(fn)" t nil)
-
-(autoload 'projectile-find-tag "projectile" "\
-Find tag in project.
-
-\(fn)" t nil)
-
-(autoload 'projectile-run-command-in-root "projectile" "\
-Invoke `execute-extended-command' in the project's root.
-
-\(fn)" t nil)
-
-(autoload 'projectile-run-shell-command-in-root "projectile" "\
-Invoke `shell-command' in the project's root.
-
-\(fn)" t nil)
-
-(autoload 'projectile-run-async-shell-command-in-root "projectile" "\
-Invoke `async-shell-command' in the project's root.
-
-\(fn)" t nil)
-
-(autoload 'projectile-run-gdb "projectile" "\
-Invoke `gdb' in the project's root.
-
-\(fn)" t nil)
-
-(autoload 'projectile-run-shell "projectile" "\
-Invoke `shell' in the project's root.
-
-Switch to the project specific shell buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-run-eshell "projectile" "\
-Invoke `eshell' in the project's root.
-
-Switch to the project specific eshell buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-run-ielm "projectile" "\
-Invoke `ielm' in the project's root.
-
-Switch to the project specific ielm buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-run-term "projectile" "\
-Invoke `term' in the project's root.
-
-Switch to the project specific term buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-run-vterm "projectile" "\
-Invoke `vterm' in the project's root.
-
-Switch to the project specific term buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'projectile-replace "projectile" "\
-Replace literal string in project using non-regexp `tags-query-replace'.
-
-With a prefix argument ARG prompts you for a directory on which
-to run the replacement.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'projectile-replace-regexp "projectile" "\
-Replace a regexp in the project using `tags-query-replace'.
-
-With a prefix argument ARG prompts you for a directory on which
-to run the replacement.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'projectile-kill-buffers "projectile" "\
-Kill project buffers.
-
-The buffer are killed according to the value of
-`projectile-kill-buffers-filter'.
-
-\(fn)" t nil)
-
-(autoload 'projectile-save-project-buffers "projectile" "\
-Save all project buffers.
-
-\(fn)" t nil)
-
-(autoload 'projectile-dired "projectile" "\
-Open `dired' at the root of the project.
-
-\(fn)" t nil)
-
-(autoload 'projectile-dired-other-window "projectile" "\
-Open `dired' at the root of the project in another window.
-
-\(fn)" t nil)
-
-(autoload 'projectile-dired-other-frame "projectile" "\
-Open `dired' at the root of the project in another frame.
-
-\(fn)" t nil)
-
-(autoload 'projectile-vc "projectile" "\
-Open `vc-dir' at the root of the project.
-
-For git projects `magit-status-internal' is used if available.
-For hg projects `monky-status' is used if available.
-
-If PROJECT-ROOT is given, it is opened instead of the project
-root directory of the current buffer file. If interactively
-called with a prefix argument, the user is prompted for a project
-directory to open.
-
-\(fn &optional PROJECT-ROOT)" t nil)
-
-(autoload 'projectile-recentf "projectile" "\
-Show a list of recently visited files in a project.
-
-\(fn)" t nil)
-
-(autoload 'projectile-configure-project "projectile" "\
-Run project configure command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-compile-project "projectile" "\
-Run project compilation command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-test-project "projectile" "\
-Run project test command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-run-project "projectile" "\
-Run project run command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG.
-
-\(fn ARG)" t nil)
-
-(autoload 'projectile-repeat-last-command "projectile" "\
-Run last projectile external command.
-
-External commands are: `projectile-configure-project',
-`projectile-compile-project', `projectile-test-project' and
-`projectile-run-project'.
-
-If the prefix argument SHOW_PROMPT is non nil, the command can be edited.
-
-\(fn SHOW-PROMPT)" t nil)
-
-(autoload 'projectile-switch-project "projectile" "\
-Switch to a project we have visited before.
-Invokes the command referenced by `projectile-switch-project-action' on switch.
-With a prefix ARG invokes `projectile-commander' instead of
-`projectile-switch-project-action.'
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'projectile-switch-open-project "projectile" "\
-Switch to a project we have currently opened.
-Invokes the command referenced by `projectile-switch-project-action' on switch.
-With a prefix ARG invokes `projectile-commander' instead of
-`projectile-switch-project-action.'
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'projectile-find-file-in-directory "projectile" "\
-Jump to a file in a (maybe regular) DIRECTORY.
-
-This command will first prompt for the directory the file is in.
-
-\(fn &optional DIRECTORY)" t nil)
-
-(autoload 'projectile-find-file-in-known-projects "projectile" "\
-Jump to a file in any of the known projects.
-
-\(fn)" t nil)
-
-(autoload 'projectile-cleanup-known-projects "projectile" "\
-Remove known projects that don't exist anymore.
-
-\(fn)" t nil)
-
-(autoload 'projectile-clear-known-projects "projectile" "\
-Clear both `projectile-known-projects' and `projectile-known-projects-file'.
-
-\(fn)" t nil)
-
-(autoload 'projectile-remove-known-project "projectile" "\
-Remove PROJECT from the list of known projects.
-
-\(fn &optional PROJECT)" t nil)
-
-(autoload 'projectile-remove-current-project-from-known-projects "projectile" "\
-Remove the current project from the list of known projects.
-
-\(fn)" t nil)
-
-(autoload 'projectile-add-known-project "projectile" "\
-Add PROJECT-ROOT to the list of known projects.
-
-\(fn PROJECT-ROOT)" t nil)
-
-(autoload 'projectile-ibuffer "projectile" "\
-Open an IBuffer window showing all buffers in the current project.
-
-Let user choose another project when PROMPT-FOR-PROJECT is supplied.
-
-\(fn PROMPT-FOR-PROJECT)" t nil)
-
-(autoload 'projectile-commander "projectile" "\
-Execute a Projectile command with a single letter.
-The user is prompted for a single character indicating the action to invoke.
-The `?' character describes then
-available actions.
-
-See `def-projectile-commander-method' for defining new methods.
-
-\(fn)" t nil)
-
-(autoload 'projectile-browse-dirty-projects "projectile" "\
-Browse dirty version controlled projects.
-
-With a prefix argument, or if CACHED is non-nil, try to use the cached
-dirty project list.
-
-\(fn &optional CACHED)" t nil)
-
-(autoload 'projectile-edit-dir-locals "projectile" "\
-Edit or create a .dir-locals.el file of the project.
-
-\(fn)" t nil)
-
-(defvar projectile-mode nil "\
-Non-nil if Projectile mode is enabled.
-See the `projectile-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `projectile-mode'.")
-
-(custom-autoload 'projectile-mode "projectile" nil)
-
-(autoload 'projectile-mode "projectile" "\
-Minor mode to assist project management and navigation.
-
-When called interactively, toggle `projectile-mode'. With prefix
-ARG, enable `projectile-mode' if ARG is positive, otherwise disable
-it.
-
-When called from Lisp, enable `projectile-mode' if ARG is omitted,
-nil or positive. If ARG is `toggle', toggle `projectile-mode'.
-Otherwise behave as if called interactively.
-
-\\{projectile-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(define-obsolete-function-alias 'projectile-global-mode 'projectile-mode "1.0")
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "projectile" '("projectile-" "??" "delete-file-projectile-remove-from-cache" "def-projectile-commander-method" "compilation-find-file-projectile-find-compilation-buffer")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; projectile-autoloads.el ends here
diff --git a/elpa/projectile-20200710.947/projectile-pkg.el b/elpa/projectile-20200710.947/projectile-pkg.el
deleted file mode 100644
index 6defafd..0000000
--- a/elpa/projectile-20200710.947/projectile-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "projectile" "20200710.947" "Manage and navigate projects in Emacs easily" '((emacs "25.1") (pkg-info "0.4")) :commit "bbcf781d3fddb8e00d0dc10eb68bc2528fb409b3" :keywords '("project" "convenience") :authors '(("Bozhidar Batsov" . "bozhidar@batsov.com")) :maintainer '("Bozhidar Batsov" . "bozhidar@batsov.com") :url "https://github.com/bbatsov/projectile")
diff --git a/elpa/projectile-20200710.947/projectile.el b/elpa/projectile-20200710.947/projectile.el
deleted file mode 100644
index d4e7786..0000000
--- a/elpa/projectile-20200710.947/projectile.el
+++ /dev/null
@@ -1,4875 +0,0 @@
-;;; projectile.el --- Manage and navigate projects in Emacs easily -*- lexical-binding: t -*-
-
-;; Copyright © 2011-2020 Bozhidar Batsov <bozhidar@batsov.com>
-
-;; Author: Bozhidar Batsov <bozhidar@batsov.com>
-;; URL: https://github.com/bbatsov/projectile
-;; Package-Version: 20200710.947
-;; Package-Commit: bbcf781d3fddb8e00d0dc10eb68bc2528fb409b3
-;; Keywords: project, convenience
-;; Version: 2.3.0-snapshot
-;; Package-Requires: ((emacs "25.1") (pkg-info "0.4"))
-
-;; This file is NOT part of GNU 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, or (at your option)
-;; any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-;;
-;; This library provides easy project management and navigation. The
-;; concept of a project is pretty basic - just a folder containing
-;; special file. Currently git, mercurial and bazaar repos are
-;; considered projects by default. If you want to mark a folder
-;; manually as a project just create an empty .projectile file in
-;; it. See the README for more details.
-;;
-;;; Code:
-
-(require 'cl-lib)
-(require 'thingatpt)
-(require 'ibuffer)
-(require 'ibuf-ext)
-(require 'compile)
-(require 'grep)
-(eval-when-compile
- (require 'find-dired)
- (require 'subr-x))
-
-(eval-when-compile
- (defvar ag-ignore-list)
- (defvar ggtags-completion-table)
- (defvar tags-completion-table)
- (defvar tags-loop-scan)
- (defvar tags-loop-operate)
- (defvar eshell-buffer-name)
- (defvar explicit-shell-file-name))
-
-(declare-function tags-completion-table "etags")
-(declare-function make-term "term")
-(declare-function term-mode "term")
-(declare-function term-char-mode "term")
-(declare-function eshell-search-path "esh-ext")
-(declare-function vc-dir "vc-dir")
-(declare-function vc-dir-busy "vc-dir")
-(declare-function string-trim "subr-x")
-(declare-function fileloop-continue "fileloop")
-(declare-function fileloop-initialize-replace "fileloop")
-
-(declare-function ggtags-ensure-project "ext:ggtags")
-(declare-function ggtags-update-tags "ext:ggtags")
-(declare-function pkg-info-version-info "ext:pkg-info")
-(declare-function ripgrep-regexp "ext:ripgrep")
-(declare-function vterm "ext:vterm")
-(declare-function vterm-send-return "ext:vterm")
-(declare-function vterm-send-string "ext:vterm")
-
-(defvar grep-files-aliases)
-(defvar grep-find-ignored-directories)
-(defvar grep-find-ignored-files)
-
-
-;;; Customization
-(defgroup projectile nil
- "Manage and navigate projects easily."
- :group 'tools
- :group 'convenience
- :link '(url-link :tag "GitHub" "https://github.com/bbatsov/projectile")
- :link '(url-link :tag "Online Manual" "https://docs.projectile.mx/")
- :link '(emacs-commentary-link :tag "Commentary" "projectile"))
-
-(defcustom projectile-indexing-method (if (eq system-type 'windows-nt) 'native 'alien)
- "Specifies the indexing method used by Projectile.
-
-There are three indexing methods - native, hybrid and alien.
-
-The native method is implemented in Emacs Lisp (therefore it is
-native to Emacs). Its advantage is that it is portable and will
-work everywhere that Emacs does. Its disadvantage is that it is a
-bit slow (especially for large projects). Generally it's a good
-idea to pair the native indexing method with caching.
-
-The hybrid indexing method uses external tools (e.g. git, find,
-etc) to speed up the indexing process. Still, the files will be
-post-processed by Projectile for sorting/filtering purposes.
-In this sense that approach is a hybrid between native indexing
-and alien indexing.
-
-The alien indexing method optimizes to the limit the speed
-of the hybrid indexing method. This means that Projectile will
-not do any processing of the files returned by the external
-commands and you're going to get the maximum performance
-possible. This behaviour makes a lot of sense for most people,
-as they'd typically be putting ignores in their VCS config and
-won't care about any additional ignores/unignores/sorting that
-Projectile might also provide.
-
-The disadvantage of the hybrid and alien methods is that they are not well
-supported on Windows systems. That's why by default alien indexing is the
-default on all operating systems, except Windows."
- :group 'projectile
- :type '(radio
- (const :tag "Native" native)
- (const :tag "Hybrid" hybrid)
- (const :tag "Alien" alien)))
-
-(defcustom projectile-enable-caching (eq projectile-indexing-method 'native)
- "When t enables project files caching.
-
-Project caching is automatically enabled by default if you're
-using the native indexing method."
- :group 'projectile
- :type 'boolean)
-
-(defcustom projectile-kill-buffers-filter 'kill-all
- "Determine which buffers are killed by `projectile-kill-buffers'.
-
-When the kill-all option is selected, kills each buffer.
-
-When the kill-only-files option is selected, kill only the buffer
-associated to a file.
-
-Otherwise, it should be a predicate that takes one argument: the buffer to
-be killed."
- :group 'projectile
- :type '(radio
- (const :tag "All project buffers" kill-all)
- (const :tag "Project file buffers" kill-only-files)
- (function :tag "Predicate")))
-
-(defcustom projectile-file-exists-local-cache-expire nil
- "Number of seconds before the local file existence cache expires.
-Local refers to a file on a local file system.
-
-A value of nil disables this cache.
-See `projectile-file-exists-p' for details."
- :group 'projectile
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Seconds")))
-
-(defcustom projectile-file-exists-remote-cache-expire (* 5 60)
- "Number of seconds before the remote file existence cache expires.
-Remote refers to a file on a remote file system such as tramp.
-
-A value of nil disables this cache.
-See `projectile-file-exists-p' for details."
- :group 'projectile
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Seconds")))
-
-(defcustom projectile-files-cache-expire nil
- "Number of seconds before project files list cache expires.
-
-A value of nil means the cache never expires."
- :group 'projectile
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Seconds")))
-
-(defcustom projectile-auto-discover t
- "Whether to discover projects when `projectile-mode' is activated."
- :group 'projectile
- :type 'boolean
- :package-version '(projectile . "2.3.0"))
-
-(defcustom projectile-auto-update-cache t
- "Whether the cache should automatically be updated when files are opened or deleted."
- :group 'projectile
- :type 'boolean)
-
-(defcustom projectile-require-project-root 'prompt
- "Require the presence of a project root to operate when true.
-When set to 'prompt Projectile will ask you to select a project
-directory if you're not in a project.
-
-When nil Projectile will consider the current directory the project root."
- :group 'projectile
- :type '(choice (const :tag "No" nil)
- (const :tag "Yes" t)
- (const :tag "Prompt for project" prompt)))
-
-(defcustom projectile-completion-system 'ido
- "The completion system to be used by Projectile."
- :group 'projectile
- :type '(radio
- (const :tag "Ido" ido)
- (const :tag "Helm" helm)
- (const :tag "Ivy" ivy)
- (const :tag "Default" default)
- (function :tag "Custom function")))
-
-(defcustom projectile-keymap-prefix nil
- "Projectile keymap prefix."
- :group 'projectile
- :type 'string)
-
-(make-obsolete-variable 'projectile-keymap-prefix "Use (define-key projectile-mode-map (kbd ...) 'projectile-command-map) instead." "2.0.0")
-
-(defcustom projectile-cache-file
- (expand-file-name "projectile.cache" user-emacs-directory)
- "The name of Projectile's cache file."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-tags-file-name "TAGS"
- "The tags filename Projectile's going to use."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-tags-command "ctags -Re -f \"%s\" %s \"%s\""
- "The command Projectile's going to use to generate a TAGS file."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-tags-backend 'auto
- "The tag backend that Projectile should use.
-
-If set to 'auto', `projectile-find-tag' will automatically choose
-which backend to use. Preference order is ggtags -> xref
--> etags-select -> `find-tag'. Variable can also be set to specify which
-backend to use. If selected backend is unavailable, fall back to
-`find-tag'.
-
-If this variable is set to 'auto' and ggtags is available, or if
-set to 'ggtags', then ggtags will be used for
-`projectile-regenerate-tags'. For all other settings
-`projectile-tags-command' will be used."
- :group 'projectile
- :type '(radio
- (const :tag "auto" auto)
- (const :tag "xref" xref)
- (const :tag "ggtags" ggtags)
- (const :tag "etags" etags-select)
- (const :tag "standard" find-tag))
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-sort-order 'default
- "The sort order used for a project's files.
-
-Note that files aren't sorted if `projectile-indexing-method'
-is set to 'alien'."
- :group 'projectile
- :type '(radio
- (const :tag "Default (no sorting)" default)
- (const :tag "Recently opened files" recentf)
- (const :tag "Recently active buffers, then recently opened files" recently-active)
- (const :tag "Access time (atime)" access-time)
- (const :tag "Modification time (mtime)" modification-time)))
-
-(defcustom projectile-verbose t
- "Echo messages that are not errors."
- :group 'projectile
- :type 'boolean)
-
-(defcustom projectile-buffers-filter-function nil
- "A function used to filter the buffers in `projectile-project-buffers'.
-
-The function should accept and return a list of Emacs buffers.
-Two example filter functions are shipped by default -
-`projectile-buffers-with-file' and
-`projectile-buffers-with-file-or-process'."
- :group 'projectile
- :type 'function)
-
-(defcustom projectile-project-name nil
- "If this value is non-nil, it will be used as project name.
-
-It has precedence over function `projectile-project-name-function'."
- :group 'projectile
- :type 'string
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-project-name-function 'projectile-default-project-name
- "A function that receives the project-root and returns the project name.
-
-If variable `projectile-project-name' is non-nil, this function will not be used."
- :group 'projectile
- :type 'function
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-project-root-files
- '(
- "GTAGS" ; GNU Global tags
- "TAGS" ; etags/ctags are usually in the root of project
- "configure.ac" ; autoconf new style
- "configure.in" ; autoconf old style
- "cscope.out" ; cscope
- )
- "A list of files considered to mark the root of a project.
-The topmost match has precedence.
-See `projectile-register-project-type'."
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-project-root-files-bottom-up
- '(".projectile" ; projectile project marker
- ".git" ; Git VCS root dir
- ".hg" ; Mercurial VCS root dir
- ".fslckout" ; Fossil VCS root dir
- "_FOSSIL_" ; Fossil VCS root DB on Windows
- ".bzr" ; Bazaar VCS root dir
- "_darcs" ; Darcs VCS root dir
- )
- "A list of files considered to mark the root of a project.
-The bottommost (parentmost) match has precedence."
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-project-root-files-top-down-recurring
- '(".svn" ; Svn VCS root dir
- "CVS" ; Csv VCS root dir
- "Makefile")
- "A list of files considered to mark the root of a project.
-The search starts at the top and descends down till a directory
-that contains a match file but its parent does not. Thus, it's a
-bottommost match in the topmost sequence of directories
-containing a root file."
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-project-root-files-functions
- '(projectile-root-local
- projectile-root-bottom-up
- projectile-root-top-down
- projectile-root-top-down-recurring)
- "A list of functions for finding project roots."
- :group 'projectile
- :type '(repeat function))
-
-(defcustom projectile-dirconfig-comment-prefix
- nil
- "Projectile config file (.projectile) comment start marker.
-If specified, starting a line in a project's .projectile file with this
-character marks that line as a comment instead of a pattern.
-Similar to '#' in .gitignore files."
- :group 'projectile
- :type 'character
- :package-version '(projectile . "2.2.0"))
-
-(defcustom projectile-globally-ignored-files
- (list projectile-tags-file-name)
- "A list of files globally ignored by projectile."
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-globally-unignored-files nil
- "A list of files globally unignored by projectile.
-
-Regular expressions can be used."
- :group 'projectile
- :type '(repeat string)
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-globally-ignored-file-suffixes
- nil
- "A list of file suffixes globally ignored by projectile."
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-globally-ignored-directories
- '(".idea"
- ".ensime_cache"
- ".eunit"
- ".git"
- ".hg"
- ".fslckout"
- "_FOSSIL_"
- ".bzr"
- "_darcs"
- ".tox"
- ".svn"
- ".stack-work")
- "A list of directories globally ignored by projectile.
-
-Regular expressions can be used."
- :safe (lambda (x) (not (remq t (mapcar #'stringp x))))
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-globally-unignored-directories nil
- "A list of directories globally unignored by projectile."
- :group 'projectile
- :type '(repeat string)
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-globally-ignored-modes
- '("erc-mode"
- "help-mode"
- "completion-list-mode"
- "Buffer-menu-mode"
- "gnus-.*-mode"
- "occur-mode")
- "A list of regular expressions for major modes ignored by projectile.
-
-If a buffer is using a given major mode, projectile will ignore
-it for functions working with buffers."
- :group 'projectile
- :type '(repeat string))
-
-(defcustom projectile-globally-ignored-buffers nil
- "A list of buffer-names ignored by projectile.
-
-You can use either exact buffer names or regular expressions.
-If a buffer is in the list projectile will ignore it for
-functions working with buffers."
- :group 'projectile
- :type '(repeat string)
- :package-version '(projectile . "0.12.0"))
-
-(defcustom projectile-find-file-hook nil
- "Hooks run when a file is opened with `projectile-find-file'."
- :group 'projectile
- :type 'hook)
-
-(defcustom projectile-find-dir-hook nil
- "Hooks run when a directory is opened with `projectile-find-dir'."
- :group 'projectile
- :type 'hook)
-
-(defcustom projectile-switch-project-action 'projectile-find-file
- "Action invoked after switching projects with `projectile-switch-project'.
-
-Any function that does not take arguments will do."
- :group 'projectile
- :type 'function)
-
-(defcustom projectile-find-dir-includes-top-level nil
- "If true, add top-level dir to options offered by `projectile-find-dir'."
- :group 'projectile
- :type 'boolean)
-
-(defcustom projectile-use-git-grep nil
- "If true, use `vc-git-grep' in git projects."
- :group 'projectile
- :type 'boolean)
-
-(defcustom projectile-grep-finished-hook nil
- "Hooks run when `projectile-grep' finishes."
- :group 'projectile
- :type 'hook
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-test-prefix-function 'projectile-test-prefix
- "Function to find test files prefix based on PROJECT-TYPE."
- :group 'projectile
- :type 'function)
-
-(defcustom projectile-test-suffix-function 'projectile-test-suffix
- "Function to find test files suffix based on PROJECT-TYPE."
- :group 'projectile
- :type 'function)
-
-(defcustom projectile-related-files-fn-function 'projectile-related-files-fn
- "Function to find related files based on PROJECT-TYPE."
- :group 'projectile
- :type 'function)
-
-(defcustom projectile-dynamic-mode-line t
- "If true, update the mode-line dynamically.
-Only file buffers are affected by this, as the update happens via
-`find-file-hook'.
-
-See also `projectile-mode-line-function' and `projectile-update-mode-line'."
- :group 'projectile
- :type 'boolean
- :package-version '(projectile . "2.0.0"))
-
-(defcustom projectile-mode-line-function 'projectile-default-mode-line
- "The function to use to generate project-specific mode-line.
-The default function adds the project name and type to the mode-line.
-See also `projectile-update-mode-line'."
- :group 'projectile
- :type 'function
- :package-version '(projectile . "2.0.0"))
-
-
-;;; Idle Timer
-(defvar projectile-idle-timer nil
- "The timer object created when `projectile-enable-idle-timer' is non-nil.")
-
-(defcustom projectile-idle-timer-seconds 30
- "The idle period to use when `projectile-enable-idle-timer' is non-nil."
- :group 'projectile
- :type 'number)
-
-(defcustom projectile-idle-timer-hook '(projectile-regenerate-tags)
- "The hook run when `projectile-enable-idle-timer' is non-nil."
- :group 'projectile
- :type '(repeat symbol))
-
-(defcustom projectile-enable-idle-timer nil
- "Enables idle timer hook `projectile-idle-timer-functions'.
-
-When `projectile-enable-idle-timer' is non-nil, the hook
-`projectile-idle-timer-hook' is run each time Emacs has been idle
-for `projectile-idle-timer-seconds' seconds and we're in a
-project."
- :group 'projectile
- :set (lambda (symbol value)
- (set symbol value)
- (when projectile-idle-timer
- (cancel-timer projectile-idle-timer))
- (setq projectile-idle-timer nil)
- (when projectile-enable-idle-timer
- (setq projectile-idle-timer (run-with-idle-timer
- projectile-idle-timer-seconds t
- (lambda ()
- (when (projectile-project-p)
- (run-hooks 'projectile-idle-timer-hook)))))))
- :type 'boolean)
-
-(defvar projectile-projects-cache nil
- "A hashmap used to cache project file names to speed up related operations.")
-
-(defvar projectile-projects-cache-time nil
- "A hashmap used to record when we populated `projectile-projects-cache'.")
-
-(defvar projectile-project-root-cache (make-hash-table :test 'equal)
- "Cached value of function `projectile-project-root`.")
-
-(defvar projectile-project-type-cache (make-hash-table :test 'equal)
- "A hashmap used to cache project type to speed up related operations.")
-
-(defvar projectile-known-projects nil
- "List of locations where we have previously seen projects.
-The list of projects is ordered by the time they have been accessed.
-
-See also `projectile-remove-known-project',
-`projectile-cleanup-known-projects' and `projectile-clear-known-projects'.")
-
-(defvar projectile-known-projects-on-file nil
- "List of known projects reference point.
-
-Contains a copy of `projectile-known-projects' when it was last
-synchronized with `projectile-known-projects-file'.")
-
-(defcustom projectile-known-projects-file
- (expand-file-name "projectile-bookmarks.eld"
- user-emacs-directory)
- "Name and location of the Projectile's known projects file."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-ignored-projects nil
- "A list of projects not to be added to `projectile-known-projects'."
- :group 'projectile
- :type '(repeat :tag "Project list" directory)
- :package-version '(projectile . "0.11.0"))
-
-(defcustom projectile-ignored-project-function nil
- "Function to decide if a project is added to `projectile-known-projects'.
-
-Can be either nil, or a function that takes the truename of the
-project root as argument and returns non-nil if the project is to
-be ignored or nil otherwise.
-
-This function is only called if the project is not listed in
-`projectile-ignored-projects'.
-
-A suitable candidate would be `file-remote-p' to ignore remote
-projects."
- :group 'projectile
- :type '(choice
- (const :tag "Nothing" nil)
- (const :tag "Remote files" file-remote-p)
- function)
- :package-version '(projectile . "0.13.0"))
-
-(defcustom projectile-track-known-projects-automatically t
- "Controls whether Projectile will automatically register known projects.
-
-When set to nil you'll have always add projects explicitly with
-`projectile-add-known-project'."
- :group 'projectile
- :type 'boolean
- :package-version '(projectile . "1.0.0"))
-
-(defcustom projectile-project-search-path nil
- "List of folders where projectile is automatically going to look for projects.
-You can think of something like $PATH, but for projects instead of executables.
-Examples of such paths might be ~/projects, ~/work, etc."
- :group 'projectile
- :type 'list
- :package-version '(projectile . "1.0.0"))
-
-(defcustom projectile-git-command "git ls-files -zco --exclude-standard"
- "Command used by projectile to get the files in a git project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-git-submodule-command "git submodule --quiet foreach 'echo $path' | tr '\\n' '\\0'"
- "Command used by projectile to list submodules of a given git repository.
-Set to nil to disable listing submodules contents."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-git-ignored-command "git ls-files -zcoi --exclude-standard"
- "Command used by projectile to get the ignored files in a git project."
- :group 'projectile
- :type 'string
- :package-version '(projectile . "0.14.0"))
-
-(defcustom projectile-hg-command "hg locate -f -0 -I ."
- "Command used by projectile to get the files in a hg project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-fossil-command (concat "fossil ls | "
- (when (string-equal system-type
- "windows-nt")
- "dos2unix | ")
- "tr '\\n' '\\0'")
- "Command used by projectile to get the files in a fossil project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-bzr-command "bzr ls -R --versioned -0"
- "Command used by projectile to get the files in a bazaar project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-darcs-command "darcs show files -0 . "
- "Command used by projectile to get the files in a darcs project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-svn-command "svn list -R . | grep -v '$/' | tr '\\n' '\\0'"
- "Command used by projectile to get the files in a svn project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-generic-command
- (if (executable-find "fd")
- "fd . -0 --type f --color=never"
- "find . -type f -print0")
- "Command used by projectile to get the files in a generic project."
- :group 'projectile
- :type 'string)
-
-(defcustom projectile-vcs-dirty-state '("edited" "unregistered" "needs-update" "needs-merge" "unlocked-changes" "conflict")
- "List of states checked by `projectile-browse-dirty-projects'.
-Possible checked states are:
-\"edited\", \"unregistered\", \"needs-update\", \"needs-merge\",
-\"unlocked-changes\" and \"conflict\",
-as defined in `vc.el'."
- :group 'projectile
- :type '(repeat (string))
- :package-version '(projectile . "1.0.0"))
-
-(defcustom projectile-other-file-alist
- '( ;; handle C/C++ extensions
- ("cpp" . ("h" "hpp" "ipp"))
- ("ipp" . ("h" "hpp" "cpp"))
- ("hpp" . ("h" "ipp" "cpp" "cc"))
- ("cxx" . ("h" "hxx" "ixx"))
- ("ixx" . ("h" "hxx" "cxx"))
- ("hxx" . ("h" "ixx" "cxx"))
- ("c" . ("h"))
- ("m" . ("h"))
- ("mm" . ("h"))
- ("h" . ("c" "cc" "cpp" "ipp" "hpp" "cxx" "ixx" "hxx" "m" "mm"))
- ("cc" . ("h" "hh" "hpp"))
- ("hh" . ("cc"))
-
- ;; vertex shader and fragment shader extensions in glsl
- ("vert" . ("frag"))
- ("frag" . ("vert"))
-
- ;; handle files with no extension
- (nil . ("lock" "gpg"))
- ("lock" . (""))
- ("gpg" . (""))
- )
- "Alist of extensions for switching to file with the same name,
- using other extensions based on the extension of current
- file."
- :type 'alist)
-
-(defcustom projectile-create-missing-test-files nil
- "During toggling, if non-nil enables creating test files if not found.
-
-When not-nil, every call to projectile-find-implementation-or-test-*
-creates test files if not found on the file system. Defaults to nil.
-It assumes the test/ folder is at the same level as src/."
- :group 'projectile
- :type 'boolean)
-
-(defcustom projectile-after-switch-project-hook nil
- "Hooks run right after project is switched."
- :group 'projectile
- :type 'hook)
-
-(defcustom projectile-before-switch-project-hook nil
- "Hooks run when right before project is switched."
- :group 'projectile
- :type 'hook)
-
-(defcustom projectile-current-project-on-switch 'remove
- "Determines whether to display current project when switching projects.
-
-When set to 'remove current project is not included, 'move-to-end
-will display current project and the end of the list of known
-projects, 'keep will leave the current project at the default
-position."
- :group 'projectile
- :type '(radio
- (const :tag "Remove" remove)
- (const :tag "Move to end" move-to-end)
- (const :tag "Keep" keep)))
-
-(defcustom projectile-max-file-buffer-count nil
- "Maximum number of file buffers per project that are kept open.
-
-If the value is nil, there is no limit to the opend buffers count."
- :group 'projectile
- :type 'integer
- :package-version '(projectile . "2.2.0"))
-
-
-;;; Version information
-
-;;;###autoload
-(defun projectile-version (&optional show-version)
- "Get the Projectile version as string.
-
-If called interactively or if SHOW-VERSION is non-nil, show the
-version in the echo area and the messages buffer.
-
-The returned string includes both, the version from package.el
-and the library version, if both a present and different.
-
-If the version number could not be determined, signal an error,
-if called interactively, or if SHOW-VERSION is non-nil, otherwise
-just return nil."
- (interactive (list t))
- (if (require 'pkg-info nil t)
- (let ((version (pkg-info-version-info 'projectile)))
- (when show-version
- (message "Projectile %s" version))
- version)
- (error "Cannot determine version without package pkg-info")))
-
-;;; Misc utility functions
-(defun projectile-difference (list1 list2)
- (cl-remove-if
- (lambda (x) (member x list2))
- list1))
-
-(defun projectile-unixy-system-p ()
- "Check to see if unixy text utilities are installed."
- (cl-every
- (lambda (x) (executable-find x))
- '("grep" "cut" "uniq")))
-
-(defun projectile-symbol-or-selection-at-point ()
- "Get the symbol or selected text at point."
- (if (use-region-p)
- (buffer-substring-no-properties (region-beginning) (region-end))
- (projectile-symbol-at-point)))
-
-(defun projectile-symbol-at-point ()
- "Get the symbol at point and strip its properties."
- (substring-no-properties (or (thing-at-point 'symbol) "")))
-
-(defun projectile-generate-process-name (process make-new)
- "Infer the buffer name for PROCESS or generate a new one if MAKE-NEW is true."
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (base-name (format "*%s %s*" process (projectile-project-name project))))
- (if make-new
- (generate-new-buffer-name base-name)
- base-name)))
-
-
-;;; Serialization
-(defun projectile-serialize (data filename)
- "Serialize DATA to FILENAME.
-
-The saved data can be restored with `projectile-unserialize'."
- (when (file-writable-p filename)
- (with-temp-file filename
- (insert (let (print-length) (prin1-to-string data))))))
-
-(defun projectile-unserialize (filename)
- "Read data serialized by `projectile-serialize' from FILENAME."
- (with-demoted-errors
- "Error during file deserialization: %S"
- (when (file-exists-p filename)
- (with-temp-buffer
- (insert-file-contents filename)
- ;; this will blow up if the contents of the file aren't
- ;; lisp data structures
- (read (buffer-string))))))
-
-
-;;; Caching
-(defvar projectile-file-exists-cache
- (make-hash-table :test 'equal)
- "Cached `projectile-file-exists-p' results.")
-
-(defvar projectile-file-exists-cache-timer nil
- "Timer for scheduling`projectile-file-exists-cache-cleanup'.")
-
-(defun projectile-file-exists-cache-cleanup ()
- "Removed timed out cache entries and reschedules or remove the
-timer if no more items are in the cache."
- (let ((now (current-time)))
- (maphash (lambda (key value)
- (if (time-less-p (cdr value) now)
- (remhash key projectile-file-exists-cache)))
- projectile-file-exists-cache)
- (setq projectile-file-exists-cache-timer
- (if (> (hash-table-count projectile-file-exists-cache) 0)
- (run-with-timer 10 nil 'projectile-file-exists-cache-cleanup)))))
-
-(defun projectile-file-exists-p (filename)
- "Return t if file FILENAME exist.
-A wrapper around `file-exists-p' with additional caching support."
- (let* ((file-remote (file-remote-p filename))
- (expire-seconds
- (if file-remote
- (and projectile-file-exists-remote-cache-expire
- (> projectile-file-exists-remote-cache-expire 0)
- projectile-file-exists-remote-cache-expire)
- (and projectile-file-exists-local-cache-expire
- (> projectile-file-exists-local-cache-expire 0)
- projectile-file-exists-local-cache-expire)))
- (remote-file-name-inhibit-cache (if expire-seconds
- expire-seconds
- remote-file-name-inhibit-cache)))
- (if (not expire-seconds)
- (file-exists-p filename)
- (let* ((current-time (current-time))
- (cached (gethash filename projectile-file-exists-cache))
- (cached-value (if cached (car cached)))
- (cached-expire (if cached (cdr cached)))
- (cached-expired (if cached (time-less-p cached-expire current-time) t))
- (value (or (and (not cached-expired) cached-value)
- (if (file-exists-p filename) 'found 'notfound))))
- (when (or (not cached) cached-expired)
- (puthash filename
- (cons value (time-add current-time (seconds-to-time expire-seconds)))
- projectile-file-exists-cache))
- (unless projectile-file-exists-cache-timer
- (setq projectile-file-exists-cache-timer
- (run-with-timer 10 nil 'projectile-file-exists-cache-cleanup)))
- (equal value 'found)))))
-
-;;;###autoload
-(defun projectile-invalidate-cache (prompt)
- "Remove the current project's files from `projectile-projects-cache'.
-
-With a prefix argument PROMPT prompts for the name of the project whose cache
-to invalidate."
- (interactive "P")
- (let ((project-root
- (if prompt
- (completing-read "Remove cache for: "
- (hash-table-keys projectile-projects-cache))
- (projectile-ensure-project (projectile-project-root)))))
- (setq projectile-project-root-cache (make-hash-table :test 'equal))
- (remhash project-root projectile-project-type-cache)
- (remhash project-root projectile-projects-cache)
- (remhash project-root projectile-projects-cache-time)
- (projectile-serialize-cache)
- (when projectile-verbose
- (message "Invalidated Projectile cache for %s."
- (propertize project-root 'face 'font-lock-keyword-face))))
- (when (fboundp 'recentf-cleanup)
- (recentf-cleanup)))
-
-(defun projectile-time-seconds ()
- "Return the number of seconds since the unix epoch."
- (cl-destructuring-bind (high low _usec _psec) (current-time)
- (+ (lsh high 16) low)))
-
-(defun projectile-cache-project (project files)
- "Cache PROJECTs FILES.
-The cache is created both in memory and on the hard drive."
- (when projectile-enable-caching
- (puthash project files projectile-projects-cache)
- (puthash project (projectile-time-seconds) projectile-projects-cache-time)
- (projectile-serialize-cache)))
-
-;;;###autoload
-(defun projectile-purge-file-from-cache (file)
- "Purge FILE from the cache of the current project."
- (interactive
- (list (projectile-completing-read
- "Remove file from cache: "
- (projectile-current-project-files))))
- (let* ((project-root (projectile-project-root))
- (project-cache (gethash project-root projectile-projects-cache)))
- (if (projectile-file-cached-p file project-root)
- (progn
- (puthash project-root (remove file project-cache) projectile-projects-cache)
- (projectile-serialize-cache)
- (when projectile-verbose
- (message "%s removed from cache" file)))
- (error "%s is not in the cache" file))))
-
-;;;###autoload
-(defun projectile-purge-dir-from-cache (dir)
- "Purge DIR from the cache of the current project."
- (interactive
- (list (projectile-completing-read
- "Remove directory from cache: "
- (projectile-current-project-dirs))))
- (let* ((project-root (projectile-project-root))
- (project-cache (gethash project-root projectile-projects-cache)))
- (puthash project-root
- (cl-remove-if (lambda (str) (string-prefix-p dir str)) project-cache)
- projectile-projects-cache)))
-
-(defun projectile-file-cached-p (file project)
- "Check if FILE is already in PROJECT cache."
- (member file (gethash project projectile-projects-cache)))
-
-;;;###autoload
-(defun projectile-cache-current-file ()
- "Add the currently visited file to the cache."
- (interactive)
- (let ((current-project (projectile-project-root)))
- (when (and (buffer-file-name) (gethash (projectile-project-root) projectile-projects-cache))
- (let* ((abs-current-file (file-truename (buffer-file-name)))
- (current-file (file-relative-name abs-current-file current-project)))
- (unless (or (projectile-file-cached-p current-file current-project)
- (projectile-ignored-directory-p (file-name-directory abs-current-file))
- (projectile-ignored-file-p abs-current-file))
- (puthash current-project
- (cons current-file (gethash current-project projectile-projects-cache))
- projectile-projects-cache)
- (projectile-serialize-cache)
- (message "File %s added to project %s cache."
- (propertize current-file 'face 'font-lock-keyword-face)
- (propertize current-project 'face 'font-lock-keyword-face)))))))
-
-;; cache opened files automatically to reduce the need for cache invalidation
-(defun projectile-cache-files-find-file-hook ()
- "Function for caching files with `find-file-hook'."
- (let ((project-root (projectile-project-p)))
- (when (and projectile-enable-caching
- project-root
- (not (projectile-ignored-project-p project-root)))
- (projectile-cache-current-file))))
-
-(defun projectile-track-known-projects-find-file-hook ()
- "Function for caching projects with `find-file-hook'."
- (when (and projectile-track-known-projects-automatically (projectile-project-p))
- (projectile-add-known-project (projectile-project-root))))
-
-(defun projectile-maybe-invalidate-cache (force)
- "Invalidate if FORCE or project's dirconfig newer than cache."
- (when (or force (file-newer-than-file-p (projectile-dirconfig-file)
- projectile-cache-file))
- (projectile-invalidate-cache nil)))
-
-;;;###autoload
-(defun projectile-discover-projects-in-directory (directory)
- "Discover any projects in DIRECTORY and add them to the projectile cache.
-This function is not recursive and only adds projects with roots
-at the top level of DIRECTORY."
- (interactive
- (list (read-directory-name "Starting directory: ")))
- (let ((subdirs (directory-files directory t)))
- (mapcar
- (lambda (dir)
- (when (and (file-directory-p dir)
- (not (member (file-name-nondirectory dir) '(".." "."))))
- (when (projectile-project-p dir)
- (projectile-add-known-project dir))))
- subdirs)))
-
-;;;###autoload
-(defun projectile-discover-projects-in-search-path ()
- "Discover projects in `projectile-project-search-path'.
-Invoked automatically when `projectile-mode' is enabled."
- (interactive)
- (mapcar #'projectile-discover-projects-in-directory projectile-project-search-path))
-
-
-(defun delete-file-projectile-remove-from-cache (filename &optional _trash)
- (if (and projectile-enable-caching projectile-auto-update-cache (projectile-project-p))
- (let* ((project-root (projectile-project-root))
- (true-filename (file-truename filename))
- (relative-filename (file-relative-name true-filename project-root)))
- (if (projectile-file-cached-p relative-filename project-root)
- (projectile-purge-file-from-cache relative-filename)))))
-
-
-;;; Project root related utilities
-(defun projectile-parent (path)
- "Return the parent directory of PATH.
-PATH may be a file or directory and directory paths may end with a slash."
- (directory-file-name (file-name-directory (directory-file-name (expand-file-name path)))))
-
-(defun projectile-locate-dominating-file (file name)
- "Look up the directory hierarchy from FILE for a directory containing NAME.
-Stop at the first parent directory containing a file NAME,
-and return the directory. Return nil if not found.
-Instead of a string, NAME can also be a predicate taking one argument
-\(a directory) and returning a non-nil value if that directory is the one for
-which we're looking."
- ;; copied from files.el (stripped comments) emacs-24 bzr branch 2014-03-28 10:20
- (setq file (abbreviate-file-name file))
- (let ((root nil)
- try)
- (while (not (or root
- (null file)
- (string-match locate-dominating-stop-dir-regexp file)))
- (setq try (if (stringp name)
- (projectile-file-exists-p (expand-file-name name file))
- (funcall name file)))
- (cond (try (setq root file))
- ((equal file (setq file (file-name-directory
- (directory-file-name file))))
- (setq file nil))))
- (and root (expand-file-name (file-name-as-directory root)))))
-
-(defvar-local projectile-project-root nil
- "Defines a custom Projectile project root.
-This is intended to be used as a file local variable.")
-
-(defun projectile-root-local (_dir)
- "A simple wrapper around `projectile-project-root'."
- projectile-project-root)
-
-(defun projectile-root-top-down (dir &optional list)
- "Identify a project root in DIR by top-down search for files in LIST.
-If LIST is nil, use `projectile-project-root-files' instead.
-Return the first (topmost) matched directory or nil if not found."
- (projectile-locate-dominating-file
- dir
- (lambda (dir)
- (cl-find-if (lambda (f) (projectile-file-exists-p (expand-file-name f dir)))
- (or list projectile-project-root-files)))))
-
-(defun projectile-root-bottom-up (dir &optional list)
- "Identify a project root in DIR by bottom-up search for files in LIST.
-If LIST is nil, use `projectile-project-root-files-bottom-up' instead.
-Return the first (bottommost) matched directory or nil if not found."
- (cl-some (lambda (name) (projectile-locate-dominating-file dir name))
- (or list projectile-project-root-files-bottom-up)))
-
-(defun projectile-root-top-down-recurring (dir &optional list)
- "Identify a project root in DIR by recurring top-down search for files in LIST.
-If LIST is nil, use `projectile-project-root-files-top-down-recurring'
-instead. Return the last (bottommost) matched directory in the
-topmost sequence of matched directories. Nil otherwise."
- (cl-some
- (lambda (f)
- (projectile-locate-dominating-file
- dir
- (lambda (dir)
- (and (projectile-file-exists-p (expand-file-name f dir))
- (or (string-match locate-dominating-stop-dir-regexp (projectile-parent dir))
- (not (projectile-file-exists-p (expand-file-name f (projectile-parent dir)))))))))
- (or list projectile-project-root-files-top-down-recurring)))
-
-(defun projectile-project-root (&optional dir)
- "Retrieves the root directory of a project if available.
-If DIR is not supplied its set to the current directory by default."
- ;; the cached value will be 'none in the case of no project root (this is to
- ;; ensure it is not reevaluated each time when not inside a project) so use
- ;; cl-subst to replace this 'none value with nil so a nil value is used
- ;; instead
- (let ((dir (or dir default-directory)))
- ;; Back out of any archives, the project will live on the outside and
- ;; searching them is slow.
- (when (and (fboundp 'tramp-archive-file-name-archive)
- (tramp-archive-file-name-p dir))
- (setq dir (file-name-directory (tramp-archive-file-name-archive dir))))
- (cl-subst nil 'none
- ;; The `is-local' and `is-connected' variables are
- ;; used to fix the behavior where Emacs hangs
- ;; because of Projectile when you open a file over
- ;; TRAMP. It basically prevents Projectile from
- ;; trying to find information about files for which
- ;; it's not possible to get that information right
- ;; now.
- (or (let ((is-local (not (file-remote-p dir))) ;; `true' if the file is local
- (is-connected (file-remote-p dir nil t))) ;; `true' if the file is remote AND we are connected to the remote
- (when (or is-local is-connected)
- (cl-some
- (lambda (func)
- (let* ((cache-key (format "%s-%s" func dir))
- (cache-value (gethash cache-key projectile-project-root-cache)))
- (if (and cache-value (file-exists-p cache-value))
- cache-value
- (let ((value (funcall func (file-truename dir))))
- (puthash cache-key value projectile-project-root-cache)
- value))))
- projectile-project-root-files-functions)))
- ;; set cached to none so is non-nil so we don't try
- ;; and look it up again
- 'none))))
-
-(defun projectile-ensure-project (dir)
- "Ensure that DIR is non-nil.
-Useful for commands that expect the presence of a project.
-Controlled by `projectile-require-project-root'."
- (if dir
- dir
- (cond
- ((eq projectile-require-project-root 'prompt) (projectile-completing-read
- "Switch to project: " projectile-known-projects))
- (projectile-require-project-root (error "Projectile can't find a project definition in %s" dir))
- (t default-directory))))
-
-(defun projectile-project-p (&optional dir)
- "Check if DIR is a project.
-Defaults to the current directory if not provided
-explicitly."
- (projectile-project-root (or dir default-directory)))
-
-(defun projectile-default-project-name (project-root)
- "Default function used create project name to be displayed based on the value of PROJECT-ROOT."
- (file-name-nondirectory (directory-file-name project-root)))
-
-(defun projectile-project-name (&optional project)
- "Return project name.
-If PROJECT is not specified acts on the current project."
- (or projectile-project-name
- (let ((project-root (or project (projectile-project-root))))
- (if project-root
- (funcall projectile-project-name-function project-root)
- "-"))))
-
-
-;;; Project indexing
-(defun projectile-get-project-directories (project-dir)
- "Get the list of PROJECT-DIR directories that are of interest to the user."
- (mapcar (lambda (subdir) (concat project-dir subdir))
- (or (nth 0 (projectile-parse-dirconfig-file)) '(""))))
-
-(defun projectile--directory-p (directory)
- "Checks if DIRECTORY is a string designating a valid directory."
- (and (stringp directory) (file-directory-p directory)))
-
-(defun projectile-dir-files (directory)
- "List the files in DIRECTORY and in its sub-directories.
-Files are returned as relative paths to DIRECTORY."
- (unless (projectile--directory-p directory)
- (error "Directory %S does not exist" directory))
- ;; check for a cache hit first if caching is enabled
- (let ((files-list (and projectile-enable-caching
- (gethash directory projectile-projects-cache))))
- ;; cache disabled or cache miss
- (or files-list
- (let ((vcs (projectile-project-vcs directory)))
- (pcase projectile-indexing-method
- ('native (projectile-dir-files-native directory))
- ;; use external tools to get the project files
- ('hybrid (projectile-adjust-files directory vcs (projectile-dir-files-alien directory)))
- ('alien (projectile-dir-files-alien directory))
- (_ (user-error "Unsupported indexing method `%S'" projectile-indexing-method)))))))
-
-;;; Native Project Indexing
-;;
-;; This corresponds to `projectile-indexing-method' being set to native.
-(defun projectile-dir-files-native (directory)
- "Get the files for ROOT under DIRECTORY using just Emacs Lisp."
- (let ((progress-reporter
- (make-progress-reporter
- (format "Projectile is indexing %s"
- (propertize directory 'face 'font-lock-keyword-face)))))
- ;; we need the files with paths relative to the project root
- (mapcar (lambda (file) (file-relative-name file directory))
- (projectile-index-directory directory (projectile-filtering-patterns)
- progress-reporter))))
-
-(defun projectile-index-directory (directory patterns progress-reporter &optional ignored-files ignored-directories)
- "Index DIRECTORY taking into account PATTERNS.
-
-The function calls itself recursively until all sub-directories
-have been indexed. The PROGRESS-REPORTER is updated while the
-function is executing. The list of IGNORED-FILES and
-IGNORED-DIRECTORIES may optionally be provided."
- ;; we compute the ignored files and directories only once and then we reuse the
- ;; pre-computed values in the subsequent recursive invocations of the function
- (let ((ignored-files (or ignored-files (projectile-ignored-files)))
- (ignored-directories (or ignored-directories (projectile-ignored-directories))))
- (apply #'append
- (mapcar
- (lambda (f)
- (unless (or (and patterns (projectile-ignored-rel-p f directory patterns))
- (member (file-name-nondirectory (directory-file-name f))
- '("." ".." ".svn" ".cvs")))
- (progress-reporter-update progress-reporter)
- (if (file-directory-p f)
- (unless (projectile-ignored-directory-p
- (file-name-as-directory f)
- ignored-directories)
- (projectile-index-directory
- f patterns progress-reporter ignored-files ignored-directories))
- (unless (projectile-ignored-file-p f ignored-files)
- (list f)))))
- (directory-files directory t)))))
-
-;;; Alien Project Indexing
-;;
-;; This corresponds to `projectile-indexing-method' being set to hybrid or alien.
-;; The only difference between the two methods is that alien doesn't do
-;; any post-processing of the files obtained via the external command.
-(defun projectile-dir-files-alien (directory)
- "Get the files for DIRECTORY using external tools."
- (let ((vcs (projectile-project-vcs directory)))
- (cond
- ((eq vcs 'git)
- (nconc (projectile-files-via-ext-command directory (projectile-get-ext-command vcs))
- (projectile-get-sub-projects-files directory vcs)))
- (t (projectile-files-via-ext-command directory (projectile-get-ext-command vcs))))))
-
-(define-obsolete-function-alias 'projectile-dir-files-external 'projectile-dir-files-alien "2.0.0")
-(define-obsolete-function-alias 'projectile-get-repo-files 'projectile-dir-files-alien "2.0.0")
-
-(defun projectile-get-ext-command (vcs)
- "Determine which external command to invoke based on the project's VCS.
-Fallback to a generic command when not in a VCS-controlled project."
- (pcase vcs
- ('git projectile-git-command)
- ('hg projectile-hg-command)
- ('fossil projectile-fossil-command)
- ('bzr projectile-bzr-command)
- ('darcs projectile-darcs-command)
- ('svn projectile-svn-command)
- (_ projectile-generic-command)))
-
-(defun projectile-get-sub-projects-command (vcs)
- "Get the sub-projects command for VCS.
-Currently that's supported just for Git (sub-projects being Git
-sub-modules there)."
- (pcase vcs
- ('git projectile-git-submodule-command)
- (_ "")))
-
-(defun projectile-get-ext-ignored-command (vcs)
- "Determine which external command to invoke based on the project's VCS."
- (pcase vcs
- ('git projectile-git-ignored-command)
- ;; TODO: Add support for other VCS
- (_ nil)))
-
-(defun projectile-flatten (lst)
- "Take a nested list LST and return its contents as a single, flat list."
- (if (and (listp lst) (listp (cdr lst)))
- (cl-mapcan 'projectile-flatten lst)
- (list lst)))
-
-(defun projectile-get-all-sub-projects (project)
- "Get all sub-projects for a given project.
-
-PROJECT is base directory to start search recursively."
- (let ((submodules (projectile-get-immediate-sub-projects project)))
- (cond
- ((null submodules)
- nil)
- (t
- (nconc submodules (projectile-flatten
- ;; recursively get sub-projects of each sub-project
- (mapcar (lambda (s)
- (projectile-get-all-sub-projects s)) submodules)))))))
-
-(defun projectile-get-immediate-sub-projects (path)
- "Get immediate sub-projects for a given project without recursing.
-
-PATH is the vcs root or project root from which to start
-searching, and should end with an appropriate path delimiter, such as
-'/' or a '\\'.
-
-If the vcs get-sub-projects query returns results outside of path,
-they are excluded from the results of this function."
- (let* ((vcs (projectile-project-vcs path))
- ;; search for sub-projects under current project `project'
- (submodules (mapcar
- (lambda (s)
- (file-name-as-directory (expand-file-name s path)))
- (projectile-files-via-ext-command path (projectile-get-sub-projects-command vcs))))
- (project-child-folder-regex
- (concat "\\`"
- (regexp-quote path))))
-
- ;; If project root is inside of an VCS folder, but not actually an
- ;; VCS root itself, submodules external to the project will be
- ;; included in the VCS get sub-projects result. Let's remove them.
- (cl-remove-if-not
- (lambda (submodule)
- (string-match-p project-child-folder-regex
- submodule))
- submodules)))
-
-(defun projectile-get-sub-projects-files (project-root _vcs)
- "Get files from sub-projects for PROJECT-ROOT recursively."
- (projectile-flatten
- (mapcar (lambda (sub-project)
- (let ((project-relative-path
- (file-name-as-directory (file-relative-name
- sub-project project-root))))
- (mapcar (lambda (file)
- (concat project-relative-path file))
- ;; TODO: Seems we forgot git hardcoded here
- (projectile-files-via-ext-command sub-project projectile-git-command))))
- (projectile-get-all-sub-projects project-root))))
-
-(defun projectile-get-repo-ignored-files (project vcs)
- "Get a list of the files ignored in the PROJECT using VCS."
- (let ((cmd (projectile-get-ext-ignored-command vcs)))
- (when cmd
- (projectile-files-via-ext-command project cmd))))
-
-(defun projectile-get-repo-ignored-directory (project dir vcs)
- "Get a list of the files ignored in the PROJECT in the directory DIR.
-VCS is the VCS of the project."
- (let ((cmd (projectile-get-ext-ignored-command vcs)))
- (when cmd
- (projectile-files-via-ext-command project (concat cmd " " dir)))))
-
-(defun projectile-files-via-ext-command (root command)
- "Get a list of relative file names in the project ROOT by executing COMMAND.
-
-If `command' is nil or an empty string, return nil.
-This allows commands to be disabled."
- (when (stringp command)
- (let ((default-directory root))
- (split-string (shell-command-to-string command) "\0" t))))
-
-(defun projectile-adjust-files (project vcs files)
- "First remove ignored files from FILES, then add back unignored files."
- (projectile-add-unignored project vcs (projectile-remove-ignored files)))
-
-(defun projectile-remove-ignored (files)
- "Remove ignored files and folders from FILES.
-
-If ignored directory prefixed with '*', then ignore all
-directories/subdirectories with matching filename,
-otherwise operates relative to project root."
- (let ((ignored-files (projectile-ignored-files-rel))
- (ignored-dirs (projectile-ignored-directories-rel)))
- (cl-remove-if
- (lambda (file)
- (or (cl-some
- (lambda (f)
- (string= f (file-name-nondirectory file)))
- ignored-files)
- (cl-some
- (lambda (dir)
- ;; if the directory is prefixed with '*' then ignore all directories matching that name
- (if (string-prefix-p "*" dir)
- ;; remove '*' and trailing slash from ignored directory name
- (let ((d (substring dir 1 (if (equal (substring dir -1) "/") -1 nil))))
- (cl-some
- (lambda (p)
- (string= d p))
- ;; split path by '/', remove empty strings, and check if any subdirs match name 'd'
- (delete "" (split-string (or (file-name-directory file) "") "/"))))
- (string-prefix-p dir file)))
- ignored-dirs)
- (cl-some
- (lambda (suf)
- (string-suffix-p suf file t))
- projectile-globally-ignored-file-suffixes)))
- files)))
-
-(defun projectile-keep-ignored-files (project vcs files)
- "Filter FILES to retain only those that are ignored."
- (when files
- (cl-remove-if-not
- (lambda (file)
- (cl-some (lambda (f) (string-prefix-p f file)) files))
- (projectile-get-repo-ignored-files project vcs))))
-
-(defun projectile-keep-ignored-directories (project vcs directories)
- "Get ignored files within each of DIRECTORIES."
- (when directories
- (let (result)
- (dolist (dir directories result)
- (setq result (append result
- (projectile-get-repo-ignored-directory project dir vcs))))
- result)))
-
-(defun projectile-add-unignored (project vcs files)
- "This adds unignored files to FILES.
-
-Useful because the VCS may not return ignored files at all. In
-this case unignored files will be absent from FILES."
- (let ((unignored-files (projectile-keep-ignored-files
- project
- vcs
- (projectile-unignored-files-rel)))
- (unignored-paths (projectile-remove-ignored
- (projectile-keep-ignored-directories
- project
- vcs
- (projectile-unignored-directories-rel)))))
- (append files unignored-files unignored-paths)))
-
-(defun projectile-buffers-with-file (buffers)
- "Return only those BUFFERS backed by files."
- (cl-remove-if-not (lambda (b) (buffer-file-name b)) buffers))
-
-(defun projectile-buffers-with-file-or-process (buffers)
- "Return only those BUFFERS backed by files or processes."
- (cl-remove-if-not (lambda (b) (or (buffer-file-name b)
- (get-buffer-process b))) buffers))
-
-(defun projectile-project-buffers (&optional project)
- "Get a list of a project's buffers.
-If PROJECT is not specified the command acts on the current project."
- (let* ((project-root (or project (projectile-project-root)))
- (all-buffers (cl-remove-if-not
- (lambda (buffer)
- (projectile-project-buffer-p buffer project-root))
- (buffer-list))))
- (if projectile-buffers-filter-function
- (funcall projectile-buffers-filter-function all-buffers)
- all-buffers)))
-
-(defun projectile-process-current-project-buffers (action)
- "Process the current project's buffers using ACTION."
- (let ((project-buffers (projectile-project-buffers)))
- (dolist (buffer project-buffers)
- (funcall action buffer))))
-
-(defun projectile-project-buffer-files (&optional project)
- "Get a list of a project's buffer files.
-If PROJECT is not specified the command acts on the current project."
- (let ((project-root (or project (projectile-project-root))))
- (mapcar
- (lambda (buffer)
- (file-relative-name
- (buffer-file-name buffer)
- project-root))
- (projectile-buffers-with-file
- (projectile-project-buffers project)))))
-
-(defun projectile-project-buffer-p (buffer project-root)
- "Check if BUFFER is under PROJECT-ROOT."
- (with-current-buffer buffer
- (and (not (string-prefix-p " " (buffer-name buffer)))
- (not (projectile-ignored-buffer-p buffer))
- default-directory
- (string-equal (file-remote-p default-directory)
- (file-remote-p project-root))
- (not (string-match-p "^http\\(s\\)?://" default-directory))
- (string-prefix-p project-root (file-truename default-directory) (eq system-type 'windows-nt)))))
-
-(defun projectile-ignored-buffer-p (buffer)
- "Check if BUFFER should be ignored.
-
-Regular expressions can be use."
- (or
- (with-current-buffer buffer
- (cl-some
- (lambda (name)
- (string-match-p name (buffer-name)))
- projectile-globally-ignored-buffers))
- (with-current-buffer buffer
- (cl-some
- (lambda (mode)
- (string-match-p (concat "^" mode "$")
- (symbol-name major-mode)))
- projectile-globally-ignored-modes))))
-
-(defun projectile-recently-active-files ()
- "Get list of recently active files.
-
-Files are ordered by recently active buffers, and then recently
-opened through use of recentf."
- (let ((project-buffer-files (projectile-project-buffer-files)))
- (append project-buffer-files
- (projectile-difference
- (projectile-recentf-files)
- project-buffer-files))))
-
-(defun projectile-project-buffer-names ()
- "Get a list of project buffer names."
- (mapcar #'buffer-name (projectile-project-buffers)))
-
-(defun projectile-prepend-project-name (string)
- "Prepend the current project's name to STRING."
- (format "[%s] %s" (projectile-project-name) string))
-
-(defun projectile-read-buffer-to-switch (prompt)
- "Read the name of a buffer to switch to, prompting with PROMPT.
-
-This function excludes the current buffer from the offered
-choices."
- (projectile-completing-read
- prompt
- (delete (buffer-name (current-buffer))
- (projectile-project-buffer-names))))
-
-;;;###autoload
-(defun projectile-switch-to-buffer ()
- "Switch to a project buffer."
- (interactive)
- (switch-to-buffer
- (projectile-read-buffer-to-switch "Switch to buffer: ")))
-
-;;;###autoload
-(defun projectile-switch-to-buffer-other-window ()
- "Switch to a project buffer and show it in another window."
- (interactive)
- (switch-to-buffer-other-window
- (projectile-read-buffer-to-switch "Switch to buffer: ")))
-
-;;;###autoload
-(defun projectile-switch-to-buffer-other-frame ()
- "Switch to a project buffer and show it in another frame."
- (interactive)
- (switch-to-buffer-other-frame
- (projectile-read-buffer-to-switch "Switch to buffer: ")))
-
-;;;###autoload
-(defun projectile-display-buffer ()
- "Display a project buffer in another window without selecting it."
- (interactive)
- (display-buffer
- (projectile-completing-read
- "Display buffer: "
- (projectile-project-buffer-names))))
-
-;;;###autoload
-(defun projectile-project-buffers-other-buffer ()
- "Switch to the most recently selected buffer project buffer.
-Only buffers not visible in windows are returned."
- (interactive)
- (switch-to-buffer (car (projectile-project-buffers-non-visible))) nil t)
-
-(defun projectile-project-buffers-non-visible ()
- "Get a list of non visible project buffers."
- (cl-remove-if-not
- (lambda (buffer)
- (not (get-buffer-window buffer 'visible)))
- (projectile-project-buffers)))
-
-;;;###autoload
-(defun projectile-multi-occur (&optional nlines)
- "Do a `multi-occur' in the project's buffers.
-With a prefix argument, show NLINES of context."
- (interactive "P")
- (let ((project (projectile-ensure-project (projectile-project-root))))
- (multi-occur (projectile-project-buffers project)
- (car (occur-read-primary-args))
- nlines)))
-
-(defun projectile-normalise-paths (patterns)
- "Remove leading `/' from the elements of PATTERNS."
- (delq nil (mapcar (lambda (pat) (and (string-prefix-p "/" pat)
- ;; remove the leading /
- (substring pat 1)))
- patterns)))
-
-(defun projectile-expand-paths (paths)
- "Expand the elements of PATHS.
-
-Elements containing wildcards are expanded and spliced into the
-resulting paths. The returned PATHS are absolute, based on the
-projectile project root."
- (let ((default-directory (projectile-project-root)))
- (projectile-flatten (mapcar
- (lambda (pattern)
- (or (file-expand-wildcards pattern t)
- (projectile-expand-root pattern)))
- paths))))
-
-(defun projectile-normalise-patterns (patterns)
- "Remove paths from PATTERNS."
- (cl-remove-if (lambda (pat) (string-prefix-p "/" pat)) patterns))
-
-(defun projectile-make-relative-to-root (files)
- "Make FILES relative to the project root."
- (let ((project-root (projectile-project-root)))
- (mapcar (lambda (f) (file-relative-name f project-root)) files)))
-
-(defun projectile-ignored-directory-p
- (directory &optional ignored-directories)
- "Check if DIRECTORY should be ignored.
-
-Regular expressions can be used. A pre-computed list of
-IGNORED-DIRECTORIES may optionally be provided."
- (cl-some
- (lambda (name)
- (string-match-p name directory))
- (or ignored-directories (projectile-ignored-directories))))
-
-(defun projectile-ignored-file-p (file &optional ignored-files)
- "Check if FILE should be ignored.
-
-Regular expressions can be used. A pre-computed list of
-IGNORED-FILES may optionally be provided."
- (cl-some
- (lambda (name)
- (string-match-p name file))
- (or ignored-files (projectile-ignored-files))))
-
-(defun projectile-check-pattern-p (file pattern)
- "Check if FILE meets PATTERN."
- (or (string-suffix-p (directory-file-name pattern)
- (directory-file-name file))
- (member file (file-expand-wildcards pattern t))))
-
-(defun projectile-ignored-rel-p (file directory patterns)
- "Check if FILE should be ignored relative to DIRECTORY
-according to PATTERNS: (ignored . unignored)"
- (let ((default-directory directory))
- (and (cl-some
- (lambda (pat) (projectile-check-pattern-p file pat))
- (car patterns))
- (cl-notany
- (lambda (pat) (projectile-check-pattern-p file pat))
- (cdr patterns)))))
-
-(defun projectile-ignored-files ()
- "Return list of ignored files."
- (projectile-difference
- (mapcar
- #'projectile-expand-root
- (append
- projectile-globally-ignored-files
- (projectile-project-ignored-files)))
- (projectile-unignored-files)))
-
-(defun projectile-ignored-directories ()
- "Return list of ignored directories."
- (projectile-difference
- (mapcar
- #'file-name-as-directory
- (mapcar
- #'projectile-expand-root
- (append
- projectile-globally-ignored-directories
- (projectile-project-ignored-directories))))
- (projectile-unignored-directories)))
-
-(defun projectile-ignored-directories-rel ()
- "Return list of ignored directories, relative to the root."
- (projectile-make-relative-to-root (projectile-ignored-directories)))
-
-(defun projectile-ignored-files-rel ()
- "Return list of ignored files, relative to the root."
- (projectile-make-relative-to-root (projectile-ignored-files)))
-
-(defun projectile-project-ignored-files ()
- "Return list of project ignored files.
-Unignored files are not included."
- (cl-remove-if 'file-directory-p (projectile-project-ignored)))
-
-(defun projectile-project-ignored-directories ()
- "Return list of project ignored directories.
-Unignored directories are not included."
- (cl-remove-if-not 'file-directory-p (projectile-project-ignored)))
-
-(defun projectile-paths-to-ignore ()
- "Return a list of ignored project paths."
- (projectile-normalise-paths (nth 1 (projectile-parse-dirconfig-file))))
-
-(defun projectile-patterns-to-ignore ()
- "Return a list of relative file patterns."
- (projectile-normalise-patterns (nth 1 (projectile-parse-dirconfig-file))))
-
-(defun projectile-project-ignored ()
- "Return list of project ignored files/directories.
-Unignored files/directories are not included."
- (let ((paths (projectile-paths-to-ignore)))
- (projectile-expand-paths paths)))
-
-(defun projectile-unignored-files ()
- "Return list of unignored files."
- (mapcar
- #'projectile-expand-root
- (append
- projectile-globally-unignored-files
- (projectile-project-unignored-files))))
-
-(defun projectile-unignored-directories ()
- "Return list of unignored directories."
- (mapcar
- #'file-name-as-directory
- (mapcar
- #'projectile-expand-root
- (append
- projectile-globally-unignored-directories
- (projectile-project-unignored-directories)))))
-
-(defun projectile-unignored-directories-rel ()
- "Return list of unignored directories, relative to the root."
- (projectile-make-relative-to-root (projectile-unignored-directories)))
-
-(defun projectile-unignored-files-rel ()
- "Return list of unignored files, relative to the root."
- (projectile-make-relative-to-root (projectile-unignored-files)))
-
-(defun projectile-project-unignored-files ()
- "Return list of project unignored files."
- (cl-remove-if 'file-directory-p (projectile-project-unignored)))
-
-(defun projectile-project-unignored-directories ()
- "Return list of project unignored directories."
- (cl-remove-if-not 'file-directory-p (projectile-project-unignored)))
-
-(defun projectile-paths-to-ensure ()
- "Return a list of unignored project paths."
- (projectile-normalise-paths (nth 2 (projectile-parse-dirconfig-file))))
-
-(defun projectile-files-to-ensure ()
- (projectile-flatten (mapcar (lambda (pat) (file-expand-wildcards pat t))
- (projectile-patterns-to-ensure))))
-
-(defun projectile-patterns-to-ensure ()
- "Return a list of relative file patterns."
- (projectile-normalise-patterns (nth 2 (projectile-parse-dirconfig-file))))
-
-(defun projectile-filtering-patterns ()
- (cons (projectile-patterns-to-ignore)
- (projectile-patterns-to-ensure)))
-
-(defun projectile-project-unignored ()
- "Return list of project ignored files/directories."
- (delete-dups (append (projectile-expand-paths (projectile-paths-to-ensure))
- (projectile-expand-paths (projectile-files-to-ensure)))))
-
-
-(defun projectile-dirconfig-file ()
- "Return the absolute path to the project's dirconfig file."
- (expand-file-name ".projectile" (projectile-project-root)))
-
-(defun projectile-parse-dirconfig-file ()
- "Parse project ignore file and return directories to ignore and keep.
-
-The return value will be a list of three elements, the car being
-the list of directories to keep, the cadr being the list of files
-or directories to ignore, and the caddr being the list of files
-or directories to ensure.
-
-Strings starting with + will be added to the list of directories
-to keep, and strings starting with - will be added to the list of
-directories to ignore. For backward compatibility, without a
-prefix the string will be assumed to be an ignore string."
- (let (keep ignore ensure (dirconfig (projectile-dirconfig-file)))
- (when (projectile-file-exists-p dirconfig)
- (with-temp-buffer
- (insert-file-contents dirconfig)
- (while (not (eobp))
- (pcase (char-after)
- ;; ignore comment lines if prefix char has been set
- ((pred (lambda (leading-char)
- (and projectile-dirconfig-comment-prefix
- (eql leading-char
- projectile-dirconfig-comment-prefix))))
- nil)
- (?+ (push (buffer-substring (1+ (point)) (line-end-position)) keep))
- (?- (push (buffer-substring (1+ (point)) (line-end-position)) ignore))
- (?! (push (buffer-substring (1+ (point)) (line-end-position)) ensure))
- (_ (push (buffer-substring (point) (line-end-position)) ignore)))
- (forward-line)))
- (list (mapcar (lambda (f) (file-name-as-directory (string-trim f)))
- (delete "" (reverse keep)))
- (mapcar #'string-trim
- (delete "" (reverse ignore)))
- (mapcar #'string-trim
- (delete "" (reverse ensure)))))))
-
-(defun projectile-expand-root (name)
- "Expand NAME to project root.
-
-Never use on many files since it's going to recalculate the
-project-root for every file."
- (expand-file-name name (projectile-project-root)))
-
-(cl-defun projectile-completing-read (prompt choices &key initial-input action)
- "Present a project tailored PROMPT with CHOICES."
- (let ((prompt (projectile-prepend-project-name prompt))
- res)
- (setq res
- (cond
- ((eq projectile-completion-system 'ido)
- (ido-completing-read prompt choices nil nil initial-input))
- ((eq projectile-completion-system 'default)
- (completing-read prompt choices nil nil initial-input))
- ((eq projectile-completion-system 'helm)
- (if (and (fboundp 'helm)
- (fboundp 'helm-make-source))
- (helm :sources
- (helm-make-source "Projectile" 'helm-source-sync
- :candidates choices
- :action (if action
- (prog1 action
- (setq action nil))
- #'identity))
- :prompt prompt
- :input initial-input
- :buffer "*helm-projectile*")
- (user-error "Please install helm from \
-https://github.com/emacs-helm/helm")))
- ((eq projectile-completion-system 'ivy)
- (if (fboundp 'ivy-read)
- (ivy-read prompt choices
- :initial-input initial-input
- :action (prog1 action
- (setq action nil))
- :caller 'projectile-completing-read)
- (user-error "Please install ivy from \
-https://github.com/abo-abo/swiper")))
- (t (funcall projectile-completion-system prompt choices))))
- (if action
- (funcall action res)
- res)))
-
-(defun projectile-project-files (project-root)
- "Return a list of files for the PROJECT-ROOT."
- (let (files)
- ;; If the cache is too stale, don't use it.
- (when projectile-files-cache-expire
- (let ((cache-time
- (gethash project-root projectile-projects-cache-time)))
- (when (or (null cache-time)
- (< (+ cache-time projectile-files-cache-expire)
- (projectile-time-seconds)))
- (remhash project-root projectile-projects-cache)
- (remhash project-root projectile-projects-cache-time))))
-
- ;; Use the cache, if requested and available.
- (when projectile-enable-caching
- (setq files (gethash project-root projectile-projects-cache)))
-
- ;; Calculate the list of files.
- (when (null files)
- (when projectile-enable-caching
- (message "Projectile is initializing cache for %s ..." project-root))
- (setq files
- (if (eq projectile-indexing-method 'alien)
- ;; In alien mode we can just skip reading
- ;; .projectile and find all files in the root dir.
- (projectile-dir-files-alien project-root)
- ;; If a project is defined as a list of subfolders
- ;; then we'll have the files returned for each subfolder,
- ;; so they are relative to the project root.
- ;;
- ;; TODO: That's pretty slow and we need to improve it.
- ;; One options would be to pass explicitly the subdirs
- ;; to commands like `git ls-files` which would return
- ;; files paths relative to the project root.
- (cl-mapcan
- (lambda (dir)
- (mapcar (lambda (f)
- (file-relative-name (concat dir f)
- project-root))
- (projectile-dir-files dir)))
- (projectile-get-project-directories project-root))))
-
- ;; Save the cached list.
- (when projectile-enable-caching
- (projectile-cache-project project-root files)))
-
- ;;; Sorting
- ;;
- ;; Files can't be cached in sorted order as some sorting schemes
- ;; require dynamic data. Sorting is ignored completely when in
- ;; alien mode.
- (if (eq projectile-indexing-method 'alien)
- files
- (projectile-sort-files files))))
-
-(defun projectile-current-project-files ()
- "Return a list of the files in the current project."
- (projectile-project-files (projectile-project-root)))
-
-(defun projectile-process-current-project-files (action)
- "Process the current project's files using ACTION."
- (let ((project-files (projectile-current-project-files))
- (default-directory (projectile-project-root)))
- (dolist (filename project-files)
- (funcall action filename))))
-
-(defun projectile-project-dirs (project)
- "Return a list of dirs for PROJECT."
- (delete-dups
- (delq nil
- (mapcar #'file-name-directory
- (projectile-project-files project)))))
-
-(defun projectile-current-project-dirs ()
- "Return a list of dirs for the current project."
- (projectile-project-dirs (projectile-ensure-project (projectile-project-root))))
-
-(defun projectile-get-other-files (file-name &optional flex-matching)
- "Return a list of other files for FILE-NAME.
-The list depends on `:related-files-fn' project option and
-`projectile-other-file-alist'. For the latter, FLEX-MATCHING can be used
-to match any basename."
- (if-let ((plist (projectile--related-files-plist-by-kind file-name :other)))
- (projectile--related-files-from-plist plist)
- (projectile--other-extension-files file-name
- (projectile-current-project-files)
- flex-matching)))
-
-(defun projectile--find-other-file (&optional flex-matching ff-variant)
- "Switch between files with the same name but different extensions.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable
-`projectile-other-file-alist'. With FF-VARIANT set to a defun, use that
-instead of `find-file'. A typical example of such a defun would be
-`find-file-other-window' or `find-file-other-frame'"
- (let ((ff (or ff-variant #'find-file))
- (other-files (projectile-get-other-files (buffer-file-name) flex-matching)))
- (if other-files
- (let ((file-name (projectile--choose-from-candidates other-files)))
- (funcall ff (expand-file-name file-name
- (projectile-project-root))))
- (error "No other file found"))))
-
-
-;;; Interactive commands
-;;;###autoload
-(defun projectile-find-other-file (&optional flex-matching)
- "Switch between files with the same name but different extensions.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable `projectile-other-file-alist'."
- (interactive "P")
- (projectile--find-other-file flex-matching))
-
-;;;###autoload
-(defun projectile-find-other-file-other-window (&optional flex-matching)
- "Switch between files with the same name but different extensions in other window.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable `projectile-other-file-alist'."
- (interactive "P")
- (projectile--find-other-file flex-matching
- #'find-file-other-window))
-
-;;;###autoload
-(defun projectile-find-other-file-other-frame (&optional flex-matching)
- "Switch between files with the same name but different extensions in other frame.
-With FLEX-MATCHING, match any file that contains the base name of current file.
-Other file extensions can be customized with the variable `projectile-other-file-alist'."
- (interactive "P")
- (projectile--find-other-file flex-matching
- #'find-file-other-frame))
-
-(defun projectile--file-name-sans-extensions (file-name)
- "Return FILE-NAME sans any extensions.
-The extensions, in a filename, are what follows the first '.', with the exception of a leading '.'"
- (setq file-name (file-name-nondirectory file-name))
- (substring file-name 0 (string-match "\\..*" file-name 1)))
-
-(defun projectile--file-name-extensions (file-name)
- "Return FILE-NAME's extensions.
-The extensions, in a filename, are what follows the first '.', with the exception of a leading '.'"
- ;;would it make sense to return nil instead of an empty string if no extensions are found?
- (setq file-name (file-name-nondirectory file-name))
- (let (extensions-start)
- (substring file-name
- (if (setq extensions-start (string-match "\\..*" file-name 1))
- (1+ extensions-start)
- (length file-name)))))
-
-(defun projectile-associated-file-name-extensions (file-name)
- "Return projectile-other-file-extensions associated to FILE-NAME's extensions.
-If no associated other-file-extensions for the complete (nested) extension are found, remove subextensions from FILENAME's extensions until a match is found."
- (let ((current-extensions (projectile--file-name-extensions (file-name-nondirectory file-name)))
- associated-extensions)
- (catch 'break
- (while (not (string= "" current-extensions))
- (if (setq associated-extensions (cdr (assoc current-extensions projectile-other-file-alist)))
- (throw 'break associated-extensions))
- (setq current-extensions (projectile--file-name-extensions current-extensions))))))
-
-(defun projectile--other-extension-files (current-file project-file-list &optional flex-matching)
- "Narrow to files with the same names but different extensions.
-Returns a list of possible files for users to choose.
-
-With FLEX-MATCHING, match any file that contains the base name of current file"
- (let* ((file-ext-list (projectile-associated-file-name-extensions current-file))
- (fulldirname (if (file-name-directory current-file)
- (file-name-directory current-file) "./"))
- (dirname (file-name-nondirectory (directory-file-name fulldirname)))
- (filename (regexp-quote (projectile--file-name-sans-extensions current-file)))
- (file-list (mapcar (lambda (ext)
- (if flex-matching
- (concat ".*" filename ".*" "\." ext "\\'")
- (concat "^" filename
- (unless (equal ext "")
- (concat "\." ext))
- "\\'")))
- file-ext-list))
- (candidates (cl-remove-if-not
- (lambda (project-file)
- (string-match filename project-file))
- project-file-list))
- (candidates
- (projectile-flatten (mapcar
- (lambda (file)
- (cl-remove-if-not
- (lambda (project-file)
- (string-match file
- (concat (file-name-base project-file)
- (unless (equal (file-name-extension project-file) nil)
- (concat "\." (file-name-extension project-file))))))
- candidates))
- file-list)))
- (candidates
- (cl-remove-if-not (lambda (file) (not (backup-file-name-p file))) candidates))
- (candidates
- (cl-sort (copy-sequence candidates)
- (lambda (file _)
- (let ((candidate-dirname (file-name-nondirectory (directory-file-name (file-name-directory file)))))
- (unless (equal fulldirname (file-name-directory file))
- (equal dirname candidate-dirname)))))))
- candidates))
-
-(defun projectile-select-files (project-files &optional invalidate-cache)
- "Select a list of files based on filename at point.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (projectile-maybe-invalidate-cache invalidate-cache)
- (let* ((file (if (region-active-p)
- (buffer-substring (region-beginning) (region-end))
- (or (thing-at-point 'filename) "")))
- (file (if (string-match "\\.?\\./" file)
- (file-relative-name (file-truename file) (projectile-project-root))
- file))
- (files (if file
- (cl-remove-if-not
- (lambda (project-file)
- (string-match file project-file))
- project-files)
- nil)))
- files))
-
-(defun projectile--find-file-dwim (invalidate-cache &optional ff-variant)
- "Jump to a project's files using completion based on context.
-
-With a INVALIDATE-CACHE invalidates the cache first.
-
-With FF-VARIANT set to a defun, use that instead of `find-file'.
-A typical example of such a defun would be `find-file-other-window' or
-`find-file-other-frame'
-
-Subroutine for `projectile-find-file-dwim' and
-`projectile-find-file-dwim-other-window'"
- (let* ((project-root (projectile-project-root))
- (project-files (projectile-project-files project-root))
- (files (projectile-select-files project-files invalidate-cache))
- (file (cond ((= (length files) 1)
- (car files))
- ((> (length files) 1)
- (projectile-completing-read "Switch to: " files))
- (t
- (projectile-completing-read "Switch to: " project-files))))
- (ff (or ff-variant #'find-file)))
- (funcall ff (expand-file-name file project-root))
- (run-hooks 'projectile-find-file-hook)))
-
-;;;###autoload
-(defun projectile-find-file-dwim (&optional invalidate-cache)
- "Jump to a project's files using completion based on context.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-If point is on a filename, Projectile first tries to search for that
-file in project:
-
-- If it finds just a file, it switches to that file instantly. This works even
-if the filename is incomplete, but there's only a single file in the current project
-that matches the filename at point. For example, if there's only a single file named
-\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete),
-`projectile-find-file-dwim' still switches to \"projectile/projectile.el\" immediately
- because this is the only filename that matches.
-
-- If it finds a list of files, the list is displayed for selecting. A list of
-files is displayed when a filename appears more than one in the project or the
-filename at point is a prefix of more than two files in a project. For example,
-if `projectile-find-file-dwim' is executed on a filepath like \"projectile/\", it lists
-the content of that directory. If it is executed on a partial filename like
- \"projectile/a\", a list of files with character 'a' in that directory is presented.
-
-- If it finds nothing, display a list of all files in project for selecting."
- (interactive "P")
- (projectile--find-file-dwim invalidate-cache))
-
-;;;###autoload
-(defun projectile-find-file-dwim-other-window (&optional invalidate-cache)
- "Jump to a project's files using completion based on context in other window.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-If point is on a filename, Projectile first tries to search for that
-file in project:
-
-- If it finds just a file, it switches to that file instantly. This works even
-if the filename is incomplete, but there's only a single file in the current project
-that matches the filename at point. For example, if there's only a single file named
-\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete),
-`projectile-find-file-dwim-other-window' still switches to \"projectile/projectile.el\"
-immediately because this is the only filename that matches.
-
-- If it finds a list of files, the list is displayed for selecting. A list of
-files is displayed when a filename appears more than one in the project or the
-filename at point is a prefix of more than two files in a project. For example,
-if `projectile-find-file-dwim-other-window' is executed on a filepath like \"projectile/\", it lists
-the content of that directory. If it is executed on a partial filename
-like \"projectile/a\", a list of files with character 'a' in that directory
-is presented.
-
-- If it finds nothing, display a list of all files in project for selecting."
- (interactive "P")
- (projectile--find-file-dwim invalidate-cache #'find-file-other-window))
-
-;;;###autoload
-(defun projectile-find-file-dwim-other-frame (&optional invalidate-cache)
- "Jump to a project's files using completion based on context in other frame.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first.
-
-If point is on a filename, Projectile first tries to search for that
-file in project:
-
-- If it finds just a file, it switches to that file instantly. This works even
-if the filename is incomplete, but there's only a single file in the current project
-that matches the filename at point. For example, if there's only a single file named
-\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete),
-`projectile-find-file-dwim-other-frame' still switches to \"projectile/projectile.el\"
-immediately because this is the only filename that matches.
-
-- If it finds a list of files, the list is displayed for selecting. A list of
-files is displayed when a filename appears more than one in the project or the
-filename at point is a prefix of more than two files in a project. For example,
-if `projectile-find-file-dwim-other-frame' is executed on a filepath like \"projectile/\", it lists
-the content of that directory. If it is executed on a partial filename
-like \"projectile/a\", a list of files with character 'a' in that directory
-is presented.
-
-- If it finds nothing, display a list of all files in project for selecting."
- (interactive "P")
- (projectile--find-file-dwim invalidate-cache #'find-file-other-frame))
-
-(defun projectile--find-file (invalidate-cache &optional ff-variant)
- "Jump to a project's file using completion.
-With INVALIDATE-CACHE invalidates the cache first. With FF-VARIANT set to a
-defun, use that instead of `find-file'. A typical example of such a defun
-would be `find-file-other-window' or `find-file-other-frame'"
- (interactive "P")
- (projectile-maybe-invalidate-cache invalidate-cache)
- (let* ((project-root (projectile-ensure-project (projectile-project-root)))
- (file (projectile-completing-read "Find file: "
- (projectile-project-files project-root)))
- (ff (or ff-variant #'find-file)))
- (when file
- (funcall ff (expand-file-name file project-root))
- (run-hooks 'projectile-find-file-hook))))
-
-;;;###autoload
-(defun projectile-find-file (&optional invalidate-cache)
- "Jump to a project's file using completion.
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile--find-file invalidate-cache))
-
-;;;###autoload
-(defun projectile-find-file-other-window (&optional invalidate-cache)
- "Jump to a project's file using completion and show it in another window.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile--find-file invalidate-cache #'find-file-other-window))
-
-;;;###autoload
-(defun projectile-find-file-other-frame (&optional invalidate-cache)
- "Jump to a project's file using completion and show it in another frame.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile--find-file invalidate-cache #'find-file-other-frame))
-
-;;;###autoload
-(defun projectile-toggle-project-read-only ()
- "Toggle project read only."
- (interactive)
- (let ((inhibit-read-only t)
- (val (not buffer-read-only))
- (default-directory (projectile-ensure-project (projectile-project-root))))
- (add-dir-local-variable nil 'buffer-read-only val)
- (save-buffer)
- (kill-buffer)
- (when buffer-file-name
- (read-only-mode (if val +1 -1))
- (message "[%s] read-only-mode is %s" (projectile-project-name) (if val "on" "off")))))
-
-
-;;;; Sorting project files
-(defun projectile-sort-files (files)
- "Sort FILES according to `projectile-sort-order'."
- (cl-case projectile-sort-order
- (default files)
- (recentf (projectile-sort-by-recentf-first files))
- (recently-active (projectile-sort-by-recently-active-first files))
- (modification-time (projectile-sort-by-modification-time files))
- (access-time (projectile-sort-by-access-time files))))
-
-(defun projectile-sort-by-recentf-first (files)
- "Sort FILES by a recent first scheme."
- (let ((project-recentf-files (projectile-recentf-files)))
- (append project-recentf-files
- (projectile-difference files project-recentf-files))))
-
-(defun projectile-sort-by-recently-active-first (files)
- "Sort FILES by most recently active buffers or opened files."
- (let ((project-recently-active-files (projectile-recently-active-files)))
- (append project-recently-active-files
- (projectile-difference files project-recently-active-files))))
-
-(defun projectile-sort-by-modification-time (files)
- "Sort FILES by modification time."
- (let ((default-directory (projectile-project-root)))
- (cl-sort
- (copy-sequence files)
- (lambda (file1 file2)
- (let ((file1-mtime (nth 5 (file-attributes file1)))
- (file2-mtime (nth 5 (file-attributes file2))))
- (not (time-less-p file1-mtime file2-mtime)))))))
-
-(defun projectile-sort-by-access-time (files)
- "Sort FILES by access time."
- (let ((default-directory (projectile-project-root)))
- (cl-sort
- (copy-sequence files)
- (lambda (file1 file2)
- (let ((file1-atime (nth 4 (file-attributes file1)))
- (file2-atime (nth 4 (file-attributes file2))))
- (not (time-less-p file1-atime file2-atime)))))))
-
-
-;;;; Find directory in project functionality
-(defun projectile--find-dir (invalidate-cache &optional dired-variant)
- "Jump to a project's directory using completion.
-
-With INVALIDATE-CACHE invalidates the cache first. With DIRED-VARIANT set to a
-defun, use that instead of `dired'. A typical example of such a defun would be
-`dired-other-window' or `dired-other-frame'"
- (projectile-maybe-invalidate-cache invalidate-cache)
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (dir (projectile-complete-dir project))
- (dired-v (or dired-variant #'dired)))
- (funcall dired-v (expand-file-name dir project))
- (run-hooks 'projectile-find-dir-hook)))
-
-;;;###autoload
-(defun projectile-find-dir (&optional invalidate-cache)
- "Jump to a project's directory using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile--find-dir invalidate-cache))
-
-;;;###autoload
-(defun projectile-find-dir-other-window (&optional invalidate-cache)
- "Jump to a project's directory in other window using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile--find-dir invalidate-cache #'dired-other-window))
-
-;;;###autoload
-(defun projectile-find-dir-other-frame (&optional invalidate-cache)
- "Jump to a project's directory in other frame using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile--find-dir invalidate-cache #'dired-other-frame))
-
-(defun projectile-complete-dir (project)
- (let ((project-dirs (projectile-project-dirs project)))
- (projectile-completing-read
- "Find dir: "
- (if projectile-find-dir-includes-top-level
- (append '("./") project-dirs)
- project-dirs))))
-
-;;;###autoload
-(defun projectile-find-test-file (&optional invalidate-cache)
- "Jump to a project's test file using completion.
-
-With a prefix arg INVALIDATE-CACHE invalidates the cache first."
- (interactive "P")
- (projectile-maybe-invalidate-cache invalidate-cache)
- (let ((file (projectile-completing-read "Find test file: "
- (projectile-current-project-test-files))))
- (find-file (expand-file-name file (projectile-project-root)))))
-
-(defun projectile-test-files (files)
- "Return only the test FILES."
- (cl-remove-if-not 'projectile-test-file-p files))
-
-(defun projectile--merge-related-files-fns (related-files-fns)
- "Merge multiple RELATED-FILES-FNS into one function."
- (lambda (path)
- (let (merged-plist)
- (dolist (fn related-files-fns merged-plist)
- (let ((plist (funcall fn path)))
- (cl-loop for (key value) on plist by #'cddr
- do (let ((values (if (consp value) value (list value))))
- (if (plist-member merged-plist key)
- (nconc (plist-get merged-plist key) values)
- (setq merged-plist (plist-put merged-plist key values))))))))))
-
-(defun projectile--related-files-plist (project-root file)
- "Return a plist containing all related files information for FILE in PROJECT-ROOT."
- (if-let ((rel-path (if (file-name-absolute-p file)
- (file-relative-name file project-root)
- file))
- (custom-function (funcall projectile-related-files-fn-function (projectile-project-type))))
- (funcall (cond ((functionp custom-function)
- custom-function)
- ((consp custom-function)
- (projectile--merge-related-files-fns custom-function))
- (t
- (error "Unsupported value type of :related-files-fn")))
- rel-path)))
-
-(defun projectile--related-files-plist-by-kind (file kind)
- "Return a plist containing :paths and/or :predicate of KIND for FILE."
- (if-let ((project-root (projectile-project-root))
- (plist (projectile--related-files-plist project-root file))
- (has-kind? (plist-member plist kind)))
- (let* ((kind-value (plist-get plist kind))
- (values (if (cl-typep kind-value '(or string function))
- (list kind-value)
- kind-value))
- (paths (delete-dups (cl-remove-if-not 'stringp values)))
- (predicates (delete-dups (cl-remove-if-not 'functionp values))))
- (append
- ;; Make sure that :paths exists even with nil if there is no predicates
- (when (or paths (null predicates))
- (list :paths (cl-remove-if-not
- (lambda (f)
- (projectile-file-exists-p (expand-file-name f project-root)))
- paths)))
- (when predicates
- (list :predicate (if (= 1 (length predicates))
- (car predicates)
- (lambda (other-file)
- (cl-some (lambda (predicate)
- (funcall predicate other-file))
- predicates)))))))))
-
-(defun projectile--related-files-from-plist (plist)
- "Return a list of files matching to PLIST from current project files."
- (let* ((predicate (plist-get plist :predicate))
- (paths (plist-get plist :paths)))
- (delete-dups (append
- paths
- (when predicate
- (cl-remove-if-not predicate (projectile-current-project-files)))))))
-
-(defun projectile--related-files-kinds(file)
- "Return a list o keywords meaning available related kinds for FILE."
- (if-let ((project-root (projectile-project-root))
- (plist (projectile--related-files-plist project-root file)))
- (cl-loop for key in plist by #'cddr
- collect key)))
-
-(defun projectile--related-files (file kind)
- "Return a list of related files of KIND for FILE."
- (projectile--related-files-from-plist (projectile--related-files-plist-by-kind file kind)))
-
-(defun projectile--find-related-file (file &optional kind)
- "Choose a file from files related to FILE as KIND.
-If KIND is not provided, a list of possible kinds can be chosen."
- (unless kind
- (if-let ((available-kinds (projectile--related-files-kinds file)))
- (setq kind (if (= (length available-kinds) 1)
- (car available-kinds)
- (intern (projectile-completing-read "Kind :" available-kinds))))
- (error "No related files found")))
-
- (if-let ((candidates (projectile--related-files file kind)))
- (projectile-expand-root (projectile--choose-from-candidates candidates))
- (error
- "No matching related file as `%s' found for project type `%s'"
- kind (projectile-project-type))))
-
-;;;###autoload
-(defun projectile-find-related-file-other-window ()
- "Open related file in other window."
- (interactive)
- (find-file-other-window
- (projectile--find-related-file (buffer-file-name))))
-
-;;;###autoload
-(defun projectile-find-related-file-other-frame ()
- "Open related file in other frame."
- (interactive)
- (find-file-other-frame
- (projectile--find-related-file (buffer-file-name))))
-
-;;;###autoload
-(defun projectile-find-related-file()
- "Open related file."
- (interactive)
- (find-file
- (projectile--find-related-file (buffer-file-name))))
-
-;;;###autoload
-(defun projectile-related-files-fn-groups(kind groups)
- "Generate a related-files-fn which relates as KIND for files in each of GROUPS."
- (lambda (path)
- (if-let ((group-found (cl-find-if (lambda (group)
- (member path group))
- groups)))
- (list kind (cl-remove path group-found :test 'equal)))))
-
-;;;###autoload
-(defun projectile-related-files-fn-extensions(kind extensions)
- "Generate a related-files-fn which relates as KIND for files having EXTENSIONS."
- (lambda (path)
- (let* ((ext (file-name-extension path))
- (basename (file-name-base path))
- (basename-regexp (regexp-quote basename)))
- (when (member ext extensions)
- (list kind (lambda (other-path)
- (and (string-match-p basename-regexp other-path)
- (equal basename (file-name-base other-path))
- (let ((other-ext (file-name-extension other-path)))
- (and (member other-ext extensions)
- (not (equal other-ext ext)))))))))))
-
-;;;###autoload
-(defun projectile-related-files-fn-test-with-prefix(extension test-prefix)
- "Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-PREFIX."
- (lambda (path)
- (when (equal (file-name-extension path) extension)
- (let* ((file-name (file-name-nondirectory path))
- (find-impl? (string-prefix-p test-prefix file-name))
- (file-name-to-find (if find-impl?
- (substring file-name (length test-prefix))
- (concat test-prefix file-name))))
- (list (if find-impl? :impl :test)
- (lambda (other-path)
- (and (string-suffix-p file-name-to-find other-path)
- (equal (file-name-nondirectory other-path) file-name-to-find))))))))
-
-;;;###autoload
-(defun projectile-related-files-fn-test-with-suffix(extension test-suffix)
- "Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-SUFFIX."
- (lambda (path)
- (when (equal (file-name-extension path) extension)
- (let* ((file-name (file-name-nondirectory path))
- (dot-ext (concat "." extension))
- (suffix-ext (concat test-suffix dot-ext))
- (find-impl? (string-suffix-p suffix-ext file-name))
- (file-name-to-find (if find-impl?
- (concat (substring file-name 0 (- (length suffix-ext)))
- dot-ext)
- (concat (substring file-name 0 (- (length dot-ext)))
- suffix-ext))))
- (list (if find-impl? :impl :test)
- (lambda (other-path)
- (and (string-suffix-p file-name-to-find other-path)
- (equal (file-name-nondirectory other-path) file-name-to-find))))))))
-
-(defun projectile-test-file-p (file)
- "Check if FILE is a test file."
- (let ((kinds (projectile--related-files-kinds file)))
- (cond ((member :impl kinds) t)
- ((member :test kinds) nil)
- (t (or (cl-some (lambda (pat) (string-prefix-p pat (file-name-nondirectory file)))
- (delq nil (list (funcall projectile-test-prefix-function (projectile-project-type)))))
- (cl-some (lambda (pat) (string-suffix-p pat (file-name-sans-extension (file-name-nondirectory file))))
- (delq nil (list (funcall projectile-test-suffix-function (projectile-project-type))))))))))
-
-(defun projectile-current-project-test-files ()
- "Return a list of test files for the current project."
- (projectile-test-files (projectile-current-project-files)))
-
-(defvar projectile-project-types nil
- "An alist holding all project types that are known to Projectile.
-The project types are symbols and they are linked to plists holding
-the properties of the various project types.")
-
-(cl-defun projectile-register-project-type
- (project-type marker-files &key project-file compilation-dir configure compile test run test-suffix test-prefix src-dir test-dir related-files-fn)
- "Register a project type with projectile.
-
-A project type is defined by PROJECT-TYPE, a set of MARKER-FILES,
-and optional keyword arguments:
-PROJECT-FILE the main project file in the root project directory.
-COMPILATION-DIR the directory to run the tests- and compilations in,
-CONFIGURE which specifies a command that configures the project
- `%s' in the command will be substituted with (projectile-project-root)
- before the command is run,
-COMPILE which specifies a command that builds the project,
-TEST which specified a command that tests the project,
-RUN which specifies a command that runs the project,
-TEST-SUFFIX which specifies test file suffix, and
-TEST-PREFIX which specifies test file prefix.
-SRC-DIR which specifies the path to the source relative to the project root.
-TEST-DIR which specifies the path to the tests relative to the project root.
-RELATED-FILES-FN which specifies a custom function to find the related files such as
-test/impl/other files as below:
- CUSTOM-FUNCTION accepts FILE as relative path from the project root and returns
- a plist containing :test, :impl or :other as key and the relative path/paths or
- predicate as value. PREDICATE accepts a relative path as the input."
- (let ((project-plist (list 'marker-files marker-files
- 'project-file project-file
- 'compilation-dir compilation-dir
- 'configure-command configure
- 'compile-command compile
- 'test-command test
- 'run-command run)))
- ;; There is no way for the function to distinguish between an
- ;; explicit argument of nil and an omitted argument. However, the
- ;; body of the function is free to consider nil an abbreviation
- ;; for some other meaningful value
- (when (and project-file (not (member project-file projectile-project-root-files)))
- (add-to-list 'projectile-project-root-files project-file))
- (when test-suffix
- (plist-put project-plist 'test-suffix test-suffix))
- (when test-prefix
- (plist-put project-plist 'test-prefix test-prefix))
- (when src-dir
- (plist-put project-plist 'src-dir src-dir))
- (when test-dir
- (plist-put project-plist 'test-dir test-dir))
- (when related-files-fn
- (plist-put project-plist 'related-files-fn related-files-fn))
-
- (setq projectile-project-types
- (cons `(,project-type . ,project-plist)
- projectile-project-types))))
-
-(defun projectile-cabal-project-p ()
- "Check if a project contains *.cabal files but no stack.yaml file."
- (and (projectile-verify-file-wildcard "?*.cabal")
- (not (projectile-verify-file "stack.yaml"))))
-
-(defun projectile-dotnet-project-p ()
- "Check if a project contains a .NET project marker."
- (or (projectile-verify-file-wildcard "?*.csproj")
- (projectile-verify-file-wildcard "?*.fsproj")))
-
-(defun projectile-go-project-p ()
- "Check if a project contains Go source files."
- (or (projectile-verify-file "go.mod")
- (projectile-verify-file-wildcard "*.go")))
-
-(defcustom projectile-go-project-test-function #'projectile-go-project-p
- "Function to determine if project's type is go."
- :group 'projectile
- :type 'function
- :package-version '(projectile . "1.0.0"))
-
-;;; Project type registration
-;;
-;; Project type detection happens in a reverse order with respect to
-;; project type registration (invocations of `projectile-register-project-type').
-;;
-;; As function-based project type detection is pretty slow, so it
-;; should be tried at the end if everything else failed (meaning here
-;; it should be listed first).
-;;
-;; Ideally common project types should be checked earlier than exotic ones.
-
-;; Function-based detection project type
-(projectile-register-project-type 'haskell-cabal #'projectile-cabal-project-p
- :compile "cabal build"
- :test "cabal test"
- :run "cabal run"
- :test-suffix "Spec")
-(projectile-register-project-type 'dotnet #'projectile-dotnet-project-p
- :compile "dotnet build"
- :run "dotnet run"
- :test "dotnet test")
-(projectile-register-project-type 'go projectile-go-project-test-function
- :compile "go build"
- :test "go test ./..."
- :test-suffix "_test")
-;; File-based detection project types
-
-;; Universal
-(projectile-register-project-type 'scons '("SConstruct")
- :project-file "SConstruct"
- :compile "scons"
- :test "scons test"
- :test-suffix "test")
-(projectile-register-project-type 'meson '("meson.build")
- :project-file "meson.build"
- :compilation-dir "build"
- :configure "meson %s"
- :compile "ninja"
- :test "ninja test")
-(projectile-register-project-type 'nix '("default.nix")
- :project-file "default.nix"
- :compile "nix-build"
- :test "nix-build")
-(projectile-register-project-type 'bazel '("WORKSPACE")
- :project-file "WORKSPACE"
- :compile "bazel build"
- :test "bazel test"
- :run "bazel run")
-
-;; Make & CMake
-(projectile-register-project-type 'make '("Makefile")
- :project-file "Makefile"
- :compile "make"
- :test "make test")
-(projectile-register-project-type 'cmake '("CMakeLists.txt")
- :project-file "CMakeLists.txt"
- :compilation-dir "build"
- :configure "cmake %s -B %s"
- :compile "cmake --build ."
- :test "ctest")
-;; PHP
-(projectile-register-project-type 'php-symfony '("composer.json" "app" "src" "vendor")
- :project-file "composer.json"
- :compile "app/console server:run"
- :test "phpunit -c app "
- :test-suffix "Test")
-;; Erlang & Elixir
-(projectile-register-project-type 'rebar '("rebar.config")
- :project-file "rebar.config"
- :compile "rebar"
- :test "rebar eunit"
- :test-suffix "_SUITE")
-(projectile-register-project-type 'elixir '("mix.exs")
- :project-file "mix.exs"
- :compile "mix compile"
- :src-dir "lib/"
- :test "mix test"
- :test-suffix "_test")
-;; JavaScript
-(projectile-register-project-type 'grunt '("Gruntfile.js")
- :project-file "Gruntfile.js"
- :compile "grunt"
- :test "grunt test")
-(projectile-register-project-type 'gulp '("gulpfile.js")
- :project-file "gulpfile.js"
- :compile "gulp"
- :test "gulp test")
-(projectile-register-project-type 'npm '("package.json")
- :project-file "package.json"
- :compile "npm install"
- :test "npm test"
- :test-suffix ".test")
-;; Angular
-(projectile-register-project-type 'angular '("angular.json" ".angular-cli.json")
- :project-file "angular.json"
- :compile "ng build"
- :run "ng serve"
- :test "ng test"
- :test-suffix ".spec")
-;; Python
-(projectile-register-project-type 'django '("manage.py")
- :project-file "manage.py"
- :compile "python manage.py runserver"
- :test "python manage.py test"
- :test-prefix "test_"
- :test-suffix"_test")
-(projectile-register-project-type 'python-pip '("requirements.txt")
- :project-file "requirements.txt"
- :compile "python setup.py build"
- :test "python -m unittest discover"
- :test-prefix "test_"
- :test-suffix"_test")
-(projectile-register-project-type 'python-pkg '("setup.py")
- :project-file "setup.py"
- :compile "python setup.py build"
- :test "python -m unittest discover"
- :test-prefix "test_"
- :test-suffix"_test")
-(projectile-register-project-type 'python-tox '("tox.ini")
- :project-file "tox.ini"
- :compile "tox -r --notest"
- :test "tox"
- :test-prefix "test_"
- :test-suffix"_test")
-(projectile-register-project-type 'python-pipenv '("Pipfile")
- :project-file "Pipfile"
- :compile "pipenv run build"
- :test "pipenv run test"
- :test-prefix "test_"
- :test-suffix "_test")
-;; Java & friends
-(projectile-register-project-type 'maven '("pom.xml")
- :project-file "pom.xml"
- :compile "mvn clean install"
- :test "mvn test"
- :test-suffix "Test"
- :src-dir "main/src/"
- :test-dir "main/test/")
-(projectile-register-project-type 'gradle '("build.gradle")
- :project-file "build.gradle"
- :compile "gradle build"
- :test "gradle test"
- :test-suffix "Spec")
-(projectile-register-project-type 'gradlew '("gradlew")
- :project-file "gradlew"
- :compile "./gradlew build"
- :test "./gradlew test"
- :test-suffix "Spec")
-(projectile-register-project-type 'grails '("application.properties" "grails-app")
- :project-file "application.properties"
- :compile "grails package"
- :test "grails test-app"
- :test-suffix "Spec")
-;; Scala
-(projectile-register-project-type 'sbt '("build.sbt")
- :project-file "build.sbt"
- :compile "sbt compile"
- :test "sbt test"
- :test-suffix "Spec")
-;; Clojure
-(projectile-register-project-type 'lein-test '("project.clj")
- :project-file "project.clj"
- :compile "lein compile"
- :test "lein test"
- :test-suffix "_test")
-(projectile-register-project-type 'lein-midje '("project.clj" ".midje.clj")
- :project-file "project.clj"
- :compile "lein compile"
- :test "lein midje"
- :test-prefix "t_")
-(projectile-register-project-type 'boot-clj '("build.boot")
- :project-file "build.boot"
- :compile "boot aot"
- :test "boot test"
- :test-suffix "_test")
-(projectile-register-project-type 'clojure-cli '("deps.edn")
- :project-file "deps.edn"
- :test-suffix "_test")
-(projectile-register-project-type 'bloop '(".bloop")
- :project-file ".bloop"
- :compile "bloop compile root"
- :test "bloop test --propagate --reporter scalac root"
- :src-dir "src/main/"
- :test-dir "src/test/"
- :test-suffix "Spec")
-;; Ruby
-(projectile-register-project-type 'ruby-rspec '("Gemfile" "lib" "spec")
- :project-file "Gemfile"
- :compile "bundle exec rake"
- :src-dir "lib/"
- :test "bundle exec rspec"
- :test-dir "spec/"
- :test-suffix "_spec")
-(projectile-register-project-type 'ruby-test '("Gemfile" "lib" "test")
- :project-file "Gemfile"
- :compile"bundle exec rake"
- :src-dir "lib/"
- :test "bundle exec rake test"
- :test-suffix "_test")
-;; Rails needs to be registered after npm, otherwise `package.json` makes it `npm`.
-;; https://github.com/bbatsov/projectile/pull/1191
-(projectile-register-project-type 'rails-test '("Gemfile" "app" "lib" "db" "config" "test")
- :project-file "Gemfile"
- :compile "bundle exec rails server"
- :src-dir "lib/"
- :test "bundle exec rake test"
- :test-suffix "_test")
-(projectile-register-project-type 'rails-rspec '("Gemfile" "app" "lib" "db" "config" "spec")
- :project-file "Gemfile"
- :compile "bundle exec rails server"
- :src-dir "lib/"
- :test "bundle exec rspec"
- :test-dir "spec/"
- :test-suffix "_spec")
-;; Crystal
-(projectile-register-project-type 'crystal-spec '("shard.yml")
- :project-file "shard.yml"
- :src-dir "src/"
- :test "crystal spec"
- :test-dir "spec/"
- :test-suffix "_spec")
-
-;; Emacs
-(projectile-register-project-type 'emacs-cask '("Cask")
- :project-file "Cask"
- :compile "cask install"
- :test-prefix "test-"
- :test-suffix "-test")
-(projectile-register-project-type 'emacs-eldev (lambda () (or (projectile-verify-file "Eldev")
- (projectile-verify-file "Eldev-local")))
- :compile "eldev package"
- :test "eldev test"
- :run "eldev emacs")
-
-;; R
-(projectile-register-project-type 'r '("DESCRIPTION")
- :project-file "DESCRIPTION"
- :compile "R CMD INSTALL --with-keep.source ."
- :test (concat "R CMD check -o " temporary-file-directory " ."))
-
-;; Haskell
-(projectile-register-project-type 'haskell-stack '("stack.yaml")
- :project-file "stack.yaml"
- :compile "stack build"
- :test "stack build --test"
- :test-suffix "Spec")
-
-;; Rust
-(projectile-register-project-type 'rust-cargo '("Cargo.toml")
- :project-file "Cargo.toml"
- :compile "cargo build"
- :test "cargo test"
- :run "cargo run")
-
-;; Racket
-(projectile-register-project-type 'racket '("info.rkt")
- :project-file "info.rkt"
- :test "raco test .")
-
-;; Dart
-(projectile-register-project-type 'dart '("pubspec.yaml")
- :project-file "pubspec.yaml"
- :compile "pub get"
- :test "pub run test"
- :run "dart"
- :test-suffix "_test.dart")
-
-
-(defvar-local projectile-project-type nil
- "Buffer local var for overriding the auto-detected project type.
-Normally you'd set this from .dir-locals.el.")
-(put 'projectile-project-type 'safe-local-variable #'symbolp)
-
-(defun projectile-detect-project-type ()
- "Detect the type of the current project.
-Fallsback to a generic project type when the type can't be determined."
- (let ((project-type
- (or (car (cl-find-if
- (lambda (project-type-record)
- (let ((project-type (car project-type-record))
- (marker (plist-get (cdr project-type-record) 'marker-files)))
- (if (functionp marker)
- (and (funcall marker) project-type)
- (and (projectile-verify-files marker) project-type))))
- projectile-project-types))
- 'generic)))
- (puthash (projectile-project-root) project-type projectile-project-type-cache)
- project-type))
-
-(defun projectile-project-type (&optional dir)
- "Determine a project's type based on its structure.
-When DIR is specified it checks it, otherwise it acts
-on the current project.
-
-The project type is cached for improved performance."
- (if projectile-project-type
- projectile-project-type
- (let* ((dir (or dir default-directory))
- (project-root (projectile-project-root dir)))
- (if project-root
- (or (gethash project-root projectile-project-type-cache)
- (projectile-detect-project-type))
- ;; if we're not in a project we just return nil
- nil))))
-
-;;;###autoload
-(defun projectile-project-info ()
- "Display info for current project."
- (interactive)
- (message "Project dir: %s ## Project VCS: %s ## Project type: %s"
- (projectile-project-root)
- (projectile-project-vcs)
- (projectile-project-type)))
-
-(defun projectile-verify-files (files)
- "Check whether all FILES exist in the current project."
- (cl-every #'projectile-verify-file files))
-
-(defun projectile-verify-file (file)
- "Check whether FILE exists in the current project."
- (file-exists-p (projectile-expand-root file)))
-
-(defun projectile-verify-file-wildcard (file)
- "Check whether FILE exists in the current project.
-Expands wildcards using `file-expand-wildcards' before checking."
- (file-expand-wildcards (projectile-expand-root file)))
-
-(defun projectile-project-vcs (&optional project-root)
- "Determine the VCS used by the project if any.
-PROJECT-ROOT is the targeted directory. If nil, use
-`projectile-project-root'."
- (or project-root (setq project-root (projectile-project-root)))
- (cond
- ((projectile-file-exists-p (expand-file-name ".git" project-root)) 'git)
- ((projectile-file-exists-p (expand-file-name ".hg" project-root)) 'hg)
- ((projectile-file-exists-p (expand-file-name ".fslckout" project-root)) 'fossil)
- ((projectile-file-exists-p (expand-file-name "_FOSSIL_" project-root)) 'fossil)
- ((projectile-file-exists-p (expand-file-name ".bzr" project-root)) 'bzr)
- ((projectile-file-exists-p (expand-file-name "_darcs" project-root)) 'darcs)
- ((projectile-file-exists-p (expand-file-name ".svn" project-root)) 'svn)
- ((projectile-locate-dominating-file project-root ".git") 'git)
- ((projectile-locate-dominating-file project-root ".hg") 'hg)
- ((projectile-locate-dominating-file project-root ".fslckout") 'fossil)
- ((projectile-locate-dominating-file project-root "_FOSSIL_") 'fossil)
- ((projectile-locate-dominating-file project-root ".bzr") 'bzr)
- ((projectile-locate-dominating-file project-root "_darcs") 'darcs)
- ((projectile-locate-dominating-file project-root ".svn") 'svn)
- (t 'none)))
-
-(defun projectile--test-name-for-impl-name (impl-file-path)
- "Determine the name of the test file for IMPL-FILE-PATH."
- (let* ((project-type (projectile-project-type))
- (impl-file-name (file-name-sans-extension (file-name-nondirectory impl-file-path)))
- (impl-file-ext (file-name-extension impl-file-path))
- (test-prefix (funcall projectile-test-prefix-function project-type))
- (test-suffix (funcall projectile-test-suffix-function project-type)))
- (cond
- (test-prefix (concat test-prefix impl-file-name "." impl-file-ext))
- (test-suffix (concat impl-file-name test-suffix "." impl-file-ext))
- (t (error "Project type `%s' not supported!" project-type)))))
-
-(defun projectile-create-test-file-for (impl-file-path)
- "Create a test file for IMPL-FILE-PATH."
- (let* ((test-file (projectile--test-name-for-impl-name impl-file-path))
- (project-root (projectile-project-root))
- (relative-dir (file-name-directory (file-relative-name impl-file-path project-root)))
- (src-dir-name (projectile-src-directory (projectile-project-type)))
- (test-dir-name (projectile-test-directory (projectile-project-type)))
- (test-dir (expand-file-name (replace-regexp-in-string src-dir-name test-dir-name relative-dir) project-root))
- (test-path (expand-file-name test-file test-dir)))
- (unless (file-exists-p test-path)
- (progn (unless (file-exists-p test-dir)
- (make-directory test-dir :create-parents))
- test-path))))
-
-(defun projectile-find-implementation-or-test (file-name)
- "Given a FILE-NAME return the matching implementation or test filename.
-
-If `projectile-create-missing-test-files' is non-nil, create the missing
-test file."
- (unless file-name (error "The current buffer is not visiting a file"))
- (if (projectile-test-file-p file-name)
- ;; find the matching impl file
- (let ((impl-file (projectile-find-matching-file file-name)))
- (if impl-file
- (projectile-expand-root impl-file)
- (error
- "No matching source file found for project type `%s'"
- (projectile-project-type))))
- ;; find the matching test file
- (let ((test-file (projectile-find-matching-test file-name)))
- (if test-file
- (projectile-expand-root test-file)
- (if projectile-create-missing-test-files
- (projectile-create-test-file-for file-name)
- (error "No matching test file found for project type `%s'"
- (projectile-project-type)))))))
-
-;;;###autoload
-(defun projectile-find-implementation-or-test-other-window ()
- "Open matching implementation or test file in other window."
- (interactive)
- (find-file-other-window
- (projectile-find-implementation-or-test (buffer-file-name))))
-
-;;;###autoload
-(defun projectile-find-implementation-or-test-other-frame ()
- "Open matching implementation or test file in other frame."
- (interactive)
- (find-file-other-frame
- (projectile-find-implementation-or-test (buffer-file-name))))
-
-;;;###autoload
-(defun projectile-toggle-between-implementation-and-test ()
- "Toggle between an implementation file and its test file."
- (interactive)
- (find-file
- (projectile-find-implementation-or-test (buffer-file-name))))
-
-
-(defun projectile-project-type-attribute (project-type key &optional default-value)
- "Return the value of some PROJECT-TYPE attribute identified by KEY.
-Fallback to DEFAULT-VALUE for missing attributes."
- (let ((project (alist-get project-type projectile-project-types)))
- (if (and project (plist-member project key))
- (plist-get project key)
- default-value)))
-
-(defun projectile-test-prefix (project-type)
- "Find default test files prefix based on PROJECT-TYPE."
- (projectile-project-type-attribute project-type 'test-prefix))
-
-(defun projectile-test-suffix (project-type)
- "Find default test files suffix based on PROJECT-TYPE."
- (projectile-project-type-attribute project-type 'test-suffix))
-
-(defun projectile-related-files-fn (project-type)
- "Find relative file based on PROJECT-TYPE."
- (projectile-project-type-attribute project-type 'related-files-fn))
-
-(defun projectile-src-directory (project-type)
- "Find default src directory based on PROJECT-TYPE."
- (projectile-project-type-attribute project-type 'src-dir "src/"))
-
-(defun projectile-test-directory (project-type)
- "Find default test directory based on PROJECT-TYPE."
- (projectile-project-type-attribute project-type 'test-dir "test/"))
-
-(defun projectile-dirname-matching-count (a b)
- "Count matching dirnames ascending file paths."
- (setq a (reverse (split-string (or (file-name-directory a) "") "/" t))
- b (reverse (split-string (or (file-name-directory b) "") "/" t)))
- (let ((common 0))
- (while (and a b (string-equal (pop a) (pop b)))
- (setq common (1+ common)))
- common))
-
-(defun projectile-group-file-candidates (file candidates)
- "Group file candidates by dirname matching count."
- (cl-sort (copy-sequence
- (let (value result)
- (while (setq value (pop candidates))
- (let* ((key (projectile-dirname-matching-count file value))
- (kv (assoc key result)))
- (if kv
- (setcdr kv (cons value (cdr kv)))
- (push (list key value) result))))
- (mapcar (lambda (x)
- (cons (car x) (nreverse (cdr x))))
- (nreverse result))))
- (lambda (a b) (> (car a) (car b)))))
-
-(defun projectile--best-or-all-candidates-based-on-parents-dirs (file candidates)
- "Return a list containing the best one one for FILE from CANDIDATES or all CANDIDATES."
- (let ((grouped-candidates (projectile-group-file-candidates file candidates)))
- (if (= (length (car grouped-candidates)) 2)
- (list (car (last (car grouped-candidates))))
- (apply #'append (mapcar #'cdr grouped-candidates)))))
-
-(defun projectile--impl-to-test-predicate (impl-file)
- "Return a predicate, which returns t for any test files for IMPL-FILE."
- (let* ((basename (file-name-sans-extension (file-name-nondirectory impl-file)))
- (test-prefix (funcall projectile-test-prefix-function (projectile-project-type)))
- (test-suffix (funcall projectile-test-suffix-function (projectile-project-type)))
- (prefix-name (when test-prefix (concat test-prefix basename)))
- (suffix-name (when test-suffix (concat basename test-suffix))))
- (lambda (current-file)
- (let ((name (file-name-sans-extension (file-name-nondirectory current-file))))
- (or (string-equal prefix-name name)
- (string-equal suffix-name name))))))
-
-(defun projectile--find-matching-test (impl-file)
- "Return a list of test files for IMPL-FILE."
- (if-let ((plist (projectile--related-files-plist-by-kind impl-file :test)))
- (projectile--related-files-from-plist plist)
- (if-let ((predicate (projectile--impl-to-test-predicate impl-file)))
- (projectile--best-or-all-candidates-based-on-parents-dirs
- impl-file (cl-remove-if-not predicate (projectile-current-project-files))))))
-
-(defun projectile--test-to-impl-predicate (test-file)
- "Return a predicate, which returns t for any impl files for TEST-FILE."
- (let* ((basename (file-name-sans-extension (file-name-nondirectory test-file)))
- (test-prefix (funcall projectile-test-prefix-function (projectile-project-type)))
- (test-suffix (funcall projectile-test-suffix-function (projectile-project-type))))
- (lambda (current-file)
- (let ((name (file-name-nondirectory (file-name-sans-extension current-file))))
- (or (when test-prefix (string-equal (concat test-prefix name) basename))
- (when test-suffix (string-equal (concat name test-suffix) basename)))))))
-
-(defun projectile--find-matching-file (test-file)
- "Return a list of impl files tested by TEST-FILE."
- (if-let ((plist (projectile--related-files-plist-by-kind test-file :impl)))
- (projectile--related-files-from-plist plist)
- (if-let ((predicate (projectile--test-to-impl-predicate test-file)))
- (projectile--best-or-all-candidates-based-on-parents-dirs
- test-file (cl-remove-if-not predicate (projectile-current-project-files))))))
-
-(defun projectile--choose-from-candidates (candidates)
- "Choose one item from CANDIDATES."
- (if (= (length candidates) 1)
- (car candidates)
- (projectile-completing-read "Switch to: " candidates)))
-
-(defun projectile-find-matching-test (impl-file)
- "Compute the name of the test matching IMPL-FILE."
- (if-let ((candidates (projectile--find-matching-test impl-file)))
- (projectile--choose-from-candidates candidates)))
-
-(defun projectile-find-matching-file (test-file)
- "Compute the name of a file matching TEST-FILE."
- (if-let ((candidates (projectile--find-matching-file test-file)))
- (projectile--choose-from-candidates candidates)))
-
-(defun projectile-grep-default-files ()
- "Try to find a default pattern for `projectile-grep'.
-This is a subset of `grep-read-files', where either a matching entry from
-`grep-files-aliases' or file name extension pattern is returned."
- (when buffer-file-name
- (let* ((fn (file-name-nondirectory buffer-file-name))
- (default-alias
- (let ((aliases (remove (assoc "all" grep-files-aliases)
- grep-files-aliases))
- alias)
- (while aliases
- (setq alias (car aliases)
- aliases (cdr aliases))
- (if (string-match (mapconcat
- #'wildcard-to-regexp
- (split-string (cdr alias) nil t)
- "\\|")
- fn)
- (setq aliases nil)
- (setq alias nil)))
- (cdr alias)))
- (default-extension
- (let ((ext (file-name-extension fn)))
- (and ext (concat "*." ext)))))
- (or default-alias default-extension))))
-
-(defun projectile--globally-ignored-file-suffixes-glob ()
- "Return ignored file suffixes as a list of glob patterns."
- (mapcar (lambda (pat) (concat "*" pat)) projectile-globally-ignored-file-suffixes))
-
-(defun projectile--read-search-string-with-default (prefix-label)
- (let* ((prefix-label (projectile-prepend-project-name prefix-label))
- (default-value (projectile-symbol-or-selection-at-point))
- (default-label (if (or (not default-value)
- (string= default-value ""))
- ""
- (format " (default %s)" default-value))))
- (read-string (format "%s%s: " prefix-label default-label) nil nil default-value)))
-
-(defvar projectile-grep-find-ignored-paths)
-(defvar projectile-grep-find-unignored-paths)
-(defvar projectile-grep-find-ignored-patterns)
-(defvar projectile-grep-find-unignored-patterns)
-
-(defun projectile-rgrep-default-command (regexp files dir)
- "Compute the command for \\[rgrep] to use by default.
-
-Extension of the Emacs 25.1 implementation of `rgrep-default-command', with
-which it shares its arglist."
- (require 'find-dired) ; for `find-name-arg'
- (grep-expand-template
- grep-find-template
- regexp
- (concat (shell-quote-argument "(")
- " " find-name-arg " "
- (mapconcat
- #'shell-quote-argument
- (split-string files)
- (concat " -o " find-name-arg " "))
- " "
- (shell-quote-argument ")"))
- dir
- (concat
- (and grep-find-ignored-directories
- (concat "-type d "
- (shell-quote-argument "(")
- ;; we should use shell-quote-argument here
- " -path "
- (mapconcat
- #'identity
- (delq nil (mapcar
- #'(lambda (ignore)
- (cond ((stringp ignore)
- (shell-quote-argument
- (concat "*/" ignore)))
- ((consp ignore)
- (and (funcall (car ignore) dir)
- (shell-quote-argument
- (concat "*/"
- (cdr ignore)))))))
- grep-find-ignored-directories))
- " -o -path ")
- " "
- (shell-quote-argument ")")
- " -prune -o "))
- (and grep-find-ignored-files
- (concat (shell-quote-argument "!") " -type d "
- (shell-quote-argument "(")
- ;; we should use shell-quote-argument here
- " -name "
- (mapconcat
- #'(lambda (ignore)
- (cond ((stringp ignore)
- (shell-quote-argument ignore))
- ((consp ignore)
- (and (funcall (car ignore) dir)
- (shell-quote-argument
- (cdr ignore))))))
- grep-find-ignored-files
- " -o -name ")
- " "
- (shell-quote-argument ")")
- " -prune -o "))
- (and projectile-grep-find-ignored-paths
- (concat (shell-quote-argument "(")
- " -path "
- (mapconcat
- (lambda (ignore) (shell-quote-argument
- (concat "./" ignore)))
- projectile-grep-find-ignored-paths
- " -o -path ")
- " "
- (shell-quote-argument ")")
- " -prune -o "))
- (and projectile-grep-find-ignored-patterns
- (concat (shell-quote-argument "(")
- (and (or projectile-grep-find-unignored-paths
- projectile-grep-find-unignored-patterns)
- (concat " "
- (shell-quote-argument "(")))
- " -path "
- (mapconcat
- (lambda (ignore)
- (shell-quote-argument
- (if (string-prefix-p "*" ignore) ignore
- (concat "*/" ignore))))
- projectile-grep-find-ignored-patterns
- " -o -path ")
- (and (or projectile-grep-find-unignored-paths
- projectile-grep-find-unignored-patterns)
- (concat " "
- (shell-quote-argument ")")
- " -a "
- (shell-quote-argument "!")
- " "
- (shell-quote-argument "(")
- (and projectile-grep-find-unignored-paths
- (concat " -path "
- (mapconcat
- (lambda (ignore) (shell-quote-argument
- (concat "./" ignore)))
- projectile-grep-find-unignored-paths
- " -o -path ")))
- (and projectile-grep-find-unignored-paths
- projectile-grep-find-unignored-patterns
- " -o")
- (and projectile-grep-find-unignored-patterns
- (concat " -path "
- (mapconcat
- (lambda (ignore)
- (shell-quote-argument
- (if (string-prefix-p "*" ignore) ignore
- (concat "*/" ignore))))
- projectile-grep-find-unignored-patterns
- " -o -path ")))
- " "
- (shell-quote-argument ")")))
- " "
- (shell-quote-argument ")")
- " -prune -o ")))))
-
-;;;###autoload
-(defun projectile-grep (&optional regexp arg)
- "Perform rgrep in the project.
-
-With a prefix ARG asks for files (globbing-aware) which to grep in.
-With prefix ARG of `-' (such as `M--'), default the files (without prompt),
-to `projectile-grep-default-files'.
-
-With REGEXP given, don't query the user for a regexp."
- (interactive "i\nP")
- (require 'grep) ;; for `rgrep'
- (let* ((roots (projectile-get-project-directories (projectile-project-root)))
- (search-regexp (or regexp
- (projectile--read-search-string-with-default "Grep for")))
- (files (and arg (or (and (equal current-prefix-arg '-)
- (projectile-grep-default-files))
- (read-string (projectile-prepend-project-name "Grep in: ")
- (projectile-grep-default-files))))))
- (dolist (root-dir roots)
- (require 'vc-git) ;; for `vc-git-grep'
- ;; in git projects users have the option to use `vc-git-grep' instead of `rgrep'
- (if (and (eq (projectile-project-vcs) 'git)
- projectile-use-git-grep
- (fboundp 'vc-git-grep))
- (vc-git-grep search-regexp (or files "") root-dir)
- ;; paths for find-grep should relative and without trailing /
- (let ((grep-find-ignored-files
- (cl-union (projectile--globally-ignored-file-suffixes-glob)
- grep-find-ignored-files))
- (projectile-grep-find-ignored-paths
- (append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir)))
- (projectile-ignored-directories))
- (mapcar (lambda (file)
- (file-relative-name file root-dir))
- (projectile-ignored-files))))
- (projectile-grep-find-unignored-paths
- (append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir)))
- (projectile-unignored-directories))
- (mapcar (lambda (file)
- (file-relative-name file root-dir))
- (projectile-unignored-files))))
- (projectile-grep-find-ignored-patterns (projectile-patterns-to-ignore))
- (projectile-grep-find-unignored-patterns (projectile-patterns-to-ensure)))
- (grep-compute-defaults)
- (cl-letf (((symbol-function 'rgrep-default-command) #'projectile-rgrep-default-command))
- (rgrep search-regexp (or files "* .*") root-dir)
- (when (get-buffer "*grep*")
- ;; When grep is using a global *grep* buffer rename it to be
- ;; scoped to the current root to allow multiple concurrent grep
- ;; operations, one per root
- (with-current-buffer "*grep*"
- (rename-buffer (concat "*grep <" root-dir ">*"))))))))
- (run-hooks 'projectile-grep-finished-hook)))
-
-;;;###autoload
-(defun projectile-ag (search-term &optional arg)
- "Run an ag search with SEARCH-TERM in the project.
-
-With an optional prefix argument ARG SEARCH-TERM is interpreted as a
-regular expression."
- (interactive
- (list (projectile--read-search-string-with-default
- (format "Ag %ssearch for" (if current-prefix-arg "regexp " "")))
- current-prefix-arg))
- (if (require 'ag nil 'noerror)
- (let ((ag-command (if arg 'ag-regexp 'ag))
- (ag-ignore-list (delq nil
- (delete-dups
- (append
- ag-ignore-list
- (projectile--globally-ignored-file-suffixes-glob)
- ;; ag supports git ignore files directly
- (unless (eq (projectile-project-vcs) 'git)
- (append (projectile-ignored-files-rel)
- (projectile-ignored-directories-rel)
- grep-find-ignored-files
- grep-find-ignored-directories
- '()))))))
- ;; reset the prefix arg, otherwise it will affect the ag-command
- (current-prefix-arg nil))
- (funcall ag-command search-term (projectile-project-root)))
- (error "Package 'ag' is not available")))
-
-;;;###autoload
-(defun projectile-ripgrep (search-term &optional arg)
- "Run a Ripgrep search with `SEARCH-TERM' at current project root.
-
-With an optional prefix argument ARG SEARCH-TERM is interpreted as a
-regular expression."
- (interactive
- (list (projectile--read-search-string-with-default
- (format "Ripgrep %ssearch for" (if current-prefix-arg "regexp " "")))
- current-prefix-arg))
- (if (require 'ripgrep nil 'noerror)
- (let ((args (mapcar (lambda (val) (concat "--glob !" val))
- (append projectile-globally-ignored-files
- projectile-globally-ignored-directories))))
- (ripgrep-regexp search-term
- (projectile-project-root)
- (if arg
- args
- (cons "--fixed-strings" args))))
- (error "Package `ripgrep' is not available")))
-
-(defun projectile-tags-exclude-patterns ()
- "Return a string with exclude patterns for ctags."
- (mapconcat (lambda (pattern) (format "--exclude=\"%s\""
- (directory-file-name pattern)))
- (projectile-ignored-directories-rel) " "))
-
-;;;###autoload
-(defun projectile-regenerate-tags ()
- "Regenerate the project's [e|g]tags."
- (interactive)
- (if (and (boundp 'ggtags-mode)
- (memq projectile-tags-backend '(auto ggtags)))
- (progn
- (let* ((ggtags-project-root (projectile-project-root))
- (default-directory ggtags-project-root))
- (ggtags-ensure-project)
- (ggtags-update-tags t)))
- (let* ((project-root (projectile-project-root))
- (tags-exclude (projectile-tags-exclude-patterns))
- (default-directory project-root)
- (tags-file (expand-file-name projectile-tags-file-name))
- (command (format projectile-tags-command tags-file tags-exclude default-directory))
- shell-output exit-code)
- (with-temp-buffer
- (setq exit-code
- (call-process-shell-command command nil (current-buffer))
- shell-output (string-trim
- (buffer-substring (point-min) (point-max)))))
- (unless (zerop exit-code)
- (error shell-output))
- (visit-tags-table tags-file)
- (message "Regenerated %s" tags-file))))
-
-(defun projectile-visit-project-tags-table ()
- "Visit the current project's tags table."
- (when (projectile-project-p)
- (let ((tags-file (projectile-expand-root projectile-tags-file-name)))
- (when (file-exists-p tags-file)
- (with-demoted-errors "Error loading tags-file: %s"
- (visit-tags-table tags-file t))))))
-
-(defun projectile-determine-find-tag-fn ()
- "Determine which function to use for a call to `projectile-find-tag'."
- (or
- (cond
- ((eq projectile-tags-backend 'auto)
- (cond
- ((fboundp 'ggtags-find-tag-dwim)
- 'ggtags-find-tag-dwim)
- ((fboundp 'xref-find-definitions)
- 'xref-find-definitions)
- ((fboundp 'etags-select-find-tag)
- 'etags-select-find-tag)))
- ((eq projectile-tags-backend 'xref)
- (when (fboundp 'xref-find-definitions)
- 'xref-find-definitions))
- ((eq projectile-tags-backend 'ggtags)
- (when (fboundp 'ggtags-find-tag-dwim)
- 'ggtags-find-tag-dwim))
- ((eq projectile-tags-backend 'etags-select)
- (when (fboundp 'etags-select-find-tag)
- 'etags-select-find-tag)))
- 'find-tag))
-
-;;;###autoload
-(defun projectile-find-tag ()
- "Find tag in project."
- (interactive)
- (projectile-visit-project-tags-table)
- ;; Auto-discover the user's preference for tags
- (let ((find-tag-fn (projectile-determine-find-tag-fn)))
- (call-interactively find-tag-fn)))
-
-(defmacro projectile-with-default-dir (dir &rest body)
- "Invoke in DIR the BODY."
- (declare (debug t) (indent 1))
- `(let ((default-directory ,dir))
- ,@body))
-
-;;;###autoload
-(defun projectile-run-command-in-root ()
- "Invoke `execute-extended-command' in the project's root."
- (interactive)
- (projectile-with-default-dir (projectile-ensure-project (projectile-project-root))
- (call-interactively #'execute-extended-command)))
-
-;;;###autoload
-(defun projectile-run-shell-command-in-root ()
- "Invoke `shell-command' in the project's root."
- (interactive)
- (projectile-with-default-dir (projectile-ensure-project (projectile-project-root))
- (call-interactively #'shell-command)))
-
-;;;###autoload
-(defun projectile-run-async-shell-command-in-root ()
- "Invoke `async-shell-command' in the project's root."
- (interactive)
- (projectile-with-default-dir (projectile-ensure-project (projectile-project-root))
- (call-interactively #'async-shell-command)))
-
-;;;###autoload
-(defun projectile-run-gdb ()
- "Invoke `gdb' in the project's root."
- (interactive)
- (projectile-with-default-dir (projectile-ensure-project (projectile-project-root))
- (call-interactively 'gdb)))
-
-;;;###autoload
-(defun projectile-run-shell (arg)
- "Invoke `shell' in the project's root.
-
-Switch to the project specific shell buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead."
- (interactive "P")
- (projectile-with-default-dir (projectile-ensure-project (projectile-project-root))
- (shell (projectile-generate-process-name "shell" arg))))
-
-;;;###autoload
-(defun projectile-run-eshell (arg)
- "Invoke `eshell' in the project's root.
-
-Switch to the project specific eshell buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead."
- (interactive "P")
- (projectile-with-default-dir (projectile-ensure-project (projectile-project-root))
- (let ((eshell-buffer-name (projectile-generate-process-name "eshell" arg)))
- (eshell))))
-
-;;;###autoload
-(defun projectile-run-ielm (arg)
- "Invoke `ielm' in the project's root.
-
-Switch to the project specific ielm buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead."
- (interactive "P")
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (ielm-buffer-name (projectile-generate-process-name "ielm" arg)))
- (if (get-buffer ielm-buffer-name)
- (switch-to-buffer ielm-buffer-name)
- (projectile-with-default-dir project
- (ielm))
- ;; ielm's buffer name is hardcoded, so we have to rename it after creation
- (rename-buffer ielm-buffer-name))))
-
-;;;###autoload
-(defun projectile-run-term (arg)
- "Invoke `term' in the project's root.
-
-Switch to the project specific term buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead."
- (interactive "P")
- (let ((project (projectile-ensure-project (projectile-project-root)))
- (buffer-name (projectile-generate-process-name "term" arg))
- (default-program (or explicit-shell-file-name
- (getenv "ESHELL")
- (getenv "SHELL")
- "/bin/sh")))
- (unless (get-buffer buffer-name)
- (require 'term)
- (let ((program (read-from-minibuffer "Run program: " default-program)))
- (projectile-with-default-dir project
- (set-buffer (term-ansi-make-term buffer-name program))
- (term-mode)
- (term-char-mode))))
- (switch-to-buffer buffer-name)))
-
-;;;###autoload
-(defun projectile-run-vterm (&optional arg)
- "Invoke `vterm' in the project's root.
-
-Switch to the project specific term buffer if it already exists.
-
-Use a prefix argument ARG to indicate creation of a new process instead."
- (interactive "P")
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (buffer (projectile-generate-process-name "vterm" arg)))
- (unless (buffer-live-p (get-buffer buffer))
- (unless (require 'vterm nil 'noerror)
- (error "Package 'vterm' is not available"))
- (projectile-with-default-dir project
- (vterm buffer)))
- (switch-to-buffer buffer)))
-
-(defun projectile-files-in-project-directory (directory)
- "Return a list of files in DIRECTORY."
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (dir (file-relative-name (expand-file-name directory)
- project)))
- (cl-remove-if-not
- (lambda (f) (string-prefix-p dir f))
- (projectile-project-files project))))
-
-(defun projectile-files-from-cmd (cmd directory)
- "Use a grep-like CMD to search for files within DIRECTORY.
-
-CMD should include the necessary search params and should output
-equivalently to grep -HlI (only unique matching filenames).
-Returns a list of expanded filenames."
- (let ((default-directory directory))
- (mapcar (lambda (str)
- (concat directory
- (if (string-prefix-p "./" str)
- (substring str 2)
- str)))
- (split-string
- (string-trim (shell-command-to-string cmd))
- "\n+"
- t))))
-
-(defun projectile-files-with-string (string directory)
- "Return a list of all files containing STRING in DIRECTORY.
-
-Tries to use rg, ag, ack, git-grep, and grep in that order. If those
-are impossible (for instance on Windows), returns a list of all
-files in the project."
- (if (projectile-unixy-system-p)
- (let* ((search-term (shell-quote-argument string))
- (cmd (cond ((executable-find "rg")
- (concat "rg -lF --no-heading --color never -- "
- search-term))
- ((executable-find "ag")
- (concat "ag --literal --nocolor --noheading -l -- "
- search-term))
- ((executable-find "ack")
- (concat "ack --literal --noheading --nocolor -l -- "
- search-term))
- ((and (executable-find "git")
- (eq (projectile-project-vcs) 'git))
- (concat "git grep -HlI " search-term))
- (t
- ;; -r: recursive
- ;; -H: show filename for each match
- ;; -l: show only file names with matches
- ;; -I: no binary files
- (format "grep -rHlI %s ." search-term)))))
- (projectile-files-from-cmd cmd directory))
- ;; we have to reject directories as a workaround to work with git submodules
- (cl-remove-if
- #'file-directory-p
- (mapcar #'projectile-expand-root (projectile-dir-files directory)))))
-
-;;;###autoload
-(defun projectile-replace (&optional arg)
- "Replace literal string in project using non-regexp `tags-query-replace'.
-
-With a prefix argument ARG prompts you for a directory on which
-to run the replacement."
- (interactive "P")
- (let* ((directory (if arg
- (file-name-as-directory
- (read-directory-name "Replace in directory: "))
- (projectile-ensure-project (projectile-project-root))))
- (old-text (read-string
- (projectile-prepend-project-name "Replace: ")
- (projectile-symbol-or-selection-at-point)))
- (new-text (read-string
- (projectile-prepend-project-name
- (format "Replace %s with: " old-text))))
- (files (projectile-files-with-string old-text directory)))
- (if (fboundp #'fileloop-continue)
- ;; Emacs 27+
- (progn (fileloop-initialize-replace old-text new-text files 'default)
- (fileloop-continue))
- ;; Emacs 25 and 26
- ;;
- ;; Adapted from `tags-query-replace' for literal strings (not regexp)
- (setq tags-loop-scan `(let ,(unless (equal old-text (downcase old-text))
- '((case-fold-search nil)))
- (if (search-forward ',old-text nil t)
- ;; When we find a match, move back to
- ;; the beginning of it so
- ;; perform-replace will see it.
- (goto-char (match-beginning 0))))
- tags-loop-operate `(perform-replace ',old-text ',new-text t nil nil
- nil multi-query-replace-map))
- (tags-loop-continue (or (cons 'list files) t)))))
-
-;;;###autoload
-(defun projectile-replace-regexp (&optional arg)
- "Replace a regexp in the project using `tags-query-replace'.
-
-With a prefix argument ARG prompts you for a directory on which
-to run the replacement."
- (interactive "P")
- (let* ((directory (if arg
- (file-name-as-directory
- (read-directory-name "Replace regexp in directory: "))
- (projectile-ensure-project (projectile-project-root))))
- (old-text (read-string
- (projectile-prepend-project-name "Replace regexp: ")
- (projectile-symbol-or-selection-at-point)))
- (new-text (read-string
- (projectile-prepend-project-name
- (format "Replace regexp %s with: " old-text))))
- (files
- ;; We have to reject directories as a workaround to work with git submodules.
- ;;
- ;; We can't narrow the list of files with
- ;; `projectile-files-with-string' because those regexp tools
- ;; don't support Emacs regular expressions.
- (cl-remove-if
- #'file-directory-p
- (mapcar #'projectile-expand-root (projectile-dir-files directory)))))
- (tags-query-replace old-text new-text nil (cons 'list files))))
-
-;;;###autoload
-(defun projectile-kill-buffers ()
- "Kill project buffers.
-
-The buffer are killed according to the value of
-`projectile-kill-buffers-filter'."
- (interactive)
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (project-name (projectile-project-name project))
- (buffers (projectile-project-buffers project)))
- (when (yes-or-no-p
- (format "Are you sure you want to kill %s buffers for '%s'? "
- (length buffers) project-name))
- (dolist (buffer buffers)
- (when (and
- ;; we take care not to kill indirect buffers directly
- ;; as we might encounter them after their base buffers are killed
- (not (buffer-base-buffer buffer))
- (if (functionp projectile-kill-buffers-filter)
- (funcall projectile-kill-buffers-filter buffer)
- (pcase projectile-kill-buffers-filter
- ('kill-all t)
- ('kill-only-files (buffer-file-name buffer))
- (_ (user-error "Invalid projectile-kill-buffers-filter value: %S" projectile-kill-buffers-filter)))))
- (kill-buffer buffer))))))
-
-;;;###autoload
-(defun projectile-save-project-buffers ()
- "Save all project buffers."
- (interactive)
- (let* ((project (projectile-ensure-project (projectile-project-root)))
- (project-name (projectile-project-name project))
- (modified-buffers (cl-remove-if-not (lambda (buf)
- (and (buffer-file-name buf)
- (buffer-modified-p buf)))
- (projectile-project-buffers project))))
- (if (null modified-buffers)
- (message "[%s] No buffers need saving" project-name)
- (dolist (buf modified-buffers)
- (with-current-buffer buf
- (save-buffer)))
- (message "[%s] Saved %d buffers" project-name (length modified-buffers)))))
-
-;;;###autoload
-(defun projectile-dired ()
- "Open `dired' at the root of the project."
- (interactive)
- (dired (projectile-ensure-project (projectile-project-root))))
-
-;;;###autoload
-(defun projectile-dired-other-window ()
- "Open `dired' at the root of the project in another window."
- (interactive)
- (dired-other-window (projectile-ensure-project (projectile-project-root))))
-
-;;;###autoload
-(defun projectile-dired-other-frame ()
- "Open `dired' at the root of the project in another frame."
- (interactive)
- (dired-other-frame (projectile-ensure-project (projectile-project-root))))
-
-;;;###autoload
-(defun projectile-vc (&optional project-root)
- "Open `vc-dir' at the root of the project.
-
-For git projects `magit-status-internal' is used if available.
-For hg projects `monky-status' is used if available.
-
-If PROJECT-ROOT is given, it is opened instead of the project
-root directory of the current buffer file. If interactively
-called with a prefix argument, the user is prompted for a project
-directory to open."
- (interactive (and current-prefix-arg
- (list
- (projectile-completing-read
- "Open project VC in: "
- projectile-known-projects))))
- (or project-root (setq project-root (projectile-project-root)))
- (let ((vcs (projectile-project-vcs project-root)))
- (cl-case vcs
- (git
- (cond ((fboundp 'magit-status-internal)
- (magit-status-internal project-root))
- ((fboundp 'magit-status)
- (with-no-warnings (magit-status project-root)))
- (t
- (vc-dir project-root))))
- (hg
- (if (fboundp 'monky-status)
- (monky-status project-root)
- (vc-dir project-root)))
- (t (vc-dir project-root)))))
-
-;;;###autoload
-(defun projectile-recentf ()
- "Show a list of recently visited files in a project."
- (interactive)
- (if (boundp 'recentf-list)
- (find-file (projectile-expand-root
- (projectile-completing-read
- "Recently visited files: "
- (projectile-recentf-files))))
- (message "recentf is not enabled")))
-
-(defun projectile-recentf-files ()
- "Return a list of recently visited files in a project."
- (and (boundp 'recentf-list)
- (let ((project-root (projectile-ensure-project (projectile-project-root))))
- (mapcar
- (lambda (f) (file-relative-name f project-root))
- (cl-remove-if-not
- (lambda (f) (string-prefix-p project-root (expand-file-name f)))
- recentf-list)))))
-
-(defun projectile-serialize-cache ()
- "Serializes the memory cache to the hard drive."
- (projectile-serialize projectile-projects-cache projectile-cache-file))
-
-(defvar projectile-configure-cmd-map
- (make-hash-table :test 'equal)
- "A mapping between projects and the last configure command used on them.")
-
-(defvar projectile-compilation-cmd-map
- (make-hash-table :test 'equal)
- "A mapping between projects and the last compilation command used on them.")
-
-(defvar projectile-test-cmd-map
- (make-hash-table :test 'equal)
- "A mapping between projects and the last test command used on them.")
-
-(defvar projectile-run-cmd-map
- (make-hash-table :test 'equal)
- "A mapping between projects and the last run command used on them.")
-
-(defvar projectile-project-configure-cmd nil
- "The command to use with `projectile-configure-project'.
-It takes precedence over the default command for the project type when set.
-Should be set via .dir-locals.el.")
-
-(defvar projectile-project-compilation-cmd nil
- "The command to use with `projectile-compile-project'.
-It takes precedence over the default command for the project type when set.
-Should be set via .dir-locals.el.")
-
-(defvar projectile-project-compilation-dir nil
- "The directory to use with `projectile-compile-project'.
-The directory path is relative to the project root.
-Should be set via .dir-locals.el.")
-
-(defvar projectile-project-test-cmd nil
- "The command to use with `projectile-test-project'.
-It takes precedence over the default command for the project type when set.
-Should be set via .dir-locals.el.")
-
-(defvar projectile-project-run-cmd nil
- "The command to use with `projectile-run-project'.
-It takes precedence over the default command for the project type when set.
-Should be set via .dir-locals.el.")
-
-(defun projectile-default-generic-command (project-type command-type)
- "Generic retrieval of COMMAND-TYPEs default cmd-value for PROJECT-TYPE.
-
-If found, checks if value is symbol or string. In case of symbol
-resolves to function `funcall's. Return value of function MUST
-be string to be executed as command."
- (let ((command (plist-get (alist-get project-type projectile-project-types) command-type)))
- (cond
- ((not command) nil)
- ((stringp command) command)
- ((functionp command)
- (if (fboundp command)
- (funcall (symbol-function command))))
- (t
- (error "The value for: %s in project-type: %s was neither a function nor a string" command-type project-type)))))
-
-(defun projectile-default-configure-command (project-type)
- "Retrieve default configure command for PROJECT-TYPE."
- (projectile-default-generic-command project-type 'configure-command))
-
-(defun projectile-default-compilation-command (project-type)
- "Retrieve default compilation command for PROJECT-TYPE."
- (projectile-default-generic-command project-type 'compile-command))
-
-(defun projectile-default-compilation-dir (project-type)
- "Retrieve default compilation directory for PROJECT-TYPE."
- (projectile-default-generic-command project-type 'compilation-dir))
-
-(defun projectile-default-test-command (project-type)
- "Retrieve default test command for PROJECT-TYPE."
- (projectile-default-generic-command project-type 'test-command))
-
-(defun projectile-default-run-command (project-type)
- "Retrieve default run command for PROJECT-TYPE."
- (projectile-default-generic-command project-type 'run-command))
-
-(defun projectile-configure-command (compile-dir)
- "Retrieve the configure command for COMPILE-DIR.
-
-The command is determined like this:
-
-- first we check `projectile-configure-cmd-map' for the last
-configure command that was invoked on the project
-
-- then we check for `projectile-project-configure-cmd' supplied
-via .dir-locals.el
-
-- finally we check for the default configure command for a
-project of that type"
- (or (gethash compile-dir projectile-configure-cmd-map)
- projectile-project-configure-cmd
- (let ((cmd-format-string (projectile-default-configure-command (projectile-project-type))))
- (when cmd-format-string
- (format cmd-format-string (projectile-project-root) compile-dir)))))
-
-(defun projectile-compilation-command (compile-dir)
- "Retrieve the compilation command for COMPILE-DIR.
-
-The command is determined like this:
-
-- first we check `projectile-compilation-cmd-map' for the last
-compile command that was invoked on the project
-
-- then we check for `projectile-project-compilation-cmd' supplied
-via .dir-locals.el
-
-- finally we check for the default compilation command for a
-project of that type"
- (or (gethash compile-dir projectile-compilation-cmd-map)
- projectile-project-compilation-cmd
- (projectile-default-compilation-command (projectile-project-type))))
-
-(defun projectile-test-command (compile-dir)
- "Retrieve the test command for COMPILE-DIR.
-
-The command is determined like this:
-
-- first we check `projectile-test-cmd-map' for the last
-test command that was invoked on the project
-
-- then we check for `projectile-project-test-cmd' supplied
-via .dir-locals.el
-
-- finally we check for the default test command for a
-project of that type"
- (or (gethash compile-dir projectile-test-cmd-map)
- projectile-project-test-cmd
- (projectile-default-test-command (projectile-project-type))))
-
-(defun projectile-run-command (compile-dir)
- "Retrieve the run command for COMPILE-DIR.
-
-The command is determined like this:
-
-- first we check `projectile-run-cmd-map' for the last
-run command that was invoked on the project
-
-- then we check for `projectile-project-run-cmd' supplied
-via .dir-locals.el
-
-- finally we check for the default run command for a
-project of that type"
- (or (gethash compile-dir projectile-run-cmd-map)
- projectile-project-run-cmd
- (projectile-default-run-command (projectile-project-type))))
-
-(defun projectile-read-command (prompt command)
- "Adapted from `compilation-read-command'."
- (read-shell-command prompt command
- (if (equal (car compile-history) command)
- '(compile-history . 1)
- 'compile-history)))
-
-(defun projectile-compilation-dir ()
- "Retrieve the compilation directory for this project."
- (let* ((type (projectile-project-type))
- (directory (or projectile-project-compilation-dir
- (projectile-default-compilation-dir type))))
- (if directory
- (file-truename
- (concat (file-name-as-directory (projectile-project-root))
- (file-name-as-directory directory)))
- (projectile-project-root))))
-
-(defun projectile-maybe-read-command (arg default-cmd prompt)
- "Prompt user for command unless DEFAULT-CMD is an Elisp function."
- (if (and (or (stringp default-cmd) (null default-cmd))
- (or compilation-read-command arg))
- (projectile-read-command prompt default-cmd)
- default-cmd))
-
-(defun projectile-run-compilation (cmd)
- "Run external or Elisp compilation command CMD."
- (if (functionp cmd)
- (funcall cmd)
- (compile cmd)))
-
-(defvar projectile-project-command-history (make-hash-table :test 'equal)
- "The history of last executed project commands, per project.
-
-Projects are indexed by their project-root value.")
-
-(defun projectile--get-command-history (project-root)
- (or (gethash project-root projectile-project-command-history)
- (puthash project-root
- (make-ring 16)
- projectile-project-command-history)))
-
-(cl-defun projectile--run-project-cmd
- (command command-map &key show-prompt prompt-prefix save-buffers)
- "Run a project COMMAND, typically a test- or compile command.
-
-Cache the COMMAND for later use inside the hash-table COMMAND-MAP.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-by setting SHOW-PROMPT. The prompt will be prefixed with PROMPT-PREFIX.
-
-If SAVE-BUFFERS is non-nil save all projectile buffers before
-running the command.
-
-The command actually run is returned."
- (let* ((project-root (projectile-project-root))
- (default-directory (projectile-compilation-dir))
- (command (projectile-maybe-read-command show-prompt
- command
- prompt-prefix)))
- (when command-map
- (puthash default-directory command command-map)
- (ring-insert (projectile--get-command-history project-root) command))
- (when save-buffers
- (save-some-buffers (not compilation-ask-about-save)
- (lambda ()
- (projectile-project-buffer-p (current-buffer)
- project-root))))
- (unless (file-directory-p default-directory)
- (mkdir default-directory))
- (projectile-run-compilation command)
- command))
-
-;;;###autoload
-(defun projectile-configure-project (arg)
- "Run project configure command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG."
- (interactive "P")
- (let ((command (projectile-configure-command (projectile-compilation-dir))))
- (projectile--run-project-cmd command projectile-configure-cmd-map
- :show-prompt arg
- :prompt-prefix "Configure command: "
- :save-buffers t)))
-
-;;;###autoload
-(defun projectile-compile-project (arg)
- "Run project compilation command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG."
- (interactive "P")
- (let ((command (projectile-compilation-command (projectile-compilation-dir))))
- (projectile--run-project-cmd command projectile-compilation-cmd-map
- :show-prompt arg
- :prompt-prefix "Compile command: "
- :save-buffers t)))
-
-;;;###autoload
-(defun projectile-test-project (arg)
- "Run project test command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG."
- (interactive "P")
- (let ((command (projectile-test-command (projectile-compilation-dir))))
- (projectile--run-project-cmd command projectile-test-cmd-map
- :show-prompt arg
- :prompt-prefix "Test command: "
- :save-buffers t)))
-
-;;;###autoload
-(defun projectile-run-project (arg)
- "Run project run command.
-
-Normally you'll be prompted for a compilation command, unless
-variable `compilation-read-command'. You can force the prompt
-with a prefix ARG."
- (interactive "P")
- (let ((command (projectile-run-command (projectile-compilation-dir))))
- (projectile--run-project-cmd command projectile-run-cmd-map
- :show-prompt arg
- :prompt-prefix "Run command: ")))
-
-;;;###autoload
-(defun projectile-repeat-last-command (show-prompt)
- "Run last projectile external command.
-
-External commands are: `projectile-configure-project',
-`projectile-compile-project', `projectile-test-project' and
-`projectile-run-project'.
-
-If the prefix argument SHOW_PROMPT is non nil, the command can be edited."
- (interactive "P")
- (let* ((project-root
- (projectile-ensure-project (projectile-project-root)))
- (command-history (projectile--get-command-history project-root))
- (command (car-safe (ring-elements command-history)))
- (compilation-read-command show-prompt)
- executed-command)
- (unless command
- (user-error "No command has been run yet for this project"))
- (setq executed-command
- (projectile--run-project-cmd command
- nil
- :save-buffers t
- :prompt-prefix "Execute command: "))
- (unless (string= command executed-command)
- (ring-insert command-history executed-command))))
-
-(defun compilation-find-file-projectile-find-compilation-buffer (orig-fun marker filename directory &rest formats)
- "Try to find a buffer for FILENAME, if we cannot find it,
-fallback to the original function."
- (when (and (not (file-exists-p (expand-file-name filename)))
- (projectile-project-p))
- (let* ((root (projectile-project-root))
- (dirs (cons "" (projectile-current-project-dirs)))
- (new-filename (car (cl-remove-if-not
- #'file-exists-p
- (mapcar
- (lambda (f)
- (expand-file-name
- filename
- (expand-file-name f root)))
- dirs)))))
- (when new-filename
- (setq filename new-filename))))
-
- (apply orig-fun `(,marker ,filename ,directory ,@formats)))
-
-(defun projectile-open-projects ()
- "Return a list of all open projects.
-An open project is a project with any open buffers."
- (delete-dups
- (delq nil
- (mapcar (lambda (buffer)
- (with-current-buffer buffer
- (when (projectile-project-p)
- (abbreviate-file-name (projectile-project-root)))))
- (buffer-list)))))
-
-(defun projectile--remove-current-project (projects)
- "Remove the current project (if any) from the list of PROJECTS."
- (if-let ((project (projectile-project-root)))
- (projectile-difference projects
- (list (abbreviate-file-name project)))
- projects))
-
-(defun projectile--move-current-project-to-end (projects)
- "Move current project (if any) to the end of list in the list of PROJECTS."
- (if-let ((project (projectile-project-root)))
- (append
- (projectile--remove-current-project projects)
- (list (abbreviate-file-name project)))
- projects))
-
-(defun projectile-relevant-known-projects ()
- "Return a list of known projects."
- (pcase projectile-current-project-on-switch
- ('remove (projectile--remove-current-project projectile-known-projects))
- ('move-to-end (projectile--move-current-project-to-end projectile-known-projects))
- ('keep projectile-known-projects)))
-
-(defun projectile-relevant-open-projects ()
- "Return a list of open projects."
- (let ((open-projects (projectile-open-projects)))
- (pcase projectile-current-project-on-switch
- ('remove (projectile--remove-current-project open-projects))
- ('move-to-end (projectile--move-current-project-to-end open-projects))
- ('keep open-projects))))
-
-;;;###autoload
-(defun projectile-switch-project (&optional arg)
- "Switch to a project we have visited before.
-Invokes the command referenced by `projectile-switch-project-action' on switch.
-With a prefix ARG invokes `projectile-commander' instead of
-`projectile-switch-project-action.'"
- (interactive "P")
- (let ((projects (projectile-relevant-known-projects)))
- (if projects
- (projectile-completing-read
- "Switch to project: " projects
- :action (lambda (project)
- (projectile-switch-project-by-name project arg)))
- (user-error "There are no known projects"))))
-
-;;;###autoload
-(defun projectile-switch-open-project (&optional arg)
- "Switch to a project we have currently opened.
-Invokes the command referenced by `projectile-switch-project-action' on switch.
-With a prefix ARG invokes `projectile-commander' instead of
-`projectile-switch-project-action.'"
- (interactive "P")
- (let ((projects (projectile-relevant-open-projects)))
- (if projects
- (projectile-completing-read
- "Switch to open project: " projects
- :action (lambda (project)
- (projectile-switch-project-by-name project arg)))
- (user-error "There are no open projects"))))
-
-(defun projectile-switch-project-by-name (project-to-switch &optional arg)
- "Switch to project by project name PROJECT-TO-SWITCH.
-Invokes the command referenced by `projectile-switch-project-action' on switch.
-With a prefix ARG invokes `projectile-commander' instead of
-`projectile-switch-project-action.'"
- (unless (projectile-project-p project-to-switch)
- (projectile-remove-known-project project-to-switch)
- (error "Directory %s is not a project" project-to-switch))
- (let ((switch-project-action (if arg
- 'projectile-commander
- projectile-switch-project-action)))
- (run-hooks 'projectile-before-switch-project-hook)
- (let ((default-directory project-to-switch))
- ;; use a temporary buffer to load PROJECT-TO-SWITCH's dir-locals before calling SWITCH-PROJECT-ACTION
- (with-temp-buffer
- (hack-dir-local-variables-non-file-buffer))
- ;; Normally the project name is determined from the current
- ;; buffer. However, when we're switching projects, we want to
- ;; show the name of the project being switched to, rather than
- ;; the current project, in the minibuffer. This is a simple hack
- ;; to tell the `projectile-project-name' function to ignore the
- ;; current buffer and the caching mechanism, and just return the
- ;; value of the `projectile-project-name' variable.
- (let ((projectile-project-name (funcall projectile-project-name-function
- project-to-switch)))
- (funcall switch-project-action)))
- (run-hooks 'projectile-after-switch-project-hook)))
-
-;;;###autoload
-(defun projectile-find-file-in-directory (&optional directory)
- "Jump to a file in a (maybe regular) DIRECTORY.
-
-This command will first prompt for the directory the file is in."
- (interactive "DFind file in directory: ")
- (unless (projectile--directory-p directory)
- (user-error "Directory %S does not exist" directory))
- (let ((default-directory directory))
- (if (projectile-project-p)
- ;; target directory is in a project
- (let ((file (projectile-completing-read "Find file: "
- (projectile-dir-files directory))))
- (find-file (expand-file-name file directory))
- (run-hooks 'projectile-find-file-hook))
- ;; target directory is not in a project
- (projectile-find-file))))
-
-(defun projectile-all-project-files ()
- "Get a list of all files in all projects."
- (cl-mapcan
- (lambda (project)
- (when (file-exists-p project)
- (mapcar (lambda (file)
- (expand-file-name file project))
- (projectile-project-files project))))
- projectile-known-projects))
-
-;;;###autoload
-(defun projectile-find-file-in-known-projects ()
- "Jump to a file in any of the known projects."
- (interactive)
- (find-file (projectile-completing-read "Find file in projects: " (projectile-all-project-files))))
-
-(defun projectile-keep-project-p (project)
- "Determine whether we should cleanup (remove) PROJECT or not.
-
-It handles the case of remote projects as well.
-See `projectile--cleanup-known-projects'."
- ;; Taken from from `recentf-keep-default-predicate'
- (cond
- ((file-remote-p project nil t) (file-readable-p project))
- ((file-remote-p project))
- ((file-readable-p project))))
-
-(defun projectile--cleanup-known-projects ()
- "Remove known projects that don't exist anymore and return a list of projects removed."
- (projectile-merge-known-projects)
- (let ((projects-kept (cl-remove-if-not #'projectile-keep-project-p projectile-known-projects))
- (projects-removed (cl-remove-if #'projectile-keep-project-p projectile-known-projects)))
- (setq projectile-known-projects projects-kept)
- (projectile-merge-known-projects)
- projects-removed))
-
-;;;###autoload
-(defun projectile-cleanup-known-projects ()
- "Remove known projects that don't exist anymore."
- (interactive)
- (if-let ((projects-removed (projectile--cleanup-known-projects)))
- (message "Projects removed: %s"
- (mapconcat #'identity projects-removed ", "))
- (message "No projects needed to be removed.")))
-
-;;;###autoload
-(defun projectile-clear-known-projects ()
- "Clear both `projectile-known-projects' and `projectile-known-projects-file'."
- (interactive)
- (setq projectile-known-projects nil)
- (projectile-save-known-projects))
-
-;;;###autoload
-(defun projectile-remove-known-project (&optional project)
- "Remove PROJECT from the list of known projects."
- (interactive (list (projectile-completing-read
- "Remove from known projects: " projectile-known-projects
- :action 'projectile-remove-known-project)))
- (unless (called-interactively-p 'any)
- (setq projectile-known-projects
- (cl-remove-if
- (lambda (proj) (string= project proj))
- projectile-known-projects))
- (projectile-merge-known-projects)
- (when projectile-verbose
- (message "Project %s removed from the list of known projects." project))))
-
-;;;###autoload
-(defun projectile-remove-current-project-from-known-projects ()
- "Remove the current project from the list of known projects."
- (interactive)
- (projectile-remove-known-project (abbreviate-file-name (projectile-project-root))))
-
-(defun projectile-ignored-projects ()
- "A list of projects that should not be save in `projectile-known-projects'."
- (mapcar #'file-truename projectile-ignored-projects))
-
-(defun projectile-ignored-project-p (project-root)
- "Return t if PROJECT-ROOT should not be added to `projectile-known-projects'."
- (or (member project-root (projectile-ignored-projects))
- (and (functionp projectile-ignored-project-function)
- (funcall projectile-ignored-project-function project-root))))
-
-;;;###autoload
-(defun projectile-add-known-project (project-root)
- "Add PROJECT-ROOT to the list of known projects."
- (interactive (list (read-directory-name "Add to known projects: ")))
- (unless (projectile-ignored-project-p project-root)
- (setq projectile-known-projects
- (delete-dups
- (cons (file-name-as-directory (abbreviate-file-name project-root))
- projectile-known-projects)))
- (projectile-merge-known-projects)))
-
-(defun projectile-load-known-projects ()
- "Load saved projects from `projectile-known-projects-file'.
-Also set `projectile-known-projects'."
- (setq projectile-known-projects
- (projectile-unserialize projectile-known-projects-file))
- (setq projectile-known-projects-on-file
- (and (sequencep projectile-known-projects)
- (copy-sequence projectile-known-projects))))
-
-(defun projectile-save-known-projects ()
- "Save PROJECTILE-KNOWN-PROJECTS to PROJECTILE-KNOWN-PROJECTS-FILE."
- (projectile-serialize projectile-known-projects
- projectile-known-projects-file)
- (setq projectile-known-projects-on-file
- (and (sequencep projectile-known-projects)
- (copy-sequence projectile-known-projects))))
-
-(defun projectile-merge-known-projects ()
- "Merge any change from `projectile-known-projects-file' and save to disk.
-
-This enables multiple Emacs processes to make changes without
-overwriting each other's changes."
- (let* ((known-now projectile-known-projects)
- (known-on-last-sync projectile-known-projects-on-file)
- (known-on-file
- (projectile-unserialize projectile-known-projects-file))
- (removed-after-sync (projectile-difference known-on-last-sync known-now))
- (removed-in-other-process
- (projectile-difference known-on-last-sync known-on-file))
- (result (delete-dups
- (projectile-difference
- (append known-now known-on-file)
- (append removed-after-sync removed-in-other-process)))))
- (setq projectile-known-projects result)
- (projectile-save-known-projects)))
-
-
-;;; IBuffer integration
-(define-ibuffer-filter projectile-files
- "Show Ibuffer with all buffers in the current project."
- (:reader (read-directory-name "Project root: " (projectile-project-root))
- :description nil)
- (with-current-buffer buf
- (equal (file-name-as-directory (expand-file-name qualifier))
- (projectile-project-root))))
-
-(defun projectile-ibuffer-by-project (project-root)
- "Open an IBuffer window showing all buffers in PROJECT-ROOT."
- (let ((project-name (funcall projectile-project-name-function project-root)))
- (ibuffer nil (format "*%s Buffers*" project-name)
- (list (cons 'projectile-files project-root)))))
-
-;;;###autoload
-(defun projectile-ibuffer (prompt-for-project)
- "Open an IBuffer window showing all buffers in the current project.
-
-Let user choose another project when PROMPT-FOR-PROJECT is supplied."
- (interactive "P")
- (let ((project-root (if prompt-for-project
- (projectile-completing-read
- "Project name: "
- (projectile-relevant-known-projects))
- (projectile-project-root))))
-
- (projectile-ibuffer-by-project project-root)))
-
-
-;;;; projectile-commander
-
-(defconst projectile-commander-help-buffer "*Projectile Commander Help*")
-
-(defvar projectile-commander-methods nil
- "List of file-selection methods for the `projectile-commander' command.
-Each element is a list (KEY DESCRIPTION FUNCTION).
-DESCRIPTION is a one-line description of what the key selects.")
-
-;;;###autoload
-(defun projectile-commander ()
- "Execute a Projectile command with a single letter.
-The user is prompted for a single character indicating the action to invoke.
-The `?' character describes then
-available actions.
-
-See `def-projectile-commander-method' for defining new methods."
- (interactive)
- (let* ((choices (mapcar #'car projectile-commander-methods))
- (prompt (concat "Select Projectile command [" choices "]: "))
- (ch (read-char-choice prompt choices))
- (fn (nth 2 (assq ch projectile-commander-methods))))
- (funcall fn)))
-
-(defmacro def-projectile-commander-method (key description &rest body)
- "Define a new `projectile-commander' method.
-
-KEY is the key the user will enter to choose this method.
-
-DESCRIPTION is a one-line sentence describing how the method.
-
-BODY is a series of forms which are evaluated when the find
-is chosen."
- (let ((method `(lambda ()
- ,@body)))
- `(setq projectile-commander-methods
- (cl-sort (copy-sequence
- (cons (list ,key ,description ,method)
- (assq-delete-all ,key projectile-commander-methods)))
- (lambda (a b) (< (car a) (car b)))))))
-
-(def-projectile-commander-method ?? "Commander help buffer."
- (ignore-errors (kill-buffer projectile-commander-help-buffer))
- (with-current-buffer (get-buffer-create projectile-commander-help-buffer)
- (insert "Projectile Commander Methods:\n\n")
- (dolist (met projectile-commander-methods)
- (insert (format "%c:\t%s\n" (car met) (cadr met))))
- (goto-char (point-min))
- (help-mode)
- (display-buffer (current-buffer) t))
- (projectile-commander))
-
-(defun projectile-commander-bindings ()
- "Setup the keybindings for the Projectile Commander."
- (def-projectile-commander-method ?f
- "Find file in project."
- (projectile-find-file))
-
- (def-projectile-commander-method ?T
- "Find test file in project."
- (projectile-find-test-file))
-
- (def-projectile-commander-method ?b
- "Switch to project buffer."
- (projectile-switch-to-buffer))
-
- (def-projectile-commander-method ?d
- "Find directory in project."
- (projectile-find-dir))
-
- (def-projectile-commander-method ?D
- "Open project root in dired."
- (projectile-dired))
-
- (def-projectile-commander-method ?v
- "Open project root in vc-dir or magit."
- (projectile-vc))
-
- (def-projectile-commander-method ?V
- "Browse dirty projects"
- (projectile-browse-dirty-projects))
-
- (def-projectile-commander-method ?r
- "Replace a string in the project."
- (projectile-replace))
-
- (def-projectile-commander-method ?R
- "Regenerate the project's [e|g]tags."
- (projectile-regenerate-tags))
-
- (def-projectile-commander-method ?g
- "Run grep on project."
- (projectile-grep))
-
- (def-projectile-commander-method ?a
- "Run ag on project."
- (call-interactively #'projectile-ag))
-
- (def-projectile-commander-method ?s
- "Switch project."
- (projectile-switch-project))
-
- (def-projectile-commander-method ?o
- "Run multi-occur on project buffers."
- (projectile-multi-occur))
-
- (def-projectile-commander-method ?j
- "Find tag in project."
- (projectile-find-tag))
-
- (def-projectile-commander-method ?k
- "Kill all project buffers."
- (projectile-kill-buffers))
-
- (def-projectile-commander-method ?e
- "Find recently visited file in project."
- (projectile-recentf)))
-
-
-;;; Dirty (modified) project check related functionality
-(defun projectile-check-vcs-status (&optional project-path)
- "Check the status of the current project.
-If PROJECT-PATH is a project, check this one instead."
- (let ((project-path (or project-path (projectile-project-root)))
- (project-status nil))
- (save-excursion
- (vc-dir project-path)
- ;; wait until vc-dir is done
- (while (vc-dir-busy) (sleep-for 0 100))
- ;; check for status
- (save-excursion
- (save-match-data
- (dolist (check projectile-vcs-dirty-state)
- (goto-char (point-min))
- (when (search-forward check nil t)
- (setq project-status (cons check project-status))))))
- (kill-buffer)
- project-status)))
-
-(defvar projectile-cached-dirty-projects-status nil
- "Cache of the last dirty projects check.")
-
-(defun projectile-check-vcs-status-of-known-projects ()
- "Return the list of dirty projects.
-The list is composed of sublists~: (project-path, project-status).
-Raise an error if their is no dirty project."
- (save-window-excursion
- (message "Checking for modifications in known projects...")
- (let ((projects projectile-known-projects)
- (status ()))
- (dolist (project projects)
- (when (and (projectile-keep-project-p project) (not (string= 'none (projectile-project-vcs project))))
- (let ((tmp-status (projectile-check-vcs-status project)))
- (when tmp-status
- (setq status (cons (list project tmp-status) status))))))
- (when (= (length status) 0)
- (message "No dirty projects have been found"))
- (setq projectile-cached-dirty-projects-status status)
- status)))
-
-;;;###autoload
-(defun projectile-browse-dirty-projects (&optional cached)
- "Browse dirty version controlled projects.
-
-With a prefix argument, or if CACHED is non-nil, try to use the cached
-dirty project list."
- (interactive "P")
- (let ((status (if (and cached projectile-cached-dirty-projects-status)
- projectile-cached-dirty-projects-status
- (projectile-check-vcs-status-of-known-projects)))
- (mod-proj nil))
- (while (not (= (length status) 0))
- (setq mod-proj (cons (car (pop status)) mod-proj)))
- (projectile-completing-read "Select project: " mod-proj
- :action 'projectile-vc)))
-
-
-;;; Find next/previous project buffer
-(defun projectile--repeat-until-project-buffer (orig-fun &rest args)
- "Repeat ORIG-FUN with ARGS until the current buffer is a project buffer."
- (if (projectile-project-root)
- (let* ((other-project-buffers (make-hash-table :test 'eq))
- (projectile-project-buffers (projectile-project-buffers))
- (max-iterations (length (buffer-list)))
- (counter 0))
- (dolist (buffer projectile-project-buffers)
- (unless (eq buffer (current-buffer))
- (puthash buffer t other-project-buffers)))
- (when (cdr-safe projectile-project-buffers)
- (while (and (< counter max-iterations)
- (not (gethash (current-buffer) other-project-buffers)))
- (apply orig-fun args)
- (cl-incf counter))))
- (apply orig-fun args)))
-
-(defun projectile-next-project-buffer ()
- "In selected window switch to the next project buffer.
-
-If the current buffer does not belong to a project, call `next-buffer'."
- (interactive)
- (projectile--repeat-until-project-buffer #'next-buffer))
-
-(defun projectile-previous-project-buffer ()
- "In selected window switch to the previous project buffer.
-
-If the current buffer does not belong to a project, call `previous-buffer'."
- (interactive)
- (projectile--repeat-until-project-buffer #'previous-buffer))
-
-
-;;; Editing a project's .dir-locals
-(defun projectile-read-variable ()
- "Prompt for a variable and return its name."
- (completing-read "Variable: "
- obarray
- (lambda (v)
- (and (boundp v) (not (keywordp v))))
- t))
-
-(define-skeleton projectile-skel-variable-cons
- "Insert a variable-name and a value in a cons-cell."
- "Value: "
- "("
- (projectile-read-variable)
- " . "
- str
- ")")
-
-(define-skeleton projectile-skel-dir-locals
- "Insert a .dir-locals.el template."
- nil
- "((nil . ("
- ("" '(projectile-skel-variable-cons) \n)
- resume:
- ")))")
-
-;;;###autoload
-(defun projectile-edit-dir-locals ()
- "Edit or create a .dir-locals.el file of the project."
- (interactive)
- (let ((file (expand-file-name ".dir-locals.el" (projectile-project-root))))
- (find-file file)
- (when (not (file-exists-p file))
- (unwind-protect
- (projectile-skel-dir-locals)
- (save-buffer)))))
-
-
-;;; Projectile Minor mode
-(define-obsolete-variable-alias 'projectile-mode-line-lighter 'projectile-mode-line-prefix)
-(defcustom projectile-mode-line-prefix
- " Projectile"
- "Mode line lighter prefix for Projectile.
-It's used by `projectile-default-mode-line'
-when using dynamic mode line lighter and is the only
-thing shown in the mode line otherwise."
- :group 'projectile
- :type 'string
- :package-version '(projectile . "0.12.0"))
-
-(defvar-local projectile--mode-line projectile-mode-line-prefix)
-
-(defun projectile-default-mode-line ()
- "Report project name and type in the modeline."
- (let ((project-name (projectile-project-name))
- (project-type (projectile-project-type)))
- (format "%s[%s%s]"
- projectile-mode-line-prefix
- (or project-name "-")
- (if project-type
- (format ":%s" project-type)
- ""))))
-
-(defun projectile-update-mode-line ()
- "Update the Projectile mode-line."
- (let ((mode-line (funcall projectile-mode-line-function)))
- (setq projectile--mode-line mode-line))
- (force-mode-line-update))
-
-(defvar projectile-command-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "4 a") #'projectile-find-other-file-other-window)
- (define-key map (kbd "4 b") #'projectile-switch-to-buffer-other-window)
- (define-key map (kbd "4 C-o") #'projectile-display-buffer)
- (define-key map (kbd "4 d") #'projectile-find-dir-other-window)
- (define-key map (kbd "4 D") #'projectile-dired-other-window)
- (define-key map (kbd "4 f") #'projectile-find-file-other-window)
- (define-key map (kbd "4 g") #'projectile-find-file-dwim-other-window)
- (define-key map (kbd "4 t") #'projectile-find-implementation-or-test-other-window)
- (define-key map (kbd "5 a") #'projectile-find-other-file-other-frame)
- (define-key map (kbd "5 b") #'projectile-switch-to-buffer-other-frame)
- (define-key map (kbd "5 d") #'projectile-find-dir-other-frame)
- (define-key map (kbd "5 D") #'projectile-dired-other-frame)
- (define-key map (kbd "5 f") #'projectile-find-file-other-frame)
- (define-key map (kbd "5 g") #'projectile-find-file-dwim-other-frame)
- (define-key map (kbd "5 t") #'projectile-find-implementation-or-test-other-frame)
- (define-key map (kbd "!") #'projectile-run-shell-command-in-root)
- (define-key map (kbd "&") #'projectile-run-async-shell-command-in-root)
- (define-key map (kbd "a") #'projectile-find-other-file)
- (define-key map (kbd "b") #'projectile-switch-to-buffer)
- (define-key map (kbd "C") #'projectile-configure-project)
- (define-key map (kbd "c") #'projectile-compile-project)
- (define-key map (kbd "d") #'projectile-find-dir)
- (define-key map (kbd "D") #'projectile-dired)
- (define-key map (kbd "e") #'projectile-recentf)
- (define-key map (kbd "E") #'projectile-edit-dir-locals)
- (define-key map (kbd "f") #'projectile-find-file)
- (define-key map (kbd "g") #'projectile-find-file-dwim)
- (define-key map (kbd "F") #'projectile-find-file-in-known-projects)
- (define-key map (kbd "i") #'projectile-invalidate-cache)
- (define-key map (kbd "I") #'projectile-ibuffer)
- (define-key map (kbd "j") #'projectile-find-tag)
- (define-key map (kbd "k") #'projectile-kill-buffers)
- (define-key map (kbd "l") #'projectile-find-file-in-directory)
- (define-key map (kbd "m") #'projectile-commander)
- (define-key map (kbd "o") #'projectile-multi-occur)
- (define-key map (kbd "p") #'projectile-switch-project)
- (define-key map (kbd "q") #'projectile-switch-open-project)
- (define-key map (kbd "P") #'projectile-test-project)
- (define-key map (kbd "r") #'projectile-replace)
- (define-key map (kbd "R") #'projectile-regenerate-tags)
- (define-key map (kbd "s g") #'projectile-grep)
- (define-key map (kbd "s r") #'projectile-ripgrep)
- (define-key map (kbd "s s") #'projectile-ag)
- (define-key map (kbd "S") #'projectile-save-project-buffers)
- (define-key map (kbd "t") #'projectile-toggle-between-implementation-and-test)
- (define-key map (kbd "T") #'projectile-find-test-file)
- (define-key map (kbd "u") #'projectile-run-project)
- (define-key map (kbd "v") #'projectile-vc)
- (define-key map (kbd "V") #'projectile-browse-dirty-projects)
- (define-key map (kbd "x e") #'projectile-run-eshell)
- (define-key map (kbd "x i") #'projectile-run-ielm)
- (define-key map (kbd "x t") #'projectile-run-term)
- (define-key map (kbd "x s") #'projectile-run-shell)
- (define-key map (kbd "x g") #'projectile-run-gdb)
- (define-key map (kbd "x v") #'projectile-run-vterm)
- (define-key map (kbd "z") #'projectile-cache-current-file)
- (define-key map (kbd "<left>") #'projectile-previous-project-buffer)
- (define-key map (kbd "<right>") #'projectile-next-project-buffer)
- (define-key map (kbd "ESC") #'projectile-project-buffers-other-buffer)
- map)
- "Keymap for Projectile commands after `projectile-keymap-prefix'.")
-(fset 'projectile-command-map projectile-command-map)
-
-(defvar projectile-mode-map
- (let ((map (make-sparse-keymap)))
- (when projectile-keymap-prefix
- (define-key map projectile-keymap-prefix 'projectile-command-map))
- (easy-menu-define projectile-mode-menu map
- "Menu for Projectile"
- '("Projectile"
- ["Find file" projectile-find-file]
- ["Find file in known projects" projectile-find-file-in-known-projects]
- ["Find test file" projectile-find-test-file]
- ["Find directory" projectile-find-dir]
- ["Find file in directory" projectile-find-file-in-directory]
- ["Find other file" projectile-find-other-file]
- ["Switch to buffer" projectile-switch-to-buffer]
- ["Jump between implementation file and test file" projectile-toggle-between-implementation-and-test]
- ["Kill project buffers" projectile-kill-buffers]
- ["Save project buffers" projectile-save-project-buffers]
- ["Recent files" projectile-recentf]
- ["Previous buffer" projectile-previous-project-buffer]
- ["Next buffer" projectile-next-project-buffer]
- "--"
- ["Toggle project wide read-only" projectile-toggle-project-read-only]
- ["Edit .dir-locals.el" projectile-edit-dir-locals]
- "--"
- ["Switch to project" projectile-switch-project]
- ["Switch to open project" projectile-switch-open-project]
- ["Discover projects in directory" projectile-discover-projects-in-directory]
- ["Browse dirty projects" projectile-browse-dirty-projects]
- ["Open project in dired" projectile-dired]
- "--"
- ["Search in project (grep)" projectile-grep]
- ["Search in project (ag)" projectile-ag]
- ["Replace in project" projectile-replace]
- ["Multi-occur in project" projectile-multi-occur]
- "--"
- ["Run GDB" projectile-run-gdb]
- "--"
- ["Run shell" projectile-run-shell]
- ["Run eshell" projectile-run-eshell]
- ["Run ielm" projectile-run-ielm]
- ["Run term" projectile-run-term]
- "--"
- ["Cache current file" projectile-cache-current-file]
- ["Invalidate cache" projectile-invalidate-cache]
- ["Regenerate [e|g]tags" projectile-regenerate-tags]
- "--"
- ["Configure project" projectile-configure-project]
- ["Compile project" projectile-compile-project]
- ["Test project" projectile-test-project]
- ["Run project" projectile-run-project]
- ["Repeat last external command" projectile-repeat-last-command]
- "--"
- ["Project info" projectile-project-info]
- ["About" projectile-version]))
- map)
- "Keymap for Projectile mode.")
-
-(defun projectile-find-file-hook-function ()
- "Called by `find-file-hook' when `projectile-mode' is on.
-
-The function does pretty much nothing when triggered on remote files
-as all the operations it normally performs are extremely slow over
-tramp."
- (projectile-maybe-limit-project-file-buffers)
- (unless (file-remote-p default-directory)
- (when projectile-dynamic-mode-line
- (projectile-update-mode-line))
- (when projectile-auto-update-cache
- (projectile-cache-files-find-file-hook))
- (projectile-track-known-projects-find-file-hook)
- (projectile-visit-project-tags-table)))
-
-(defun projectile-maybe-limit-project-file-buffers ()
- "Limit the opened file buffers for a project.
-
-The function simply kills the last buffer, as it's normally called
-when opening new files."
- (when projectile-max-file-buffer-count
- (let ((project-buffers (projectile-project-buffer-files)))
- (when (> (length project-buffers) projectile-max-file-buffer-count)
- (kill-buffer (car (last project-buffers)))))))
-
-;;;###autoload
-(define-minor-mode projectile-mode
- "Minor mode to assist project management and navigation.
-
-When called interactively, toggle `projectile-mode'. With prefix
-ARG, enable `projectile-mode' if ARG is positive, otherwise disable
-it.
-
-When called from Lisp, enable `projectile-mode' if ARG is omitted,
-nil or positive. If ARG is `toggle', toggle `projectile-mode'.
-Otherwise behave as if called interactively.
-
-\\{projectile-mode-map}"
- :lighter projectile--mode-line
- :keymap projectile-mode-map
- :group 'projectile
- :require 'projectile
- :global t
- (cond
- (projectile-mode
- ;; setup the commander bindings
- (projectile-commander-bindings)
- ;; initialize the projects cache if needed
- (unless projectile-projects-cache
- (setq projectile-projects-cache
- (or (projectile-unserialize projectile-cache-file)
- (make-hash-table :test 'equal))))
- (unless projectile-projects-cache-time
- (setq projectile-projects-cache-time
- (make-hash-table :test 'equal)))
- ;; load the known projects
- (projectile-load-known-projects)
- ;; update the list of known projects
- (projectile--cleanup-known-projects)
- (when projectile-auto-discover
- (projectile-discover-projects-in-search-path))
- (add-hook 'find-file-hook 'projectile-find-file-hook-function)
- (add-hook 'projectile-find-dir-hook #'projectile-track-known-projects-find-file-hook t)
- (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t t)
- (advice-add 'compilation-find-file :around #'compilation-find-file-projectile-find-compilation-buffer)
- (advice-add 'delete-file :before #'delete-file-projectile-remove-from-cache))
- (t
- (remove-hook 'find-file-hook #'projectile-find-file-hook-function)
- (remove-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t)
- (advice-remove 'compilation-find-file #'compilation-find-file-projectile-find-compilation-buffer)
- (advice-remove 'delete-file #'delete-file-projectile-remove-from-cache))))
-
-;;;###autoload
-(define-obsolete-function-alias 'projectile-global-mode 'projectile-mode "1.0")
-
-(provide 'projectile)
-
-;;; projectile.el ends here
diff --git a/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-autoloads.el b/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-autoloads.el
deleted file mode 100644
index c13f8f7..0000000
--- a/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-autoloads.el
+++ /dev/null
@@ -1,38 +0,0 @@
-;;; rainbow-delimiters-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "rainbow-delimiters" "rainbow-delimiters.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from rainbow-delimiters.el
-
-(autoload 'rainbow-delimiters-mode "rainbow-delimiters" "\
-Highlight nested parentheses, brackets, and braces according to their depth.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'rainbow-delimiters-mode-enable "rainbow-delimiters" "\
-Enable `rainbow-delimiters-mode'.
-
-\(fn)" nil nil)
-
-(autoload 'rainbow-delimiters-mode-disable "rainbow-delimiters" "\
-Disable `rainbow-delimiters-mode'.
-
-\(fn)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "rainbow-delimiters" '("rainbow-delimiters-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; rainbow-delimiters-autoloads.el ends here
diff --git a/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-pkg.el b/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-pkg.el
deleted file mode 100644
index 29cf9ab..0000000
--- a/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "rainbow-delimiters" "20191018.1233" "Highlight brackets according to their depth" 'nil :commit "5125f4e47604ad36c3eb4706310fcafac729ca8c" :keywords '("faces" "convenience" "lisp" "tools") :authors '(("Jeremy Rayman" . "opensource@jeremyrayman.com") ("Fanael Linithien" . "fanael4@gmail.com")) :maintainer '("Fanael Linithien" . "fanael4@gmail.com") :url "https://github.com/Fanael/rainbow-delimiters")
diff --git a/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters.el b/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters.el
deleted file mode 100644
index 9bc959f..0000000
--- a/elpa/rainbow-delimiters-20191018.1233/rainbow-delimiters.el
+++ /dev/null
@@ -1,305 +0,0 @@
-;;; rainbow-delimiters.el --- Highlight brackets according to their depth -*- lexical-binding: t -*-
-
-;; Copyright (C)
-;; 2010-2013 Jeremy Rayman
-;; 2013-2019 Fanael Linithien
-;; Author: Jeremy Rayman <opensource@jeremyrayman.com>
-;; Fanael Linithien <fanael4@gmail.com>
-;; Maintainer: Fanael Linithien <fanael4@gmail.com>
-;; Created: 2010-09-02
-;; Version: 2.1.4
-;; Package-Version: 20191018.1233
-;; Package-Commit: 5125f4e47604ad36c3eb4706310fcafac729ca8c
-;; Keywords: faces, convenience, lisp, tools
-;; Homepage: https://github.com/Fanael/rainbow-delimiters
-
-;; Note: despite `lexical-binding', there's no Emacs 24 dependency.
-;; This is merely an optimization for Emacs 24+, the code is supposed to work
-;; with *both* dynamic and lexical binding.
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Installation:
-
-;; The recommended way is to use MELPA (http://melpa.org/) or MELPA Stable
-;; (http://stable.melpa.org/). If either is in your `package-archives', do
-;; M-x package-install RET rainbow-delimiters RET
-;; Otherwise, open `rainbow-delimiters.el' in Emacs and use
-;; M-x package-install-from-buffer
-;; Any other methods of installation are unsupported.
-
-;;; Commentary:
-;;
-;; Rainbow-delimiters is a "rainbow parentheses"-like mode which highlights
-;; parentheses, brackets, and braces according to their depth. Each
-;; successive level is highlighted in a different color. This makes it easy
-;; to spot matching delimiters, orient yourself in the code, and tell which
-;; statements are at a given level.
-;;
-;; Great care has been taken to make this mode fast. You shouldn't see
-;; any discernible change in scrolling or editing speed while using it,
-;; even in delimiter-rich languages like Clojure, Lisp, and Scheme.
-;;
-;; Usage:
-;;
-;; To toggle the mode in the current buffer:
-;; M-x rainbow-delimiters-mode
-;; To start the mode automatically in `foo-mode', add the following to your init
-;; file:
-;; (add-hook 'foo-mode-hook #'rainbow-delimiters-mode)
-;; To start the mode automatically in most programming modes (Emacs 24 and
-;; above):
-;; (add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
-;;
-;; Customization:
-;;
-;; To customize various options, including the color theme:
-;; M-x customize-group rainbow-delimiters
-;;
-;; You can specify custom colors by customizing following faces:
-;; - Faces take the form `rainbow-delimiters-depth-N-face', with N being the
-;; depth. Depth begins at 1, the outermost color. Faces exist for depths 1-9.
-;; - The unmatched delimiter face: `rainbow-delimiters-unmatched-face'.
-;; - The mismatched delimiter face: `rainbow-delimiters-mismatched-face'.
-
-;;; Code:
-
-(defgroup rainbow-delimiters nil
- "Highlight nested parentheses, brackets, and braces according to their depth."
- :prefix "rainbow-delimiters-"
- :link '(url-link :tag "Website for rainbow-delimiters"
- "https://github.com/Fanael/rainbow-delimiters")
- :group 'applications)
-
-(defgroup rainbow-delimiters-faces nil
- "Faces for successively nested pairs of delimiters.
-
-When depth exceeds innermost defined face, colors cycle back through."
- :group 'rainbow-delimiters
- :group 'faces
- :link '(custom-group-link "rainbow-delimiters")
- :prefix "rainbow-delimiters-")
-
-(defcustom rainbow-delimiters-pick-face-function
- #'rainbow-delimiters-default-pick-face
- "The function used to pick a face used to highlight a delimiter.
-The function should take three arguments (DEPTH MATCH LOC), where:
- - DEPTH is the delimiter depth; when zero or negative, it's an unmatched
- delimiter.
- - MATCH is nil iff the delimiter is a mismatched closing delimiter.
- - LOC is the location of the delimiter.
-The function should return a value suitable to use as a value of the `face' text
-property, or nil, in which case the delimiter is not highlighted.
-The function should not move the point or mark or change the match data."
- :tag "Pick face function"
- :type 'function
- :group 'rainbow-delimiters)
-
-(defface rainbow-delimiters-base-face
- '((default (:inherit unspecified)))
- "Face inherited by all other rainbow-delimiter faces."
- :group 'rainbow-delimiters-faces)
-
-(defface rainbow-delimiters-base-error-face
- '((default (:inherit rainbow-delimiters-base-face))
- (t (:foreground "#88090B")))
- "Face inherited by all other rainbow-delimiter error faces."
- :group 'rainbow-delimiters-faces)
-
-(defface rainbow-delimiters-unmatched-face
- '((default (:inherit rainbow-delimiters-base-error-face)))
- "Face to highlight unmatched closing delimiters in."
- :group 'rainbow-delimiters-faces)
-
-(defface rainbow-delimiters-mismatched-face
- '((default (:inherit rainbow-delimiters-unmatched-face)))
- "Face to highlight mismatched closing delimiters in."
- :group 'rainbow-delimiters-faces)
-
-(eval-when-compile
- (defmacro rainbow-delimiters--define-depth-faces ()
- (let ((faces '())
- (light-colors ["#707183" "#7388d6" "#909183" "#709870" "#907373"
- "#6276ba" "#858580" "#80a880" "#887070"])
- (dark-colors ["grey55" "#93a8c6" "#b0b1a3" "#97b098" "#aebed8"
- "#b0b0b3" "#90a890" "#a2b6da" "#9cb6ad"]))
- (dotimes (i 9)
- (push `(defface ,(intern (format "rainbow-delimiters-depth-%d-face" (1+ i)))
- '((default (:inherit rainbow-delimiters-base-face))
- (((class color) (background light)) :foreground ,(aref light-colors i))
- (((class color) (background dark)) :foreground ,(aref dark-colors i)))
- ,(format "Nested delimiter face, depth %d." (1+ i))
- :group 'rainbow-delimiters-faces)
- faces))
- `(progn ,@faces))))
-(rainbow-delimiters--define-depth-faces)
-
-(defcustom rainbow-delimiters-max-face-count 9
- "Number of faces defined for highlighting delimiter levels.
-
-Determines depth at which to cycle through faces again.
-
-It's safe to change this variable provided that for all integers from 1 to the
-new value inclusive, a face `rainbow-delimiters-depth-N-face' is defined."
- :type 'integer
- :group 'rainbow-delimiters)
-
-(defcustom rainbow-delimiters-outermost-only-face-count 0
- "Number of faces to be used only for N outermost delimiter levels.
-
-This should be smaller than `rainbow-delimiters-max-face-count'."
- :type 'integer
- :group 'rainbow-delimiters)
-
-
-(defun rainbow-delimiters-default-pick-face (depth match _loc)
- "Return a face name appropriate for nesting depth DEPTH.
-DEPTH and MATCH are as in `rainbow-delimiters-pick-face-function'.
-
-The returned value is either `rainbow-delimiters-unmatched-face',
-`rainbow-delimiters-mismatched-face', or one of the
-`rainbow-delimiters-depth-N-face' faces, obeying
-`rainbow-delimiters-max-face-count' and
-`rainbow-delimiters-outermost-only-face-count'."
- (cond
- ((<= depth 0)
- 'rainbow-delimiters-unmatched-face)
- ((not match)
- 'rainbow-delimiters-mismatched-face)
- (t
- (intern-soft
- (concat "rainbow-delimiters-depth-"
- (number-to-string
- (if (<= depth rainbow-delimiters-max-face-count)
- ;; Our nesting depth has a face defined for it.
- depth
- ;; Deeper than # of defined faces; cycle back through to
- ;; `rainbow-delimiters-outermost-only-face-count' + 1.
- ;; Return face # that corresponds to current nesting level.
- (+ 1 rainbow-delimiters-outermost-only-face-count
- (mod (- depth rainbow-delimiters-max-face-count 1)
- (- rainbow-delimiters-max-face-count
- rainbow-delimiters-outermost-only-face-count)))))
- "-face")))))
-
-(defun rainbow-delimiters--apply-color (loc depth match)
- "Highlight a single delimiter at LOC according to DEPTH.
-
-LOC is the location of the character to add text properties to.
-DEPTH is the nested depth at LOC, which determines the face to use.
-MATCH is nil iff it's a mismatched closing delimiter."
- (let ((face (funcall rainbow-delimiters-pick-face-function depth match loc)))
- (when face
- (font-lock-prepend-text-property loc (1+ loc) 'face face))))
-
-(defun rainbow-delimiters--char-ineligible-p (loc ppss delim-syntax-code)
- "Return t if char at LOC should not be highlighted.
-PPSS is the `parse-partial-sexp' state at LOC.
-DELIM-SYNTAX-CODE is the `car' of a raw syntax descriptor at LOC.
-
-Returns t if char at loc meets one of the following conditions:
-- Inside a string.
-- Inside a comment.
-- Is an escaped char, e.g. ?\)"
- (or
- (nth 3 ppss) ; inside string?
- (nth 4 ppss) ; inside comment?
- (nth 5 ppss) ; escaped according to the syntax table?
- ;; Note: no need to consider single-char openers, they're already handled
- ;; by looking at ppss.
- (cond
- ;; Two character opener, LOC at the first character?
- ((/= 0 (logand #x10000 delim-syntax-code))
- (/= 0 (logand #x20000 (or (car (syntax-after (1+ loc))) 0))))
- ;; Two character opener, LOC at the second character?
- ((/= 0 (logand #x20000 delim-syntax-code))
- (/= 0 (logand #x10000 (or (car (syntax-after (1- loc))) 0))))
- (t
- nil))))
-
-;; Main function called by font-lock.
-(defun rainbow-delimiters--propertize (end)
- "Highlight delimiters in region between point and END.
-
-Used by font-lock for dynamic highlighting."
- (let* ((last-ppss-pos (point))
- (ppss (syntax-ppss)))
- (while (> end (progn (skip-syntax-forward "^()" end)
- (point)))
- (let* ((delim-pos (point))
- (delim-syntax (syntax-after delim-pos)))
- (setq ppss (parse-partial-sexp last-ppss-pos delim-pos nil nil ppss))
- (setq last-ppss-pos delim-pos)
- ;; `skip-syntax-forward' leaves the point at the delimiter, move past
- ;; it.
- (forward-char)
- (let ((delim-syntax-code (car delim-syntax)))
- (cond
- ((rainbow-delimiters--char-ineligible-p delim-pos ppss delim-syntax-code)
- nil)
- ((= 4 (logand #xFFFF delim-syntax-code))
- ;; The (1+ ...) is needed because `parse-partial-sexp' returns the
- ;; depth at the opening delimiter, not in the block being started.
- (rainbow-delimiters--apply-color delim-pos (1+ (nth 0 ppss)) t))
- (t
- ;; Not an opening delimiter, so it's a closing delimiter.
- (let ((matches-p (eq (cdr delim-syntax) (char-after (nth 1 ppss)))))
- (rainbow-delimiters--apply-color delim-pos (nth 0 ppss) matches-p))))))))
- ;; We already fontified the delimiters, tell font-lock there's nothing more
- ;; to do.
- nil)
-
-;; NB: no face defined here because we apply the faces ourselves instead of
-;; leaving that to font-lock.
-(defconst rainbow-delimiters--font-lock-keywords
- '(rainbow-delimiters--propertize))
-
-;;;###autoload
-(define-minor-mode rainbow-delimiters-mode
- "Highlight nested parentheses, brackets, and braces according to their depth."
- nil "" nil ; No modeline lighter - it's already obvious when the mode is on.
- (font-lock-remove-keywords nil rainbow-delimiters--font-lock-keywords)
- (when rainbow-delimiters-mode
- (font-lock-add-keywords nil rainbow-delimiters--font-lock-keywords 'append)
- (set (make-local-variable 'jit-lock-contextually) t)
- (when (or (bound-and-true-p syntax-begin-function)
- (bound-and-true-p font-lock-beginning-of-syntax-function))
- ;; We're going to modify `syntax-begin-function', so flush the cache to
- ;; avoid getting cached values that used the old value.
- (syntax-ppss-flush-cache 0))
- ;; `syntax-begin-function' may break the assumption we rely on that
- ;; `syntax-ppss' is exactly equivalent to `parse-partial-sexp' from
- ;; `point-min'. Just don't use it, the performance hit should be negligible.
- (when (boundp 'syntax-begin-function)
- (set (make-local-variable 'syntax-begin-function) nil))
- ;; Obsolete equivalent of `syntax-begin-function'.
- (when (boundp 'font-lock-beginning-of-syntax-function)
- (set (make-local-variable 'font-lock-beginning-of-syntax-function) nil)))
- (when font-lock-mode
- (if (fboundp 'font-lock-flush)
- (font-lock-flush)
- (with-no-warnings (font-lock-fontify-buffer)))))
-
-;;;###autoload
-(defun rainbow-delimiters-mode-enable ()
- "Enable `rainbow-delimiters-mode'."
- (rainbow-delimiters-mode 1))
-
-;;;###autoload
-(defun rainbow-delimiters-mode-disable ()
- "Disable `rainbow-delimiters-mode'."
- (rainbow-delimiters-mode 0))
-
-(provide 'rainbow-delimiters)
-;;; rainbow-delimiters.el ends here
diff --git a/elpa/rainbow-mode-1.0.5.signed b/elpa/rainbow-mode-1.0.5.signed
deleted file mode 100644
index c4de6c1..0000000
--- a/elpa/rainbow-mode-1.0.5.signed
+++ /dev/null
@@ -1 +0,0 @@
-Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2020-07-28T14:05:01-0700 using RSA \ No newline at end of file
diff --git a/elpa/rainbow-mode-1.0.5/rainbow-mode-autoloads.el b/elpa/rainbow-mode-1.0.5/rainbow-mode-autoloads.el
deleted file mode 100644
index db96c6a..0000000
--- a/elpa/rainbow-mode-1.0.5/rainbow-mode-autoloads.el
+++ /dev/null
@@ -1,28 +0,0 @@
-;;; rainbow-mode-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "rainbow-mode" "rainbow-mode.el" (0 0 0 0))
-;;; Generated autoloads from rainbow-mode.el
-
-(autoload 'rainbow-mode "rainbow-mode" "\
-Colorize strings that represent colors.
-This will fontify with colors the string like \"#aabbcc\" or \"blue\".
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "rainbow-mode" '("rainbow-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; rainbow-mode-autoloads.el ends here
diff --git a/elpa/rainbow-mode-1.0.5/rainbow-mode-pkg.el b/elpa/rainbow-mode-1.0.5/rainbow-mode-pkg.el
deleted file mode 100644
index 1636b3a..0000000
--- a/elpa/rainbow-mode-1.0.5/rainbow-mode-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "rainbow-mode" "1.0.5" "Colorize color names in buffers" 'nil :url "http://elpa.gnu.org/packages/rainbow-mode.html" :keywords '("faces") :authors '(("Julien Danjou" . "julien@danjou.info")) :maintainer '("Julien Danjou" . "julien@danjou.info"))
diff --git a/elpa/rainbow-mode-1.0.5/rainbow-mode.el b/elpa/rainbow-mode-1.0.5/rainbow-mode.el
deleted file mode 100644
index ab5d085..0000000
--- a/elpa/rainbow-mode-1.0.5/rainbow-mode.el
+++ /dev/null
@@ -1,1379 +0,0 @@
-;;; rainbow-mode.el --- Colorize color names in buffers
-
-;; Copyright (C) 2010-2020 Free Software Foundation, Inc
-
-;; Author: Julien Danjou <julien@danjou.info>
-;; Keywords: faces
-;; Version: 1.0.5
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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.
-
-;; GNU Emacs 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 <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; This minor mode sets background color to strings that match color
-;; names, e.g. #0000ff is displayed in white with a blue background.
-;;
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'regexp-opt)
-(require 'faces)
-(require 'color)
-
-(unless (require 'xterm-color nil t)
- (require 'ansi-color))
-
-(defgroup rainbow nil
- "Show color strings with a background color."
- :tag "Rainbow"
- :group 'help)
-
-;;; Hexadecimal colors
-
-(defvar rainbow-hexadecimal-colors-font-lock-keywords
- '(("[^&]\\(#\\(?:[0-9a-fA-F]\\{3\\}\\)\\{1,4\\}\\)"
- (1 (rainbow-colorize-itself 1)))
- ("^\\(#\\(?:[0-9a-fA-F]\\{3\\}\\)\\{1,4\\}\\)"
- (0 (rainbow-colorize-itself)))
- ("[Rr][Gg][Bb]:[0-9a-fA-F]\\{1,4\\}/[0-9a-fA-F]\\{1,4\\}/[0-9a-fA-F]\\{1,4\\}"
- (0 (rainbow-colorize-itself)))
- ("[Rr][Gg][Bb][Ii]:[0-9.]+/[0-9.]+/[0-9.]+"
- (0 (rainbow-colorize-itself)))
- ("\\(?:[Cc][Ii][Ee]\\(?:[Xx][Yy][Zz]\\|[Uu][Vv][Yy]\\|[Xx][Yy][Yy]\\|[Ll][Aa][Bb]\\|[Ll][Uu][Vv]\\)\\|[Tt][Ee][Kk][Hh][Vv][Cc]\\):[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?/[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?/[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?"
- (0 (rainbow-colorize-itself))))
- "Font-lock keywords to add for hexadecimal colors.")
-
-;;; rgb() colors
-
-(defvar rainbow-html-rgb-colors-font-lock-keywords
- '(("rgb(\s*\\([0-9]\\{1,3\\}\\(?:\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*)"
- (0 (rainbow-colorize-rgb)))
- ("rgba(\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*[0-9]*\.?[0-9]+\s*%?\s*)"
- (0 (rainbow-colorize-rgb)))
- ("hsl(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*)"
- (0 (rainbow-colorize-hsl)))
- ("hsla(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*[0-9]*\.?[0-9]+\s*%?\s*)"
- (0 (rainbow-colorize-hsl))))
- "Font-lock keywords to add for RGB colors.")
-
-;;; HTML colors
-
-(defvar rainbow-html-colors-font-lock-keywords nil
- "Font-lock keywords to add for HTML colors.")
-(make-variable-buffer-local 'rainbow-html-colors-font-lock-keywords)
-
-(defcustom rainbow-html-colors-alist
- '(("AliceBlue" . "#F0F8FF")
- ("AntiqueWhite" . "#FAEBD7")
- ("Aqua" . "#00FFFF")
- ("Aquamarine" . "#7FFFD4")
- ("Azure" . "#F0FFFF")
- ("Beige" . "#F5F5DC")
- ("Bisque" . "#FFE4C4")
- ("Black" . "#000000")
- ("BlanchedAlmond" . "#FFEBCD")
- ("Blue" . "#0000FF")
- ("BlueViolet" . "#8A2BE2")
- ("Brown" . "#A52A2A")
- ("BurlyWood" . "#DEB887")
- ("CadetBlue" . "#5F9EA0")
- ("Chartreuse" . "#7FFF00")
- ("Chocolate" . "#D2691E")
- ("Coral" . "#FF7F50")
- ("CornflowerBlue" . "#6495ED")
- ("Cornsilk" . "#FFF8DC")
- ("Crimson" . "#DC143C")
- ("Cyan" . "#00FFFF")
- ("DarkBlue" . "#00008B")
- ("DarkCyan" . "#008B8B")
- ("DarkGoldenRod" . "#B8860B")
- ("DarkGray" . "#A9A9A9")
- ("DarkGrey" . "#A9A9A9")
- ("DarkGreen" . "#006400")
- ("DarkKhaki" . "#BDB76B")
- ("DarkMagenta" . "#8B008B")
- ("DarkOliveGreen" . "#556B2F")
- ("Darkorange" . "#FF8C00")
- ("DarkOrchid" . "#9932CC")
- ("DarkRed" . "#8B0000")
- ("DarkSalmon" . "#E9967A")
- ("DarkSeaGreen" . "#8FBC8F")
- ("DarkSlateBlue" . "#483D8B")
- ("DarkSlateGray" . "#2F4F4F")
- ("DarkSlateGrey" . "#2F4F4F")
- ("DarkTurquoise" . "#00CED1")
- ("DarkViolet" . "#9400D3")
- ("DeepPink" . "#FF1493")
- ("DeepSkyBlue" . "#00BFFF")
- ("DimGray" . "#696969")
- ("DimGrey" . "#696969")
- ("DodgerBlue" . "#1E90FF")
- ("FireBrick" . "#B22222")
- ("FloralWhite" . "#FFFAF0")
- ("ForestGreen" . "#228B22")
- ("Fuchsia" . "#FF00FF")
- ("Gainsboro" . "#DCDCDC")
- ("GhostWhite" . "#F8F8FF")
- ("Gold" . "#FFD700")
- ("GoldenRod" . "#DAA520")
- ("Gray" . "#808080")
- ("Grey" . "#808080")
- ("Green" . "#008000")
- ("GreenYellow" . "#ADFF2F")
- ("HoneyDew" . "#F0FFF0")
- ("HotPink" . "#FF69B4")
- ("IndianRed" . "#CD5C5C")
- ("Indigo" . "#4B0082")
- ("Ivory" . "#FFFFF0")
- ("Khaki" . "#F0E68C")
- ("Lavender" . "#E6E6FA")
- ("LavenderBlush" . "#FFF0F5")
- ("LawnGreen" . "#7CFC00")
- ("LemonChiffon" . "#FFFACD")
- ("LightBlue" . "#ADD8E6")
- ("LightCoral" . "#F08080")
- ("LightCyan" . "#E0FFFF")
- ("LightGoldenRodYellow" . "#FAFAD2")
- ("LightGray" . "#D3D3D3")
- ("LightGrey" . "#D3D3D3")
- ("LightGreen" . "#90EE90")
- ("LightPink" . "#FFB6C1")
- ("LightSalmon" . "#FFA07A")
- ("LightSeaGreen" . "#20B2AA")
- ("LightSkyBlue" . "#87CEFA")
- ("LightSlateGray" . "#778899")
- ("LightSlateGrey" . "#778899")
- ("LightSteelBlue" . "#B0C4DE")
- ("LightYellow" . "#FFFFE0")
- ("Lime" . "#00FF00")
- ("LimeGreen" . "#32CD32")
- ("Linen" . "#FAF0E6")
- ("Magenta" . "#FF00FF")
- ("Maroon" . "#800000")
- ("MediumAquaMarine" . "#66CDAA")
- ("MediumBlue" . "#0000CD")
- ("MediumOrchid" . "#BA55D3")
- ("MediumPurple" . "#9370D8")
- ("MediumSeaGreen" . "#3CB371")
- ("MediumSlateBlue" . "#7B68EE")
- ("MediumSpringGreen" . "#00FA9A")
- ("MediumTurquoise" . "#48D1CC")
- ("MediumVioletRed" . "#C71585")
- ("MidnightBlue" . "#191970")
- ("MintCream" . "#F5FFFA")
- ("MistyRose" . "#FFE4E1")
- ("Moccasin" . "#FFE4B5")
- ("NavajoWhite" . "#FFDEAD")
- ("Navy" . "#000080")
- ("OldLace" . "#FDF5E6")
- ("Olive" . "#808000")
- ("OliveDrab" . "#6B8E23")
- ("Orange" . "#FFA500")
- ("OrangeRed" . "#FF4500")
- ("Orchid" . "#DA70D6")
- ("PaleGoldenRod" . "#EEE8AA")
- ("PaleGreen" . "#98FB98")
- ("PaleTurquoise" . "#AFEEEE")
- ("PaleVioletRed" . "#D87093")
- ("PapayaWhip" . "#FFEFD5")
- ("PeachPuff" . "#FFDAB9")
- ("Peru" . "#CD853F")
- ("Pink" . "#FFC0CB")
- ("Plum" . "#DDA0DD")
- ("PowderBlue" . "#B0E0E6")
- ("Purple" . "#800080")
- ("Red" . "#FF0000")
- ("RosyBrown" . "#BC8F8F")
- ("RoyalBlue" . "#4169E1")
- ("SaddleBrown" . "#8B4513")
- ("Salmon" . "#FA8072")
- ("SandyBrown" . "#F4A460")
- ("SeaGreen" . "#2E8B57")
- ("SeaShell" . "#FFF5EE")
- ("Sienna" . "#A0522D")
- ("Silver" . "#C0C0C0")
- ("SkyBlue" . "#87CEEB")
- ("SlateBlue" . "#6A5ACD")
- ("SlateGray" . "#708090")
- ("SlateGrey" . "#708090")
- ("Snow" . "#FFFAFA")
- ("SpringGreen" . "#00FF7F")
- ("SteelBlue" . "#4682B4")
- ("Tan" . "#D2B48C")
- ("Teal" . "#008080")
- ("Thistle" . "#D8BFD8")
- ("Tomato" . "#FF6347")
- ("Turquoise" . "#40E0D0")
- ("Violet" . "#EE82EE")
- ("Wheat" . "#F5DEB3")
- ("White" . "#FFFFFF")
- ("WhiteSmoke" . "#F5F5F5")
- ("Yellow" . "#FFFF00")
- ("YellowGreen" . "#9ACD32"))
- "Alist of HTML colors.
-Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)."
- :type 'alist
- :group 'rainbow)
-
-(defcustom rainbow-html-colors-major-mode-list
- '(html-mode css-mode php-mode nxml-mode xml-mode)
- "List of major mode where HTML colors are enabled when
-`rainbow-html-colors' is set to auto."
- :type '(repeat (symbol :tag "Major-Mode"))
- :group 'rainbow)
-
-(defcustom rainbow-html-colors 'auto
- "When to enable HTML colors.
-If set to t, the HTML colors will be enabled. If set to nil, the
-HTML colors will not be enabled. If set to auto, the HTML colors
-will be enabled if a major mode has been detected from the
-`rainbow-html-colors-major-mode-list'."
- :type '(choice (symbol :tag "enable in certain modes" auto)
- (symbol :tag "enable globally" t)
- (symbol :tag "disable" nil))
- :group 'rainbow)
-
-;;; X colors
-
-(defvar rainbow-x-colors-font-lock-keywords
- `((,(regexp-opt (x-defined-colors) 'words)
- (0 (rainbow-colorize-itself))))
- "Font-lock keywords to add for X colors.")
-
-(defcustom rainbow-x-colors-major-mode-list
- '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode)
- "List of major mode where X colors are enabled when
-`rainbow-x-colors' is set to auto."
- :type '(repeat (symbol :tag "Major-Mode"))
- :group 'rainbow)
-
-(defcustom rainbow-x-colors 'auto
- "When to enable X colors.
-If set to t, the X colors will be enabled. If set to nil, the
-X colors will not be enabled. If set to auto, the X colors
-will be enabled if a major mode has been detected from the
-`rainbow-x-colors-major-mode-list'."
- :type '(choice (symbol :tag "enable in certain modes" auto)
- (symbol :tag "enable globally" t)
- (symbol :tag "disable" nil))
- :group 'rainbow)
-
-;;; LaTeX colors
-
-(defvar rainbow-latex-rgb-colors-font-lock-keywords
- '(("{rgb}{\\([0-9.]+\\),\s*\\([0-9.]+\\),\s*\\([0-9.]+\\)}"
- (0 (rainbow-colorize-rgb-float)))
- ("{RGB}{\\([0-9]\\{1,3\\}\\),\s*\\([0-9]\\{1,3\\}\\),\s*\\([0-9]\\{1,3\\}\\)}"
- (0 (rainbow-colorize-rgb)))
- ("{HTML}{\\([0-9A-Fa-f]\\{6\\}\\)}"
- (0 (rainbow-colorize-hexadecimal-without-sharp))))
- "Font-lock keywords to add for LaTeX colors.")
-
-(defcustom rainbow-latex-colors-major-mode-list
- '(latex-mode)
- "List of major mode where LaTeX colors are enabled when
-`rainbow-x-colors' is set to auto."
- :type '(repeat (symbol :tag "Major-Mode"))
- :group 'rainbow)
-
-(defcustom rainbow-latex-colors 'auto
- "When to enable LaTeX colors.
-If set to t, the LaTeX colors will be enabled. If set to nil, the
-LaTeX colors will not be enabled. If set to auto, the LaTeX colors
-will be enabled if a major mode has been detected from the
-`rainbow-latex-colors-major-mode-list'."
- :type '(choice (symbol :tag "enable in certain modes" auto)
- (symbol :tag "enable globally" t)
- (symbol :tag "disable" nil))
- :group 'rainbow)
-
-;;; Shell colors
-
-(defvar rainbow-ansi-colors-font-lock-keywords
- '(("\\(\\\\[eE]\\|\\\\033\\|\\\\x1[bB]\\|\033\\)\\[\\([0-9;]*m\\)"
- (0 (rainbow-colorize-ansi))))
- "Font-lock keywords to add for ANSI colors.")
-
-(defcustom rainbow-ansi-colors-major-mode-list
- '(sh-mode c-mode c++-mode)
- "List of major mode where ANSI colors are enabled when
-`rainbow-ansi-colors' is set to auto."
- :type '(repeat (symbol :tag "Major-Mode"))
- :group 'rainbow)
-
-(defcustom rainbow-ansi-colors 'auto
- "When to enable ANSI colors.
-If set to t, the ANSI colors will be enabled. If set to nil, the
-ANSI colors will not be enabled. If set to auto, the ANSI colors
-will be enabled if a major mode has been detected from the
-`rainbow-ansi-colors-major-mode-list'."
- :type '(choice (symbol :tag "enable in certain modes" auto)
- (symbol :tag "enable globally" t)
- (symbol :tag "disable" nil))
- :group 'rainbow)
-
-;;; R colors
-
-(defvar rainbow-r-colors-font-lock-keywords nil
- "Font-lock keywords to add for R colors.")
-(make-variable-buffer-local 'rainbow-r-colors-font-lock-keywords)
-
-;; use the following code to generate the list in R
-;; output_colors <- function(colors) {for(color in colors) {col <- col2rgb(color); cat(sprintf("(\"%s\" . \"#%02X%02X%02X\")\n",color,col[1],col[2],col[3]));}}
-;; output_colors(colors())
-(defcustom rainbow-r-colors-alist
- '(("white" . "#FFFFFF")
- ("aliceblue" . "#F0F8FF")
- ("antiquewhite" . "#FAEBD7")
- ("antiquewhite1" . "#FFEFDB")
- ("antiquewhite2" . "#EEDFCC")
- ("antiquewhite3" . "#CDC0B0")
- ("antiquewhite4" . "#8B8378")
- ("aquamarine" . "#7FFFD4")
- ("aquamarine1" . "#7FFFD4")
- ("aquamarine2" . "#76EEC6")
- ("aquamarine3" . "#66CDAA")
- ("aquamarine4" . "#458B74")
- ("azure" . "#F0FFFF")
- ("azure1" . "#F0FFFF")
- ("azure2" . "#E0EEEE")
- ("azure3" . "#C1CDCD")
- ("azure4" . "#838B8B")
- ("beige" . "#F5F5DC")
- ("bisque" . "#FFE4C4")
- ("bisque1" . "#FFE4C4")
- ("bisque2" . "#EED5B7")
- ("bisque3" . "#CDB79E")
- ("bisque4" . "#8B7D6B")
- ("black" . "#000000")
- ("blanchedalmond" . "#FFEBCD")
- ("blue" . "#0000FF")
- ("blue1" . "#0000FF")
- ("blue2" . "#0000EE")
- ("blue3" . "#0000CD")
- ("blue4" . "#00008B")
- ("blueviolet" . "#8A2BE2")
- ("brown" . "#A52A2A")
- ("brown1" . "#FF4040")
- ("brown2" . "#EE3B3B")
- ("brown3" . "#CD3333")
- ("brown4" . "#8B2323")
- ("burlywood" . "#DEB887")
- ("burlywood1" . "#FFD39B")
- ("burlywood2" . "#EEC591")
- ("burlywood3" . "#CDAA7D")
- ("burlywood4" . "#8B7355")
- ("cadetblue" . "#5F9EA0")
- ("cadetblue1" . "#98F5FF")
- ("cadetblue2" . "#8EE5EE")
- ("cadetblue3" . "#7AC5CD")
- ("cadetblue4" . "#53868B")
- ("chartreuse" . "#7FFF00")
- ("chartreuse1" . "#7FFF00")
- ("chartreuse2" . "#76EE00")
- ("chartreuse3" . "#66CD00")
- ("chartreuse4" . "#458B00")
- ("chocolate" . "#D2691E")
- ("chocolate1" . "#FF7F24")
- ("chocolate2" . "#EE7621")
- ("chocolate3" . "#CD661D")
- ("chocolate4" . "#8B4513")
- ("coral" . "#FF7F50")
- ("coral1" . "#FF7256")
- ("coral2" . "#EE6A50")
- ("coral3" . "#CD5B45")
- ("coral4" . "#8B3E2F")
- ("cornflowerblue" . "#6495ED")
- ("cornsilk" . "#FFF8DC")
- ("cornsilk1" . "#FFF8DC")
- ("cornsilk2" . "#EEE8CD")
- ("cornsilk3" . "#CDC8B1")
- ("cornsilk4" . "#8B8878")
- ("cyan" . "#00FFFF")
- ("cyan1" . "#00FFFF")
- ("cyan2" . "#00EEEE")
- ("cyan3" . "#00CDCD")
- ("cyan4" . "#008B8B")
- ("darkblue" . "#00008B")
- ("darkcyan" . "#008B8B")
- ("darkgoldenrod" . "#B8860B")
- ("darkgoldenrod1" . "#FFB90F")
- ("darkgoldenrod2" . "#EEAD0E")
- ("darkgoldenrod3" . "#CD950C")
- ("darkgoldenrod4" . "#8B6508")
- ("darkgray" . "#A9A9A9")
- ("darkgreen" . "#006400")
- ("darkgrey" . "#A9A9A9")
- ("darkkhaki" . "#BDB76B")
- ("darkmagenta" . "#8B008B")
- ("darkolivegreen" . "#556B2F")
- ("darkolivegreen1" . "#CAFF70")
- ("darkolivegreen2" . "#BCEE68")
- ("darkolivegreen3" . "#A2CD5A")
- ("darkolivegreen4" . "#6E8B3D")
- ("darkorange" . "#FF8C00")
- ("darkorange1" . "#FF7F00")
- ("darkorange2" . "#EE7600")
- ("darkorange3" . "#CD6600")
- ("darkorange4" . "#8B4500")
- ("darkorchid" . "#9932CC")
- ("darkorchid1" . "#BF3EFF")
- ("darkorchid2" . "#B23AEE")
- ("darkorchid3" . "#9A32CD")
- ("darkorchid4" . "#68228B")
- ("darkred" . "#8B0000")
- ("darksalmon" . "#E9967A")
- ("darkseagreen" . "#8FBC8F")
- ("darkseagreen1" . "#C1FFC1")
- ("darkseagreen2" . "#B4EEB4")
- ("darkseagreen3" . "#9BCD9B")
- ("darkseagreen4" . "#698B69")
- ("darkslateblue" . "#483D8B")
- ("darkslategray" . "#2F4F4F")
- ("darkslategray1" . "#97FFFF")
- ("darkslategray2" . "#8DEEEE")
- ("darkslategray3" . "#79CDCD")
- ("darkslategray4" . "#528B8B")
- ("darkslategrey" . "#2F4F4F")
- ("darkturquoise" . "#00CED1")
- ("darkviolet" . "#9400D3")
- ("deeppink" . "#FF1493")
- ("deeppink1" . "#FF1493")
- ("deeppink2" . "#EE1289")
- ("deeppink3" . "#CD1076")
- ("deeppink4" . "#8B0A50")
- ("deepskyblue" . "#00BFFF")
- ("deepskyblue1" . "#00BFFF")
- ("deepskyblue2" . "#00B2EE")
- ("deepskyblue3" . "#009ACD")
- ("deepskyblue4" . "#00688B")
- ("dimgray" . "#696969")
- ("dimgrey" . "#696969")
- ("dodgerblue" . "#1E90FF")
- ("dodgerblue1" . "#1E90FF")
- ("dodgerblue2" . "#1C86EE")
- ("dodgerblue3" . "#1874CD")
- ("dodgerblue4" . "#104E8B")
- ("firebrick" . "#B22222")
- ("firebrick1" . "#FF3030")
- ("firebrick2" . "#EE2C2C")
- ("firebrick3" . "#CD2626")
- ("firebrick4" . "#8B1A1A")
- ("floralwhite" . "#FFFAF0")
- ("forestgreen" . "#228B22")
- ("gainsboro" . "#DCDCDC")
- ("ghostwhite" . "#F8F8FF")
- ("gold" . "#FFD700")
- ("gold1" . "#FFD700")
- ("gold2" . "#EEC900")
- ("gold3" . "#CDAD00")
- ("gold4" . "#8B7500")
- ("goldenrod" . "#DAA520")
- ("goldenrod1" . "#FFC125")
- ("goldenrod2" . "#EEB422")
- ("goldenrod3" . "#CD9B1D")
- ("goldenrod4" . "#8B6914")
- ("gray" . "#BEBEBE")
- ("gray0" . "#000000")
- ("gray1" . "#030303")
- ("gray2" . "#050505")
- ("gray3" . "#080808")
- ("gray4" . "#0A0A0A")
- ("gray5" . "#0D0D0D")
- ("gray6" . "#0F0F0F")
- ("gray7" . "#121212")
- ("gray8" . "#141414")
- ("gray9" . "#171717")
- ("gray10" . "#1A1A1A")
- ("gray11" . "#1C1C1C")
- ("gray12" . "#1F1F1F")
- ("gray13" . "#212121")
- ("gray14" . "#242424")
- ("gray15" . "#262626")
- ("gray16" . "#292929")
- ("gray17" . "#2B2B2B")
- ("gray18" . "#2E2E2E")
- ("gray19" . "#303030")
- ("gray20" . "#333333")
- ("gray21" . "#363636")
- ("gray22" . "#383838")
- ("gray23" . "#3B3B3B")
- ("gray24" . "#3D3D3D")
- ("gray25" . "#404040")
- ("gray26" . "#424242")
- ("gray27" . "#454545")
- ("gray28" . "#474747")
- ("gray29" . "#4A4A4A")
- ("gray30" . "#4D4D4D")
- ("gray31" . "#4F4F4F")
- ("gray32" . "#525252")
- ("gray33" . "#545454")
- ("gray34" . "#575757")
- ("gray35" . "#595959")
- ("gray36" . "#5C5C5C")
- ("gray37" . "#5E5E5E")
- ("gray38" . "#616161")
- ("gray39" . "#636363")
- ("gray40" . "#666666")
- ("gray41" . "#696969")
- ("gray42" . "#6B6B6B")
- ("gray43" . "#6E6E6E")
- ("gray44" . "#707070")
- ("gray45" . "#737373")
- ("gray46" . "#757575")
- ("gray47" . "#787878")
- ("gray48" . "#7A7A7A")
- ("gray49" . "#7D7D7D")
- ("gray50" . "#7F7F7F")
- ("gray51" . "#828282")
- ("gray52" . "#858585")
- ("gray53" . "#878787")
- ("gray54" . "#8A8A8A")
- ("gray55" . "#8C8C8C")
- ("gray56" . "#8F8F8F")
- ("gray57" . "#919191")
- ("gray58" . "#949494")
- ("gray59" . "#969696")
- ("gray60" . "#999999")
- ("gray61" . "#9C9C9C")
- ("gray62" . "#9E9E9E")
- ("gray63" . "#A1A1A1")
- ("gray64" . "#A3A3A3")
- ("gray65" . "#A6A6A6")
- ("gray66" . "#A8A8A8")
- ("gray67" . "#ABABAB")
- ("gray68" . "#ADADAD")
- ("gray69" . "#B0B0B0")
- ("gray70" . "#B3B3B3")
- ("gray71" . "#B5B5B5")
- ("gray72" . "#B8B8B8")
- ("gray73" . "#BABABA")
- ("gray74" . "#BDBDBD")
- ("gray75" . "#BFBFBF")
- ("gray76" . "#C2C2C2")
- ("gray77" . "#C4C4C4")
- ("gray78" . "#C7C7C7")
- ("gray79" . "#C9C9C9")
- ("gray80" . "#CCCCCC")
- ("gray81" . "#CFCFCF")
- ("gray82" . "#D1D1D1")
- ("gray83" . "#D4D4D4")
- ("gray84" . "#D6D6D6")
- ("gray85" . "#D9D9D9")
- ("gray86" . "#DBDBDB")
- ("gray87" . "#DEDEDE")
- ("gray88" . "#E0E0E0")
- ("gray89" . "#E3E3E3")
- ("gray90" . "#E5E5E5")
- ("gray91" . "#E8E8E8")
- ("gray92" . "#EBEBEB")
- ("gray93" . "#EDEDED")
- ("gray94" . "#F0F0F0")
- ("gray95" . "#F2F2F2")
- ("gray96" . "#F5F5F5")
- ("gray97" . "#F7F7F7")
- ("gray98" . "#FAFAFA")
- ("gray99" . "#FCFCFC")
- ("gray100" . "#FFFFFF")
- ("green" . "#00FF00")
- ("green1" . "#00FF00")
- ("green2" . "#00EE00")
- ("green3" . "#00CD00")
- ("green4" . "#008B00")
- ("greenyellow" . "#ADFF2F")
- ("grey" . "#BEBEBE")
- ("grey0" . "#000000")
- ("grey1" . "#030303")
- ("grey2" . "#050505")
- ("grey3" . "#080808")
- ("grey4" . "#0A0A0A")
- ("grey5" . "#0D0D0D")
- ("grey6" . "#0F0F0F")
- ("grey7" . "#121212")
- ("grey8" . "#141414")
- ("grey9" . "#171717")
- ("grey10" . "#1A1A1A")
- ("grey11" . "#1C1C1C")
- ("grey12" . "#1F1F1F")
- ("grey13" . "#212121")
- ("grey14" . "#242424")
- ("grey15" . "#262626")
- ("grey16" . "#292929")
- ("grey17" . "#2B2B2B")
- ("grey18" . "#2E2E2E")
- ("grey19" . "#303030")
- ("grey20" . "#333333")
- ("grey21" . "#363636")
- ("grey22" . "#383838")
- ("grey23" . "#3B3B3B")
- ("grey24" . "#3D3D3D")
- ("grey25" . "#404040")
- ("grey26" . "#424242")
- ("grey27" . "#454545")
- ("grey28" . "#474747")
- ("grey29" . "#4A4A4A")
- ("grey30" . "#4D4D4D")
- ("grey31" . "#4F4F4F")
- ("grey32" . "#525252")
- ("grey33" . "#545454")
- ("grey34" . "#575757")
- ("grey35" . "#595959")
- ("grey36" . "#5C5C5C")
- ("grey37" . "#5E5E5E")
- ("grey38" . "#616161")
- ("grey39" . "#636363")
- ("grey40" . "#666666")
- ("grey41" . "#696969")
- ("grey42" . "#6B6B6B")
- ("grey43" . "#6E6E6E")
- ("grey44" . "#707070")
- ("grey45" . "#737373")
- ("grey46" . "#757575")
- ("grey47" . "#787878")
- ("grey48" . "#7A7A7A")
- ("grey49" . "#7D7D7D")
- ("grey50" . "#7F7F7F")
- ("grey51" . "#828282")
- ("grey52" . "#858585")
- ("grey53" . "#878787")
- ("grey54" . "#8A8A8A")
- ("grey55" . "#8C8C8C")
- ("grey56" . "#8F8F8F")
- ("grey57" . "#919191")
- ("grey58" . "#949494")
- ("grey59" . "#969696")
- ("grey60" . "#999999")
- ("grey61" . "#9C9C9C")
- ("grey62" . "#9E9E9E")
- ("grey63" . "#A1A1A1")
- ("grey64" . "#A3A3A3")
- ("grey65" . "#A6A6A6")
- ("grey66" . "#A8A8A8")
- ("grey67" . "#ABABAB")
- ("grey68" . "#ADADAD")
- ("grey69" . "#B0B0B0")
- ("grey70" . "#B3B3B3")
- ("grey71" . "#B5B5B5")
- ("grey72" . "#B8B8B8")
- ("grey73" . "#BABABA")
- ("grey74" . "#BDBDBD")
- ("grey75" . "#BFBFBF")
- ("grey76" . "#C2C2C2")
- ("grey77" . "#C4C4C4")
- ("grey78" . "#C7C7C7")
- ("grey79" . "#C9C9C9")
- ("grey80" . "#CCCCCC")
- ("grey81" . "#CFCFCF")
- ("grey82" . "#D1D1D1")
- ("grey83" . "#D4D4D4")
- ("grey84" . "#D6D6D6")
- ("grey85" . "#D9D9D9")
- ("grey86" . "#DBDBDB")
- ("grey87" . "#DEDEDE")
- ("grey88" . "#E0E0E0")
- ("grey89" . "#E3E3E3")
- ("grey90" . "#E5E5E5")
- ("grey91" . "#E8E8E8")
- ("grey92" . "#EBEBEB")
- ("grey93" . "#EDEDED")
- ("grey94" . "#F0F0F0")
- ("grey95" . "#F2F2F2")
- ("grey96" . "#F5F5F5")
- ("grey97" . "#F7F7F7")
- ("grey98" . "#FAFAFA")
- ("grey99" . "#FCFCFC")
- ("grey100" . "#FFFFFF")
- ("honeydew" . "#F0FFF0")
- ("honeydew1" . "#F0FFF0")
- ("honeydew2" . "#E0EEE0")
- ("honeydew3" . "#C1CDC1")
- ("honeydew4" . "#838B83")
- ("hotpink" . "#FF69B4")
- ("hotpink1" . "#FF6EB4")
- ("hotpink2" . "#EE6AA7")
- ("hotpink3" . "#CD6090")
- ("hotpink4" . "#8B3A62")
- ("indianred" . "#CD5C5C")
- ("indianred1" . "#FF6A6A")
- ("indianred2" . "#EE6363")
- ("indianred3" . "#CD5555")
- ("indianred4" . "#8B3A3A")
- ("ivory" . "#FFFFF0")
- ("ivory1" . "#FFFFF0")
- ("ivory2" . "#EEEEE0")
- ("ivory3" . "#CDCDC1")
- ("ivory4" . "#8B8B83")
- ("khaki" . "#F0E68C")
- ("khaki1" . "#FFF68F")
- ("khaki2" . "#EEE685")
- ("khaki3" . "#CDC673")
- ("khaki4" . "#8B864E")
- ("lavender" . "#E6E6FA")
- ("lavenderblush" . "#FFF0F5")
- ("lavenderblush1" . "#FFF0F5")
- ("lavenderblush2" . "#EEE0E5")
- ("lavenderblush3" . "#CDC1C5")
- ("lavenderblush4" . "#8B8386")
- ("lawngreen" . "#7CFC00")
- ("lemonchiffon" . "#FFFACD")
- ("lemonchiffon1" . "#FFFACD")
- ("lemonchiffon2" . "#EEE9BF")
- ("lemonchiffon3" . "#CDC9A5")
- ("lemonchiffon4" . "#8B8970")
- ("lightblue" . "#ADD8E6")
- ("lightblue1" . "#BFEFFF")
- ("lightblue2" . "#B2DFEE")
- ("lightblue3" . "#9AC0CD")
- ("lightblue4" . "#68838B")
- ("lightcoral" . "#F08080")
- ("lightcyan" . "#E0FFFF")
- ("lightcyan1" . "#E0FFFF")
- ("lightcyan2" . "#D1EEEE")
- ("lightcyan3" . "#B4CDCD")
- ("lightcyan4" . "#7A8B8B")
- ("lightgoldenrod" . "#EEDD82")
- ("lightgoldenrod1" . "#FFEC8B")
- ("lightgoldenrod2" . "#EEDC82")
- ("lightgoldenrod3" . "#CDBE70")
- ("lightgoldenrod4" . "#8B814C")
- ("lightgoldenrodyellow" . "#FAFAD2")
- ("lightgray" . "#D3D3D3")
- ("lightgreen" . "#90EE90")
- ("lightgrey" . "#D3D3D3")
- ("lightpink" . "#FFB6C1")
- ("lightpink1" . "#FFAEB9")
- ("lightpink2" . "#EEA2AD")
- ("lightpink3" . "#CD8C95")
- ("lightpink4" . "#8B5F65")
- ("lightsalmon" . "#FFA07A")
- ("lightsalmon1" . "#FFA07A")
- ("lightsalmon2" . "#EE9572")
- ("lightsalmon3" . "#CD8162")
- ("lightsalmon4" . "#8B5742")
- ("lightseagreen" . "#20B2AA")
- ("lightskyblue" . "#87CEFA")
- ("lightskyblue1" . "#B0E2FF")
- ("lightskyblue2" . "#A4D3EE")
- ("lightskyblue3" . "#8DB6CD")
- ("lightskyblue4" . "#607B8B")
- ("lightslateblue" . "#8470FF")
- ("lightslategray" . "#778899")
- ("lightslategrey" . "#778899")
- ("lightsteelblue" . "#B0C4DE")
- ("lightsteelblue1" . "#CAE1FF")
- ("lightsteelblue2" . "#BCD2EE")
- ("lightsteelblue3" . "#A2B5CD")
- ("lightsteelblue4" . "#6E7B8B")
- ("lightyellow" . "#FFFFE0")
- ("lightyellow1" . "#FFFFE0")
- ("lightyellow2" . "#EEEED1")
- ("lightyellow3" . "#CDCDB4")
- ("lightyellow4" . "#8B8B7A")
- ("limegreen" . "#32CD32")
- ("linen" . "#FAF0E6")
- ("magenta" . "#FF00FF")
- ("magenta1" . "#FF00FF")
- ("magenta2" . "#EE00EE")
- ("magenta3" . "#CD00CD")
- ("magenta4" . "#8B008B")
- ("maroon" . "#B03060")
- ("maroon1" . "#FF34B3")
- ("maroon2" . "#EE30A7")
- ("maroon3" . "#CD2990")
- ("maroon4" . "#8B1C62")
- ("mediumaquamarine" . "#66CDAA")
- ("mediumblue" . "#0000CD")
- ("mediumorchid" . "#BA55D3")
- ("mediumorchid1" . "#E066FF")
- ("mediumorchid2" . "#D15FEE")
- ("mediumorchid3" . "#B452CD")
- ("mediumorchid4" . "#7A378B")
- ("mediumpurple" . "#9370DB")
- ("mediumpurple1" . "#AB82FF")
- ("mediumpurple2" . "#9F79EE")
- ("mediumpurple3" . "#8968CD")
- ("mediumpurple4" . "#5D478B")
- ("mediumseagreen" . "#3CB371")
- ("mediumslateblue" . "#7B68EE")
- ("mediumspringgreen" . "#00FA9A")
- ("mediumturquoise" . "#48D1CC")
- ("mediumvioletred" . "#C71585")
- ("midnightblue" . "#191970")
- ("mintcream" . "#F5FFFA")
- ("mistyrose" . "#FFE4E1")
- ("mistyrose1" . "#FFE4E1")
- ("mistyrose2" . "#EED5D2")
- ("mistyrose3" . "#CDB7B5")
- ("mistyrose4" . "#8B7D7B")
- ("moccasin" . "#FFE4B5")
- ("navajowhite" . "#FFDEAD")
- ("navajowhite1" . "#FFDEAD")
- ("navajowhite2" . "#EECFA1")
- ("navajowhite3" . "#CDB38B")
- ("navajowhite4" . "#8B795E")
- ("navy" . "#000080")
- ("navyblue" . "#000080")
- ("oldlace" . "#FDF5E6")
- ("olivedrab" . "#6B8E23")
- ("olivedrab1" . "#C0FF3E")
- ("olivedrab2" . "#B3EE3A")
- ("olivedrab3" . "#9ACD32")
- ("olivedrab4" . "#698B22")
- ("orange" . "#FFA500")
- ("orange1" . "#FFA500")
- ("orange2" . "#EE9A00")
- ("orange3" . "#CD8500")
- ("orange4" . "#8B5A00")
- ("orangered" . "#FF4500")
- ("orangered1" . "#FF4500")
- ("orangered2" . "#EE4000")
- ("orangered3" . "#CD3700")
- ("orangered4" . "#8B2500")
- ("orchid" . "#DA70D6")
- ("orchid1" . "#FF83FA")
- ("orchid2" . "#EE7AE9")
- ("orchid3" . "#CD69C9")
- ("orchid4" . "#8B4789")
- ("palegoldenrod" . "#EEE8AA")
- ("palegreen" . "#98FB98")
- ("palegreen1" . "#9AFF9A")
- ("palegreen2" . "#90EE90")
- ("palegreen3" . "#7CCD7C")
- ("palegreen4" . "#548B54")
- ("paleturquoise" . "#AFEEEE")
- ("paleturquoise1" . "#BBFFFF")
- ("paleturquoise2" . "#AEEEEE")
- ("paleturquoise3" . "#96CDCD")
- ("paleturquoise4" . "#668B8B")
- ("palevioletred" . "#DB7093")
- ("palevioletred1" . "#FF82AB")
- ("palevioletred2" . "#EE799F")
- ("palevioletred3" . "#CD6889")
- ("palevioletred4" . "#8B475D")
- ("papayawhip" . "#FFEFD5")
- ("peachpuff" . "#FFDAB9")
- ("peachpuff1" . "#FFDAB9")
- ("peachpuff2" . "#EECBAD")
- ("peachpuff3" . "#CDAF95")
- ("peachpuff4" . "#8B7765")
- ("peru" . "#CD853F")
- ("pink" . "#FFC0CB")
- ("pink1" . "#FFB5C5")
- ("pink2" . "#EEA9B8")
- ("pink3" . "#CD919E")
- ("pink4" . "#8B636C")
- ("plum" . "#DDA0DD")
- ("plum1" . "#FFBBFF")
- ("plum2" . "#EEAEEE")
- ("plum3" . "#CD96CD")
- ("plum4" . "#8B668B")
- ("powderblue" . "#B0E0E6")
- ("purple" . "#A020F0")
- ("purple1" . "#9B30FF")
- ("purple2" . "#912CEE")
- ("purple3" . "#7D26CD")
- ("purple4" . "#551A8B")
- ("red" . "#FF0000")
- ("red1" . "#FF0000")
- ("red2" . "#EE0000")
- ("red3" . "#CD0000")
- ("red4" . "#8B0000")
- ("rosybrown" . "#BC8F8F")
- ("rosybrown1" . "#FFC1C1")
- ("rosybrown2" . "#EEB4B4")
- ("rosybrown3" . "#CD9B9B")
- ("rosybrown4" . "#8B6969")
- ("royalblue" . "#4169E1")
- ("royalblue1" . "#4876FF")
- ("royalblue2" . "#436EEE")
- ("royalblue3" . "#3A5FCD")
- ("royalblue4" . "#27408B")
- ("saddlebrown" . "#8B4513")
- ("salmon" . "#FA8072")
- ("salmon1" . "#FF8C69")
- ("salmon2" . "#EE8262")
- ("salmon3" . "#CD7054")
- ("salmon4" . "#8B4C39")
- ("sandybrown" . "#F4A460")
- ("seagreen" . "#2E8B57")
- ("seagreen1" . "#54FF9F")
- ("seagreen2" . "#4EEE94")
- ("seagreen3" . "#43CD80")
- ("seagreen4" . "#2E8B57")
- ("seashell" . "#FFF5EE")
- ("seashell1" . "#FFF5EE")
- ("seashell2" . "#EEE5DE")
- ("seashell3" . "#CDC5BF")
- ("seashell4" . "#8B8682")
- ("sienna" . "#A0522D")
- ("sienna1" . "#FF8247")
- ("sienna2" . "#EE7942")
- ("sienna3" . "#CD6839")
- ("sienna4" . "#8B4726")
- ("skyblue" . "#87CEEB")
- ("skyblue1" . "#87CEFF")
- ("skyblue2" . "#7EC0EE")
- ("skyblue3" . "#6CA6CD")
- ("skyblue4" . "#4A708B")
- ("slateblue" . "#6A5ACD")
- ("slateblue1" . "#836FFF")
- ("slateblue2" . "#7A67EE")
- ("slateblue3" . "#6959CD")
- ("slateblue4" . "#473C8B")
- ("slategray" . "#708090")
- ("slategray1" . "#C6E2FF")
- ("slategray2" . "#B9D3EE")
- ("slategray3" . "#9FB6CD")
- ("slategray4" . "#6C7B8B")
- ("slategrey" . "#708090")
- ("snow" . "#FFFAFA")
- ("snow1" . "#FFFAFA")
- ("snow2" . "#EEE9E9")
- ("snow3" . "#CDC9C9")
- ("snow4" . "#8B8989")
- ("springgreen" . "#00FF7F")
- ("springgreen1" . "#00FF7F")
- ("springgreen2" . "#00EE76")
- ("springgreen3" . "#00CD66")
- ("springgreen4" . "#008B45")
- ("steelblue" . "#4682B4")
- ("steelblue1" . "#63B8FF")
- ("steelblue2" . "#5CACEE")
- ("steelblue3" . "#4F94CD")
- ("steelblue4" . "#36648B")
- ("tan" . "#D2B48C")
- ("tan1" . "#FFA54F")
- ("tan2" . "#EE9A49")
- ("tan3" . "#CD853F")
- ("tan4" . "#8B5A2B")
- ("thistle" . "#D8BFD8")
- ("thistle1" . "#FFE1FF")
- ("thistle2" . "#EED2EE")
- ("thistle3" . "#CDB5CD")
- ("thistle4" . "#8B7B8B")
- ("tomato" . "#FF6347")
- ("tomato1" . "#FF6347")
- ("tomato2" . "#EE5C42")
- ("tomato3" . "#CD4F39")
- ("tomato4" . "#8B3626")
- ("turquoise" . "#40E0D0")
- ("turquoise1" . "#00F5FF")
- ("turquoise2" . "#00E5EE")
- ("turquoise3" . "#00C5CD")
- ("turquoise4" . "#00868B")
- ("violet" . "#EE82EE")
- ("violetred" . "#D02090")
- ("violetred1" . "#FF3E96")
- ("violetred2" . "#EE3A8C")
- ("violetred3" . "#CD3278")
- ("violetred4" . "#8B2252")
- ("wheat" . "#F5DEB3")
- ("wheat1" . "#FFE7BA")
- ("wheat2" . "#EED8AE")
- ("wheat3" . "#CDBA96")
- ("wheat4" . "#8B7E66")
- ("whitesmoke" . "#F5F5F5")
- ("yellow" . "#FFFF00")
- ("yellow1" . "#FFFF00")
- ("yellow2" . "#EEEE00")
- ("yellow3" . "#CDCD00")
- ("yellow4" . "#8B8B00")
- ("yellowgreen" . "#9ACD32"))
- "Alist of R colors.
-Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)."
- :type 'alist
- :group 'rainbow)
-
-(defcustom rainbow-r-colors-major-mode-list
- '(ess-mode)
- "List of major mode where R colors are enabled when
-`rainbow-r-colors' is set to auto."
- :type '(repeat (symbol :tag "Major-Mode"))
- :group 'rainbow)
-
-(defcustom rainbow-r-colors 'auto
- "When to enable R colors.
-If set to t, the R colors will be enabled. If set to nil, the
-R colors will not be enabled. If set to auto, the R colors
-will be enabled if a major mode has been detected from the
-`rainbow-r-colors-major-mode-list'."
- :type '(choice (symbol :tag "enable in certain modes" auto)
- (symbol :tag "enable globally" t)
- (symbol :tag "disable" nil))
- :group 'rainbow)
-
-;;; Functions
-
-(defun rainbow-colorize-match (color &optional match)
- "Return a matched string propertized with a face whose
-background is COLOR. The foreground is computed using
-`rainbow-color-luminance', and is either white or black."
- (let ((match (or match 0)))
- (put-text-property
- (match-beginning match) (match-end match)
- 'face `((:foreground ,(if (> 0.5 (rainbow-x-color-luminance color))
- "white" "black"))
- (:background ,color)))))
-
-(defun rainbow-colorize-itself (&optional match)
- "Colorize a match with itself."
- (rainbow-colorize-match (match-string-no-properties (or match 0)) match))
-
-(defun rainbow-colorize-hexadecimal-without-sharp ()
- "Colorize an hexadecimal colors and prepend # to it."
- (rainbow-colorize-match (concat "#" (match-string-no-properties 1))))
-
-(defun rainbow-colorize-by-assoc (assoc-list)
- "Colorize a match with its association from ASSOC-LIST."
- (rainbow-colorize-match (cdr (assoc-string (match-string-no-properties 0)
- assoc-list t))))
-
-(defun rainbow-rgb-relative-to-absolute (number)
- "Convert a relative NUMBER to absolute. If NUMBER is absolute, return NUMBER.
-This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\".
-If the percentage value is above 100, it's converted to 100."
- (let ((string-length (- (length number) 1)))
- ;; Is this a number with %?
- (if (eq (elt number string-length) ?%)
- (/ (* (min (string-to-number (substring number 0 string-length)) 100) 255) 100)
- (string-to-number number))))
-
-(defun rainbow-colorize-hsl ()
- "Colorize a match with itself."
- (let ((h (/ (string-to-number (match-string-no-properties 1)) 360.0))
- (s (/ (string-to-number (match-string-no-properties 2)) 100.0))
- (l (/ (string-to-number (match-string-no-properties 3)) 100.0)))
- (rainbow-colorize-match
- (cl-destructuring-bind (r g b)
- (color-hsl-to-rgb h s l)
- (format "#%02X%02X%02X" (* r 255) (* g 255) (* b 255))))))
-
-(defun rainbow-colorize-rgb ()
- "Colorize a match with itself."
- (let ((r (rainbow-rgb-relative-to-absolute (match-string-no-properties 1)))
- (g (rainbow-rgb-relative-to-absolute (match-string-no-properties 2)))
- (b (rainbow-rgb-relative-to-absolute (match-string-no-properties 3))))
- (rainbow-colorize-match (format "#%02X%02X%02X" r g b))))
-
-(defun rainbow-colorize-rgb-float ()
- "Colorize a match with itself, with relative value."
- (let ((r (* (string-to-number (match-string-no-properties 1)) 255.0))
- (g (* (string-to-number (match-string-no-properties 2)) 255.0))
- (b (* (string-to-number (match-string-no-properties 3)) 255.0)))
- (rainbow-colorize-match (format "#%02X%02X%02X" r g b))))
-
-(defvar ansi-color-context)
-(defvar xterm-color-current)
-
-(defun rainbow-colorize-ansi ()
- "Return a matched string propertized with ansi color face."
- (let ((xterm-color? (featurep 'xterm-color))
- (string (match-string-no-properties 0))
- color)
- (save-match-data
- (let* ((replaced (concat
- (replace-regexp-in-string
- "^\\(\\\\[eE]\\|\\\\033\\|\\\\x1[bB]\\)"
- "\033" string) "x"))
- xterm-color-current
- ansi-color-context
- (applied (funcall (if xterm-color?
- 'xterm-color-filter
- 'ansi-color-apply)
- replaced))
- (face-property (get-text-property
- 0
- (if xterm-color? 'face 'font-lock-face)
- applied)))
- (unless (listp (or (car-safe face-property) face-property))
- (setq face-property (list face-property)))
- (setq color (funcall (if xterm-color? 'cadr 'cdr)
- (or (assq (if xterm-color?
- :foreground
- 'foreground-color)
- face-property)
- (assq (if xterm-color?
- :background
- 'background-color)
- face-property))))))
- (when color
- (rainbow-colorize-match color))))
-
-(defun rainbow-color-luminance (red green blue)
- "Calculate the relative luminance of color composed of RED, GREEN and BLUE.
-Return a value between 0 and 1."
- (/ (+ (* .2126 red) (* .7152 green) (* .0722 blue)) 255))
-
-(defun rainbow-x-color-luminance (color)
- "Calculate the relative luminance of a color string (e.g. \"#ffaa00\", \"blue\").
-Return a value between 0 and 1."
- (let* ((values (x-color-values color))
- (r (/ (car values) 256.0))
- (g (/ (cadr values) 256.0))
- (b (/ (caddr values) 256.0)))
- (rainbow-color-luminance r g b)))
-
-;;; Mode
-
-(defun rainbow-turn-on ()
- "Turn on rainbow-mode."
- (font-lock-add-keywords nil
- rainbow-hexadecimal-colors-font-lock-keywords
- t)
- ;; Activate X colors?
- (when (or (eq rainbow-x-colors t)
- (and (eq rainbow-x-colors 'auto)
- (memq major-mode rainbow-x-colors-major-mode-list)))
- (font-lock-add-keywords nil
- rainbow-x-colors-font-lock-keywords
- t))
- ;; Activate LaTeX colors?
- (when (or (eq rainbow-latex-colors t)
- (and (eq rainbow-latex-colors 'auto)
- (memq major-mode rainbow-latex-colors-major-mode-list)))
- (font-lock-add-keywords nil
- rainbow-latex-rgb-colors-font-lock-keywords
- t))
- ;; Activate ANSI colors?
- (when (or (eq rainbow-ansi-colors t)
- (and (eq rainbow-ansi-colors 'auto)
- (memq major-mode rainbow-ansi-colors-major-mode-list)))
- (font-lock-add-keywords nil
- rainbow-ansi-colors-font-lock-keywords
- t))
- ;; Activate HTML colors?
- (when (or (eq rainbow-html-colors t)
- (and (eq rainbow-html-colors 'auto)
- (memq major-mode rainbow-html-colors-major-mode-list)))
- (setq rainbow-html-colors-font-lock-keywords
- `((,(regexp-opt (mapcar 'car rainbow-html-colors-alist) 'words)
- (0 (rainbow-colorize-by-assoc rainbow-html-colors-alist)))))
- (font-lock-add-keywords nil
- `(,@rainbow-html-colors-font-lock-keywords
- ,@rainbow-html-rgb-colors-font-lock-keywords)
- t))
- ;; Activate R colors?
- (when (or (eq rainbow-r-colors t)
- (and (eq rainbow-r-colors 'auto)
- (memq major-mode rainbow-r-colors-major-mode-list)))
- (setq rainbow-r-colors-font-lock-keywords
- `((,(regexp-opt (mapcar 'car rainbow-r-colors-alist) 'words)
- (0 (rainbow-colorize-by-assoc rainbow-r-colors-alist)))))
- (font-lock-add-keywords nil
- rainbow-r-colors-font-lock-keywords
- t)))
-
-(defun rainbow-turn-off ()
- "Turn off rainbow-mode."
- (font-lock-remove-keywords
- nil
- `(,@rainbow-hexadecimal-colors-font-lock-keywords
- ,@rainbow-x-colors-font-lock-keywords
- ,@rainbow-latex-rgb-colors-font-lock-keywords
- ,@rainbow-r-colors-font-lock-keywords
- ,@rainbow-html-colors-font-lock-keywords
- ,@rainbow-html-rgb-colors-font-lock-keywords)))
-
-(defvar rainbow-keywords-hook nil
- "Hook used to add additional font-lock keywords.
-This hook is called by `rainbow-mode' before it re-enables
-`font-lock-mode'. Hook functions must only add additional
-keywords when `rainbow-mode' is non-nil. When that is nil,
-then they must remove those additional keywords again.")
-
-;;;###autoload
-(define-minor-mode rainbow-mode
- "Colorize strings that represent colors.
-This will fontify with colors the string like \"#aabbcc\" or \"blue\"."
- :lighter " Rbow"
- (if rainbow-mode
- (rainbow-turn-on)
- (rainbow-turn-off))
- ;; We cannot use `rainbow-mode-hook' because this has
- ;; to be done before `font-lock-mode' is re-enabled.
- (run-hooks 'rainbow-keywords-hook)
- ;; Call `font-lock-mode' to refresh the buffer when used
- ;; e.g. interactively.
- (font-lock-mode 1))
-
-;;;; ChangeLog:
-
-;; 2020-07-28 Julien Danjou <julien@danjou.info>
-;;
-;; fix(rainbow_mode): remove spurious + in regex
-;;
-;; Thanks Peder Stray for the report and suggestion.
-;;
-;; 2020-03-30 Julien Danjou <julien@danjou.info>
-;;
-;; fix(rainbow-mode): fix typo in docstring
-;;
-;; Thanks Bauke Jan Douma <bjdouma@xs4all.nl>
-;;
-;; 2019-12-23 Julien Danjou <julien@danjou.info>
-;;
-;; Release rainbow-mode 1.0.3
-;;
-;; * Use cl-lib instead of cl
-;;
-;; As of Emacs 27.1 `cl' is officially deprecated.
-;;
-;; `cl' was only required for `multiple-value-bind' and using that was
-;; conceptually wrong to begin with: `color-hsl-to-rgb' does NOT return
-;; three
-;; values; it returns one value which happens to consist of three
-;; components and
-;; any one of these components by itself is meaningless. Now we use
-;; `cl-destructuring-bind', which does not have the same connotation.
-;;
-;; * rainbow-keywords-hook: New hook run by rainbow-mode
-;;
-;; * rainbow-mode: Remove unnecessary progn
-;; Also improve a contained comment.
-;;
-;; Thanks Jonas Bernoulli <jonas@bernoul.li>
-;;
-;; 2019-11-25 Julien Danjou <julien@danjou.info>
-;;
-;; Release rainbow-mode 1.0.2
-;;
-;; 2019-11-25 Julien Danjou <julien@danjou.info>
-;;
-;; Fix a off-by-one error and some wording in rainbow-mode
-;;
-;; * packages/rainbow-mode/rainbow-mode.el (rainbow-color-luminance): Fix a
-;; off-by-one error and wording.
-;; (rainbow-x-color-luminance): Fix wording.
-;;
-;; Thanks Peder Stray.
-;;
-;; 2018-05-21 Julien Danjou <julien@danjou.info>
-;;
-;; * rainbow-mode/rainbow-mode.el: do not fail if face-property is a symbol
-;;
-;; It turns out there are cases when `face-property' can be just a symbol
-;; and we need to protect our selves from that, i.e. `car' should not fail.
-;; Hence,
-;; `car-safe' is there and if it's `nil', then fall back to `face-property'
-;; as is.
-;;
-;; See https://github.com/tarsius/hl-todo/issues/17
-;;
-;; 2018-03-26 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: release 1.0
-;;
-;; 2018-03-26 Jonas Bernoulli <jonas@bernoul.li>
-;;
-;; Allow outline-minor-mode to find section headings
-;;
-;; 2018-03-26 Jonas Bernoulli <jonas@bernoul.li>
-;;
-;; Set type of customizable options
-;;
-;; 2018-03-26 Jonas Bernoulli <jonas@bernoul.li>
-;;
-;; Enforce use of spaces for indentation
-;;
-;; Also untabify some code added by a contributor who, unlike you, has not
-;; globally set `indent-tabs-mode' to nil.
-;;
-;; 2017-05-29 Julien Danjou <julien@danjou.info>
-;;
-;; Fix `rainbow-color-luminance' docstring
-;;
-;; 2015-10-12 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow: add font-lock at the end
-;;
-;; See https://github.com/fxbois/web-mode/issues/612
-;;
-;; 2015-03-06 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow: fix font-lock-mode refresh
-;;
-;; 2014-10-15 Stefan Monnier <monnier@iro.umontreal.ca>
-;;
-;; * packages/rainbow-mode/rainbow-mode.el (ansi-color-context)
-;; (xterm-color-current): Declare.
-;;
-;; 2014-09-07 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: support float in CSS and limit to 100%
-;;
-;; 2013-08-05 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: 0.9, allow spaces in LaTeX colors
-;;
-;; 2013-05-03 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: add support for R, bump version to 0.8
-;;
-;; Signed-off-by: Julien Danjou <julien@danjou.info>
-;;
-;; 2013-02-26 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: version 0.7
-;;
-;; * rainbow-mode.el: don't activate font-lock-mode
-;;
-;; 2012-12-11 Julien Danjou <julien@danjou.info>
-;;
-;; * rainbow-mode: update to 0.6, add support for ANSI coloring
-;;
-;; 2012-11-26 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: fix some LaTex docstrings
-;;
-;; 2012-11-14 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: version 0.5
-;;
-;; * rainbow-mode.el: fix syntax error on
-;; `rainbow-hexadecimal-colors-font-lock-keywords'.
-;;
-;; 2012-11-09 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode: version 0.4
-;;
-;; * rainbow-mode.el: Use functions from color package to colorize HSL
-;; rather
-;; than our own copy.
-;;
-;; 2012-11-09 Julien Danjou <julien@danjou.info>
-;;
-;; rainbow-mode 0.3
-;;
-;; * rainbow-mode.el: avoid colorizing HTML entities
-;;
-;; 2011-09-23 Julien Danjou <julien@danjou.info>
-;;
-;; Update rainbow-mode to version 0.2
-;;
-;; 2011-07-01 Chong Yidong <cyd@stupidchicken.com>
-;;
-;; Give every package its own directory in packages/ including single-file
-;; packages.
-;;
-
-
-(provide 'rainbow-mode)
-
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-;;; rainbow-mode.el ends here
diff --git a/elpa/s-20180406.808/s-autoloads.el b/elpa/s-20180406.808/s-autoloads.el
deleted file mode 100644
index a232497..0000000
--- a/elpa/s-20180406.808/s-autoloads.el
+++ /dev/null
@@ -1,22 +0,0 @@
-;;; s-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "s" "s.el" (0 0 0 0))
-;;; Generated autoloads from s.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "s" '("s-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; s-autoloads.el ends here
diff --git a/elpa/s-20180406.808/s-pkg.el b/elpa/s-20180406.808/s-pkg.el
deleted file mode 100644
index 42a7b77..0000000
--- a/elpa/s-20180406.808/s-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "s" "20180406.808" "The long lost Emacs string manipulation library." 'nil :commit "43ba8b563bee3426cead0e6d4ddc09398e1a349d" :keywords '("strings") :authors '(("Magnar Sveen" . "magnars@gmail.com")) :maintainer '("Magnar Sveen" . "magnars@gmail.com"))
diff --git a/elpa/s-20180406.808/s.el b/elpa/s-20180406.808/s.el
deleted file mode 100644
index 7970ffd..0000000
--- a/elpa/s-20180406.808/s.el
+++ /dev/null
@@ -1,748 +0,0 @@
-;;; s.el --- The long lost Emacs string manipulation library.
-
-;; Copyright (C) 2012-2015 Magnar Sveen
-
-;; Author: Magnar Sveen <magnars@gmail.com>
-;; Version: 1.12.0
-;; Package-Version: 20180406.808
-;; Package-Commit: 43ba8b563bee3426cead0e6d4ddc09398e1a349d
-;; Keywords: strings
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; The long lost Emacs string manipulation library.
-;;
-;; See documentation on https://github.com/magnars/s.el#functions
-
-;;; Code:
-
-;; Silence byte-compiler
-(defvar ucs-normalize-combining-chars) ; Defined in `ucs-normalize'
-(autoload 'slot-value "eieio")
-
-(defun s-trim-left (s)
- "Remove whitespace at the beginning of S."
- (declare (pure t) (side-effect-free t))
- (save-match-data
- (if (string-match "\\`[ \t\n\r]+" s)
- (replace-match "" t t s)
- s)))
-
-(defun s-trim-right (s)
- "Remove whitespace at the end of S."
- (save-match-data
- (declare (pure t) (side-effect-free t))
- (if (string-match "[ \t\n\r]+\\'" s)
- (replace-match "" t t s)
- s)))
-
-(defun s-trim (s)
- "Remove whitespace at the beginning and end of S."
- (declare (pure t) (side-effect-free t))
- (s-trim-left (s-trim-right s)))
-
-(defun s-collapse-whitespace (s)
- "Convert all adjacent whitespace characters to a single space."
- (declare (pure t) (side-effect-free t))
- (replace-regexp-in-string "[ \t\n\r]+" " " s))
-
-(defun s-split (separator s &optional omit-nulls)
- "Split S into substrings bounded by matches for regexp SEPARATOR.
-If OMIT-NULLS is non-nil, zero-length substrings are omitted.
-
-This is a simple wrapper around the built-in `split-string'."
- (declare (side-effect-free t))
- (save-match-data
- (split-string s separator omit-nulls)))
-
-(defun s-split-up-to (separator s n &optional omit-nulls)
- "Split S up to N times into substrings bounded by matches for regexp SEPARATOR.
-
-If OMIT-NULLS is non-nil, zero-length substrings are omitted.
-
-See also `s-split'."
- (declare (side-effect-free t))
- (save-match-data
- (let ((op 0)
- (r nil))
- (with-temp-buffer
- (insert s)
- (setq op (goto-char (point-min)))
- (while (and (re-search-forward separator nil t)
- (< 0 n))
- (let ((sub (buffer-substring op (match-beginning 0))))
- (unless (and omit-nulls
- (equal sub ""))
- (push sub r)))
- (setq op (goto-char (match-end 0)))
- (setq n (1- n)))
- (let ((sub (buffer-substring op (point-max))))
- (unless (and omit-nulls
- (equal sub ""))
- (push sub r))))
- (nreverse r))))
-
-(defun s-lines (s)
- "Splits S into a list of strings on newline characters."
- (declare (pure t) (side-effect-free t))
- (s-split "\\(\r\n\\|[\n\r]\\)" s))
-
-(defun s-join (separator strings)
- "Join all the strings in STRINGS with SEPARATOR in between."
- (declare (pure t) (side-effect-free t))
- (mapconcat 'identity strings separator))
-
-(defun s-concat (&rest strings)
- "Join all the string arguments into one string."
- (declare (pure t) (side-effect-free t))
- (apply 'concat strings))
-
-(defun s-prepend (prefix s)
- "Concatenate PREFIX and S."
- (declare (pure t) (side-effect-free t))
- (concat prefix s))
-
-(defun s-append (suffix s)
- "Concatenate S and SUFFIX."
- (declare (pure t) (side-effect-free t))
- (concat s suffix))
-
-(defun s-repeat (num s)
- "Make a string of S repeated NUM times."
- (declare (pure t) (side-effect-free t))
- (let (ss)
- (while (> num 0)
- (setq ss (cons s ss))
- (setq num (1- num)))
- (apply 'concat ss)))
-
-(defun s-chop-suffix (suffix s)
- "Remove SUFFIX if it is at end of S."
- (declare (pure t) (side-effect-free t))
- (let ((pos (- (length suffix))))
- (if (and (>= (length s) (length suffix))
- (string= suffix (substring s pos)))
- (substring s 0 pos)
- s)))
-
-(defun s-chop-suffixes (suffixes s)
- "Remove SUFFIXES one by one in order, if they are at the end of S."
- (declare (pure t) (side-effect-free t))
- (while suffixes
- (setq s (s-chop-suffix (car suffixes) s))
- (setq suffixes (cdr suffixes)))
- s)
-
-(defun s-chop-prefix (prefix s)
- "Remove PREFIX if it is at the start of S."
- (declare (pure t) (side-effect-free t))
- (let ((pos (length prefix)))
- (if (and (>= (length s) (length prefix))
- (string= prefix (substring s 0 pos)))
- (substring s pos)
- s)))
-
-(defun s-chop-prefixes (prefixes s)
- "Remove PREFIXES one by one in order, if they are at the start of S."
- (declare (pure t) (side-effect-free t))
- (while prefixes
- (setq s (s-chop-prefix (car prefixes) s))
- (setq prefixes (cdr prefixes)))
- s)
-
-(defun s-shared-start (s1 s2)
- "Returns the longest prefix S1 and S2 have in common."
- (declare (pure t) (side-effect-free t))
- (let ((search-length (min (length s1) (length s2)))
- (i 0))
- (while (and (< i search-length)
- (= (aref s1 i) (aref s2 i)))
- (setq i (1+ i)))
- (substring s1 0 i)))
-
-(defun s-shared-end (s1 s2)
- "Returns the longest suffix S1 and S2 have in common."
- (declare (pure t) (side-effect-free t))
- (let* ((l1 (length s1))
- (l2 (length s2))
- (search-length (min l1 l2))
- (i 0))
- (while (and (< i search-length)
- (= (aref s1 (- l1 i 1)) (aref s2 (- l2 i 1))))
- (setq i (1+ i)))
- ;; If I is 0, then it means that there's no common suffix between
- ;; S1 and S2.
- ;;
- ;; However, since (substring s (- 0)) will return the whole
- ;; string, `s-shared-end' should simply return the empty string
- ;; when I is 0.
- (if (zerop i)
- ""
- (substring s1 (- i)))))
-
-(defun s-chomp (s)
- "Remove one trailing `\\n`, `\\r` or `\\r\\n` from S."
- (declare (pure t) (side-effect-free t))
- (s-chop-suffixes '("\n" "\r") s))
-
-(defun s-truncate (len s &optional ellipsis)
- "If S is longer than LEN, cut it down and add ELLIPSIS to the end.
-
-The resulting string, including ellipsis, will be LEN characters
-long.
-
-When not specified, ELLIPSIS defaults to ‘...’."
- (declare (pure t) (side-effect-free t))
- (unless ellipsis
- (setq ellipsis "..."))
- (if (> (length s) len)
- (format "%s%s" (substring s 0 (- len (length ellipsis))) ellipsis)
- s))
-
-(defun s-word-wrap (len s)
- "If S is longer than LEN, wrap the words with newlines."
- (declare (side-effect-free t))
- (save-match-data
- (with-temp-buffer
- (insert s)
- (let ((fill-column len))
- (fill-region (point-min) (point-max)))
- (buffer-substring (point-min) (point-max)))))
-
-(defun s-center (len s)
- "If S is shorter than LEN, pad it with spaces so it is centered."
- (declare (pure t) (side-effect-free t))
- (let ((extra (max 0 (- len (length s)))))
- (concat
- (make-string (ceiling extra 2) ? )
- s
- (make-string (floor extra 2) ? ))))
-
-(defun s-pad-left (len padding s)
- "If S is shorter than LEN, pad it with PADDING on the left."
- (declare (pure t) (side-effect-free t))
- (let ((extra (max 0 (- len (length s)))))
- (concat (make-string extra (string-to-char padding))
- s)))
-
-(defun s-pad-right (len padding s)
- "If S is shorter than LEN, pad it with PADDING on the right."
- (declare (pure t) (side-effect-free t))
- (let ((extra (max 0 (- len (length s)))))
- (concat s
- (make-string extra (string-to-char padding)))))
-
-(defun s-left (len s)
- "Returns up to the LEN first chars of S."
- (declare (pure t) (side-effect-free t))
- (if (> (length s) len)
- (substring s 0 len)
- s))
-
-(defun s-right (len s)
- "Returns up to the LEN last chars of S."
- (declare (pure t) (side-effect-free t))
- (let ((l (length s)))
- (if (> l len)
- (substring s (- l len) l)
- s)))
-
-(defun s-ends-with? (suffix s &optional ignore-case)
- "Does S end with SUFFIX?
-
-If IGNORE-CASE is non-nil, the comparison is done without paying
-attention to case differences.
-
-Alias: `s-suffix?'"
- (declare (pure t) (side-effect-free t))
- (let ((start-pos (- (length s) (length suffix))))
- (and (>= start-pos 0)
- (eq t (compare-strings suffix nil nil
- s start-pos nil ignore-case)))))
-
-(defun s-starts-with? (prefix s &optional ignore-case)
- "Does S start with PREFIX?
-
-If IGNORE-CASE is non-nil, the comparison is done without paying
-attention to case differences.
-
-Alias: `s-prefix?'. This is a simple wrapper around the built-in
-`string-prefix-p'."
- (declare (pure t) (side-effect-free t))
- (string-prefix-p prefix s ignore-case))
-
-(defun s--truthy? (val)
- (declare (pure t) (side-effect-free t))
- (not (null val)))
-
-(defun s-contains? (needle s &optional ignore-case)
- "Does S contain NEEDLE?
-
-If IGNORE-CASE is non-nil, the comparison is done without paying
-attention to case differences."
- (declare (pure t) (side-effect-free t))
- (let ((case-fold-search ignore-case))
- (s--truthy? (string-match-p (regexp-quote needle) s))))
-
-(defun s-equals? (s1 s2)
- "Is S1 equal to S2?
-
-This is a simple wrapper around the built-in `string-equal'."
- (declare (pure t) (side-effect-free t))
- (string-equal s1 s2))
-
-(defun s-less? (s1 s2)
- "Is S1 less than S2?
-
-This is a simple wrapper around the built-in `string-lessp'."
- (declare (pure t) (side-effect-free t))
- (string-lessp s1 s2))
-
-(defun s-matches? (regexp s &optional start)
- "Does REGEXP match S?
-If START is non-nil the search starts at that index.
-
-This is a simple wrapper around the built-in `string-match-p'."
- (declare (side-effect-free t))
- (s--truthy? (string-match-p regexp s start)))
-
-(defun s-blank? (s)
- "Is S nil or the empty string?"
- (declare (pure t) (side-effect-free t))
- (or (null s) (string= "" s)))
-
-(defun s-blank-str? (s)
- "Is S nil or the empty string or string only contains whitespace?"
- (declare (pure t) (side-effect-free t))
- (or (s-blank? s) (s-blank? (s-trim s))))
-
-(defun s-present? (s)
- "Is S anything but nil or the empty string?"
- (declare (pure t) (side-effect-free t))
- (not (s-blank? s)))
-
-(defun s-presence (s)
- "Return S if it's `s-present?', otherwise return nil."
- (declare (pure t) (side-effect-free t))
- (and (s-present? s) s))
-
-(defun s-lowercase? (s)
- "Are all the letters in S in lower case?"
- (declare (side-effect-free t))
- (let ((case-fold-search nil))
- (not (string-match-p "[[:upper:]]" s))))
-
-(defun s-uppercase? (s)
- "Are all the letters in S in upper case?"
- (declare (side-effect-free t))
- (let ((case-fold-search nil))
- (not (string-match-p "[[:lower:]]" s))))
-
-(defun s-mixedcase? (s)
- "Are there both lower case and upper case letters in S?"
- (let ((case-fold-search nil))
- (s--truthy?
- (and (string-match-p "[[:lower:]]" s)
- (string-match-p "[[:upper:]]" s)))))
-
-(defun s-capitalized? (s)
- "In S, is the first letter upper case, and all other letters lower case?"
- (declare (side-effect-free t))
- (let ((case-fold-search nil))
- (s--truthy?
- (string-match-p "^[[:upper:]][^[:upper:]]*$" s))))
-
-(defun s-numeric? (s)
- "Is S a number?"
- (declare (pure t) (side-effect-free t))
- (s--truthy?
- (string-match-p "^[0-9]+$" s)))
-
-(defun s-replace (old new s)
- "Replaces OLD with NEW in S."
- (declare (pure t) (side-effect-free t))
- (replace-regexp-in-string (regexp-quote old) new s t t))
-
-(defalias 's-replace-regexp 'replace-regexp-in-string)
-
-(defun s--aget (alist key)
- (declare (pure t) (side-effect-free t))
- (cdr (assoc-string key alist)))
-
-(defun s-replace-all (replacements s)
- "REPLACEMENTS is a list of cons-cells. Each `car` is replaced with `cdr` in S."
- (declare (pure t) (side-effect-free t))
- (replace-regexp-in-string (regexp-opt (mapcar 'car replacements))
- (lambda (it) (s--aget replacements it))
- s t t))
-
-(defun s-downcase (s)
- "Convert S to lower case.
-
-This is a simple wrapper around the built-in `downcase'."
- (declare (side-effect-free t))
- (downcase s))
-
-(defun s-upcase (s)
- "Convert S to upper case.
-
-This is a simple wrapper around the built-in `upcase'."
- (declare (side-effect-free t))
- (upcase s))
-
-(defun s-capitalize (s)
- "Convert the first word's first character to upper case and the rest to lower case in S."
- (declare (side-effect-free t))
- (concat (upcase (substring s 0 1)) (downcase (substring s 1))))
-
-(defun s-titleize (s)
- "Convert each word's first character to upper case and the rest to lower case in S.
-
-This is a simple wrapper around the built-in `capitalize'."
- (declare (side-effect-free t))
- (capitalize s))
-
-(defmacro s-with (s form &rest more)
- "Threads S through the forms. Inserts S as the last item
-in the first form, making a list of it if it is not a list
-already. If there are more forms, inserts the first form as the
-last item in second form, etc."
- (declare (debug (form &rest [&or (function &rest form) fboundp])))
- (if (null more)
- (if (listp form)
- `(,(car form) ,@(cdr form) ,s)
- (list form s))
- `(s-with (s-with ,s ,form) ,@more)))
-
-(put 's-with 'lisp-indent-function 1)
-
-(defun s-index-of (needle s &optional ignore-case)
- "Returns first index of NEEDLE in S, or nil.
-
-If IGNORE-CASE is non-nil, the comparison is done without paying
-attention to case differences."
- (declare (pure t) (side-effect-free t))
- (let ((case-fold-search ignore-case))
- (string-match-p (regexp-quote needle) s)))
-
-(defun s-reverse (s)
- "Return the reverse of S."
- (declare (pure t) (side-effect-free t))
- (save-match-data
- (if (multibyte-string-p s)
- (let ((input (string-to-list s))
- output)
- (require 'ucs-normalize)
- (while input
- ;; Handle entire grapheme cluster as a single unit
- (let ((grapheme (list (pop input))))
- (while (memql (car input) ucs-normalize-combining-chars)
- (push (pop input) grapheme))
- (setq output (nconc (nreverse grapheme) output))))
- (concat output))
- (concat (nreverse (string-to-list s))))))
-
-(defun s-match-strings-all (regex string)
- "Return a list of matches for REGEX in STRING.
-
-Each element itself is a list of matches, as per
-`match-string'. Multiple matches at the same position will be
-ignored after the first."
- (declare (side-effect-free t))
- (save-match-data
- (let ((all-strings ())
- (i 0))
- (while (and (< i (length string))
- (string-match regex string i))
- (setq i (1+ (match-beginning 0)))
- (let (strings
- (num-matches (/ (length (match-data)) 2))
- (match 0))
- (while (/= match num-matches)
- (push (match-string match string) strings)
- (setq match (1+ match)))
- (push (nreverse strings) all-strings)))
- (nreverse all-strings))))
-
-(defun s-matched-positions-all (regexp string &optional subexp-depth)
- "Return a list of matched positions for REGEXP in STRING.
-SUBEXP-DEPTH is 0 by default."
- (declare (side-effect-free t))
- (if (null subexp-depth)
- (setq subexp-depth 0))
- (save-match-data
- (let ((pos 0) result)
- (while (and (string-match regexp string pos)
- (< pos (length string)))
- (let ((m (match-end subexp-depth)))
- (push (cons (match-beginning subexp-depth) (match-end subexp-depth)) result)
- (setq pos (match-end 0))))
- (nreverse result))))
-
-(defun s-match (regexp s &optional start)
- "When the given expression matches the string, this function returns a list
-of the whole matching string and a string for each matched subexpressions.
-If it did not match the returned value is an empty list (nil).
-
-When START is non-nil the search will start at that index."
- (declare (side-effect-free t))
- (save-match-data
- (if (string-match regexp s start)
- (let ((match-data-list (match-data))
- result)
- (while match-data-list
- (let* ((beg (car match-data-list))
- (end (cadr match-data-list))
- (subs (if (and beg end) (substring s beg end) nil)))
- (setq result (cons subs result))
- (setq match-data-list
- (cddr match-data-list))))
- (nreverse result)))))
-
-(defun s-slice-at (regexp s)
- "Slices S up at every index matching REGEXP."
- (declare (side-effect-free t))
- (if (= 0 (length s)) (list "")
- (save-match-data
- (let (i)
- (setq i (string-match regexp s 1))
- (if i
- (cons (substring s 0 i)
- (s-slice-at regexp (substring s i)))
- (list s))))))
-
-(defun s-split-words (s)
- "Split S into list of words."
- (declare (side-effect-free t))
- (s-split
- "[^[:word:]0-9]+"
- (let ((case-fold-search nil))
- (replace-regexp-in-string
- "\\([[:lower:]]\\)\\([[:upper:]]\\)" "\\1 \\2"
- (replace-regexp-in-string "\\([[:upper:]]\\)\\([[:upper:]][0-9[:lower:]]\\)" "\\1 \\2" s)))
- t))
-
-(defun s--mapcar-head (fn-head fn-rest list)
- "Like MAPCAR, but applies a different function to the first element."
- (if list
- (cons (funcall fn-head (car list)) (mapcar fn-rest (cdr list)))))
-
-(defun s-lower-camel-case (s)
- "Convert S to lowerCamelCase."
- (declare (side-effect-free t))
- (s-join "" (s--mapcar-head 'downcase 'capitalize (s-split-words s))))
-
-(defun s-upper-camel-case (s)
- "Convert S to UpperCamelCase."
- (declare (side-effect-free t))
- (s-join "" (mapcar 'capitalize (s-split-words s))))
-
-(defun s-snake-case (s)
- "Convert S to snake_case."
- (declare (side-effect-free t))
- (s-join "_" (mapcar 'downcase (s-split-words s))))
-
-(defun s-dashed-words (s)
- "Convert S to dashed-words."
- (declare (side-effect-free t))
- (s-join "-" (mapcar 'downcase (s-split-words s))))
-
-(defun s-capitalized-words (s)
- "Convert S to Capitalized words."
- (declare (side-effect-free t))
- (let ((words (s-split-words s)))
- (s-join " " (cons (capitalize (car words)) (mapcar 'downcase (cdr words))))))
-
-(defun s-titleized-words (s)
- "Convert S to Titleized Words."
- (declare (side-effect-free t))
- (s-join " " (mapcar 's-titleize (s-split-words s))))
-
-(defun s-word-initials (s)
- "Convert S to its initials."
- (declare (side-effect-free t))
- (s-join "" (mapcar (lambda (ss) (substring ss 0 1))
- (s-split-words s))))
-
-;; Errors for s-format
-(progn
- (put 's-format-resolve
- 'error-conditions
- '(error s-format s-format-resolve))
- (put 's-format-resolve
- 'error-message
- "Cannot resolve a template to values"))
-
-(defun s-format (template replacer &optional extra)
- "Format TEMPLATE with the function REPLACER.
-
-REPLACER takes an argument of the format variable and optionally
-an extra argument which is the EXTRA value from the call to
-`s-format'.
-
-Several standard `s-format' helper functions are recognized and
-adapted for this:
-
- (s-format \"${name}\" 'gethash hash-table)
- (s-format \"${name}\" 'aget alist)
- (s-format \"$0\" 'elt sequence)
-
-The REPLACER function may be used to do any other kind of
-transformation."
- (let ((saved-match-data (match-data)))
- (unwind-protect
- (replace-regexp-in-string
- "\\$\\({\\([^}]+\\)}\\|[0-9]+\\)"
- (lambda (md)
- (let ((var
- (let ((m (match-string 2 md)))
- (if m m
- (string-to-number (match-string 1 md)))))
- (replacer-match-data (match-data)))
- (unwind-protect
- (let ((v
- (cond
- ((eq replacer 'gethash)
- (funcall replacer var extra))
- ((eq replacer 'aget)
- (funcall 's--aget extra var))
- ((eq replacer 'elt)
- (funcall replacer extra var))
- ((eq replacer 'oref)
- (funcall #'slot-value extra (intern var)))
- (t
- (set-match-data saved-match-data)
- (if extra
- (funcall replacer var extra)
- (funcall replacer var))))))
- (if v (format "%s" v) (signal 's-format-resolve md)))
- (set-match-data replacer-match-data)))) template
- ;; Need literal to make sure it works
- t t)
- (set-match-data saved-match-data))))
-
-(defvar s-lex-value-as-lisp nil
- "If `t' interpolate lisp values as lisp.
-
-`s-lex-format' inserts values with (format \"%S\").")
-
-(defun s-lex-fmt|expand (fmt)
- "Expand FMT into lisp."
- (declare (side-effect-free t))
- (list 's-format fmt (quote 'aget)
- (append '(list)
- (mapcar
- (lambda (matches)
- (list
- 'cons
- (cadr matches)
- `(format
- (if s-lex-value-as-lisp "%S" "%s")
- ,(intern (cadr matches)))))
- (s-match-strings-all "${\\([^}]+\\)}" fmt)))))
-
-(defmacro s-lex-format (format-str)
- "`s-format` with the current environment.
-
-FORMAT-STR may use the `s-format' variable reference to refer to
-any variable:
-
- (let ((x 1))
- (s-lex-format \"x is: ${x}\"))
-
-The values of the variables are interpolated with \"%s\" unless
-the variable `s-lex-value-as-lisp' is `t' and then they are
-interpolated with \"%S\"."
- (declare (debug (form)))
- (s-lex-fmt|expand format-str))
-
-(defun s-count-matches (regexp s &optional start end)
- "Count occurrences of `regexp' in `s'.
-
-`start', inclusive, and `end', exclusive, delimit the part of `s' to
-match. `start' and `end' are both indexed starting at 1; the initial
-character in `s' is index 1.
-
-This function starts looking for the next match from the end of the
-previous match. Hence, it ignores matches that overlap a previously
-found match. To count overlapping matches, use
-`s-count-matches-all'."
- (declare (side-effect-free t))
- (save-match-data
- (with-temp-buffer
- (insert s)
- (goto-char (point-min))
- (count-matches regexp (or start 1) (or end (point-max))))))
-
-(defun s-count-matches-all (regexp s &optional start end)
- "Count occurrences of `regexp' in `s'.
-
-`start', inclusive, and `end', exclusive, delimit the part of `s' to
-match. `start' and `end' are both indexed starting at 1; the initial
-character in `s' is index 1.
-
-This function starts looking for the next match from the second
-character of the previous match. Hence, it counts matches that
-overlap a previously found match. To ignore matches that overlap a
-previously found match, use `s-count-matches'."
- (declare (side-effect-free t))
- (let* ((anchored-regexp (format "^%s" regexp))
- (match-count 0)
- (i 0)
- (narrowed-s (substring s
- (when start (1- start))
- (when end (1- end)))))
- (save-match-data
- (while (< i (length narrowed-s))
- (when (s-matches? anchored-regexp (substring narrowed-s i))
- (setq match-count (1+ match-count)))
- (setq i (1+ i))))
- match-count))
-
-(defun s-wrap (s prefix &optional suffix)
- "Wrap string S with PREFIX and optionally SUFFIX.
-
-Return string S with PREFIX prepended. If SUFFIX is present, it
-is appended, otherwise PREFIX is used as both prefix and
-suffix."
- (declare (pure t) (side-effect-free t))
- (concat prefix s (or suffix prefix)))
-
-
-;;; Aliases
-
-(defalias 's-blank-p 's-blank?)
-(defalias 's-blank-str-p 's-blank-str?)
-(defalias 's-capitalized-p 's-capitalized?)
-(defalias 's-contains-p 's-contains?)
-(defalias 's-ends-with-p 's-ends-with?)
-(defalias 's-equals-p 's-equals?)
-(defalias 's-less-p 's-less?)
-(defalias 's-lowercase-p 's-lowercase?)
-(defalias 's-matches-p 's-matches?)
-(defalias 's-mixedcase-p 's-mixedcase?)
-(defalias 's-numeric-p 's-numeric?)
-(defalias 's-prefix-p 's-starts-with?)
-(defalias 's-prefix? 's-starts-with?)
-(defalias 's-present-p 's-present?)
-(defalias 's-starts-with-p 's-starts-with?)
-(defalias 's-suffix-p 's-ends-with?)
-(defalias 's-suffix? 's-ends-with?)
-(defalias 's-uppercase-p 's-uppercase?)
-
-
-(provide 's)
-;;; s.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-autoloads.el b/elpa/smartparens-20200324.2147/smartparens-autoloads.el
deleted file mode 100644
index f433e33..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-autoloads.el
+++ /dev/null
@@ -1,330 +0,0 @@
-;;; smartparens-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "smartparens" "smartparens.el" (0 0 0 0))
-;;; Generated autoloads from smartparens.el
-
-(autoload 'sp-cheat-sheet "smartparens" "\
-Generate a cheat sheet of all the smartparens interactive functions.
-
-Without a prefix argument, print only the short documentation and examples.
-
-With non-nil prefix argument ARG, show the full documentation for each function.
-
-You can follow the links to the function or variable help page.
-To get back to the full list, use \\[help-go-back].
-
-You can use `beginning-of-defun' and `end-of-defun' to jump to
-the previous/next entry.
-
-Examples are fontified using the `font-lock-string-face' for
-better orientation.
-
-\(fn &optional ARG)" t nil)
-
-(defvar smartparens-mode-map (make-sparse-keymap) "\
-Keymap used for `smartparens-mode'.")
-
-(autoload 'sp-use-paredit-bindings "smartparens" "\
-Initiate `smartparens-mode-map' with `sp-paredit-bindings'.
-
-\(fn)" t nil)
-
-(autoload 'sp-use-smartparens-bindings "smartparens" "\
-Initiate `smartparens-mode-map' with `sp-smartparens-bindings'.
-
-\(fn)" t nil)
-
-(autoload 'smartparens-mode "smartparens" "\
-Toggle smartparens mode.
-
-You can enable pre-set bindings by customizing
-`sp-base-key-bindings' variable. The current content of
-`smartparens-mode-map' is:
-
- \\{smartparens-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'smartparens-strict-mode "smartparens" "\
-Toggle the strict smartparens mode.
-
-When strict mode is active, `delete-char', `kill-word' and their
-backward variants will skip over the pair delimiters in order to
-keep the structure always valid (the same way as `paredit-mode'
-does). This is accomplished by remapping them to
-`sp-delete-char' and `sp-kill-word'. There is also function
-`sp-kill-symbol' that deletes symbols instead of words, otherwise
-working exactly the same (it is not bound to any key by default).
-
-When strict mode is active, this is indicated with \"/s\"
-after the smartparens indicator in the mode list.
-
-\(fn &optional ARG)" t nil)
-
-(defvar smartparens-global-strict-mode nil "\
-Non-nil if Smartparens-Global-Strict mode is enabled.
-See the `smartparens-global-strict-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `smartparens-global-strict-mode'.")
-
-(custom-autoload 'smartparens-global-strict-mode "smartparens" nil)
-
-(autoload 'smartparens-global-strict-mode "smartparens" "\
-Toggle Smartparens-Strict mode in all buffers.
-With prefix ARG, enable Smartparens-Global-Strict mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Smartparens-Strict mode is enabled in all buffers where
-`turn-on-smartparens-strict-mode' would do it.
-See `smartparens-strict-mode' for more information on Smartparens-Strict mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'turn-on-smartparens-strict-mode "smartparens" "\
-Turn on `smartparens-strict-mode'.
-
-\(fn)" t nil)
-
-(autoload 'turn-off-smartparens-strict-mode "smartparens" "\
-Turn off `smartparens-strict-mode'.
-
-\(fn)" t nil)
-
-(defvar smartparens-global-mode nil "\
-Non-nil if Smartparens-Global mode is enabled.
-See the `smartparens-global-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `smartparens-global-mode'.")
-
-(custom-autoload 'smartparens-global-mode "smartparens" nil)
-
-(autoload 'smartparens-global-mode "smartparens" "\
-Toggle Smartparens mode in all buffers.
-With prefix ARG, enable Smartparens-Global mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Smartparens mode is enabled in all buffers where
-`turn-on-smartparens-mode' would do it.
-See `smartparens-mode' for more information on Smartparens mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'turn-on-smartparens-mode "smartparens" "\
-Turn on `smartparens-mode'.
-
-This function is used to turn on `smartparens-global-mode'.
-
-By default `smartparens-global-mode' ignores buffers with
-`mode-class' set to special, but only if they are also not comint
-buffers.
-
-Additionally, buffers on `sp-ignore-modes-list' are ignored.
-
-You can still turn on smartparens in these mode manually (or
-in mode's startup-hook etc.) by calling `smartparens-mode'.
-
-\(fn)" t nil)
-
-(autoload 'turn-off-smartparens-mode "smartparens" "\
-Turn off `smartparens-mode'.
-
-\(fn)" t nil)
-
-(autoload 'show-smartparens-mode "smartparens" "\
-Toggle visualization of matching pairs. When enabled, any
-matching pair is highlighted after `sp-show-pair-delay' seconds
-of Emacs idle time if the point is immediately in front or after
-a pair. This mode works similarly to `show-paren-mode', but
-support custom pairs.
-
-\(fn &optional ARG)" t nil)
-
-(defvar show-smartparens-global-mode nil "\
-Non-nil if Show-Smartparens-Global mode is enabled.
-See the `show-smartparens-global-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `show-smartparens-global-mode'.")
-
-(custom-autoload 'show-smartparens-global-mode "smartparens" nil)
-
-(autoload 'show-smartparens-global-mode "smartparens" "\
-Toggle Show-Smartparens mode in all buffers.
-With prefix ARG, enable Show-Smartparens-Global mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Show-Smartparens mode is enabled in all buffers where
-`turn-on-show-smartparens-mode' would do it.
-See `show-smartparens-mode' for more information on Show-Smartparens mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'turn-on-show-smartparens-mode "smartparens" "\
-Turn on `show-smartparens-mode'.
-
-\(fn)" t nil)
-
-(autoload 'turn-off-show-smartparens-mode "smartparens" "\
-Turn off `show-smartparens-mode'.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens" '("smartparens-" "sp-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-clojure" "smartparens-clojure.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-clojure.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-clojure" '("sp-clojure-prefix")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-config" "smartparens-config.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-config.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-config" '("sp-lisp-invalid-hyperlink-p")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-crystal" "smartparens-crystal.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-crystal.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-crystal" '("sp-crystal-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-elixir" "smartparens-elixir.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-elixir.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-elixir" '("sp-elixir-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-ess" "smartparens-ess.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from smartparens-ess.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-ess" '("sp-ess-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-haskell" "smartparens-haskell.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-haskell.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-haskell" '("sp-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-html" "smartparens-html.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from smartparens-html.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-html" '("sp-html-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-latex" "smartparens-latex.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-latex.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-latex" '("sp-latex-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-lua" "smartparens-lua.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from smartparens-lua.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-lua" '("sp-lua-post-keyword-insert")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-markdown" "smartparens-markdown.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-markdown.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-markdown" '("sp-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-org" "smartparens-org.el" (0 0
-;;;;;; 0 0))
-;;; Generated autoloads from smartparens-org.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-org" '("sp-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-python" "smartparens-python.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-python.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-python" '("sp-python-fix-tripple-quotes")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-ruby" "smartparens-ruby.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from smartparens-ruby.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-ruby" '("sp-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-rust" "smartparens-rust.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from smartparens-rust.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-rust" '("sp-")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-scala" "smartparens-scala.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from smartparens-scala.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-scala" '("sp-scala-wrap-with-indented-newlines")))
-
-;;;***
-
-;;;### (autoloads nil "smartparens-text" "smartparens-text.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from smartparens-text.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smartparens-text" '("sp-text-mode-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("smartparens-c.el" "smartparens-javascript.el"
-;;;;;; "smartparens-ml.el" "smartparens-pkg.el" "smartparens-racket.el"
-;;;;;; "smartparens-rst.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; smartparens-autoloads.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-c.el b/elpa/smartparens-20200324.2147/smartparens-c.el
deleted file mode 100644
index 58216a8..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-c.el
+++ /dev/null
@@ -1,52 +0,0 @@
-;;; smartparens-c.el --- Additional configuration for C/C++ mode. -*- lexical-binding: t; -*-
-;;
-;; Author: Naoya Yamashita <conao3@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 23 June 2019
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-;;
-;; This file is not part of GNU Emacs.
-;;
-;;; License:
-;;
-;; This file is part of Smartparens.
-;;
-;; Smartparens 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.
-;;
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-;;
-;;; Commentary:
-;;
-;; This file provides some additional configuration for C/C++ mode.
-;; To use it, simply add:
-;;
-;; (require 'smartparens-c)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;;; Code:
-
-(require 'smartparens)
-
-;; remap electric delete functions to smartparens function
-(define-key smartparens-strict-mode-map [remap c-electric-delete-forward] 'sp-delete-char)
-(define-key smartparens-strict-mode-map [remap c-electric-backspace] 'sp-backward-delete-char)
-
-(sp-with-modes sp-c-modes
- (sp-local-pair "{" nil :post-handlers '(("||\n[i]" "RET")))
- (sp-local-pair "/*" "*/" :post-handlers '((" | " "SPC")
- ("* ||\n[i]" "RET"))))
-
-(provide 'smartparens-c)
-;;; smartparens-c.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-clojure.el b/elpa/smartparens-20200324.2147/smartparens-clojure.el
deleted file mode 100644
index e07e650..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-clojure.el
+++ /dev/null
@@ -1,56 +0,0 @@
-;;; smartparens-clojure.el --- Additional configuration for Clojure mode. -*- lexical-binding: t; -*-
-;;
-;; Author: Vitalie Spinu <spinuvit@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 14 July 2016
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-;;
-;; This file is not part of GNU Emacs.
-;;
-;;; License:
-;;
-;; This file is part of Smartparens.
-;;
-;; Smartparens 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.
-;;
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-;;
-;;; Commentary:
-;;
-;; This file provides some additional configuration for Clojure mode. To use
-;; it, simply add:
-;;
-;; (require 'smartparens-clojure)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;;; Code:
-
-(require 'smartparens)
-
-(defvar sp-clojure-prefix "\\(?:[@`'#~,_?^]+\\)"
- "Prefix used in `sp-sexp-prefix' for clojure modes.")
-
-(dolist (mode '(clojure-mode clojurescript-mode clojurec-mode cider-repl-mode))
- (add-to-list 'sp-sexp-prefix `(,mode regexp ,sp-clojure-prefix)))
-
-;; Match "`" with "`" in strings and comments
-(sp-with-modes sp-clojure-modes
- (sp-local-pair "`" "`"
- :when '(sp-in-string-p
- sp-in-comment-p)
- :unless '(sp-lisp-invalid-hyperlink-p)))
-
-(provide 'smartparens-clojure)
-;;; smartparens-clojure.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-config.el b/elpa/smartparens-20200324.2147/smartparens-config.el
deleted file mode 100644
index 6e17e4b..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-config.el
+++ /dev/null
@@ -1,134 +0,0 @@
-;;; smartparens-config.el --- Default configuration for smartparens package -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2016 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 30 Jan 2013
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This is a default configuration for smartparens package. If you
-;; wish to set up everything by yourself, you can instead require
-;; smartparens directly.
-
-;; However, some configuration is always loaded by default, most
-;; notably the built-in list of supported pairs. If you want to erase
-;; this list, simply use (setq sp-pairs nil) and then add your own
-;; pairs.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(defun sp-lisp-invalid-hyperlink-p (_id action _context)
- "Test if there is an invalid hyperlink in a Lisp docstring.
-ID, ACTION, CONTEXT."
- (when (eq action 'navigate)
- ;; Ignore errors due to us being at the start or end of the
- ;; buffer.
- (ignore-errors
- (or
- ;; foo'|bar
- (and (looking-at "\\sw\\|\\s_")
- ;; do not consider punctuation
- (not (looking-at "[?.,;!]"))
- (save-excursion
- (backward-char 2)
- (looking-at "\\sw\\|\\s_")))
- ;; foo|'bar
- (and (save-excursion
- (backward-char 1)
- (looking-at "\\sw\\|\\s_"))
- (save-excursion
- (forward-char 1)
- (looking-at "\\sw\\|\\s_")
- ;; do not consider punctuation
- (not (looking-at "[?.,;!]"))))))))
-
-;; emacs is lisp hacking enviroment, so we set up some most common
-;; lisp modes too
-(sp-with-modes sp-lisp-modes
- ;; disable ', it's the quote character!
- (sp-local-pair "'" nil :actions nil))
-
-(sp-with-modes (-difference sp-lisp-modes sp-clojure-modes)
- ;; also only use the pseudo-quote inside strings where it serve as
- ;; hyperlink.
- (sp-local-pair "`" "'"
- :when '(sp-in-string-p
- sp-in-comment-p)
- :unless '(sp-lisp-invalid-hyperlink-p)
- :skip-match (lambda (ms _mb _me)
- (cond
- ((equal ms "'")
- (or (sp-lisp-invalid-hyperlink-p "`" 'navigate '_)
- (not (sp-point-in-string-or-comment))))
- (t (not (sp-point-in-string-or-comment)))))))
-
-;; TODO: this should only be active in docstring, otherwise we want
-;; the regexp completion \\{\\}. To handle this feature, we must
-;; allow multiple pairs on same opening (therefore, the unique ID must
-;; become the opening and closing pair)
-(sp-local-pair 'emacs-lisp-mode "\\\\{" "}" :when '(sp-in-docstring-p))
-
-;; NOTE: Normally, `sp-local-pair' accepts list of modes (or a single
-;; mode) as a first argument. The macro `sp-with-modes' adds this
-;; automatically. If you want to call sp-local-pair outside this
-;; macro, you MUST supply the major mode argument.
-
-(eval-after-load 'cc-mode '(require 'smartparens-c))
-(eval-after-load 'clojure-mode '(require 'smartparens-clojure))
-(eval-after-load 'crystal-mode '(require 'smartparens-crystal))
-(eval-after-load 'elixir-mode '(require 'smartparens-elixir))
-(eval-after-load 'enh-ruby-mode '(require 'smartparens-ruby))
-(eval-after-load 'ess '(require 'smartparens-ess))
-(eval-after-load 'haskell-interactive-mode '(require 'smartparens-haskell))
-(eval-after-load 'haskell-mode '(require 'smartparens-haskell))
-(--each sp--html-modes
- (eval-after-load it '(require 'smartparens-html)))
-(eval-after-load 'latex '(require 'smartparens-latex))
-(eval-after-load 'lua-mode '(require 'smartparens-lua))
-(eval-after-load 'markdown-mode '(require 'smartparens-markdown))
-(--each '(python-mode python)
- (eval-after-load it '(require 'smartparens-python)))
-(eval-after-load 'org '(require 'smartparens-org))
-(eval-after-load 'racket-mode '(require 'smartparens-racket))
-(eval-after-load 'rst '(require 'smartparens-rst))
-(eval-after-load 'ruby-mode '(require 'smartparens-ruby))
-(eval-after-load 'rust-mode '(require 'smartparens-rust))
-(eval-after-load 'rustic '(require 'smartparens-rust))
-(eval-after-load 'scala-mode '(require 'smartparens-scala))
-(eval-after-load 'tex-mode '(require 'smartparens-latex))
-(eval-after-load 'text-mode '(require 'smartparens-text))
-(eval-after-load 'tuareg '(require 'smartparens-ml))
-(eval-after-load 'fsharp-mode '(require 'smartparens-ml))
-(--each '(js js2-mode)
- (eval-after-load it '(require 'smartparens-javascript)))
-(provide 'smartparens-config)
-
-;;; smartparens-config.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-crystal.el b/elpa/smartparens-20200324.2147/smartparens-crystal.el
deleted file mode 100644
index 574ac8e..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-crystal.el
+++ /dev/null
@@ -1,261 +0,0 @@
-;;; smartparens-crystal.el --- Additional configuration for Crystal based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2018 Brantou
-
-;; Author: Brantou <brantou89@gmail.com>
-;; Maintainer: Brantou <brantou89@gmail.com>
-;; Created: 5 March 2018
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; Based on smartparens-ruby.el
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Crystal based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-crystal)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-(require 'smartparens-ruby)
-
-(declare-function crystal-forward-sexp "crystal")
-(declare-function crystal-backward-sexp "crystal")
-
-(defun sp-crystal-forward-sexp ()
- "Wrapper for `crystal-forward-sexp'."
- (interactive)
- (crystal-forward-sexp))
-
-(defun sp-crystal-backward-sexp ()
- "Wrapper for `crystal-backward-sexp'."
- (interactive)
- (crystal-backward-sexp))
-
-(defun sp-crystal-inline-p (id)
- "Test if ID is inline."
- (save-excursion
- (when (looking-back id nil)
- (backward-word))
- (when (not (or (looking-back "^[[:blank:]]*" nil)
- (looking-back "= *" nil)))
- (or (save-excursion
- (forward-symbol -1)
- (forward-symbol 1)
- (looking-at-p (concat " *" id)))
- (save-excursion
- ;; This does not seem to make emacs snapshot happy
- (ignore-errors
- (sp-crystal-backward-sexp)
- (sp-crystal-forward-sexp)
- (looking-at-p (concat "[^[:blank:]]* *" id))))))))
-
-(defun sp-crystal-skip-inline-match-p (ms _mb _me)
- "If non-nil, skip inline match.
-MS, MB, ME."
- (or (sp-ruby-method-p ms)
- (sp-crystal-inline-p ms)))
-
-(defun sp-crystal-in-string-word-or-inline-p (id action context)
- "Test if point is inside string, word or inline.
-ID, ACTION, CONTEXT."
- (or (sp-ruby-in-string-or-word-p id action context)
- (and (looking-back id nil)
- (sp-crystal-inline-p id))))
-
-(add-to-list 'sp-navigate-skip-match
- '((crystal-mode) . sp--ruby-skip-match))
-
-(dolist (mode '(crystal-mode))
- (add-to-list 'sp-sexp-suffix `(,mode syntax "")))
-
-(sp-with-modes 'crystal-mode
- (sp-local-pair "do" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-block-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "{" "}"
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-post-handler)
- :suffix "")
-
- (sp-local-pair "begin" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-block-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "def" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "class" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "struct" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "lib" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "fun" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "enum" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "union" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "module" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "macro" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "case" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "if" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-crystal-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-crystal-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "unless" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-crystal-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-crystal-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "while" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-crystal-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-crystal-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "until" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-crystal-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-crystal-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "|" "|"
- :when '(sp-ruby-should-insert-pipe-close)
- :pre-handlers '(sp-ruby-pre-pipe-handler)
- :suffix ""))
-
-(provide 'smartparens-crystal)
-
-;;; smartparens-crystal.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-elixir.el b/elpa/smartparens-20200324.2147/smartparens-elixir.el
deleted file mode 100644
index 8411162..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-elixir.el
+++ /dev/null
@@ -1,135 +0,0 @@
-;;; smartparens-elixir.el --- Configuration for Elixir. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Matúš Goljer
-
-;; Author: Matúš Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
-;; Version: 0.0.1
-;; Created: 15th January 2017
-;; Keywords: languages
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'smartparens)
-
-(--each '(elixir-mode)
- (add-to-list 'sp-sexp-suffix (list it 'regexp "")))
-
-(defun sp-elixir-def-p (id)
- "Return non-nil if the \"do\" keyword is part of definition.
-
-ID is the opening delimiter.
-
-Definitions are the constructions of the form defmodule-do-end,
-def-do-end and similar pairs."
- (save-excursion
- (when (equal "do" id)
- (back-to-indentation)
- (looking-at (regexp-opt '(
- "defmodule"
- "defmacro"
- "defmacrop"
- "quote"
- "def"
- "defp"
- "if"
- "unless"
- "case"
- "cond"
- "with"
- "for"
- "receive"
- "try"
- ))))))
-
-(defun sp-elixir-skip-def-p (ms _mb _me)
- "Test if \"do\" is part of definition.
-MS, MB, ME."
- (sp-elixir-def-p ms))
-
-(defun sp-elixir-do-block-post-handler (_id action _context)
- "Insert \"do\" keyword and indent the new block.
-ID, ACTION, CONTEXT."
- (when (eq action 'insert)
- (let ((m (make-marker)))
- (save-excursion
- (forward-word) ;; over the "end"
- (move-marker m (point)))
- (save-excursion (newline))
- (save-excursion (insert " do"))
- (indent-region (line-beginning-position) m)
- (move-marker m nil nil))))
-
-(defun sp-elixir-empty-do-block-post-handler (_id action _context)
- "Insert empty \"do\" keyword and indent the new block.
-
-This is used for receive-do-end expression.
-ID, ACTION, CONTEXT."
- (when (eq action 'insert)
- (let ((m (make-marker)))
- (save-excursion
- (forward-word) ;; over the "end"
- (move-marker m (point)))
- (save-excursion
- (forward-line -1)
- (end-of-line)
- (insert " do"))
- (save-excursion (newline))
- (indent-region (line-beginning-position) m)
- (indent-according-to-mode)
- (move-marker m nil nil))))
-
-(sp-with-modes 'elixir-mode
- (sp-local-pair "do" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :skip-match 'sp-elixir-skip-def-p
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "def" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-do-block-post-handler)
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "defp" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-do-block-post-handler)
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "defmodule" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-do-block-post-handler)
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "fn" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '("| "))
- (sp-local-pair "if" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-do-block-post-handler)
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "unless" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-do-block-post-handler)
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "case" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-do-block-post-handler)
- :unless '(sp-in-comment-p sp-in-string-p))
- (sp-local-pair "receive" "end"
- :when '(("RET" "<evil-ret>"))
- :post-handlers '(sp-elixir-empty-do-block-post-handler))
- )
-
-(provide 'smartparens-elixir)
-;;; smartparens-elixir.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-ess.el b/elpa/smartparens-20200324.2147/smartparens-ess.el
deleted file mode 100644
index 3afbdd5..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-ess.el
+++ /dev/null
@@ -1,227 +0,0 @@
-;;; smartparens-ess.el --- Smartparens Extension for Emacs Speaks Statistics -*- lexical-binding: t; -*-
-
-;; Copyright (c) 2015-2016 Bernhard Pröll
-
-;; Author: Bernhard Pröll
-;; Maintainer: Bernhard Pröll
-;; URL: https://github.com/Fuco1/smartparens
-;; Created: 2015-02-26
-;; Version: 0.2
-;; Keywords: abbrev convenience editing
-
-;; This file is NOT part of GNU 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; This file provides some additional configuration for ESS. To use
-;; it, simply add:
-;;
-;; (require 'smartparens-ess)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;;; Code:
-
-(require 'smartparens)
-(require 'rx)
-
-(defvar ess-roxy-str)
-
-(declare-function ess-roxy-indent-on-newline "ess-roxy")
-
-
-(dolist (mode '(ess-mode ess-r-mode inferior-ess-mode inferior-ess-r-mode))
- ;; avoid traveling commas when slurping
- ;; (|a, b), c ---> (|a, b, c)
- (add-to-list 'sp-sexp-suffix (list mode 'regexp ""))
- ;; `sp-sexp-prefix' for ESS
- (add-to-list 'sp-sexp-prefix
- (list mode 'regexp
- (rx (zero-or-more (or word (syntax symbol)))))))
-
-;; slurping follows Google's R style guide
-;; see https://google.github.io/styleguide/Rguide.xml
-(defun sp-ess-pre-handler (_id action _context)
- "Remove spaces before opening parenthesis in a function call.
-Remove redundant space around commas.
-ID, ACTION, CONTEXT."
- (when (equal action 'slurp-forward)
- (let ((sxp (sp-get-thing 'back)))
- (save-excursion
- (goto-char (sp-get sxp :beg-prf))
- ;; (|) x ---> (x)
- (when (looking-back (rx (syntax open-parenthesis)
- (one-or-more space)) nil)
- (cycle-spacing 0 nil 'single-shot))
- (cond
- ;; (|)if(cond) ---> (|if (cond))
- ((member (sp-get sxp :prefix) '("if" "for" "while"))
- (goto-char (sp-get sxp :beg))
- (cycle-spacing 1 nil 'single-shot))
- ;; (|)v [,2] <- if(x > 1) ---> (v[,2] <- if (x > 1))
- ((and
- (member (sp-get sxp :op) '("[" "("))
- (equal (sp-get sxp :prefix) "")
- (looking-back
- (rx (and (not-char "%" ",")
- (not (syntax close-parenthesis)))
- (one-or-more space)) nil)
- (not (member
- (save-excursion
- (sp-backward-sexp)
- (thing-at-point 'word 'noprop))
- '("if" "for" "while"))))
- (cycle-spacing 0 nil 'single-shot))
- ;; (|[...])%in% ---> ([...] %in%|)
- ((or (looking-at "%") (looking-back "%" nil))
- (just-one-space))
- ;; (|)a , b, c ---> (|a, b, c)
- ((looking-back
- (rx (zero-or-more space) "," (zero-or-more space))
- (line-beginning-position) 'greedy)
- (replace-match ", "))))))
- (when (equal action 'slurp-backward)
- (let ((sxp (sp-get-thing)))
- (save-excursion
- (goto-char (sp-get sxp :end))
- ;; x (|) ---> (x)
- (when (looking-at (rx (one-or-more space)
- (syntax close-parenthesis)))
- (cycle-spacing 0 nil 'single-shot))
- ;; if(cond){} (|) ---> (if (cond) {}|)
- (cond ((member (sp-get sxp :prefix) '("if" "for" "while"))
- (goto-char (sp-get sxp :beg))
- (cycle-spacing 1 nil 'single-shot))
- ;; for style reasons there should be a space before curly
- ;; brackets and binary operators
- ((and (member (sp-get sxp :op) '("{" "%"))
- (not (looking-at (rx (syntax close-parenthesis)))))
- (cycle-spacing 1 nil 'single-shot))
- ;; v[2](|) ---> (v[2]|)
- ((and
- (not (member (thing-at-point 'word 'noprop)
- '("if" "for" "while")))
- (looking-at
- (rx (and (zero-or-more space)
- (not-char "{")
- (or (syntax close-parenthesis)
- (char "(")
- (char "["))))))
- (cycle-spacing 0 nil 'single-shot))
- ;; 1 , 2 (|) ---> (1, 2)
- ((looking-at
- (rx (zero-or-more space) "," (zero-or-more space)))
- (replace-match ", ")))))))
-
-;; function(x) {|} ---> function(x) {\n|\n}
-;; ##' \tabular{rrr}{|} --->
-;; ##' \tabular{rrr}{
-;; ##' |
-;; ##' }
-(defun sp-ess-open-sexp-indent (&rest _args)
- "Open new brace or bracket with indentation.
-ARGS."
- (if (and (fboundp 'ess-roxy-entry-p) (ess-roxy-entry-p))
- (progn
- (save-excursion (ess-roxy-indent-on-newline))
- (when (looking-back ess-roxy-str nil)
- (cycle-spacing 3 nil t)))
- (newline)
- (indent-according-to-mode)
- (forward-line -1)
- (indent-according-to-mode)))
-
-(defun sp-ess-roxy-str-p (_id action _context)
- "Test if looking back at `ess-roxy-re'.
-ID, ACTION, CONTEXT."
- (when (and (boundp 'ess-roxy-re) (eq action 'insert))
- (sp--looking-back-p ess-roxy-re)))
-
-(sp-with-modes 'ess-mode
- (sp-local-pair "{" nil
- :pre-handlers '(sp-ess-pre-handler)
- ;; the more reasonable C-j interferes with default binding for
- ;; `ess-eval-line'
- :post-handlers '((sp-ess-open-sexp-indent "M-j")))
- (sp-local-pair "(" nil
- :pre-handlers '(sp-ess-pre-handler)
- :post-handlers '((sp-ess-open-sexp-indent "M-j")))
- (sp-local-pair "[" nil
- :pre-handlers '(sp-ess-pre-handler)
- :post-handlers '((sp-ess-open-sexp-indent "M-j")))
- (sp-local-pair "'" nil
- :unless '(sp-ess-roxy-str-p sp-in-comment-p sp-in-string-quotes-p)))
-
-;;; roxygen2 markup
-;; see https://cran.r-project.org/web/packages/roxygen2/vignettes/formatting.html
-(sp-with-modes 'ess-mode
- (sp-local-pair "\\strong{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\strong")
- (sp-local-pair "\\emph{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\emph")
- (sp-local-pair "\\code{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\code")
- (sp-local-pair "\\url{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\url")
- (sp-local-pair "\\link{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\link")
- (sp-local-pair "\\href{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\href"
- :suffix "{[^}]*}")
- (sp-local-pair "\\email{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\email")
- (sp-local-pair "\\pkg{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\pkg")
- (sp-local-pair "\\item{" "}"
- :when '(sp-in-comment-p)
- :post-handlers '((sp-ess-open-sexp-indent "M-j"))
- :trigger "\\item{")
- (sp-local-pair "\\enumerate{" "}"
- :when '(sp-in-comment-p)
- :post-handlers '((sp-ess-open-sexp-indent "M-j"))
- :trigger "\\enumerate")
- (sp-local-pair "\\itemize{" "}"
- :when '(sp-in-comment-p)
- :post-handlers '((sp-ess-open-sexp-indent "M-j"))
- :trigger "\\itemize")
- (sp-local-pair "\\describe{" "}"
- :when '(sp-in-comment-p)
- :post-handlers '((sp-ess-open-sexp-indent "M-j"))
- :trigger "\\describe")
- (sp-local-pair "\\eqn{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\eqn")
- (sp-local-pair "\\deqn{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\deqn")
- (sp-local-pair "\\tabular{" "}"
- :when '(sp-in-comment-p)
- :trigger "\\tabular"
- :post-handlers '((sp-ess-open-sexp-indent "M-j"))
- :suffix "{[^}]*}"))
-
-
-(provide 'smartparens-ess)
-;;; smartparens-ess ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-haskell.el b/elpa/smartparens-20200324.2147/smartparens-haskell.el
deleted file mode 100644
index 47a9ab5..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-haskell.el
+++ /dev/null
@@ -1,113 +0,0 @@
-;;; smartparens-haskell.el --- Additional configuration for Haskell based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Michael Xavier
-
-;; Author: Michael Xavier <michael@michaelxavier.net>
-;; Maintainer: Michael Xavier <michael@michaelxavier.net>
-;; Created: 29 Apr 2016
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Haskell based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-haskell)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-(require 'smartparens)
-
-(defun sp-haskell-skip-apostrophe (_ms mb _me)
- (save-excursion
- ;; We test the syntax class because haskell mode overrides
- ;; the class for ' on the fly when it run the syntax pass of
- ;; font-lock... so that if '' is a valid string (char) it
- ;; gets an override via 'syntax-table property. In which
- ;; case we just agree with haskell mode and let it be used as
- ;; a pair.
- (not (eq (syntax-class (syntax-after mb)) 7))))
-
-(defun sp-haskell-strict-ignore-apostrophe-after-word (_id action _context)
- "Ignore trailing ' when navigating.
-
-Because ' in haskell is symbol class it gets picked up as part of
-a words such as myFunction', and then strict mode won't allow us
-to delete it. Also show-smartparens-mode incorrectly highlights
-it as missing an opener.
-
-So we ignore that pair when at the end of word."
- (when (eq action 'navigate)
- (sp--looking-back-p (concat "\\(\\sw\\|\\s_\\)'+"))))
-
-(sp-with-modes '(haskell-mode haskell-interactive-mode)
- (sp-local-pair "{-" "-}")
- (sp-local-pair "{-#" "#-}")
- (sp-local-pair "{-@" "@-}")
- (sp-local-pair "'" nil
- :unless '(sp-point-after-word-p
- sp-haskell-strict-ignore-apostrophe-after-word)
- :skip-match 'sp-haskell-skip-apostrophe)
- (sp-local-pair "\\(" nil :actions nil))
-
-(defun sp--inferior-haskell-mode-backward-bound-fn ()
- "Limit the backward search to the prompt if point is on prompt."
- (-when-let (limit (cond ((bound-and-true-p comint-last-prompt)
- (marker-position (cdr comint-last-prompt)))
- ((bound-and-true-p comint-last-prompt-overlay)
- (overlay-end comint-last-prompt-overlay))
- (t nil)))
- (and (> (point) limit) limit)))
-
-(defun sp--inferior-haskell-mode-forward-bound-fn ()
- "Limit the forward search to exclude the prompt if point is before prompt."
- (-when-let (limit (cond ((bound-and-true-p comint-last-prompt)
- (marker-position (car comint-last-prompt)))
- ((bound-and-true-p comint-last-prompt-overlay)
- (overlay-start comint-last-prompt-overlay))
- (t nil)))
- (and (< (point) limit) limit)))
-
-(defun sp--setup-inferior-haskell-mode-search-bounds ()
- "Setup the search bound.
-
-If the point is after the last prompt, limit the backward search
-only for the propmt.
-
-If the point is before the last prompt, limit the forward search up until the prompt start."
- (setq sp-forward-bound-fn 'sp--inferior-haskell-mode-forward-bound-fn)
- (setq sp-backward-bound-fn 'sp--inferior-haskell-mode-backward-bound-fn))
-
-(add-hook 'inferior-haskell-mode-hook 'sp--setup-inferior-haskell-mode-search-bounds)
-
-(provide 'smartparens-haskell)
-
-;;; smartparens-haskell.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-html.el b/elpa/smartparens-20200324.2147/smartparens-html.el
deleted file mode 100644
index 3ba6406..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-html.el
+++ /dev/null
@@ -1,173 +0,0 @@
-;;; smartparens-html.el --- Additional configuration for HTML based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2014 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 14 Sep 2013
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for HTML based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-html)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-
-;; This file provides these interactive functions:
-
-;; `sp-html-next-tag' - Recommended binding: C-c C-f
-;; `sp-html-previous-tag' - Recommended binding: C-c C-b
-;;
-;; (These two bindings are used for navigation by tags forward or
-;; backward, but `sp-forward-sexp' already does that.)
-
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(defun sp-html-next-tag (arg)
- "Move point to the beginning of next SGML tag.
-
-With ARG positive N > 1, move N tags forward.
-
-With ARG raw prefix argument \\[universal-argument] move out of
-the current tag and to the beginning of enclosing tag.
-
-Note: this function is based on `sp-beginning-of-sexp' but
-specialized to only work with SGML tags and to always move
-forward."
- (interactive "P")
- (let ((sp-prefix-tag-object t))
- (if (sp--raw-argument-p arg)
- (sp-beginning-of-sexp arg)
- (sp-beginning-of-sexp (1+ (prefix-numeric-value arg))))))
-
-(defun sp-html-previous-tag (arg)
- "Move point to the beginning of previous SGML tag.
-
-With ARG positive N > 1, move N tags backward.
-
-With ARG raw prefix argument \\[universal-argument] move out of
-the current tag and to the beginning of enclosing tag.
-
-Note: this function is based on `sp-beginning-of-sexp' but
-specialized to only work with SGML tags and to always move
-backward."
- (interactive "P")
- (let ((sp-prefix-tag-object t))
- (if (sp--raw-argument-p arg)
- (sp-beginning-of-sexp arg)
- (sp-beginning-of-sexp (1- (- (prefix-numeric-value arg)))))))
-
-(defun sp-html-post-handler (&optional _id action _context)
- "Post-action hooks for `html-mode'.
-
-ID is the tag being processed, ACTION is the action and CONTEXT
-specifies if we are inside a string or code."
- (cl-case action
- (slurp-forward
- (save-excursion
- (let ((sp-prefix-pair-object t))
- (sp-backward-sexp))
- (-when-let (enc (sp-get-enclosing-sexp))
- (sp-get enc
- (goto-char :beg-in)
- (when (looking-at-p "[ \t]*$")
- (goto-char :end-in)
- (save-excursion
- (sp-backward-sexp)
- (forward-line -1)
- (when (sp-point-in-blank-line)
- (delete-region (line-beginning-position) (1+ (line-end-position)))))
- (newline-and-indent))))))
- (slurp-backward
- (save-excursion
- (-when-let (enc (sp-get-enclosing-sexp))
- (sp-get enc
- (goto-char :end-in)
- (when (sp--looking-back-p "^[ \t]*")
- (save-excursion
- (goto-char :beg-in)
- (newline-and-indent)
- (sp-forward-sexp)
- (forward-line)
- (when (sp-point-in-blank-line)
- (delete-region (line-beginning-position) (1+ (line-end-position))))))))))
- (barf-forward
- (save-excursion
- (let ((sp-prefix-pair-object t))
- (sp-backward-sexp))
- (-when-let (enc (sp-get-enclosing-sexp))
- (sp-get enc
- (goto-char :beg-in)
- (when (looking-at-p "[ \t]*$")
- (goto-char :end-in)
- (newline-and-indent)))))
- (save-excursion
- (sp-forward-sexp)
- (forward-line)
- (when (sp-point-in-blank-line)
- (delete-region (line-beginning-position) (1+ (line-end-position))))))
- (barf-backward
- (save-excursion
- (-when-let (enc (sp-get-enclosing-sexp))
- (sp-get enc
- (goto-char :end-in)
- (when (sp--looking-back-p "^[ \t]*")
- (goto-char :beg-in)
- (newline-and-indent)
- (sp-backward-up-sexp)
- (sp-backward-sexp)
- (forward-line -1)
- (when (sp-point-in-blank-line)
- (delete-region (line-beginning-position) (1+ (line-end-position)))))))))
- (beginning-of-sexp
- (when (looking-at-p "[ \t]*$")
- (sp-next-sexp)))
- (end-of-sexp
- (when (sp--looking-back-p "^[ \t]*" nil t)
- (sp-previous-sexp)))))
-
-(sp-with-modes sp--html-modes
- (sp-local-pair "<" ">")
- (sp-local-tag "<" "<_>" "</_>" :transform 'sp-match-sgml-tags :post-handlers '(sp-html-post-handler)))
-
-(--each sp--html-modes
- (add-to-list 'sp-navigate-consider-sgml-tags it))
-
-(--each '(web-mode)
- (add-to-list 'sp-sexp-suffix (list it 'regexp "")))
-
-(provide 'smartparens-html)
-
-;;; smartparens-html.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-javascript.el b/elpa/smartparens-20200324.2147/smartparens-javascript.el
deleted file mode 100644
index aa024d6..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-javascript.el
+++ /dev/null
@@ -1,55 +0,0 @@
-;;; smartparens-javascript.el --- Additional configuration for JavaScript based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (c) 2017 Marinin Tim
-;; Author: Tim Marinin <mt@marinin.xyz>
-;; Maintainer: Tim Marinin <mt@marinin.xyz>
-;; Created: 2017-03-03
-;; Keywords: abbrev convenience editing javascript
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for JavaScript based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-javascript)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-;; (|sys).path.append---the dot should not travel with the closing
-;; paren
-(--each '(js-mode javascript-mode js2-mode typescript-mode rjsx-mode)
- (add-to-list 'sp-sexp-suffix (list it 'regexp "")))
-
-(provide 'smartparens-javascript)
-;;; smartparens-javascript.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-latex.el b/elpa/smartparens-20200324.2147/smartparens-latex.el
deleted file mode 100644
index 61d9a00..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-latex.el
+++ /dev/null
@@ -1,192 +0,0 @@
-;;; smartparens-latex.el --- Additional configuration for (La)TeX based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2016 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 14 Feb 2013
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for (La)TeX based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-latex)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(defun sp-latex-insert-spaces-inside-pair (_id action _context)
- "ID, ACTION, CONTEXT."
- (when (eq action 'insert)
- (insert " ")
- (backward-char 1))
- (when (and (eq action 'wrap)
- (save-excursion
- (goto-char (sp-get sp-last-wrapped-region :beg-in))
- (not (sp--looking-back-p "[[{(]"))))
- (save-excursion
- (goto-char (sp-get sp-last-wrapped-region :end-in))
- (insert " ")
- (goto-char (sp-get sp-last-wrapped-region :beg-in))
- (insert " "))))
-
-(defun sp-latex-skip-match-apostrophe (ms _mb me)
- "MS, MB, ME."
- (when (equal ms "'")
- (save-excursion
- (goto-char me)
- (looking-at-p "\\sw"))))
-
-(defun sp-latex-skip-double-quote (_id action _context)
- "ID, ACTION, CONTEXT."
- (when (eq action 'insert)
- (when (looking-at-p "''''")
- (delete-char -2)
- (delete-char 2)
- (forward-char 2))))
-
-(defun sp-latex-point-after-backslash (id action _context)
- "Return t if point follows a backslash, nil otherwise.
-This predicate is only tested on \"insert\" action.
-ID, ACTION, CONTEXT."
- (when (eq action 'insert)
- (let ((trigger (sp-get-pair id :trigger)))
- (looking-back (concat "\\\\" (regexp-quote (if trigger trigger id))) nil))))
-
-(add-to-list 'sp-navigate-skip-match
- '((tex-mode plain-tex-mode latex-mode) . sp--backslash-skip-match))
-
-(sp-with-modes '(
- tex-mode
- plain-tex-mode
- latex-mode
- LaTeX-mode
- )
- (sp-local-pair "`" "'"
- :actions '(:rem autoskip)
- :skip-match 'sp-latex-skip-match-apostrophe
- :unless '(sp-latex-point-after-backslash sp-in-math-p))
- ;; math modes, yay. The :actions are provided automatically if
- ;; these pairs do not have global definitions.
- (sp-local-pair "$" "$")
- (sp-local-pair "\\[" "\\]"
- :unless '(sp-latex-point-after-backslash))
-
- ;; disable useless pairs.
- (sp-local-pair "\\\\(" nil :actions nil)
- (sp-local-pair "'" nil :actions nil)
- (sp-local-pair "\\\"" nil :actions nil)
-
- ;; quote should insert ``'' instead of double quotes. If we ever
- ;; need to insert ", C-q is our friend.
- (sp-local-pair "``" "''"
- :trigger "\""
- :unless '(sp-latex-point-after-backslash sp-in-math-p)
- :post-handlers '(sp-latex-skip-double-quote))
-
- ;; add the prefix function sticking to {} pair
- (sp-local-pair "{" nil :prefix "\\\\\\(\\sw\\|\\s_\\)*")
-
- ;; do not add more space when slurping
- (sp-local-pair "{" "}")
- (sp-local-pair "(" ")")
- (sp-local-pair "[" "]")
-
- ;; pairs for big brackets. Needs more research on what pairs are
- ;; useful to add here. Post suggestions if you know some.
- (sp-local-pair "\\left(" "\\right)"
- :trigger "\\l("
- :when '(sp-in-math-p)
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\left[" "\\right]"
- :trigger "\\l["
- :when '(sp-in-math-p)
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\left\\{" "\\right\\}"
- :trigger "\\l{"
- :when '(sp-in-math-p)
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\left|" "\\right|"
- :trigger "\\l|"
- :when '(sp-in-math-p)
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\bigl(" "\\bigr)"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\biggl(" "\\biggr)"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\Bigl(" "\\Bigr)"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\Biggl(" "\\Biggr)"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\bigl[" "\\bigr]"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\biggl[" "\\biggr]"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\Bigl[" "\\Bigr]"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\Biggl[" "\\Biggr]"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\bigl\\{" "\\bigr\\}"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\biggl\\{" "\\biggr\\}"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\Bigl\\{" "\\Bigr\\}"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\Biggl\\{" "\\Biggr\\}"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\lfloor" "\\rfloor"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\lceil" "\\rceil"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\langle" "\\rangle"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\lVert" "\\rVert"
- :when '(sp-in-math-p)
- :trigger "\\lVert"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
- (sp-local-pair "\\lvert" "\\rvert"
- :when '(sp-in-math-p)
- :trigger "\\lvert"
- :post-handlers '(sp-latex-insert-spaces-inside-pair))
-
- ;; some common wrappings
- (sp-local-tag "\"" "``" "''" :actions '(wrap))
- (sp-local-tag "\\b" "\\begin{_}" "\\end{_}")
- (sp-local-tag "bi" "\\begin{itemize}" "\\end{itemize}")
- (sp-local-tag "be" "\\begin{enumerate}" "\\end{enumerate}"))
-
-(provide 'smartparens-latex)
-
-;;; smartparens-latex.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-lua.el b/elpa/smartparens-20200324.2147/smartparens-lua.el
deleted file mode 100644
index 29621a6..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-lua.el
+++ /dev/null
@@ -1,90 +0,0 @@
-;;; smartparens-lua.el --- Additional configuration for Lua based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2014 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 3 August 2013
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Lua based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-lua)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(defun sp-lua-post-keyword-insert (id action _context)
- "ID, ACTION, CONTEXT."
- (cond
- ((eq action 'insert)
- (cond
- ((member id '("while" "for"))
- (insert " do")
- (save-excursion (newline-and-indent))
- (backward-char 3))
- ((equal id "if")
- (insert " then")
- (save-excursion (newline-and-indent))
- (backward-char 5))
- ((equal id "function")
- (save-excursion (newline-and-indent))
- (insert " "))))))
-
-;; all the pairs are expanded only if followed by "SPC" event. This
-;; will reduce false positives like 'dIFficult' to trigger.
-(sp-with-modes '(lua-mode)
- (sp-local-pair "if" "end"
- :when '(("SPC"))
- :unless '(sp-in-comment-p sp-in-string-p)
- :post-handlers '(sp-lua-post-keyword-insert))
- (sp-local-pair "function" "end"
- :when '(("SPC"))
- :unless '(sp-in-comment-p sp-in-string-p)
- :post-handlers '(sp-lua-post-keyword-insert))
- (sp-local-pair "for" "end"
- :when '(("SPC"))
- :unless '(sp-in-comment-p sp-in-string-p)
- :post-handlers '(sp-lua-post-keyword-insert))
- (sp-local-pair "while" "end"
- :when '(("SPC"))
- :unless '(sp-in-comment-p sp-in-string-p)
- :post-handlers '(sp-lua-post-keyword-insert))
- )
-
-(provide 'smartparens-lua)
-
-;;; smartparens-lua.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-markdown.el b/elpa/smartparens-20200324.2147/smartparens-markdown.el
deleted file mode 100644
index b097fb5..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-markdown.el
+++ /dev/null
@@ -1,88 +0,0 @@
-;;; smartparens-markdown.el --- Additional configuration for Markdown based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 11th May 2017
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Markdown based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-markdown)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-(require 'smartparens-text)
-(eval-when-compile
- (defvar markdown-gfm-use-electric-backquote))
-
-
-(defun sp-gfm-electric-backquote-p (_id action _context)
- "Do not insert ```...``` pair if that would be handled by `markdown-electric-backquote'."
- (and (eq action 'insert)
- markdown-gfm-use-electric-backquote
- (sp--looking-back-p "^```")))
-
-(defun sp--gfm-point-after-word-p (id action _context)
- "Return t if point is after a word, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-back-p (concat "\\(\\sw\\)" (regexp-quote id)))))
-
-(defun sp--gfm-skip-asterisk (_ms mb _me)
- "Non-nil if we should ignore this asterisk as a delimiter."
- (save-excursion
- (goto-char mb)
- (save-match-data (looking-at "^\\* "))))
-
-(sp-with-modes '(markdown-mode gfm-mode)
- (sp-local-pair "*" "*"
- :unless '(sp--gfm-point-after-word-p sp-point-at-bol-p)
- :post-handlers '(("[d1]" "SPC"))
- :skip-match 'sp--gfm-skip-asterisk)
- (sp-local-pair "**" "**")
- (sp-local-pair "_" "_" :unless '(sp-point-after-word-p)))
-
-(sp-with-modes 'markdown-mode
- (sp-local-pair "```" "```"))
-
-(sp-with-modes 'gfm-mode
- (sp-local-pair "`" "`" :unless '(:add sp-gfm-electric-backquote-p))
- (sp-local-pair "```" "```" :unless '(:add sp-gfm-electric-backquote-p)))
-
-(provide 'smartparens-markdown)
-;;; smartparens-markdown.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-ml.el b/elpa/smartparens-20200324.2147/smartparens-ml.el
deleted file mode 100644
index 7960c5f..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-ml.el
+++ /dev/null
@@ -1,76 +0,0 @@
-;;; smartparens-ml.el --- Additional configuration for ML languages -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2016-2017 Ta Quang Trung
-;; Copyright (C) 2017 Matus Goljer
-
-;; Author: Ta Quang Trung <taquangtrungvn@gmail.com>
-;; Matus Goljer <matus.goljer@gmail.com>
-;; Louis Roché <louis@louisroche.net>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 14 July 2016
-;; Keywords: smartparens, ML, ocaml, reason
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for ML languages.
-;; To use it, simply add:
-;;
-;; (require 'smartparens-ml)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-;;; Local pairs for ML-family languages
-
-(sp-with-modes '(fsharp-mode)
- (sp-local-pair "(*" "*)" ))
-
-(sp-with-modes '(tuareg-mode)
- ;; Disable ` because it is used in polymorphic variants
- (sp-local-pair "`" nil :actions nil)
- ;; Disable ' because it is used in value names and types
- (sp-local-pair "'" nil :actions nil)
- (sp-local-pair "(*" "*)" ))
-
-;; Ignore punctuation, so we can split ~(foo) to ~foo.
-(add-to-list 'sp-sexp-prefix (list 'tuareg-mode 'syntax ""))
-
-(sp-with-modes '(reason-mode)
- ;; Disable ` because it is used in polymorphic variants
- (sp-local-pair "`" nil :actions nil)
- ;; Disable ' because it is used in value names and types
- (sp-local-pair "'" nil :actions nil)
- (sp-local-pair "/*" "*/" ))
-
-(provide 'smartparens-ml)
-;;; smartparens-ml.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-org.el b/elpa/smartparens-20200324.2147/smartparens-org.el
deleted file mode 100644
index 87dfeca..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-org.el
+++ /dev/null
@@ -1,72 +0,0 @@
-;;; smartparens-org.el --- Configuration for Org mode. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Matúš Goljer
-
-;; Author: Matúš Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
-;; Version: 0.0.1
-;; Created: 15th January 2017
-;; Keywords: languages
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Org based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-org)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-(require 'smartparens-text)
-
-(defun sp--org-skip-asterisk (_ms mb me)
- "Non-nil if the asterisk is part of the outline marker."
- (save-excursion
- (goto-char mb)
- (beginning-of-line)
- (let ((skip-distance (skip-chars-forward "*")))
- (if (= skip-distance 1)
- (not (memq (syntax-class (syntax-after (point))) '(2 3)))
- (<= me (point))))))
-
-(defun sp-org-point-after-left-square-bracket-p (id action _context)
- "Return t if point is after a left square bracket, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-back-p (concat "\\[" (regexp-quote id)))))
-
-(sp-with-modes 'org-mode
- (sp-local-pair "*" "*"
- :unless '(sp-point-after-word-p sp-point-at-bol-p)
- :skip-match 'sp--org-skip-asterisk)
- (sp-local-pair "_" "_" :unless '(sp-point-after-word-p))
- (sp-local-pair "/" "/" :unless '(sp-point-after-word-p sp-org-point-after-left-square-bracket-p) :post-handlers '(("[d1]" "SPC")))
- (sp-local-pair "~" "~" :unless '(sp-point-after-word-p) :post-handlers '(("[d1]" "SPC")))
- (sp-local-pair "=" "=" :unless '(sp-point-after-word-p) :post-handlers '(("[d1]" "SPC")))
- (sp-local-pair "«" "»"))
-
-(provide 'smartparens-org)
-;;; smartparens-org.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-pkg.el b/elpa/smartparens-20200324.2147/smartparens-pkg.el
deleted file mode 100644
index 2e9b1b9..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-pkg.el
+++ /dev/null
@@ -1,7 +0,0 @@
-(define-package "smartparens" "20200324.2147" "Automatic insertion, wrapping and paredit-like navigation with user defined pairs."
- '((dash "2.13.0")
- (cl-lib "0.3"))
- :commit "555626a43f9bb1985aa9a0eb675f2b88b29702c8")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/smartparens-20200324.2147/smartparens-python.el b/elpa/smartparens-20200324.2147/smartparens-python.el
deleted file mode 100644
index d6ac93f..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-python.el
+++ /dev/null
@@ -1,92 +0,0 @@
-;;; smartparens-python.el --- Additional configuration for Python based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015-2016 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 8 February 2015
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Python based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-python)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-;; Python has no sexp suffices. This fixes slurping
-;; (|sys).path.append---the dot should not travel with the closing
-;; paren
-(--each '(python-mode inferior-python-mode)
- (add-to-list 'sp-sexp-suffix (list it 'regexp "")))
-
-(sp-with-modes 'python-mode
- (sp-local-pair "'" "'" :unless '(sp-in-comment-p sp-in-string-quotes-p) :post-handlers '(:add sp-python-fix-tripple-quotes))
- (sp-local-pair "\"" "\"" :post-handlers '(:add sp-python-fix-tripple-quotes))
- (sp-local-pair "'''" "'''")
- (sp-local-pair "\\'" "\\'")
- (sp-local-pair "\"\"\"" "\"\"\""))
-
-(defun sp-python-fix-tripple-quotes (id action _context)
- "Properly rewrap tripple quote pairs.
-
-When the user rewraps a tripple quote pair to the other pair
-type (i.e. ''' to \") we check if the old pair was a
-tripple-quote pair and if so add two pairs to beg/end of the
-newly formed pair (which was a single-quote \"...\" pair)."
- (when (eq action 'rewrap-sexp)
- (let ((old (plist-get sp-handler-context :parent)))
- (when (or (and (equal old "'''") (equal id "\""))
- (and (equal old "\"\"\"") (equal id "'")))
- (save-excursion
- (sp-get sp-last-wrapped-region
- (goto-char :end-in)
- (insert (make-string 2 (aref id 0)))
- (goto-char :beg)
- (insert (make-string 2 (aref id 0)))))))))
-
-(defadvice python-indent-dedent-line-backspace
- (around sp-backward-delete-char-advice activate)
- "Fix indend."
- (if smartparens-strict-mode
- (cl-letf (((symbol-function 'delete-backward-char)
- (lambda (arg &optional killp)
- (sp-backward-delete-char arg))))
- ad-do-it)
- ad-do-it))
-
-(provide 'smartparens-python)
-;;; smartparens-python.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-racket.el b/elpa/smartparens-20200324.2147/smartparens-racket.el
deleted file mode 100644
index 08af676..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-racket.el
+++ /dev/null
@@ -1,56 +0,0 @@
-;;; smartparens-racket.el --- Additional configuration for Racket based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Vikraman Choudhury
-
-;; Author: Vikraman Choudhury <git@vikraman.org>
-;; Maintainer: Vikraman Choudhury <git@vikraman.org>
-;; Created: 26 Oct 2015
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Racket based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-racket)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(sp-with-modes '(racket-mode racket-repl-mode)
- (sp-local-pair "`" nil :actions nil)
- (sp-local-pair "'" nil :actions nil)
- (sp-local-pair "#|" "|#"))
-
-(provide 'smartparens-racket)
-;;; smartparens-racket.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-rst.el b/elpa/smartparens-20200324.2147/smartparens-rst.el
deleted file mode 100644
index b1e25f8..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-rst.el
+++ /dev/null
@@ -1,62 +0,0 @@
-;;; smartparens-rst.el --- Additional configuration for rst based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2019 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 28th January 2019
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for rst based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-rst)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-(require 'smartparens-text)
-(require 'smartparens-markdown)
-
-(sp-with-modes 'rst-mode
- (sp-local-pair "*" "*"
- :unless '(sp--gfm-point-after-word-p sp-point-at-bol-p)
- :post-handlers '(("[d1]" "SPC"))
- :skip-match 'sp--gfm-skip-asterisk)
- (sp-local-pair "**" "**")
- (sp-local-pair "_" "_" :unless '(sp-point-after-word-p))
- (sp-local-pair "``" "``"))
-
-(provide 'smartparens-rst)
-;;; smartparens-rst.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-ruby.el b/elpa/smartparens-20200324.2147/smartparens-ruby.el
deleted file mode 100644
index 3ba8671..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-ruby.el
+++ /dev/null
@@ -1,411 +0,0 @@
-;;; smartparens-ruby.el --- Additional configuration for Ruby based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2013-2014 Jean-Louis Giordano
-
-;; Author: Jean-Louis Giordano <jean-louis@jawaninja.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 16 June 2013
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Ruby based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-ruby)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(declare-function enh-ruby-forward-sexp "ruby")
-(declare-function ruby-forward-sexp "ruby")
-(declare-function enh-ruby-backward-sexp "ruby")
-(declare-function ruby-backward-sexp "ruby")
-
-(defun sp-ruby-forward-sexp ()
- "Wrapper for `ruby-forward-sexp' based on `enh-ruby-mode'."
- (interactive)
- (if (boundp 'enh-ruby-forward-sexp)
- (enh-ruby-forward-sexp)
- (ruby-forward-sexp)))
-
-(defun sp-ruby-backward-sexp ()
- "Wrapper for `ruby-backward-sexp' based on `enh-ruby-mode'."
- (interactive)
- (if (boundp 'enh-ruby-backward-sexp)
- (enh-ruby-backward-sexp)
- (ruby-backward-sexp)))
-
-(defun sp-ruby-maybe-one-space ()
- "Turn whitespace around point to just one space."
- (while (looking-back " " nil) (backward-char))
- (when (or (looking-at-p " ")
- (looking-at-p "}")
- (looking-back "{" nil)
- (and (looking-at-p "\\sw")
- (looking-back ":" nil)))
- (save-excursion (just-one-space)))
- (when (and (not (looking-back "^.?" nil))
- (save-excursion
- (backward-char 2)
- (or (looking-at-p ".[^:] [.([,;]")
- (looking-at-p ".. ::")
- (looking-at-p ".[.@$] ")
- (looking-at-p ":: "))))
- (delete-char 1)))
-
-(defun sp-ruby-delete-indentation (&optional arg)
- "Better way of joining ruby lines.
-
-ARG is how many indentation to delete."
- (delete-indentation arg)
- (sp-ruby-maybe-one-space))
-
-(defun sp-ruby-block-post-handler (id action context)
- "Handler for ruby block-like insertions.
-ID, ACTION, CONTEXT."
- (when (equal action 'insert)
- (save-excursion
- (newline)
- (indent-according-to-mode))
- (indent-according-to-mode))
- (sp-ruby-post-handler id action context))
-
-(defun sp-ruby-def-post-handler (id action context)
- "Handler for ruby def-like insertions.
-ID, ACTION, CONTEXT."
- (when (equal action 'insert)
- (save-excursion
- (insert "x")
- (newline)
- (indent-according-to-mode))
- (delete-char 1))
- (sp-ruby-post-handler id action context))
-
-(defun sp-ruby-post-handler (_id action _context)
- "Ruby post handler.
-ID, ACTION, CONTEXT."
- (-let (((&plist :arg arg :enc enc) sp-handler-context))
- (when (equal action 'barf-backward)
- (sp-ruby-delete-indentation 1)
- (indent-according-to-mode)
- (save-excursion
- (sp-backward-sexp) ; move to begining of current sexp
- (sp-backward-sexp arg)
- (sp-ruby-maybe-one-space)))
-
- (when (equal action 'barf-forward)
- (sp-get enc
- (let ((beg-line (line-number-at-pos :beg-in)))
- (sp-forward-sexp arg)
- (sp-ruby-maybe-one-space)
- (when (not (= (line-number-at-pos) beg-line))
- (sp-ruby-delete-indentation -1))
- (indent-according-to-mode))))))
-
-(defun sp-ruby-pre-handler (_id action _context)
- "Handler for ruby slurp and barf.
-ID, ACTION, CONTEXT."
- (let ((enc (plist-get sp-handler-context :enc)))
- (sp-get enc
- (let ((beg-line (line-number-at-pos :beg-in))
- (end-line (line-number-at-pos :end-in)))
-
- (when (equal action 'slurp-backward)
- (save-excursion
- (sp-forward-sexp)
- (when (looking-at-p ";") (forward-char))
- (sp-ruby-maybe-one-space)
- (when (not (= (line-number-at-pos) end-line))
- (sp-ruby-delete-indentation -1)))
- (when (looking-at-p "::")
- (while (and (looking-back "\\sw" nil)
- (--when-let (sp-get-symbol t)
- (sp-get it (goto-char :beg-prf))))))
- (while (thing-at-point-looking-at "\\.[[:blank:]\n]*")
- (sp-backward-sexp))
- (when (looking-back "[@$:&?!]" nil)
- (backward-char)
- (when (looking-back "[@&:]" nil)
- (backward-char)))
- (just-one-space)
- (save-excursion
- (if (= (line-number-at-pos) end-line)
- (insert " ")
- (newline))))
-
- (when (equal action 'barf-backward)
- ;; Barf whole method chains
- (while (thing-at-point-looking-at "[(.:[][\n[:blank:]]*")
- (sp-forward-sexp))
- (if (looking-at-p " *$")
- (newline)
- (save-excursion (newline))))
-
- (when (equal action 'slurp-forward)
- (save-excursion
- (sp-backward-sexp)
- (when (looking-back "\." nil) (backward-char))
- (sp-ruby-maybe-one-space)
- (when (not (= (line-number-at-pos) beg-line))
- (if (thing-at-point-looking-at "\\.[[:blank:]\n]*")
- (progn
- (forward-symbol -1)
- (sp-ruby-delete-indentation -1))
- (sp-ruby-delete-indentation))))
- (while (looking-at-p "::") (sp-forward-symbol))
- (when (looking-at-p "[?!;]") (forward-char))
- (if (= (line-number-at-pos) beg-line)
- (insert " ")
- (newline)))
-
- (when (equal action 'barf-forward)
- (when (looking-back "\\." nil) (backward-char))
- (when (looking-at-p "::")
- (while (and (looking-back "\\sw" nil)
- (--when-let (sp-get-symbol t)
- (sp-get it (goto-char :beg-prf))))))
- (if (= (line-number-at-pos) end-line)
- (insert " ")
- (if (looking-back "^[[:blank:]]*" nil)
- (save-excursion (newline))
- (newline))))))))
-
-(defun sp-ruby-inline-p (id)
- "Test if ID is inline."
- (save-excursion
- (when (looking-back id nil)
- (backward-word))
- (when (not (or (looking-back "^[[:blank:]]*" nil)
- (looking-back "= *" nil)))
- (or (save-excursion
- (forward-symbol -1)
- (forward-symbol 1)
- (looking-at-p (concat " *" id)))
- (save-excursion
- ;; This does not seem to make emacs snapshot happy
- (ignore-errors
- (sp-ruby-backward-sexp)
- (sp-ruby-forward-sexp)
- (looking-at-p (concat "[^[:blank:]]* *" id))))))))
-
-(defun sp-ruby-method-p (id)
- "Test if ID is a method."
- (save-excursion
- (when (looking-back id nil)
- (backward-word))
- (and (looking-at-p id)
- (or
- ;; fix for def_foo
- (looking-at-p (concat id "[_?!:]"))
- ;; fix for foo_def
- (looking-back "[_:@$.]" nil)
- ;; fix for def for; end
- (looking-back "def \\|class \\|module " nil)
- ;; Check if multiline method call
- ;; But beware of comments!
- (and (looking-back "\\.[[:blank:]\n]*" nil)
- (not (save-excursion
- (search-backward ".")
- (sp-point-in-comment))))))))
-
-(defun sp-ruby-skip-inline-match-p (ms _mb _me)
- "If non-nil, skip inline match.
-MS, MB, ME."
- (or (sp-ruby-method-p ms)
- (sp-ruby-inline-p ms)))
-
-(defun sp-ruby-skip-method-p (ms _mb _me)
- "If non-nil, skip method.
-MS, MB, ME."
- (sp-ruby-method-p ms))
-
-(defun sp-ruby-in-string-or-word-p (id action context)
- "Test if point is inside string or word.
-ID, ACTION, CONTEXT."
- (or (sp-in-string-p id action context)
- (and (looking-back id nil)
- (not (looking-back (sp--strict-regexp-quote id) nil)))
- (sp-ruby-method-p id)))
-
-(defun sp-ruby-in-string-word-or-inline-p (id action context)
- "Test if point is inside string, word or inline.
-ID, ACTION, CONTEXT."
- (or (sp-ruby-in-string-or-word-p id action context)
- (and (looking-back id nil)
- (sp-ruby-inline-p id))))
-
-(defun sp-ruby-pre-pipe-handler (id action _context)
- "Ruby pipe handler.
-ID, ACTION, CONTEXT."
- (when (equal action 'insert)
- (save-excursion
- (just-one-space))
- (save-excursion
- (search-backward id)
- (just-one-space))))
-
-(defun sp-ruby-should-insert-pipe-close (id action _context)
- "Test whether to insert the closing pipe for a lambda-binding pipe pair.
-ID, ACTION, CONTEXT"
- (if (eq action 'insert)
- (thing-at-point-looking-at
- (rx-to-string `(and (or "do" "{") (* space) ,id)))
- t))
-
-(defun sp--ruby-skip-match (ms me mb)
- "Ruby skip match.
-MS, ME, MB."
- (when (string= ms "end")
- (or (sp-in-string-p ms me mb)
- (sp-ruby-method-p "end"))))
-
-(add-to-list 'sp-navigate-skip-match
- '((ruby-mode enh-ruby-mode motion-mode) . sp--ruby-skip-match))
-
-(dolist (mode '(ruby-mode motion-mode))
- (add-to-list 'sp-sexp-suffix `(,mode syntax "")))
-
-(sp-with-modes '(ruby-mode enh-ruby-mode motion-mode)
- (sp-local-pair "do" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-block-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "{" "}"
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-post-handler)
- :suffix "")
-
- (sp-local-pair "begin" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-block-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "def" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "class" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "module" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "case" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-method-p
- :suffix "")
-
- (sp-local-pair "for" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-or-word-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-inline-match-p)
-
- (sp-local-pair "if" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "unless" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "while" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "until" "end"
- :when '(("SPC" "RET" "<evil-ret>"))
- :unless '(sp-ruby-in-string-word-or-inline-p sp-in-comment-p)
- :actions '(insert navigate)
- :pre-handlers '(sp-ruby-pre-handler)
- :post-handlers '(sp-ruby-def-post-handler)
- :skip-match 'sp-ruby-skip-inline-match-p
- :suffix "")
-
- (sp-local-pair "|" "|"
- :when '(sp-ruby-should-insert-pipe-close)
- :pre-handlers '(sp-ruby-pre-pipe-handler)
- :suffix ""))
-
-(provide 'smartparens-ruby)
-
-;;; smartparens-ruby.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-rust.el b/elpa/smartparens-20200324.2147/smartparens-rust.el
deleted file mode 100644
index e3f46ce..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-rust.el
+++ /dev/null
@@ -1,142 +0,0 @@
-;;; smartparens-rust.el --- Additional configuration for Rust based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Wilfred Hughes
-
-;; Created: 3 November 2015
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Rust. To use
-;; it, simply add:
-;;
-;; (require 'smartparens-config)
-;;
-;; alternatively, you can explicitly load these preferences:
-;;
-;; (require 'smartparens-rust)
-;;
-;; in your configuration.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-(require 'smartparens)
-
-(declare-function rust-mode "rust-mode")
-(declare-function rustic-mode "rustic-mode")
-
-(defun sp-in-rust-lifetime-context (&rest _args)
- "Return t if point is in a Rust context where ' represents a lifetime.
-If we return nil, ' should be used for character literals.
-ARGS."
- (or
- (condition-case nil
- ;; If point is just after a &', it's probably a &'foo.
- (save-excursion
- (backward-char 2)
- (looking-at "&"))
- ;; If we're at the beginning of the buffer, just carry on.
- (beginning-of-buffer))
- ;; If point is inside < > it's probably a parameterised function.
- (let ((paren-pos (nth 1 (syntax-ppss))))
- (and paren-pos
- (save-excursion
- (goto-char paren-pos)
- (looking-at "<"))))))
-
-(defun sp-rust-skip-match-angle-bracket (_ms _mb me)
- "Non-nil if we should ignore the bracket as valid delimiter."
- (save-excursion
- (goto-char me)
- (let ((on-fn-return-type
- (sp--looking-back-p (rx "->") nil))
- (on-match-branch
- (sp--looking-back-p (rx "=>") nil))
- (on-comparison
- (sp--looking-back-p (rx (or
- (seq space "<")
- (seq space ">")
- (seq space "<<")
- (seq space ">>")))
- nil)))
- (or on-comparison on-fn-return-type on-match-branch))))
-
-(defun sp-rust-filter-angle-brackets (_id action context)
- "Non-nil if we should allow ID's ACTION in CONTEXT for angle brackets."
- ;; See the docstring for `sp-pair' for the possible values of ID,
- ;; ACTION and CONTEXT.
- (cond
- ;; Inside strings, don't do anything with < or >.
- ((eq context 'string)
- nil)
- ;; Don't do any smart pairing inside comments either.
- ((eq context 'comment)
- nil)
- ;; Otherwise, we're in code.
- ((eq context 'code)
- (let ((on-fn-return-type
- (looking-back (rx "->") nil))
- (on-match-branch
- (looking-back (rx "=>") nil))
- (on-comparison
- (looking-back (rx (or
- (seq space "<")
- (seq space ">")
- (seq space "<<")
- (seq space ">>")))
- nil)))
- (cond
- ;; Only insert a matching > if we're not looking at a
- ;; comparison.
- ((eq action 'insert)
- (and (not on-comparison) (not on-fn-return-type) (not on-match-branch)))
- ;; Always allow wrapping in a pair if the region is active.
- ((eq action 'wrap)
- (not on-match-branch))
- ;; When pressing >, autoskip if we're not looking at a
- ;; comparison.
- ((eq action 'autoskip)
- (and (not on-comparison) (not on-fn-return-type) (not on-match-branch)))
- ;; Allow navigation, highlighting and strictness checks if it's
- ;; not a comparison.
- ((eq action 'navigate)
- (and (not on-comparison) (not on-fn-return-type) (not on-match-branch))))))))
-
-(sp-with-modes '(rust-mode rustic-mode)
- (sp-local-pair "'" "'"
- :unless '(sp-in-comment-p sp-in-string-quotes-p sp-in-rust-lifetime-context)
- :post-handlers'(:rem sp-escape-quotes-after-insert))
- (sp-local-pair "<" ">"
- :when '(sp-rust-filter-angle-brackets)
- :skip-match 'sp-rust-skip-match-angle-bracket))
-
-;; Rust has no sexp suffices. This fixes slurping
-;; (|foo).bar -> (foo.bar)
-(add-to-list 'sp-sexp-suffix (list #'rust-mode 'regexp ""))
-(add-to-list 'sp-sexp-suffix (list #'rustic-mode 'regexp ""))
-
-(provide 'smartparens-rust)
-
-;;; smartparens-rust.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-scala.el b/elpa/smartparens-20200324.2147/smartparens-scala.el
deleted file mode 100644
index 7e79016..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-scala.el
+++ /dev/null
@@ -1,80 +0,0 @@
-;;; smartparens-scala.el --- Additional configuration for Scala based modes. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015 Greg Nwosu
-
-;; Author: Greg Nwosu <greg.nwosu@gmail.com>
-;; Maintainer: Greg Nwosu <greg.nwosu@gmail.com>
-;; Created: 8 July 2015
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for Scala based
-;; modes. To use it, simply add:
-;;
-;; (require 'smartparens-scala)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-;;
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-;;
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-;; Scala has no sexp suffices. This fixes slurping
-;; import scala.mutable{|} ListBuffer, Set ---the comma should not travel with the closing
-;; paren
-(--each '(scala-mode inferior-scala-mode)
- (add-to-list 'sp-sexp-suffix (list it 'regexp "")))
-
-(defun sp-scala-wrap-with-indented-newlines (_1 action _2)
- "Post handler for the wrap ACTION, putting the region on indented newlines."
- (when (eq action 'wrap)
- (sp-get sp-last-wrapped-region
- (let ((beg :beg-in)
- (end :end-in))
- (save-excursion
- (goto-char end)
- (newline-and-indent))
- (save-excursion
- (goto-char beg)
- (newline))
- (indent-region beg end)))))
-
-(sp-local-pair 'scala-mode "(" nil
- :post-handlers '(("||\n[i]" "RET")
- ("| " "SPC")))
-
-(sp-local-pair 'scala-mode "{" nil
- :post-handlers '(("||\n[i]" "RET")
- ("| " "SPC")
- sp-scala-wrap-with-indented-newlines))
-
-(provide 'smartparens-scala)
-;;; smartparens-scala.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens-text.el b/elpa/smartparens-20200324.2147/smartparens-text.el
deleted file mode 100644
index 91c07be..0000000
--- a/elpa/smartparens-20200324.2147/smartparens-text.el
+++ /dev/null
@@ -1,65 +0,0 @@
-;;; smartparens-latex.el --- Additional configuration for text-mode. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 16 July 2017
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some additional configuration for `text-mode'.
-;; To use it, simply add:
-;;
-;; (require 'smartparens-text)
-;;
-;; into your configuration. You can use this in conjunction with the
-;; default config or your own configuration.
-
-;; If you have good ideas about what should be added please file an
-;; issue on the github tracker.
-
-;; For more info, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;;; Code:
-
-(require 'smartparens)
-
-(defun sp-text-mode-emoticon-p (_id action _context)
- (when (memq action '(insert navigate))
- (sp--looking-back-p ":-?[()]" 3)))
-
-(defun sp-text-mode-skip-emoticon (ms mb _me)
- (when (member ms '("(" ")"))
- (save-excursion
- (goto-char mb)
- (sp--looking-back-p ":-?" 2))))
-
-(sp-local-pair 'text-mode "(" nil
- :unless '(:add sp-text-mode-emoticon-p)
- :skip-match 'sp-text-mode-skip-emoticon)
-
-(provide 'smartparens-text)
-;;; smartparens-text.el ends here
diff --git a/elpa/smartparens-20200324.2147/smartparens.el b/elpa/smartparens-20200324.2147/smartparens.el
deleted file mode 100644
index c9745cd..0000000
--- a/elpa/smartparens-20200324.2147/smartparens.el
+++ /dev/null
@@ -1,9628 +0,0 @@
-;;; smartparens.el --- Automatic insertion, wrapping and paredit-like navigation with user defined pairs. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012-2016 Matus Goljer
-
-;; Author: Matus Goljer <matus.goljer@gmail.com>
-;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
-;; Created: 17 Nov 2012
-;; Keywords: abbrev convenience editing
-;; URL: https://github.com/Fuco1/smartparens
-
-;; This file is not part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Smartparens.
-
-;; Smartparens 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.
-
-;; Smartparens 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 Smartparens. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Smartparens is minor mode for Emacs that deals with parens pairs
-;; and tries to be smart about it. It started as a unification effort
-;; to combine functionality of several existing packages in a single,
-;; compatible and extensible way to deal with parentheses, delimiters,
-;; tags and the like. Some of these packages include autopair,
-;; textmate, wrap-region, electric-pair-mode, paredit and others. With
-;; the basic features found in other packages it also brings many
-;; improvements as well as completely new features.
-
-;; For a basic overview, see github readme at
-;; https://github.com/Fuco1/smartparens
-
-;; For the complete documentation visit the documentation wiki located
-;; at https://github.com/Fuco1/smartparens/wiki
-
-;; If you like this project, you can donate here:
-;; https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CEYP5YVHDRX8C
-
-;;; Code:
-
-(eval-when-compile
- (require 'subr-x) ; for `string-trim'
- (require 'cl-lib))
-
-(require 'dash)
-(require 'thingatpt)
-(require 'help-mode) ;; for help-xref-following #85
-
-(declare-function cua-replace-region "cua-base") ; FIXME: remove this when we drop support for old emacs
-(declare-function cua-delete-region "cua-base")
-(declare-function cua--fallback "cua-base")
-(declare-function package-version-join "package")
-(declare-function package-desc-version "package")
-
-(declare-function subword-kill "subword")
-(declare-function subword-forward "subword")
-(declare-function subword-backward "subword")
-
-(declare-function hungry-delete-backward "hungry-delete")
-(declare-function hungry-delete-forward "hungry-delete")
-
-(declare-function evil-get-register "evil-common")
-(declare-function evil-set-register "evil-common")
-(eval-when-compile
- (defvar evil-this-register)
- (defvar package-alist)
- (defvar sp-autoskip-closing-pair)
- (defvar sp-show-enclosing-pair-commands)
- (defvar show-smartparens-mode))
-
-
-;;; backport for older emacsen
-
-;; introduced in 24.3
-(unless (fboundp 'defvar-local)
- (defmacro defvar-local (var val &optional docstring)
- "Define VAR as a buffer-local variable with default value VAL.
-Like `defvar' but additionally marks the variable as being automatically
-buffer-local wherever it is set."
- (declare (debug defvar) (doc-string 3))
- ;; Can't use backquote here, it's too early in the bootstrap.
- (list 'progn (list 'defvar var val docstring)
- (list 'make-variable-buffer-local (list 'quote var)))))
-
-;;;###autoload
-(defun sp-cheat-sheet (&optional arg)
- "Generate a cheat sheet of all the smartparens interactive functions.
-
-Without a prefix argument, print only the short documentation and examples.
-
-With non-nil prefix argument ARG, show the full documentation for each function.
-
-You can follow the links to the function or variable help page.
-To get back to the full list, use \\[help-go-back].
-
-You can use `beginning-of-defun' and `end-of-defun' to jump to
-the previous/next entry.
-
-Examples are fontified using the `font-lock-string-face' for
-better orientation."
- (interactive "P")
- (setq arg (not arg))
- (let ((do-not-display '(
- smartparens-mode
- smartparens-global-mode
- turn-on-smartparens-mode
- turn-off-smartparens-mode
- sp-wrap-cancel
- sp-remove-active-pair-overlay
- sp-splice-sexp-killing-around ;; is aliased to `sp-raise-sexp'
- show-smartparens-mode
- show-smartparens-global-mode
- turn-on-show-smartparens-mode
- turn-off-show-smartparens-mode
- ))
- (do-not-display-with-arg '(
- sp-use-paredit-bindings
- sp-use-smartparens-bindings
- ))
- (commands (cl-loop for i in (cdr (assoc-string (file-truename (locate-library "smartparens")) load-history))
- if (and (consp i) (eq (car i) 'defun) (commandp (cdr i)))
- collect (cdr i))))
- (with-current-buffer (get-buffer-create "*Smartparens cheat sheet*")
- (let ((standard-output (current-buffer))
- (help-xref-following t))
- (read-only-mode -1)
- (erase-buffer)
- (help-mode)
- (smartparens-mode 1)
- (help-setup-xref (list #'sp-cheat-sheet)
- (called-interactively-p 'interactive))
- (read-only-mode -1)
- (--each (--remove (or (memq it do-not-display)
- (and arg (memq it do-not-display-with-arg)))
- commands)
- (unless (equal (symbol-name it) "advice-compilation")
- (let ((start (point)) kill-from)
- (insert (propertize (symbol-name it) 'face 'font-lock-function-name-face))
- (insert " is ")
- (describe-function-1 it)
- (save-excursion
- (when arg
- (goto-char start)
- (forward-paragraph 1)
- (forward-line 1)
- (if (looking-at "^It is bound")
- (forward-paragraph 2)
- (forward-paragraph 1))
- (setq kill-from (point))
- (when (re-search-forward "^Examples:" nil t)
- (delete-region kill-from
- (save-excursion
- (forward-line 1)
- (point))))))
- (insert (propertize (concat
- "\n\n"
- (make-string 72 ?―)
- "\n\n") 'face 'font-lock-function-name-face)))))
- (goto-char (point-min))
- (while (re-search-forward "\\(->\\|​\\)" nil t)
- (let ((thing (bounds-of-thing-at-point 'line)))
- (put-text-property (car thing) (cdr thing) 'face 'font-lock-string-face)))
- (goto-char (point-min))
- (while (re-search-forward "|" nil t)
- (put-text-property (1- (point)) (point) 'face 'font-lock-warning-face))
- (goto-char (point-min))
- (while (re-search-forward "^It is bound to \\(.*?\\)\\." nil t)
- (put-text-property (match-beginning 1) (match-end 1) 'face 'font-lock-keyword-face))
- (goto-char (point-min))
- (while (re-search-forward ";;.*?$" nil t)
- (put-text-property (match-beginning 0) (match-end 0) 'face 'font-lock-comment-face))
- (help-make-xrefs)
- (goto-char (point-min))))
- (pop-to-buffer "*Smartparens cheat sheet*")))
-
-(defun sp-describe-system (starterkit)
- "Describe user's system.
-
-The output of this function can be used in bug reports."
- (interactive
- (list (completing-read "Starterkit/Distribution used: "
- (list
- "Spacemacs"
- "Evil"
- "Vanilla"
- ))))
- (let ((text (format "- `smartparens` version: %s
-- Active `major-mode`: `%s`
-- Smartparens strict mode: %s
-- Emacs version (`M-x emacs-version`): %s
-- Starterkit/Distribution: %s
-- OS: %s"
- (--if-let (cadr (assoc 'smartparens package-alist))
- (package-version-join (package-desc-version it))
- "<Please specify manually>")
- (symbol-name major-mode)
- (bound-and-true-p smartparens-strict-mode)
- (replace-regexp-in-string "\n" "" (emacs-version))
- starterkit
- (symbol-name system-type))))
- (pop-to-buffer
- (with-current-buffer (get-buffer-create "*sp-describe-system*")
- (erase-buffer)
- (insert "The content of the buffer underneath the line was
-copied to your clipboard. You can also edit it in this buffer
-and then copy the results manually.
-------------------------------------------------
-")
- (insert text)
- (current-buffer)))
- (kill-new text)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Variables
-
-(defvar-local sp-forward-bound-fn nil
- "Function to restrict the forward search")
-
-(defvar-local sp-backward-bound-fn nil
- "Function to restrict the backward search")
-
-(defun sp--get-forward-bound ()
- "Get the bound to limit the forward search for looking for pairs.
-
-If it returns nil, the original bound passed to the search
-function will be considered."
- (and sp-forward-bound-fn (funcall sp-forward-bound-fn)))
-
-(defun sp--get-backward-bound ()
- "Get the bound to limit the backward search for looking for pairs.
-
-If it returns nil, the original bound passed to the search
-function will be considered."
- (and sp-backward-bound-fn (funcall sp-backward-bound-fn)))
-
-
-;;;###autoload
-(defvar smartparens-mode-map (make-sparse-keymap)
- "Keymap used for `smartparens-mode'.")
-(defvaralias 'sp-keymap 'smartparens-mode-map)
-(make-obsolete-variable 'sp-keymap 'smartparens-mode-map "2015-01-01")
-
-(defvar sp-paredit-bindings '(
- ("C-M-f" . sp-forward-sexp) ;; navigation
- ("C-M-b" . sp-backward-sexp)
- ("C-M-u" . sp-backward-up-sexp)
- ("C-M-d" . sp-down-sexp)
- ("C-M-p" . sp-backward-down-sexp)
- ("C-M-n" . sp-up-sexp)
- ("M-s" . sp-splice-sexp) ;; depth-changing commands
- ("M-<up>" . sp-splice-sexp-killing-backward)
- ("M-<down>" . sp-splice-sexp-killing-forward)
- ("M-r" . sp-splice-sexp-killing-around)
- ("M-(" . sp-wrap-round)
- ("C-)" . sp-forward-slurp-sexp) ;; barf/slurp
- ("C-<right>" . sp-forward-slurp-sexp)
- ("C-}" . sp-forward-barf-sexp)
- ("C-<left>" . sp-forward-barf-sexp)
- ("C-(" . sp-backward-slurp-sexp)
- ("C-M-<left>" . sp-backward-slurp-sexp)
- ("C-{" . sp-backward-barf-sexp)
- ("C-M-<right>" . sp-backward-barf-sexp)
- ("M-S" . sp-split-sexp) ;; misc
- ("M-j" . sp-join-sexp)
- ("M-?" . sp-convolute-sexp)
- )
- "Paredit inspired bindings.
-
-Alist containing the default paredit bindings to corresponding
-smartparens functions.")
-
-(defun sp--populate-keymap (bindings)
- "Populates the `smartparens-mode-map' from the BINDINGS alist."
- (--each bindings
- (define-key smartparens-mode-map (read-kbd-macro (car it)) (cdr it))))
-
-;;;###autoload
-(defun sp-use-paredit-bindings ()
- "Initiate `smartparens-mode-map' with `sp-paredit-bindings'."
- (interactive)
- (sp--populate-keymap sp-paredit-bindings))
-
-(defvar sp-smartparens-bindings '(
- ("C-M-f" . sp-forward-sexp)
- ("C-M-b" . sp-backward-sexp)
- ("C-M-d" . sp-down-sexp)
- ("C-M-a" . sp-backward-down-sexp)
- ("C-S-d" . sp-beginning-of-sexp)
- ("C-S-a" . sp-end-of-sexp)
- ("C-M-e" . sp-up-sexp)
- ("C-M-u" . sp-backward-up-sexp)
- ("C-M-n" . sp-next-sexp)
- ("C-M-p" . sp-previous-sexp)
- ("C-M-k" . sp-kill-sexp)
- ("C-M-w" . sp-copy-sexp)
- ("M-<delete>" . sp-unwrap-sexp)
- ("M-<backspace>" . sp-backward-unwrap-sexp)
- ("C-<right>" . sp-forward-slurp-sexp)
- ("C-<left>" . sp-forward-barf-sexp)
- ("C-M-<left>" . sp-backward-slurp-sexp)
- ("C-M-<right>" . sp-backward-barf-sexp)
- ("M-D" . sp-splice-sexp)
- ("C-M-<delete>" . sp-splice-sexp-killing-forward)
- ("C-M-<backspace>" . sp-splice-sexp-killing-backward)
- ("C-S-<backspace>" . sp-splice-sexp-killing-around)
- ("C-]" . sp-select-next-thing-exchange)
- ("C-M-]" . sp-select-next-thing)
- ("C-M-SPC" . sp-mark-sexp)
- ("M-F" . sp-forward-symbol)
- ("M-B" . sp-backward-symbol)
- )
- "Alist containing the default smartparens bindings.")
-
-;;;###autoload
-(defun sp-use-smartparens-bindings ()
- "Initiate `smartparens-mode-map' with `sp-smartparens-bindings'."
- (interactive)
- (sp--populate-keymap sp-smartparens-bindings))
-
-(defun sp--set-base-key-bindings (&optional symbol value)
- "Set up the default keymap based on `sp-base-key-bindings'.
-
-SYMBOL is the symbol being set, that is `sp-base-key-bindings'.
-
-VALUE is the saved value (as a symbol), can be one of:
-- sp
-- paredit
-
-This function is also used as a setter for this customize value."
- (when symbol (set-default symbol value))
- (cond
- ((eq value 'sp)
- (sp-use-smartparens-bindings))
- ((eq value 'paredit)
- (sp-use-paredit-bindings))))
-
-(defun sp--update-override-key-bindings (&optional symbol value)
- "Override the key bindings with values from `sp-override-key-bindings'.
-
-SYMBOL is `sp-override-key-bindings', VALUE is the value being set.
-
-This function is also used as a setter for this customize value."
- (when symbol (set-default symbol value))
- ;; this also needs to reload the base set, if any is present.
- (sp--set-base-key-bindings)
- (sp--populate-keymap value))
-
-(defcustom sp-base-key-bindings nil
- "A default set of key bindings for commands provided by smartparens.
-
-Paredit binding adds the bindings in `sp-paredit-bindings' to the
-corresponding smartparens commands. It does not add bindings to
-any other commands, or commands that do not have a paredit
-counterpart.
-
-Smartparens binding adds the bindings in
-`sp-smartparens-bindings' to most common smartparens commands.
-These are somewhat inspired by paredit, but in many cases differ.
-
-Note that neither \"paredit\" nor \"smartparens\" bindings add a
-binding for all the provided commands."
- :type '(radio
- (const :tag "Don't use any default set of bindings" nil)
- (const :tag "Use smartparens set of bindings" sp)
- (const :tag "Use paredit set of bindings" paredit))
- :set 'sp--set-base-key-bindings
- :group 'smartparens)
-
-(defcustom sp-override-key-bindings nil
- "An alist of bindings and commands that should override the base key set.
-
-If you wish to override a binding from the base set, set the
-value for the binding to the `kbd' recognizable string constant
-and command to the command symbol you wish to bind there.
-
-If you wish to disable a binding from the base set, set the value
-for the command to nil.
-
-Examples:
- (\"C-M-f\" . sp-forward-sexp)
- (\"C-<right>\" . nil)
-
-See `sp-base-key-bindings'."
- :type '(alist
- :key-type string
- :value-type symbol)
- :set 'sp--update-override-key-bindings
- :group 'smartparens)
-
-(defvar sp-escape-char nil
- "Character used to escape quotes inside strings.")
-(make-variable-buffer-local 'sp-escape-char)
-
-(defvar sp-comment-char nil
- "Character used to start comments.")
-(make-variable-buffer-local 'sp-comment-char)
-
-(defvar sp-pair-list nil
- "List of pairs for autoinsertion or wrapping.
-
-Maximum length of opening or closing pair is
-`sp-max-pair-length' characters.")
-(make-variable-buffer-local 'sp-pair-list)
-
-(defvar sp-local-pairs nil
- "List of pair definitions used for current buffer.")
-(make-variable-buffer-local 'sp-local-pairs)
-
-(defvar sp-last-operation nil
- "Symbol holding the last successful operation.")
-(make-variable-buffer-local 'sp-last-operation)
-
-(cl-defstruct sp-state
- "Smartparens state for the current buffer."
- ;; A "counter" to track delayed hook. When a pair is inserted, a
- ;; cons of the form (:next . pair) is stored. On the next
- ;; (immediately after insertion) invocation of post-command-hook, it
- ;; is changed to (:this . pair). When the `car' is :this, the
- ;; post-command-hook checks the delayed hooks for `pair' and
- ;; executes them, then reset the "counter".
- delayed-hook
- ;; TODO
- delayed-insertion
- ;; The last point checked by sp--syntax-ppss and its result, used for
- ;; memoization
- last-syntax-ppss-point ;; a list (point point-min point-max)
- last-syntax-ppss-result
- ;; Value of `sp-pair-list' for this buffer. Note that this might
- ;; differ from `sp-pair-list' which is often changed by dynamic
- ;; binding
- pair-list
- ;; Value of `sp-local-pairs' for this buffer. Note that this might
- ;; differ from `sp-local-pairs' which is often changed by dynamic
- ;; binding
- local-pairs
- )
-
-(defvar sp-state (make-sp-state)
- "Smartparens state for the current buffer.")
-(make-variable-buffer-local 'sp-state)
-
-;; TODO: get rid of this
-(defvar sp-previous-point -1
- "Location of point before last command.
-
-This is only updated when some pair-overlay is active. Do not
-rely on the value of this variable anywhere else!")
-(make-variable-buffer-local 'sp-previous-point)
-
-;; TODO: get rid of this
-(defvar sp-wrap-point nil
- "Save the value of point before attemt to wrap a region.
-
-Used for restoring the original state if the wrapping is
-cancelled.")
-(make-variable-buffer-local 'sp-wrap-point)
-
-;; TODO: get rid of this
-(defvar sp-wrap-mark nil
- "Save the value of mark before attemt to wrap a region.
-
-Used for restoring the original state if the wrapping is
-cancelled.")
-(make-variable-buffer-local 'sp-wrap-mark)
-
-(defvar sp-last-inserted-characters ""
- "Characters typed during the wrapping selection.
-
-If wrapping is cancelled, these characters are re-inserted to the
-location of point before the wrapping.")
-(make-variable-buffer-local 'sp-last-inserted-characters)
-
-(defvar sp-last-inserted-pair nil
- "Last inserted pair.")
-(make-variable-buffer-local 'sp-last-inserted-pair)
-
-(defvar sp-delayed-pair nil
- "The pair whose insertion is being delayed.
-
-The insertion of this pair is delayed to be carried out in
-`sp--post-command-hook-handler'. The format is (opening delim
-. beg of the opening delim)")
-(make-variable-buffer-local 'sp-delayed-pair)
-
-(defvar sp-last-wrapped-region nil
- "Information about the last wrapped region.
-The format is the same as returned by `sp-get-sexp'.")
-(make-variable-buffer-local 'sp-last-wrapped-region)
-
-(defvar sp-point-inside-string nil
- "Non-nil if point is inside a string.
-
-Used to remember the state from before `self-insert-command' is
-run.")
-
-(defvar sp-buffer-modified-p nil
- "Non-nil if buffer was modified before `pre-command-hook'.")
-
-(defvar sp-pre-command-point nil
- "Position of `point' before `this-command' gets executed.")
-
-(defconst sp-max-pair-length 10
- "Maximum length of an opening or closing delimiter.
-
-Only the pairs defined by `sp-pair' are considered. Tag pairs
-can be of any length.")
-
-(defconst sp-max-prefix-length 100
- "Maximum length of a pair prefix.
-
-Because prefixes for pairs can be specified using regular
-expressions, they can potentially be of arbitrary length. This
-settings solves the problem where the parser would decide to
-backtrack the entire buffer which would lock up Emacs.")
-
-(defvar sp-pairs
- '((t
- .
- ((:open "\\\\(" :close "\\\\)" :actions (insert wrap autoskip navigate))
- (:open "\\{" :close "\\}" :actions (insert wrap autoskip navigate))
- (:open "\\(" :close "\\)" :actions (insert wrap autoskip navigate))
- (:open "\\\"" :close "\\\"" :actions (insert wrap autoskip navigate))
- (:open "\"" :close "\""
- :actions (insert wrap autoskip navigate escape)
- :unless (sp-in-string-quotes-p)
- :post-handlers (sp-escape-wrapped-region sp-escape-quotes-after-insert))
- (:open "'" :close "'"
- :actions (insert wrap autoskip navigate escape)
- :unless (sp-in-string-quotes-p sp-point-after-word-p)
- :post-handlers (sp-escape-wrapped-region sp-escape-quotes-after-insert))
- (:open "(" :close ")" :actions (insert wrap autoskip navigate))
- (:open "[" :close "]" :actions (insert wrap autoskip navigate))
- (:open "{" :close "}" :actions (insert wrap autoskip navigate))
- (:open "`" :close "`" :actions (insert wrap autoskip navigate)))))
- "List of pair definitions.
-
-Maximum length of opening or closing pair is
-`sp-max-pair-length' characters.")
-
-(defvar sp-tags nil
- "List of tag definitions. See `sp-local-tag' for more information.")
-
-(defvar sp-prefix-tag-object nil
- "If non-nil, only consider tags while searching for next thing.")
-
-(defvar sp-prefix-pair-object nil
- "If non-nil, only consider pairs while searching for next thing.
-
-Pairs are defined as expressions delimited by pairs from
-`sp-pair-list'.")
-
-(defvar sp-prefix-symbol-object nil
- "If non-nil, only consider symbols while searching for next thing.
-
-Symbol is defined as a chunk of text recognized by
-`sp-forward-symbol'.")
-
-(define-obsolete-variable-alias 'sp--lisp-modes 'sp-lisp-modes "2015-11-08")
-
-(defcustom sp-lisp-modes '(
- cider-repl-mode
- clojure-mode
- clojurec-mode
- clojurescript-mode
- clojurex-mode
- common-lisp-mode
- emacs-lisp-mode
- eshell-mode
- geiser-repl-mode
- gerbil-mode
- inf-clojure-mode
- inferior-emacs-lisp-mode
- inferior-lisp-mode
- inferior-scheme-mode
- lisp-interaction-mode
- lisp-mode
- monroe-mode
- racket-mode
- racket-repl-mode
- scheme-interaction-mode
- scheme-mode
- slime-repl-mode
- stumpwm-mode
- )
- "List of Lisp-related modes."
- :type '(repeat symbol)
- :group 'smartparens)
-
-(defcustom sp-clojure-modes '(
- cider-repl-mode
- clojure-mode
- clojurec-mode
- clojurescript-mode
- clojurex-mode
- inf-clojure-mode
- )
- "List of Clojure-related modes."
- :type '(repeat symbol)
- :group 'smartparens)
-
-(defcustom sp-c-modes '(
- c-mode
- c++-mode
- )
- "List of C-related modes."
- :type '(repeat symbol)
- :group 'smartparens)
-
-(defcustom sp-no-reindent-after-kill-modes '(
- python-mode
- coffee-mode
- asm-mode
- makefile-gmake-mode
- haml-mode
- )
- "List of modes that should not reindent after kill."
- :type '(repeat symbol)
- :group 'smartparens)
-
-(defcustom sp-no-reindent-after-kill-indent-line-functions
- '(
- insert-tab
- )
- "List of `indent-line-function's that should not reindent after kill."
- :type '(repeat symbol)
- :group 'smartparens)
-
-(defvar sp--html-modes '(
- sgml-mode
- html-mode
- rhtml-mode
- nxhtml-mode
- nxml-mode
- web-mode
- jinja2-mode
- html-erb-mode
- js-jsx-mode
- js2-jsx-mode
- rjsx-mode
- )
- "List of HTML modes.")
-
-(defvar sp-message-alist
- '((:unmatched-expression
- "Search failed: there is an unmatched expression somewhere or we are at the beginning/end of file"
- "Unmatched expression")
- (:unbalanced-region
- "Can not kill the region: the buffer would end up in an unbalanced state after deleting the active region"
- "Killing the region would make the buffer unbalanced"
- "Unbalanced region")
- (:delimiter-in-string
- "Ignored: opening or closing pair is inside a string or comment and matching pair is outside (or vice versa)")
- (:no-matching-tag
- "Search failed: no matching tag found"
- "No matching tag")
- (:invalid-context-prev
- "Invalid context: previous h-sexp ends after the next one"
- "Invalid context")
- (:invalid-context-cur
- "Invalid context: current h-sexp starts after the next one"
- "Invalid context")
- (:no-structure-found
- "Previous sexp starts after current h-sexp or no structure was found"
- "No valid structure found")
- (:invalid-structure
- "Ignored: this operation would result in invalid structure"
- "Ignored because of invalid structure")
- (:cant-slurp
- "Ignored: we can not slurp without breaking strictly balanced expression"
- "Can not slurp without breaking balance")
- (:cant-slurp-context
- "Ignored: we can not slurp into different context (comment -> code)"
- "Can not slurp into different context")
- (:cant-insert-closing-delimiter
- "We can not insert unbalanced closing delimiter in strict mode"
- "Can not insert unbalanced delimiter")
- (:blank-sexp
- "Point is in blank sexp, nothing to barf"
- "Point is in blank sexp")
- (:point-not-deep-enough
- "Point has to be at least two levels deep to swap the enclosing delimiters"
- "Point has to be at least two levels deep"
- "Point not deep enough")
- (:different-type
- "The expressions to be joined are of different type"
- "Expressions are of different type"))
- "List of predefined messages to be displayed by `sp-message'.
-
-Each element is a list consisting of a keyword and one or more
-strings, which are chosen based on the `sp-message-width'
-variable. If the latter is t, the first string is chosen as
-default, which should be the most verbose option available.")
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Customize & Mode definitions
-
-(defgroup smartparens ()
- "Smartparens minor mode."
- :group 'editing
- :prefix "sp-")
-
-;;;###autoload
-(define-minor-mode smartparens-mode
- "Toggle smartparens mode.
-
-You can enable pre-set bindings by customizing
-`sp-base-key-bindings' variable. The current content of
-`smartparens-mode-map' is:
-
- \\{smartparens-mode-map}"
- :init-value nil
- :lighter (" SP" (:eval (if smartparens-strict-mode "/s" "")))
- :group 'smartparens
- :keymap smartparens-mode-map
- (if smartparens-mode
- (progn
- (sp--init)
- (add-hook 'self-insert-uses-region-functions 'sp-wrap--can-wrap-p nil 'local)
- (run-hooks 'smartparens-enabled-hook))
- (remove-hook 'self-insert-uses-region-functions 'sp-wrap--can-wrap-p 'local)
- (run-hooks 'smartparens-disabled-hook)))
-
-(defvar smartparens-strict-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap delete-char] 'sp-delete-char)
- (define-key map [remap delete-forward-char] 'sp-delete-char)
- (define-key map [remap backward-delete-char-untabify] 'sp-backward-delete-char)
- (define-key map [remap backward-delete-char] 'sp-backward-delete-char)
- (define-key map [remap delete-backward-char] 'sp-backward-delete-char)
- (define-key map [remap kill-word] 'sp-kill-word)
- (define-key map [remap kill-line] 'sp-kill-hybrid-sexp)
- (define-key map [remap backward-kill-word] 'sp-backward-kill-word)
- (define-key map [remap kill-region] 'sp-kill-region)
- (define-key map [remap delete-region] 'sp-delete-region)
- (define-key map [remap kill-whole-line] 'sp-kill-whole-line)
- map)
- "Keymap used for `smartparens-strict-mode'.")
-
-;;;###autoload
-(define-minor-mode smartparens-strict-mode
- "Toggle the strict smartparens mode.
-
-When strict mode is active, `delete-char', `kill-word' and their
-backward variants will skip over the pair delimiters in order to
-keep the structure always valid (the same way as `paredit-mode'
-does). This is accomplished by remapping them to
-`sp-delete-char' and `sp-kill-word'. There is also function
-`sp-kill-symbol' that deletes symbols instead of words, otherwise
-working exactly the same (it is not bound to any key by default).
-
-When strict mode is active, this is indicated with \"/s\"
-after the smartparens indicator in the mode list."
- :init-value nil
- :group 'smartparens
- (if smartparens-strict-mode
- (progn
- (unless smartparens-mode
- (smartparens-mode 1))
- (unless (-find-indices (lambda (it) (eq (car it) 'smartparens-strict-mode)) minor-mode-overriding-map-alist)
- (setq minor-mode-overriding-map-alist
- (cons `(smartparens-strict-mode . ,smartparens-strict-mode-map) minor-mode-overriding-map-alist)))
- (put 'sp-backward-delete-char 'delete-selection 'sp--delete-selection-supersede-p)
- (put 'sp-delete-char 'delete-selection 'sp--delete-selection-supersede-p)
- (add-hook 'self-insert-uses-region-functions 'sp--self-insert-uses-region-strict-p nil 'local)
- (setq sp-autoskip-closing-pair 'always))
- (setq minor-mode-overriding-map-alist
- (-remove (lambda (it) (eq (car it) 'smartparens-strict-mode)) minor-mode-overriding-map-alist))
- (put 'sp-backward-delete-char 'delete-selection 'supersede)
- (put 'sp-delete-char 'delete-selection 'supersede)
- (remove-hook 'self-insert-uses-region-functions 'sp--self-insert-uses-region-strict-p 'local)
- (let ((std-val (car (plist-get (symbol-plist 'sp-autoskip-closing-pair) 'standard-value)))
- (saved-val (car (plist-get (symbol-plist 'sp-autoskip-closing-pair) 'saved-value))))
- (setq sp-autoskip-closing-pair (eval (or saved-val std-val))))))
-
-;;;###autoload
-(define-globalized-minor-mode smartparens-global-strict-mode
- smartparens-strict-mode
- turn-on-smartparens-strict-mode
- :group 'smartparens)
-
-(defcustom sp-ignore-modes-list '(
- minibuffer-inactive-mode
- )
- "Modes where smartparens mode is inactive if allowed globally."
- :type '(repeat symbol)
- :group 'smartparens)
-
-;;;###autoload
-(defun turn-on-smartparens-strict-mode ()
- "Turn on `smartparens-strict-mode'."
- (interactive)
- (unless (or (member major-mode sp-ignore-modes-list)
- (and (not (derived-mode-p 'comint-mode))
- (eq (get major-mode 'mode-class) 'special)))
- (smartparens-strict-mode 1)))
-
-;;;###autoload
-(defun turn-off-smartparens-strict-mode ()
- "Turn off `smartparens-strict-mode'."
- (interactive)
- (smartparens-strict-mode -1))
-
-(defun sp--init ()
- "Initialize the buffer local smartparens state.
-
- This includes pair bindings and other buffer local variables
-that depend on the active `major-mode'."
- (setq sp-state (make-sp-state))
- ;; setup local pair replacements
- (sp--update-local-pairs)
- ;; set the escape char
- (dotimes (char 256)
- (unless sp-escape-char
- (when (= ?\\ (char-syntax char))
- (setq sp-escape-char (string char))))
- (unless sp-comment-char
- (when (= ?< (char-syntax char))
- (setq sp-comment-char (string char))))))
-
-(defun sp--maybe-init ()
- "Initialize the buffer if it is not already initialized.
-
-See `sp--init'."
- (unless sp-pair-list
- (sp--init)))
-
-(defun sp--remove-local-pair (open)
- "Remove OPEN from `sp-local-pairs'."
- (setq sp-local-pairs
- (--remove (equal (plist-get it :open) open)
- sp-local-pairs)))
-
-(defun sp--update-sp-pair-list ()
- "Update `sp-pair-list' according to current value of `sp-local-pairs'."
- (setq sp-pair-list
- (->> sp-local-pairs
- (--map (cons (plist-get it :open) (plist-get it :close)))
- (-sort (lambda (x y) (> (length (car x)) (length (car y))))))))
-
-(defun sp--update-local-pairs ()
- "Update local pairs after change or at mode initialization.
-
-This commands load all the parent major mode definitions and
-merges them into current buffer's `sp-local-pairs'."
- (let ((parent-modes (-fix (lambda (x)
- (--if-let (get (car x) 'derived-mode-parent)
- (cons it x)
- x))
- (list major-mode))))
- ;; Combine all the definitions from the most ancient parent to the
- ;; most recent parent
- (--each parent-modes (sp-update-local-pairs it))))
-
-(defun sp-update-local-pairs (configuration)
- "Update `sp-local-pairs' with CONFIGURATION.
-
-The pairs are only updated in current buffer not in all buffers
-with the same major mode! If you want to update all buffers of
-the specific major-modes use `sp-local-pair'.
-
-CONFIGURATION can be a symbol to be looked up in `sp-pairs' or a
-property list corresponding to the arguments of `sp-local-pair'
-or a list of such property lists."
- (setq sp-local-pairs
- (cond
- ((symbolp configuration)
- (sp--merge-pair-configurations (cdr (assq configuration sp-pairs))))
- ((plist-member configuration :open)
- (sp--merge-pair-configurations (list configuration)))
- (t
- (sp--merge-pair-configurations configuration))))
-
- ;; Keep only those which have non-nil :actions
- (setq sp-local-pairs (--filter (plist-get it :actions) sp-local-pairs))
-
- ;; update the `sp-pair-list'. This is a list only containing
- ;; (open.close) cons pairs for easier querying. We also must order
- ;; it by length of opening delimiter in descending order (first
- ;; value is the longest)
- (sp--update-sp-pair-list)
- (setf (sp-state-local-pairs sp-state) sp-local-pairs)
- (setf (sp-state-pair-list sp-state) sp-pair-list))
-
-(defmacro sp-with-buffers-using-mode (mode &rest body)
- "Execute BODY in every existing buffer using `major-mode' MODE."
- (declare (indent 1))
- `(--each (buffer-list)
- (with-current-buffer it
- (when (derived-mode-p ,mode)
- ,@body))))
-
-(defun sp--update-local-pairs-everywhere (&rest modes)
- "Run `sp--update-local-pairs' in all buffers.
-
-This is necessary to update all the buffer-local definitions. If
-MODES is non-nil, only update buffers with `major-mode' equal to
-MODES."
- (setq modes (-flatten modes))
- (--each (buffer-list)
- (with-current-buffer it
- (when (and smartparens-mode
- (or (not modes)
- (--any? (derived-mode-p it) modes)))
- (sp--update-local-pairs)))))
-
-(defcustom smartparens-enabled-hook nil
- "Called after `smartparens-mode' is turned on."
- :type 'hook
- :group 'smartparens)
-
-(defcustom smartparens-disabled-hook nil
- "Called after `smartparens-mode' is turned off."
- :type 'hook
- :group 'smartparens)
-
-;;;###autoload
-(define-globalized-minor-mode smartparens-global-mode
- smartparens-mode
- turn-on-smartparens-mode)
-
-;;;###autoload
-(defun turn-on-smartparens-mode ()
- "Turn on `smartparens-mode'.
-
-This function is used to turn on `smartparens-global-mode'.
-
-By default `smartparens-global-mode' ignores buffers with
-`mode-class' set to special, but only if they are also not comint
-buffers.
-
-Additionally, buffers on `sp-ignore-modes-list' are ignored.
-
-You can still turn on smartparens in these mode manually (or
-in mode's startup-hook etc.) by calling `smartparens-mode'."
- (interactive)
- (unless (or (member major-mode sp-ignore-modes-list)
- (and (not (derived-mode-p 'comint-mode))
- (eq (get major-mode 'mode-class) 'special)))
- (smartparens-mode t)))
-
-;;;###autoload
-(defun turn-off-smartparens-mode ()
- "Turn off `smartparens-mode'."
- (interactive)
- (smartparens-mode -1))
-
-;; insert custom
-(defcustom sp-autoinsert-pair t
- "If non-nil, autoinsert pairs. See `sp-insert-pair'."
- :type 'boolean
- :group 'smartparens)
-
-;; TODO: remove this in 1.12
-(defcustom sp-autoinsert-quote-if-followed-by-closing-pair nil
- "If non-nil autoinsert quotes when the point is followed by closing delimiter.
-
-This option only changes behaviour of the insertion process if
-point is inside a string. In other words, if string is not
-closed and next character is a closing pair.
-
-For example, in a situation like this:
-
- [\"some text|]
-
-after pressing \", one would probably want to insert the closing
-quote, not a nested pair (\\\"\\\"), to close the string literal
-in the array. To enable such behaviour, set this variable to
-nil.
-
-Note: the values of this varible seem to be backward, i.e. it is
-\"enabled\" when the value is nil. This was an unfortunate
-choice of wording. It is kept this way to preserve backward
-compatibility. The intended meaning is \"insert the pair if
-followed by closing pair?\", t = yes."
- :type 'boolean
- :group 'smartparens)
-(make-obsolete-variable
- 'sp-autoinsert-quote-if-followed-by-closing-pair
- "the option was removed and no longer has any effect." "1.10")
-
-(defcustom sp-autoskip-closing-pair 'always-end
- "Determine the behaviour when skipping closing delimiters.
-
-If t, skip the following closing pair if the expression is
-active (that is right after insertion). This is controlled by
-`sp-cancel-autoskip-on-backward-movement'.
-
-If set to \"always-end\", skip the closing pair even if the
-expression is not active and point is at the end of the
-expression. This only works for expressions with
-single-character delimiters.
-
-If set to \"always\", `sp-up-sexp' is called whenever the closing
-delimiter is typed inside a sexp of the same type. This is the
-paredit-like behaviour. This setting only works for
-single-character delimiters and does not work for string-like
-delimiters.
-
-See `sp-autoskip-opening-pair' for similar setting for
-string-like delimiters.
-
-See also `sp-skip-closing-pair'."
- :type '(radio
- (const :tag "Never skip closing delimiter" nil)
- (const :tag "Skip closing delimiter in active expressions" t)
- (const :tag "Always skip closing delimiter if at the end of sexp" always-end)
- (const :tag "Always skip closing delimiter" always))
- :group 'smartparens)
-(make-variable-buffer-local 'sp-autoskip-closing-pair)
-
-(defcustom sp-autoskip-opening-pair nil
- "Determine the behaviour when skipping opening delimiters.
-
-If non-nil, skip into the following string-like expression
-instead of inserting a new pair."
- :type 'boolean
- :group 'smartparens)
-(make-variable-buffer-local 'sp-autoskip-opening-pair)
-
-;; TODO: rename to reflect what this actually does
-(defcustom sp-cancel-autoskip-on-backward-movement t
- "If non-nil, deactivate the active expression on backward movement.
-
-Note: the name of this variable is a historic coincidence and
-will change in some future release to reflect its real purpose.
-
-See also `sp-skip-closing-pair'."
- :type 'boolean
- :group 'smartparens)
-
-;; delete custom
-(defcustom sp-autodelete-pair t
- "If non-nil, auto delete pairs. See `sp-delete-pair'."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-autodelete-closing-pair t
- "If non-nil, auto delete the whole closing-pair. See `sp-delete-pair'."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-autodelete-opening-pair t
- "If non-nil, auto delete the whole opening-pair. See `sp-delete-pair'."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-undo-pairs-separately nil
- "If non-nil, put an `undo-boundary' before each inserted pair.
-
-Calling undo after smartparens complete a pair will remove only
-the pair before undoing any previous insertion.
-
-WARNING: This option is implemented by hacking the
-`buffer-undo-list'. Turning this option on might have
-irreversible consequences on the buffer's undo information and in
-some cases might remove important information. Usage of package
-`undo-tree' is recommended if you ever need to revert to a state
-unreachable by undo."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-successive-kill-preserve-whitespace 1
- "Control the behaviour of `sp-kill-sexp' on successive kills.
-
-In the description, we consider more than one space
-\"superfluous\", however, newlines are preserved."
- :type '(radio
- (const :tag "Always preserve the whitespace" 0)
- (const :tag "Remove superfluous whitespace after last kill" 1)
- (const :tag "Remove superfluous whitespace after all kills" 2))
- :group 'smartparens)
-
-;; wrap custom
-(defcustom sp-autowrap-region t
- "If non-nil, wrap the active region with pair."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-wrap-show-possible-pairs t
- "If non-nil, show possible pairs which can complete the wrapping."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-autodelete-wrap t
- "If non-nil, autodelete opening and closing pair of most recent wrapping.
-
-Deletion command must be the very first command after the
-insertion, otherwise normal behaviour is applied."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-wrap-repeat-last 1
- "Context in which smartparens repeats the last wrap.
-
-If the last operation was a wrap and we insert another pair at
-the beginning or end of the last wrapped region, repeat the
-wrap on this region with current pair."
- :type '(radio
- (const :tag "Do not repeat wrapping" 0)
- (const :tag "Only repeat if current tag is the same as the last one" 1)
- (const :tag "Always repeat if the point is after the opening/closing delimiter of last wrapped region" 2))
- :group 'smartparens)
-
-(defcustom sp-wrap-entire-symbol nil
- "If non-nil, do NOT wrap the entire symbol, only the part after point.
-
-If set to \"Enable globally\", smart symbol wrapping is active
-everywhere. This is the default option.
-
-If set to \"Disable globally\", smart symbol wrapping is disabled
-everywhere.
-
-Otherwise, a list of major modes where smart symbol wrapping is
-*disabled* can be supplied.
-
-Examples:
-
- foo-ba|r-baz -> (|foo-bar-baz) ;; if enabled
-
- foo-ba|r-baz -> foo-ba(|r-baz) ;; if disabled"
- :type '(choice
- (const :tag "Enable globally" nil)
- (const :tag "Disable globally" globally)
- (repeat :tag "Disable in these major modes" symbol))
- :group 'smartparens)
-
-(defcustom sp-wrap-from-point nil
- "If non-nil, do not wrap from the beginning of next expression but from point.
-
-However, if the point is inside a symbol/word, the entire
-symbol/word is wrapped. To customize this behaviour, see
-variable `sp-wrap-entire-symbol'."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-wrap-respect-direction nil
- "When non-nil respect the wrap direction.
-
-When non-nil, wrapping with opening pair always jumps to the
-beginning of the region and wrapping with closing pair always
-jumps to the end of the region.
-
- |fooM -> [ -> |[foo]M
- Mfoo| -> [ -> |[foo]M
- |fooM -> ] -> M[foo]|
- Mfoo| -> ] -> M[foo]|
-
-When nil, closing pair places the point at the end of the region
-and the opening pair leaves the point at its original
-position (before or after the region).
-
- |fooM -> [ -> [|fooM]
- Mfoo| -> [ -> M[foo]|
- |fooM -> ] -> M[foo]|
- Mfoo| -> ] -> M[foo]|"
- :type 'boolean
- :group 'smartparens)
-
-;; escaping custom
-(defcustom sp-escape-wrapped-region t
- "If non-nil, escape special chars inside the just wrapped region."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-escape-quotes-after-insert t
- "If non-nil, escape string quotes if typed inside string."
- :type 'boolean
- :group 'smartparens)
-
-;; navigation & manip custom
-(defcustom sp-navigate-consider-sgml-tags '(
- html-mode
- )
- "List of modes where sgml tags are considered to be sexps."
- :type '(repeat symbol)
- :group 'smartparens)
-
-
-(defcustom sp-navigate-use-textmode-stringlike-parser '((derived . text-mode))
- "List of modes where textmode stringlike parser is used.
-
-See `sp-get-textmode-stringlike-expression'.
-
-Each element of the list can either be a symbol which is then
-checked against `major-mode', or a cons (derived . PARENT-MODE),
-where PARENT-MODE is checked using `derived-mode-p'."
- :type '(repeat (choice
- (symbol :tag "Major mode")
- (cons :tag "Derived mode"
- (const derived)
- (symbol :tag "Parent major mode name"))))
- :group 'smartparens)
-
-(defcustom sp-navigate-consider-symbols t
- "If non-nil, consider symbols outside balanced expressions as such.
-
-Symbols are recognized by function `sp-forward-symbol'. This
-setting affect all the navigation and manipulation functions
-where it make sense.
-
-Also, special handling of strings is enabled, where the whole
-string delimited with \"\" is considered as one token.
-
-WARNING: This is a legacy setting and changing its value to NIL
-may break many things. It is kept only for backward
-compatibility and will be removed in the next major release."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-navigate-comments-as-sexps t
- "If non-nil, consider comments as sexps in `sp-get-enclosing-sexp'.
-
-If this option is enabled, unbalanced expressions in comments are
-never automatically closed (see `sp-navigate-close-if-unbalanced')."
- :type 'boolean
- :group 'smartparens)
-
-;; TODO: add -alist suffix
-(defcustom sp-navigate-skip-match `(
- (,sp-lisp-modes . sp--elisp-skip-match)
- )
- "Major-mode dependent specifications of skip functions.
-
-Alist where the key is a list of major-modes and the value is a
-function used to skip over matches in `sp-get-paired-expression'.
-This function takes three arguments: the currently matched
-delimiter, beginning of match and end of match. If this function
-returns true, the current match will be skipped.
-
-You can use this to skip over expressions that serve multiple
-functions, such as if/end pair or unary if in Ruby or * in
-markdown when it signifies list item instead of emphasis. If the
-exception is only relevant to one pair, you should rather
-use :skip-match option in `sp-local-pair'."
- :type '(alist
- :key-type (repeat symbol)
- :value-type symbol)
- :group 'smartparens)
-
-(defcustom sp-navigate-reindent-after-up `(
- (interactive
- ,@sp-lisp-modes
- )
- )
- "Modes where sexps should be reindented after `sp-up-sexp'.
-
-The whitespace between the closing delimiter and last \"thing\"
-inside the expression is removed. It works analogically for the
-`sp-backward-up-sexp'.
-
-Note that this also happens when `sp-skip-closing-pair' is
-invoked (usually in strict mode when the closing delimiter is
-typed) as it calls `sp-up-sexp' internally. This behaviour can
-be customized by various settings of `sp-autoskip-closing-pair'
-and `sp-autoskip-opening-pair'.
-
-If the mode is in the list \"interactive\", only reindent the sexp
-if the command was called interactively. This is recommended for
-general use.
-
-If the mode is in the list \"always\", reindend the sexp even if the
-command was called programatically."
- :type '(alist
- :options (interactive always)
- :value-type (repeat symbol))
- :group 'smartparens)
-
-(defcustom sp-navigate-reindent-after-up-in-string t
- "If non-nil, `sp-up-sexp' will reindent inside strings.
-
-If `sp-navigate-reindent-after-up' is enabled and the point is
-inside a string, this setting determines if smartparens should
-reindent the current (string) sexp or not."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-navigate-close-if-unbalanced nil
- "If non-nil, insert the closing pair of the un-matched pair on `sp-up-sexp'.
-
-The closing delimiter is inserted after the symbol at
-point (using `sp-previous-sexp')."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-navigate-interactive-always-progress-point nil
- "Make point always move in the direction of navigation.
-
-If non-nil and the function is called interactively,
-`sp-next-sexp' and `sp-previous-sexp' will always move the point
-to the end/beg of such an expression where the point would end up
-being further in the direction of travel.
-
-Note: this behaviour will become default in release 2.0 and will
-cease to be configurable."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-sexp-prefix nil
- "Alist of `major-mode' specific prefix specification.
-
-Each item is a list with three properties:
-- major mode
-- a constant symbol 'regexp or 'syntax
-- a regexp or a string containing syntax class codes.
-
-If the second argument is 'regexp, the third argument is
-interpreted as a regexp to search backward from the start of an
-expression.
-
-If the second argument is 'syntax, the third argument is
-interpreted as string containing syntax codes that will be
-skipped.
-
-You can also override this property locally for a specific pair
-by specifying its :prefix property."
- :type '(repeat
- (list symbol
- (choice
- (const :tag "Regexp" regexp)
- (const :tag "Syntax class codes" syntax))
- string))
- :group 'smartparens)
-
-(defcustom sp-sexp-suffix nil
- "Alist of `major-mode' specific suffix specification.
-
-Each item is a list with three properties:
-- major mode
-- a constant symbol 'regexp or 'syntax
-- a regexp or a string containing syntax class codes.
-
-If the second argument is 'regexp, the third argument is
-interpreted as a regexp to search forward from the end of an
-expression.
-
-If the second argument is 'syntax, the third argument is
-interpreted as string containing syntax codes that will be
-skipped.
-
-You can also override this property locally for a specific pair
-by specifying its :suffix property."
- :type '(repeat
- (list symbol
- (choice
- (const :tag "Regexp" regexp)
- (const :tag "Syntax class codes" syntax))
- string))
- :group 'smartparens)
-
-(defcustom sp-split-sexp-always-split-as-string t
- "Determine if sexp inside string is split.
-
-If the point is inside a sexp inside a string, the default
-behaviour is now to split the string, such that:
-
- \"foo (|) bar\"
-
-becomes
-
- \"foo (\"|\") bar\"
-
-instead of
-
- \"foo ()|() bar\".
-
-Note: the old default behaviour was the reverse, it would split
-the sexp, but this is hardly ever what you want.
-
-You can add a post-handler on string pair and check for
-'split-string action to add concatenation operators of the
-language you work in (in each `major-mode' you can have a separate
-hook).
-
-For example, in PHP the string concatenation operator is a
-dot (.), so you would add:
-
- (defun my-php-post-split-handler (_ action _)
- (when (eq action 'split-sexp)
- (just-one-space)
- (insert \". . \")
- (backward-char 3)))
-
- (sp-local-pair 'php-mode \"'\" nil
- :post-handlers '(my-php-post-split-handler))
-
-Then
-
- echo 'foo |baz';
-
-results in
-
- echo 'foo' . | . 'baz';"
- :type 'boolean
- :group 'smartparens)
-
-;; hybrid lines
-(defcustom sp-hybrid-kill-excessive-whitespace nil
- "Determine how `sp-kill-hybrid-sexp' kills excessive whitespace.
-
-If non-nil, `sp-kill-hybrid-sexp' will delete all whitespace
-up until next hybrid sexp if the point is at the end of line or
-on a blank line.
-
-When it is set to 'kill, whitespace will be appended to the sexp
-in kill ring."
- :type '(choice
- (const :tag "Delete" t)
- (const :tag "Kill" kill)
- (const :tag "Off" nil))
- :group 'smartparens)
-
-(defcustom sp-hybrid-kill-entire-symbol nil
- "Governs how symbols under point are treated by `sp-kill-hybrid-sexp'.
-
-If t, always kill the symbol under point.
-
-If nil, never kill the entire symbol and only kill the part after point.
-
-If a function, this should be a zero-arg predicate. When it
-returns non-nil value, we should kill from point."
- :type '(radio
- (const :tag "Always kill entire symbol" t)
- (const :tag "Always kill from point" nil)
- (const :tag "Kill from point only inside strings" sp-point-in-string)
- (function :tag "Custom predicate"))
- :group 'smartparens)
-
-(defcustom sp-comment-string nil
- "String that is inserted after calling `sp-comment'.
-
-It is an alist of list of major modes to a string.
-
-The value of `comment-start' is used if the major mode is not found."
- :type '(alist
- :key-type (repeat symbol)
- :value-type string)
- :group 'smartparens)
-
-;; ui custom
-(defcustom sp-highlight-pair-overlay t
- "If non-nil, autoinserted pairs are highlighted while point is inside the pair."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-highlight-wrap-overlay t
- "If non-nil, wrap overlays are highlighted during editing of the wrapping pair."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-highlight-wrap-tag-overlay t
- "If non-nil, wrap tag overlays are highlighted during editing of the wrapping tag pair."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-echo-match-when-invisible t
- "If non-nil, show-smartparens-mode prints the line of the
-matching paren in the echo area if not visible on screen."
- :type 'boolean
- :group 'smartparens)
-
-(defcustom sp-message-width 'frame
- "Length of information and error messages to display.
-
-If set to 'frame (the default), messages are chosen based of the
-frame width. t means chose the default (verbose) message, nil
-means mute. Integers specify the maximum width."
- :type '(choice (const :tag "Fit to frame" frame)
- (const :tag "Verbose" t)
- (const :tag "Mute" nil)
- (integer :tag "Max width"))
- :group 'smartparens)
-
-;; TODO: this should be true by default > then the behaviour is
-;; controlled by subword-mode... and this is a hard override
-(defcustom sp-use-subword nil
- "Override of `subword-mode' killing behaviour.
-
-If non-nill, `sp-kill-word' and `sp-backward-kill-word' only
-kill \"subwords\" when `subword-mode' is active."
- :type 'boolean
- :group 'smartparens)
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Selection mode handling
-
-(defun sp--delete-selection-p ()
- "Return t if `delete-selection-mode' or `cua-delete-selection' is enabled."
- (or (and (boundp 'delete-selection-mode) delete-selection-mode)
- (and (boundp 'cua-delete-selection) cua-delete-selection cua-mode)))
-
-(defun sp--delete-selection-supersede-p ()
- "Decide if the current command should delete the region or not.
-
-This check is used as value of 'delete-selection property on the
-command symbol."
- (if (or (equal current-prefix-arg '(4))
- (sp-region-ok-p (region-beginning) (region-end)))
- 'supersede
- (sp-message :unbalanced-region)
- ;; Since this check runs in the pre-command-hook we can change the
- ;; command to be executed... in this case we set it to ignore
- ;; because we don't want to do anything.
- (setq this-command 'ignore)
- nil))
-
-(defun sp--self-insert-uses-region-strict-p ()
- "Decide if the current `self-insert-command' should be able to
-replace the region.
-
-This check is added to the special hook
-`self-insert-uses-region-functions' which is checked by
-`delete-selection-uses-region-p'."
- (if (or (equal current-prefix-arg '(4))
- (sp-region-ok-p (region-beginning) (region-end)))
- ;; region is OK or we are allowed to replace it, just say nil so
- ;; that delsel handles this
- nil
- ;; in case region is bad we interrupt the insertion
- (setq this-command 'ignore)
- t))
-
-;; TODO: this function was removed from Emacs, we should get rid of
-;; the advice in time.
-(defadvice cua-replace-region (around fix-sp-wrap activate)
- "Fix `sp-wrap' in `cua-selection-mode'."
- (if (sp-wrap--can-wrap-p)
- (cua--fallback)
- ad-do-it))
-
-(defadvice cua-delete-region (around fix-sp-delete-region activate)
- "If `smartparens-strict-mode' is enabled, perform a region
-check before deleting."
- (if smartparens-strict-mode
- (progn
- (unless (or current-prefix-arg
- (sp-region-ok-p (region-beginning) (region-end)))
- (user-error (sp-message :unbalanced-region :return)))
- ad-do-it)
- ad-do-it))
-
-
-
-(cl-eval-when (compile eval load)
- (defun sp--get-substitute (struct list)
- "Only ever call this from sp-get! This function does the
-replacement of all the keywords with actual calls to sp-get."
- (if (listp list)
- (if (eq (car list) 'sp-get)
- list
- (mapcar (lambda (x) (sp--get-substitute struct x))
- (let ((command (car list)))
- (cond
- ((eq command 'sp-do-move-op)
- (let ((argument (make-symbol "--sp-argument--")))
- `(let ((,argument ,(cadr list)))
- (if (< ,argument :beg-prf)
- (progn
- (goto-char :beg-prf)
- (delete-char (+ :op-l :prefix-l))
- (goto-char ,argument)
- (insert :prefix :op))
- (goto-char ,argument)
- (insert :prefix :op)
- (goto-char :beg-prf)
- (delete-char (+ :op-l :prefix-l))))))
- ((eq command 'sp-do-move-cl)
- (let ((argument (make-symbol "--sp-argument--")))
- `(let ((,argument ,(cadr list)))
- (if (> ,argument :end-in)
- (progn
- (goto-char ,argument)
- (insert :cl :suffix)
- (goto-char :end-in)
- (delete-char (+ :cl-l :suffix-l)))
- (goto-char :end-in)
- (delete-char (+ :cl-l :suffix-l))
- (goto-char ,argument)
- (insert :cl :suffix)))))
- ((eq command 'sp-do-del-op)
- `(progn
- (goto-char :beg-prf)
- (delete-char (+ :op-l :prefix-l))))
- ((eq command 'sp-do-del-cl)
- `(progn
- (goto-char :end-in)
- (delete-char (+ :cl-l :suffix-l))))
- ((eq command 'sp-do-put-op)
- `(progn
- (goto-char ,(cadr list))
- (insert :prefix :op)))
- ((eq command 'sp-do-put-cl)
- `(progn
- (goto-char ,(cadr list))
- (insert :cl :suffix)))
- (t list)))))
- (if (keywordp list)
- (sp--get-replace-keyword struct list)
- list)))
-
- (defun sp--get-replace-keyword (struct keyword)
- (cl-case keyword
- ;; point in buffer before the opening delimiter
- (:beg `(plist-get ,struct :beg))
- ;; point in the buffer after the closing delimiter
- (:end `(plist-get ,struct :end))
- ;; point in buffer after the opening delimiter
- (:beg-in `(+ (plist-get ,struct :beg) (length (plist-get ,struct :op))))
- ;; point in buffer before the closing delimiter
- (:end-in `(- (plist-get ,struct :end) (length (plist-get ,struct :cl))))
- ;; point in buffer before the prefix of this expression
- (:beg-prf `(- (plist-get ,struct :beg) (length (plist-get ,struct :prefix))))
- ;; point in the buffer after the suffix of this expression
- (:end-suf `(+ (plist-get ,struct :end) (length (plist-get ,struct :suffix))))
- ;; opening delimiter
- (:op `(plist-get ,struct :op))
- ;; closing delimiter
- (:cl `(plist-get ,struct :cl))
- ;; length of the opening pair
- (:op-l `(length (plist-get ,struct :op)))
- ;; length of the closing pair
- (:cl-l `(length (plist-get ,struct :cl)))
- ;; length of the entire expression, including enclosing
- ;; delimiters and the prefix and suffix
- (:len `(- (plist-get ,struct :end)
- (plist-get ,struct :beg)
- (- (length (plist-get ,struct :prefix)))
- (- (length (plist-get ,struct :suffix)))))
- ;; length of the the pair ignoring the prefix, including delimiters
- (:len-out `(- (plist-get ,struct :end) (plist-get ,struct :beg)))
- ;; length of the pair inside the delimiters
- (:len-in `(- (plist-get ,struct :end)
- (plist-get ,struct :beg)
- (length (plist-get ,struct :op))
- (length (plist-get ,struct :cl))))
- ;; expression prefix
- (:prefix `(plist-get ,struct :prefix))
- ;; expression prefix length
- (:prefix-l `(length (plist-get ,struct :prefix)))
- (:suffix `(plist-get ,struct :suffix))
- (:suffix-l `(length (plist-get ,struct :suffix)))
- ;; combined op/cl and suffix/prefix
- (:opp `(concat (plist-get ,struct :prefix)
- (plist-get ,struct :op)))
- (:opp-l `(+ (length (plist-get ,struct :prefix))
- (length (plist-get ,struct :op))))
- (:cls `(concat (plist-get ,struct :cl)
- (plist-get ,struct :suffix)))
- (:cls-l `(+ (length (plist-get ,struct :cl))
- (length (plist-get ,struct :suffix))))
- (t keyword))))
-
-
-;; TODO: rewrite this in terms of `symbol-macrolet' ??
-(defmacro sp-get (struct &rest forms)
- "Get a property from a structure.
-
-STRUCT is a plist with the format as returned by `sp-get-sexp'.
-Which means this macro also works with `sp-get-symbol',
-`sp-get-string' and `sp-get-thing'.
-
-FORMS is an attribute we want to query. Currently supported
-attributes are:
-
-:beg - point in buffer before the opening delimiter
-:end - point in the buffer after the closing delimiter
-:beg-in - point in buffer after the opening delimiter
-:end-in - point in buffer before the closing delimiter
-:beg-prf - point in buffer before the prefix of this expression
-:end-suf - point in buffer after the suffix of this expression
-:op - opening delimiter
-:cl - closing delimiter
-:op-l - length of the opening pair
-:cl-l - length of the closing pair
-:len - length of the entire expression, including enclosing
- delimiters, the prefix and the suffix
-:len-out - length of the the pair ignoring the prefix and suffix,
- including delimiters
-:len-in - length of the pair inside the delimiters
-:prefix - expression prefix
-:prefix-l - expression prefix length
-:suffix - expression suffix
-:suffix-l - expression suffix length
-
-These special \"functions\" are expanded to do the selected
-action in the context of currently queried pair:
-
-Nullary:
-\(sp-do-del-op) - remove prefix and opening delimiter
-\(sp-do-del-cl) - remove closing delimiter and suffix
-
-Unary:
-\(sp-do-move-op p) - move prefix and opening delimiter to point p
-\(sp-do-move-cl p) - move closing delimiter and suffix to point p
-\(sp-do-put-op p) - put prefix and opening delimiter at point p
-\(sp-do-put-cl p) - put closing delimiter and suffix at point p
-
-In addition to these simple queries and commands, this macro
-understands arbitrary forms where any of the aforementioned
-attributes are used. Therefore, you can for example query for
-\"(+ :op-l :cl-l)\". This query would return the sum of lengths
-of opening and closing delimiter. A query
-\"(concat :prefix :op)\" would return the string containing
-expression prefix and the opening delimiter.
-
-Special care is taken to only evaluate the STRUCT argument once."
- (declare (indent 1)
- (debug (form body)))
- (let ((st (make-symbol "struct")))
- (sp--get-substitute st `(let ((,st ,struct)) ,@forms))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Misc/Utility functions
-
-(defun sp--indent-region (start end &optional column)
- "Call `indent-region' unless `aggressive-indent-mode' is enabled.
-
-START, END and COLUMN are the same as in `indent-region'."
- (unless (bound-and-true-p aggressive-indent-mode)
- ;; Don't issue "Indenting region..." message.
- (cl-letf (((symbol-function 'message) #'ignore))
- (indent-region start end column))))
-
-(defmacro sp-with-modes (arg &rest forms)
- "Add ARG as first argument to each form in FORMS.
-
-This can be used with `sp-local-pair' calls to automatically
-insert the modes."
- (declare (indent 1)
- (debug (form body)))
- (let ((modes (make-symbol "modes")))
- `(let ((,modes ,arg))
- (progn
- ,@(mapcar (lambda (form) (append (list (car form) modes) (cdr form))) forms)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode `((,(concat "("
- (regexp-opt '("sp-with-modes"
- "sp-get"
- "sp-compare-sexps") t)
- "\\_>")
- (1 font-lock-keyword-face))))
-
-(defmacro sp--with-case-sensitive (&rest body)
- "Ensure that searching done within BODY is case-sensitive.
-
-Bind `case-fold-search' to nil if it is not already and avoid the
-bind if it is already. Any function that needs to use any of the
-sp--looking-* functions more than once should wrap them all in
-`sp--with-case-sensitive'."
- (declare (indent 0)
- (debug (body)))
- `(if case-fold-search
- (let ((case-fold-search nil))
- ,@body)
- ,@body))
-
-(defun sp--evil-normal-state-p ()
- "Check to see if the current `evil-state' is in normal mode."
- (and (fboundp 'evil-normal-state-p) (evil-normal-state-p)))
-
-(defun sp--evil-motion-state-p ()
- "Check to see if the current `evil-state' is in motion mode."
- (and (fboundp 'evil-motion-state-p) (evil-motion-state-p)))
-
-(defun sp--evil-visual-state-p ()
- "Check to see if the current `evil-state' is in visual mode."
- (and (fboundp 'evil-visual-state-p) (evil-visual-state-p)))
-
-(defun sp-point-in-blank-line (&optional p)
- "Return non-nil if line at point is blank (whitespace only).
-
-If optional argument P is present test this instead of point."
- (save-excursion
- (when p (goto-char p))
- (beginning-of-line)
- (looking-at "[ \t]*$")))
-
-(defun sp-point-in-blank-sexp (&optional p)
- "Return non-nil if point is inside blank (whitespace only) sexp.
-
-If optional argument P is present test this instead of point.
-
-Warning: it is only safe to call this when point is inside a
-sexp, otherwise the call may be very slow."
- (save-excursion
- (when p (goto-char p))
- (-when-let (enc (sp-get-enclosing-sexp))
- (sp-get enc (string-match-p
- "\\`[ \t\n]*\\'"
- (buffer-substring-no-properties :beg-in :end-in))))))
-
-(defun sp-char-is-escaped-p (&optional point)
- "Test if the char at POINT is escaped or not.
-
-POINT defaults to `point'."
- (setq point (or point (point)))
- (save-match-data
- (when (save-excursion
- (goto-char point)
- (looking-back (concat sp-escape-char sp-escape-char "+") nil t))
- (eq (logand (length (match-string 0)) 1) 1))))
-
-(defun sp--syntax-ppss (&optional p)
- "Memoize the last result of `syntax-ppss'.
-
-P is the point at which we run `syntax-ppss'"
- (let ((p (or p (point)))
- (mem-p (sp-state-last-syntax-ppss-point sp-state)))
- (if (and (eq p (nth 0 mem-p))
- (eq (point-min) (nth 1 mem-p))
- (eq (point-max) (nth 2 mem-p)))
- (sp-state-last-syntax-ppss-result sp-state)
- ;; Add hook to reset memoization if necessary
- (unless (sp-state-last-syntax-ppss-point sp-state)
- (add-hook 'before-change-functions 'sp--reset-memoization t t))
- (setf (sp-state-last-syntax-ppss-point sp-state)
- (list p (point-min) (point-max))
- (sp-state-last-syntax-ppss-result sp-state) (syntax-ppss p)))))
-
-(defun sp-point-in-string (&optional p)
- "Return non-nil if point is inside string or documentation string.
-
-This function actually returns the 3rd element of `syntax-ppss'
-which can be a number if the string is delimited by that
-character or t if the string is delimited by general string
-fences.
-
-If optional argument P is present test this instead of point."
- (ignore-errors
- (save-excursion
- (nth 3 (sp--syntax-ppss p)))))
-
-(defun sp-point-in-comment (&optional p)
- "Return non-nil if point is inside comment.
-
-If optional argument P is present test this instead off point."
- (setq p (or p (point)))
- (ignore-errors
- (save-excursion
- ;; We cannot be in a comment if we are inside a string
- (unless (nth 3 (sp--syntax-ppss p))
- (or (nth 4 (sp--syntax-ppss p))
- ;; this also test opening and closing comment delimiters... we
- ;; need to chack that it is not newline, which is in "comment
- ;; ender" class in elisp-mode, but we just want it to be
- ;; treated as whitespace
- (and (< p (point-max))
- (memq (char-syntax (char-after p)) '(?< ?>))
- (not (eq (char-after p) ?\n)))
- ;; we also need to test the special syntax flag for comment
- ;; starters and enders, because `syntax-ppss' does not yet
- ;; know if we are inside a comment or not (e.g. / can be a
- ;; division or comment starter...).
- (-when-let (s (car (syntax-after p)))
- (or (and (/= 0 (logand (lsh 1 16) s))
- (nth 4 (syntax-ppss (+ p 2))))
- (and (/= 0 (logand (lsh 1 17) s))
- (nth 4 (syntax-ppss (+ p 1))))
- (and (/= 0 (logand (lsh 1 18) s))
- (nth 4 (syntax-ppss (- p 1))))
- (and (/= 0 (logand (lsh 1 19) s))
- (nth 4 (syntax-ppss (- p 2)))))))))))
-
-(defun sp-point-in-string-or-comment (&optional p)
- "Return non-nil if point is inside string, documentation string or a comment.
-
-If optional argument P is present, test this instead of point."
- (or (sp-point-in-string p)
- (sp-point-in-comment p)))
-
-;; TODO: add -p suffix
-(defun sp-point-in-symbol (&optional p)
- "Return non-nil if `point' is inside symbol.
-
-If P is non-nil, interpret it as buffer position and test there.
-
-Point is inside symbol if characters on both sides of the point
-are in either word or symbol class."
- (setq p (or p (point)))
- (save-excursion
- (goto-char p)
- (and (/= 0 (following-char))
- (memq (char-syntax (following-char)) '(?w ?_))
- (memq (char-syntax (preceding-char)) '(?w ?_)))))
-
-(defun sp--single-key-description (event)
- "Return a description of the last EVENT.
-
-Replace all the function key symbols with garbage character (ň).
-
-TODO: fix this!"
- (let ((original (single-key-description event)))
- (cond
- ((string-match-p "<.*?>" original) "ň")
- ((string-match-p "SPC" original) " ")
- (t original))))
-
-;; see https://github.com/Fuco1/smartparens/issues/125#issuecomment-20356176
-(defun sp--current-indentation ()
- "Get the indentation offset of the current line."
- (save-excursion
- (back-to-indentation)
- (current-column)))
-
-(defun sp--calculate-indentation-offset (old-column old-indentation)
- "Calculate correct indentation after re-indent.
-
-OLD-COLUMN is the column before reindent.
-
-OLD-INDENTATION is the indentation depth before reindent."
- (let ((indentation (sp--current-indentation)))
- (cond
- ;; Point was in code, so move it along with the re-indented code
- ((>= old-column old-indentation)
- (+ old-column (- indentation old-indentation)))
- ;; Point was indentation, but would be in code now, so move to
- ;; the beginning of indentation
- ((<= indentation old-column) indentation)
- ;; Point was in indentation, and still is, so leave it there
- (:else old-column))))
-
-(defun sp--back-to-indentation (old-column old-indentation)
- "Set the current column to proper value.
-
-See `sp--keep-indentation'.
-
-OLD-COLUMN is the column before reindent.
-
-OLD-INDENTATION is the indentation depth before reindent."
- (let ((offset (sp--calculate-indentation-offset old-column old-indentation)))
- (move-to-column offset)))
-
-;; TODO: rename to preserve-current-column
-(defmacro sp--keep-indentation (&rest body)
- "Execute BODY and restore the column.
-
-If point was in code move it along if the line is reinvented so
-it is the same distance relative to first code column.
-
-If point was previously in the indentation region but would end
-up in code, move it to the first code column.
-
-If point was in the indentation region and is still there after
-BODY, do nothing."
- (declare (indent 0)
- (debug (body)))
- (let ((c (make-symbol "c"))
- (i (make-symbol "i")))
- `(let ((,c (current-column))
- (,i (sp--current-indentation)))
- ,@body
- (sp--back-to-indentation ,c ,i))))
-
-;; Please contribute these if you come across some!
-(defvar sp--self-insert-commands
- '(self-insert-command
- org-self-insert-command
- LaTeX-insert-left-brace)
- "List of commands that are some sort of `self-insert-command'.
-
-Many modes rebind \"self-inserting\" keys to \"smart\" versions
-which do some additional processing before delegating the
-insertion to `self-insert-command'. Smartparens needs to be able
-to distinguish these to properly handle insertion and reinsertion
-of pairs and wraps.")
-
-;; Please contribute these if you come across some!
-(defvar sp--special-self-insert-commands
- '(
- TeX-insert-dollar
- TeX-insert-quote
- quack-insert-opening-paren
- quack-insert-closing-paren
- quack-insert-opening-bracket
- quack-insert-closing-bracket
- racket-insert-closing-paren
- racket-insert-closing-bracket
- racket-insert-closing-brace
- )
- "List of commands which are handled as if they were `self-insert-command's.
-
-Some modes redefine \"self-inserting\" keys to \"smart\" versions
-which do some additional processing but do _not_ delegate the
-insertion to `self-insert-command', instead inserting via
-`insert'. Smartparens needs to be able to distinguish these to
-properly handle insertion and reinsertion of pairs and wraps.
-
-The `sp--post-self-insert-hook-handler' is called in the
-`post-command-hook' for these commands.")
-
-(defun sp--self-insert-command-p ()
- "Return non-nil if `this-command' is some sort of `self-insert-command'."
- (memq this-command sp--self-insert-commands))
-
-(defun sp--special-self-insert-command-p ()
- "Return non-nil if `this-command' is \"special\" self insert command.
-
-A special self insert command is one that inserts a character but
-does not trigger `post-self-insert-hook'."
- (memq this-command sp--special-self-insert-commands))
-
-(defun sp--signum (x)
- "Return 1 if X is positive, -1 if negative, 0 if zero."
- (cond ((> x 0) 1) ((< x 0) -1) (t 0)))
-
-;; The structure returned by sp-get-sexp is a plist with following properties:
-;;
-;; :beg - point in the buffer before the opening delimiter (ignoring prefix)
-;; :end - point in the buffer after the closing delimiter
-;; :op - opening delimiter
-;; :cl - closing delimiter
-;; :prefix - expression prefix
-;;
-;; This structure should never be accessed directly and should only be
-;; exposed by the sp-get macro. This way, we can later change the
-;; internal representation without much trouble.
-
-(defmacro sp-compare-sexps (a b &optional fun what-a what-b)
- "Return non-nil if the expressions A and B are equal.
-
-Two expressions are equal if their :beg property is the same.
-
-If optional argument FUN is non-nil, it is the comparison
-function.
-
-If optional argument WHAT-A is non-nil, use it as a keyword on
-which to do the comparsion (default to :beg).
-
-If optional argument WHAT-B is non-nil, use it as a keyword on
-which to do the comparsion (default to WHAT-A)."
- (declare (debug (form form &optional functionp keywordp keywordp)))
- (setq fun (or fun 'equal))
- (setq what-a (or what-a :beg))
- (setq what-b (or what-b what-a))
- `(,fun (sp-get ,a ,what-a) (sp-get ,b ,what-b)))
-
-(defun sp-message (key &optional return)
- "Display a message.
-
-KEY is either a string or list of strings, or a keyword,
-in which case the string list is looked up in
-`sp-message-alist'. The string to be displayed is chosen based on
-the `sp-message-width' variable.
-
-If RETURN is non-nil return the string instead of printing it."
- (let ((msgs (cond ((listp key) key)
- ((stringp key) (list key))
- (t (cdr (assq key sp-message-alist))))))
- (when (and msgs sp-message-width)
- (if (eq sp-message-width t)
- (if return (car msgs) (message "%s." (car msgs)))
- (let ((maxlen (if (eq sp-message-width 'frame)
- (frame-width)
- sp-message-width))
- (s nil))
- (dolist (msg msgs)
- (if (and (<= (length msg) maxlen)
- (> (length msg) (length s)))
- (setf s msg)))
- (when s
- (if return s (message "%s." s))))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Adding/removing of pairs/bans/allows etc.
-
-(defun sp--merge-prop (prop new-pair old-pair)
- "Merge a property PROP from NEW-PAIR into OLD-PAIR.
-
-The list OLD-PAIR must not be nil."
- (let ((new-val (plist-get new-pair prop)))
- (cl-case prop
- (:close (plist-put old-pair :close new-val))
- (:prefix (plist-put old-pair :prefix new-val))
- (:suffix (plist-put old-pair :suffix new-val))
- (:skip-match (plist-put old-pair :skip-match new-val))
- (:trigger (plist-put old-pair :trigger new-val))
- (:trigger-wrap (plist-put old-pair :trigger-wrap new-val))
- ((:actions :when :unless :pre-handlers :post-handlers)
- (cl-case (car new-val)
- (:add (plist-put old-pair prop (-union (plist-get old-pair prop) (cdr new-val))))
- (:rem (plist-put old-pair prop (-difference (plist-get old-pair prop) (cdr new-val))))
- (t
- (cond
- ;; this means we have ((:add ...) (:rem ...)) argument
- ((and new-val
- (listp (car new-val))
- (memq (caar new-val) '(:add :rem)))
- (let ((a (assq :add new-val))
- (r (assq :rem new-val)))
- (plist-put old-pair prop (-union (plist-get old-pair prop) (cdr a)))
- (plist-put old-pair prop (-difference (plist-get old-pair prop) (cdr r)))))
- (t
- (plist-put old-pair prop (plist-get new-pair prop))))))))))
-
-(defun sp--merge-pairs (old-pair new-pair)
- "Merge OLD-PAIR and NEW-PAIR.
-This modifies the OLD-PAIR by side effect."
- (let ((ind 0))
- (--each new-pair
- (when (= 0 (% ind 2))
- (sp--merge-prop it new-pair old-pair))
- (setq ind (1+ ind))))
- old-pair)
-
-(defun sp--update-pair (new-pair old-pair)
- "Copy properties from NEW-PAIR to OLD-PAIR.
-
-The list OLD-PAIR must not be nil."
- (let ((ind 0))
- (--each new-pair
- (when (= 0 (% ind 2))
- (when (or (not (plist-get old-pair it))
- ;; HACK: we don't want to overwrite list properties
- ;; that aren't just :add with :add because this
- ;; would break the "idempotency".
- (not (equal '(:add) (plist-get new-pair it))))
- (plist-put old-pair it (plist-get new-pair it))))
- (setq ind (1+ ind))))
- old-pair)
-
-(defun sp--update-pair-list (pair mode)
- "Update the PAIR for major mode MODE.
-
-If this pair is not defined yet for this major mode, add it. If
-this pair is already defined, replace all the properties in the
-old definition with values from PAIR."
- ;; get the structure relevant to mode. t means global setting
- (let ((struct (--first (eq mode (car it)) sp-pairs)))
- (if (not struct)
- (!cons (cons mode (list pair)) sp-pairs)
- ;; this does NOT merge changes, only replace the values at
- ;; properties. Open delimiter works as ID as usual.
- (let ((old-pair (--first (equal (plist-get pair :open)
- (plist-get it :open))
- (cdr struct)))
- (open (plist-get pair :open)))
- (if (not old-pair)
- (progn
- (unless (or (plist-get pair :close)
- (sp--get-pair open (assq t sp-pairs)))
- (error "Pair %s was never defined, please specify closing delimiter in instead of passing `nil'" open))
- (setcdr struct (cons pair (cdr struct))))
- (sp--update-pair pair old-pair)))))
- sp-pairs)
-
-(defun sp--get-pair (open list)
- "Get the pair with id OPEN from list LIST."
- (--first (equal open (plist-get it :open)) list))
-
-(defun sp--get-pair-definition (open list &optional prop)
- "Get the definition of a pair identified by OPEN from list LIST.
-
-If PROP is non-nil, return the value of that property instead."
- (let ((pair (sp--get-pair open list)))
- (if prop
- (cond
- ((eq prop :op-l)
- (length (plist-get pair :open)))
- ((eq prop :cl-l)
- (length (plist-get pair :close)))
- ((eq prop :len)
- (+ (length (plist-get pair :open)) (length (plist-get pair :close))))
- ((eq prop :post-handlers)
- (--filter (not (listp it)) (plist-get pair prop)))
- ((eq prop :post-handlers-cond)
- (--filter (listp it) (plist-get pair :post-handlers)))
- ((eq prop :when)
- (--filter (not (listp it)) (plist-get pair :when)))
- ((eq prop :when-cond)
- (-flatten (-concat (--filter (listp it) (plist-get pair :when)))))
- (t (plist-get pair prop)))
- pair)))
-
-(defun sp-get-pair-definition (open mode &optional prop)
- "Get the definition of pair identified by OPEN.
-
-OPEN is the opening delimiter, MODE is the major mode symbol or t
-for global definition.
-
-If PROP is non-nil, return the value of that property instead."
- (sp--get-pair-definition open (cdr (assq mode sp-pairs)) prop))
-
-(defun sp-get-pair (open &optional prop)
- "Return the definition of pair defined by OPEN in the current buffer.
-
-The value is fetched from `sp-local-pairs'.
-
-If PROP is non-nil, return the value of that property instead."
- (sp--get-pair-definition open sp-local-pairs prop))
-
-(defun sp--merge-pair-configurations (specific &optional current)
- "Merge SPECIFIC pair configuration to the CURRENT configuration.
-
-CURRENT defaults to `sp-local-pairs' if it is non-nil or the
-global definition from `sp-pairs' if `sp-local-pairs' is nil."
- (let* ((global (or current sp-local-pairs (cdr (assq t sp-pairs))))
- (local specific)
- (result nil))
- ;; copy the pairs on global list first. This creates new plists
- ;; so we can modify them without changing the global "template"
- ;; values.
- (dolist (old-pair global)
- (!cons (list :open (plist-get old-pair :open)) result))
-
- ;; merge the global list with result. This basically "deep copy"
- ;; global list. We use `sp--merge-pairs' because it also clones
- ;; the list properties (actions, filters etc.)
- (dolist (new-pair global)
- (let ((old-pair (sp--get-pair (plist-get new-pair :open) result)))
- (sp--merge-pairs old-pair new-pair)))
-
- ;; for each local pair, merge it into the global definition
- (dolist (new-pair local)
- (let ((old-pair (sp--get-pair (plist-get new-pair :open) result)))
- (if old-pair
- (sp--merge-pairs old-pair new-pair)
- ;; pair does not have global definition, simply copy it over
- (!cons
- ;; this "deep copy" the new-pair
- (sp--merge-pairs (list :open (plist-get new-pair :open)) new-pair)
- ;; TODO: remove the nil lists from the definitions
- result))))
- result))
-
-(defun sp-wrap-with-pair (pair)
- "Wrap the following expression with PAIR.
-
-This function is a non-interactive helper. To use this function
-interactively, bind the following lambda to a key:
-
- (lambda (&optional arg) (interactive \"P\") (sp-wrap-with-pair \"(\"))
-
-This lambda accepts the same prefix arguments as
-`sp-select-next-thing'.
-
-If region is active and `use-region-p' returns true, the region
-is wrapped instead. This is useful with selection functions in
-`evil-mode' to wrap regions with pairs."
- (let* ((arg (or current-prefix-arg 1))
- (sel (and (not (use-region-p))
- (sp-select-next-thing-exchange
- arg
- (cond
- ;; point is inside symbol and smart symbol wrapping is disabled
- ((and (sp-point-in-symbol)
- (or (eq sp-wrap-entire-symbol 'globally)
- (memq major-mode sp-wrap-entire-symbol)))
- (point))
- ;; wrap from point, not the start of the next expression
- ((and sp-wrap-from-point
- (not (sp-point-in-symbol)))
- (point))))))
- (active-pair (--first (equal (car it) pair) sp-pair-list))
- (rb (region-beginning))
- (re (region-end)))
- (goto-char re)
- (insert (cdr active-pair))
- (goto-char rb)
- (insert (car active-pair))
- (if (use-region-p)
- (sp--indent-region rb re)
- (sp-get sel (sp--indent-region :beg :end)))))
-
-(cl-defun sp-pair (open
- close
- &key
- trigger
- trigger-wrap
- (actions '(wrap insert autoskip navigate))
- when
- unless
- pre-handlers
- post-handlers
- wrap
- bind
- insert)
- "Add a pair definition.
-
-OPEN is the opening delimiter. Every pair is uniquely determined
-by this string.
-
-CLOSE is the closing delimiter. You can use nil for this
-argument if you are updating an existing definition. In this
-case, the old value is retained.
-
-TRIGGER is an optional trigger for the pair. The pair will be
-inserted if either OPEN or TRIGGER is typed. This is usually
-used as a shortcut for longer pairs or for pairs that can't be
-typed easily.
-
-TRIGGER-WRAP is the same as TRIGGER but used for wrapping.
-
-ACTIONS is a list of actions that smartparens will perform with
-this pair. Possible values are:
-
-- insert - autoinsert the closing pair when opening pair is
- typed.
-- wrap - wrap an active region with the pair defined by opening
- delimiter if this is typed while region is active.
-- autoskip - if the sexp is active or `sp-autoskip-closing-pair' is
- set to 'always, skip over the closing delimiter if user types its
- characters in order.
-- navigate - enable this pair for navigation/highlight and strictness
- checks
-- escape - allow autoescaping of this delimiter in string contexts
-
-If the ACTIONS argument has value :rem, the pair is removed.
-This can be used to remove default pairs you don't want to use.
-For example: (sp-pair \"[\" nil :actions :rem)
-
-WHEN is a list of predicates that test whether the action
-should be performed in current context. The values in the list
-should be names of the predicates (that is symbols, not
-lambdas!). They should accept three arguments: opening
-delimiter (which uniquely determines the pair), action and
-context. The context argument can have values:
-
-- string - if point is inside string.
-- comment - if point is inside comment.
-- code - if point is inside code. This context is only
- recognized in programming modes that define string semantics.
-
-If *any* filter returns t, the action WILL be performed. A number
-of filters are predefined: `sp-point-after-word-p',
-`sp-point-before-word-p', `sp-in-string-p',
-`sp-point-before-eol-p' etc.
-
-When clause also supports a special format for delayed insertion.
-The condition is a list with commands, predicates (with three
-arguments as regular when form) or strings specifying the last
-event. All three types can be combined in one list. The pair
-will be inserted *after* the next command if it matches the any
-command on the list, if the last event matches any string on the
-list or if any predicate returns true. If the pair's :when
-clause contains this special form, it will never be immediately
-inserted and will always test for delayed insertion.
-
-UNLESS is a list of predicates. The conventions are the same as
-for the WHEN list. If *any* filter on this list returns t, the
-action WILL NOT be performed. The predicates in the WHEN list
-are checked first, and if any of them succeeds, the UNLESS list
-is not checked.
-
-Note: the functions on the WHEN/UNLESS lists are also called
-\"filters\" in the documentation.
-
-All the filters are run *after* the trigger character is
-inserted.
-
-PRE-HANDLERS is a list of functions that are called before there
-has been some action caused by this pair. The arguments are the
-same as for filters. Context is relative to the point *before*
-the last inserted character. Because of the nature of the
-wrapping operation, this hook is not called if the action is
-wrapping.
-
-POST-HANDLERS is a list of functions that are called after there
-has been some action caused by this pair. The arguments are the
-same as for filters. Context is relative to current position of
-point *after* the closing pair was inserted.
-
-After a wrapping action, the point might end on either side of
-the wrapped region, depending on the original direction. You can
-use the variable `sp-last-wrapped-region' to retrieve information
-about the wrapped region and position the point to suit your
-needs.
-
-A special syntax for conditional execution of hooks is also
-supported. If the added item is a list (function command1
-command2...), where function is a 3 argument function described
-above and command(s) can be either name of a command or a string
-representing an event. If the last command or event as described
-by `single-key-description' matches any on the list, the hook
-will be executed. This means these hooks are run not after the
-insertion, but after the *next* command is executed.
-
-Example:
- ((lambda (id act con)
- (save-excursion
- (newline))) \"RET\" newline)
-
-This function will move the closing pair on its own line only if
-the next command is `newline' or is triggered by RET. Otherwise
-the pairs stay on the same line.
-
-WRAP is a key binding to which a \"wrapping\" action is bound.
-The key should be in format that is accepted by `kbd'. This
-option binds a lambda form:
-
- `(lambda (&optional arg)
- (interactive \"P\")
- (sp-wrap-with-pair ,OPEN))
-
-to the specified key sequence. The binding is added to global
-keymap. When executed, it wraps ARG (default 1) expressions with
-this pair (like `paredit-wrap-round' and friends). Additionally,
-it accepts the same prefix arguments as `sp-select-next-thing'.
-
-BIND is equivalent to WRAP. It is a legacy setting and will be
-removed soon.
-
-INSERT is a key binding to which an \"insert\" action is bound.
-The key should be in format that is accepted by `kbd'. This is
-achieved by binding a lambda form:
-
- (lambda () (interactive) (sp-insert-pair \"pair-id\"))
-
-to the supplied key, where pair-id is the open delimiter of the
-pair. The binding is added to the global map. You can also bind
-a similar lambda manually. To only bind this in specific major
-modes, use this property on `sp-local-pair' instead."
- (if (eq actions :rem)
- (let ((global-list (assq t sp-pairs)))
- (setcdr global-list (--remove (equal (plist-get it :open) open) (cdr global-list)))
- (--each (buffer-list)
- (with-current-buffer it (sp--remove-local-pair open))))
- (let ((pair nil))
- (setq pair (plist-put pair :open open))
- (when close (plist-put pair :close close))
- (when trigger (plist-put pair :trigger trigger))
- (when trigger-wrap (plist-put pair :trigger-wrap trigger-wrap))
- (dolist (arg `((:actions . ,actions)
- (:when . ,when)
- (:unless . ,unless)
- (:pre-handlers . ,pre-handlers)
- (:post-handlers . ,post-handlers)))
- ;; We only consider "nil" as a proper value if the property
- ;; already exists in the pair. In that case, we will set it to
- ;; nil. This allows for removing properties in global
- ;; definitions.
- (when (or (cdr arg)
- (sp-get-pair-definition open t (car arg)))
- (plist-put pair (car arg) (cdr arg))))
- (sp--update-pair-list pair t))
- (when (or wrap bind) (global-set-key (read-kbd-macro (or wrap bind))
- `(lambda (&optional arg)
- (interactive "P")
- (sp-wrap-with-pair ,open))))
- (when insert (global-set-key (kbd insert) `(lambda () (interactive) (sp-insert-pair ,open)))))
- (sp--update-local-pairs-everywhere)
- sp-pairs)
-
-(cl-defun sp-local-pair (modes
- open
- close
- &key
- trigger
- trigger-wrap
- (actions '(:add))
- (when '(:add))
- (unless '(:add))
- (pre-handlers '(:add))
- (post-handlers '(:add))
- wrap
- bind
- insert
- prefix
- suffix
- skip-match)
- "Add a local pair definition or override a global definition.
-
-MODES can be a single mode or a list of modes where these settings
-should be applied.
-
-PREFIX is a regular expression matching an optional prefix for
-this pair in the specified major modes. If not specified, the
-characters of expression prefix syntax class are automatically
-considered instead. This can be used to attach custom prefixes
-to pairs, such as prefix \"\\function\" in \\function{arg} in
-`LaTeX-mode'.
-
-SUFFIX is a regular expression matching an optional suffix for
-this pair in the specified major modes. If not specified, the
-characters of punctuation syntax class are automatically
-considered instead.
-
-The rest of the arguments have same semantics as in `sp-pair'.
-
-If the pair is not defined globally, ACTIONS defaults to (wrap
-insert) instead of (:add) (which inherits global settings)
-
-The pairs are uniquely identified by the opening delimiter. If you
-replace the closing one with a different string in the local
-definition, this will override the global closing delimiter.
-
-The list arguments can optionally be of form starting with
-\":add\" or \":rem\" when these mean \"add to the global list\"
-and \"remove from the global list\" respectively. Otherwise,
-the global list is replaced. If you wish to both add and remove
-things with single call, use \"((:add ...) (:rem ...))\" as an
-argument. Therefore,
-
- :when '(:add my-test)
-
-would mean \"use the global settings for this pair, but also this
-additional test\". If no value is provided for list arguments,
-they default to \"(:add)\" which means they inherit the list from
-the global definition.
-
-To disable a pair in a major mode, simply set its actions set to
-nil. This will ensure the pair is not even loaded when the mode is
-activated.
-
-If WRAP is non-nil, the binding is added into major mode keymap
-called \"foo-mode-map\". If the mode does not follow this
-convention, you will need to bind the function manually (see
-`sp-pair' to how the function is named for each particular pair).
-The bindings are not added into `smartparens-mode-map' to prevent
-clashes between different modes.
-
-BIND is equivalent to WRAP. It is a legacy setting and will be
-removed soon.
-
-The binding for INSERT follows the same convention as BIND. See
-`sp-pair' for more info.
-
-You can provide a function SKIP-MATCH, that will take three
-arguments: the currently matched delimiter, beginning of match
-and end of match. If this function returns true, the
-`sp-get-paired-expression' matcher will ignore this match. You
-can use this to skip over expressions that serve multiple
-functions, such as if/end pair or unary if in Ruby or * in
-markdown when it signifies list item instead of emphasis. In
-addition, there is a global per major-mode option, see
-`sp-navigate-skip-match'."
- (if (eq actions :rem)
- (dolist (m (-flatten (list modes)))
- (let ((mode-pairs (assq m sp-pairs)))
- (setcdr mode-pairs
- (--remove (equal (plist-get it :open) open)
- (cdr mode-pairs))))
- (sp-with-buffers-using-mode m
- (sp--remove-local-pair open)))
- (dolist (m (-flatten (list modes)))
- (let* ((pair nil))
- (setq pair (plist-put pair :open open))
- (when close (plist-put pair :close close))
- (when trigger (plist-put pair :trigger trigger))
- (when trigger-wrap (plist-put pair :trigger-wrap trigger-wrap))
- (when prefix (plist-put pair :prefix prefix))
- (when suffix (plist-put pair :suffix suffix))
- (when skip-match (plist-put pair :skip-match skip-match))
- (when (and (not (sp-get-pair-definition open t))
- (equal actions '(:add)))
- (setq actions '(wrap insert autoskip navigate)))
- (plist-put pair :actions actions)
- (plist-put pair :when when)
- (plist-put pair :unless unless)
- (plist-put pair :pre-handlers pre-handlers)
- (plist-put pair :post-handlers post-handlers)
- (sp--update-pair-list pair m)
- (-when-let* ((symbol (intern (concat (symbol-name m) "-map")))
- (map (and (boundp symbol) (symbol-value symbol))))
- (when (or wrap bind) (define-key map
- (read-kbd-macro (or wrap bind))
- `(lambda (&optional arg)
- (interactive "P")
- (sp-wrap-with-pair ,open))))
- (when insert (define-key map
- (kbd insert)
- `(lambda () (interactive) (sp-insert-pair ,open))))))))
- (sp--update-local-pairs-everywhere (-flatten (list modes)))
- sp-pairs)
-
-(cl-defun sp-local-tag (modes trig open close &key
- (transform 'identity)
- (actions '(wrap insert))
- post-handlers)
- "Add a tag definition.
-
-MODES is a mode or a list of modes where this tag should
-activate. It is impossible to define global tags.
-
-TRIG is the trigger sequence. It can be a string of any length.
-If more triggers share a common prefix, the shortest trigger is
-executed.
-
-OPEN is the format of the opening tag. This is inserted before
-the active region.
-
-CLOSE is the format of the closing tag. This is inserted after
-the active region.
-
-Opening and closing tags can optionally contain the _ character.
-
-If the opening tag contains the _ character, after you type the
-trigger, the region is wrapped with \"skeleton\" tags and a
-special tag editing mode is entered. The text you now type is
-substituted for the _ character in the opening tag.
-
-If the closing tag contains the _ character, the text from the
-opening pair is mirrored to the closing pair and substituted for
-the _ character.
-
-TRANSFORM is a function name (symbol) that is called to perform a
-transformation of the opening tag text before this is inserted to
-the closing tag. For example, in html tag it might simply select
-the name of the tag and cut off the tag attributes (like
-class/style etc.). Defaults to identity.
-
-ACTIONS is a list of actions this tag should support. Currently,
-only \"wrap\" action is supported. Usually, you don't need to
-specify this argument.
-
-POST-HANDLERS is a list of functions that are called after the
-tag is inserted. If the tag does contain the _ character, these
-functions are called after the tag editing mode is exited. Each
-function on this list should accept two arguments: the trigger
-string and the action."
- (dolist (mode (-flatten (list modes)))
- (let* ((tag-list (assq mode sp-tags))
- (tag (--first (equal trig (plist-get it :trigger)) (cdr tag-list)))
- (new-tag nil))
- (setq new-tag (plist-put new-tag :trigger trig))
- (plist-put new-tag :open open)
- (plist-put new-tag :close close)
- (when transform (plist-put new-tag :transform transform))
- (when actions (plist-put new-tag :actions actions))
- (when post-handlers (plist-put new-tag :post-handlers post-handlers))
- (if tag-list
- (if (not actions)
- (setcdr tag-list (--remove (equal trig (plist-get it :trigger)) (cdr tag-list)))
- (if (not tag)
- (setcdr tag-list (cons new-tag (cdr tag-list)))
- (sp--update-pair new-tag tag)))
- ;; mode doesn't exist
- (when actions
- (!cons (cons mode (list new-tag)) sp-tags))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Overlay management
-
-;; burlywood4
-(defface sp-pair-overlay-face
- '((t (:inherit highlight)))
- "The face used to highlight pair overlays."
- :group 'smartparens)
-
-(defface sp-wrap-overlay-face
- '((t (:inherit sp-pair-overlay-face)))
- "The face used to highlight wrap overlays.
-
-When the user wraps a region with multi-character pair a special
-insertion mode is entered. This face is used for the overlays
-where the possible wrappings are displayed.
-
-The opening and closing delimiters use
-`sp-wrap-overlay-opening-pair' and `sp-wrap-overlay-closing-pair'
-respectively."
- :group 'smartparens)
-
-(defface sp-wrap-overlay-opening-pair
- '((t (:inherit sp-wrap-overlay-face
- :foreground "green")))
- "The face used to highlight opening pairs for wrapping.
-
-See `sp-wrap-overlay-face'."
- :group 'smartparens)
-
-(defface sp-wrap-overlay-closing-pair
- '((t (:inherit sp-wrap-overlay-face
- :foreground "red")))
- "The face used to highlight closing pairs for wrapping.
-
-See `sp-wrap-overlay-face'."
- :group 'smartparens)
-
-(defface sp-wrap-tag-overlay-face
- '((t (:inherit sp-pair-overlay-face)))
- "The face used to highlight wrap tag overlays."
- :group 'smartparens)
-
-(defvar sp-pair-overlay-list '()
- "List of overlays used for tracking inserted pairs.
-
-When a pair is inserted, an overlay is created over it. When the
-user starts typing the closing pair we will not insert it again.
-If user leaves the overlay, it is canceled and the insertion
-works again as usual.")
-(make-variable-buffer-local 'sp-pair-overlay-list)
-
-(defvar sp-wrap-overlays nil
- "Cons pair of wrap overlays.")
-(make-variable-buffer-local 'sp-wrap-overlays)
-
-(defvar sp-wrap-tag-overlays nil
- "Cons pair of tag wrap overlays.")
-(make-variable-buffer-local 'sp-wrap-tag-overlays)
-
-(defvar sp-pair-overlay-keymap (make-sparse-keymap)
- "Keymap for the pair overlays.")
-(define-key sp-pair-overlay-keymap (kbd "C-g")
- '(menu-item nil sp-remove-active-pair-overlay :filter
- (lambda (cmd)
- (unless (bound-and-true-p company-my-keymap)
- cmd))))
-
-(defvar sp-wrap-overlay-keymap (make-sparse-keymap)
- "Keymap for the wrap overlays.")
-(define-key sp-wrap-overlay-keymap (kbd "C-g") 'sp-wrap-cancel)
-
-(defun sp--overlays-at (&optional pos)
- "Wrapper around `overlays-at' to get smartparens overlays.
-
-POS is the same as for `overlays-at'.
-
-Smartparens functions must use this function instead of
-`overlays-at' directly."
- ;; TODO: we should probably also check the returned value
- (--filter (overlay-get it 'type) (overlays-at (or pos (point)))))
-
-(defun sp--point-in-overlay-p (overlay)
- "Return t if point is in OVERLAY."
- (and (< (point) (overlay-end overlay))
- (> (point) (overlay-start overlay))))
-
-(defun sp--get-overlay-length (overlay)
- "Compute the length of OVERLAY."
- (- (overlay-end overlay) (overlay-start overlay)))
-
-(defun sp--get-active-overlay (&optional type)
- "Get active overlay.
-
-Active overlay is the shortest overlay at point. Optional
-argument TYPE restrict overlays to only those with given type."
- (let ((overlays (sp--overlays-at)))
- (when type
- (setq overlays (--filter (eq (overlay-get it 'type) type) overlays)))
- (cond
- ((not overlays) nil)
- ((not (cdr overlays)) (car overlays))
- (t
- (--reduce (if (< (sp--get-overlay-length it) (sp--get-overlay-length acc)) it acc) overlays)))))
-
-(defun sp--pair-overlay-create (start end id)
- "Create an overlay over the currently inserted pair.
-
-This overlay is used for tracking the position of the point and
-marks the active expression. START and END are the boundaries of
-the overlay, ID is the id of the pair."
- (let ((overlay (make-overlay start end)))
- ;; set priority to 99 so that yasnippet with 100 overloads the
- ;; keymap #625
- (overlay-put overlay 'priority 99)
- (overlay-put overlay 'keymap sp-pair-overlay-keymap)
- (overlay-put overlay 'pair-id id)
- (overlay-put overlay 'type 'pair)
- (!cons overlay sp-pair-overlay-list)
- (sp--pair-overlay-fix-highlight)
- (add-hook 'post-command-hook 'sp--pair-overlay-post-command-handler nil t)))
-
-(defun sp-wrap-cancel ()
- "Cancel the active wrapping."
- (interactive)
- (unwind-protect
- (-let (((obeg . oend) sp-wrap-overlays))
- (when (and (not (called-interactively-p 'any))
- (sp--delete-selection-p))
- (kill-region (overlay-end obeg) (overlay-start oend)))
- (delete-region (overlay-start oend) (overlay-end oend))
- (when (> sp-wrap-point sp-wrap-mark)
- (let ((beg (delete-and-extract-region (overlay-start obeg) (overlay-end obeg))))
- (goto-char (overlay-start oend))
- (insert beg))))
- (sp-wrap--clean-overlays)))
-
-(defun sp-wrap--clean-overlays ()
- "Delete wrap overlays."
- (-let [(obeg . oend) sp-wrap-overlays]
- (delete-overlay obeg)
- (delete-overlay oend)
- (setq sp-wrap-overlays nil)))
-
-(defun sp--pair-overlay-fix-highlight ()
- "Fix highlighting of the pair overlays.
-
-Only the active overlay should be highlighted."
- (--each (sp--overlays-at) (overlay-put it 'face nil))
- (let* ((active (sp--get-active-overlay))
- (type (and active (overlay-get active 'type))))
- (if active
- (cond
- ((eq 'wrap-tag type)
- (when sp-highlight-wrap-tag-overlay
- (overlay-put active 'face 'sp-wrap-tag-overlay-face)))
- ((eq 'pair type)
- (when sp-highlight-pair-overlay
- (overlay-put active 'face 'sp-pair-overlay-face))))
- ;; edge case where we're at the end of active overlay. If
- ;; there is a wrap-tag overlay, restore it's face
- (when sp-wrap-tag-overlays
- (overlay-put (car sp-wrap-tag-overlays) 'face 'sp-wrap-tag-overlay-face)))))
-
-(defun sp--pair-overlay-post-command-handler ()
- "Remove all invalid pair overlays.
-
-An invalid overlay is one that doesn't have point inside it or
-is of zero length.
-
-Also remove all pair overlays if point moved backwards and
-`sp-cancel-autoskip-on-backward-movement' is non-nil."
- ;; if the point moved backwards, remove all overlays
- (if (and sp-cancel-autoskip-on-backward-movement
- (< (point) sp-previous-point))
- (dolist (o sp-pair-overlay-list) (sp--remove-overlay o))
- ;; else only remove the overlays where point is outside them or
- ;; their length is zero
- (dolist (o (--remove (and (sp--point-in-overlay-p it)
- (> (sp--get-overlay-length it) 0))
- sp-pair-overlay-list))
- (sp--remove-overlay o)))
- (when sp-pair-overlay-list
- (setq sp-previous-point (point))))
-
-(defun sp--reset-memoization (&rest ignored)
- "Reset memoization as a safety precaution.
-
-IGNORED is a dummy argument used to eat up arguments passed from
-the hook where this is executed."
- (setf (sp-state-last-syntax-ppss-point sp-state) nil
- (sp-state-last-syntax-ppss-result sp-state) nil))
-
-(defun sp-remove-active-pair-overlay ()
- "Deactivate the active overlay. See `sp--get-active-overlay'."
- (interactive)
- (-when-let (active-overlay (sp--get-active-overlay 'pair))
- (sp--remove-overlay active-overlay)))
-
-(defun sp--remove-overlay (overlay)
- "Remove OVERLAY."
- ;; if it's not a pair overlay, nothing happens here anyway
- (setq sp-pair-overlay-list (--remove (equal it overlay) sp-pair-overlay-list))
- ;; if we have zero pair overlays, remove the post-command hook
- (when (not sp-pair-overlay-list)
- (remove-hook 'post-command-hook 'sp--pair-overlay-post-command-handler t)
- ;; this is only updated when sp--pair-overlay-post-command-handler
- ;; is active. Therefore, we need to reset this to 1. If not, newly
- ;; created overlay could be removed right after creation - if
- ;; sp-previous-point was greater than actual point
- (setq sp-previous-point -1))
- (delete-overlay overlay)
- (sp--pair-overlay-fix-highlight))
-
-(defun sp--replace-overlay-text (o string)
- "Replace text inside overlay O with STRING."
- (save-excursion
- (goto-char (overlay-start o))
- (insert string)
- (delete-region (point) (overlay-end o))))
-
-(defun sp--get-overlay-text (o)
- "Get text inside overlay O."
- (buffer-substring (overlay-start o) (overlay-end o)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Action predicates
-
-(defun sp-in-string-p (_id _action context)
- "Return t if point is inside string or comment, nil otherwise."
- (eq context 'string))
-
-(defun sp-in-string-quotes-p (_id action context)
- "Special string test for quotes.
-
-On insert action, test the string context one character back from
-point. Return nil at `bobp'.
-
-On escape action use the value of CONTEXT."
- (cond
- ((eq action 'insert)
- (if (bobp) nil
- (save-excursion (backward-char 1) (sp-point-in-string))))
- ((eq action 'escape)
- (eq context 'string))))
-
-(defun sp-in-docstring-p (_id _action context)
- "Return t if point is inside elisp docstring, nil otherwise."
- (and (eq context 'string)
- (save-excursion
- (--when-let (car (sp-get-quoted-string-bounds))
- (goto-char it)
- (ignore-errors (backward-sexp 3))
- (looking-at-p (regexp-opt '("defun" "defmacro"
- "cl-defun" "cl-defmacro"
- "defun*" "defmacro*"
- "lambda" "-lambda")))))))
-
-(defun sp-in-code-p (_id _action context)
- "Return t if point is inside code, nil otherwise."
- (eq context 'code))
-
-(defun sp-in-comment-p (_id _action context)
- "Return t if point is inside comment, nil otherwise."
- (eq context 'comment))
-
-(defun sp-in-math-p (_id _action _context)
- "Return t if point is inside code, nil otherwise."
- (when (functionp 'texmathp)
- (texmathp)))
-
-(defun sp-point-before-eol-p (_id action _context)
- "Return t if point is followed by optional white spaces and end of line, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-at-p "\\s-*$")))
-
-(defun sp-point-after-bol-p (id action _context)
- "Return t if point follows beginning of line and possibly white spaces, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-back-p (concat "^\\s-*" (regexp-quote id)))))
-
-(defun sp-point-at-bol-p (id action _context)
- "Return t if point is at the beginning of line, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-back-p (concat "^" (regexp-quote id)))))
-
-(defun sp-point-before-symbol-p (_id action _context)
- "Return t if point is followed by a symbol, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-at-p "\\s_")))
-
-(defun sp-point-before-word-p (_id action _context)
- "Return t if point is followed by a word, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-at-p "\\sw\\|\\s_")))
-
-(defun sp-point-after-word-p (id action _context)
- "Return t if point is after a word, nil otherwise.
-This predicate is only tested on \"insert\" action."
- ;; TODO: remove condition with sp-defpair
- (when (memq action '(insert escape))
- (sp--looking-back-p (concat "\\(\\sw\\|\\s_\\)" (regexp-quote id)))))
-
-(defun sp-point-before-same-p (id action _context)
- "Return t if point is followed by ID, nil otherwise.
-This predicate is only tested on \"insert\" action."
- (when (eq action 'insert)
- (sp--looking-at-p (regexp-quote id))))
-
-(defun sp-point-in-empty-line-p (id _action _context)
- "Return t if point is on an empty line, nil otherwise."
- (and (sp--looking-at-p "\\s-*$")
- (sp--looking-back-p (concat "^\\s-*" (regexp-quote id)))))
-
-(defun sp-char-escaped-p (_id action _context)
- "Return non-nil if character before point is escaped with \\."
- (when (eq action 'insert)
- (save-excursion
- (backward-char 1)
- (looking-back "\\\\" 1))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Pair insertion/deletion/skipping
-
-(defun sp--do-action-p (id action &optional use-inside-string)
- "Return t if pair ID can perform ACTION.
-
-If ACTION is a list, return t if at least one action from the
-list can be performed.
-
-If USE-INSIDE-STRING is non-nil, use value of
-`sp-point-inside-string' instead of testing with
-`sp-point-in-string-or-comment'."
- (setq action (-flatten (list action)))
- (let* ((actions (sp-get-pair id :actions))
- (when-l (sp-get-pair id :when))
- (unless-l (sp-get-pair id :unless))
- (in-string (if use-inside-string
- sp-point-inside-string
- (sp-point-in-string)))
- (context (cond
- (in-string 'string)
- ((sp-point-in-comment) 'comment)
- (t 'code)))
- a r)
- (while (and action (not r))
- (setq a (car action))
- (setq r (when (memq a actions)
- ;;(and (when-clause) (not (unless-clause)))
- (and (or (not when-l)
- (--some (funcall it id a context) when-l))
- (or (not unless-l)
- (not (--some (funcall it id a context) unless-l))))))
- (!cdr action))
- r))
-
-(defun sp--get-handler-context (type)
- "Return the context constant. TYPE is type of the handler."
- (let ((in-string (cl-case type
- (:pre-handlers
- (save-excursion
- (unless (bobp) (backward-char 1))
- (sp-point-in-string-or-comment)))
- (:post-handlers
- (sp-point-in-string-or-comment)))))
- (if in-string 'string 'code)))
-
-(defun sp--get-context (&optional point in-string in-comment)
- "Return the context of POINT.
-
-If the optional arguments IN-STRING or IN-COMMENT non-nil, their
-value is used instead of a test."
- (save-excursion
- (goto-char (or point (point)))
- (cond
- ((or in-string (sp-point-in-string)) 'string)
- ((or in-comment (sp-point-in-comment)) 'comment)
- (t 'code))))
-
-(defun sp--parse-insertion-spec (fun)
- "Parse the insertion specification FUN and return a form to evaluate."
- (let ((spec nil)
- (after nil)
- (last 1))
- (cl-labels ((push-non-empty
- (what)
- (unless (equal (cadr what) "")
- (push what spec))))
- (with-temp-buffer
- (insert fun)
- (goto-char (point-min))
- (while (re-search-forward "\\(|\\|\\[\\)" nil t)
- (cond
- ((equal (match-string 0) "[")
- (if (save-excursion (backward-char 1) (eq (preceding-char) 92))
- (push-non-empty `(insert ,(concat (buffer-substring-no-properties last (- (point) 2)) "[")))
- (push-non-empty `(insert ,(buffer-substring-no-properties last (1- (point)))))
- (let* ((p (point))
- (fun-end (progn
- (re-search-forward "]" nil t)
- (1- (point))))
- (fun-spec (buffer-substring-no-properties p fun-end))
- (instruction (cond
- ((equal fun-spec "i")
- '(indent-according-to-mode))
- ((equal (aref fun-spec 0) ?d)
- `(delete-char ,(string-to-number (substring fun-spec 1)))))))
- (when instruction (push instruction spec)))))
- ((equal (match-string 0) "|")
- (cond
- ((save-excursion (backward-char 1) (eq (preceding-char) 92))
- (push-non-empty `(insert ,(concat (buffer-substring-no-properties last (- (point) 2)) "|"))))
- (t
- (push-non-empty `(insert ,(buffer-substring-no-properties last (1- (point)))))
- (push 'save-excursion spec)
- (when (eq (following-char) 124)
- (forward-char 1)
- (setq after '(indent-according-to-mode)))))))
- (setq last (point)))
- (push-non-empty `(insert ,(buffer-substring-no-properties last (point-max)))))
- (let* ((specr (nreverse spec))
- (specsplit (--split-with (not (eq it 'save-excursion)) specr))
- (re (-concat (car specsplit) (if (cadr specsplit) (cdr specsplit) nil))))
- (cons 'progn (if after (-snoc re after) re))))))
-
-(defun sp--run-function-or-insertion (fun id action context)
- "Run a function or insertion.
-
-If FUN is a function, call it with `funcall' with ID, ACTION and
-CONTEXT as arguments.
-
-If FUN is a string, interpret it as \"insertion specification\",
-see `sp-pair' for description."
- (cond
- ((functionp fun)
- (funcall fun id action context))
- ((stringp fun)
- (eval (sp--parse-insertion-spec fun)))))
-
-
-(defvar sp-handler-context nil
- "Special variable holding context during handler execution.")
-
-;; TODO: get rid of `sp-handler-context' and make all the handlers (we
-;; should call them hooks) take better arguments, what we pass now is
-;; useless almost always
-(defun sp--run-hook-with-args (id type action &optional context-values)
- "Run all the hooks for pair ID of type TYPE on action ACTION.
-
-CONTEXT-VALUES is a plist with arbitrary values (depending on the
-action). A dynamic varable `sp-handler-context' will be bound to
-this value during execution of the handler."
- (ignore-errors
- (let ((hook (sp-get-pair id type))
- (context (sp--get-handler-context type)))
- (if hook
- (let ((sp-handler-context context-values))
- (--each hook (sp--run-function-or-insertion it id action context)))
- (run-hook-with-args 'tag-hook id action context)))))
-
-;; TODO: add a test for a symbol property that would tell this handler
-;; not to re=set `sp-last-operation'. Useful for example in "macro
-;; functions" like `my-wrap-with-paren'.
-(defun sp--post-command-hook-handler ()
- "Handle the situation after some command has executed."
- (sp--with-case-sensitive
- (when (sp--special-self-insert-command-p)
- (sp--post-self-insert-hook-handler))
- (ignore-errors
- (when smartparens-mode
- ;; handle the wrap overlays
- (when sp-wrap-overlays
- (let* ((overlay (car sp-wrap-overlays))
- (start (overlay-start overlay))
- (end (overlay-end overlay))
- (p (point)))
- (when (or (< p sp-previous-point)
- (> p end)
- (< p start))
- (sp-wrap-cancel))))
- (when sp-wrap-overlays
- (setq sp-previous-point (point)))
-
- ;; Here we run the delayed hooks. See issue #80
- (cond
- ((eq (car-safe (sp-state-delayed-hook sp-state)) :next)
- (setf (car (sp-state-delayed-hook sp-state)) :this))
- ((eq (car-safe (sp-state-delayed-hook sp-state)) :this)
- (let* ((pair (cdr (sp-state-delayed-hook sp-state)))
- (hooks (sp-get-pair pair :post-handlers-cond)))
- (--each hooks
- (let ((fun (car it))
- (conds (cdr it)))
- (when (or (--any? (eq this-command it) conds)
- (--any? (equal (single-key-description last-command-event) it) conds))
- (sp--run-function-or-insertion
- fun pair 'insert
- (sp--get-handler-context :post-handlers)))))
- (setf (sp-state-delayed-hook sp-state) nil)
- (setq sp-last-inserted-pair nil))))
-
- ;; Here we run the delayed insertion. Some details in issue #113
- (when (and (not (eq sp-last-operation 'sp-insert-pair-delayed))
- sp-delayed-pair)
- (let* ((pair (car sp-delayed-pair))
- (beg (cdr sp-delayed-pair))
- (conds (sp-get-pair pair :when-cond))
- (open-pair pair)
- (close-pair (sp-get-pair pair :close)))
- (when (and conds
- (--any? (cond
- ((and (commandp it)
- (not (stringp it)))
- (eq this-command it))
- ((stringp it)
- (equal (single-key-description last-command-event) it))
- ((ignore-errors (funcall it pair 'insert (sp--get-handler-context :post-handlers))))) conds))
- ;; TODO: refactor this and the same code in
- ;; `sp-insert-pair' to a separate function
- (sp--run-hook-with-args open-pair :pre-handlers 'insert)
- (insert close-pair)
- (backward-char (length close-pair))
- (sp--pair-overlay-create beg
- (+ (point) (length close-pair))
- open-pair)
- ;; no auto-escape here? Should be fairly safe
- (sp--run-hook-with-args open-pair :post-handlers 'insert)
- (setq sp-last-inserted-pair open-pair)
- ;; TODO: this is probably useless
- (setq sp-last-operation 'sp-insert-pair)))
- (setq sp-delayed-pair nil))
-
- (when (eq sp-last-operation 'sp-insert-pair-delayed)
- (setq sp-last-operation nil))
-
- (unless (or (sp--self-insert-command-p)
- (sp--special-self-insert-command-p))
- ;; unless the last command was a self-insert, remove the
- ;; information about the last wrapped region. It is only used
- ;; for: 1. deleting the wrapping immediately after the wrap,
- ;; 2. re-wrapping region immediatelly after a sucessful wrap.
- ;; Therefore, the deletion should have no ill-effect. If the
- ;; necessity will arise, we can add a different flag.
- (setq sp-last-wrapped-region nil)
- (setq sp-last-operation nil))
-
- (when show-smartparens-mode
- (if (member this-command sp-show-enclosing-pair-commands)
- (sp-show--pair-enc-function)
- (when (not (eq this-command 'sp-highlight-current-sexp))
- (sp-show--pair-delete-enc-overlays))))))))
-
-(defmacro sp--setaction (action &rest forms)
- "Use ACTION as a flag to evaluating FORMS.
-
-If ACTION is nil, evaluate FORMS and set it to the value of the
-last form; otherwise do nothing."
- (declare (debug (form body)))
- `(unless ,action
- (setq ,action (progn ,@forms))))
-
-;; TODO: this introduces a regression, where doing C-4 [ inserts [[[[]
-;; figure out how to detect the argument to self-insert-command that
-;; resulted to this insertion
-(defun sp--post-self-insert-hook-handler ()
- "Handler for `post-self-insert-hook'."
- (with-demoted-errors "sp--post-self-insert-hook-handler: %S"
- (when smartparens-mode
- (sp--with-case-sensitive
- (catch 'done
- (let (action)
- (when (region-active-p)
- (condition-case err
- (sp-wrap--initialize)
- (user-error
- (message (error-message-string err))
- ;; we need to remove the undo record of the insertion
- (unless (eq buffer-undo-list t)
- ;; pop all undo info until we hit an insertion node
- (sp--undo-pop-to-last-insertion-node)
- ;; get rid of it and insert an undo boundary marker
- (pop buffer-undo-list)
- (undo-boundary))
- (restore-buffer-modified-p sp-buffer-modified-p)
- (throw 'done nil))))
- (cond
- (sp-wrap-overlays
- (sp-wrap))
- (t
- ;; TODO: this does not pick correct pair!! it uses insert and not wrapping code
- (sp--setaction
- action
- (-when-let ((_ . open-pairs) (sp--all-pairs-to-insert nil 'wrap))
- (catch 'done
- (-each open-pairs
- (-lambda ((&keys :open open :close close))
- (--when-let (sp--wrap-repeat-last (cons open close))
- (throw 'done it)))))))
- (unless overwrite-mode (sp--setaction action (sp-insert-pair)))
- (sp--setaction action (sp-skip-closing-pair))
- (unless action (sp-escape-open-delimiter))
- ;; if nothing happened, we just inserted a character, so
- ;; set the apropriate operation.
- (unless action
- (setq sp-last-operation 'sp-self-insert))))))))))
-
-;; Unfortunately, some modes rebind "inserting" keys to their own
-;; handlers but do not hand over the insertion back to
-;; `self-insert-command', rather, they insert via `insert'.
-;; Therefore, we need to call this handler in `post-command-hook' too.
-;; The list `sp--special-self-insert-commands' specifies which
-;; commands to handle specially.
-(add-hook 'post-self-insert-hook 'sp--post-self-insert-hook-handler)
-
-;; TODO: make a proper data structure for state tracking and describe
-;; why we need each of these.
-(defun sp--save-pre-command-state ()
- "Save some of the buffer state before `pre-command-hook'."
- (when smartparens-mode
- (setq sp-point-inside-string (sp-point-in-string))
- (setq sp-pre-command-point (point))
- (setq sp-buffer-modified-p (buffer-modified-p))))
-
-(add-hook 'pre-command-hook 'sp--save-pre-command-state)
-
-(defun sp--get-pair-list ()
- "Get all non-stringlike pairs.
-
-Return all pairs that are recognized in this `major-mode' and do
-not have same opening and closing delimiter. This is used for
-navigation functions."
- (--filter (not (string= (car it) (cdr it))) sp-pair-list))
-
-(defun sp--get-stringlike-list ()
- "Get all string-like pairs.
-
-Return all pairs that are recognized in this `major-mode' that
-have same opening and closing delimiter."
- (--filter (string= (car it) (cdr it)) sp-pair-list))
-
-(defun sp--get-allowed-pair-list ()
- "Get all allowed non string-like pairs.
-
-Return all pairs that are recognized in this `major-mode', do not
-have same opening and closing delimiter and are allowed in the
-current context. See also `sp--get-pair-list'."
- (--filter (and (sp--do-action-p (car it) 'navigate)
- (not (equal (car it) (cdr it)))) sp-pair-list))
-
-(defun sp--get-allowed-stringlike-list ()
- "Get all allowed string-like pairs.
-
-Return all pairs that are recognized in this `major-mode',
-have the same opening and closing delimiter and are allowed in
-the current context."
- (--filter (and (sp--do-action-p (car it) 'navigate)
- (equal (car it) (cdr it))) sp-pair-list))
-
-(defun sp--get-pair-list-context (&optional action)
- "Return all pairs that are recognized in this `major-mode' and
-are allowed in the current context."
- (setq action (or action 'insert))
- (--filter (sp--do-action-p (car it) action) sp-pair-list))
-
-(defun sp--get-pair-list-wrap ()
- "Return the list of all pairs that can be used for wrapping."
- (--filter (sp--do-action-p (car it) 'wrap) sp-pair-list))
-
-(defun sp--wrap-regexp (string start end)
- "Wraps regexp with start and end boundary conditions to avoid
-matching symbols in symbols."
- (concat "\\(?:" (when start "\\<") string (when end "\\>") "\\)"))
-
-(defun sp--regexp-for-group (parens &rest strings)
- "Generates an optimized regexp matching all string, but with
-extra boundary conditions depending on parens."
- (let* ((start (car parens))
- (end (cadr parens)))
- (sp--wrap-regexp (regexp-opt strings) start end)))
-
-(defun sp--strict-regexp-opt (strings &optional ignored)
- "Like regexp-opt, but with extra boundary conditions to ensure
-that the strings are not matched in-symbol."
- (if strings
- (with-syntax-table
- ;; HACK: this is a terrible hack to make ' be treated as a
- ;; punctuation. Many text modes set it as word character which
- ;; messes up the regexps
- (let ((table (make-syntax-table (syntax-table))))
- (modify-syntax-entry ?' "." table)
- table)
- (--> strings
- (-group-by (lambda (string)
- (list (and (string-match-p "\\`\\<" string) t)
- (and (string-match-p "\\>\\'" string) t)))
- it)
- (mapconcat (lambda (g) (apply 'sp--regexp-for-group g)) it "\\|")
- (concat "\\(?:" it "\\)")))
- "^\\<$"))
-
-(defun sp--strict-regexp-quote (string)
- "Like regexp-quote, but make sure that the string is not
-matched in-symbol."
- (sp--wrap-regexp (regexp-quote string)
- (string-match-p "\\`\\<" string)
- (string-match-p "\\>\\'" string)))
-
-(cl-defun sp--get-opening-regexp (&optional (pair-list (sp--get-pair-list)))
- "Return regexp matching any opening pair."
- (sp--strict-regexp-opt (--map (car it) pair-list)))
-
-(cl-defun sp--get-closing-regexp (&optional (pair-list (sp--get-pair-list)))
- "Return regexp matching any closing pair."
- (sp--strict-regexp-opt (--map (cdr it) pair-list)))
-
-(cl-defun sp--get-allowed-regexp (&optional (pair-list (sp--get-allowed-pair-list)))
- "Return regexp matching any opening or closing
-delimiter for any pair allowed in current context."
- (sp--strict-regexp-opt (--mapcat (list (car it) (cdr it)) pair-list)))
-
-(cl-defun sp--get-stringlike-regexp (&optional (pair-list (sp--get-allowed-stringlike-list)))
- "Return a regexp matching any string-like delimiter.
-
-In case PAIR-LIST is empty return a regexp that never matches
-anything."
- (if (consp pair-list)
- (regexp-opt (--map (car it) pair-list))
- "^\\<$"))
-
-(defun sp--get-last-wraped-region (beg end open close)
- "Return `sp-get-sexp' style plist about the last wrapped region.
-
-Note: this function does not retrieve the actual value of
-`sp-last-wrapped-region', it merely construct the plist from the
-provided values."
- (let ((b (make-marker))
- (e (make-marker)))
- (set-marker b beg)
- (set-marker e end)
- (set-marker-insertion-type e t)
- `(:beg ,b :end ,e :op ,open :cl ,close :prefix "")))
-
-;; Wrapping is basically the same thing as insertion, only the closing
-;; pair is placed at a distance.
-
-;; However, we want to be able to insert the *closing* delimiter and
-;; go to the end of block. This will only work with delimiters which
-;; are unique wrt their opening one. For more complex wrapping, there
-;; will probably be an IDO/minibuffer interface. Openings are checked
-;; first.
-
-;; Inserting the opening delimiter should put the point wherever it
-;; was when we started insertion.
-
-(defun sp-wrap--can-wrap-p ()
- "Return non-nil if we can wrap a region.
-
-This is used in advices on various pre-command-hooks from
-\"selection deleting\" modes to intercept their actions.
-
-Also added to `self-insert-uses-region-functions' to prevent
-`delete-selection-mode' from replacing the region."
- (let* ((list (sp--get-pair-list-wrap))
- (desc (sp--single-key-description last-command-event)))
- (--any? (or (string-prefix-p desc (car it))
- (string-prefix-p desc (cdr it)))
- list)))
-
-(defun sp--pair-to-wrap-comparator (prop a b)
- "Comparator for wrapping pair selection.
-
-PROP specifies wrapping-end. A and B are pairs to be compared."
- (< (length (plist-get a prop)) (length (plist-get b prop))))
-
-(defun sp--pair-to-wrap (&optional prefix)
- "Return information about possible wrapping pairs.
-
-If optional PREFIX is non-nil, this is used to determine the
-possible wrapping pairs instead of the text in the wrapping
-overlay."
- (let* ((working-pairs
- ;; TODO: abstract this into a new "sp--get-..." hierarchy
- (--filter (sp--do-action-p (plist-get it :open) 'wrap) sp-local-pairs))
- (obeg (car sp-wrap-overlays))
- (prefix (or prefix (sp--get-overlay-text obeg)))
- (opening-pairs (--filter (string-prefix-p prefix (plist-get it :open)) working-pairs))
- ;; HACK: Here, we will add special "trigger pairs" to the
- ;; opening list. We set the opening delimiter to the
- ;; trigger, leave the rest alone and put the real open into
- ;; :open-real property. When we get the pair back, we will
- ;; check this property, and if present, fix the pair back to
- ;; the regular form
- (wrapper-pairs (->> (--filter (string-prefix-p prefix (or (plist-get it :trigger-wrap) "")) working-pairs)
- (-map (-lambda ((pair &as &plist :open open :trigger-wrap trigger-wrap))
- (setq pair (copy-sequence pair))
- (setq pair (plist-put pair :open trigger-wrap))
- (setq pair (plist-put pair :open-real open))
- pair))))
- (opening-pairs (-concat wrapper-pairs opening-pairs))
- (closing-pairs (--filter (string-prefix-p prefix (plist-get it :close)) working-pairs))
- (open (car (--sort (sp--pair-to-wrap-comparator :open it other) opening-pairs)))
- ;; TODO: do we need the special sorting here?
- (close (car (--sort (sp--pair-to-wrap-comparator :close it other) closing-pairs))))
- (list :open open
- :close close
- :opening opening-pairs
- :closing closing-pairs)))
-
-(defun sp-wrap--initialize ()
- "Initialize wrapping."
- (when (and sp-autowrap-region
- (sp-wrap--can-wrap-p))
- ;; This is the length of string which was inserted by the last
- ;; "self-insert" action. Typically this is 1, but sometimes a
- ;; single key inserts two or more characters, such as " in latex
- ;; where it translates into `` or ''.
- (let ((inserted-string-length (- (point) sp-pre-command-point)))
- ;; TODO: get rid of the following variables
- (setq sp-wrap-point (- (point) inserted-string-length))
- (setq sp-wrap-mark (mark))
- ;; balance check
- (with-silent-modifications
- (let ((inserted-string
- (prog1 (delete-and-extract-region sp-wrap-point (point))
- ;; HACK: in modes with string fences, the insertion
- ;; of the delimiter causes `syntax-propertize' to
- ;; fire, but the above deletion doesn't re-run it
- ;; because the cache tells it the state is OK. We
- ;; need to destroy the cache and re-run the
- ;; `syntax-propertize' on the buffer. This might be
- ;; expensive, but we only done this on wrap-init so
- ;; it's fine, I guess.
- (setq syntax-propertize--done -1)
- (syntax-propertize (point-max))))
- (point-string-context (sp-get-quoted-string-bounds sp-wrap-point))
- (mark-string-context (sp-get-quoted-string-bounds (mark))))
- ;; If point and mark are inside the same string, we don't
- ;; need to check if the region is OK. If both are outisde
- ;; strings, we have to. If one is inside and the other is
- ;; not, no matter what we would break, so we exit.
- (cond
- ;; inside the same string
- ((and point-string-context mark-string-context
- (eq (car point-string-context)
- (car mark-string-context))))
- ;; neither is inside string
- ((and (not point-string-context)
- (not mark-string-context))
- (unless (sp-region-ok-p sp-wrap-point (mark))
- (user-error "Mismatched sexp state: wrapping would break structure")))
- ;; one is in and the other isn't
- ((if point-string-context (not mark-string-context) mark-string-context)
- (user-error "Mismatched string state: point %sin string, mark %sin string"
- (if (car-safe point-string-context) "" "not ")
- (if (car-safe mark-string-context) "" "not ")))
- ;; both are in but in different strings
- (t (user-error "Mismatched string state: point and mark are inside different strings")))
- (insert inserted-string)))
- ;; if point > mark, we need to move point to mark and reinsert the
- ;; just inserted character.
- (when (> (point) (mark))
- (let ((char (delete-and-extract-region (- (point) inserted-string-length) (point))))
- (exchange-point-and-mark)
- (insert char)))
- (let* ((oleft (make-overlay (- (region-beginning) inserted-string-length)
- (region-beginning) nil nil t))
- (oright (make-overlay (region-end) (region-end) nil nil t)))
- (setq sp-wrap-overlays (cons oleft oright))
- (when sp-highlight-wrap-overlay
- (overlay-put oleft 'face 'sp-wrap-overlay-face)
- (overlay-put oright 'face 'sp-wrap-overlay-face))
- (overlay-put oleft 'priority 100)
- (overlay-put oright 'priority 100)
- (overlay-put oleft 'keymap sp-wrap-overlay-keymap)
- (overlay-put oleft 'type 'wrap)
- (setq sp-previous-point (point))
- (goto-char (1+ (overlay-start oleft)))))))
-
-(defun sp-wrap--finalize (wrapping-end open close)
- "Finalize a successful wrapping.
-
-WRAPPING-END specifies the wrapping end. If we wrapped using
-opening delimiter it is :open. If we wrapped using closing
-delimiter it is :close. Position of point after wrapping depends
-on this value---if :open, go where the wrapping was initalized,
-if :close, go after the newly-formed sexp.
-
-OPEN and CLOSE are the delimiters."
- (-let (((obeg . oend) sp-wrap-overlays))
- (sp--replace-overlay-text obeg open)
- (sp--replace-overlay-text oend close)
- (setq sp-last-operation 'sp-wrap-region)
- (setq sp-last-wrapped-region
- (sp--get-last-wraped-region
- (overlay-start obeg) (overlay-end oend)
- open close))
- (cond
- ((eq wrapping-end :open)
- (if sp-wrap-respect-direction
- (progn
- (set-mark (overlay-end oend))
- (goto-char (overlay-start obeg)))
- (when (> sp-wrap-point sp-wrap-mark)
- (set-mark (overlay-start obeg))
- (goto-char (overlay-end oend)))))
- ((eq wrapping-end :close)
- (set-mark (overlay-start obeg))
- (goto-char (overlay-end oend))))
- (sp-wrap--clean-overlays)
- (sp--run-hook-with-args open :post-handlers 'wrap)))
-
-(defun sp-wrap ()
- "Try to wrap the active region with some pair.
-
-This function is not ment to be used to wrap sexps with pairs
-programatically. Use `sp-wrap-with-pair' instead."
- (-let* (((&plist :open open :close close
- :opening opening-pairs
- :closing closing-pairs) (sp--pair-to-wrap))
- ((obeg . oend) sp-wrap-overlays))
- (cond
- (open
- (-let (((&plist :open open :close close :open-real open-real) open))
- (when sp-wrap-show-possible-pairs
- (overlay-put
- oend 'after-string
- (mapconcat (lambda (x)
- (if sp-highlight-wrap-overlay
- (concat
- (propertize
- (plist-get x :open) 'face
- 'sp-wrap-overlay-opening-pair)
- (propertize
- (plist-get x :close)
- 'face 'sp-wrap-overlay-closing-pair))
- (concat (plist-get x :open) (plist-get x :close))))
- opening-pairs " ")))
- (when (equal (sp--get-overlay-text obeg) open)
- (sp-wrap--finalize :open (or open-real open) close))))
- ((and close (= 1 (length closing-pairs)))
- (-let (((&plist :open open :close close) close))
- (when (equal (sp--get-overlay-text obeg) close)
- (sp-wrap--finalize :close open close))))
- (t
- (sp-wrap-cancel)))))
-
-(defun sp--escape-region (chars-to-escape beg end)
- "Escape instances of CHARS-TO-ESCAPE between BEG and END.
-
-Return non-nil if at least one escaping was performed."
- (save-excursion
- (goto-char beg)
- (let ((pattern (regexp-opt chars-to-escape))
- (end-marker (set-marker (make-marker) end))
- (re nil))
- (while (re-search-forward pattern end-marker t)
- (setq re t)
- (save-excursion
- (goto-char (match-beginning 0))
- (insert sp-escape-char)))
- re)))
-
-;; TODO: refactor the rewrap-sexp dependent parts out so that this
-;; function has less dependencies on the action
-;; TODO: add mode-dependent escape/unescape actions?
-(defun sp-escape-wrapped-region (id action _context)
- "Escape quotes and special chars when a region is (re)wrapped."
- (when (and sp-escape-wrapped-region
- (memq action '(wrap rewrap-sexp)))
- (sp-get sp-last-wrapped-region
- (let* ((parent-delim (save-excursion
- (goto-char :beg)
- (sp-get (sp-get-string)
- (cond
- ((and (< :beg (point))
- (< (point) :end))
- :op)
- ((eq action 'rewrap-sexp)
- (plist-get sp-handler-context :parent)))))))
- (cond
- ((equal parent-delim id)
- (sp--escape-region (list id sp-escape-char) :beg :end))
- (parent-delim
- (sp--escape-region (list id) :beg-in :end-in))
- (t
- (sp--escape-region (list id sp-escape-char) :beg-in :end-in)))))))
-
-(defun sp-escape-quotes-after-insert (id action context)
- "Escape quotes inserted via `sp-insert-pair'."
- (when (and sp-escape-quotes-after-insert
- (eq action 'insert)
- ;; we test not being inside string because if we were
- ;; before inserting the "" pair it is now split into two
- ;; -> which moves us outside the pair
- (not (eq context 'string))
- ;; the inserted character must have string syntax,
- ;; otherwise no "context" flip happens
- (eq (syntax-class
- (syntax-after
- (save-excursion
- (backward-char (length id))
- (point)))) 7))
- (let ((open id)
- (close (sp-get-pair id :close)))
- (sp--escape-region (list open close)
- (- (point) (length open))
- (+ (point) (length close))))))
-
-(defun sp--buffer-is-string-balanced-p ()
- "Check if the buffer is string-balanced.
-
-A string-balanced buffer is one where where is no unclosed
-string, that is, the string state at the end of the buffer is
-\"closed\"."
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-max))
- (let ((syntax (sp--syntax-ppss)))
- (or (< (car syntax) 0)
- (nth 3 syntax))))))
-
-(defun sp-escape-open-delimiter ()
- "Escape just inserted opening pair if `sp-insert-pair' was skipped.
-
-This is useful for escaping of \" inside strings when its pairing
-is disabled. This way, we can control autoescape and closing
-delimiter insertion separately."
- (-when-let (open (plist-get (sp--pair-to-insert 'escape) :open))
- (when (and (sp--do-action-p open 'escape)
- sp-point-inside-string
- ;; do not escape if we are looking at a closing
- ;; delimiter, that means we closed an opened string,
- ;; most likely.
- (sp--buffer-is-string-balanced-p))
- (sp--escape-region (list open) (- (point) (length open)) (point)))))
-
-;; kept to not break people's config... remove later
-(defun sp-match-sgml-tags (tag)
- "Split the html tag TAG at the first space and return its name."
- (let* ((split (split-string tag " "))
- (close (car split)))
- close))
-(make-obsolete 'sp-match-sgml-tags "do not use this function as the tag system has been removed." "2015-02-07")
-
-(defun sp--is-number-cons (c)
- "Return non-nil if C is a cons cell with numbers at `car' and `cdr'."
- (and (consp c) (numberp (car c)) (numberp (cdr c))))
-
-;; TODO: more research is needed
-(defun sp--undo-pop-to-last-insertion-node ()
- "Pop all undo info until an insertion node (beg . end) is found.
-
-This can potentially remove some undo important information."
- (while (and buffer-undo-list
- (or (null (car buffer-undo-list)) ;; is nil
- ;; is not undo action we're interested in
- (not (sp--is-number-cons (car buffer-undo-list)))))
- (pop buffer-undo-list)))
-
-;; modified from: https://github.com/Fuco1/smartparens/issues/90#issuecomment-18800369
-(defun sp--split-last-insertion-undo (len)
- "Split the last insertion node in the `buffer-undo-list' to
-include separate pair node."
- (sp--undo-pop-to-last-insertion-node)
- (when buffer-undo-list
- (let* ((previous-undo-actions (cdr buffer-undo-list))
- (beg (caar buffer-undo-list))
- (end (cdar buffer-undo-list))
- first-action second-action)
- (unless (< beg (- end len))
- ;; We need to go back more than one action. Given the pairs
- ;; are limited to 10 chars now and the chunks seem to be 20
- ;; chars, we probably wouldn't need more.
- (pop buffer-undo-list)
- (sp--undo-pop-to-last-insertion-node)
- (when buffer-undo-list
- (setq beg (caar buffer-undo-list))
- (setq previous-undo-actions (cdr buffer-undo-list))))
- (setq first-action (cons beg (- end len)))
- (setq second-action (cons (- end len) end))
- (setq buffer-undo-list
- (append (list nil second-action nil first-action)
- previous-undo-actions)))))
-
-;; TODO: remove ACTION argument and make the selection process more
-;; unified (see also sp--pair-to-wrap which depends on buffer state
-;; among other things)
-(defun sp--all-pairs-to-insert (&optional looking-fn action)
- "Return all pairs that can be inserted at point.
-
-Return nil if such pair does not exist.
-
-Pairs inserted using a trigger have higher priority over pairs
-without a trigger and only one or the other list is returned.
-
-In other words, if any pair can be inserted using a trigger, only
-pairs insertable by trigger are returned.
-
-ACTION is an implementation detail. Usually it has the value
-'insert when we determine pairs to insert. On repeated wrapping
-however we pass the value 'wrap. This will be refactored away in
-the upcoming version."
- (setq looking-fn (or looking-fn 'sp--looking-back-p))
- (setq action (or action 'insert))
- (let ((working-pairs
- ;; TODO: abstract this into a new "sp--get-..." hierarchy
- (--filter (sp--do-action-p (plist-get it :open) action) sp-local-pairs)))
- (-if-let (trigs (--filter (and (plist-get it :trigger)
- (funcall looking-fn (sp--strict-regexp-quote (plist-get it :trigger))))
- working-pairs))
- (cons :trigger trigs)
- (-when-let (pairs (--filter (funcall looking-fn (sp--strict-regexp-quote (plist-get it :open))) working-pairs))
- (cons :open pairs)))))
-
-(defun sp--pair-to-insert-comparator (prop a b)
- (cond
- ;; in case of triggers shorter always wins
- ((eq prop :trigger)
- (< (length (plist-get a :trigger)) (length (plist-get b :trigger))))
- ;; Shorter wins only if the shorter's closing is a prefix of the
- ;; longer's closing. In other words, if we are looking at
- ;; shorter's closing and we are trying to nest it.
- (t
- (if (< (length (plist-get a :open)) (length (plist-get b :open)))
- (and (string-prefix-p (plist-get a :close) (plist-get b :close))
- (sp--looking-at-p (plist-get a :close)))
- (not (and (string-prefix-p (plist-get b :close) (plist-get a :close))
- (sp--looking-at-p (plist-get b :close))))))))
-
-(defun sp--pair-to-insert (&optional action)
- "Return pair that can be inserted at point.
-
-Return nil if such pair does not exist.
-
-If more triggers or opening pairs are possible select the
-shortest one."
- (-when-let ((property . pairs) (sp--all-pairs-to-insert nil action))
- (car (--sort (sp--pair-to-insert-comparator property it other) pairs))))
-
-(defun sp--longest-prefix-to-insert ()
- "Return pair with the longest :open which can be inserted at point."
- (-when-let (pairs (--filter (sp--looking-back-p (sp--strict-regexp-quote (plist-get it :open))) sp-local-pairs))
- (car (--sort (> (length (plist-get it :open)) (length (plist-get other :open))) pairs))))
-
-(defun sp--pair-to-uninsert ()
- "Return pair to uninsert.
-
-If the current to-be-inserted pair shares a prefix with
-another (shorter) pair, we must first remove the effect of
-inserting its closing pair before inserting the current one.
-
-The previously inserted pair must be the one with the longest
-common prefix excluding the current pair."
- (-when-let (lp (sp--longest-prefix-to-insert))
- (save-excursion
- (backward-char (length (plist-get lp :open)))
- (-when-let ((property . pairs) (sp--all-pairs-to-insert 'sp--looking-at-p))
- (car (--sort (> (length (plist-get it property)) (length (plist-get other property)))
- ;; remove pairs whose open is longer than the
- ;; current longest possible prefix---otherwise
- ;; they would overflow to the closing pair
- ;; TODO: this ignores the possibility when lp is
- ;; inserted by trigger. We assume triggers are
- ;; shorter than the openings and this situation,
- ;; if ever, should be very rare
- (--remove (>= (length (plist-get it :open))
- (length (plist-get lp :open))) pairs)))))))
-
-(defun sp--insert-pair-get-pair-info (active-pair)
- "Get basic info about the to-be-inserted pair."
- (let ((open-pair (plist-get active-pair :open)))
- (list
- open-pair
- (plist-get active-pair :close)
- (-if-let (tr (plist-get active-pair :trigger))
- (if (sp--looking-back-p (sp--strict-regexp-quote tr)) tr open-pair)
- open-pair))))
-
-(defun sp-insert-pair (&optional pair)
- "Automatically insert the closing pair if it is allowed in current context.
-
-If PAIR is provided, use this as pair ID instead of looking
-through the recent history of pressed keys.
-
-You can disable this feature completely for all modes and all pairs by
-setting `sp-autoinsert-pair' to nil.
-
-You can globally disable insertion of closing pair if point is
-followed by the matching opening pair. It is disabled by
-default."
- (sp--with-case-sensitive
- (catch 'done
- (-let* ((active-pair (unwind-protect
- ;; This fake insertion manufactures proper
- ;; context for the tests below... in effect
- ;; we must make it look as if the user
- ;; typed in the opening part themselves
- ;; TODO: it is duplicated in the test
- ;; below, maybe it wouldn't hurt to
- ;; restructure this function a bit
- (progn
- (when pair (insert pair))
- (sp--pair-to-insert))
- (when pair (delete-char (- (length pair))))))
- ((open-pair close-pair trig) (sp--insert-pair-get-pair-info active-pair)))
- ;; We are not looking at a closing delimiter which might mean we
- ;; are in an already existing sexp. If the to-be-inserted pair
- ;; has a prefix which is also a pair we migth be extending the
- ;; opener of a sexp with this opener. In which case we should
- ;; probably rewrap.
- (unless (sp--looking-at-p (sp--get-closing-regexp))
- (when (and open-pair
- (= 1 (- (point) sp-pre-command-point)))
- (-when-let (prefix-pair (sp-get-pair (substring open-pair 0 -1)))
- (let ((last-char-of-open-pair (substring open-pair -1)))
- (unwind-protect
- (progn
- (delete-char -1)
- (--when-let (sp-get-thing t)
- (save-excursion
- (sp-get it
- (delete-region :end-in :end)
- (goto-char :end-in)
- (insert close-pair)))
- (throw 'done t)))
- (insert last-char-of-open-pair))))))
- (if (not (unwind-protect
- (progn
- (when pair (insert pair))
- ;; TODO: all these tests must go into `sp--pair-to-insert'
- (and sp-autoinsert-pair
- active-pair
- (if (memq sp-autoskip-closing-pair '(always always-end))
- (or (not (equal open-pair close-pair))
- (not (sp-skip-closing-pair nil t)))
- t)
- (sp--do-action-p open-pair 'insert t)
- ;; was sp-autoinsert-if-followed-by-same
- (or (not (sp--get-active-overlay 'pair))
- (not (sp--looking-at (sp--strict-regexp-quote open-pair)))
- (and (equal open-pair close-pair)
- (eq sp-last-operation 'sp-insert-pair)
- (save-excursion
- (backward-char (length trig))
- (sp--looking-back (sp--strict-regexp-quote open-pair))))
- (not (equal open-pair close-pair)))))
- (when pair (delete-char (- (length pair))))))
- ;; if this pair could not be inserted, we try the procedure
- ;; again with this pair removed from sp-pair-list to give
- ;; chance to other pairs sharing a common suffix (for
- ;; example \[ and [)
- (let ((new-sp-pair-list (--remove (equal (car it) open-pair) sp-pair-list))
- (new-sp-local-pairs (--remove (equal (plist-get it :open) open-pair) sp-local-pairs)))
- (when (> (length sp-pair-list) (length new-sp-pair-list))
- (let ((sp-pair-list new-sp-pair-list)
- (sp-local-pairs new-sp-local-pairs))
- (sp-insert-pair))))
- ;; setup the delayed insertion here.
- (if (sp-get-pair open-pair :when-cond)
- (progn
- (setq sp-delayed-pair (cons open-pair (- (point) (length open-pair))))
- (setq sp-last-operation 'sp-insert-pair-delayed))
- (unless pair (delete-char (- (length trig))))
- (insert open-pair)
- (sp--run-hook-with-args open-pair :pre-handlers 'insert)
- ;; The re-binding of these dynamic variables is a hack to
- ;; combat the similar rebinding in the branch above where
- ;; we retry `sp-insert-pair' with some pairs removed.
- ;; This however causes them to be uninserted improperly,
- ;; so for this one operation we need to restore the state
- ;; to the "full" pair list. TODO: in the future we might
- ;; want to pass the state around explicitly so we have
- ;; better control.
- (--when-let (let ((sp-pair-list (sp-state-pair-list sp-state))
- (sp-local-pairs (sp-state-local-pairs sp-state)))
- (sp--pair-to-uninsert))
- (let ((cl (plist-get it :close)))
- (when (and (sp--looking-at-p (sp--strict-regexp-quote cl))
- (> (- (length close-pair) (length cl)) 0))
- (delete-char (length cl)))))
- (insert close-pair)
- (backward-char (length close-pair))
- (sp--pair-overlay-create (- (point) (length open-pair))
- (+ (point) (length close-pair))
- open-pair)
- (when sp-undo-pairs-separately
- (sp--split-last-insertion-undo (+ (length open-pair) (length close-pair)))
- ;; TODO: abc\{abc\} undo undo \{asd\} . next undo removes the
- ;; entire \{asd\} if we do not insert two nils here.
- ;; Normally, repeated nils are ignored so it shouldn't
- ;; matter. It would still be useful to inspect further.
- (push nil buffer-undo-list)
- (push nil buffer-undo-list))
- (sp--run-hook-with-args open-pair :post-handlers 'insert)
- (setq sp-last-inserted-pair open-pair)
- (setf (sp-state-delayed-hook sp-state) (cons :next open-pair))
- (setq sp-last-operation 'sp-insert-pair)))))))
-
-(defun sp--wrap-repeat-last (active-pair)
- "If the last operation was a wrap and `sp-wrap-repeat-last' is
-non-nil, repeat the wrapping with this pair around the last
-active region."
- (unless (= 0 sp-wrap-repeat-last)
- (when sp-last-wrapped-region
- (let* ((b (sp-get sp-last-wrapped-region :beg))
- (e (sp-get sp-last-wrapped-region :end))
- (op (sp-get sp-last-wrapped-region :op))
- (oplen (length op))
- (cllen (sp-get sp-last-wrapped-region :cl-l))
- (acolen (length (car active-pair))))
- (when (and
- (cond
- ((= 1 sp-wrap-repeat-last)
- (equal (car active-pair) op))
- ((= 2 sp-wrap-repeat-last)))
- (memq sp-last-operation '(sp-self-insert sp-wrap-region))
- (or (= (point) (+ b oplen acolen))
- (= (point) e)))
- (delete-char (- acolen))
- (if (< (point) e)
- (progn (goto-char (+ b oplen))
- (insert (car active-pair))
- (goto-char (- e cllen))
- (insert (cdr active-pair))
- (setq sp-last-wrapped-region
- (sp--get-last-wraped-region
- (+ b oplen) (point)
- (car active-pair) (cdr active-pair)))
- (goto-char (+ b oplen acolen)))
- (goto-char b)
- (insert (car active-pair))
- (goto-char e)
- (insert (cdr active-pair))
- (setq sp-last-wrapped-region
- (sp--get-last-wraped-region
- b e (car active-pair) (cdr active-pair))))
- (setq sp-last-operation 'sp-wrap-region)
- (sp--run-hook-with-args (car active-pair) :post-handlers 'wrap)
- sp-last-operation)))))
-
-(defun sp--char-is-part-of-stringlike (char)
- "Return non-nil if CHAR is part of a string-like delimiter of length 1."
- (->> (sp--get-stringlike-list)
- (--filter (= 1 (length (cdr it))))
- (-map 'car)
- (--any? (string-match-p (regexp-quote char) it))))
-
-(defun sp--char-is-part-of-closing (char &optional pair-list)
- "Return non-nil if CHAR is part of a pair delimiter of length 1.
-Specifically, return the pair for which CHAR is the closing
-delimiter."
- (let ((regexp (regexp-quote char)))
- (->> (or pair-list (sp--get-pair-list))
- (--filter (= 1 (length (cdr it))))
- (--find (string-match-p regexp (cdr it))))))
-
-;; TODO: this only supports single-char delimiters. Maybe it should
-;; that that way.
-(defun sp-skip-closing-pair (&optional last test-only)
- "Automatically skip the closing delimiters of pairs.
-
-If point is inside an inserted pair, and the user only moved
-forward with point (that is, only inserted text), if the closing
-pair is typed, we shouldn't insert it again but skip forward. We
-call this state \"active sexp\". The setting
-`sp-cancel-autoskip-on-backward-movement' controls when an active
-expression become inactive.
-
-For example, pressing ( is followed by inserting the pair (|). If
-we then type 'word' and follow by ), the result should be (word)|
-instead of (word)|).
-
-This behaviour can be customized by various settings of
-`sp-autoskip-closing-pair' and `sp-autoskip-opening-pair'.
-
-Additionally, this behaviour can be selectively disabled for
-specific pairs by removing their \"autoskip\" action. You can
-achieve this by using `sp-pair' or `sp-local-pair' with
-\":actions '(:rem autoskip)\"."
- (sp--with-case-sensitive
- (when (or (and (eq sp-autoskip-closing-pair t)
- sp-pair-overlay-list
- (sp--get-active-overlay 'pair))
- (memq sp-autoskip-closing-pair '(always always-end)))
- ;; TODO: ugly hack to override 'navigate with 'autoskip. Each of
- ;; these submodules should set-up their own environment somehow
- ;; and thread it through the entire computation
- (cl-letf (((symbol-function 'sp--get-allowed-stringlike-list)
- (lambda ()
- (--filter (and (sp--do-action-p (car it) 'autoskip)
- (equal (car it) (cdr it))) sp-pair-list))))
- ;; these two are pretty hackish ~_~
- (cl-labels ((get-sexp
- (last)
- (delete-char -1)
- (insert " ")
- (prog1 (sp-get-sexp)
- (delete-char -1)
- (insert last)))
- (get-enclosing-sexp
- (last)
- (delete-char -1)
- (insert " ")
- (prog1 (sp-get-enclosing-sexp)
- (delete-char -1)
- (insert last))))
- (let ((last (or last (sp--single-key-description last-command-event))))
- (-if-let (active-sexp
- (cond
- ((-when-let* ((ov (sp--get-active-overlay 'pair))
- (op (overlay-get ov 'pair-id))
- (cl (cdr (assoc op sp-pair-list))))
- ;; if the sexp is active, we are inside it.
- (when (and (= 1 (length op))
- (equal last cl))
- (list :beg (overlay-start ov)
- :end (overlay-end ov)
- :op op
- :cl cl
- :prefix ""
- :suffix ""))))
- ((sp--char-is-part-of-stringlike last)
- ;; a part of closing delimiter is typed. There are four
- ;; options now:
- ;; - we are inside the sexp, at its end
- ;; - we are inside the sexp, somewhere in the middle
- ;; - we are outside, in front of a sexp
- ;; - we are outside, somewhere between sexps
- (cond
- ((and (sp--looking-at (sp--get-stringlike-regexp))
- (not (sp--skip-match-p (match-string-no-properties 0)
- (match-beginning 0)
- (match-end 0))))
- ;; if we're looking at the delimiter, and it is valid in
- ;; current context, get the sexp.
- (get-sexp last))
- ;; here comes the feature when we're somewhere in the
- ;; middle of the sexp (or outside), if ever supported.
- ))
- ((sp--char-is-part-of-closing last)
- (cond
- ((and (sp--looking-at (sp--get-closing-regexp))
- (not (sp--skip-match-p (match-string-no-properties 0)
- (match-beginning 0)
- (match-end 0))))
- (get-sexp last))
- ((eq sp-autoskip-closing-pair 'always)
- (get-enclosing-sexp last))))))
- (if (and active-sexp
- (equal (sp-get active-sexp :cl) last)
- (sp--do-action-p (sp-get active-sexp :op) 'autoskip)
- ;; if the point is inside string and preceded
- ;; by an odd number of `sp-escape-char's, we
- ;; should not skip as that would leave the
- ;; string broken.
- (or (not (sp-point-in-string))
- (not (sp-char-is-escaped-p (1- (point))))))
- (-when-let (re (cond
- ((= (point) (sp-get active-sexp :beg))
- ;; we are in front of a string-like sexp
- (when sp-autoskip-opening-pair
- (if test-only t
- (delete-char -1)
- (forward-char)
- (setq sp-last-operation 'sp-skip-closing-pair))))
- ((= (point) (sp-get active-sexp :end-in))
- (if test-only t
- (delete-char 1)
- (setq sp-last-operation 'sp-skip-closing-pair)))
- ((sp-get active-sexp
- (and (> (point) :beg-in)
- (< (point) :end-in)))
- (if test-only t
- (delete-char -1)
- (sp-up-sexp nil t)))))
- (unless (or test-only
- sp-buffer-modified-p)
- (set-buffer-modified-p nil))
- (unless test-only
- (sp--run-hook-with-args (sp-get active-sexp :op) :post-handlers 'skip-closing-pair))
- re)
- ;; if we can't skip and are in strict mode we must not
- ;; insert anything if it is a closing character
- (sp--inhibit-insertion-of-closing-delim last))
- (sp--inhibit-insertion-of-closing-delim last))))))))
-
-(defun sp--inhibit-insertion-of-closing-delim (last)
- "Inhibit insertion of closing delimiter in `smartparens-strict-mode'.
-
-If we are not inserting inside string or a comment, and the LAST
-inserted character is closing delimiter for a pair that performs
-autoskip, and we can not jump out of its enclosing sexp (i.e. it
-does not match), we are not allowed to insert it literally
-because it would break the balance; so we delete the
-just-inserted character."
- (when (and smartparens-strict-mode
- (-when-let (pair (sp--char-is-part-of-closing
- last (sp--get-allowed-pair-list)))
- (memq 'autoskip (sp-get-pair (car pair) :actions)))
- (not (sp-point-in-string-or-comment)))
- (delete-char -1)
- (set-buffer-modified-p sp-buffer-modified-p)
- (sp-message :cant-insert-closing-delimiter)
- nil))
-
-(defun sp-delete-pair (&optional arg)
- "Automatically delete opening or closing pair, or both, depending on
-position of point.
-
-If the point is inside an empty pair, automatically delete both. That
-is, [(|) turns to [|, [\{|\} turns to [|. Can be disabled by setting
-`sp-autodelete-pair' to nil.
-
-If the point is behind a closing pair or behind an opening pair delete
-it as a whole. That is, \{\}| turns to \{|, \{| turns to |. Can be
-disabled by setting `sp-autodelete-closing-pair' and
-`sp-autodelete-opening-pair' to nil.
-
-If the last operation was a wrap and `sp-autodelete-wrap' is
-enabled, invoking this function will unwrap the expression, that
-is remove the just added wrapping."
- ;; NOTE: Only use delete-char inside this function, so we
- ;; don't activate the advice recursively!
-
- ;; only activate if argument is 1 (this is 0-th argument of the
- ;; delete-backward-char), otherwise the user wants to delete
- ;; multiple character, so let him do that
- (sp--with-case-sensitive
- (when (and (= arg 1)
- smartparens-mode)
- (if (and sp-autodelete-wrap
- (eq sp-last-operation 'sp-wrap-region))
- (let ((p (point))
- (b (sp-get sp-last-wrapped-region :beg))
- (e (sp-get sp-last-wrapped-region :end))
- (o (sp-get sp-last-wrapped-region :op-l))
- (c (sp-get sp-last-wrapped-region :cl-l)))
- ;; if the last operation was `sp-wrap-region', and we are at
- ;; the position of either opening or closing pair, delete the
- ;; just-inserted pair
- (when (or (= p (+ b o))
- (= p e))
- (insert "x") ;dummy char to account for the regularly deleted one
- (save-excursion
- (goto-char e)
- (delete-char (- c))
- (goto-char b)
- (delete-char o))
- (setq sp-last-operation 'sp-delete-pair-wrap)))
- (let ((p (point))
- (inside-pair (--first (and (sp--looking-back (sp--strict-regexp-quote (car it)))
- (sp--looking-at (concat "[ \n\t]*" (sp--strict-regexp-quote (cdr it)))))
- sp-pair-list))
- (behind-pair (--first (sp--looking-back (sp--strict-regexp-quote (cdr it))) sp-pair-list))
- (opening-pair (--first (sp--looking-back (sp--strict-regexp-quote (car it))) sp-pair-list)))
-
- (cond
- ;; we're just before the closing quote of a string. If there
- ;; is an opening or closing pair behind the point, remove
- ;; it. This is only really relevant if the pair ends in the
- ;; same character as string quote. We almost never want to
- ;; delete it as an autopair (it would "open up the string").
- ;; So, word\"|" and <backspace> should produce word\|" or
- ;; word|" (if \" is autopair) instead of word\|.
- ((and (sp-point-in-string)
- (not (sp-point-in-string (1+ p)))
- (sp-point-in-string (1- p))) ;; the string isn't empty
- (cond ;; oh, you ugly duplication :/
- ((and behind-pair sp-autodelete-closing-pair)
- (delete-char (- (1- (length (car behind-pair)))))
- (setq sp-last-operation 'sp-delete-pair-closing))
- ((and opening-pair sp-autodelete-opening-pair)
- (delete-char (- (1- (length (car opening-pair)))))
- (setq sp-last-operation 'sp-delete-pair-opening))))
- ;; we're inside a pair
- ((and inside-pair sp-autodelete-pair)
- (let* ((beg (save-excursion
- (search-backward (car inside-pair))))
- (end (save-excursion
- (search-forward (cdr inside-pair))))
- (cs (sp--get-context p))
- (ce (sp--get-context end))
- (current-sexp (sp-get-sexp)))
- (when (and (or (not (eq cs 'comment)) ;; a => b <=> ~a v b
- (eq ce 'comment))
- (eq beg (sp-get current-sexp :beg))
- (eq end (sp-get current-sexp :end))
- (equal (sp-get current-sexp :op) (car inside-pair))
- (equal (sp-get current-sexp :cl) (cdr inside-pair)))
- (delete-char (- end p))
- (delete-char (- (1- (length (car inside-pair)))))
- (setq sp-last-operation 'sp-delete-pair))))
- ;; we're behind a closing pair
- ((and behind-pair sp-autodelete-closing-pair)
- (delete-char (- (1- (length (cdr behind-pair)))))
- (setq sp-last-operation 'sp-delete-pair-closing))
- ;; we're behind an opening pair and there's no closing pair
- ((and opening-pair sp-autodelete-opening-pair)
- (delete-char (- (1- (length (car opening-pair)))))
- (setq sp-last-operation 'sp-delete-pair-opening))))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Navigation
-
-(defun sp--looking-at (regexp)
- "Like `looking-at', but always case sensitive."
- (sp--with-case-sensitive
- (looking-at regexp)))
-
-(defun sp--looking-at-p (regexp)
- "Like `looking-at-p', but always case sensitive."
- (sp--with-case-sensitive
- (looking-at-p regexp)))
-
-(defun sp--looking-back (regexp &optional limit not-greedy)
- "Return non-nil if text before point matches regular expression REGEXP.
-
-With optional argument LIMIT search only that many characters
-backward. If LIMIT is nil, default to `sp-max-pair-length'.
-
-If optional argument NON-GREEDY is t search for any matching
-sequence, not necessarily the longest possible."
- (setq limit (or limit sp-max-pair-length))
- (sp--with-case-sensitive
- (let ((from (max 1 (- (point) limit)))
- (to (point))
- (greedy (not not-greedy))
- has-match)
- (if greedy
- (save-excursion
- (goto-char from)
- (save-match-data
- (while (and (not has-match) (< (point) to))
- ;; don't use looking-at because we can't limit that search
- (if (and (save-excursion (re-search-forward regexp to t))
- (= (match-end 0) to))
- (setq has-match (match-data))
- (forward-char 1))))
- (when has-match
- (set-match-data has-match)
- t))
- (save-excursion
- (not (null (search-backward-regexp (concat "\\(?:" regexp "\\)\\=") from t))))))))
-
-(defun sp--looking-back-p (regexp &optional limit not-greedy)
- "Same as `sp--looking-back' but do not change the match data."
- (save-match-data
- (sp--looking-back regexp limit not-greedy)))
-
-(defun sp--search-backward-regexp (regexp &optional bound noerror count)
- "Works just like `search-backward-regexp', but returns the
-longest possible match. That means that searching for
-\"defun|fun\" backwards would return \"defun\" instead of
-\"fun\", which would be matched first.
-
-This is an internal function. Only use this for searching for
-pairs!"
- (setq count (or count 1))
- (setq bound (or (sp--get-backward-bound) bound))
- (sp--with-case-sensitive
- (let (r)
- (while (> count 0)
- (when (search-backward-regexp regexp bound noerror)
- (goto-char (match-end 0))
- (if (sp--looking-back regexp)
- (setq r (goto-char (match-beginning 0)))
- (if noerror nil (error "Search failed: %s" regexp))))
- (setq count (1- count)))
- r)))
-
-(defun sp--search-forward-regexp (regexp &optional bound noerror count)
- "Just like `search-forward-regexp', but always case sensitive."
- (setq bound (or (sp--get-forward-bound) bound))
- (sp--with-case-sensitive
- (search-forward-regexp regexp bound noerror count)))
-
-(defun sp--search-forward-in-context (regexp &optional bound noerror count)
- "Just like `sp--search-forward-regexp' but only accept results in same context.
-
-The context at point is considered the reference context."
- (let ((context (sp--get-context))
- (re))
- (--dotimes (or count 1)
- (save-excursion
- (while (and (setq re (sp--search-forward-regexp regexp bound noerror))
- (not (eq (sp--get-context) context)))))
- (when re (goto-char re)))
- re))
-
-(defun sp--search-backward-in-context (regexp &optional bound noerror count)
- "Just like `sp--search-backward-regexp' but only accept results in same context.
-
-The context at point is considered the reference context."
- (let ((context (sp--get-context))
- (re))
- (--dotimes (or count 1)
- (save-excursion
- (while (and (setq re (sp--search-backward-regexp regexp bound noerror))
- (not (eq (sp--get-context) context))))
- (when re (goto-char re))))
- re))
-
-(defun sp-get-quoted-string-bounds (&optional point)
- "Return the bounds of the string around POINT.
-
-POINT defaults to `point'.
-
-If the point is not inside a quoted string, return nil."
- (setq point (or point (point)))
- (save-excursion
- (goto-char point)
- (let ((parse-data (syntax-ppss)))
- (when (nth 3 parse-data)
- (let* ((open (nth 8 parse-data))
- (close (save-excursion
- (parse-partial-sexp
- (point) (point-max)
- nil nil parse-data 'syntax-table)
- (point))))
- (cons open close))))))
-
-;; TODO: the repeated conditions are ugly, refactor this!
-(defun sp-get-comment-bounds ()
- "If the point is inside a comment, return its bounds."
- (when (or (sp-point-in-comment)
- (looking-at "[[:space:]]+\\s<"))
- (let ((open (save-excursion
- (--when-let (nth 8 (sp--syntax-ppss))
- (goto-char it))
- (while (and (not (bobp))
- (or (when (sp-point-in-comment)
- (backward-char 1)
- t)
- (when (save-excursion
- (beginning-of-line)
- (looking-at "^[[:space:]]+\\s<"))
- (when (>= (forward-line -1) 0)
- (end-of-line))
- t))))
- ;; this means we got here by `sp-point-in-comment' condition
- (unless (and (bobp) (sp-point-in-comment))
- (forward-char))
- (point)))
- (close (save-excursion
- (while (and (not (eobp))
- (or (sp-point-in-comment)
- (looking-at "[[:space:]]+\\s<")))
- (forward-char 1))
- (let ((pp (1- (point))))
- (when (not (or (eobp)
- (sp-point-in-comment)
- (looking-at "[[:space:]]+\\s<")
- (and (eq (char-syntax
- (char-after pp)) ?>)
- (not (eq (char-after pp) ?\n)))
- (/= (logand
- (lsh 1 18)
- (car (syntax-after pp))) 0)
- (/= (logand
- (lsh 1 19)
- (car (syntax-after pp))) 0)))
- (backward-char 1)))
- (point))))
- (cons open close))))
-
-(defun sp--get-string-or-comment-bounds ()
- "Get the bounds of string or comment the point is in."
- (or (sp-get-quoted-string-bounds)
- (sp-get-comment-bounds)))
-
-(defmacro sp--search-and-save-match (search-fn pattern bound res beg end str)
- "Save the last match info."
- `(progn
- (setq ,res (funcall ,search-fn ,pattern ,bound t))
- (when ,res
- (setq ,beg (match-beginning 0))
- (setq ,end (match-end 0))
- (setq ,str (match-string 0)))
- ,res))
-
-(cl-defun sp--skip-match-p (ms mb me
- &key
- (global-skip (cdr (--first (memq major-mode (car it)) sp-navigate-skip-match)))
- (pair-skip (sp-get-pair ms :skip-match)))
- "Return non-nil if this match should be skipped.
-
-This function uses two tests, one specified in
-`sp-navigate-skip-match' (this is global setting for all pairs in
-given major mode) and by a function specified in :skip-match
-property of the pair.
-
-If you are calling this function in a heavy loop, you can supply
-the test functions as keyword arguments to speed up the lookup."
- (save-match-data
- (or (when global-skip (funcall global-skip ms mb me))
- (when pair-skip (funcall pair-skip ms mb me)))))
-
-(defmacro sp--valid-initial-delimiter-p (form)
- "Test the last match using `sp--skip-match-p'. The form should
-be a function call that sets the match data."
- (declare (debug (form)))
- (let ((match (make-symbol "match"))
- (pair-skip (make-symbol "pair-skip")))
- `(and ,form
- (let* ((,match (match-string 0))
- (,pair-skip (or (sp-get-pair ,match :skip-match)
- (sp-get-pair (car (--first
- (equal (cdr it) ,match)
- sp-pair-list))
- :skip-match))))
- (not (sp--skip-match-p
- ,match
- (match-beginning 0)
- (match-end 0)
- :pair-skip ,pair-skip))))))
-
-(defun sp--elisp-skip-match (ms mb _me)
- "Function used to test for escapes in lisp modes.
-
-Non-nil return value means to skip the result."
- (and ms
- (> mb 1)
- (save-excursion
- (goto-char mb)
- (save-match-data
- (or (and (sp--looking-back "\\\\" 1 t)
- ;; it might be a part of ?\\ token
- (not (sp--looking-back "\\?\\\\\\\\" 3 t)))
- (and (not (sp-point-in-string-or-comment))
- (sp--looking-back "\\?" 1 t) ;;TODO surely we can do better
- (not (sp--looking-back "\\\\\\?" 2 t))
- (not (sp--looking-back "\\s_\\?" 2 t))
- (not (sp--looking-back "\\sw\\?" 2 t))))))))
-
-(defun sp--backslash-skip-match (ms mb _me)
- (and ms
- (save-excursion
- (goto-char mb)
- (sp--looking-back "\\\\" 1 t))))
-
-;; TODO: since this function is used for all the navigation, we should
-;; optimize it a lot! Get some elisp profiler! Also, we should split
-;; this into smaller functions (esp. the "first expression search"
-;; business)
-(defun sp-get-paired-expression (&optional back)
- "Find the nearest balanced pair expression after point.
-
-The expressions considered are those delimited by pairs on
-`sp-pair-list'."
- (sp--with-case-sensitive
- (save-excursion
- (let* ((search-fn (if (not back) 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (global-skip-fn (cdr (--first (memq major-mode (car it)) sp-navigate-skip-match)))
- (pair-list (sp--get-allowed-pair-list))
- ;; TODO UGLY HACK!!! When the situation is:
- ;; ..)|;; comment
- ;; the context the point gets is the comment. But if we
- ;; are searching backward, that is incorrect, because in
- ;; that case we want the context of the closing pair.
- ;; Therefore, if the direction is backward, we need to move
- ;; one point backward, then test the comment/string thing,
- ;; then compute the correct bounds, and then restore the
- ;; point so the search will pick up the )
-
- ;; However, we need to distinguish the cases where we are
- ;; in comment and trying to get out, and when we are in any
- ;; context and we jump into string (in that case, we should
- ;; report code context!). For example:
- ;; "foo"|;bar
- ;; or
- ;; "foo"|bar
- ;; should both report code context
- ;; and "|(foo)" should report string context.
-
- ;; Beware the case when we have a string inside a comment, like
- ;; (foo) ;; bar "baz"| qux
- ;; In this case we want to report comment context even when
- ;; backing into the "" (which however is commented)
-
- ;; Yet another case is when we are not in a comment but
- ;; directly after one and we search backwards, consider:
- ;; /* foo bar */|
- ;; in C-like language. In this case, we want to report the
- ;; context as comment.
-
- ;; In some languages, special paren syntax with a prefix
- ;; serves to mark strings. This means that regular
- ;; delimiters, like () are used to delimit strings. For
- ;; example, in ruby the sequence %w(...) signifies a
- ;; string. If the point is after such a sequence and we
- ;; are searching back, we must use the string context,
- ;; because the paren is now a string delimiter. This is
- ;; usually implemented with "string fence" syntax, so we
- ;; will simply check for that.
-
- ;; Thanks for being consistent at handling syntax bounds Emacs!
- (in-string-or-comment (if back
- (let ((in-comment (sp-point-in-comment))
- (in-string (sp-point-in-string)))
- (save-excursion
- (unless (= (point) (point-min))
- (backward-char)
- (cond
- ((eq (car (syntax-after (point))) 15) (point))
- (in-comment (when (sp-point-in-comment) (1+ (point))))
- ((and (not in-comment) (sp-point-in-comment)) (1+ (point)))
- ((or in-comment in-string) (1+ (point)))))))
- (when (sp-point-in-string-or-comment) (point))))
- (string-bounds (and in-string-or-comment
- (progn
- (goto-char in-string-or-comment)
- (sp--get-string-or-comment-bounds))))
- (fw-bound (if in-string-or-comment (cdr string-bounds) (point-max)))
- (bw-bound (if in-string-or-comment (car string-bounds) (point-min)))
- s e forward mb me ms r done
- possible-pairs possible-interfering-pairs possible-ops possible-cls)
- (while (and (not done)
- (sp--search-and-save-match
- search-fn
- ;; #556 The regexp we use here might exclude or
- ;; include extra pairs in case the next match is in
- ;; a different context. There's no way to know
- ;; beforehand where we land, so we need to consider
- ;; *all* pairs in the search and then re-check with
- ;; a regexp based on the context of the found pair
- (sp--get-allowed-regexp
- ;; use all the pairs!
- (sp--get-pair-list))
- (if back bw-bound fw-bound)
- r mb me ms))
- ;; search for the first opening pair. Here, only consider tags
- ;; that are allowed in the current context.
- (unless (or (not (save-excursion
- (if back
- (progn
- (goto-char me)
- (sp--looking-back-p (sp--get-allowed-regexp)))
- (goto-char mb)
- (sp--looking-at-p (sp--get-allowed-regexp)))))
- (sp--skip-match-p ms mb me :global-skip global-skip-fn))
- ;; if the point originally wasn't inside of a string or comment
- ;; but now is, jump out of the string/comment and only search
- ;; the code. This ensures that the comments and strings are
- ;; skipped if we search inside code.
- (if (and (not in-string-or-comment)
- (if back
- ;; When searching back, the point lands on the
- ;; first character of whatever pair we've found
- ;; and it is in the proper context, for example
- ;; "|(foo)"
- (sp-point-in-string-or-comment)
- ;; However, when searching forward, the point
- ;; lands after the last char of the pair so to get
- ;; its context we must back up one character
- (sp-point-in-string-or-comment (1- (point)))))
- (-if-let (bounds (sp--get-string-or-comment-bounds))
- (let ((jump-to (if back (car bounds) (cdr bounds))))
- (goto-char jump-to)
- ;; Can't move out of comment because eob, #427
- (when (eobp)
- (setq done t)))
- (setq done t))
- (setq done t))))
- (when r
- (setq possible-pairs (--filter (or (equal ms (car it))
- (equal ms (cdr it)))
- pair-list))
- (setq possible-ops (-map 'car possible-pairs))
- (setq possible-cls (-map 'cdr possible-pairs))
- (setq pair-list (-difference pair-list possible-pairs))
- (setq possible-interfering-pairs pair-list)
- (while possible-interfering-pairs
- (setq possible-interfering-pairs
- (--filter (or (-contains? possible-ops (car it))
- (-contains? possible-cls (cdr it)))
- pair-list))
- (setq pair-list (-difference pair-list possible-interfering-pairs))
- (setq possible-ops (append possible-ops (-map 'car possible-interfering-pairs)))
- (setq possible-cls (append possible-cls (-map 'cdr possible-interfering-pairs))))
- (when (--any? (equal ms it) possible-ops)
- (setq forward t)
- (setq s mb)
- (when back
- (forward-char (length ms))))
- (when (--any? (equal ms it) possible-cls)
- (setq forward nil)
- (setq e me)
- (when (not back)
- (backward-char (length ms))))
- (let* ((opens (if forward possible-ops possible-cls))
- (closes (if forward possible-cls possible-ops))
- (needle (sp--strict-regexp-opt (append possible-ops possible-cls)))
- (search-fn (if forward 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (depth 1)
- (eof (if forward 'eobp 'bobp))
- (b (if forward fw-bound bw-bound))
- (open (substring-no-properties ms))
- (close (substring-no-properties ms))
- (failure (funcall eof))
- (skip-match-pair-fns (->> possible-ops
- (--mapcat (-when-let (smf (sp-get-pair it :skip-match))
- (list (cons it smf) (cons (sp-get-pair it :close) smf)))))))
- (while (and (> depth 0) (not (funcall eof)))
- (sp--search-and-save-match search-fn needle b r mb me ms)
- (if r
- (unless (or (and (not in-string-or-comment)
- (if forward (save-excursion
- (backward-char)
- (sp-point-in-string-or-comment))
- (sp-point-in-string-or-comment)))
- ;; check the individual pair skipper. We
- ;; need to test all the possible-ops,
- ;; which makes it a bit ugly :/
- (let ((skip-match-pair-fn
- (cdr (--first (equal (car it) ms) skip-match-pair-fns))))
- (sp--skip-match-p ms mb me :global-skip global-skip-fn :pair-skip skip-match-pair-fn)))
- (when (--any? (equal ms it) opens) (setq depth (1+ depth)))
- (when (--any? (equal ms it) closes) (setq depth (1- depth))))
- (unless (minibufferp)
- (sp-message :unmatched-expression))
- (setq depth -1)
- (setq failure t)))
- (if forward
- (setq e me)
- (setq s mb))
- (setq close (substring-no-properties ms))
- (if (or failure
- (/= depth 0))
- (progn
- (unless (minibufferp)
- (sp-message :unmatched-expression))
- nil)
- (let ((end-in-cos (sp-point-in-string-or-comment (1- e)))) ;; fix the "point on comment" issue
- (cond
- ((or (and (sp-point-in-string-or-comment s) (not end-in-cos))
- (and (not (sp-point-in-string-or-comment s)) end-in-cos))
- (unless (minibufferp)
- (sp-message :delimiter-in-string))
- nil)
- (t
- (let* ((op (if forward open close)))
- (list :beg s
- :end e
- :op op
- :cl (if forward close open)
- :prefix (sp--get-prefix s op)
- :suffix (sp--get-suffix e op)))))))))))))
-
-;; TODO: this does not consider unbalanced quotes in comments!!!
-(defun sp--find-next-stringlike-delimiter (needle search-fn-f &optional limit skip-fn)
- "Find the next string-like delimiter, considering the escapes
-and the skip-match predicate."
- (let (hit match)
- (while (and (not hit)
- (funcall search-fn-f needle limit t))
- (save-match-data
- (setq match (match-string-no-properties 0))
- (unless (or (save-match-data
- (save-excursion
- (goto-char (match-beginning 0))
- (or (sp--looking-back-p "\\\\" 2) ;; assumes \ is always the escape... bad?
- (and (eq major-mode 'emacs-lisp-mode)
- (not (sp-point-in-string))
- (sp--looking-back-p "?" 1)))))
- ;; TODO: HACK: global-skip is hack here!!!
- (sp--skip-match-p match (match-beginning 0) (match-end 0)
- :pair-skip (or skip-fn
- (sp-get-pair match :skip-match))
- :global-skip nil))
- (setq hit (match-data)))))
- hit))
-
-(defun sp-get-stringlike-expression (&optional back)
- "Find the nearest string-like expression after point.
-
-String-like expression is expression enclosed with the same
-opening and closing delimiter, such as *...*, \"...\", `...` etc."
- (sp--with-case-sensitive
- (save-excursion
- (let ((needle (sp--get-stringlike-regexp))
- (search-fn-f (if (not back) 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (search-fn-b (if back 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (count 0)
- m b e skip-match-fn limit ok)
- (when (not (equal needle ""))
- (when (sp--find-next-stringlike-delimiter needle search-fn-f)
- ;; assumes \ is always the escape... bad?
- (setq m (match-string-no-properties 0))
- (setq needle (regexp-quote m))
- (setq skip-match-fn (sp-get-pair m :skip-match))
- (cond
- ((sp-point-in-string)
- (setq limit (sp-get-quoted-string-bounds)))
- ((sp-point-in-comment)
- (setq limit (sp-get-comment-bounds))))
- (save-excursion
- (while (sp--find-next-stringlike-delimiter needle 'search-backward-regexp (car limit) skip-match-fn)
- (setq count (1+ count))))
- (when (= (mod count 2) 0)
- (sp--find-next-stringlike-delimiter needle search-fn-b nil))
- (save-excursion
- (setq ok (sp--find-next-stringlike-delimiter needle 'sp--search-backward-regexp (car limit)))
- (setq e (match-beginning 0)))
- (setq ok (and ok (sp--find-next-stringlike-delimiter needle 'search-forward-regexp (cdr limit))))
- (setq b (match-end 0))
- (when ok
- (let ((mb b) (me e))
- (setq b (min mb me))
- (setq e (max mb me)))
- (list :beg b :end e :op m :cl m :prefix (sp--get-prefix b m) :suffix (sp--get-suffix e m)))))))))
-
-(defun sp--textmode-stringlike-regexp (delimiters &optional direction)
- "Get a regexp matching text-mode string-like DELIMITERS.
-
-Capture group 1 or 2 has the delimiter itself, depending on the
-direction (forward, backward).
-
-If DIRECTION is :open, create a regexp matching opening only.
-
-If DIRECTION is :close, create a regexp matching closing only.
-
-If DIRECTION is nil, create a regexp matching both directions."
- (let* ((delims (regexp-opt delimiters))
- (re (concat
- (if (or (not direction)
- (eq direction :open))
- (concat "\\(?:" "\\(?:\\`\\|[ \t\n\r]\\)" "\\(" delims "\\)" "[^ \t\n\r]\\)") "")
- (if (not direction) "\\|" "")
- (if (or (not direction)
- (eq direction :close))
- (concat "\\(?:[^ \t\n\r]" "\\(" delims "\\)" "\\(?:[ \t\n\r[:punct:]]\\|\\'\\)" "\\)") ""))))
- re))
-
-(defun sp--find-next-textmode-stringlike-delimiter (needle search-fn-f &optional limit)
- "Find the next string-like delimiter, considering the escapes
-and the skip-match predicate."
- (let (hit)
- (while (and (not hit)
- (funcall search-fn-f needle limit t))
- (save-match-data
- (let* ((group (if (match-string 1) 1 2))
- (match (match-string-no-properties group))
- (mb (match-beginning group))
- (me (match-end group))
- (skip-fn (sp-get-pair match :skip-match)))
- (unless (sp--skip-match-p match mb me :pair-skip skip-fn :global-skip nil)
- (setq hit (list match (if (= group 1) :open :close)))))))
- hit))
-
-(defun sp-get-textmode-stringlike-expression (&optional back)
- "Find the nearest text-mode string-like expression.
-
-If BACK is non-nil search in the backwards direction.
-
-Text-mode string-like expression is one where the delimiters must
-be surrounded by whitespace from the outside. For example,
-
-foo *bar* baz
-
-is a valid expression enclosed in ** pair, but
-
-foo*bar*baz OR foo *bar*baz OR foo*bar* baz
-
-are not.
-
-This is the case in almost every markup language, and so we will
-adjust the parsing to only consider such pairs as delimiters.
-This makes the parsing much faster as it transforms the problem
-to non-stringlike matching and we can use a simple
-counting (stack) algorithm."
- (save-excursion
- (let ((restart-from (point))
- (bounds (or (sp-get-comment-bounds)
- (cons (point-min) (point-max))))
- hit re)
- (while (not hit)
- (goto-char restart-from)
- (save-excursion
- (ignore-errors
- (if back (forward-char) (backward-char)))
- (let* ((delimiters (-map 'car (sp--get-allowed-stringlike-list)))
- (needle (sp--textmode-stringlike-regexp delimiters))
- (search-fn-f (if (not back) 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (limit-f (if (not back) (cdr bounds) (car bounds))))
- (-if-let ((delim type) (sp--find-next-textmode-stringlike-delimiter needle search-fn-f limit-f))
- (let ((search-fn (if (eq type :open) 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (limit (if (eq type :open) (cdr bounds) (car bounds)))
- (needle (sp--textmode-stringlike-regexp (list delim) (if (eq type :open) :close :open))))
- (setq restart-from (point))
- ;; this adjustments are made because elisp regexp
- ;; can't do lookahead assertions... so we match and
- ;; then back up.
- (ignore-errors
- (when (and (not back) (eq type :open)) (backward-char (1+ (length delim))))
- (when (and (not back) (eq type :close) (not (eobp))) (backward-char 1))
- (when (and back (eq type :close)) (forward-char (1+ (length delim))))
- (when (and back (eq type :open) (not (bobp))) (forward-char 1)))
- (let ((other-end (point)))
- (when (sp--find-next-textmode-stringlike-delimiter needle search-fn limit)
- ;; Beware, we also need to test the beg/end of
- ;; buffer, because we have that variant in the
- ;; regexp. In that case the match does not
- ;; consume anything and we needn't do any
- ;; correction.
- (let* ((this-end (if (eq type :open)
- (max (point-min) (if (eobp) (point) (1- (point))))
- (min (point-max) (if (bobp) (point) (1+ (point))))))
- (b (min this-end other-end))
- (e (max this-end other-end)))
- (setq re (list :beg b
- :end e
- :op delim
- :cl delim
- :prefix (sp--get-prefix b delim) :suffix (sp--get-suffix e delim)))
- (setq hit t)
- ;; We ignore matches that contain two
- ;; consecutive newlines, as that usually means
- ;; there's a new paragraph somewhere inbetween
- ;; TODO: make this customizable
- (when (sp-get re
- (save-excursion
- (goto-char :beg)
- (re-search-forward "\n\n\\|\r\r" :end t)))
- (setq re nil)
- (setq hit nil))))))
- (setq hit :no-more)))))
- re)))
-
-(defun sp-use-textmode-stringlike-parser-p ()
- "Test if we should use textmode stringlike parser or not."
- (let ((modes (-filter 'symbolp sp-navigate-use-textmode-stringlike-parser))
- (derived (-map 'cdr (-remove 'symbolp sp-navigate-use-textmode-stringlike-parser))))
- (or (--any? (eq major-mode it) modes)
- (apply 'derived-mode-p derived))))
-
-(defun sp-get-stringlike-or-textmode-expression (&optional back delimiter)
- "Return a stringlike expression using stringlike or textmode parser.
-
-DELIMITER is a candidate in case we performed a search before
-calling this function and we know it's the closest string
-delimiter to try. This is purely a performance hack, do not rely
-on it when calling directly."
- (if (sp-use-textmode-stringlike-parser-p)
- (sp-get-textmode-stringlike-expression back)
- ;; performance hack. If the delimiter is a character in
- ;; syntax class 34, grab the string-like expression using
- ;; `sp-get-string'
- (if (and delimiter
- (= (length delimiter) 1)
- ;; TODO: this "smart" behaviour is duplicated in
- ;; `sp-get-thing', maybe the whole string parsing could
- ;; be extracted to some common function (actually we
- ;; should probably use this one from `sp-get-thing')
- (eq (char-syntax (string-to-char delimiter)) 34))
- (if (eq t (sp-point-in-string))
- ;; TODO: this is duplicated in `sp-get-thing', move to a function
- (save-excursion
- (save-restriction
- (widen)
- (-let (((beg . end) (sp-get-quoted-string-bounds)))
- (narrow-to-region beg end))
- (sp-get-stringlike-expression back)))
- (sp-get-string back))
- (sp-get-stringlike-expression back))))
-
-(defun sp-get-expression (&optional back)
- "Find the nearest balanced expression of any kind.
-
-For markup and text modes a special, more efficient stringlike
-parser is available, see `sp-get-textmode-stringlike-expression'.
-By default, this is enabled in all modes derived from
-`text-mode'. You can change it by customizing
-`sp-navigate-use-textmode-stringlike-parser'."
- (let ((pre (sp--get-allowed-regexp))
- (sre (sp--get-stringlike-regexp))
- (search-fn (if (not back) 'sp--search-forward-regexp 'sp--search-backward-regexp))
- (ps (if back (1- (point-min)) (1+ (point-max))))
- (ss (if back (1- (point-min)) (1+ (point-max))))
- (string-delim nil))
- (setq ps (if (equal pre "") ps
- (or (save-excursion (funcall search-fn pre nil t)) ps)))
- (setq ss (if (equal sre "") ss
- (or (--when-let (save-excursion
- (sp--find-next-stringlike-delimiter sre search-fn))
- (setq string-delim (match-string 0))
- (save-match-data
- (set-match-data it)
- (if back (match-beginning 0) (match-end 0))))
- ss)))
- ;; TODO: simplify this logic somehow... (this really depends
- ;; on a rewrite of the core parser logic: separation of "find
- ;; the valid opening" and "parse it")
-
- ;; Here, we sacrifice readability for performance. Because we
- ;; only use regexp to look forward for the closest pair, it
- ;; might occasionally happen that what we picked in fact
- ;; *can't* form a pair and it returns error (for example, it
- ;; is an unclosed pair or a quote between words like'so, which
- ;; doesn't form a pair). In such a case, or when the pair
- ;; found is further than the other possible pair type (for
- ;; example, we think we should parse stringlike, but we skip
- ;; the first occurrence and the next one is only after a
- ;; regular pair, which we should've picked instead), we must
- ;; try the other parser as well.
- (-let (((type . re) (if (or (and (not back) (< ps ss))
- (and back (> ps ss)))
- (cons :regular (sp-get-paired-expression back))
- (cons :string (sp-get-stringlike-or-textmode-expression back string-delim)))))
- (when re
- (sp-get re
- (cond
- ;; If the returned sexp is regular, but the
- ;; to-be-tried-string-expression is before it, we try
- ;; to parse it as well, it might be a complete sexp in
- ;; which case it should be returned.
- ((and (eq type :regular)
- (or (and (not back) (< ss :beg))
- (and back (> ss :end))))
- (or (sp-get-stringlike-or-textmode-expression back string-delim) re))
- ((and (eq type :string)
- (or (and (not back) (< ps :beg))
- (and back (> ps :end))))
- (or (sp-get-paired-expression back) re))
- (t re)))))))
-
-(defun sp-get-sexp (&optional back)
- "Find the nearest balanced expression that is after (before) point.
-
-Search backward if BACK is non-nil. This also means, if the
-point is inside an expression, this expression is returned.
-
-If `major-mode' is member of `sp-navigate-consider-sgml-tags',
-sgml tags will also be considered as sexps in current buffer.
-
-If the search starts outside a comment, all subsequent comments
-are skipped.
-
-If the search starts inside a string or comment, it tries to find
-the first balanced expression that is completely contained inside
-the string or comment. If no such expression exist, a warning is
-raised (for example, when you comment out imbalanced expression).
-However, if you start a search from within a string and the next
-complete sexp lies completely outside, this is returned. Note
-that this only works in modes where strings and comments are
-properly defined via the syntax tables.
-
-The return value is a plist with following keys:
-
- :beg - point in the buffer before the opening
- delimiter (ignoring prefix)
- :end - point in the buffer after the closing delimiter
- :op - opening delimiter
- :cl - closing delimiter
- :prefix - expression prefix
- :suffix - expression suffix
-
-However, you should never access this structure directly as it is
-subject to change. Instead, use the macro `sp-get' which also
-provide shortcuts for many commonly used queries (such as length
-of opening/closing delimiter or prefix)."
- (sp--maybe-init)
- (sp--with-case-sensitive
- (cond
- (sp-prefix-tag-object
- (sp-get-sgml-tag back))
- (sp-prefix-pair-object
- (sp-get-paired-expression back))
- ((memq major-mode sp-navigate-consider-sgml-tags)
- (let ((paired (sp-get-expression back)))
- (if (and paired
- (equal "<" (sp-get paired :op)))
- ;; if the point is inside the tag delimiter, return the pair.
- (if (sp-get paired (and (<= :beg-in (point)) (>= :end-in (point))))
- paired
- ;; if the tag can't be completed, we can at least return
- ;; the <> pair
- (or (sp-get-sgml-tag back) paired))
- ;; we can still try the tag if the first < or > is closer than
- ;; the pair. This is a bit too complicated... seems like a
- ;; more clever solution would be needed in the future, esp if
- ;; we add the python hack.
- (cond
- ((and (not back)
- (< (save-excursion
- (or (search-forward "<" nil t) (point-max)))
- (or (sp-get paired :beg) (point-max))))
- (or (sp-get-sgml-tag) paired))
- ((and back
- (> (save-excursion
- (or (search-backward ">" nil t) (point-min)))
- (or (sp-get paired :end) (point-max))))
- (or (sp-get-sgml-tag t) paired))
- (t paired)))))
- (t (sp-get-expression back)))))
-
-(defun sp--get-hybrid-sexp-beg ()
- "Get the beginning of hybrid sexp.
-See `sp-get-hybrid-sexp' for definition."
- (save-excursion
- (cl-labels ((indent-or-beg-of-line
- (lb)
- (if (sp-point-in-blank-line)
- lb
- (back-to-indentation)
- (point))))
- (let ((p (progn (when (sp-point-in-symbol) (sp-backward-sexp)) (point)))
- (lb (line-beginning-position))
- (cur (--if-let (save-excursion (sp-backward-sexp)) it (list :end 0))) ;hack
- last)
- (if (< (sp-get cur :end) lb)
- ;; if the line is not empty, we move the beg to the indent
- (indent-or-beg-of-line lb)
- (while (sp-get cur
- (and cur
- (> :end lb)
- (<= :end p)))
- (setq last cur)
- (setq cur (sp-backward-sexp)))
- (if last
- (sp-get last :beg-prf)
- ;; happens when there is no sexp before the opening delim of
- ;; the enclosing sexp. In case it is on line above, we take
- ;; the maximum wrt lb.
- (sp-get cur (max :beg-in (indent-or-beg-of-line lb)))))))))
-
-(defun sp--narrow-to-line ()
- "Narrow to the current line."
- (narrow-to-region (line-beginning-position) (line-end-position)))
-
-(defun sp--get-hybrid-sexp-end ()
- "Get the end of hybrid sexp.
-See `sp-get-hybrid-sexp' for definition."
- (save-excursion
- (cl-labels ((skip-prefix-backward
- (p)
- (save-excursion
- (goto-char p)
- (save-restriction
- (sp--narrow-to-line)
- (skip-syntax-backward " .")
- (point)))))
- (let ((p (progn (when (sp-point-in-symbol) (sp-backward-sexp)) (point)))
- (le (line-end-position))
- (cur (--if-let (save-excursion (sp-forward-sexp)) it (list :beg (1+ (point-max))))) ;hack
- last)
- (if (> (sp-get cur :beg) le)
- (if (sp-point-in-blank-line) le (skip-prefix-backward le))
- (while (sp-get cur
- (and cur
- (< :beg le)
- (>= :beg p)))
- (setq last cur)
- (setq cur (sp-forward-sexp)))
- (let ((r (skip-prefix-backward
- (if last
- (sp-get last :end)
- ;; happens when there is no sexp before the closing delim of
- ;; the enclosing sexp. In case it is on line below, we take
- ;; the minimum wrt le.
- (sp-get cur (min :end-in le))))))
- (goto-char r)
- ;; fix the situation when point ends in comment
- (cond
- ((sp-point-in-comment)
- (if (= (line-number-at-pos p)
- (line-number-at-pos r))
- (line-end-position)
- (goto-char p)
- (line-end-position)))
- (t r))))))))
-
-(defun sp--get-hybrid-suffix (p)
- "Get the hybrid sexp suffix, which is any punctuation after
-the end, possibly preceded by whitespace."
- (save-excursion
- (goto-char p)
- (buffer-substring-no-properties
- p
- (save-restriction
- (sp--narrow-to-line)
- (skip-syntax-forward " ")
- (if (not (looking-at "\\s."))
- p
- (skip-syntax-forward ".")
- (point))))))
-
-(defun sp-get-hybrid-sexp ()
- "Return the hybrid sexp around point.
-
-A hybrid sexp is defined as the smallest balanced region containing
-the point while not expanding further than the current line. That is,
-any hanging sexps will be included, but the expansion stops at the
-enclosing list boundaries or line boundaries."
- (let ((end (sp--get-hybrid-sexp-end)))
- (list :beg (sp--get-hybrid-sexp-beg)
- :end end
- :op ""
- :cl ""
- :prefix ""
- :suffix (sp--get-hybrid-suffix end))))
-
-(defun sp-get-enclosing-sexp (&optional arg)
- "Return the balanced expression that wraps point at the same level.
-
-With ARG, ascend that many times. This function expects a positive
-argument."
- (setq arg (or arg 1))
- (save-excursion
- (let ((n arg)
- (ok t)
- (okr))
- (while (and (> n 0) ok)
- (setq ok t)
- (setq okr nil)
- ;; if we are inside string, get the string bounds and "string
- ;; expression"
- (when (sp-point-in-string)
- (setq okr (sp-get-string)))
- ;; get the "normal" expression defined by pairs
- (let ((p (point)))
- (setq ok (sp-get-sexp))
- (cond
- ((and ok (= (sp-get ok :beg) p))
- (goto-char (sp-get ok :end))
- (setq n (1+ n)))
- ((and ok (< (sp-get ok :beg) p))
- (goto-char (sp-get ok :end)))
- (t
- (while (and ok (>= (sp-get ok :beg) p))
- (setq ok (sp-get-sexp))
- (when ok (goto-char (sp-get ok :end)))))))
- ;; if the pair expression is enclosed inside a string, return
- ;; the pair expression, otherwise return the string expression
- (when okr
- (unless (and ok
- (sp-compare-sexps ok okr >=)
- (sp-compare-sexps ok okr <= :end))
- (setq ok okr)
- (goto-char (sp-get ok :end))))
- (setq n (1- n)))
- (if (not (and (not ok)
- sp-navigate-comments-as-sexps))
- ok
- (when (sp-point-in-comment)
- (let* ((cb (sp-get-comment-bounds))
- (b (save-excursion
- (goto-char (car cb))
- (sp-skip-backward-to-symbol t)
- (point)))
- (e (save-excursion
- (goto-char (cdr cb))
- (sp-skip-forward-to-symbol t)
- (point))))
- (list :beg b :end e :op "" :cl "" :prefix sp-comment-char)))))))
-
-(defun sp-get-list-items (&optional lst)
- "Return the information about expressions inside LST.
-
-LST should be a data structure in format as returned by
-`sp-get-sexp'.
-
-The return value is a list of such structures in order as they
-occur inside LST describing each expression, with LST itself
-prepended to the front.
-
-If LST is nil, the list at point is used (that is the list
-following point after `sp-backward-up-sexp' is called)."
- (let ((r nil))
- (save-excursion
- (unless lst
- (setq lst (sp-backward-up-sexp)))
- (when lst
- (goto-char (sp-get lst :beg-in))
- (while (< (point) (sp-get lst :end))
- (!cons (sp-forward-sexp) r))
- (cons lst (nreverse (cdr r)))))))
-
-(cl-defun sp--get-prefix (&optional (p (point)) op)
- "Get the prefix of EXPR.
-
-Prefix is any continuous sequence of characters in \"expression
-prefix\" syntax class. You can also specify a set of syntax code
-characters or a regexp for a specific major mode. See
-`sp-sexp-prefix'.
-
-The point is expected to be at the opening delimiter of the sexp
-and the prefix is searched backwards.
-
-If the prefix property is defined for OP, the associated regexp
-is used to retrieve the prefix instead of the global setting."
- (sp--with-case-sensitive
- (save-excursion
- (goto-char p)
- (let* ((pref (sp-get-pair op :prefix))
- (prefix
- (if pref
- (when (sp--looking-back pref sp-max-prefix-length)
- (match-string-no-properties 0))
- (-if-let (mmode-prefix (cdr (assoc major-mode sp-sexp-prefix)))
- (cond
- ((and (eq (car mmode-prefix) 'regexp)
- (sp--looking-back (cadr mmode-prefix)))
- (match-string-no-properties 0))
- ((eq (car mmode-prefix) 'syntax)
- (skip-syntax-backward (cadr mmode-prefix))
- (buffer-substring-no-properties (point) p))
- (t ""))
- (backward-prefix-chars)
- (buffer-substring-no-properties (point) p)))))
- ;; do not consider it a prefix if it matches some opening or
- ;; closing delimiter which is allowed for parsing in current
- ;; context
- (goto-char p)
- (if (and (< 0 (length prefix))
- (or (sp--do-action-p prefix 'navigate)
- (sp--do-action-p
- (car (--first (equal (cdr it) prefix)
- sp-pair-list))
- 'navigate)))
- ""
- prefix)))))
-
-(cl-defun sp--get-suffix (&optional (p (point)) op)
- "Get the suffix of EXPR.
-
-Suffix is any continuous sequence of characters in the
-\"punctuation suffix\" syntax class. You can also specify a set
-of syntax code characters or a regexp for a specific major mode.
-See `sp-sexp-suffix'.
-
-If the suffix property is defined for OP, the associated regexp
-is used to retrieve the suffix instead of the global setting."
- (sp--with-case-sensitive
- (save-excursion
- (goto-char p)
- (let* ((suff (sp-get-pair op :suffix))
- (suffix
- (if suff
- (when (sp--looking-at suff)
- (match-string-no-properties 0))
- (-if-let (mmode-suffix (cdr (assoc major-mode sp-sexp-suffix)))
- (cond
- ((and (eq (car mmode-suffix) 'regexp)
- (sp--looking-at (cadr mmode-suffix)))
- (match-string-no-properties 0))
- ((eq (car mmode-suffix) 'syntax)
- (skip-syntax-forward (cadr mmode-suffix))
- (buffer-substring-no-properties p (point)))
- (t ""))
- (skip-syntax-forward ".")
- (buffer-substring-no-properties p (point))))))
- ;; do not consider it a suffix if it matches some opening or
- ;; closing delimiter which is allowed for parsing in current
- ;; context
- (goto-char p)
- (if (and (< 0 (length suffix))
- (or (sp--do-action-p suffix 'navigate)
- (sp--do-action-p
- (car (--first (equal (cdr it) suffix)
- sp-pair-list))
- 'navigate)))
- ""
- suffix)))))
-
-(defun sp-get-symbol (&optional back)
- "Find the nearest symbol that is after point, or before point if BACK is non-nil.
-
-This also means, if the point is inside a symbol, this symbol is
-returned. Symbol is defined as a chunk of text recognized by
-`sp-forward-symbol'.
-
-The return value is a plist with the same format as the value
-returned by `sp-get-sexp'."
- (sp--maybe-init)
- (let (b e last-or-first)
- (save-excursion
- (if back
- (progn
- (sp-skip-backward-to-symbol)
- (when (= (point) (point-min)) (setq last-or-first t))
- (sp-forward-symbol -1)
- (setq b (point))
- (sp-forward-symbol 1)
- (setq e (point)))
- (sp-skip-forward-to-symbol)
- (when (= (point) (point-max)) (setq last-or-first t))
- (sp-forward-symbol 1)
- (setq e (point))
- (sp-forward-symbol -1)
- (setq b (point))))
- (unless last-or-first
- (list :beg b :end e :op "" :cl "" :prefix (sp--get-prefix b) :suffix (sp--get-suffix e)))))
-
-(defun sp--get-string (bounds)
- "Return the `sp-get-sexp' format info about the string.
-
-This function simply transforms BOUNDS, which is a cons (BEG
-. END) into format compatible with `sp-get-sexp'."
- (let* ((op (char-to-string (char-after (car bounds))))
- (cl (char-to-string (char-before (cdr bounds)))))
- ;; if the closing and opening isn't the same token, we should
- ;; return nil
- (when (equal op cl)
- (list :beg (car bounds)
- :end (cdr bounds)
- :op cl
- :cl cl
- :prefix (sp--get-prefix (car bounds) op)
- :suffix (sp--get-suffix (cdr bounds) cl)))))
-
-(defun sp-get-string (&optional back)
- "Find the nearest string after point, or before if BACK is non-nil.
-
-This also means if the point is inside a string, this string is
-returned. If there are another symbols between point and the
-string, nil is returned. That means that this function only
-return non-nil if the string is the very next meaningful
-expression.
-
-The return value is a plist with the same format as the value
-returned by `sp-get-sexp'."
- (sp--maybe-init)
- (if (sp-point-in-comment)
- (sp-get-stringlike-expression back)
- (if (sp-point-in-string)
- (let ((r (sp-get-quoted-string-bounds)))
- (sp--get-string r))
- (save-excursion
- (sp-skip-into-string back)
- (--when-let (sp-get-quoted-string-bounds)
- (sp--get-string it))))))
-
-(defun sp-get-whitespace ()
- "Get the whitespace around point.
-
-Whitespace here is defined as any of the characters: space, tab
-and newline."
- (list :beg (save-excursion (skip-chars-backward " \t\n") (point))
- :end (save-excursion (skip-chars-forward " \t\n") (point))
- :op ""
- :cl ""
- :prefix ""
- :suffix ""))
-
-(defun sp--sgml-get-tag-name (match)
- (let ((sub (if (equal "/" (substring match 1 2))
- (substring match 2)
- (substring match 1))))
- (car (split-string sub "\\( \\|>\\)"))))
-
-(defun sp--sgml-opening-p (tag)
- (not (equal "/" (substring tag 1 2))))
-
-(defun sp--sgml-ignore-tag (tag)
- "Return non-nil if tag should be ignored in search, nil otherwise."
- (member tag '("!--" "!DOCTYPE")))
-
-(defun sp-get-sgml-tag (&optional back)
- (sp--maybe-init)
- (sp--with-case-sensitive
- (save-excursion
- (let ((search-fn (if (not back) 'sp--search-forward-regexp 'search-backward-regexp))
- tag tag-name needle
- open-start open-end
- close-start close-end)
- (when (and (funcall search-fn "</?.*?\\s-?.*?>" nil t)
- (progn
- (setq tag (substring-no-properties (match-string 0)))
- (setq tag-name (sp--sgml-get-tag-name tag))
- (not (sp--sgml-ignore-tag tag-name))))
- (setq needle (concat "</?" tag-name))
- (let* ((forward (sp--sgml-opening-p tag))
- (search-fn (if forward 'sp--search-forward-regexp 'search-backward-regexp))
- (depth 1))
- (save-excursion
- (if (not back)
- (progn
- (setq open-end (point))
- (search-backward-regexp "<" nil t)
- (setq open-start (point)))
- (setq open-start (point))
- (search-forward-regexp ">" nil t)
- (setq open-end (point))))
- (cond
- ((and (not back) (not forward))
- (goto-char (match-beginning 0)))
- ((and back forward)
- (goto-char (match-end 0))))
- (while (> depth 0)
- (if (funcall search-fn needle nil t)
- (if (sp--sgml-opening-p (match-string 0))
- (if forward (setq depth (1+ depth)) (setq depth (1- depth)))
- (if forward (setq depth (1- depth)) (setq depth (1+ depth))))
- (setq depth -1)))
- (if (eq depth -1)
- (progn (sp-message :no-matching-tag) nil)
- (save-excursion
- (if forward
- (progn
- (setq close-start (match-beginning 0))
- (search-forward-regexp ">" nil t)
- (setq close-end (point)))
- (setq close-start (point))
- (search-forward-regexp ">" nil t)
- (setq close-end (point))))
- (let ((op (buffer-substring-no-properties open-start open-end))
- (cl (buffer-substring-no-properties close-start close-end)))
- (list :beg (if forward open-start close-start)
- :end (if forward close-end open-end)
- :op (if forward op cl)
- :cl (if forward cl op)
- :prefix ""
- :suffix "")))))))))
-
-(defun sp--end-delimiter-closure (pairs pair-list)
- "Compute the \"end-delimiter\" closure of set PAIRS.
-
-PAIRS can be:
-- single pair ID
-- single cons with opening and closing delimiter
-- list of pair IDs
-- list of conses of opening and closing delimiters
-
-For example, if we have pairs (if . end) and (def . end), then
-the closure of \"if\" pair are both of these because they share
-the closing delimiter. Therefore, in the navigation functions,
-both have to be considered by the parser."
- (let* ((pairs (-flatten (list pairs)))
- (pairs (if (consp (car pairs)) (-map 'car pairs) pairs))
- (pairs (--filter (member (car it) pairs) pair-list))
- (closure (-mapcat
- (lambda (x)
- (--filter (equal (cdr x) (cdr it)) pair-list))
- pairs)))
- closure))
-
-(defun sp-restrict-to-pairs (pairs function)
- "Call the FUNCTION restricted to PAIRS.
-
-PAIRS is either an opening delimiter of a list of opening
-delimiters.
-
-FUNCTION is a function symbol.
-
-For example, you can restrict function `sp-down-sexp' to the
-pair (\"{\" . \"}\") for easier navigation of blocks in C-like
-languages."
- (let* ((pairs (-flatten (list pairs)))
- (new-pairs (--filter (member (car it) pairs) sp-pair-list))
- (sp-pair-list (sp--end-delimiter-closure new-pairs sp-pair-list)))
- (call-interactively function)))
-
-(defun sp-restrict-to-object (object function)
- "Call the FUNCTION restricted to OBJECT.
-
-OBJECT is one of following symbols (you have to quote it!):
-- `sp-prefix-pair-object'
-- `sp-prefix-tag-object'
-- `sp-prefix-symbol-object'
-
-This function will enable this prefix and then call FUNCTION.
-
-FUNCTION is a function symbol.
-
-This function is equivalent to doing:
-
- (let ((sp-prefix-object t))
- (call-interactively function))
-
-For example, you can restrict function `sp-forward-sexp' to just
-the pairs for easier navigation of blocks in C-like languages."
- (cl-letf (((symbol-value object) t))
- (call-interactively function)))
-
-;; TODO: add shorter alias?
-(defun sp-restrict-to-pairs-interactive (pairs function)
- "Return an interactive lambda that calls FUNCTION restricted to PAIRS.
-
-See `sp-restrict-to-pairs'.
-
-This function implements a \"decorator pattern\", that is, you
-can apply another scoping function to the output of this function
-and the effects will added together. In particular, you can
-combine it with:
-
-- `sp-restrict-to-object-interactive'
-
-You can also bind the output of this function directly to a key, like:
-
- (global-set-key (kbd ...) (sp-restrict-to-pairs-interactive \"{\" 'sp-down-sexp))
-
-This will be a function that descends down only into { } pair,
-ignoring all others."
- (lambda (&optional _arg)
- (interactive "P")
- (sp-restrict-to-pairs pairs function)))
-
-(defun sp-restrict-to-object-interactive (object function)
- "Return an interactive lambda that calls FUNCTION restricted to OBJECT.
-
-See `sp-restrict-to-object'.
-
-This function implements a \"decorator pattern\", that is, you
-can apply another scoping function to the output of this function
-and the effects will added together. In particular, you can
-combine it with:
-
-- `sp-restrict-to-pairs-interactive'
-
-You can also bind the output of this function directly to a key, like:
-
- (global-set-key (kbd ...) (sp-restrict-to-object-interactive
- 'sp-prefix-pair-object
- 'sp-forward-sexp))
-
-This will be a function that navigates only by using paired
-expressions, ignoring strings and sgml tags."
- (lambda (&optional _arg)
- (interactive "P")
- (sp-restrict-to-object object function)))
-
-(defun sp-prefix-tag-object (&optional _arg)
- "Read the command and invoke it on the next tag object.
-
-If you specify a regular emacs prefix argument this is passed to
-the executed command. Therefore, executing
-\"\\[universal-argument] 2 \\[sp-prefix-tag-object] \\[sp-forward-sexp]\" will move two tag
-expressions forward, ignoring possible symbols or paired
-expressions inbetween.
-
-Tag object is anything delimited by sgml tag."
- (interactive "P")
- (let* ((cmd (read-key-sequence "" t))
- (com (key-binding cmd))
- (sp-prefix-tag-object t))
- (if (commandp com)
- (call-interactively com)
- (execute-kbd-macro cmd))))
-
-(defun sp-prefix-pair-object (&optional _arg)
- "Read the command and invoke it on the next pair object.
-
-If you specify a regular emacs prefix argument this is passed to
-the executed command. Therefore, executing
-\"\\[universal-argument] 2 \\[sp-prefix-pair-object] \\[sp-forward-sexp]\" will move two paired
-expressions forward, ignoring possible symbols inbetween.
-
-Pair object is anything delimited by pairs from `sp-pair-list'."
- (interactive "P")
- (let* ((cmd (read-key-sequence "" t))
- (com (key-binding cmd))
- (sp-prefix-pair-object t))
- (if (commandp com)
- (call-interactively com)
- (execute-kbd-macro cmd))))
-
-(defun sp-prefix-symbol-object (&optional _arg)
- "Read the command and invoke it on the next pair object.
-
-If you specify a regular emacs prefix argument this is passed to
-the executed command. Therefore, executing
-\"\\[universal-argument] 2 \\[sp-prefix-symbol-object] \\[sp-forward-sexp]\" will move two symbols
-forward, ignoring any structure.
-
-Symbol is defined as a chunk of text recognized by
-`sp-forward-symbol'."
- (interactive "P")
- (let* ((cmd (read-key-sequence "" t))
- (com (key-binding cmd))
- (sp-prefix-symbol-object t))
- (if (commandp com)
- (call-interactively com)
- (execute-kbd-macro cmd))))
-
-(defun sp-prefix-save-excursion (&optional _arg)
- "Execute the command keeping the point fixed.
-
-If you specify a regular emacs prefix argument this is passed to
-the executed command."
- (interactive "P")
- (let* ((cmd (read-key-sequence "" t))
- (com (key-binding cmd)))
- (sp--keep-indentation
- (save-excursion
- (if (commandp com)
- (call-interactively com)
- (execute-kbd-macro cmd))))))
-
-(defun sp-get-thing (&optional back)
- "Find next thing after point, or before if BACK is non-nil.
-
-Thing is either symbol (`sp-get-symbol'),
-string (`sp-get-string') or balanced expression recognized by
-`sp-get-sexp'.
-
-If `sp-navigate-consider-symbols' is nil, only balanced
-expressions are considered."
- (sp--maybe-init)
- (sp--with-case-sensitive
- (cond
- (sp-prefix-tag-object (sp-get-sgml-tag back))
- (sp-prefix-pair-object (sp-get-paired-expression back))
- (sp-prefix-symbol-object (sp-get-symbol back))
- (t
- (if back
- (if (not sp-navigate-consider-symbols)
- (sp-get-sexp t)
- (save-excursion
- (cond
- ((sp-point-in-empty-string)
- (sp-get-string t))
- (t
- (sp-skip-backward-to-symbol t nil t)
- (cond
- ;; this is an optimization, we do not need to look up
- ;; the "pair" expression first. If this fails, follow
- ;; up with regular sexps
- ((and (memq major-mode sp-navigate-consider-sgml-tags)
- (or (sp--looking-back ">")
- ;; sp-skip-backward-to-symbol moves the
- ;; point to the end of an element name in
- ;; js2-jsx-mode
- (looking-at ">"))
- (sp-get-sgml-tag t)))
- ((sp--valid-initial-delimiter-p (sp--looking-back (sp--get-closing-regexp (sp--get-allowed-pair-list)) nil))
- (sp-get-sexp t))
- ((sp--valid-initial-delimiter-p (sp--looking-back (sp--get-opening-regexp (sp--get-allowed-pair-list)) nil))
- (sp-get-sexp t))
- ((and (eq (syntax-class (syntax-after (1- (point)))) 7)
- (not (sp-char-is-escaped-p (1- (point)))))
- (if (eq t (sp-point-in-string))
- (save-excursion
- (save-restriction
- (widen)
- (-let (((beg . end) (sp-get-quoted-string-bounds)))
- (narrow-to-region beg end))
- (sp-get-stringlike-expression t)))
- (sp-get-string t)))
- ((sp--valid-initial-delimiter-p (sp--looking-back (sp--get-stringlike-regexp) nil))
- (sp-get-expression t))
- ;; We might be somewhere inside the prefix of the
- ;; sexp after the point. Since the prefix can be
- ;; specified as regexp and not syntax class, it might
- ;; itself by a symbol which would invalidly get
- ;; picked here.
- (t (-when-let (sym (sp-get-symbol t))
- (save-excursion
- (sp-get sym (goto-char :end))
- (if (sp--valid-initial-delimiter-p (sp--looking-at (sp--get-opening-regexp (sp--get-allowed-pair-list))))
- (let* ((ms (match-string 0))
- (pref (sp--get-prefix (point) ms)))
- (if (and pref
- (not (equal pref "")))
- (sp-get-sexp t)
- sym))
- sym)))))))))
- (if (not sp-navigate-consider-symbols)
- (sp-get-sexp nil)
- (save-excursion
- (cond
- ((sp-point-in-empty-string)
- (sp-get-string nil))
- (t
- (sp-skip-forward-to-symbol t nil t)
- (cond
- ((and (memq major-mode sp-navigate-consider-sgml-tags)
- (or (looking-at "<")
- ;; sp-skip-forward-to-symbol moves the point
- ;; to the beginning of an element name in
- ;; js2-jsx-mode
- (and (sp--looking-back "</?" (- (point) 2))
- (goto-char (match-beginning 0))))
- (sp-get-sgml-tag)))
- ((sp--valid-initial-delimiter-p (sp--looking-at (sp--get-opening-regexp (sp--get-allowed-pair-list))))
- (sp-get-sexp nil))
- ((sp--valid-initial-delimiter-p (sp--looking-at (sp--get-closing-regexp (sp--get-allowed-pair-list))))
- (sp-get-sexp nil))
- ;; TODO: merge the following two conditions and use
- ;; `sp-get-stringlike-or-textmode-expression'
- ((and (eq (syntax-class (syntax-after (point))) 7)
- (not (sp-char-is-escaped-p)))
- ;; It might happen that the string delimiter we are
- ;; looking at is nested inside another string
- ;; delimited by string fences (for example nested "
- ;; and ' in python). In this case we can't use
- ;; `sp-get-string' parser because it would pick up the
- ;; outer string. So if we are inside a string and
- ;; `syntax-ppss' returns t as delimiter we need to use
- ;; `sp-get-stringlike-expression'
- (if (eq t (sp-point-in-string))
- (save-excursion
- (save-restriction
- (widen)
- (-let (((beg . end) (sp-get-quoted-string-bounds)))
- (narrow-to-region beg end))
- (sp-get-stringlike-expression nil)))
- (sp-get-string nil)))
- ((sp--valid-initial-delimiter-p (sp--looking-at (sp--get-stringlike-regexp)))
- (sp-get-expression nil))
- ;; it can still be that we are looking at a /prefix/ of a
- ;; sexp. We should skip a symbol forward and check if it
- ;; is a sexp, and then maybe readjust the output.
- (t (let* ((sym (sp-get-symbol nil))
- (sym-string (and sym (sp-get sym (buffer-substring-no-properties :beg :end))))
- (point-before-prefix (point)))
- (when sym-string
- (if (sp--valid-initial-delimiter-p (sp--search-forward-regexp (sp--get-opening-regexp (sp--get-pair-list-context 'navigate)) nil t))
- (let* ((ms (match-string 0))
- (pref (progn
- ;; need to move before the
- ;; opening, so (point) evals
- ;; there.
- (backward-char (length ms))
- (sp--get-prefix (point) ms))))
- ;; We use >= because the first skip to
- ;; symbol might have skipped some prefix
- ;; chars which make prefix of the symbol
- ;; which together make prefix of a sexp.
- ;; For example \foo{} in latex, where \ is
- ;; prefix of symbol foo and \foo is prefix
- ;; of {
- (if (and pref
- (not (equal pref ""))
- (>= point-before-prefix (- (point) (length pref))))
- (sp-get-sexp nil)
- sym))
- sym))))))))))))))
-
-(defun sp-narrow-to-sexp (arg)
- "Make text outside current balanced expression invisible.
-A numeric arg specifies to move up by that many enclosing expressions.
-
-See also `narrow-to-region' and `narrow-to-defun'."
- (interactive "p")
- (-when-let (enc (sp-get-enclosing-sexp arg))
- (sp-get enc (narrow-to-region :beg-prf :end))))
-
-(defun sp-forward-sexp (&optional arg)
- "Move forward across one balanced expression.
-
-With ARG, do it that many times. Negative arg -N means move
-backward across N balanced expressions. If there is no forward
-expression, jump out of the current one (effectively doing
-`sp-up-sexp').
-
-With `sp-navigate-consider-symbols' symbols and strings are also
-considered balanced expressions.
-
-Examples: (prefix arg in comment)
-
- |(foo bar baz) -> (foo bar baz)|
-
- (|foo bar baz) -> (foo| bar baz)
-
- (|foo bar baz) -> (foo bar| baz) ;; 2
-
- (foo (bar baz|)) -> (foo (bar baz)|)"
- (interactive "^p")
- (setq arg (or arg 1))
- (if (< arg 0)
- (sp-backward-sexp (- arg))
- (let* ((n arg)
- (ok t))
- (while (and ok (> n 0))
- (setq ok (sp-get-thing))
- (setq n (1- n))
- (when ok (goto-char (sp-get ok :end))))
- ok)))
-
-(put 'sp-forward-sexp 'CUA 'move)
-
-(defun sp-backward-sexp (&optional arg)
- "Move backward across one balanced expression (sexp).
-
-With ARG, do it that many times. Negative arg -N means move
-forward across N balanced expressions. If there is no previous
-expression, jump out of the current one (effectively doing
-`sp-backward-up-sexp').
-
-With `sp-navigate-consider-symbols' symbols and strings are also
-considered balanced expressions.
-
-Examples: (prefix arg in comment)
-
- (foo bar baz)| -> |(foo bar baz)
-
- (foo| bar baz) -> (|foo bar baz)
-
- (foo bar| baz) -> (|foo bar baz) ;; 2
-
- ((|foo bar) baz) -> (|(foo bar) baz)"
- (interactive "^p")
- (setq arg (or arg 1))
- (if (< arg 0)
- (sp-forward-sexp (- arg))
- (let* ((n arg)
- (ok t))
- (while (and ok (> n 0))
- (setq ok (sp-get-thing t))
- (setq n (1- n))
- (when ok (goto-char (sp-get ok :beg))))
- ok)))
-
-(put 'sp-backward-sexp 'CUA 'move)
-
-(defun sp-next-sexp (&optional arg)
- "Move forward to the beginning of next balanced expression.
-
-With ARG, do it that many times. If there is no next expression
-at current level, jump one level up (effectively doing
-`sp-backward-up-sexp'). Negative arg -N means move to the
-beginning of N-th previous balanced expression.
-
-If `sp-navigate-interactive-always-progress-point' is non-nil,
-and this is called interactively, the point will move to the
-first expression in forward direction where it will end up
-greater than the current location.
-
-With `sp-navigate-consider-symbols' symbols and strings are also
-considered balanced expressions.
-
-Examples:
-
- ((foo) |bar (baz quux)) -> ((foo) bar |(baz quux))
-
- ((foo) bar |(baz quux)) -> |((foo) bar (baz quux))
-
-and with non-nil `sp-navigate-interactive-always-progress-point'
-
- (f|oo bar) -> (foo |bar)
-
- ((fo|o) (bar)) -> ((foo) |(bar))"
- (interactive "^p")
- (setq arg (or arg 1))
- (if (<= arg 0)
- (sp-backward-sexp (- arg))
- (if (and sp-navigate-interactive-always-progress-point
- (called-interactively-p 'any))
- (progn
- (while (< 0 arg)
- (let ((point-start (point)))
- (while (--when-let (sp-forward-sexp)
- (<= (sp-get it :beg) point-start))))
- (setq arg (1- arg)))
- (goto-char (sp-get (sp-get-thing t) :beg)))
- (if (= arg 1)
- (-when-let (ok (sp-get-thing))
- (if (= (point) (sp-get ok :beg))
- (progn (sp-forward-sexp 2)
- (sp-backward-sexp))
- (goto-char (sp-get ok :beg))
- ok))
- (sp-forward-sexp arg)
- (sp-backward-sexp)))))
-
-(put 'sp-next-sexp 'CUA 'move)
-
-(defun sp-previous-sexp (&optional arg)
- "Move backward to the end of previous balanced expression.
-
-With ARG, do it that many times. If there is no next
-expression at current level, jump one level up (effectively
-doing `sp-up-sexp'). Negative arg -N means move to the end of
-N-th following balanced expression.
-
-With `sp-navigate-consider-symbols' symbols and strings are also
-considered balanced expressions.
-
-If `sp-navigate-interactive-always-progress-point' is non-nil,
-and this is called interactively, the point will move to the
-first expression in backward direction where it will end up
-less than the current location.
-
-Examples:
-
- ((foo) bar| (baz quux)) -> ((foo)| bar (baz quux))
-
- ((foo)| bar (baz quux)) -> ((foo) bar (baz quux))|
-
-and if `sp-navigate-interactive-always-progress-point' is non-nil
-
- (foo b|ar baz) -> (foo| bar baz)
-
- (foo (b|ar baz)) -> (foo| (bar baz))"
- (interactive "^p")
- (setq arg (or arg 1))
- (if (<= arg 0)
- (sp-forward-sexp (- arg))
- (if (and sp-navigate-interactive-always-progress-point
- ;; (called-interactively-p 'any)
- )
- (progn
- (while (< 0 arg)
- (let ((point-start (point)))
- (while (--when-let (sp-backward-sexp)
- (>= (sp-get it :end) point-start))))
- (setq arg (1- arg)))
- (goto-char (sp-get (sp-get-thing) :end)))
- (if (= arg 1)
- (-when-let (ok (sp-get-thing t))
- (if (= (point) (sp-get ok :end))
- (progn (sp-backward-sexp 2)
- (sp-forward-sexp))
- (goto-char (sp-get ok :end))
- ok))
- (sp-backward-sexp arg)
- (sp-forward-sexp)))))
-
-(put 'sp-previous-sexp 'CUA 'move)
-
-(defun sp-forward-parallel-sexp (&optional arg)
- "Move forward across one balanced expressions at the same depth.
-
-If calling `sp-forward-sexp' at point would result in raising a
-level up, loop back to the first expression at current level,
-that is the first child of the enclosing sexp as defined by
-`sp-get-enclosing-sexp'."
- (interactive "^p")
- (setq arg (or arg 1))
- (if (< arg 0)
- (sp-backward-parallel-sexp (- arg))
- (let (re)
- (while (> arg 0)
- (setq arg (1- arg))
- (let ((next (sp-get-thing))
- (prev (sp-get-thing t)))
- (setq
- re
- (cond
- ((eq next nil)
- (goto-char (point-min))
- (sp-forward-sexp))
- ((eq prev nil)
- (goto-char (sp-get next :end))
- next)
- (t (if (> (sp-get next :beg) (sp-get prev :beg))
- (progn
- (goto-char (sp-get next :end))
- next)
- (goto-char (sp-get next :beg-in))
- (sp-forward-sexp)))))))
- re)))
-
-(defun sp-backward-parallel-sexp (&optional arg)
- "Move backward across one balanced expressions at the same depth.
-
-If calling `sp-backward-sexp' at point would result in raising a
-level up, loop back to the last expression at current level, that
-is the last child of the enclosing sexp as defined by
-`sp-get-enclosing-sexp'."
- (interactive "^p")
- (setq arg (or arg 1))
- (if (< arg 0)
- (sp-forward-parallel-sexp (- arg))
- (let (re)
- (while (> arg 0)
- (setq arg (1- arg))
- (let ((next (sp-get-thing))
- (prev (sp-get-thing t)))
- (setq
- re
- (cond
- ((eq prev nil)
- (goto-char (point-max))
- (sp-backward-sexp))
- ((eq next nil)
- (goto-char (sp-get prev :beg))
- prev)
- (t (if (< (sp-get prev :end) (sp-get next :end))
- (progn
- (goto-char (sp-get prev :beg))
- prev)
- (goto-char (sp-get prev :end-in))
- (sp-backward-sexp)))))))
- re)))
-
-(defun sp--raw-argument-p (arg)
- "Return t if ARG represents raw argument, that is a non-empty list."
- (and (listp arg) (car arg)))
-
-(defun sp--negate-argument (arg)
- "Return the argument ARG but negated.
-
-If the argument is a raw prefix argument (cons num nil) return a
-list with its car negated. If the argument is just the - symbol,
-return 1. If the argument is nil, return -1. Otherwise negate
-the input number."
- (cond
- ((sp--raw-argument-p arg) (list (- (car arg))))
- ((eq arg '-) 1)
- ((not arg) -1)
- (t (- arg))))
-
-(defun sp-down-sexp (&optional arg)
- "Move forward down one level of sexp.
-
-With ARG, do this that many times. A negative argument -N means
-move backward but still go down a level.
-
-If ARG is raw prefix argument \\[universal-argument], descend forward as much as
-possible.
-
-If ARG is raw prefix argument \\[universal-argument] \\[universal-argument], jump to the beginning of
-current list.
-
-If the point is inside sexp and there is no down expression to
-descend to, jump to the beginning of current one. If moving
-backwards, jump to end of current one.
-
-Examples:
-
- |foo (bar (baz quux)) -> foo (|bar (baz quux))
-
- |foo (bar (baz quux)) -> foo (bar (|baz quux)) ;; 2
-
- |foo (bar (baz (quux) blab)) -> foo (bar (baz (|quux) blab)) ;; \\[universal-argument]
-
- (foo (bar baz) |quux) -> (|foo (bar baz) quux)
-
- (blab foo |(bar baz) quux) -> (|blab foo (bar baz) quux) ;; \\[universal-argument] \\[universal-argument]"
- (interactive "^P")
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (n (abs arg))
- (ok t)
- (last-point -1))
- (if (and raw (= (abs arg) 16))
- ;; jump to the beginning/end of current list
- (-when-let (enc (sp-get-enclosing-sexp))
- (if (> arg 0)
- (goto-char (sp-get enc :beg-in))
- (goto-char (sp-get enc :end-in)))
- (setq ok enc))
- ;; otherwise descend normally
- (while (and ok (> n 0))
- (setq ok (sp-get-sexp (< arg 0)))
- ;; if the prefix was C-u, we do not decrease n and instead set
- ;; it to -1 when (point) == "last ok"
- (if raw
- (when (= (point) last-point)
- (setq n -1))
- (setq n (1- n)))
- (when ok
- (setq last-point (point))
- (if (< arg 0)
- (goto-char (sp-get ok :end-in))
- (goto-char (sp-get ok :beg-in))))))
- ok))
-
-(put 'sp-down-sexp 'CUA 'move)
-
-(defun sp-backward-down-sexp (&optional arg)
- "Move backward down one level of sexp.
-
-With ARG, do this that many times. A negative argument -N means
-move forward but still go down a level.
-
-If ARG is raw prefix argument \\[universal-argument], descend backward as much as
-possible.
-
-If ARG is raw prefix argument \\[universal-argument] \\[universal-argument], jump to the end of current
-list.
-
-If the point is inside sexp and there is no down expression to
-descend to, jump to the end of current one. If moving forward,
-jump to beginning of current one.
-
-Examples:
-
- foo (bar (baz quux))| -> foo (bar (baz quux)|)
-
- (bar (baz quux)) foo| -> (bar (baz quux|)) foo ;; 2
-
- foo (bar (baz (quux) blab))| -> foo (bar (baz (quux|) blab)) ;; \\[universal-argument]
-
- (foo| (bar baz) quux) -> (foo (bar baz) quux|)
-
- (foo (bar baz) |quux blab) -> (foo (bar baz) quux blab|) ;; \\[universal-argument] \\[universal-argument]"
- (interactive "^P")
- (sp-down-sexp (sp--negate-argument arg)))
-
-(put 'sp-backward-down-sexp 'CUA 'move)
-
-(defun sp-beginning-of-sexp (&optional arg)
- "Jump to beginning of the sexp the point is in.
-
-The beginning is the point after the opening delimiter.
-
-With no argument, this is the same as calling
-\\[universal-argument] \\[universal-argument] `sp-down-sexp'
-
-With ARG positive N > 1, move forward out of the current
-expression, move N-2 expressions forward and move down one level
-into next expression.
-
-With ARG negative -N < 1, move backward out of the current
-expression, move N-1 expressions backward and move down one level
-into next expression.
-
-With ARG raw prefix argument \\[universal-argument] move out of the current expressions
-and then to the beginning of enclosing expression.
-
-Examples:
-
- (foo (bar baz) quux| (blab glob)) -> (|foo (bar baz) quux (blab glob))
-
- (foo (bar baz|) quux (blab glob)) -> (foo (|bar baz) quux (blab glob))
-
- (|foo) (bar) (baz quux) -> (foo) (bar) (|baz quux) ;; 3
-
- (foo bar) (baz) (quux|) -> (|foo bar) (baz) (quux) ;; -3
-
- ((foo bar) (baz |quux) blab) -> (|(foo bar) (baz quux) blab) ;; \\[universal-argument]"
- (interactive "^P")
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (re (cond
- ((and raw (= arg 4))
- (sp-up-sexp)
- (sp-beginning-of-sexp))
- ((= arg 1)
- (sp-down-sexp '(16)))
- ((< arg 0)
- (sp-backward-up-sexp)
- (sp-forward-sexp (1+ arg))
- (sp-down-sexp))
- ((> arg 0)
- (sp-up-sexp)
- (sp-forward-sexp (- arg 2))
- (sp-down-sexp)))))
- (sp--run-hook-with-args (sp-get re :op) :post-handlers 'beginning-of-sexp)
- re))
-
-(put 'sp-beginning-of-sexp 'CUA 'move)
-
-(defun sp-end-of-sexp (&optional arg)
- "Jump to end of the sexp the point is in.
-
-The end is the point before the closing delimiter.
-
-With no argument, this is the same as calling
-\\[universal-argument] \\[universal-argument] `sp-backward-down-sexp'.
-
-With ARG positive N > 1, move forward out of the current
-expression, move N-1 expressions forward and move down backward
-one level into previous expression.
-
-With ARG negative -N < 1, move backward out of the current
-expression, move N-2 expressions backward and move down backward
-one level into previous expression.
-
-With ARG raw prefix argument \\[universal-argument] move out of the current expressions
-and then to the end of enclosing expression.
-
-Examples:
-
- (foo |(bar baz) quux (blab glob)) -> (foo (bar baz) quux (blab glob)|)
-
- (foo (|bar baz) quux (blab glob)) -> (foo (bar baz|) quux (blab glob))
-
- (|foo) (bar) (baz quux) -> (foo) (bar) (baz quux|) ;; 3
-
- (foo bar) (baz) (quux|) -> (foo bar|) (baz) (quux) ;; -3
-
- ((foo |bar) (baz quux) blab) -> ((foo bar) (baz quux) blab|) ;; \\[universal-argument]"
- (interactive "^P")
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (re (cond
- ((and raw (= arg 4))
- (sp-up-sexp)
- (sp-end-of-sexp))
- ((= arg 1)
- (sp-down-sexp '(-16)))
- ((< arg 0)
- (sp-backward-up-sexp)
- (sp-forward-sexp (+ 2 arg))
- (sp-backward-down-sexp))
- ((> arg 0)
- (sp-up-sexp)
- (sp-forward-sexp (1- arg))
- (sp-backward-down-sexp)))))
- (sp--run-hook-with-args (sp-get re :op) :post-handlers 'end-of-sexp)
- re))
-
-(put 'sp-end-of-sexp 'CUA 'move)
-
-(defun sp-beginning-of-next-sexp (&optional arg)
- "Jump to the beginning of next sexp on the same depth.
-
-Optional argument ARG defaults to 1 and means how many times we
-should repeat.
-
-This acts exactly as `sp-beginning-of-sexp' but adds 1 to the
-numeric argument.
-
-Examples:
-
- (f|oo) (bar) (baz) -> (foo) (|bar) (baz)
-
- (f|oo) (bar) (baz) -> (foo) (bar) (|baz) ;; 2"
- (interactive "^P")
- (if (sp--raw-argument-p arg)
- (sp-beginning-of-sexp arg)
- (let ((arg (prefix-numeric-value arg)))
- (if (> arg 0)
- (sp-beginning-of-sexp (1+ arg))
- (sp-beginning-of-sexp (1- arg))))))
-
-(put 'sp-beginning-of-next-sexp 'CUA 'move)
-
-(defun sp-beginning-of-previous-sexp (&optional arg)
- "Jump to the beginning of previous sexp on the same depth.
-
-Optional argument ARG defaults to 1 and means how many times we
-should repeat.
-
-This acts exactly as `sp-beginning-of-sexp' with negative
-argument but subtracts 1 from it.
-
-Examples:
-
- (foo) (b|ar) (baz) -> (|foo) (bar) (baz)
-
- (foo) (bar) (b|az) -> (|foo) (bar) (baz) ;; 2"
- (interactive "^P")
- (if (sp--raw-argument-p arg)
- (sp-beginning-of-sexp (sp--negate-argument arg))
- (let ((arg (prefix-numeric-value arg)))
- (if (> arg 0)
- (sp-beginning-of-sexp (- (1+ arg)))
- (sp-beginning-of-sexp (- (1- arg)))))))
-
-(put 'sp-beginning-of-previous-sexp 'CUA 'move)
-
-(defun sp-end-of-next-sexp (&optional arg)
- "Jump to the end of next sexp on the same depth.
-
-Optional argument ARG defaults to 1 and means how many times we
-should repeat.
-
-This acts exactly as `sp-end-of-sexp' but adds 1 to the
-numeric argument.
-
-Examples:
-
- (f|oo) (bar) (baz) -> (foo) (bar|) (baz)
-
- (f|oo) (bar) (baz) -> (foo) (bar) (baz|) ;; 2"
- (interactive "^P")
- (if (sp--raw-argument-p arg)
- (sp-end-of-sexp arg)
- (let ((arg (prefix-numeric-value arg)))
- (if (> arg 0)
- (sp-end-of-sexp (1+ arg))
- (sp-end-of-sexp (1- arg))))))
-
-(put 'sp-end-of-next-sexp 'CUA 'move)
-
-(defun sp-end-of-previous-sexp (&optional arg)
- "Jump to the end of previous sexp on the same depth.
-
-Optional argument ARG defaults to 1 and means how many times we
-should repeat.
-
-This acts exactly as `sp-end-of-sexp' with negative
-argument but subtracts 1 from it.
-
-Examples:
-
- (foo) (b|ar) (baz) -> (foo|) (bar) (baz)
-
- (foo) (bar) (b|az) -> (foo|) (bar) (baz) ;; 2"
- (interactive "^P")
- (if (sp--raw-argument-p arg)
- (sp-end-of-sexp (sp--negate-argument arg))
- (let ((arg (prefix-numeric-value arg)))
- (if (> arg 0)
- (sp-end-of-sexp (- (1+ arg)))
- (sp-end-of-sexp (- (1- arg)))))))
-
-(put 'sp-end-of-previous-sexp 'CUA 'move)
-
-;; TODO: split the reindent code so we can call it inside strings on
-;; sexps like [foo ]... We can't reindent that by default because it
-;; can be a regular expression or something where the whitespace
-;; matters. For now, disable reindent in strings if the sexp is not
-;; the string quote itself.
-(defun sp-up-sexp (&optional arg interactive)
- "Move forward out of one level of parentheses.
-
-With ARG, do this that many times. A negative argument means
-move backward but still to a less deep spot.
-
-The argument INTERACTIVE is for internal use only.
-
-If called interactively and `sp-navigate-reindent-after-up' is
-enabled for current major-mode, remove the whitespace between end
-of the expression and the last \"thing\" inside the expression.
-This behaviour can be suppressed for syntactic string sexps by
-setting `sp-navigate-reindent-after-up-in-string' to nil.
-
-If `sp-navigate-close-if-unbalanced' is non-nil, close the
-unbalanced expressions automatically.
-
-Examples:
-
- (foo |(bar baz) quux blab) -> (foo (bar baz) quux blab)|
-
- (foo (bar |baz) quux blab) -> (foo (bar baz) quux blab)| ;; 2
-
- (foo bar |baz -> (foo bar baz)| ;; re-indent the expression
-​ )
-
- (foo |(bar baz) -> (foo)| (bar baz) ;; close unbalanced expr."
- (interactive "^p\np")
- (setq arg (or arg 1))
- (sp--with-case-sensitive
- (let ((ok (sp-get-enclosing-sexp (abs arg))))
- (if ok
- (progn
- (if (> arg 0)
- (goto-char (sp-get ok :end))
- (goto-char (sp-get ok :beg)))
- (when (and (= (abs arg) 1)
- (not (equal (sp-get ok :prefix) sp-comment-char))
- (or (memq major-mode (assq 'always sp-navigate-reindent-after-up))
- (and (memq major-mode (assq 'interactive sp-navigate-reindent-after-up))
- interactive))
- (or sp-navigate-reindent-after-up-in-string
- (sp-get ok (not (sp-point-in-string :end-in))))
- ;; if the sexp to be reindented is not a string
- ;; but is inside a string, we should rather do
- ;; nothing than break semantics (in e.g. regexp
- ;; [...])
- (let ((str (sp-point-in-string)))
- (or (not str)
- ;; op must be the delimiter of the string we're in
- (eq (sp-get ok :op)
- (or (eq str t)
- (char-to-string str))))))
- ;; TODO: this needs different indent rules for different
- ;; modes. Should we concern with such things? Lisp rules are
- ;; funny in HTML... :/
- (save-excursion
- (if (> arg 0)
- (progn
- (goto-char (sp-get ok :end-in))
- (let ((prev (sp-get-thing t)))
- ;; if the expression is empty remove everything inside
- (if (sp-compare-sexps ok prev)
- (sp-get ok (delete-region :beg-in :end-in))
- (when (save-excursion
- (skip-chars-backward " \t\n")
- (= (point) (sp-get prev :end-suf)))
- (delete-region (sp-get prev :end-suf) (point))))))
- (goto-char (sp-get ok :beg-in))
- (let ((next (sp-get-thing)))
- (if (sp-compare-sexps ok next)
- (sp-get ok (delete-region :beg-in :end-in))
- (when (save-excursion
- (skip-chars-forward " \t\n")
- (= (point) (sp-get next :beg-prf)))
- (delete-region (point) (sp-get next :beg-prf)))))))))
- ;; on forward up, we can detect that the pair was not closed.
- ;; Therefore, jump sexps backwards until we hit the error, then
- ;; extract the opening pair and insert it at point. Only works
- ;; for pairs defined in `sp-pair-list'.
- (when (and (> arg 0)
- sp-navigate-close-if-unbalanced)
- (let (active-pair)
- (save-excursion
- ;; add support for SGML tags here
- (while (sp-backward-sexp))
- (sp-skip-backward-to-symbol t)
- (when (sp--looking-back (sp--get-opening-regexp))
- (let* ((op (match-string 0)))
- (setq active-pair (assoc op sp-pair-list)))))
- (when active-pair
- (sp-backward-sexp)
- (sp-forward-sexp)
- (insert (cdr active-pair))))))
- ok)))
-
-(put 'sp-up-sexp 'CUA 'move)
-
-(defun sp-backward-up-sexp (&optional arg interactive)
- "Move backward out of one level of parentheses.
-
-With ARG, do this that many times. A negative argument means
-move forward but still to a less deep spot.
-
-The argument INTERACTIVE is for internal use only.
-
-If called interactively and `sp-navigate-reindent-after-up' is
-enabled for current major-mode, remove the whitespace between
-beginning of the expression and the first \"thing\" inside the
-expression.
-
-Examples:
-
- (foo (bar baz) quux| blab) -> |(foo (bar baz) quux blab)
-
- (foo (bar |baz) quux blab) -> |(foo (bar baz) quux blab) ;; 2
-
- ( -> |(foo bar baz)
-​ foo |bar baz)"
- (interactive "^p\np")
- (setq arg (or arg 1))
- (sp-up-sexp (- arg) interactive))
-
-(put 'sp-backward-up-sexp 'CUA 'move)
-
-(defvar sp-last-kill-whitespace nil
- "Save the whitespace cleaned after the last kill.
-
-If the next command is `sp-kill-sexp', append the whitespace
-between the successive kills.")
-
-(defun sp--kill-or-copy-region (beg end &optional dont-kill)
- "Kill or copy region between BEG and END according to DONT-KILL.
-If `evil-mode' is active, copying a region will also add it to the 0 register.
-Additionally, if command was prefixed with a register, copy the region
-to that register."
- (interactive)
- (let ((result
- (if dont-kill
- (copy-region-as-kill beg end)
- (kill-region beg end))))
- (when (bound-and-true-p evil-mode)
- (when dont-kill
- (evil-set-register ?0 (evil-get-register ?1)))
- (when evil-this-register
- (evil-set-register evil-this-register (evil-get-register ?1))
- (setq evil-this-register nil)))
- result))
-
-(defun sp-kill-sexp (&optional arg dont-kill)
- "Kill the balanced expression following point.
-
-If point is inside an expression and there is no following
-expression, kill the topmost enclosing expression.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction.
-
-With ARG being raw prefix \\[universal-argument], kill all the expressions from
-point up until the end of current list. With raw prefix \\[negative-argument] \\[universal-argument],
-kill all the expressions from beginning of current list up until
-point. If point is inside a symbol, this is also killed. If
-there is no expression after/before the point, just delete the
-whitespace up until the closing/opening delimiter.
-
-With ARG being raw prefix \\[universal-argument] \\[universal-argument], kill current list (the list
-point is inside).
-
-With ARG numeric prefix 0 (zero) kill the insides of the current
-list, that is everything from after the opening delimiter to
-before the closing delimiter.
-
-If ARG is nil, default to 1 (kill single expression forward)
-
-If second optional argument DONT-KILL is non-nil, save the to be
-killed region in the kill ring, but do not kill the region from
-buffer.
-
-With `sp-navigate-consider-symbols', symbols and strings are also
-considered balanced expressions.
-
-Examples:
-
- (foo |(abc) bar) -> (foo | bar) ;; nil, defaults to 1
-
- (foo (bar) | baz) -> | ;; 2
-
- (foo |(bar) baz) -> | ;; \\[universal-argument] \\[universal-argument]
-
- (1 |2 3 4 5 6) -> (1|) ;; \\[universal-argument]
-
- (1 |2 3 4 5 6) -> (1 | 5 6) ;; 3
-
- (1 2 3 4 5| 6) -> (1 2 3 | 6) ;; -2
-
- (1 2 3 4| 5 6) -> (|5 6) ;; \\[negative-argument] \\[universal-argument]
-
- (1 2 | ) -> (1 2|) ;; \\[universal-argument], kill useless whitespace
-
- (1 2 3 |4 5 6) -> (|) ;; 0
-
-Note: prefix argument is shown after the example in
-\"comment\". Assumes `sp-navigate-consider-symbols' equal to t."
- (interactive "P")
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (n (abs arg))
- (ok t)
- (b (point-max))
- (e (point)))
- (cond
- ;; kill to the end or beginning of list
- ((and raw
- (= n 4))
- (let ((next (sp-get-thing (< arg 0)))
- (enc (sp-get-enclosing-sexp)))
- (if (sp-compare-sexps next enc)
- (when (not dont-kill)
- (let ((del (sp-get-whitespace)))
- (sp-get del (delete-region :beg :end))))
- (if (> arg 0)
- (sp--kill-or-copy-region
- (sp-get next :beg-prf) (sp-get enc :end-in) dont-kill)
- (sp--kill-or-copy-region
- (sp-get next :end) (sp-get enc :beg-in) dont-kill))
- (when (not dont-kill)
- (let ((del (sp-get-whitespace)))
- (sp-get del (delete-region :beg :end)))))))
- ;; kill the enclosing list
- ((and raw
- (= n 16))
- (let ((lst (sp-backward-up-sexp)))
- (sp-get lst (sp--kill-or-copy-region
- :beg-prf :end dont-kill))))
- ;; kill inside of sexp
- ((= n 0)
- (let ((e (sp-get-enclosing-sexp)))
- (when e
- (sp-get e (sp--kill-or-copy-region
- :beg-in :end-in dont-kill)))))
- ;; regular kill
- (t
- (save-excursion
- (while (and (> n 0) ok)
- (setq ok (sp-forward-sexp (sp--signum arg)))
- (sp-get ok
- (when (< :beg-prf b) (setq b :beg-prf))
- (when (> :end e) (setq e :end)))
- (setq n (1- n))))
- (when ok
- (let ((bm (set-marker (make-marker) b)))
- (if (eq last-command 'kill-region)
- (progn
- (when (member sp-successive-kill-preserve-whitespace '(1 2))
- (kill-append sp-last-kill-whitespace nil))
- (sp--kill-or-copy-region
- (if (> b (point)) (point) b) e dont-kill))
- (sp--kill-or-copy-region b e dont-kill))
- ;; kill useless junk whitespace, but only if we're actually
- ;; killing the region
- (when (not dont-kill)
- (sp--cleanup-after-kill)
- ;; kill useless newlines
- (when (string-match-p "\n" (buffer-substring-no-properties bm (point)))
- (setq sp-last-kill-whitespace
- (concat sp-last-kill-whitespace
- (buffer-substring-no-properties bm (point))))
- (delete-region bm (point)))
- (when (= 0 sp-successive-kill-preserve-whitespace)
- (kill-append sp-last-kill-whitespace nil)))))))))
-
-(defun sp--cleanup-after-kill ()
- (unless (save-match-data (looking-back "^[\t\s]+" (1- (line-beginning-position))))
- (let ((bdel (save-excursion
- (when (sp--looking-back-p " " 1)
- (skip-chars-backward " \t")
- (when (not (sp--looking-back-p (sp--get-opening-regexp)))
- (forward-char)))
- (point)))
- (edel (save-excursion
- (when (looking-at " ")
- (skip-chars-forward " \t")
- (when (not (or (sp--looking-at (sp--get-closing-regexp))
- (looking-at "$")))
- (backward-char)))
- (point))))
- (when (eq this-command 'kill-region)
- (setq sp-last-kill-whitespace
- (if (/= 2 sp-successive-kill-preserve-whitespace)
- (buffer-substring-no-properties bdel edel)
- "")))
- (delete-region bdel edel)))
- (if (memq major-mode sp-lisp-modes)
- ;; WARNING: The above white-space killing routine might preserve
- ;; less whitespace than there actually is because the indent
- ;; might further eat some up
- (indent-according-to-mode)
- (unless (or (memq major-mode sp-no-reindent-after-kill-modes)
- (memq indent-line-function
- sp-no-reindent-after-kill-indent-line-functions))
- (save-excursion
- (sp--indent-region (line-beginning-position) (line-end-position)))
- (when (> (save-excursion
- (back-to-indentation)
- (current-indentation))
- (current-column))
- (back-to-indentation)))))
-
-(defun sp-backward-kill-sexp (&optional arg dont-kill)
- "Kill the balanced expression preceding point.
-
-This is exactly like calling `sp-kill-sexp' with minus ARG.
-In other words, the direction of all commands is reversed. For
-more information, see the documentation of `sp-kill-sexp'.
-
-Examples:
-
- (foo (abc)| bar) -> (foo | bar)
-
- blab (foo (bar baz) quux)| -> blab |
-
- (1 2 3 |4 5 6) -> (|4 5 6) ;; \\[universal-argument]"
- (interactive "P")
- (sp-kill-sexp (sp--negate-argument arg) dont-kill))
-
-(defun sp-copy-sexp (&optional arg)
- "Copy the following ARG expressions to the kill-ring.
-
-This is exactly like calling `sp-kill-sexp' with second argument
-t. All the special prefix arguments work the same way."
- (interactive "P")
- (save-excursion
- (sp-kill-sexp arg t)))
-
-(defun sp-backward-copy-sexp (&optional arg)
- "Copy the previous ARG expressions to the kill-ring.
-
-This is exactly like calling `sp-backward-kill-sexp' with second argument
-t. All the special prefix arguments work the same way."
- (interactive "P")
- (save-excursion
- (sp-kill-sexp (sp--negate-argument arg) t)))
-
-(defun sp-clone-sexp ()
- "Clone sexp after or around point.
-
-If the form immediately after point is a sexp, clone it below the
-current one and put the point in front of it.
-
-Otherwise get the enclosing sexp and clone it below the current
-enclosing sexp."
- (interactive)
- (-when-let (ok (let ((sexp (sp-get-thing)))
- (if (not (equal (sp-get sexp :op) ""))
- sexp
- (sp-get-enclosing-sexp))))
- (sp-get ok
- (undo-boundary)
- (if (< :beg-prf (point))
- ;; this is the case where point is inside a sexp, we place
- ;; the "clone" before the current enclosing sexp and move
- ;; the old one below. Note that the "net result" is the
- ;; same as the other case, but the implementation must
- ;; reflect different relative position of the point wrt
- ;; "current" sexp.
- (save-excursion
- (goto-char :beg-prf)
- (insert-buffer-substring-no-properties
- (current-buffer) :beg-prf :end-suf)
- (newline-and-indent))
- ;; in this case we are in front, so we move after the current
- ;; one, place the clone and move it below
- (goto-char :end-suf)
- (save-excursion
- (insert-buffer-substring-no-properties
- (current-buffer) :beg-prf :end-suf))
- (newline-and-indent))
- (sp-indent-defun))))
-
-(defun sp-kill-hybrid-sexp (arg)
- "Kill a line as if with `kill-line', but respecting delimiters.
-
-With ARG being raw prefix \\[universal-argument] \\[universal-argument], kill the hybrid sexp
-the point is in (see `sp-get-hybrid-sexp').
-
-With ARG numeric prefix 0 (zero) just call `kill-line'.
-
-You can customize the behaviour of this command by toggling
-`sp-hybrid-kill-excessive-whitespace'.
-
-Examples:
-
- foo | bar baz -> foo | ;; nil
-
- foo (bar | baz) quux -> foo (bar |) quux ;; nil
-
- foo | bar (baz -> foo | ;; nil
- quux)
-
- foo \"bar |baz quux\" quack -> foo \"bar |\" quack ;; nil
-
- foo (bar
- baz) qu|ux (quack -> foo | hoo ;; \\[universal-argument] \\[universal-argument]
- zaq) hoo
-
- foo | (bar -> foo | ;; C-0
- baz) baz)"
- (interactive "P")
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (orig-indent (save-excursion
- (back-to-indentation)
- (current-column)))
- (orig-column (current-column)))
- (cond
- ((= arg 0) (kill-line))
- ((and raw (= arg 16))
- (let ((hl (sp-get-hybrid-sexp)))
- (sp-get hl (kill-region :beg-prf :end-suf))))
- (t
- (let ((hl (sp-get-hybrid-sexp)))
- (save-excursion
- (when (and (or (eq sp-hybrid-kill-entire-symbol t)
- (and (functionp sp-hybrid-kill-entire-symbol)
- (not (funcall sp-hybrid-kill-entire-symbol))))
- (sp-point-in-symbol))
- (sp-backward-sexp))
- (sp-get hl
- (let ((end (min (point-max) (if (looking-at "[ \t]*$")
- (1+ :end-suf)
- :end-suf))))
- (when sp-hybrid-kill-excessive-whitespace
- (save-excursion
- (goto-char end)
- (skip-chars-forward "\n\t\r\s")
- (cond
- ((eq 'kill sp-hybrid-kill-excessive-whitespace)
- (setq end (point)))
- (t (delete-region end (point))))))
- (kill-region (point) end)))))
- (sp--cleanup-after-kill)
- ;; if we've killed the entire line, do *not* contract the indent
- ;; to just one space
- (when (sp-point-in-blank-line)
- (delete-region (line-beginning-position) (line-end-position))
- (if (and (= 0 orig-column)
- kill-whole-line)
- (delete-char 1) ;; delete the newline
- (let ((need-indent (- orig-indent (current-column))))
- (when (> need-indent 0)
- (insert (make-string need-indent ?\ ))))))))))
-
-(defun sp-kill-whole-line ()
- "Kill current line in sexp-aware manner.
-
-First, go to the beginning of current line and then try to kill
-as much as possible on the current line but without breaking
-balance.
-
-If there is a hanging sexp at the end of line the it is killed as
-well.
-
-If there is a closing delimiter for a sexp \"up\" current sexp,
-the kill is not extended after it. For more details see
-`sp-kill-hybrid-sexp'.
-
-Examples:
-
- (progn (progn
- (some |long sexp)) -> |)"
- (interactive)
- (beginning-of-line)
- (sp-kill-hybrid-sexp nil)
- (let ((empty-last-line (save-excursion (beginning-of-line) (eobp))))
- ;; We can't kill the line if it is empty and the last line
- (when (and (sp-point-in-blank-line) (not empty-last-line))
- (kill-whole-line))))
-
-(defun sp--transpose-objects (first second)
- "Transpose FIRST and SECOND object while preserving the
-whitespace between them."
- (save-excursion
- (goto-char (sp-get second :beg-prf))
- (let ((ins (sp-get second (delete-and-extract-region :beg-prf :end)))
- (between (delete-and-extract-region (sp-get first :end) (point))))
- (goto-char (sp-get first :beg-prf))
- (insert ins between))))
-
-(defun sp-transpose-sexp (&optional arg)
- "Transpose the expressions around point.
-
-The operation will move the point after the transposed block, so
-the next transpose will \"drag\" it forward.
-
-With arg positive N, apply that many times, dragging the
-expression forward.
-
-With arg negative -N, apply N times backward, pushing the word
-before cursor backward. This will therefore not transpose the
-expressions before and after point, but push the expression
-before point over the one before it.
-
-Examples:
-
- foo |bar baz -> bar foo| baz
-
- foo |bar baz -> bar baz foo| ;; 2
-
- (foo) |(bar baz) -> (bar baz) (foo)|
-
- (foo bar) -> (baz quux) ;; keeps the formatting
-​ |(baz quux) |(foo bar)
-
- foo bar baz| -> foo baz| bar ;; -1"
- (interactive "P")
- (let* ((arg (prefix-numeric-value arg))
- (n (abs arg)))
- ;; if we're inside a symbol, we need to move out of it first
- (when (> arg 0)
- (when (sp-point-in-symbol)
- (sp-forward-symbol)))
- (while (> n 0)
- (when (< arg 0) (sp-backward-sexp))
- (let* ((next (save-excursion (sp-forward-sexp)))
- (prev (save-excursion (goto-char (sp-get next :beg-prf)) (sp-backward-sexp))))
- (sp--transpose-objects prev next)
- (when (< arg 0)
- (goto-char (+ (sp-get prev :beg-prf) (sp-get next :len))))
- (setq n (1- n))))))
-
-(defun sp-transpose-hybrid-sexp (&optional arg)
- "Transpose the hybrid sexps around point.
-
-`sp-backward-sexp' is used to enter the previous hybrid sexp.
-
-With ARG numeric prefix call `transpose-lines' with this
-argument.
-
-The operation will move the point at the next line after the
-transposed block if it is at the end of line already.
-
-Examples:
-
- foo bar baz (quux
- |baz (quux -> quack)
- quack) foo bar\\n|
-
-
- [(foo) (bar) -> [(baz)
- |(baz)] (foo) (bar)|]
-
- foo bar baz -> quux flux
- |quux flux foo bar baz\\n|"
- (interactive "P")
- (if (numberp arg)
- (transpose-lines arg)
- (let* ((next (save-excursion
- (sp-forward-sexp)
- (sp-backward-sexp)
- (sp-get-hybrid-sexp)))
- (prev (save-excursion
- (goto-char (sp-get next :beg))
- (sp-backward-sexp)
- (sp-get-hybrid-sexp))))
- (if (sp-compare-sexps prev next > :end)
- (sp-message :invalid-context-prev)
- (sp--transpose-objects prev next))
- (when (looking-at "[\n\t ]+")
- (forward-line)
- (back-to-indentation)))))
-
-(defun sp-push-hybrid-sexp ()
- "Push the hybrid sexp after point over the following one.
-
-`sp-forward-sexp' is used to enter the following hybrid sexp.
-
-Examples:
-
- |x = big_function_call(a, |(a,
- b) b) = read_user_input()
- ->
- (a, x = big_function_call(a,
- b) = read_user_input() b)"
- (interactive)
- (let* ((cur (sp-get-hybrid-sexp))
- (next (save-excursion
- (goto-char (sp-get cur :end))
- (sp-forward-sexp)
- (sp-get-hybrid-sexp))))
- (if (sp-compare-sexps cur next >)
- (sp-message :invalid-context-cur)
- (sp--transpose-objects cur next))))
-
-;; The following two functions are inspired by "adjust-parens.el"
-;; package available at
-;; http://elpa.gnu.org/packages/adjust-parens-1.0.el
-(defun sp-indent-adjust-sexp ()
- "Add the hybrid sexp at line into previous sexp. All forms
-between the two are also inserted. Specifically, if the point is
-on empty line, move the closing delimiter there, so the next
-typed text will become the last item of the previous sexp.
-
-This acts similarly to `sp-add-to-previous-sexp' but with special
-handling of empty lines."
- (interactive)
- (let* ((hsexp (sp-get-hybrid-sexp))
- (prev-sexp (save-excursion
- (goto-char (sp-get hsexp :beg))
- (sp-get-sexp t))))
- (if (not (and prev-sexp hsexp
- (sp-compare-sexps prev-sexp hsexp < :end :beg)))
- (sp-message :no-structure-found)
- (save-excursion
- (sp-get prev-sexp
- (goto-char (sp-get hsexp :end))
- (insert :cl)
- (goto-char :end-in)
- (delete-char :cl-l)))
- (sp-get (sp-get-enclosing-sexp) (sp--indent-region :beg :end))
- (indent-according-to-mode)
- (sp--run-hook-with-args (sp-get prev-sexp :op) :post-handlers 'indent-adjust-sexp))))
-
-(defun sp-dedent-adjust-sexp ()
- "Remove the hybrid sexp at line from previous sexp. All
-sibling forms after it are also removed (not deleted, just placed
-outside of the enclosing list). Specifically, if the point is on
-empty line followed by closing delimiter of enclosing list, move
-the closing delimiter after the last item in the list.
-
-This acts similarly to `sp-forward-barf-sexp' but with special
-handling of empty lines."
- (interactive)
- (-when-let (enc (sp-get-enclosing-sexp))
- (save-excursion
- ;; if we're looking at whitespace and end of sexp, move the
- ;; closing paren over the whitespace but *after* the last item
- ;; in the list (barf would also go *before* the last item)
- (sp-skip-forward-to-symbol t)
- (if (= (point) (sp-get enc :end-in))
- (let ((prev-sexp (sp-get-thing t)))
- (sp-get enc
- (delete-char :cl-l)
- (goto-char (sp-get prev-sexp :end))
- ;; see next TODO
- (save-restriction
- (sp--narrow-to-line)
- (skip-syntax-forward " ")
- (skip-syntax-forward "."))
- (insert :cl)))
- ;; otherwise just C-u barf
- (sp-skip-backward-to-symbol t)
- (sp-forward-barf-sexp '(4))
- ;; we need to take special care of any hanging
- ;; punctuation. TODO: this should be a sexp suffix? HACK until
- ;; we fix barf to get the info.
- (save-restriction
- (sp-get (sp-backward-down-sexp)
- (goto-char :end)
- (delete-char (- :cl-l))
- (sp--narrow-to-line)
- (skip-syntax-forward " ")
- (skip-syntax-forward ".")
- (insert :cl)))
- (sp-get enc (sp--indent-region :beg :end))))
- (indent-according-to-mode)
- (sp--run-hook-with-args (sp-get enc :op) :post-handlers 'dedent-adjust-sexp)))
-
-;; "When the hook is called point is *after* the just moved closing delimiter."
-;; TODO: add hook
-(defun sp-slurp-hybrid-sexp ()
- "Add hybrid sexp following the current list in it by moving the
-closing delimiter.
-
-This is philosophically similar to `sp-forward-slurp-sexp' but
-works better in \"line-based\" languages like C or Java.
-
-Because the structure is much looser in these languages, this
-command currently does not support all the prefix argument
-triggers that `sp-forward-slurp-sexp' does."
- (interactive)
- (let (slurped-within-line)
- (-if-let* ((enc (sp-get-enclosing-sexp))
- (bsexp (save-excursion
- (sp-get enc (goto-char :end))
- (when (sp-compare-sexps (sp-forward-sexp) enc >)
- (sp-get-hybrid-sexp)))))
- (save-excursion
- (sp-get enc
- (goto-char :end-suf)
- (delete-char (- (+ :cl-l :suffix-l)))
- ;; TODO: move to hook
- (when (sp-point-in-blank-line)
- (delete-region (line-beginning-position) (1+ (line-end-position))))
- (sp-forward-sexp)
-
- (when (eq (line-number-at-pos :beg)
- (line-number-at-pos :end))
- (setq slurped-within-line t))
- ;; If we're slurping over multiple lines, include the suffix on the next line.
- ;; I.e. while () {|} -> while () {\n foo(); \n}
- (unless slurped-within-line
- (sp-get (sp-get-hybrid-sexp) (goto-char :end-suf)))
- (insert :cl :suffix))
- ;; TODO: move to hook
- (sp-get (sp--next-thing-selection -1)
- (save-excursion
- (if (save-excursion
- (goto-char :beg-in)
- (looking-at "[ \t]*$"))
- (progn
- (goto-char :end-in)
- (newline))
- ;; copy the whitespace after opening delim and put it in
- ;; front of the closing. This will ensure pretty { foo }
- ;; or {foo}
- (goto-char :end-in)
- (insert (buffer-substring-no-properties
- :beg-in
- (+ :beg-in (save-excursion
- (goto-char :beg-in)
- (skip-syntax-forward " ")))))))
- (unless (or (looking-at "[ \t]*$")
- (looking-at (sp--get-stringlike-regexp))
- (looking-at (sp--get-closing-regexp))
- slurped-within-line)
- (newline)))
- (sp-get (sp--next-thing-selection -1) (sp--indent-region :beg :end))
- ;; we need to call this again to get the new structure after
- ;; indent.
- (sp--next-thing-selection -1))
- (sp-message :invalid-structure)
- nil)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; "paredit" operations
-
-(defun sp-forward-slurp-sexp (&optional arg)
- "Add sexp following the current list in it by moving the closing delimiter.
-
-If the current list is the last in a parent list, extend that
-list (and possibly apply recursively until we can extend a list
-or end of file).
-
-If ARG is N, apply this function that many times.
-
-If ARG is negative -N, extend the opening pair instead (that is,
-backward).
-
-If ARG is raw prefix \\[universal-argument], extend all the way to the end of the parent list.
-
-If both the current expression and the expression to be slurped
-are strings, they are joined together.
-
-See also `sp-slurp-hybrid-sexp' which is similar but handles
-C-style syntax better.
-
-Examples:
-
- (foo |bar) baz -> (foo |bar baz)
-
- [(foo |bar)] baz -> [(foo |bar) baz]
-
- [(foo |bar) baz] -> [(foo |bar baz)]
-
- ((|foo) bar baz quux) -> ((|foo bar baz quux)) ;; with \\[universal-argument]
-
- \"foo| bar\" \"baz quux\" -> \"foo| bar baz quux\""
- (interactive "P")
- (if (> (prefix-numeric-value arg) 0)
- (let ((n (abs (prefix-numeric-value arg)))
- (enc (sp-get-enclosing-sexp))
- (in-comment (sp-point-in-comment))
- next-thing ok)
- (when enc
- (save-excursion
- (if (sp--raw-argument-p arg)
- (progn
- (goto-char (sp-get enc :end-suf))
- (setq next-thing (sp-get-enclosing-sexp))
- (when next-thing
- (goto-char (sp-get next-thing :end-in))
- (sp--run-hook-with-args (sp-get enc :op) :pre-handlers 'slurp-forward
- (list :arg arg :enc enc :next-thing next-thing))
- (sp-get enc (insert :cl :suffix))
- (goto-char (sp-get enc :end-suf))
- (delete-char (sp-get enc (- (+ :cl-l :suffix-l))))
- (sp--indent-region (sp-get enc :beg-prf) (sp-get next-thing :end))
- (sp--run-hook-with-args (sp-get enc :op) :post-handlers 'slurp-forward
- (list :arg arg :enc enc :next-thing next-thing))))
- (while (> n 0)
- (goto-char (sp-get enc :end-suf))
- (setq ok enc)
- (setq next-thing (sp-get-thing nil))
- (while (sp-compare-sexps next-thing ok <)
- (goto-char (sp-get next-thing :end-suf))
- (setq ok next-thing)
- (setq next-thing (sp-get-thing nil)))
- ;; do not allow slurping into a different context from
- ;; inside a comment
- (if (and in-comment
- (save-excursion
- (sp-get next-thing
- (goto-char :beg)
- (not (sp-point-in-comment)))))
- (progn
- (sp-message :cant-slurp-context)
- (setq n -1))
- (if ok
- (progn
- (if (and (equal (sp-get next-thing :cl) "\"")
- (equal (sp-get ok :cl) "\""))
- (progn
- (sp--join-sexp ok next-thing)
- (goto-char (- (sp-get next-thing :end) 2))
- (plist-put enc :end (- (sp-get next-thing :end) 2)))
- (let ((inner-sexp
- (save-excursion
- (goto-char (sp-get ok :end-in))
- (sp-get-thing t))))
- (delete-char (sp-get ok (- (+ :cl-l :suffix-l))))
- ;; this calculation corrects the absence
- ;; of already deleted cls
- (goto-char (- (sp-get next-thing :end-suf)
- (sp-get ok (+ :cl-l :suffix-l))))
- ;; only insert space if not inserting it
- ;; would merge two sexps together
- (when (and (sp-get ok (/= :len-in 0))
- (sp-compare-sexps
- inner-sexp
- (sp-get-thing t))
- (= (sp-get ok :end-suf)
- (sp-get next-thing :beg-prf)))
- (save-excursion
- (goto-char (sp-get ok :end-in))
- (insert " "))))
- (sp--run-hook-with-args
- (sp-get enc :op) :pre-handlers 'slurp-forward
- (list :arg arg :enc enc :ok ok :next-thing next-thing))
- (sp-get ok (insert :cl :suffix))
- (sp--indent-region (sp-get ok :beg-prf) (point))
- ;; HACK: update the "enc" data structure if ok==enc
- (when (= (sp-get enc :beg) (sp-get ok :beg)) (plist-put enc :end (point)))
- (sp--run-hook-with-args
- (sp-get enc :op) :post-handlers 'slurp-forward
- (list :arg arg :enc enc :ok ok :next-thing next-thing)))
- (setq n (1- n)))
- (sp-message :cant-slurp)
- (setq n -1))))))))
- (sp-backward-slurp-sexp (sp--negate-argument arg))))
-
-(defun sp-backward-slurp-sexp (&optional arg)
- "Add the sexp preceding the current list in it by moving the opening delimiter.
-
-If the current list is the first in a parent list, extend that
-list (and possibly apply recursively until we can extend a list
-or beginning of file).
-
-If arg is N, apply this function that many times.
-
-If arg is negative -N, extend the closing pair instead (that is,
-forward).
-
-If ARG is raw prefix \\[universal-argument], extend all the way to the beginning of the parent list.
-
-If both the current expression and the expression to be slurped
-are strings, they are joined together.
-
-Examples:
-
- foo (bar| baz) -> (foo bar| baz)
-
- foo [(bar| baz)] -> [foo (bar| baz)]
-
- [foo (bar| baz)] -> [(foo bar| baz)]
-
- (foo bar baz (|quux)) -> ((foo bar baz |quux)) ;; with \\[universal-argument]
-
- \"foo bar\" \"baz |quux\" -> \"foo bar baz |quux\""
- (interactive "P")
- (if (> (prefix-numeric-value arg) 0)
- (let ((n (abs (prefix-numeric-value arg)))
- (enc (sp-get-enclosing-sexp))
- (in-comment (sp-point-in-comment))
- next-thing ok)
- (when enc
- (save-excursion
- (if (sp--raw-argument-p arg)
- (progn
- (goto-char (sp-get enc :beg-prf))
- (setq next-thing (sp-get-enclosing-sexp))
- (when next-thing
- (delete-char (sp-get enc (+ :op-l :prefix-l)))
- (goto-char (sp-get next-thing :beg-in))
- (sp--run-hook-with-args
- (sp-get enc :op) :pre-handlers 'slurp-backward
- (list :arg arg :enc enc :next-thing next-thing))
- (sp-get enc (insert :prefix :op))
- (sp--indent-region (sp-get next-thing :beg-in) (sp-get enc :end))
- (sp--run-hook-with-args
- (sp-get enc :op) :post-handlers 'slurp-backward
- (list :arg arg :enc enc :next-thing next-thing))))
- (while (> n 0)
- (goto-char (sp-get enc :beg-prf))
- (setq ok enc)
- (setq next-thing (sp-get-thing t))
- (while (sp-compare-sexps next-thing ok > :end)
- (goto-char (sp-get next-thing :beg-prf))
- (setq ok next-thing)
- (setq next-thing (sp-get-thing t)))
- ;; do not allow slurping into a different context from
- ;; inside a comment
- (if (and in-comment
- (save-excursion
- (sp-get next-thing
- (goto-char :beg)
- (not (sp-point-in-comment)))))
- (progn
- (sp-message :cant-slurp-context)
- (setq n -1))
- (if ok
- (progn
- (if (and (equal (sp-get next-thing :cl) "\"")
- (equal (sp-get ok :cl) "\""))
- (progn
- (sp--join-sexp next-thing ok)
- (goto-char (sp-get next-thing :beg-prf))
- (plist-put enc :beg (sp-get next-thing :beg)))
- (let ((inner-sexp
- (save-excursion
- (goto-char (sp-get ok :beg-in))
- (sp-get-thing))))
- (delete-char (sp-get ok (+ :op-l :prefix-l)))
- (goto-char (sp-get next-thing :beg-prf))
- ;; only insert space if not inserting it
- ;; would merge two sexps together
- (when (and (sp-get ok (/= :len-in 0))
- (= (sp-get ok (- (sp-get inner-sexp :end)
- :op-l :prefix-l))
- (sp-get (sp-get-thing) :end))
- (= (sp-get ok :beg-prf)
- (sp-get next-thing :end-suf)))
- (save-excursion
- (goto-char (sp-get ok (- :beg-in :op-l :prefix-l)))
- (insert " "))))
- (sp--run-hook-with-args
- (sp-get enc :op) :pre-handlers 'slurp-backward
- (list :arg arg :enc enc :ok ok :next-thing next-thing))
- (sp-get ok (insert :prefix :op))
- (sp--indent-region (point) (sp-get ok :end))
- ;; HACK: update the "enc" data structure if ok==enc
- (when (sp-compare-sexps enc ok) (plist-put enc :beg (- (point) (sp-get ok :op-l))))
- (sp--run-hook-with-args
- (sp-get enc :op) :post-handlers 'slurp-backward
- (list :arg arg :enc enc :ok ok :next-thing next-thing)))
- (setq n (1- n)))
- (sp-message :cant-slurp)
- (setq n -1))))))))
- (sp-forward-slurp-sexp (sp--negate-argument arg))))
-
-(defun sp-add-to-previous-sexp (&optional arg)
- "Add the expression around point to the first list preceding point.
-
-With ARG positive N add that many expressions to the preceding
-list.
-
-If ARG is raw prefix argument \\[universal-argument] add all expressions until
-the end of enclosing list to the previous list.
-
-If ARG is raw prefix argument \\[universal-argument] \\[universal-argument] add the current
-list into the previous list.
-
-Examples:
-
- (foo bar) |baz quux -> (foo bar |baz) quux
-
- (foo bar) |baz quux -> (foo bar |baz quux) ;; 2
-
- (blab (foo bar) |baz quux) -> (blab (foo bar |baz quux)) ;; \\[universal-argument]
-
- (foo bar) (baz |quux) -> (foo bar (baz |quux)) ;; \\[universal-argument] \\[universal-argument]"
- (interactive "P")
- (save-excursion
- (cond
- ((equal arg '(16))
- (sp-backward-up-sexp)
- (sp-backward-down-sexp)
- (sp-forward-slurp-sexp))
- (t
- (sp-backward-down-sexp)
- (sp-forward-slurp-sexp arg))))
- (indent-according-to-mode))
-
-(defun sp-add-to-next-sexp (&optional arg)
- "Add the expressions around point to the first list following point.
-
-With ARG positive N add that many expressions to the following
-list.
-
-If ARG is raw prefix argument \\[universal-argument] add all expressions until
-the beginning of enclosing list to the following list.
-
-If ARG is raw prefix argument \\[universal-argument] \\[universal-argument] add the current
-list into the following list.
-
-Examples:
-
- foo bar| (baz quux) -> foo (bar| baz quux)
-
- foo bar| (baz quux) -> (foo bar| baz quux) ;; 2
-
- (foo bar |(bar quux) blab) -> ((foo bar |bar quux) blab) ;; \\[universal-argument]
-
- (foo |bar) (baz quux) -> ((foo |bar) baz quux) ;; \\[universal-argument] \\[universal-argument]"
- (interactive "P")
- (save-excursion
- (cond
- ((equal arg '(16))
- (sp-up-sexp)
- (sp-down-sexp)
- (sp-backward-slurp-sexp))
- (t
- (sp-down-sexp)
- (sp-backward-slurp-sexp arg)))))
-
-(defun sp-forward-barf-sexp (&optional arg)
- "Remove the last sexp in the current list by moving the closing delimiter.
-
-If ARG is positive number N, barf that many expressions.
-
-If ARG is negative number -N, contract the opening pair instead.
-
-If ARG is raw prefix \\[universal-argument], barf all expressions from the one after
-point to the end of current list and place the point before the
-closing delimiter of the list.
-
-If the current list is empty, do nothing.
-
-Examples: (prefix arg in comment)
-
- (foo bar| baz) -> (foo bar|) baz ;; nil (defaults to 1)
-
- (foo| [bar baz]) -> (foo|) [bar baz] ;; 1
-
- (1 2 3| 4 5 6) -> (1 2 3|) 4 5 6 ;; \\[universal-argument] (or numeric prefix 3)
-
- (foo bar| baz) -> foo (bar| baz) ;; -1"
- (interactive "P")
- (let* ((raw (sp--raw-argument-p arg))
- (old-arg arg)
- (arg (prefix-numeric-value arg)))
- (if (> arg 0)
- (if (sp-point-in-blank-sexp)
- (sp-message :blank-sexp)
- (save-excursion
- (let ((enc (sp-get-enclosing-sexp)))
- (sp-get enc
- (cond
- ((and raw (= arg 4))
- (sp-get (sp-get-thing t)
- (goto-char :end-suf)))
- (t
- (goto-char :end-in)
- (sp-backward-sexp arg)
- (when (<= (point) :beg)
- (goto-char :beg-in))))
- ;; we know for sure there is at least one thing in the list
- (let ((back (sp-get-thing t)))
- (if (sp-compare-sexps back enc)
- (goto-char :beg-in)
- (goto-char (sp-get back :end-suf))))
- (sp--run-hook-with-args :op :pre-handlers 'barf-forward
- (list :arg arg :enc enc)))
- (sp-get (sp-get-enclosing-sexp)
- (sp-do-move-cl (point))
- (sp--keep-indentation
- (sp--indent-region :beg :end))
- (sp--run-hook-with-args :op :post-handlers 'barf-forward
- (list :arg arg :enc enc))))))
- (sp-backward-barf-sexp (sp--negate-argument old-arg)))))
-
-(defun sp-backward-barf-sexp (&optional arg)
- "This is exactly like calling `sp-forward-barf-sexp' with minus ARG.
-In other words, instead of contracting the closing pair, the
-opening pair is contracted. For more information, see the
-documentation of `sp-forward-barf-sexp'.
-
-Examples:
-
- (foo bar| baz) -> foo (bar| baz)
-
- ([foo bar] |baz) -> [foo bar] (|baz)
-
- (1 2 3 |4 5 6) -> 1 2 3 (|4 5 6) ;; \\[universal-argument] (or 3)"
- (interactive "P")
- (let* ((raw (sp--raw-argument-p arg))
- (old-arg arg)
- (arg (prefix-numeric-value arg)))
- (if (> arg 0)
- (if (sp-point-in-blank-sexp)
- (sp-message :blank-sexp)
- (save-excursion
- (let ((enc (sp-get-enclosing-sexp)))
- (sp-get enc
- (cond
- ((and raw (= arg 4))
- (sp-get (sp-get-thing)
- (goto-char :beg-prf)))
- (t
- (goto-char :beg-in)
- (sp-forward-sexp arg)
- (when (>= (point) :end)
- (goto-char :end-in))))
- ;; we know for sure there is at least one thing in the list
- (let ((next (sp-get-thing)))
- (if (sp-compare-sexps next enc)
- (goto-char :end-in)
- (goto-char (sp-get next :beg-prf))))
- (sp--run-hook-with-args :op :pre-handlers 'barf-backward
- (list :arg arg :enc enc)))
- (sp-get (sp-get-enclosing-sexp)
- (sp-do-move-op (point))
- (sp--indent-region :beg :end)
- (sp--run-hook-with-args :op :post-handlers 'barf-backward
- (list :arg arg :enc enc))))))
- (sp-forward-barf-sexp (sp--negate-argument old-arg)))))
-
-;; TODO: get rid of the macro anyway, it's stupid!
-(defmacro sp--skip-to-symbol-1 (forward)
- "Generate `sp-skip-forward-to-symbol' or `sp-skip-backward-to-symbol'."
- (let ((inc (if forward '1+ '1-))
- (dec (if forward '1- '1+))
- (forward-fn (if forward 'forward-char 'backward-char))
- (next-char-fn (if forward 'following-char 'preceding-char))
- (looking (if forward 'sp--looking-at 'sp--looking-back))
- (prefix-fn (if forward 'sp--get-suffix 'sp--get-prefix))
- (eob-test (if forward '(eobp) '(bobp)))
- (comment-bound (if forward 'cdr 'car)))
- `(let ((in-comment (sp-point-in-comment))
- ;; HACK: if we run out of current context this might skip a
- ;; pair that was not allowed before. However, such a call is
- ;; never made in SP, so it's OK for now
- (allowed-pairs (sp--get-allowed-regexp))
- ,(if forward
- '(allowed-close (sp--get-closing-regexp (sp--get-allowed-pair-list)))
- '(allowed-open (sp--get-opening-regexp (sp--get-allowed-pair-list))))
- (allowed-strings (sp--get-stringlike-regexp))
- (prefix nil))
- (while (and (not (or ,eob-test
- (and stop-after-string
- (not (sp-point-in-string))
- (sp-point-in-string (,dec (point))))
- (and stop-at-string
- (not (sp-point-in-string))
- (sp-point-in-string (,inc (point))))
- (and stop-inside-string
- (sp-point-in-string)
- (not (sp-point-in-string (,inc (point)))))
- (and (,looking allowed-pairs)
- (or in-comment (not (sp-point-in-comment))))
- (and (,looking allowed-strings)
- (or in-comment (not (sp-point-in-comment))))))
- (or (member (char-syntax (,next-char-fn)) '(?< ?> ?! ?| ?\ ?\\ ?\" ?' ?.))
- (/= 0 (logand (lsh 1 20) (car (syntax-after
- ,(if forward
- '(point)
- '(1- (point)))))))
- (unless in-comment (sp-point-in-comment))
- ;; This is the case where we are starting at
- ;; pair (looking at it) and there is some
- ;; prefix which is not recognized by syntax,
- ;; i.e. defined by regexp. This should only be
- ;; tested once in principle before the next
- ;; time we land on a delimiter this whole loop
- ;; stops based on the first branch of the `and'
- ;; condition in `while' so using expensive
- ;; functions here is not a bg deal.
- (and (or (,(if forward 'sp--looking-back 'sp--looking-at)
- ,(if forward 'allowed-close 'allowed-open))
- (,(if forward 'sp--looking-back 'sp--looking-at) allowed-strings))
- (progn
- (setq prefix (,prefix-fn))
- (> (length prefix) 0)))))
- (if (and (not in-comment)
- (sp-point-in-comment))
- (progn
- (goto-char (,comment-bound (sp-get-comment-bounds)))
- (unless ,eob-test (,forward-fn 1)))
- (unless ,eob-test
- (,forward-fn (max (length prefix) 1))))))))
-
-(defun sp-skip-forward-to-symbol (&optional stop-at-string stop-after-string stop-inside-string)
- "Skip whitespace and comments moving forward.
-
-If STOP-AT-STRING is non-nil, stop before entering a string (if
-not already in a string).
-
-If STOP-AFTER-STRING is non-nil, stop after exiting a string.
-
-If STOP-INSIDE-STRING is non-nil, stop before exiting a string.
-
-Examples:
-
- foo| bar -> foo |bar
-
- foo| [bar baz] -> foo |[bar baz]"
- (interactive "^")
- (sp--skip-to-symbol-1 t))
-
-(put 'sp-skip-forward-to-symbol 'CUA 'move)
-
-(defun sp-skip-backward-to-symbol (&optional stop-at-string stop-after-string stop-inside-string)
- "Skip whitespace and comments moving backward.
-If STOP-AT-STRING is non-nil, stop before entering a string (if
-not already in a string).
-
-If STOP-AFTER-STRING is non-nil, stop after exiting a string.
-
-If STOP-INSIDE-STRING is non-nil, stop before exiting a string.
-
-Examples:
-
- foo |bar -> foo| bar
-
- [bar baz] |foo -> [bar baz]| foo"
- (interactive "^")
- (sp--skip-to-symbol-1 nil))
-
-(put 'sp-skip-backward-to-symbol 'CUA 'move)
-
-(defun sp-skip-into-string (&optional back)
- "Move the point into the next string.
-
-With BACK non-nil, move backwards."
- (if back
- (while (and (not (sp-point-in-string)) (> (point) (point-min)))
- (backward-char))
- (while (and (not (sp-point-in-string)) (< (point) (point-max)))
- (forward-char))))
-
-;; TODO: in ruby, "foo |if bar" now moves correctly, but there's a
-;; noticable lag before it jumps over "if". This is probably caused
-;; by :skip-match handlers. Investigate!
-(defun sp-forward-symbol (&optional arg)
- "Move point to the next position that is the end of a symbol.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction.
-
-A symbol is any sequence of characters that are in either the
-word constituent or symbol constituent syntax class. Current
-symbol only extend to the possible opening or closing delimiter
-as defined by `sp-add-pair' even if part of this delimiter
-would match \"symbol\" syntax classes.
-
-Examples:
-
- |foo bar baz -> foo| bar baz
-
- |foo (bar (baz)) -> foo (bar| (baz)) ;; 2
-
- |foo (bar (baz) quux) -> foo (bar (baz) quux|) ;; 4"
- (interactive "^p")
- (setq arg (or arg 1))
- (sp--with-case-sensitive
- (let* ((n (abs arg))
- (fw (> arg 0))
- (allowed (sp--get-allowed-pair-list))
- (open (sp--get-opening-regexp allowed))
- (close (sp--get-closing-regexp allowed)))
- (if fw
- (while (> n 0)
- ;; First we need to get to the beginning of a symbol. This means
- ;; skipping all whitespace and pair delimiters until we hit
- ;; something in \sw or \s_
- (while (cond
- ((eobp) nil)
- ((not (memq (char-syntax (following-char)) '(?w ?_)))
- (forward-char)
- t)
- ;; if allowed is empty, the regexp matches anything
- ;; and we go into infinite loop, cf. Issue #400
- ((and allowed (sp--valid-initial-delimiter-p (sp--looking-at open)))
- (goto-char (match-end 0)))
- ((and allowed (sp--valid-initial-delimiter-p (sp--looking-at close)))
- (goto-char (match-end 0)))))
- (while (and (not (eobp))
- (or (not allowed)
- (not (or (sp--valid-initial-delimiter-p (sp--looking-at open))
- (sp--valid-initial-delimiter-p (sp--looking-at close)))))
- (or (memq (char-syntax (following-char)) '(?w ?_))
- ;; Specifically for lisp, we consider
- ;; sequences of ?\<ANYTHING> a symbol
- ;; sequence
- (and (eq (char-before) ??)
- (eq (char-syntax (following-char)) ?\\))
- (and (eq (char-syntax (char-before)) ?\\))))
- (forward-char))
- (setq n (1- n)))
- (sp-backward-symbol n)))))
-
-(put 'sp-forward-symbol 'CUA 'move)
-
-(defun sp-backward-symbol (&optional arg)
- "Move point to the next position that is the beginning of a symbol.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-forward direction.
-
-A symbol is any sequence of characters that are in either the word
-constituent or symbol constituent syntax class. Current symbol only
-extend to the possible opening or closing delimiter as defined by
-`sp-add-pair' even if part of this delimiter would match \"symbol\"
-syntax classes.
-
-Examples:
-
- foo bar| baz -> foo |bar baz
-
- ((foo bar) baz)| -> ((foo |bar) baz) ;; 2
-
- (quux ((foo) bar) baz)| -> (|quux ((foo) bar) baz) ;; 4"
- (interactive "^p")
- (setq arg (or arg 1))
- (sp--with-case-sensitive
- (let ((n (abs arg))
- (fw (> arg 0))
- (open (sp--get-opening-regexp (sp--get-allowed-pair-list)))
- (close (sp--get-closing-regexp (sp--get-allowed-pair-list))))
- (if fw
- (while (> n 0)
- (while (cond
- ((bobp) nil)
- ((not (memq (char-syntax (preceding-char)) '(?w ?_)))
- (backward-char)
- t)
- ((sp--valid-initial-delimiter-p (sp--looking-back open))
- (goto-char (match-beginning 0)))
- ((sp--valid-initial-delimiter-p (sp--looking-back close))
- (goto-char (match-beginning 0)))))
- (while (and (not (bobp))
- (not (or (sp--valid-initial-delimiter-p (sp--looking-back open))
- (sp--valid-initial-delimiter-p (sp--looking-back close))))
- (or (memq (char-syntax (preceding-char)) '(?w ?_))
- ;; Specifically for lisp, we consider
- ;; sequences of ?\<ANYTHING> a symbol
- ;; sequence
- (and (eq (char-before (1- (point))) ??)
- (eq (char-syntax (preceding-char)) ?\\))
- ))
- (backward-char))
- ;; skip characters which are symbols with prefix flag
- (while (and (not (eobp))
- (/= 0 (logand (lsh 1 20) (car (syntax-after (point))))))
- (forward-char 1))
- (setq n (1- n)))
- (sp-forward-symbol n)))))
-
-(put 'sp-backward-symbol 'CUA 'move)
-
-(defun sp-rewrap-sexp (pair &optional keep-old)
- "Rewrap the enclosing expression with a different pair.
-
-PAIR is the new enclosing pair.
-
-If optional argument KEEP-OLD is set, keep old delimiter and wrap
-with PAIR on the outside of the current expression.
-
-When used interactively, the new pair is specified in minibuffer
-by typing the *opening* delimiter, same way as with pair
-wrapping.
-
-When used interactively with raw prefix argument \\[universal-argument], KEEP-OLD
-is set to non-nil.
-
-Examples:
-
- (foo |bar baz) -> [foo |bar baz] ;; [
-
- (foo |bar baz) -> [(foo |bar baz)] ;; \\[universal-argument] ["
- (interactive (list
- (catch 'done
- (let ((available-pairs (sp--get-pair-list-context 'wrap))
- ev ac (pair-prefix ""))
- (while (not ac)
- (setq ev (read-event (format "Rewrap with: %s" pair-prefix) t))
- (if (and (equal pair-prefix "")
- (eq ev 'return))
- (throw 'done nil))
- (setq pair-prefix (concat pair-prefix (format-kbd-macro (vector ev))))
- (unless (--any? (string-prefix-p pair-prefix (car it)) available-pairs)
- (user-error "Impossible pair prefix selected: %s" pair-prefix))
- (setq ac (--first (equal pair-prefix (car it)) available-pairs)))
- ac))
- current-prefix-arg))
- (if (not pair)
- (sp-unwrap-sexp)
- (-when-let (enc (sp-get-enclosing-sexp))
- (save-excursion
- (sp-get enc
- (goto-char :end)
- (unless keep-old
- (delete-char (- :cl-l)))
- (insert (cdr pair))
- (goto-char :beg)
- (insert (car pair))
- (unless keep-old
- (delete-char :op-l))
- (setq sp-last-wrapped-region
- (sp--get-last-wraped-region
- :beg (+ :end
- (length (car pair))
- (length (cdr pair))
- (- :op-l)
- (- :cl-l))
- (car pair) (cdr pair)))))
- (sp--run-hook-with-args (car pair) :post-handlers 'rewrap-sexp
- (list :parent (sp-get enc :op))))))
-
-(defun sp-swap-enclosing-sexp (&optional arg)
- "Swap the enclosing delimiters of this and the parent expression.
-
-With N > 0 numeric argument, ascend that many levels before
-swapping.
-
-Examples:
-
- (foo [|bar] baz) -> [foo (|bar) baz] ;; 1
-
- (foo {bar [|baz] quux} quack) -> [foo {bar (|baz) quux} quack] ;; 2"
- (interactive "p")
- (let ((enc (sp-get-enclosing-sexp))
- (encp (sp-get-enclosing-sexp (1+ arg))))
- (if (and enc encp)
- (save-excursion
- (sp-get encp
- (goto-char :end)
- (delete-char (- :cl-l)))
- (sp-get enc
- (insert :cl)
- (goto-char :end)
- (delete-char (- :cl-l)))
- (sp-get encp (insert :cl))
- (sp-get enc (goto-char :beg-prf))
- (sp-get encp (insert :prefix :op))
- (sp-get enc (delete-char (+ :op-l :prefix-l)))
- (sp-get encp (goto-char :beg-prf))
- (sp-get enc (insert :prefix :op))
- (sp-get encp (delete-char (+ :op-l :prefix-l))))
- (sp-message :point-not-deep-enough))))
-
-(defun sp--unwrap-sexp (sexp &optional no-cleanup)
- "Unwrap expression defined by SEXP.
-
-Warning: this function remove possible empty lines and reindents
-the unwrapped sexp, so the SEXP structure will no longer
-represent a valid object in a buffer!"
- (sp-get sexp
- (delete-region :end-in :end)
- (delete-region :beg-prf :beg-in))
- ;; if the delimiters were the only thing on the line, we should also
- ;; get rid of the (possible) empty line that will be the result of
- ;; their removal. This is especially nice in HTML mode or
- ;; long-running tags like \[\] in latex.
- (unless no-cleanup
- (let ((new-start (sp-get sexp :beg-prf))
- (new-end (sp-get sexp (- :end-in :op-l :prefix-l)))
- indent-from indent-to)
- (save-excursion
- (goto-char new-end)
- (when (string-match-p "^[\n\t ]+\\'" (thing-at-point 'line))
- (let ((b (bounds-of-thing-at-point 'line)))
- (delete-region (car b) (cdr b))))
- (setq indent-to (point))
- (goto-char new-start)
- (when (string-match-p "^[\n\t ]+\\'" (thing-at-point 'line))
- (let ((b (bounds-of-thing-at-point 'line)))
- (delete-region (car b) (cdr b))))
- (setq indent-from (point)))
- (unless (or (memq major-mode sp-no-reindent-after-kill-modes)
- (memq indent-line-function
- sp-no-reindent-after-kill-indent-line-functions))
- (sp--keep-indentation
- (sp--indent-region indent-from indent-to))))))
-
-(defun sp-change-inner ()
- "Change the inside of the next expression.
-
-First, kill the inside of the next balanced expression, then move
-point just after the opening delimiter.
-
-Examples:
-
- (f|oo [bar] baz) -> (foo [|] baz)
-
- {|'foo': 'bar'} -> {'|': 'bar'}"
- (interactive)
- (-when-let (ok (sp-get-sexp))
- (sp-get ok
- (kill-region :beg-in :end-in)
- (goto-char :beg-in))))
-
-(defun sp-change-enclosing ()
- "Change the inside of the enclosing expression.
-
-Whitespace on both sides of the inner items is preserved if it
-contains newlines. Invoking this function on a blank sexp will
-wipe out remaining whitespace (see `sp-point-in-blank-sexp').
-
-Move the point to the beginning of the original content.
-
-Examples:
-
- (f|oo [bar] baz) -> (|)
-
- {'f|oo': 'bar'} -> {'|': 'bar'}"
- (interactive)
- (-when-let (ok (sp-get-enclosing-sexp))
- (sp-get ok
- (if (sp-point-in-blank-sexp)
- (progn
- (kill-region :beg-in :end-in)
- (goto-char :beg-in))
- (let ((beg (progn
- (goto-char :beg-in)
- (skip-chars-forward "\t\n ")
- (point)))
- (end (progn
- (goto-char :end-in)
- (skip-chars-backward "\t\n ")
- (point))))
- (kill-region beg end)
- (goto-char beg))))))
-
-(defun sp-unwrap-sexp (&optional arg)
- "Unwrap the following expression.
-
-With ARG N, unwrap Nth expression as returned by
-`sp-forward-sexp'. If ARG is negative -N, unwrap Nth expression
-backwards as returned by `sp-backward-sexp'.
-
-Return the information about the just unwrapped expression. Note
-that this structure does not represent a valid expression in the
-buffer.
-
-Examples:
-
- |(foo bar baz) -> |foo bar baz
-
- (foo bar| baz) -> foo bar| baz
-
- |(foo) (bar) (baz) -> |(foo) bar (baz) ;; 2"
- (interactive "p")
- (setq arg (or arg 1))
- (let ((sp-navigate-consider-symbols nil))
- (let ((ok (save-excursion (sp-forward-sexp arg))))
- (when ok (sp--unwrap-sexp ok))
- ok)))
-
-(defun sp-backward-unwrap-sexp (&optional arg)
- "Unwrap the previous expression.
-
-With ARG N, unwrap Nth expression as returned by
-`sp-backward-sexp'. If ARG is negative -N, unwrap Nth expression
-forward as returned by `sp-forward-sexp'.
-
-Examples:
-
- (foo bar baz)| -> foo bar baz|
-
- (foo bar)| (baz) -> foo bar| (baz)
-
- (foo) (bar) (baz)| -> foo (bar) (baz) ;; 3"
- (interactive "p")
- (sp-unwrap-sexp (- (or arg 1))))
-
-(defun sp-splice-sexp (&optional arg)
- "Unwrap the current list.
-
-With ARG N, unwrap Nth list as returned by applying `sp-up-sexp'
-N times. This function expect positive arg.
-
-Examples:
-
- (foo (bar| baz) quux) -> (foo bar| baz quux)
-
- (foo |(bar baz) quux) -> foo |(bar baz) quux
-
- (foo (bar| baz) quux) -> foo (bar| baz) quux ;; 2"
- (interactive "p")
- (setq arg (or arg 1))
- (-when-let (ok (sp-get-enclosing-sexp arg))
- (if (equal ";" (sp-get ok :prefix))
- (sp-get ok
- (save-excursion
- (goto-char :beg)
- (-when-let (enc (sp-get-enclosing-sexp arg))
- (sp--unwrap-sexp enc))))
- (sp--unwrap-sexp ok))))
-
-(defun sp--splice-sexp-do-killing (beg end expr &optional jump-end)
- "Save the text in the region between BEG and END inside EXPR,
-then delete EXPR and insert the saved text.
-
-If optional argument JUPM-END is equal to the symbol 'end move
-the point after the re-inserted text."
- (let (str p)
- (setq str (buffer-substring-no-properties beg end))
- (delete-region (sp-get expr :beg-prf) (sp-get expr :end))
- (save-excursion
- (insert str)
- (sp--indent-region (sp-get expr :beg-prf) (point))
- (setq p (point)))
- (when (eq jump-end 'end) (goto-char p))))
-
-(defun sp-splice-sexp-killing-backward (&optional arg)
- "Unwrap the current list and kill all the expressions
-between start of this list and the point.
-
-With the optional argument ARG, repeat that many times. This
-argument should be positive number.
-
-Examples:
-
- (foo (let ((x 5)) |(sqrt n)) bar) -> (foo |(sqrt n) bar)
-
-​ (when ok| |(perform-operation-1)
-​ (perform-operation-1) -> (perform-operation-2)
-​ (perform-operation-2))
-
-​ (save-excursion -> |(awesome-stuff-happens) ;; 2
-​ (unless (test)
-​ |(awesome-stuff-happens)))
-
-Note that to kill only the content and not the enclosing
-delimiters you can use \\[universal-argument] \\[sp-backward-kill-sexp].
-See `sp-backward-kill-sexp' for more information."
- (interactive "p")
- (while (> arg 0)
- (sp-splice-sexp-killing-around '(4))
- (setq arg (1- arg))))
-
-;; TODO: write in terms of `sp-splice-sexp-killing-around'.
-(defun sp-splice-sexp-killing-forward (&optional arg)
- "Unwrap the current list and kill all the expressions between
-the point and the end of this list.
-
-With the optional argument ARG, repeat that many times. This
-argument should be positive number.
-
-Examples:
-
- (a (b c| d e) f) -> (a b c| f)
-
- (+ (x |y z) w) -> (+ x| w)
-
-Note that to kill only the content and not the enclosing
-delimiters you can use \\[universal-argument] \\[sp-kill-sexp].
-See `sp-kill-sexp' for more information."
- (interactive "p")
- (while (> arg 0)
- (let ((ok (sp-get-enclosing-sexp 1)))
- (if ok
- (let ((next (sp-get-thing t)))
- (if (sp-compare-sexps next ok)
- (sp-kill-sexp '(16))
- (sp--splice-sexp-do-killing
- (sp-get next :end) ;search backward
- (sp-get ok :beg-in)
- ok 'end)))
- (setq arg -1)))
- (setq arg (1- arg))))
-
-(defun sp-splice-sexp-killing-around (&optional arg)
- "Unwrap the current list and kill everything inside except next expression.
-
-With ARG save that many next expressions. With ARG negative -N,
-save that many expressions backward.
-
-If ARG is raw prefix argument \\[universal-argument] this function behaves exactly
-the same as `sp-splice-sexp-killing-backward'.
-
-If ARG is negative raw prefix argument \\[negative-argument] \\[universal-argument] this function
-behaves exactly the same as `sp-splice-sexp-killing-forward'.
-
-Note that the behaviour with the prefix argument seems to be
-reversed. This is because the backward variant is much more
-common and hence deserve shorter binding.
-
-If ARG is raw prefix argument \\[universal-argument] \\[universal-argument] raise the expression the point
-is inside of. This is the same as `sp-backward-up-sexp' followed by
-`sp-splice-sexp-killing-around'.
-
-Examples:
-
- (a b |(c d) e f) -> |(c d) ;; with arg = 1
-
- (a b |c d e f) -> |c d ;; with arg = 2
-
- (- (car x) |a 3) -> (car x)| ;; with arg = -1
-
- (foo (bar |baz) quux) -> |(bar baz) ;; with arg = \\[universal-argument] \\[universal-argument]"
- (interactive "P")
- (cond
- ((equal arg '(-4))
- (sp-splice-sexp-killing-forward 1))
- (t
- (if (equal arg '(16))
- (progn
- (sp-backward-up-sexp)
- (setq arg 1)))
- (let* (inside-comment-inside-sexp
- (num-arg (prefix-numeric-value arg))
- (ok ;; (sp-get-enclosing-sexp 1)
- (save-excursion
- (sp-skip-backward-to-symbol)
- ;; if the point is inside a comment, we want to
- ;; operate on the sexp that contains it. however,
- ;; if we are inside a sexp inside a comment, we
- ;; should operate on that instead.
- (if (sp-point-in-comment)
- (let ((enc (sp-get-enclosing-sexp 1))
- (cb (sp-get-comment-bounds)))
- (if (> (sp-get enc :beg) (car cb))
- (progn
- (setq inside-comment-inside-sexp t)
- enc)
- (goto-char (cdr cb))
- ;; todo: replace with something more
- ;; abstract
- (skip-chars-forward "\t\n ")
- (sp-get-enclosing-sexp 1)))
- (sp-get-enclosing-sexp 1)))))
- (when ok
- (when (and (sp-point-in-comment)
- (not inside-comment-inside-sexp))
- (let ((cb (sp-get-comment-bounds)))
- (goto-char (if (> num-arg 0) (car cb) (cdr cb)))))
- (sp-skip-backward-to-symbol)
- (-let* ((next (sp--next-thing-selection arg))
- ((from . to)
- (cond
- ((and (sp-point-in-comment)
- (not inside-comment-inside-sexp))
- (if (> num-arg 0)
- ;; only extends to keep the comment if raising
- ;; towards the end.
- (cons (car (sp-get-comment-bounds))
- (sp-get next :end-suf))
- (sp-get next (cons :beg-prf :end-suf))))
- ((and (sp-point-in-comment)
- inside-comment-inside-sexp)
- (sp-get next (cons :beg-prf :end-suf)))
- ;; If we are splicing before a comment, the
- ;; comment might be connected to the sexp
- ;; after it, so we better don't kill it. Only
- ;; do that if the comment is on its own line
- ;; though, otherwise it is connected to the
- ;; sexp before it.
- ((save-excursion
- (skip-chars-forward "\t\n ")
- (when (and (> num-arg 0)
- (sp-point-in-comment)
- (save-excursion
- (skip-chars-backward "\t ")
- (bolp)))
- (cons (point) (sp-get next :end-suf)))))
- ;; similarly, if there is a comment before
- ;; this sexp, keep it.
- ((save-excursion
- (sp-backward-symbol)
- (when (and (> num-arg 0)
- (sp-point-in-comment)
- (goto-char (car (sp-get-comment-bounds)))
- (> (point) (sp-get ok :beg))
- (save-excursion
- (skip-chars-backward "\t ")
- (bolp)))
- (cons (point) (sp-get next :end-suf)))))
- (t (sp-get next (cons :beg-prf :end-suf))))))
- (sp--splice-sexp-do-killing from to
- ok (if (> num-arg 0) nil 'end))))))))
-
-(defalias 'sp-raise-sexp 'sp-splice-sexp-killing-around)
-
-(defun sp-convolute-sexp (&optional arg)
- "Convolute balanced expressions.
-
-Save the expressions preceding point and delete them. Then
-splice the resulting expression. Wrap the current enclosing list
-with the delimiters of the spliced list and insert the saved
-expressions.
-
-If point is in a symbol, move to end of symbol before convolving.
-
-With ARG positive N, move up N lists before wrapping.
-
-Examples:
-
-We want to move the `while' before the `let'.
-
-​ (let ((stuff 1) (while (we-are-good)
-​ (other 2)) (let ((stuff 1)
-​ (while (we-are-good) -> (other 2))
-​ |(do-thing 1) |(do-thing 1)
-​ (do-thing 2) (do-thing 2)
-​ (do-thing 3))) (do-thing 3)))
-
- (forward-char (sp-get env |:op-l)) -> (sp-get env (forward-char |:op-l))"
- (interactive "p")
- (save-excursion
- (when (sp-point-in-symbol)
- (sp-forward-symbol))
- (when (looking-at-p " ")
- (just-one-space))
- (let* ((old-buffer-size (buffer-size))
- (enc (sp-get-enclosing-sexp))
- (inner-close (sp-get enc (delete-and-extract-region
- (save-excursion
- (goto-char :end-in)
- (sp-backward-whitespace))
- :end)))
- (inner-raise (sp-get enc (delete-and-extract-region
- :beg-prf
- (save-excursion
- (sp-forward-whitespace)))))
- (whitespace (sp-get enc
- ;; this happens when the entire inside sexp was removed.
- (when (= old-buffer-size (+ (buffer-size) :len))
- (delete-and-extract-region
- (save-excursion
- (goto-char :beg-prf)
- (max (line-beginning-position) (sp-backward-whitespace)))
- :beg-prf))))
- (encp (sp-get-enclosing-sexp arg)))
- (sp-get encp
- (goto-char :end)
- (insert inner-close)
- (goto-char :beg-prf)
- (insert inner-raise (if whitespace whitespace ""))
- (sp-get (sp-get-enclosing-sexp)
- (sp--indent-region :beg :end)))))
- (indent-according-to-mode))
-
-(defun sp-absorb-sexp (&optional arg)
- "Absorb previous expression.
-
-Save the expressions preceding point and delete them. Then slurp
-an expression backward and insert the saved expressions.
-
-With ARG positive N, absorb that many expressions.
-
-Examples:
-
-​ (do-stuff 1) (save-excursion
-​ (save-excursion -> |(do-stuff 1)
-​ |(do-stuff 2)) (do-stuff 2))
-
- foo bar (concat |baz quux) -> (concat |foo bar baz quux) ;; 2"
- (interactive "p")
- (sp-forward-whitespace)
- (let* ((old (point))
- (raise (progn
- (sp-beginning-of-sexp)
- (buffer-substring (point) old))))
- (delete-region (point) old)
- (sp-backward-slurp-sexp arg)
- (sp-forward-whitespace)
- (sp-beginning-of-sexp)
- (insert raise)
- (save-excursion
- (sp-backward-up-sexp)
- (indent-sexp)))
- (sp-forward-whitespace))
-
-(defun sp-emit-sexp (&optional arg)
- "Move all expression preceding point except the first one out of the current list.
-
-With ARG positive N, keep that many expressions from the start of
-the current list.
-
-This is similar as `sp-backward-barf-sexp' but it also drags the
-first N expressions with the delimiter.
-
-Examples:
-
-​ (save-excursion ​(do-stuff 1)
-​ (do-stuff 1) (do-stuff 2)
-​ (do-stuff 2) -> (save-excursion
-​ |(do-stuff 3)) |(do-stuff 3))
-
-​ (while not-done-yet (execute-only-once)
-​ (execute-only-once) -> (while not-done-yet ;; arg = 2
-​ |(execute-in-loop)) |(execute-in-loop))"
- (interactive "p")
- (let (save-text)
- (save-excursion
- (sp-beginning-of-sexp)
- (let* ((start (point)))
- (sp-forward-sexp arg)
- (sp-skip-forward-to-symbol t)
- (setq save-text (buffer-substring start (point)))
- (delete-region start (point))))
- (save-excursion (sp-backward-barf-sexp '(4)))
- (sp-down-sexp)
- (insert save-text)
- (save-excursion
- (sp-backward-up-sexp)
- (indent-sexp))))
-
-(defun sp-extract-before-sexp (&optional arg)
- "Move the expression after point before the enclosing balanced expression.
-
-The point moves with the extracted expression.
-
-With ARG positive N, extract N expressions after point.
-
-With ARG negative -N, extract N expressions before point.
-
-With ARG being raw prefix argument \\[universal-argument], extract all the expressions
-up until the end of enclosing list.
-
-If the raw prefix is negative, this behaves as \\[universal-argument] `sp-backward-barf-sexp'."
- (interactive "P")
- (if (equal arg '(-4))
- (sp-backward-barf-sexp '(4))
- (sp-select-next-thing arg)
- (let ((enc (sp-get-enclosing-sexp))
- save-text b e nl)
- (save-excursion
- ;; TODO: extract this use pattern into general "get X things
- ;; with or without surrounding whitespace."
- (setq b (region-beginning))
- (setq e (region-end))
- (goto-char (sp-get enc :end-in))
- (if (save-excursion
- (skip-chars-backward "\t ")
- (bolp))
- (let ((whitespace (sp-get-whitespace)))
- (sp-get whitespace (when (= :beg e)
- (delete-region :beg :end))))
- (setq nl t))
- (setq save-text (delete-and-extract-region b e))
- (when nl
- (let ((whitespace (sp-get-whitespace)))
- (sp-get whitespace (delete-region :beg :end))))
- (goto-char (sp-get enc :beg-prf))
- (insert save-text "\n")
- (sp-get enc (sp--indent-region :beg-prf :end)))
- ;; if we're at an empty line, remove it
- (when (string-match-p "^[\n\t ]+\\'" (thing-at-point 'line))
- (let ((b (bounds-of-thing-at-point 'line)))
- (delete-region (car b) (cdr b))))
- (goto-char (sp-get enc :beg-prf)))))
-
-(defun sp-extract-after-sexp (&optional arg)
- "Move the expression after point after the enclosing balanced expression.
-
-The point moves with the extracted expression.
-
-With ARG positive N, extract N expressions after point.
-
-With ARG negative -N, extract N expressions before point.
-
-With ARG being raw prefix argument \\[universal-argument], extract all the
-expressions up until the end of enclosing list.
-
-With ARG being negative raw prefix argument \\[negative-argument] \\[universal-argument], extract all the
-expressions up until the start of enclosing list."
- ;; this is uch uglier than the "before" version, since the
- ;; calculations forward have to account for the deleted text. Figure
- ;; out a way to make it smoother.
- (interactive "P")
- (sp-select-next-thing arg)
- (sp--with-case-sensitive
- (let ((enc (sp-get-enclosing-sexp))
- (dws 0) ;length of deleted whitespace
- save-text b e nl)
- (save-excursion
- (setq b (region-beginning))
- (setq e (region-end))
- (goto-char (sp-get enc :end-in))
- (if (save-excursion
- (skip-chars-backward "\t ")
- (bolp))
- (let ((whitespace (sp-get-whitespace)))
- (sp-get whitespace
- (when (= :beg e)
- (delete-region :beg :end)
- (setq dws (- :end :beg)))))
- (setq nl t))
- (setq save-text (delete-and-extract-region b e))
- (when nl
- (let ((whitespace (sp-get-whitespace)))
- (sp-get whitespace (delete-region :beg :end))
- (sp-get whitespace (setq dws (+ dws (- :end :beg))))))
- (sp-get enc (goto-char (- :end (length save-text) dws)))
- (insert "\n" save-text)
- (sp-get enc (sp--indent-region :beg-prf :end))
- (setq e (point)))
- ;; if we're at an empty line, remove it
- (setq dws 0) ; variable reuse, ugly :/
- (when (string-match-p "^[\n\t ]+\\'" (thing-at-point 'line))
- (let ((b (bounds-of-thing-at-point 'line)))
- (delete-region (car b) (cdr b))
- (setq dws (- (cdr b) (car b)))))
- (when (sp--looking-back (sp--get-opening-regexp) nil t)
- (let ((whitespace (sp-get-whitespace)))
- (sp-get whitespace
- (delete-region :beg :end)
- (setq dws (- :end :beg)))))
- (goto-char (- e dws)))))
-
-(defun sp-forward-whitespace (&optional arg)
- "Skip forward past the whitespace characters.
-With non-nil ARG return number of characters skipped."
- (interactive "^P")
- (let ((rel-move (skip-chars-forward " \t\n")))
- (if arg rel-move (point))))
-
-(put 'sp-forward-whitespace 'CUA 'move)
-
-(defun sp-backward-whitespace (&optional arg)
- "Skip backward past the whitespace characters.
-With non-nil ARG return number of characters skipped."
- (interactive "^P")
- (let ((rel-move (skip-chars-backward " \t\n")))
- (if arg rel-move (point))))
-
-(put 'sp-backward-whitespace 'CUA 'move)
-
-(defun sp-split-sexp (arg)
- "Split the list or string the point is on into two.
-
-If ARG is a raw prefix \\[universal-argument] split all the sexps in current expression
-in separate lists enclosed with delimiters of the current
-expression.
-
-See also setting `sp-split-sexp-always-split-as-string' which
-determines how sexps inside strings are treated and also for a
-discussion of how to automatically add concatenation operators to
-string splitting.
-
-Examples:
-
- (foo bar |baz quux) -> (foo bar) |(baz quux)
-
- \"foo bar |baz quux\" -> \"foo bar\" |\"baz quux\"
-
- ([foo |bar baz] quux) -> ([foo] |[bar baz] quux)
-
- (foo bar| baz quux) -> (foo) (bar|) (baz) (quux) ;; \\[universal-argument]"
- (interactive "P")
- (cond
- ((equal arg '(4))
- (-when-let (items (sp-get-list-items))
- (let ((op (sp-get (car items) :op))
- (cl (sp-get (car items) :cl))
- (beg (sp-get (car items) :beg))
- (end (sp-get (car items) :end)))
- (!cdr items)
- (setq items (nreverse items))
- (save-excursion
- (goto-char end)
- (delete-char (- (length cl)))
- (while items
- (sp-get (car items)
- (goto-char :end)
- (insert cl)
- (goto-char :beg)
- (insert op))
- (!cdr items))
- (goto-char beg)
- (delete-char (length op))))))
- (t
- (let ((should-split-as-string
- (and sp-split-sexp-always-split-as-string
- (sp-point-in-string))))
- (-when-let (ok (if should-split-as-string
- (save-excursion
- (goto-char (car (sp-get-quoted-string-bounds)))
- (sp-get-sexp))
- (sp-get-enclosing-sexp 1)))
- (sp-get ok
- (sp--run-hook-with-args :op :pre-handlers 'split-sexp)
- (if should-split-as-string
- (progn
- (insert :cl)
- (save-excursion (insert :op)))
- (forward-char (- (prog1 (sp-backward-whitespace t) (insert :cl))))
- (save-excursion (sp-forward-whitespace) (insert :op)))
- (sp--run-hook-with-args :op :post-handlers 'split-sexp)))))))
-
-(defun sp--join-sexp (prev next)
- "Join the expressions PREV and NEXT if they are of the same type.
-
-The expression with smaller :beg is considered the previous one,
-so the input order does not actually matter.
-
-Return the information about resulting expression."
- (if (and (sp-compare-sexps prev next equal :op)
- (sp-compare-sexps prev next equal :cl))
- ;; if there's some prefix on the second expression, remove it.
- ;; We do not move it to the first expression, it is assumed
- ;; there's one already
- (progn
- (if (sp-compare-sexps prev next >)
- (let ((tmp prev))
- (setq prev next)
- (setq next tmp)))
- (sp-get next (delete-region :beg-prf :beg-in))
- (sp-get prev (delete-region :end-in :end))
- (list :beg (sp-get prev :beg)
- :end (- (sp-get next (- :end :op-l :prefix-l)) (sp-get prev :cl-l))
- :op (sp-get prev :op)
- :cl (sp-get prev :cl)
- :prefix (sp-get prev :prefix)))
- (sp-message :different-type)))
-
-(defun sp-join-sexp (&optional arg)
- "Join the sexp before and after point if they are of the same type.
-
-If ARG is positive N, join N expressions after the point with the
-one before the point.
-
-If ARG is negative -N, join N expressions before the point with
-the one after the point.
-
-If ARG is a raw prefix \\[universal-argument] join all the things up until the end
-of current expression.
-
-The joining stops at the first expression of different type.
-
-Examples:
-
- (foo bar) |(baz) -> (foo bar |baz)
-
- (foo) |(bar) (baz) -> (foo |bar baz) ;; 2
-
- [foo] [bar] |[baz] -> [foo bar |baz] ;; -2
-
- (foo bar (baz)| (quux) (blob bluq)) -> (foo bar (baz| quux blob bluq)) ;; \\[universal-argument]"
- (interactive "P")
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (n (abs arg))
- (prev (save-excursion (sp-backward-sexp (sp--signum arg))))
- next)
- (save-excursion
- (cond
- ((and raw (= n 4))
- (setq next (sp-forward-sexp (sp--signum arg)))
- (while (cond
- ((> arg 0)
- (sp-compare-sexps next prev > :beg :end))
- ((< arg 0)
- (sp-compare-sexps next prev < :end :beg)))
- (setq prev (sp--join-sexp prev next))
- (setq next (sp-forward-sexp (sp--signum arg)))))
- (t (while (> n 0)
- (setq next (sp-forward-sexp (sp--signum arg)))
- (setq prev (sp--join-sexp prev next))
- (setq n (1- n)))))
- prev)))
-
-(defun sp--next-thing-selection (&optional arg point)
- "Return the bounds of selection over next thing.
-
-See `sp-select-next-thing' for the meaning of ARG.
-
-If POINT is non-nil, it is assumed it's a point inside the buffer
-from which the selection extends, either forward or backward,
-depending on the value of ARG.
-
-The return value has the same format as `sp-get-sexp'. This does
-not necessarily represent a valid balanced expression!"
- (save-excursion
- (let* ((raw (sp--raw-argument-p arg))
- (arg (prefix-numeric-value arg))
- (beg point) (end point)
- (op "") (cl "")
- (prefix "")
- (suffix ""))
- (cond
- ;; select up until end of list
- ((and raw (= arg 4))
- (let ((enc (sp-get-enclosing-sexp)))
- (if (not enc)
- (error "No enclosing expression")
- (save-excursion
- (goto-char (sp-get enc :end-in))
- (-when-let (ok (sp-get-thing t))
- (sp-get ok
- (setq end :end)
- (setq cl :cl)
- (setq suffix :suffix)))))
- (unless point
- (-when-let (ok (sp-get-thing))
- (if (sp-compare-sexps ok enc)
- (progn
- (setq beg end)
- (setq end (sp-get enc :end-in)))
- (sp-get ok
- (setq beg :beg)
- (setq op :op)
- (setq prefix :prefix)))))))
- ;; select up until beg of list
- ((and raw (= arg -4))
- (let ((enc (sp-get-enclosing-sexp)))
- (if (not enc)
- (error "No enclosing expression")
- (save-excursion
- (goto-char (sp-get enc :beg-in))
- (-when-let (ok (sp-get-thing))
- (sp-get ok
- (setq beg :beg)
- (setq op :op)
- (setq prefix :prefix))))))
- (unless point
- (-when-let (ok (sp-get-thing t))
- (sp-get ok
- (setq end :end)
- (setq cl :cl)
- (setq suffix :suffix)))))
- ;; select the enclosing expression
- ((and raw (= (abs arg) 16))
- (let ((enc (sp-get-enclosing-sexp)))
- (if (not enc)
- (error "No enclosing expression")
- (sp-get enc (setq beg :beg) (setq end :end)
- (setq op :op) (setq cl :cl)
- (setq prefix :prefix)
- (setq suffix :suffix)))))
- ;; normal selection, select N expressions
- ((> arg 0)
- (let* ((first (sp-forward-sexp))
- (last first))
- (setq arg (1- arg))
- (setq beg (or point (sp-get first :beg)))
- (while (and (> arg 0) last)
- (setq last (sp-forward-sexp))
- (let ((nb (sp-get last :beg))) (when (< nb beg)
- (setq first last)
- (setq beg nb)))
- (setq arg (1- arg)))
- (unless (and point (= point beg))
- (sp-get first
- (setq beg :beg)
- (setq op :op)
- (setq prefix :prefix)))
- (sp-get last
- (setq end :end)
- (setq cl :cl)
- (setq suffix :suffix))))
- ;; normal select, select -N expressions
- ((< arg 0)
- (let* ((first (sp-backward-sexp))
- (last first))
- (setq arg (1+ arg))
- (setq end (or point (sp-get first :end)))
- (while (and (< arg 0) last)
- (setq last (sp-backward-sexp))
- (let ((ne (sp-get last :end))) (when (> ne end)
- (setq first last)
- (setq end ne)))
- (setq arg (1+ arg)))
- (sp-get last
- (setq beg :beg)
- (setq op :op)
- (setq prefix :prefix))
- (unless (and point (= point end))
- (sp-get first
- (setq end :end)
- (setq cl :cl)
- (setq suffix :suffix)))))
- ;; N = 0, select insides
- ((= arg 0)
- (let ((enc (sp-get-enclosing-sexp)))
- (if (not enc)
- (error "No enclosing expression")
- (save-excursion
- (goto-char (sp-get enc :beg-in))
- (-when-let (ok (sp-get-thing))
- (sp-get ok
- (setq beg :beg)
- (setq op :op)
- (setq prefix :prefix))))
- (save-excursion
- (goto-char (sp-get enc :end-in))
- (-when-let (ok (sp-get-thing t))
- (sp-get ok
- (setq end :end)
- (setq cl :cl)
- (setq suffix :suffix))))))))
- (list :beg beg :end end :op op :cl cl :prefix prefix :suffix suffix))))
-
-(defun sp-select-next-thing (&optional arg point)
- "Set active region over next thing as recognized by `sp-get-thing'.
-
-If ARG is positive N, select N expressions forward.
-
-If ARG is negative -N, select N expressions backward.
-
-If ARG is a raw prefix \\[universal-argument] select all the things up until the
-end of current expression.
-
-If ARG is a raw prefix \\[universal-argument] \\[universal-argument] select the current expression (as
-if doing `sp-backward-up-sexp' followed by
-`sp-select-next-thing').
-
-If ARG is number 0 (zero), select all the things inside the
-current expression.
-
-If POINT is non-nil, it is assumed it's a point inside the buffer
-from which the selection extends, either forward or backward,
-depending on the value of ARG.
-
-If the currently active region contains a balanced expression,
-following invocation of `sp-select-next-thing' will select the
-inside of this expression . Therefore calling this function
-twice with no active region will select the inside of the next
-expression.
-
-If the point is right in front of the expression any potential
-prefix is ignored. For example, '|(foo) would only select (foo)
-and not include ' in the selection. If you wish to also select
-the prefix, you have to move the point backwards.
-
-With `sp-navigate-consider-symbols' symbols and strings are also
-considered balanced expressions."
- (interactive "P")
- (let* ((selection (sp--next-thing-selection arg point))
- (p (point))
- (b (sp-get selection :beg))
- (e (sp-get selection :end))
- contracted)
- ;; Show a helpful error if we're trying to move beyond the
- ;; beginning or end of the buffer.
- (when (or (null b) (null e))
- (user-error (if (bobp) "At beginning of buffer" "At end of buffer")))
- ;; if region is active and ready to use, check if this selection
- ;; == old selection. If so, reselect the insides
- (when (region-active-p)
- (let ((rb (region-beginning))
- (re (region-end)))
- (when (and (sp-get selection
- (or (= rb :beg)
- (= rb :beg-prf)))
- (= re (sp-get selection :end)))
- (sp-get selection
- (setq b :beg-in)
- (setq e :end-in))
- (setq contracted t))))
- ;; if we moved forward check if the old-point was in front of an
- ;; expression and after a prefix. If so, remove the prefix from
- ;; the selection
- (unless (and (> (prefix-numeric-value arg) 0)
- (not (sp--raw-argument-p arg))
- (= b p))
- (unless contracted (setq b (sp-get selection :beg-prf))))
- (push-mark b t t)
- (goto-char e)
- selection))
-
-(defun sp-select-previous-thing (&optional arg point)
- "Set active region over ARG previous things as recognized by `sp-get-thing'.
-
-If ARG is negative -N, select that many expressions forward.
-
-With `sp-navigate-consider-symbols' symbols and strings are also
-considered balanced expressions."
- (interactive "P")
- (sp-select-next-thing (sp--negate-argument arg) point))
-
-(defun sp-select-next-thing-exchange (&optional arg point)
- "Just like `sp-select-next-thing' but run `exchange-point-and-mark' afterwards."
- (interactive "P")
- (prog1
- (sp-select-next-thing arg point)
- (exchange-point-and-mark)))
-
-(defun sp-select-previous-thing-exchange (&optional arg point)
- "Just like `sp-select-previous-thing' but run `exchange-point-and-mark' afterwards."
- (interactive "P")
- (prog1
- (sp-select-previous-thing arg point)
- (exchange-point-and-mark)))
-
-(defun sp-mark-sexp (&optional arg allow-extend)
- "Set mark ARG balanced expressions from point.
-The place mark goes is the same place \\[sp-forward-sexp] would
-move to with the same argument.
-Interactively, if this command is repeated
-or (in Transient Mark mode) if the mark is active,
-it marks the next ARG sexps after the ones already marked.
-This command assumes point is not in a string or comment."
- (interactive "P\np")
- (cond ((and allow-extend
- (or (and (eq last-command this-command) (mark t))
- (and transient-mark-mode mark-active)))
- (setq arg (if arg (prefix-numeric-value arg)
- (if (< (mark) (point)) -1 1)))
- (set-mark
- (save-excursion
- (let ((p (point)))
- (goto-char (mark))
- (sp-forward-sexp arg)
- (unless (sp-region-ok-p p (point))
- (user-error "Can not extend selection: region invalid"))
- (point)))))
- (t
- (push-mark
- (save-excursion
- (sp-forward-sexp (prefix-numeric-value arg))
- (point))
- nil t))))
-
-(defun sp-delete-char (&optional arg)
- "Delete a character forward or move forward over a delimiter.
-
-If on an opening delimiter, move forward into balanced expression.
-
-If on a closing delimiter, refuse to delete unless the balanced
-expression is empty, in which case delete the entire expression.
-
-If the delimiter does not form a balanced expression, it will be
-deleted normally.
-
-With a numeric prefix argument N > 0, delete N characters forward.
-
-With a numeric prefix argument N < 0, delete N characters backward.
-
-With a numeric prefix argument N = 0, simply delete a character
-forward, without regard for delimiter balancing.
-
-If ARG is raw prefix argument \\[universal-argument], delete
-characters forward until a closing delimiter whose deletion would
-break the proper pairing is hit.
-
-Examples:
-
- (quu|x \"zot\") -> (quu| \"zot\")
-
- (quux |\"zot\") -> (quux \"|zot\") -> (quux \"|ot\")
-
- (foo (|) bar) -> (foo | bar)
-
- |(foo bar) -> (|foo bar)"
- (interactive "P")
- (sp--with-case-sensitive
- (let* ((raw (sp--raw-argument-p arg))
- ;; if you edit 10 gigabyte files in Emacs, you're gonna have
- ;; a bad time.
- (n (if raw 100000000
- (prefix-numeric-value arg))))
- (cond
- ((> n 0)
- (while (> n 0)
- (cond
- ((let ((ok (sp-point-in-empty-sexp)))
- (when ok
- (backward-char (length (car ok)))
- (delete-char (+ (length (car ok)) (length (cdr ok)))))
- ok)
- ;; make this customizable
- (setq n (1- n)))
- ((and (sp-point-in-string)
- (save-excursion (forward-char) (not (sp-point-in-string))))
- (setq n 0))
- ((sp--looking-at (sp--get-opening-regexp (sp--get-pair-list-context 'navigate)))
- (-if-let (thing (save-match-data (sp-get-thing)))
- (cond
- ((= (sp-get thing :end-in) (point))
- (setq n 0))
- ((= (sp-get thing :beg) (point))
- (goto-char (sp-get thing :beg-in)))
- (t
- (delete-char (length (match-string 0)))))
- (delete-char (length (match-string 0))))
- ;; make this customizable
- (setq n (1- n)))
- ((and (not (sp-point-in-string))
- (save-excursion (forward-char) (sp-point-in-string)))
- (forward-char)
- ;; make this customizable
- (setq n (1- n)))
- ((sp--looking-at (sp--get-closing-regexp (sp--get-pair-list-context 'navigate)))
- (if (save-match-data (sp-get-thing))
- ;; make this customizable -- maybe we want to skip and
- ;; continue deleting
- (setq n 0)
- (delete-char (length (match-string 0)))
- (setq n (1- n))))
- ((bound-and-true-p hungry-delete-mode)
- (hungry-delete-forward 1)
- (setq n (1- n)))
- (t
- (delete-char 1)
- (setq n (1- n))))))
- ((= n 0) (delete-char 1))
- (t (sp-backward-delete-char (sp--negate-argument arg)))))))
-
-(defun sp-backward-delete-char (&optional arg)
- "Delete a character backward or move backward over a delimiter.
-
-If on a closing delimiter, move backward into balanced expression.
-
-If on a opening delimiter, refuse to delete unless the balanced
-expression is empty, in which case delete the entire expression.
-
-If the delimiter does not form a balanced expression, it will be
-deleted normally.
-
-With a numeric prefix argument N > 0, delete N characters backward.
-
-With a numeric prefix argument N < 0, delete N characters forward.
-
-With a numeric prefix argument N = 0, simply delete a character
-backward, without regard for delimiter balancing.
-
-If ARG is raw prefix argument \\[universal-argument], delete
-characters backward until a opening delimiter whose deletion would
-break the proper pairing is hit.
-
-Examples:
-
- (\"zot\" q|uux) -> (\"zot\" |uux)
-
- (\"zot\"| quux) -> (\"zot|\" quux) -> (\"zo|\" quux)
-
- (foo (|) bar) -> (foo | bar)
-
- (foo bar)| -> (foo bar|)"
- (interactive "P")
- (if (and sp-autodelete-wrap
- (eq sp-last-operation 'sp-wrap-region))
- (sp-backward-unwrap-sexp)
- (sp--with-case-sensitive
- (let* ((raw (sp--raw-argument-p arg))
- ;; if you edit 10 gigabyte files in Emacs, you're gonna have
- ;; a bad time.
- (n (if raw 100000000
- (prefix-numeric-value arg))))
- (cond
- ((> n 0)
- (while (> n 0)
- (cond
- ((let ((ok (sp-point-in-empty-sexp)))
- (when ok
- (backward-char (length (car ok)))
- (delete-char (+ (length (car ok)) (length (cdr ok)))))
- ok)
- ;; make this customizable
- (setq n (1- n)))
- ((and (sp-point-in-string)
- (save-excursion (backward-char) (not (sp-point-in-string))))
- (setq n 0))
- ((sp--looking-back (sp--get-closing-regexp (sp--get-pair-list-context 'navigate)))
- (-if-let (thing (save-match-data (sp-get-thing t)))
- (cond
- ((= (sp-get thing :end) (point))
- (goto-char (sp-get thing :end-in)))
- ((= (sp-get thing :beg-in) (point))
- (setq n 0))
- (t
- (delete-char (- (length (match-string 0))))))
- (delete-char (- (length (match-string 0)))))
- ;; make this customizable
- (setq n (1- n)))
- ((and (not (sp-point-in-string))
- (save-excursion (backward-char) (sp-point-in-string)))
- (backward-char)
- ;; make this customizable
- (setq n (1- n)))
- ((sp--looking-back (sp--get-opening-regexp (sp--get-pair-list-context 'navigate)))
- (if (save-match-data (sp-get-thing t))
- ;; make this customizable -- maybe we want to skip and
- ;; continue deleting
- (setq n 0)
- (delete-char (- (length (match-string 0))))
- (setq n (1- n))))
- ((bound-and-true-p hungry-delete-mode)
- (hungry-delete-backward 1)
- (setq n (1- n)))
- (t
- (delete-char -1)
- (setq n (1- n))))))
- ((= n 0) (delete-char -1))
- (t (sp-delete-char (sp--negate-argument arg))))))))
-
-(put 'sp-backward-delete-char 'delete-selection 'supersede)
-(put 'sp-delete-char 'delete-selection 'supersede)
-
-(defun sp-point-in-empty-sexp (&optional pos)
- "Return non-nil if point is in empty sexp or string.
-
-The return value is active cons pair of opening and closing sexp
-delimiter enclosing this sexp."
- (setq pos (or pos (point)))
- (let (op act)
- (cond
- ((sp--looking-back (sp--get-opening-regexp (sp--get-pair-list-context 'navigate)))
- (setq op (match-string 0))
- (setq act (--first (equal (car it) op) sp-pair-list))
- (when (sp--looking-at (regexp-quote (cdr act))) act))
- ((sp-point-in-empty-string pos)))))
-
-(defun sp-point-in-empty-string (&optional pos)
- "Return non-nil if point is in empty string.
-
-The return value is actually cons pair of opening and closing
-string delimiter enclosing this string."
- (setq pos (or pos (point)))
- (when (and (sp-point-in-string)
- (save-excursion (if (= (point-max) (point))
- t
- (forward-char) (not (sp-point-in-string))))
- (save-excursion (backward-char) (not (sp-point-in-string))))
- (save-excursion
- (let* ((syntax (nth 3 (syntax-ppss pos)))
- (c (char-to-string (if (eq syntax t) (following-char) syntax))))
- (cons c c)))))
-
-(defun sp--use-subword ()
- "Return non-nil if word killing commands should kill subwords.
-This is the case if `subword-mode' is enabled and
-`sp-use-subword' is non-nil."
- (and sp-use-subword (bound-and-true-p subword-mode)))
-
-(defun sp--kill-word (&optional n)
- "Kill N words or subwords."
- (let ((n (or n 1)))
- (if (sp--use-subword)
- (subword-kill n)
- (kill-word n))))
-
-(defun sp--forward-word (&optional n)
- "Move forward N words or subwords."
- (let ((n (or n 1)))
- (if (sp--use-subword)
- (subword-forward n)
- (forward-word n))))
-
-(defun sp--backward-word (&optional n)
- "Move backward N words or subwords."
- (let ((n (or n 1)))
- (if (sp--use-subword)
- (subword-backward n)
- (backward-word n))))
-
-(defun sp-kill-symbol (&optional arg word)
- "Kill a symbol forward, skipping over any intervening delimiters.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction.
-
-See `sp-forward-symbol' for what constitutes a symbol."
- (interactive "p")
- (sp--with-case-sensitive
- (if (> arg 0)
- (while (> arg 0)
- (-when-let (s (sp-get-symbol))
- (sp-get s
- (let* ((beg
- (if (< :beg-prf (point))
- (if word (point) :beg)
- (if (= (save-excursion
- (sp-skip-forward-to-symbol)
- (point))
- :beg-prf)
- (point)
- :beg-prf)))
- (end (if word
- (let ((fw-end
- (save-excursion
- (sp--forward-word)
- (point))))
- (if (sp-region-ok-p beg fw-end)
- fw-end
- :end-suf))
- :end-suf)))
- (goto-char beg)
- (kill-region beg end))))
- (sp--cleanup-after-kill)
- (setq arg (1- arg)))
- (sp-backward-kill-symbol (sp--negate-argument arg) word))))
-
-(defun sp-kill-word (&optional arg)
- "Kill a word forward, skipping over intervening delimiters.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction."
- (interactive "p")
- (sp-kill-symbol arg t))
-
-(defun sp-delete-symbol (&optional arg word)
- "Delete a symbol forward, skipping over any intervening delimiters.
-
-Deleted symbol does not go to the clipboard or kill ring.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction.
-
-See `sp-forward-symbol' for what constitutes a symbol."
- (interactive "p")
- (let* ((kill-ring kill-ring)
- (select-enable-clipboard nil))
- (sp-kill-symbol arg word)))
-
-(defun sp-delete-word (&optional arg)
- "Delete a word forward, skipping over intervening delimiters.
-
-Deleted word does not go to the clipboard or kill ring.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction."
- (interactive "p")
- (sp-delete-symbol arg t))
-
-(defun sp-backward-kill-symbol (&optional arg word)
- "Kill a symbol backward, skipping over any intervening delimiters.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-forward direction.
-
-See `sp-backward-symbol' for what constitutes a symbol."
- (interactive "p")
- (sp--with-case-sensitive
- (if (> arg 0)
- (while (> arg 0)
- (-when-let (s (sp-get-symbol t))
- (sp-get s
- (let* ((end
- (if (< (point) :end-suf)
- (if word (point) :end-suf)
- (if (= (save-excursion
- (sp-skip-backward-to-symbol)
- (point))
- :end-suf)
- (point)
- :end-suf)))
- (beg (if word
- (let ((bw-start
- (save-excursion
- (sp--backward-word)
- (point))))
- (if (sp-region-ok-p bw-start end)
- bw-start
- :beg-prf))
- :beg-prf)))
- (goto-char end)
- (kill-region end beg))))
- (sp--cleanup-after-kill)
- (setq arg (1- arg)))
- (sp-kill-symbol (sp--negate-argument arg) word))))
-
-(defun sp-backward-kill-word (&optional arg)
- "Kill a word backward, skipping over intervening delimiters.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction."
- (interactive "p")
- (sp-backward-kill-symbol arg t))
-
-(defun sp-backward-delete-symbol (&optional arg word)
- "Delete a symbol backward, skipping over any intervening delimiters.
-
-Deleted symbol does not go to the clipboard or kill ring.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-forward direction.
-
-See `sp-backward-symbol' for what constitutes a symbol."
- (interactive "p")
- (let* ((kill-ring kill-ring)
- (select-enable-clipboard nil))
- (sp-backward-kill-symbol arg word)))
-
-(defun sp-backward-delete-word (&optional arg)
- "Delete a word backward, skipping over intervening delimiters.
-
-Deleted word does not go to the clipboard or kill ring.
-
-With ARG being positive number N, repeat that many times.
-
-With ARG being Negative number -N, repeat that many times in
-backward direction."
- (interactive "p")
- (sp-backward-delete-symbol arg t))
-
-(defun sp-delete-region (beg end)
- "Delete the text between point and mark, like `delete-region'.
-
-BEG and END are the bounds of region to be deleted.
-
-If that text is unbalanced, signal an error instead.
-With a prefix argument, skip the balance check."
- (interactive "r")
- (when (or current-prefix-arg
- (sp-region-ok-p beg end)
- (user-error (sp-message :unbalanced-region :return)))
- (setq this-command 'delete-region)
- (delete-region beg end)))
-
-(defun sp-kill-region (beg end)
- "Kill the text between point and mark, like `kill-region'.
-
-BEG and END are the bounds of region to be killed.
-
-If that text is unbalanced, signal an error instead.
-With a prefix argument, skip the balance check."
- (interactive "r")
- (when (or current-prefix-arg
- (sp-region-ok-p beg end)
- (user-error (sp-message :unbalanced-region :return)))
- (setq this-command 'kill-region)
- (kill-region beg end)))
-
-(defun sp-indent-defun (&optional arg)
- "Reindent the current defun.
-
-If point is inside a string or comment, fill the current
-paragraph instead, and with ARG, justify as well.
-
-Otherwise, reindent the current defun, and adjust the position
-of the point."
- (interactive "P")
- (if (sp-point-in-string-or-comment)
- (fill-paragraph arg)
- (let ((column (current-column))
- (indentation (sp--current-indentation)))
- (save-excursion
- (end-of-defun)
- (beginning-of-defun)
- (indent-sexp))
- (sp--back-to-indentation column indentation))))
-
-(cl-defun sp-region-ok-p (start end)
- "Test if region between START and END is balanced.
-
-A balanced region is one where all opening delimiters are matched
-by closing delimiters.
-
-This function does *not* check that the delimiters are correctly
-ordered, that is [(]) is correct even though it is not logically
-properly balanced."
- (interactive "r")
- (save-excursion
- (save-restriction
- (when (eq (sp-point-in-string start) (sp-point-in-string end))
- (narrow-to-region start end)
- (let ((regex (sp--get-allowed-regexp (-difference sp-pair-list (sp--get-allowed-pair-list)))))
- (goto-char (point-min))
- (while (or (prog1 (sp-forward-sexp)
- (sp-skip-forward-to-symbol))
- ;; skip impossible delimiters
- (when (looking-at-p regex)
- (goto-char (match-end 0)))))
- (looking-at-p "[[:blank:]\n]*\\'"))))))
-
-(defun sp-newline ()
- "Insert a newline and indent it.
-
-This is like `newline-and-indent', but it not only indents the
-line that the point is on but also the S-expression following the
-point, if there is one.
-
-If in a string, just insert a literal newline.
-
-If in a comment and if followed by invalid structure, call
-`indent-new-comment-line' to keep the invalid structure in a
-comment."
- (interactive)
- (cond
- ((sp-point-in-string)
- (newline))
- ((sp-point-in-comment)
- (if (sp-region-ok-p (point) (point-at-eol))
- (progn (newline-and-indent) (ignore-errors (indent-sexp)))
- (indent-new-comment-line)))
- (t
- (newline-and-indent)
- (ignore-errors (indent-sexp)))))
-
-(defun sp-comment ()
- "Insert the comment character and adjust hanging sexps such
- that it doesn't break structure."
- (interactive)
- (if (sp-point-in-string-or-comment)
- (if (= 1 (length (single-key-description last-command-event))) ;; pretty hacky
- (insert (single-key-description last-command-event))
- (insert comment-start))
- (sp--with-case-sensitive
- (let ((old-point (point))
- (column (current-column))
- (indentation (sp--current-indentation))
- (old-line (line-number-at-pos))
- (hsexp (sp-get-hybrid-sexp))
- (newline-inserted 0))
- (goto-char (sp-get hsexp :end))
- (if (and (sp--looking-at-p (concat "\\s-*" (sp--get-closing-regexp)))
- (= old-line (line-number-at-pos)))
- (progn
- (setq old-point (point))
- (newline)
- (setq newline-inserted (1+ (- (line-end-position) (point)))))
- (when (/= old-line (line-number-at-pos))
- (sp-backward-sexp)
- (setq old-point (+ old-point (skip-syntax-backward " ")))
- (newline)
- (setq newline-inserted (- (line-end-position) (point)))))
- ;; @{ indenting madness
- (goto-char old-point)
- (sp-get hsexp (sp--indent-region :beg (+ :end newline-inserted)))
- (sp--back-to-indentation column indentation)
- ;; @}
- (let ((comment-delim (or (cdr (--first (memq major-mode (car it)) sp-comment-string))
- comment-start)))
- (when (and (/= 0 (current-column))
- (not (sp--looking-back-p "\\s-")))
- (insert " "))
- (insert comment-delim)
- (when (/= newline-inserted 0)
- (save-excursion
- (forward-line 1)
- (indent-according-to-mode))))))))
-
-(defun sp-wrap-round ()
- "Wrap following sexp in round parentheses."
- (interactive)
- (sp-wrap-with-pair "("))
-
-(defun sp-wrap-square ()
- "Wrap following sexp in square brackets."
- (interactive)
- (sp-wrap-with-pair "["))
-
-(defun sp-wrap-curly ()
- "Wrap following sexp in curly braces."
- (interactive)
- (sp-wrap-with-pair "{"))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; show-smartparens-mode
-
-(defgroup show-smartparens nil
- "Show smartparens minor mode."
- :group 'smartparens)
-
-(defcustom sp-show-pair-delay 0.125
- "Time in seconds to delay before showing a matching pair."
- :type '(number :tag "seconds")
- :group 'show-smartparens)
-
-(defcustom sp-show-enclosing-pair-commands '(
- sp-show-enclosing-pair
- sp-forward-slurp-sexp
- sp-backward-slurp-sexp
- sp-forward-barf-sexp
- sp-backward-barf-sexp
- )
- "List of commands after which the enclosing pair is highlighted.
-
-After the next command the pair will automatically disappear."
- :type '(repeat symbol)
- :group 'show-smartparens)
-
-(defcustom sp-show-pair-from-inside nil
- "If non-nil, highlight the enclosing pair if immediately after
-the opening delimiter or before the closing delimiter."
- :type 'boolean
- :group 'show-smartparens)
-
-(defcustom sp-show-pair-match-priority 1000
- "Priority of matching pair highlighting overlays."
- :type 'integer
- :group 'show-smartparens)
-
-(defface sp-show-pair-match-face
- '((t (:inherit show-paren-match)))
- "`show-smartparens-mode' face used for a matching pair."
- :group 'show-smartparens)
-
-(defface sp-show-pair-mismatch-face
- '((t (:inherit show-paren-mismatch)))
- "`show-smartparens-mode' face used for a mismatching pair."
- :group 'show-smartparens)
-
-(defface sp-show-pair-enclosing
- '((t (:inherit highlight)))
- "The face used to highlight pair overlays."
- :group 'show-smartparens)
-
-(defface sp-show-pair-match-content-face
- '()
- "`show-smartparens-mode' face used for a matching pair's content."
- :group 'show-smartparens)
-
-(defvar sp-show-pair-idle-timer nil)
-
-(defvar sp-show-pair-overlays nil)
-
-(defvar sp-show-pair-previous-match-positions nil)
-
-(defvar sp-show-pair-previous-point nil)
-
-(defvar sp-show-pair-enc-overlays nil)
-
-;;;###autoload
-(define-minor-mode show-smartparens-mode
- "Toggle visualization of matching pairs. When enabled, any
-matching pair is highlighted after `sp-show-pair-delay' seconds
-of Emacs idle time if the point is immediately in front or after
-a pair. This mode works similarly to `show-paren-mode', but
-support custom pairs."
- :init-value nil
- :group 'show-smartparens
- (if show-smartparens-mode
- (unless sp-show-pair-idle-timer
- (setq sp-show-pair-idle-timer
- (run-with-idle-timer sp-show-pair-delay t
- 'sp-show--pair-function)))
- (when sp-show-pair-overlays
- (sp-show--pair-delete-overlays))))
-
-;;;###autoload
-(define-globalized-minor-mode show-smartparens-global-mode
- show-smartparens-mode
- turn-on-show-smartparens-mode)
-
-;;;###autoload
-(defun turn-on-show-smartparens-mode ()
- "Turn on `show-smartparens-mode'."
- (interactive)
- (unless (or (member major-mode sp-ignore-modes-list)
- (and (not (derived-mode-p 'comint-mode))
- (eq (get major-mode 'mode-class) 'special)))
- (show-smartparens-mode t)))
-
-;;;###autoload
-(defun turn-off-show-smartparens-mode ()
- "Turn off `show-smartparens-mode'."
- (interactive)
- (show-smartparens-mode -1))
-
-(defun sp-show-enclosing-pair ()
- "Highlight the enclosing pair around point."
- (interactive))
-
-(defun sp-highlight-current-sexp (_arg)
- "Highlight the expression returned by the next command, preserving point position."
- (interactive "P")
- (let* ((cmd (read-key-sequence "" t))
- (com (key-binding cmd)))
- (if (commandp com)
- (save-excursion
- (let ((ok (call-interactively com)))
- (sp-show--pair-enc-function ok)))
- (execute-kbd-macro cmd))))
-
-(defun sp-show--pair-function ()
- "Display the show pair overlays and print the line of the
-matching paren in the echo area if not visible on screen."
- (when show-smartparens-mode
- (sp--with-case-sensitive
- (save-match-data
- (cl-labels ((scan-and-place-overlays
- (match &optional back)
- ;; we can use `sp-get-thing' here because we *are* at some
- ;; pair opening, and so only the tag or the sexp can trigger.
- (-if-let (ok (sp-get-thing back))
- (sp-get ok
- (when (or (and back
- (or (= :end (point))
- (= :beg-in (point))))
- (and (not back)
- (or (= :beg (point))
- (= :end-in (point)))))
- (sp-show--pair-create-overlays :beg :end :op-l :cl-l)
- (when (and sp-echo-match-when-invisible
- (not (or (active-minibuffer-window) cursor-in-echo-area)))
- (sp-show--pair-echo-match :beg :end :op-l :cl-l))))
- (if back
- (sp-show--pair-create-mismatch-overlay (- (point) (length match))
- (length match))
- (sp-show--pair-create-mismatch-overlay (point) (length match)))
- (setq sp-show-pair-previous-match-positions nil)
- (setq sp-show-pair-previous-point nil))))
- (let* ((pair-list (sp--get-allowed-pair-list))
- (opening (sp--get-opening-regexp pair-list))
- (closing (sp--get-closing-regexp pair-list))
- (allowed (and sp-show-pair-from-inside (sp--get-allowed-regexp))))
- (cond
- ;; if we are in a situation "()|", we should highlight the
- ;; regular pair and not the string pair "from inside"
- ((and (not (sp--evil-normal-state-p))
- (not (sp--evil-motion-state-p))
- (not (sp--evil-visual-state-p))
- (sp--looking-back (if sp-show-pair-from-inside allowed closing)))
- (scan-and-place-overlays (match-string 0) :back))
- ((or (and (or (sp--evil-normal-state-p)
- (sp--evil-motion-state-p)
- (sp--evil-visual-state-p))
- (sp--looking-at (sp--get-allowed-regexp)))
- (sp--looking-at (if sp-show-pair-from-inside allowed opening))
- (looking-at (sp--get-stringlike-regexp))
- (and (memq major-mode sp-navigate-consider-sgml-tags)
- (looking-at "<")))
- (scan-and-place-overlays (match-string 0)))
- ((or (sp--looking-back (if sp-show-pair-from-inside allowed closing))
- (sp--looking-back (sp--get-stringlike-regexp))
- (and (memq major-mode sp-navigate-consider-sgml-tags)
- (sp--looking-back ">")))
- (scan-and-place-overlays (match-string 0) :back))
- (sp-show-pair-overlays
- (sp-show--pair-delete-overlays)
- (setq sp-show-pair-previous-match-positions nil)
- (setq sp-show-pair-previous-point nil)))))))))
-
-(defun sp-show--pair-enc-function (&optional thing)
- "Display the show pair overlays for enclosing expression."
- (when show-smartparens-mode
- (-when-let (enc (or thing (sp-get-enclosing-sexp)))
- (sp-get enc (sp-show--pair-create-enc-overlays :beg :end :op-l :cl-l)))))
-
-(defun sp-show--pair-create-overlays (start end olen clen)
- "Create the show pair overlays."
- (when sp-show-pair-overlays
- (sp-show--pair-delete-overlays))
- (let* ((oleft (make-overlay start (+ start olen) nil t nil))
- (omiddle (make-overlay (+ start olen) (- end clen) nil t nil))
- (oright (make-overlay (- end clen) end nil t nil)))
- (setq sp-show-pair-overlays (list oleft omiddle oright))
- (overlay-put oleft 'face 'sp-show-pair-match-face)
- (unless (use-region-p)
- (overlay-put omiddle 'face 'sp-show-pair-match-content-face))
- (overlay-put oright 'face 'sp-show-pair-match-face)
- (overlay-put oleft 'priority sp-show-pair-match-priority)
- (overlay-put omiddle 'priority 1000)
- (overlay-put oright 'priority sp-show-pair-match-priority)
- (overlay-put oleft 'type 'show-pair)))
-
-(defun sp-show--pair-echo-match (start end olen clen)
- "Print the line of the matching paren in the echo area if not
-visible on screen. Needs to be called after the show-pair overlay
-has been created."
- (let ((match-positions (list start end olen clen)))
- (when (not (and (equal sp-show-pair-previous-match-positions match-positions)
- (equal sp-show-pair-previous-point (point))))
- (setq sp-show-pair-previous-match-positions match-positions)
- (setq sp-show-pair-previous-point (point))
- (let* ((visible-start (pos-visible-in-window-p start))
- (visible-end (pos-visible-in-window-p end))
- (where (cond
- ((not visible-start) start)
- ((not visible-end) end))))
- (when where
- (save-excursion
- (let* ((from (progn (goto-char where) (beginning-of-line) (point)))
- (to (progn (end-of-line) (point)))
- (line (buffer-substring from to))
- (message-log-max)) ;; don't log in messages
- ;; Add smartparens overlay for opening parens
- (let* ((i1 (- start from))
- (i2 (+ i1 olen)))
- (when (and (< i1 (length line)) (>= i2 0))
- (add-face-text-property (max i1 0) (min i2 (length line))
- 'sp-show-pair-match-face nil line)))
- ;; Add smartparens overlay for closing parens
- (let* ((i1 (- end from 1))
- (i2 (+ i1 clen)))
- (when (and (< i1 (length line)) (>= i2 0))
- (add-face-text-property (max i1 0) (min i2 (length line))
- 'sp-show-pair-match-face nil line)))
- ;; echo line of match
- (message "Matches: %s" (string-trim line)))))))))
-
-(defun sp-show--pair-create-enc-overlays (start end olen clen)
- "Create the show pair enclosing overlays"
- (when sp-show-pair-enc-overlays
- (sp-show--pair-delete-enc-overlays))
- (let* ((oleft (make-overlay start (+ start olen) nil t nil))
- (oright (make-overlay (- end clen) end nil t nil)))
- (setq sp-show-pair-enc-overlays (cons oleft oright))
- (overlay-put oleft 'face 'sp-show-pair-enclosing)
- (overlay-put oright 'face 'sp-show-pair-enclosing)
- (overlay-put oleft 'priority 1000)
- (overlay-put oright 'priority 1000)
- (overlay-put oleft 'type 'show-pair-enc)))
-
-(defun sp-show--pair-create-mismatch-overlay (start len)
- "Create the mismatch pair overlay."
- (when sp-show-pair-overlays
- (sp-show--pair-delete-overlays))
- (let ((o (make-overlay start (+ start len) nil t nil)))
- (setq sp-show-pair-overlays (list o))
- (overlay-put o 'face 'sp-show-pair-mismatch-face)
- (overlay-put o 'priority 1000)
- (overlay-put o 'type 'show-pair)))
-
-(defun sp-show--pair-delete-overlays ()
- "Remove both show pair overlays."
- (when sp-show-pair-overlays
- (dolist (overlay sp-show-pair-overlays)
- (delete-overlay overlay))
- (setq sp-show-pair-overlays nil)))
-
-(defun sp-show--pair-delete-enc-overlays ()
- "Remove both show pair enclosing overlays."
- (when sp-show-pair-enc-overlays
- (when (car sp-show-pair-enc-overlays)
- (delete-overlay (car sp-show-pair-enc-overlays)))
- (when (cdr sp-show-pair-enc-overlays)
- (delete-overlay (cdr sp-show-pair-enc-overlays)))
- (setq sp-show-pair-enc-overlays nil)))
-
-
-;; global initialization
-(defadvice delete-backward-char (before sp-delete-pair-advice activate)
- (save-match-data
- (sp-delete-pair (ad-get-arg 0))))
-(defadvice haskell-indentation-delete-backward-char (before sp-delete-pair-advice activate)
- (save-match-data
- (sp-delete-pair (ad-get-arg 0))))
-(add-hook 'post-command-hook 'sp--post-command-hook-handler)
-(sp--set-base-key-bindings)
-(sp--update-override-key-bindings)
-
-(defadvice company--insert-candidate (after sp-company--insert-candidate activate)
- "If `smartparens-mode' is active, we check if the completed string
-has a pair definition. If so, we insert the closing pair."
- (when smartparens-mode
- (sp-insert-pair))
- ad-return-value)
-
-(defadvice hippie-expand (after sp-auto-complete-advice activate)
- (when smartparens-mode
- (sp-insert-pair)))
-
-(defvar sp--mc/cursor-specific-vars
- '(
- sp-wrap-point
- sp-wrap-mark
- sp-last-wrapped-region
- sp-pair-overlay-list
- sp-wrap-overlays
- sp-wrap-tag-overlays
- sp-last-operation
- sp-previous-point
- )
- "A list of vars that need to be tracked on a per-cursor basis.")
-
-(defvar mc/cursor-specific-vars)
-(eval-after-load 'multiple-cursors
- '(dolist (it sp--mc/cursor-specific-vars)
- (add-to-list 'mc/cursor-specific-vars it)))
-
-(provide 'smartparens)
-
-;; Local Variables:
-;; coding: utf-8
-;; eval: (font-lock-add-keywords nil `((,(concat "(" (regexp-opt '("sp-do-move-op" "sp-do-move-cl" "sp-do-put-op" "sp-do-put-cl" "sp-do-del-op" "sp-do-del-cl") t) "\\_>") 1 'font-lock-variable-name-face)))
-;; End:
-
-;;; smartparens.el ends here
diff --git a/elpa/swiper-20200503.1102/swiper-autoloads.el b/elpa/swiper-20200503.1102/swiper-autoloads.el
deleted file mode 100644
index 64a4221..0000000
--- a/elpa/swiper-20200503.1102/swiper-autoloads.el
+++ /dev/null
@@ -1,64 +0,0 @@
-;;; swiper-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "swiper" "swiper.el" (0 0 0 0))
-;;; Generated autoloads from swiper.el
-
-(autoload 'swiper-avy "swiper" "\
-Jump to one of the current swiper candidates.
-
-\(fn)" t nil)
-
-(autoload 'swiper-backward "swiper" "\
-`isearch-backward' with an overview.
-When non-nil, INITIAL-INPUT is the initial search pattern.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'swiper-thing-at-point "swiper" "\
-`swiper' with `ivy-thing-at-point'.
-
-\(fn)" t nil)
-
-(autoload 'swiper-all-thing-at-point "swiper" "\
-`swiper-all' with `ivy-thing-at-point'.
-
-\(fn)" t nil)
-
-(autoload 'swiper "swiper" "\
-`isearch-forward' with an overview.
-When non-nil, INITIAL-INPUT is the initial search pattern.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'swiper-all "swiper" "\
-Run `swiper' for all open buffers.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'swiper-isearch "swiper" "\
-A `swiper' that's not line-based.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(autoload 'swiper-isearch-backward "swiper" "\
-Like `swiper-isearch' but the first result is before the point.
-
-\(fn &optional INITIAL-INPUT)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "swiper" '("swiper-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; swiper-autoloads.el ends here
diff --git a/elpa/swiper-20200503.1102/swiper-pkg.el b/elpa/swiper-20200503.1102/swiper-pkg.el
deleted file mode 100644
index 18a4f3a..0000000
--- a/elpa/swiper-20200503.1102/swiper-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "swiper" "20200503.1102" "Isearch with an overview. Oh, man!" '((emacs "24.5") (ivy "0.13.0")) :commit "c6b60d34ac37bf4d91a25f16d22e528f85e06938" :keywords '("matching") :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com")) :maintainer '("Oleh Krehel" . "ohwoeowho@gmail.com") :url "https://github.com/abo-abo/swiper")
diff --git a/elpa/swiper-20200503.1102/swiper.el b/elpa/swiper-20200503.1102/swiper.el
deleted file mode 100644
index f49a414..0000000
--- a/elpa/swiper-20200503.1102/swiper.el
+++ /dev/null
@@ -1,1719 +0,0 @@
-;;; swiper.el --- Isearch with an overview. Oh, man! -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015-2019 Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel <ohwoeowho@gmail.com>
-;; URL: https://github.com/abo-abo/swiper
-;; Package-Version: 20200503.1102
-;; Package-Commit: c6b60d34ac37bf4d91a25f16d22e528f85e06938
-;; Version: 0.13.0
-;; Package-Requires: ((emacs "24.5") (ivy "0.13.0"))
-;; Keywords: matching
-
-;; This file is part of GNU Emacs.
-
-;; This file 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, 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.
-
-;; For a full copy of the GNU General Public License
-;; see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package gives an overview of the current regex search
-;; candidates. The search regex can be split into groups with a
-;; space. Each group is highlighted with a different face.
-;;
-;; It can double as a quick `regex-builder', although only single
-;; lines will be matched.
-
-;;; Code:
-
-(require 'ivy)
-
-(defgroup swiper nil
- "`isearch' with an overview."
- :group 'matching
- :prefix "swiper-")
-
-(defface swiper-match-face-1
- '((t (:inherit lazy-highlight)))
- "The background face for `swiper' matches."
- :group 'ivy-faces)
-
-(defface swiper-match-face-2
- '((t (:inherit isearch)))
- "Face for `swiper' matches modulo 1."
- :group 'ivy-faces)
-
-(defface swiper-match-face-3
- '((t (:inherit match)))
- "Face for `swiper' matches modulo 2."
- :group 'ivy-faces)
-
-(defface swiper-match-face-4
- '((t (:inherit isearch-fail)))
- "Face for `swiper' matches modulo 3."
- :group 'ivy-faces)
-
-(defface swiper-background-match-face-1
- '((t (:inherit swiper-match-face-1)))
- "The background face for non-current `swiper' matches."
- :group 'ivy-faces)
-
-(defface swiper-background-match-face-2
- '((t (:inherit swiper-match-face-2)))
- "Face for non-current `swiper' matches modulo 1."
- :group 'ivy-faces)
-
-(defface swiper-background-match-face-3
- '((t (:inherit swiper-match-face-3)))
- "Face for non-current `swiper' matches modulo 2."
- :group 'ivy-faces)
-
-(defface swiper-background-match-face-4
- '((t (:inherit swiper-match-face-4)))
- "Face for non-current `swiper' matches modulo 3."
- :group 'ivy-faces)
-
-(defface swiper-line-face
- '((t (:inherit highlight)))
- "Face for current `swiper' line."
- :group 'ivy-faces)
-
-(defcustom swiper-faces '(swiper-match-face-1
- swiper-match-face-2
- swiper-match-face-3
- swiper-match-face-4)
- "List of `swiper' faces for group matches."
- :group 'ivy-faces
- :type '(repeat face))
-
-(defvar swiper-background-faces
- '(swiper-background-match-face-1
- swiper-background-match-face-2
- swiper-background-match-face-3
- swiper-background-match-face-4)
- "Like `swiper-faces', but used for all matches except the current one.")
-
-(defun swiper--recompute-background-faces ()
- (let ((faces '(swiper-background-match-face-1
- swiper-background-match-face-2
- swiper-background-match-face-3
- swiper-background-match-face-4))
- (colir-compose-method #'colir-compose-soft-light))
- (cl-mapc (lambda (f1 f2)
- (let ((bg (face-background f1)))
- (when bg
- (set-face-background
- f2
- (colir-blend
- (colir-color-parse bg)
- (colir-color-parse "#ffffff"))))))
- swiper-faces
- faces)))
-(swiper--recompute-background-faces)
-
-(defcustom swiper-min-highlight 2
- "Only highlight matches for regexps at least this long."
- :type 'integer)
-
-(defcustom swiper-include-line-number-in-search nil
- "Include line number in text of search candidates."
- :type 'boolean
- :group 'swiper)
-
-(defcustom swiper-goto-start-of-match nil
- "When non-nil, go to the start of the match, not its end.
-Treated as non-nil when searching backwards."
- :type 'boolean
- :group 'swiper)
-
-(defun swiper-C-s (&optional arg)
- "Move cursor vertically down ARG candidates.
-If the input is empty, select the previous history element instead."
- (interactive "p")
- (if (string= ivy-text "")
- (ivy-previous-history-element 1)
- (ivy-next-line arg)))
-
-(defvar swiper-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-s") 'swiper-C-s)
- (define-key map (kbd "M-q") 'swiper-query-replace)
- (define-key map (kbd "C-l") 'swiper-recenter-top-bottom)
- (define-key map (kbd "C-'") 'swiper-avy)
- (define-key map (kbd "C-7") 'swiper-mc)
- (define-key map (kbd "C-c C-f") 'swiper-toggle-face-matching)
- map)
- "Keymap for swiper.")
-
-(defvar swiper--query-replace-overlays nil)
-
-(defun swiper--query-replace-updatefn ()
- (let ((lisp (ignore-errors (nth 2 (query-replace-compile-replacement ivy-text t)))))
- (dolist (ov swiper--query-replace-overlays)
- (overlay-put
- ov 'after-string
- (propertize
- (condition-case nil
- (with-current-buffer (overlay-buffer ov)
- (set-match-data (overlay-get ov 'md))
- (if (consp lisp)
- (eval lisp)
- (match-substitute-replacement ivy-text)))
- (error ivy-text))
- 'face 'error)))))
-
-(defun swiper--query-replace-cleanup ()
- (while swiper--query-replace-overlays
- (delete-overlay (pop swiper--query-replace-overlays))))
-
-(defun swiper--query-replace-setup ()
- (with-ivy-window
- (let ((end (window-end (selected-window) t))
- (re (ivy-re-to-str ivy-regex)))
- (save-excursion
- (beginning-of-line)
- (while (re-search-forward re end t)
- (let ((ov (make-overlay (1- (match-end 0)) (match-end 0)))
- (md (match-data t)))
- (overlay-put
- ov 'matches
- (mapcar
- (lambda (x)
- (list `(match-string ,x) (match-string x)))
- (number-sequence 0 (1- (/ (length md) 2)))))
- (overlay-put ov 'md md)
- (push ov swiper--query-replace-overlays))
- (unless (> (match-end 0) (match-beginning 0))
- (forward-char)))))))
-
-(defun swiper-query-replace ()
- "Start `query-replace' with string to replace from last search string."
- (interactive)
- (cond ((null (window-minibuffer-p))
- (user-error "Should only be called in the minibuffer through `swiper-map'"))
- ((string= "" ivy-text)
- (user-error "Empty input"))
- (t
- (swiper--query-replace-setup)
- (unwind-protect
- (let* ((enable-recursive-minibuffers t)
- (from (ivy-re-to-str ivy-regex))
- (groups (number-sequence 1 ivy--subexps))
- (default
- (list
- (mapconcat (lambda (i) (format "\\%d" i)) groups " ")
- (format "\\,(concat %s)"
- (if (<= ivy--subexps 1)
- "\\&"
- (mapconcat
- (lambda (i) (format "\\%d" i))
- groups
- " \" \" ")))))
- (to
- (query-replace-compile-replacement
- (ivy-read
- (format "Query replace %s with: " from) nil
- :def default
- :caller 'swiper-query-replace)
- t)))
- (swiper--cleanup)
- (ivy-exit-with-action
- (lambda (_)
- (with-ivy-window
- (move-beginning-of-line 1)
- (let ((inhibit-read-only t))
- (perform-replace from to
- t t nil))))))
- (swiper--query-replace-cleanup)))))
-
-(ivy-configure 'swiper-query-replace
- :update-fn #'swiper--query-replace-updatefn)
-(put 'swiper-query-replace 'no-counsel-M-x t)
-
-(defvar inhibit-message)
-
-(defun swiper-all-query-replace ()
- "Start `query-replace' with string to replace from last search string."
- (interactive)
- (if (null (window-minibuffer-p))
- (user-error
- "Should only be called in the minibuffer through `swiper-all-map'")
- (let* ((enable-recursive-minibuffers t)
- (from (ivy--regex ivy-text))
- (to (query-replace-read-to from "Query replace" t)))
- (swiper--cleanup)
- (ivy-exit-with-action
- (lambda (_)
- (let ((wnd-conf (current-window-configuration))
- (inhibit-message t))
- (unwind-protect
- (dolist (cand ivy--old-cands)
- (let ((buffer (get-text-property 0 'buffer cand)))
- (switch-to-buffer buffer)
- (goto-char (point-min))
- (perform-replace from to t t nil)))
- (set-window-configuration wnd-conf))))))))
-(put 'swiper-all-query-replace 'no-counsel-M-x t)
-
-(defvar avy-all-windows)
-(defvar avy-style)
-(defvar avy-keys)
-(declare-function avy--overlay-post "ext:avy")
-(declare-function avy-action-goto "ext:avy")
-(declare-function avy-candidate-beg "ext:avy")
-(declare-function avy--done "ext:avy")
-(declare-function avy--make-backgrounds "ext:avy")
-(declare-function avy-window-list "ext:avy")
-(declare-function avy-read "ext:avy")
-(declare-function avy-read-de-bruijn "ext:avy")
-(declare-function avy-tree "ext:avy")
-(declare-function avy-push-mark "ext:avy")
-(declare-function avy--remove-leading-chars "ext:avy")
-
-(defun swiper--avy-candidates ()
- (let* (
- ;; We'll have overlapping overlays, so we sort all the
- ;; overlays in the visible region by their start, and then
- ;; throw out non-Swiper overlays or overlapping Swiper
- ;; overlays.
- (visible-overlays (cl-sort (with-ivy-window
- (overlays-in (window-start)
- (window-end)))
- #'< :key #'overlay-start))
- (min-overlay-start 0)
- (overlays-for-avy
- (cl-remove-if-not
- (lambda (ov)
- (when (and (>= (overlay-start ov)
- min-overlay-start)
- (memq (overlay-get ov 'face)
- (append swiper-faces swiper-background-faces)))
- (setq min-overlay-start (overlay-start ov))))
- visible-overlays))
- (offset (if (eq (ivy-state-caller ivy-last) 'swiper) 1 0)))
- (nconc
- (mapcar (lambda (ov)
- (cons (overlay-start ov)
- (overlay-get ov 'window)))
- overlays-for-avy)
- (save-excursion
- (save-restriction
- (narrow-to-region (window-start) (window-end))
- (goto-char (point-min))
- (forward-line)
- (let ((win (selected-window))
- cands)
- (while (not (eobp))
- (push (cons (+ (point) offset) win)
- cands)
- (forward-line))
- cands))))))
-
-(defun swiper--avy-candidate ()
- (let ((candidates (swiper--avy-candidates))
- (avy-all-windows nil))
- (unwind-protect
- (prog2
- (avy--make-backgrounds
- (append (avy-window-list)
- (list (ivy-state-window ivy-last))))
- (if (eq avy-style 'de-bruijn)
- (avy-read-de-bruijn candidates avy-keys)
- (avy-read (avy-tree candidates avy-keys)
- #'avy--overlay-post
- #'avy--remove-leading-chars))
- (avy-push-mark))
- (avy--done))))
-
-(defun swiper--avy-goto (candidate)
- (cond ((let ((win (cdr-safe candidate)))
- (and win (window-minibuffer-p win)))
- (let ((nlines (count-lines (point-min) (point-max))))
- (ivy-set-index
- (+ (car (ivy--minibuffer-index-bounds
- ivy--index ivy--length ivy-height))
- (line-number-at-pos (car candidate))
- (if (or (= nlines (1+ ivy-height))
- (< ivy--length ivy-height))
- 0
- (- ivy-height nlines))
- -2)))
- (ivy--exhibit)
- (ivy-done)
- (ivy-call))
- ((or (consp candidate)
- (number-or-marker-p candidate))
- (ivy-quit-and-run
- (avy-action-goto (avy-candidate-beg candidate))))))
-
-;;;###autoload
-(defun swiper-avy ()
- "Jump to one of the current swiper candidates."
- (interactive)
- (unless (require 'avy nil 'noerror)
- (error "Package avy isn't installed"))
- (cl-case (length ivy-text)
- (0
- (user-error "Need at least one char of input"))
- (1
- (let ((swiper-min-highlight 1))
- (swiper--update-input-ivy))))
- (swiper--avy-goto (swiper--avy-candidate)))
-
-(declare-function mc/create-fake-cursor-at-point "ext:multiple-cursors-core")
-(declare-function multiple-cursors-mode "ext:multiple-cursors-core")
-
-(defun swiper-mc ()
- "Create a fake cursor for each `swiper' candidate.
-Make sure `swiper-mc' is on `mc/cmds-to-run-once' list."
- (interactive)
- (unless (require 'multiple-cursors nil t)
- (error "Multiple-cursors isn't installed"))
- (unless (window-minibuffer-p)
- (error "Call me only from `swiper'"))
- (let ((cands (nreverse ivy--old-cands))
- (action (ivy--get-action ivy-last)))
- (unless (string= ivy-text "")
- (ivy-exit-with-action
- (lambda (_)
- (let (cand)
- (while (setq cand (pop cands))
- (funcall action cand)
- (when cands
- (mc/create-fake-cursor-at-point))))
- (multiple-cursors-mode 1))))))
-
-(defvar swiper--current-window-start nil
- "Store `window-start' to restore it later.
-This prevents a \"jumping\" behavior which occurs when variables
-such as `scroll-conservatively' are set to a high value.")
-
-(defun swiper-recenter-top-bottom (&optional arg)
- "Call (`recenter-top-bottom' ARG)."
- (interactive "P")
- (with-ivy-window
- (recenter-top-bottom arg)
- (setq swiper--current-window-start (window-start))))
-
-(defvar swiper-font-lock-exclude
- '(Man-mode
- adoc-mode
- bbdb-mode
- bongo-library-mode
- bongo-mode
- bongo-playlist-mode
- bookmark-bmenu-mode
- circe-channel-mode
- circe-query-mode
- circe-server-mode
- deadgrep-mode
- debbugs-gnu-mode
- dired-mode
- elfeed-search-mode
- elfeed-show-mode
- emms-playlist-mode
- emms-stream-mode
- erc-mode
- eshell-mode
- eww-mode
- forth-block-mode
- forth-mode
- fundamental-mode
- gnus-article-mode
- gnus-group-mode
- gnus-summary-mode
- help-mode
- helpful-mode
- jabber-chat-mode
- magit-popup-mode
- matrix-client-mode
- matrix-client-room-list-mode
- mu4e-headers-mode
- mu4e-view-mode
- nix-mode
- notmuch-search-mode
- notmuch-tree-mode
- occur-edit-mode
- occur-mode
- org-agenda-mode
- package-menu-mode
- rcirc-mode
- sauron-mode
- sieve-mode
- treemacs-mode
- twittering-mode
- vc-dir-mode
- w3m-mode
- woman-mode
- xref--xref-buffer-mode)
- "List of major-modes that are incompatible with `font-lock-ensure'.")
-
-(defun swiper-font-lock-ensure-p ()
- "Return non-nil if we should `font-lock-ensure'."
- (or (derived-mode-p 'magit-mode)
- (bound-and-true-p magit-blame-mode)
- (memq major-mode swiper-font-lock-exclude)
- (not (derived-mode-p 'prog-mode))))
-
-(defun swiper-font-lock-ensure ()
- "Ensure the entire buffer is highlighted."
- (unless (swiper-font-lock-ensure-p)
- (unless (or (> (buffer-size) 100000) (null font-lock-mode))
- (if (fboundp 'font-lock-ensure)
- ;; Added in Emacs 25.1.
- (font-lock-ensure)
- (with-no-warnings (font-lock-fontify-buffer))))))
-
-(defvar swiper--format-spec ""
- "Store the current candidates format spec.")
-
-(defvar swiper--width nil
- "Store the number of digits needed for the longest line number.")
-
-(defvar swiper-use-visual-line nil
- "When non-nil, use `line-move' instead of `forward-line'.")
-
-(defvar dired-isearch-filenames)
-(declare-function dired-move-to-filename "dired")
-
-(defun swiper--line ()
- (let* ((beg (cond ((and (eq major-mode 'dired-mode)
- (bound-and-true-p dired-isearch-filenames))
- (dired-move-to-filename)
- (point))
- (swiper-use-visual-line
- (save-excursion
- (beginning-of-visual-line)
- (point)))
- (t
- (point))))
- (end (if swiper-use-visual-line
- (save-excursion
- (end-of-visual-line)
- (point))
- (line-end-position))))
-
- (concat
- " "
- (buffer-substring beg end))))
-
-(defvar swiper-use-visual-line-p
- (lambda (n-lines)
- (and visual-line-mode
- ;; super-slow otherwise
- (< (buffer-size) 20000)
- (< n-lines 400)))
- "A predicate that decides whether `line-move' or `forward-line' is used.
-Note that `line-move' can be very slow.")
-
-(defun swiper--candidates (&optional numbers-width)
- "Return a list of this buffer lines.
-
-NUMBERS-WIDTH, when specified, is used for width spec of line
-numbers; replaces calculating the width from buffer line count."
- (let* ((inhibit-field-text-motion t)
- (n-lines (count-lines (point-min) (point-max))))
- (if (funcall swiper-use-visual-line-p n-lines)
- (progn
- (when (eq major-mode 'org-mode)
- (require 'outline)
- (if (fboundp 'outline-show-all)
- ;; Added in Emacs 25.1.
- (outline-show-all)
- (with-no-warnings
- (show-all))))
- (setq swiper-use-visual-line t))
- (setq swiper-use-visual-line nil))
- (unless (zerop n-lines)
- (setq swiper--width (or numbers-width
- (1+ (floor (log n-lines 10)))))
- (setq swiper--format-spec
- (format "%%-%dd " swiper--width))
- (let ((line-number 1)
- (advancer (if swiper-use-visual-line
- (lambda (arg) (line-move arg t))
- #'forward-line))
- candidates)
- (save-excursion
- (goto-char (point-min))
- (swiper-font-lock-ensure)
- (while (< (point) (point-max))
- (when (swiper-match-usable-p)
- (let ((str (swiper--line)))
- (setq str (ivy-cleanup-string str))
- (let ((line-number-str
- (format swiper--format-spec line-number)))
- (if swiper-include-line-number-in-search
- (setq str (concat line-number-str str))
- (put-text-property
- 0 1 'display line-number-str str))
- (put-text-property
- 0 1 'swiper-line-number line-number str))
- (push str candidates)))
- (funcall advancer 1)
- (cl-incf line-number))
- (nreverse candidates))))))
-
-(defvar swiper--opoint 1
- "The point when `swiper' starts.")
-
-;;;###autoload
-(defun swiper-backward (&optional initial-input)
- "`isearch-backward' with an overview.
-When non-nil, INITIAL-INPUT is the initial search pattern."
- (interactive)
- (let ((ivy-index-functions-alist
- '((swiper . ivy-recompute-index-swiper-backward))))
- (swiper initial-input)))
-
-;;;###autoload
-(defun swiper-thing-at-point ()
- "`swiper' with `ivy-thing-at-point'."
- (interactive)
- (let ((thing (ivy-thing-at-point)))
- (when (use-region-p)
- (deactivate-mark))
- (swiper (regexp-quote thing))))
-
-;;;###autoload
-(defun swiper-all-thing-at-point ()
- "`swiper-all' with `ivy-thing-at-point'."
- (interactive)
- (let ((thing (ivy-thing-at-point)))
- (when (use-region-p)
- (deactivate-mark))
- (swiper-all (regexp-quote thing))))
-
-(defun swiper--extract-matches (regex cands)
- "Extract captured REGEX groups from CANDS."
- (let (res)
- (dolist (cand cands)
- (setq cand (substring cand 1))
- (when (string-match regex cand)
- (push (mapconcat (lambda (n) (match-string-no-properties n cand))
- (number-sequence
- 1
- (/ (- (length (match-data)) 2) 2))
- " ")
- res)))
- (nreverse res)))
-
-(defun swiper--occur-cands (fname cands)
- (when cands
- (with-current-buffer (ivy-state-buffer ivy-last)
- (when (eq (ivy-state-caller ivy-last) 'swiper-isearch)
- (setq cands (mapcar #'swiper--line-at-point cands)))
- (let* ((pt-min (point-min))
- (line-delta
- (save-restriction
- (widen)
- (1- (line-number-at-pos pt-min))))
- (lines
- (if (eq (ivy-state-caller ivy-last) 'swiper-isearch)
- (swiper--isearch-occur-cands cands)
- (mapcar (lambda (s)
- (let ((n (swiper--line-number s)))
- (setq s (substring s 1))
- (add-text-properties 0 1 (list 'swiper-line-number n) s)
- (cons n s)))
- cands)))
- (offset (+ (length fname) 2)))
- (mapcar (lambda (x)
- (let ((nn (number-to-string
- (+ (car x) line-delta))))
- (remove-text-properties 0 1 '(display) (cdr x))
- (put-text-property 0 (length nn) 'face 'ivy-grep-line-number nn)
- (put-text-property 0 1 'offset (+ offset (length nn)) fname)
- (format "%s:%s:%s" fname nn (cdr x))))
- lines)))))
-
-(defun swiper--isearch-occur-cands (cands)
- (let* ((last-pt (get-text-property 0 'point (car cands)))
- (line (1+ (line-number-at-pos last-pt)))
- res pt)
- (dolist (cand cands)
- (setq pt (get-text-property 0 'point cand))
- (cl-incf line (1- (count-lines last-pt pt)))
- (push (cons line cand) res)
- (setq last-pt pt))
- (nreverse res)))
-
-(defun swiper--occur-insert-lines (cands)
- (let ((inhibit-read-only t))
- ;; Need precise number of header lines for `wgrep' to work.
- (insert (format "-*- mode:grep; default-directory: %S -*-\n\n\n"
- default-directory))
- (insert (format "%d candidates:\n" (length cands)))
- (ivy--occur-insert-lines cands)
- (goto-char (point-min))
- (forward-line 4)))
-
-(defun swiper--occur-buffer ()
- (let ((buffer (ivy-state-buffer ivy-last)))
- (unless (buffer-live-p buffer)
- (setq buffer
- (setf (ivy-state-buffer ivy-last)
- (find-file-noselect
- (plist-get (ivy-state-extra-props ivy-last) :fname))))
- (save-selected-window
- (pop-to-buffer buffer))
- (setf (ivy-state-window ivy-last) (selected-window)))
- buffer))
-
-(defun swiper-occur (&optional cands)
- "Generate a custom occur buffer for `swiper'.
-When capture groups are present in the input, print them instead of lines."
- (setq cands (or ivy-marked-candidates cands))
- (let* ((buffer (swiper--occur-buffer))
- (fname (propertize
- (with-ivy-window
- (if (buffer-file-name buffer)
- (file-name-nondirectory
- (buffer-file-name buffer))
- (buffer-name buffer)))
- 'face
- 'ivy-grep-info))
- (re
- (progn
- (string-match "\"\\(.*\\)\"" (buffer-name))
- (ivy-set-text (match-string 1 (buffer-name)))
- (mapconcat #'identity (ivy--split ivy-text) ".*?")))
- (cands
- (swiper--occur-cands
- fname
- (or cands
- (save-window-excursion
- (switch-to-buffer buffer)
- (if (eq (ivy-state-caller ivy-last) 'swiper)
- (let ((ivy--regex-function 'swiper--re-builder))
- (setq ivy--old-re nil)
- (ivy--filter re (swiper--candidates)))
- (swiper-isearch-function ivy-text)))))))
- (if (string-match-p "\\\\(" re)
- (insert
- (mapconcat #'identity
- (swiper--extract-matches
- re (with-current-buffer buffer
- (swiper--candidates)))
- "\n"))
- (unless (eq major-mode 'ivy-occur-grep-mode)
- (ivy-occur-grep-mode)
- (font-lock-mode -1))
- (swiper--occur-insert-lines
- (mapcar (lambda (cand) (concat "./" cand)) cands)))))
-
-(declare-function evil-set-jump "ext:evil-jumps")
-
-(defvar swiper--current-line nil)
-(defvar swiper--current-match-start nil)
-(defvar swiper--point-min nil)
-(defvar swiper--point-max nil)
-(defvar swiper--reveal-mode nil)
-
-(defun swiper--init ()
- "Perform initialization common to both completion methods."
- (setq swiper--current-line nil)
- (setq swiper--current-match-start nil)
- (setq swiper--current-window-start nil)
- (setq swiper--opoint (point))
- (setq swiper--point-min (point-min))
- (setq swiper--point-max (point-max))
- (when (setq swiper--reveal-mode
- (bound-and-true-p reveal-mode))
- (reveal-mode -1))
- (lazy-highlight-cleanup t)
- (setq isearch-opened-overlays nil)
- (when (bound-and-true-p evil-mode)
- (evil-set-jump)))
-
-(defun swiper--normalize-regex (re)
- "Normalize the swiper regex RE.
-Add a space after a leading `^' if needed and apply
-`search-default-mode' if bound."
- (replace-regexp-in-string
- "^\\(?:\\\\(\\)?\\^"
- (concat "\\&" (if (eq 'swiper (ivy-state-caller ivy-last)) " " ""))
- (if (functionp (bound-and-true-p search-default-mode))
- (mapconcat
- (lambda (x)
- (if (string-match-p "\\`[^$\\^]+\\'" x)
- (funcall search-default-mode x)
- x))
- (split-string re "\\b") "")
- re)
- t))
-
-(defun swiper--re-builder (str)
- "Transform STR into a swiper regex.
-This is the regex used in the minibuffer where candidates have
-line numbers. For the buffer, use `ivy--regex' instead."
- (let* ((re-builder (ivy-alist-setting ivy-re-builders-alist))
- (str (replace-regexp-in-string "\\\\n" "\n" str))
- (re (funcall re-builder str)))
- (if (consp re)
- (mapcar
- (lambda (x)
- (cons (swiper--normalize-regex (car x))
- (cdr x)))
- re)
- (swiper--normalize-regex re))))
-
-(defvar swiper-history nil
- "History for `swiper'.")
-
-(defvar swiper-invocation-face nil
- "The face at the point of invocation of `swiper'.")
-
-(defcustom swiper-stay-on-quit nil
- "When non-nil don't go back to search start on abort."
- :type 'boolean)
-
-;;;###autoload
-(defun swiper (&optional initial-input)
- "`isearch-forward' with an overview.
-When non-nil, INITIAL-INPUT is the initial search pattern."
- (interactive)
- (let ((candidates (swiper--candidates)))
- (swiper--init)
- (setq swiper-invocation-face
- (plist-get (text-properties-at (point)) 'face))
- (let ((preselect
- (if (or swiper-use-visual-line (null search-invisible))
- (count-screen-lines
- (point-min)
- (save-excursion (beginning-of-visual-line) (point)))
- (1- (line-number-at-pos))))
- (minibuffer-allow-text-properties t)
- res)
- (unwind-protect
- (and
- (setq res
- (ivy-read
- "Swiper: "
- candidates
- :initial-input initial-input
- :keymap swiper-map
- :preselect
- (if initial-input
- (cl-position-if
- (lambda (x)
- (= (1+ preselect) (swiper--line-number x)))
- (progn
- (setq ivy--old-re nil)
- (ivy--filter initial-input candidates)))
- preselect)
- :require-match t
- :action #'swiper--action
- :re-builder #'swiper--re-builder
- :history 'swiper-history
- :extra-props (list :fname (buffer-file-name))
- :caller 'swiper))
- (point))
- (unless (or res swiper-stay-on-quit)
- (goto-char swiper--opoint))
- (isearch-clean-overlays)
- (unless (or res (string= ivy-text ""))
- (cl-pushnew ivy-text swiper-history))
- (setq swiper--current-window-start nil)
- (when swiper--reveal-mode
- (reveal-mode 1))))))
-
-(ivy-configure 'swiper
- :occur #'swiper-occur
- :update-fn #'swiper--update-input-ivy
- :unwind-fn #'swiper--cleanup
- :index-fn #'ivy-recompute-index-swiper)
-
-(defun swiper-toggle-face-matching ()
- "Toggle matching only the candidates with `swiper-invocation-face'."
- (interactive)
- (setf (ivy-state-matcher ivy-last)
- (if (ivy-state-matcher ivy-last)
- nil
- #'swiper--face-matcher))
- (setq ivy--old-re nil))
-
-(defun swiper--face-matcher (regexp candidates)
- "Return REGEXP matching CANDIDATES.
-Matched candidates should have `swiper-invocation-face'."
- (cl-remove-if-not
- (lambda (x)
- (and (string-match regexp x)
- (let* ((s (match-string 0 x))
- (n (length s))
- (i 0))
- (while (and (< i n)
- (text-property-any
- i (1+ i)
- 'face swiper-invocation-face
- s))
- (cl-incf i))
- (= i n))))
- candidates))
-
-(defun swiper--ensure-visible ()
- "Remove overlays hiding point."
- (let ((overlays (overlays-at (1- (point))))
- ov expose)
- (while (setq ov (pop overlays))
- (if (and (invisible-p (overlay-get ov 'invisible))
- (setq expose (overlay-get ov 'isearch-open-invisible)))
- (funcall expose ov)))))
-
-(defvar swiper--overlays nil
- "Store overlays.")
-
-(defvar swiper--isearch-highlight-timer nil
- "This timer used by `swiper--delayed-add-overlays'.")
-
-(defun swiper--cleanup ()
- "Clean up the overlays."
- (while swiper--overlays
- (delete-overlay (pop swiper--overlays)))
- ;; force cleanup unless it's :unwind
- (lazy-highlight-cleanup
- (if (eq ivy-exit 'done) lazy-highlight-cleanup t))
- (when (timerp swiper--isearch-highlight-timer)
- (cancel-timer swiper--isearch-highlight-timer)
- (setq swiper--isearch-highlight-timer nil)))
-
-(defun swiper--add-cursor-overlay (wnd)
- (let* ((special (or (eolp) (looking-at "\t")))
- (ov (make-overlay (point) (if special (point) (1+ (point))))))
- (if special
- (overlay-put ov 'after-string (propertize " " 'face 'ivy-cursor))
- (overlay-put ov 'face 'ivy-cursor))
- (overlay-put ov 'window wnd)
- (overlay-put ov 'priority 2)
- (push ov swiper--overlays)))
-
-(defun swiper--add-line-overlay (wnd)
- (let ((beg (if visual-line-mode
- (save-excursion
- (beginning-of-visual-line)
- (point))
- (line-beginning-position)))
- (end (if visual-line-mode
- (save-excursion
- (end-of-visual-line)
- (point))
- (1+ (line-end-position)))))
- (push (swiper--make-overlay beg end 'swiper-line-face wnd 0)
- swiper--overlays)))
-
-(defun swiper--make-overlay (beg end face wnd priority)
- "Create an overlay bound by BEG and END.
-FACE, WND and PRIORITY are properties corresponding to
-the face, window and priority of the overlay."
- (let ((overlay (make-overlay beg end)))
- (overlay-put overlay 'face face)
- (overlay-put overlay 'window wnd)
- (overlay-put overlay 'priority priority)
- overlay))
-
-(defun swiper--recenter-p ()
- (or (display-graphic-p)
- (not recenter-redisplay)))
-
-(defun swiper--positive-regexps ()
- (if (listp ivy-regex)
- (mapcar #'car (cl-remove-if-not #'cdr ivy-regex))
- (list ivy-regex)))
-
-(defun swiper--update-input-ivy ()
- "Called when `ivy' input is updated."
- (with-ivy-window
- (swiper--cleanup)
- (when (> (length (ivy-state-current ivy-last)) 0)
- (let ((regexps (swiper--positive-regexps))
- (re-idx -1)
- (case-fold-search (ivy--case-fold-p ivy-text)))
- (dolist (re regexps)
- (setq re-idx (1+ re-idx))
- (let* ((re (replace-regexp-in-string
- " " "\t"
- re))
- (num (swiper--line-number (ivy-state-current ivy-last))))
- (unless (memq this-command '(ivy-yank-word
- ivy-yank-symbol
- ivy-yank-char
- scroll-other-window))
- (when (cl-plusp num)
- (unless (if swiper--current-line
- (eq swiper--current-line num)
- (eq (line-number-at-pos) num))
- (goto-char swiper--point-min)
- (if swiper-use-visual-line
- (line-move (1- num))
- (forward-line (1- num))))
- (if (and (equal ivy-text "")
- (>= swiper--opoint (line-beginning-position))
- (<= swiper--opoint (line-end-position)))
- (goto-char swiper--opoint)
- (if (eq swiper--current-line num)
- (when swiper--current-match-start
- (goto-char swiper--current-match-start))
- (setq swiper--current-line num))
- (when (re-search-forward re (line-end-position) t)
- (setq swiper--current-match-start (match-beginning 0))))
- (isearch-range-invisible (line-beginning-position)
- (line-end-position))
- (swiper--maybe-recenter)))
- (swiper--add-overlays
- re
- (max
- (if (swiper--recenter-p)
- (window-start)
- (line-beginning-position (- (window-height))))
- swiper--point-min)
- (min
- (if (swiper--recenter-p)
- (window-end (selected-window) t)
- (line-end-position (window-height)))
- swiper--point-max)
- nil
- re-idx)))))))
-
-(defun swiper--add-overlays (re &optional beg end wnd re-idx)
- "Add overlays for RE regexp in visible part of the current buffer.
-BEG and END, when specified, are the point bounds.
-WND, when specified is the window."
- (setq wnd (or wnd (ivy-state-window ivy-last)))
- (swiper--add-line-overlay wnd)
- (let* ((pt (point))
- (wh (window-height))
- (beg (or beg (save-excursion
- (forward-line (- wh))
- (point))))
- (end (or end (save-excursion
- (forward-line wh)
- (point))))
- (case-fold-search (ivy--case-fold-p re)))
- (when (>= (length re) swiper-min-highlight)
- (save-excursion
- (goto-char beg)
- ;; RE can become an invalid regexp
- (while (progn
- (when (eolp)
- (unless (eobp)
- (forward-char)))
- (and (ignore-errors (re-search-forward re end t))
- (> (- (match-end 0) (match-beginning 0)) 0)))
- ;; Don't highlight a match if it spans multiple
- ;; lines. `count-lines' returns 1 if the match is within a
- ;; single line, even if it includes the newline, and 2 or
- ;; greater otherwise. We hope that the inclusion of the
- ;; newline will not ever be a problem in practice.
- (when (< (count-lines (match-beginning 0) (match-end 0)) 2)
- (let* ((faces (if (= (match-end 0) pt)
- swiper-faces
- swiper-background-faces))
- (adder-fn (lambda (beg end face priority)
- (push (swiper--make-overlay beg end face wnd priority)
- isearch-lazy-highlight-overlays))))
- (unless (and (consp ivy--old-re)
- (null
- (save-match-data
- (ivy--re-filter ivy--old-re
- (list
- (buffer-substring-no-properties
- (line-beginning-position)
- (line-end-position)))))))
- (swiper--add-properties faces adder-fn re-idx)))))))))
-
-(defun swiper--add-properties (faces adder-fn &optional re-idx)
- (let ((mb (match-beginning 0))
- (me (match-end 0)))
- (unless (> (- me mb) 2017)
- (funcall adder-fn
- mb me
- (if (and ivy-use-group-face-if-no-groups (zerop ivy--subexps))
- (nth (1+ (mod (or re-idx 0) (1- (length faces)))) faces)
- (car faces))
- 0)))
- (let ((i 1)
- (j 0))
- (while (<= (cl-incf j) ivy--subexps)
- (let ((bm (match-beginning j))
- (em (match-end j)))
- (when (and (integerp em)
- (integerp bm))
- (when (eq (ivy-alist-setting ivy-re-builders-alist t) #'ivy--regex-fuzzy)
- (while (and (< j ivy--subexps)
- (integerp (match-beginning (+ j 1)))
- (= em (match-beginning (+ j 1))))
- (setq em (match-end (cl-incf j)))))
- (funcall adder-fn
- bm em
- (nth (1+ (mod (+ i 2) (1- (length faces))))
- faces)
- i)
- (cl-incf i))))))
-
-(defcustom swiper-action-recenter nil
- "When non-nil, recenter after exiting `swiper'."
- :type 'boolean)
-(defvar evil-search-module)
-(defvar evil-ex-search-pattern)
-(defvar evil-ex-search-persistent-highlight)
-(defvar evil-ex-search-direction)
-(declare-function evil-ex-search-activate-highlight "evil-ex")
-
-(defun swiper--maybe-recenter ()
- (cond (swiper-action-recenter
- (recenter))
- ((swiper--recenter-p)
- (when swiper--current-window-start
- (set-window-start (selected-window) swiper--current-window-start))
- (when (or
- (< (point) (window-start))
- (> (point) (window-end (ivy-state-window ivy-last) t)))
- (recenter))))
- (setq swiper--current-window-start (window-start)))
-
-(defun swiper--line-number (x)
- (or (get-text-property 0 'swiper-line-number x)
- (get-text-property 1 'swiper-line-number x)))
-
-(defcustom swiper-verbose t
- "When non-nil, print more informational messages."
- :type 'boolean)
-
-(defun swiper--push-mark ()
- (when (/= (point) swiper--opoint)
- (unless (and transient-mark-mode mark-active)
- (when (eq ivy-exit 'done)
- (push-mark swiper--opoint t)
- (when swiper-verbose
- (message "Mark saved where search started"))))))
-
-(defun swiper--action (x)
- "Goto line X."
- (let ((ln (1- (swiper--line-number x)))
- (re (ivy--regex ivy-text))
- (case-fold-search (ivy--case-fold-p ivy-text)))
- (if (null x)
- (user-error "No candidates")
- (with-ivy-window
- (unless (equal (current-buffer)
- (ivy-state-buffer ivy-last))
- (switch-to-buffer (ivy-state-buffer ivy-last)))
- (goto-char
- (if (buffer-narrowed-p)
- swiper--point-min
- (point-min)))
- (funcall (if swiper-use-visual-line
- #'line-move
- #'forward-line)
- ln)
- (when (and (re-search-forward re (line-end-position) t) swiper-goto-start-of-match)
- (goto-char (match-beginning 0)))
- (swiper--ensure-visible)
- (swiper--maybe-recenter)
- (swiper--push-mark)
- (swiper--remember-search-history re)))))
-
-(defun swiper--remember-search-history (re)
- "Add the search pattern RE to the search history ring."
- (add-to-history
- 'regexp-search-ring
- re
- regexp-search-ring-max)
- ;; integration with evil-mode's search
- (when (bound-and-true-p evil-mode)
- (when (eq evil-search-module 'isearch)
- (setq isearch-string ivy-text))
- (when (eq evil-search-module 'evil-search)
- (add-to-history 'evil-ex-search-history re)
- (setq evil-ex-search-pattern (list re t t))
- (setq evil-ex-search-direction 'forward)
- (when evil-ex-search-persistent-highlight
- (evil-ex-search-activate-highlight evil-ex-search-pattern)))))
-
-(defun swiper-from-isearch ()
- "Invoke `swiper' from isearch."
- (interactive)
- (let ((query (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string))))
- (isearch-exit)
- (swiper query)))
-
-(defvar swiper-multi-buffers nil
- "Store the current list of buffers.")
-
-(defvar swiper-multi-candidates nil
- "Store the list of candidates for `swiper-multi'.")
-
-(defun swiper-multi-prompt ()
- "Return prompt for `swiper-multi'."
- (format "Buffers (%s): "
- (mapconcat #'identity swiper-multi-buffers ", ")))
-
-(defvar swiper-window-width 80)
-
-(defun swiper-multi ()
- "Select one or more buffers.
-Run `swiper' for those buffers."
- (interactive)
- (setq swiper-multi-buffers nil)
- (let ((ivy-use-virtual-buffers nil))
- (ivy-read (swiper-multi-prompt)
- #'internal-complete-buffer
- :action #'swiper-multi-action-1))
- (let ((swiper-window-width (- (- (frame-width) (if (display-graphic-p) 0 1)) 4)))
- (ivy-read "Swiper: " swiper-multi-candidates
- :action #'swiper-multi-action-2
- :caller 'swiper-multi)))
-
-(ivy-configure 'swiper-multi
- :unwind-fn #'swiper--cleanup
- :index-fn #'ivy-recompute-index-swiper
- :format-fn #'swiper--all-format-function)
-
-(defun swiper-multi-action-1 (x)
- "Add X to list of selected buffers `swiper-multi-buffers'.
-If X is already part of the list, remove it instead. Quit the selection if
-X is selected by either `ivy-done', `ivy-alt-done' or `ivy-immediate-done',
-otherwise continue prompting for buffers."
- (if (member x swiper-multi-buffers)
- (progn
- (setq swiper-multi-buffers (delete x swiper-multi-buffers)))
- (unless (equal x "")
- (setq swiper-multi-buffers (append swiper-multi-buffers (list x)))))
- (let ((prompt (swiper-multi-prompt)))
- (setf (ivy-state-prompt ivy-last) prompt)
- (setq ivy--prompt (concat "%-4d " prompt)))
- (cond ((memq this-command '(ivy-done
- ivy-alt-done
- ivy-immediate-done))
- (setq swiper-multi-candidates
- (swiper--multi-candidates
- (mapcar #'get-buffer swiper-multi-buffers))))
- ((eq this-command 'ivy-call)
- (with-selected-window (active-minibuffer-window)
- (delete-minibuffer-contents)))))
-
-(defun swiper-multi-action-2 (x)
- "Move to candidate X from `swiper-multi'."
- (when (> (length x) 0)
- (let ((buffer-name (get-text-property 0 'buffer x)))
- (when buffer-name
- (with-ivy-window
- (switch-to-buffer buffer-name)
- (goto-char (point-min))
- (forward-line (1- (swiper--line-number x)))
- (re-search-forward
- (ivy--regex ivy-text)
- (line-end-position) t)
- (isearch-range-invisible (line-beginning-position)
- (line-end-position))
- (unless (eq ivy-exit 'done)
- (swiper--cleanup)
- (swiper--add-overlays (ivy--regex ivy-text))))))))
-
-(defun swiper-all-buffer-p (buffer)
- "Return non-nil if BUFFER should be considered by `swiper-all'."
- (let ((mode (buffer-local-value 'major-mode (get-buffer buffer))))
- (cond
- ;; Ignore TAGS buffers, they tend to add duplicate results.
- ((eq mode #'tags-table-mode) nil)
- ;; Always consider dired buffers, even though they're not backed
- ;; by a file.
- ((eq mode #'dired-mode) t)
- ;; Always consider stash buffers too, as they may have
- ;; interesting content not present in any buffers. We don't #'
- ;; quote to satisfy the byte-compiler.
- ((eq mode 'magit-stash-mode) t)
- ;; Email buffers have no file, but are useful to search
- ((eq mode 'gnus-article-mode) t)
- ;; Otherwise, only consider the file if it's backed by a file.
- (t (buffer-file-name buffer)))))
-
-;;* `swiper-all'
-(defun swiper-all-function (str)
- "Search in all open buffers for STR."
- (or
- (ivy-more-chars)
- (let* ((buffers (cl-remove-if-not #'swiper-all-buffer-p (buffer-list)))
- (re-full ivy-regex)
- re re-tail
- cands match
- (case-fold-search (ivy--case-fold-p str)))
- (setq re (ivy-re-to-str re-full))
- (when (consp re-full)
- (setq re-tail (cdr re-full)))
- (dolist (buffer buffers)
- (with-current-buffer buffer
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward re nil t)
- (setq match (if (memq major-mode '(org-mode dired-mode))
- (buffer-substring-no-properties
- (line-beginning-position)
- (line-end-position))
- (buffer-substring
- (line-beginning-position)
- (line-end-position))))
- (put-text-property
- 0 1 'buffer
- (buffer-name)
- match)
- (put-text-property 0 1 'point (point) match)
- (when (or (null re-tail) (ivy-re-match re-tail match))
- (push match cands))))))
- (setq ivy--old-re re-full)
- (if (null cands)
- (list "")
- (setq ivy--old-cands (nreverse cands))))))
-
-(defun swiper--all-format-function (cands)
- "Format CANDS for `swiper-all'.
-See `ivy-format-functions-alist' for further information."
- (let* ((ww swiper-window-width)
- (col2 1)
- (cands-with-buffer
- (mapcar (lambda (s)
- (let ((buffer (get-text-property 0 'buffer s)))
- (setq col2 (max col2 (length buffer)))
- (cons s buffer))) cands))
- (col1 (- ww 4 col2)))
- (setq cands
- (mapcar (lambda (x)
- (if (cdr x)
- (let ((s (ivy--truncate-string (car x) col1)))
- (concat
- s
- (make-string
- (max 0
- (- ww (string-width s) (length (cdr x))))
- ?\ )
- (cdr x)))
- (car x)))
- cands-with-buffer))
- (ivy--format-function-generic
- (lambda (str)
- (ivy--add-face str 'ivy-current-match))
- (lambda (str)
- str)
- cands
- "\n")))
-
-(defvar swiper-all-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "M-q") 'swiper-all-query-replace)
- map)
- "Keymap for `swiper-all'.")
-
-;;;###autoload
-(defun swiper-all (&optional initial-input)
- "Run `swiper' for all open buffers."
- (interactive)
- (let ((swiper-window-width (- (frame-width) (if (display-graphic-p) 0 1))))
- (ivy-read "swiper-all: " 'swiper-all-function
- :action #'swiper-all-action
- :dynamic-collection t
- :keymap swiper-all-map
- :initial-input initial-input
- :caller 'swiper-all)))
-
-(ivy-configure 'swiper-all
- :update-fn 'auto
- :unwind-fn #'swiper--cleanup
- :format-fn #'swiper--all-format-function)
-
-(defun swiper-all-action (x)
- "Move to candidate X from `swiper-all'."
- (when (> (length x) 0)
- (let ((buffer-name (get-text-property 0 'buffer x)))
- (when buffer-name
- (with-ivy-window
- (switch-to-buffer buffer-name)
- (goto-char (get-text-property 0 'point x))
- (isearch-range-invisible (line-beginning-position)
- (line-end-position))
- (unless (eq ivy-exit 'done)
- (swiper--cleanup)
- (swiper--add-overlays (ivy--regex ivy-text))))))))
-
-(defun swiper--multi-candidates (buffers)
- "Extract candidates from BUFFERS."
- (let ((res nil))
- (dolist (buf buffers)
- (with-current-buffer buf
- (setq res
- (nconc
- (mapcar
- (lambda (s) (put-text-property 0 1 'buffer (buffer-name) s) s)
- (swiper--candidates 4))
- res))))
- res))
-
-;;* `swiper-isearch'
-(defun swiper-isearch-function (str)
- "Collect STR matches in the current buffer for `swiper-isearch'."
- (with-ivy-window
- (swiper--isearch-function str)))
-
-(defun swiper-match-usable-p ()
- (or search-invisible
- (not (cl-find-if
- (lambda (ov)
- (invisible-p (overlay-get ov 'invisible)))
- (overlays-at (point))))))
-
-(defvar swiper--isearch-backward nil)
-(defvar swiper--isearch-start-point nil)
-
-(defun swiper--isearch-function-1 (re backward)
- (unless (string= re ".")
- (let (cands)
- (save-excursion
- (goto-char (if backward (point-max) (point-min)))
- (while (and (funcall (if backward #'re-search-backward #'re-search-forward) re nil t)
- (not (and
- (= (match-beginning 0) (match-end 0))
- (if backward (bobp) (eobp)))))
- (when (swiper-match-usable-p)
- (let ((pos (if (or backward swiper-goto-start-of-match)
- (match-beginning 0)
- (point))))
- (push pos cands)))
- (when (= (match-beginning 0) (match-end 0))
- (if backward
- (backward-char)
- (forward-char)))))
- (if backward
- cands
- (nreverse cands)))))
-
-(defun swiper--isearch-next-item (re cands)
- (if swiper--isearch-backward
- (or
- (cl-position-if
- (lambda (x)
- (and
- (< x swiper--isearch-start-point)
- (eq 0 (string-match-p
- re
- (buffer-substring-no-properties
- x swiper--isearch-start-point)))))
- cands
- :from-end t)
- 0)
- (or
- (cl-position-if
- (lambda (x) (> x swiper--isearch-start-point))
- cands)
- 0)))
-
-(defun swiper--isearch-filter-ignore-order (re-full cands)
- (let (filtered-cands)
- (dolist (re-cons re-full cands)
- (save-excursion
- (dolist (cand cands)
- (goto-char cand)
- (beginning-of-line)
- (unless (if (re-search-forward (car re-cons) (line-end-position) t)
- (not (cdr re-cons))
- (cdr re-cons))
- (push cand filtered-cands))))
- (setq cands (nreverse filtered-cands))
- (setq filtered-cands nil))))
-
-(defun swiper--isearch-function (str)
- (let ((re-full ivy-regex))
- (unless (equal re-full "")
- (let* ((case-fold-search (ivy--case-fold-p str))
- (re
- (if (stringp re-full)
- re-full
- (mapconcat
- #'ivy--regex-or-literal
- (delq nil (mapcar (lambda (x) (and (cdr x) (car x))) re-full))
- "\\|")))
- (cands (swiper--isearch-function-1 re swiper--isearch-backward)))
- (when (consp re-full)
- (setq cands (swiper--isearch-filter-ignore-order re-full cands)))
- (setq ivy--old-re re)
- (ivy-set-index (swiper--isearch-next-item re cands))
- (setq ivy--old-cands cands)))))
-
-(defcustom swiper-isearch-highlight-delay '(2 0.2)
- "When `ivy-text' is too short, delay showing the overlay.
-
-The default value will delay showing the overlay by 0.2 seconds
-if `ivy-text' is shorter than 2 characters.
-
-The aim is to reduce the visual clutter, since it's very rare
-that we search only for one character."
- :type '(list
- (integer :tag "Text length")
- (float :tag "Delay in seconds")))
-
-(defun swiper--delayed-add-overlays ()
- (if (and swiper-isearch-highlight-delay
- (< (length ivy-text) (car swiper-isearch-highlight-delay)))
- (setq swiper--isearch-highlight-timer
- (run-with-idle-timer
- (cadr swiper-isearch-highlight-delay) nil
- (lambda ()
- (with-ivy-window
- (swiper--add-overlays (ivy--regex ivy-text))))))
- (dolist (re (swiper--positive-regexps))
- (swiper--add-overlays re))))
-
-(defun swiper-isearch-action (x)
- "Move to X for `swiper-isearch'."
- (if (or (numberp x)
- (and (> (length x) 0)
- (setq x (get-text-property 0 'point x))))
- (with-ivy-window
- (goto-char x)
- (when (and (or (eq this-command 'ivy-previous-line-or-history)
- (and (eq this-command 'ivy-done)
- (eq last-command 'ivy-previous-line-or-history)))
- (looking-back ivy-regex (line-beginning-position)))
- (goto-char (match-beginning 0)))
- (isearch-range-invisible (point) (1+ (point)))
- (swiper--maybe-recenter)
- (if (eq ivy-exit 'done)
- (progn
- (swiper--push-mark)
- (swiper--remember-search-history (ivy--regex ivy-text)))
- (swiper--cleanup)
- (swiper--delayed-add-overlays)
- (swiper--add-cursor-overlay
- (ivy-state-window ivy-last))))
- (swiper--cleanup)))
-
-(defun swiper-action-copy (_x)
- "Copy line at point and go back."
- (kill-new
- (buffer-substring-no-properties
- (line-beginning-position) (line-end-position)))
- (goto-char swiper--opoint))
-
-(ivy-add-actions 'swiper-isearch '(("w" swiper-action-copy "copy")))
-(ivy-add-actions 'swiper '(("w" swiper-action-copy "copy")))
-
-(defun swiper-isearch-thing-at-point ()
- "Insert `symbol-at-point' into the minibuffer of `swiper-isearch'.
-When not running `swiper-isearch' already, start it."
- (interactive)
- (if (window-minibuffer-p)
- (let (bnd str regionp)
- (with-ivy-window
- (setq bnd
- (if (setq regionp (region-active-p))
- (prog1 (cons (region-beginning) (region-end))
- (deactivate-mark))
- (bounds-of-thing-at-point 'symbol)))
- (setq str (buffer-substring-no-properties (car bnd) (cdr bnd))))
- (insert str)
- (unless regionp
- (ivy--insert-symbol-boundaries)))
- (let (thing)
- (if (use-region-p)
- (progn
- (setq thing (buffer-substring-no-properties
- (region-beginning) (region-end)))
- (goto-char (region-beginning))
- (deactivate-mark))
- (let ((bnd (bounds-of-thing-at-point 'symbol)))
- (when bnd
- (goto-char (car bnd)))
- (setq thing (ivy-thing-at-point))))
- (swiper-isearch thing))))
-
-(defvar swiper-isearch-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map swiper-map)
- (define-key map (kbd "M-n") 'swiper-isearch-thing-at-point)
- map)
- "Keymap for `swiper-isearch'.")
-
-(defun swiper--isearch-same-line-p (s1 s2)
- "Check if S1 and S2 are equal and on the same line."
- (and (equal s1 s2)
- (<= (count-lines
- (get-text-property 0 'point s2)
- (get-text-property 0 'point s1))
- 1)))
-
-(defun swiper-isearch-format-function (cands)
- (if (numberp (car-safe cands))
- (let ((re (ivy-re-to-str ivy-regex)))
- (if (string= re "^$")
- ""
- (mapconcat
- #'identity
- (swiper--isearch-format
- ivy--index ivy--length (or ivy--old-cands ivy--all-candidates)
- re
- (ivy-state-current ivy-last)
- (ivy-state-buffer ivy-last))
- "\n")))
- (funcall
- (ivy-alist-setting ivy-format-functions-alist t)
- cands)))
-
-(defun swiper--line-at-point (pt)
- (save-excursion
- (goto-char pt)
- (let ((s (buffer-substring
- (line-beginning-position)
- (line-end-position))))
- (if (string= s "")
- s
- (put-text-property 0 1 'point pt s)
- (ivy-cleanup-string s)))))
-
-(defun swiper--isearch-highlight (str &optional current)
- (let ((start 0)
- (i 0)
- (re (ivy-re-to-str ivy-regex)))
- (catch 'done
- (while (string-match re str start)
- (if (= (match-beginning 0) (match-end 0))
- (throw 'done t)
- (setq start (match-end 0)))
- (swiper--add-properties
- (if (eq current i)
- swiper-faces
- swiper-background-faces)
- (lambda (beg end face _priority)
- (add-face-text-property beg end face nil str)))
- (cl-incf i)))
- str))
-
-(defun swiper--isearch-format (index length cands regex current buffer)
- (let* ((half-height (/ ivy-height 2))
- (i (1- index))
- (j 0)
- (len 0)
- res s)
- (with-current-buffer buffer
- (while (and (>= i 0)
- (swiper--isearch-same-line-p
- (swiper--line-at-point (nth i cands))
- (swiper--line-at-point current)))
- (cl-decf i)
- (cl-incf j))
- (while (and (>= i 0)
- (< len half-height))
- (setq s (swiper--line-at-point (nth i cands)))
- (unless (swiper--isearch-same-line-p s (car res))
- (push (swiper--isearch-highlight s) res)
- (cl-incf len))
- (cl-decf i))
- (setq res (nreverse res))
- (let ((current-str
- (swiper--line-at-point current))
- (start 0))
- (dotimes (_ (1+ j))
- (string-match regex current-str start)
- (setq start (match-end 0)))
- (font-lock-prepend-text-property
- 0 (length current-str)
- 'face 'swiper-line-face current-str)
- (swiper--isearch-highlight current-str j)
- (push current-str res))
- (cl-incf len)
- (setq i (1+ index))
- (while (and (< i length)
- (swiper--isearch-same-line-p
- (swiper--line-at-point (nth i cands))
- (swiper--line-at-point current)))
- (cl-incf i))
- (while (and (< i length)
- (< len ivy-height))
- (setq s (swiper--line-at-point (nth i cands)))
- (unless (swiper--isearch-same-line-p s (car res))
- (push (swiper--isearch-highlight s) res)
- (cl-incf len))
- (cl-incf i))
- (nreverse res))))
-
-(defun swiper--isearch-init ()
- "Initialize `swiper-isearch'."
- (swiper--init)
- (setq swiper--isearch-start-point (point))
- (swiper-font-lock-ensure))
-
-(defun swiper--isearch-unwind ()
- (swiper--cleanup)
- (unless (or (eq ivy-exit 'done) swiper-stay-on-quit)
- (goto-char swiper--opoint))
- (isearch-clean-overlays)
- (swiper--ensure-visible)
- (unless (or (eq ivy-exit 'done) (string= ivy-text ""))
- (cl-pushnew ivy-text swiper-history)))
-
-;;;###autoload
-(defun swiper-isearch (&optional initial-input)
- "A `swiper' that's not line-based."
- (interactive)
- (let ((ivy-fixed-height-minibuffer t)
- (cursor-in-non-selected-windows nil)
- (swiper-min-highlight 1))
- (ivy-read
- "Swiper: "
- #'swiper-isearch-function
- :initial-input initial-input
- :keymap swiper-isearch-map
- :dynamic-collection t
- :require-match t
- :action #'swiper-isearch-action
- :re-builder #'swiper--re-builder
- :history 'swiper-history
- :extra-props (list :fname (buffer-file-name))
- :caller 'swiper-isearch)))
-
-(ivy-configure 'swiper-isearch
- :occur #'swiper-occur
- :init-fn #'swiper--isearch-init
- :update-fn 'auto
- :unwind-fn #'swiper--isearch-unwind
- :format-fn #'swiper-isearch-format-function)
-
-;;;###autoload
-(defun swiper-isearch-backward (&optional initial-input)
- "Like `swiper-isearch' but the first result is before the point."
- (interactive)
- (let ((swiper--isearch-backward t))
- (swiper-isearch initial-input)))
-
-(defun swiper-isearch-toggle ()
- "Two-way toggle between `swiper-isearch' and isearch.
-Intended to be bound in `isearch-mode-map' and `swiper-map'."
- (interactive)
- (if isearch-mode
- (let ((query (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string))))
- (isearch-exit)
- (goto-char (or (and isearch-forward isearch-other-end)
- (point)))
- (swiper-isearch query))
- (ivy-exit-with-action
- (lambda (_)
- (when (looking-back (ivy-re-to-str ivy-regex) (line-beginning-position))
- (goto-char (match-beginning 0)))
- (isearch-mode t)
- (unless (string= ivy-text "")
- (isearch-yank-string ivy-text))))))
-
-(provide 'swiper)
-
-;;; swiper.el ends here
diff --git a/elpa/tabbar-20180726.1735/down.png b/elpa/tabbar-20180726.1735/down.png
deleted file mode 100644
index 1a7e9ae..0000000
--- a/elpa/tabbar-20180726.1735/down.png
+++ /dev/null
Binary files differ
diff --git a/elpa/tabbar-20180726.1735/tabbar-autoloads.el b/elpa/tabbar-20180726.1735/tabbar-autoloads.el
deleted file mode 100644
index d56c842..0000000
--- a/elpa/tabbar-20180726.1735/tabbar-autoloads.el
+++ /dev/null
@@ -1,185 +0,0 @@
-;;; tabbar-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "tabbar" "tabbar.el" (0 0 0 0))
-;;; Generated autoloads from tabbar.el
-
-(autoload 'tabbar-backward "tabbar" "\
-Select the previous available tab.
-Depend on the setting of the option `tabbar-cycle-scope'.
-
-\(fn)" t nil)
-
-(autoload 'tabbar-forward "tabbar" "\
-Select the next available tab.
-Depend on the setting of the option `tabbar-cycle-scope'.
-
-\(fn)" t nil)
-
-(autoload 'tabbar-backward-group "tabbar" "\
-Go to selected tab in the previous available group.
-
-\(fn)" t nil)
-
-(autoload 'tabbar-forward-group "tabbar" "\
-Go to selected tab in the next available group.
-
-\(fn)" t nil)
-
-(autoload 'tabbar-backward-tab "tabbar" "\
-Select the previous visible tab.
-
-\(fn)" t nil)
-
-(autoload 'tabbar-forward-tab "tabbar" "\
-Select the next visible tab.
-
-\(fn)" t nil)
-
-(autoload 'tabbar-press-home "tabbar" "\
-Press the tab bar home button.
-That is, simulate a mouse click on that button.
-A numeric prefix ARG value of 2, or 3, respectively simulates a
-mouse-2, or mouse-3 click. The default is a mouse-1 click.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tabbar-press-scroll-left "tabbar" "\
-Press the tab bar scroll-left button.
-That is, simulate a mouse click on that button.
-A numeric prefix ARG value of 2, or 3, respectively simulates a
-mouse-2, or mouse-3 click. The default is a mouse-1 click.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tabbar-press-scroll-right "tabbar" "\
-Press the tab bar scroll-right button.
-That is, simulate a mouse click on that button.
-A numeric prefix ARG value of 2, or 3, respectively simulates a
-mouse-2, or mouse-3 click. The default is a mouse-1 click.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tabbar-mwheel-backward "tabbar" "\
-Select the previous available tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-backward'.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-forward "tabbar" "\
-Select the next available tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-forward'.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-backward-group "tabbar" "\
-Go to selected tab in the previous available group.
-If there is only one group, select the previous visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-backward-group'.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-forward-group "tabbar" "\
-Go to selected tab in the next available group.
-If there is only one group, select the next visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-forward-group'.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-backward-tab "tabbar" "\
-Select the previous visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-backward-tab'.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-forward-tab "tabbar" "\
-Select the next visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-forward-tab'.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-switch-tab "tabbar" "\
-Select the next or previous tab according to EVENT.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-mwheel-switch-group "tabbar" "\
-Select the next or previous group of tabs according to EVENT.
-
-\(fn EVENT)" t nil)
-
-(autoload 'tabbar-local-mode "tabbar" "\
-Toggle local display of the tab bar.
-With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled.
-When turned on, if a local header line is shown, it is hidden to show
-the tab bar. The tab bar is locally hidden otherwise. When turned
-off, if a local header line is hidden or the tab bar is locally
-hidden, it is shown again. Signal an error if Tabbar mode is off.
-
-\(fn &optional ARG)" t nil)
-
-(defvar tabbar-mode nil "\
-Non-nil if Tabbar mode is enabled.
-See the `tabbar-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `tabbar-mode'.")
-
-(custom-autoload 'tabbar-mode "tabbar" nil)
-
-(autoload 'tabbar-mode "tabbar" "\
-Toggle display of a tab bar in the header line.
-With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled.
-
-\\{tabbar-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(defvar tabbar-mwheel-mode nil "\
-Non-nil if Tabbar-Mwheel mode is enabled.
-See the `tabbar-mwheel-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `tabbar-mwheel-mode'.")
-
-(custom-autoload 'tabbar-mwheel-mode "tabbar" nil)
-
-(autoload 'tabbar-mwheel-mode "tabbar" "\
-Toggle use of the mouse wheel to navigate through tabs or groups.
-With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled.
-
-\\{tabbar-mwheel-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "tabbar" '("tabbar-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("tabbar-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; tabbar-autoloads.el ends here
diff --git a/elpa/tabbar-20180726.1735/tabbar-pkg.el b/elpa/tabbar-20180726.1735/tabbar-pkg.el
deleted file mode 100644
index f1530f2..0000000
--- a/elpa/tabbar-20180726.1735/tabbar-pkg.el
+++ /dev/null
@@ -1,9 +0,0 @@
-(define-package "tabbar" "20180726.1735" "Display a tab bar in the header line" 'nil :commit "82bbda31cbe8ef367dd6501c3aa14b7f2c835910" :keywords
- '("convenience")
- :authors
- '(("David Ponce" . "david@dponce.com"))
- :maintainer
- '("David Ponce" . "david@dponce.com"))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/tabbar-20180726.1735/tabbar.el b/elpa/tabbar-20180726.1735/tabbar.el
deleted file mode 100644
index a0dce4a..0000000
--- a/elpa/tabbar-20180726.1735/tabbar.el
+++ /dev/null
@@ -1,1978 +0,0 @@
-;; -*-no-byte-compile: t; -*-
-;;; tabbar.el --- Display a tab bar in the header line
-
-;; Copyright (C) 2003, 2004, 2005 David Ponce
-
-;; Author: David Ponce <david@dponce.com>
-;; Maintainer: David Ponce <david@dponce.com>
-;; Created: 25 February 2003
-;; Keywords: convenience
-;; Version: 2.2
-;; Revision: $Id: tabbar.el,v 1.7 2009/03/02 21:02:34 davidswelt Exp $
-
-(defconst tabbar-version "2.2")
-
-;; This file is not part of GNU 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, 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 this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
-;; Floor, Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-;;
-;; This library provides the Tabbar global minor mode to display a tab
-;; bar in the header line of Emacs 21 and later versions. You can use
-;; the mouse to click on a tab and select it. Also, three buttons are
-;; displayed on the left side of the tab bar in this order: the
-;; "home", "scroll left", and "scroll right" buttons. The "home"
-;; button is a general purpose button used to change something on the
-;; tab bar. The scroll left and scroll right buttons are used to
-;; scroll tabs horizontally. Tabs can be divided up into groups to
-;; maintain several sets of tabs at the same time (see also the
-;; chapter "Core" below for more details on tab grouping). Only one
-;; group is displayed on the tab bar, and the "home" button, for
-;; example, can be used to navigate through the different groups, to
-;; show different tab bars.
-;;
-;; In a graphic environment, using the mouse is probably the preferred
-;; way to work with the tab bar. However, you can also use the tab
-;; bar when Emacs is running on a terminal, so it is possible to use
-;; commands to press special buttons, or to navigate cyclically
-;; through tabs.
-;;
-;; These commands, and default keyboard shortcuts, are provided:
-;;
-;; `tabbar-mode'
-;; Toggle the Tabbar global minor mode. When enabled a tab bar is
-;; displayed in the header line.
-;;
-;; `tabbar-local-mode' (C-c <C-f10>)
-;; Toggle the Tabbar-Local minor mode. Provided the global minor
-;; mode is turned on, the tab bar becomes local in the current
-;; buffer when the local minor mode is enabled. This permits to
-;; see the tab bar in a buffer where the header line is already
-;; used by another mode (like `Info-mode' for example).
-;;
-;; `tabbar-mwheel-mode'
-;; Toggle the Tabbar-Mwheel global minor mode. When enabled you
-;; can use the mouse wheel to navigate through tabs of groups.
-;;
-;; `tabbar-press-home' (C-c <C-home>)
-;; `tabbar-press-scroll-left' (C-c <C-prior>)
-;; `tabbar-press-scroll-right' (C-c <C-next>)
-;; Simulate a mouse-1 click on respectively the "home", "scroll
-;; left", and "scroll right" buttons. A numeric prefix argument
-;; value of 2, or 3, respectively simulates a mouse-2, or mouse-3
-;; click.
-;;
-;; `tabbar-backward' (C-c <C-left>)
-;; `tabbar-forward' (C-c <C-right>)
-;; Are the basic commands to navigate cyclically through tabs or
-;; groups of tabs. The cycle is controlled by the
-;; `tabbar-cycle-scope' option. The default is to navigate
-;; through all tabs across all existing groups of tabs. You can
-;; change the default behavior to navigate only through the tabs
-;; visible on the tab bar, or through groups of tabs only. Or use
-;; the more specialized commands below.
-;;
-;; `tabbar-backward-tab'
-;; `tabbar-forward-tab'
-;; Navigate through the tabs visible on the tab bar.
-;;
-;; `tabbar-backward-group' (C-c <C-up>)
-;; `tabbar-forward-group' (C-c <C-down>)
-;; Navigate through existing groups of tabs.
-;;
-;;
-;; Core
-;; ----
-;;
-;; The content of the tab bar is represented by an internal data
-;; structure: a tab set. A tab set is a collection (group) of tabs,
-;; identified by an unique name. In a tab set, at any time, one and
-;; only one tab is designated as selected within the tab set.
-;;
-;; A tab is a simple data structure giving the value of the tab, and a
-;; reference to its tab set container. A tab value can be any Lisp
-;; object. Each tab object is guaranteed to be unique.
-;;
-;; A tab set is displayed on the tab bar through a "view" defined by
-;; the index of the leftmost tab shown. Thus, it is possible to
-;; scroll the tab bar horizontally by changing the start index of the
-;; tab set view.
-;;
-;; The visual representation of a tab bar is a list of valid
-;; `header-line-format' template elements, one for each special
-;; button, and for each tab found into a tab set "view". When the
-;; visual representation of a tab is required, the function specified
-;; in the variable `tabbar-tab-label-function' is called to obtain it.
-;; The visual representation of a special button is obtained by
-;; calling the function specified in `tabbar-button-label-function',
-;; which is passed a button name among `home', `scroll-left', or
-;; `scroll-right'. There are also options and faces to customize the
-;; appearance of buttons and tabs (see the code for more details).
-;;
-;; When the mouse is over a tab, the function specified in
-;; `tabbar-help-on-tab-function' is called, which is passed the tab
-;; and should return a help string to display. When a tab is
-;; selected, the function specified in `tabbar-select-tab-function' is
-;; called, which is passed the tab and the event received.
-;;
-;; Similarly, to control the behavior of the special buttons, the
-;; following variables are available, for respectively the `home',
-;; `scroll-left' and `scroll-right' value of `<button>':
-;;
-;; `tabbar-<button>-function'
-;; Function called when <button> is selected. The function is
-;; passed the mouse event received.
-;;
-;; `tabbar-<button>-help-function'
-;; Function called with no arguments to obtain a help string
-;; displayed when the mouse is over <button>.
-;;
-;; To increase performance, each tab set automatically maintains its
-;; visual representation in a cache. As far as possible, the cache is
-;; used to display the tab set, and refreshed only when necessary.
-;;
-;; Several tab sets can be maintained at the same time. Only one is
-;; displayed on the tab bar, it is obtained by calling the function
-;; specified in the variable `tabbar-current-tabset-function'.
-;;
-;; A special tab set is maintained, that contains the list of the
-;; currently selected tabs in the existing tab sets. This tab set is
-;; useful to show the existing tab sets in a tab bar, and switch
-;; between them easily. The function `tabbar-get-tabsets-tabset'
-;; returns this special tab set.
-;;
-;;
-;; Buffer tabs
-;; -----------
-;;
-;; The default tab bar implementation provided displays buffers in
-;; dedicated tabs. Selecting a tab, switch (mouse-1), or pop
-;; (mouse-2), to the buffer it contains.
-;;
-;; The list of buffers put in tabs is provided by the function
-;; specified in the variable `tabbar-buffer-list-function'. The
-;; default function: `tabbar-buffer-list', excludes buffers whose name
-;; starts with a space, when they are not visiting a file.
-;;
-;; Buffers are organized in groups, each one represented by a tab set.
-;; A buffer can have no group, or belong to more than one group. The
-;; function specified by the variable `tabbar-buffer-groups-function'
-;; is called for each buffer to obtain the groups it belongs to. The
-;; default function provided: `tabbar-buffer-groups' organizes buffers
-;; depending on their major mode (see that function for details).
-;;
-;; The "home" button toggles display of buffer groups on the tab bar,
-;; allowing to easily show another buffer group by clicking on the
-;; associated tab.
-;;
-;; Known problems:
-;;
-;; Bug item #858306 at <http://sf.net/tracker/?group_id=79309>:
-;; tabbar-mode crashes GNU Emacs 21.3 on MS-Windows 98/95.
-;;
-
-;;; History:
-;;
-
-;;; Code:
-
-;;; Options
-;;
-(defgroup tabbar nil
- "Display a tab bar in the header line."
- :group 'convenience)
-
-(defcustom tabbar-cycle-scope nil
- "*Specify the scope of cyclic navigation through tabs.
-The following scopes are possible:
-
-- `tabs'
- Navigate through visible tabs only.
-- `groups'
- Navigate through tab groups only.
-- default
- Navigate through visible tabs, then through tab groups."
- :group 'tabbar
- :type '(choice :tag "Cycle through..."
- (const :tag "Visible Tabs Only" tabs)
- (const :tag "Tab Groups Only" groups)
- (const :tag "Visible Tabs then Tab Groups" nil)))
-
-(defcustom tabbar-auto-scroll-flag t
- "*Non-nil means to automatically scroll the tab bar.
-That is, when a tab is selected outside of the tab bar visible area,
-the tab bar is scrolled horizontally so the selected tab becomes
-visible."
- :group 'tabbar
- :type 'boolean)
-
-(defvar tabbar-inhibit-functions '(tabbar-default-inhibit-function)
- "List of functions to be called before displaying the tab bar.
-Those functions are called one by one, with no arguments, until one of
-them returns a non-nil value, and thus, prevents to display the tab
-bar.")
-
-(defvar tabbar-current-tabset-function nil
- "Function called with no argument to obtain the current tab set.
-This is the tab set displayed on the tab bar.")
-
-(defvar tabbar-tab-label-function nil
- "Function that obtains a tab label displayed on the tab bar.
-The function is passed a tab and should return a string.")
-
-(defvar tabbar-select-tab-function nil
- "Function that select a tab.
-The function is passed a mouse event and a tab, and should make it the
-selected tab.")
-
-(defvar tabbar-help-on-tab-function nil
- "Function to obtain a help string for a tab.
-The help string is displayed when the mouse is onto the button. The
-function is passed the tab and should return a help string or nil for
-none.")
-
-(defvar tabbar-button-label-function nil
- "Function that obtains a button label displayed on the tab bar.
-The function is passed a button name should return a propertized
-string to display.")
-
-(defvar tabbar-home-function nil
- "Function called when clicking on the tab bar home button.
-The function is passed the mouse event received.")
-
-(defvar tabbar-home-help-function nil
- "Function to obtain a help string for the tab bar home button.
-The help string is displayed when the mouse is onto the button.
-The function is called with no arguments.")
-
-(defvar tabbar-scroll-left-function 'tabbar-scroll-left
- "Function that scrolls tabs on left.
-The function is passed the mouse event received when clicking on the
-scroll left button. It should scroll the current tab set.")
-
-(defvar tabbar-scroll-left-help-function 'tabbar-scroll-left-help
- "Function to obtain a help string for the scroll left button.
-The help string is displayed when the mouse is onto the button.
-The function is called with no arguments.")
-
-(defvar tabbar-scroll-right-function 'tabbar-scroll-right
- "Function that scrolls tabs on right.
-The function is passed the mouse event received when clicking on the
-scroll right button. It should scroll the current tab set.")
-
-(defvar tabbar-scroll-right-help-function 'tabbar-scroll-right-help
- "Function to obtain a help string for the scroll right button.
-The help string is displayed when the mouse is onto the button.
-The function is called with no arguments.")
-
-;;; Misc.
-;;
-(eval-and-compile
- (defalias 'tabbar-display-update
- (if (fboundp 'force-window-update)
- #'(lambda () (force-window-update (selected-window)))
- 'force-mode-line-update)))
-
-(defsubst tabbar-click-p (event)
- "Return non-nil if EVENT is a mouse click event."
- (memq 'click (event-modifiers event)))
-
-(defun tabbar-shorten (str width)
- "Return a shortened string from STR that fits in the given display WIDTH.
-WIDTH is specified in terms of character display width in the current
-buffer; see also `char-width'. If STR display width is greater than
-WIDTH, STR is truncated and an ellipsis string \"...\" is inserted at
-end or in the middle of the returned string, depending on available
-room."
- (let* ((n (length str))
- (sw (string-width str))
- (el "...")
- (ew (string-width el))
- (w 0)
- (i 0))
- (cond
- ;; STR fit in WIDTH, return it.
- ((<= sw width)
- str)
- ;; There isn't enough room for the ellipsis, STR is just
- ;; truncated to fit in WIDTH.
- ((<= width ew)
- (while (< w width)
- (setq w (+ w (char-width (aref str i)))
- i (1+ i)))
- (substring str 0 i))
- ;; There isn't enough room to insert the ellipsis in the middle
- ;; of the truncated string, so put the ellipsis at end.
- ((zerop (setq sw (/ (- width ew) 2)))
- (setq width (- width ew))
- (while (< w width)
- (setq w (+ w (char-width (aref str i)))
- i (1+ i)))
- (concat (substring str 0 i) el))
- ;; Put the ellipsis in the middle of the truncated string.
- (t
- (while (< w sw)
- (setq w (+ w (char-width (aref str i)))
- i (1+ i)))
- (setq w (+ w ew))
- (while (< w width)
- (setq n (1- n)
- w (+ w (char-width (aref str n)))))
- (concat (substring str 0 i) el (substring str n)))
- )))
-
-;;; Tab and tab set
-;;
-(defsubst tabbar-make-tab (object tabset)
- "Return a new tab with value OBJECT.
-TABSET is the tab set the tab belongs to."
- (cons object tabset))
-
-(defsubst tabbar-tab-value (tab)
- "Return the value of tab TAB."
- (car tab))
-
-(defsubst tabbar-tab-tabset (tab)
- "Return the tab set TAB belongs to."
- (cdr tab))
-
-(defvar tabbar-tabsets nil
- "The tab sets store.")
-
-(defvar tabbar-tabsets-tabset nil
- "The special tab set of existing tab sets.")
-
-(defvar tabbar-current-tabset nil
- "The tab set currently displayed on the tab bar.")
-(make-variable-buffer-local 'tabbar-current-tabset)
-
-(defvar tabbar-init-hook nil
- "Hook run after tab bar data has been initialized.
-You should use this hook to initialize dependent data.")
-
-(defsubst tabbar-init-tabsets-store ()
- "Initialize the tab set store."
- (setq tabbar-tabsets (make-vector 31 0)
- tabbar-tabsets-tabset (make-symbol "tabbar-tabsets-tabset"))
- (put tabbar-tabsets-tabset 'start 0)
- (run-hooks 'tabbar-init-hook))
-
-(defvar tabbar-quit-hook nil
- "Hook run after tab bar data has been freed.
-You should use this hook to reset dependent data.")
-
-(defsubst tabbar-free-tabsets-store ()
- "Free the tab set store."
- (setq tabbar-tabsets nil
- tabbar-tabsets-tabset nil)
- (run-hooks 'tabbar-quit-hook))
-
-;; Define an "hygienic" function free of side effect between its local
-;; variables and those of the callee.
-(eval-and-compile
- (defalias 'tabbar-map-tabsets
- (let ((function (make-symbol "function"))
- (result (make-symbol "result"))
- (tabset (make-symbol "tabset")))
- `(lambda (,function)
- "Apply FUNCTION to each tab set, and make a list of the results.
-The result is a list just as long as the number of existing tab sets."
- (let (,result)
- (if tabbar-tabsets
- (mapatoms
- #'(lambda (,tabset)
- (push (funcall ,function ,tabset) ,result))
- tabbar-tabsets))
- ,result)))))
-
-(defun tabbar-make-tabset (name &rest objects)
- "Make a new tab set whose name is the string NAME.
-It is initialized with tabs build from the list of OBJECTS."
- (let* ((tabset (intern name tabbar-tabsets))
- (tabs (mapcar #'(lambda (object)
- (tabbar-make-tab object tabset))
- objects)))
- (set tabset tabs)
- (put tabset 'select (car tabs))
- (put tabset 'start 0)
- tabset))
-
-(defsubst tabbar-get-tabset (name)
- "Return the tab set whose name is the string NAME.
-Return nil if not found."
- (intern-soft name tabbar-tabsets))
-
-(defsubst tabbar-delete-tabset (tabset)
- "Delete the tab set TABSET.
-That is, remove it from the tab sets store."
- (unintern tabset tabbar-tabsets))
-
-(defsubst tabbar-tabs (tabset)
- "Return the list of tabs in TABSET."
- (symbol-value tabset))
-
-(defsubst tabbar-tab-values (tabset)
- "Return the list of tab values in TABSET."
- (mapcar 'tabbar-tab-value (tabbar-tabs tabset)))
-
-(defsubst tabbar-get-tab (object tabset)
- "Search for a tab with value OBJECT in TABSET.
-Return the tab found, or nil if not found."
- (assoc object (tabbar-tabs tabset)))
-
-(defsubst tabbar-member (tab tabset)
- "Return non-nil if TAB is in TABSET."
- (or (eq (tabbar-tab-tabset tab) tabset)
- (memq tab (tabbar-tabs tabset))))
-
-(defsubst tabbar-template (tabset)
- "Return the cached visual representation of TABSET.
-That is, a `header-line-format' template, or nil if the cache is
-empty."
- (get tabset 'template))
-
-(defsubst tabbar-set-template (tabset template)
- "Set the cached visual representation of TABSET to TEMPLATE.
-TEMPLATE must be a valid `header-line-format' template, or nil to
-cleanup the cache."
- (put tabset 'template template))
-
-(defsubst tabbar-selected-tab (tabset)
- "Return the tab selected in TABSET."
- (get tabset 'select))
-
-(defsubst tabbar-selected-value (tabset)
- "Return the value of the tab selected in TABSET."
- (tabbar-tab-value (tabbar-selected-tab tabset)))
-
-(defsubst tabbar-selected-p (tab tabset)
- "Return non-nil if TAB is the selected tab in TABSET."
- (eq tab (tabbar-selected-tab tabset)))
-
-(defsubst tabbar-modified-p (tab tabset)
- "Return non-nil if TAB is a modified tab in TABSET."
- (and (buffer-modified-p (tabbar-tab-value tab))
- (buffer-file-name (tabbar-tab-value tab))))
-
-(defvar tabbar--track-selected nil)
-
-(defsubst tabbar-select-tab (tab tabset)
- "Make TAB the selected tab in TABSET.
-Does nothing if TAB is not found in TABSET.
-Return TAB if selected, nil if not."
- (when (tabbar-member tab tabset)
- (unless (tabbar-selected-p tab tabset)
- (tabbar-set-template tabset nil)
- (setq tabbar--track-selected tabbar-auto-scroll-flag))
- (put tabset 'select tab)))
-
-(defsubst tabbar-select-tab-value (object tabset)
- "Make the tab with value OBJECT, the selected tab in TABSET.
-Does nothing if a tab with value OBJECT is not found in TABSET.
-Return the tab selected, or nil if nothing was selected."
- (tabbar-select-tab (tabbar-get-tab object tabset) tabset))
-
-(defsubst tabbar-start (tabset)
- "Return the index of the first visible tab in TABSET."
- (get tabset 'start))
-
-(defsubst tabbar-view (tabset)
- "Return the list of visible tabs in TABSET.
-That is, the sub-list of tabs starting at the first visible one."
- (nthcdr (tabbar-start tabset) (tabbar-tabs tabset)))
-
-(defun tabbar-add-tab (tabset object &optional append)
- "Add to TABSET a tab with value OBJECT if there isn't one there yet.
-If the tab is added, it is added at the beginning of the tab list,
-unless the optional argument APPEND is non-nil, in which case it is
-added at the end."
- (let ((tabs (tabbar-tabs tabset)))
- (if (tabbar-get-tab object tabset)
- tabs
- (let ((tab (tabbar-make-tab object tabset)))
- (tabbar-set-template tabset nil)
- (set tabset (if append
- (append tabs (list tab))
- (cons tab tabs)))))))
-
-(defun tabbar-delete-tab (tab)
- "Remove TAB from its tab set."
- (let* ((tabset (tabbar-tab-tabset tab))
- (tabs (tabbar-tabs tabset))
- (sel (eq tab (tabbar-selected-tab tabset)))
- (next (and sel (cdr (memq tab tabs)))))
- (tabbar-set-template tabset nil)
- (setq tabs (delq tab tabs))
- ;; When the selected tab is deleted, select the next one, if
- ;; available, or the last one otherwise.
- (and sel (tabbar-select-tab (car (or next (last tabs))) tabset))
- (set tabset tabs)))
-
-(defun tabbar-scroll (tabset count)
- "Scroll the visible tabs in TABSET of COUNT units.
-If COUNT is positive move the view on right. If COUNT is negative,
-move the view on left."
- (let ((start (min (max 0 (+ (tabbar-start tabset) count))
- (1- (length (tabbar-tabs tabset))))))
- (when (/= start (tabbar-start tabset))
- (tabbar-set-template tabset nil)
- (put tabset 'start start))))
-
-(defun tabbar-tab-next (tabset tab &optional before)
- "Search in TABSET for the tab after TAB.
-If optional argument BEFORE is non-nil, search for the tab before
-TAB. Return the tab found, or nil otherwise."
- (let* (last (tabs (tabbar-tabs tabset)))
- (while (and tabs (not (eq tab (car tabs))))
- (setq last (car tabs)
- tabs (cdr tabs)))
- (and tabs (if before last (nth 1 tabs)))))
-
-(defun tabbar-current-tabset (&optional update)
- "Return the tab set currently displayed on the tab bar.
-If optional argument UPDATE is non-nil, call the user defined function
-`tabbar-current-tabset-function' to obtain it. Otherwise return the
-current cached copy."
- (and update tabbar-current-tabset-function
- (setq tabbar-current-tabset
- (funcall tabbar-current-tabset-function)))
- tabbar-current-tabset)
-
-(defun tabbar-get-tabsets-tabset ()
- "Return the tab set of selected tabs in existing tab sets."
- (set tabbar-tabsets-tabset (tabbar-map-tabsets 'tabbar-selected-tab))
- (tabbar-scroll tabbar-tabsets-tabset 0)
- (tabbar-set-template tabbar-tabsets-tabset nil)
- tabbar-tabsets-tabset)
-
-;;; Faces
-;;
-(defface tabbar-default
- '(
- ;;(((class color grayscale) (background light))
- ;; :inherit variable-pitch
- ;; :height 0.8
- ;; :foreground "gray50"
- ;; :background "grey75"
- ;; )
- (((class color grayscale) (background dark))
- :inherit variable-pitch
- :height 0.8
- :foreground "grey75"
- :background "gray50"
- )
- (((class mono) (background light))
- :inherit variable-pitch
- :height 0.8
- :foreground "black"
- :background "white"
- )
- (((class mono) (background dark))
- :inherit variable-pitch
- :height 0.8
- :foreground "white"
- :background "black"
- )
- (t
- :inherit variable-pitch
- :height 0.8
- :foreground "gray50"
- :background "gray75"
- ))
- "Default face used in the tab bar."
- :group 'tabbar)
-
-(defface tabbar-unselected
- '((t
- :inherit tabbar-default
- :box (:line-width 1 :color "white" :style released-button)
- ))
- "Face used for unselected tabs."
- :group 'tabbar)
-
-(defface tabbar-selected
- '((t
- :inherit tabbar-default
- :box (:line-width 1 :color "white" :style pressed-button)
- :foreground "blue"
- ))
- "Face used for the selected tab."
- :group 'tabbar)
-
-(defface tabbar-modified
- '((t
- :inherit tabbar-default
- :box (:line-width 1 :color "white" :style released-button)
- :foreground "green"
- ))
- "Face used for unsaved tabs."
- :group 'tabbar)
-
-(defface tabbar-selected-modified
- '((t
- :inherit tabbar-default
- :box (:line-width 1 :color "white" :style released-button)
- :foreground "red"
- ))
- "Face used for unsaved and selected tabs."
- :group 'tabbar)
-
-(defface tabbar-highlight
- '((t
- :underline t
- ))
- "Face used to highlight a tab during mouse-overs."
- :group 'tabbar)
-
-(defface tabbar-separator
- '((t
- :inherit tabbar-default
- ))
- "Face used for separators between tabs."
- :group 'tabbar)
-
-(defface tabbar-button
- '((t
- :inherit tabbar-default
- :box (:line-width 1 :color "white" :style released-button)
- ))
- "Face used for tab bar buttons."
- :group 'tabbar)
-
-(defface tabbar-button-highlight
- '((t
- :inherit tabbar-default
- ))
- "Face used to highlight a button during mouse-overs."
- :group 'tabbar)
-
-(defcustom tabbar-background-color nil
- "*Background color of the tab bar.
-By default, use the background color specified for the
-`tabbar-default' face (or inherited from another face), or the
-background color of the `default' face otherwise."
- :group 'tabbar
- :type '(choice (const :tag "Default" nil)
- (color)))
-
-(defsubst tabbar-background-color ()
- "Return the background color of the tab bar."
- (or tabbar-background-color
- (let* ((face 'tabbar-default)
- (color (face-background face)))
- (while (null color)
- (or (facep (setq face (face-attribute face :inherit)))
- (setq face 'default))
- (setq color (face-background face)))
- color)))
-
-;;; Buttons and separator look and feel
-;;
-(defconst tabbar-button-widget
- '(cons
- (cons :tag "Enabled"
- (string)
- (repeat :tag "Image"
- :extra-offset 2
- (restricted-sexp :tag "Spec"
- :match-alternatives (listp))))
- (cons :tag "Disabled"
- (string)
- (repeat :tag "Image"
- :extra-offset 2
- (restricted-sexp :tag "Spec"
- :match-alternatives (listp))))
- )
- "Widget for editing a tab bar button.
-A button is specified as a pair (ENABLED-BUTTON . DISABLED-BUTTON),
-where ENABLED-BUTTON and DISABLED-BUTTON specify the value used when
-the button is respectively enabled and disabled. Each button value is
-a pair (STRING . IMAGE) where STRING is a string value, and IMAGE a
-list of image specifications.
-If IMAGE is non-nil, try to use that image, else use STRING.
-If only the ENABLED-BUTTON image is provided, a DISABLED-BUTTON image
-is derived from it.")
-
-;;; Home button
-;;
-(defvar tabbar-home-button-value nil
- "Value of the home button.")
-
-(defconst tabbar-home-button-enabled-image
- '((:type pbm :data "\
-P2 13 13 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0
-6 0 255 255 255 255 255 255 255 255 255 255 9 130 9 255 255 255 255
-255 255 255 255 255 255 26 130 26 255 255 255 255 255 255 255 0 9 26
-41 130 41 26 9 0 255 255 255 255 5 145 140 135 130 125 120 115 5 255
-255 255 255 0 9 26 41 130 41 26 9 0 255 255 255 255 255 255 255 26 130
-26 255 255 255 255 255 255 255 255 255 255 9 130 9 255 255 255 255 255
-255 255 255 255 255 0 6 0 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255
-"))
- "Default image for the enabled home button.")
-
-(defconst tabbar-home-button-disabled-image
- '((:type pbm :data "\
-P2 13 13 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 0 0 1 2 3 2 1 0 0 255 255 255 255 0 132 128 123 119 114 110
-106 0 255 255 255 255 0 0 1 2 3 2 1 0 0 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255
-"))
- "Default image for the disabled home button.")
-
-(defcustom tabbar-home-button
- (cons (cons "[o]" tabbar-home-button-enabled-image)
- (cons "[x]" tabbar-home-button-disabled-image))
- "The home button.
-The variable `tabbar-button-widget' gives details on this widget."
- :group 'tabbar
- :type tabbar-button-widget
- :set '(lambda (variable value)
- (custom-set-default variable value)
- ;; Schedule refresh of button value.
- (setq tabbar-home-button-value nil)))
-
-;;; Scroll left button
-;;
-(defvar tabbar-scroll-left-button-value nil
- "Value of the scroll left button.")
-
-(defconst tabbar-scroll-left-button-enabled-image
- '((:type pbm :data "\
-P2 13 13 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 128 16 48 255 255 255 255 255 255 255
-255 144 28 86 128 0 255 255 255 255 255 255 160 44 92 159 135 113 0
-255 255 255 255 160 44 97 165 144 129 120 117 0 255 255 176 44 98 175
-174 146 127 126 127 128 0 255 255 0 160 184 156 143 136 134 135 137
-138 0 255 255 176 32 67 144 146 144 145 146 148 149 0 255 255 255 255
-160 42 75 140 154 158 159 160 0 255 255 255 255 255 255 160 40 74 154
-170 171 0 255 255 255 255 255 255 255 255 160 41 82 163 0 255 255 255
-255 255 255 255 255 255 255 160 32 48 255 255 255 255 255 255 255 255
-255 255 255 255 255 255
-"))
- "Default image for the enabled scroll left button.
-A disabled button image will be automatically build from it.")
-
-(defcustom tabbar-scroll-left-button
- (cons (cons " <" tabbar-scroll-left-button-enabled-image)
- (cons " =" nil))
- "The scroll left button.
-The variable `tabbar-button-widget' gives details on this widget."
- :group 'tabbar
- :type tabbar-button-widget
- :set '(lambda (variable value)
- (custom-set-default variable value)
- ;; Schedule refresh of button value.
- (setq tabbar-scroll-left-button-value nil)))
-
-;;; Scroll right button
-;;
-(defvar tabbar-scroll-right-button-value nil
- "Value of the scroll right button.")
-
-(defconst tabbar-scroll-right-button-enabled-image
- '((:type pbm :data "\
-P2 13 13 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-48 32 160 255 255 255 255 255 255 255 255 255 255 44 161 71 32 160 255
-255 255 255 255 255 255 255 36 157 163 145 62 32 160 255 255 255 255
-255 255 30 128 133 137 142 124 50 32 160 255 255 255 255 29 120 121
-124 126 126 124 105 42 32 176 255 255 31 126 127 128 128 128 128 126
-124 89 32 255 255 33 134 135 136 137 137 138 119 49 32 176 255 255 34
-143 144 145 146 128 54 32 160 255 255 255 255 36 152 153 134 57 32 160
-255 255 255 255 255 255 38 141 60 32 160 255 255 255 255 255 255 255
-255 48 32 160 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255
-"))
- "Default image for the enabled scroll right button.
-A disabled button image will be automatically build from it.")
-
-(defcustom tabbar-scroll-right-button
- (cons (cons " >" tabbar-scroll-right-button-enabled-image)
- (cons " =" nil))
- "The scroll right button.
-The variable `tabbar-button-widget' gives details on this widget."
- :group 'tabbar
- :type tabbar-button-widget
- :set '(lambda (variable value)
- (custom-set-default variable value)
- ;; Schedule refresh of button value.
- (setq tabbar-scroll-right-button-value nil)))
-
-;;; Separator
-;;
-(defconst tabbar-separator-widget
- '(cons (choice (string)
- (number :tag "Space width" 0.2))
- (repeat :tag "Image"
- :extra-offset 2
- (restricted-sexp :tag "Spec"
- :match-alternatives (listp))))
- "Widget for editing a tab bar separator.
-A separator is specified as a pair (STRING-OR-WIDTH . IMAGE) where
-STRING-OR-WIDTH is a string value or a space width, and IMAGE a list
-of image specifications.
-If IMAGE is non-nil, try to use that image, else use STRING-OR-WIDTH.
-The value (\"\"), or (0) hide separators.")
-
-(defvar tabbar-separator-value nil
- "Value of the separator used between tabs.")
-
-(defcustom tabbar-separator (list 0.2)
- "Separator used between tabs.
-The variable `tabbar-separator-widget' gives details on this widget."
- :group 'tabbar
- :type tabbar-separator-widget
- :set '(lambda (variable value)
- (custom-set-default variable value)
- ;; Schedule refresh of separator value.
- (setq tabbar-separator-value nil)))
-
-;;; Images
-;;
-(defcustom tabbar-use-images t
- "*Non-nil means to try to use images in tab bar.
-That is for buttons and separators."
- :group 'tabbar
- :type 'boolean
- :set '(lambda (variable value)
- (custom-set-default variable value)
- ;; Schedule refresh of all buttons and separator values.
- (setq tabbar-separator-value nil
- tabbar-home-button-value nil
- tabbar-scroll-left-button-value nil
- tabbar-scroll-right-button-value nil)))
-
-;; the following cache only provides minor speed benefits
-;; but it may be a workaround for the close-tab/undo.png display issue
-(defvar tabbar-cached-image nil)
-(defvar tabbar-cached-spec nil)
-(defsubst tabbar-find-image (specs)
- "Find an image, choosing one of a list of image specifications.
-SPECS is a list of image specifications. See also `find-image'."
- (if (eq tabbar-cached-spec specs)
- tabbar-cached-image
- (when (and tabbar-use-images (display-images-p))
- (condition-case nil
- (prog1
- (setq tabbar-cached-image (find-image specs))
- (setq tabbar-cached-spec specs))
- (error nil)))))
-
-(defsubst tabbar-disable-image (image)
- "From IMAGE, return a new image which looks disabled."
- (setq image (copy-sequence image))
- (setcdr image (plist-put (cdr image) :conversion 'disabled))
- image)
-
-(defsubst tabbar-normalize-image (image &optional margin)
- "Make IMAGE centered and transparent.
-If optional MARGIN is non-nil, it must be a number of pixels to add as
-an extra margin around the image."
- (let ((plist (cdr image)))
- (or (plist-get plist :ascent)
- (setq plist (plist-put plist :ascent 'center)))
- (or (plist-get plist :mask)
- (setq plist (plist-put plist :mask '(heuristic t))))
- (or (not (natnump margin))
- (plist-get plist :margin)
- (plist-put plist :margin margin))
- (setcdr image plist))
- image)
-
-;;; Button keymaps and callbacks
-;;
-(defun tabbar-make-mouse-keymap (callback)
- "Return a keymap that call CALLBACK on mouse events.
-CALLBACK is passed the received mouse event."
- (let ((keymap (make-sparse-keymap)))
- ;; Pass mouse-1, mouse-2 and mouse-3 events to CALLBACK.
- (define-key keymap [header-line down-mouse-1] 'ignore)
- (define-key keymap [header-line mouse-1] callback)
- (define-key keymap [header-line down-mouse-2] 'ignore)
- (define-key keymap [header-line mouse-2] callback)
- (define-key keymap [header-line down-mouse-3] 'ignore)
- (define-key keymap [header-line mouse-3] callback)
- keymap))
-
-(defsubst tabbar-make-mouse-event (&optional type)
- "Return a mouse click event.
-Optional argument TYPE is a mouse-click event or one of the
-symbols `mouse-1', `mouse-2' or `mouse-3'.
-The default is `mouse-1'."
- (if (tabbar-click-p type)
- type
- (list (or (memq type '(mouse-2 mouse-3)) 'mouse-1)
- (or (event-start nil) ;; Emacs 21.4
- (list (selected-window) (point) '(0 . 0) 0)))))
-
-;;; Buttons
-;;
-(defconst tabbar-default-button-keymap
- (tabbar-make-mouse-keymap 'tabbar-select-button-callback)
- "Default keymap of a button.")
-
-(defun tabbar-help-on-button (window object position)
- "Return a help string or nil for none, for the button under the mouse.
-WINDOW is the window in which the help was found (unused).
-OBJECT is the button label under the mouse.
-POSITION is the position in that label.
-Call `tabbar-NAME-help-function' where NAME is the button name
-associated to OBJECT."
- (let* ((name (get-text-property position 'tabbar-button object))
- (funvar (and name
- (intern-soft (format "tabbar-%s-help-function"
- name)))))
- (and (symbol-value funvar)
- (funcall (symbol-value funvar)))))
-
-(defsubst tabbar-click-on-button (name &optional type)
- "Handle a mouse click event on button NAME.
-Call `tabbar-select-NAME-function' with the received, or simulated
-mouse click event.
-Optional argument TYPE is a mouse click event type (see the function
-`tabbar-make-mouse-event' for details)."
- (let ((funvar (intern-soft (format "tabbar-%s-function" name))))
- (when (symbol-value funvar)
- (funcall (symbol-value funvar) (tabbar-make-mouse-event type))
- (tabbar-display-update))))
-
-(defun tabbar-select-button-callback (event)
- "Handle a mouse EVENT on a button.
-Pass mouse click events on a button to `tabbar-click-on-button'."
- (interactive "@e")
- (when (tabbar-click-p event)
- (let ((target (posn-string (event-start event))))
- (tabbar-click-on-button
- (get-text-property (cdr target) 'tabbar-button (car target))
- event))))
-
-(defun tabbar-make-button-keymap (name)
- "Return a keymap to handle mouse click events on button NAME."
- (if (fboundp 'posn-string)
- tabbar-default-button-keymap
- (let ((event (make-symbol "event")))
- (tabbar-make-mouse-keymap
- `(lambda (,event)
- (interactive "@e")
- (and (tabbar-click-p ,event)
- (tabbar-click-on-button ',name ,event)))))))
-
-;;; Button callbacks
-;;
-(defun tabbar-scroll-left (event)
- "On mouse EVENT, scroll current tab set on left."
- (when (eq (event-basic-type event) 'mouse-1)
- (tabbar-scroll (tabbar-current-tabset) -1)))
-
-(defun tabbar-scroll-left-help ()
- "Help string shown when mouse is over the scroll left button."
- "mouse-1: scroll tabs left.")
-
-(defun tabbar-scroll-right (event)
- "On mouse EVENT, scroll current tab set on right."
- (when (eq (event-basic-type event) 'mouse-1)
- (tabbar-scroll (tabbar-current-tabset) 1)))
-
-(defun tabbar-scroll-right-help ()
- "Help string shown when mouse is over the scroll right button."
- "mouse-1: scroll tabs right.")
-
-;;; Tabs
-;;
-(defconst tabbar-default-tab-keymap
- (tabbar-make-mouse-keymap 'tabbar-select-tab-callback)
- "Default keymap of a tab.")
-
-(defun tabbar-help-on-tab (window object position)
- "Return a help string or nil for none, for the tab under the mouse.
-WINDOW is the window in which the help was found (unused).
-OBJECT is the tab label under the mouse.
-POSITION is the position in that label.
-Call `tabbar-help-on-tab-function' with the associated tab."
- (when tabbar-help-on-tab-function
- (let ((tab (get-text-property position 'tabbar-tab object)))
- (funcall tabbar-help-on-tab-function tab))))
-
-(defsubst tabbar-click-on-tab (tab &optional type)
- "Handle a mouse click event on tab TAB.
-Call `tabbar-select-tab-function' with the received, or simulated
-mouse click event, and TAB.
-Optional argument TYPE is a mouse click event type (see the function
-`tabbar-make-mouse-event' for details)."
- (when tabbar-select-tab-function
- (funcall tabbar-select-tab-function
- (tabbar-make-mouse-event type) tab)
- (tabbar-display-update)))
-
-(defun tabbar-select-tab-callback (event)
- "Handle a mouse EVENT on a tab.
-Pass mouse click events on a tab to `tabbar-click-on-tab'."
- (interactive "@e")
- (when (tabbar-click-p event)
- (let ((target (posn-string (event-start event))))
- (tabbar-click-on-tab
- (get-text-property (cdr target) 'tabbar-tab (car target))
- event))))
-
-(defun tabbar-make-tab-keymap (tab)
- "Return a keymap to handle mouse click events on TAB."
- (if (fboundp 'posn-string)
- tabbar-default-tab-keymap
- (let ((event (make-symbol "event")))
- (tabbar-make-mouse-keymap
- `(lambda (,event)
- (interactive "@e")
- (and (tabbar-click-p ,event)
- (tabbar-click-on-tab ',tab ,event)))))))
-
-;;; Tab bar construction
-;;
-(defun tabbar-button-label (name)
- "Return a label for button NAME.
-That is a pair (ENABLED . DISABLED), where ENABLED and DISABLED are
-respectively the appearance of the button when enabled and disabled.
-They are propertized strings which could display images, as specified
-by the variable `tabbar-NAME-button'."
- (let* ((btn (symbol-value
- (intern-soft (format "tabbar-%s-button" name))))
- (on (tabbar-find-image (cdar btn)))
- (off (and on (tabbar-find-image (cddr btn)))))
- (when on
- (tabbar-normalize-image on 1)
- (if off
- (tabbar-normalize-image off 1)
- ;; If there is no disabled button image, derive one from the
- ;; button enabled image.
- (setq off (tabbar-disable-image on))))
- (cons
- (propertize (or (caar btn) " ") 'display on)
- (propertize (or (cadr btn) " ") 'display off))))
-
-(defun tabbar-line-button (name)
- "Return the display representation of button NAME.
-That is, a propertized string used as an `header-line-format' template
-element."
- (let ((label (if tabbar-button-label-function
- (funcall tabbar-button-label-function name)
- (cons name name))))
- ;; Cache the display value of the enabled/disabled buttons in
- ;; variables `tabbar-NAME-button-value'.
- (set (intern (format "tabbar-%s-button-value" name))
- (cons
- (propertize (car label)
- 'tabbar-button name
- 'face 'tabbar-button
- 'mouse-face 'tabbar-button-highlight
- 'pointer 'hand
- 'local-map (tabbar-make-button-keymap name)
- 'help-echo 'tabbar-help-on-button)
- (propertize (cdr label)
- 'face 'tabbar-button
- 'pointer 'arrow)))))
-
-(defun tabbar-line-separator ()
- "Return the display representation of a tab bar separator.
-That is, a propertized string used as an `header-line-format' template
-element."
- (let ((image (tabbar-find-image (cdr tabbar-separator))))
- ;; Cache the separator display value in variable
- ;; `tabbar-separator-value'.
- (setq tabbar-separator-value
- (cond
- (image
- (propertize " "
- 'face 'tabbar-separator
- 'pointer 'arrow
- 'display (tabbar-normalize-image image)))
- ((numberp (car tabbar-separator))
- (propertize " "
- 'face 'tabbar-separator
- 'pointer 'arrow
- 'display (list 'space
- :width (car tabbar-separator))))
- ((propertize (or (car tabbar-separator) " ")
- 'face 'tabbar-separator
- 'pointer 'arrow))))
- ))
-
-(defsubst tabbar-line-buttons (tabset)
- "Return a list of propertized strings for tab bar buttons.
-TABSET is the tab set used to choose the appropriate buttons."
- (list
- (if tabbar-home-function
- (car tabbar-home-button-value)
- (cdr tabbar-home-button-value))
- (if (> (tabbar-start tabset) 0)
- (car tabbar-scroll-left-button-value)
- (cdr tabbar-scroll-left-button-value))
- (if (< (tabbar-start tabset)
- (1- (length (tabbar-tabs tabset))))
- (car tabbar-scroll-right-button-value)
- (cdr tabbar-scroll-right-button-value))
- tabbar-separator-value))
-
-(defsubst tabbar-line-tab (tab)
- "Return the display representation of tab TAB.
-That is, a propertized string used as an `header-line-format' template
-element.
-Call `tabbar-tab-label-function' to obtain a label for TAB."
- (concat (propertize
- (if tabbar-tab-label-function
- (funcall tabbar-tab-label-function tab)
- tab)
- 'tabbar-tab tab
- 'local-map (tabbar-make-tab-keymap tab)
- 'help-echo 'tabbar-help-on-tab
- 'mouse-face 'tabbar-highlight
- 'face (cond ((and (tabbar-selected-p tab (tabbar-current-tabset))
- (tabbar-modified-p tab (tabbar-current-tabset)))
- 'tabbar-selected-modified)
- ((tabbar-selected-p tab (tabbar-current-tabset))
- 'tabbar-selected)
- ((tabbar-modified-p tab (tabbar-current-tabset))
- 'tabbar-modified)
- (t 'tabbar-unselected))
- 'pointer 'hand)
- tabbar-separator-value))
-
-(defun tabbar-line-format (tabset)
- "Return the `header-line-format' value to display TABSET."
- (let* ((sel (tabbar-selected-tab tabset))
- (tabs (tabbar-view tabset))
- (padcolor (tabbar-background-color))
- atsel elts)
- ;; Initialize buttons and separator values.
- (or tabbar-separator-value
- (tabbar-line-separator))
- (or tabbar-home-button-value
- (tabbar-line-button 'home))
- (or tabbar-scroll-left-button-value
- (tabbar-line-button 'scroll-left))
- (or tabbar-scroll-right-button-value
- (tabbar-line-button 'scroll-right))
- ;; Track the selected tab to ensure it is always visible.
- (when tabbar--track-selected
- (while (not (memq sel tabs))
- (tabbar-scroll tabset -1)
- (setq tabs (tabbar-view tabset)))
- (while (and tabs (not atsel))
- (setq elts (cons (tabbar-line-tab (car tabs)) elts)
- atsel (eq (car tabs) sel)
- tabs (cdr tabs)))
- (setq elts (nreverse elts))
- ;; At this point the selected tab is the last elt in ELTS.
- ;; Scroll TABSET and ELTS until the selected tab becomes
- ;; visible.
- (with-temp-buffer
- (let ((truncate-partial-width-windows nil)
- (inhibit-modification-hooks t)
- deactivate-mark ;; Prevent deactivation of the mark!
- start)
- (setq truncate-lines nil
- buffer-undo-list t)
- (apply 'insert (tabbar-line-buttons tabset))
- (setq start (point))
- (while (and (cdr elts) ;; Always show the selected tab!
- (progn
- (delete-region start (point-max))
- (goto-char (point-max))
- (apply 'insert elts)
- (goto-char (point-min))
- (> (vertical-motion 1) 0)))
- (tabbar-scroll tabset 1)
- (setq elts (cdr elts)))))
- (setq elts (nreverse elts))
- (setq tabbar--track-selected nil))
- ;; Format remaining tabs.
- (while tabs
- (setq elts (cons (tabbar-line-tab (car tabs)) elts)
- tabs (cdr tabs)))
- ;; Cache and return the new tab bar.
- (tabbar-set-template
- tabset
- (list (tabbar-line-buttons tabset)
- (nreverse elts)
- (propertize "%-"
- 'face (list :background padcolor
- :foreground padcolor)
- 'pointer 'arrow)))
- ))
-
-(defun tabbar-line ()
- "Return the header line templates that represent the tab bar.
-Inhibit display of the tab bar in current window if any of the
-`tabbar-inhibit-functions' return non-nil."
- (cond
- ((run-hook-with-args-until-success 'tabbar-inhibit-functions)
- ;; Don't show the tab bar.
- (setq header-line-format nil))
- ((tabbar-current-tabset t)
- ;; When available, use a cached tab bar value, else recompute it.
- (or (tabbar-template tabbar-current-tabset)
- (tabbar-line-format tabbar-current-tabset)))))
-
-(defconst tabbar-header-line-format '(:eval (tabbar-line))
- "The tab bar header line format.")
-
-(defun tabbar-default-inhibit-function ()
- "Inhibit display of the tab bar in specified windows.
-That is dedicated windows, and `checkdoc' status windows."
- (or (window-dedicated-p (selected-window))
- (member (buffer-name)
- (list " *Checkdoc Status*"
- (if (boundp 'ispell-choices-buffer)
- ispell-choices-buffer
- "*Choices*")))))
-
-;;; Cyclic navigation through tabs
-;;
-(defun tabbar-cycle (&optional backward type)
- "Cycle to the next available tab.
-The scope of the cyclic navigation through tabs is specified by the
-option `tabbar-cycle-scope'.
-If optional argument BACKWARD is non-nil, cycle to the previous tab
-instead.
-Optional argument TYPE is a mouse event type (see the function
-`tabbar-make-mouse-event' for details)."
- (let* ((tabset (tabbar-current-tabset t))
- (ttabset (tabbar-get-tabsets-tabset))
- ;; If navigation through groups is requested, and there is
- ;; only one group, navigate through visible tabs.
- (cycle (if (and (eq tabbar-cycle-scope 'groups)
- (not (cdr (tabbar-tabs ttabset))))
- 'tabs
- tabbar-cycle-scope))
- selected tab)
- (when tabset
- (setq selected (tabbar-selected-tab tabset))
- (cond
- ;; Cycle through visible tabs only.
- ((eq cycle 'tabs)
- (setq tab (tabbar-tab-next tabset selected backward))
- ;; When there is no tab after/before the selected one, cycle
- ;; to the first/last visible tab.
- (unless tab
- (setq tabset (tabbar-tabs tabset)
- tab (car (if backward (last tabset) tabset))))
- )
- ;; Cycle through tab groups only.
- ((eq cycle 'groups)
- (setq tab (tabbar-tab-next ttabset selected backward))
- ;; When there is no group after/before the selected one, cycle
- ;; to the first/last available group.
- (unless tab
- (setq tabset (tabbar-tabs ttabset)
- tab (car (if backward (last tabset) tabset))))
- )
- (t
- ;; Cycle through visible tabs then tab groups.
- (setq tab (tabbar-tab-next tabset selected backward))
- ;; When there is no visible tab after/before the selected one,
- ;; cycle to the next/previous available group.
- (unless tab
- (setq tab (tabbar-tab-next ttabset selected backward))
- ;; When there is no next/previous group, cycle to the
- ;; first/last available group.
- (unless tab
- (setq tabset (tabbar-tabs ttabset)
- tab (car (if backward (last tabset) tabset))))
- ;; Select the first/last visible tab of the new group.
- (setq tabset (tabbar-tabs (tabbar-tab-tabset tab))
- tab (car (if backward (last tabset) tabset))))
- ))
- (tabbar-click-on-tab tab type))))
-
-;;;###autoload
-(defun tabbar-backward ()
- "Select the previous available tab.
-Depend on the setting of the option `tabbar-cycle-scope'."
- (interactive)
- (tabbar-cycle t))
-
-;;;###autoload
-(defun tabbar-forward ()
- "Select the next available tab.
-Depend on the setting of the option `tabbar-cycle-scope'."
- (interactive)
- (tabbar-cycle))
-
-;;;###autoload
-(defun tabbar-backward-group ()
- "Go to selected tab in the previous available group."
- (interactive)
- (let ((tabbar-cycle-scope 'groups))
- (tabbar-cycle t)))
-
-;;;###autoload
-(defun tabbar-forward-group ()
- "Go to selected tab in the next available group."
- (interactive)
- (let ((tabbar-cycle-scope 'groups))
- (tabbar-cycle)))
-
-;;;###autoload
-(defun tabbar-backward-tab ()
- "Select the previous visible tab."
- (interactive)
- (let ((tabbar-cycle-scope 'tabs))
- (tabbar-cycle t)))
-
-;;;###autoload
-(defun tabbar-forward-tab ()
- "Select the next visible tab."
- (interactive)
- (let ((tabbar-cycle-scope 'tabs))
- (tabbar-cycle)))
-
-;;; Button press commands
-;;
-(defsubst tabbar--mouse (number)
- "Return a mouse button symbol from NUMBER.
-That is mouse-2, or mouse-3 when NUMBER is respectively 2, or 3.
-Return mouse-1 otherwise."
- (cond ((eq number 2) 'mouse-2)
- ((eq number 3) 'mouse-3)
- ('mouse-1)))
-
-;;;###autoload
-(defun tabbar-press-home (&optional arg)
- "Press the tab bar home button.
-That is, simulate a mouse click on that button.
-A numeric prefix ARG value of 2, or 3, respectively simulates a
-mouse-2, or mouse-3 click. The default is a mouse-1 click."
- (interactive "p")
- (tabbar-click-on-button 'home (tabbar--mouse arg)))
-
-;;;###autoload
-(defun tabbar-press-scroll-left (&optional arg)
- "Press the tab bar scroll-left button.
-That is, simulate a mouse click on that button.
-A numeric prefix ARG value of 2, or 3, respectively simulates a
-mouse-2, or mouse-3 click. The default is a mouse-1 click."
- (interactive "p")
- (tabbar-click-on-button 'scroll-left (tabbar--mouse arg)))
-
-;;;###autoload
-(defun tabbar-press-scroll-right (&optional arg)
- "Press the tab bar scroll-right button.
-That is, simulate a mouse click on that button.
-A numeric prefix ARG value of 2, or 3, respectively simulates a
-mouse-2, or mouse-3 click. The default is a mouse-1 click."
- (interactive "p")
- (tabbar-click-on-button 'scroll-right (tabbar--mouse arg)))
-
-;;; Mouse-wheel support
-;;
-(require 'mwheel)
-
-;;; Compatibility
-;;
-(defconst tabbar--mwheel-up-event
- (symbol-value (if (boundp 'mouse-wheel-up-event)
- 'mouse-wheel-up-event
- 'mouse-wheel-up-button)))
-
-(defconst tabbar--mwheel-down-event
- (symbol-value (if (boundp 'mouse-wheel-down-event)
- 'mouse-wheel-down-event
- 'mouse-wheel-down-button)))
-
-(defsubst tabbar--mwheel-key (event-type)
- "Return a mouse wheel key symbol from EVENT-TYPE.
-When EVENT-TYPE is a symbol return it.
-When it is a button number, return symbol `mouse-<EVENT-TYPE>'."
- (if (symbolp event-type)
- event-type
- (intern (format "mouse-%s" event-type))))
-
-(defsubst tabbar--mwheel-up-p (event)
- "Return non-nil if EVENT is a mouse-wheel up event."
- (let ((x (event-basic-type event)))
- (if (eq 'mouse-wheel x)
- (< (car (cdr (cdr event))) 0) ;; Emacs 21.3
- ;; Emacs > 21.3
- (eq x tabbar--mwheel-up-event))))
-
-;;; Basic commands
-;;
-;;;###autoload
-(defun tabbar-mwheel-backward (event)
- "Select the previous available tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-backward'."
- (interactive "@e")
- (tabbar-cycle t event))
-
-;;;###autoload
-(defun tabbar-mwheel-forward (event)
- "Select the next available tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-forward'."
- (interactive "@e")
- (tabbar-cycle nil event))
-
-;;;###autoload
-(defun tabbar-mwheel-backward-group (event)
- "Go to selected tab in the previous available group.
-If there is only one group, select the previous visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-backward-group'."
- (interactive "@e")
- (let ((tabbar-cycle-scope 'groups))
- (tabbar-cycle t event)))
-
-;;;###autoload
-(defun tabbar-mwheel-forward-group (event)
- "Go to selected tab in the next available group.
-If there is only one group, select the next visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-forward-group'."
- (interactive "@e")
- (let ((tabbar-cycle-scope 'groups))
- (tabbar-cycle nil event)))
-
-;;;###autoload
-(defun tabbar-mwheel-backward-tab (event)
- "Select the previous visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-backward-tab'."
- (interactive "@e")
- (let ((tabbar-cycle-scope 'tabs))
- (tabbar-cycle t event)))
-
-;;;###autoload
-(defun tabbar-mwheel-forward-tab (event)
- "Select the next visible tab.
-EVENT is the mouse event that triggered this command.
-Mouse-enabled equivalent of the command `tabbar-forward-tab'."
- (interactive "@e")
- (let ((tabbar-cycle-scope 'tabs))
- (tabbar-cycle nil event)))
-
-;;; Wrappers when there is only one generic mouse-wheel event
-;;
-;;;###autoload
-(defun tabbar-mwheel-switch-tab (event)
- "Select the next or previous tab according to EVENT."
- (interactive "@e")
- (if (tabbar--mwheel-up-p event)
- (tabbar-mwheel-forward-tab event)
- (tabbar-mwheel-backward-tab event)))
-
-;;;###autoload
-(defun tabbar-mwheel-switch-group (event)
- "Select the next or previous group of tabs according to EVENT."
- (interactive "@e")
- (if (tabbar--mwheel-up-p event)
- (tabbar-mwheel-forward-group event)
- (tabbar-mwheel-backward-group event)))
-
-;;; Minor modes
-;;
-(defsubst tabbar-mode-on-p ()
- "Return non-nil if Tabbar mode is on."
- (eq (default-value 'header-line-format)
- tabbar-header-line-format))
-
-;;; Tabbar-Local mode
-;;
-(defvar tabbar--local-hlf nil)
-
-;;;###autoload
-(define-minor-mode tabbar-local-mode
- "Toggle local display of the tab bar.
-With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled.
-When turned on, if a local header line is shown, it is hidden to show
-the tab bar. The tab bar is locally hidden otherwise. When turned
-off, if a local header line is hidden or the tab bar is locally
-hidden, it is shown again. Signal an error if Tabbar mode is off."
- :group 'tabbar
- :global nil
- (unless (tabbar-mode-on-p)
- (error "Tabbar mode must be enabled"))
-;;; ON
- (if tabbar-local-mode
- (if (and (local-variable-p 'header-line-format)
- header-line-format)
- ;; A local header line exists, hide it to show the tab bar.
- (progn
- ;; Fail in case of an inconsistency because another local
- ;; header line is already hidden.
- (when (local-variable-p 'tabbar--local-hlf)
- (error "Another local header line is already hidden"))
- (set (make-local-variable 'tabbar--local-hlf)
- header-line-format)
- (kill-local-variable 'header-line-format))
- ;; Otherwise hide the tab bar in this buffer.
- (setq header-line-format nil))
-;;; OFF
- (if (local-variable-p 'tabbar--local-hlf)
- ;; A local header line is hidden, show it again.
- (progn
- (setq header-line-format tabbar--local-hlf)
- (kill-local-variable 'tabbar--local-hlf))
- ;; The tab bar is locally hidden, show it again.
- (kill-local-variable 'header-line-format))))
-
-;;; Tabbar mode
-;;
-(defvar tabbar-prefix-key [(control ?c)]
- "The common prefix key used in Tabbar mode.")
-
-(defvar tabbar-prefix-map
- (let ((km (make-sparse-keymap)))
- (define-key km [(control home)] 'tabbar-press-home)
- (define-key km [(control left)] 'tabbar-backward)
- (define-key km [(control right)] 'tabbar-forward)
- (define-key km [(control up)] 'tabbar-backward-group)
- (define-key km [(control down)] 'tabbar-forward-group)
- (define-key km [(control prior)] 'tabbar-press-scroll-left)
- (define-key km [(control next)] 'tabbar-press-scroll-right)
- (define-key km [(control f10)] 'tabbar-local-mode)
- km)
- "The key bindings provided in Tabbar mode.")
-
-(defvar tabbar-mode-map
- (let ((km (make-sparse-keymap)))
- (define-key km tabbar-prefix-key tabbar-prefix-map)
- km)
- "Keymap to use in Tabbar mode.")
-
-(defvar tabbar--global-hlf nil)
-
-;;;###autoload
-(define-minor-mode tabbar-mode
- "Toggle display of a tab bar in the header line.
-With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled.
-
-\\{tabbar-mode-map}"
- :group 'tabbar
- :require 'tabbar
- :global t
- :keymap tabbar-mode-map
- (if tabbar-mode
-;;; ON
- (unless (tabbar-mode-on-p)
- ;; Save current default value of `header-line-format'.
- (setq tabbar--global-hlf (default-value 'header-line-format))
- (tabbar-init-tabsets-store)
- (setq-default header-line-format tabbar-header-line-format)
- (if (fboundp 'tabbar-define-access-keys) (tabbar-define-access-keys)))
-;;; OFF
- (when (tabbar-mode-on-p)
- ;; Turn off Tabbar-Local mode globally.
- (mapc #'(lambda (b)
- (condition-case nil
- (with-current-buffer b
- (and tabbar-local-mode
- (tabbar-local-mode -1)))
- (error nil)))
- (buffer-list))
- ;; Restore previous `header-line-format'.
- (setq-default header-line-format tabbar--global-hlf)
- (tabbar-free-tabsets-store))
- ))
-
-;;; Tabbar-Mwheel mode
-;;
-(defvar tabbar-mwheel-mode-map
- (let ((km (make-sparse-keymap)))
- (if (get 'mouse-wheel 'event-symbol-elements)
- ;; Use one generic mouse wheel event
- (define-key km [A-mouse-wheel]
- 'tabbar-mwheel-switch-group)
- ;; Use separate up/down mouse wheel events
- (let ((up (tabbar--mwheel-key tabbar--mwheel-up-event))
- (down (tabbar--mwheel-key tabbar--mwheel-down-event)))
- (define-key km `[header-line ,down]
- 'tabbar-mwheel-backward-group)
- (define-key km `[header-line ,up]
- 'tabbar-mwheel-forward-group)
- (define-key km `[header-line (control ,down)]
- 'tabbar-mwheel-backward-tab)
- (define-key km `[header-line (control ,up)]
- 'tabbar-mwheel-forward-tab)
- (define-key km `[header-line (shift ,down)]
- 'tabbar-mwheel-backward)
- (define-key km `[header-line (shift ,up)]
- 'tabbar-mwheel-forward)
- ))
- km)
- "Keymap to use in Tabbar-Mwheel mode.")
-
-;;;###autoload
-(define-minor-mode tabbar-mwheel-mode
- "Toggle use of the mouse wheel to navigate through tabs or groups.
-With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled.
-
-\\{tabbar-mwheel-mode-map}"
- :group 'tabbar
- :require 'tabbar
- :global t
- :keymap tabbar-mwheel-mode-map
- (when tabbar-mwheel-mode
- (unless (and (boundp 'mouse-wheel-mode)
- mouse-wheel-mode
- tabbar-mode)
- (tabbar-mwheel-mode -1))))
-
-(defun tabbar-mwheel-follow ()
- "Toggle Tabbar-Mwheel following Tabbar and Mouse-Wheel modes."
- (if (boundp 'mouse-wheel-mode)
- (tabbar-mwheel-mode (if (and mouse-wheel-mode tabbar-mode) 1 -1))))
-
-(add-hook 'tabbar-mode-hook 'tabbar-mwheel-follow)
-(add-hook 'mouse-wheel-mode-hook 'tabbar-mwheel-follow)
-
-;;; Buffer tabs
-;;
-(defgroup tabbar-buffer nil
- "Display buffers in the tab bar."
- :group 'tabbar)
-
-(defcustom tabbar-buffer-home-button
- (cons (cons "[+]" tabbar-home-button-enabled-image)
- (cons "[-]" tabbar-home-button-disabled-image))
- "The home button displayed when showing buffer tabs.
-The enabled button value is displayed when showing tabs for groups of
-buffers, and the disabled button value is displayed when showing
-buffer tabs.
-The variable `tabbar-button-widget' gives details on this widget."
- :group 'tabbar-buffer
- :type tabbar-button-widget
- :set '(lambda (variable value)
- (custom-set-default variable value)
- ;; Schedule refresh of button value.
- (setq tabbar-home-button-value nil)))
-
-(defvar tabbar-buffer-list-function 'tabbar-buffer-list
- "Function that returns the list of buffers to show in tabs.
-That function is called with no arguments and must return a list of
-buffers.")
-
-(defvar tabbar-buffer-groups-function 'tabbar-buffer-groups
- "Function that gives the group names the current buffer belongs to.
-It must return a list of group names, or nil if the buffer has no
-group. Notice that it is better that a buffer belongs to one group.")
-
-(defun tabbar-buffer-list ()
- "Return the list of buffers to show in tabs.
-Exclude buffers whose name starts with a space, when they are not
-visiting a file. The current buffer is always included."
- (delq nil
- (mapcar #'(lambda (b)
- (cond
- ;; Always include the current buffer.
- ((eq (current-buffer) b) b)
- ((buffer-file-name b) b)
- ((char-equal ?\ (aref (buffer-name b) 0)) nil)
- ((buffer-live-p b) b)))
- (buffer-list))))
-
-(defun tabbar-buffer-mode-derived-p (mode parents)
- "Return non-nil if MODE derives from a mode in PARENTS."
- (let (derived)
- (while (and (not derived) mode)
- (if (memq mode parents)
- (setq derived t)
- (setq mode (get mode 'derived-mode-parent))))
- derived))
-
-(defun tabbar-buffer-groups ()
- "Return the list of group names the current buffer belongs to.
-Return a list of one element based on major mode."
- (list
- (cond
- ((or (get-buffer-process (current-buffer))
- ;; Check if the major mode derives from `comint-mode' or
- ;; `compilation-mode'.
- (tabbar-buffer-mode-derived-p
- major-mode '(comint-mode compilation-mode)))
- "Process"
- )
- ((member (buffer-name)
- '("*scratch*" "*Messages*"))
- "Common"
- )
- ((eq major-mode 'dired-mode)
- "Dired"
- )
- ((memq major-mode
- '(help-mode apropos-mode Info-mode Man-mode))
- "Help"
- )
- ((memq major-mode
- '(rmail-mode
- rmail-edit-mode vm-summary-mode vm-mode mail-mode
- mh-letter-mode mh-show-mode mh-folder-mode
- gnus-summary-mode message-mode gnus-group-mode
- gnus-article-mode score-mode gnus-browse-killed-mode))
- "Mail"
- )
- (t
- ;; Return `mode-name' if not blank, `major-mode' otherwise.
- (if (and (stringp mode-name)
- ;; Take care of preserving the match-data because this
- ;; function is called when updating the header line.
- (save-match-data (string-match "[^ ]" mode-name)))
- mode-name
- (symbol-name major-mode))
- ))))
-
-;;; Group buffers in tab sets.
-;;
-(defvar tabbar--buffers nil)
-
-(defun tabbar-buffer-update-groups ()
- "Update tab sets from groups of existing buffers.
-Return the the first group where the current buffer is."
- (let ((bl (sort
- (mapcar
- ;; for each buffer, create list: buffer, buffer name, groups-list
- ;; sort on buffer name; store to bl (buffer list)
- #'(lambda (b)
- (with-current-buffer b
- (list (current-buffer)
- (buffer-name)
- (if tabbar-buffer-groups-function
- (funcall tabbar-buffer-groups-function)
- '("Common")))))
- (and tabbar-buffer-list-function
- (funcall tabbar-buffer-list-function)))
- #'(lambda (e1 e2)
- (string-lessp (nth 1 e1) (nth 1 e2))))))
- ;; If the cache has changed, update the tab sets.
- (unless (equal bl tabbar--buffers)
- ;; Add new buffers, or update changed ones.
- (dolist (e bl) ;; loop through buffer list
- (dolist (g (nth 2 e)) ;; for each member of groups-list for current buffer
- (let ((tabset (tabbar-get-tabset g))) ;; get group from group name
- (if tabset ;; if group exists
- ;; check if current buffer is same as any cached buffer
- ;; (search buffer list for matching buffer)
- (unless (equal e (assq (car e) tabbar--buffers)) ;; if not,...
- ;; This is a new buffer, or a previously existing
- ;; buffer that has been renamed, or moved to another
- ;; group. Update the tab set, and the display.
- (tabbar-add-tab tabset (car e) t) ;; add to end of tabset
- (tabbar-set-template tabset nil))
- ;;if tabset doesn't exist, make a new tabset with this buffer
- (tabbar-make-tabset g (car e))))))
- ;; Remove tabs for buffers not found in cache or moved to other
- ;; groups, and remove empty tabsets.
- (mapc 'tabbar-delete-tabset ;; delete each tabset named in following list:
- (tabbar-map-tabsets ;; apply following function to each tabset:
- #'(lambda (tabset)
- (dolist (tab (tabbar-tabs tabset)) ;; for each tab in tabset
- (let ((e (assq (tabbar-tab-value tab) bl))) ;; get buffer
- (or (and e (memq tabset ;; skip if buffer exists and tabset is a member of groups-list for this buffer
- (mapcar 'tabbar-get-tabset
- (nth 2 e))))
- (tabbar-delete-tab tab)))) ;; else remove tab from this set
- ;; Return empty tab sets
- (unless (tabbar-tabs tabset)
- tabset)))) ;; return list of tabsets, replacing non-empties with nil
- ;; The new cache becomes the current one.
- (setq tabbar--buffers bl)))
- ;; Return the first group the current buffer belongs to.
- (car (nth 2 (assq (current-buffer) tabbar--buffers))))
-
-;;; Tab bar callbacks
-;;
-(defvar tabbar--buffer-show-groups nil)
-
-(defsubst tabbar-buffer-show-groups (flag)
- "Set display of tabs for groups of buffers to FLAG."
- (setq tabbar--buffer-show-groups flag
- ;; Redisplay the home button.
- tabbar-home-button-value nil))
-
-(defun tabbar-buffer-tabs ()
- "Return the buffers to display on the tab bar, in a tab set."
- (let ((tabset (tabbar-get-tabset (tabbar-buffer-update-groups))))
- (tabbar-select-tab-value (current-buffer) tabset)
- (when tabbar--buffer-show-groups
- (setq tabset (tabbar-get-tabsets-tabset))
- (tabbar-select-tab-value (current-buffer) tabset))
- tabset))
-
-(defun tabbar-buffer-button-label (name)
- "Return a label for button NAME.
-That is a pair (ENABLED . DISABLED), where ENABLED and DISABLED are
-respectively the appearance of the button when enabled and disabled.
-They are propertized strings which could display images, as specified
-by the variable `tabbar-button-label'.
-When NAME is 'home, return a different ENABLED button if showing tabs
-or groups. Call the function `tabbar-button-label' otherwise."
- (let ((lab (tabbar-button-label name)))
- (when (eq name 'home)
- (let* ((btn tabbar-buffer-home-button)
- (on (tabbar-find-image (cdar btn)))
- (off (tabbar-find-image (cddr btn))))
- ;; When `tabbar-buffer-home-button' does not provide a value,
- ;; default to the enabled value of `tabbar-home-button'.
- (if on
- (tabbar-normalize-image on 1)
- (setq on (get-text-property 0 'display (car lab))))
- (if off
- (tabbar-normalize-image off 1)
- (setq off (get-text-property 0 'display (car lab))))
- (setcar lab
- (if tabbar--buffer-show-groups
- (propertize (or (caar btn) (car lab)) 'display on)
- (propertize (or (cadr btn) (car lab)) 'display off)))
- ))
- lab))
-
-(defun tabbar-buffer-tab-label (tab)
- "Return a label for TAB.
-That is, a string used to represent it on the tab bar."
- (let ((label (if tabbar--buffer-show-groups
- (format "[%s]" (tabbar-tab-tabset tab))
- (format "%s" (tabbar-tab-value tab)))))
- ;; Unless the tab bar auto scrolls to keep the selected tab
- ;; visible, shorten the tab label to keep as many tabs as possible
- ;; in the visible area of the tab bar.
- (if tabbar-auto-scroll-flag
- label
- (tabbar-shorten
- label (max 1 (/ (window-width)
- (length (tabbar-view
- (tabbar-current-tabset)))))))))
-
-(defun tabbar-buffer-help-on-tab (tab)
- "Return the help string shown when mouse is onto TAB."
- (if tabbar--buffer-show-groups
- (let* ((tabset (tabbar-tab-tabset tab))
- (tab (tabbar-selected-tab tabset)))
- (format "mouse-1: switch to buffer %S in group [%s]"
- (buffer-name (tabbar-tab-value tab)) tabset))
- (format "mouse-1: switch to buffer %S\n\
-mouse-2: pop to buffer, mouse-3: delete other windows"
- (buffer-name (tabbar-tab-value tab)))
- ))
-
-(defun tabbar-buffer-select-tab (event tab)
- "On mouse EVENT, select TAB."
- (let ((mouse-button (event-basic-type event))
- (buffer (tabbar-tab-value tab)))
- (cond
- ((eq mouse-button 'mouse-2)
- (pop-to-buffer buffer t))
- ((eq mouse-button 'mouse-3)
- (delete-other-windows))
- (t
- (switch-to-buffer buffer)))
- ;; Don't show groups.
- (tabbar-buffer-show-groups nil)
- ))
-
-(defun tabbar-buffer-click-on-home (event)
- "Handle a mouse click EVENT on the tab bar home button.
-mouse-1, toggle the display of tabs for groups of buffers.
-mouse-3, close the current buffer."
- (let ((mouse-button (event-basic-type event)))
- (cond
- ((eq mouse-button 'mouse-1)
- (tabbar-buffer-show-groups (not tabbar--buffer-show-groups)))
- ((eq mouse-button 'mouse-3)
- (kill-buffer nil))
- )))
-
-(defun tabbar-buffer-help-on-home ()
- "Return the help string shown when mouse is onto the toggle button."
- (concat
- (if tabbar--buffer-show-groups
- "mouse-1: show buffers in selected group"
- "mouse-1: show groups of buffers")
- ", mouse-3: close current buffer"))
-
-(defun tabbar-buffer-track-killed ()
- "Hook run just before actually killing a buffer.
-In Tabbar mode, try to switch to a buffer in the current tab bar,
-after the current buffer has been killed. Try first the buffer in tab
-after the current one, then the buffer in tab before. On success, put
-the sibling buffer in front of the buffer list, so it will be selected
-first."
- (and (eq header-line-format tabbar-header-line-format)
- (eq tabbar-current-tabset-function 'tabbar-buffer-tabs)
- (eq (current-buffer) (window-buffer (selected-window)))
- (let ((bl (tabbar-tab-values (tabbar-current-tabset)))
- (b (current-buffer))
- found sibling)
- (while (and bl (not found))
- (if (eq b (car bl))
- (setq found t)
- (setq sibling (car bl)))
- (setq bl (cdr bl)))
- (when (and (setq sibling (or (car bl) sibling))
- (buffer-live-p sibling))
- ;; Move sibling buffer in front of the buffer list.
- (save-current-buffer
- (switch-to-buffer sibling))))))
-
-;;; Tab bar buffer setup
-;;
-(defun tabbar-buffer-init ()
- "Initialize tab bar buffer data.
-Run as `tabbar-init-hook'."
- (setq tabbar--buffers nil
- tabbar--buffer-show-groups nil
- tabbar-current-tabset-function 'tabbar-buffer-tabs
- tabbar-tab-label-function 'tabbar-buffer-tab-label
- tabbar-select-tab-function 'tabbar-buffer-select-tab
- tabbar-help-on-tab-function 'tabbar-buffer-help-on-tab
- tabbar-button-label-function 'tabbar-buffer-button-label
- tabbar-home-function 'tabbar-buffer-click-on-home
- tabbar-home-help-function 'tabbar-buffer-help-on-home
- )
- (add-hook 'kill-buffer-hook 'tabbar-buffer-track-killed))
-
-(defun tabbar-buffer-quit ()
- "Quit tab bar buffer.
-Run as `tabbar-quit-hook'."
- (setq tabbar--buffers nil
- tabbar--buffer-show-groups nil
- tabbar-current-tabset-function nil
- tabbar-tab-label-function nil
- tabbar-select-tab-function nil
- tabbar-help-on-tab-function nil
- tabbar-button-label-function nil
- tabbar-home-function nil
- tabbar-home-help-function nil
- )
- (remove-hook 'kill-buffer-hook 'tabbar-buffer-track-killed))
-
-(add-hook 'tabbar-init-hook 'tabbar-buffer-init)
-(add-hook 'tabbar-quit-hook 'tabbar-buffer-quit)
-
-(provide 'tabbar)
-
-(run-hooks 'tabbar-load-hook)
-
-;;; tabbar.el ends here
diff --git a/elpa/tabbar-20180726.1735/up.png b/elpa/tabbar-20180726.1735/up.png
deleted file mode 100644
index 87aeab0..0000000
--- a/elpa/tabbar-20180726.1735/up.png
+++ /dev/null
Binary files differ
diff --git a/elpa/tabbar-ruler-20160802.307/dir b/elpa/tabbar-ruler-20160802.307/dir
deleted file mode 100644
index 24f6a4d..0000000
--- a/elpa/tabbar-ruler-20160802.307/dir
+++ /dev/null
@@ -1,19 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "?" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs lisp libraries
-* tabbar-ruler: (tabbar-ruler). Changes tabbar setup to be similar to
- Aquaemacs.
diff --git a/elpa/tabbar-ruler-20160802.307/tabbar-ruler-autoloads.el b/elpa/tabbar-ruler-20160802.307/tabbar-ruler-autoloads.el
deleted file mode 100644
index 3b56f03..0000000
--- a/elpa/tabbar-ruler-20160802.307/tabbar-ruler-autoloads.el
+++ /dev/null
@@ -1,52 +0,0 @@
-;;; tabbar-ruler-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "tabbar-ruler" "tabbar-ruler.el" (0 0 0 0))
-;;; Generated autoloads from tabbar-ruler.el
-
-(autoload 'tabbar-install-faces "tabbar-ruler" "\
-Install faces for a FRAME.
-
-\(fn &optional FRAME)" t nil)
-
-(autoload 'tabbar-ruler-up "tabbar-ruler" "\
-Tabbar press up key.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tabbar-ruler-forward "tabbar-ruler" "\
-Forward ruler. Takes into consideration if the home-key was pressed.
-This is based on the variable `tabbar--buffer-show-groups'
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tabbar-ruler-backward "tabbar-ruler" "\
-Backward ruler. Takes into consideration if the home-key was pressed.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tabbar-ruler-move "tabbar-ruler" "\
-Start the movement for the tabbar
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "tabbar-ruler" '("tabbar-" "after-modifying-buffer" "on-" "last-tabbar-ruler-tabbar-buffer-groups" "mode-icon-unknown")))
-
-;;;***
-
-;;;### (autoloads nil nil ("tabbar-ruler-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; tabbar-ruler-autoloads.el ends here
diff --git a/elpa/tabbar-ruler-20160802.307/tabbar-ruler-pkg.el b/elpa/tabbar-ruler-20160802.307/tabbar-ruler-pkg.el
deleted file mode 100644
index dcf9b2d..0000000
--- a/elpa/tabbar-ruler-20160802.307/tabbar-ruler-pkg.el
+++ /dev/null
@@ -1,15 +0,0 @@
-(define-package "tabbar-ruler" "20160802.307" "Pretty tabbar, autohide, use both tabbar/ruler"
- '((tabbar "2.0.1")
- (powerline "2.3")
- (mode-icons "0.4.0")
- (cl-lib "0.5"))
- :commit "535568189aa12a3eff7f977d2783e57b6a65ab6a" :keywords
- '("tabbar" "ruler mode" "menu" "tool bar.")
- :authors
- '(("Matthew Fidler, Ta Quang Trung, Nathaniel Cunningham"))
- :maintainer
- '("Matthew L. Fidler")
- :url "http://github.com/mlf176f2/tabbar-ruler.el")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/tabbar-ruler-20160802.307/tabbar-ruler.el b/elpa/tabbar-ruler-20160802.307/tabbar-ruler.el
deleted file mode 100644
index 20323cf..0000000
--- a/elpa/tabbar-ruler-20160802.307/tabbar-ruler.el
+++ /dev/null
@@ -1,2150 +0,0 @@
-;;; tabbar-ruler.el --- Pretty tabbar, autohide, use both tabbar/ruler
-;;
-;; Filename: tabbar-ruler.el
-;; Description: Changes tabbar setup to be similar to Aquaemacs.
-;; Author: Matthew Fidler, Ta Quang Trung, Nathaniel Cunningham
-;; Maintainer: Matthew L. Fidler
-;; Created: Mon Oct 18 17:06:07 2010 (-0500)
-;; Version: 0.45
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800)
-;; By: Matthew L. Fidler
-;; Update #: 663
-;; URL: http://github.com/mlf176f2/tabbar-ruler.el
-;; Keywords: Tabbar, Ruler Mode, Menu, Tool Bar.
-;; Compatibility: Windows Emacs 23.x
-;; Package-Requires: ((tabbar "2.0.1") (powerline "2.3") (mode-icons "0.4.0") (cl-lib "0.5"))
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Commentary:
-;;
-;; * Introduction
-;; Tabbar ruler is an Emacs package that allows both the tabbar and the
-;; ruler to be used together. In addition it allows auto-hiding of the
-;; menu-bar and tool-bar.
-;;
-;;
-;; Tabbar appearance based on reverse engineering Aquaemacs code and
-;; changing to my preferences, and Emacs Wiki.
-;;
-;; Tabbar/Ruler integration is new. Tabbar should be active on mouse
-;; move. Ruler should be active on self-insert commands.
-;;
-;; Also allows auto-hiding of toolbar and menu.
-;;
-;; To use this, put the library in your load path and use
-;;
-;;
-;; (setq tabbar-ruler-global-tabbar t) ; If you want tabbar
-;; (setq tabbar-ruler-global-ruler t) ; if you want a global ruler
-;; (setq tabbar-ruler-popup-menu t) ; If you want a popup menu.
-;; (setq tabbar-ruler-popup-toolbar t) ; If you want a popup toolbar
-;; (setq tabbar-ruler-popup-scrollbar t) ; If you want to only show the
-;; ; scroll bar when your mouse is moving.
-;; (require 'tabbar-ruler)
-;;
-;;
-;;
-;;
-;; * Changing how tabbar groups files/buffers
-;; The default behavior for tabbar-ruler is to group the tabs by frame.
-;; You can change this back to the old-behavior by:
-;;
-;; (tabbar-ruler-group-buffer-groups)
-;;
-;; or by issuing the following code:
-;;
-;;
-;; (setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
-;;
-;;
-;; In addition, you can also group by projectile project easily by:
-;;
-;;
-;; (tabbar-ruler-group-by-projectile-project)
-;;
-;; * Adding key-bindings to tabbar-ruler
-;; You can add key-bindings to change the current tab. The easiest way
-;; to add the bindings is to add a key like:
-;;
-;;
-;; (global-set-key (kbd "C-c t") 'tabbar-ruler-move)
-;;
-;;
-;; After that, all you would need to press is Control+c t and then the
-;; arrow keys will allow you to change the buffer quite easily. To exit
-;; the buffer movement you can press enter or space.
-;;
-;; * Known issues
-;; the left arrow is text instead of an image.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Change Log:
-;; 13-Sep-2014 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Version bump
-;; 1-Jul-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Fix variable misspecification
-;; 28-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Fixed strange org-readme issue
-;; 28-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Tue Oct 19 15:37:53 2010 (-0500) (us041375) #663 (Matthew L. Fidler)
-;; Added popup scrollbarbar
-;; 27-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Added autoload for tabbar-install-faces. That way ergoemacs and other
-;; packages can load the tabbar-ruler by just calling (tabbar-install-faces)
-;; 6-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Added left-char and right char to tabbar-ruler-move-keymap so that
-;; keybindings in emacs 24.3 work correctly.
-;; 6-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Changed movement commands. The movement commands are simpler (in my opinion)
-;; 4-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Change package description. Fixed the documentation to actually
-;; change to the old tabbar method of grouping buffers.
-;; 4-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Turn off ruler mode in the next buffer (if necessary)
-;; 4-Jun-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Add movement keys. Also add toggles for different groupings.
-;; 1-May-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Try to address issue #4
-;; 1-May-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Changed the modified font to italics. Made the modified symbol
-;; customizable, but off by default. Should address issue #5.
-;; 5-Apr-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Trying to update upstream sources.
-;; 5-Apr-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Fixed speed issues on windows. It wasn't a redraw that was causing
-;; the speed issues, it was the constant recreation of the right-click
-;; menus...
-;; 27-Mar-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Fixed typo to fix issue #2.
-;; 27-Mar-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Attempt to fix issue #2. Whenever the color is not a string, assume
-;; that it should be transparent. I'm unsure if the mac osx puts the
-;; translated color to a string. However, it seems that the undefined
-;; should be the same as transparent. Therefore, this fix *should* work...
-;; 20-Mar-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Add inverse video option for unselected tabbar. Made it the default.
-;; has better contrast between the selected and unselected tabs.
-;; 20-Mar-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Changed emacs 24.3 to support the times character. Also removed
-;; starred documentation strings.
-;; 20-Mar-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Emacs 24.3 had an error when using ucs-insert. Added fallbacks so
-;; that this works when ucs-insert does not work.
-;; 20-Feb-2013 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Changed so that the separators do not need to be fancy images. I
-;; found that when the separators were images, it slowed down emacs on
-;; windows. Therefore, the fancy images are disabled by default. This
-;; also includes the stylized close symbols.
-;; 19-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Added back popup-menu
-;; 19-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Upload to marmalade
-;; 19-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Changed slope. Made the background color the default background color
-;; if unspecified. Made tabbar-hex-color return "None" if not defined
-;; 15-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Made sure that the tabbr-ruler-separator-image is at least 17 pixels high
-;; 15-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-;; Attempt to fix another bug on load
-;; 14-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Fixed tabbar ruler so that it loads cold.
-;; 14-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Memoized the tabbar images to speed things up
-;; 14-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Mat`'thew L. Fidler)
-;; Upload to Marmalade
-;; 14-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Fancy tabs
-;; 13-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Added Bug fix for coloring. Made the selected tab match the default
-;; color in the buffer. Everything else is grayed out.
-;; 10-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Took out a statement that may fix the left-scrolling bug?
-;; 10-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Added package-menu-mode to the excluded tabbar-ruler fight modes.
-;; 07-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Will no longer take over editing of org source blocks or info blocks.
-;; 07-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Changed the order of checking so that helm will work when you move a mouse.
-;; 07-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Now works with Helm. Should fix issue #1
-;; 06-Dec-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 09:02:56 2012 (-0600) #659 (Matthew L. Fidler)
-;; Now colors are based on loaded theme (from minibar). Also added
-;; bug-fix for setting tabbar colors every time a frame opens. Also
-;; added a bug fix for right-clicking a frame that is not associated with
-;; a buffer.
-;; 1-Mar-2012 Matthew L. Fidler
-;; Last-Updated: Thu Mar 1 08:38:09 2012 (-0600) #656 (Matthew L. Fidler)
-;; Will not change tool-bar-mode in Mac. It causes some funny
-;; things to happen.
-;; 9-Feb-2012 Matthew L. Fidler
-;; Last-Updated: Thu Feb 9 19:18:21 2012 (-0600) #651 (Matthew L. Fidler)
-;; Will not change the menu bar in a Mac. Its always there.
-;; 14-Jan-2012 Matthew L. Fidler
-;; Last-Updated: Sat Jan 14 21:58:51 2012 (-0600) #648 (Matthew L. Fidler)
-;; Added more commands that trigger the ruler.
-;; 14-Jan-2012 Matthew L. Fidler
-;; Last-Updated: Sat Jan 14 21:44:32 2012 (-0600) #641 (Matthew L. Fidler)
-;; Added more ruler commands. It works a bit better
-;; now. Additionally I have changed the ep- to tabbar-ruler-.
-;; 14-Jan-2012 Matthew L. Fidler
-;; Last-Updated: Tue Feb 8 15:01:27 2011 (-0600) #639 (Matthew L. Fidler)
-;; Changed EmacsPortable to tabbar-ruler
-;; 08-Feb-2011 Matthew L. Fidler
-;; Last-Updated: Tue Feb 8 14:59:57 2011 (-0600) #638 (Matthew L. Fidler)
-;; Added ELPA tags.
-;; 08-Feb-2011 Matthew L. Fidler
-;; Last-Updated: Tue Feb 8 12:47:09 2011 (-0600) #604 (Matthew L. Fidler)
-;; Removed xpm dependencies. Now no images are required, they are built by the library.
-;; 04-Dec-2010 Matthew L. Fidler
-;; Last-Updated: Sat Dec 4 16:27:07 2010 (-0600) #551 (Matthew L. Fidler)
-;; Added context menu.
-;; 01-Dec-2010 Matthew L. Fidler
-;; Last-Updated: Wed Dec 1 15:26:37 2010 (-0600) #341 (Matthew L. Fidler)
-;; Added scratch buffers to list.
-;; 04-Nov-2010
-;; Last-Updated: Thu Nov 4 09:39:14 2010 (-0500) (us041375)
-;; Made tabbar mode default.
-;; 02-Nov-2010 Matthew L. Fidler
-;; Last-Updated: Tue Nov 2 10:14:12 2010 (-0500) (Matthew L. Fidler)
-;; Make post-command-hook handle errors gracefully.
-;; 20-Oct-2010 Matthew L. Fidler
-;; Last-Updated: Tue Oct 19 15:37:53 2010 (-0500) (us041375)
-;;
-;; Changed behavior when outside the window to assume the last
-;; known mouse position. This fixes the two problems below.
-;;
-;; 20-Oct-2010 Matthew L. Fidler
-;; Last-Updated: Tue Oct 19 15:37:53 2010 (-0500) (us041375)
-;;
-;; As it turns out when the toolbar is hidden when the mouse is
-;; outside of the emacs window, it also hides when navigating the
-;; menu. Switching behavior back.
-;;
-;; 20-Oct-2010 Matthew L. Fidler
-;; Last-Updated: Tue Oct 19 15:37:53 2010 (-0500) (us041375)
-;; Made popup menu and toolbar be hidden when mouse is oustide of emacs window.
-;; 20-Oct-2010 Matthew L. Fidler
-;; Last-Updated: Tue Oct 19 15:37:53 2010 (-0500) (us041375)
-;; Changed to popup ruler-mode if tabbar and ruler are not displayed.
-;; 19-Oct-2010 Matthew L. Fidler
-;; Last-Updated: Tue Oct 19 15:37:53 2010 (-0500) (us041375)
-;; Changed tabbar, menu, toolbar and ruler variables to be buffer
-;; or frame local.
-;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; 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, 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 this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
-;; Floor, Boston, MA 02110-1301, USA.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Code:
-
-(add-to-list 'load-path (file-name-directory (or load-file-name (buffer-file-name))))
-
-(require 'cl-lib)
-(require 'tabbar)
-(require 'easymenu)
-(require 'powerline nil t)
-(require 'mode-icons nil t)
-
-(defgroup tabbar-ruler nil
- "Pretty tabbar, autohide, use both tabbar/ruler."
- :group 'tabbar)
-
-(defcustom tabbar-ruler-global-tabbar t
- "Should tabbar-ruler have a global tabbar?"
- :type 'boolean
- :group 'tabbar-ruler)
-(defcustom tabbar-ruler-global-ruler nil
- "Should tabbar-ruler have a global ruler?"
- :type 'boolean
- :group 'tabbar-ruler)
-(defcustom tabbar-ruler-popup-menu nil
- "Should tabbar-ruler have a popup menu. As mouse moves toward top of window, the menu pops up."
- :type 'boolean
- :group 'tabbar-ruler)
-(defcustom tabbar-ruler-popup-toolbar nil
- "Should tabbar-ruler have a popup toolbar. As mouse moves toward top of window, the toolbar pops up."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-popup-scrollbar nil
- "Should tabbas-ruler have popup scrollbar. As mouse moves, the scroll-bar pops up. Otherwise the sroll-bar is turned off."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-popup-menu-min-y 5 ;
- "Minimum number of pixels from the top before a menu/toolbar pops up."
- :type 'integer
- :group 'tabbar-ruler)
-(defcustom tabbar-ruler-popup-menu-min-y-leave 50
- "Minimum number of pixels form the top before a menu/toolbar disappears."
- :type 'integer
- :group 'tabbar-ruler)
-(defcustom tabbar-ruler-do-not-switch-on-ruler-when-tabbar-is-on-y 75
- "Minimum number of pixels to switch on ruler when tabbar is on."
- :type 'integer
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-excluded-buffers '("*Messages*" "*Completions*" "*ESS*" "*Packages*" "*log-edit-files*" "*helm-mini*" "*helm-mode-describe-variable*")
- "Excluded buffers in tabbar."
- :type '(repeat (string :tag "Buffer Name"))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-fight-igore-modes '(info-mode helm-mode package-menu-mode)
- "Exclude these mode when changing between tabbar and ruler."
- :type '(repeat (symbol :tag "Major Mode"))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-use-mode-icons t
- "Use mode icons for tabbar-ruler."
- :type '(choice
- (const :tag "No" nil)
- (const :tag "If enabled" if-enabled)
- (const :tag "Always" t))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-recolor-inactive-icons t
- "Recolor inactive icons for `mode-icons' icons."
- :type '(choice
- (const :tag "No" nil)
- (const :tag "If enabled" if-enabled)
- (const :tag "Always" t))
- :group 'tabbar-ruler)
-
-(when tabbar-ruler-use-mode-icons
- (require 'mode-icons nil t)
- (if (fboundp #'mode-icons-mode)
- (mode-icons-mode)
- (warn "Cannot start mode-icons-mode, icons will be missing from tabs.")))
-
-(defcustom tabbar-ruler-mode-icon-for-unknown-modes nil
- "Use mode icons for unknown modes."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-fancy-tab-separator nil
- "Separate each tab with a fancy generated image."
- :type '(choice
- (const :tag "Text" nil)
- (const :tag "Alternate" alternate)
- (const :tag "arrow" arrow)
- (const :tag "arrow-fade" arrow-fade)
- (const :tag "bar" bar)
- (const :tag "box" box)
- (const :tag "brace" brace)
- (const :tag "butt" butt)
- (const :tag "chamfer" chamfer)
- (const :tag "contour" contour)
- (const :tag "curve" curve)
- (const :tag "rounded" rounded)
- (const :tag "roundstub" roundstub)
- (const :tag "slant" slant)
- (const :tag "wave" wave)
- (const :tag "zigzag" zigzag))
- :group 'tabbar-ruler)
-
-
-(defcustom tabbar-ruler-fancy-current-tab-separator 'inherit
- "The current tab can have a different separator."
- :type '(choice
- (const :tag "Inherit" inherit)
- (const :tag "Text" nil)
- (const :tag "Alternate" alternate)
- (const :tag "arrow" arrow)
- (const :tag "arrow-fade" arrow-fade)
- (const :tag "bar" bar)
- (const :tag "box" box)
- (const :tag "brace" brace)
- (const :tag "butt" butt)
- (const :tag "chamfer" chamfer)
- (const :tag "contour" contour)
- (const :tag "curve" curve)
- (const :tag "rounded" rounded)
- (const :tag "roundstub" roundstub)
- (const :tag "slant" slant)
- (const :tag "wave" wave)
- (const :tag "zigzag" zigzag))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-tab-padding 2
- "Separate each tab with this padding.
-This is only enabled whin `tabbar-ruler-fancy-tab-separator' is non-nil"
- :type '(choice
- (const :tag "No padding" nil)
- (integer :tag "Padding in pixels"))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-padding-face nil
- "Color/Face of padding."
- :type '(choice
- (face :tag "Face")
- (const :tag "Background color" nil)
- (color :tag "Color"))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-pad-selected t
- "Pad selected tab."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-tab-height 25
- "Height for tabbar-ruler's separations."
- :type '(choice
- (const :tag "Height of Text" nil)
- (integer :tag "Overriding Height"))
- :group 'tabbar-ruler)
-
-
-(defcustom tabbar-ruler-fancy-close-image nil
- "Use an image for the close."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-movement-timer-delay 0.1
- "Timer delay for `tabbar-ruler-movement-timer'."
- :type 'number
- :group 'tabbar-ruler)
-
-(defvar tabbar-close-tab-function nil
- "Function to call to close a tabbar tab.
-
-Passed a single argument, the tab construct to be closed.")
-
-(defvar tabbar-new-tab-function nil
- "Function to call to create a new buffer in tabbar-mode.
-
-Optional single argument is the MODE for the new buffer.")
-
-(defvar tabbar-last-tab nil)
-(defvar tabbar-ruler-keep-tabbar nil)
-
-
-(defvar mode-icon-unknown
- "/* XPM */
-static char * c:\tmp\emacs_xpm[] = {
-\"16 16 103 2\",
-\" c None\",
-\". c #707070\",
-\"+ c #717171\",
-\"@ c #727272\",
-\"# c #6C6C6C\",
-\"$ c #696969\",
-\"% c #6E6E6E\",
-\"& c #7C7C7C\",
-\"* c #858585\",
-\"= c #969696\",
-\"- c #A3A3A3\",
-\"; c #A7A7A7\",
-\"> c #9A9A9A\",
-\", c #747474\",
-\"' c #838383\",
-\") c #A5A5A5\",
-\"! c #ACACAC\",
-\"~ c #A8A8A8\",
-\"{ c #A9A9A9\",
-\"] c #B0B0B0\",
-\"^ c #C5C5C5\",
-\"/ c #F5F5F5\",
-\"( c #D8D8D8\",
-\"_ c #777777\",
-\": c #C6C6C6\",
-\"< c #F7F7F7\",
-\"[ c #F1F1F1\",
-\"} c #F2F2F2\",
-\"| c #ECECEC\",
-\"1 c #E4E4E4\",
-\"2 c #DEDEDE\",
-\"3 c #F4F4F4\",
-\"4 c #FBFBFB\",
-\"5 c #8F8F8F\",
-\"6 c #6B6B6B\",
-\"7 c #AFAFAF\",
-\"8 c #F3F3F3\",
-\"9 c #E8E8E8\",
-\"0 c #C4C4C4\",
-\"a c #CCCCCC\",
-\"b c #D3D3D3\",
-\"c c #B7B7B7\",
-\"d c #737373\",
-\"e c #757575\",
-\"f c #828282\",
-\"g c #909090\",
-\"h c #C3C3C3\",
-\"i c #EEEEEE\",
-\"j c #BDBDBD\",
-\"k c #A1A1A1\",
-\"l c #979797\",
-\"m c #888888\",
-\"n c #8B8B8B\",
-\"o c #959595\",
-\"p c #BCBCBC\",
-\"q c #E6E6E6\",
-\"r c #C7C7C7\",
-\"s c #8A8A8A\",
-\"t c #818181\",
-\"u c #7A7A7A\",
-\"v c #BABABA\",
-\"w c #D1D1D1\",
-\"x c #DBDBDB\",
-\"y c #D7D7D7\",
-\"z c #DCDCDC\",
-\"A c #F0F0F0\",
-\"B c #7E7E7E\",
-\"C c #6F6F6F\",
-\"D c #A2A2A2\",
-\"E c #F6F6F6\",
-\"F c #EBEBEB\",
-\"G c #D0D0D0\",
-\"H c #BEBEBE\",
-\"I c #BFBFBF\",
-\"J c #A6A6A6\",
-\"K c #7D7D7D\",
-\"L c #787878\",
-\"M c #6D6D6D\",
-\"N c #D2D2D2\",
-\"O c #8C8C8C\",
-\"P c #868686\",
-\"Q c #878787\",
-\"R c #848484\",
-\"S c #C2C2C2\",
-\"T c #7F7F7F\",
-\"U c #949494\",
-\"V c #8D8D8D\",
-\"W c #C0C0C0\",
-\"X c #EDEDED\",
-\"Y c #E0E0E0\",
-\"Z c #9C9C9C\",
-\"` c #939393\",
-\" . c #8E8E8E\",
-\".. c #767676\",
-\"+. c #E9E9E9\",
-\"@. c #E5E5E5\",
-\"#. c #D6D6D6\",
-\"$. c #9D9D9D\",
-\"%. c #B8B8B8\",
-\"&. c #D5D5D5\",
-\"*. c #FFFFFF\",
-\"=. c #929292\",
-\"-. c #B1B1B1\",
-\" . + @ . # $ \",
-\" + % . & * = - ; > , \",
-\" + . ' ) ! ~ { ] ^ / ( _ \",
-\" @ @ @ : < [ } | 1 2 3 4 5 6 \",
-\" @ , & 7 8 9 0 0 : a b c _ . \",
-\"d d e f g h i j k k l m _ , @ + \",
-\"d , . _ n o p q r l s t u e d @ \",
-\", . 5 v w x y z A w g B u e , @ \",
-\"C D / E / F G h H I J K L e , d \",
-\"M I E 8 N O ' P Q * t & _ e e d \",
-\"@ R ( 3 S T P g U U V R u e e d \",
-\" + t W X Y j { Z ` .s f .., \",
-\" ..d + Z w +.X @.#.p $.T e , \",
-\" e u s D %.0 &.< *.F P @ \",
-\" _ ' =.k ! -.7 - ... \",
-\" @ + + + . C \"};
-")
-
-(defun tabbar-popup-menu ()
- "Keymap for pop-up menu. Emacs only."
- `(,(format "%s" (nth 0 tabbar-last-tab))
- ["Buffer Indirect Clone" tabbar-popup-clone-indirect-buffer]
- "--"
- ["Close" tabbar-popup-close]
- ["Close all buffers with same extension" tabbar-popup-close-ext]
- ["Close all BUT this" tabbar-popup-close-but]
- "--"
- ["Save" tabbar-popup-save]
- ["Save As" tabbar-popup-save-as]
- "--"
- ["Rename File" tabbar-popup-rename
- :active (and (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab))))]
- ["Delete File" tabbar-popup-delete
- :active (and (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab))))]
- "--"
- ["Copy full path" tabbar-popup-copy-path
- :active (and (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab))))
- ]
- ["Copy directory path" tabbar-popup-copy-dir
- :active (and (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab))))
- ]
- ["Copy file-name" tabbar-popup-copy-file
- :active (and (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab))))
- ]
- ["Copy buffer name" tabbar-popup-buffer-name]
- "--"
- ["Gzip File" tabbar-popup-gz
- :active (and (executable-find "gzip")
- (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab)))
- (not (string-match "\\.gz\\(?:~\\|\\.~[0-9]+~\\)?\\'" (buffer-file-name (tabbar-tab-value tabbar-last-tab)))))]
- ["Bzip File" tabbar-popup-bz2
- :active (and (executable-find "bzip2")
- (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab)))
- (not (string-match "\\.bz2\\(?:~\\|\\.~[0-9]+~\\)?\\'" (buffer-file-name (tabbar-tab-value tabbar-last-tab)))))]
- ["Xzip File" tabbar-popup-xz
- :active (and (executable-find "xz")
- (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab)))
- (not (string-match "\\.xz\\(?:~\\|\\.~[0-9]+~\\)?\\'" (buffer-file-name (tabbar-tab-value tabbar-last-tab)))))]
- ["Decompress File" tabbar-popup-decompress
- :active (and
- (buffer-file-name (tabbar-tab-value tabbar-last-tab))
- (file-exists-p (buffer-file-name (tabbar-tab-value tabbar-last-tab)))
- (string-match "\\(?:\\.\\(?:Z\\|gz\\|bz2\\|tbz2?\\|tgz\\|svgz\\|sifz\\|xz\\|dz\\)\\)\\(\\(?:~\\|\\.~[0-9]+~\\)?\\)\\'"
- (buffer-file-name (tabbar-tab-value tabbar-last-tab))))
- ]
- ;; "--"
- ;; ["Print" tabbar-popup-print]
- ))
-
-(defun tabbar-popup-print ()
- "Print buffer."
- (interactive))
-
-(defun tabbar-popup-clone-indirect-buffer ()
- "Tabbar pop up clone indirect-buffer."
- (interactive)
- (let ((buffer (tabbar-tab-value tabbar-last-tab)))
- (with-current-buffer buffer
- (call-interactively 'clone-indirect-buffer))))
-
-(defun tabbar-popup-close ()
- "Tabbar pop up close."
- (interactive)
- (funcall tabbar-close-tab-function tabbar-last-tab))
-
-(defun tabbar-popup-close-but ()
- "Tabbar close all BUT this buffer."
- (interactive)
- (let ((cur (symbol-value (funcall tabbar-current-tabset-function))))
- (mapc (lambda(tab)
- (unless (eq tab tabbar-last-tab)
- (funcall tabbar-close-tab-function tab)))
- cur)))
-
-(defun tabbar-popup-close-ext ()
- "Tabbar close everything with the tabbaset same extension as the current."
- (interactive)
- (let ((cur (symbol-value (funcall tabbar-current-tabset-function)))
- (ext (concat (regexp-quote (file-name-extension (buffer-name (car tabbar-last-tab)) t)) "$")))
- (mapc (lambda(tab)
- (when (string-match-p ext (buffer-name (car tab)))
- (funcall tabbar-close-tab-function tab)))
- cur)))
-
-(defun tabbar-popup-save-as ()
- "Tabbar save as."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab)))
- (with-current-buffer buf
- (call-interactively 'write-file))))
-
-(defun tabbar-popup-rename ()
- "Tabbar rename."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-file-name buf)))
- (with-current-buffer buf
- (when (call-interactively 'write-file)
- (if (string= fn (buffer-file-name (current-buffer)))
- (error "Buffer has same name. Just saved instead.")
- (delete-file fn))))))
-
-(defun tabbar-popup-delete ()
- "Tabbar delete file."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-file-name buf)))
- (when (yes-or-no-p (format "Are you sure you want to delete %s?" buf))
- (with-current-buffer buf
- (set-buffer-modified-p nil)
- (kill-buffer (current-buffer))
- (delete-file fn)))))
-
-
-(defun tabbar-popup-copy-path ()
- "Tabbar copy path."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-file-name buf)))
- (kill-new fn)))
-
-
-(defun tabbar-popup-buffer-name ()
- "Tab-bar copy buffer name"
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-name buf)))
- (kill-new fn)))
-
-
-(defun tabbar-popup-copy-file ()
- "Tabbar copy file name."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-file-name buf)))
- (kill-new (file-name-nondirectory fn))))
-
-
-(defun tabbar-popup-copy-dir ()
- "Tabbar copy directory."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-file-name buf)))
- (kill-new (file-name-directory fn))))
-
-(defun tabbar-popup-remove-compression-ext (file-name &optional new-compression)
- "Remove compression extension, and possibly add a new extension.
-
-FILE-NAME is the initial file-name.
-
-NEW-COMPRESSION is the new compression extension. If nil, the compression extesion is removed."
- (let ((ret file-name))
- (when (string-match "\\(\\(?:\\.\\(?:Z\\|gz\\|bz2\\|tbz2?\\|tgz\\|svgz\\|sifz\\|xz\\|dz\\)\\)?\\)\\(\\(?:~\\|\\.~[0-9]+~\\)?\\)\\'" ret)
- (setq ret (replace-match (concat (or new-compression "") (match-string 2 ret)) t t ret)))
- (symbol-value 'ret)))
-
-(defun tabbar-popup-gz (&optional ext err)
- "Gzip the file.
-
-EXT is the extension to remove, which defaults to \".gz\".
-
-ERR is a custom error string. Otherwise, the error is assumed to
-be \"Could not gzip the file!\"."
- (interactive)
- (let* ((buf (tabbar-tab-value tabbar-last-tab))
- (fn (buffer-file-name buf))
- (nfn (tabbar-popup-remove-compression-ext fn (or ext ".gz"))))
- (if (string= fn nfn)
- (error "Already has that compression!")
- (with-current-buffer buf
- (write-file nfn)
- (if (not (file-exists-p nfn))
- (error "%s" (or err "Could not gzip file!"))
- (when (file-exists-p fn)
- (delete-file fn)))))))
-
-(defun tabbar-popup-bz2 ()
- "Bzip file."
- (interactive)
- (tabbar-popup-gz ".bz2" "Could not bzip the file!"))
-
-(defun tabbar-popup-xz ()
- "Xzip file."
- (interactive)
- (tabbar-popup-gz ".xz" "Could not xzip the file!"))
-
-(defun tabbar-popup-decompress ()
- "Decompress file."
- (interactive)
- (tabbar-popup-gz "" "Could not decompress the file!"))
-
-(defun tabbar-context-menu ()
- "Pop up a context menu."
- (interactive)
- (popup-menu (tabbar-popup-menu)))
-
-
-(defun tabbar-hex-color (color)
- "Gets the hexadecimal value of a COLOR."
- (let ((ret color))
- (cond
- ((not (eq (type-of color) 'string))
- (setq ret "None"))
- ((string= "#" (substring color 0 1))
- (setq ret (upcase ret)))
- ((color-defined-p color)
- (setq ret (concat "#"
- (mapconcat
- (lambda(val)
- (format "%02X" (* val 255)))
- (color-name-to-rgb color) ""))))
- (t (setq ret "None")))
- (symbol-value 'ret)))
-
-(defcustom tabbar-ruler-swap-faces nil
- "Swap the selected / unselected tab colors."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-invert-deselected t
- "Invert deselected tabs."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-modified-symbol nil
- "Add modified symbol in addition to changing the face."
- :type 'boolean
- :group 'tabbar-ruler)
-
-
-(defcustom tabbar-ruler-style nil
- "Style of tabbar ruler."
- :type '(choice
- (const :tag "Let variables decide" nil)
- (const :tag "Text-mode tabbar" 'text)
- (const :tag "Firefox style" 'firefox)
- (const :tag "Firefox with circle close" 'firefox-circle))
- :group 'tabbar-ruler)
-
-(defcustom tabbar-ruler-use-variable-pitch t
- "Use variable pich font.
-
-This copies the :family and :foundry from the `variable-pitch' face."
- :type 'boolean
- :group 'tabbar-ruler)
-
-(defun tabbar-diff-face-p (face)
- "Is FACE customized?"
- (and (facep face)
- (or (and (custom-facep face)
- (or (get face 'saved-value)
- (get face 'saved-face)
- (get face 'saved-face-comment)))
- (ignore-errors (not (eq (default-value face) face))))))
-
-(defun tabbar-ruler-style-firefox (&optional frame)
- "Setup firefox style for FRAME."
- (setq tabbar-ruler-tab-padding 1
- tabbar-ruler-pad-selected nil
- tabbar-ruler-padding-face (tabbar-foreground 'tabbar-default)
- tabbar-ruler-fancy-current-tab-separator 'wave
- tabbar-ruler-fancy-tab-separator 'bar
- tabbar-ruler-fancy-close-image nil)
- (dolist (face '(tabbar-button
- tabbar-separator
- tabbar-unselected
- tabbar-unselected-highlight
- tabbar-unselected-modified))
- (unless (tabbar-diff-face-p face)
- (set-face-attribute face frame
- :background (tabbar-background 'tabbar-default)
- :foreground (tabbar-foreground 'tabbar-default))))
- (dolist (face '(tabbar-button
- tabbar-separator
- tabbar-selected
- tabbar-selected-highlight
- tabbar-selected-modified
- tabbar-unselected
- tabbar-unselected-highlight
- tabbar-unselected-modified))
- (unless (tabbar-diff-face-p face)
- (set-face-attribute face frame
- :height 100))))
-
-(defun tabbar-ruler-style-firefox-circle (&optional frame)
- "Setup firefox with closed image for FRAME."
- (tabbar-ruler-style-firefox)
- (setq tabbar-ruler-fancy-close-image t))
-
-(defun tabbar-ruler-style-text (&optional frame)
- "Setup text style."
- (setq tabbar-ruler-tab-padding nil
- tabbar-ruler-pad-selected nil
- tabbar-ruler-padding-face nil
- tabbar-ruler-fancy-current-tab-separator 'inherit
- tabbar-ruler-fancy-tab-separator nil
- tabbar-ruler-fancy-close-image nil))
-
-;;;###autoload
-(defun tabbar-install-faces (&optional frame)
- "Install faces for a FRAME."
- (interactive)
- (copy-face 'mode-line 'tabbar-default frame)
- (if tabbar-ruler-swap-faces
- (progn
- (copy-face 'default 'tabbar-selected frame)
- (copy-face 'shadow 'tabbar-unselected frame)
- (if tabbar-ruler-invert-deselected
- (unless (tabbar-diff-face-p 'tabbar-selected)
- (copy-face 'tabbar-selected 'tabbar-unselected)
- (set-face-attribute 'tabbar-selected frame)
- (invert-face 'tabbar-selected))
- (unless (tabbar-diff-face-p 'tabbar-selected)
- (set-face-attribute 'tabbar-selected frame
- :inherit 'mode-line-buffer-id
- :background (face-attribute 'mode-line-inactive :background))))
- (unless (tabbar-diff-face-p 'tabbar-unselected-highlight)
- (copy-face 'mode-line-buffer-id 'tabbar-unselected-highlight frame))
- (unless (tabbar-diff-face-p 'tabbar-selected-highlight)
- (copy-face 'mode-line-inactive 'tabbar-selected-highlight frame)))
- (unless (tabbar-diff-face-p 'tabbar-selected)
- (copy-face 'default 'tabbar-selected frame))
- (unless (tabbar-diff-face-p 'tabbar-unselected)
- (copy-face 'shadow 'tabbar-unselected frame))
-
- (if tabbar-ruler-invert-deselected
- (unless (tabbar-diff-face-p 'tabbar-unselected)
- (copy-face 'tabbar-selected 'tabbar-unselected)
- (set-face-attribute 'tabbar-unselected frame)
- (invert-face 'tabbar-unselected))
- (unless (tabbar-diff-face-p 'tabbar-unselected)
- (set-face-attribute 'tabbar-unselected frame
- :inherit 'mode-line-buffer-id
- :background (face-attribute 'mode-line-inactive :background))))
-
-
- (unless (tabbar-diff-face-p 'tabbar-selected-highlight)
- (copy-face 'mode-line-buffer-id 'tabbar-selected-highlight frame))
- (unless (tabbar-diff-face-p 'tabbar-unselected-highlight)
- (copy-face 'mode-line-inactive 'tabbar-unselected-highlight frame)))
-
- (unless (tabbar-diff-face-p 'tabbar-separator)
- (set-face-attribute 'tabbar-separator frame
- :inherit 'tabbar-default))
-
- (unless (tabbar-diff-face-p 'tabbar-button)
- (set-face-attribute 'tabbar-button frame
- :inherit 'tabbar-default))
- (dolist (face '(tabbar-button
- tabbar-separator
- tabbar-selected
- tabbar-selected-highlight
- tabbar-selected-modified
- tabbar-unselected
- tabbar-unselected-highlight
- tabbar-unselected-modified))
- (unless (tabbar-diff-face-p face)
- (set-face-attribute face frame
- :box nil
- :height (face-attribute 'default :height frame)
- :width (face-attribute 'default :width frame)))
- (when tabbar-ruler-use-variable-pitch
- (unless (tabbar-diff-face-p face)
- (set-face-attribute face frame
- :family (face-attribute 'variable-pitch :family)
- :foundry (face-attribute 'variable-pitch :foundry)))))
- (tabbar-ruler-remove-caches)
- (when tabbar-ruler-style
- (let ((fun (intern (format "tabbar-ruler-style-%s" tabbar-ruler-style))))
- (when (fboundp fun)
- (funcall fun frame)))))
-
-(add-hook 'after-make-frame-functions 'tabbar-install-faces)
-(add-hook 'emacs-startup-hook 'tabbar-install-faces)
-
-;; Taken from powerline
-
-(defun tabbar-create-or-get-tabbar-cache ()
- "Return a frame-local hash table that acts as a memoization
-cache for tabbar. Create one if the frame doesn't have one
-yet."
- (or (frame-parameter nil 'tabbar-cache)
- (let ((table (make-hash-table :test 'equal)))
- ;; Store it as a frame-local variable
- (modify-frame-parameters nil `((tabbar-cache . ,table)))
- table)))
-
-;; from memoize.el @ http://nullprogram.com/blog/2010/07/26/
-(defun tabbar-memoize (func)
- "Memoize FUNC.
-If argument is a symbol then install the tabbar-memoized function over
-the original function. Use frame-local memoization."
- (cl-typecase func
- (symbol (fset func (tabbar-memoize-wrap-frame-local (symbol-function func))) func)
- (function (tabbar-memoize-wrap-frame-local func))))
-
-(defun tabbar-memoize-wrap-frame-local (func)
- "Return the tabbar-memoized version of FUNC. The memoization cache is
-frame-local."
- (let ((cache-sym (cl-gensym))
- (val-sym (cl-gensym))
- (args-sym (cl-gensym)))
- `(lambda (&rest ,args-sym)
- ,(concat (documentation func) "\n(tabbar-memoized function)")
- (let* ((,cache-sym (tabbar-create-or-get-tabbar-cache))
- (,val-sym (gethash ,args-sym ,cache-sym)))
- (if ,val-sym
- ,val-sym
- (puthash ,args-sym (apply ,func ,args-sym) ,cache-sym))))))
-
-(cl-defun tabbar-ruler-image (&key type disabled color face)
- "Returns the scroll-images"
- (let ((clr2 (or (and face (facep face) (tabbar-background face))
- (and disabled (tabbar-hex-color (face-attribute 'mode-line-inactive :background)))
- (tabbar-hex-color (face-attribute 'mode-line :background))))
- (clr (or color
- (and face (facep face) (tabbar-foreground face))
- (and disabled (tabbar-hex-color (face-attribute 'mode-line-inactive :foreground)))
- (tabbar-hex-color (face-attribute 'mode-line :foreground)))))
- (if (eq type 'close)
- (format "/* XPM */
- static char * close_tab_xpm[] = {
- \"14 11 3 1\",
- \" c None\",
- \". c %s\",
- \"+ c %s\",
- \" ..... \",
- \" ....... \",
- \" ......... \",
- \" ... ... ... \",
- \" .... . .... \",
- \" ..... ..... \",
- \" .... . .... \",
- \" ... ... ... \",
- \" ......... \",
- \" ....... \",
- \" ..... \"};" clr clr2)
-
- (format
- "/* XPM */
-static char * scroll_%s_%s_xpm[] = {
-\"17 17 2 1\",
-\" c None\",
-\". c %s\",
-\" \",
-\" \",
-\" \",
-\" \",
-\" \",
-%s
-\" \",
-\" \",
-\" \",
-\" \",
-\" \",
-\" \"};
-" (symbol-name type)
-(if disabled "disabled" "enabled")
-clr
-(cond
- ((eq 'right type)
- "\" \",
-\" .. \",
-\" .... \",
-\" ...... \",
-\" ..... \",
-\" ... \",
-"
- )
- ((eq 'left type)
- "\" \",
-\" .. \",
-\" .... \",
-\" ...... \",
-\" ..... \",
-\" ... \","
- )
- ((eq 'up type)
- "\" . \",
-\" .. \",
-\" ... \",
-\" .... \",
-\" ..... \",
-\" ..... \",")
- ((eq 'down type)
- "\" ..... \",
-\" ..... \",
-\" .... \",
-\" ... \",
-\" .. \",
-\" . \","))))))
-
-
-(defconst tabbar-home-button-enabled-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'down)))
- "Default image for the enabled home button.")
-
-(defconst tabbar-home-button-disabled-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'up)))
- "Default image for the disabled home button")
-
-
-(defconst tabbar-home-button
- (cons (cons "[o]" tabbar-home-button-enabled-image)
- (cons "[x]" tabbar-home-button-disabled-image)))
-
-(defvar tabbar-buffer-home-button
- (cons (cons "[+]" tabbar-home-button-enabled-image)
- (cons "[-]" tabbar-home-button-disabled-image)))
-
-(defvar tabbar-scroll-left-button-enabled-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'left))))
-
-(defvar tabbar-scroll-left-button-disabled-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'left :disabled t))))
-
-(defvar tabbar-scroll-left-button
- (cons (cons " <" tabbar-scroll-left-button-enabled-image)
- (cons " =" tabbar-scroll-left-button-disabled-image)))
-
-(defvar tabbar-scroll-right-button-enabled-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'right))))
-
-(defvar tabbar-scroll-right-button-disabled-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'right :disabled t))))
-
-(defvar tabbar-scroll-right-button
- (cons (cons " >" tabbar-scroll-right-button-enabled-image)
- (cons " =" tabbar-scroll-right-button-disabled-image)))
-
-(defsubst tabbar-normalize-image (image &optional margin face mask)
- "Make IMAGE centered and transparent.
-If optional MARGIN is non-nil, it must be a number of pixels to add as
-an extra margin around the image. If optional MASK is non-nil, mask
-property is included."
- (when image
- (let ((plist (cdr image))
- (face (or face 'tabbar-default)))
- (or (plist-get plist :ascent)
- (setq plist (plist-put plist :ascent 'center)))
- (or (plist-get plist :mask)
- (when mask
- (setq plist (plist-put plist :mask '(heuristic t)))))
- (or (not (natnump margin))
- ;; (plist-get plist :margin)
- (plist-put plist :margin margin))
- (and (facep face)
- (plist-put plist :face face))
- (setcdr image plist)))
- image)
-
-;; for buffer tabs, use the usual command to close/kill a buffer
-(defun tabbar-buffer-close-tab (tab)
- (let ((buffer (tabbar-tab-value tab)))
- (with-current-buffer buffer
- (kill-buffer buffer))))
-
-(setq tabbar-close-tab-function 'tabbar-buffer-close-tab)
-
-(defsubst tabbar-click-on-tab (tab &optional type action)
- "Handle a mouse click event on tab TAB.
-Call `tabbar-select-tab-function' with the received, or simulated
-mouse click event, and TAB.
-Optional argument TYPE is a mouse click event type (see the function
-`tabbar-make-mouse-event' for details)."
- (let* ((mouse-event (tabbar-make-mouse-event type))
- (mouse-button (event-basic-type mouse-event))
- tmp map)
- (cond
- ((eq mouse-button 'mouse-3)
- (setq tabbar-last-tab tab)
- (tabbar-context-menu))
- ((eq action 'close-tab)
- (when (and (eq mouse-button 'mouse-1) tabbar-close-tab-function)
- (funcall tabbar-close-tab-function tab)))
- ((and (eq action 'icon) (setq tmp (key-binding [menu-bar languages])))
- (with-current-buffer (tabbar-tab-value tab)
- (setq map (copy-keymap tmp)
- tmp (mouse-menu-major-mode-map))
- (define-key map [major-mode-sep-b] '(menu-item "---"))
- (define-key map [major-mode] (cons (nth 1 tmp) tmp))
- ;; (setq tmp (make-composed-map tmp (mouse-menu-major-mode-map)))
- ;; (popup-menug tmp)
- (popup-menu map))
- (tabbar-ruler-modification-state-change)
- (tabbar-display-update))
- (t (when tabbar-select-tab-function
- (funcall tabbar-select-tab-function
- (tabbar-make-mouse-event type) tab)
- (tabbar-display-update))))))
-
-(defun tabbar-reset ()
- "Reset memoized functions."
- (interactive)
- (tabbar-memoize 'tabbar-make-tab-keymap)
- (tabbar-memoize 'tabbar-ruler-image))
-(tabbar-reset)
-
-(defsubst tabbar-drag-p (event)
- "Return non-nil if EVENT is a mouse drag event."
- (memq 'drag (event-modifiers event)))
-
-(defun tabbar-select-tab-callback (event)
- "Handle a mouse EVENT on a tab.
-Pass mouse click events on a tab to `tabbar-click-on-tab'."
- (interactive "@e")
- (cond
- ((tabbar-click-p event)
- (let ((target (posn-string (event-start event))))
- (tabbar-click-on-tab
- (get-text-property (cdr target) 'tabbar-tab (car target))
- event
- (get-text-property (cdr target) 'tabbar-action (car target)))))
- ((tabbar-drag-p event)
- (let ((start-target (posn-string (event-start event)))
- (end-target (posn-string (event-end event))))
- (tabbar-drag-tab
- (get-text-property (cdr start-target) 'tabbar-tab (car start-target))
- (get-text-property (cdr end-target) 'tabbar-tab (car end-target))
- event)))
- ))
-
-(defun tabbar-drag-tab (dragged-tab dropped-tab event)
- "Handle DRAGGED-TAB dragged-and-dropped onto DROPPED-TAB.
- Include full mouse EVENT from drag-and-drop action."
- (let ((start-tabset (tabbar-tab-tabset dragged-tab)))
- (when (and (eq start-tabset (tabbar-tab-tabset dropped-tab))
- (not (eq dragged-tab dropped-tab)))
- (let* ((tabs (tabbar-tabs start-tabset))
- (drop-tail-length (length (memq dropped-tab tabs)))
- (drag-tail-length (length (memq dragged-tab tabs)))
- (dragdrop-pair (list dragged-tab dropped-tab))
- new-tablist)
- (when (> drag-tail-length drop-tail-length)
- (setq dragdrop-pair (reverse dragdrop-pair)))
- (dolist (thistab (reverse tabs))
- ;; build list of tabs. When we hit dragged-tab, don't append it.
- ;; When we hit dropped-tab, append dragdrop-pair
- (cond
- ((eq thistab dragged-tab))
- ((eq thistab dropped-tab)
- (setq new-tablist (append dragdrop-pair new-tablist)))
- (t (add-to-list 'new-tablist thistab))
- ))
- (set start-tabset new-tablist)
- ;; (setq tabbar-window-cache nil) ;; didn't help
- (tabbar-set-template start-tabset nil)
- ;; open the dragged tab
- (funcall tabbar-select-tab-function
- (tabbar-make-mouse-event event) dragged-tab)
- (tabbar-display-update)
- ))))
-
-(defun tabbar-ruler-pad-xpm (width color &optional height)
- "Generate padding xpm of WIDTH and COLOR with optional HEIGHT."
- (let* ((height (or height tabbar-ruler-tab-height (pl/separator-height)))
- (data nil)
- (i 0))
- (while (< i height)
- (setq data (cons
- (append (make-list width 1))
- data))
- (setq i (+ i 1)))
- (pl/make-xpm "sep" color color data)))
-
-(defun tabbar-background-- (int)
- "Convert INT to 2 digit hex."
- (substring (format "%02X" int) -2))
-
-(defun tabbar-background (face &optional foreground)
- "Gets hex background of FACE.
-When FOREGROUND is non-nil, get the foreground instead."
- (let ((color (or (and (facep face)
- (or (and foreground (face-foreground face nil 'default))
- (face-background face nil 'default)))
- (and (stringp face) face))))
- (when (member color (x-defined-colors))
- (setq color (x-color-values color)
- color (concat"#"
- (tabbar-background--(nth 0 color))
- (tabbar-background--(nth 1 color))
- (tabbar-background--(nth 2 color)))))
- color))
-
-(defun tabbar-foreground (face)
- "Gets hex foreground of FACE."
- (tabbar-background face t))
-
-
-(defun tabbar-line-right-separator (selected-p face background-face &optional dir
- normalize-face)
- "Right separator for tabbar.
-SELECTED-P tells if the item is seleceted."
- (when tabbar-ruler-fancy-tab-separator
- (let* ((dir (or dir "right"))
- (fun
- (if (and selected-p (not (eq tabbar-ruler-fancy-current-tab-separator 'inherit)))
- (intern (format "powerline-%s-%s" tabbar-ruler-fancy-current-tab-separator dir))
- (intern (format "powerline-%s-%s" tabbar-ruler-fancy-tab-separator dir))))
- (normalize-face (or normalize-face face)))
- (propertize "|"
- 'display (tabbar-normalize-image (funcall fun background-face face tabbar-ruler-tab-height) 0 normalize-face)
- 'face normalize-face))))
-
-(defun tabbar-line-left-separator (selected-p face background-face)
- "Left separator for tabbar."
- (or (tabbar-line-right-separator selected-p background-face face "left" face)
- tabbar-separator-value))
-
-(defvar tabbar-line-mode-icon nil)
-
-(defun tabbar-line-fix-display (text face tab keymap)
- "Fix display for TEXT given FACE, TAB and KEYMAP."
- (let* ((compose-p (get-text-property 0 'composition text))
- (display-p (get-text-property 0 'display text))
- (image-p (and display-p (eq (car display-p) 'image)))
- (plist (and image-p (cdr display-p))))
- (cond
- (image-p
- (setq plist (plist-put plist :ascent 'center)
- plist (plist-put plist :face face))
- (propertize " "
- 'display `(image ,@plist)
- 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'pointer 'hand
- 'tabbar-action 'icon))
- ((and display-p (stringp display-p)
- (= 1 (length display-p)))
- (propertize display-p
- 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'pointer 'hand
- 'tabbar-action 'icon))
- ((and compose-p (= 3 (length compose-p))
- (setq compose-p (nth 2 compose-p))
- (= 1 (length compose-p))
- (setq compose-p (make-string 1 (aref compose-p 0))))
- (propertize compose-p
- 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'pointer 'hand
- 'tabbar-action 'icon))
- (t ""))))
-
-(defun tabbar-line-mode-icon (tab face keymap)
- "Create mode icon for TAB using FACE and KEYMAP"
- (setq tabbar-line-mode-icon nil)
- (when (and window-system
- (or (and (eq t tabbar-ruler-use-mode-icons) (featurep 'mode-icons))
- (and (eq 'if-enabled tabbar-ruler-use-mode-icons)
- (boundp 'mode-icons-mode)
- mode-icons-mode)))
- (let ((mode-icon (and (fboundp #'mode-icons-get-icon-spec)
- (with-current-buffer (tabbar-tab-value tab)
- (mode-icons-get-icon-spec mode-name)))))
- (setq tabbar-line-mode-icon (propertize " " 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'face face
- 'pointer 'hand
- 'tabbar-action 'icon))
- (if mode-icon
- (tabbar-line-fix-display
- (mode-icons--recolor-string (with-current-buffer (tabbar-tab-value tab) mode-name)
- (or (not tabbar-ruler-recolor-inactive-icons)
- (memq face '(tabbar-selected tabbar-selected-highlight tabbar-selected-modified)))
- face)
- face tab keymap)
- (if tabbar-ruler-mode-icon-for-unknown-modes
- (propertize " "
- 'display (create-image mode-icon-unknown 'xpm t
- :ascent 'center
- :face face)
- 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'pointer 'hand
- 'tabbar-action 'icon)
- (setq tabbar-line-mode-icon nil))))))
-
-(defun tabbar-line-padding (selected-p next-selected-p background-face)
- (when (and tabbar-ruler-fancy-tab-separator tabbar-ruler-tab-padding
- (or (not selected-p) (and selected-p tabbar-ruler-pad-selected))
- (or (not next-selected-p) (and next-selected-p tabbar-ruler-pad-selected)))
- (propertize " " 'display (tabbar-normalize-image
- (tabbar-ruler-pad-xpm
- tabbar-ruler-tab-padding
- (tabbar-background (or tabbar-ruler-padding-face background-face))) 0 background-face)
- 'face background-face)))
-
-(defsubst tabbar-line-tab (tab &optional not-last sel)
- "Return the display representation of tab TAB.
-That is, a propertized string used as an `header-line-format' template
-element.
-Call `tabbar-tab-label-function' to obtain a label for TAB."
- (let* ((selected-p (tabbar-selected-p tab (tabbar-current-tabset)))
- (next-selected-p (and not-last (tabbar-selected-p (car not-last) (tabbar-current-tabset))))
- (modified-p (buffer-modified-p (tabbar-tab-value tab)))
- (keymap (tabbar-make-tab-keymap tab))
- (left-fun
- (if (and selected-p (not (eq tabbar-ruler-fancy-current-tab-separator 'inherit)))
- (intern (format "powerline-%s-left" tabbar-ruler-fancy-current-tab-separator))
- (intern (format "powerline-%s-left" tabbar-ruler-fancy-tab-separator))))
- (face (if selected-p
- (if modified-p
- 'tabbar-selected-modified
- 'tabbar-selected)
- (if modified-p
- 'tabbar-unselected-modified
- 'tabbar-unselected)))
- (close-button-image (tabbar-find-image
- `((:type xpm :data ,(tabbar-ruler-image :type 'close :disabled (not modified-p)
- :face face)))))
- (background-face 'tabbar-default)
- (next-background-face 'tabbar-default)
- (mode-icon (and (featurep 'mode-icons)
- (with-current-buffer (tabbar-tab-value tab)
- (assoc mode-name mode-icons))))
- (pad-face (or tabbar-ruler-padding-face background-face)))
- (setq close-button-image (tabbar-normalize-image close-button-image 0 face))
- (concat
- (tabbar-line-right-separator selected-p face background-face)
- (propertize " " 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'face face
- 'pointer 'hand)
-
- (tabbar-line-mode-icon tab face keymap)
- tabbar-line-mode-icon
- (propertize
- (if tabbar-tab-label-function
- (funcall tabbar-tab-label-function tab)
- tab)
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'mouse-face 'tabbar-highlight
- 'face face
- 'pointer 'hand)
- (propertize (if (and modified-p tabbar-ruler-modified-symbol)
- (with-temp-buffer
- (insert (make-string 1 #x207A))
- (insert " ")
- (buffer-substring (point-min) (point-max))) " ")
- 'face face
- 'tabbar-tab tab
- 'local-map keymap
- 'help-echo 'tabbar-help-on-tab
- 'face face
- 'pointer 'hand)
- (if tabbar-ruler-fancy-close-image
- (propertize (with-temp-buffer
- (insert (make-string 1 #x00D7))
- (buffer-string))
- 'display close-button-image
- 'face face
- 'pointer 'hand
- 'tabbar-tab tab
- 'local-map keymap
- 'tabbar-action 'close-tab)
- (propertize
- (with-temp-buffer
- (insert (make-string 1 #x00D7))
- (insert " ")
- (buffer-string))
- 'face face
- 'pointer 'hand
- 'tabbar-tab tab
- 'local-map keymap
- 'tabbar-action 'close-tab))
- (tabbar-line-left-separator selected-p face background-face)
- (tabbar-line-padding selected-p next-selected-p 'tabbar-default)
- )))
-
-(defsubst tabbar-line-format (tabset)
- "Return the `header-line-format' value to display TABSET."
- (let* ((sel (tabbar-selected-tab tabset))
- (tabs (tabbar-view tabset))
- (padcolor (tabbar-background-color))
- atsel elts)
- ;; Initialize buttons and separator values.
- (or tabbar-separator-value
- (tabbar-line-separator))
- (or tabbar-home-button-value
- (tabbar-line-button 'home))
- (or tabbar-scroll-left-button-value
- (tabbar-line-button 'scroll-left))
- (or tabbar-scroll-right-button-value
- (tabbar-line-button 'scroll-right))
- ;; Track the selected tab to ensure it is always visible.
- (when tabbar--track-selected
- (while (not (memq sel tabs))
- (tabbar-scroll tabset -1)
- (setq tabs (tabbar-view tabset)))
- (while (and tabs (not atsel))
- (setq elts (cons (tabbar-line-tab (car tabs) (cdr tabs)) elts)
- atsel (eq (car tabs) sel)
- tabs (cdr tabs)))
- (setq elts (nreverse elts))
- ;; At this point the selected tab is the last elt in ELTS.
- ;; Scroll TABSET and ELTS until the selected tab becomes
- ;; visible.
- (with-temp-buffer
- (let ((truncate-partial-width-windows nil)
- (inhibit-modification-hooks t)
- deactivate-mark ;; Prevent deactivation of the mark!
- start)
- (setq truncate-lines nil
- buffer-undo-list t)
- (apply 'insert (tabbar-line-buttons tabset))
- (setq start (point))
- (while (and (cdr elts) ;; Always show the selected tab!
- (progn
- (delete-region start (point-max))
- (goto-char (point-max))
- (apply 'insert elts)
- (goto-char (point-min))
- (> (vertical-motion 1) 0)))
- (tabbar-scroll tabset 1)
- (setq elts (cdr elts)))))
- (setq elts (nreverse elts))
- (setq tabbar--track-selected nil))
- ;; Format remaining tabs.
- (while tabs
- (setq elts (cons (tabbar-line-tab (car tabs) (cdr tabs)) elts)
- tabs (cdr tabs)))
- ;; Cache and return the new tab bar.
- (setq elts (nreverse elts))
- (tabbar-set-template
- tabset
- (list (tabbar-line-buttons tabset)
- (cond
- (tabbar-ruler-fancy-tab-separator
- (propertize " " 'display (funcall (intern (format "powerline-%s-right" tabbar-ruler-fancy-tab-separator))
- nil (get-text-property 0 'face (car elts)) tabbar-ruler-tab-height)))
- (t ""))
- elts
- (propertize "%-"
- 'face (list :background padcolor
- :foreground padcolor)
- 'pointer 'arrow)))))
-
-(defface tabbar-selected-modified
- '((t
- :inherit tabbar-selected
- :foreground "DarkOrange3"
- :weight bold))
- "Face used for selected tabs."
- :group 'tabbar)
-
-(defface tabbar-unselected-modified
- '((t
- :inherit tabbar-unselected
- :foreground "DarkOrange3"
- :weight bold))
- "Face used for unselected tabs."
- :group 'tabbar)
-
-(defface tabbar-key-binding '((t
- :foreground "white"))
- "Face for unselected, highlighted tabs."
- :group 'tabbar)
-
-;; Hooks based on yswzing's hooks, but modified for this function state.
-;; called each time the modification state of the buffer changed
-(defun tabbar-ruler-modification-state-change ()
- (tabbar-set-template tabbar-current-tabset nil)
- (tabbar-display-update))
-
-;; first-change-hook is called BEFORE the change is made
-(defun tabbar-ruler-on-buffer-modification ()
- (set-buffer-modified-p t)
- (tabbar-ruler-modification-state-change))
-(add-hook 'after-save-hook 'tabbar-ruler-modification-state-change)
-
-(defvar tabbar-ruler-tabbar-off 't)
-(defvar tabbar-ruler-ruler-off 't)
-(set (make-variable-buffer-local 'tabbar-ruler-toolbar-off) nil)
-(set (make-variable-buffer-local 'tabbar-ruler-ruler-off) nil)
-
-(defvar tabbar-ruler-toolbar-off nil)
-(defvar tabbar-ruler-menu-off nil)
-(add-hook 'find-file-hook
- (lambda()
- (interactive)
- (tabbar-ruler-tabbar-ruler-fight 't)))
-
-(defcustom tabbar-ruler-ruler-display-commands
- '(ac-trigger-commands
- esn-upcase-char-self-insert
- esn-magic-$
- right-char
- left-char
- previous-line
- next-line
- backward-paragraph
- forward-paragraph
- cua-scroll-down
- cua-scroll-up
- cua-paste
- cua-paste-pop
- scroll-up
- scroll-down
- autopair-newline
- autopair-insert-opening
- autopair-skip-close-maybe
- autopair-backspace
- backward-delete-char-untabify
- delete-backward-char
- self-insert-command)
- "Ruler display commands."
- :group 'tabbar-ruler
- :type '(repeat symbol))
-
-(defun tabbar-ruler-tabbar-ruler-fight (&optional initialize)
- "Defines the fighting behavior of the tabbar-ruler ruler and tabbar."
- (condition-case error
- (progn
- (cond
- ((minibufferp)
- nil)
- (tabbar-ruler-keep-tabbar
- (setq tabbar-ruler-keep-tabbar nil)
- nil)
- ((and (save-match-data (string-match "^[*]Org Src " (buffer-name))))
- nil)
- ((member major-mode tabbar-ruler-fight-igore-modes)
- nil)
- ( (eq major-mode 'helm-mode)
- nil)
- ( (eq last-command 'mouse-drag-region)
- (tabbar-ruler-mouse-movement))
- ( (and tabbar-ruler-global-ruler tabbar-ruler-global-tabbar)
- (cond
- ( (memq last-command tabbar-ruler-ruler-display-commands)
- (when tabbar-ruler-popup-scrollbar
- (scroll-bar-mode -1))
- (when tabbar-ruler-ruler-off
- (ruler-mode 1)
- (setq tabbar-ruler-ruler-off nil))
- (unless tabbar-ruler-tabbar-off
- (tabbar-mode -1)
- (setq tabbar-ruler-tabbar-off 't))
- (when tabbar-ruler-popup-menu
- (unless tabbar-ruler-menu-off
- (unless (eq system-type 'darwin)
- (menu-bar-mode -1))
- (setq tabbar-ruler-menu-off 't)))
- (when tabbar-ruler-popup-toolbar
- (unless (eq system-type 'darwin)
- (unless tabbar-ruler-toolbar-off
- (tool-bar-mode -1)
- (setq tabbar-ruler-toolbar-off 't)))))
- ( (save-match-data (string-match "\\(mouse\\|ignore\\|window\\|frame\\)" (format "%s" last-command)))
- (when nil ;; Took this out; Afterward it works much better...
- (unless tabbar-ruler-ruler-off
- (ruler-mode -1)
- (setq tabbar-ruler-ruler-off 't))
- (when tabbar-ruler-tabbar-off
- (tabbar-mode 1)
- (setq tabbar-ruler-tabbar-off nil))))
- ( 't
- (when (or initialize (and tabbar-ruler-ruler-off tabbar-ruler-tabbar-off))
- (when tabbar-ruler-popup-scrollbar
- (scroll-bar-mode -1))
- (when tabbar-ruler-ruler-off
- (ruler-mode 1)
- (setq tabbar-ruler-ruler-off nil))
- (unless tabbar-ruler-tabbar-off
- (tabbar-mode -1)
- (setq tabbar-ruler-tabbar-off 't))))))
- ( tabbar-ruler-global-ruler
- (when tabbar-ruler-ruler-off
- (ruler-mode 1)
- (setq tabbar-ruler-ruler-off nil)))
- ( tabbar-ruler-global-tabbar
- (when tabbar-ruler-tabbar-off
- (tabbar-mode 1)
- (setq tabbar-ruler-tabbar-off nil)))))
- (error
- (message "Error in post-command-hook for Ruler/Tabbar: %s" (error-message-string error)))))
-
-(add-hook 'post-command-hook 'tabbar-ruler-tabbar-ruler-fight)
-(defvar tabbar-ruler-movement-timer nil)
-(defvar tabbar-ruler-movement-x nil)
-(defvar tabbar-ruler-movement-y nil)
-
-(defun tabbar-ruler-mouse-movement ()
- "Mouse Movement function"
- (interactive)
- (when tabbar-ruler-movement-timer
- (cancel-timer tabbar-ruler-movement-timer))
- (let* ((y-pos (cddr (mouse-pixel-position)))
- (x-pos (cadr (mouse-pixel-position))))
- (unless y-pos
- (setq y-pos tabbar-ruler-movement-y))
- (unless x-pos
- (setq x-pos tabbar-ruler-movement-x))
- (when (or (not tabbar-ruler-movement-x) (not tabbar-ruler-movement-y)
- (and tabbar-ruler-movement-x tabbar-ruler-movement-y
- (not
- (and
- (= tabbar-ruler-movement-x x-pos)
- (= tabbar-ruler-movement-y y-pos)))))
- (when (and x-pos y-pos)
- (when tabbar-ruler-popup-scrollbar
- (scroll-bar-mode 1))
- (setq tabbar-ruler-movement-x x-pos)
- (setq tabbar-ruler-movement-y y-pos)
- (unless tabbar-ruler-ruler-off
- (ruler-mode -1)
- (setq tabbar-ruler-ruler-off 't))
- (when tabbar-ruler-tabbar-off
- (tabbar-mode 1)
- (setq tabbar-ruler-tabbar-off nil))
- (if (>= (if (or tabbar-ruler-menu-off tabbar-ruler-toolbar-off)
- tabbar-ruler-popup-menu-min-y
- tabbar-ruler-popup-menu-min-y-leave) y-pos)
- (progn
- (when tabbar-ruler-popup-menu
- (when tabbar-ruler-menu-off
- (unless (eq system-type 'darwin)
- (menu-bar-mode 1))
- (setq tabbar-ruler-menu-off nil)))
- (when tabbar-ruler-popup-toolbar
- (unless (eq system-type 'darwin)
- (when tabbar-ruler-toolbar-off
- (tool-bar-mode 1)
- (setq tabbar-ruler-toolbar-off nil)))))
- (when tabbar-ruler-popup-menu
- (unless tabbar-ruler-menu-off
- (unless (eq system-type 'darwin)
- (menu-bar-mode -1))
- (setq tabbar-ruler-menu-off 't)))
- (when tabbar-ruler-popup-toolbar
- (unless (eq system-type 'darwin)
- (unless tabbar-ruler-toolbar-off
- (tool-bar-mode -1)
- (setq tabbar-ruler-toolbar-off 't)))))))
- (setq tabbar-ruler-movement-timer (run-with-idle-timer
- (time-add
- (if
- (current-idle-time)
- (current-idle-time)
- (seconds-to-time 0))
- (seconds-to-time
- tabbar-ruler-movement-timer-delay))
- nil
- 'tabbar-ruler-mouse-movement))))
-(tabbar-ruler-mouse-movement)
-
-(defun tabbar-ruler-movement-timer-reset ()
- "Mouse movement timer reset"
- (interactive)
- (when tabbar-ruler-movement-timer
- (cancel-timer tabbar-ruler-movement-timer))
- (setq tabbar-ruler-movement-timer (run-with-idle-timer
- (seconds-to-time
- tabbar-ruler-movement-timer-delay)
- nil
- 'tabbar-ruler-mouse-movement)))
-
-(add-hook 'post-command-hook 'tabbar-ruler-movement-timer-reset)
-
-(defvar tabbar-buffer-groups-function 'tabbar-buffer-groups)
-
-(defun last-tabbar-ruler-tabbar-buffer-groups nil)
-
-(defun tabbar-ruler-tabbar-buffer-groups ()
- "Return the list of group names the current buffer belongs to.
-Return a list of one element based on major mode."
- (setq last-tabbar-ruler-tabbar-buffer-groups
- (list
- (cond
- ;; ((or (get-buffer-process (current-buffer))
- ;; ;; Check if the major mode derives from `comint-mode' or
- ;; ;; `compilation-mode'.
- ;; (tabbar-buffer-mode-derived-p
- ;; major-mode '(comint-mode compilation-mode)))
- ;; "Process")
- ;; ((string-match "^ *[*]" (buffer-name))
- ;; "Common"
- ;; )
- ((eq major-mode 'dired-mode)
- "Dired")
- ((memq major-mode
- '(help-mode apropos-mode Info-mode Man-mode))
- "Help")
- ((memq major-mode
- '(rmail-mode
- rmail-edit-mode vm-summary-mode vm-mode mail-mode
- mh-letter-mode mh-show-mode mh-folder-mode
- gnus-summary-mode message-mode gnus-group-mode
- gnus-article-mode score-mode gnus-browse-killed-mode))
- "Mail")
- (t
- "Files"
- ))))
- (symbol-value 'last-tabbar-ruler-tabbar-buffer-groups))
-
-
-(defun tabbar-ruler-tabbar-buffer-list ()
- "Return the list of buffers to show in tabs.
-Exclude buffers whose name starts with a space or *, when they are not
-visiting a file. The current buffer is always included."
- (delq nil
- (mapcar #'(lambda (b)
- (cond
- ;; Always include the current buffer.
- ((eq (current-buffer) b) b)
- ((buffer-file-name b) b)
- ((member (buffer-name b) tabbar-ruler-excluded-buffers) nil)
- ;; ((string= "*Messages*" (format "%s" (buffer-name b))))
- ((char-equal ?\ (aref (buffer-name b) 0)) nil)
- ;;((char-equal ?* (aref (buffer-name b) 0)) nil)
- ((buffer-live-p b) b)))
- (buffer-list))))
-
-(setq tabbar-buffer-list-function #'tabbar-ruler-tabbar-buffer-list)
-
-(defvar tabbar-ruler-projectile-tabbar-buffer-group-calc nil
- "Buffer group for projectile. Should be buffer local and speed up calculation of buffer groups.")
-(defun tabbar-ruler-projectile-tabbar-buffer-groups ()
- "Return the list of group names BUFFER belongs to.
- Return only one group for each buffer."
-
- (if tabbar-ruler-projectile-tabbar-buffer-group-calc
- (symbol-value 'tabbar-ruler-projectile-tabbar-buffer-group-calc)
- (set (make-local-variable 'tabbar-ruler-projectile-tabbar-buffer-group-calc)
-
- (cond
- ((or (get-buffer-process (current-buffer)) (memq major-mode '(comint-mode compilation-mode))) '("Term"))
- ((string-equal "*" (substring (buffer-name) 0 1)) '("Misc"))
- ((condition-case err
- (projectile-project-root)
- (error nil)) (list (projectile-project-name)))
- ((memq major-mode '(emacs-lisp-mode python-mode emacs-lisp-mode c-mode c++-mode makefile-mode lua-mode vala-mode)) '("Coding"))
- ((memq major-mode '(javascript-mode js-mode nxhtml-mode html-mode css-mode)) '("HTML"))
- ((memq major-mode '(org-mode calendar-mode diary-mode)) '("Org"))
- ((memq major-mode '(dired-mode)) '("Dir"))
- (t '("Main"))))
- (symbol-value 'tabbar-ruler-projectile-tabbar-buffer-group-calc)))
-
-(defun tabbar-ruler-group-by-projectile-project()
- "Group by projectile project."
- (interactive)
- (setq tabbar-buffer-groups-function 'tabbar-ruler-projectile-tabbar-buffer-groups))
-
-(defun tabbar-ruler-group-user-buffers-helper ()
- ;; customize tabbar to have only 2 groups: emacs's and user's buffers
- ;; all normal files will be shown in group user's buffers
- (list (cond ((string-equal "*" (substring (buffer-name) 0 1)) "emacs's buffers")
- ((eq major-mode 'dired-mode) "emacs's buffers")
- (t "user's buffers"))))
-
-(defun tabbar-ruler-group-user-buffers ()
- (interactive)
- (setq tabbar-buffer-groups-function 'tabbar-ruler-group-user-buffers-helper))
-
-(defun tabbar-ruler-buffer-groups ()
- "Return the list of group names the current buffer belongs to.
-Return a list of one element based on major mode."
- (list
- (cond
- ((or (get-buffer-process (current-buffer))
- ;; Check if the major mode derives from `comint-mode' or
- ;; `compilation-mode'.
- (tabbar-buffer-mode-derived-p
- major-mode '(comint-mode compilation-mode)))
- "Process")
- ((member (buffer-name)
- '("*scratch*" "*Messages*"))
- "Common"
- )
- ((eq major-mode 'dired-mode)
- "Dired"
- )
- ((memq major-mode
- '(help-mode apropos-mode Info-mode Man-mode))
- "Help")
- ((memq major-mode
- '(rmail-mode
- rmail-edit-mode vm-summary-mode vm-mode mail-mode
- mh-letter-mode mh-show-mode mh-folder-mode
- gnus-summary-mode message-mode gnus-group-mode
- gnus-article-mode score-mode gnus-browse-killed-mode))
- "Mail")
- (t
- ;; Return `mode-name' if not blank, `major-mode' otherwise.
- (if (and (stringp mode-name)
- ;; Take care of preserving the match-data because this
- ;; function is called when updating the header line.
- (save-match-data (string-match "[^ ]" mode-name)))
- (let ((txt (format "%s" mode-name)))
- ;; Take out mode-icons and show text
- (set-text-properties 0 (length txt) nil txt)
- txt)
- (symbol-name major-mode))))))
-
-(defun tabbar-ruler-group-buffer-groups ()
- "Use tabbar's major-mode grouping of buffers."
- (interactive)
- (setq tabbar-buffer-groups-function 'tabbar-ruler-buffer-groups))
-
-;; default group mode
-(tabbar-ruler-group-user-buffers)
-
-;;; Adapted from auto-hide in EmacsWiki
-
-(defvar tabbar-display-functions
- '(tabbar-press-home
- tabbar-backward
- tabbar-forward
- tabbar-backward-tab
- tabbar-forward-tab
- tabbar-backward-group
- tabbar-forward-group
- tabbar-press-scroll-left
- tabbar-press-scroll-right)
- "Tabbar movement functions")
-
-(mapc
- (lambda(x)
- (eval `(defun ,(intern (concat "tabbar-ruler-" (symbol-name x))) (&optional arg)
- ,(concat "Turn on tabbar before running `" (symbol-name x) "'")
- (interactive "p")
- (setq tabbar-ruler-keep-tabbar t)
- (unless tabbar-ruler-ruler-off
- (ruler-mode -1)
- (setq tabbar-ruler-ruler-off 't))
- (when tabbar-ruler-tabbar-off
- (tabbar-mode 1)
- (setq tabbar-ruler-tabbar-off nil))
- (setq current-prefix-arg current-prefix-arg)
- (call-interactively ',x)
- (setq tabbar-ruler-keep-tabbar t)
- (unless tabbar-ruler-ruler-off
- (ruler-mode -1)
- (setq tabbar-ruler-ruler-off 't))
- (when tabbar-ruler-tabbar-off
- (tabbar-mode 1)
- (setq tabbar-ruler-tabbar-off nil)))))
- tabbar-display-functions)
-
-;;;###autoload
-(defun tabbar-ruler-up (&optional arg)
- "Tabbar press up key."
- (interactive "p")
- (setq current-prefix-arg current-prefix-arg)
- (call-interactively 'tabbar-ruler-tabbar-press-home))
-
-;;;###autoload
-(defun tabbar-ruler-forward (&optional arg)
- "Forward ruler. Takes into consideration if the home-key was pressed.
-This is based on the variable `tabbar--buffer-show-groups'"
- (interactive "p")
- (cond
- (tabbar--buffer-show-groups
- (setq current-prefix-arg current-prefix-arg)
- (call-interactively 'tabbar-ruler-tabbar-forward-group)
- (tabbar-ruler-tabbar-press-home))
- (t
- (setq current-prefix-arg current-prefix-arg)
- (call-interactively 'tabbar-ruler-tabbar-forward-tab))))
-
-;;;###autoload
-(defun tabbar-ruler-backward (&optional arg)
- "Backward ruler. Takes into consideration if the home-key was pressed."
- (interactive "p")
- (cond
- (tabbar--buffer-show-groups
- (setq current-prefix-arg current-prefix-arg)
- (call-interactively 'tabbar-ruler-tabbar-backward-group)
- (tabbar-ruler-tabbar-press-home))
- (t
- (setq current-prefix-arg current-prefix-arg)
- (call-interactively 'tabbar-ruler-tabbar-backward-tab))))
-
-(when (not (fboundp 'set-temporary-overlay-map))
- ;; Backport this function from newer emacs versions
- (defun set-temporary-overlay-map (map &optional keep-pred)
- "Set a new keymap that will only exist for a short period of time.
-The new keymap to use must be given in the MAP variable. When to
-remove the keymap depends on user input and KEEP-PRED:
-
-- if KEEP-PRED is nil (the default), the keymap disappears as
- soon as any key is pressed, whether or not the key is in MAP;
-
-- if KEEP-PRED is t, the keymap disappears as soon as a key *not*
- i in MAP is pressed;
-
-- otherwise, KEEP-PRED must be a 0-arguments predicate that will
- decide if the keymap should be removed (if predicate returns
- nil) or kept (otherwise). The predicate will be called after
- each key sequence."
-
- (let* ((clearfunsym (make-symbol "clear-temporary-overlay-map"))
- (overlaysym (make-symbol "t"))
- (alist (list (cons overlaysym map)))
- (clearfun
- `(lambda ()
- (unless ,(cond ((null keep-pred) nil)
- ((eq t keep-pred)
- `(eq this-command
- (lookup-key ',map
- (this-command-keys-vector))))
- (t `(funcall ',keep-pred)))
- (remove-hook 'pre-command-hook ',clearfunsym)
- (setq emulation-mode-map-alists
- (delq ',alist emulation-mode-map-alists))))))
- (set overlaysym overlaysym)
- (fset clearfunsym clearfun)
- (add-hook 'pre-command-hook clearfunsym)
-
- (push alist emulation-mode-map-alists))))
-
-(defvar tabbar-ruler-move-keymap (make-sparse-keymap)
- "Keymap for tabbar-ruler movement")
-
-(define-key tabbar-ruler-move-keymap [remap previous-line] 'tabbar-ruler-up)
-(define-key tabbar-ruler-move-keymap [remap next-line] 'tabbar-ruler-up)
-(define-key tabbar-ruler-move-keymap [remap backward-char] 'tabbar-ruler-backward)
-(define-key tabbar-ruler-move-keymap [remap forward-char] 'tabbar-ruler-forward)
-(define-key tabbar-ruler-move-keymap [remap left-char] 'tabbar-ruler-backward)
-(define-key tabbar-ruler-move-keymap [remap right-char] 'tabbar-ruler-forward)
-(define-key tabbar-ruler-move-keymap (kbd "SPC") (lambda() (interactive) (message "Exited tabbar-movement")))
-(define-key tabbar-ruler-move-keymap (kbd "<return>") (lambda() (interactive) (message "Exited tabbar-movement")))
-
-(defun tabbar-ruler-move-pred ()
- "Determines if emacs should keep the temporary keymap
- `tabbar-ruler-move-keymap' when running `tabbar-ruler-move'."
- (memq this-command '(tabbar-ruler-up tabbar-ruler-backward tabbar-ruler-forward)))
-
-;;;###autoload
-(defun tabbar-ruler-move ()
- "Start the movement for the tabbar"
- (interactive)
- (setq tabbar-ruler-keep-tabbar t)
- (unless tabbar-ruler-ruler-off
- (ruler-mode -1)
- (setq tabbar-ruler-ruler-off 't))
- (when tabbar-ruler-tabbar-off
- (tabbar-mode 1)
- (setq tabbar-ruler-tabbar-off nil))
- (message "Use arrow keys to change buffers (or line movement commands). Exit with space/return or any other key.")
- (set-temporary-overlay-map tabbar-ruler-move-keymap 'tabbar-ruler-move-pred))
-
-;; Hook save and change events to show modified buffers in tabbar
-(defun on-saving-buffer ()
- (tabbar-set-template tabbar-current-tabset nil)
- (tabbar-display-update))
-(defun on-modifying-buffer ()
- (set-buffer-modified-p (buffer-modified-p))
- (tabbar-set-template tabbar-current-tabset nil)
- (tabbar-display-update))
-(defun after-modifying-buffer (begin end length)
- (set-buffer-modified-p (buffer-modified-p))
- (tabbar-set-template tabbar-current-tabset nil)
- (tabbar-display-update))
-(add-hook 'after-save-hook 'on-saving-buffer)
-(add-hook 'first-change-hook 'on-modifying-buffer)
-(add-hook 'after-change-functions 'after-modifying-buffer)
-
-(defun tabbar-ruler-remove-caches ()
- "Remove caches for tabbar-ruler."
- ;; Courtesy of Ba Manzi
- ;; https://bitbucket.org/bamanzi/dotemacs-elite/issue/24/tabbar-ruler-not-work-in-emacs-244-keep
- (mapc #'(lambda (frame)
- (modify-frame-parameters frame '((tabbar-cache . nil))))
- (frame-list)))
-
-(add-hook 'desktop-after-read-hook 'tabbar-ruler-remove-caches)
-
-;; (defadvice enable-theme (after tabbar-ruler-enable-theme-after activate)
-;; "Fix the tabbar faces when you change themes."
-;; (tabbar-install-faces))
-
-;; (defadvice disable-theme (after tabbar-ruler-disable-theme-after activate)
-;; "Fix the tabbar faces when you change themes."
-;; (tabbar-install-faces))
-
-
-(defmacro tabbar-ruler-save-buffer-state (&rest body)
- "Eval BODY,
-then restore the buffer state under the assumption that no significant
-modification has been made in BODY. A change is considered
-significant if it affects the buffer text in any way that isn't
-completely restored again. Changes in text properties like `face' or
-`syntax-table' are considered insignificant. This macro allows text
-properties to be changed, even in a read-only buffer.
-
-This macro should be placed around all calculations which set
-\"insignificant\" text properties in a buffer, even when the buffer is
-known to be writeable. That way, these text properties remain set
-even if the user undoes the command which set them.
-
-This macro should ALWAYS be placed around \"temporary\" internal buffer
-changes \(like adding a newline to calculate a text-property then
-deleting it again\), so that the user never sees them on his
-`buffer-undo-list'.
-
-However, any user-visible changes to the buffer \(like auto-newlines\)
-must not be within a `ergoemacs-save-buffer-state', since the user then
-wouldn't be able to undo them.
-
-The return value is the value of the last form in BODY.
-
-This was stole/modified from `c-save-buffer-state'"
- `(let* ((modified (buffer-modified-p)) (buffer-undo-list t)
- (inhibit-read-only t) (inhibit-point-motion-hooks t)
- before-change-functions after-change-functions
- deactivate-mark
- buffer-file-name buffer-file-truename ; Prevent primitives checking
- ; for file modification
- )
- (unwind-protect
- (progn ,@body)
- (and (not modified)
- (buffer-modified-p)
- (set-buffer-modified-p nil)))))
-
-(defadvice tabbar-display-update (around tabbar-ruler-fix-select-word activate)
- "Fix the tabbar selection of a word with the mouse."
- (tabbar-ruler-save-buffer-state
- ad-do-it))
-
-
-(tabbar-install-faces)
-(provide 'tabbar-ruler)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; tabbar-ruler.el ends here
diff --git a/elpa/tabbar-ruler-20160802.307/tabbar-ruler.info b/elpa/tabbar-ruler-20160802.307/tabbar-ruler.info
deleted file mode 100644
index 03fc9eb..0000000
--- a/elpa/tabbar-ruler-20160802.307/tabbar-ruler.info
+++ /dev/null
@@ -1,244 +0,0 @@
-This is tabbar-ruler.info, produced by makeinfo version 4.13 from
-tabbar-ruler.texi.
-
-INFO-DIR-SECTION Emacs lisp libraries
-START-INFO-DIR-ENTRY
-* tabbar-ruler: (tabbar-ruler). Changes tabbar setup to be similar to Aquaemacs.
-END-INFO-DIR-ENTRY
-
-
-File: tabbar-ruler.info, Node: Top, Next: Tabbar Ruler, Up: (dir)
-
-Top
-***
-
-* Menu:
-
-* Tabbar Ruler::
-
-
-File: tabbar-ruler.info, Node: Tabbar Ruler, Prev: Top, Up: Top
-
-1 Tabbar Ruler
-**************
-
-Matthew L. Fidler ## Library Information _tabbar-ruler.el_ -- Pretty
-tabbar, autohide, use both tabbar/ruler
-
- * *Filename* - tabbar-ruler.el
-
- * *Description* - Changes tabbar setup to be similar to Aquaemacs.
-
- * *Author* - Matthew Fidler, Nathaniel Cunningham
-
- * *Maintainer* - Matthew L. Fidler
-
- * *Created* - Mon Oct 18 17:06:07 2010 (-0500)
-
- * *Version* - 0.40
-
- * *Last-Updated* - Sat Dec 15 15:44:34 2012 (+0800)
-
- * *By* - Matthew L. Fidler
-
- * *Update #* - 663
-
- * *URL* - http:__github.com_mlf176f2_tabbar-ruler.el
-
- * *Keywords* - Tabbar, Ruler Mode, Menu, Tool Bar.
-
- * *Compatibility* - Windows Emacs 23.x
-
- * *Package-Requires* - ((tabbar "2.0.1"))
-
-* Menu:
-
-* Introduction::
-* Changing how tabbar groups files/buffers::
-* Adding key-bindings to tabbar-ruler::
-* Known issues::
-
-
-File: tabbar-ruler.info, Node: Introduction, Next: Changing how tabbar groups files/buffers, Up: Tabbar Ruler
-
-1.1 Introduction
-================
-
-Tabbar ruler is an emacs package that allows both the tabbar and the
-ruler to be used together. In addition it allows auto-hiding of the
-menu-bar and tool-bar.
-
-Tabbar appearance based on reverse engineering Aquaemacs code and
-changing to my preferences, and Emacs Wiki.
-
-Tabbar/Ruler integration is new. Tabbar should be active on mouse move.
-Ruler should be active on self-insert commands.
-
-Also allows auto-hiding of toolbar and menu.
-
-To use this, put the library in your load path and use
-
-(setq tabbar-ruler-global-tabbar t) ; If you want tabbar (setq
-tabbar-ruler-global-ruler t) ; if you want a global ruler (setq
-tabbar-ruler-popup-menu t) ; If you want a popup menu. (setq
-tabbar-ruler-popup-toolbar t) ; If you want a popup toolbar (setq
-tabbar-ruler-popup-scrollbar t) ; If you want to only show the ; scroll
-bar when your mouse is moving. (require 'tabbar-ruler)
-
-
-File: tabbar-ruler.info, Node: Changing how tabbar groups files/buffers, Next: Adding key-bindings to tabbar-ruler, Prev: Introduction, Up: Tabbar Ruler
-
-1.2 Changing how tabbar groups files/buffers
-============================================
-
-The default behavior for tabbar-ruler is to group the tabs by frame.
-You can change this back to the old-behavior by:
-
-(tabbar-ruler-group-buffer-groups)
-
-or by issuing the following code:
-
-(setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
-
-In addition, you can also group by projectile project easily by:
-
-(tabbar-ruler-group-by-projectile-project)
-
-
-File: tabbar-ruler.info, Node: Adding key-bindings to tabbar-ruler, Next: Known issues, Prev: Changing how tabbar groups files/buffers, Up: Tabbar Ruler
-
-1.3 Adding key-bindings to tabbar-ruler
-=======================================
-
-You can add key-bindings to change the current tab. The easiest way to
-add the bindings is to add a key like:
-
-(global-set-key (kbd "C-c t") 'tabbar-ruler-move)
-
-After that, all you would need to press is Control+c t and then the
-arrow keys will allow you to change the buffer quite easily. To exit
-the buffer movement you can press enter or space.
-
-
-File: tabbar-ruler.info, Node: Known issues, Prev: Adding key-bindings to tabbar-ruler, Up: Tabbar Ruler
-
-1.4 Known issues
-================
-
-the left arrow is text instead of an image. ## History
-
-1-Jul-2013 Matthew L. Fidler
-Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-Fix variable misspecification - *28-Jun-2013* - Fixed strange
-org-readme issue (Matthew L. Fidler) - *28-Jun-2013* - Added popup
-scrollbarbar (Matthew L. Fidler) - *27-Jun-2013* - Added autoload for
-tabbar-install-faces. That way ergoemacs and other packages can load
-the tabbar-ruler by just calling (tabbar-install-faces) 6-Jun-2013
-Matthew L. Fidler Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663
-(Matthew L. Fidler) Added left-char and right char to
-tabbar-ruler-move-keymap so that keybindings in emacs 24.3 work
-correctly. 6-Jun-2013 Matthew L. Fidler Last-Updated: Sat Dec 15
-15:44:34 2012 (+0800) #663 (Matthew L. Fidler) Changed movement
-commands. The movement commands are simpler (in my opinion) 4-Jun-2013
-Matthew L. Fidler Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663
-(Matthew L. Fidler) Change package description. Fixed the documentation
-to actually change to the old tabbar method of grouping buffers.
-4-Jun-2013 Matthew L. Fidler Last-Updated: Sat Dec 15 15:44:34 2012
-(+0800) #663 (Matthew L. Fidler) Turn off ruler mode in the next buffer
-(if necessary) 4-Jun-2013 Matthew L. Fidler Last-Updated: Sat Dec 15
-15:44:34 2012 (+0800) #663 (Matthew L. Fidler) Add movement keys. Also
-add toggles for different groupings. 1-May-2013 Matthew L. Fidler
-Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-Try to address issue #4 1-May-2013 Matthew L. Fidler Last-Updated: Sat
-Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler) Changed the
-modified font to italics. Made the modified symbol customizable, but
-off by default. Should address issue #5. 5-Apr-2013 Matthew L. Fidler
-Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-Trying to update upstream sources. 5-Apr-2013 Matthew L. Fidler
-Last-Updated: Sat Dec 15 15:44:34 2012 (+0800) #663 (Matthew L. Fidler)
-Fixed speed issues on windows. It wasn't a redraw that was causing the
-speed issues, it was the constant recreation of the right-click
-menus... (Matthew L. Fidler) - *27-Mar-2013* - Fixed typo to fix issue
-#2. (Matthew L. Fidler) - *27-Mar-2013* - Attempt to fix issue #2.
-Whenever the color is not a string, assume that it should be
-transparent. I'm unsure if the mac osx puts the translated color to a
-string. However, it seems that the undefined should be the same as
-transparent. Therefore, this fix *should* work... (Matthew L. Fidler) -
-*20-Mar-2013* - Add inverse video option for unselected tabbar. Made it
-the default. has better contrast between the selected and unselected
-tabs. (Matthew L. Fidler) - *20-Mar-2013* - Changed emacs 24.3 to
-support the times character. Also removed starred documentation
-strings. (Matthew L. Fidler) - *20-Mar-2013* - Emacs 24.3 had an error
-when using ucs-insert. Added fallbacks so that this works when
-ucs-insert does not work. (Matthew L. Fidler) - *20-Feb-2013* - Changed
-so that the separators do not need to be fancy images. I found that
-when the separators were images, it slowed down emacs on windows.
-Therefore, the fancy images are disabled by default. This also includes
-the stylized close symbols. (Matthew L. Fidler) - *19-Dec-2012* - Added
-back popup-menu (Matthew L. Fidler) - *19-Dec-2012* - Upload to
-marmalade (Matthew L. Fidler) - *19-Dec-2012* - Changed slope. Made the
-background color the default background color if unspecified. Made
-tabbar-hex-color return "None" if not defined (Matthew L. Fidler) -
-*15-Dec-2012* - Made sure that the tabbr-ruler-separator-image is at
-least 17 pixels high (Matthew L. Fidler) - *15-Dec-2012* - Attempt to
-fix another bug on load (Matthew L. Fidler) - *14-Dec-2012* - Fixed
-tabbar ruler so that it loads cold. (Matthew L. Fidler) - *14-Dec-2012*
-- Memoized the tabbar images to speed things up (Matthew L. Fidler) -
-*14-Dec-2012* - Upload to Marmalade (Mat"thew L. Fidler) -
-*14-Dec-2012* - Fancy tabs (Matthew L. Fidler) - *13-Dec-2012* - Added
-Bug fix for coloring. Made the selected tab match the default color in
-the buffer. Everything else is grayed out. (Matthew L. Fidler) -
-*10-Dec-2012* - Took out a statement that may fix the left-scrolling
-bug? (Matthew L. Fidler) - *10-Dec-2012* - Added package-menu-mode to
-the excluded tabbar-ruler fight modes. (Matthew L. Fidler) -
-*07-Dec-2012* - Will no longer take over editing of org source blocks
-or info blocks. (Matthew L. Fidler) - *07-Dec-2012* - Changed the order
-of checking so that helm will work when you move a mouse. (Matthew L.
-Fidler) - *07-Dec-2012* - Now works with Helm. Should fix issue #1
-(Matthew L. Fidler) - *06-Dec-2012* - Now colors are based on loaded
-theme (from minibar). Also added bug-fix for setting tabbar colors
-every time a frame opens. Also added a bug fix for right-clicking a
-frame that is not associated with a buffer. 1-Mar-2012 Matthew L.
-Fidler Last-Updated: Thu Mar 1 08:38:09 2012 (-0600) #656 (Matthew L.
-Fidler) Will not change tool-bar-mode in Mac. It causes some funny
-things to happen. 9-Feb-2012 Matthew L. Fidler Last-Updated: Thu Feb 9
-19:18:21 2012 (-0600) #651 (Matthew L. Fidler) Will not change the menu
-bar in a Mac. Its always there. (Matthew L. Fidler) - *14-Jan-2012* -
-Added more commands that trigger the ruler. (Matthew L. Fidler) -
-*14-Jan-2012* - Added more ruler commands. It works a bit better now.
-Additionally I have changed the ep- to tabbar-ruler-. (Matthew L.
-Fidler) - *14-Jan-2012* - Changed EmacsPortable to tabbar-ruler
-(Matthew L. Fidler) - *08-Feb-2011* - Added ELPA tags. (Matthew L.
-Fidler) - *08-Feb-2011* - Removed xpm dependencies. Now no images are
-required, they are built by the library. (Matthew L. Fidler) -
-*04-Dec-2010* - Added context menu. (Matthew L. Fidler) - *01-Dec-2010*
-- Added scratch buffers to list. (Matthew L. Fidler) - *04-Nov-2010* -
-Made tabbar mode default. (us041375) - *02-Nov-2010* - Make
-post-command-hook handle errors gracefully. (Matthew L. Fidler) -
-*20-Oct-2010* - Changed behavior when outside the window to assume the
-last known mouse position. This fixes the two problems below.
-(us041375) - *20-Oct-2010* - As it turns out when the toolbar is hidden
-when the mouse is outside of the emacs window, it also hides when
-navigating the menu. Switching behavior back. (us041375) -
-*20-Oct-2010* - Made popup menu and toolbar be hidden when mouse is
-oustide of emacs window. (us041375) - *20-Oct-2010* - Changed to popup
-ruler-mode if tabbar and ruler are not displayed. (us041375) -
-*19-Oct-2010* - Changed tabbar, menu, toolbar and ruler variables to be
-buffer or frame local. (Matthew L. Fidler)
-
-
-
-Tag Table:
-Node: Top250
-Node: Tabbar Ruler358
-Node: Introduction1282
-Node: Changing how tabbar groups files/buffers2310
-Node: Adding key-bindings to tabbar-ruler2921
-Node: Known issues3512
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/tabbar-ruler-readme.txt b/elpa/tabbar-ruler-readme.txt
deleted file mode 100644
index 31998f5..0000000
--- a/elpa/tabbar-ruler-readme.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-* Introduction
-Tabbar ruler is an Emacs package that allows both the tabbar and the
-ruler to be used together. In addition it allows auto-hiding of the
-menu-bar and tool-bar.
-
-
-Tabbar appearance based on reverse engineering Aquaemacs code and
-changing to my preferences, and Emacs Wiki.
-
-Tabbar/Ruler integration is new. Tabbar should be active on mouse
-move. Ruler should be active on self-insert commands.
-
-Also allows auto-hiding of toolbar and menu.
-
-To use this, put the library in your load path and use
-
-
- (setq tabbar-ruler-global-tabbar t) ; If you want tabbar
- (setq tabbar-ruler-global-ruler t) ; if you want a global ruler
- (setq tabbar-ruler-popup-menu t) ; If you want a popup menu.
- (setq tabbar-ruler-popup-toolbar t) ; If you want a popup toolbar
- (setq tabbar-ruler-popup-scrollbar t) ; If you want to only show the
- ; scroll bar when your mouse is moving.
- (require 'tabbar-ruler)
-
-
-
-
-* Changing how tabbar groups files/buffers
-The default behavior for tabbar-ruler is to group the tabs by frame.
-You can change this back to the old-behavior by:
-
- (tabbar-ruler-group-buffer-groups)
-
-or by issuing the following code:
-
-
- (setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
-
-
-In addition, you can also group by projectile project easily by:
-
-
- (tabbar-ruler-group-by-projectile-project)
-
-* Adding key-bindings to tabbar-ruler
-You can add key-bindings to change the current tab. The easiest way
-to add the bindings is to add a key like:
-
-
- (global-set-key (kbd "C-c t") 'tabbar-ruler-move)
-
-
-After that, all you would need to press is Control+c t and then the
-arrow keys will allow you to change the buffer quite easily. To exit
-the buffer movement you can press enter or space.
-
-* Known issues
-the left arrow is text instead of an image.
diff --git a/elpa/tablist-20200427.2205/tablist-autoloads.el b/elpa/tablist-20200427.2205/tablist-autoloads.el
deleted file mode 100644
index df3a0a0..0000000
--- a/elpa/tablist-20200427.2205/tablist-autoloads.el
+++ /dev/null
@@ -1,48 +0,0 @@
-;;; tablist-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "tablist" "tablist.el" (0 0 0 0))
-;;; Generated autoloads from tablist.el
-
-(autoload 'tablist-minor-mode "tablist" "\
-Toggle Tablist minor mode on or off.
-With a prefix argument ARG, enable Tablist minor mode if ARG is
-positive, and disable it otherwise. If called from Lisp, enable
-the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'.
-\\{tablist-minor-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'tablist-mode "tablist" "\
-
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "tablist" '("tablist-")))
-
-;;;***
-
-;;;### (autoloads nil "tablist-filter" "tablist-filter.el" (0 0 0
-;;;;;; 0))
-;;; Generated autoloads from tablist-filter.el
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "tablist-filter" '("tablist-filter-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("tablist-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; tablist-autoloads.el ends here
diff --git a/elpa/tablist-20200427.2205/tablist-filter.el b/elpa/tablist-20200427.2205/tablist-filter.el
deleted file mode 100644
index c5d56b8..0000000
--- a/elpa/tablist-20200427.2205/tablist-filter.el
+++ /dev/null
@@ -1,464 +0,0 @@
-;;; tablist-filter.el --- Filter expressions for tablists. -*- lexical-binding:t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: extensions, lisp
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;
-
-(defvar python-mode-hook)
-(let (python-mode-hook) ;FIXME: Why?
-(require 'semantic/wisent/comp)
-(require 'semantic/wisent/wisent))
-
-;;; Code:
-
-(defvar wisent-eoi-term)
-(declare-function wisent-parse "semantic/wisent/wisent.el")
-
-;;
-;; *Variables
-;;
-
-(defvar tablist-filter-binary-operator
- '((== . tablist-filter-op-equal)
- (=~ . tablist-filter-op-regexp)
- (< . tablist-filter-op-<)
- (> . tablist-filter-op->)
- (<= . tablist-filter-op-<=)
- (>= . tablist-filter-op->=)
- (= . tablist-filter-op-=)))
-
-(defvar tablist-filter-unary-operator nil)
-
-(defvar tablist-filter-wisent-parser nil)
-
-(defvar tablist-filter-lexer-regexps nil)
-
-(defvar tablist-filter-wisent-grammar
- '(
- ;; terminals
- ;; Use lowercase for better looking error messages.
- (operand unary-operator binary-operator or and not)
-
- ;; terminal associativity & precedence
- ((left binary-operator)
- (left unary-operator)
- (left or)
- (left and)
- (left not))
-
- ;; rules
- (filter-or-empty
- ((nil))
- ((?\( ?\)) nil)
- ((filter) $1))
- (filter
- ((operand) $1) ;;Named filter
- ((operand binary-operator operand) `(,(intern $2) ,$1 ,$3))
- ((unary-operator operand) `(,(intern $1) ,$2))
- ((not filter) `(not ,$2))
- ((filter and filter) `(and ,$1 ,$3))
- ((filter or filter) `(or ,$1 ,$3))
- ((?\( filter ?\)) $2))))
-
-;;
-;; *Filter Parsing
-;;
-
-(defun tablist-filter-parser-init (&optional reinitialize interactive)
- (interactive (list t t))
- (unless (and tablist-filter-lexer-regexps
- (not reinitialize))
- (let ((re (mapcar
- (lambda (l)
- (let ((re (regexp-opt
- (mapcar 'symbol-name
- (mapcar 'car l)) t)))
- (if (= (length re) 0)
- ".\\`" ;;matches nothing
- re)))
- (list tablist-filter-binary-operator
- tablist-filter-unary-operator))))
- (setq tablist-filter-lexer-regexps
- (nreverse
- (cons (concat "\\(?:" (car re) "\\|" (cadr re)
- "\\|[ \t\f\r\n\"!()]\\|&&\\|||\\)")
- re)))))
- (unless (and tablist-filter-wisent-parser
- (not reinitialize))
- (let ((wisent-compile-grammar*
- (symbol-function
- 'wisent-compile-grammar)))
- (setq tablist-filter-wisent-parser
- ;; Trick the byte-compile into not using the byte-compile
- ;; handler in semantic/wisent/comp.el, since it does not
- ;; always work (wisent-context-compile-grammar n/a).
- (funcall wisent-compile-grammar*
- tablist-filter-wisent-grammar))))
- (when interactive
- (message "Parser reinitialized."))
- nil)
-
-(defun tablist-filter-wisent-lexer ()
- (cl-destructuring-bind (unary-op binary-op keywords)
- tablist-filter-lexer-regexps
- (skip-chars-forward " \t\f\r\n")
- (cond
- ((eobp) (list wisent-eoi-term))
- ((= ?\" (char-after))
- `(operand , (condition-case err
- (read (current-buffer))
- (error (signal (car err) (cons
- "invalid lisp string"
- (cdr err)))))))
- ((looking-at unary-op)
- (goto-char (match-end 0))
- `(unary-operator ,(match-string-no-properties 0)))
- ((looking-at binary-op)
- (goto-char (match-end 0))
- `(binary-operator ,(match-string-no-properties 0)))
- ((looking-at "&&")
- (forward-char 2)
- `(and "&&"))
- ((looking-at "||")
- (forward-char 2)
- `(or "||"))
- ((= ?! (char-after))
- (forward-char)
- `(not "!"))
- ((= ?\( (char-after))
- (forward-char)
- `(?\( "("))
- ((= ?\) (char-after))
- (forward-char)
- `(?\) ")"))
- (t
- (let ((beg (point)))
- (when (re-search-forward keywords nil 'move)
- (goto-char (match-beginning 0)))
- `(operand ,(buffer-substring-no-properties
- beg
- (point))))))))
-
-(defun tablist-filter-parse (filter)
- (interactive "sFilter: ")
- (tablist-filter-parser-init)
- (with-temp-buffer
- (save-excursion (insert filter))
- (condition-case error
- (wisent-parse tablist-filter-wisent-parser
- 'tablist-filter-wisent-lexer
- (lambda (msg)
- (signal 'error
- (replace-regexp-in-string
- "\\$EOI" "end of input"
- msg t t))))
- (error
- (signal 'error
- (append (if (consp (cdr error))
- (cdr error)
- (list (cdr error)))
- (list (point))))))))
-
-(defun tablist-filter-unparse (filter &optional noerror)
- (cl-labels
- ((unparse (filter &optional noerror)
- (cond
- ((stringp filter)
- (if (or (string-match (nth 2 tablist-filter-lexer-regexps)
- filter)
- (= 0 (length filter)))
- (format "%S" filter)
- filter))
- ((and (eq (car-safe filter) 'not)
- (= (length filter) 2))
- (let ((paren (memq (car-safe (nth 1 filter)) '(or and))))
- (format "!%s%s%s"
- (if paren "(" "")
- (unparse (cadr filter) noerror)
- (if paren ")" ""))))
- ((and (memq (car-safe filter) '(and or))
- (= (length filter) 3))
- (let ((lparen (and (eq (car filter) 'and)
- (eq 'or (car-safe (car-safe (cdr filter))))))
- (rparen (and (eq (car filter) 'and)
- (eq 'or (car-safe (car-safe (cddr filter)))))))
- (format "%s%s%s %s %s%s%s"
- (if lparen "(" "")
- (unparse (cadr filter) noerror)
- (if lparen ")" "")
- (cl-case (car filter)
- (and "&&") (or "||"))
- (if rparen "(" "")
- (unparse (car (cddr filter)) noerror)
- (if rparen ")" ""))))
- ((and (assq (car-safe filter) tablist-filter-binary-operator)
- (= (length filter) 3))
- (format "%s %s %s"
- (unparse (cadr filter) noerror)
- (car filter)
- (unparse (car (cddr filter)) noerror)))
- ((and (assq (car-safe filter) tablist-filter-unary-operator)
- (= (length filter) 2))
- (format "%s %s"
- (car filter)
- (unparse (cadr filter) noerror)))
- ((not filter) "")
- (t (funcall (if noerror 'format 'error)
- "Invalid filter: %s" filter)))))
- (tablist-filter-parser-init)
- (unparse filter noerror)))
-
-(defun tablist-filter-eval (filter id entry &optional named-alist)
- (cl-labels
- ((feval (filter)
- (pcase filter
- (`(not . ,(and operand (guard (not (cdr operand)))))
- (not (feval (car operand))))
- (`(and . ,(and operands (guard (= 2 (length operands)))))
- (and
- (feval (nth 0 operands))
- (feval (nth 1 operands))))
- (`(or . ,(and operands (guard (= 2 (length operands)))))
- (or
- (feval (nth 0 operands))
- (feval (nth 1 operands))))
- (`(,op . ,(and operands (guard (= (length operands) 1))))
- (let ((fn (assq op tablist-filter-unary-operator)))
- (unless fn
- (error "Undefined unary operator: %s" op))
- (funcall fn id entry (car operands))))
- (`(,op . ,(and operands (guard (= (length operands) 2))))
- (let ((fn (cdr (assq op tablist-filter-binary-operator))))
- (unless fn
- (error "Undefined binary operator: %s" op))
- (funcall fn id entry (car operands)
- (cadr operands))))
- ((guard (stringp filter))
- (let ((fn (cdr (assoc filter named-alist))))
- (unless fn
- (error "Undefined named filter: %s" filter))
- (if (functionp fn)
- (funcall fn id entry))
- (feval
- (if (stringp fn) (tablist-filter-unparse fn) fn))))
- (`nil t)
- (_ (error "Invalid filter: %s" filter)))))
- (feval filter)))
-
-;;
-;; *Filter Operators
-;;
-
-(defun tablist-filter-get-item-by-name (entry col-name)
- (let* ((col (cl-position col-name tabulated-list-format
- :key 'car
- :test
- (lambda (s1 s2)
- (eq t (compare-strings
- s1 nil nil s2 nil nil t)))))
- (item (and col (elt entry col))))
- (unless col
- (error "No such column: %s" col-name))
- (if (consp item) ;(LABEL . PROPS)
- (car item)
- item)))
-
-(defun tablist-filter-op-equal (_id entry op1 op2)
- "COLUMN == STRING : Matches if COLUMN's entry is equal to STRING."
- (let ((item (tablist-filter-get-item-by-name entry op1)))
- (string= item op2)))
-
-(defun tablist-filter-op-regexp (_id entry op1 op2)
- "COLUMN =~ REGEXP : Matches if COLUMN's entry matches REGEXP."
- (let ((item (tablist-filter-get-item-by-name entry op1)))
- (string-match op2 item)))
-
-(defun tablist-filter-op-< (id entry op1 op2)
- "COLUMN < NUMBER : Matches if COLUMN's entry is less than NUMBER."
- (tablist-filter-op-numeric '< id entry op1 op2))
-
-(defun tablist-filter-op-> (id entry op1 op2)
- "COLUMN > NUMBER : Matches if COLUMN's entry is greater than NUMBER."
- (tablist-filter-op-numeric '> id entry op1 op2))
-
-(defun tablist-filter-op-<= (id entry op1 op2)
- "COLUMN <= NUMBER : Matches if COLUMN's entry is less than or equal to NUMBER."
- (tablist-filter-op-numeric '<= id entry op1 op2))
-
-(defun tablist-filter-op->= (id entry op1 op2)
- "COLUMN >= NUMBER : Matches if COLUMN's entry is greater than or equal to NUMBER."
- (tablist-filter-op-numeric '>= id entry op1 op2))
-
-(defun tablist-filter-op-= (id entry op1 op2)
- "COLUMN = NUMBER : Matches if COLUMN's entry as a number is equal to NUMBER."
- (tablist-filter-op-numeric '= id entry op1 op2))
-
-(defun tablist-filter-op-numeric (op _id entry op1 op2)
- (let ((item (tablist-filter-get-item-by-name entry op1)))
- (funcall op (string-to-number item)
- (string-to-number op2))))
-
-(defun tablist-filter-help (&optional temporary)
- (interactive)
- (cl-labels
- ((princ-op (op)
- (princ (car op))
- (princ (concat (make-string (max 0 (- 4 (length (symbol-name (car op)))))
- ?\s)
- "- "
- (car (split-string
- (or (documentation (cdr op))
- (format "FIXME: Not documented: %s"
- (cdr op)))
- "\n" t))
- "\n"))))
- (with-temp-buffer-window
- "*Help*"
- (if temporary
- '((lambda (buf alist)
- (let ((win
- (or (display-buffer-reuse-window buf alist)
- (display-buffer-in-side-window buf alist))))
- (fit-window-to-buffer win)
- win))
- (side . bottom)))
- nil
- (princ "Filter entries with the following operators.\n\n")
- (princ "&& - FILTER1 && FILTER2 : Locical and.\n")
- (princ "|| - FILTER1 || FILTER2 : Locical or.\n")
- (dolist (op tablist-filter-binary-operator)
- (princ-op op))
- (princ "! - ! FILTER : Locical not.\n\n")
- (dolist (op tablist-filter-unary-operator)
- (princ-op op))
- (princ "\"...\" may be used to quote names and values if necessary,
-and \(...\) to group expressions.")
- (with-current-buffer standard-output
- (help-mode)))))
-
-;;
-;; *Filter Functions
-;;
-
-;; filter ::= nil | named | fn | (OP OP1 [OP2])
-
-(defun tablist-filter-negate (filter)
- "Return a filter not matching filter."
- (cond
- ((eq (car-safe filter) 'not)
- (cadr filter))
- (filter
- (list 'not filter))))
-
-(defun tablist-filter-push (filter new-filter &optional or-p)
- "Return a filter combining FILTER and NEW-FILTER.
-
-By default the filters are and'ed, unless OR-P is non-nil."
- (if (or (null filter)
- (null new-filter))
- (or filter
- new-filter)
- (list (if or-p 'or 'and)
- filter new-filter)))
-
-(defun tablist-filter-pop (filter)
- "Remove the first operator or operand from filter.
-
-If filter starts with a negation, return filter unnegated,
-if filter starts with a dis- or conjunction, remove the first operand,
-if filter is nil, raise an error,
-else return nil."
- (pcase filter
- (`(,(or `and `or) . ,tail)
- (car (cdr tail)))
- (`(not . ,op1)
- (car op1))
- (_ (unless filter
- (error "Filter is empty")))))
-
-(defun tablist-filter-map (fn filter)
- (pcase filter
- (`(,(or `and `or `not) . ,tail)
- (cons (car filter)
- (mapcar (lambda (f)
- (tablist-filter-map fn f))
- tail)))
- (_ (funcall fn filter))))
-
-;;
-;; *Reading Filter
-;;
-
-(defvar tablist-filter-edit-history nil)
-(defvar tablist-filter-edit-display-help t)
-
-(defun tablist-filter-edit-filter (prompt &optional
- initial-filter history
- validate-fn)
- (let* ((str (tablist-filter-unparse initial-filter))
- (filter initial-filter)
- (validate-fn (or validate-fn 'identity))
- error done)
- (save-window-excursion
- (when tablist-filter-edit-display-help
- (tablist-filter-help t))
- (while (not done)
- (minibuffer-with-setup-hook
- (lambda ()
- (when error
- (when (car error)
- (goto-char (+ (field-beginning)
- (car error)))
- (skip-chars-backward " \t\n"))
- (minibuffer-message "%s" (cdr error))
- (setq error nil)))
- (setq str (propertize
- (read-string prompt str
- (or history 'tablist-filter-edit-history)))
- done t))
- (condition-case err
- (progn
- (setq filter (tablist-filter-parse str))
- (funcall validate-fn filter))
- (error
- (setq done nil)
- (setq error (cons (car-safe (cddr err)) nil))
- (when (car error)
- (setq str (with-temp-buffer
- (insert str)
- (goto-char (car error))
- (set-text-properties
- (progn
- (skip-chars-backward " \t\n")
- (backward-char)
- (point))
- (min (car error) (point-max))
- '(face error rear-nonsticky t))
- (buffer-string))))
- (setcdr error (error-message-string err)))))
- filter)))
-
-(provide 'tablist-filter)
-;; Local Variables:
-;; outline-regexp: ";;\\(\\(?:[;*]+ \\| \\*+\\)[^\s\t\n]\\|###autoload\\)\\|("
-;; indent-tabs-mode: nil
-;; End:
-;;; tablist-filter.el ends here
diff --git a/elpa/tablist-20200427.2205/tablist-pkg.el b/elpa/tablist-20200427.2205/tablist-pkg.el
deleted file mode 100644
index ff19737..0000000
--- a/elpa/tablist-20200427.2205/tablist-pkg.el
+++ /dev/null
@@ -1,11 +0,0 @@
-(define-package "tablist" "20200427.2205" "Extended tabulated-list-mode"
- '((emacs "24.3"))
- :commit "faab7a035ef2258cc4ea2182f67e3aedab7e2af9" :keywords
- '("extensions" "lisp")
- :authors
- '(("Andreas Politz" . "politza@fh-trier.de"))
- :maintainer
- '("Andreas Politz" . "politza@fh-trier.de"))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/tablist-20200427.2205/tablist.el b/elpa/tablist-20200427.2205/tablist.el
deleted file mode 100644
index df8778b..0000000
--- a/elpa/tablist-20200427.2205/tablist.el
+++ /dev/null
@@ -1,1945 +0,0 @@
-;;; tablist.el --- Extended tabulated-list-mode -*- lexical-binding: t -*-
-
-;; Copyright (C) 2013, 2014 Andreas Politz
-
-;; Author: Andreas Politz <politza@fh-trier.de>
-;; Keywords: extensions, lisp
-;; Package: tablist
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3"))
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; This package adds marks and filters to tabulated-list-mode. It
-;; also kind of puts a dired face on tabulated list buffers.
-;;
-;; It can be used by deriving from tablist-mode and some features by
-;; using tablist-minor-mode inside a tabulated-list-mode buffer.
-;;
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'ring)
-(require 'tabulated-list)
-(require 'dired)
-(require 'tablist-filter)
-
-;;
-;; *Macros
-;;
-
-(defmacro tablist-save-marks (&rest body)
- "Eval body, while preserving all marks."
- (let ((marks (make-symbol "marks")))
- `(let (,marks)
- (save-excursion
- (goto-char (point-min))
- (let ((re "^\\([^ ]\\)"))
- (while (re-search-forward re nil t)
- (push (cons (tabulated-list-get-id)
- (tablist-get-mark-state))
- ,marks))))
- (unwind-protect
- (progn ,@body)
- (save-excursion
- (dolist (m ,marks)
- (let ((id (pop m)))
- (goto-char (point-min))
- (while (and id (not (eobp)))
- (when (equal id (tabulated-list-get-id))
- (tablist-put-mark-state m)
- (setq id nil))
- (forward-line)))))))))
-
-(defmacro tablist-with-remembering-entry (&rest body)
- "Remember where body left of and restore previous position.
-
-If the current entry is still visible, move to it. Otherwise move
-to the next visible one after it. If that also fails, goto to
-the beginning of the buffer. Finally move point to the major
-column."
- (declare (indent 0) (debug t))
- (let ((re (make-symbol "re"))
- (id (make-symbol "id"))
- (col (make-symbol "col")))
- `(let ((,re
- (replace-regexp-in-string
- "[\t ]+" "[\t ]*" (regexp-quote
- (or (thing-at-point 'line) ""))
- t t))
- (,id (tabulated-list-get-id))
- (,col (tablist-current-column)))
- (progn
- ,@body
- (let (success pos)
- (goto-char (point-min))
- (setq pos (point))
- (while (and (setq success (re-search-forward ,re nil t))
- (> (point) (prog1 pos (setq pos (point))))
- (forward-line -1)
- (not (equal ,id (tabulated-list-get-id))))
- (forward-line))
- (unless success
- (goto-char (point-min))
- (while (and (not (eobp))
- (not success))
- (if (equal (tabulated-list-get-id) ,id)
- (setq success t)
- (forward-line))))
- (unless (and success (not (invisible-p (point))))
- (goto-char (point-min)))
- (tablist-skip-invisible-entries)
- (tablist-move-to-column
- (or ,col (car (tablist-major-columns))))
- (dolist (win (get-buffer-window-list))
- (set-window-point win (point))))))))
-
-(defmacro tablist-with-filter-displayed (&rest body)
- "Display the current filter in the mode while evalling BODY."
- (let ((state (make-symbol "state")))
- `(let ((,state (tablist-display-filter 'state)))
- (tablist-display-filter t)
- (unwind-protect
- (progn ,@body)
- (tablist-display-filter ,state)))))
-
-;;
-;; *Mode Maps
-;;
-
-(defvar tablist-mode-filter-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap "p" #'tablist-pop-filter)
- (define-key kmap "r" #'tablist-push-regexp-filter)
- (define-key kmap "=" #'tablist-push-equal-filter)
- (define-key kmap "n" #'tablist-push-numeric-filter)
- (define-key kmap "!" #'tablist-negate-filter)
- (define-key kmap "t" #'tablist-toggle-first-filter-logic)
- (define-key kmap "/" #'tablist-display-filter)
- (define-key kmap "z" #'tablist-suspend-filter)
-
- (define-key kmap "a" #'tablist-push-named-filter)
- (define-key kmap "s" #'tablist-name-current-filter)
- (define-key kmap "D" #'tablist-delete-named-filter)
- (define-key kmap "d" #'tablist-deconstruct-named-filter)
- (define-key kmap "e" #'tablist-edit-filter)
- (define-key kmap "C" #'tablist-clear-filter)
- kmap))
-
-(defvar tablist-mode-mark-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap "c" #'tablist-change-marks)
- (define-key kmap "!" #'tablist-unmark-all-marks)
- (define-key kmap "r" #'tablist-mark-items-regexp)
- (define-key kmap "n" #'tablist-mark-items-numeric)
- (define-key kmap "m" #'tablist-mark-forward)
- kmap))
-
-(defvar tablist-mode-regexp-map
- (let ((kmap (make-sparse-keymap)))
- ;; (define-key kmap "&" #'tablist-flag-gargabe-items)
- (define-key kmap "m" #'tablist-mark-items-regexp)
- kmap))
-
-(defvar tablist-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (define-key kmap "m" #'tablist-mark-forward)
- (define-key kmap (kbd "DEL") #'tablist-unmark-backward)
- (define-key kmap "k" #'tablist-do-kill-lines)
- (define-key kmap "U" #'tablist-unmark-all-marks)
- (define-key kmap "u" #'tablist-unmark-forward)
- (define-key kmap "t" #'tablist-toggle-marks)
-
- (define-key kmap (kbd "TAB") #'tablist-forward-column)
- (define-key kmap "\t" #'tablist-forward-column)
- (define-key kmap [backtab] #'tablist-backward-column)
-
- (define-key kmap "%" tablist-mode-regexp-map)
- (define-key kmap "*" tablist-mode-mark-map)
- (define-key kmap "/" tablist-mode-filter-map)
-
- ;; (define-key kmap "e" #'tablist-edit-column)
- ;; (define-key kmap "i" #'tablist-insert-entry)
- (define-key kmap "s" #'tablist-sort)
- (define-key kmap [remap back-to-indentation] #'tablist-move-to-major-column)
- (define-key kmap [remap next-line] #'tablist-next-line)
- (define-key kmap [remap previous-line] #'tablist-previous-line)
- (define-key kmap "<" #'tablist-shrink-column)
- (define-key kmap ">" #'tablist-enlarge-column)
- (define-key kmap "q" #'tablist-quit)
- (define-key kmap "G" #'tablist-revert)
- (define-key kmap (kbd "C-c C-e") #'tablist-export-csv)
- kmap))
-
-(defvar tablist-mode-map
- (let ((kmap (copy-keymap tablist-minor-mode-map)))
- (set-keymap-parent kmap tabulated-list-mode-map)
- (define-key kmap "d" #'tablist-flag-forward)
- (define-key kmap (kbd "RET") #'tablist-find-entry)
- (define-key kmap "f" #'tablist-find-entry)
- ;; (define-key kmap "~" #'tablist-flag-gargabe-items)
- (define-key kmap "D" #'tablist-do-delete)
- ;; (define-key kmap "C" #'tablist-do-copy)
- ;; (define-key kmap "R" #'tablist-do-rename)
- (define-key kmap "x" #'tablist-do-flagged-delete)
- ;; (define-key kmap "F" #'tablist-find-marked-items)
- ;; (define-key kmap (kbd "C-o") #'tablist-display-item)
- kmap))
-
-;;
-;; *Variables
-;;
-
-;; Marking
-(defvar tablist-umark-filtered-entries t)
-(defvar tablist-marker-char dired-marker-char
- "The character used for marking.")
-(defvar tablist-marker-face 'dired-mark
- "The face used for the mark character.")
-(defvar tablist-marked-face 'dired-marked
- "The face used for marked major columns.")
-
-;; Operations
-(defvar-local tablist-operations-function nil
- "A function for handling operations on the entries.
-
-The function is called with varying number of arguments, while
-the first one is always a symbol describing one of the following
-operations.
-
-`supported-operations'
-
-This is the only mandatory operation. There are no other
-arguments and the function should return a list of symbols of
-supported operations.
-
-`delete'
-
-The 2nd argument will be a list of entry ID's. The function
-should somehow delete these entries and update
-`tabulated-list-entries'.
-
-`find-entry'
-
-The 2nd argument is the ID of an entry. The function should
-somehow find/display this entry, i.e. a kind of default
-operation.
-
-`edit-column'
-
-The function is called with 3 further arguments: ID, INDEX and
-NEW-COLUMN, where ID represents the entry to edit, INDEX is the index
-of the column and NEW-COLUMN is the proposed new value for this
-column. It should either
-
-i. return a new edited complete entry and update
-`tabulated-list-entries', or
-
-ii. throw an error, if NEW-COLUMN is not a valid value for this
-column.
-
-`complete'
-
-The function is called with 4 further arguments: ID, INDEX,
-STRING and POS, where ID represents an entry, INDEX is the index
-of the column to complete, STRING it's current value and POS an
-offset of the current position of point into STRING.
-
-The function should return a collection for this column, suitable
-as argument for the function `completion-in-region'.")
-
-;; Differentiating columns
-(defvar-local tablist-major-columns nil
- "Columns used to mark and when querying.")
-
-;; Filter
-(defvar-local tablist-current-filter nil)
-(defvar-local tablist-filter-suspended nil)
-(defvar tablist-named-filter nil)
-
-;; History variables
-(defvar tablist-column-name-history nil)
-
-;; Hooks
-(defvar tablist-selection-changed-functions nil
- "A hook run when ever point moves to a different entry.")
-
-;; Context Window
-(defvar-local tablist-context-window nil)
-(defvar-local tablist-context-window-function nil)
-(defvar tablist-context-window-display-action
- `((display-buffer-reuse-window
- tablist-display-buffer-split-below-and-attach)
- (window-height . 0.25)
- (inhibit-same-window . t)))
-
-;;
-;; *Setup
-;;
-
-(defvar savehist-additional-variables)
-(add-hook 'savehist-save-hook
- (lambda nil
- (add-to-list 'savehist-additional-variables 'tablist-named-filter)))
-
-;;;###autoload
-(define-minor-mode tablist-minor-mode
- nil nil nil nil
- (unless (derived-mode-p 'tabulated-list-mode)
- (error "Buffer is not in Tabulated List Mode"))
- (tablist-init (not tablist-minor-mode)))
-
-;;;###autoload
-(define-derived-mode tablist-mode tabulated-list-mode "TL"
- (tablist-init))
-
-(defun tablist-init (&optional disable)
- (let ((cleaned-misc (cl-remove 'tablist-current-filter
- mode-line-misc-info :key #'car-safe)))
- (cond
- ((not disable)
- (set (make-local-variable 'mode-line-misc-info)
- (append
- (list
- (list 'tablist-current-filter
- '(:eval (format " [%s]"
- (if tablist-filter-suspended
- "suspended"
- "filtered")))))))
- (add-hook 'post-command-hook
- 'tablist-selection-changed-handler nil t)
- (add-hook 'tablist-selection-changed-functions
- 'tablist-context-window-update nil t))
- (t
- (setq mode-line-misc-info cleaned-misc)
- (remove-hook 'post-command-hook
- 'tablist-selection-changed-handler t)
- (remove-hook 'tablist-selection-changed-functions
- 'tablist-context-window-update t)))))
-
-(defun tablist-quit ()
- (interactive)
- (tablist-hide-context-window)
- (quit-window))
-
-(defvar-local tablist-selected-id nil)
-(defvar tablist-edit-column-minor-mode)
-
-(defun tablist-selection-changed-handler ()
- (unless tablist-edit-column-minor-mode
- (let ((id tablist-selected-id)
- (selected (tabulated-list-get-id)))
- (unless (eq selected id)
- (setq tablist-selected-id selected)
- (run-hook-with-args
- 'tablist-selection-changed-functions
- tablist-selected-id)))))
-
-(defvar tablist-context-window-update--timer nil)
-
-(defun tablist-context-window-update (&optional id)
- (when (and tablist-context-window-function
- (window-live-p tablist-context-window)
- (not tablist-edit-column-minor-mode))
- (unless id
- (setq id (tabulated-list-get-id)))
- (when (timerp tablist-context-window-update--timer)
- (cancel-timer tablist-context-window-update--timer))
- (setq tablist-context-window-update--timer
- (run-with-idle-timer 0.1 nil
- (lambda (fn window)
- (when (window-live-p window)
- (with-selected-window window
- (set-window-dedicated-p nil nil)
- (save-selected-window
- (funcall fn id))
- (when (window-live-p (selected-window))
- (set-window-dedicated-p nil t)))))
- tablist-context-window-function
- tablist-context-window))))
-
-(defun tablist-display-context-window ()
- (interactive)
- (unless tablist-context-window-function
- (error "No function for handling a context is defined"))
- (unless (window-live-p tablist-context-window)
- (setq tablist-context-window
- (display-buffer
- (current-buffer)
- tablist-context-window-display-action)))
- (prog1
- tablist-context-window
- (tablist-context-window-update)))
-
-(defun tablist-hide-context-window ()
- (interactive)
- (when (window-live-p tablist-context-window)
- (let ((ignore-window-parameters t))
- (delete-window tablist-context-window)))
- (setq tablist-context-window nil))
-
-(defun tablist-toggle-context-window ()
- (interactive)
- (if (window-live-p tablist-context-window)
- (tablist-hide-context-window)
- (tablist-display-context-window)))
-
-;;
-;; *Marking
-;;
-
-(defun tablist-revert ()
- "Revert the list with marks preserved, position kept."
- (interactive)
- (tablist-save-marks
- (tablist-with-remembering-entry
- (tabulated-list-revert))))
-
-(defun tablist-major-columns ()
- (if (null tablist-major-columns)
- (number-sequence 0 (1- (length tabulated-list-format)))
- (if (numberp tablist-major-columns)
- (list tablist-major-columns)
- tablist-major-columns)))
-
-(defun tablist-put-mark (&optional pos)
- "Put a mark before the entry at POS.
-
-POS defaults to point. Use `tablist-marker-char',
-`tablist-marker-face', `tablist-marked-face' and
-`tablist-major-columns' to determine how to mark and what to put
-a face on."
- (when (or (null tabulated-list-padding)
- (< tabulated-list-padding 1))
- (setq tabulated-list-padding 1)
- (tabulated-list-revert))
- (save-excursion
- (and pos (goto-char pos))
- (unless (tabulated-list-get-id)
- (error "No entry at this position"))
- (let ((inhibit-read-only t))
- (tabulated-list-put-tag
- (string tablist-marker-char))
- (put-text-property
- (point-at-bol)
- (1+ (point-at-bol))
- 'face tablist-marker-face)
- (let ((columns (tablist-column-offsets)))
- (dolist (c (tablist-major-columns))
- (when (and (>= c 0)
- (< c (length columns)))
- (let ((beg (+ (point-at-bol)
- (nth c columns)))
- (end (if (= c (1- (length columns)))
- (point-at-eol)
- (+ (point-at-bol)
- (nth (1+ c) columns)))))
- (cond
- ((and tablist-marked-face
- (not (eq tablist-marker-char ?\s)))
- (tablist--save-face-property beg end)
- (put-text-property
- beg end 'face tablist-marked-face))
- (t (tablist--restore-face-property beg end))))))))))
-
-(defun tablist-mark-forward (&optional arg interactive)
- "Mark ARG entries forward.
-
-ARG is interpreted as a prefix-arg. If interactive is non-nil,
-maybe use the active region instead of ARG.
-
-See `tablist-put-mark' for how entries are marked."
- (interactive (list current-prefix-arg t))
- (cond
- ;; Mark files in the active region.
- ((and interactive (use-region-p))
- (save-excursion
- (goto-char (region-beginning))
- (beginning-of-line)
- (tablist-repeat-over-lines
- (1+ (count-lines
- (point)
- (save-excursion
- (goto-char (region-end))
- (beginning-of-line)
- (point))))
- 'tablist-put-mark)))
- ;; Mark the current (or next ARG) files.
- (t
- (tablist-repeat-over-lines
- (prefix-numeric-value arg)
- 'tablist-put-mark))))
-
-(defun tablist-mark-backward (&optional arg interactive)
- "Mark ARG entries backward.
-
-See `tablist-mark-forward'."
- (interactive (list current-prefix-arg t))
- (tablist-mark-forward (- (prefix-numeric-value arg))
- interactive))
-
-(defun tablist-unmark-forward (&optional arg interactive)
- "Unmark ARG entries forward.
-
-See `tablist-mark-forward'."
- (interactive (list current-prefix-arg t))
- (let ((tablist-marker-char ?\s)
- tablist-marked-face)
- (tablist-mark-forward arg interactive)))
-
-(defun tablist-unmark-backward (&optional arg interactive)
- "Unmark ARG entries backward.
-
-See `tablist-mark-forward'."
- (interactive (list current-prefix-arg t))
- (let ((tablist-marker-char ?\s)
- tablist-marked-face)
- (tablist-mark-backward arg interactive)))
-
-(defun tablist-flag-forward (&optional arg interactive)
- "Flag ARG entries forward.
-
-See `tablist-mark-forward'."
- (interactive (list current-prefix-arg t))
- (let ((tablist-marker-char ?D)
- (tablist-marked-face 'dired-flagged))
- (tablist-mark-forward arg interactive)))
-
-(defun tablist-change-marks (old new)
- "Change all OLD marks to NEW marks.
-
-OLD and NEW are both characters used to mark files."
- (interactive
- (let* ((cursor-in-echo-area t)
- (old (progn (message "Change (old mark): ") (read-char)))
- (new (progn (message "Change %c marks to (new mark): " old)
- (read-char))))
- (list old new)))
- (when (eq new ?\n)
- (error "Mark character \\n is not allowed"))
- (let ((default-mark-p (equal tablist-marker-char new))
- (tablist-marker-char old))
- (save-excursion
- (tablist-map-over-marks
- (lambda nil
- (pcase new
- (?D
- (tablist-flag-forward 1))
- (_
- (let ((tablist-marker-char new)
- (tablist-marked-face
- (and default-mark-p
- tablist-marked-face)))
- (tablist-put-mark)))))))))
-
-(defun tablist-unmark-all-marks (&optional marks interactive)
- "Remove all marks in MARKS.
-
-MARKS should be a string of mark characters to match and defaults
-to all marks. Interactively, remove all marks, unless a prefix
-arg was given, in which case ask about which ones to remove.
-Give a message, if interactive is non-nil.
-
-Returns the number of unmarked marks."
- (interactive
- (list (if current-prefix-arg
- (read-string "Remove marks: ")) t))
- (let ((re (if marks
- (tablist-marker-regexp marks)
- "^[^ ]"))
- (removed 0))
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward re nil t)
- (let ((tablist-marker-char ?\s)
- tablist-marker-face
- tablist-marked-face)
- (tablist-put-mark))
- (cl-incf removed)))
- (when interactive
- (message "Removed %d marks" removed))
- removed))
-
-(defun tablist-toggle-marks ()
- "Unmark all marked and mark all unmarked entries.
-
-See `tablist-put-mark'."
- (interactive)
- (let ((marked-re (tablist-marker-regexp))
- (not-marked-re
- (let ((tablist-marker-char ?\s))
- (tablist-marker-regexp))))
- (save-excursion
- (goto-char (point-min))
- (tablist-skip-invisible-entries)
- (while (not (eobp))
- (cond
- ((looking-at marked-re)
- (save-excursion (tablist-unmark-backward -1)))
- ((looking-at not-marked-re)
- (tablist-put-mark)))
- (tablist-forward-entry)))
- (tablist-move-to-major-column)))
-
-(defun tablist-get-marked-items (&optional arg distinguish-one-marked)
- "Return marked or ARG entries."
- (let ((items (save-excursion
- (tablist-map-over-marks
- (lambda () (cons (tabulated-list-get-id)
- (tabulated-list-get-entry)))
- arg nil distinguish-one-marked))))
- (if (and distinguish-one-marked
- (eq (car items) t))
- items
- (nreverse items))))
-
-(defun tablist-mark-items-regexp (column-name regexp)
- "Mark entries matching REGEXP in column COLUMN-NAME."
- (interactive
- (tablist-read-regexp-filter "Mark" current-prefix-arg ))
- (tablist-map-with-filter
- 'tablist-put-mark
- `(=~ ,column-name ,regexp)))
-
-(defun tablist-mark-items-numeric (binop column-name operand)
- "Mark items fulfilling BINOP with arg OPERAND in column COLUMN-NAME.
-
-First the column's value is coerced to a number N. Then the test
-proceeds as \(BINOP N OPERAND\)."
- (interactive
- (tablist-read-numeric-filter "Mark" current-prefix-arg))
- (tablist-map-with-filter
- 'tablist-put-mark
- `(,binop ,column-name ,operand)))
-
-(defun tablist-map-over-marks (fn &optional arg show-progress
- distinguish-one-marked)
- (prog1
- (cond
- ((and arg (integerp arg))
- (let (results)
- (tablist-repeat-over-lines
- arg
- (lambda ()
- (if show-progress (sit-for 0))
- (push (funcall fn) results)))
- (if (< arg 0)
- (nreverse results)
- results)))
- (arg
- ;; non-nil, non-integer ARG means use current item:
- (tablist-skip-invisible-entries)
- (unless (eobp)
- (list (funcall fn))))
- (t
- (cl-labels ((search (re)
- (let (success)
- (tablist-skip-invisible-entries)
- (while (and (setq success
- (re-search-forward re nil t))
- (invisible-p (point)))
- (tablist-forward-entry))
- success)))
- (let ((regexp (tablist-marker-regexp))
- next-position results found)
- (save-excursion
- (goto-char (point-min))
- ;; remember position of next marked file before BODY
- ;; can insert lines before the just found file,
- ;; confusing us by finding the same marked file again
- ;; and again and...
- (setq next-position (and (search regexp)
- (point-marker))
- found (not (null next-position)))
- (while next-position
- (goto-char next-position)
- (if show-progress (sit-for 0))
- (push (funcall fn) results)
- ;; move after last match
- (goto-char next-position)
- (forward-line 1)
- (set-marker next-position nil)
- (setq next-position (and (search regexp)
- (point-marker)))))
- (if (and distinguish-one-marked (= (length results) 1))
- (setq results (cons t results)))
- (if found
- results
- (unless (or (eobp) (invisible-p (point)))
- (list (funcall fn))))))))
- (tablist-move-to-major-column)))
-
-(defun tablist-marker-regexp (&optional marks)
- "Return a regexp matching marks in MARKS.
-
-MARKS should be a string of mark characters to match and defaults
-to the current value of `tablist-marker-char' as a string."
- (concat (format "^[%s]"
- (or marks (string tablist-marker-char)))))
-
-(defun tablist-get-mark-state ()
- "Return the mark state of the entry at point."
- (save-excursion
- (beginning-of-line)
- (when (looking-at "^\\([^ ]\\)")
- (let ((mark (buffer-substring
- (match-beginning 1)
- (match-end 1))))
- (tablist-move-to-major-column)
- (list (aref mark 0)
- (get-text-property 0 'face mark)
- (get-text-property (point) 'face))))))
-
-(defun tablist-put-mark-state (state)
- "Set the mark of the entry at point according to STATE.
-
-STATE is a return value of `tablist-get-mark-state'."
- (cl-destructuring-bind (tablist-marker-char
- tablist-marker-face
- tablist-marked-face)
- state
- (tablist-put-mark)))
-
-(defun tablist-mark-prompt (arg items)
- "Return a string suitable for use in a tablist prompt."
- ;; distinguish-one-marked can cause the first element to be just t.
- (if (eq (car items) t) (setq items (cdr items)))
- (let ((count (length items)))
- (if (= count 1)
- (car items)
- ;; more than 1 item:
- (if (integerp arg)
- ;; abs(arg) = count
- ;; Perhaps this is nicer, but it also takes more screen space:
- ;;(format "[%s %d items]" (if (> arg 0) "next" "previous")
- ;; count)
- (format "[next %d item%s]"
- arg (dired-plural-s arg))
- (format "%c [%d item%s]" dired-marker-char count
- (dired-plural-s count))))))
-
-;;
-;; *Movement
-;;
-
-(defun tablist-forward-entry (&optional n)
- "Move past the next N unfiltered entries."
- (unless n (setq n 1))
- (while (and (> n 0)
- (not (eobp)))
- (forward-line)
- (when (invisible-p (point))
- (tablist-skip-invisible-entries))
- (cl-decf n))
- (while (and (< n 0)
- (not (bobp)))
- (forward-line -1)
- (when (invisible-p (point))
- (tablist-skip-invisible-entries t))
- (cl-incf n))
- n)
-
-(defun tablist-next-line (&optional n)
- (interactive "p")
- (when (and (< n 0)
- (save-excursion
- (end-of-line 0)
- (tablist-skip-invisible-entries t)
- (bobp)))
- (signal 'beginning-of-buffer nil))
- (when (and (> n 0)
- (save-excursion
- (tablist-forward-entry)
- (eobp)))
- (signal 'end-of-buffer nil))
-
- (let ((col (tablist-current-column)))
- (tablist-forward-entry (or n 1))
- (if col
- (tablist-move-to-column col)
- (tablist-move-to-major-column))))
-
-(defun tablist-previous-line (&optional n)
- (interactive "p")
- (tablist-next-line (- (or n 1))))
-
-(defun tablist-repeat-over-lines (arg function)
- "Call FUNCTION for the next ARG entries."
- ;; Move out of potentially invisble area.
- (tablist-skip-invisible-entries)
- (let ((pos (make-marker)))
- (while (and (> arg 0)
- (not (eobp)))
- (cl-decf arg)
- (save-excursion
- (tablist-forward-entry)
- (move-marker pos (1+ (point))))
- (unless (eobp)
- (save-excursion (funcall function)))
- ;; Advance to the next line--actually, to the line that *was* next.
- ;; (If FUNCTION inserted some new lines in between, skip them.)
- (goto-char pos))
- (while (and (< arg 0) (not (bobp)))
- (cl-incf arg)
- (tablist-forward-entry -1)
- (save-excursion (funcall function)))
- (move-marker pos nil)
- (tablist-move-to-major-column)))
-
-(defun tablist-move-to-column (n)
- "Move to the N'th list column."
- (interactive "p")
- (when (tabulated-list-get-id)
- (let ((columns (tablist-column-offsets)))
- (when (or (< n 0)
- (>= n (length columns)))
- (error "No such column: %s" n))
- (beginning-of-line)
- (forward-char (nth n columns))
- (when (and (plist-get (nthcdr 3 (elt tabulated-list-format n))
- :right-align)
- (not (= n (1- (length columns)))))
- (forward-char (1- (car (cdr (elt tabulated-list-format n)))))))))
-
-(defun tablist-move-to-major-column (&optional first-skip-invisible-p)
- "Move to the first major column."
- (interactive (list t))
- (when first-skip-invisible-p
- (tablist-skip-invisible-entries))
- (tablist-move-to-column (car (tablist-major-columns))))
-
-(defun tablist-forward-column (n)
- "Move n columns forward, while wrapping around."
- (interactive "p")
- (unless (tabulated-list-get-id)
- (error "No entry on this line"))
- (let* ((columns (tablist-column-offsets))
- (current (1- (length columns))))
- ;; find current column
- (while (and (>= current 0)
- (> (nth current columns)
- (current-column)))
- (cl-decf current))
- ;; there may be an invisible spec here
- (when (bolp)
- (forward-char))
- ;; before any columns
- (when (< current 0)
- (goto-char (+ (point-at-bol) (if (> n 0)
- (car columns)
- (car (last columns)))))
- (setq n (* (cl-signum n) (1- (abs n)))))
- (when (/= n 0)
- (tablist-move-to-column
- (mod (+ current n) (length columns))))))
-
-(defun tablist-backward-column (n)
- "Move n columns backward, while wrapping around."
- (interactive "p")
- (tablist-forward-column (- n)))
-
-;;
-(defun tablist-skip-invisible-entries (&optional backward)
- "Skip invisible entries BACKWARD or forward.
-
-Do nothing, if the entry at point is visible. Otherwise move to
-the beginning of the next visible entry in the direction
-determined by BACKWARD.
-
-Return t, if point is now in a visible area."
-
- (cond
- ((and backward
- (not (bobp))
- (get-text-property (point) 'invisible))
- (when (get-text-property (1- (point)) 'invisible)
- (goto-char (previous-single-property-change
- (point)
- 'invisible nil (point-min))))
- (forward-line -1))
- ((and (not backward)
- (not (eobp))
- (get-text-property (point) 'invisible))
- (goto-char (next-single-property-change
- (point)
- 'invisible nil (point-max)))))
- (not (invisible-p (point))))
-
-;;
-;; *Operations
-;;
-
-(defun tablist-yes-or-no-p (operation arg items)
- "Query the user whether to proceed with some operation.
-
-Operation should be a symbol or string describing the operation,
-ARG the prefix-arg of the command used in
-`tablist-get-marked-items' or elsewhere, to get the ITEMS."
-
- (let ((pp-items (mapcar 'tablist-pretty-print-entry
- (mapcar 'cdr items)))
- dired-no-confirm
- (op-str (upcase-initials
- (if (stringp operation)
- operation
- (symbol-name operation)))))
- (dired-mark-pop-up
- (format " *%s*" op-str) nil
- pp-items
- dired-deletion-confirmer
- (format "%s %s "
- op-str
- (tablist-mark-prompt arg pp-items)))))
-
-(defun tablist-operation-available-p (op)
- (and (functionp tablist-operations-function)
- (memq op (funcall tablist-operations-function
- 'supported-operations))))
-
-(defun tablist-do-delete (&optional arg)
- "Delete ARG entries."
- (interactive "P")
- (unless (tablist-operation-available-p 'delete)
- (error "Deleting entries is not available in this buffer"))
- (let ((items (tablist-get-marked-items arg)))
- (when (tablist-yes-or-no-p 'delete arg items)
- (tablist-do-kill-lines arg)
- (funcall tablist-operations-function
- 'delete (mapcar 'car items))
- (tablist-move-to-major-column))))
-
-(defun tablist-do-flagged-delete (&optional interactive)
- "Delete all entries marked with a D."
- (interactive "p")
- (let* ((tablist-marker-char ?D))
- (if (save-excursion
- (goto-char (point-min))
- (re-search-forward (tablist-marker-regexp) nil t))
- (tablist-do-delete)
- (or (not interactive)
- (message "(No deletions requested)")))))
-
-(defun tablist-do-kill-lines (&optional arg interactive)
- "Remove ARG lines from the display."
- (interactive (list current-prefix-arg t))
- (save-excursion
- (let ((positions
- (tablist-map-over-marks 'point arg))
- (inhibit-read-only t))
- (dolist (pos positions)
- (goto-char pos)
- (tabulated-list-delete-entry))
- (when interactive
- (message (format "Killed %d line%s"
- (length positions)
- (dired-plural-s (length positions))))))))
-
-(defun tablist-do-operation (arg fn operation &optional delete-p revert-p)
- "Operate on marked items.
-
-ARG should be the `current-prefix-arg', FN is a function of two
-arguments \(ID ENTRY\) handling the operation. It gets called
-repeatedly with all marked items. OPERATION is a symbol or string
-describing the operation, it is used for display.
-
-Optional non-nil DELETE-P means, remove the items from the display.
-Optional REVERT-P means, revert the display afterwards."
- (let ((items (tablist-get-marked-items arg)))
- (unless items
- (error "No items marked"))
- (when (tablist-yes-or-no-p operation arg items)
- (when delete-p
- (tablist-do-kill-lines arg))
- (dolist (item items)
- (funcall fn (car item)))
- (when revert-p
- (tablist-revert))
- (tablist-move-to-major-column))))
-
-;;
-;; *Editing
-;;
-(defvar tablist-edit-column-minor-mode-map
- (let ((kmap (make-sparse-keymap)))
- (set-keymap-parent kmap (current-global-map))
- (define-key kmap [remap self-insert-command] #'self-insert-command)
- (define-key kmap "\r" #'tablist-edit-column-commit)
- (define-key kmap (kbd "C-g") #'tablist-edit-column-quit)
- (define-key kmap (kbd "C-c C-c") #'tablist-edit-column-commit)
- (define-key kmap (kbd "C-c C-q") #'tablist-edit-column-quit)
- (define-key kmap "\t" #'tablist-edit-column-complete)
- (define-key kmap (kbd "TAB") #'tablist-edit-column-complete)
- (define-key kmap [remap end-of-buffer] #'end-of-line)
- (define-key kmap [remap beginning-of-buffer] #'beginning-of-line)
- (define-key kmap [remap mark-whole-buffer] #'tablist-edit-column-mark-field)
- kmap))
-
-(define-minor-mode tablist-edit-column-minor-mode
- "" nil nil nil
- (unless (or tablist-minor-mode
- (derived-mode-p 'tablist-mode))
- (error "Not in a tablist buffer"))
- (cond
- (tablist-edit-column-minor-mode
- (add-to-list 'mode-line-misc-info
- '(tablist-edit-column-minor-mode "[edit]"))
- (add-hook 'post-command-hook 'tablist-edit-column-constrain-point nil t)
- (read-only-mode -1))
- (t
- (remove-hook 'post-command-hook 'tablist-edit-column-constrain-point t)
- (read-only-mode 1))))
-
-(defun tablist-edit-column (&optional n)
- (interactive "P")
- (unless n (setq n (tablist-current-column)))
- (tablist-assert-column-editable n)
- (let* ((offsets (append (tablist-column-offsets)
- (list (- (point-at-eol)
- (point-at-bol)))))
- (beg (+ (point-at-bol)
- (nth n offsets)))
- (end (+ (point-at-bol)
- (nth (1+ n) offsets)))
- (entry (tabulated-list-get-entry beg))
- (inhibit-read-only t)
- (inhibit-field-text-motion t)
- (alist `((entry . ,entry)
- (column . ,n)
- (id . ,(tabulated-list-get-id beg))))
- ov)
- (goto-char beg)
- (delete-region beg end)
- (add-text-properties
- (point-at-bol) (point-at-eol)
- '(read-only t field t))
- (unless (= beg (point-at-bol))
- (put-text-property (1- beg) beg 'rear-nonsticky t))
- (save-excursion
- ;; Keep one read-only space at the end for keeping text
- ;; properties.
- (insert
- (propertize
- (concat
- (tablist-nth-entry n entry)
- (propertize " "
- 'display `(space :align-to ,(- end (point-at-bol)))))
- 'field nil
- 'front-sticky '(tablist-edit)
- 'rear-nonsticky '(read-only field)
- 'tablist-edit alist))
- (setq end (point)))
- (add-text-properties
- (1- end) end '(read-only t field 'tablist-edit-end))
- (setq ov (make-overlay beg end))
- (overlay-put ov 'priority 9999)
- (overlay-put ov 'face '(:background "deep sky blue" :foreground "white"))
- (overlay-put ov 'evaporate t)
- (overlay-put ov 'tablist-edit t)
- (tablist-edit-column-minor-mode 1)))
-
-(defun tablist-edit-column-quit ()
- (interactive)
- (tablist-edit-column-commit t))
-
-(defun tablist-edit-column-commit (&optional abandon-edit)
- (interactive (list current-prefix-arg))
- (let ((inhibit-read-only t)
- (inhibit-field-text-motion t)
- bounds)
- (condition-case nil
- (setq bounds (tablist-edit-column-bounds))
- (error
- (tablist-edit-column-minor-mode -1)
- (tabulated-list-revert)
- (put-text-property (point-min) (point-max)
- 'tablist-edit nil)
- (error "Unable to complete the edit")))
- (let* ((beg (car bounds))
- (end (cdr bounds))
- (alist (get-text-property beg 'tablist-edit))
- (column (cdr (assq 'column alist)))
- (id (cdr (assq 'id alist)))
- (entry (cdr (assq 'entry alist)))
- (item (buffer-substring-no-properties beg (1- end))))
-
- (unless abandon-edit
- ;; Throws an error, if item is invalid.
- (setq entry (funcall tablist-operations-function
- 'edit-column id column item)))
- (tablist-edit-column-minor-mode -1)
- (remove-overlays beg end 'tablist-edit t)
- (put-text-property beg end 'tablist-edit nil)
- (delete-region (point-at-bol) (1+ (point-at-eol)))
- (save-excursion
- (tabulated-list-print-entry id entry))
- (forward-char (nth column (tablist-column-offsets))))))
-
-(defun tablist-edit-column-complete ()
- (interactive)
- (unless (tablist-operation-available-p 'complete)
- (error "Completion not available"))
- (cl-destructuring-bind (beg &rest end)
- (tablist-edit-column-bounds t)
- (let* ((string (buffer-substring-no-properties
- beg end))
- (alist (get-text-property beg 'tablist-edit))
- (completions (funcall tablist-operations-function
- 'complete
- (cdr (assq 'id alist))
- (cdr (assq 'column alist))
- string
- (- (point) beg))))
- (unless completions
- (error "No completions available"))
- (completion-in-region beg end completions))))
-
-(defun tablist-column-editable (n)
- (and (tablist-operation-available-p 'edit-column)
- (not (tablist-column-property n :read-only))))
-
-(defun tablist-assert-column-editable (n)
- (unless (and (>= n 0)
- (< n (length tabulated-list-format)))
- (error "Invalid column number: %s" n))
- (unless (tablist-operation-available-p 'edit-column)
- (error "Editing columns not enabled in this buffer"))
- (when (tablist-column-property n :read-only)
- (error "This column is read-only")))
-
-(defun tablist-edit-column-constrain-point ()
- (unless tablist-edit-column-minor-mode
- (error "Not editing a column"))
- (unless (get-text-property (point) 'tablist-edit)
- (let ((bounds (tablist-edit-column-bounds)))
- (when bounds
- (if (> (point) (cdr bounds))
- (goto-char (1- (cdr bounds)))
- (goto-char (car bounds)))
- (point)))))
-
-(defun tablist-edit-column-bounds (&optional skip-final-space)
- (unless tablist-edit-column-minor-mode
- (error "Not editing a column"))
- (let ((pos (next-single-property-change
- (point) 'tablist-edit))
- beg end)
- (cond
- ((null pos)
- (setq end (previous-single-property-change
- (point-max) 'tablist-edit)
- beg (previous-single-property-change
- end 'tablist-edit)))
- ((get-text-property pos 'tablist-edit)
- (setq beg pos
- end (next-single-property-change
- pos 'tablist-edit)))
- (pos
- (setq end pos
- beg (previous-single-property-change
- pos 'tablist-edit))))
-
- (unless (and beg end (get-text-property beg 'tablist-edit))
- (error "Unable to locate edited text"))
- (cons beg (if skip-final-space (1- end) end))))
-
-(defun tablist-edit-column-mark-field ()
- (interactive)
- (push-mark (field-beginning))
- (push-mark (field-end) nil t)
- (goto-char (field-beginning)))
-
-(defun tablist-find-entry (&optional id)
- (interactive)
- (unless (tablist-operation-available-p 'find-entry)
- (error "Finding entries not supported in this buffer"))
- (funcall tablist-operations-function
- 'find-entry
- (or id (tabulated-list-get-id))))
-
-;;
-;; *Utility
-;;
-
-(defun tablist-column-property (n prop)
- (plist-get
- (nthcdr 3 (aref tabulated-list-format n))
- prop))
-
-(defun tablist-current-column ()
- "Return the column number at point.
-
-Returns nil, if point is before the first column."
- (let ((column
- (1- (cl-position
- (current-column)
- (append (tablist-column-offsets)
- (list most-positive-fixnum))
- :test (lambda (column offset) (> offset column))))))
- (when (>= column 0)
- column)))
-
-(defun tablist-column-offsets ()
- "Return a list of column positions.
-
-This is a list of offsets from the beginning of the line."
- (let ((cc tabulated-list-padding)
- columns)
- (dotimes (i (length tabulated-list-format))
- (let* ((c (aref tabulated-list-format i))
- (len (nth 1 c))
- (pad (or (plist-get (nthcdr 3 c) :pad-right)
- 1)))
- (push cc columns)
- (when (numberp len)
- (cl-incf cc len))
- (when pad
- (cl-incf cc pad))))
- (nreverse columns)))
-
-(defun tablist-pretty-print-entry (item)
- (mapconcat (lambda (i)
- (tablist-nth-entry i item))
- (tablist-major-columns) " "))
-
-(defun tablist--save-face-property (beg end)
- ;; We need to distinguish ,,not set'' from ''no face''.
- (unless (and (text-property-not-all beg end 'face nil)
- (< beg end))
- (put-text-property beg (1+ beg) 'face 'default))
- (unless (text-property-not-all beg end 'tablist-saved-face nil)
- (tablist-copy-text-property beg end 'face 'tablist-saved-face)))
-
-(defun tablist--restore-face-property (beg end)
- (when (text-property-not-all beg end 'tablist-saved-face nil)
- (tablist-copy-text-property beg end 'tablist-saved-face 'face)))
-
-(defun tablist-copy-text-property (beg end from to)
- "Copy text property FROM to TO in region BEG to END."
- (let ((inhibit-read-only t))
- (save-excursion
- (while (< beg end)
- (goto-char beg)
- (put-text-property
- (point)
- (setq beg (next-single-property-change
- (point) from nil end))
- to
- (get-text-property (point) from))))))
-
-;;
-(defun tablist-read-column-name (arg &optional prompt default)
- "Read the name of a column using ARG.
-
-If ARG is a number, return column ARG.
-If ARG is nil, return DEFAULT or the current column.
-Else ask the user, using PROMPT and DEFAULT."
- (cond
- ((numberp arg)
- (or (tablist-column-name
- (prefix-numeric-value arg))
- (error "No such column: %d" (prefix-numeric-value arg))))
- ((null arg)
- (or default
- (tablist-column-name
- (or (tablist-current-column)
- (car (tablist-major-columns))
- 0))))
- (t
- (let* ((default (or default
- (tablist-column-name
- (car (tablist-major-columns)))))
- (result
- (completing-read
- (format "%s %s: "
- (or prompt "Use column")
- (if default
- (format "(default %s)"
- default)
- ""))
- (tablist-column-names)
- nil t nil 'tablist-column-name-history)))
- (if (> (length result) 0)
- result
- (if (not default)
- (error "No column selected")
- default))))))
-
-(defun tablist-column-name (n)
- "Return the name of column N."
- (when (and n
- (>= n 0)
- (< n (length tabulated-list-format)))
- (substring-no-properties
- (car (elt tabulated-list-format n)) 0)))
-
-(defun tablist-column-names ()
- "Return a list of all column-names."
- (mapcar 'tablist-column-name
- (number-sequence 0 (1- (length tabulated-list-format)))))
-
-(defun tablist-nth-entry (n &optional entry)
- (unless entry (setq entry (tabulated-list-get-entry)))
- (when (and entry
- (>= n 0)
- (< n (length entry)))
- (let ((str (elt entry n)))
- (if (stringp str)
- str
- (car str)))))
-
-(defun tablist-major-column-name ()
- "Return a list of the major column names."
- (tablist-column-name (car (tablist-major-columns))))
-
-(defun tablist-export-csv (&optional separator always-quote-p
- invisible-p out-buffer display-p)
- "Export a tabulated list to a CSV format.
-
-Use SEPARATOR (or ;) and quote if necessary (or always if
-ALWAYS-QUOTE-P is non-nil). Only consider non-filtered entries,
-unless invisible-p is non-nil. Create a buffer for the output or
-insert it after point in OUT-BUFFER. Finally if DISPLAY-P is
-non-nil, display this buffer.
-
-Return the output buffer."
-
- (interactive (list nil t nil nil t))
- (unless (derived-mode-p 'tabulated-list-mode)
- (error "Not in Tabulated List Mode"))
- (unless (stringp separator)
- (setq separator (string (or separator ?\;))))
- (let* ((outb (or out-buffer
- (get-buffer-create
- (format "%s.csv" (buffer-name)))))
- (escape-re (format "[%s\"\n]" separator))
- (header (tablist-column-names)))
- (unless (buffer-live-p outb)
- (error "Expected a live buffer: %s" outb))
- (cl-labels
- ((printit (entry)
- (insert
- (mapconcat
- (lambda (e)
- (unless (stringp e)
- (setq e (car e)))
- (if (or always-quote-p
- (string-match escape-re e))
- (concat "\""
- (replace-regexp-in-string "\"" "\"\"" e t t)
- "\"")
- e))
- entry separator))
- (insert ?\n)))
- (with-current-buffer outb
- (let ((inhibit-read-only t))
- (erase-buffer)
- (printit header)))
- (save-excursion
- (goto-char (point-min))
- (unless invisible-p
- (tablist-skip-invisible-entries))
- (while (not (eobp))
- (let* ((entry (tabulated-list-get-entry)))
- (with-current-buffer outb
- (let ((inhibit-read-only t))
- (printit entry)))
- (if invisible-p
- (forward-line)
- (tablist-forward-entry)))))
- (if display-p
- (display-buffer outb))
- outb)))
-
-;;
-
-(defun tablist-enlarge-column (&optional column width)
- "Enlarge column COLUMN by WIDTH.
-
-This function is lazy and therefore pretty slow."
- (interactive
- (list nil (* (prefix-numeric-value current-prefix-arg)
- 3)))
- (unless column (setq column (tablist-current-column)))
- (unless column
- (error "No column given and no entry at point"))
- (unless width (setq width 1))
- (when (or (not (numberp column))
- (< column 0)
- (>= column (length tabulated-list-format)))
- (error "No such column: %d" column))
- (when (= column (1- (length tabulated-list-format)))
- (error "Can't resize last column"))
-
- (let* ((cur-width (cadr (elt tabulated-list-format column))))
- (setcar (cdr (elt tabulated-list-format column))
- (max 3 (+ cur-width width)))
- (tablist-with-remembering-entry
- (tablist-save-marks
- (tabulated-list-init-header)
- (tabulated-list-print)))))
-
-(defun tablist-shrink-column (&optional column width)
- (interactive
- (list nil (* (prefix-numeric-value current-prefix-arg)
- 3)))
- (tablist-enlarge-column column (- (or width 1))))
-
-;; *Sorting
-;;
-
-(defun tablist-sort (&optional column)
- "Sort the tabulated-list by COLUMN.
-
-COLUMN may be either a name or an index. The default compare
-function is given by the `tabulated-list-format', which see.
-
-This function saves the current sort column and the inverse
-sort-direction in the variable `tabulated-list-sort-key', which
-also determines the default COLUMN and direction.
-
-The main difference to `tabulated-list-sort' is, that this
-function sorts the buffer in-place and it ignores a nil sort
-entry in `tabulated-list-format' and sorts on the column
-anyway (why not ?)."
-
- (interactive
- (list
- (if (null current-prefix-arg)
- (tablist-column-name
- (or (tablist-current-column)
- (car (tablist-major-columns))
- 0))
- (tablist-read-column-name
- '(4) "Sort by column"
- (tablist-column-name (car (tablist-major-columns)))))))
-
- (unless column
- (setq column (or (car tabulated-list-sort-key)
- (tablist-column-name (car (tablist-major-columns)))
- (tablist-column-name 0))))
- (when (numberp column)
- (let ((column-name (tablist-column-name column)))
- (unless column-name
- (error "No such column: %d" column))
- (setq column column-name)))
-
- (setq tabulated-list-sort-key
- (cons column
- (if (equal column (car tabulated-list-sort-key))
- (cdr tabulated-list-sort-key))))
-
- (let* ((entries (if (functionp tabulated-list-entries)
- (funcall tabulated-list-entries)
- tabulated-list-entries))
- (reverse (cdr tabulated-list-sort-key))
- (n (tabulated-list--column-number ;;errors if column is n/a
- (car tabulated-list-sort-key)))
- (compare-fn (nth 2 (aref tabulated-list-format n))))
-
- (when (or (null compare-fn)
- (eq compare-fn t))
- (setq compare-fn
- (lambda (a b)
- (setq a (aref (cadr a) n))
- (setq b (aref (cadr b) n))
- (string< (if (stringp a) a (car a))
- (if (stringp b) b (car b))))))
-
- (unless compare-fn
- (error "This column cannot be sorted: %s" column))
-
- (setcdr tabulated-list-sort-key (not reverse))
- ;; Presort the entries and hash the result and sort the buffer.
- (setq entries (sort (copy-sequence entries) compare-fn))
- (let ((hash (make-hash-table :test 'equal)))
- (dotimes (i (length entries))
- (puthash (caar entries) i hash)
- (setq entries (cdr entries)))
- (tablist-with-remembering-entry
- (goto-char (point-min))
- (tablist-skip-invisible-entries)
- (let ((inhibit-read-only t))
- (sort-subr
- nil 'tablist-forward-entry 'end-of-line
- (lambda ()
- (gethash (tabulated-list-get-id) hash 0))
- nil (if reverse '< '>))))
- (tablist-move-to-column n)
- ;; Make the sort arrows display.
- (tabulated-list-init-header))))
-
-;;
-;; *Filter
-;;
-
-(defun tablist-read-filter-name (prompt)
- (let ((filter (cdr (assq major-mode tablist-named-filter))))
- (unless filter
- (error "No filter defined for %s mode" mode-name))
- (let ((name (completing-read
- (format "%s: " prompt)
- filter
- nil t)))
- (unless (> (length name) 0)
- (error "No filter selected"))
- name)))
-
-(defun tablist-apply-filter (&optional filter)
- "Apply FILTER to the current tabulated list.
-
-FILTER defaults to `tablist-current-filter'."
- (unless filter (setq filter tablist-current-filter))
- (tablist-filter-unhide-buffer)
- (when (and filter
- (null tablist-filter-suspended))
- (tablist-with-remembering-entry
- (tablist-map-with-filter
- (lambda nil
- (if tablist-umark-filtered-entries
- (save-excursion (tablist-unmark-forward)))
- (tablist-filter-hide-entry))
- (tablist-filter-negate filter))))
- (force-mode-line-update))
-
-(defadvice tabulated-list-print (after tabulated-list activate)
- "Reapply the filter."
- (when (or tablist-minor-mode
- (derived-mode-p 'tablist-mode))
- (tablist-apply-filter)))
-
-(defun tablist-eval-filter (filter)
- (tablist-filter-eval
- filter
- (tabulated-list-get-id)
- (tabulated-list-get-entry)
- (cdr (assq major-mode tablist-named-filter))))
-
-(defun tablist-map-with-filter (fn filter &optional show-progress
- distinguish-one-marked)
- "Call FN for every unfiltered entry matching FILTER."
- (prog1
- (cl-labels ((search ()
- (tablist-skip-invisible-entries)
- (while (and (not (eobp))
- (not (tablist-eval-filter filter)))
- (tablist-forward-entry))
- (unless (eobp)
- (point-marker))))
- (let (next-position results)
- (save-excursion
- (goto-char (point-min))
- (setq next-position (search))
- (while next-position
- (goto-char next-position)
- (if show-progress (sit-for 0))
- (push (funcall fn) results)
- ;; move after last match
- (goto-char next-position)
- (forward-line 1)
- (set-marker next-position nil)
- (setq next-position (search)))
- (if (and distinguish-one-marked (= (length results) 1))
- (setq results (cons t results))))))))
-
-;;
-;; **Filter Commands
-;;
-(defun tablist-push-filter (filter &optional interactive or-p)
- (setq tablist-current-filter
- (tablist-filter-push
- tablist-current-filter
- filter or-p))
- (tablist-apply-filter)
- (when interactive
- (tablist-display-filter-temporarily)))
-
-(defun tablist-pop-filter (&optional n interactive)
- "Remove the first N filter components."
- (interactive (list (prefix-numeric-value current-prefix-arg) t))
- (while (and tablist-current-filter
- (> n 0))
- (setq tablist-current-filter
- (tablist-filter-pop
- tablist-current-filter))
- (cl-decf n))
- (tablist-apply-filter)
- (when interactive
- (when (> n 0)
- (message "The filter is empty."))
- (tablist-display-filter-temporarily))
- n)
-
-(defun tablist-negate-filter (&optional interactive)
- "Negate the current filter."
- (interactive (list t))
- (setq tablist-current-filter
- (tablist-filter-negate
- tablist-current-filter))
- (tablist-apply-filter)
- (when interactive
- (tablist-display-filter-temporarily)))
-
-(defun tablist-toggle-first-filter-logic ()
- "Toggle between and/or for the first filter operand."
- (interactive)
- (setq tablist-current-filter
- (pcase tablist-current-filter
- (`(or ,x1 ,x2)
- `(and ,x1 ,x2))
- (`(and ,x1 ,x2)
- `(or ,x1 ,x2))
- (`(not ,x) x)
- (x `(not ,x))))
- (tablist-apply-filter)
- (tablist-display-filter-temporarily))
-
-(defun tablist-suspend-filter (&optional flag)
- "Temporarily disable filtering according to FLAG.
-
-Interactively, this command toggles filtering."
- (interactive
- (list (not tablist-filter-suspended)))
- (let ((state tablist-filter-suspended))
- (unless (eq (not (not state))
- (not (not flag)))
- (set (make-local-variable 'tablist-filter-suspended) flag)
- (tablist-apply-filter))))
-
-(defun tablist-read-regexp-filter (operation arg)
- (let ((column-name (tablist-read-column-name arg)))
- (list
- column-name
- (let ((re
- (read-regexp (format "%s where %s matches: " operation column-name))))
- (unless (> (length re) 0)
- (error "No regexp given"))
- re))))
-
-(defun tablist-read-equal-filter (operation arg)
- (let ((column-name (tablist-read-column-name arg)))
- (list
- column-name
- (read-string (format "%s where %s equals: " operation column-name)))))
-
-(defun tablist-read-numeric-filter (operation arg)
- (let* ((entry (tabulated-list-get-entry 1))
- (default (cl-some
- (lambda (idx)
- (let ((value (tablist-nth-entry idx entry)))
- (when (or (not (eq 0 (string-to-number value)))
- (equal "0" value))
- (tablist-column-name idx))))
- (number-sequence 0 (length entry))))
- (column-name (tablist-read-column-name arg nil default))
- (op (completing-read
- (format "%s %s matching binary op: " operation column-name)
- '("=" "<" ">" "<=" ">=") nil t))
- oper)
-
- (when (equal "" op)
- (error "No operation selected"))
- (setq op (intern op))
- (setq oper (number-to-string
- (read-number
- (format "%s where %s %s " operation column-name op))))
-
- (list op column-name oper)))
-
-(defun tablist-push-regexp-filter (column-name regexp)
- "Add a new filter matching REGEXP in COLUMN-NAME.
-
-The filter is and'ed with the current filter. Use
-`tablist-toggle-first-filter-logic' to change this."
- (interactive
- (tablist-with-filter-displayed
- (tablist-read-regexp-filter "Filter" current-prefix-arg)))
- (tablist-push-filter
- `(=~ ,column-name ,regexp)
- (called-interactively-p 'any)))
-
-(defun tablist-push-equal-filter (column-name string)
- "Add a new filter whre string equals COLUMN-NAME's value.
-
-The filter is and'ed with the current filter. Use
-`tablist-toggle-first-filter-logic' to change this."
- (interactive
- (tablist-with-filter-displayed
- (tablist-read-equal-filter "Filter" current-prefix-arg)))
- (tablist-push-filter
- `(== ,column-name ,string)
- (called-interactively-p 'any)))
-
-(defun tablist-push-numeric-filter (op column-name 2nd-arg)
- "Add a new filter matching a numeric predicate.
-
-The filter is and'ed with the current filter. Use
-`tablist-toggle-first-filter-logic' to change this."
- (interactive
- (tablist-with-filter-displayed
- (tablist-read-numeric-filter "Filter" current-prefix-arg)))
- (tablist-push-filter
- `(,op ,column-name ,2nd-arg)
- (called-interactively-p 'any)))
-
-(defun tablist-push-named-filter (name)
- "Add a named filter called NAME.
-
-Named filter are saved in the variable `tablist-named-filter'."
- (interactive
- (tablist-with-filter-displayed
- (list
- (tablist-read-filter-name "Add filter"))))
- (when (and name (symbolp name))
- (setq name (symbol-name name)))
- (tablist-push-filter name (called-interactively-p 'any)))
-
-(defun tablist-delete-named-filter (name &optional mode)
- (interactive
- (tablist-with-filter-displayed
- (list
- (tablist-read-filter-name "Delete filter"))))
- (setq tablist-current-filter
- (tablist-filter-map
- (lambda (f)
- (when (equal f name)
- (setq f (tablist-get-named-filter f)))
- f)
- tablist-current-filter))
- (unless mode (setq mode major-mode))
- (let ((mode-filter
- (assq mode tablist-named-filter)))
- (when mode-filter
- (setcdr mode-filter
- (cl-remove name (cdr mode-filter)
- :test 'equal :key 'car)))))
-
-(defun tablist-name-current-filter (name)
- (interactive
- (list (tablist-with-filter-displayed
- (read-string
- "Add name for current filter: "))))
- (unless tablist-current-filter
- (error "Filter is empty"))
- (unless (> (length name) 0)
- (error "No name given"))
- (tablist-put-named-filter
- name (if (stringp tablist-current-filter)
- (tablist-get-named-filter
- tablist-current-filter)
- tablist-current-filter))
- (setq tablist-current-filter name)
- (force-mode-line-update))
-
-(defun tablist-deconstruct-named-filter ()
- (interactive)
- (let (found)
- (setq tablist-current-filter
- (tablist-filter-map
- (lambda (f)
- (when (and (not found)
- (stringp f))
- (setq found t)
- (let ((df (tablist-get-named-filter f)))
- (unless df
- (error "Filter is not defined: %s" f))
- (setq f df)))
- f)
- tablist-current-filter))
- (unless found
- (error "No named filter found"))
- (force-mode-line-update)))
-
-(defun tablist-filter-names (&optional mode)
- (mapcar 'car (cdr (assq (or mode major-mode)
- tablist-named-filter))))
-
-(defun tablist-get-named-filter (name &optional mode)
- (cdr (assoc name
- (cdr (assq (or mode major-mode)
- tablist-named-filter)))))
-
-(defun tablist-put-named-filter (name filter &optional mode)
- (unless mode (setq mode major-mode))
- (let ((mode-filter
- (assq mode tablist-named-filter)))
- (unless mode-filter
- (setq mode-filter (cons mode nil))
- (push mode-filter tablist-named-filter))
- (let ((entry (assoc name mode-filter)))
- (if entry
- (setcdr entry filter)
- (setcdr mode-filter
- (list (cons name filter)))))))
-
-(defun tablist-validate-named-filter (filter)
- (tablist-filter-map
- (lambda (f)
- (when (and (stringp f)
- (null (tablist-get-named-filter f)))
- (error "Undefined named filter: %s (defined: %s)" f
- (mapconcat 'identity (tablist-filter-names) ","))))
- filter))
-
-(defun tablist-edit-filter ()
- (interactive)
- (setq tablist-current-filter
- (tablist-with-filter-displayed
- (tablist-filter-edit-filter
- "Edit filter: "
- tablist-current-filter
- nil
- 'tablist-validate-named-filter)))
- (tablist-apply-filter))
-
-(defun tablist-clear-filter ()
- (interactive)
- (setq tablist-current-filter nil)
- (tablist-apply-filter))
-
-;; **Displaying filter
-;;
-
-(defconst tablist-display-filter-mode-line-tag nil)
-
-(defun tablist-display-filter (&optional flag)
- "Display the current filter according to FLAG.
-
-If FLAG has the value 'toggle, toggle it's visibility.
-If FLAG has the 'state, then do nothing but return the current
-visibility."
- (interactive (list 'toggle))
- (let* ((tag 'tablist-display-filter-mode-line-tag)
- (displayed-p (not (not (assq tag mode-line-format)))))
- (if (eq flag 'state)
- displayed-p
- (let ((display-p (not (not (if (eq flag 'toggle)
- (not displayed-p)
- flag)))))
- (unless (eq displayed-p display-p)
- (setq mode-line-format
- (if display-p
- (list (cons tag mode-line-format)
- '(:eval
- (replace-regexp-in-string
- "%" "%%"
- (concat
- (propertize "Filter: " 'face 'minibuffer-prompt)
- (and tablist-filter-suspended
- "[suspended] ")
- (if tablist-current-filter
- (tablist-filter-unparse
- tablist-current-filter t)
- "[none]")))))
- (cdr (assq tag mode-line-format)))))
- (force-mode-line-update)
- display-p))))
-
-(defun tablist-display-filter-temporarily ()
- (tablist-with-filter-displayed
- (sit-for 9999)))
-
-;;
-;; **Hiding/Unhiding Entries
-;;
-(defun tablist-filter-set-entry-hidden (flag &optional pos)
- (save-excursion
- (when pos (goto-char pos))
- (beginning-of-line)
- (let ((inhibit-read-only t))
- (add-text-properties
- (point-at-bol)
- (1+ (point-at-eol))
- `(invisible ,flag)))))
-
-(defun tablist-filter-hide-entry (&optional pos)
- (interactive)
- (tablist-filter-set-entry-hidden t pos))
-
-(defun tablist-filter-unhide-entry (&optional pos)
- (tablist-filter-set-entry-hidden nil pos))
-
-(defun tablist-filter-unhide-buffer ()
- (let ((inhibit-read-only t))
- (remove-text-properties
- (point-min) (point-max)
- '(invisible))))
-
-(defun tablist-window-attach (awindow &optional window)
- "Attach AWINDOW to WINDOW.
-
-This has the following effect. Whenever WINDOW, defaulting to
-the selected window, stops displaying the buffer it currently
-displays (e.g., by switching buffers or because it was deleted)
-AWINDOW is deleted."
- (unless window (setq window (selected-window)))
- (let ((buffer (window-buffer window))
- (hook (make-symbol "window-attach-hook")))
- (fset hook
- (lambda ()
- (when (or (not (window-live-p window))
- (not (eq buffer (window-buffer window))))
- (remove-hook 'window-configuration-change-hook
- hook)
- ;; Deleting windows inside wcch may cause errors in
- ;; windows.el .
- (run-with-timer
- 0 nil (lambda (win)
- (when (and (window-live-p win)
- (not (eq win (selected-window))))
- (delete-window win)))
- awindow))))
- (add-hook 'window-configuration-change-hook hook)))
-
-(defun tablist-display-buffer-split-below-and-attach (buf alist)
- "Display buffer action using `tablist-window-attach'."
- (let ((window (selected-window))
- (height (cdr (assq 'window-height alist)))
- newwin)
- (when height
- (when (floatp height)
- (setq height (round (* height (frame-height)))))
- (setq height (- (max height window-min-height))))
- (setq newwin (window--display-buffer
- buf
- (split-window-below height)
- 'window alist))
- (tablist-window-attach newwin window)
- newwin))
-
-(defun tablist-generate-sorter (column compare-fn &optional read-fn)
- "Generate a sort function for `tabulated-list' entries.
-
-Example:
-
- \(tablist-generate-sorter 0 '< 'string-to-number\)
-
-would create a sort function sorting `tabulated-list-entries' on
-the 0-th column as numbers by the less-than relation."
-
- (lambda (e1 e2)
- (funcall compare-fn
- (funcall (or read-fn 'identity)
- (aref (cadr e1) column))
- (funcall (or read-fn 'identity)
- (aref (cadr e2) column)))))
-
-(provide 'tablist)
-;; Local Variables:
-;; outline-regexp: ";;\\(\\(?:[;*]+ \\| \\*+\\)[^\s\t\n]\\|###autoload\\)\\|("
-;; indent-tabs-mode: nil
-;; End:
-;;; tablist.el ends here
diff --git a/elpa/transient-20200719.955/dir b/elpa/transient-20200719.955/dir
deleted file mode 100644
index 4d6ad7f..0000000
--- a/elpa/transient-20200719.955/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* Transient: (transient). Transient Commands.
diff --git a/elpa/transient-20200719.955/transient-autoloads.el b/elpa/transient-20200719.955/transient-autoloads.el
deleted file mode 100644
index e20a77f..0000000
--- a/elpa/transient-20200719.955/transient-autoloads.el
+++ /dev/null
@@ -1,80 +0,0 @@
-;;; transient-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "transient" "transient.el" (0 0 0 0))
-;;; Generated autoloads from transient.el
-
-(autoload 'transient-insert-suffix "transient" "\
-Insert a SUFFIX into PREFIX before LOC.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'.
-
-\(fn PREFIX LOC SUFFIX)" nil nil)
-
-(function-put 'transient-insert-suffix 'lisp-indent-function 'defun)
-
-(autoload 'transient-append-suffix "transient" "\
-Insert a SUFFIX into PREFIX after LOC.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'.
-
-\(fn PREFIX LOC SUFFIX)" nil nil)
-
-(function-put 'transient-append-suffix 'lisp-indent-function 'defun)
-
-(autoload 'transient-replace-suffix "transient" "\
-Replace the suffix at LOC in PREFIX with SUFFIX.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'.
-
-\(fn PREFIX LOC SUFFIX)" nil nil)
-
-(function-put 'transient-replace-suffix 'lisp-indent-function 'defun)
-
-(autoload 'transient-remove-suffix "transient" "\
-Remove the suffix or group at LOC in PREFIX.
-PREFIX is a prefix command, a symbol.
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'.
-
-\(fn PREFIX LOC)" nil nil)
-
-(function-put 'transient-remove-suffix 'lisp-indent-function 'defun)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "transient" '("transient-")))
-
-;;;***
-
-;;;### (autoloads nil nil ("transient-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; transient-autoloads.el ends here
diff --git a/elpa/transient-20200719.955/transient-pkg.el b/elpa/transient-20200719.955/transient-pkg.el
deleted file mode 100644
index 4f00e2d..0000000
--- a/elpa/transient-20200719.955/transient-pkg.el
+++ /dev/null
@@ -1,12 +0,0 @@
-(define-package "transient" "20200719.955" "Transient commands"
- '((emacs "25.1"))
- :commit "4d44d08e90355a8ef36aaad1f9f79c95de1ce0e9" :keywords
- '("bindings")
- :authors
- '(("Jonas Bernoulli" . "jonas@bernoul.li"))
- :maintainer
- '("Jonas Bernoulli" . "jonas@bernoul.li")
- :url "https://github.com/magit/transient")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/transient-20200719.955/transient.el b/elpa/transient-20200719.955/transient.el
deleted file mode 100644
index ae11a1d..0000000
--- a/elpa/transient-20200719.955/transient.el
+++ /dev/null
@@ -1,3417 +0,0 @@
-;;; transient.el --- Transient commands -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2018-2020 Free Software Foundation, Inc.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Homepage: https://github.com/magit/transient
-;; Package-Requires: ((emacs "25.1"))
-;; Keywords: bindings
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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.
-
-;; GNU Emacs 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 this program. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Taking inspiration from prefix keys and prefix arguments, Transient
-;; implements a similar abstraction involving a prefix command, infix
-;; arguments and suffix commands. We could call this abstraction a
-;; "transient command", but because it always involves at least two
-;; commands (a prefix and a suffix) we prefer to call it just a
-;; "transient".
-
-;; When the user calls a transient prefix command, then a transient
-;; (temporary) keymap is activated, which binds the transient's infix
-;; and suffix commands, and functions that control the transient state
-;; are added to `pre-command-hook' and `post-command-hook'. The
-;; available suffix and infix commands and their state are shown in
-;; the echo area until the transient is exited by invoking a suffix
-;; command.
-
-;; Calling an infix command causes its value to be changed, possibly
-;; by reading a new value in the minibuffer.
-
-;; Calling a suffix command usually causes the transient to be exited
-;; but suffix commands can also be configured to not exit the
-;; transient state.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'eieio)
-(require 'format-spec)
-(require 'seq)
-
-(eval-when-compile
- (require 'subr-x))
-
-(and (require 'async-bytecomp nil t)
- (let ((pkgs (bound-and-true-p async-bytecomp-allowed-packages)))
- (if (consp pkgs)
- (cl-intersection '(all magit transient) pkgs)
- (memq pkgs '(all t))))
- (fboundp 'async-bytecomp-package-mode)
- (async-bytecomp-package-mode 1))
-
-(declare-function info 'info)
-(declare-function Man-find-section 'man)
-(declare-function Man-next-section 'man)
-(declare-function Man-getpage-in-background 'man)
-
-(defvar Man-notify-method)
-
-(define-obsolete-function-alias 'define-transient-command
- 'transient-define-prefix "Transient 0.3.0")
-(define-obsolete-function-alias 'define-suffix-command
- 'transient-define-suffix "Transient 0.3.0")
-(define-obsolete-function-alias 'define-infix-command
- 'transient-define-infix "Transient 0.3.0")
-(define-obsolete-function-alias 'define-infix-argument
- 'transient-define-argument "Transient 0.3.0")
-
-(define-obsolete-variable-alias 'current-transient-prefix
- 'transient-current-prefix "Transient 0.3.0")
-(define-obsolete-variable-alias 'current-transient-command
- 'transient-current-command "Transient 0.3.0")
-(define-obsolete-variable-alias 'current-transient-suffixes
- 'transient-current-suffixes "Transient 0.3.0")
-(define-obsolete-variable-alias 'post-transient-hook
- 'transient-exit-hook "Transient 0.3.0")
-
-;;; Options
-
-(defgroup transient nil
- "Transient commands."
- :group 'extensions)
-
-(defcustom transient-show-popup t
- "Whether to show the current transient in a popup buffer.
-
-- If t, then show the popup as soon as a transient prefix command
- is invoked.
-
-- If nil, then do not show the popup unless the user explicitly
- requests it, by pressing an incomplete prefix key sequence.
-
-- If a number, then delay displaying the popup and instead show
- a brief one-line summary. If zero or negative, then suppress
- even showing that summary and display the pressed key only.
-
- Show the popup when the user explicitly requests it by pressing
- an incomplete prefix key sequence. Unless zero, then also show
- the popup after that many seconds of inactivity (using the
- absolute value)."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type '(choice (const :tag "instantly" t)
- (const :tag "on demand" nil)
- (const :tag "on demand (no summary)" 0)
- (number :tag "after delay" 1)))
-
-(defcustom transient-enable-popup-navigation nil
- "Whether navigation commands are enabled in the transient popup.
-
-While a transient is active the transient popup buffer is not the
-current buffer, making it necessary to use dedicated commands to
-act on that buffer itself. If this non-nil, then the following
-features are available:
-
-- \"<up>\" moves the cursor to the previous suffix.
- \"<down>\" moves the cursor to the next suffix.
- \"RET\" invokes the suffix the cursor is on.
-- \"<mouse-1>\" invokes the clicked on suffix.
-- \"C-s\" and \"C-r\" start isearch in the popup buffer."
- :package-version '(transient . "0.2.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-display-buffer-action
- '(display-buffer-in-side-window
- (side . bottom)
- (inhibit-same-window . t))
- "The action used to display the transient popup buffer.
-
-The transient popup buffer is displayed in a window using
-
- \(display-buffer buf transient-display-buffer-action)
-
-The value of this option has the form (FUNCTION . ALIST),
-where FUNCTION is a function or a list of functions. Each such
-function should accept two arguments: a buffer to display and
-an alist of the same form as ALIST. See `display-buffer' for
-details.
-
-The default is (display-buffer-in-side-window (side . bottom)).
-This displays the window at the bottom of the selected frame.
-Another useful value is (display-buffer-below-selected). This
-is what `magit-popup' used by default. For more alternatives
-see info node `(elisp)Display Action Functions'.
-
-It may be possible to display the window in another frame, but
-whether that works in practice depends on the window-manager.
-If the window manager selects the new window (Emacs frame),
-then it doesn't work.
-
-If you change the value of this option, then you might also
-want to change the value of `transient-mode-line-format'."
- :package-version '(transient . "0.3.0")
- :group 'transient
- :type '(cons (choice function (repeat :tag "Functions" function))
- alist))
-
-(defcustom transient-mode-line-format 'line
- "The mode-line format for the transient popup buffer.
-
-If nil, then the buffer has no mode-line. If the buffer is not
-displayed right above the echo area, then this probably is not
-a good value.
-
-If `line' (the default), then the buffer also has no mode-line,
-but a thin line is drawn instead, using the background color of
-the face `transient-separator'. Termcap frames cannot display
-thin lines and therefore fallback to treating `line' like nil.
-
-Otherwise this can be any mode-line format.
-See `mode-line-format' for details."
- :package-version '(transient . "0.2.0")
- :group 'transient
- :type '(choice (const :tag "hide mode-line" nil)
- (const :tag "substitute thin line" line)
- (const :tag "name of prefix command"
- ("%e" mode-line-front-space
- mode-line-buffer-identification))
- (sexp :tag "custom mode-line format")))
-
-(defcustom transient-show-common-commands nil
- "Whether to show common transient suffixes in the popup buffer.
-
-These commands are always shown after typing the prefix key
-\"C-x\" when a transient command is active. To toggle the value
-of this variable use \"C-x t\" when a transient is active."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-read-with-initial-input nil
- "Whether to use the last history element as initial minibuffer input."
- :package-version '(transient . "0.2.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-highlight-mismatched-keys nil
- "Whether to highlight keys that do not match their argument.
-
-This only affects infix arguments that represent command-line
-arguments. When this option is non-nil, then the key binding
-for infix argument are highlighted when only a long argument
-\(e.g. \"--verbose\") is specified but no shor-thand (e.g \"-v\").
-In the rare case that a short-hand is specified but does not
-match the key binding, then it is highlighed differently.
-
-The highlighting is done using using `transient-mismatched-key'
-and `transient-nonstandard-key'."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-substitute-key-function nil
- "Function used to modify key bindings.
-
-This function is called with one argument, the prefix object,
-and must return a key binding description, either the existing
-key description it finds in the `key' slot, or a substitution.
-
-This is intended to let users replace certain prefix keys. It
-could also be used to make other substitutions, but that is
-discouraged.
-
-For example, \"=\" is hard to reach using my custom keyboard
-layout, so I substitute \"(\" for that, which is easy to reach
-using a layout optimized for lisp.
-
- (setq transient-substitute-key-function
- (lambda (obj)
- (let ((key (oref obj key)))
- (if (string-match \"\\\\`\\\\(=\\\\)[a-zA-Z]\" key)
- (replace-match \"(\" t t key 1)
- key)))))"
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type '(choice (const :tag "Transform no keys (nil)" nil) function))
-
-(defcustom transient-semantic-coloring nil
- "Whether to color prefixes and suffixes in Hydra-like fashion.
-This feature is experimental.
-
-If non-nil, then the key binding of each suffix is colorized to
-indicate whether it exits the transient state or not. The color
-of the prefix is indicated using the line that is drawn when the
-value of `transient-mode-line-format' is `line'.
-
-For more information about how Hydra uses colors see
-https://github.com/abo-abo/hydra#color and
-https://oremacs.com/2015/02/19/hydra-colors-reloaded."
- :package-version '(transient . "0.3.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-detect-key-conflicts nil
- "Whether to detect key binding conflicts.
-
-Conflicts are detected when a transient prefix command is invoked
-and results in an error, which prevents the transient from being
-used."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-force-fixed-pitch nil
- "Whether to force used of monospaced font in popup buffer.
-
-Even if you use a proportional font for the `default' face,
-you might still want to use a monospaced font in transient's
-popup buffer. Setting this option to t causes `default' to
-be remapped to `fixed-pitch' in that buffer."
- :package-version '(transient . "0.2.0")
- :group 'transient
- :type 'boolean)
-
-(defcustom transient-default-level 4
- "Control what suffix levels are made available by default.
-
-Each suffix command is placed on a level and each prefix command
-has a level, which controls which suffix commands are available.
-Integers between 1 and 7 (inclusive) are valid levels.
-
-The levels of individual transients and/or their individual
-suffixes can be changed individually, by invoking the prefix and
-then pressing \"C-x l\".
-
-The default level for both transients and their suffixes is 4.
-This option only controls the default for transients. The default
-suffix level is always 4. The author of a transient should place
-certain suffixes on a higher level if they expect that it won't be
-of use to most users, and they should place very important suffixes
-on a lower level so that they remain available even if the user
-lowers the transient level.
-
-\(Magit currently places nearly all suffixes on level 4 and lower
-levels are not used at all yet. So for the time being you should
-not set a lower level here and using a higher level might not
-give you as many additional suffixes as you hoped.)"
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type '(choice (const :tag "1 - fewest suffixes" 1)
- (const 2)
- (const 3)
- (const :tag "4 - default" 4)
- (const 5)
- (const 6)
- (const :tag "7 - most suffixes" 7)))
-
-(defcustom transient-levels-file
- (locate-user-emacs-file (convert-standard-filename "transient/levels.el"))
- "File used to save levels of transients and their suffixes."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'file)
-
-(defcustom transient-values-file
- (locate-user-emacs-file (convert-standard-filename "transient/values.el"))
- "File used to save values of transients."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'file)
-
-(defcustom transient-history-file
- (locate-user-emacs-file (convert-standard-filename "transient/history.el"))
- "File used to save history of transients and their infixes."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'file)
-
-(defcustom transient-history-limit 10
- "Number of history elements to keep when saving to file."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'integer)
-
-(defcustom transient-save-history t
- "Whether to save history of transient commands when exiting Emacs."
- :package-version '(transient . "0.1.0")
- :group 'transient
- :type 'boolean)
-
-;;; Faces
-
-(defgroup transient-faces nil
- "Faces used by Transient."
- :group 'transient)
-
-(defface transient-heading '((t :inherit font-lock-keyword-face))
- "Face used for headings."
- :group 'transient-faces)
-
-(defface transient-key '((t :inherit font-lock-builtin-face))
- "Face used for keys."
- :group 'transient-faces)
-
-(defface transient-argument '((t :inherit font-lock-warning-face))
- "Face used for enabled arguments."
- :group 'transient-faces)
-
-(defface transient-value '((t :inherit font-lock-string-face))
- "Face used for values."
- :group 'transient-faces)
-
-(defface transient-inactive-argument '((t :inherit shadow))
- "Face used for inactive arguments."
- :group 'transient-faces)
-
-(defface transient-inactive-value '((t :inherit shadow))
- "Face used for inactive values."
- :group 'transient-faces)
-
-(defface transient-unreachable '((t :inherit shadow))
- "Face used for suffixes unreachable from the current prefix sequence."
- :group 'transient-faces)
-
-(defface transient-active-infix '((t :inherit secondary-selection))
- "Face used for the infix for which the value is being read."
- :group 'transient-faces)
-
-(defface transient-unreachable-key '((t :inherit shadow))
- "Face used for keys unreachable from the current prefix sequence."
- :group 'transient-faces)
-
-(defface transient-nonstandard-key '((t :underline t))
- "Face optionally used to highlight keys conflicting with short-argument.
-Also see option `transient-highlight-mismatched-keys'."
- :group 'transient-faces)
-
-(defface transient-mismatched-key '((t :underline t))
- "Face optionally used to highlight keys without a short-argument.
-Also see option `transient-highlight-mismatched-keys'."
- :group 'transient-faces)
-
-(defface transient-inapt-suffix '((t :inherit shadow :italic t))
- "Face used for suffixes that are inapt at this time."
- :group 'transient-faces)
-
-(defface transient-enabled-suffix
- '((t :background "green" :foreground "black" :weight bold))
- "Face used for enabled levels while editing suffix levels.
-See info node `(transient)Enabling and Disabling Suffixes'."
- :group 'transient-faces)
-
-(defface transient-disabled-suffix
- '((t :background "red" :foreground "black" :weight bold))
- "Face used for disabled levels while editing suffix levels.
-See info node `(transient)Enabling and Disabling Suffixes'."
- :group 'transient-faces)
-
-(defface transient-separator
- `((((class color) (background light))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey80")
- (((class color) (background dark))
- ,@(and (>= emacs-major-version 27) '(:extend t))
- :background "grey30"))
- "Face used to draw line below transient popup window.
-This is only used if `transient-mode-line-format' is `line'.
-Only the background color is significant."
- :group 'transient-faces)
-
-(defgroup transient-color-faces
- '((transient-semantic-coloring custom-variable))
- "Faces used by Transient for Hydra-like command coloring.
-These faces are only used if `transient-semantic-coloring'
-\(which see) is non-nil."
- :group 'transient-faces)
-
-(defface transient-red
- '((t :inherit transient-key :foreground "red"))
- "Face used for red prefixes and suffixes."
- :group 'transient-color-faces)
-
-(defface transient-blue
- '((t :inherit transient-key :foreground "blue"))
- "Face used for blue prefixes and suffixes."
- :group 'transient-color-faces)
-
-(defface transient-amaranth
- '((t :inherit transient-key :foreground "#E52B50"))
- "Face used for amaranth prefixes."
- :group 'transient-color-faces)
-
-(defface transient-pink
- '((t :inherit transient-key :foreground "#FF6EB4"))
- "Face used for pink prefixes."
- :group 'transient-color-faces)
-
-(defface transient-teal
- '((t :inherit transient-key :foreground "#367588"))
- "Face used for teal prefixes."
- :group 'transient-color-faces)
-
-;;; Persistence
-
-(defun transient--read-file-contents (file)
- (with-demoted-errors "Transient error: %S"
- (and (file-exists-p file)
- (with-temp-buffer
- (insert-file-contents file)
- (read (current-buffer))))))
-
-(defun transient--pp-to-file (object file)
- (make-directory (file-name-directory file) t)
- (setq object (cl-sort object #'string< :key #'car))
- (with-temp-file file
- (let ((print-level nil)
- (print-length nil))
- (pp object (current-buffer)))))
-
-(defvar transient-values
- (transient--read-file-contents transient-values-file)
- "Values of transient commands.
-The value of this variable persists between Emacs sessions
-and you usually should not change it manually.")
-
-(defun transient-save-values ()
- (transient--pp-to-file transient-values transient-values-file))
-
-(defvar transient-levels
- (transient--read-file-contents transient-levels-file)
- "Levels of transient commands.
-The value of this variable persists between Emacs sessions
-and you usually should not change it manually.")
-
-(defun transient-save-levels ()
- (transient--pp-to-file transient-levels transient-levels-file))
-
-(defvar transient-history
- (transient--read-file-contents transient-history-file)
- "History of transient commands and infix arguments.
-The value of this variable persists between Emacs sessions
-\(unless `transient-save-history' is nil) and you usually
-should not change it manually.")
-
-(defun transient-save-history ()
- (setq transient-history
- (cl-sort (mapcar (pcase-lambda (`(,key . ,val))
- (cons key (seq-take (delete-dups val)
- transient-history-limit)))
- transient-history)
- #'string< :key #'car))
- (transient--pp-to-file transient-history transient-history-file))
-
-(defun transient-maybe-save-history ()
- "Save the value of `transient-history'.
-If `transient-save-history' is nil, then do nothing."
- (when transient-save-history
- (transient-save-history)))
-
-(unless noninteractive
- (add-hook 'kill-emacs-hook 'transient-maybe-save-history))
-
-;;; Classes
-;;;; Prefix
-
-(defclass transient-prefix ()
- ((prototype :initarg :prototype)
- (command :initarg :command)
- (level :initarg :level)
- (variable :initarg :variable :initform nil)
- (value) (default-value :initarg :value)
- (scope :initarg :scope :initform nil)
- (history :initarg :history :initform nil)
- (history-pos :initarg :history-pos :initform 0)
- (history-key :initarg :history-key :initform nil)
- (man-page :initarg :man-page :initform nil)
- (info-manual :initarg :info-manual :initform nil)
- (transient-suffix :initarg :transient-suffix :initform nil)
- (transient-non-suffix :initarg :transient-non-suffix :initform nil)
- (incompatible :initarg :incompatible :initform nil))
- "Transient prefix command.
-
-Each transient prefix command consists of a command, which is
-stored in a symbol's function slot and an object, which is
-stored in the `transient--prefix' property of the same symbol.
-
-When a transient prefix command is invoked, then a clone of that
-object is stored in the global variable `transient--prefix' and
-the prototype is stored in the clone's `prototype' slot.")
-
-;;;; Suffix
-
-(defclass transient-child ()
- ((level
- :initarg :level
- :initform 1
- :documentation "Enable if level of prefix is equal or greater.")
- (if
- :initarg :if
- :initform nil
- :documentation "Enable if predicate returns non-nil.")
- (if-not
- :initarg :if-not
- :initform nil
- :documentation "Enable if predicate returns nil.")
- (if-non-nil
- :initarg :if-non-nil
- :initform nil
- :documentation "Enable if variable's value is non-nil.")
- (if-nil
- :initarg :if-nil
- :initform nil
- :documentation "Enable if variable's value is nil.")
- (if-mode
- :initarg :if-mode
- :initform nil
- :documentation "Enable if major-mode matches value.")
- (if-not-mode
- :initarg :if-not-mode
- :initform nil
- :documentation "Enable if major-mode does not match value.")
- (if-derived
- :initarg :if-derived
- :initform nil
- :documentation "Enable if major-mode derives from value.")
- (if-not-derived
- :initarg :if-not-derived
- :initform nil
- :documentation "Enable if major-mode does not derive from value."))
- "Abstract superclass for group and and suffix classes.
-
-It is undefined what happens if more than one `if*' predicate
-slot is non-nil."
- :abstract t)
-
-(defclass transient-suffix (transient-child)
- ((key :initarg :key)
- (command :initarg :command)
- (transient :initarg :transient)
- (format :initarg :format :initform " %k %d")
- (description :initarg :description :initform nil)
- (inapt :initform nil)
- (inapt-if
- :initarg :inapt-if
- :initform nil
- :documentation "Inapt if predicate returns non-nil.")
- (inapt-if-not
- :initarg :inapt-if-not
- :initform nil
- :documentation "Inapt if predicate returns nil.")
- (inapt-if-non-nil
- :initarg :inapt-if-non-nil
- :initform nil
- :documentation "Inapt if variable's value is non-nil.")
- (inapt-if-nil
- :initarg :inapt-if-nil
- :initform nil
- :documentation "Inapt if variable's value is nil.")
- (inapt-if-mode
- :initarg :inapt-if-mode
- :initform nil
- :documentation "Inapt if major-mode matches value.")
- (inapt-if-not-mode
- :initarg :inapt-if-not-mode
- :initform nil
- :documentation "Inapt if major-mode does not match value.")
- (inapt-if-derived
- :initarg :inapt-if-derived
- :initform nil
- :documentation "Inapt if major-mode derives from value.")
- (inapt-if-not-derived
- :initarg :inapt-if-not-derived
- :initform nil
- :documentation "Inapt if major-mode does not derive from value."))
- "Superclass for suffix command.")
-
-(defclass transient-infix (transient-suffix)
- ((transient :initform t)
- (argument :initarg :argument)
- (shortarg :initarg :shortarg)
- (value :initform nil)
- (multi-value :initarg :multi-value :initform nil)
- (allow-empty :initarg :allow-empty :initform nil)
- (history-key :initarg :history-key :initform nil)
- (reader :initarg :reader :initform nil)
- (prompt :initarg :prompt :initform nil)
- (choices :initarg :choices :initform nil)
- (format :initform " %k %d (%v)"))
- "Transient infix command."
- :abstract t)
-
-(defclass transient-argument (transient-infix) ()
- "Abstract superclass for infix arguments."
- :abstract t)
-
-(defclass transient-switch (transient-argument) ()
- "Class used for command-line argument that can be turned on and off.")
-
-(defclass transient-option (transient-argument) ()
- "Class used for command-line argument that can take a value.")
-
-(defclass transient-variable (transient-infix)
- ((variable :initarg :variable)
- (format :initform " %k %d %v"))
- "Abstract superclass for infix commands that set a variable."
- :abstract t)
-
-(defclass transient-switches (transient-argument)
- ((argument-format :initarg :argument-format)
- (argument-regexp :initarg :argument-regexp))
- "Class used for sets of mutually exclusive command-line switches.")
-
-(defclass transient-files (transient-infix) ()
- "Class used for the \"--\" argument.
-All remaining arguments are treated as files.
-They become the value of this this argument.")
-
-;;;; Group
-
-(defclass transient-group (transient-child)
- ((suffixes :initarg :suffixes :initform nil)
- (hide :initarg :hide :initform nil)
- (description :initarg :description :initform nil))
- "Abstract superclass of all group classes."
- :abstract t)
-
-(defclass transient-column (transient-group) ()
- "Group class that displays each element on a separate line.")
-
-(defclass transient-row (transient-group) ()
- "Group class that displays all elements on a single line.")
-
-(defclass transient-columns (transient-group) ()
- "Group class that displays elements organized in columns.
-Direct elements have to be groups whose elements have to be
-commands or string. Each subgroup represents a column. This
-class takes care of inserting the subgroups' elements.")
-
-(defclass transient-subgroups (transient-group) ()
- "Group class that wraps other groups.
-
-Direct elements have to be groups whose elements have to be
-commands or strings. This group inserts an empty line between
-subgroups. The subgroups are responsible for displaying their
-elements themselves.")
-
-;;; Define
-
-(defmacro transient-define-prefix (name arglist &rest args)
- "Define NAME as a transient prefix command.
-
-ARGLIST are the arguments that command takes.
-DOCSTRING is the documentation string and is optional.
-
-These arguments can optionally be followed by key-value pairs.
-Each key has to be a keyword symbol, either `:class' or a keyword
-argument supported by the constructor of that class. The
-`transient-prefix' class is used if the class is not specified
-explicitly.
-
-GROUPs add key bindings for infix and suffix commands and specify
-how these bindings are presented in the popup buffer. At least
-one GROUP has to be specified. See info node `(transient)Binding
-Suffix and Infix Commands'.
-
-The BODY is optional. If it is omitted, then ARGLIST is also
-ignored and the function definition becomes:
-
- (lambda ()
- (interactive)
- (transient-setup \\='NAME))
-
-If BODY is specified, then it must begin with an `interactive'
-form that matches ARGLIST, and it must call `transient-setup'.
-It may however call that function only when some condition is
-satisfied; that is one of the reason why you might want to use
-an explicit BODY.
-
-All transients have a (possibly nil) value, which is exported
-when suffix commands are called, so that they can consume that
-value. For some transients it might be necessary to have a sort
-of secondary value, called a scope. Such a scope would usually
-be set in the commands `interactive' form and has to be passed
-to the setup function:
-
- (transient-setup \\='NAME nil nil :scope SCOPE)
-
-\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])"
- (declare (debug (&define name lambda-list
- [&optional lambda-doc]
- [&rest keywordp sexp]
- [&rest vectorp]
- [&optional ("interactive" interactive) def-body]))
- (indent defun)
- (doc-string 3))
- (pcase-let ((`(,class ,slots ,suffixes ,docstr ,body)
- (transient--expand-define-args args)))
- `(progn
- (defalias ',name
- ,(if body
- `(lambda ,arglist ,@body)
- `(lambda ()
- (interactive)
- (transient-setup ',name))))
- (put ',name 'interactive-only t)
- (put ',name 'function-documentation ,docstr)
- (put ',name 'transient--prefix
- (,(or class 'transient-prefix) :command ',name ,@slots))
- (put ',name 'transient--layout
- ',(cl-mapcan (lambda (s) (transient--parse-child name s))
- suffixes)))))
-
-(defmacro transient-define-suffix (name arglist &rest args)
- "Define NAME as a transient suffix command.
-
-ARGLIST are the arguments that the command takes.
-DOCSTRING is the documentation string and is optional.
-
-These arguments can optionally be followed by key-value pairs.
-Each key has to be a keyword symbol, either `:class' or a
-keyword argument supported by the constructor of that class.
-The `transient-suffix' class is used if the class is not
-specified explicitly.
-
-The BODY must begin with an `interactive' form that matches
-ARGLIST. The infix arguments are usually accessed by using
-`transient-args' inside `interactive'.
-
-\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... BODY...)"
- (declare (debug (&define name lambda-list
- [&optional lambda-doc]
- [&rest keywordp sexp]
- ("interactive" interactive)
- def-body))
- (indent defun)
- (doc-string 3))
- (pcase-let ((`(,class ,slots ,_ ,docstr ,body)
- (transient--expand-define-args args)))
- `(progn
- (defalias ',name (lambda ,arglist ,@body))
- (put ',name 'interactive-only t)
- (put ',name 'function-documentation ,docstr)
- (put ',name 'transient--suffix
- (,(or class 'transient-suffix) :command ',name ,@slots)))))
-
-(defmacro transient-define-infix (name _arglist &rest args)
- "Define NAME as a transient infix command.
-
-ARGLIST is always ignored and reserved for future use.
-DOCSTRING is the documentation string and is optional.
-
-The key-value pairs are mandatory. All transient infix commands
-are equal to each other (but not eq), so it is meaningless to
-define an infix command without also setting at least `:class'
-and one other keyword (which it is depends on the used class,
-usually `:argument' or `:variable').
-
-Each key has to be a keyword symbol, either `:class' or a keyword
-argument supported by the constructor of that class. The
-`transient-switch' class is used if the class is not specified
-explicitly.
-
-The function definitions is always:
-
- (lambda ()
- (interactive)
- (let ((obj (transient-suffix-object)))
- (transient-infix-set obj (transient-infix-read obj)))
- (transient--show))
-
-`transient-infix-read' and `transient-infix-set' are generic
-functions. Different infix commands behave differently because
-the concrete methods are different for different infix command
-classes. In rare case the above command function might not be
-suitable, even if you define your own infix command class. In
-that case you have to use `transient-suffix-command' to define
-the infix command and use t as the value of the `:transient'
-keyword.
-
-\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)"
- (declare (debug (&define name lambda-list
- [&optional lambda-doc]
- [&rest keywordp sexp]))
- (indent defun)
- (doc-string 3))
- (pcase-let ((`(,class ,slots ,_ ,docstr ,_)
- (transient--expand-define-args args)))
- `(progn
- (defalias ',name ,(transient--default-infix-command))
- (put ',name 'interactive-only t)
- (put ',name 'function-documentation ,docstr)
- (put ',name 'transient--suffix
- (,(or class 'transient-switch) :command ',name ,@slots)))))
-
-(defalias 'transient-define-argument 'define-infix-command
- "Define NAME as a transient infix command.
-
-Only use this alias to define an infix command that actually
-sets an infix argument. To define a infix command that, for
-example, sets a variable use `transient-define-infix' instead.
-
-\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)")
-
-(defun transient--expand-define-args (args)
- (let (class keys suffixes docstr)
- (when (stringp (car args))
- (setq docstr (pop args)))
- (while (keywordp (car args))
- (let ((k (pop args))
- (v (pop args)))
- (if (eq k :class)
- (setq class v)
- (push k keys)
- (push v keys))))
- (while (vectorp (car args))
- (push (pop args) suffixes))
- (list (if (eq (car-safe class) 'quote)
- (cadr class)
- class)
- (nreverse keys)
- (nreverse suffixes)
- docstr
- args)))
-
-(defun transient--parse-child (prefix spec)
- (cl-etypecase spec
- (vector (when-let ((c (transient--parse-group prefix spec))) (list c)))
- (list (when-let ((c (transient--parse-suffix prefix spec))) (list c)))
- (string (list spec))))
-
-(defun transient--parse-group (prefix spec)
- (setq spec (append spec nil))
- (cl-symbol-macrolet
- ((car (car spec))
- (pop (pop spec)))
- (let (level class args)
- (when (integerp car)
- (setq level pop))
- (when (stringp car)
- (setq args (plist-put args :description pop)))
- (while (keywordp car)
- (let ((k pop))
- (if (eq k :class)
- (setq class pop)
- (setq args (plist-put args k pop)))))
- (vector (or level (oref-default 'transient-child level))
- (or class
- (if (vectorp car)
- 'transient-columns
- 'transient-column))
- args
- (cl-mapcan (lambda (s) (transient--parse-child prefix s)) spec)))))
-
-(defun transient--parse-suffix (prefix spec)
- (let (level class args)
- (cl-symbol-macrolet
- ((car (car spec))
- (pop (pop spec)))
- (when (integerp car)
- (setq level pop))
- (when (or (stringp car)
- (vectorp car))
- (setq args (plist-put args :key pop)))
- (when (or (stringp car)
- (eq (car-safe car) 'lambda)
- (and (symbolp car)
- (not (commandp car))
- (commandp (cadr spec))))
- (setq args (plist-put args :description pop)))
- (cond
- ((keywordp car)
- (error "Need command, got %S" car))
- ((symbolp car)
- (setq args (plist-put args :command pop)))
- ((or (stringp car)
- (and car (listp car)))
- (let ((arg pop))
- (cl-typecase arg
- (list
- (setq args (plist-put args :shortarg (car arg)))
- (setq args (plist-put args :argument (cadr arg)))
- (setq arg (cadr arg)))
- (string
- (when-let ((shortarg (transient--derive-shortarg arg)))
- (setq args (plist-put args :shortarg shortarg)))
- (setq args (plist-put args :argument arg))))
- (setq args (plist-put args :command
- (intern (format "transient:%s:%s"
- prefix arg))))
- (cond ((and car (not (keywordp car)))
- (setq class 'transient-option)
- (setq args (plist-put args :reader pop)))
- ((not (string-suffix-p "=" arg))
- (setq class 'transient-switch))
- (t
- (setq class 'transient-option)
- (setq args (plist-put args :reader 'read-string))))))
- (t
- (error "Needed command or argument, got %S" car)))
- (while (keywordp car)
- (let ((k pop))
- (cl-case k
- (:class (setq class pop))
- (:level (setq level pop))
- (t (setq args (plist-put args k pop)))))))
- (unless (plist-get args :key)
- (when-let ((shortarg (plist-get args :shortarg)))
- (setq args (plist-put args :key shortarg))))
- (list (or level (oref-default 'transient-child level))
- (or class 'transient-suffix)
- args)))
-
-(defun transient--default-infix-command ()
- (cons 'lambda
- '(()
- (interactive)
- (let ((obj (transient-suffix-object)))
- (transient-infix-set obj (transient-infix-read obj)))
- (transient--show))))
-
-(defun transient--ensure-infix-command (obj)
- (let ((cmd (oref obj command)))
- (unless (or (commandp cmd)
- (get cmd 'transient--infix-command))
- (if (or (cl-typep obj 'transient-switch)
- (cl-typep obj 'transient-option))
- (put cmd 'transient--infix-command
- (transient--default-infix-command))
- ;; This is not an anonymous infix argument.
- (error "Suffix %s is not defined or autoloaded as a command" cmd)))))
-
-(defun transient--derive-shortarg (arg)
- (save-match-data
- (and (string-match "\\`\\(-[a-zA-Z]\\)\\(\\'\\|=\\)" arg)
- (match-string 1 arg))))
-
-;;; Edit
-
-(defun transient--insert-suffix (prefix loc suffix action)
- (let* ((suf (cl-etypecase suffix
- (vector (transient--parse-group prefix suffix))
- (list (transient--parse-suffix prefix suffix))
- (string suffix)))
- (mem (transient--layout-member loc prefix))
- (elt (car mem)))
- (cond
- ((not mem)
- (message "Cannot insert %S into %s; %s not found"
- suffix prefix loc))
- ((or (and (vectorp suffix) (not (vectorp elt)))
- (and (listp suffix) (vectorp elt))
- (and (stringp suffix) (vectorp elt)))
- (message "Cannot place %S into %s at %s; %s"
- suffix prefix loc
- "suffixes and groups cannot be siblings"))
- (t
- (when (and (listp suffix)
- (listp elt))
- (let ((key (transient--spec-key suf)))
- (if (equal (transient--kbd key)
- (transient--kbd (transient--spec-key elt)))
- (setq action 'replace)
- (transient-remove-suffix prefix key))))
- (cl-ecase action
- (insert (setcdr mem (cons elt (cdr mem)))
- (setcar mem suf))
- (append (setcdr mem (cons suf (cdr mem))))
- (replace (setcar mem suf)))))))
-
-;;;###autoload
-(defun transient-insert-suffix (prefix loc suffix)
- "Insert a SUFFIX into PREFIX before LOC.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'."
- (declare (indent defun))
- (transient--insert-suffix prefix loc suffix 'insert))
-
-;;;###autoload
-(defun transient-append-suffix (prefix loc suffix)
- "Insert a SUFFIX into PREFIX after LOC.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'."
- (declare (indent defun))
- (transient--insert-suffix prefix loc suffix 'append))
-
-;;;###autoload
-(defun transient-replace-suffix (prefix loc suffix)
- "Replace the suffix at LOC in PREFIX with SUFFIX.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'."
- (declare (indent defun))
- (transient--insert-suffix prefix loc suffix 'replace))
-
-;;;###autoload
-(defun transient-remove-suffix (prefix loc)
- "Remove the suffix or group at LOC in PREFIX.
-PREFIX is a prefix command, a symbol.
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'."
- (declare (indent defun))
- (transient--layout-member loc prefix 'remove))
-
-(defun transient-get-suffix (prefix loc)
- "Return the suffix or group at LOC in PREFIX.
-PREFIX is a prefix command, a symbol.
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'."
- (if-let ((mem (transient--layout-member loc prefix)))
- (car mem)
- (error "%s not found in %s" loc prefix)))
-
-(defun transient-suffix-put (prefix loc prop value)
- "Edit the suffix at LOC in PREFIX, setting PROP to VALUE.
-PREFIX is a prefix command, a symbol.
-SUFFIX is a suffix command or a group specification (of
- the same forms as expected by `transient-define-prefix').
-LOC is a command, a key vector, a key description (a string
- as returned by `key-description'), or a coordination list
- (whose last element may also be a command or key).
-See info node `(transient)Modifying Existing Transients'."
- (let ((suf (transient-get-suffix prefix loc)))
- (setf (elt suf 2)
- (plist-put (elt suf 2) prop value))))
-
-(defun transient--layout-member (loc prefix &optional remove)
- (let ((val (or (get prefix 'transient--layout)
- (error "%s is not a transient command" prefix))))
- (when (listp loc)
- (while (integerp (car loc))
- (let* ((children (if (vectorp val) (aref val 3) val))
- (mem (transient--nthcdr (pop loc) children)))
- (if (and remove (not loc))
- (let ((rest (delq (car mem) children)))
- (if (vectorp val)
- (aset val 3 rest)
- (put prefix 'transient--layout rest))
- (setq val nil))
- (setq val (if loc (car mem) mem)))))
- (setq loc (car loc)))
- (if loc
- (transient--layout-member-1 (transient--kbd loc) val remove)
- val)))
-
-(defun transient--layout-member-1 (loc layout remove)
- (cond ((listp layout)
- (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove))
- layout))
- ((vectorp (car (aref layout 3)))
- (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove))
- (aref layout 3)))
- (remove
- (aset layout 3
- (delq (car (transient--group-member loc layout))
- (aref layout 3)))
- nil)
- (t (transient--group-member loc layout))))
-
-(defun transient--group-member (loc group)
- (cl-member-if (lambda (suffix)
- (and (listp suffix)
- (let* ((def (nth 2 suffix))
- (cmd (plist-get def :command)))
- (if (symbolp loc)
- (eq cmd loc)
- (equal (transient--kbd
- (or (plist-get def :key)
- (transient--command-key cmd)))
- loc)))))
- (aref group 3)))
-
-(defun transient--kbd (keys)
- (when (vectorp keys)
- (setq keys (key-description keys)))
- (when (stringp keys)
- (setq keys (kbd keys)))
- keys)
-
-(defun transient--spec-key (spec)
- (let ((plist (nth 2 spec)))
- (or (plist-get plist :key)
- (transient--command-key
- (plist-get plist :command)))))
-
-(defun transient--command-key (cmd)
- (when-let ((obj (get cmd 'transient--suffix)))
- (cond ((slot-boundp obj 'key)
- (oref obj key))
- ((slot-exists-p obj 'shortarg)
- (if (slot-boundp obj 'shortarg)
- (oref obj shortarg)
- (transient--derive-shortarg (oref obj argument)))))))
-
-(defun transient--nthcdr (n list)
- (nthcdr (if (< n 0) (- (length list) (abs n)) n) list))
-
-;;; Variables
-
-(defvar transient-current-prefix nil
- "The transient from which this suffix command was invoked.
-This is an object representing that transient, use
-`transient-current-command' to get the respective command.")
-
-(defvar transient-current-command nil
- "The transient from which this suffix command was invoked.
-This is a symbol representing that transient, use
-`current-transient-object' to get the respective object.")
-
-(defvar transient-current-suffixes nil
- "The suffixes of the transient from which this suffix command was invoked.
-This is a list of objects. Usually it is sufficient to instead
-use the function `transient-args', which returns a list of
-values. In complex cases it might be necessary to use this
-variable instead.")
-
-(defvar transient-exit-hook nil
- "Hook run after exiting a transient.")
-
-(defvar transient--prefix nil)
-(defvar transient--layout nil)
-(defvar transient--suffixes nil)
-
-(defconst transient--stay t "Do not exit the transient.")
-(defconst transient--exit nil "Do exit the transient.")
-
-(defvar transient--exitp nil "Whether to exit the transient.")
-(defvar transient--showp nil "Whether the transient is show in a popup buffer.")
-(defvar transient--helpp nil "Whether help-mode is active.")
-(defvar transient--editp nil "Whether edit-mode is active.")
-
-(defvar transient--active-infix nil "The active infix awaiting user input.")
-
-(defvar transient--timer nil)
-
-(defvar transient--stack nil)
-
-(defvar transient--buffer-name " *transient*"
- "Name of the transient buffer.")
-
-(defvar transient--window nil
- "The window used to display the transient popup.")
-
-(defvar transient--original-window nil
- "The window that was selected before the transient was invoked.
-Usually it remains selected while the transient is active.")
-
-(define-obsolete-variable-alias 'transient--source-buffer
- 'transient--original-buffer "Transient 0.2.0")
-
-(defvar transient--original-buffer nil
- "The buffer that was current before the transient was invoked.
-Usually it remains current while the transient is active.")
-
-(defvar transient--debug nil "Whether put debug information into *Messages*.")
-
-(defvar transient--history nil)
-
-(defvar transient--scroll-commands
- '(transient-scroll-up
- transient-scroll-down
- mwheel-scroll
- scroll-bar-toolkit-scroll))
-
-;;; Identities
-
-(defun transient-suffix-object (&optional command)
- "Return the object associated with the current suffix command.
-
-Each suffix commands is associated with an object, which holds
-additional information about the suffix, such as its value (in
-the case of an infix command, which is a kind of suffix command).
-
-This function is intended to be called by infix commands, whose
-command definition usually (at least when defined using
-`transient-define-infix') is this:
-
- (lambda ()
- (interactive)
- (let ((obj (transient-suffix-object)))
- (transient-infix-set obj (transient-infix-read obj)))
- (transient--show))
-
-\(User input is read outside of `interactive' to prevent the
-command from being added to `command-history'. See #23.)
-
-Such commands need to be able to access their associated object
-to guide how `transient-infix-read' reads the new value and to
-store the read value. Other suffix commands (including non-infix
-commands) may also need the object to guide their behavior.
-
-This function attempts to return the object associated with the
-current suffix command even if the suffix command was not invoked
-from a transient. (For some suffix command that is a valid thing
-to do, for others it is not.) In that case nil may be returned
-if the command was not defined using one of the macros intended
-to define such commands.
-
-The optional argument COMMAND is intended for internal use. If
-you are contemplating using it in your own code, then you should
-probably use this instead:
-
- (get COMMAND 'transient--suffix)"
- (when command
- (cl-check-type command command))
- (if transient--prefix
- (cl-find-if (lambda (obj)
- (eq (transient--suffix-command obj)
- (or command this-original-command)))
- transient--suffixes)
- (when-let ((obj (get (or command this-command) 'transient--suffix))
- (obj (clone obj)))
- (transient-init-scope obj)
- (transient-init-value obj)
- obj)))
-
-(defun transient--suffix-command (object)
- "Return the command represented by OBJECT.
-
-If the value of OBJECT's `command' slot is a command, then return
-that. Otherwise it is a symbol whose `transient--infix-command'
-property holds an anonymous command, which is returned instead."
- (cl-check-type object transient-suffix)
- (let ((sym (oref object command)))
- (if (commandp sym)
- sym
- (get sym 'transient--infix-command))))
-
-(defun transient--suffix-symbol (arg)
- "Return a symbol representing ARG.
-
-ARG must be a command and/or a symbol. If it is a symbol,
-then just return it. Otherwise return the symbol whose
-`transient--infix-command' property's value is ARG."
- (or (cl-typep arg 'command)
- (cl-typep arg 'symbol)
- (signal 'wrong-type-argument `((command symbol) ,arg)))
- (if (symbolp arg)
- arg
- (let* ((obj (transient-suffix-object))
- (sym (oref obj command)))
- (if (eq (get sym 'transient--infix-command) arg)
- sym
- (catch 'found
- (mapatoms (lambda (sym)
- (when (eq (get sym 'transient--infix-command) arg)
- (throw 'found sym)))))))))
-
-;;; Keymaps
-
-(defvar transient-base-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "ESC ESC ESC") 'transient-quit-all)
- (define-key map (kbd "C-g") 'transient-quit-one)
- (define-key map (kbd "C-q") 'transient-quit-all)
- (define-key map (kbd "C-z") 'transient-suspend)
- (define-key map (kbd "C-v") 'transient-scroll-up)
- (define-key map (kbd "M-v") 'transient-scroll-down)
- (define-key map [next] 'transient-scroll-up)
- (define-key map [prior] 'transient-scroll-down)
- map)
- "Parent of other keymaps used by Transient.
-
-This is the parent keymap of all the keymaps that are used in
-all transients: `transient-map' (which in turn is the parent
-of the transient-specific keymaps), `transient-edit-map' and
-`transient-sticky-map'.
-
-If you change a binding here, then you might also have to edit
-`transient-sticky-map' and `transient-common-commands'. While
-the latter isn't a proper transient prefix command, it can be
-edited using the same functions as used for transients.")
-
-(defvar transient-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map transient-base-map)
- (define-key map (kbd "C-p") 'universal-argument)
- (define-key map (kbd "C--") 'negative-argument)
- (define-key map (kbd "C-t") 'transient-show)
- (define-key map (kbd "?") 'transient-help)
- (define-key map (kbd "C-h") 'transient-help)
- (define-key map (kbd "M-p") 'transient-history-prev)
- (define-key map (kbd "M-n") 'transient-history-next)
- map)
- "Top-level keymap used by all transients.")
-
-(defvar transient-edit-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map transient-base-map)
- (define-key map (kbd "?") 'transient-help)
- (define-key map (kbd "C-h") 'transient-help)
- (define-key map (kbd "C-x l") 'transient-set-level)
- map)
- "Keymap that is active while a transient in is in \"edit mode\".")
-
-(defvar transient-sticky-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map transient-base-map)
- (define-key map (kbd "C-g") 'transient-quit-seq)
- map)
- "Keymap that is active while an incomplete key sequence is active.")
-
-(defvar transient--common-command-prefixes '(?\C-x))
-
-(put 'transient-common-commands
- 'transient--layout
- (cl-mapcan
- (lambda (s) (transient--parse-child 'transient-common-commands s))
- '([:hide (lambda ()
- (and (not (memq (car transient--redisplay-key)
- transient--common-command-prefixes))
- (not transient-show-common-commands)))
- ["Value commands"
- ("C-x s " "Set" transient-set)
- ("C-x C-s" "Save" transient-save)
- ("M-p " "Previous value" transient-history-prev)
- ("M-n " "Next value" transient-history-next)]
- ["Sticky commands"
- ;; Like `transient-sticky-map' except that
- ;; "C-g" has to be bound to a different command.
- ("C-g" "Quit prefix or transient" transient-quit-one)
- ("C-q" "Quit transient stack" transient-quit-all)
- ("C-z" "Suspend transient stack" transient-suspend)]
- ["Customize"
- ("C-x t" transient-toggle-common
- :description (lambda ()
- (if transient-show-common-commands
- "Hide common commands"
- "Show common permanently")))
- ("C-x l" "Show/hide suffixes" transient-set-level)]])))
-
-(defvar transient-predicate-map
- (let ((map (make-sparse-keymap)))
- (define-key map [handle-switch-frame] 'transient--do-suspend)
- (define-key map [transient-suspend] 'transient--do-suspend)
- (define-key map [transient-help] 'transient--do-stay)
- (define-key map [transient-set-level] 'transient--do-stay)
- (define-key map [transient-history-prev] 'transient--do-stay)
- (define-key map [transient-history-next] 'transient--do-stay)
- (define-key map [universal-argument] 'transient--do-stay)
- (define-key map [negative-argument] 'transient--do-stay)
- (define-key map [digit-argument] 'transient--do-stay)
- (define-key map [transient-quit-all] 'transient--do-quit-all)
- (define-key map [transient-quit-one] 'transient--do-quit-one)
- (define-key map [transient-quit-seq] 'transient--do-stay)
- (define-key map [transient-show] 'transient--do-stay)
- (define-key map [transient-update] 'transient--do-stay)
- (define-key map [transient-toggle-common] 'transient--do-stay)
- (define-key map [transient-set] 'transient--do-call)
- (define-key map [transient-save] 'transient--do-call)
- (define-key map [describe-key-briefly] 'transient--do-stay)
- (define-key map [describe-key] 'transient--do-stay)
- (define-key map [transient-scroll-up] 'transient--do-stay)
- (define-key map [transient-scroll-down] 'transient--do-stay)
- (define-key map [mwheel-scroll] 'transient--do-stay)
- (define-key map [scroll-bar-toolkit-scroll] 'transient--do-stay)
- (define-key map [transient-noop] 'transient--do-noop)
- (define-key map [transient-mouse-push-button] 'transient--do-move)
- (define-key map [transient-push-button] 'transient--do-move)
- (define-key map [transient-backward-button] 'transient--do-move)
- (define-key map [transient-forward-button] 'transient--do-move)
- (define-key map [transient-isearch-backward] 'transient--do-move)
- (define-key map [transient-isearch-forward] 'transient--do-move)
- map)
- "Base keymap used to map common commands to their transient behavior.
-
-The \"transient behavior\" of a command controls, among other
-things, whether invoking the command causes the transient to be
-exited or not and whether infix arguments are exported before
-doing so.
-
-Each \"key\" is a command that is common to all transients and
-that is bound in `transient-map', `transient-edit-map',
-`transient-sticky-map' and/or `transient-common-command'.
-
-Each binding is a \"pre-command\", a function that controls the
-transient behavior of the respective command.
-
-For transient commands that are bound in individual transients,
-the transient behavior is specified using the `:transient' slot
-of the corresponding object.")
-
-(defvar transient-popup-navigation-map)
-
-(defvar transient--transient-map nil)
-(defvar transient--predicate-map nil)
-(defvar transient--redisplay-map nil)
-(defvar transient--redisplay-key nil)
-
-(defun transient--push-keymap (map)
- (transient--debug " push %s%s" map (if (symbol-value map) "" " VOID"))
- (with-demoted-errors "transient--push-keymap: %S"
- (internal-push-keymap (symbol-value map) 'overriding-terminal-local-map)))
-
-(defun transient--pop-keymap (map)
- (transient--debug " pop %s%s" map (if (symbol-value map) "" " VOID"))
- (with-demoted-errors "transient--pop-keymap: %S"
- (internal-pop-keymap (symbol-value map) 'overriding-terminal-local-map)))
-
-(defun transient--make-transient-map ()
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map (if transient--editp
- transient-edit-map
- transient-map))
- (dolist (obj transient--suffixes)
- (let ((key (oref obj key)))
- (when (vectorp key)
- (setq key (key-description key))
- (oset obj key key))
- (when transient-substitute-key-function
- (setq key (save-match-data
- (funcall transient-substitute-key-function obj)))
- (oset obj key key))
- (let ((kbd (kbd key))
- (cmd (transient--suffix-command obj)))
- (when-let ((conflict (and transient-detect-key-conflicts
- (transient--lookup-key map kbd))))
- (unless (eq cmd conflict)
- (transient--emergency-exit)
- (error "Cannot bind %S to %s and also %s"
- (string-trim key)
- cmd conflict)))
- (define-key map kbd cmd))))
- (when transient-enable-popup-navigation
- (setq map
- (make-composed-keymap (list map transient-popup-navigation-map))))
- map))
-
-(defun transient--make-predicate-map ()
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map transient-predicate-map)
- (dolist (obj transient--suffixes)
- (let* ((cmd (oref obj command))
- (sub-prefix (and (symbolp cmd) (get cmd 'transient--prefix)))
- (sym (transient--suffix-symbol cmd)))
- (cond
- ((oref obj inapt)
- (define-key map (vector sym) 'transient--do-warn-inapt))
- ((slot-boundp obj 'transient)
- (define-key map (vector sym)
- (let ((do (oref obj transient)))
- (pcase do
- (`t (if sub-prefix
- 'transient--do-replace
- 'transient--do-stay))
- (`nil 'transient--do-exit)
- (_ do)))))
- ((not (lookup-key transient-predicate-map (vector sym)))
- (define-key map (vector sym)
- (if sub-prefix
- 'transient--do-replace
- (or (oref transient--prefix transient-suffix)
- 'transient--do-exit)))))))
- map))
-
-(defun transient--make-redisplay-map ()
- (setq transient--redisplay-key
- (cl-case this-command
- (transient-update
- (setq transient--showp t)
- (setq unread-command-events
- (listify-key-sequence (this-single-command-raw-keys))))
- (transient-quit-seq
- (setq unread-command-events
- (butlast (listify-key-sequence
- (this-single-command-raw-keys))
- 2))
- (butlast transient--redisplay-key))
- (t nil)))
- (let ((topmap (make-sparse-keymap))
- (submap (make-sparse-keymap)))
- (when transient--redisplay-key
- (define-key topmap (vconcat transient--redisplay-key) submap)
- (set-keymap-parent submap transient-sticky-map))
- (map-keymap-internal
- (lambda (key def)
- (when (and (not (eq key ?\e))
- (listp def)
- (keymapp def))
- (define-key topmap (vconcat transient--redisplay-key (list key))
- 'transient-update)))
- (if transient--redisplay-key
- (lookup-key transient--transient-map (vconcat transient--redisplay-key))
- transient--transient-map))
- topmap))
-
-;;; Setup
-
-(defun transient-setup (&optional name layout edit &rest params)
- "Setup the transient specified by NAME.
-
-This function is called by transient prefix commands to setup the
-transient. In that case NAME is mandatory, LAYOUT and EDIT must
-be nil and PARAMS may be (but usually is not) used to set e.g. the
-\"scope\" of the transient (see `transient-define-prefix').
-
-This function is also called internally in which case LAYOUT and
-EDIT may be non-nil."
- (transient--debug 'setup)
- (when (and (>= (minibuffer-depth) 1) transient--prefix)
- (error "Cannot invoke %s while minibuffer is active %s"
- this-command "on behalf of another prefix command"))
- (cond
- ((not name)
- ;; Switching between regular and edit mode.
- (transient--pop-keymap 'transient--transient-map)
- (transient--pop-keymap 'transient--redisplay-map)
- (setq name (oref transient--prefix command))
- (setq params (list :scope (oref transient--prefix scope))))
- ((not (or layout ; resuming parent/suspended prefix
- transient-current-command)) ; entering child prefix
- (transient--stack-zap)) ; replace suspended prefix, if any
- (edit
- ;; Returning from help to edit.
- (setq transient--editp t)))
- (transient--init-objects name layout params)
- (transient--history-init transient--prefix)
- (setq transient--predicate-map (transient--make-predicate-map))
- (setq transient--transient-map (transient--make-transient-map))
- (setq transient--redisplay-map (transient--make-redisplay-map))
- (setq transient--original-window (selected-window))
- (setq transient--original-buffer (current-buffer))
- (transient--redisplay)
- (transient--init-transient)
- (transient--suspend-which-key-mode))
-
-(defun transient--init-objects (name layout params)
- (setq transient--prefix
- (let ((proto (get name 'transient--prefix)))
- (apply #'clone proto
- :prototype proto
- :level (or (alist-get
- t (alist-get name transient-levels))
- transient-default-level)
- params)))
- (transient-init-value transient--prefix)
- (setq transient--layout
- (or layout
- (let ((levels (alist-get name transient-levels)))
- (cl-mapcan (lambda (c) (transient--init-child levels c))
- (append (get name 'transient--layout)
- (and (not transient--editp)
- (get 'transient-common-commands
- 'transient--layout)))))))
- (setq transient--suffixes
- (cl-labels ((s (def)
- (cond
- ((stringp def) nil)
- ((listp def) (cl-mapcan #'s def))
- ((transient-group--eieio-childp def)
- (cl-mapcan #'s (oref def suffixes)))
- ((transient-suffix--eieio-childp def)
- (list def)))))
- (cl-mapcan #'s transient--layout))))
-
-(defun transient--init-child (levels spec)
- (cl-etypecase spec
- (vector (transient--init-group levels spec))
- (list (transient--init-suffix levels spec))
- (string (list spec))))
-
-(defun transient--init-group (levels spec)
- (pcase-let ((`(,level ,class ,args ,children) (append spec nil)))
- (when (transient--use-level-p level)
- (let ((obj (apply class :level level args)))
- (when (transient--use-suffix-p obj)
- (when-let ((suffixes
- (cl-mapcan (lambda (c) (transient--init-child levels c))
- children)))
- (oset obj suffixes suffixes)
- (list obj)))))))
-
-(defun transient--init-suffix (levels spec)
- (pcase-let* ((`(,level ,class ,args) spec)
- (cmd (plist-get args :command))
- (level (or (alist-get (transient--suffix-symbol cmd) levels)
- level)))
- (let ((fn (and (symbolp cmd)
- (symbol-function cmd))))
- (when (autoloadp fn)
- (transient--debug " autoload %s" cmd)
- (autoload-do-load fn)))
- (when (transient--use-level-p level)
- (let ((obj (if-let ((proto (and cmd
- (symbolp cmd)
- (get cmd 'transient--suffix))))
- (apply #'clone proto :level level args)
- (apply class :level level args))))
- (transient--init-suffix-key obj)
- (transient--ensure-infix-command obj)
- (when (transient--use-suffix-p obj)
- (if (transient--inapt-suffix-p obj)
- (oset obj inapt t)
- (transient-init-scope obj)
- (transient-init-value obj))
- (list obj))))))
-
-(cl-defmethod transient--init-suffix-key ((obj transient-suffix))
- (unless (slot-boundp obj 'key)
- (error "No key for %s" (oref obj command))))
-
-(cl-defmethod transient--init-suffix-key ((obj transient-argument))
- (if (transient-switches--eieio-childp obj)
- (cl-call-next-method obj)
- (unless (slot-boundp obj 'shortarg)
- (when-let ((shortarg (transient--derive-shortarg (oref obj argument))))
- (oset obj shortarg shortarg)))
- (unless (slot-boundp obj 'key)
- (if (slot-boundp obj 'shortarg)
- (oset obj key (oref obj shortarg))
- (error "No key for %s" (oref obj command))))))
-
-(defun transient--use-level-p (level &optional edit)
- (or (and transient--editp (not edit))
- (and (>= level 1)
- (<= level (oref transient--prefix level)))))
-
-(defun transient--use-suffix-p (obj)
- (transient--do-suffix-p
- (oref obj if)
- (oref obj if-not)
- (oref obj if-nil)
- (oref obj if-non-nil)
- (oref obj if-mode)
- (oref obj if-not-mode)
- (oref obj if-derived)
- (oref obj if-not-derived)
- t))
-
-(defun transient--inapt-suffix-p (obj)
- (transient--do-suffix-p
- (oref obj inapt-if)
- (oref obj inapt-if-not)
- (oref obj inapt-if-nil)
- (oref obj inapt-if-non-nil)
- (oref obj inapt-if-mode)
- (oref obj inapt-if-not-mode)
- (oref obj inapt-if-derived)
- (oref obj inapt-if-not-derived)
- nil))
-
-(defun transient--do-suffix-p
- (if if-not if-nil if-non-nil if-mode if-not-mode if-derived if-not-derived
- default)
- (cond
- (if (funcall if))
- (if-not (not (funcall if-not)))
- (if-non-nil (symbol-value if-non-nil))
- (if-nil (not (symbol-value if-nil)))
- (if-mode (if (atom if-mode)
- (eq major-mode if-mode)
- (memq major-mode if-mode)))
- (if-not-mode (not (if (atom if-not-mode)
- (eq major-mode if-not-mode)
- (memq major-mode if-not-mode))))
- (if-derived (if (atom if-derived)
- (derived-mode-p if-derived)
- (apply #'derived-mode-p if-derived)))
- (if-not-derived (not (if (atom if-not-derived)
- (derived-mode-p if-not-derived)
- (apply #'derived-mode-p if-not-derived))))
- (t default)))
-
-;;; Flow-Control
-
-(defun transient--init-transient ()
- (transient--debug 'init-transient)
- (transient--push-keymap 'transient--transient-map)
- (transient--push-keymap 'transient--redisplay-map)
- (add-hook 'pre-command-hook #'transient--pre-command)
- (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (add-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (add-hook 'post-command-hook #'transient--post-command)
- (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit)
- (when transient--exitp
- ;; This prefix command was invoked as the suffix of another.
- ;; Prevent `transient--post-command' from removing the hooks
- ;; that we just added.
- (setq transient--exitp 'replace)))
-
-(defun transient--pre-command ()
- (transient--debug 'pre-command)
- (cond
- ((memq this-command '(transient-update transient-quit-seq))
- (transient--pop-keymap 'transient--redisplay-map))
- ((and transient--helpp
- (not (memq this-command '(transient-quit-one
- transient-quit-all))))
- (cond
- ((transient-help)
- (transient--do-suspend)
- (setq this-command 'transient-suspend)
- (transient--pre-exit))
- ((not (transient--edebug-command-p))
- (setq this-command 'transient-undefined))))
- ((and transient--editp
- (transient-suffix-object)
- (not (memq this-command '(transient-quit-one
- transient-quit-all
- transient-help))))
- (setq this-command 'transient-set-level))
- (t
- (setq transient--exitp nil)
- (when (eq (if-let ((fn (transient--get-predicate-for
- this-original-command)))
- (let ((action (funcall fn)))
- (when (eq action transient--exit)
- (setq transient--exitp (or transient--exitp t)))
- action)
- (if (let ((keys (this-command-keys-vector)))
- (eq (aref keys (1- (length keys))) ?\C-g))
- (setq this-command 'transient-noop)
- (unless (transient--edebug-command-p)
- (setq this-command 'transient-undefined)))
- transient--stay)
- transient--exit)
- (transient--pre-exit)))))
-
-(defun transient--get-predicate-for (cmd)
- (or (lookup-key transient--predicate-map
- (vector (transient--suffix-symbol cmd)))
- (oref transient--prefix transient-non-suffix)))
-
-(defun transient--pre-exit ()
- (transient--debug 'pre-exit)
- (transient--delete-window)
- (transient--timer-cancel)
- (transient--pop-keymap 'transient--transient-map)
- (transient--pop-keymap 'transient--redisplay-map)
- (remove-hook 'pre-command-hook #'transient--pre-command)
- (unless transient--showp
- (message ""))
- (setq transient--transient-map nil)
- (setq transient--predicate-map nil)
- (setq transient--redisplay-map nil)
- (setq transient--redisplay-key nil)
- (setq transient--showp nil)
- (setq transient--helpp nil)
- (setq transient--editp nil)
- (setq transient--prefix nil)
- (setq transient--layout nil)
- (setq transient--suffixes nil)
- (setq transient--original-window nil)
- (setq transient--original-buffer nil)
- (setq transient--window nil))
-
-(defun transient--delete-window ()
- (when (window-live-p transient--window)
- (let ((buf (window-buffer transient--window)))
- (with-demoted-errors "Error while exiting transient: %S"
- (delete-window transient--window))
- (kill-buffer buf))))
-
-(defun transient--export ()
- (setq transient-current-prefix transient--prefix)
- (setq transient-current-command (oref transient--prefix command))
- (setq transient-current-suffixes transient--suffixes)
- (transient--history-push transient--prefix))
-
-(defun transient--minibuffer-setup ()
- (transient--debug 'minibuffer-setup)
- (unless (> (minibuffer-depth) 1)
- (unless transient--exitp
- (transient--pop-keymap 'transient--transient-map)
- (transient--pop-keymap 'transient--redisplay-map)
- (remove-hook 'pre-command-hook #'transient--pre-command))
- (remove-hook 'post-command-hook #'transient--post-command)))
-
-(defun transient--minibuffer-exit ()
- (transient--debug 'minibuffer-exit)
- (unless (> (minibuffer-depth) 1)
- (unless transient--exitp
- (transient--push-keymap 'transient--transient-map)
- (transient--push-keymap 'transient--redisplay-map)
- (add-hook 'pre-command-hook #'transient--pre-command))
- (add-hook 'post-command-hook #'transient--post-command)))
-
-(defun transient--suspend-override (&optional minibuffer-hooks)
- (transient--debug 'suspend-override)
- (transient--pop-keymap 'transient--transient-map)
- (transient--pop-keymap 'transient--redisplay-map)
- (remove-hook 'pre-command-hook #'transient--pre-command)
- (remove-hook 'post-command-hook #'transient--post-command)
- (when minibuffer-hooks
- (remove-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (remove-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (advice-remove 'abort-recursive-edit #'transient--minibuffer-exit)))
-
-(defun transient--resume-override (&optional minibuffer-hooks)
- (transient--debug 'resume-override)
- (transient--push-keymap 'transient--transient-map)
- (transient--push-keymap 'transient--redisplay-map)
- (add-hook 'pre-command-hook #'transient--pre-command)
- (add-hook 'post-command-hook #'transient--post-command)
- (when minibuffer-hooks
- (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (add-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit)))
-
-(defun transient--post-command ()
- (transient--debug 'post-command)
- (if transient--exitp
- (progn
- (unless (and (eq transient--exitp 'replace)
- (or transient--prefix
- ;; The current command could act as a prefix,
- ;; but decided not to call `transient-setup'.
- (prog1 nil (transient--stack-zap))))
- (remove-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (remove-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (advice-remove 'abort-recursive-edit #'transient--minibuffer-exit)
- (remove-hook 'post-command-hook #'transient--post-command))
- (setq transient-current-prefix nil)
- (setq transient-current-command nil)
- (setq transient-current-suffixes nil)
- (let ((resume (and transient--stack
- (not (memq transient--exitp '(replace suspend))))))
- (setq transient--exitp nil)
- (setq transient--helpp nil)
- (setq transient--editp nil)
- (run-hooks 'transient-exit-hook)
- (when resume
- (transient--stack-pop))))
- (transient--pop-keymap 'transient--redisplay-map)
- (setq transient--redisplay-map (transient--make-redisplay-map))
- (transient--push-keymap 'transient--redisplay-map)
- (unless (eq this-command (oref transient--prefix command))
- (transient--redisplay))))
-
-(defun transient--stack-push ()
- (transient--debug 'stack-push)
- (push (list (oref transient--prefix command)
- transient--layout
- transient--editp
- :scope (oref transient--prefix scope))
- transient--stack))
-
-(defun transient--stack-pop ()
- (transient--debug 'stack-pop)
- (and transient--stack
- (prog1 t (apply #'transient-setup (pop transient--stack)))))
-
-(defun transient--stack-zap ()
- (transient--debug 'stack-zap)
- (setq transient--stack nil))
-
-(defun transient--redisplay ()
- (if (or (eq transient-show-popup t)
- transient--showp)
- (unless (memq this-command transient--scroll-commands)
- (transient--show))
- (when (and (numberp transient-show-popup)
- (not (zerop transient-show-popup))
- (not transient--timer))
- (transient--timer-start))
- (transient--show-brief)))
-
-(defun transient--timer-start ()
- (setq transient--timer
- (run-at-time (abs transient-show-popup) nil
- (lambda ()
- (transient--timer-cancel)
- (transient--show)
- (let ((message-log-max nil))
- (message ""))))))
-
-(defun transient--timer-cancel ()
- (when transient--timer
- (cancel-timer transient--timer)
- (setq transient--timer nil)))
-
-(defun transient--debug (arg &rest args)
- (when transient--debug
- (if (symbolp arg)
- (message "-- %-16s (cmd: %s, exit: %s)"
- arg this-command transient--exitp)
- (apply #'message arg args))))
-
-(defun transient--emergency-exit ()
- "Exit the current transient command after an error occurred.
-
-Beside being used with `condition-case', this function also has
-to be a member of `debugger-mode-hook', else the debugger would
-be unusable and exiting it by pressing \"q\" would fail because
-the transient command would still be active and that key would
-either be unbound or do something else.
-
-When no transient is active (i.e. when `transient--prefix') is
-nil, then do nothing."
- (when transient--prefix
- (setq transient--stack nil)
- (setq transient--exitp t)
- (transient--pre-exit)
- (transient--post-command)))
-
-(add-hook 'debugger-mode-hook 'transient--emergency-exit)
-
-(defmacro transient--with-emergency-exit (&rest body)
- (declare (indent defun))
- `(condition-case nil
- ,(macroexp-progn body)
- (error (transient--emergency-exit))))
-
-;;; Pre-Commands
-
-(defun transient--do-stay ()
- "Call the command without exporting variables and stay transient."
- transient--stay)
-
-(defun transient--do-noop ()
- "Call `transient-noop' and stay transient."
- (setq this-command 'transient-noop)
- transient--stay)
-
-(defun transient--do-warn ()
- "Call `transient-undefined' and stay transient."
- (setq this-command 'transient-undefined)
- transient--stay)
-
-(defun transient--do-warn-inapt ()
- "Call `transient-inapt' and stay transient."
- (setq this-command 'transient-inapt)
- transient--stay)
-
-(defun transient--do-call ()
- "Call the command after exporting variables and stay transient."
- (transient--export)
- transient--stay)
-
-(defun transient--do-exit ()
- "Call the command after exporting variables and exit the transient."
- (transient--export)
- (transient--stack-zap)
- transient--exit)
-
-(defun transient--do-replace ()
- "Call the transient prefix command, replacing the active transient."
- (transient--export)
- (transient--stack-push)
- (setq transient--exitp 'replace)
- transient--exit)
-
-(defun transient--do-suspend ()
- "Suspend the active transient, saving the transient stack."
- (transient--stack-push)
- (setq transient--exitp 'suspend)
- transient--exit)
-
-(defun transient--do-quit-one ()
- "If active, quit help or edit mode, else exit the active transient."
- (cond (transient--helpp
- (setq transient--helpp nil)
- transient--stay)
- (transient--editp
- (setq transient--editp nil)
- (transient-setup)
- transient--stay)
- (t transient--exit)))
-
-(defun transient--do-quit-all ()
- "Exit all transients without saving the transient stack."
- (transient--stack-zap)
- transient--exit)
-
-(defun transient--do-move ()
- "Call the command if `transient-enable-popup-navigation' is non-nil.
-In that case behave like `transient--do-stay', otherwise similar
-to `transient--do-warn'."
- (unless transient-enable-popup-navigation
- (setq this-command 'transient-popup-navigation-help))
- transient--stay)
-
-(put 'transient--do-stay 'transient-color 'transient-blue)
-(put 'transient--do-noop 'transient-color 'transient-blue)
-(put 'transient--do-warn 'transient-color 'transient-blue)
-(put 'transient--do-warn-inapt 'transient-color 'transient-blue)
-(put 'transient--do-call 'transient-color 'transient-blue)
-(put 'transient--do-exit 'transient-color 'transient-red)
-(put 'transient--do-replace 'transient-color 'transient-red)
-(put 'transient--do-suspend 'transient-color 'transient-red)
-(put 'transient--do-quit-one 'transient-color 'transient-red)
-(put 'transient--do-quit-all 'transient-color 'transient-red)
-(put 'transient--do-move 'transient-color 'transient-blue)
-
-;;; Commands
-
-(defun transient-noop ()
- "Do nothing at all."
- (interactive))
-
-(defun transient-undefined ()
- "Warn the user that the pressed key is not bound to any suffix."
- (interactive)
- (transient--invalid "Unbound suffix"))
-
-(defun transient-inapt ()
- "Warn the user that the invoked command is inapt."
- (interactive)
- (transient--invalid "Inapt command"))
-
-(defun transient--invalid (msg)
- (ding)
- (message "%s: `%s' (Use `%s' to abort, `%s' for help) [%s]"
- msg
- (propertize (key-description (this-single-command-keys))
- 'face 'font-lock-warning-face)
- (propertize "C-g" 'face 'transient-key)
- (propertize "?" 'face 'transient-key)
- (propertize (symbol-name (transient--suffix-symbol
- this-original-command))
- 'face 'font-lock-warning-face)))
-
-(defun transient-toggle-common ()
- "Toggle whether common commands are always shown."
- (interactive)
- (setq transient-show-common-commands (not transient-show-common-commands)))
-
-(defun transient-suspend ()
- "Suspend the current transient.
-It can later be resumed using `transient-resume' while no other
-transient is active."
- (interactive))
-
-(defun transient-quit-all ()
- "Exit all transients without saving the transient stack."
- (interactive))
-
-(defun transient-quit-one ()
- "Exit the current transients, possibly returning to the previous."
- (interactive))
-
-(defun transient-quit-seq ()
- "Abort the current incomplete key sequence."
- (interactive))
-
-(defun transient-update ()
- "Redraw the transient's state in the popup buffer."
- (interactive))
-
-(defun transient-show ()
- "Show the transient's state in the popup buffer."
- (interactive)
- (setq transient--showp t))
-
-(defvar-local transient--restore-winconf nil)
-
-(defvar transient-resume-mode)
-
-(defun transient-help ()
- "Show help for the active transient or one of its suffixes."
- (interactive)
- (if (called-interactively-p 'any)
- (setq transient--helpp t)
- (with-demoted-errors "transient-help: %S"
- (when (lookup-key transient--transient-map
- (this-single-command-raw-keys))
- (setq transient--helpp nil)
- (let ((winconf (current-window-configuration)))
- (transient-show-help
- (if (eq this-original-command 'transient-help)
- transient--prefix
- (or (transient-suffix-object)
- this-original-command)))
- (setq transient--restore-winconf winconf))
- (fit-window-to-buffer nil (frame-height) (window-height))
- (transient-resume-mode)
- (message "Type \"q\" to resume transient command.")
- t))))
-
-(defun transient-set-level (&optional command level)
- "Set the level of the transient or one of its suffix commands."
- (interactive
- (let ((command this-original-command)
- (prefix (oref transient--prefix command)))
- (and (or (not (eq command 'transient-set-level))
- (and transient--editp
- (setq command prefix)))
- (list command
- (let ((keys (this-single-command-raw-keys)))
- (and (lookup-key transient--transient-map keys)
- (string-to-number
- (let ((transient--active-infix
- (transient-suffix-object command)))
- (transient--show)
- (transient--read-number-N
- (format "Set level for `%s': "
- (transient--suffix-symbol command))
- nil nil (not (eq command prefix)))))))))))
- (cond
- ((not command)
- (setq transient--editp t)
- (transient-setup))
- (level
- (let* ((prefix (oref transient--prefix command))
- (alist (alist-get prefix transient-levels))
- (sym (transient--suffix-symbol command)))
- (if (eq command prefix)
- (progn (oset transient--prefix level level)
- (setq sym t))
- (oset (transient-suffix-object command) level level))
- (setf (alist-get sym alist) level)
- (setf (alist-get prefix transient-levels) alist))
- (transient-save-levels))
- (t
- (transient-undefined))))
-
-(defun transient-set ()
- "Save the value of the active transient for this Emacs session."
- (interactive)
- (transient-set-value (or transient--prefix transient-current-prefix)))
-
-(defun transient-save ()
- "Save the value of the active transient persistenly across Emacs sessions."
- (interactive)
- (transient-save-value (or transient--prefix transient-current-prefix)))
-
-(defun transient-history-next ()
- "Switch to the next value used for the active transient."
- (interactive)
- (let* ((obj transient--prefix)
- (pos (1- (oref obj history-pos)))
- (hst (oref obj history)))
- (if (< pos 0)
- (user-error "End of history")
- (oset obj history-pos pos)
- (oset obj value (nth pos hst))
- (mapc #'transient-init-value transient--suffixes))))
-
-(defun transient-history-prev ()
- "Switch to the previous value used for the active transient."
- (interactive)
- (let* ((obj transient--prefix)
- (pos (1+ (oref obj history-pos)))
- (hst (oref obj history))
- (len (length hst)))
- (if (> pos (1- len))
- (user-error "End of history")
- (oset obj history-pos pos)
- (oset obj value (nth pos hst))
- (mapc #'transient-init-value transient--suffixes))))
-
-(defun transient-scroll-up (&optional arg)
- "Scroll text of transient popup window upward ARG lines.
-If ARG is nil scroll near full screen. This is a wrapper
-around `scroll-up-command' (which see)."
- (interactive "^P")
- (with-selected-window transient--window
- (scroll-up-command arg)))
-
-(defun transient-scroll-down (&optional arg)
- "Scroll text of transient popup window down ARG lines.
-If ARG is nil scroll near full screen. This is a wrapper
-around `scroll-down-command' (which see)."
- (interactive "^P")
- (with-selected-window transient--window
- (scroll-down-command arg)))
-
-(defun transient-resume ()
- "Resume a previously suspended stack of transients."
- (interactive)
- (cond (transient--stack
- (let ((winconf transient--restore-winconf))
- (kill-local-variable 'transient--restore-winconf)
- (when transient-resume-mode
- (transient-resume-mode -1)
- (quit-window))
- (when winconf
- (set-window-configuration winconf)))
- (transient--stack-pop))
- (transient-resume-mode
- (kill-local-variable 'transient--restore-winconf)
- (transient-resume-mode -1)
- (quit-window))
- (t
- (message "No suspended transient command"))))
-
-;;; Value
-;;;; Init
-
-(cl-defgeneric transient-init-scope (obj)
- "Set the scope of the suffix object OBJ.
-
-The scope is actually a property of the transient prefix, not of
-individual suffixes. However it is possible to invoke a suffix
-command directly instead of from a transient. In that case, if
-the suffix expects a scope, then it has to determine that itself
-and store it in its `scope' slot.
-
-This function is called for all suffix commands, but unless a
-concrete method is implemented this falls through to the default
-implementation, which is a noop.")
-
-(cl-defmethod transient-init-scope ((_ transient-suffix))
- "Noop." nil)
-
-(cl-defgeneric transient-init-value (_)
- "Set the initial value of the object OBJ.
-
-This function is called for all prefix and suffix commands.
-
-For suffix commands (including infix argument commands) the
-default implementation is a noop. Classes derived from the
-abstract `transient-infix' class must implement this function.
-Non-infix suffix commands usually don't have a value."
- nil)
-
-(cl-defmethod transient-init-value ((obj transient-prefix))
- (if (slot-boundp obj 'value)
- (oref obj value)
- (oset obj value
- (if-let ((saved (assq (oref obj command) transient-values)))
- (cdr saved)
- (if-let ((default (and (slot-boundp obj 'default-value)
- (oref obj default-value))))
- (if (functionp default)
- (funcall default)
- default)
- nil)))))
-
-(cl-defmethod transient-init-value ((obj transient-switch))
- (oset obj value
- (car (member (oref obj argument)
- (oref transient--prefix value)))))
-
-(cl-defmethod transient-init-value ((obj transient-option))
- (oset obj value
- (transient--value-match (format "\\`%s\\(.*\\)" (oref obj argument)))))
-
-(cl-defmethod transient-init-value ((obj transient-switches))
- (oset obj value
- (transient--value-match (oref obj argument-regexp))))
-
-(defun transient--value-match (re)
- (when-let ((match (cl-find-if (lambda (v)
- (and (stringp v)
- (string-match re v)))
- (oref transient--prefix value))))
- (match-string 1 match)))
-
-(cl-defmethod transient-init-value ((obj transient-files))
- (oset obj value
- (cdr (assoc "--" (oref transient--prefix value)))))
-
-;;;; Read
-
-(cl-defgeneric transient-infix-read (obj)
- "Determine the new value of the infix object OBJ.
-
-This function merely determines the value; `transient-infix-set'
-is used to actually store the new value in the object.
-
-For most infix classes this is done by reading a value from the
-user using the reader specified by the `reader' slot (using the
-`transient-infix' method described below).
-
-For some infix classes the value is changed without reading
-anything in the minibuffer, i.e. the mere act of invoking the
-infix command determines what the new value should be, based
-on the previous value.")
-
-(cl-defmethod transient-infix-read :around ((obj transient-infix))
- "Highlight the infix in the popup buffer.
-
-Also arrange for the transient to be exited in case of an error
-because otherwise Emacs would get stuck in an inconsistent state,
-which might make it necessary to kill it from the outside."
- (let ((transient--active-infix obj))
- (transient--show))
- (transient--with-emergency-exit
- (cl-call-next-method obj)))
-
-(cl-defmethod transient-infix-read ((obj transient-infix))
- "Read a value while taking care of history.
-
-This method is suitable for a wide variety of infix commands,
-including but not limited to inline arguments and variables.
-
-If you do not use this method for your own infix class, then
-you should likely replicate a lot of the behavior of this
-method. If you fail to do so, then users might not appreciate
-the lack of history, for example.
-
-Only for very simple classes that toggle or cycle through a very
-limited number of possible values should you replace this with a
-simple method that does not handle history. (E.g. for a command
-line switch the only possible values are \"use it\" and \"don't use
-it\", in which case it is pointless to preserve history.)"
- (with-slots (value multi-value allow-empty choices) obj
- (if (and value
- (not multi-value)
- transient--prefix)
- (oset obj value nil)
- (let* ((overriding-terminal-local-map nil)
- (reader (oref obj reader))
- (prompt (transient-prompt obj))
- (value (if multi-value (mapconcat #'identity value ",") value))
- (history-key (or (oref obj history-key)
- (oref obj command)))
- (transient--history (alist-get history-key transient-history))
- (transient--history (if (or (null value)
- (eq value (car transient--history)))
- transient--history
- (cons value transient--history)))
- (initial-input (and transient-read-with-initial-input
- (car transient--history)))
- (history (if initial-input
- (cons 'transient--history 1)
- 'transient--history))
- (value
- (cond
- (reader (funcall reader prompt initial-input history))
- (multi-value
- (completing-read-multiple prompt choices nil nil
- initial-input history))
- (choices
- (completing-read prompt choices nil t initial-input history))
- (t (read-string prompt initial-input history)))))
- (cond ((and (equal value "") (not allow-empty))
- (setq value nil))
- ((and (equal value "\"\"") allow-empty)
- (setq value "")))
- (when value
- (when (bound-and-true-p ivy-mode)
- (set-text-properties 0 (length (car transient--history)) nil
- (car transient--history)))
- (setf (alist-get history-key transient-history)
- (delete-dups transient--history)))
- value))))
-
-(cl-defmethod transient-infix-read ((obj transient-switch))
- "Toggle the switch on or off."
- (if (oref obj value) nil (oref obj argument)))
-
-(cl-defmethod transient-infix-read ((obj transient-switches))
- "Cycle through the mutually exclusive switches.
-The last value is \"don't use any of these switches\"."
- (let ((choices (mapcar (apply-partially #'format (oref obj argument-format))
- (oref obj choices))))
- (if-let ((value (oref obj value)))
- (cadr (member value choices))
- (car choices))))
-
-(cl-defmethod transient-infix-read ((command symbol))
- "Elsewhere use the reader of the infix command COMMAND.
-Use this if you want to share an infix's history with a regular
-stand-alone command."
- (cl-letf (((symbol-function #'transient--show) #'ignore))
- (transient-infix-read (get command 'transient--suffix))))
-
-;;;; Readers
-
-(defun transient-read-directory (prompt _initial-input _history)
- "Read a directory."
- (expand-file-name (read-directory-name prompt)))
-
-(defun transient-read-existing-directory (prompt _initial-input _history)
- "Read an existing directory."
- (expand-file-name (read-directory-name prompt nil nil t)))
-
-(defun transient-read-number-N0 (prompt initial-input history)
- "Read a natural number (including zero) and return it as a string."
- (transient--read-number-N prompt initial-input history t))
-
-(defun transient-read-number-N+ (prompt initial-input history)
- "Read a natural number (excluding zero) and return it as a string."
- (transient--read-number-N prompt initial-input history nil))
-
-(defun transient--read-number-N (prompt initial-input history include-zero)
- (save-match-data
- (cl-block nil
- (while t
- (let ((str (read-from-minibuffer prompt initial-input nil nil history)))
- (cond ((string-equal str "")
- (cl-return nil))
- ((string-match-p (if include-zero
- "\\`\\(0\\|[1-9][0-9]*\\)\\'"
- "\\`[1-9][0-9]*\\'")
- str)
- (cl-return str))))
- (message "Please enter a natural number (%s zero)."
- (if include-zero "including" "excluding"))
- (sit-for 1)))))
-
-(defun transient-read-date (prompt default-time _history)
- "Read a date using `org-read-date' (which see)."
- (require 'org)
- (when (fboundp 'org-read-date)
- (org-read-date 'with-time nil nil prompt default-time)))
-
-;;;; Prompt
-
-(cl-defgeneric transient-prompt (obj)
- "Return the prompt to be used to read infix object OBJ's value.")
-
-(cl-defmethod transient-prompt ((obj transient-infix))
- "Return the prompt to be used to read infix object OBJ's value.
-
-This implementation should be suitable for almost all infix
-commands.
-
-If the value of OBJ's `prompt' slot is non-nil, then it must be
-a string or a function. If it is a string, then use that. If
-it is a function, then call that with OBJ as the only argument.
-That function must return a string, which is then used as the
-prompt.
-
-Otherwise, if the value of either the `argument' or `variable'
-slot of OBJ is a string, then base the prompt on that (preferring
-the former), appending either \"=\" (if it appears to be a
-command-line option) or \": \".
-
-Finally fall through to using \"(BUG: no prompt): \" as the
-prompt."
- (if-let ((prompt (oref obj prompt)))
- (let ((prompt (if (functionp prompt)
- (funcall prompt obj)
- prompt)))
- (if (stringp prompt)
- prompt
- "(BUG: no prompt): "))
- (or (when-let ((arg (and (slot-boundp obj 'argument) (oref obj argument))))
- (if (and (stringp arg) (string-suffix-p "=" arg))
- arg
- (concat arg ": ")))
- (when-let ((var (and (slot-boundp obj 'variable) (oref obj variable))))
- (and (stringp var)
- (concat var ": ")))
- "(BUG: no prompt): ")))
-
-;;;; Set
-
-(defvar transient--unset-incompatible t)
-
-(cl-defgeneric transient-infix-set (obj value)
- "Set the value of infix object OBJ to value.")
-
-(cl-defmethod transient-infix-set ((obj transient-infix) value)
- "Set the value of infix object OBJ to value.
-
-This implementation should be suitable for almost all infix
-commands."
- (oset obj value value))
-
-(cl-defmethod transient-infix-set :around ((obj transient-argument) value)
- "Unset incompatible infix arguments."
- (let ((arg (if (slot-boundp obj 'argument)
- (oref obj argument)
- (oref obj argument-regexp))))
- (if-let ((sic (and value arg transient--unset-incompatible))
- (spec (oref transient--prefix incompatible))
- (incomp (remove arg (cl-find-if (lambda (elt) (member arg elt)) spec))))
- (progn
- (cl-call-next-method obj value)
- (dolist (arg incomp)
- (when-let ((obj (cl-find-if (lambda (obj)
- (and (slot-boundp obj 'argument)
- (equal (oref obj argument) arg)))
- transient--suffixes)))
- (let ((transient--unset-incompatible nil))
- (transient-infix-set obj nil)))))
- (cl-call-next-method obj value))))
-
-(cl-defmethod transient-set-value ((obj transient-prefix))
- (oset (oref obj prototype) value (transient-get-value))
- (transient--history-push obj))
-
-;;;; Save
-
-(cl-defmethod transient-save-value ((obj transient-prefix))
- (let ((value (transient-get-value)))
- (oset (oref obj prototype) value value)
- (setf (alist-get (oref obj command) transient-values) value)
- (transient-save-values))
- (transient--history-push obj))
-
-;;;; Get
-
-(defun transient-args (prefix)
- "Return the value of the transient prefix command PREFIX.
-If the current command was invoked from the transient prefix
-command PREFIX, then return the active infix arguments. If
-the current command was not invoked from PREFIX, then return
-the set, saved or default value for PREFIX."
- (if (eq transient-current-command prefix)
- (delq nil (mapcar 'transient-infix-value transient-current-suffixes))
- (let ((transient--prefix nil)
- (transient--layout nil)
- (transient--suffixes nil))
- (transient--init-objects prefix nil nil)
- (delq nil (mapcar 'transient-infix-value transient--suffixes)))))
-
-(defun transient-get-value ()
- (delq nil (mapcar 'transient-infix-value transient-current-suffixes)))
-
-(cl-defgeneric transient-infix-value (obj)
- "Return the value of the suffix object OBJ.
-
-This function is called by `transient-args' (which see), meaning
-this function is how the value of a transient is determined so
-that the invoked suffix command can use it.
-
-Currently most values are strings, but that is not set in stone.
-Nil is not a value, it means \"no value\".
-
-Usually only infixes have a value, but see the method for
-`transient-suffix'.")
-
-(cl-defmethod transient-infix-value ((_ transient-suffix))
- "Return nil, which means \"no value\".
-
-Infix arguments contribute the the transient's value while suffix
-commands consume it. This function is called for suffixes anyway
-because a command that both contributes to the transient's value
-and also consumes it is not completely unconceivable.
-
-If you define such a command, then you must define a derived
-class and implement this function because this default method
-does nothing." nil)
-
-(cl-defmethod transient-infix-value ((obj transient-infix))
- "Return the value of OBJ's `value' slot."
- (oref obj value))
-
-(cl-defmethod transient-infix-value ((obj transient-option))
- "Return (concat ARGUMENT VALUE) or nil.
-
-ARGUMENT and VALUE are the values of the respective slots of OBJ.
-If VALUE is nil, then return nil. VALUE may be the empty string,
-which is not the same as nil."
- (when-let ((value (oref obj value)))
- (concat (oref obj argument) value)))
-
-(cl-defmethod transient-infix-value ((_ transient-variable))
- "Return nil, which means \"no value\".
-
-Setting the value of a variable is done by, well, setting the
-value of the variable. I.e. this is a side-effect and does not
-contribute to the value of the transient."
- nil)
-
-(cl-defmethod transient-infix-value ((obj transient-files))
- "Return (concat ARGUMENT VALUE) or nil.
-
-ARGUMENT and VALUE are the values of the respective slots of OBJ.
-If VALUE is nil, then return nil. VALUE may be the empty string,
-which is not the same as nil."
- (when-let ((value (oref obj value)))
- (cons (oref obj argument) value)))
-
-;;; History
-
-(cl-defgeneric transient--history-key (obj)
- "Return OBJ's history key.
-If the value of the `history-key' slot is non-nil, then return
-that. Otherwise return the value of the `command' slot."
- (or (oref obj history-key)
- (oref obj command)))
-
-(cl-defgeneric transient--history-push (obj)
- "Push the current value of OBJ to its entry in `transient-history'."
- (let ((key (transient--history-key obj)))
- (setf (alist-get key transient-history)
- (let ((args (transient-get-value)))
- (cons args (delete args (alist-get key transient-history)))))))
-
-(cl-defgeneric transient--history-init (obj)
- "Initialize OBJ's `history' slot.
-This is the transient-wide history; many individual infixes also
-have a history of their own.")
-
-(cl-defmethod transient--history-init ((obj transient-prefix))
- "Initialize OBJ's `history' slot from the variable `transient-history'."
- (let ((val (oref obj value)))
- (oset obj history
- (cons val (delete val (alist-get (transient--history-key obj)
- transient-history))))))
-
-;;; Draw
-
-(defun transient--show-brief ()
- (let ((message-log-max nil))
- (if (and transient-show-popup (<= transient-show-popup 0))
- (message "%s-" (key-description (this-command-keys)))
- (message
- "%s- [%s] %s"
- (key-description (this-command-keys))
- (oref transient--prefix command)
- (mapconcat
- #'identity
- (sort
- (cl-mapcan
- (lambda (suffix)
- (let ((key (kbd (oref suffix key))))
- ;; Don't list any common commands.
- (and (not (memq (oref suffix command)
- `(,(lookup-key transient-map key)
- ,(lookup-key transient-sticky-map key)
- ;; From transient-common-commands:
- transient-set
- transient-save
- transient-history-prev
- transient-history-next
- transient-quit-one
- transient-toggle-common
- transient-set-level)))
- (list (propertize (oref suffix key) 'face 'transient-key)))))
- transient--suffixes)
- #'string<)
- (propertize "|" 'face 'transient-unreachable-key))))))
-
-(defun transient--show ()
- (transient--timer-cancel)
- (setq transient--showp t)
- (let ((buf (get-buffer-create transient--buffer-name))
- (focus nil))
- (unless (window-live-p transient--window)
- (setq transient--window
- (display-buffer buf transient-display-buffer-action)))
- (with-selected-window transient--window
- (when transient-enable-popup-navigation
- (setq focus (button-get (point) 'command)))
- (erase-buffer)
- (set-window-hscroll transient--window 0)
- (set-window-dedicated-p transient--window t)
- (set-window-parameter transient--window 'no-other-window t)
- (setq window-size-fixed t)
- (when (bound-and-true-p tab-line-format)
- (setq tab-line-format nil))
- (setq mode-line-format (if (eq transient-mode-line-format 'line)
- nil
- transient-mode-line-format))
- (setq mode-line-buffer-identification
- (symbol-name (oref transient--prefix command)))
- (if transient-enable-popup-navigation
- (setq-local cursor-in-non-selected-windows 'box)
- (setq cursor-type nil))
- (setq display-line-numbers nil)
- (setq show-trailing-whitespace nil)
- (transient--insert-groups)
- (when (or transient--helpp transient--editp)
- (transient--insert-help))
- (when (and (eq transient-mode-line-format 'line)
- window-system)
- (let ((face
- (if-let ((f (and (transient--semantic-coloring-p)
- (transient--prefix-color transient--prefix))))
- `(,@(and (>= emacs-major-version 27) '(:extend t))
- :background ,(face-foreground f))
- 'transient-separator)))
- (insert (propertize "__" 'face face 'display '(space :height (1))))
- (insert (propertize "\n" 'face face 'line-height t))))
- (let ((window-resize-pixelwise t)
- (window-size-fixed nil))
- (fit-window-to-buffer nil nil 1))
- (goto-char (point-min))
- (when transient-force-fixed-pitch
- (transient--force-fixed-pitch))
- (when transient-enable-popup-navigation
- (transient--goto-button focus)))))
-
-(defun transient--insert-groups ()
- (let ((groups (cl-mapcan (lambda (group)
- (let ((hide (oref group hide)))
- (and (not (and (functionp hide)
- (funcall hide)))
- (list group))))
- transient--layout))
- group)
- (while (setq group (pop groups))
- (transient--insert-group group)
- (when groups
- (insert ?\n)))))
-
-(cl-defgeneric transient--insert-group (group)
- "Format GROUP and its elements and insert the result.")
-
-(cl-defmethod transient--insert-group :before ((group transient-group))
- "Insert GROUP's description, if any."
- (when-let ((desc (transient-format-description group)))
- (insert desc ?\n)))
-
-(cl-defmethod transient--insert-group ((group transient-row))
- (dolist (suffix (oref group suffixes))
- (insert (transient-format suffix))
- (insert " "))
- (insert ?\n))
-
-(cl-defmethod transient--insert-group ((group transient-column))
- (dolist (suffix (oref group suffixes))
- (let ((str (transient-format suffix)))
- (insert str)
- (unless (string-match-p ".\n\\'" str)
- (insert ?\n)))))
-
-(cl-defmethod transient--insert-group ((group transient-columns))
- (let* ((columns
- (mapcar
- (lambda (column)
- (let ((rows (mapcar 'transient-format (oref column suffixes))))
- (when-let ((desc (transient-format-description column)))
- (push desc rows))
- rows))
- (oref group suffixes)))
- (rs (apply #'max (mapcar #'length columns)))
- (cs (length columns))
- (cw (mapcar (lambda (col) (apply #'max (mapcar #'length col)))
- columns))
- (cc (transient--seq-reductions-from (apply-partially #'+ 3) cw 0)))
- (dotimes (r rs)
- (dotimes (c cs)
- (insert (make-string (- (nth c cc) (current-column)) ?\s))
- (when-let ((cell (nth r (nth c columns))))
- (insert cell))
- (when (= c (1- cs))
- (insert ?\n))))))
-
-(cl-defmethod transient--insert-group ((group transient-subgroups))
- (let* ((subgroups (oref group suffixes))
- (n (length subgroups)))
- (dotimes (s n)
- (transient--insert-group (nth s subgroups))
- (when (< s (1- n))
- (insert ?\n)))))
-
-(cl-defgeneric transient-format (obj)
- "Format and return OBJ for display.
-
-When this function is called, then the current buffer is some
-temporary buffer. If you need the buffer from which the prefix
-command was invoked to be current, then do so by temporarily
-making `transient--original-buffer' current.")
-
-(cl-defmethod transient-format ((arg string))
- "Return the string ARG after applying the `transient-heading' face."
- (propertize arg 'face 'transient-heading))
-
-(cl-defmethod transient-format ((_ null))
- "Return a string containing just the newline character."
- "\n")
-
-(cl-defmethod transient-format ((arg integer))
- "Return a string containing just the ARG character."
- (char-to-string arg))
-
-(cl-defmethod transient-format :around ((obj transient-infix))
- "When reading user input for this infix, then highlight it."
- (let ((str (cl-call-next-method obj)))
- (when (eq obj transient--active-infix)
- (setq str (concat str "\n"))
- (add-face-text-property
- (if (eq this-command 'transient-set-level) 3 0)
- (length str)
- 'transient-active-infix nil str))
- str))
-
-(cl-defmethod transient-format :around ((obj transient-suffix))
- "When edit-mode is enabled, then prepend the level information.
-Optional support for popup buttons is also implemented here."
- (let ((str (concat
- (and transient--editp
- (let ((level (oref obj level)))
- (propertize (format " %s " level)
- 'face (if (transient--use-level-p level t)
- 'transient-enabled-suffix
- 'transient-disabled-suffix))))
- (cl-call-next-method obj))))
- (when (oref obj inapt)
- (set-text-properties 0 (length str)
- (list 'face 'transient-inapt-suffix)
- str))
- (if transient-enable-popup-navigation
- (make-text-button str nil
- 'type 'transient-button
- 'command (transient--suffix-command obj))
- str)))
-
-(cl-defmethod transient-format ((obj transient-infix))
- "Return a string generated using OBJ's `format'.
-%k is formatted using `transient-format-key'.
-%d is formatted using `transient-format-description'.
-%v is formatted using `transient-format-value'."
- (format-spec (oref obj format)
- `((?k . ,(transient-format-key obj))
- (?d . ,(transient-format-description obj))
- (?v . ,(transient-format-value obj)))))
-
-(cl-defmethod transient-format ((obj transient-suffix))
- "Return a string generated using OBJ's `format'.
-%k is formatted using `transient-format-key'.
-%d is formatted using `transient-format-description'."
- (format-spec (oref obj format)
- `((?k . ,(transient-format-key obj))
- (?d . ,(transient-format-description obj)))))
-
-(cl-defgeneric transient-format-key (obj)
- "Format OBJ's `key' for display and return the result.")
-
-(cl-defmethod transient-format-key ((obj transient-suffix))
- "Format OBJ's `key' for display and return the result."
- (let ((key (oref obj key))
- (cmd (oref obj command)))
- (if transient--redisplay-key
- (let ((len (length transient--redisplay-key))
- (seq (cl-coerce (edmacro-parse-keys key t) 'list)))
- (cond
- ((equal (seq-take seq len) transient--redisplay-key)
- (let ((pre (key-description (vconcat (seq-take seq len))))
- (suf (key-description (vconcat (seq-drop seq len)))))
- (setq pre (replace-regexp-in-string "RET" "C-m" pre t))
- (setq pre (replace-regexp-in-string "TAB" "C-i" pre t))
- (setq suf (replace-regexp-in-string "RET" "C-m" suf t))
- (setq suf (replace-regexp-in-string "TAB" "C-i" suf t))
- ;; We use e.g. "-k" instead of the more correct "- k",
- ;; because the former is prettier. If we did that in
- ;; the definition, then we want to drop the space that
- ;; is reinserted above. False-positives are possible
- ;; for silly bindings like "-C-c C-c".
- (unless (string-match-p " " key)
- (setq pre (replace-regexp-in-string " " "" pre))
- (setq suf (replace-regexp-in-string " " "" suf)))
- (concat (propertize pre 'face 'default)
- (and (string-prefix-p (concat pre " ") key) " ")
- (transient--colorize-key suf cmd)
- (save-excursion
- (when (string-match " +\\'" key)
- (match-string 0 key))))))
- ((transient--lookup-key transient-sticky-map (kbd key))
- (transient--colorize-key key cmd))
- (t
- (propertize key 'face 'transient-unreachable-key))))
- (transient--colorize-key key cmd))))
-
-(defun transient--colorize-key (key command)
- (propertize key 'face
- (or (and (transient--semantic-coloring-p)
- (transient--suffix-color command))
- 'transient-key)))
-
-(cl-defmethod transient-format-key :around ((obj transient-argument))
- (let ((key (cl-call-next-method obj)))
- (cond ((not transient-highlight-mismatched-keys))
- ((not (slot-boundp obj 'shortarg))
- (add-face-text-property
- 0 (length key) 'transient-nonstandard-key nil key))
- ((not (string-equal key (oref obj shortarg)))
- (add-face-text-property
- 0 (length key) 'transient-mismatched-key nil key)))
- key))
-
-(cl-defgeneric transient-format-description (obj)
- "Format OBJ's `description' for display and return the result.")
-
-(cl-defmethod transient-format-description ((obj transient-child))
- "The `description' slot may be a function, in which case that is
-called inside the correct buffer (see `transient-insert-group')
-and its value is returned to the caller."
- (when-let ((desc (oref obj description)))
- (if (functionp desc)
- (with-current-buffer transient--original-buffer
- (funcall desc))
- desc)))
-
-(cl-defmethod transient-format-description ((obj transient-group))
- "Format the description by calling the next method. If the result
-doesn't use the `face' property at all, then apply the face
-`transient-heading' to the complete string."
- (when-let ((desc (cl-call-next-method obj)))
- (if (text-property-not-all 0 (length desc) 'face nil desc)
- desc
- (propertize desc 'face 'transient-heading))))
-
-(cl-defmethod transient-format-description :around ((obj transient-suffix))
- "Format the description by calling the next method. If the result
-is nil, then use \"(BUG: no description)\" as the description.
-If the OBJ's `key' is currently unreachable, then apply the face
-`transient-unreachable' to the complete string."
- (let ((desc (or (cl-call-next-method obj)
- (propertize "(BUG: no description)" 'face 'error))))
- (if (transient--key-unreachable-p obj)
- (propertize desc 'face 'transient-unreachable)
- desc)))
-
-(cl-defgeneric transient-format-value (obj)
- "Format OBJ's value for display and return the result.")
-
-(cl-defmethod transient-format-value ((obj transient-suffix))
- (propertize (oref obj argument)
- 'face (if (oref obj value)
- 'transient-argument
- 'transient-inactive-argument)))
-
-(cl-defmethod transient-format-value ((obj transient-option))
- (let ((value (oref obj value)))
- (propertize (concat (oref obj argument)
- (if (listp value)
- (mapconcat #'identity value ",")
- value))
- 'face (if value
- 'transient-value
- 'transient-inactive-value))))
-
-(cl-defmethod transient-format-value ((obj transient-switches))
- (with-slots (value argument-format choices) obj
- (format (propertize argument-format
- 'face (if value
- 'transient-value
- 'transient-inactive-value))
- (concat
- (propertize "[" 'face 'transient-inactive-value)
- (mapconcat
- (lambda (choice)
- (propertize choice 'face
- (if (equal (format argument-format choice) value)
- 'transient-value
- 'transient-inactive-value)))
- choices
- (propertize "|" 'face 'transient-inactive-value))
- (propertize "]" 'face 'transient-inactive-value)))))
-
-(cl-defmethod transient-format-value ((obj transient-files))
- (let ((argument (oref obj argument)))
- (if-let ((value (oref obj value)))
- (propertize (concat argument " "
- (mapconcat (lambda (f) (format "%S" f))
- (oref obj value) " "))
- 'face 'transient-argument)
- (propertize argument 'face 'transient-inactive-argument))))
-
-(defun transient--key-unreachable-p (obj)
- (and transient--redisplay-key
- (let ((key (oref obj key)))
- (not (or (equal (seq-take (cl-coerce (edmacro-parse-keys key t) 'list)
- (length transient--redisplay-key))
- transient--redisplay-key)
- (transient--lookup-key transient-sticky-map (kbd key)))))))
-
-(defun transient--lookup-key (keymap key)
- (let ((val (lookup-key keymap key)))
- (and val (not (integerp val)) val)))
-
-;;; Help
-
-(cl-defgeneric transient-show-help (obj)
- "Show help for OBJ's command.")
-
-(cl-defmethod transient-show-help ((obj transient-prefix))
- "Show the info manual, manpage or command doc-string.
-Show the first one that is specified."
- (if-let ((manual (oref obj info-manual)))
- (info manual)
- (if-let ((manpage (oref obj man-page)))
- (transient--show-manpage manpage)
- (transient--describe-function (oref obj command)))))
-
-(cl-defmethod transient-show-help ((_ transient-suffix))
- "Show the command doc-string."
- (if (eq this-original-command 'transient-help)
- (if-let ((manpage (oref transient--prefix man-page)))
- (transient--show-manpage manpage)
- (transient--describe-function (oref transient--prefix command)))
- (transient--describe-function this-original-command)))
-
-(cl-defmethod transient-show-help ((obj transient-infix))
- "Show the manpage if defined or the command doc-string.
-If the manpage is specified, then try to jump to the correct
-location."
- (if-let ((manpage (oref transient--prefix man-page)))
- (transient--show-manpage manpage (ignore-errors (oref obj argument)))
- (transient--describe-function this-original-command)))
-
-;; `cl-generic-generalizers' doesn't support `command' et al.
-(cl-defmethod transient-show-help (cmd)
- "Show the command doc-string."
- (transient--describe-function cmd))
-
-(defun transient--show-manpage (manpage &optional argument)
- (require 'man)
- (let* ((Man-notify-method 'meek)
- (buf (Man-getpage-in-background manpage))
- (proc (get-buffer-process buf)))
- (while (and proc (eq (process-status proc) 'run))
- (accept-process-output proc))
- (switch-to-buffer buf)
- (when argument
- (transient--goto-argument-description argument))))
-
-(defun transient--describe-function (fn)
- (describe-function fn)
- (select-window (get-buffer-window (help-buffer))))
-
-(defun transient--goto-argument-description (arg)
- (goto-char (point-min))
- (let ((case-fold-search nil)
- ;; This matches preceding/proceeding options. Options
- ;; such as "-a", "-S[<keyid>]", and "--grep=<pattern>"
- ;; are matched by this regex without the shy group.
- ;; The ". " in the shy group is for options such as
- ;; "-m parent-number", and the "-[^[:space:]]+ " is
- ;; for options such as "--mainline parent-number"
- (others "-\\(?:. \\|-[^[:space:]]+ \\)?[^[:space:]]+"))
- (when (re-search-forward
- (if (equal arg "--")
- ;; Special case.
- "^[\t\s]+\\(--\\(?: \\|$\\)\\|\\[--\\]\\)"
- ;; Should start with whitespace and may have
- ;; any number of options before and/or after.
- (format
- "^[\t\s]+\\(?:%s, \\)*?\\(?1:%s\\)%s\\(?:, %s\\)*$"
- others
- ;; Options don't necessarily end in an "="
- ;; (e.g., "--gpg-sign[=<keyid>]")
- (string-remove-suffix "=" arg)
- ;; Simple options don't end in an "=". Splitting this
- ;; into 2 cases should make getting false positives
- ;; less likely.
- (if (string-suffix-p "=" arg)
- ;; "[^[:space:]]*[^.[:space:]]" matches the option
- ;; value, which is usually after the option name
- ;; and either '=' or '[='. The value can't end in
- ;; a period, as that means it's being used at the
- ;; end of a sentence. The space is for options
- ;; such as '--mainline parent-number'.
- "\\(?: \\|\\[?=\\)[^[:space:]]*[^.[:space:]]"
- ;; Either this doesn't match anything (e.g., "-a"),
- ;; or the option is followed by a value delimited
- ;; by a "[", "<", or ":". A space might appear
- ;; before this value, as in "-f <file>". The
- ;; space alternative is for options such as
- ;; "-m parent-number".
- "\\(?:\\(?: \\| ?[\\[<:]\\)[^[:space:]]*[^.[:space:]]\\)?")
- others))
- nil t)
- (goto-char (match-beginning 1)))))
-
-(defun transient--insert-help ()
- (unless (looking-back "\n\n" 2)
- (insert "\n"))
- (when transient--helpp
- (insert
- (format (propertize "\
-Type a %s to show help for that suffix command, or %s to show manual.
-Type %s to exit help.\n"
- 'face 'transient-heading)
- (propertize "<KEY>" 'face 'transient-key)
- (propertize "?" 'face 'transient-key)
- (propertize "C-g" 'face 'transient-key))))
- (when transient--editp
- (unless transient--helpp
- (insert
- (format (propertize "\
-Type a %s to set level for that suffix command.
-Type %s to set what levels are available for this prefix command.\n"
- 'face 'transient-heading)
- (propertize "<KEY>" 'face 'transient-key)
- (propertize "C-x l" 'face 'transient-key))))
- (with-slots (level) transient--prefix
- (insert
- (format (propertize "
-Suffixes on levels %s are available.
-Suffixes on levels %s and %s are unavailable.\n"
- 'face 'transient-heading)
- (propertize (format "1-%s" level)
- 'face 'transient-enabled-suffix)
- (propertize " 0 "
- 'face 'transient-disabled-suffix)
- (propertize (format ">=%s" (1+ level))
- 'face 'transient-disabled-suffix))))))
-
-(defvar transient-resume-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap Man-quit] 'transient-resume)
- (define-key map [remap Info-exit] 'transient-resume)
- (define-key map [remap quit-window] 'transient-resume)
- map)
- "Keymap for `transient-resume-mode'.
-
-This keymap remaps every command that would usually just quit the
-documentation buffer to `transient-resume', which additionally
-resumes the suspended transient.")
-
-(define-minor-mode transient-resume-mode
- "Auxiliary minor-mode used to resume a transient after viewing help.")
-
-;;; Compatibility
-;;;; Popup Navigation
-
-(defun transient-popup-navigation-help ()
- "Inform the user how to enable popup navigation commands."
- (interactive)
- (message "This command is only available if `%s' is non-nil"
- 'transient-enable-popup-navigation))
-
-(define-button-type 'transient-button
- 'face nil
- 'action (lambda (button)
- (let ((command (button-get button 'command)))
- ;; Yes, I know that this is wrong(tm).
- ;; Unfortunately it is also necessary.
- (setq this-original-command command)
- (call-interactively command))))
-
-(defvar transient-popup-navigation-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "<down-mouse-1>") 'transient-noop)
- (define-key map (kbd "<mouse-1>") 'transient-mouse-push-button)
- (define-key map (kbd "RET") 'transient-push-button)
- (define-key map (kbd "<up>") 'transient-backward-button)
- (define-key map (kbd "C-p") 'transient-backward-button)
- (define-key map (kbd "<down>") 'transient-forward-button)
- (define-key map (kbd "C-n") 'transient-forward-button)
- (define-key map (kbd "C-r") 'transient-isearch-backward)
- (define-key map (kbd "C-s") 'transient-isearch-forward)
- map))
-
-(defun transient-mouse-push-button (&optional pos)
- "Invoke the suffix the user clicks on."
- (interactive (list last-command-event))
- (push-button pos))
-
-(defun transient-push-button ()
- "Invoke the selected suffix command."
- (interactive)
- (with-selected-window transient--window
- (push-button)))
-
-(defun transient-backward-button (n)
- "Move to the previous button in the transient popup buffer.
-See `backward-button' for information about N."
- (interactive "p")
- (with-selected-window transient--window
- (backward-button n t)))
-
-(defun transient-forward-button (n)
- "Move to the next button in the transient popup buffer.
-See `forward-button' for information about N."
- (interactive "p")
- (with-selected-window transient--window
- (forward-button n t)))
-
-(defun transient--goto-button (command)
- (if (not command)
- (forward-button 1)
- (while (and (ignore-errors (forward-button 1))
- (not (eq (button-get (button-at (point)) 'command) command))))
- (unless (eq (button-get (button-at (point)) 'command) command)
- (goto-char (point-min))
- (forward-button 1))))
-
-;;;; Popup Isearch
-
-(defvar transient--isearch-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map isearch-mode-map)
- (define-key map [remap isearch-exit] 'transient-isearch-exit)
- (define-key map [remap isearch-cancel] 'transient-isearch-cancel)
- (define-key map [remap isearch-abort] 'transient-isearch-abort)
- map))
-
-(defun transient-isearch-backward (&optional regexp-p)
- "Do incremental search backward.
-With a prefix argument, do an incremental regular expression
-search instead."
- (interactive "P")
- (transient--isearch-setup)
- (let ((isearch-mode-map transient--isearch-mode-map))
- (isearch-mode nil regexp-p)))
-
-(defun transient-isearch-forward (&optional regexp-p)
- "Do incremental search forward.
-With a prefix argument, do an incremental regular expression
-search instead."
- (interactive "P")
- (transient--isearch-setup)
- (let ((isearch-mode-map transient--isearch-mode-map))
- (isearch-mode t regexp-p)))
-
-(defun transient-isearch-exit ()
- "Like `isearch-exit' but adapted for `transient'."
- (interactive)
- (isearch-exit)
- (transient--isearch-exit))
-
-(defun transient-isearch-cancel ()
- "Like `isearch-cancel' but adapted for `transient'."
- (interactive)
- (condition-case nil (isearch-cancel) (quit))
- (transient--isearch-exit))
-
-(defun transient-isearch-abort ()
- "Like `isearch-abort' but adapted for `transient'."
- (interactive)
- (condition-case nil (isearch-abort) (quit))
- (transient--isearch-exit))
-
-(defun transient--isearch-setup ()
- (select-window transient--window)
- (transient--suspend-override))
-
-(defun transient--isearch-exit ()
- (select-window transient--original-window)
- (transient--resume-override))
-
-;;;; Hydra Color Emulation
-
-(defun transient--semantic-coloring-p ()
- (and transient-semantic-coloring
- (not transient--helpp)
- (not transient--editp)))
-
-(defun transient--suffix-color (command)
- (or (get command 'transient-color)
- (get (transient--get-predicate-for command) 'transient-color)))
-
-(defun transient--prefix-color (command)
- (let* ((nonsuf (or (oref command transient-non-suffix)
- 'transient--do-warn))
- (nonsuf (if (memq nonsuf '(transient--do-noop transient--do-warn))
- 'disallow
- (get nonsuf 'transient-color)))
- (suffix (if-let ((pred (oref command transient-suffix)))
- (get pred 'transient-color)
- (if (eq nonsuf 'transient-red)
- 'transient-red
- 'transient-blue))))
- (pcase (list suffix nonsuf)
- (`(transient-red disallow) 'transient-amaranth)
- (`(transient-blue disallow) 'transient-teal)
- (`(transient-red transient-red) 'transient-pink)
- (`(transient-red transient-blue) 'transient-red)
- (`(transient-blue transient-blue) 'transient-blue))))
-
-;;;; Edebug
-
-(defun transient--edebug--recursive-edit (fn arg-mode)
- (transient--debug 'edebug--recursive-edit)
- (if (not transient--prefix)
- (funcall fn arg-mode)
- (transient--suspend-override t)
- (funcall fn arg-mode)
- (transient--resume-override t)))
-
-(advice-add 'edebug--recursive-edit :around 'transient--edebug--recursive-edit)
-
-(defun transient--abort-edebug ()
- (when (bound-and-true-p edebug-active)
- (transient--emergency-exit)))
-
-(advice-add 'abort-recursive-edit :before 'transient--abort-edebug)
-(advice-add 'top-level :before 'transient--abort-edebug)
-
-(defun transient--edebug-command-p ()
- (and (bound-and-true-p edebug-active)
- (or (memq this-command '(top-level abort-recursive-edit))
- (string-prefix-p "edebug" (symbol-name this-command)))))
-
-;;;; Miscellaneous
-
-(declare-function which-key-mode "which-key" (&optional arg))
-
-(defun transient--suspend-which-key-mode ()
- (when (bound-and-true-p which-key-mode)
- (which-key-mode -1)
- (add-hook 'transient-exit-hook 'transient--resume-which-key-mode)))
-
-(defun transient--resume-which-key-mode ()
- (unless transient--prefix
- (which-key-mode 1)
- (remove-hook 'transient-exit-hook 'transient--resume-which-key-mode)))
-
-(defun transient-bind-q-to-quit ()
- "Modify some keymaps to bind \"q\" to the appropriate quit command.
-
-\"C-g\" is the default binding for such commands now, but Transient's
-predecessor Magit-Popup used \"q\" instead. If you would like to get
-that binding back, then call this function in your init file like so:
-
- (with-eval-after-load \\='transient
- (transient-bind-q-to-quit))
-
-Individual transients may already bind \"q\" to something else
-and such a binding would shadow the quit binding. If that is the
-case then \"Q\" is bound to whatever \"q\" would have been bound
-to by setting `transient-substitute-key-function' to a function
-that does that. Of course \"Q\" may already be bound to something
-else, so that function binds \"M-q\" to that command instead.
-Of course \"M-q\" may already be bound to something else, but
-we stop there."
- (define-key transient-base-map "q" 'transient-quit-one)
- (define-key transient-sticky-map "q" 'transient-quit-seq)
- (setq transient-substitute-key-function
- 'transient-rebind-quit-commands))
-
-(defun transient-rebind-quit-commands (obj)
- "See `transient-bind-q-to-quit'."
- (let ((key (oref obj key)))
- (cond ((string-equal key "q") "Q")
- ((string-equal key "Q") "M-q")
- (t key))))
-
-(defun transient--force-fixed-pitch ()
- (require 'face-remap)
- (face-remap-reset-base 'default)
- (face-remap-add-relative 'default 'fixed-pitch))
-
-;;;; Missing from Emacs
-
-(defun transient--seq-reductions-from (function sequence initial-value)
- (let ((acc (list initial-value)))
- (seq-doseq (elt sequence)
- (push (funcall function (car acc) elt) acc))
- (nreverse acc)))
-
-;;; Font-Lock
-
-(defconst transient-font-lock-keywords
- (eval-when-compile
- `((,(concat "("
- (regexp-opt (list "transient-define-prefix"
- "transient-define-infix"
- "transient-define-argument"
- "transient-define-suffix")
- t)
- "\\_>[ \t'\(]*"
- "\\(\\(?:\\sw\\|\\s_\\)+\\)?")
- (1 'font-lock-keyword-face)
- (2 'font-lock-function-name-face nil t)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode transient-font-lock-keywords)
-
-;;; _
-(provide 'transient)
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-;;; transient.el ends here
diff --git a/elpa/transient-20200719.955/transient.info b/elpa/transient-20200719.955/transient.info
deleted file mode 100644
index 1fc0d99..0000000
--- a/elpa/transient-20200719.955/transient.info
+++ /dev/null
@@ -1,2442 +0,0 @@
-This is transient.info, produced by makeinfo version 6.5 from
-transient.texi.
-
- Copyright (C) 2018-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Transient: (transient). Transient Commands.
-END-INFO-DIR-ENTRY
-
-
-File: transient.info, Node: Top, Next: Introduction, Up: (dir)
-
-Transient User and Developer Manual
-***********************************
-
-Taking inspiration from prefix keys and prefix arguments, Transient
-implements a similar abstraction involving a prefix command, infix
-arguments and suffix commands. We could call this abstraction a
-"transient command", but because it always involves at least two
-commands (a prefix and a suffix) we prefer to call it just a
-"transient".
-
- When the user calls a transient prefix command, then a transient
-(temporary) keymap is activated, which binds the transient’s infix and
-suffix commands, and functions that control the transient state are
-added to ‘pre-command-hook’ and ‘post-command-hook’. The available
-suffix and infix commands and their state are shown in a popup buffer
-until the transient is exited by invoking a suffix command.
-
- Calling an infix command causes its value to be changed, possibly by
-reading a new value in the minibuffer.
-
- Calling a suffix command usually causes the transient to be exited
-but suffix commands can also be configured to not exit the transient.
-
-This manual is for Transient version 0.2.0 (v0.2.0-8-gc94cff7+1).
-
- Copyright (C) 2018-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-* Menu:
-
-* Introduction::
-* Usage::
-* Other Options::
-* Modifying Existing Transients::
-* Defining New Commands::
-* Classes and Methods::
-* Related Abstractions and Packages::
-* FAQ::
-* Keystroke Index::
-* Command Index::
-* Function Index::
-* Variable Index::
-
-— The Detailed Node Listing —
-
-Usage
-
-* Invoking Transients::
-* Aborting and Resuming Transients::
-* Common Suffix Commands::
-* Saving Values::
-* Using History::
-* Getting Help for Suffix Commands::
-* Enabling and Disabling Suffixes::
-* Other Commands::
-
-Defining New Commands
-
-* Defining Transients::
-* Binding Suffix and Infix Commands::
-* Defining Suffix and Infix Commands::
-* Using Infix Arguments::
-* Transient State::
-
-Binding Suffix and Infix Commands
-
-* Group Specifications::
-* Suffix Specifications::
-
-
-Classes and Methods
-
-* Group Classes::
-* Group Methods::
-* Prefix Classes::
-* Suffix Classes::
-* Suffix Methods::
-* Prefix Slots::
-* Suffix Slots::
-* Predicate Slots::
-
-Suffix Methods
-
-* Suffix Value Methods::
-* Suffix Format Methods::
-
-
-Related Abstractions and Packages
-
-* Comparison With Prefix Keys and Prefix Arguments::
-* Comparison With Other Packages::
-
-
-
-File: transient.info, Node: Introduction, Next: Usage, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-Taking inspiration from prefix keys and prefix arguments, Transient
-implements a similar abstraction involving a prefix command, infix
-arguments and suffix commands. We could call this abstraction a
-"transient command", but because it always involves at least two
-commands (a prefix and a suffix) we prefer to call it just a
-"transient".
-
- Transient keymaps are a feature provided by Emacs. Transients as
- implemented by this package involve the use of transient keymaps.
-
- Emacs provides a feature that it calls "prefix commands". When we
- talk about "prefix commands" in this manual, then we mean our own
- kind of "prefix commands", unless specified otherwise. To avoid
- ambiguity we sometimes use the terms "transient prefix command" for
- our kind and "regular prefix command" for Emacs’ kind.
-
- When the user calls a transient prefix command, then a transient
-(temporary) keymap is activated, which binds the transient’s infix and
-suffix commands, and functions that control the transient state are
-added to ‘pre-command-hook’ and ‘post-command-hook’. The available
-suffix and infix commands and their state are shown in a popup buffer
-until the transient state is exited by invoking a suffix command.
-
- Calling an infix command causes its value to be changed. How that is
-done depends on the type of the infix command. The simplest case is an
-infix command that represents a command-line argument that does not take
-a value. Invoking such an infix command causes the switch to be toggled
-on or off. More complex infix commands may read a value from the user,
-using the minibuffer.
-
- Calling a suffix command usually causes the transient to be exited;
-the transient keymaps and hook functions are removed, the popup buffer
-no longer shows information about the (no longer bound) suffix commands,
-the values of some public global variables are set, while some internal
-global variables are unset, and finally the command is actually called.
-Suffix commands can also be configured to not exit the transient.
-
- A suffix command can, but does not have to, use the infix arguments
-in much the same way it can choose to use or ignore the prefix
-arguments. For a suffix command that was invoked from a transient the
-variable ‘transient-current-suffixes’ and the function ‘transient-args’
-serve about the same purpose as the variables ‘prefix-arg’ and
-‘current-prefix-arg’ do for any command that was called after the prefix
-arguments have been set using a command such as ‘universal-argument’.
-
- The information shown in the popup buffer while a transient is active
-looks a bit like this:
-
- ,-----------------------------------------
- |Arguments
- | -f Force (--force)
- | -a Annotate (--annotate)
- |
- |Create
- | t tag
- | r release
- `-----------------------------------------
-
- This is a simplified version of ‘magit-tag’. Info manuals do not
- support images or colored text, so the above "screenshot" lacks
- some information; in practice you would be able to tell whether the
- arguments ‘--force’ and ‘--annotate’ are enabled or not based on
- their color.
-
- Transient can be used to implement simple "command dispatchers". The
-main benefit then is that the user can see all the available commands in
-a popup buffer. That is useful by itself because it frees the user from
-having to remember all the keys that are valid after a certain prefix
-key or command. Magit’s ‘magit-dispatch’ command is an example of using
-Transient to merely implement a command dispatcher.
-
- In addition to that, Transient also allows users to interactively
-pass arguments to commands. These arguments can be much more complex
-than what is reasonable when using prefix arguments. There is a limit
-to how many aspects of a command can be controlled using prefix
-arguments. Furthermore what a certain prefix argument means for
-different commands can be completely different, and users have to read
-documentation to learn and then commit to memory what a certain prefix
-argument means to a certain command.
-
- Transient suffix commands on the other hand can accept dozens of
-different arguments without the user having to remember anything. When
-using Transient, then one can call a command with arguments that are
-just as complex as when calling the same function non-interactively
-using code.
-
- Invoking a transient command with arguments is similar to invoking a
-command in a shell with command-line completion and history enabled.
-One benefit of the Transient interface is that it remembers history not
-only on a global level ("this command was invoked using these arguments
-and previously it was invoked using those other arguments"), but also
-remembers the values of individual arguments independently. See *note
-Using History::.
-
- After a transient prefix command is invoked ‘C-h <key>’ can be used
-to show the documentation for the infix or suffix command that ‘<key>’
-is bound to (see *note Getting Help for Suffix Commands::) and infixes
-and suffixes can be removed from the transient using ‘C-x l <key>’.
-Infixes and suffixes that are disabled by default can be enabled the
-same way. See *note Enabling and Disabling Suffixes::.
-
- Transient ships with support for a few different types of specialized
-infix commands. A command that sets a command line option for example
-has different needs than a command that merely toggles a boolean flag.
-Additionally Transient provides abstractions for defining new types,
-which the author of Transient did not anticipate (or didn’t get around
-to implementing yet).
-
-
-File: transient.info, Node: Usage, Next: Other Options, Prev: Introduction, Up: Top
-
-2 Usage
-*******
-
-* Menu:
-
-* Invoking Transients::
-* Aborting and Resuming Transients::
-* Common Suffix Commands::
-* Saving Values::
-* Using History::
-* Getting Help for Suffix Commands::
-* Enabling and Disabling Suffixes::
-* Other Commands::
-
-
-File: transient.info, Node: Invoking Transients, Next: Aborting and Resuming Transients, Up: Usage
-
-2.1 Invoking Transients
-=======================
-
-A transient prefix command is invoked like any other command by pressing
-the key that is bound to that command. The main difference to other
-commands is that a transient prefix command activates a transient
-keymap, which temporarily binds the transient’s infix and suffix
-commands. Bindings from other keymaps may, or may not, be disabled
-while the transient state is in effect.
-
- There are two kinds of commands that are available after invoking a
-transient prefix command; infix and suffix commands. Infix commands set
-some value (which is then shown in a popup buffer), without leaving the
-transient. Suffix commands on the other hand usually quit the transient
-and they may use the values set by the infix commands, i.e. the infix
-*arguments*.
-
- Instead of setting arguments to be used by a suffix command, infix
-commands may also set some value by side-effect.
-
-
-File: transient.info, Node: Aborting and Resuming Transients, Next: Common Suffix Commands, Prev: Invoking Transients, Up: Usage
-
-2.2 Aborting and Resuming Transients
-====================================
-
-To quit the transient without invoking a suffix command press ‘C-g’.
-
- Key bindings in transient keymaps may be longer than a single event.
-After pressing a valid prefix key, all commands whose bindings do not
-begin with that prefix key are temporarily unavailable and grayed out.
-To abort the prefix key press ‘C-g’ (which in this case only quits the
-prefix key, but not the complete transient).
-
- A transient prefix command can be bound as a suffix of another
-transient. Invoking such a suffix replaces the current transient state
-with a new transient state, i.e. the available bindings change and the
-information displayed in the popup buffer is updated accordingly.
-Pressing ‘C-g’ while a nested transient is active only quits the
-innermost transient, causing a return to the previous transient.
-
- ‘C-q’ or ‘C-z’ on the other hand always exits all transients. If you
-use the latter, then you can later resume the stack of transients using
-‘M-x transient-resume’.
-
-‘C-g’ (‘transient-quit-seq’)
-‘C-g’ (‘transient-quit-one’)
-
- This key quits the currently active incomplete key sequence, if
- any, or else the current transient. When quitting the current
- transient, then it returns to the previous transient, if any.
-
- Transient’s predecessor bound ‘q’ instead of ‘C-g’ to the quit
-command. To learn how to get that binding back see
-‘transient-bind-q-to-quit’’s doc string.
-
-‘C-q’ (‘transient-quit-all’)
-
- This command quits the currently active incomplete key sequence, if
- any, and all transients, including the active transient and all
- suspended transients, if any.
-
-‘C-z’ (‘transient-suspend’)
-
- Like ‘transient-quit-all’, this command quits an incomplete key
- sequence, if any, and all transients. Additionally it saves the
- stack of transients so that it can easily be resumed (which is
- particularly useful if you quickly need to do "something else" and
- the stack is deeper than a single transient and/or you have already
- changed the values of some infix arguments).
-
- Note that only a single stack of transients can be saved at a time.
- If another stack is already saved, then saving a new stack discards
- the previous stack.
-
-‘M-x transient-resume’ (‘transient-resume’)
-
- This command resumes the previously suspended stack of transients,
- if any.
-
-
-File: transient.info, Node: Common Suffix Commands, Next: Saving Values, Prev: Aborting and Resuming Transients, Up: Usage
-
-2.3 Common Suffix Commands
-==========================
-
-A few shared suffix commands are available in all transients. These
-suffix commands are not shown in the popup buffer by default.
-
- Most of these commands are bound to ‘C-x <key>’ and after pressing
-‘C-x’ a section featuring all common commands is temporarily shown in
-the popup buffer. After invoking one of these commands, that section
-disappears again. Note however that one of these commands is described
-as "Show common permanently"; invoke that if you want the common
-commands to always be shown for all transients.
-
-‘C-x t’ (‘transient-toggle-common’)
-
- This command toggles whether the generic commands that are common
- to all transients are always displayed or only after typing the
- incomplete prefix key sequence ‘C-x’. This only affects the
- current Emacs session.
-
- -- User Option: transient-show-common-commands
-
- This option controls whether shared suffix commands are shown
- alongside the transient-specific infix and suffix commands. By
- default the shared commands are not shown to avoid overwhelming the
- user with to many options.
-
- While a transient is active, pressing ‘C-x’ always shows the common
- command. The value of this option can be changed for the current
- Emacs session by typing ‘C-x t’ while a transient is active.
-
- The other common commands are described in either the previous node
-or in one of the following nodes.
-
- Some of Transient’s key bindings differ from the respective bindings
-of Magit-Popup; see *note FAQ:: for more information.
-
-
-File: transient.info, Node: Saving Values, Next: Using History, Prev: Common Suffix Commands, Up: Usage
-
-2.4 Saving Values
-=================
-
-After setting the infix arguments in a transient, the user can save
-those arguments for future invocations.
-
- Most transients will start out with the saved arguments when they are
-invoked. There are a few exceptions though. Some transients are
-designed so that the value that they use is stored externally as the
-buffer-local value of some variable. Invoking such a transient again
-uses the buffer-local value. (1)
-
- If the user does not save the value and just exits using a regular
-suffix command, then the value is merely saved to the transient’s
-history. That value won’t be used when the transient is next invoked
-but it is easily accessible (see *note Using History::).
-
-‘C-x s’ (‘transient-set’)
-
- This command saves the value of the active transient for this Emacs
- session.
-
-‘C-x C-s’ (‘transient-save’)
-
- Save the value of the active transient persistently across Emacs
- sessions.
-
- -- User Option: transient-values-file
-
- This file is used to persist the values of transients between Emacs
- sessions.
-
- ---------- Footnotes ----------
-
- (1) ‘magit-diff’ and ‘magit-log’ are two prominent examples, and
-their handling of buffer-local values is actually a bit more complicated
-than outlined above and even customizable. This is something I am
-rethinking, but I don’t want to rush any changes.)
-
-
-File: transient.info, Node: Using History, Next: Getting Help for Suffix Commands, Prev: Saving Values, Up: Usage
-
-2.5 Using History
-=================
-
-Every time the user invokes a suffix command the transient’s current
-value is saved to its history. These values can be cycled through the
-same way one can cycle through the history of commands that read
-user-input in the minibuffer.
-
-‘M-p’ (‘transient-history-prev’)
-
- This command switches to the previous value used for the active
- transient.
-
-‘M-n’ (‘transient-history-next’)
-
- This command switches to the next value used for the active
- transient.
-
- In addition to the transient-wide history, Transient of course
-supports per-infix history. When an infix reads user-input using the
-minibuffer, then the user can use the regular minibuffer history
-commands to cycle through previously used values. Usually the same keys
-as those mentioned above are bound to those commands.
-
- Authors of transients should arrange for different infix commands
-that read the same kind of value to also use the same history key (see
-*note Suffix Slots::).
-
- Both kinds of history are saved to a file when Emacs is exited.
-
- -- User Option: transient-history-file
-
- This file is used to persist the history of transients and their
- infixes between Emacs sessions.
-
- -- User Option: transient-history-limit
-
- This option controls how many history elements are kept at the time
- the history is saved in ‘transient-history-file’.
-
-
-File: transient.info, Node: Getting Help for Suffix Commands, Next: Enabling and Disabling Suffixes, Prev: Using History, Up: Usage
-
-2.6 Getting Help for Suffix Commands
-====================================
-
-Transients can have many suffixes and infixes that the user might not be
-familiar with. To make it trivial to get help for these, Transient
-provides access to the documentation directly from the active transient.
-
-‘C-h’ (‘transient-help’)
-
- This command enters help mode. When help mode is active, then
- typing ‘<key>’ shows information about the suffix command that
- ‘<key>’ normally is bound to (instead of invoking it). Pressing
- ‘C-h’ a second time shows information about the _prefix_ command.
-
- After typing ‘<key>’ the stack of transient states is suspended and
- information about the suffix command is shown instead. Typing ‘q’
- in the help buffer buries that buffer and resumes the transient
- state.
-
- What sort of documentation is shown depends on how the transient was
-defined. For infix commands that represent command-line arguments this
-ideally shows the appropriate manpage. ‘transient-help’ then tries to
-jump to the correct location within that. Info manuals are also
-supported. The fallback is to show the command’s doc string, for
-non-infix suffixes this is usually appropriate.
-
-
-File: transient.info, Node: Enabling and Disabling Suffixes, Next: Other Commands, Prev: Getting Help for Suffix Commands, Up: Usage
-
-2.7 Enabling and Disabling Suffixes
-===================================
-
-The user base of a package that uses transients can be very diverse.
-This is certainly the case for Magit; some users have been using it and
-Git for a decade, while others are just getting started now.
-
- For that reason a mechanism is needed that authors can use to
-classify a transient’s infixes and suffixes along the
-essentials...everything spectrum. We use the term "levels" to describe
-that mechanism.
-
- Each suffix command is placed on a level and each transient has a
-level (called transient-level), which controls which suffix commands are
-available. Integers between 1 and 7 (inclusive) are valid levels. For
-suffixes, 0 is also valid; it means that the suffix is not displayed at
-any level.
-
- The levels of individual transients and/or their individual suffixes
-can be changed interactively, by invoking the transient and then
-pressing ‘C-x l’ to enter the "edit" mode, see below.
-
- The default level for both transients and their suffixes is 4. The
-‘transient-default-level’ option only controls the default for
-transients. The default suffix level is always 4. The authors of
-transients should place certain suffixes on a higher level, if they
-expect that it won’t be of use to most users, and they should place very
-important suffixes on a lower level, so that they remain available even
-if the user lowers the transient level.
-
- (Magit currently places nearly all suffixes on level 4 and lower
-levels are not used at all yet. So for the time being you should not
-set a lower default level and using a higher level might not give you as
-many additional suffixes as you hoped.)
-
- -- User Option: transient-default-level
-
- This option controls which suffix levels are made available by
- default. It sets the transient-level for transients for which the
- user has not set that individually.
-
- -- User Option: transient-levels-file
-
- This file is used to persist the levels of transients and their
- suffixes between Emacs sessions.
-
-‘C-x l’ (‘transient-set-level’)
-
- This command enters edit mode. When edit mode is active, then all
- infixes and suffixes that are currently usable are displayed along
- with their levels. The colors of the levels indicate whether they
- are enabled or not. The level of the transient is also displayed
- along with some usage information.
-
- In edit mode, pressing the key that would usually invoke a certain
- suffix instead prompts the user for the level that suffix should be
- placed on.
-
- Help mode is available in edit mode.
-
- To change the transient level press ‘C-x l’ again.
-
- To exit edit mode press ‘C-g’.
-
- Note that edit mode does not display any suffixes that are not
- currently usable. ‘magit-rebase’ for example shows different
- suffixes depending on whether a rebase is already in progress or
- not. The predicates also apply in edit mode.
-
- Therefore, to control which suffixes are available given a certain
- state, you have to make sure that that state is currently active.
-
-
-File: transient.info, Node: Other Commands, Prev: Enabling and Disabling Suffixes, Up: Usage
-
-2.8 Other Commands
-==================
-
-When invoking a transient in a small frame, the transient window may not
-show the complete buffer, making it necessary to scroll, using the
-following commands. These commands are never shown in the transient
-window, and the key bindings are the same as for ‘scroll-up-command’ and
-‘scroll-down-command’ in other buffers.
-
- -- Command: transient-scroll-up arg
-
- This command scrolls text of transient popup window upward ARG
- lines. If ARG is ‘nil’, then it scrolls near full screen. This is
- a wrapper around ‘scroll-up-command’ (which see).
-
- -- Command: transient-scroll-down arg
-
- This command scrolls text of transient popup window down ARG lines.
- If ARG is ‘nil’, then it scrolls near full screen. This is a
- wrapper around ‘scroll-down-command’ (which see).
-
-
-File: transient.info, Node: Other Options, Next: Modifying Existing Transients, Prev: Usage, Up: Top
-
-3 Other Options
-***************
-
- -- User Option: transient-show-popup
-
- This option controls whether the current transient’s infix and
- suffix commands are shown in the popup buffer.
-
- • If ‘t’ (the default) then the popup buffer is shown as soon as
- a transient prefix command is invoked.
-
- • If ‘nil’, then the popup buffer is not shown unless the user
- explicitly requests it, by pressing an incomplete prefix key
- sequence.
-
- • If a number, then the a brief one-line summary is shown
- instead of the popup buffer. If zero or negative, then not
- even that summary is shown; only the pressed key itself is
- shown.
-
- The popup is shown when the user explicitly requests it by
- pressing an incomplete prefix key sequence. Unless this is
- zero, then the popup is shown after that many seconds of
- inactivity (using the absolute value).
-
- -- User Option: transient-enable-popup-navigation
-
- This option controls whether navigation commands are enabled in the
- transient popup.
-
- While a transient is active the transient popup buffer is not the
- current buffer, making it necessary to use dedicated commands to
- act on that buffer itself. This is disabled by default. If this
- option is non-nil, then the following features are available:
-
- • ‘<up>’ moves the cursor to the previous suffix. ‘<down>’
- moves the cursor to the next suffix. ‘RET’ invokes the suffix
- the cursor is on.
-
- • ‘<mouse-1>’ invokes the clicked on suffix.
-
- • ‘C-s’ and ‘C-r’ start isearch in the popup buffer.
-
- -- User Option: transient-display-buffer-action
-
- This option specifies the action used to display the transient
- popup buffer. The transient popup buffer is displayed in a window
- using ‘(display-buffer buf transient-display-buffer-action)’.
-
- The value of this option has the form ‘(FUNCTION . ALIST)’, where
- FUNCTION is a function or a list of functions. Each such function
- should accept two arguments: a buffer to display and an alist of
- the same form as ALIST. See *note (elisp)Choosing Window::.
-
- The default is ‘(display-buffer-in-side-window (side . bottom))’.
- This displays the window at the bottom of the selected frame.
- Another useful value is ‘(display-buffer-below-selected)’. This is
- what ‘magit-popup’ used by default. For more alternatives see
- *note (elisp)Display Action Functions::.
-
- It may be possible to display the window in another frame, but
- whether that works in practice depends on the window-manager. If
- the window manager selects the new window (Emacs frame), then it
- doesn’t work.
-
- If you change the value of this option, then you might also want to
- change the value of ‘transient-mode-line-format’.
-
- -- User Option: transient-mode-line-format
-
- This option controls whether the transient popup buffer has a
- mode-line, separator line, or neither.
-
- If ‘nil’, then the buffer has no mode-line. If the buffer is not
- displayed right above the echo area, then this probably is not a
- good value.
-
- If ‘line’ (the default), then the buffer also has no mode-line, but
- a thin line is drawn instead, using the background color of the
- face ‘transient-separator’. Termcap frames cannot display thin
- lines and therefore fallback to treating ‘line’ like ‘nil’.
-
- Otherwise this can be any mode-line format. See *note (elisp)Mode
- Line Format:: for details.
-
- -- User Option: transient-read-with-initial-input
-
- This option controls whether the last history element is used as
- the initial minibuffer input when reading the value of an infix
- argument from the user. If ‘nil’, then there is no initial input
- and the first element has to be accessed the same way as the older
- elements.
-
- -- User Option: transient-highlight-mismatched-keys
-
- This option controls whether key bindings of infix commands that do
- not match the respective command-line argument should be
- highlighted. For other infix commands this option has no effect.
-
- When this option is non-nil, then the key binding for an infix
- argument is highlighted when only a long argument (e.g.
- ‘--verbose’) is specified but no shorthand (e.g ‘-v’). In the rare
- case that a shorthand is specified but the key binding does not
- match, then it is highlighted differently.
-
- Highlighting mismatched key bindings is useful when learning the
- arguments of the underlying command-line tool; you wouldn’t want to
- learn any short-hands that do not actually exist.
-
- The highlighting is done using one of the faces
- ‘transient-mismatched-key’ and ‘transient-nonstandard-key’.
-
- -- User Option: transient-substitute-key-function
-
- This function is used to modify key bindings. If the value of this
- option is nil (the default), then no substitution is performed.
-
- This function is called with one argument, the prefix object, and
- must return a key binding description, either the existing key
- description it finds in the ‘key’ slot, or the key description that
- replaces the prefix key. It could be used to make other
- substitutions, but that is discouraged.
-
- For example, ‘=’ is hard to reach using my custom keyboard layout,
- so I substitute ‘(’ for that, which is easy to reach using a layout
- optimized for lisp.
-
- (setq transient-substitute-key-function
- (lambda (obj)
- (let ((key (oref obj key)))
- (if (string-match "\\`\\(=\\)[a-zA-Z]" key)
- (replace-match "(" t t key 1)
- key))))
-
- -- User Option: transient-detect-key-conflicts
-
- This option controls whether key binding conflicts should be
- detected at the time the transient is invoked. If so, then this
- results in an error, which prevents the transient from being used.
- Because of that, conflicts are ignored by default.
-
- Conflicts cannot be determined earlier, i.e. when the transient is
- being defined and when new suffixes are being added, because at
- that time there can be false-positives. It is actually valid for
- multiple suffixes to share a common key binding, provided the
- predicates of those suffixes prevent that more than one of them is
- enabled at a time.
-
- -- User Option: transient-force-fixed-pitch
-
- This option controls whether to force the use of a monospaced font
- in popup buffer. Even if you use a proportional font for the
- ‘default’ face, you might still want to use a monospaced font in
- transient’s popup buffer. Setting this option to t causes
- ‘default’ to be remapped to ‘fixed-pitch’ in that buffer.
-
-
-File: transient.info, Node: Modifying Existing Transients, Next: Defining New Commands, Prev: Other Options, Up: Top
-
-4 Modifying Existing Transients
-*******************************
-
-To an extent transients can be customized interactively, see *note
-Enabling and Disabling Suffixes::. This section explains how existing
-transients can be further modified non-interactively.
-
- The following functions share a few arguments:
-
- • PREFIX is a transient prefix command, a symbol.
-
- • SUFFIX is a transient infix or suffix specification in the same
- form as expected by ‘transient-define-prefix’. Note that an infix
- is a special kind of suffix. Depending on context "suffixes" means
- "suffixes (including infixes)" or "non-infix suffixes". Here it
- means the former. See *note Suffix Specifications::.
-
- SUFFIX may also be a group in the same form as expected by
- ‘transient-define-prefix’. See *note Group Specifications::.
-
- • LOC is a command, a key vector, a key description (a string as
- returned by ‘key-description’), or a list specifying coordinates
- (the last element may also be a command or key). For example ‘(1 0
- -1)’ identifies the last suffix (‘-1’) of the first subgroup (‘0’)
- of the second group (‘1’).
-
- If LOC is a list of coordinates, then it can be used to identify a
- group, not just an individual suffix command.
-
- The function ‘transient-get-suffix’ can be useful to determine
- whether a certain coordination list identifies the suffix or group
- that you expect it to identify. In hairy cases it may be necessary
- to look at the definition of the transient prefix command.
-
- These functions operate on the information stored in the
-‘transient--layout’ property of the PREFIX symbol. Suffix entries in
-that tree are not objects but have the form ‘(LEVEL CLASS PLIST)’, where
-plist should set at least ‘:key’, ‘:description’ and ‘:command’.
-
- -- Function: transient-insert-suffix prefix loc suffix
-
- This function inserts suffix or group SUFFIX into PREFIX before
- LOC.
-
- -- Function: transient-append-suffix prefix loc suffix
-
- This function inserts suffix or group SUFFIX into PREFIX after LOC.
-
- -- Function: transient-replace-suffix prefix loc suffix
-
- This function replaces the suffix or group at LOC in PREFIX with
- suffix or group SUFFIX.
-
- -- Function: transient-remove-suffix prefix loc
-
- This function removes the suffix or group at LOC in PREFIX.
-
- -- Function: transient-get-suffix prefix loc
-
- This function returns the suffix or group at LOC in PREFIX. The
- returned value has the form mentioned above.
-
- -- Function: transient-suffix-put prefix loc prop value
-
- This function edits the suffix or group at LOC in PREFIX, by
- setting the PROP of its plist to VALUE.
-
- Most of these functions do not signal an error if they cannot perform
-the requested modification. The functions that insert new suffixes show
-a warning if LOC cannot be found in PREFIX, without signaling an error.
-The reason for doing it like this is that establishing a key binding
-(and that is what we essentially are trying to do here) should not
-prevent the rest of the configuration from loading. Among these
-functions only ‘transient-get-suffix’ and ‘transient-suffix-put’ may
-signal an error.
-
-
-File: transient.info, Node: Defining New Commands, Next: Classes and Methods, Prev: Modifying Existing Transients, Up: Top
-
-5 Defining New Commands
-***********************
-
-* Menu:
-
-* Defining Transients::
-* Binding Suffix and Infix Commands::
-* Defining Suffix and Infix Commands::
-* Using Infix Arguments::
-* Transient State::
-
-
-File: transient.info, Node: Defining Transients, Next: Binding Suffix and Infix Commands, Up: Defining New Commands
-
-5.1 Defining Transients
-=======================
-
-A transient consists of a prefix command and at least one suffix
-command, though usually a transient has several infix and suffix
-commands. The below macro defines the transient prefix command *and*
-binds the transient’s infix and suffix commands. In other words, it
-defines the complete transient, not just the transient prefix command
-that is used to invoke that transient.
-
- -- Macro: transient-define-prefix name arglist [docstring] [keyword
- value]... group... [body...]
-
- This macro defines NAME as a transient prefix command and binds the
- transient’s infix and suffix commands.
-
- ARGLIST are the arguments that the prefix command takes. DOCSTRING
- is the documentation string and is optional.
-
- These arguments can optionally be followed by keyword-value pairs.
- Each key has to be a keyword symbol, either ‘:class’ or a keyword
- argument supported by the constructor of that class. The
- ‘transient-prefix’ class is used if the class is not specified
- explicitly.
-
- GROUPs add key bindings for infix and suffix commands and specify
- how these bindings are presented in the popup buffer. At least one
- GROUP has to be specified. See *note Binding Suffix and Infix
- Commands::.
-
- The BODY is optional. If it is omitted, then ARGLIST is ignored
- and the function definition becomes:
-
- (lambda ()
- (interactive)
- (transient-setup 'NAME))
-
- If BODY is specified, then it must begin with an ‘interactive’ form
- that matches ARGLIST, and it must call ‘transient-setup’. It may
- however call that function only when some condition is satisfied.
-
- All transients have a (possibly ‘nil’) value, which is exported
- when suffix commands are called, so that they can consume that
- value. For some transients it might be necessary to have a sort of
- secondary value, called a "scope". Such a scope would usually be
- set in the command’s ‘interactive’ form and has to be passed to the
- setup function:
-
- (transient-setup 'NAME nil nil :scope SCOPE)
-
- For example, the scope of the ‘magit-branch-configure’ transient is
- the branch whose variables are being configured.
-
-
-File: transient.info, Node: Binding Suffix and Infix Commands, Next: Defining Suffix and Infix Commands, Prev: Defining Transients, Up: Defining New Commands
-
-5.2 Binding Suffix and Infix Commands
-=====================================
-
-The macro ‘transient-define-prefix’ is used to define a transient. This
-defines the actual transient prefix command (see *note Defining
-Transients::) and adds the transient’s infix and suffix bindings, as
-described below.
-
- Users and third-party packages can add additional bindings using
-functions such as ‘transient-insert-suffix’ (See *note Modifying
-Existing Transients::). These functions take a "suffix specification"
-as one of their arguments, which has the same form as the specifications
-used in ‘transient-define-prefix’.
-
-* Menu:
-
-* Group Specifications::
-* Suffix Specifications::
-
-
-File: transient.info, Node: Group Specifications, Next: Suffix Specifications, Up: Binding Suffix and Infix Commands
-
-5.2.1 Group Specifications
---------------------------
-
-The suffix and infix commands of a transient are organized in groups.
-The grouping controls how the descriptions of the suffixes are outlined
-visually but also makes it possible to set certain properties for a set
-of suffixes.
-
- Several group classes exist, some of which organize suffixes in
-subgroups. In most cases the class does not have to be specified
-explicitly, but see *note Group Classes::.
-
- Groups are specified in the call to ‘transient-define-prefix’, using
-vectors. Because groups are represented using vectors, we cannot use
-square brackets to indicate an optional element and instead use curly
-brackets to do the latter.
-
- Group specifications then have this form:
-
- [{LEVEL} {DESCRIPTION} {KEYWORD VALUE}... ELEMENT...]
-
- The LEVEL is optional and defaults to 4. See *note Enabling and
-Disabling Suffixes::.
-
- The DESCRIPTION is optional. If present it is used as the heading of
-the group.
-
- The KEYWORD-VALUE pairs are optional. Each keyword has to be a
-keyword symbol, either ‘:class’ or a keyword argument supported by the
-constructor of that class.
-
- • One of these keywords, ‘:description’, is equivalent to specifying
- DESCRIPTION at the very beginning of the vector. The
- recommendation is to use ‘:description’ if some other keyword is
- also used, for consistency, or DESCRIPTION otherwise, because it
- looks better.
-
- • Likewise ‘:level’ is equivalent to LEVEL.
-
- • Other important keywords include the ‘:if...’ keywords. These
- keywords control whether the group is available in a certain
- situation.
-
- For example, one group of the ‘magit-rebase’ transient uses ‘:if
- magit-rebase-in-progress-p’, which contains the suffixes that are
- useful while rebase is already in progress; and another that uses
- ‘:if-not magit-rebase-in-progress-p’, which contains the suffixes
- that initiate a rebase.
-
- These predicates can also be used on individual suffixes and are
- only documented once, see *note Predicate Slots::.
-
- • Finally the value of ‘:hide’, if non-nil, is a predicate that
- controls whether the group is hidden by default. The key bindings
- for suffixes of a hidden group should all use the same prefix key.
- Pressing that prefix key should temporarily show the group and its
- suffixes, which assumes that a predicate like this is used:
-
- (lambda ()
- (eq (car transient--redisplay-key)
- ?\C-c)) ; the prefix key shared by all bindings
-
- The ELEMENTs are either all subgroups (vectors), or all suffixes
-(lists) and strings. (At least currently no group type exists that
-would allow mixing subgroups with commands at the same level, though in
-principle there is nothing that prevents that.)
-
- If the ELEMENTs are not subgroups, then they can be a mixture of
-lists that specify commands and strings. Strings are inserted verbatim.
-The empty string can be used to insert gaps between suffixes, which is
-particularly useful if the suffixes are outlined as a table.
-
- The form of suffix specifications is documented in the next node.
-
-
-File: transient.info, Node: Suffix Specifications, Prev: Group Specifications, Up: Binding Suffix and Infix Commands
-
-5.2.2 Suffix Specifications
----------------------------
-
-A transient’s suffix and infix commands are bound when the transient
-prefix command is defined using ‘transient-define-prefix’, see *note
-Defining Transients::. The commands are organized into groups, see
-*note Group Specifications::. Here we describe the form used to bind an
-individual suffix command.
-
- The same form is also used when later binding additional commands
-using functions such as ‘transient-insert-suffix’, see *note Modifying
-Existing Transients::.
-
- Note that an infix is a special kind of suffix. Depending on context
-"suffixes" means "suffixes (including infixes)" or "non-infix suffixes".
-Here it means the former.
-
- Suffix specifications have this form:
-
- ([LEVEL] [KEY] [DESCRIPTION] COMMAND|ARGUMENT [KEYWORD VALUE]...)
-
- LEVEL, KEY and DESCRIPTION can also be specified using the KEYWORDs
-‘:level’, ‘:key’ and ‘:description’. If the object that is associated
-with COMMAND sets these properties, then they do not have to be
-specified here. You can however specify them here anyway, possibly
-overriding the object’s values just for the binding inside this
-transient.
-
- • LEVEL is the suffix level, an integer between 1 and 7. See *note
- Enabling and Disabling Suffixes::.
-
- • KEY is the key binding, either a vector or key description string.
-
- • DESCRIPTION is the description, either a string or a function that
- returns a string. The function should be a lambda expression to
- avoid ambiguity. In some cases a symbol that is bound as a
- function would also work but to be safe you should use
- ‘:description’ in that case.
-
- The next element is either a command or an argument. This is the
-only argument that is mandatory in all cases.
-
- • COMMAND is a symbol that is bound as a function, which has to be a
- command. Any command will do; it does not need to have an object
- associated with it (as would be the case if
- ‘transient-define-suffix’ or ‘transient-define-infix’ were used to
- define it).
-
- As mentioned above, the object that is associated with a command
- can be used to set the default for certain values that otherwise
- have to be set in the suffix specification. Therefore if there is
- no object, then you have to make sure to specify the KEY and the
- DESCRIPTION.
-
- • The mandatory argument can also be a command-line argument, a
- string. In that case an anonymous command is defined and bound.
-
- Instead of a string, this can also be a list of two strings, in
- which case the first string is used as the short argument (which
- can also be specified using ‘:shortarg’) and the second as the long
- argument (which can also be specified using ‘:argument’).
-
- Only the long argument is displayed in the popup buffer. See
- ‘transient-detect-key-conflicts’ for how the short argument may be
- used.
-
- Unless the class is specified explicitly, the appropriate class is
- guessed based on the long argument. If the argument ends with "=​"
- (e.g. "–format=") then ‘transient-option’ is used, otherwise
- ‘transient-switch’.
-
- Finally, details can be specified using optional KEYWORD-VALUE pairs.
-Each keyword has to be a keyword symbol, either ‘:class’ or a keyword
-argument supported by the constructor of that class. See *note Suffix
-Slots::.
-
-
-File: transient.info, Node: Defining Suffix and Infix Commands, Next: Using Infix Arguments, Prev: Binding Suffix and Infix Commands, Up: Defining New Commands
-
-5.3 Defining Suffix and Infix Commands
-======================================
-
-Note that an infix is a special kind of suffix. Depending on context
-"suffixes" means "suffixes (including infixes)" or "non-infix suffixes".
-
- -- Macro: transient-define-suffix name arglist [docstring] [keyword
- value]... body...
-
- This macro defines NAME as a transient suffix command.
-
- ARGLIST are the arguments that the command takes. DOCSTRING is the
- documentation string and is optional.
-
- These arguments can optionally be followed by keyword-value pairs.
- Each keyword has to be a keyword symbol, either ‘:class’ or a
- keyword argument supported by the constructor of that class. The
- ‘transient-suffix’ class is used if the class is not specified
- explicitly.
-
- The BODY must begin with an ‘interactive’ form that matches
- ARGLIST. The infix arguments are usually accessed by using
- ‘transient-args’ inside ‘interactive’.
-
- -- Macro: transient-define-infix name arglist [docstring] [keyword
- value]...
-
- This macro defines NAME as a transient infix command.
-
- ARGLIST is always ignored (but mandatory never-the-less) and
- reserved for future use. DOCSTRING is the documentation string and
- is optional.
-
- The keyword-value pairs are mandatory. All transient infix
- commands are ‘equal’ to each other (but not ‘eq’), so it is
- meaningless to define an infix command without also setting at
- least ‘:class’ and one other keyword (which it is depends on the
- used class, usually ‘:argument’ or ‘:variable’).
-
- Each keyword has to be a keyword symbol, either ‘:class’ or a
- keyword argument supported by the constructor of that class. The
- ‘transient-switch’ class is used if the class is not specified
- explicitly.
-
- The function definition is always:
-
- (lambda ()
- (interactive)
- (let ((obj (transient-suffix-object)))
- (transient-infix-set obj (transient-infix-read obj)))
- (transient--show))
-
- ‘transient-infix-read’ and ‘transient-infix-set’ are generic
- functions. Different infix commands behave differently because the
- concrete methods are different for different infix command classes.
- In rare cases the above command function might not be suitable,
- even if you define your own infix command class. In that case you
- have to use ‘transient-suffix-command’ to define the infix command
- and use ‘t’ as the value of the ‘:transient’ keyword.
-
- -- Macro: transient-define-argument name arglist [docstring] [keyword
- value]...
-
- This macro defines NAME as a transient infix command.
-
- This is an alias for ‘transient-define-infix’. Only use this alias
- to define an infix command that actually sets an infix argument.
- To define an infix command that, for example, sets a variable, use
- ‘transient-define-infix’ instead.
-
-
-File: transient.info, Node: Using Infix Arguments, Next: Transient State, Prev: Defining Suffix and Infix Commands, Up: Defining New Commands
-
-5.4 Using Infix Arguments
-=========================
-
-The function and the variables described below allow suffix commands to
-access the value of the transient from which they were invoked; which is
-the value of its infix arguments. These variables are set when the user
-invokes a suffix command that exits the transient, but before actually
-calling the command.
-
- When returning to the command-loop after calling the suffix command,
-the arguments are reset to ‘nil’ (which causes the function to return
-‘nil’ too).
-
- Like for Emacs’ prefix arguments it is advisable, but not mandatory,
-to access the infix arguments inside the command’s ‘interactive’ form.
-The preferred way of doing that is to call the ‘transient-args’
-function, which for infix arguments serves about the same purpose as
-‘prefix-arg’ serves for prefix arguments.
-
- -- Function: transient-args &optional prefix
-
- This function returns the value of the transient prefix command
- PREFIX.
-
- If the current command was invoked from the transient prefix
- command PREFIX, then it returns the active infix arguments. If the
- current command was not invoked from PREFIX, then it returns the
- set, saved or default value for PREFIX.
-
- -- Variable: transient-current-suffixes
-
- The suffixes of the transient from which this suffix command was
- invoked. This is a list of objects. Usually it is sufficient to
- instead use the function ‘transient-args’, which returns a list of
- values. In complex cases it might be necessary to use this
- variable instead, i.e. if you need access to information beside
- the value.
-
- -- Variable: transient-current-prefix
-
- The transient from which this suffix command was invoked. The
- returned value is a ‘transient-prefix’ object, which holds
- information associated with the transient prefix command.
-
- -- Variable: transient-current-command
-
- The transient from which this suffix command was invoked. The
- returned value is a symbol, the transient prefix command.
-
-
-File: transient.info, Node: Transient State, Prev: Using Infix Arguments, Up: Defining New Commands
-
-5.5 Transient State
-===================
-
-Invoking a transient prefix command "activates" the respective
-transient, i.e. it puts a transient keymap into effect, which binds the
-transient’s infix and suffix commands.
-
- The default behavior while a transient is active is as follows:
-
- • Invoking an infix command does not affect the transient state; the
- transient remains active.
-
- • Invoking a (non-infix) suffix command "deactivates" the transient
- state by removing the transient keymap and performing some
- additional cleanup.
-
- • Invoking a command that is bound in a keymap other than the
- transient keymap is disallowed and trying to do so results in a
- warning. This does not "deactivate" the transient.
-
- But these are just the defaults. Whether a certain command
-deactivates or "exits" the transient is configurable. There is more
-than one way in which a command can be "transient" or "non-transient";
-the exact behavior is implemented by calling a so-called "pre-command"
-function. Whether non-suffix commands are allowed to be called is
-configurable per transient.
-
- • The transient-ness of suffix commands (including infix commands) is
- controlled by the value of their ‘transient’ slot, which can be set
- either when defining the command or when adding a binding to a
- transient while defining the respective transient prefix command.
-
- Valid values are booleans and the pre-commands described below.
-
- • ‘t’ is equivalent to ‘transient--do-stay’.
-
- • ‘nil’ is equivalent to ‘transient--do-exit’.
-
- • If ‘transient’ is unbound (and that is actually the default
- for non-infix suffixes) then the value of the prefix’s
- ‘transient-suffix’ slot is used instead. The default value of
- that slot is ‘nil’, so the suffix’s ‘transient’ slot being
- unbound is essentially equivalent to it being ‘nil’.
-
- • A suffix command can be a prefix command itself, i.e. a
- "sub-prefix". While a sub-prefix is active we nearly always want
- ‘C-g’ to take the user back to the "super-prefix". However in rare
- cases this may not be desirable, and that makes the following
- complication necessary:
-
- For ‘transient-suffix’ objects the ‘transient’ slot is unbound. We
- can ignore that for the most part because, as stated above, ‘nil’
- and the slot being unbound are equivalent, and mean "do exit".
- That isn’t actually true for suffixes that are sub-prefixes though.
- For such suffixes unbound means "do exit but allow going back",
- which is the default, while ‘nil’ means "do exit permanently",
- which requires that slot to be explicitly set to that value.
-
- • The transient-ness of certain built-in suffix commands is specified
- using ‘transient-predicate-map’. This is a special keymap, which
- binds commands to pre-commands (as opposed to keys to commands) and
- takes precedence over the ‘transient’ slot.
-
- The available pre-command functions are documented below. They are
-called by ‘transient--pre-command’, a function on ‘pre-command-hook’ and
-the value that they return determines whether the transient is exited.
-To do so the value of one of the constants ‘transient--exit’ or
-‘transient--stay’ is used (that way we don’t have to remember if ‘t’
-means "exit" or "stay").
-
- Additionally these functions may change the value of ‘this-command’
-(which explains why they have to be called using ‘pre-command-hook’),
-call ‘transient-export’, ‘transient--stack-zap’ or
-‘transient--stack-push’; and set the values of ‘transient--exitp’,
-‘transient--helpp’ or ‘transient--editp’.
-
-5.5.1 Pre-commands for Infixes
-------------------------------
-
-The default for infixes is ‘transient--do-stay’. This is also the only
-function that makes sense for infixes.
-
- -- Function: transient--do-stay
-
- Call the command without exporting variables and stay transient.
-
-5.5.2 Pre-commands for Suffixes
--------------------------------
-
-The default for suffixes is ‘transient--do-exit’.
-
- -- Function: transient--do-exit
-
- Call the command after exporting variables and exit the transient.
-
- -- Function: transient--do-call
-
- Call the command after exporting variables and stay transient.
-
- -- Function: transient--do-replace
-
- Call the transient prefix command, replacing the active transient.
-
- This is used for suffixes that are prefixes themselves, i.e. for
- sub-prefixes.
-
-5.5.3 Pre-commands for Non-Suffixes
------------------------------------
-
-The default for non-suffixes, i.e commands that are bound in other
-keymaps beside the transient keymap, is ‘transient--do-warn’. Silently
-ignoring the user-error is also an option, though probably not a good
-one.
-
- If you want to let the user invoke non-suffix commands, then use
-‘transient--do-stay’ as the value of the prefix’s ‘transient-non-suffix’
-slot.
-
- -- Function: transient--do-warn
-
- Call ‘transient-undefined’ and stay transient.
-
- -- Function: transient--do-noop
-
- Call ‘transient-noop’ and stay transient.
-
-5.5.4 Special Pre-Commands
---------------------------
-
- -- Function: transient--do-quit-one
-
- If active, quit help or edit mode, else exit the active transient.
-
- This is used when the user pressed ‘C-g’.
-
- -- Function: transient--do-quit-all
-
- Exit all transients without saving the transient stack.
-
- This is used when the user pressed ‘C-q’.
-
- -- Function: transient--do-suspend
-
- Suspend the active transient, saving the transient stack.
-
- This is used when the user pressed ‘C-z’.
-
-
-File: transient.info, Node: Classes and Methods, Next: Related Abstractions and Packages, Prev: Defining New Commands, Up: Top
-
-6 Classes and Methods
-*********************
-
-Transient uses classes and generic functions to make it possible to
-define new types of suffix commands that are similar to existing types,
-but behave differently in some aspects. It does the same for groups and
-prefix commands, though at least for prefix commands that *currently*
-appears to be less important.
-
- Every prefix, infix and suffix command is associated with an object,
-which holds information that controls certain aspects of its behavior.
-This happens in two ways.
-
- • Associating a command with a certain class gives the command a
- type. This makes it possible to use generic functions to do
- certain things that have to be done differently depending on what
- type of command it acts on.
-
- That in turn makes it possible for third-parties to add new types
- without having to convince the maintainer of Transient that that
- new type is important enough to justify adding a special case to a
- dozen or so functions.
-
- • Associating a command with an object makes it possible to easily
- store information that is specific to that particular command.
-
- Two commands may have the same type, but obviously their key
- bindings and descriptions still have to be different, for example.
-
- The values of some slots are functions. The ‘reader’ slot for
- example holds a function that is used to read a new value for an
- infix command. The values of such slots are regular functions.
-
- Generic functions are used when a function should do something
- different based on the type of the command, i.e. when all commands
- of a certain type should behave the same way but different from the
- behavior for other types. Object slots that hold a regular
- function as value are used when the task that they perform is
- likely to differ even between different commands of the same type.
-
-* Menu:
-
-* Group Classes::
-* Group Methods::
-* Prefix Classes::
-* Suffix Classes::
-* Suffix Methods::
-* Prefix Slots::
-* Suffix Slots::
-* Predicate Slots::
-
-
-File: transient.info, Node: Group Classes, Next: Group Methods, Up: Classes and Methods
-
-6.1 Group Classes
-=================
-
-The type of a group can be specified using the ‘:class’ property at the
-beginning of the class specification, e.g. ‘[:class transient-columns
-...]’ in a call to ‘transient-define-prefix’.
-
- • The abstract ‘transient-child’ class is the base class of both
- ‘transient-group’ (and therefore all groups) as well as of
- ‘transient-suffix’ (and therefore all suffix and infix commands).
-
- This class exists because the elements (aka "children") of certain
- groups can be other groups instead of suffix and infix commands.
-
- • The abstract ‘transient-group’ class is the superclass of all other
- group classes.
-
- • The ‘transient-column’ class is the simplest group.
-
- This is the default "flat" group. If the class is not specified
- explicitly and the first element is not a vector (i.e. not a
- group), then this class is used.
-
- This class displays each element on a separate line.
-
- • The ‘transient-row’ class displays all elements on a single line.
-
- • The ‘transient-columns’ class displays commands organized in
- columns.
-
- Direct elements have to be groups whose elements have to be
- commands or strings. Each subgroup represents a column. This
- class takes care of inserting the subgroups’ elements.
-
- This is the default "nested" group. If the class is not specified
- explicitly and the first element is a vector (i.e. a group), then
- this class is used.
-
- • The ‘transient-subgroups’ class wraps other groups.
-
- Direct elements have to be groups whose elements have to be
- commands or strings. This group inserts an empty line between
- subgroups. The subgroups themselves are responsible for displaying
- their elements.
-
-
-File: transient.info, Node: Group Methods, Next: Prefix Classes, Prev: Group Classes, Up: Classes and Methods
-
-6.2 Group Methods
-=================
-
- -- Function: transient--insert-group group
-
- This generic function formats the group and its elements and
- inserts the result into the current buffer, which is a temporary
- buffer. The contents of that buffer are later inserted into the
- popup buffer.
-
- Functions that are called by this function may need to operate in
- the buffer from which the transient was called. To do so they can
- temporarily make the ‘transient--source-buffer’ the current buffer.
-
-
-File: transient.info, Node: Prefix Classes, Next: Suffix Classes, Prev: Group Methods, Up: Classes and Methods
-
-6.3 Prefix Classes
-==================
-
-Currently the ‘transient-prefix’ class is being used for all prefix
-commands and there is only a single generic function that can be
-specialized based on the class of a prefix command.
-
- -- Function: transient--history-init obj
-
- This generic function is called while setting up the transient and
- is responsible for initializing the ‘history’ slot. This is the
- transient-wide history; many individual infixes also have a history
- of their own.
-
- The default (and currently only) method extracts the value from the
- global variable ‘transient-history’.
-
- A transient prefix command’s object is stored in the
-‘transient--prefix’ property of the command symbol. While a transient
-is active, a clone of that object is stored in the variable
-‘transient--prefix’. A clone is used because some changes that are made
-to the active transient’s object should not affect later invocations.
-
-
-File: transient.info, Node: Suffix Classes, Next: Suffix Methods, Prev: Prefix Classes, Up: Classes and Methods
-
-6.4 Suffix Classes
-==================
-
- • All suffix and infix classes derive from ‘transient-suffix’, which
- in turn derives from ‘transient-child’, from which
- ‘transient-group’ also derives (see *note Group Classes::).
-
- • All infix classes derive from the abstract ‘transient-infix’ class,
- which in turn derives from the ‘transient-suffix’ class.
-
- Infixes are a special type of suffixes. The primary difference is
- that infixes always use the ‘transient--do-stay’ pre-command, while
- non-infix suffixes use a variety of pre-commands (see *note
- Transient State::). Doing that is most easily achieved by using
- this class, though theoretically it would be possible to define an
- infix class that does not do so. If you do that then you get to
- implement many methods.
-
- Also, infixes and non-infix suffixes are usually defined using
- different macros (see *note Defining Suffix and Infix Commands::).
-
- • Classes used for infix commands that represent arguments should be
- derived from the abstract ‘transient-argument’ class.
-
- • The ‘transient-switch’ class (or a derived class) is used for infix
- arguments that represent command-line switches (arguments that do
- not take a value).
-
- • The ‘transient-option’ class (or a derived class) is used for infix
- arguments that represent command-line options (arguments that do
- take a value).
-
- • The ‘transient-switches’ class can be used for a set of mutually
- exclusive command-line switches.
-
- • The ‘transient-files’ class can be used for a "–" argument that
- indicates that all remaining arguments are files.
-
- • Classes used for infix commands that represent variables should
- derived from the abstract ‘transient-variables’ class.
-
- Magit defines additional classes, which can serve as examples for the
-fancy things you can do without modifying Transient. Some of these
-classes will likely get generalized and added to Transient. For now
-they are very much subject to change and not documented.
-
-
-File: transient.info, Node: Suffix Methods, Next: Prefix Slots, Prev: Suffix Classes, Up: Classes and Methods
-
-6.5 Suffix Methods
-==================
-
-To get information about the methods implementing these generic
-functions use ‘describe-function’.
-
-* Menu:
-
-* Suffix Value Methods::
-* Suffix Format Methods::
-
-
-File: transient.info, Node: Suffix Value Methods, Next: Suffix Format Methods, Up: Suffix Methods
-
-6.5.1 Suffix Value Methods
---------------------------
-
- -- Function: transient-init-value obj
-
- This generic function sets the initial value of the object OBJ.
-
- This function is called for all suffix commands, but unless a
- concrete method is implemented this falls through to the default
- implementation, which is a noop. In other words this usually only
- does something for infix commands, but note that this is not
- implemented for the abstract class ‘transient-infix’, so if your
- class derives from that directly, then you must implement a method.
-
- -- Function: transient-infix-read obj
-
- This generic function determines the new value of the infix object
- OBJ.
-
- This function merely determines the value; ‘transient-infix-set’ is
- used to actually store the new value in the object.
-
- For most infix classes this is done by reading a value from the
- user using the reader specified by the ‘reader’ slot (using the
- ‘transient-infix-value’ method described below).
-
- For some infix classes the value is changed without reading
- anything in the minibuffer, i.e. the mere act of invoking the
- infix command determines what the new value should be, based on the
- previous value.
-
- -- Function: transient-prompt obj
-
- This generic function returns the prompt to be used to read infix
- object OBJ’s value.
-
- -- Function: transient-infix-set obj value
-
- This generic function sets the value of infix object OBJ to VALUE.
-
- -- Function: transient-infix-value obj
-
- This generic function returns the value of the suffix object OBJ.
-
- This function is called by ‘transient-args’ (which see), meaning
- this function is how the value of a transient is determined so that
- the invoked suffix command can use it.
-
- Currently most values are strings, but that is not set in stone.
- ‘nil’ is not a value, it means "no value".
-
- Usually only infixes have a value, but see the method for
- ‘transient-suffix’.
-
- -- Function: transient-init-scope obj
-
- This generic function sets the scope of the suffix object OBJ.
-
- The scope is actually a property of the transient prefix, not of
- individual suffixes. However it is possible to invoke a suffix
- command directly instead of from a transient. In that case, if the
- suffix expects a scope, then it has to determine that itself and
- store it in its ‘scope’ slot.
-
- This function is called for all suffix commands, but unless a
- concrete method is implemented this falls through to the default
- implementation, which is a noop.
-
-
-File: transient.info, Node: Suffix Format Methods, Prev: Suffix Value Methods, Up: Suffix Methods
-
-6.5.2 Suffix Format Methods
----------------------------
-
- -- Function: transient-format obj
-
- This generic function formats and returns OBJ for display.
-
- When this function is called, then the current buffer is some
- temporary buffer. If you need the buffer from which the prefix
- command was invoked to be current, then do so by temporarily making
- ‘transient--source-buffer’ current.
-
- -- Function: transient-format-key obj
-
- This generic function formats OBJ’s ‘key’ for display and returns
- the result.
-
- -- Function: transient-format-description obj
-
- This generic function formats OBJ’s ‘description’ for display and
- returns the result.
-
- -- Function: transient-format-value obj
-
- This generic function formats OBJ’s value for display and returns
- the result.
-
- -- Function: transient-show-help obj
-
- Show help for the prefix, infix or suffix command represented by
- OBJ.
-
- For prefixes, show the info manual, if that is specified using the
- ‘info-manual’ slot. Otherwise show the manpage if that is
- specified using the ‘man-page’ slot. Otherwise show the command’s
- doc string.
-
- For suffixes, show the command’s doc string.
-
- For infixes, show the manpage if that is specified. Otherwise show
- the command’s doc string.
-
-
-File: transient.info, Node: Prefix Slots, Next: Suffix Slots, Prev: Suffix Methods, Up: Classes and Methods
-
-6.6 Prefix Slots
-================
-
- • ‘man-page’ or ‘info-manual’ can be used to specify the
- documentation for the prefix and its suffixes. The command
- ‘transient-help’ uses the method ‘transient-show-help’ (which see)
- to lookup and use these values.
-
- • ‘history-key’ If multiple prefix commands should share a single
- value, then this slot has to be set to the same value for all of
- them. You probably don’t want that.
-
- • ‘transient-suffix’ and ‘transient-non-suffix’ play a part when
- determining whether the currently active transient prefix command
- remains active/transient when a suffix or abitrary non-suffix
- command is invoked. See *note Transient State::.
-
- • ‘incompatible’ A list of lists. Each sub-list specifies a set of
- mutually exclusive arguments. Enabling one of these arguments
- causes the others to be disabled.
-
- • ‘scope’ For some transients it might be necessary to have a sort of
- secondary value, called a "scope". See ‘transient-define-prefix’.
-
-6.6.1 Internal Prefix Slots
----------------------------
-
-These slots are mostly intended for internal use. They should not be
-set in calls to ‘transient-define-prefix’.
-
- • ‘prototype’ When a transient prefix command is invoked, then a
- clone of that object is stored in the global variable
- ‘transient--prefix’ and the prototype is stored in the clone’s
- ‘prototype’ slot.
-
- • ‘command’ The command, a symbol. Each transient prefix command
- consists of a command, which is stored in a symbol’s function slot
- and an object, which is stored in the ‘transient--prefix’ property
- of the same symbol.
-
- • ‘level’ The level of the prefix commands. The suffix commands
- whose layer is equal or lower are displayed. See *note Enabling
- and Disabling Suffixes::.
-
- • ‘value’ The likely outdated value of the prefix. Instead of
- accessing this slot directly you should use the function
- ‘transient-get-value’, which is guaranteed to return the up-to-date
- value.
-
- • ‘history’ and ‘history-pos’ are used to keep track of historic
- values. Unless you implement your own ‘transient-infix-read’
- method you should not have to deal with these slots.
-
-
-File: transient.info, Node: Suffix Slots, Next: Predicate Slots, Prev: Prefix Slots, Up: Classes and Methods
-
-6.7 Suffix Slots
-================
-
-Here we document most of the slots that are only available for suffix
-objects. Some slots are shared by suffix and group objects, they are
-documented in *note Predicate Slots::.
-
- Also see *note Suffix Classes::.
-
-6.7.1 Slots of ‘transient-suffix’
----------------------------------
-
- • ‘key’ The key, a key vector or a key description string.
-
- • ‘command’ The command, a symbol.
-
- • ‘transient’ Whether to stay transient. See *note Transient
- State::.
-
- • ‘format’ The format used to display the suffix in the popup buffer.
- It must contain the following %-placeholders:
-
- • ‘%k’ For the key.
-
- • ‘%d’ For the description.
-
- • ‘%v’ For the infix value. Non-infix suffixes don’t have a
- value.
-
- • ‘description’ The description, either a string or a function that
- is called with no argument and returns a string.
-
-6.7.2 Slots of ‘transient-infix’
---------------------------------
-
-Some of these slots are only meaningful for some of the subclasses.
-They are defined here anyway to allow sharing certain methods.
-
- • ‘argument’ The long argument, e.g. ‘--verbose’.
-
- • ‘shortarg’ The short argument, e.g. ‘-v’.
-
- • ‘multi-value’ For options, whether the option can have multiple
- values. If non-nil, then default to use
- ‘completing-read-multiple’.
-
- • ‘allow-empty’ For options, whether the empty string is a valid
- value.
-
- • ‘history-key’ The key used to store the history. This defaults to
- the command name. This is useful when multiple infixes should
- share the same history because their values are of the same kind.
-
- • ‘reader’ The function used to read the value of an infix. Not used
- for switches. The function takes three arguments, PROMPT,
- INITIAL-INPUT and HISTORY, and must return a string.
-
- • ‘prompt’ The prompt used when reading the value, either a string or
- a function that takes the object as the only argument and which
- returns a prompt string.
-
- • ‘choices’ A list of valid values. How exactly that is used depends
- on the class of the object.
-
-6.7.3 Slots of ‘transient-variable’
------------------------------------
-
- • ‘variable’ The variable.
-
-6.7.4 Slots of ‘transient-switches’
------------------------------------
-
- • ‘argument-format’ The display format. Must contain ‘%s’, one of
- the ‘choices’ is substituted for that. E.g. ‘--%s-order’.
-
- • ‘argument-regexp’ The regexp used to match any one of the switches.
- E.g. ‘\\(--\\(topo\\|author-date\\|date\\)-order\\)’.
-
-
-File: transient.info, Node: Predicate Slots, Prev: Suffix Slots, Up: Classes and Methods
-
-6.8 Predicate Slots
-===================
-
-Suffix and group objects share some predicate slots that control whether
-a group or suffix should be available depending on some state. Only one
-of these slots can be used at the same time. It is undefined what
-happens if you use more than one.
-
- • ‘if’ Enable if predicate returns non-nil.
-
- • ‘if-not’ Enable if predicate returns nil.
-
- • ‘if-non-nil’ Enable if variable’s value is non-nil.
-
- • ‘if-nil’ Enable if variable’s value is nil.
-
- • ‘if-mode’ Enable if major-mode matches value.
-
- • ‘if-not-mode’ Enable if major-mode does not match value.
-
- • ‘if-derived’ Enable if major-mode derives from value.
-
- • ‘if-not-derived’ Enable if major-mode does not derive from value.
-
- One more slot is shared between group and suffix classes, ‘level’.
-Like the slots documented above, it is a predicate, but it is used for a
-different purpose. The value has to be an integer between 1 and 7.
-‘level’ controls whether a suffix or a group should be available
-depending on user preference. See *note Enabling and Disabling
-Suffixes::.
-
-
-File: transient.info, Node: Related Abstractions and Packages, Next: FAQ, Prev: Classes and Methods, Up: Top
-
-7 Related Abstractions and Packages
-***********************************
-
-* Menu:
-
-* Comparison With Prefix Keys and Prefix Arguments::
-* Comparison With Other Packages::
-
-
-File: transient.info, Node: Comparison With Prefix Keys and Prefix Arguments, Next: Comparison With Other Packages, Up: Related Abstractions and Packages
-
-7.1 Comparison With Prefix Keys and Prefix Arguments
-====================================================
-
-While transient commands were inspired by regular prefix keys and prefix
-arguments, they are also quite different and much more complex.
-
- The following diagrams illustrate some of the differences.
-
- • ‘(c)’ represents a return to the command loop.
-
- • ‘(+)’ represents the user’s choice to press one key or another.
-
- • ‘{WORD}’ are possible behaviors.
-
- • ‘{NUMBER}’ is a footnote.
-
-7.1.1 Regular Prefix Commands
------------------------------
-
-See *note (elisp)Prefix Keys::.
-
- ,--> command1 --> (c)
- |
- (c)-(+)-> prefix command or key --+--> command2 --> (c)
- |
- `--> command3 --> (c)
-
-7.1.2 Regular Prefix Arguments
-------------------------------
-
-See *note (elisp)Prefix Command Arguments::.
-
- ,----------------------------------,
- | |
- v |
- (c)-(+)---> prefix argument command --(c)-(+)-> any command --> (c)
- | ^ |
- | | |
- `-- sets or changes --, ,-- maybe used --' |
- | | |
- v | |
- prefix argument state |
- ^ |
- | |
- `-------- discards --------'
-
-7.1.3 Transients
-----------------
-
-(∩`-´)⊃━☆゚.*・。゚
-
- This diagram ignores the infix value and external state:
-
- (c)
- | ,- {stay} ------<-,-<------------<-,-<---,
- (+) | | | |
- | | | | |
- | | ,--> infix1 --| | |
- | | | | | |
- | | |--> infix2 --| | |
- v v | | | |
- prefix -(c)-(+)-> infix3 --' ^ |
- | | |
- |---------------> suffix1 -->--| |
- | | |
- |---------------> suffix2 ----{1}------> {exit} --> (c)
- | |
- |---------------> suffix3 -------------> {exit} --> (c)
- | |
- `--> any command --{2}-> {warn} -->--|
- | |
- |--> {noop} -->--|
- | |
- |--> {call} -->--'
- |
- `------------------> {exit} --> (c)
-
- This diagram takes the infix value into account to an extend, while
-still ignoring external state:
-
- (c)
- | ,- {stay} ------<-,-<------------<-,-<---,
- (+) | | | |
- | | | | |
- | | ,--> infix1 --| | |
- | | | | | | |
- | | ,--> infix2 --| | |
- v v | | | | |
- prefix -(c)-(+)-> infix3 --' | |
- | | ^ |
- | | | |
- |---------------> suffix1 -->--| |
- | | ^ | |
- | | | | |
- |---------------> suffix2 ----{1}------> {exit} --> (c)
- | | ^ | |
- | | | | v
- | | | | |
- |---------------> suffix3 -------------> {exit} --> (c)
- | | ^ | |
- | sets | | v
- | | maybe | |
- | | used | |
- | | | | |
- | | infix --' | |
- | `---> value | |
- | ^ | |
- | | | |
- | hides | |
- | | | |
- | `--------------------------<---|
- | | |
- `--> any command --{2}-> {warn} -->--| |
- | | |
- |--> {noop} -->--| |
- | | |
- |--> {call} -->--' ^
- | |
- `------------------> {exit} --> (c)
-
- This diagram provides more information about the infix value and also
-takes external state into account.
-
- ,----sets--- "anything"
- |
- v
- ,---------> external
- | state
- | | |
- | initialized | ☉‿⚆
- sets from |
- | | maybe
- | ,----------' used
- | | |
- (c) | | v
- | ,- {stay} --|---<-,-<------|-----<-,-<---,
- (+) | | | | | | |
- | | | v | | | |
- | | ,--> infix1 --| | | |
- | | | | | | | | |
- | | | | v | | | |
- | | ,--> infix2 --| | | |
- | | | | ^ | | | |
- v v | | | | | | |
- prefix -(c)-(+)-> infix3 --' | | |
- | | ^ | ^ |
- | | | v | |
- |---------------> suffix1 -->--| |
- | | | ^ | | |
- | | | | v | |
- |---------------> suffix2 ----{1}------> {exit} --> (c)
- | | | ^ | | |
- | | | | | | v
- | | | | v | |
- |---------------> suffix3 -------------> {exit} --> (c)
- | | | ^ | |
- | sets | | | v
- | | initialized maybe | |
- | | from used | |
- | | | | | |
- | | `-- infix ---' | |
- | `---> value -----------------------------> persistent
- | ^ ^ | | across
- | | | | | invocations -,
- | hides | | | |
- | | `----------------------------------------------'
- | | | |
- | `--------------------------<---|
- | | |
- `--> any command --{2}-> {warn} -->--| |
- | | |
- |--> {noop} -->--| |
- | | |
- |--> {call} -->--' ^
- | |
- `------------------> {exit} --> (c)
-
- • ‘{1}’ Transients can be configured to be exited when a suffix
- command is invoked. The default is to do so for all suffixes
- except for those that are common to all transients and which are
- used to perform tasks such as providing help and saving the value
- of the infix arguments for future invocations. The behavior can
- also be specified for individual suffix commands and may even
- depend on state.
-
- • ‘{2}’ Transients can be configured to allow the user to invoke
- non-suffix commands. The default is to not allow that and instead
- warn the user.
-
- Despite already being rather complex, even the last diagram leaves
-out many details. Most importantly it implies that the decision whether
-to remain transient is made later than it actually is made (for the most
-part a function on ‘pre-command-hook’ is responsible). But such
-implementation details are of little relevance to users and are covered
-elsewhere.
-
-
-File: transient.info, Node: Comparison With Other Packages, Prev: Comparison With Prefix Keys and Prefix Arguments, Up: Related Abstractions and Packages
-
-7.2 Comparison With Other Packages
-==================================
-
-7.2.1 Magit-Popup
------------------
-
-Transient is the successor to Magit-Popup (see *note
-(magit-popup)Top::).
-
- One major difference between these two implementations of the same
-ideas is that while Transient uses transient keymaps and embraces the
-command-loop, Magit-Popup implemented an inferior mechanism that does
-not use transient keymaps and that instead of using the command-loop
-implements a naive alternative based on ‘read-char’.
-
- Magit-Popup does not use classes and generic functions and defining a
-new command type is near impossible as it involves adding hard-coded
-special-cases to many functions. Because of that only a single new type
-was added, which was not already part of Magit-Popup’s initial release.
-
- A lot of things are hard-coded in Magit-Popup. One random example is
-that the key bindings for switches must begin with "-" and those for
-options must begin with "=".
-
-7.2.2 Hydra
------------
-
-Hydra (see <https://github.com/abo-abo/hydra>) is another package that
-provides features similar to those of Transient.
-
- Both packages use transient keymaps to make a set of commands
-temporarily available and show the available commands in a popup buffer.
-
- A Hydra "body" is equivalent to a Transient "prefix" and a Hydra
-"head" is equivalent to a Transient "suffix". Hydra has no equivalent
-of a Transient "infix".
-
- Both hydras and transients can be used as simple command dispatchers.
-Used like this they are similar to regular prefix commands and prefix
-keys, except that the available commands are shown in the popup buffer.
-
- (Another package that does this is ‘which-key’. It does so
-automatically for any incomplete key sequence. The advantage of that
-approach is that no additional work is necessary; the disadvantage is
-that the available commands are not organized semantically.)
-
- Both Hydra and Transient provide features that go beyond simple
-command dispatchers:
-
- • Invoking a command from a hydra does not necessarily exit the
- hydra. That makes it possible to invoke the same command again,
- but using a shorter key sequence (i.e. the key that was used to
- enter the hydra does not have to be pressed again).
-
- Transient supports that too, but for now this feature is not a
- focus and the interface is a bit more complicated. A very basic
- example using the current interface:
-
- (transient-define-prefix outline-navigate ()
- :transient-suffix 'transient--do-stay
- :transient-non-suffix 'transient--do-warn
- [("p" "previous visible heading" outline-previous-visible-heading)
- ("n" "next visible heading" outline-next-visible-heading)])
-
- • Transient supports infix arguments; values that are set by infix
- commands and then consumed by the invoked suffix command(s).
-
- To my knowledge, Hydra does not support that.
-
- Both packages make it possible to specify how exactly the available
-commands are outlined:
-
- • With Hydra this is often done using an explicit format string,
- which gives authors a lot of flexibility and makes it possible to
- do fancy things.
-
- The downside of this is that it becomes harder for a user to add
- additional commands to an existing hydra and to change key
- bindings.
-
- • Transient allows the author of a transient to organize the commands
- into groups and the use of generic functions allows authors of
- transients to control exactly how a certain command type is
- displayed.
-
- However while Transient supports giving sections a heading it does
- not currently support giving the displayed information more
- structure by, for example, using box-drawing characters.
-
- That could be implemented by defining a new group class, which lets
- the author specify a format string. It should be possible to
- implement that without modifying any existing code, but it does not
- currently exist.
-
-
-File: transient.info, Node: FAQ, Next: Keystroke Index, Prev: Related Abstractions and Packages, Up: Top
-
-Appendix A FAQ
-**************
-
-A.1 Can I control how the popup buffer is displayed?
-====================================================
-
-Yes, see ‘transient-display-buffer-action’ in *note Other Options::.
-
-A.2 Why did some of the key bindings change?
-============================================
-
-You may have noticed that the bindings for some of the common commands
-do *not* have the prefix ‘C-x’ and that furthermore some of these
-commands are grayed out while others are not. That unfortunately is a
-bit confusing if the section of common commands is not shown
-permanently, making the following explanation necessary.
-
- The purpose of usually hiding that section but showing it after the
-user pressed the respective prefix key is to conserve space and not
-overwhelm users with too much noise, while allowing the user to quickly
-list common bindings on demand.
-
- That however should not keep us from using the best possible key
-bindings. The bindings that do use a prefix do so to avoid wasting too
-many non-prefix bindings, keeping them available for use in individual
-transients. The bindings that do not use a prefix and that are *not*
-grayed out are very important bindings that are *always* available, even
-when invoking the "common command key prefix" or *any other*
-transient-specific prefix. The non-prefix keys that *are* grayed out
-however, are not available when any incomplete prefix key sequence is
-active. They do not use the "common command key prefix" because it is
-likely that users want to invoke them several times in a row and e.g.
-‘M-p M-p M-p’ is much more convenient than ‘C-x M-p C-x M-p C-x M-p’.
-
- You may also have noticed that the "Set" command is bound to ‘C-x s’,
-while Magit-Popup used to bind ‘C-c C-c’ instead. I have seen several
-users praise the latter binding (sic), so I did not change it
-willy-nilly. The reason that I changed it is that using different
-prefix keys for different common commands, would have made the temporary
-display of the common commands even more confusing, i.e. after pressing
-‘C-c’ all the ‘C-x ...’ bindings would be grayed out.
-
- Using a single prefix for common commands key means that all other
-potential prefix keys can be used for transient-specific commands
-*without* the section of common commands also popping up. ‘C-c’ in
-particular is a prefix that I want to (and already do) use for Magit,
-and also using that for a common command would prevent me from doing so.
-
- (Also see the next question.)
-
-A.3 Why does ‘q’ not quit popups anymore?
-=========================================
-
-I agree that ‘q’ is a good binding for commands that quit something.
-This includes quitting whatever transient is currently active, but it
-also includes quitting whatever it is that some specific transient is
-controlling. The transient ‘magit-blame’ for example binds ‘q’ to the
-command that turns ‘magit-blame-mode’ off.
-
- So I had to decide if ‘q’ should quit the active transient (like
-Magit-Popup used to) or whether ‘C-g’ should do that instead, so that
-‘q’ could be bound in individual transient to whatever commands make
-sense for them. Because all other letters are already reserved for use
-by individual transients, I have decided to no longer make an exception
-for ‘q’.
-
- If you want to get ‘q’’s old binding back then you can do so. Doing
-that is a bit more complicated than changing a single key binding, so I
-have implemented a function, ‘transient-bind-q-to-quit’ that makes the
-necessary changes. See its doc string for more information.
-
-
-File: transient.info, Node: Keystroke Index, Next: Command Index, Prev: FAQ, Up: Top
-
-Appendix B Keystroke Index
-**************************
-
-
-* Menu:
-
-* C-g: Aborting and Resuming Transients.
- (line 25)
-* C-g <1>: Aborting and Resuming Transients.
- (line 26)
-* C-h: Getting Help for Suffix Commands.
- (line 10)
-* C-q: Aborting and Resuming Transients.
- (line 36)
-* C-x C-s: Saving Values. (line 25)
-* C-x l: Enabling and Disabling Suffixes.
- (line 49)
-* C-x s: Saving Values. (line 20)
-* C-x t: Common Suffix Commands.
- (line 16)
-* C-z: Aborting and Resuming Transients.
- (line 42)
-* M-n: Using History. (line 16)
-* M-p: Using History. (line 11)
-* M-x transient-resume: Aborting and Resuming Transients.
- (line 55)
-
-
-File: transient.info, Node: Command Index, Next: Function Index, Prev: Keystroke Index, Up: Top
-
-Appendix C Command Index
-************************
-
-
-* Menu:
-
-* transient-help: Getting Help for Suffix Commands.
- (line 10)
-* transient-history-next: Using History. (line 16)
-* transient-history-prev: Using History. (line 11)
-* transient-quit-all: Aborting and Resuming Transients.
- (line 36)
-* transient-quit-one: Aborting and Resuming Transients.
- (line 26)
-* transient-quit-seq: Aborting and Resuming Transients.
- (line 25)
-* transient-resume: Aborting and Resuming Transients.
- (line 55)
-* transient-save: Saving Values. (line 25)
-* transient-scroll-down arg: Other Commands. (line 18)
-* transient-scroll-up arg: Other Commands. (line 12)
-* transient-set: Saving Values. (line 20)
-* transient-set-level: Enabling and Disabling Suffixes.
- (line 49)
-* transient-suspend: Aborting and Resuming Transients.
- (line 42)
-* transient-toggle-common: Common Suffix Commands.
- (line 16)
-
-
-File: transient.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top
-
-Appendix D Function Index
-*************************
-
-
-* Menu:
-
-* transient--do-call: Transient State. (line 98)
-* transient--do-exit: Transient State. (line 94)
-* transient--do-noop: Transient State. (line 125)
-* transient--do-quit-all: Transient State. (line 138)
-* transient--do-quit-one: Transient State. (line 132)
-* transient--do-replace: Transient State. (line 102)
-* transient--do-stay: Transient State. (line 85)
-* transient--do-suspend: Transient State. (line 144)
-* transient--do-warn: Transient State. (line 121)
-* transient--history-init: Prefix Classes. (line 10)
-* transient--insert-group: Group Methods. (line 6)
-* transient-append-suffix: Modifying Existing Transients.
- (line 47)
-* transient-args: Using Infix Arguments.
- (line 22)
-* transient-define-argument: Defining Suffix and Infix Commands.
- (line 63)
-* transient-define-infix: Defining Suffix and Infix Commands.
- (line 27)
-* transient-define-prefix: Defining Transients. (line 13)
-* transient-define-suffix: Defining Suffix and Infix Commands.
- (line 9)
-* transient-format: Suffix Format Methods.
- (line 6)
-* transient-format-description: Suffix Format Methods.
- (line 20)
-* transient-format-key: Suffix Format Methods.
- (line 15)
-* transient-format-value: Suffix Format Methods.
- (line 25)
-* transient-get-suffix: Modifying Existing Transients.
- (line 60)
-* transient-infix-read: Suffix Value Methods.
- (line 17)
-* transient-infix-set: Suffix Value Methods.
- (line 39)
-* transient-infix-value: Suffix Value Methods.
- (line 43)
-* transient-init-scope: Suffix Value Methods.
- (line 57)
-* transient-init-value: Suffix Value Methods.
- (line 6)
-* transient-insert-suffix: Modifying Existing Transients.
- (line 42)
-* transient-prompt: Suffix Value Methods.
- (line 34)
-* transient-remove-suffix: Modifying Existing Transients.
- (line 56)
-* transient-replace-suffix: Modifying Existing Transients.
- (line 51)
-* transient-scroll-down: Other Commands. (line 18)
-* transient-scroll-up: Other Commands. (line 12)
-* transient-show-help: Suffix Format Methods.
- (line 30)
-* transient-suffix-put: Modifying Existing Transients.
- (line 65)
-
-
-File: transient.info, Node: Variable Index, Prev: Function Index, Up: Top
-
-Appendix E Variable Index
-*************************
-
-
-* Menu:
-
-* transient-current-command: Using Infix Arguments.
- (line 47)
-* transient-current-prefix: Using Infix Arguments.
- (line 41)
-* transient-current-suffixes: Using Infix Arguments.
- (line 32)
-* transient-default-level: Enabling and Disabling Suffixes.
- (line 38)
-* transient-detect-key-conflicts: Other Options. (line 137)
-* transient-display-buffer-action: Other Options. (line 46)
-* transient-enable-popup-navigation: Other Options. (line 28)
-* transient-force-fixed-pitch: Other Options. (line 151)
-* transient-highlight-mismatched-keys: Other Options. (line 96)
-* transient-history-file: Using History. (line 33)
-* transient-history-limit: Using History. (line 38)
-* transient-levels-file: Enabling and Disabling Suffixes.
- (line 44)
-* transient-mode-line-format: Other Options. (line 71)
-* transient-read-with-initial-input: Other Options. (line 88)
-* transient-show-common-commands: Common Suffix Commands.
- (line 23)
-* transient-show-popup: Other Options. (line 6)
-* transient-substitute-key-function: Other Options. (line 115)
-* transient-values-file: Saving Values. (line 30)
-
-
-
-Tag Table:
-Node: Top751
-Node: Introduction3673
-Node: Usage9460
-Node: Invoking Transients9794
-Node: Aborting and Resuming Transients10826
-Node: Common Suffix Commands13485
-Node: Saving Values15239
-Ref: Saving Values-Footnote-116497
-Node: Using History16767
-Node: Getting Help for Suffix Commands18308
-Node: Enabling and Disabling Suffixes19701
-Node: Other Commands22991
-Node: Other Options23947
-Node: Modifying Existing Transients31071
-Node: Defining New Commands34473
-Node: Defining Transients34809
-Node: Binding Suffix and Infix Commands37240
-Node: Group Specifications38094
-Node: Suffix Specifications41426
-Node: Defining Suffix and Infix Commands45001
-Node: Using Infix Arguments48199
-Node: Transient State50419
-Node: Classes and Methods56292
-Node: Group Classes58506
-Node: Group Methods60422
-Node: Prefix Classes61068
-Node: Suffix Classes62160
-Node: Suffix Methods64404
-Node: Suffix Value Methods64725
-Node: Suffix Format Methods67485
-Node: Prefix Slots68937
-Node: Suffix Slots71412
-Node: Predicate Slots74263
-Node: Related Abstractions and Packages75511
-Node: Comparison With Prefix Keys and Prefix Arguments75798
-Node: Comparison With Other Packages86110
-Node: FAQ90300
-Node: Keystroke Index94034
-Node: Command Index95668
-Node: Function Index97455
-Node: Variable Index101612
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/undo-tree-0.7.4.signed b/elpa/undo-tree-0.7.4.signed
deleted file mode 100644
index cec76aa..0000000
--- a/elpa/undo-tree-0.7.4.signed
+++ /dev/null
@@ -1 +0,0 @@
-Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2020-01-29T02:05:02-0800 using RSA \ No newline at end of file
diff --git a/elpa/undo-tree-0.7.4/undo-tree-autoloads.el b/elpa/undo-tree-0.7.4/undo-tree-autoloads.el
deleted file mode 100644
index b2cf8c7..0000000
--- a/elpa/undo-tree-0.7.4/undo-tree-autoloads.el
+++ /dev/null
@@ -1,64 +0,0 @@
-;;; undo-tree-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "undo-tree" "undo-tree.el" (0 0 0 0))
-;;; Generated autoloads from undo-tree.el
-
-(autoload 'undo-tree-mode "undo-tree" "\
-Toggle undo-tree mode.
-With no argument, this command toggles the mode.
-A positive prefix argument turns the mode on.
-A negative prefix argument turns it off.
-
-Undo-tree-mode replaces Emacs' standard undo feature with a more
-powerful yet easier to use version, that treats the undo history
-as what it is: a tree.
-
-The following keys are available in `undo-tree-mode':
-
- \\{undo-tree-map}
-
-Within the undo-tree visualizer, the following keys are available:
-
- \\{undo-tree-visualizer-mode-map}
-
-\(fn &optional ARG)" t nil)
-
-(defvar global-undo-tree-mode nil "\
-Non-nil if Global Undo-Tree mode is enabled.
-See the `global-undo-tree-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `global-undo-tree-mode'.")
-
-(custom-autoload 'global-undo-tree-mode "undo-tree" nil)
-
-(autoload 'global-undo-tree-mode "undo-tree" "\
-Toggle Undo-Tree mode in all buffers.
-With prefix ARG, enable Global Undo-Tree mode if ARG is positive;
-otherwise, disable it. If called from Lisp, enable the mode if
-ARG is omitted or nil.
-
-Undo-Tree mode is enabled in all buffers where
-`turn-on-undo-tree-mode' would do it.
-See `undo-tree-mode' for more information on Undo-Tree mode.
-
-\(fn &optional ARG)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "undo-tree" '("undo-" "turn-on-undo-tree-mode" "*undo-tree-id-counter*" "buffer-undo-tree")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; undo-tree-autoloads.el ends here
diff --git a/elpa/undo-tree-0.7.4/undo-tree-pkg.el b/elpa/undo-tree-0.7.4/undo-tree-pkg.el
deleted file mode 100644
index 9ee3096..0000000
--- a/elpa/undo-tree-0.7.4/undo-tree-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "undo-tree" "0.7.4" "Treat undo history as a tree" 'nil :keywords '("convenience" "files" "undo" "redo" "history" "tree") :authors '(("Toby Cubitt" . "toby-undo-tree@dr-qubit.org")) :maintainer '("Toby Cubitt" . "toby-undo-tree@dr-qubit.org") :url "http://www.dr-qubit.org/emacs.php")
diff --git a/elpa/undo-tree-0.7.4/undo-tree.el b/elpa/undo-tree-0.7.4/undo-tree.el
deleted file mode 100644
index 9fa1fc6..0000000
--- a/elpa/undo-tree-0.7.4/undo-tree.el
+++ /dev/null
@@ -1,4751 +0,0 @@
-;;; undo-tree.el --- Treat undo history as a tree -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2009-2020 Free Software Foundation, Inc
-
-;; Author: Toby Cubitt <toby-undo-tree@dr-qubit.org>
-;; Maintainer: Toby Cubitt <toby-undo-tree@dr-qubit.org>
-;; Version: 0.7.4
-;; Keywords: convenience, files, undo, redo, history, tree
-;; URL: http://www.dr-qubit.org/emacs.php
-;; Repository: http://www.dr-qubit.org/git/undo-tree.git
-
-;; This file is part of Emacs.
-;;
-;; This file 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 <http://www.gnu.org/licenses/>.
-
-
-;;; Commentary:
-;;
-;; Emacs has a powerful undo system. Unlike the standard undo/redo system in
-;; most software, it allows you to recover *any* past state of a buffer
-;; (whereas the standard undo/redo system can lose past states as soon as you
-;; redo). However, this power comes at a price: many people find Emacs' undo
-;; system confusing and difficult to use, spawning a number of packages that
-;; replace it with the less powerful but more intuitive undo/redo system.
-;;
-;; Both the loss of data with standard undo/redo, and the confusion of Emacs'
-;; undo, stem from trying to treat undo history as a linear sequence of
-;; changes. It's not. The `undo-tree-mode' provided by this package replaces
-;; Emacs' undo system with a system that treats undo history as what it is: a
-;; branching tree of changes. This simple idea allows the more intuitive
-;; behaviour of the standard undo/redo system to be combined with the power of
-;; never losing any history. An added side bonus is that undo history can in
-;; some cases be stored more efficiently, allowing more changes to accumulate
-;; before Emacs starts discarding history.
-;;
-;; The only downside to this more advanced yet simpler undo system is that it
-;; was inspired by Vim. But, after all, most successful religions steal the
-;; best ideas from their competitors!
-;;
-;;
-;; Installation
-;; ============
-;;
-;; This package has only been tested with Emacs versions 24 and CVS. It should
-;; work in Emacs versions 22 and 23 too, but will not work without
-;; modifications in earlier versions of Emacs.
-;;
-;; To install `undo-tree-mode', make sure this file is saved in a directory in
-;; your `load-path', and add the line:
-;;
-;; (require 'undo-tree)
-;;
-;; to your .emacs file. Byte-compiling undo-tree.el is recommended (e.g. using
-;; "M-x byte-compile-file" from within emacs).
-;;
-;; If you want to replace the standard Emacs' undo system with the
-;; `undo-tree-mode' system in all buffers, you can enable it globally by
-;; adding:
-;;
-;; (global-undo-tree-mode)
-;;
-;; to your .emacs file.
-;;
-;;
-;; Quick-Start
-;; ===========
-;;
-;; If you're the kind of person who likes to jump in the car and drive,
-;; without bothering to first figure out whether the button on the left dips
-;; the headlights or operates the ejector seat (after all, you'll soon figure
-;; it out when you push it), then here's the minimum you need to know:
-;;
-;; `undo-tree-mode' and `global-undo-tree-mode'
-;; Enable undo-tree mode (either in the current buffer or globally).
-;;
-;; C-_ C-/ (`undo-tree-undo')
-;; Undo changes.
-;;
-;; M-_ C-? (`undo-tree-redo')
-;; Redo changes.
-;;
-;; `undo-tree-switch-branch'
-;; Switch undo-tree branch.
-;; (What does this mean? Better press the button and see!)
-;;
-;; C-x u (`undo-tree-visualize')
-;; Visualize the undo tree.
-;; (Better try pressing this button too!)
-;;
-;; C-x r u (`undo-tree-save-state-to-register')
-;; Save current buffer state to register.
-;;
-;; C-x r U (`undo-tree-restore-state-from-register')
-;; Restore buffer state from register.
-;;
-;;
-;;
-;; In the undo-tree visualizer:
-;;
-;; <up> p C-p (`undo-tree-visualize-undo')
-;; Undo changes.
-;;
-;; <down> n C-n (`undo-tree-visualize-redo')
-;; Redo changes.
-;;
-;; <left> b C-b (`undo-tree-visualize-switch-branch-left')
-;; Switch to previous undo-tree branch.
-;;
-;; <right> f C-f (`undo-tree-visualize-switch-branch-right')
-;; Switch to next undo-tree branch.
-;;
-;; C-<up> M-{ (`undo-tree-visualize-undo-to-x')
-;; Undo changes up to last branch point.
-;;
-;; C-<down> M-} (`undo-tree-visualize-redo-to-x')
-;; Redo changes down to next branch point.
-;;
-;; <down> n C-n (`undo-tree-visualize-redo')
-;; Redo changes.
-;;
-;; <mouse-1> (`undo-tree-visualizer-mouse-set')
-;; Set state to node at mouse click.
-;;
-;; t (`undo-tree-visualizer-toggle-timestamps')
-;; Toggle display of time-stamps.
-;;
-;; d (`undo-tree-visualizer-toggle-diff')
-;; Toggle diff display.
-;;
-;; s (`undo-tree-visualizer-selection-mode')
-;; Toggle keyboard selection mode.
-;;
-;; q (`undo-tree-visualizer-quit')
-;; Quit undo-tree-visualizer.
-;;
-;; C-q (`undo-tree-visualizer-abort')
-;; Abort undo-tree-visualizer.
-;;
-;; , <
-;; Scroll left.
-;;
-;; . >
-;; Scroll right.
-;;
-;; <pgup> M-v
-;; Scroll up.
-;;
-;; <pgdown> C-v
-;; Scroll down.
-;;
-;;
-;;
-;; In visualizer selection mode:
-;;
-;; <up> p C-p (`undo-tree-visualizer-select-previous')
-;; Select previous node.
-;;
-;; <down> n C-n (`undo-tree-visualizer-select-next')
-;; Select next node.
-;;
-;; <left> b C-b (`undo-tree-visualizer-select-left')
-;; Select left sibling node.
-;;
-;; <right> f C-f (`undo-tree-visualizer-select-right')
-;; Select right sibling node.
-;;
-;; <pgup> M-v
-;; Select node 10 above.
-;;
-;; <pgdown> C-v
-;; Select node 10 below.
-;;
-;; <enter> (`undo-tree-visualizer-set')
-;; Set state to selected node and exit selection mode.
-;;
-;; s (`undo-tree-visualizer-mode')
-;; Exit selection mode.
-;;
-;; t (`undo-tree-visualizer-toggle-timestamps')
-;; Toggle display of time-stamps.
-;;
-;; d (`undo-tree-visualizer-toggle-diff')
-;; Toggle diff display.
-;;
-;; q (`undo-tree-visualizer-quit')
-;; Quit undo-tree-visualizer.
-;;
-;; C-q (`undo-tree-visualizer-abort')
-;; Abort undo-tree-visualizer.
-;;
-;; , <
-;; Scroll left.
-;;
-;; . >
-;; Scroll right.
-;;
-;;
-;;
-;; Persistent undo history:
-;;
-;; Note: Requires Emacs version 24.3 or higher.
-;;
-;; `undo-tree-auto-save-history' (variable)
-;; automatically save and restore undo-tree history along with buffer
-;; (disabled by default)
-;;
-;; `undo-tree-save-history' (command)
-;; manually save undo history to file
-;;
-;; `undo-tree-load-history' (command)
-;; manually load undo history from file
-;;
-;;
-;;
-;; Compressing undo history:
-;;
-;; Undo history files cannot grow beyond the maximum undo tree size, which
-;; is limited by `undo-limit', `undo-strong-limit' and
-;; `undo-outer-limit'. Nevertheless, undo history files can grow quite
-;; large. If you want to automatically compress undo history, add the
-;; following advice to your .emacs file (replacing ".gz" with the filename
-;; extension of your favourite compression algorithm):
-;;
-;; (defadvice undo-tree-make-history-save-file-name
-;; (after undo-tree activate)
-;; (setq ad-return-value (concat ad-return-value ".gz")))
-;;
-;;
-;;
-;;
-;; Undo Systems
-;; ============
-;;
-;; To understand the different undo systems, it's easiest to consider an
-;; example. Imagine you make a few edits in a buffer. As you edit, you
-;; accumulate a history of changes, which we might visualize as a string of
-;; past buffer states, growing downwards:
-;;
-;; o (initial buffer state)
-;; |
-;; |
-;; o (first edit)
-;; |
-;; |
-;; o (second edit)
-;; |
-;; |
-;; x (current buffer state)
-;;
-;;
-;; Now imagine that you undo the last two changes. We can visualize this as
-;; rewinding the current state back two steps:
-;;
-;; o (initial buffer state)
-;; |
-;; |
-;; x (current buffer state)
-;; |
-;; |
-;; o
-;; |
-;; |
-;; o
-;;
-;;
-;; However, this isn't a good representation of what Emacs' undo system
-;; does. Instead, it treats the undos as *new* changes to the buffer, and adds
-;; them to the history:
-;;
-;; o (initial buffer state)
-;; |
-;; |
-;; o (first edit)
-;; |
-;; |
-;; o (second edit)
-;; |
-;; |
-;; x (buffer state before undo)
-;; |
-;; |
-;; o (first undo)
-;; |
-;; |
-;; x (second undo)
-;;
-;;
-;; Actually, since the buffer returns to a previous state after an undo,
-;; perhaps a better way to visualize it is to imagine the string of changes
-;; turning back on itself:
-;;
-;; (initial buffer state) o
-;; |
-;; |
-;; (first edit) o x (second undo)
-;; | |
-;; | |
-;; (second edit) o o (first undo)
-;; | /
-;; |/
-;; o (buffer state before undo)
-;;
-;; Treating undos as new changes might seem a strange thing to do. But the
-;; advantage becomes clear as soon as we imagine what happens when you edit
-;; the buffer again. Since you've undone a couple of changes, new edits will
-;; branch off from the buffer state that you've rewound to. Conceptually, it
-;; looks like this:
-;;
-;; o (initial buffer state)
-;; |
-;; |
-;; o
-;; |\
-;; | \
-;; o x (new edit)
-;; |
-;; |
-;; o
-;;
-;; The standard undo/redo system only lets you go backwards and forwards
-;; linearly. So as soon as you make that new edit, it discards the old
-;; branch. Emacs' undo just keeps adding changes to the end of the string. So
-;; the undo history in the two systems now looks like this:
-;;
-;; Undo/Redo: Emacs' undo
-;;
-;; o o
-;; | |
-;; | |
-;; o o o
-;; .\ | |\
-;; . \ | | \
-;; . x (new edit) o o |
-;; (discarded . | / |
-;; branch) . |/ |
-;; . o |
-;; |
-;; |
-;; x (new edit)
-;;
-;; Now, what if you change your mind about those undos, and decide you did
-;; like those other changes you'd made after all? With the standard undo/redo
-;; system, you're lost. There's no way to recover them, because that branch
-;; was discarded when you made the new edit.
-;;
-;; However, in Emacs' undo system, those old buffer states are still there in
-;; the undo history. You just have to rewind back through the new edit, and
-;; back through the changes made by the undos, until you reach them. Of
-;; course, since Emacs treats undos (even undos of undos!) as new changes,
-;; you're really weaving backwards and forwards through the history, all the
-;; time adding new changes to the end of the string as you go:
-;;
-;; o
-;; |
-;; |
-;; o o o (undo new edit)
-;; | |\ |\
-;; | | \ | \
-;; o o | | o (undo the undo)
-;; | / | | |
-;; |/ | | |
-;; (trying to get o | | x (undo the undo)
-;; to this state) | /
-;; |/
-;; o
-;;
-;; So far, this is still reasonably intuitive to use. It doesn't behave so
-;; differently to standard undo/redo, except that by going back far enough you
-;; can access changes that would be lost in standard undo/redo.
-;;
-;; However, imagine that after undoing as just described, you decide you
-;; actually want to rewind right back to the initial state. If you're lucky,
-;; and haven't invoked any command since the last undo, you can just keep on
-;; undoing until you get back to the start:
-;;
-;; (trying to get o x (got there!)
-;; to this state) | |
-;; | |
-;; o o o o (keep undoing)
-;; | |\ |\ |
-;; | | \ | \ |
-;; o o | | o o (keep undoing)
-;; | / | | | /
-;; |/ | | |/
-;; (already undid o | | o (got this far)
-;; to this state) | /
-;; |/
-;; o
-;;
-;; But if you're unlucky, and you happen to have moved the point (say) after
-;; getting to the state labelled "got this far", then you've "broken the undo
-;; chain". Hold on to something solid, because things are about to get
-;; hairy. If you try to undo now, Emacs thinks you're trying to undo the
-;; undos! So to get back to the initial state you now have to rewind through
-;; *all* the changes, including the undos you just did:
-;;
-;; (trying to get o x (finally got there!)
-;; to this state) | |
-;; | |
-;; o o o o o o
-;; | |\ |\ |\ |\ |
-;; | | \ | \ | \ | \ |
-;; o o | | o o | | o o
-;; | / | | | / | | | /
-;; |/ | | |/ | | |/
-;; (already undid o | | o<. | | o
-;; to this state) | / : | /
-;; |/ : |/
-;; o : o
-;; :
-;; (got this far, but
-;; broke the undo chain)
-;;
-;; Confused?
-;;
-;; In practice you can just hold down the undo key until you reach the buffer
-;; state that you want. But whatever you do, don't move around in the buffer
-;; to *check* that you've got back to where you want! Because you'll break the
-;; undo chain, and then you'll have to traverse the entire string of undos
-;; again, just to get back to the point at which you broke the
-;; chain. Undo-in-region and commands such as `undo-only' help to make using
-;; Emacs' undo a little easier, but nonetheless it remains confusing for many
-;; people.
-;;
-;;
-;; So what does `undo-tree-mode' do? Remember the diagram we drew to represent
-;; the history we've been discussing (make a few edits, undo a couple of them,
-;; and edit again)? The diagram that conceptually represented our undo
-;; history, before we started discussing specific undo systems? It looked like
-;; this:
-;;
-;; o (initial buffer state)
-;; |
-;; |
-;; o
-;; |\
-;; | \
-;; o x (current state)
-;; |
-;; |
-;; o
-;;
-;; Well, that's *exactly* what the undo history looks like to
-;; `undo-tree-mode'. It doesn't discard the old branch (as standard undo/redo
-;; does), nor does it treat undos as new changes to be added to the end of a
-;; linear string of buffer states (as Emacs' undo does). It just keeps track
-;; of the tree of branching changes that make up the entire undo history.
-;;
-;; If you undo from this point, you'll rewind back up the tree to the previous
-;; state:
-;;
-;; o
-;; |
-;; |
-;; x (undo)
-;; |\
-;; | \
-;; o o
-;; |
-;; |
-;; o
-;;
-;; If you were to undo again, you'd rewind back to the initial state. If on
-;; the other hand you redo the change, you'll end up back at the bottom of the
-;; most recent branch:
-;;
-;; o (undo takes you here)
-;; |
-;; |
-;; o (start here)
-;; |\
-;; | \
-;; o x (redo takes you here)
-;; |
-;; |
-;; o
-;;
-;; So far, this is just like the standard undo/redo system. But what if you
-;; want to return to a buffer state located on a previous branch of the
-;; history? Since `undo-tree-mode' keeps the entire history, you simply need
-;; to tell it to switch to a different branch, and then redo the changes you
-;; want:
-;;
-;; o
-;; |
-;; |
-;; o (start here, but switch
-;; |\ to the other branch)
-;; | \
-;; (redo) o o
-;; |
-;; |
-;; (redo) x
-;;
-;; Now you're on the other branch, if you undo and redo changes you'll stay on
-;; that branch, moving up and down through the buffer states located on that
-;; branch. Until you decide to switch branches again, of course.
-;;
-;; Real undo trees might have multiple branches and sub-branches:
-;;
-;; o
-;; ____|______
-;; / \
-;; o o
-;; ____|__ __|
-;; / | \ / \
-;; o o o o x
-;; | |
-;; / \ / \
-;; o o o o
-;;
-;; Trying to imagine what Emacs' undo would do as you move about such a tree
-;; will likely frazzle your brain circuits! But in `undo-tree-mode', you're
-;; just moving around this undo history tree. Most of the time, you'll
-;; probably only need to stay on the most recent branch, in which case it
-;; behaves like standard undo/redo, and is just as simple to understand. But
-;; if you ever need to recover a buffer state on a different branch, the
-;; possibility of switching between branches and accessing the full undo
-;; history is still there.
-;;
-;;
-;;
-;; The Undo-Tree Visualizer
-;; ========================
-;;
-;; Actually, it gets better. You don't have to imagine all these tree
-;; diagrams, because `undo-tree-mode' includes an undo-tree visualizer which
-;; draws them for you! In fact, it draws even better diagrams: it highlights
-;; the node representing the current buffer state, it highlights the current
-;; branch, and you can toggle the display of time-stamps (by hitting "t") and
-;; a diff of the undo changes (by hitting "d"). (There's one other tiny
-;; difference: the visualizer puts the most recent branch on the left rather
-;; than the right.)
-;;
-;; Bring up the undo tree visualizer whenever you want by hitting "C-x u".
-;;
-;; In the visualizer, the usual keys for moving up and down a buffer instead
-;; move up and down the undo history tree (e.g. the up and down arrow keys, or
-;; "C-n" and "C-p"). The state of the "parent" buffer (the buffer whose undo
-;; history you are visualizing) is updated as you move around the undo tree in
-;; the visualizer. If you reach a branch point in the visualizer, the usual
-;; keys for moving forward and backward in a buffer instead switch branch
-;; (e.g. the left and right arrow keys, or "C-f" and "C-b").
-;;
-;; Clicking with the mouse on any node in the visualizer will take you
-;; directly to that node, resetting the state of the parent buffer to the
-;; state represented by that node.
-;;
-;; You can also select nodes directly using the keyboard, by hitting "s" to
-;; toggle selection mode. The usual motion keys now allow you to move around
-;; the tree without changing the parent buffer. Hitting <enter> will reset the
-;; state of the parent buffer to the state represented by the currently
-;; selected node.
-;;
-;; It can be useful to see how long ago the parent buffer was in the state
-;; represented by a particular node in the visualizer. Hitting "t" in the
-;; visualizer toggles the display of time-stamps for all the nodes. (Note
-;; that, because of the way `undo-tree-mode' works, these time-stamps may be
-;; somewhat later than the true times, especially if it's been a long time
-;; since you last undid any changes.)
-;;
-;; To get some idea of what changes are represented by a given node in the
-;; tree, it can be useful to see a diff of the changes. Hit "d" in the
-;; visualizer to toggle a diff display. This normally displays a diff between
-;; the current state and the previous one, i.e. it shows you the changes that
-;; will be applied if you undo (move up the tree). However, the diff display
-;; really comes into its own in the visualizer's selection mode (see above),
-;; where it instead shows a diff between the current state and the currently
-;; selected state, i.e. it shows you the changes that will be applied if you
-;; reset to the selected state.
-;;
-;; (Note that the diff is generated by the Emacs `diff' command, and is
-;; displayed using `diff-mode'. See the corresponding customization groups if
-;; you want to customize the diff display.)
-;;
-;; Finally, hitting "q" will quit the visualizer, leaving the parent buffer in
-;; whatever state you ended at. Hitting "C-q" will abort the visualizer,
-;; returning the parent buffer to whatever state it was originally in when the
-;; visualizer was invoked.
-;;
-;;
-;;
-;; Undo-in-Region
-;; ==============
-;;
-;; Emacs allows a very useful and powerful method of undoing only selected
-;; changes: when a region is active, only changes that affect the text within
-;; that region will be undone. With the standard Emacs undo system, changes
-;; produced by undoing-in-region naturally get added onto the end of the
-;; linear undo history:
-;;
-;; o
-;; |
-;; | x (second undo-in-region)
-;; o |
-;; | |
-;; | o (first undo-in-region)
-;; o |
-;; | /
-;; |/
-;; o
-;;
-;; You can of course redo these undos-in-region as usual, by undoing the
-;; undos:
-;;
-;; o
-;; |
-;; | o_
-;; o | \
-;; | | |
-;; | o o (undo the undo-in-region)
-;; o | |
-;; | / |
-;; |/ |
-;; o x (undo the undo-in-region)
-;;
-;;
-;; In `undo-tree-mode', undo-in-region works much the same way: when there's
-;; an active region, undoing only undoes changes that affect that region. In
-;; `undo-tree-mode', redoing when there's an active region similarly only
-;; redoes changes that affect that region.
-;;
-;; However, the way these undo- and redo-in-region changes are recorded in the
-;; undo history is quite different. The good news is, you don't need to
-;; understand this to use undo- and redo-in-region in `undo-tree-mode' - just
-;; go ahead and use them! They'll probably work as you expect. But if you're
-;; masochistic enough to want to understand conceptually what's happening to
-;; the undo tree as you undo- and redo-in-region, then read on...
-;;
-;;
-;; Undo-in-region creates a new branch in the undo history. The new branch
-;; consists of an undo step that undoes some of the changes that affect the
-;; current region, and another step that undoes the remaining changes needed
-;; to rejoin the previous undo history.
-;;
-;; Previous undo history Undo-in-region
-;;
-;; o o
-;; | |
-;; | |
-;; | |
-;; o o
-;; | |
-;; | |
-;; | |
-;; o o_
-;; | | \
-;; | | x (undo-in-region)
-;; | | |
-;; x o o
-;;
-;; As long as you don't change the active region after undoing-in-region,
-;; continuing to undo-in-region extends the new branch, pulling more changes
-;; that affect the current region into an undo step immediately above your
-;; current location in the undo tree, and pushing the point at which the new
-;; branch is attached further up the tree:
-;;
-;; First undo-in-region Second undo-in-region
-;;
-;; o o
-;; | |
-;; | |
-;; | |
-;; o o_
-;; | | \
-;; | | x (undo-in-region)
-;; | | |
-;; o_ o |
-;; | \ | |
-;; | x | o
-;; | | | |
-;; o o o o
-;;
-;; Redoing takes you back down the undo tree, as usual (as long as you haven't
-;; changed the active region after undoing-in-region, it doesn't matter if it
-;; is still active):
-;;
-;; o
-;; |
-;; |
-;; |
-;; o_
-;; | \
-;; | o
-;; | |
-;; o |
-;; | |
-;; | o (redo)
-;; | |
-;; o x (redo)
-;;
-;;
-;; What about redo-in-region? Obviously, redo-in-region only makes sense if
-;; you have already undone some changes, so that there are some changes to
-;; redo! Redoing-in-region splits off a new branch of the undo history below
-;; your current location in the undo tree. This time, the new branch consists
-;; of a first redo step that redoes some of the redo changes that affect the
-;; current region, followed by *all* the remaining redo changes.
-;;
-;; Previous undo history Redo-in-region
-;;
-;; o o
-;; | |
-;; | |
-;; | |
-;; x o_
-;; | | \
-;; | | x (redo-in-region)
-;; | | |
-;; o o |
-;; | | |
-;; | | |
-;; | | |
-;; o o o
-;;
-;; As long as you don't change the active region after redoing-in-region,
-;; continuing to redo-in-region extends the new branch, pulling more redo
-;; changes into a redo step immediately below your current location in the
-;; undo tree.
-;;
-;; First redo-in-region Second redo-in-region
-;;
-;; o o
-;; | |
-;; | |
-;; | |
-;; o_ o_
-;; | \ | \
-;; | x | o
-;; | | | |
-;; o | o |
-;; | | | |
-;; | | | x (redo-in-region)
-;; | | | |
-;; o o o o
-;;
-;; Note that undo-in-region and redo-in-region only ever add new changes to
-;; the undo tree, they *never* modify existing undo history. So you can always
-;; return to previous buffer states by switching to a previous branch of the
-;; tree.
-
-
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'diff)
-(require 'gv)
-
-
-
-;;; =====================================================================
-;;; Compatibility hacks for older Emacsen
-
-;; `characterp' isn't defined in Emacs versions < 23
-(unless (fboundp 'characterp)
- (defalias 'characterp 'char-valid-p))
-
-;; `region-active-p' isn't defined in Emacs versions < 23
-(unless (fboundp 'region-active-p)
- (defun region-active-p () (and transient-mark-mode mark-active)))
-
-
-;; `registerv' defstruct isn't defined in Emacs versions < 24
-(unless (fboundp 'registerv-make)
- (defmacro registerv-make (data &rest _dummy) data))
-
-(unless (fboundp 'registerv-data)
- (defmacro registerv-data (data) data))
-
-
-;; `diff-no-select' and `diff-file-local-copy' aren't defined in Emacs
-;; versions < 24 (copied and adapted from Emacs 24)
-(unless (fboundp 'diff-no-select)
- (defun diff-no-select (old new &optional switches no-async buf)
- ;; Noninteractive helper for creating and reverting diff buffers
- (unless (bufferp new) (setq new (expand-file-name new)))
- (unless (bufferp old) (setq old (expand-file-name old)))
- (or switches (setq switches diff-switches)) ; If not specified, use default.
- (unless (listp switches) (setq switches (list switches)))
- (or buf (setq buf (get-buffer-create "*Diff*")))
- (let* ((old-alt (diff-file-local-copy old))
- (new-alt (diff-file-local-copy new))
- (command
- (mapconcat 'identity
- `(,diff-command
- ;; Use explicitly specified switches
- ,@switches
- ,@(mapcar #'shell-quote-argument
- (nconc
- (when (or old-alt new-alt)
- (list "-L" (if (stringp old)
- old (prin1-to-string old))
- "-L" (if (stringp new)
- new (prin1-to-string new))))
- (list (or old-alt old)
- (or new-alt new)))))
- " "))
- (thisdir default-directory))
- (with-current-buffer buf
- (setq buffer-read-only t)
- (buffer-disable-undo (current-buffer))
- (let ((inhibit-read-only t))
- (erase-buffer))
- (buffer-enable-undo (current-buffer))
- (diff-mode)
- (set (make-local-variable 'revert-buffer-function)
- (lambda (_ignore-auto _noconfirm)
- (diff-no-select old new switches no-async (current-buffer))))
- (setq default-directory thisdir)
- (let ((inhibit-read-only t))
- (insert command "\n"))
- (if (and (not no-async) (fboundp 'start-process))
- (let ((proc (start-process "Diff" buf shell-file-name
- shell-command-switch command)))
- (set-process-filter proc 'diff-process-filter)
- (set-process-sentinel
- proc (lambda (proc _msg)
- (with-current-buffer (process-buffer proc)
- (diff-sentinel (process-exit-status proc))
- (if old-alt (delete-file old-alt))
- (if new-alt (delete-file new-alt))))))
- ;; Async processes aren't available.
- (let ((inhibit-read-only t))
- (diff-sentinel
- (call-process shell-file-name nil buf nil
- shell-command-switch command))
- (if old-alt (delete-file old-alt))
- (if new-alt (delete-file new-alt)))))
- buf)))
-
-(unless (fboundp 'diff-file-local-copy)
- (defun diff-file-local-copy (file-or-buf)
- (if (bufferp file-or-buf)
- (with-current-buffer file-or-buf
- (let ((tempfile (make-temp-file "buffer-content-")))
- (write-region nil nil tempfile nil 'nomessage)
- tempfile))
- (file-local-copy file-or-buf))))
-
-
-;; `user-error' isn't defined in Emacs < 24.3
-(unless (fboundp 'user-error)
- (defalias 'user-error 'error)
- ;; prevent debugger being called on user errors
- (add-to-list 'debug-ignored-errors "^No further undo information")
- (add-to-list 'debug-ignored-errors "^No further redo information")
- (add-to-list 'debug-ignored-errors "^No further redo information for region"))
-
-
-
-
-
-;;; =====================================================================
-;;; Global variables and customization options
-
-(defvar buffer-undo-tree nil
- "Tree of undo entries in current buffer.")
-(put 'buffer-undo-tree 'permanent-local t)
-(make-variable-buffer-local 'buffer-undo-tree)
-
-
-(defgroup undo-tree nil
- "Tree undo/redo."
- :group 'undo)
-
-
-(defcustom undo-tree-limit 80000000
- "Value of `undo-limit' used in `undo-tree-mode'.
-
-If `undo-limit' is larger than `undo-tree-limit', the larger of
-the two values will be used.
-
-See also `undo-tree-strong-limit' and `undo-tree-outer-limit'.
-
-Setting this to nil prevents `undo-tree-mode' ever discarding
-undo history. (As far as possible. In principle, it is still
-possible for Emacs to discard undo history behind
-`undo-tree-mode's back.) USE THIS SETTING AT YOUR OWN RISK! Emacs
-may crash if undo history exceeds Emacs' available memory. This
-is particularly risky if `undo-tree-auto-save-history' is
-enabled, as in that case undo history is preserved even between
-Emacs sessions."
- :group 'undo-tree
- :type '(choice integer (const nil)))
-
-
-(defcustom undo-tree-strong-limit 120000000
- "Value of `undo-strong-limit' used in `undo-tree-mode'.
-
-If `undo-strong-limit' is larger than `undo-tree-strong-limit'
-the larger of the two values will be used."
- :group 'undo-tree
- :type 'integer)
-
-
-(defcustom undo-tree-outer-limit 360000000
- "Value of `undo-outer-limit' used in `undo-tree-mode'.
-
-If `undo-outer-limit' is larger than `undo-tree-outer-limit' the
-larger of the two values will be used."
- :group 'undo-tree
- :type 'integer)
-
-
-(defcustom undo-tree-mode-lighter " Undo-Tree"
- "Lighter displayed in mode line
-when `undo-tree-mode' is enabled."
- :group 'undo-tree
- :type 'string)
-
-
-(defcustom undo-tree-incompatible-major-modes '(term-mode)
- "List of major-modes in which `undo-tree-mode' should not be enabled.
-\(See `turn-on-undo-tree-mode'.\)"
- :group 'undo-tree
- :type '(repeat symbol))
-
-
-(defcustom undo-tree-enable-undo-in-region nil
- "When non-nil, enable undo-in-region.
-
-When undo-in-region is enabled, undoing or redoing when the
-region is active (in `transient-mark-mode') or with a prefix
-argument (not in `transient-mark-mode') only undoes changes
-within the current region."
- :group 'undo-tree
- :type 'boolean)
-
-
-(defcustom undo-tree-auto-save-history nil
- "When non-nil, `undo-tree-mode' will save undo history to file
-when a buffer is saved to file.
-
-It will automatically load undo history when a buffer is loaded
-from file, if an undo save file exists.
-
-By default, undo-tree history is saved to a file called
-\".<buffer-file-name>.~undo-tree~\" in the same directory as the
-file itself. To save under a different directory, customize
-`undo-tree-history-directory-alist' (see the documentation for
-that variable for details).
-
-WARNING! `undo-tree-auto-save-history' will not work properly in
-Emacs versions prior to 24.3, so it cannot be enabled via
-the customization interface in versions earlier than that one. To
-ignore this warning and enable it regardless, set
-`undo-tree-auto-save-history' to a non-nil value outside of
-customize."
- :group 'undo-tree
- :type (if (version-list-< (version-to-list emacs-version) '(24 3))
- '(choice (const :tag "<disabled>" nil))
- 'boolean))
-
-
-(defcustom undo-tree-history-directory-alist nil
- "Alist of filename patterns and undo history directory names.
-Each element looks like (REGEXP . DIRECTORY). Undo history for
-files with names matching REGEXP will be saved in DIRECTORY.
-DIRECTORY may be relative or absolute. If it is absolute, so
-that all matching files are backed up into the same directory,
-the file names in this directory will be the full name of the
-file backed up with all directory separators changed to `!' to
-prevent clashes. This will not work correctly if your filesystem
-truncates the resulting name.
-
-For the common case of all backups going into one directory, the
-alist should contain a single element pairing \".\" with the
-appropriate directory name.
-
-If this variable is nil, or it fails to match a filename, the
-backup is made in the original file's directory.
-
-On MS-DOS filesystems without long names this variable is always
-ignored."
- :group 'undo-tree
- :type '(repeat (cons (regexp :tag "Regexp matching filename")
- (directory :tag "Undo history directory name"))))
-
-
-
-(defcustom undo-tree-visualizer-relative-timestamps t
- "When non-nil, display times relative to current time
-when displaying time stamps in visualizer.
-
-Otherwise, display absolute times."
- :group 'undo-tree
- :type 'boolean)
-
-
-(defcustom undo-tree-visualizer-timestamps nil
- "When non-nil, display time-stamps by default
-in undo-tree visualizer.
-
-\\<undo-tree-visualizer-mode-map>You can always toggle time-stamps on and off \
-using \\[undo-tree-visualizer-toggle-timestamps], regardless of the
-setting of this variable."
- :group 'undo-tree
- :type 'boolean)
-
-
-(defcustom undo-tree-visualizer-diff nil
- "When non-nil, display diff by default in undo-tree visualizer.
-
-\\<undo-tree-visualizer-mode-map>You can always toggle the diff display \
-using \\[undo-tree-visualizer-toggle-diff], regardless of the
-setting of this variable."
- :group 'undo-tree
- :type 'boolean)
-
-
-(defcustom undo-tree-visualizer-lazy-drawing 100
- "When non-nil, use lazy undo-tree drawing in visualizer.
-
-Setting this to a number causes the visualizer to switch to lazy
-drawing when the number of nodes in the tree is larger than this
-value.
-
-Lazy drawing means that only the visible portion of the tree will
-be drawn initially, and the tree will be extended later as
-needed. For the most part, the only visible effect of this is to
-significantly speed up displaying the visualizer for very large
-trees.
-
-There is one potential negative effect of lazy drawing. Other
-branches of the tree will only be drawn once the node from which
-they branch off becomes visible. So it can happen that certain
-portions of the tree that would be shown with lazy drawing
-disabled, will not be drawn immediately when it is
-enabled. However, this effect is quite rare in practice."
- :group 'undo-tree
- :type '(choice (const :tag "never" nil)
- (const :tag "always" t)
- (integer :tag "> size")))
-
-
-(defvar undo-tree-pre-save-element-functions '()
- "Special hook to modify undo-tree elements prior to saving.
-Each function on this hook is called in turn on each undo element
-in the tree by `undo-tree-save-history' prior to writing the undo
-history to file. It should return either nil, which removes that
-undo element from the saved history, or a replacement element to
-use instead (which should be identical to the original element if
-that element should be saved unchanged).")
-
-
-(defvar undo-tree-post-load-element-functions '()
- "Special hook to modify undo-tree undo elements after loading.
-Each function on this hook is called in turn on each undo element
-in the tree by `undo-tree-load-history' after loading the undo
-history from file. It should return either nil, which removes that
-undo element from the loaded history, or a replacement element to
-use instead (which should be identical to the original element if
-that element should be loaded unchanged).")
-
-
-(defface undo-tree-visualizer-default-face
- '((((class color)) :foreground "gray"))
- "Face used to draw undo-tree in visualizer."
- :group 'undo-tree)
-
-(defface undo-tree-visualizer-current-face
- '((((class color)) :foreground "red"))
- "Face used to highlight current undo-tree node in visualizer."
- :group 'undo-tree)
-
-(defface undo-tree-visualizer-active-branch-face
- '((((class color) (background dark))
- (:foreground "white" :weight bold))
- (((class color) (background light))
- (:foreground "black" :weight bold)))
- "Face used to highlight active undo-tree branch in visualizer."
- :group 'undo-tree)
-
-(defface undo-tree-visualizer-register-face
- '((((class color)) :foreground "yellow"))
- "Face used to highlight undo-tree nodes saved to a register
-in visualizer."
- :group 'undo-tree)
-
-(defface undo-tree-visualizer-unmodified-face
- '((((class color)) :foreground "cyan"))
- "Face used to highlight nodes corresponding to unmodified buffers
-in visualizer."
- :group 'undo-tree)
-
-
-(defvar undo-tree-visualizer-parent-buffer nil
- "Parent buffer in visualizer.")
-(put 'undo-tree-visualizer-parent-buffer 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-parent-buffer)
-
-;; stores modification time of parent buffer's file, if any
-(defvar undo-tree-visualizer-parent-mtime nil)
-(put 'undo-tree-visualizer-parent-mtime 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-parent-mtime)
-
-;; stores current horizontal spacing needed for drawing undo-tree
-(defvar undo-tree-visualizer-spacing nil)
-(put 'undo-tree-visualizer-spacing 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-spacing)
-
-;; calculate horizontal spacing required for drawing tree with current
-;; settings
-(defsubst undo-tree-visualizer-calculate-spacing ()
- (if undo-tree-visualizer-timestamps
- (if undo-tree-visualizer-relative-timestamps 9 13)
- 3))
-
-;; holds node that was current when visualizer was invoked
-(defvar undo-tree-visualizer-initial-node nil)
-(put 'undo-tree-visualizer-initial-node 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-initial-node)
-
-;; holds currently selected node in visualizer selection mode
-(defvar undo-tree-visualizer-selected-node nil)
-(put 'undo-tree-visualizer-selected-node 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-selected)
-
-;; used to store nodes at edge of currently drawn portion of tree
-(defvar undo-tree-visualizer-needs-extending-down nil)
-(put 'undo-tree-visualizer-needs-extending-down 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-needs-extending-down)
-(defvar undo-tree-visualizer-needs-extending-up nil)
-(put 'undo-tree-visualizer-needs-extending-up 'permanent-local t)
-(make-variable-buffer-local 'undo-tree-visualizer-needs-extending-up)
-
-;; dynamically bound to t when undoing from visualizer, to inhibit
-;; `undo-tree-kill-visualizer' hook function in parent buffer
-(defvar undo-tree-inhibit-kill-visualizer nil)
-
-;; can be let-bound to a face name, used in drawing functions
-(defvar undo-tree-insert-face nil)
-
-;; visualizer buffer names
-(defconst undo-tree-visualizer-buffer-name " *undo-tree*")
-(defconst undo-tree-diff-buffer-name "*undo-tree Diff*")
-
-
-
-
-;;; =================================================================
-;;; Default keymaps
-
-(defvar undo-tree-map nil
- "Keymap used in undo-tree-mode.")
-
-(unless undo-tree-map
- (let ((map (make-sparse-keymap)))
- ;; remap `undo' and `undo-only' to `undo-tree-undo'
- (define-key map [remap undo] 'undo-tree-undo)
- (define-key map [remap undo-only] 'undo-tree-undo)
- ;; bind standard undo bindings (since these match redo counterparts)
- (define-key map (kbd "C-/") 'undo-tree-undo)
- (define-key map "\C-_" 'undo-tree-undo)
- ;; redo doesn't exist normally, so define our own keybindings
- (define-key map (kbd "C-?") 'undo-tree-redo)
- (define-key map (kbd "M-_") 'undo-tree-redo)
- ;; just in case something has defined `redo'...
- (define-key map [remap redo] 'undo-tree-redo)
- ;; we use "C-x u" for the undo-tree visualizer
- (define-key map (kbd "\C-x u") 'undo-tree-visualize)
- ;; bind register commands
- (define-key map (kbd "C-x r u") 'undo-tree-save-state-to-register)
- (define-key map (kbd "C-x r U") 'undo-tree-restore-state-from-register)
- ;; set keymap
- (setq undo-tree-map map)))
-
-
-(defvar undo-tree-visualizer-mode-map nil
- "Keymap used in undo-tree visualizer.")
-
-(unless undo-tree-visualizer-mode-map
- (let ((map (make-sparse-keymap)))
- ;; vertical motion keys undo/redo
- (define-key map [remap previous-line] 'undo-tree-visualize-undo)
- (define-key map [remap next-line] 'undo-tree-visualize-redo)
- (define-key map [up] 'undo-tree-visualize-undo)
- (define-key map "p" 'undo-tree-visualize-undo)
- (define-key map "\C-p" 'undo-tree-visualize-undo)
- (define-key map [down] 'undo-tree-visualize-redo)
- (define-key map "n" 'undo-tree-visualize-redo)
- (define-key map "\C-n" 'undo-tree-visualize-redo)
- ;; horizontal motion keys switch branch
- (define-key map [remap forward-char]
- 'undo-tree-visualize-switch-branch-right)
- (define-key map [remap backward-char]
- 'undo-tree-visualize-switch-branch-left)
- (define-key map [right] 'undo-tree-visualize-switch-branch-right)
- (define-key map "f" 'undo-tree-visualize-switch-branch-right)
- (define-key map "\C-f" 'undo-tree-visualize-switch-branch-right)
- (define-key map [left] 'undo-tree-visualize-switch-branch-left)
- (define-key map "b" 'undo-tree-visualize-switch-branch-left)
- (define-key map "\C-b" 'undo-tree-visualize-switch-branch-left)
- ;; paragraph motion keys undo/redo to significant points in tree
- (define-key map [remap backward-paragraph] 'undo-tree-visualize-undo-to-x)
- (define-key map [remap forward-paragraph] 'undo-tree-visualize-redo-to-x)
- (define-key map "\M-{" 'undo-tree-visualize-undo-to-x)
- (define-key map "\M-}" 'undo-tree-visualize-redo-to-x)
- (define-key map [C-up] 'undo-tree-visualize-undo-to-x)
- (define-key map [C-down] 'undo-tree-visualize-redo-to-x)
- ;; mouse sets buffer state to node at click
- (define-key map [mouse-1] 'undo-tree-visualizer-mouse-set)
- ;; toggle timestamps
- (define-key map "t" 'undo-tree-visualizer-toggle-timestamps)
- ;; toggle diff
- (define-key map "d" 'undo-tree-visualizer-toggle-diff)
- ;; toggle selection mode
- (define-key map "s" 'undo-tree-visualizer-selection-mode)
- ;; horizontal scrolling may be needed if the tree is very wide
- (define-key map "," 'undo-tree-visualizer-scroll-left)
- (define-key map "." 'undo-tree-visualizer-scroll-right)
- (define-key map "<" 'undo-tree-visualizer-scroll-left)
- (define-key map ">" 'undo-tree-visualizer-scroll-right)
- ;; vertical scrolling may be needed if the tree is very tall
- (define-key map [next] 'undo-tree-visualizer-scroll-up)
- (define-key map [prior] 'undo-tree-visualizer-scroll-down)
- ;; quit/abort visualizer
- (define-key map "q" 'undo-tree-visualizer-quit)
- (define-key map "\C-q" 'undo-tree-visualizer-abort)
- ;; set keymap
- (setq undo-tree-visualizer-mode-map map)))
-
-
-(defvar undo-tree-visualizer-selection-mode-map nil
- "Keymap used in undo-tree visualizer selection mode.")
-
-(unless undo-tree-visualizer-selection-mode-map
- (let ((map (make-sparse-keymap)))
- ;; vertical motion keys move up and down tree
- (define-key map [remap previous-line]
- 'undo-tree-visualizer-select-previous)
- (define-key map [remap next-line]
- 'undo-tree-visualizer-select-next)
- (define-key map [up] 'undo-tree-visualizer-select-previous)
- (define-key map "p" 'undo-tree-visualizer-select-previous)
- (define-key map "\C-p" 'undo-tree-visualizer-select-previous)
- (define-key map [down] 'undo-tree-visualizer-select-next)
- (define-key map "n" 'undo-tree-visualizer-select-next)
- (define-key map "\C-n" 'undo-tree-visualizer-select-next)
- ;; vertical scroll keys move up and down quickly
- (define-key map [next]
- (lambda () (interactive) (undo-tree-visualizer-select-next 10)))
- (define-key map [prior]
- (lambda () (interactive) (undo-tree-visualizer-select-previous 10)))
- ;; horizontal motion keys move to left and right siblings
- (define-key map [remap forward-char] 'undo-tree-visualizer-select-right)
- (define-key map [remap backward-char] 'undo-tree-visualizer-select-left)
- (define-key map [right] 'undo-tree-visualizer-select-right)
- (define-key map "f" 'undo-tree-visualizer-select-right)
- (define-key map "\C-f" 'undo-tree-visualizer-select-right)
- (define-key map [left] 'undo-tree-visualizer-select-left)
- (define-key map "b" 'undo-tree-visualizer-select-left)
- (define-key map "\C-b" 'undo-tree-visualizer-select-left)
- ;; horizontal scroll keys move left or right quickly
- (define-key map ","
- (lambda () (interactive) (undo-tree-visualizer-select-left 10)))
- (define-key map "."
- (lambda () (interactive) (undo-tree-visualizer-select-right 10)))
- (define-key map "<"
- (lambda () (interactive) (undo-tree-visualizer-select-left 10)))
- (define-key map ">"
- (lambda () (interactive) (undo-tree-visualizer-select-right 10)))
- ;; <enter> sets buffer state to node at point
- (define-key map "\r" 'undo-tree-visualizer-set)
- ;; mouse selects node at click
- (define-key map [mouse-1] 'undo-tree-visualizer-mouse-select)
- ;; toggle diff
- (define-key map "d" 'undo-tree-visualizer-selection-toggle-diff)
- ;; set keymap
- (setq undo-tree-visualizer-selection-mode-map map)))
-
-
-
-
-;;; =====================================================================
-;;; Undo-tree data structure
-
-(cl-defstruct
- (undo-tree
- :named
- (:constructor nil)
- (:constructor make-undo-tree
- (&aux
- (root (undo-tree-make-node nil nil))
- (current root)
- (size 0)
- (count 0)
- (object-pool (make-hash-table :test 'eq :weakness 'value))))
- (:copier nil))
- root current size count object-pool)
-
-(defun undo-tree-copy (tree)
- ;; Return a copy of undo-tree TREE.
- (unwind-protect
- (let ((new (make-undo-tree)))
- (undo-tree-decircle tree)
- (let ((max-lisp-eval-depth (* 100 (undo-tree-count tree)))
- (max-specpdl-size (* 100 (undo-tree-count tree))))
- (setf (undo-tree-root new)
- (undo-tree-node-copy (undo-tree-root tree)
- new (undo-tree-current tree))))
- (setf (undo-tree-size new)
- (undo-tree-size tree))
- (setf (undo-tree-count new)
- (undo-tree-count tree))
- (setf (undo-tree-object-pool new)
- (copy-hash-table (undo-tree-object-pool tree)))
- (undo-tree-recircle new)
- new)
- (undo-tree-recircle tree)))
-
-
-(cl-defstruct
- (undo-tree-node
- (:type vector) ; create unnamed struct
- (:constructor nil)
- (:constructor undo-tree-make-node
- (previous undo
- &optional redo
- &aux
- (timestamp (current-time))
- (branch 0)))
- (:constructor undo-tree-make-node-backwards
- (next-node undo
- &optional redo
- &aux
- (next (list next-node))
- (timestamp (current-time))
- (branch 0)))
- (:constructor undo-tree-make-empty-node ())
- (:copier nil))
- previous next undo redo timestamp branch meta-data)
-
-
-(defmacro undo-tree-node-p (n)
- (let ((len (length (undo-tree-make-node nil nil))))
- `(and (vectorp ,n) (= (length ,n) ,len))))
-
-(defun undo-tree-node-copy (node &optional tree current)
- ;; Return a copy of undo-tree NODE, sans previous link or meta-data.
- ;; If TREE and CURRENT are supplied, set (undo-tree-current TREE) to the
- ;; copy of CURRENT node, if found.
- (let* ((new (undo-tree-make-empty-node))
- (stack (list (cons node new)))
- n)
- (while (setq n (pop stack))
- (setf (undo-tree-node-undo (cdr n))
- (copy-tree (undo-tree-node-undo (car n)) 'copy-vectors))
- (setf (undo-tree-node-redo (cdr n))
- (copy-tree (undo-tree-node-redo (car n)) 'copy-vectors))
- (setf (undo-tree-node-timestamp (cdr n))
- (copy-sequence (undo-tree-node-timestamp (car n))))
- (setf (undo-tree-node-branch (cdr n))
- (undo-tree-node-branch (car n)))
- (setf (undo-tree-node-next (cdr n))
- (mapcar (lambda (_) (undo-tree-make-empty-node))
- (make-list (length (undo-tree-node-next (car n))) nil)))
- ;; set (undo-tree-current TREE) to copy if we've found CURRENT
- (when (and tree (eq (car n) current))
- (setf (undo-tree-current tree) (cdr n)))
- ;; recursively copy next nodes
- (let ((next0 (undo-tree-node-next (car n)))
- (next1 (undo-tree-node-next (cdr n))))
- (while (and next0 next1)
- (push (cons (pop next0) (pop next1)) stack))))
- new))
-
-
-(cl-defstruct
- (undo-tree-region-data
- (:type vector) ; create unnamed struct
- (:constructor nil)
- (:constructor undo-tree-make-region-data
- (&optional undo-beginning undo-end
- redo-beginning redo-end))
- (:constructor undo-tree-make-undo-region-data
- (undo-beginning undo-end))
- (:constructor undo-tree-make-redo-region-data
- (redo-beginning redo-end))
- (:copier nil))
- undo-beginning undo-end redo-beginning redo-end)
-
-
-(defmacro undo-tree-region-data-p (r)
- (let ((len (length (undo-tree-make-region-data))))
- `(and (vectorp ,r) (= (length ,r) ,len))))
-
-(defmacro undo-tree-node-clear-region-data (node)
- `(setf (undo-tree-node-meta-data ,node)
- (delq nil
- (delq :region
- (plist-put (undo-tree-node-meta-data ,node)
- :region nil)))))
-
-
-(defmacro undo-tree-node-undo-beginning (node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (when (undo-tree-region-data-p r)
- (undo-tree-region-data-undo-beginning r))))
-
-(defmacro undo-tree-node-undo-end (node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (when (undo-tree-region-data-p r)
- (undo-tree-region-data-undo-end r))))
-
-(defmacro undo-tree-node-redo-beginning (node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (when (undo-tree-region-data-p r)
- (undo-tree-region-data-redo-beginning r))))
-
-(defmacro undo-tree-node-redo-end (node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (when (undo-tree-region-data-p r)
- (undo-tree-region-data-redo-end r))))
-
-
-(gv-define-setter undo-tree-node-undo-beginning (val node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (unless (undo-tree-region-data-p r)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :region
- (setq r (undo-tree-make-region-data)))))
- (setf (undo-tree-region-data-undo-beginning r) ,val)))
-
-(gv-define-setter undo-tree-node-undo-end (val node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (unless (undo-tree-region-data-p r)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :region
- (setq r (undo-tree-make-region-data)))))
- (setf (undo-tree-region-data-undo-end r) ,val)))
-
-(gv-define-setter undo-tree-node-redo-beginning (val node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (unless (undo-tree-region-data-p r)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :region
- (setq r (undo-tree-make-region-data)))))
- (setf (undo-tree-region-data-redo-beginning r) ,val)))
-
-(gv-define-setter undo-tree-node-redo-end (val node)
- `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
- (unless (undo-tree-region-data-p r)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :region
- (setq r (undo-tree-make-region-data)))))
- (setf (undo-tree-region-data-redo-end r) ,val)))
-
-
-
-(cl-defstruct
- (undo-tree-visualizer-data
- (:type vector) ; create unnamed struct
- (:constructor nil)
- (:constructor undo-tree-make-visualizer-data
- (&optional lwidth cwidth rwidth marker))
- (:copier nil))
- lwidth cwidth rwidth marker)
-
-
-(defmacro undo-tree-visualizer-data-p (v)
- (let ((len (length (undo-tree-make-visualizer-data))))
- `(and (vectorp ,v) (= (length ,v) ,len))))
-
-(defun undo-tree-node-clear-visualizer-data (node)
- (let ((plist (undo-tree-node-meta-data node)))
- (if (eq (car plist) :visualizer)
- (setf (undo-tree-node-meta-data node) (nthcdr 2 plist))
- (while (and plist (not (eq (cadr plist) :visualizer)))
- (setq plist (cdr plist)))
- (if plist (setcdr plist (nthcdr 3 plist))))))
-
-(defmacro undo-tree-node-lwidth (node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (when (undo-tree-visualizer-data-p v)
- (undo-tree-visualizer-data-lwidth v))))
-
-(defmacro undo-tree-node-cwidth (node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (when (undo-tree-visualizer-data-p v)
- (undo-tree-visualizer-data-cwidth v))))
-
-(defmacro undo-tree-node-rwidth (node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (when (undo-tree-visualizer-data-p v)
- (undo-tree-visualizer-data-rwidth v))))
-
-(defmacro undo-tree-node-marker (node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (when (undo-tree-visualizer-data-p v)
- (undo-tree-visualizer-data-marker v))))
-
-
-(gv-define-setter undo-tree-node-lwidth (val node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (unless (undo-tree-visualizer-data-p v)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :visualizer
- (setq v (undo-tree-make-visualizer-data)))))
- (setf (undo-tree-visualizer-data-lwidth v) ,val)))
-
-(gv-define-setter undo-tree-node-cwidth (val node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (unless (undo-tree-visualizer-data-p v)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :visualizer
- (setq v (undo-tree-make-visualizer-data)))))
- (setf (undo-tree-visualizer-data-cwidth v) ,val)))
-
-(gv-define-setter undo-tree-node-rwidth (val node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (unless (undo-tree-visualizer-data-p v)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :visualizer
- (setq v (undo-tree-make-visualizer-data)))))
- (setf (undo-tree-visualizer-data-rwidth v) ,val)))
-
-(gv-define-setter undo-tree-node-marker (val node)
- `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
- (unless (undo-tree-visualizer-data-p v)
- (setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :visualizer
- (setq v (undo-tree-make-visualizer-data)))))
- (setf (undo-tree-visualizer-data-marker v) ,val)))
-
-
-
-(cl-defstruct
- (undo-tree-register-data
- (:type vector)
- (:constructor nil)
- (:constructor undo-tree-make-register-data (buffer node)))
- buffer node)
-
-(defun undo-tree-register-data-p (data)
- (and (vectorp data)
- (= (length data) 2)
- (undo-tree-node-p (undo-tree-register-data-node data))))
-
-(defun undo-tree-register-data-print-func (data)
- (princ (format "an undo-tree state for buffer %s"
- (undo-tree-register-data-buffer data))))
-
-(defmacro undo-tree-node-register (node)
- `(plist-get (undo-tree-node-meta-data ,node) :register))
-
-(gv-define-setter undo-tree-node-register (val node)
- `(setf (undo-tree-node-meta-data ,node)
- (plist-put (undo-tree-node-meta-data ,node) :register ,val)))
-
-
-
-
-;;; =====================================================================
-;;; Basic undo-tree data structure functions
-
-(defun undo-tree-grow (undo)
- "Add an UNDO node to current branch of `buffer-undo-tree'."
- (let* ((current (undo-tree-current buffer-undo-tree))
- (new (undo-tree-make-node current undo)))
- (push new (undo-tree-node-next current))
- (setf (undo-tree-current buffer-undo-tree) new)))
-
-
-(defun undo-tree-grow-backwards (node undo &optional redo)
- "Add new node *above* undo-tree NODE, and return new node.
-Note that this will overwrite NODE's \"previous\" link, so should
-only be used on a detached NODE, never on nodes that are already
-part of `buffer-undo-tree'."
- (let ((new (undo-tree-make-node-backwards node undo redo)))
- (setf (undo-tree-node-previous node) new)
- new))
-
-
-(defun undo-tree-splice-node (node splice)
- "Splice NODE into undo tree, below node SPLICE.
-Note that this will overwrite NODE's \"next\" and \"previous\"
-links, so should only be used on a detached NODE, never on nodes
-that are already part of `buffer-undo-tree'."
- (setf (undo-tree-node-next node) (undo-tree-node-next splice)
- (undo-tree-node-branch node) (undo-tree-node-branch splice)
- (undo-tree-node-previous node) splice
- (undo-tree-node-next splice) (list node)
- (undo-tree-node-branch splice) 0)
- (dolist (n (undo-tree-node-next node))
- (setf (undo-tree-node-previous n) node)))
-
-
-(defun undo-tree-snip-node (node)
- "Snip NODE out of undo tree."
- (let* ((parent (undo-tree-node-previous node))
- position p)
- ;; if NODE is only child, replace parent's next links with NODE's
- (if (= (length (undo-tree-node-next parent)) 0)
- (setf (undo-tree-node-next parent) (undo-tree-node-next node)
- (undo-tree-node-branch parent) (undo-tree-node-branch node))
- ;; otherwise...
- (setq position (undo-tree-position node (undo-tree-node-next parent)))
- (cond
- ;; if active branch used do go via NODE, set parent's branch to active
- ;; branch of NODE
- ((= (undo-tree-node-branch parent) position)
- (setf (undo-tree-node-branch parent)
- (+ position (undo-tree-node-branch node))))
- ;; if active branch didn't go via NODE, update parent's branch to point
- ;; to same node as before
- ((> (undo-tree-node-branch parent) position)
- (cl-incf (undo-tree-node-branch parent)
- (1- (length (undo-tree-node-next node))))))
- ;; replace NODE in parent's next list with NODE's entire next list
- (if (= position 0)
- (setf (undo-tree-node-next parent)
- (nconc (undo-tree-node-next node)
- (cdr (undo-tree-node-next parent))))
- (setq p (nthcdr (1- position) (undo-tree-node-next parent)))
- (setcdr p (nconc (undo-tree-node-next node) (cddr p)))))
- ;; update previous links of NODE's children
- (dolist (n (undo-tree-node-next node))
- (setf (undo-tree-node-previous n) parent))))
-
-
-(defun undo-tree-mapc (--undo-tree-mapc-function-- node)
- ;; Apply FUNCTION to NODE and to each node below it.
- (let ((stack (list node))
- n)
- (while (setq n (pop stack))
- (funcall --undo-tree-mapc-function-- n)
- (setq stack (append (undo-tree-node-next n) stack)))))
-
-
-(defmacro undo-tree-num-branches ()
- "Return number of branches at current undo tree node."
- '(length (undo-tree-node-next (undo-tree-current buffer-undo-tree))))
-
-
-(defun undo-tree-position (node list)
- "Find the first occurrence of NODE in LIST.
-Return the index of the matching item, or nil of not found.
-Comparison is done with `eq'."
- (let ((i 0))
- (catch 'found
- (while (progn
- (when (eq node (car list)) (throw 'found i))
- (cl-incf i)
- (setq list (cdr list))))
- nil)))
-
-
-(defvar *undo-tree-id-counter* 0)
-(make-variable-buffer-local '*undo-tree-id-counter*)
-
-(defmacro undo-tree-generate-id ()
- ;; Generate a new, unique id (uninterned symbol).
- ;; The name is made by appending a number to "undo-tree-id".
- ;; (Copied from CL package `gensym'.)
- `(let ((num (prog1 *undo-tree-id-counter*
- (cl-incf *undo-tree-id-counter*))))
- (make-symbol (format "undo-tree-id%d" num))))
-
-
-(defun undo-tree-decircle (undo-tree)
- ;; Nullify PREVIOUS links of UNDO-TREE nodes, to make UNDO-TREE data
- ;; structure non-circular.
- (undo-tree-mapc
- (lambda (node)
- (dolist (n (undo-tree-node-next node))
- (setf (undo-tree-node-previous n) nil)))
- (undo-tree-root undo-tree)))
-
-
-(defun undo-tree-recircle (undo-tree)
- ;; Recreate PREVIOUS links of UNDO-TREE nodes, to restore circular UNDO-TREE
- ;; data structure.
- (undo-tree-mapc
- (lambda (node)
- (dolist (n (undo-tree-node-next node))
- (setf (undo-tree-node-previous n) node)))
- (undo-tree-root undo-tree)))
-
-
-
-
-;;; =====================================================================
-;;; Undo list and undo changeset utility functions
-
-(defmacro undo-list-marker-elt-p (elt)
- `(markerp (car-safe ,elt)))
-
-(defmacro undo-list-GCd-marker-elt-p (elt)
- ;; Return t if ELT is a marker element whose marker has been moved to the
- ;; object-pool, so may potentially have been garbage-collected.
- ;; Note: Valid marker undo elements should be uniquely identified as cons
- ;; cells with a symbol in the car (replacing the marker), and a number in
- ;; the cdr. However, to guard against future changes to undo element
- ;; formats, we perform an additional redundant check on the symbol name.
- `(and (car-safe ,elt)
- (symbolp (car ,elt))
- (let ((str (symbol-name (car ,elt))))
- (and (> (length str) 12)
- (string= (substring str 0 12) "undo-tree-id")))
- (numberp (cdr-safe ,elt))))
-
-
-(defun undo-tree-move-GC-elts-to-pool (elt)
- ;; Move elements that can be garbage-collected into `buffer-undo-tree'
- ;; object pool, substituting a unique id that can be used to retrieve them
- ;; later. (Only markers require this treatment currently.)
- (when (undo-list-marker-elt-p elt)
- (let ((id (undo-tree-generate-id)))
- (puthash id (car elt) (undo-tree-object-pool buffer-undo-tree))
- (setcar elt id))))
-
-
-(defun undo-tree-restore-GC-elts-from-pool (elt)
- ;; Replace object id's in ELT with corresponding objects from
- ;; `buffer-undo-tree' object pool and return modified ELT, or return nil if
- ;; any object in ELT has been garbage-collected.
- (if (undo-list-GCd-marker-elt-p elt)
- (when (setcar elt (gethash (car elt)
- (undo-tree-object-pool buffer-undo-tree)))
- elt)
- elt))
-
-
-(defun undo-list-clean-GCd-elts (undo-list)
- ;; Remove object id's from UNDO-LIST that refer to elements that have been
- ;; garbage-collected. UNDO-LIST is modified by side-effect.
- (while (undo-list-GCd-marker-elt-p (car undo-list))
- (unless (gethash (caar undo-list)
- (undo-tree-object-pool buffer-undo-tree))
- (setq undo-list (cdr undo-list))))
- (let ((p undo-list))
- (while (cdr p)
- (when (and (undo-list-GCd-marker-elt-p (cadr p))
- (null (gethash (car (cadr p))
- (undo-tree-object-pool buffer-undo-tree))))
- (setcdr p (cddr p)))
- (setq p (cdr p))))
- undo-list)
-
-
-(defun undo-list-found-canary-p (undo-list)
- (or (eq (car undo-list) 'undo-tree-canary)
- (and (null (car undo-list))
- (eq (cadr undo-list) 'undo-tree-canary))))
-
-
-(defmacro undo-list-pop-changeset (undo-list &optional discard-pos)
- ;; Pop changeset from `undo-list'. If DISCARD-POS is non-nil, discard
- ;; any position entries from changeset.
- `(when (and ,undo-list (not (undo-list-found-canary-p ,undo-list)))
- (let (changeset)
- ;; discard initial undo boundary(ies)
- (while (null (car ,undo-list)) (setq ,undo-list (cdr ,undo-list)))
- ;; pop elements up to next undo boundary, discarding position entries
- ;; if DISCARD-POS is non-nil
- (while (null changeset)
- (while (and ,undo-list (car ,undo-list)
- (not (undo-list-found-canary-p ,undo-list)))
- (if (and ,discard-pos (integerp (car ,undo-list)))
- (setq ,undo-list (cdr ,undo-list))
- (push (pop ,undo-list) changeset)
- (undo-tree-move-GC-elts-to-pool (car changeset)))))
- (nreverse changeset))))
-
-
-(defun undo-tree-copy-list (undo-list)
- ;; Return a deep copy of first changeset in `undo-list'. Object id's are
- ;; replaced by corresponding objects from `buffer-undo-tree' object-pool.
- (let (copy p)
- ;; if first element contains an object id, replace it with object from
- ;; pool, discarding element entirely if it's been GC'd
- (while (and undo-list (null copy))
- (setq copy
- (undo-tree-restore-GC-elts-from-pool (pop undo-list))))
- (when copy
- (setq copy (list copy)
- p copy)
- ;; copy remaining elements, replacing object id's with objects from
- ;; pool, or discarding them entirely if they've been GC'd
- (while undo-list
- (when (setcdr p (undo-tree-restore-GC-elts-from-pool
- (undo-copy-list-1 (pop undo-list))))
- (setcdr p (list (cdr p)))
- (setq p (cdr p))))
- copy)))
-
-
-(defvar undo-tree-gc-flag nil)
-
-(defun undo-tree-post-gc ()
- (setq undo-tree-gc-flag t))
-
-
-(defun undo-list-transfer-to-tree ()
- ;; Transfer entries accumulated in `undo-list' to `buffer-undo-tree'.
-
- ;; `undo-list-transfer-to-tree' should never be called when undo is disabled
- ;; (i.e. `buffer-undo-tree' is t)
- (cl-assert (not (eq buffer-undo-tree t)))
-
- ;; if `buffer-undo-tree' is empty, create initial undo-tree
- (when (null buffer-undo-tree) (setq buffer-undo-tree (make-undo-tree)))
-
- ;; garbage-collect then repeatedly try to deep-copy `buffer-undo-list' until
- ;; we succeed without GC running, in an attempt to mitigate race conditions
- ;; with garbage collector corrupting undo history (is this even a thing?!)
- (unless (or (null buffer-undo-list)
- (undo-list-found-canary-p buffer-undo-list))
- (garbage-collect))
- (let (undo-list changeset)
- (setq undo-tree-gc-flag t)
- (while undo-tree-gc-flag
- (setq undo-tree-gc-flag nil
- undo-list (copy-tree buffer-undo-list)))
- (setq buffer-undo-list '(nil undo-tree-canary))
-
- ;; create new node from first changeset in `undo-list', save old
- ;; `buffer-undo-tree' current node, and make new node the current node
- (when (setq changeset (undo-list-pop-changeset undo-list))
- (let* ((node (undo-tree-make-node nil changeset))
- (splice (undo-tree-current buffer-undo-tree))
- (size (undo-list-byte-size (undo-tree-node-undo node)))
- (count 1))
- (setf (undo-tree-current buffer-undo-tree) node)
- ;; grow tree fragment backwards using `undo-list' changesets
- (while (setq changeset (undo-list-pop-changeset undo-list))
- (setq node (undo-tree-grow-backwards node changeset))
- (cl-incf size (undo-list-byte-size (undo-tree-node-undo node)))
- (cl-incf count))
-
- ;; if no undo history has been discarded from `undo-list' since last
- ;; transfer, splice new tree fragment onto end of old
- ;; `buffer-undo-tree' current node
- (if (undo-list-found-canary-p undo-list)
- (progn
- (setf (undo-tree-node-previous node) splice)
- (push node (undo-tree-node-next splice))
- (setf (undo-tree-node-branch splice) 0)
- (cl-incf (undo-tree-size buffer-undo-tree) size)
- (cl-incf (undo-tree-count buffer-undo-tree) count))
-
- ;; if undo history has been discarded, replace entire
- ;; `buffer-undo-tree' with new tree fragment
- (unless (= (undo-tree-size buffer-undo-tree) 0)
- (message "Undo history discarded by Emacs (see `undo-limit') - rebuilding undo-tree"))
- (setq node (undo-tree-grow-backwards node nil))
- (setf (undo-tree-root buffer-undo-tree) node)
- (setf (undo-tree-size buffer-undo-tree) size)
- (setf (undo-tree-count buffer-undo-tree) count)
- (setq undo-list '(nil undo-tree-canary))))))
-
- ;; discard undo history if necessary
- (undo-tree-discard-history))
-
-
-(defun undo-list-byte-size (undo-list)
- ;; Return size (in bytes) of UNDO-LIST
- (let ((size 0))
- (dolist (elt undo-list)
- (cl-incf size 8) ; cons cells use up 8 bytes
- (when (stringp (car-safe elt))
- (cl-incf size (string-bytes (car elt)))))
- size))
-
-
-
-(defun undo-list-rebuild-from-tree ()
- "Rebuild `buffer-undo-list' from information in `buffer-undo-tree'."
- (unless (eq buffer-undo-list t)
- (undo-list-transfer-to-tree)
- (setq buffer-undo-list nil)
- (when buffer-undo-tree
- (let ((stack (list (list (undo-tree-root buffer-undo-tree)))))
- (push (sort (mapcar 'identity (undo-tree-node-next (caar stack)))
- (lambda (a b)
- (time-less-p (undo-tree-node-timestamp a)
- (undo-tree-node-timestamp b))))
- stack)
- ;; Traverse tree in depth-and-oldest-first order, but add undo records
- ;; on the way down, and redo records on the way up.
- (while (or (car stack)
- (not (eq (car (nth 1 stack))
- (undo-tree-current buffer-undo-tree))))
- (if (car stack)
- (progn
- (setq buffer-undo-list
- (append (undo-tree-node-undo (caar stack))
- buffer-undo-list))
- (undo-boundary)
- (push (sort (mapcar 'identity
- (undo-tree-node-next (caar stack)))
- (lambda (a b)
- (time-less-p (undo-tree-node-timestamp a)
- (undo-tree-node-timestamp b))))
- stack))
- (pop stack)
- (setq buffer-undo-list
- (append (undo-tree-node-redo (caar stack))
- buffer-undo-list))
- (undo-boundary)
- (pop (car stack))))))))
-
-
-
-
-;;; =====================================================================
-;;; History discarding utility functions
-
-(defun undo-tree-oldest-leaf (node)
- ;; Return oldest leaf node below NODE.
- (while (undo-tree-node-next node)
- (setq node
- (car (sort (mapcar 'identity (undo-tree-node-next node))
- (lambda (a b)
- (time-less-p (undo-tree-node-timestamp a)
- (undo-tree-node-timestamp b)))))))
- node)
-
-
-(defun undo-tree-discard-node (node)
- ;; Discard NODE from `buffer-undo-tree', and return next in line for
- ;; discarding.
-
- ;; don't discard current node
- (unless (eq node (undo-tree-current buffer-undo-tree))
-
- ;; discarding root node...
- (if (eq node (undo-tree-root buffer-undo-tree))
- (cond
- ;; should always discard branches before root
- ((> (length (undo-tree-node-next node)) 1)
- (error "Trying to discard undo-tree root which still\
- has multiple branches"))
- ;; don't discard root if current node is only child
- ((eq (car (undo-tree-node-next node))
- (undo-tree-current buffer-undo-tree))
- nil)
- ;; discard root
- (t
- ;; clear any register referring to root
- (let ((r (undo-tree-node-register node)))
- (when (and r (eq (get-register r) node))
- (set-register r nil)))
- ;; make child of root into new root
- (setq node (setf (undo-tree-root buffer-undo-tree)
- (car (undo-tree-node-next node))))
- ;; update undo-tree size
- (cl-decf (undo-tree-size buffer-undo-tree)
- (+ (undo-list-byte-size (undo-tree-node-undo node))
- (undo-list-byte-size (undo-tree-node-redo node))))
- (cl-decf (undo-tree-count buffer-undo-tree))
- ;; discard new root's undo data and PREVIOUS link
- (setf (undo-tree-node-undo node) nil
- (undo-tree-node-redo node) nil
- (undo-tree-node-previous node) nil)
- ;; if new root has branches, or new root is current node, next node
- ;; to discard is oldest leaf, otherwise it's new root
- (if (or (> (length (undo-tree-node-next node)) 1)
- (eq (car (undo-tree-node-next node))
- (undo-tree-current buffer-undo-tree)))
- (undo-tree-oldest-leaf node)
- node)))
-
- ;; discarding leaf node...
- (let* ((parent (undo-tree-node-previous node))
- (current (nth (undo-tree-node-branch parent)
- (undo-tree-node-next parent))))
- ;; clear any register referring to the discarded node
- (let ((r (undo-tree-node-register node)))
- (when (and r (eq (get-register r) node))
- (set-register r nil)))
- ;; update undo-tree size
- (cl-decf (undo-tree-size buffer-undo-tree)
- (+ (undo-list-byte-size (undo-tree-node-undo node))
- (undo-list-byte-size (undo-tree-node-redo node))))
- (cl-decf (undo-tree-count buffer-undo-tree))
- ;; discard leaf
- (setf (undo-tree-node-next parent)
- (delq node (undo-tree-node-next parent))
- (undo-tree-node-branch parent)
- (undo-tree-position current (undo-tree-node-next parent)))
- ;; if parent has branches, or parent is current node, next node to
- ;; discard is oldest leaf, otherwise it's the parent itself
- (if (or (eq parent (undo-tree-current buffer-undo-tree))
- (and (undo-tree-node-next parent)
- (or (not (eq parent (undo-tree-root buffer-undo-tree)))
- (> (length (undo-tree-node-next parent)) 1))))
- (undo-tree-oldest-leaf parent)
- parent)))))
-
-
-
-(defun undo-tree-discard-history ()
- "Discard undo history until we're within memory usage limits
-set by `undo-limit', `undo-strong-limit' and `undo-outer-limit'."
-
- (when (> (undo-tree-size buffer-undo-tree) undo-limit)
- ;; if there are no branches off root, first node to discard is root;
- ;; otherwise it's leaf node at botom of oldest branch
- (let ((node (if (> (length (undo-tree-node-next
- (undo-tree-root buffer-undo-tree))) 1)
- (undo-tree-oldest-leaf (undo-tree-root buffer-undo-tree))
- (undo-tree-root buffer-undo-tree)))
- discarded)
-
- ;; discard nodes until memory use is within `undo-strong-limit'
- (while (and node
- (> (undo-tree-size buffer-undo-tree) undo-strong-limit))
- (setq node (undo-tree-discard-node node)
- discarded t))
-
- ;; discard nodes until next node to discard would bring memory use
- ;; within `undo-limit'
- (while (and node
- ;; check first if last discard has brought us within
- ;; `undo-limit', in case we can avoid more expensive
- ;; `undo-strong-limit' calculation
- ;; Note: this assumes undo-strong-limit > undo-limit;
- ;; if not, effectively undo-strong-limit = undo-limit
- (> (undo-tree-size buffer-undo-tree) undo-limit)
- (> (- (undo-tree-size buffer-undo-tree)
- ;; if next node to discard is root, the memory we
- ;; free-up comes from discarding changesets from its
- ;; only child...
- (if (eq node (undo-tree-root buffer-undo-tree))
- (+ (undo-list-byte-size
- (undo-tree-node-undo
- (car (undo-tree-node-next node))))
- (undo-list-byte-size
- (undo-tree-node-redo
- (car (undo-tree-node-next node)))))
- ;; ...otherwise, it comes from discarding changesets
- ;; from along with the node itself
- (+ (undo-list-byte-size (undo-tree-node-undo node))
- (undo-list-byte-size (undo-tree-node-redo node)))
- ))
- undo-limit))
- (setq node (undo-tree-discard-node node)
- discarded t))
-
- (when discarded
- (message "Undo history discarded by undo-tree (see `undo-tree-limit')"))
-
- ;; if we're still over the `undo-outer-limit', discard entire history
- (when (and undo-outer-limit
- (> (undo-tree-size buffer-undo-tree) undo-outer-limit))
- ;; query first if `undo-ask-before-discard' is set
- (if undo-ask-before-discard
- (when (yes-or-no-p
- (format
- "Buffer `%s' undo info is %d bytes long; discard it? "
- (buffer-name) (undo-tree-size buffer-undo-tree)))
- (setq buffer-undo-tree nil))
- ;; otherwise, discard and display warning
- (display-warning
- '(undo discard-info)
- (concat
- (format "Buffer `%s' undo info was %d bytes long.\n"
- (buffer-name) (undo-tree-size buffer-undo-tree))
- "The undo info was discarded because it exceeded\
- `undo-outer-limit'.
-
-This is normal if you executed a command that made a huge change
-to the buffer. In that case, to prevent similar problems in the
-future, set `undo-outer-limit' to a value that is large enough to
-cover the maximum size of normal changes you expect a single
-command to make, but not so large that it might exceed the
-maximum memory allotted to Emacs.
-
-If you did not execute any such command, the situation is
-probably due to a bug and you should report it.
-
-You can disable the popping up of this buffer by adding the entry
-\(undo discard-info) to the user option `warning-suppress-types',
-which is defined in the `warnings' library.\n")
- :warning)
- (setq buffer-undo-tree nil)))
-
- ;; if currently displaying the visualizer, redraw it
- (when (and buffer-undo-tree
- discarded
- (or (eq major-mode 'undo-tree-visualizer-mode)
- undo-tree-visualizer-parent-buffer
- (get-buffer undo-tree-visualizer-buffer-name)))
- (let ((undo-tree buffer-undo-tree))
- (with-current-buffer undo-tree-visualizer-buffer-name
- (undo-tree-draw-tree undo-tree)
- (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
- )))
-
-
-
-
-;;; =====================================================================
-;;; Visualizer utility functions
-
-(defun undo-tree-compute-widths (node)
- "Recursively compute widths for nodes below NODE."
- (let ((stack (list node))
- res)
- (while stack
- ;; try to compute widths for node at top of stack
- (if (undo-tree-node-p
- (setq res (undo-tree-node-compute-widths (car stack))))
- ;; if computation fails, it returns a node whose widths still need
- ;; computing, which we push onto the stack
- (push res stack)
- ;; otherwise, store widths and remove it from stack
- (setf (undo-tree-node-lwidth (car stack)) (aref res 0)
- (undo-tree-node-cwidth (car stack)) (aref res 1)
- (undo-tree-node-rwidth (car stack)) (aref res 2))
- (pop stack)))))
-
-
-(defun undo-tree-node-compute-widths (node)
- ;; Compute NODE's left-, centre-, and right-subtree widths. Returns widths
- ;; (in a vector) if successful. Otherwise, returns a node whose widths need
- ;; calculating before NODE's can be calculated.
- (let ((num-children (length (undo-tree-node-next node)))
- (lwidth 0) (cwidth 0) (rwidth 0) p)
- (catch 'need-widths
- (cond
- ;; leaf nodes have 0 width
- ((= 0 num-children)
- (setf cwidth 1
- (undo-tree-node-lwidth node) 0
- (undo-tree-node-cwidth node) 1
- (undo-tree-node-rwidth node) 0))
-
- ;; odd number of children
- ((= (mod num-children 2) 1)
- (setq p (undo-tree-node-next node))
- ;; compute left-width
- (dotimes (_ (/ num-children 2))
- (if (undo-tree-node-lwidth (car p))
- (cl-incf lwidth (+ (undo-tree-node-lwidth (car p))
- (undo-tree-node-cwidth (car p))
- (undo-tree-node-rwidth (car p))))
- ;; if child's widths haven't been computed, return that child
- (throw 'need-widths (car p)))
- (setq p (cdr p)))
- (if (undo-tree-node-lwidth (car p))
- (cl-incf lwidth (undo-tree-node-lwidth (car p)))
- (throw 'need-widths (car p)))
- ;; centre-width is inherited from middle child
- (setf cwidth (undo-tree-node-cwidth (car p)))
- ;; compute right-width
- (cl-incf rwidth (undo-tree-node-rwidth (car p)))
- (setq p (cdr p))
- (dotimes (_ (/ num-children 2))
- (if (undo-tree-node-lwidth (car p))
- (cl-incf rwidth (+ (undo-tree-node-lwidth (car p))
- (undo-tree-node-cwidth (car p))
- (undo-tree-node-rwidth (car p))))
- (throw 'need-widths (car p)))
- (setq p (cdr p))))
-
- ;; even number of children
- (t
- (setq p (undo-tree-node-next node))
- ;; compute left-width
- (dotimes (_ (/ num-children 2))
- (if (undo-tree-node-lwidth (car p))
- (cl-incf lwidth (+ (undo-tree-node-lwidth (car p))
- (undo-tree-node-cwidth (car p))
- (undo-tree-node-rwidth (car p))))
- (throw 'need-widths (car p)))
- (setq p (cdr p)))
- ;; centre-width is 0 when number of children is even
- (setq cwidth 0)
- ;; compute right-width
- (dotimes (_ (/ num-children 2))
- (if (undo-tree-node-lwidth (car p))
- (cl-incf rwidth (+ (undo-tree-node-lwidth (car p))
- (undo-tree-node-cwidth (car p))
- (undo-tree-node-rwidth (car p))))
- (throw 'need-widths (car p)))
- (setq p (cdr p)))))
-
- ;; return left-, centre- and right-widths
- (vector lwidth cwidth rwidth))))
-
-
-(defun undo-tree-clear-visualizer-data (tree)
- ;; Clear visualizer data below NODE.
- (undo-tree-mapc
- (lambda (n) (undo-tree-node-clear-visualizer-data n))
- (undo-tree-root tree)))
-
-
-(defun undo-tree-node-unmodified-p (node &optional mtime)
- ;; Return non-nil if NODE corresponds to a buffer state that once upon a
- ;; time was unmodified. If a file modification time MTIME is specified,
- ;; return non-nil if the corresponding buffer state really is unmodified.
- (let (changeset ntime)
- (setq changeset
- (or (undo-tree-node-redo node)
- (and (setq changeset (car (undo-tree-node-next node)))
- (undo-tree-node-undo changeset)))
- ntime
- (catch 'found
- (dolist (elt changeset)
- (when (and (consp elt) (eq (car elt) t) (consp (cdr elt))
- (throw 'found (cdr elt)))))))
- (and ntime
- (or (null mtime)
- ;; high-precision timestamps
- (if (listp (cdr ntime))
- (equal ntime mtime)
- ;; old-style timestamps
- (and (= (car ntime) (car mtime))
- (= (cdr ntime) (cadr mtime))))))))
-
-
-
-
-;;; =====================================================================
-;;; Undo-in-region utility functions
-
-;; `undo-elt-in-region' uses this as a dynamically-scoped variable
-(defvar undo-adjusted-markers nil)
-
-
-(defun undo-tree-pull-undo-in-region-branch (start end)
- ;; Pull out entries from undo changesets to create a new undo-in-region
- ;; branch, which undoes changeset entries lying between START and END first,
- ;; followed by remaining entries from the changesets, before rejoining the
- ;; existing undo tree history. Repeated calls will, if appropriate, extend
- ;; the current undo-in-region branch rather than creating a new one.
-
- ;; if we're just reverting the last redo-in-region, we don't need to
- ;; manipulate the undo tree at all
- (if (undo-tree-reverting-redo-in-region-p start end)
- t ; return t to indicate success
-
- ;; We build the `region-changeset' and `delta-list' lists forwards, using
- ;; pointers `r' and `d' to the penultimate element of the list. So that we
- ;; don't have to treat the first element differently, we prepend a dummy
- ;; leading nil to the lists, and have the pointers point to that
- ;; initially.
- ;; Note: using '(nil) instead of (list nil) in the `let*' results in
- ;; errors when the code is byte-compiled, presumably because the
- ;; Lisp reader generates a single cons, and that same cons gets used
- ;; each call.
- (let* ((region-changeset (list nil))
- (r region-changeset)
- (delta-list (list nil))
- (d delta-list)
- (node (undo-tree-current buffer-undo-tree))
- (repeated-undo-in-region
- (undo-tree-repeated-undo-in-region-p start end))
- undo-adjusted-markers ; `undo-elt-in-region' expects this
- fragment splice original-fragment original-splice original-current
- got-visible-elt undo-list elt)
-
- ;; --- initialisation ---
- (cond
- ;; if this is a repeated undo in the same region, start pulling changes
- ;; from NODE at which undo-in-region branch is attached, and detatch
- ;; the branch, using it as initial FRAGMENT of branch being constructed
- (repeated-undo-in-region
- (setq original-current node
- fragment (car (undo-tree-node-next node))
- splice node)
- ;; undo up to node at which undo-in-region branch is attached
- ;; (recognizable as first node with more than one branch)
- (let ((mark-active nil))
- (while (= (length (undo-tree-node-next node)) 1)
- (undo-tree-undo-1)
- (setq fragment node
- node (undo-tree-current buffer-undo-tree))))
- (when (eq splice node) (setq splice nil))
- ;; detatch undo-in-region branch
- (setf (undo-tree-node-next node)
- (delq fragment (undo-tree-node-next node))
- (undo-tree-node-previous fragment) nil
- original-fragment fragment
- original-splice node))
-
- ;; if this is a new undo-in-region, initial FRAGMENT is a copy of all
- ;; nodes below the current one in the active branch
- ((undo-tree-node-next node)
- (setq fragment (undo-tree-make-node nil nil)
- splice fragment)
- (while (setq node (nth (undo-tree-node-branch node)
- (undo-tree-node-next node)))
- (push (undo-tree-make-node
- splice
- (undo-copy-list (undo-tree-node-undo node))
- (undo-copy-list (undo-tree-node-redo node)))
- (undo-tree-node-next splice))
- (setq splice (car (undo-tree-node-next splice))))
- (setq fragment (car (undo-tree-node-next fragment))
- splice nil
- node (undo-tree-current buffer-undo-tree))))
-
-
- ;; --- pull undo-in-region elements into branch ---
- ;; work backwards up tree, pulling out undo elements within region until
- ;; we've got one that undoes a visible change (insertion or deletion)
- (catch 'abort
- (while (and (not got-visible-elt) node (undo-tree-node-undo node))
- ;; we cons a dummy nil element on the front of the changeset so that
- ;; we can conveniently remove the first (real) element from the
- ;; changeset if we need to; the leading nil is removed once we're
- ;; done with this changeset
- (setq undo-list (cons nil (undo-copy-list (undo-tree-node-undo node)))
- elt (cadr undo-list))
- (if fragment
- (progn
- (setq fragment (undo-tree-grow-backwards fragment undo-list))
- (unless splice (setq splice fragment)))
- (setq fragment (undo-tree-make-node nil undo-list))
- (setq splice fragment))
-
- (while elt
- (cond
- ;; keep elements within region
- ((undo-elt-in-region elt start end)
- ;; set flag if kept element is visible (insertion or deletion)
- (when (and (consp elt)
- (or (stringp (car elt)) (integerp (car elt))))
- (setq got-visible-elt t))
- ;; adjust buffer positions in elements previously undone before
- ;; kept element, as kept element will now be undone first
- (undo-tree-adjust-elements-to-elt splice elt)
- ;; move kept element to undo-in-region changeset, adjusting its
- ;; buffer position as it will now be undone first
- (setcdr r (list (undo-tree-apply-deltas elt (cdr delta-list))))
- (setq r (cdr r))
- (setcdr undo-list (cddr undo-list)))
-
- ;; discard "was unmodified" elements
- ;; FIXME: deal properly with these
- ((and (consp elt) (eq (car elt) t))
- (setcdr undo-list (cddr undo-list)))
-
- ;; if element crosses region, we can't pull any more elements
- ((undo-elt-crosses-region elt start end)
- ;; if we've found a visible element, it must be earlier in
- ;; current node's changeset; stop pulling elements (null
- ;; `undo-list' and non-nil `got-visible-elt' cause loop to exit)
- (if got-visible-elt
- (setq undo-list nil)
- ;; if we haven't found a visible element yet, pulling
- ;; undo-in-region branch has failed
- (setq region-changeset nil)
- (throw 'abort t)))
-
- ;; if rejecting element, add its delta (if any) to the list
- (t
- (let ((delta (undo-delta elt)))
- (when (/= 0 (cdr delta))
- (setcdr d (list delta))
- (setq d (cdr d))))
- (setq undo-list (cdr undo-list))))
-
- ;; process next element of current changeset
- (setq elt (cadr undo-list)))
-
- ;; if there are remaining elements in changeset, remove dummy nil
- ;; from front
- (if (cadr (undo-tree-node-undo fragment))
- (pop (undo-tree-node-undo fragment))
- ;; otherwise, if we've kept all elements in changeset, discard
- ;; empty changeset
- (when (eq splice fragment) (setq splice nil))
- (setq fragment (car (undo-tree-node-next fragment))))
- ;; process changeset from next node up the tree
- (setq node (undo-tree-node-previous node))))
-
- ;; pop dummy nil from front of `region-changeset'
- (setq region-changeset (cdr region-changeset))
-
-
- ;; --- integrate branch into tree ---
- ;; if no undo-in-region elements were found, restore undo tree
- (if (null region-changeset)
- (when original-current
- (push original-fragment (undo-tree-node-next original-splice))
- (setf (undo-tree-node-branch original-splice) 0
- (undo-tree-node-previous original-fragment) original-splice)
- (let ((mark-active nil))
- (while (not (eq (undo-tree-current buffer-undo-tree)
- original-current))
- (undo-tree-redo-1)))
- nil) ; return nil to indicate failure
-
- ;; otherwise...
- ;; need to undo up to node where new branch will be attached, to
- ;; ensure redo entries are populated, and then redo back to where we
- ;; started
- (let ((mark-active nil)
- (current (undo-tree-current buffer-undo-tree)))
- (while (not (eq (undo-tree-current buffer-undo-tree) node))
- (undo-tree-undo-1))
- (while (not (eq (undo-tree-current buffer-undo-tree) current))
- (undo-tree-redo-1)))
-
- (cond
- ;; if there's no remaining fragment, just create undo-in-region node
- ;; and attach it to parent of last node from which elements were
- ;; pulled
- ((null fragment)
- (setq fragment (undo-tree-make-node node region-changeset))
- (push fragment (undo-tree-node-next node))
- (setf (undo-tree-node-branch node) 0)
- ;; set current node to undo-in-region node
- (setf (undo-tree-current buffer-undo-tree) fragment))
-
- ;; if no splice point has been set, add undo-in-region node to top of
- ;; fragment and attach it to parent of last node from which elements
- ;; were pulled
- ((null splice)
- (setq fragment (undo-tree-grow-backwards fragment region-changeset))
- (push fragment (undo-tree-node-next node))
- (setf (undo-tree-node-branch node) 0
- (undo-tree-node-previous fragment) node)
- ;; set current node to undo-in-region node
- (setf (undo-tree-current buffer-undo-tree) fragment))
-
- ;; if fragment contains nodes, attach fragment to parent of last node
- ;; from which elements were pulled, and splice in undo-in-region node
- (t
- (setf (undo-tree-node-previous fragment) node)
- (push fragment (undo-tree-node-next node))
- (setf (undo-tree-node-branch node) 0)
- ;; if this is a repeated undo-in-region, then we've left the current
- ;; node at the original splice-point; we need to set the current
- ;; node to the equivalent node on the undo-in-region branch and redo
- ;; back to where we started
- (when repeated-undo-in-region
- (setf (undo-tree-current buffer-undo-tree)
- (undo-tree-node-previous original-fragment))
- (let ((mark-active nil))
- (while (not (eq (undo-tree-current buffer-undo-tree) splice))
- (undo-tree-redo-1 nil 'preserve-undo))))
- ;; splice new undo-in-region node into fragment
- (setq node (undo-tree-make-node nil region-changeset))
- (undo-tree-splice-node node splice)
- ;; set current node to undo-in-region node
- (setf (undo-tree-current buffer-undo-tree) node)))
-
- ;; update undo-tree size
- (setq node (undo-tree-node-previous fragment))
- (while (progn
- (and (setq node (car (undo-tree-node-next node)))
- (not (eq node original-fragment))
- (cl-incf (undo-tree-count buffer-undo-tree))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (+ (undo-list-byte-size (undo-tree-node-undo node))
- (undo-list-byte-size (undo-tree-node-redo node)))))))
- t) ; indicate undo-in-region branch was successfully pulled
- )))
-
-
-
-(defun undo-tree-pull-redo-in-region-branch (start end)
- ;; Pull out entries from redo changesets to create a new redo-in-region
- ;; branch, which redoes changeset entries lying between START and END first,
- ;; followed by remaining entries from the changesets. Repeated calls will,
- ;; if appropriate, extend the current redo-in-region branch rather than
- ;; creating a new one.
-
- ;; if we're just reverting the last undo-in-region, we don't need to
- ;; manipulate the undo tree at all
- (if (undo-tree-reverting-undo-in-region-p start end)
- t ; return t to indicate success
-
- ;; We build the `region-changeset' and `delta-list' lists forwards, using
- ;; pointers `r' and `d' to the penultimate element of the list. So that we
- ;; don't have to treat the first element differently, we prepend a dummy
- ;; leading nil to the lists, and have the pointers point to that
- ;; initially.
- ;; Note: using '(nil) instead of (list nil) in the `let*' causes bizarre
- ;; errors when the code is byte-compiled, where parts of the lists
- ;; appear to survive across different calls to this function. An
- ;; obscure byte-compiler bug, perhaps?
- (let* ((region-changeset (list nil))
- (r region-changeset)
- (delta-list (list nil))
- (d delta-list)
- (node (undo-tree-current buffer-undo-tree))
- (repeated-redo-in-region
- (undo-tree-repeated-redo-in-region-p start end))
- undo-adjusted-markers ; `undo-elt-in-region' expects this
- fragment splice got-visible-elt redo-list elt)
-
- ;; --- inisitalisation ---
- (cond
- ;; if this is a repeated redo-in-region, detach fragment below current
- ;; node
- (repeated-redo-in-region
- (when (setq fragment (car (undo-tree-node-next node)))
- (setf (undo-tree-node-previous fragment) nil
- (undo-tree-node-next node)
- (delq fragment (undo-tree-node-next node)))))
- ;; if this is a new redo-in-region, initial fragment is a copy of all
- ;; nodes below the current one in the active branch
- ((undo-tree-node-next node)
- (setq fragment (undo-tree-make-node nil nil)
- splice fragment)
- (while (setq node (nth (undo-tree-node-branch node)
- (undo-tree-node-next node)))
- (push (undo-tree-make-node
- splice nil
- (undo-copy-list (undo-tree-node-redo node)))
- (undo-tree-node-next splice))
- (setq splice (car (undo-tree-node-next splice))))
- (setq fragment (car (undo-tree-node-next fragment)))))
-
-
- ;; --- pull redo-in-region elements into branch ---
- ;; work down fragment, pulling out redo elements within region until
- ;; we've got one that redoes a visible change (insertion or deletion)
- (setq node fragment)
- (catch 'abort
- (while (and (not got-visible-elt) node (undo-tree-node-redo node))
- ;; we cons a dummy nil element on the front of the changeset so that
- ;; we can conveniently remove the first (real) element from the
- ;; changeset if we need to; the leading nil is removed once we're
- ;; done with this changeset
- (setq redo-list (push nil (undo-tree-node-redo node))
- elt (cadr redo-list))
- (while elt
- (cond
- ;; keep elements within region
- ((undo-elt-in-region elt start end)
- ;; set flag if kept element is visible (insertion or deletion)
- (when (and (consp elt)
- (or (stringp (car elt)) (integerp (car elt))))
- (setq got-visible-elt t))
- ;; adjust buffer positions in elements previously redone before
- ;; kept element, as kept element will now be redone first
- (undo-tree-adjust-elements-to-elt fragment elt t)
- ;; move kept element to redo-in-region changeset, adjusting its
- ;; buffer position as it will now be redone first
- (setcdr r (list (undo-tree-apply-deltas elt (cdr delta-list) -1)))
- (setq r (cdr r))
- (setcdr redo-list (cddr redo-list)))
-
- ;; discard "was unmodified" elements
- ;; FIXME: deal properly with these
- ((and (consp elt) (eq (car elt) t))
- (setcdr redo-list (cddr redo-list)))
-
- ;; if element crosses region, we can't pull any more elements
- ((undo-elt-crosses-region elt start end)
- ;; if we've found a visible element, it must be earlier in
- ;; current node's changeset; stop pulling elements (null
- ;; `redo-list' and non-nil `got-visible-elt' cause loop to exit)
- (if got-visible-elt
- (setq redo-list nil)
- ;; if we haven't found a visible element yet, pulling
- ;; redo-in-region branch has failed
- (setq region-changeset nil)
- (throw 'abort t)))
-
- ;; if rejecting element, add its delta (if any) to the list
- (t
- (let ((delta (undo-delta elt)))
- (when (/= 0 (cdr delta))
- (setcdr d (list delta))
- (setq d (cdr d))))
- (setq redo-list (cdr redo-list))))
-
- ;; process next element of current changeset
- (setq elt (cadr redo-list)))
-
- ;; if there are remaining elements in changeset, remove dummy nil
- ;; from front
- (if (cadr (undo-tree-node-redo node))
- (pop (undo-tree-node-undo node))
- ;; otherwise, if we've kept all elements in changeset, discard
- ;; empty changeset
- (if (eq fragment node)
- (setq fragment (car (undo-tree-node-next fragment)))
- (undo-tree-snip-node node)))
- ;; process changeset from next node in fragment
- (setq node (car (undo-tree-node-next node)))))
-
- ;; pop dummy nil from front of `region-changeset'
- (setq region-changeset (cdr region-changeset))
-
-
- ;; --- integrate branch into tree ---
- (setq node (undo-tree-current buffer-undo-tree))
- ;; if no redo-in-region elements were found, restore undo tree
- (if (null (car region-changeset))
- (when (and repeated-redo-in-region fragment)
- (push fragment (undo-tree-node-next node))
- (setf (undo-tree-node-branch node) 0
- (undo-tree-node-previous fragment) node)
- nil) ; return nil to indicate failure
-
- ;; otherwise, add redo-in-region node to top of fragment, and attach
- ;; it below current node
- (setq fragment
- (if fragment
- (undo-tree-grow-backwards fragment nil region-changeset)
- (undo-tree-make-node nil nil region-changeset)))
- (push fragment (undo-tree-node-next node))
- (setf (undo-tree-node-branch node) 0
- (undo-tree-node-previous fragment) node)
- ;; update undo-tree size
- (unless repeated-redo-in-region
- (setq node fragment)
- (while (and (setq node (car (undo-tree-node-next node)))
- (cl-incf (undo-tree-count buffer-undo-tree))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size
- (undo-tree-node-redo node))))))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo fragment)))
- t) ; indicate redo-in-region branch was successfully pulled
- )))
-
-
-
-(defun undo-tree-adjust-elements-to-elt (node undo-elt &optional below)
- "Adjust buffer positions of undo elements, starting at NODE's
-and going up the tree (or down the active branch if BELOW is
-non-nil) and through the nodes' undo elements until we reach
-UNDO-ELT. UNDO-ELT must appear somewhere in the undo changeset
-of either NODE itself or some node above it in the tree."
- (let ((delta (list (undo-delta undo-elt)))
- (undo-list (undo-tree-node-undo node)))
- ;; adjust elements until we reach UNDO-ELT
- (while (and (car undo-list)
- (not (eq (car undo-list) undo-elt)))
- (setcar undo-list
- (undo-tree-apply-deltas (car undo-list) delta -1))
- ;; move to next undo element in list, or to next node if we've run out
- ;; of elements
- (unless (car (setq undo-list (cdr undo-list)))
- (if below
- (setq node (nth (undo-tree-node-branch node)
- (undo-tree-node-next node)))
- (setq node (undo-tree-node-previous node)))
- (setq undo-list (undo-tree-node-undo node))))))
-
-
-
-(defun undo-tree-apply-deltas (undo-elt deltas &optional sgn)
- ;; Apply DELTAS in order to UNDO-ELT, multiplying deltas by SGN
- ;; (only useful value for SGN is -1).
- (let (position offset)
- (dolist (delta deltas)
- (setq position (car delta)
- offset (* (cdr delta) (or sgn 1)))
- (cond
- ;; POSITION
- ((integerp undo-elt)
- (when (>= undo-elt position)
- (setq undo-elt (- undo-elt offset))))
- ;; nil (or any other atom)
- ((atom undo-elt))
- ;; (TEXT . POSITION)
- ((stringp (car undo-elt))
- (let ((text-pos (abs (cdr undo-elt)))
- (point-at-end (< (cdr undo-elt) 0)))
- (if (>= text-pos position)
- (setcdr undo-elt (* (if point-at-end -1 1)
- (- text-pos offset))))))
- ;; (BEGIN . END)
- ((integerp (car undo-elt))
- (when (>= (car undo-elt) position)
- (setcar undo-elt (- (car undo-elt) offset))
- (setcdr undo-elt (- (cdr undo-elt) offset))))
- ;; (nil PROPERTY VALUE BEG . END)
- ((null (car undo-elt))
- (let ((tail (nthcdr 3 undo-elt)))
- (when (>= (car tail) position)
- (setcar tail (- (car tail) offset))
- (setcdr tail (- (cdr tail) offset)))))
- ))
- undo-elt))
-
-
-
-(defun undo-tree-repeated-undo-in-region-p (start end)
- ;; Return non-nil if undo-in-region between START and END is a repeated
- ;; undo-in-region
- (let ((node (undo-tree-current buffer-undo-tree)))
- (and (setq node
- (nth (undo-tree-node-branch node) (undo-tree-node-next node)))
- (eq (undo-tree-node-undo-beginning node) start)
- (eq (undo-tree-node-undo-end node) end))))
-
-
-(defun undo-tree-repeated-redo-in-region-p (start end)
- ;; Return non-nil if undo-in-region between START and END is a repeated
- ;; undo-in-region
- (let ((node (undo-tree-current buffer-undo-tree)))
- (and (eq (undo-tree-node-redo-beginning node) start)
- (eq (undo-tree-node-redo-end node) end))))
-
-
-;; Return non-nil if undo-in-region between START and END is simply
-;; reverting the last redo-in-region
-(defalias 'undo-tree-reverting-undo-in-region-p
- 'undo-tree-repeated-undo-in-region-p)
-
-
-;; Return non-nil if redo-in-region between START and END is simply
-;; reverting the last undo-in-region
-(defalias 'undo-tree-reverting-redo-in-region-p
- 'undo-tree-repeated-redo-in-region-p)
-
-
-
-
-;;; =====================================================================
-;;; Undo-tree commands
-
-(defvar undo-tree-timer nil)
-
-;;;###autoload
-(define-minor-mode undo-tree-mode
- "Toggle undo-tree mode.
-With no argument, this command toggles the mode.
-A positive prefix argument turns the mode on.
-A negative prefix argument turns it off.
-
-Undo-tree-mode replaces Emacs' standard undo feature with a more
-powerful yet easier to use version, that treats the undo history
-as what it is: a tree.
-
-The following keys are available in `undo-tree-mode':
-
- \\{undo-tree-map}
-
-Within the undo-tree visualizer, the following keys are available:
-
- \\{undo-tree-visualizer-mode-map}"
-
- nil ; init value
- undo-tree-mode-lighter ; lighter
- undo-tree-map ; keymap
-
- (cond
- (undo-tree-mode ; enabling `undo-tree-mode'
- (set (make-local-variable 'undo-limit)
- (if undo-tree-limit
- (max undo-limit undo-tree-limit)
- most-positive-fixnum))
- (set (make-local-variable 'undo-strong-limit)
- (if undo-tree-limit
- (max undo-strong-limit undo-tree-strong-limit)
- most-positive-fixnum))
- (set (make-local-variable 'undo-outer-limit) ; null `undo-outer-limit' means no limit
- (when (and undo-tree-limit undo-outer-limit undo-outer-limit)
- (max undo-outer-limit undo-tree-outer-limit)))
- (when (null undo-tree-limit)
- (setq undo-tree-timer
- (run-with-idle-timer 5 'repeat #'undo-list-transfer-to-tree)))
- (add-hook 'post-gc-hook #'undo-tree-post-gc nil))
-
- (t ; disabling `undo-tree-mode'
- ;; rebuild `buffer-undo-list' from tree so Emacs undo can work
- (undo-list-rebuild-from-tree)
- (setq buffer-undo-tree nil)
- (remove-hook 'post-gc-hook #'undo-tree-post-gc 'local)
- (when (timerp undo-tree-timer) (cancel-timer undo-tree-timer))
- (kill-local-variable 'undo-limit)
- (kill-local-variable 'undo-strong-limit)
- (kill-local-variable 'undo-outer-limit))))
-
-
-(defun turn-on-undo-tree-mode (&optional print-message)
- "Enable `undo-tree-mode' in the current buffer, when appropriate.
-Some major modes implement their own undo system, which should
-not normally be overridden by `undo-tree-mode'. This command does
-not enable `undo-tree-mode' in such buffers. If you want to force
-`undo-tree-mode' to be enabled regardless, use (undo-tree-mode 1)
-instead.
-
-The heuristic used to detect major modes in which
-`undo-tree-mode' should not be used is to check whether either
-the `undo' command has been remapped, or the default undo
-keybindings (C-/ and C-_) have been overridden somewhere other
-than in the global map. In addition, `undo-tree-mode' will not be
-enabled if the buffer's `major-mode' appears in
-`undo-tree-incompatible-major-modes'."
- (interactive "p")
- (if (or (key-binding [remap undo])
- (undo-tree-overridden-undo-bindings-p)
- (memq major-mode undo-tree-incompatible-major-modes))
- (when print-message
- (message "Buffer does not support undo-tree-mode;\
- undo-tree-mode NOT enabled"))
- (undo-tree-mode 1)))
-
-
-(defun undo-tree-overridden-undo-bindings-p ()
- "Returns t if default undo bindings are overridden, nil otherwise.
-Checks if either of the default undo key bindings (\"C-/\" or
-\"C-_\") are overridden in the current buffer by any keymap other
-than the global one. (So global redefinitions of the default undo
-key bindings do not count.)"
- (let ((binding1 (lookup-key (current-global-map) [?\C-/]))
- (binding2 (lookup-key (current-global-map) [?\C-_])))
- (global-set-key [?\C-/] 'undo)
- (global-set-key [?\C-_] 'undo)
- (unwind-protect
- (or (and (key-binding [?\C-/])
- (not (eq (key-binding [?\C-/]) 'undo)))
- (and (key-binding [?\C-_])
- (not (eq (key-binding [?\C-_]) 'undo))))
- (global-set-key [?\C-/] binding1)
- (global-set-key [?\C-_] binding2))))
-
-
-;;;###autoload
-(define-globalized-minor-mode global-undo-tree-mode
- undo-tree-mode turn-on-undo-tree-mode)
-
-
-
-(defun undo-tree-undo (&optional arg)
- "Undo changes.
-Repeat this command to undo more changes.
-A numeric ARG serves as a repeat count.
-
-In Transient Mark mode when the mark is active, only undo changes
-within the current region. Similarly, when not in Transient Mark
-mode, just \\[universal-argument] as an argument limits undo to
-changes within the current region."
- (interactive "*P")
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; throw error if undo is disabled in buffer
- (when (eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- (undo-tree-undo-1 arg)
- ;; inform user if at branch point
- (when (> (undo-tree-num-branches) 1) (message "Undo branch point!")))
-
-
-(defun undo-tree-undo-1 (&optional arg preserve-redo preserve-timestamps)
- ;; Internal undo function. An active mark in `transient-mark-mode', or
- ;; non-nil ARG otherwise, enables undo-in-region. Non-nil PRESERVE-REDO
- ;; causes the existing redo record to be preserved, rather than replacing it
- ;; with the new one generated by undoing. Non-nil PRESERVE-TIMESTAMPS
- ;; disables updating of timestamps in visited undo-tree nodes. (This latter
- ;; should *only* be used when temporarily visiting another undo state and
- ;; immediately returning to the original state afterwards. Otherwise, it
- ;; could cause history-discarding errors.)
- (let ((undo-in-progress t)
- (undo-in-region (and undo-tree-enable-undo-in-region
- (or (region-active-p)
- (and arg (not (numberp arg))))))
- pos current)
- ;; transfer entries accumulated in `buffer-undo-list' to
- ;; `buffer-undo-tree'
- (undo-list-transfer-to-tree)
-
- (dotimes (_ (or (and (numberp arg) (prefix-numeric-value arg)) 1))
- ;; check if at top of undo tree
- (unless (undo-tree-node-previous (undo-tree-current buffer-undo-tree))
- (user-error "No further undo information"))
-
- ;; if region is active, or a non-numeric prefix argument was supplied,
- ;; try to pull out a new branch of changes affecting the region
- (when (and undo-in-region
- (not (undo-tree-pull-undo-in-region-branch
- (region-beginning) (region-end))))
- (user-error "No further undo information for region"))
-
- ;; remove any GC'd elements from node's undo list
- (setq current (undo-tree-current buffer-undo-tree))
- (cl-decf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-undo current)))
- (setf (undo-tree-node-undo current)
- (undo-list-clean-GCd-elts (undo-tree-node-undo current)))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-undo current)))
- ;; undo one record from undo tree
- (when undo-in-region
- (setq pos (set-marker (make-marker) (point)))
- (set-marker-insertion-type pos t))
- (primitive-undo 1 (undo-tree-copy-list (undo-tree-node-undo current)))
- (undo-boundary)
-
- ;; if preserving old redo record, discard new redo entries that
- ;; `primitive-undo' has added to `buffer-undo-list', and remove any GC'd
- ;; elements from node's redo list
- (if preserve-redo
- (progn
- (undo-list-pop-changeset buffer-undo-list)
- (cl-decf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo current)))
- (setf (undo-tree-node-redo current)
- (undo-list-clean-GCd-elts (undo-tree-node-redo current)))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo current))))
- ;; otherwise, record redo entries that `primitive-undo' has added to
- ;; `buffer-undo-list' in current node's redo record, replacing
- ;; existing entry if one already exists
- (cl-decf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo current)))
- (setf (undo-tree-node-redo current)
- (undo-list-pop-changeset buffer-undo-list 'discard-pos))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo current))))
-
- ;; rewind current node and update timestamp
- (setf (undo-tree-current buffer-undo-tree)
- (undo-tree-node-previous (undo-tree-current buffer-undo-tree)))
- (unless preserve-timestamps
- (setf (undo-tree-node-timestamp (undo-tree-current buffer-undo-tree))
- (current-time)))
-
- ;; if undoing-in-region, record current node, region and direction so we
- ;; can tell if undo-in-region is repeated, and re-activate mark if in
- ;; `transient-mark-mode'; if not, erase any leftover data
- (if (not undo-in-region)
- (undo-tree-node-clear-region-data current)
- (goto-char pos)
- ;; note: we deliberately want to store the region information in the
- ;; node *below* the now current one
- (setf (undo-tree-node-undo-beginning current) (region-beginning)
- (undo-tree-node-undo-end current) (region-end))
- (set-marker pos nil)))
-
- ;; undo deactivates mark unless undoing-in-region
- (setq deactivate-mark (not undo-in-region))))
-
-
-
-(defun undo-tree-redo (&optional arg)
- "Redo changes. A numeric ARG serves as a repeat count.
-
-In Transient Mark mode when the mark is active, only redo changes
-within the current region. Similarly, when not in Transient Mark
-mode, just \\[universal-argument] as an argument limits redo to
-changes within the current region."
- (interactive "*P")
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; throw error if undo is disabled in buffer
- (when (eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- (undo-tree-redo-1 arg)
- ;; inform user if at branch point
- (when (> (undo-tree-num-branches) 1) (message "Undo branch point!")))
-
-
-(defun undo-tree-redo-1 (&optional arg preserve-undo preserve-timestamps)
- ;; Internal redo function. An active mark in `transient-mark-mode', or
- ;; non-nil ARG otherwise, enables undo-in-region. Non-nil PRESERVE-UNDO
- ;; causes the existing redo record to be preserved, rather than replacing it
- ;; with the new one generated by undoing. Non-nil PRESERVE-TIMESTAMPS
- ;; disables updating of timestamps in visited undo-tree nodes. (This latter
- ;; should *only* be used when temporarily visiting another undo state and
- ;; immediately returning to the original state afterwards. Otherwise, it
- ;; could cause history-discarding errors.)
- (let ((undo-in-progress t)
- (redo-in-region (and undo-tree-enable-undo-in-region
- (or (region-active-p)
- (and arg (not (numberp arg))))))
- pos current)
- ;; transfer entries accumulated in `buffer-undo-list' to
- ;; `buffer-undo-tree'
- (undo-list-transfer-to-tree)
-
- (dotimes (_ (or (and (numberp arg) (prefix-numeric-value arg)) 1))
- ;; check if at bottom of undo tree
- (when (null (undo-tree-node-next (undo-tree-current buffer-undo-tree)))
- (user-error "No further redo information"))
-
- ;; if region is active, or a non-numeric prefix argument was supplied,
- ;; try to pull out a new branch of changes affecting the region
- (when (and redo-in-region
- (not (undo-tree-pull-redo-in-region-branch
- (region-beginning) (region-end))))
- (user-error "No further redo information for region"))
-
- ;; get next node (but DON'T advance current node in tree yet, in case
- ;; redoing fails)
- (setq current (undo-tree-current buffer-undo-tree)
- current (nth (undo-tree-node-branch current)
- (undo-tree-node-next current)))
- ;; remove any GC'd elements from node's redo list
- (cl-decf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo current)))
- (setf (undo-tree-node-redo current)
- (undo-list-clean-GCd-elts (undo-tree-node-redo current)))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-redo current)))
- ;; redo one record from undo tree
- (when redo-in-region
- (setq pos (set-marker (make-marker) (point)))
- (set-marker-insertion-type pos t))
- (primitive-undo 1 (undo-tree-copy-list (undo-tree-node-redo current)))
- (undo-boundary)
- ;; advance current node in tree
- (setf (undo-tree-current buffer-undo-tree) current)
-
- ;; if preserving old undo record, discard new undo entries that
- ;; `primitive-undo' has added to `buffer-undo-list', and remove any GC'd
- ;; elements from node's redo list
- (if preserve-undo
- (progn
- (undo-list-pop-changeset buffer-undo-list)
- (cl-decf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-undo current)))
- (setf (undo-tree-node-undo current)
- (undo-list-clean-GCd-elts (undo-tree-node-undo current)))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-undo current))))
- ;; otherwise, record undo entries that `primitive-undo' has added to
- ;; `buffer-undo-list' in current node's undo record, replacing
- ;; existing entry if one already exists
- (cl-decf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-undo current)))
- (setf (undo-tree-node-undo current)
- (undo-list-pop-changeset buffer-undo-list 'discard-pos))
- (cl-incf (undo-tree-size buffer-undo-tree)
- (undo-list-byte-size (undo-tree-node-undo current))))
-
- ;; update timestamp
- (unless preserve-timestamps
- (setf (undo-tree-node-timestamp current) (current-time)))
-
- ;; if redoing-in-region, record current node, region and direction so we
- ;; can tell if redo-in-region is repeated, and re-activate mark if in
- ;; `transient-mark-mode'
- (if (not redo-in-region)
- (undo-tree-node-clear-region-data current)
- (goto-char pos)
- (setf (undo-tree-node-redo-beginning current) (region-beginning)
- (undo-tree-node-redo-end current) (region-end))
- (set-marker pos nil)))
-
- ;; redo deactivates the mark unless redoing-in-region
- (setq deactivate-mark (not redo-in-region))))
-
-
-
-(defun undo-tree-switch-branch (branch)
- "Switch to a different BRANCH of the undo tree.
-This will affect which branch to descend when *redoing* changes
-using `undo-tree-redo'."
- (interactive (list (or (and prefix-arg (prefix-numeric-value prefix-arg))
- (and (not (eq buffer-undo-list t))
- (undo-list-transfer-to-tree)
- (let ((b (undo-tree-node-branch
- (undo-tree-current
- buffer-undo-tree))))
- (cond
- ;; switch to other branch if only 2
- ((= (undo-tree-num-branches) 2) (- 1 b))
- ;; prompt if more than 2
- ((> (undo-tree-num-branches) 2)
- (read-number
- (format "Branch (0-%d, on %d): "
- (1- (undo-tree-num-branches)) b)))
- ))))))
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; throw error if undo is disabled in buffer
- (when (eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- ;; sanity check branch number
- (when (<= (undo-tree-num-branches) 1)
- (user-error "Not at undo branch point"))
- (when (or (< branch 0) (> branch (1- (undo-tree-num-branches))))
- (user-error "Invalid branch number"))
- ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
- (undo-list-transfer-to-tree)
- ;; switch branch
- (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree))
- branch)
- (message "Switched to branch %d" branch))
-
-
-(defun undo-tree-set (node &optional preserve-timestamps)
- ;; Set buffer to state corresponding to NODE. Returns intersection point
- ;; between path back from current node and path back from selected NODE.
- ;; Non-nil PRESERVE-TIMESTAMPS disables updating of timestamps in visited
- ;; undo-tree nodes. (This should *only* be used when temporarily visiting
- ;; another undo state and immediately returning to the original state
- ;; afterwards. Otherwise, it could cause history-discarding errors.)
- (let ((path (make-hash-table :test 'eq))
- (n node))
- (puthash (undo-tree-root buffer-undo-tree) t path)
- ;; build list of nodes leading back from selected node to root, updating
- ;; branches as we go to point down to selected node
- (while (progn
- (puthash n t path)
- (when (undo-tree-node-previous n)
- (setf (undo-tree-node-branch (undo-tree-node-previous n))
- (undo-tree-position
- n (undo-tree-node-next (undo-tree-node-previous n))))
- (setq n (undo-tree-node-previous n)))))
- ;; work backwards from current node until we intersect path back from
- ;; selected node
- (setq n (undo-tree-current buffer-undo-tree))
- (while (not (gethash n path))
- (setq n (undo-tree-node-previous n)))
- ;; ascend tree until intersection node
- (while (not (eq (undo-tree-current buffer-undo-tree) n))
- (undo-tree-undo-1 nil nil preserve-timestamps))
- ;; descend tree until selected node
- (while (not (eq (undo-tree-current buffer-undo-tree) node))
- (undo-tree-redo-1 nil nil preserve-timestamps))
- n)) ; return intersection node
-
-
-
-(defun undo-tree-save-state-to-register (register)
- "Store current undo-tree state to REGISTER.
-The saved state can be restored using
-`undo-tree-restore-state-from-register'.
-Argument is a character, naming the register."
- (interactive "cUndo-tree state to register: ")
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; throw error if undo is disabled in buffer
- (when (eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
- (undo-list-transfer-to-tree)
- ;; save current node to REGISTER
- (set-register
- register (registerv-make
- (undo-tree-make-register-data
- (current-buffer) (undo-tree-current buffer-undo-tree))
- :print-func 'undo-tree-register-data-print-func))
- ;; record REGISTER in current node, for visualizer
- (setf (undo-tree-node-register (undo-tree-current buffer-undo-tree))
- register))
-
-
-
-(defun undo-tree-restore-state-from-register (register)
- "Restore undo-tree state from REGISTER.
-The state must be saved using `undo-tree-save-state-to-register'.
-Argument is a character, naming the register."
- (interactive "*cRestore undo-tree state from register: ")
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; throw error if undo is disabled in buffer, or if register doesn't contain
- ;; an undo-tree node
- (let ((data (registerv-data (get-register register))))
- (cond
- ((eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- ((not (undo-tree-register-data-p data))
- (user-error "Register doesn't contain undo-tree state"))
- ((not (eq (current-buffer) (undo-tree-register-data-buffer data)))
- (user-error "Register contains undo-tree state for a different buffer")))
- ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
- (undo-list-transfer-to-tree)
- ;; restore buffer state corresponding to saved node
- (undo-tree-set (undo-tree-register-data-node data))))
-
-
-
-
-;;; =====================================================================
-;;; Undo-tree menu bar
-
-(defvar undo-tree-old-undo-menu-item nil)
-
-(defun undo-tree-update-menu-bar ()
- "Update `undo-tree-mode' Edit menu items."
- (if undo-tree-mode
- (progn
- ;; save old undo menu item, and install undo/redo menu items
- (setq undo-tree-old-undo-menu-item
- (cdr (assq 'undo (lookup-key global-map [menu-bar edit]))))
- (define-key (lookup-key global-map [menu-bar edit])
- [undo] '(menu-item "Undo" undo-tree-undo
- :enable (and undo-tree-mode
- (not buffer-read-only)
- (not (eq t buffer-undo-list))
- (not (eq nil buffer-undo-tree))
- (undo-tree-node-previous
- (undo-tree-current buffer-undo-tree)))
- :help "Undo last operation"))
- (define-key-after (lookup-key global-map [menu-bar edit])
- [redo] '(menu-item "Redo" undo-tree-redo
- :enable (and undo-tree-mode
- (not buffer-read-only)
- (not (eq t buffer-undo-list))
- (not (eq nil buffer-undo-tree))
- (undo-tree-node-next
- (undo-tree-current buffer-undo-tree)))
- :help "Redo last operation")
- 'undo))
- ;; uninstall undo/redo menu items
- (define-key (lookup-key global-map [menu-bar edit])
- [undo] undo-tree-old-undo-menu-item)
- (define-key (lookup-key global-map [menu-bar edit])
- [redo] nil)))
-
-(add-hook 'menu-bar-update-hook 'undo-tree-update-menu-bar)
-
-
-
-
-;;; =====================================================================
-;;; Persistent storage commands
-
-(defun undo-tree-make-history-save-file-name (file)
- "Create the undo history file name for FILE.
-Normally this is the file's name with \".\" prepended and
-\".~undo-tree~\" appended.
-
-A match for FILE is sought in `undo-tree-history-directory-alist'
-\(see the documentation of that variable for details\). If the
-directory for the backup doesn't exist, it is created."
- (let* ((backup-directory-alist undo-tree-history-directory-alist)
- (name (make-backup-file-name-1 file)))
- (concat (file-name-directory name) "." (file-name-nondirectory name)
- ".~undo-tree~")))
-
-
-(defun undo-tree-save-history (&optional filename overwrite)
- "Store undo-tree history to file.
-
-If optional argument FILENAME is omitted, default save file is
-\".<buffer-file-name>.~undo-tree\" if buffer is visiting a file.
-Otherwise, prompt for one.
-
-If OVERWRITE is non-nil, any existing file will be overwritten
-without asking for confirmation."
- (interactive)
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- (when (eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- (undo-list-transfer-to-tree)
- (when (and buffer-undo-tree (not (eq buffer-undo-tree t)))
- (undo-tree-kill-visualizer)
- ;; should be cleared already by killing the visualizer, but writes
- ;; unreasable data if not for some reason, so just in case...
- (undo-tree-clear-visualizer-data buffer-undo-tree)
- (let ((buff (current-buffer))
- tree)
- ;; get filename
- (unless filename
- (setq filename
- (if buffer-file-name
- (undo-tree-make-history-save-file-name buffer-file-name)
- (expand-file-name (read-file-name "File to save in: ") nil))))
- (when (or (not (file-exists-p filename))
- overwrite
- (yes-or-no-p (format "Overwrite \"%s\"? " filename)))
- ;; transform undo-tree into non-circular structure, and make tmp copy
- (setq tree (undo-tree-copy buffer-undo-tree))
- (undo-tree-decircle tree)
- ;; discard undo-tree object pool before saving
- (setf (undo-tree-object-pool tree) nil)
- ;; run pre-save transformer functions
- (when undo-tree-pre-save-element-functions
- (undo-tree-mapc
- (lambda (node)
- (let ((changeset (undo-tree-node-undo node)))
- (run-hook-wrapped
- 'undo-tree-pre-save-element-functions
- (lambda (fun)
- (setq changeset (delq nil (mapcar fun changeset)))))
- (setf (undo-tree-node-undo node) changeset))
- (let ((changeset (undo-tree-node-redo node)))
- (run-hook-wrapped
- 'undo-tree-pre-save-element-functions
- (lambda (fun)
- (setq changeset (delq nil (mapcar fun changeset)))))
- (setf (undo-tree-node-redo node) changeset)))
- (undo-tree-root tree)))
- ;; print undo-tree to file
- ;; NOTE: We use `with-temp-buffer' instead of `with-temp-file' to
- ;; allow `auto-compression-mode' to take effect, in case user
- ;; has overridden or advised the default
- ;; `undo-tree-make-history-save-file-name' to add a compressed
- ;; file extension.
- (with-auto-compression-mode
- (with-temp-buffer
- (prin1 (sha1 buff) (current-buffer))
- (terpri (current-buffer))
- (let ((print-circle t)) (prin1 tree (current-buffer)))
- (write-region nil nil filename)))))))
-
-
-
-(defun undo-tree-load-history (&optional filename noerror)
- "Load undo-tree history from file, for the current buffer.
-
-If optional argument FILENAME is null, default load file is
-\".<buffer-file-name>.~undo-tree\" if buffer is visiting a file.
-Otherwise, prompt for one.
-
-If optional argument NOERROR is non-nil, return nil instead of
-signaling an error if file is not found.
-
-Note this will overwrite any existing undo history."
- (interactive)
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; get filename
- (unless filename
- (setq filename
- (if buffer-file-name
- (undo-tree-make-history-save-file-name buffer-file-name)
- (expand-file-name (read-file-name "File to load from: ") nil))))
-
- ;; attempt to read undo-tree from FILENAME
- (catch 'load-error
- (unless (file-exists-p filename)
- (if noerror
- (throw 'load-error nil)
- (error "File \"%s\" does not exist; could not load undo-tree history"
- filename)))
- (let (buff hash tree)
- (setq buff (current-buffer))
- (with-auto-compression-mode
- (with-temp-buffer
- (insert-file-contents filename)
- (goto-char (point-min))
- (condition-case nil
- (setq hash (read (current-buffer)))
- (error
- (kill-buffer nil)
- (funcall (if noerror #'message #'user-error)
- "Error reading undo-tree history from \"%s\"" filename)
- (throw 'load-error nil)))
- (unless (string= (sha1 buff) hash)
- (kill-buffer nil)
- (funcall (if noerror 'message 'user-error)
- "Buffer has been modified; could not load undo-tree history")
- (throw 'load-error nil))
- (condition-case nil
- (setq tree (read (current-buffer)))
- (error
- (kill-buffer nil)
- (funcall (if noerror #'message #'error)
- "Error reading undo-tree history from \"%s\"" filename)
- (throw 'load-error nil)))
- (kill-buffer nil)))
- ;; run post-load transformer functions
- (when undo-tree-post-load-element-functions
- (undo-tree-mapc
- (lambda (node)
- (let ((changeset (undo-tree-node-undo node)))
- (run-hook-wrapped
- 'undo-tree-post-load-element-functions
- (lambda (fun)
- (setq changeset (delq nil (mapcar fun changeset)))))
- (setf (undo-tree-node-undo node) changeset))
- (let ((changeset (undo-tree-node-redo node)))
- (run-hook-wrapped
- 'undo-tree-post-load-element-functions
- (lambda (fun)
- (setq changeset (delq nil (mapcar fun changeset)))))
- (setf (undo-tree-node-redo node) changeset)))
- (undo-tree-root tree))) ;; initialise empty undo-tree object pool
- (setf (undo-tree-object-pool tree)
- (make-hash-table :test 'eq :weakness 'value))
- ;; restore circular undo-tree data structure
- (undo-tree-recircle tree)
- ;; create undo-tree object pool
- (setf (undo-tree-object-pool tree)
- (make-hash-table :test 'eq :weakness 'value))
- (setq buffer-undo-tree tree
- buffer-undo-list '(nil undo-tree-canary)))))
-
-
-
-;; Versions of save/load functions for use in hooks
-(defun undo-tree-save-history-from-hook ()
- (when (and undo-tree-mode undo-tree-auto-save-history
- (not (eq buffer-undo-list t))
- buffer-file-name
- (file-writable-p
- (undo-tree-make-history-save-file-name buffer-file-name)))
- (undo-tree-save-history nil 'overwrite) nil))
-
-(define-obsolete-function-alias
- 'undo-tree-save-history-hook 'undo-tree-save-history-from-hook
- "`undo-tree-save-history-hook' is obsolete since undo-tree
- version 0.6.6. Use `undo-tree-save-history-from-hook' instead.")
-
-
-(defun undo-tree-load-history-from-hook ()
- (when (and undo-tree-mode undo-tree-auto-save-history
- (not (eq buffer-undo-list t))
- (not revert-buffer-in-progress-p))
- (undo-tree-load-history nil 'noerror)))
-
-(define-obsolete-function-alias
- 'undo-tree-load-history-hook 'undo-tree-load-history-from-hook
- "`undo-tree-load-history-hook' is obsolete since undo-tree
- version 0.6.6. Use `undo-tree-load-history-from-hook' instead.")
-
-
-;; install history-auto-save hooks
-(add-hook 'write-file-functions #'undo-tree-save-history-from-hook)
-(add-hook 'kill-buffer-hook #'undo-tree-save-history-from-hook)
-(add-hook 'find-file-hook #'undo-tree-load-history-from-hook)
-
-
-
-
-;;; =====================================================================
-;;; Visualizer drawing functions
-
-(defun undo-tree-visualize ()
- "Visualize the current buffer's undo tree."
- (interactive "*")
- (unless undo-tree-mode
- (user-error "Undo-tree mode not enabled in buffer"))
- (deactivate-mark)
- ;; throw error if undo is disabled in buffer
- (when (eq buffer-undo-list t)
- (user-error "No undo information in this buffer"))
- ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
- (undo-list-transfer-to-tree)
- ;; add hook to kill visualizer buffer if original buffer is changed
- (add-hook 'before-change-functions 'undo-tree-kill-visualizer nil t)
- ;; prepare *undo-tree* buffer, then draw tree in it
- (let ((undo-tree buffer-undo-tree)
- (buff (current-buffer))
- (display-buffer-mark-dedicated 'soft))
- (switch-to-buffer-other-window
- (get-buffer-create undo-tree-visualizer-buffer-name))
- (setq undo-tree-visualizer-parent-buffer buff)
- (setq undo-tree-visualizer-parent-mtime
- (and (buffer-file-name buff)
- (nth 5 (file-attributes (buffer-file-name buff)))))
- (setq undo-tree-visualizer-initial-node (undo-tree-current undo-tree))
- (setq undo-tree-visualizer-spacing
- (undo-tree-visualizer-calculate-spacing))
- (make-local-variable 'undo-tree-visualizer-timestamps)
- (make-local-variable 'undo-tree-visualizer-diff)
- (setq buffer-undo-tree undo-tree)
- (undo-tree-visualizer-mode)
- ;; FIXME; don't know why `undo-tree-visualizer-mode' clears this
- (setq buffer-undo-tree undo-tree)
- (set (make-local-variable 'undo-tree-visualizer-lazy-drawing)
- (or (eq undo-tree-visualizer-lazy-drawing t)
- (and (numberp undo-tree-visualizer-lazy-drawing)
- (>= (undo-tree-count undo-tree)
- undo-tree-visualizer-lazy-drawing))))
- (when undo-tree-visualizer-diff (undo-tree-visualizer-show-diff))
- (let ((inhibit-read-only t)) (undo-tree-draw-tree undo-tree))))
-
-
-(defun undo-tree-kill-visualizer (&rest _dummy)
- ;; Kill visualizer. Added to `before-change-functions' hook of original
- ;; buffer when visualizer is invoked.
- (unless (or undo-tree-inhibit-kill-visualizer
- (null (get-buffer undo-tree-visualizer-buffer-name)))
- (with-current-buffer undo-tree-visualizer-buffer-name
- (undo-tree-visualizer-quit))))
-
-
-
-(defun undo-tree-draw-tree (undo-tree)
- ;; Draw undo-tree in current buffer starting from NODE (or root if nil).
- (let ((inhibit-read-only t)
- (node (if undo-tree-visualizer-lazy-drawing
- (undo-tree-current undo-tree)
- (undo-tree-root undo-tree))))
- (erase-buffer)
- (setq undo-tree-visualizer-needs-extending-down nil
- undo-tree-visualizer-needs-extending-up nil)
- (undo-tree-clear-visualizer-data undo-tree)
- (undo-tree-compute-widths node)
- ;; lazy drawing starts vertically centred and displaced horizontally to
- ;; the left (window-width/4), since trees will typically grow right
- (if undo-tree-visualizer-lazy-drawing
- (progn
- (undo-tree-move-down (/ (window-height) 2))
- (undo-tree-move-forward (max 2 (/ (window-width) 4)))) ; left margin
- ;; non-lazy drawing starts in centre at top of buffer
- (undo-tree-move-down 1) ; top margin
- (undo-tree-move-forward
- (max (/ (window-width) 2)
- (+ (undo-tree-node-char-lwidth node)
- ;; add space for left part of left-most time-stamp
- (if undo-tree-visualizer-timestamps
- (/ (- undo-tree-visualizer-spacing 4) 2)
- 0)
- 2)))) ; left margin
- ;; link starting node to its representation in visualizer
- (setf (undo-tree-node-marker node) (make-marker))
- (set-marker-insertion-type (undo-tree-node-marker node) nil)
- (move-marker (undo-tree-node-marker node) (point))
- ;; draw undo-tree
- (let ((undo-tree-insert-face 'undo-tree-visualizer-default-face)
- node-list)
- (if (not undo-tree-visualizer-lazy-drawing)
- (undo-tree-extend-down node t)
- (undo-tree-extend-down node)
- (undo-tree-extend-up node)
- (setq node-list undo-tree-visualizer-needs-extending-down
- undo-tree-visualizer-needs-extending-down nil)
- (while node-list (undo-tree-extend-down (pop node-list)))))
- ;; highlight active branch
- (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face))
- (undo-tree-highlight-active-branch
- (or undo-tree-visualizer-needs-extending-up
- (undo-tree-root undo-tree))))
- ;; highlight current node
- (undo-tree-draw-node (undo-tree-current undo-tree) 'current)))
-
-
-(defun undo-tree-extend-down (node &optional bottom)
- ;; Extend tree downwards starting from NODE and point. If BOTTOM is t,
- ;; extend all the way down to the leaves. If BOTTOM is a node, extend down
- ;; as far as that node. If BOTTOM is an integer, extend down as far as that
- ;; line. Otherwise, only extend visible portion of tree. NODE is assumed to
- ;; already have a node marker. Returns non-nil if anything was actually
- ;; extended.
- (let ((extended nil)
- (cur-stack (list node))
- next-stack)
- ;; don't bother extending if BOTTOM specifies an already-drawn node
- (unless (and (undo-tree-node-p bottom) (undo-tree-node-marker bottom))
- ;; draw nodes layer by layer
- (while (or cur-stack
- (prog1 (setq cur-stack next-stack)
- (setq next-stack nil)))
- (setq node (pop cur-stack))
- ;; if node is within range being drawn...
- (if (or (eq bottom t)
- (and (undo-tree-node-p bottom)
- (not (eq (undo-tree-node-previous node) bottom)))
- (and (integerp bottom)
- (>= bottom (line-number-at-pos
- (undo-tree-node-marker node))))
- (and (null bottom)
- (pos-visible-in-window-p (undo-tree-node-marker node)
- nil t)))
- ;; ...draw one layer of node's subtree (if not already drawn)
- (progn
- (unless (and (undo-tree-node-next node)
- (undo-tree-node-marker
- (nth (undo-tree-node-branch node)
- (undo-tree-node-next node))))
- (goto-char (undo-tree-node-marker node))
- (undo-tree-draw-subtree node)
- (setq extended t))
- (setq next-stack
- (append (undo-tree-node-next node) next-stack)))
- ;; ...otherwise, postpone drawing until later
- (push node undo-tree-visualizer-needs-extending-down))))
- extended))
-
-
-(defun undo-tree-extend-up (node &optional top)
- ;; Extend tree upwards starting from NODE. If TOP is t, extend all the way
- ;; to root. If TOP is a node, extend up as far as that node. If TOP is an
- ;; integer, extend up as far as that line. Otherwise, only extend visible
- ;; portion of tree. NODE is assumed to already have a node marker. Returns
- ;; non-nil if anything was actually extended.
- (let ((extended nil) parent)
- ;; don't bother extending if TOP specifies an already-drawn node
- (unless (and (undo-tree-node-p top) (undo-tree-node-marker top))
- (while node
- (setq parent (undo-tree-node-previous node))
- ;; if we haven't reached root...
- (if parent
- ;; ...and node is within range being drawn...
- (if (or (eq top t)
- (and (undo-tree-node-p top) (not (eq node top)))
- (and (integerp top)
- (< top (line-number-at-pos
- (undo-tree-node-marker node))))
- (and (null top)
- ;; NOTE: we check point in case window-start is outdated
- (< (min (line-number-at-pos (point))
- (line-number-at-pos (window-start)))
- (line-number-at-pos
- (undo-tree-node-marker node)))))
- ;; ...and it hasn't already been drawn
- (when (not (undo-tree-node-marker parent))
- ;; link parent node to its representation in visualizer
- (undo-tree-compute-widths parent)
- (undo-tree-move-to-parent node)
- (setf (undo-tree-node-marker parent) (make-marker))
- (set-marker-insertion-type
- (undo-tree-node-marker parent) nil)
- (move-marker (undo-tree-node-marker parent) (point))
- ;; draw subtree beneath parent
- (setq undo-tree-visualizer-needs-extending-down
- (nconc (delq node (undo-tree-draw-subtree parent))
- undo-tree-visualizer-needs-extending-down))
- (setq extended t))
- ;; ...otherwise, postpone drawing for later and exit
- (setq undo-tree-visualizer-needs-extending-up (when parent node)
- parent nil))
-
- ;; if we've reached root, stop extending and add top margin
- (setq undo-tree-visualizer-needs-extending-up nil)
- (goto-char (undo-tree-node-marker node))
- (undo-tree-move-up 1) ; top margin
- (delete-region (point-min) (line-beginning-position)))
- ;; next iteration
- (setq node parent)))
- extended))
-
-
-(defun undo-tree-expand-down (from &optional to)
- ;; Expand tree downwards. FROM is the node to start expanding from. Stop
- ;; expanding at TO if specified. Otherwise, just expand visible portion of
- ;; tree and highlight active branch from FROM.
- (when undo-tree-visualizer-needs-extending-down
- (let ((inhibit-read-only t)
- node-list extended)
- ;; extend down as far as TO node
- (when to
- (setq extended (undo-tree-extend-down from to))
- (goto-char (undo-tree-node-marker to))
- (redisplay t)) ; force redisplay to scroll buffer if necessary
- ;; extend visible portion of tree downwards
- (setq node-list undo-tree-visualizer-needs-extending-down
- undo-tree-visualizer-needs-extending-down nil)
- (when node-list
- (dolist (n node-list)
- (when (undo-tree-extend-down n) (setq extended t)))
- ;; highlight active branch in newly-extended-down portion, if any
- (when extended
- (let ((undo-tree-insert-face
- 'undo-tree-visualizer-active-branch-face))
- (undo-tree-highlight-active-branch from)))))))
-
-
-(defun undo-tree-expand-up (from &optional to)
- ;; Expand tree upwards. FROM is the node to start expanding from, TO is the
- ;; node to stop expanding at. If TO node isn't specified, just expand visible
- ;; portion of tree and highlight active branch down to FROM.
- (when undo-tree-visualizer-needs-extending-up
- (let ((inhibit-read-only t)
- extended node-list)
- ;; extend up as far as TO node
- (when to
- (setq extended (undo-tree-extend-up from to))
- (goto-char (undo-tree-node-marker to))
- ;; simulate auto-scrolling if close to top of buffer
- (when (<= (line-number-at-pos (point)) scroll-margin)
- (undo-tree-move-up (if (= scroll-conservatively 0)
- (/ (window-height) 2) 3))
- (when (undo-tree-extend-up to) (setq extended t))
- (goto-char (undo-tree-node-marker to))
- (unless (= scroll-conservatively 0) (recenter scroll-margin))))
- ;; extend visible portion of tree upwards
- (and undo-tree-visualizer-needs-extending-up
- (undo-tree-extend-up undo-tree-visualizer-needs-extending-up)
- (setq extended t))
- ;; extend visible portion of tree downwards
- (setq node-list undo-tree-visualizer-needs-extending-down
- undo-tree-visualizer-needs-extending-down nil)
- (dolist (n node-list) (undo-tree-extend-down n))
- ;; highlight active branch in newly-extended-up portion, if any
- (when extended
- (let ((undo-tree-insert-face
- 'undo-tree-visualizer-active-branch-face))
- (undo-tree-highlight-active-branch
- (or undo-tree-visualizer-needs-extending-up
- (undo-tree-root buffer-undo-tree))
- from))))))
-
-
-
-(defun undo-tree-highlight-active-branch (node &optional end)
- ;; Draw highlighted active branch below NODE in current buffer. Stop
- ;; highlighting at END node if specified.
- (let ((stack (list node)))
- ;; draw active branch
- (while stack
- (setq node (pop stack))
- (unless (or (eq node end)
- (memq node undo-tree-visualizer-needs-extending-down))
- (goto-char (undo-tree-node-marker node))
- (setq node (undo-tree-draw-subtree node 'active)
- stack (nconc stack node))))))
-
-
-(defun undo-tree-draw-node (node &optional current)
- ;; Draw symbol representing NODE in visualizer. If CURRENT is non-nil, node
- ;; is current node.
- (goto-char (undo-tree-node-marker node))
- (when undo-tree-visualizer-timestamps
- (undo-tree-move-backward (/ undo-tree-visualizer-spacing 2)))
-
- (let* ((undo-tree-insert-face (and undo-tree-insert-face
- (or (and (consp undo-tree-insert-face)
- undo-tree-insert-face)
- (list undo-tree-insert-face))))
- (register (undo-tree-node-register node))
- (unmodified (if undo-tree-visualizer-parent-mtime
- (undo-tree-node-unmodified-p
- node undo-tree-visualizer-parent-mtime)
- (undo-tree-node-unmodified-p node)))
- node-string)
- ;; check node's register (if any) still stores appropriate undo-tree state
- (unless (and register
- (undo-tree-register-data-p
- (registerv-data (get-register register)))
- (eq node (undo-tree-register-data-node
- (registerv-data (get-register register)))))
- (setq register nil))
- ;; represent node by different symbols, depending on whether it's the
- ;; current node, is saved in a register, or corresponds to an unmodified
- ;; buffer
- (setq node-string
- (cond
- (undo-tree-visualizer-timestamps
- (undo-tree-timestamp-to-string
- (undo-tree-node-timestamp node)
- undo-tree-visualizer-relative-timestamps
- current register))
- (register (char-to-string register))
- (unmodified "s")
- (current "x")
- (t "o"))
- undo-tree-insert-face
- (nconc
- (cond
- (current '(undo-tree-visualizer-current-face))
- (unmodified '(undo-tree-visualizer-unmodified-face))
- (register '(undo-tree-visualizer-register-face)))
- undo-tree-insert-face))
- ;; draw node and link it to its representation in visualizer
- (undo-tree-insert node-string)
- (undo-tree-move-backward (if undo-tree-visualizer-timestamps
- (1+ (/ undo-tree-visualizer-spacing 2))
- 1))
- (move-marker (undo-tree-node-marker node) (point))
- (put-text-property (point) (1+ (point)) 'undo-tree-node node)))
-
-
-(defun undo-tree-draw-subtree (node &optional active-branch)
- ;; Draw subtree rooted at NODE. The subtree will start from point.
- ;; If ACTIVE-BRANCH is non-nil, just draw active branch below NODE. Returns
- ;; list of nodes below NODE.
- (let ((num-children (length (undo-tree-node-next node)))
- node-list pos trunk-pos n)
- ;; draw node itself
- (undo-tree-draw-node node)
-
- (cond
- ;; if we're at a leaf node, we're done
- ((= num-children 0))
-
- ;; if node has only one child, draw it (not strictly necessary to deal
- ;; with this case separately, but as it's by far the most common case
- ;; this makes the code clearer and more efficient)
- ((= num-children 1)
- (undo-tree-move-down 1)
- (undo-tree-insert ?|)
- (undo-tree-move-backward 1)
- (undo-tree-move-down 1)
- (undo-tree-insert ?|)
- (undo-tree-move-backward 1)
- (undo-tree-move-down 1)
- (setq n (car (undo-tree-node-next node)))
- ;; link next node to its representation in visualizer
- (unless (markerp (undo-tree-node-marker n))
- (setf (undo-tree-node-marker n) (make-marker))
- (set-marker-insertion-type (undo-tree-node-marker n) nil))
- (move-marker (undo-tree-node-marker n) (point))
- ;; add next node to list of nodes to draw next
- (push n node-list))
-
- ;; if node has multiple children, draw branches
- (t
- (undo-tree-move-down 1)
- (undo-tree-insert ?|)
- (undo-tree-move-backward 1)
- (move-marker (setq trunk-pos (make-marker)) (point))
- ;; left subtrees
- (undo-tree-move-backward
- (- (undo-tree-node-char-lwidth node)
- (undo-tree-node-char-lwidth
- (car (undo-tree-node-next node)))))
- (move-marker (setq pos (make-marker)) (point))
- (setq n (cons nil (undo-tree-node-next node)))
- (dotimes (_ (/ num-children 2))
- (setq n (cdr n))
- (when (or (null active-branch)
- (eq (car n)
- (nth (undo-tree-node-branch node)
- (undo-tree-node-next node))))
- (undo-tree-move-forward 2)
- (undo-tree-insert ?_ (- trunk-pos pos 2))
- (goto-char pos)
- (undo-tree-move-forward 1)
- (undo-tree-move-down 1)
- (undo-tree-insert ?/)
- (undo-tree-move-backward 2)
- (undo-tree-move-down 1)
- ;; link node to its representation in visualizer
- (unless (markerp (undo-tree-node-marker (car n)))
- (setf (undo-tree-node-marker (car n)) (make-marker))
- (set-marker-insertion-type (undo-tree-node-marker (car n)) nil))
- (move-marker (undo-tree-node-marker (car n)) (point))
- ;; add node to list of nodes to draw next
- (push (car n) node-list))
- (goto-char pos)
- (undo-tree-move-forward
- (+ (undo-tree-node-char-rwidth (car n))
- (undo-tree-node-char-lwidth (cadr n))
- undo-tree-visualizer-spacing 1))
- (move-marker pos (point)))
- ;; middle subtree (only when number of children is odd)
- (when (= (mod num-children 2) 1)
- (setq n (cdr n))
- (when (or (null active-branch)
- (eq (car n)
- (nth (undo-tree-node-branch node)
- (undo-tree-node-next node))))
- (undo-tree-move-down 1)
- (undo-tree-insert ?|)
- (undo-tree-move-backward 1)
- (undo-tree-move-down 1)
- ;; link node to its representation in visualizer
- (unless (markerp (undo-tree-node-marker (car n)))
- (setf (undo-tree-node-marker (car n)) (make-marker))
- (set-marker-insertion-type (undo-tree-node-marker (car n)) nil))
- (move-marker (undo-tree-node-marker (car n)) (point))
- ;; add node to list of nodes to draw next
- (push (car n) node-list))
- (goto-char pos)
- (undo-tree-move-forward
- (+ (undo-tree-node-char-rwidth (car n))
- (if (cadr n) (undo-tree-node-char-lwidth (cadr n)) 0)
- undo-tree-visualizer-spacing 1))
- (move-marker pos (point)))
- ;; right subtrees
- (move-marker trunk-pos (1+ trunk-pos))
- (dotimes (_ (/ num-children 2))
- (setq n (cdr n))
- (when (or (null active-branch)
- (eq (car n)
- (nth (undo-tree-node-branch node)
- (undo-tree-node-next node))))
- (goto-char trunk-pos)
- (undo-tree-insert ?_ (- pos trunk-pos 1))
- (goto-char pos)
- (undo-tree-move-backward 1)
- (undo-tree-move-down 1)
- (undo-tree-insert ?\\)
- (undo-tree-move-down 1)
- ;; link node to its representation in visualizer
- (unless (markerp (undo-tree-node-marker (car n)))
- (setf (undo-tree-node-marker (car n)) (make-marker))
- (set-marker-insertion-type (undo-tree-node-marker (car n)) nil))
- (move-marker (undo-tree-node-marker (car n)) (point))
- ;; add node to list of nodes to draw next
- (push (car n) node-list))
- (when (cdr n)
- (goto-char pos)
- (undo-tree-move-forward
- (+ (undo-tree-node-char-rwidth (car n))
- (if (cadr n) (undo-tree-node-char-lwidth (cadr n)) 0)
- undo-tree-visualizer-spacing 1))
- (move-marker pos (point))))
- ))
- ;; return list of nodes to draw next
- (nreverse node-list)))
-
-
-(defun undo-tree-node-char-lwidth (node)
- ;; Return left-width of NODE measured in characters.
- (if (= (length (undo-tree-node-next node)) 0) 0
- (- (* (+ undo-tree-visualizer-spacing 1) (undo-tree-node-lwidth node))
- (if (= (undo-tree-node-cwidth node) 0)
- (1+ (/ undo-tree-visualizer-spacing 2)) 0))))
-
-
-(defun undo-tree-node-char-rwidth (node)
- ;; Return right-width of NODE measured in characters.
- (if (= (length (undo-tree-node-next node)) 0) 0
- (- (* (+ undo-tree-visualizer-spacing 1) (undo-tree-node-rwidth node))
- (if (= (undo-tree-node-cwidth node) 0)
- (1+ (/ undo-tree-visualizer-spacing 2)) 0))))
-
-
-(defun undo-tree-insert (str &optional arg)
- ;; Insert character or string STR ARG times, overwriting, and using
- ;; `undo-tree-insert-face'.
- (unless arg (setq arg 1))
- (when (characterp str)
- (setq str (make-string arg str))
- (setq arg 1))
- (dotimes (_ arg) (insert str))
- (setq arg (* arg (length str)))
- (undo-tree-move-forward arg)
- ;; make sure mark isn't active, otherwise `backward-delete-char' might
- ;; delete region instead of single char if transient-mark-mode is enabled
- (setq mark-active nil)
- (backward-delete-char arg)
- (when undo-tree-insert-face
- (put-text-property (- (point) arg) (point) 'face undo-tree-insert-face)))
-
-
-(defun undo-tree-move-down (&optional arg)
- ;; Move down, extending buffer if necessary.
- (let ((row (line-number-at-pos))
- (col (current-column))
- line)
- (unless arg (setq arg 1))
- (forward-line arg)
- (setq line (line-number-at-pos))
- ;; if buffer doesn't have enough lines, add some
- (when (/= line (+ row arg))
- (cond
- ((< arg 0)
- (insert (make-string (- line row arg) ?\n))
- (forward-line (+ arg (- row line))))
- (t (insert (make-string (- arg (- line row)) ?\n)))))
- (undo-tree-move-forward col)))
-
-
-(defun undo-tree-move-up (&optional arg)
- ;; Move up, extending buffer if necessary.
- (unless arg (setq arg 1))
- (undo-tree-move-down (- arg)))
-
-
-(defun undo-tree-move-forward (&optional arg)
- ;; Move forward, extending buffer if necessary.
- (unless arg (setq arg 1))
- (let (n)
- (cond
- ((>= arg 0)
- (setq n (- (line-end-position) (point)))
- (if (> n arg)
- (forward-char arg)
- (end-of-line)
- (insert (make-string (- arg n) ? ))))
- ((< arg 0)
- (setq arg (- arg))
- (setq n (- (point) (line-beginning-position)))
- (when (< (- n 2) arg) ; -2 to create left-margin
- ;; no space left - shift entire buffer contents right!
- (let ((pos (move-marker (make-marker) (point))))
- (set-marker-insertion-type pos t)
- (goto-char (point-min))
- (while (not (eobp))
- (insert-before-markers (make-string (- arg -2 n) ? ))
- (forward-line 1))
- (goto-char pos)))
- (backward-char arg)))))
-
-
-(defun undo-tree-move-backward (&optional arg)
- ;; Move backward, extending buffer if necessary.
- (unless arg (setq arg 1))
- (undo-tree-move-forward (- arg)))
-
-
-(defun undo-tree-move-to-parent (node)
- ;; Move to position of parent of NODE, extending buffer if necessary.
- (let* ((parent (undo-tree-node-previous node))
- (n (undo-tree-node-next parent))
- (l (length n)) p)
- (goto-char (undo-tree-node-marker node))
- (unless (= l 1)
- ;; move horizontally
- (setq p (undo-tree-position node n))
- (cond
- ;; node in centre subtree: no horizontal movement
- ((and (= (mod l 2) 1) (= p (/ l 2))))
- ;; node in left subtree: move right
- ((< p (/ l 2))
- (setq n (nthcdr p n))
- (undo-tree-move-forward
- (+ (undo-tree-node-char-rwidth (car n))
- (/ undo-tree-visualizer-spacing 2) 1))
- (dotimes (_ (- (/ l 2) p 1))
- (setq n (cdr n))
- (undo-tree-move-forward
- (+ (undo-tree-node-char-lwidth (car n))
- (undo-tree-node-char-rwidth (car n))
- undo-tree-visualizer-spacing 1)))
- (when (= (mod l 2) 1)
- (setq n (cdr n))
- (undo-tree-move-forward
- (+ (undo-tree-node-char-lwidth (car n))
- (/ undo-tree-visualizer-spacing 2) 1))))
- (t ;; node in right subtree: move left
- (setq n (nthcdr (/ l 2) n))
- (when (= (mod l 2) 1)
- (undo-tree-move-backward
- (+ (undo-tree-node-char-rwidth (car n))
- (/ undo-tree-visualizer-spacing 2) 1))
- (setq n (cdr n)))
- (dotimes (_ (- p (/ l 2) (mod l 2)))
- (undo-tree-move-backward
- (+ (undo-tree-node-char-lwidth (car n))
- (undo-tree-node-char-rwidth (car n))
- undo-tree-visualizer-spacing 1))
- (setq n (cdr n)))
- (undo-tree-move-backward
- (+ (undo-tree-node-char-lwidth (car n))
- (/ undo-tree-visualizer-spacing 2) 1)))))
- ;; move vertically
- (undo-tree-move-up 3)))
-
-
-(defun undo-tree-timestamp-to-string
- (timestamp &optional relative current register)
- ;; Convert TIMESTAMP to string (either absolute or RELATVE time), indicating
- ;; if it's the CURRENT node and/or has an associated REGISTER.
- (if relative
- ;; relative time
- (let ((time (floor (float-time
- (time-subtract (current-time) timestamp))))
- n)
- (setq time
- ;; years
- (if (> (setq n (/ time 315360000)) 0)
- (if (> n 999) "-ages" (format "-%dy" n))
- (setq time (% time 315360000))
- ;; days
- (if (> (setq n (/ time 86400)) 0)
- (format "-%dd" n)
- (setq time (% time 86400))
- ;; hours
- (if (> (setq n (/ time 3600)) 0)
- (format "-%dh" n)
- (setq time (% time 3600))
- ;; mins
- (if (> (setq n (/ time 60)) 0)
- (format "-%dm" n)
- ;; secs
- (format "-%ds" (% time 60)))))))
- (setq time (concat
- (if current "*" " ")
- time
- (if register (concat "[" (char-to-string register) "]")
- " ")))
- (setq n (length time))
- (if (< n 9)
- (concat (make-string (- 9 n) ? ) time)
- time))
- ;; absolute time
- (concat (if current " *" " ")
- (format-time-string "%H:%M:%S" timestamp)
- (if register
- (concat "[" (char-to-string register) "]")
- " "))))
-
-
-
-
-;;; =====================================================================
-;;; Visualizer modes
-
-(define-derived-mode
- undo-tree-visualizer-mode special-mode "undo-tree-visualizer"
- "Major mode used in undo-tree visualizer.
-
-The undo-tree visualizer can only be invoked from a buffer in
-which `undo-tree-mode' is enabled. The visualizer displays the
-undo history tree graphically, and allows you to browse around
-the undo history, undoing or redoing the corresponding changes in
-the parent buffer.
-
-Within the undo-tree visualizer, the following keys are available:
-
- \\{undo-tree-visualizer-mode-map}"
- :syntax-table nil
- :abbrev-table nil
- (setq truncate-lines t)
- (setq cursor-type nil)
- (setq undo-tree-visualizer-selected-node nil))
-
-
-(define-minor-mode undo-tree-visualizer-selection-mode
- "Toggle mode to select nodes in undo-tree visualizer."
- :lighter "Select"
- :keymap undo-tree-visualizer-selection-mode-map
- :group undo-tree
- (cond
- ;; enable selection mode
- (undo-tree-visualizer-selection-mode
- (setq cursor-type 'box)
- (setq undo-tree-visualizer-selected-node
- (undo-tree-current buffer-undo-tree))
- ;; erase diff (if any), as initially selected node is identical to current
- (when undo-tree-visualizer-diff
- (let ((buff (get-buffer undo-tree-diff-buffer-name))
- (inhibit-read-only t))
- (when buff (with-current-buffer buff (erase-buffer))))))
- (t ;; disable selection mode
- (setq cursor-type nil)
- (setq undo-tree-visualizer-selected-node nil)
- (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree)))
- (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))
- ))
-
-
-
-
-;;; =====================================================================
-;;; Visualizer commands
-
-(defun undo-tree-visualize-undo (&optional arg)
- "Undo changes. A numeric ARG serves as a repeat count."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((old (undo-tree-current buffer-undo-tree))
- current)
- ;; undo in parent buffer
- (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer)
- (deactivate-mark)
- (unwind-protect
- (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-undo-1 arg))
- (setq current (undo-tree-current buffer-undo-tree))
- (switch-to-buffer-other-window undo-tree-visualizer-buffer-name)
- ;; unhighlight old current node
- (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face)
- (inhibit-read-only t))
- (undo-tree-draw-node old))
- ;; when using lazy drawing, extend tree upwards as required
- (when undo-tree-visualizer-lazy-drawing
- (undo-tree-expand-up old current))
- ;; highlight new current node
- (let ((inhibit-read-only t)) (undo-tree-draw-node current 'current))
- ;; update diff display, if any
- (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
-
-
-(defun undo-tree-visualize-redo (&optional arg)
- "Redo changes. A numeric ARG serves as a repeat count."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((old (undo-tree-current buffer-undo-tree))
- current)
- ;; redo in parent buffer
- (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer)
- (deactivate-mark)
- (unwind-protect
- (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-redo-1 arg))
- (setq current (undo-tree-current buffer-undo-tree))
- (switch-to-buffer-other-window undo-tree-visualizer-buffer-name)
- ;; unhighlight old current node
- (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face)
- (inhibit-read-only t))
- (undo-tree-draw-node old))
- ;; when using lazy drawing, extend tree downwards as required
- (when undo-tree-visualizer-lazy-drawing
- (undo-tree-expand-down old current))
- ;; highlight new current node
- (let ((inhibit-read-only t)) (undo-tree-draw-node current 'current))
- ;; update diff display, if any
- (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
-
-
-(defun undo-tree-visualize-switch-branch-right (arg)
- "Switch to next branch of the undo tree.
-This will affect which branch to descend when *redoing* changes
-using `undo-tree-redo' or `undo-tree-visualizer-redo'."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- ;; un-highlight old active branch below current node
- (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree)))
- (let ((undo-tree-insert-face 'undo-tree-visualizer-default-face)
- (inhibit-read-only t))
- (undo-tree-highlight-active-branch (undo-tree-current buffer-undo-tree)))
- ;; increment branch
- (let ((branch (undo-tree-node-branch (undo-tree-current buffer-undo-tree))))
- (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree))
- (cond
- ((>= (+ branch arg) (undo-tree-num-branches))
- (1- (undo-tree-num-branches)))
- ((<= (+ branch arg) 0) 0)
- (t (+ branch arg))))
- (let ((inhibit-read-only t))
- ;; highlight new active branch below current node
- (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree)))
- (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face))
- (undo-tree-highlight-active-branch (undo-tree-current buffer-undo-tree)))
- ;; re-highlight current node
- (undo-tree-draw-node (undo-tree-current buffer-undo-tree) 'current))))
-
-
-(defun undo-tree-visualize-switch-branch-left (arg)
- "Switch to previous branch of the undo tree.
-This will affect which branch to descend when *redoing* changes
-using `undo-tree-redo' or `undo-tree-visualizer-redo'."
- (interactive "p")
- (undo-tree-visualize-switch-branch-right (- arg)))
-
-
-(defun undo-tree-visualizer-quit ()
- "Quit the undo-tree visualizer."
- (interactive)
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (undo-tree-clear-visualizer-data buffer-undo-tree)
- ;; remove kill visualizer hook from parent buffer
- (unwind-protect
- (with-current-buffer undo-tree-visualizer-parent-buffer
- (remove-hook 'before-change-functions 'undo-tree-kill-visualizer t))
- ;; kill diff buffer, if any
- (when undo-tree-visualizer-diff (undo-tree-visualizer-hide-diff))
- (let ((parent undo-tree-visualizer-parent-buffer)
- window)
- ;; kill visualizer buffer
- (kill-buffer nil)
- ;; switch back to parent buffer
- (unwind-protect
- (if (setq window (get-buffer-window parent))
- (select-window window)
- (switch-to-buffer parent))))))
-
-
-(defun undo-tree-visualizer-abort ()
- "Quit the undo-tree visualizer and return buffer to original state."
- (interactive)
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((node undo-tree-visualizer-initial-node))
- (undo-tree-visualizer-quit)
- (undo-tree-set node)))
-
-
-(defun undo-tree-visualizer-set (&optional pos)
- "Set buffer to state corresponding to undo tree node
-at POS, or point if POS is nil."
- (interactive)
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (unless pos (setq pos (point)))
- (let ((node (get-text-property pos 'undo-tree-node)))
- (when node
- ;; set parent buffer to state corresponding to node at POS
- (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer)
- (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-set node))
- (switch-to-buffer-other-window undo-tree-visualizer-buffer-name)
- ;; re-draw undo tree
- (let ((inhibit-read-only t)) (undo-tree-draw-tree buffer-undo-tree))
- (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
-
-
-(defun undo-tree-visualizer-mouse-set (pos)
- "Set buffer to state corresponding to undo tree node
-at mouse event POS."
- (interactive "@e")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (undo-tree-visualizer-set (event-start (nth 1 pos))))
-
-
-(defun undo-tree-visualize-undo-to-x (&optional x)
- "Undo to last branch point, register, or saved state.
-If X is the symbol `branch', undo to last branch point. If X is
-the symbol `register', undo to last register. If X is the symbol
-`saved', undo to last saved state. If X is null, undo to first of
-these that's encountered.
-
-Interactively, a single \\[universal-argument] specifies
-`branch', a double \\[universal-argument] \\[universal-argument]
-specifies `saved', and a negative prefix argument specifies
-`register'."
- (interactive "P")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (when (and (called-interactively-p 'any) x)
- (setq x (prefix-numeric-value x)
- x (cond
- ((< x 0) 'register)
- ((<= x 4) 'branch)
- (t 'saved))))
- (let ((current (if undo-tree-visualizer-selection-mode
- undo-tree-visualizer-selected-node
- (undo-tree-current buffer-undo-tree)))
- (diff undo-tree-visualizer-diff)
- r)
- (undo-tree-visualizer-hide-diff)
- (while (and (undo-tree-node-previous current)
- (or (if undo-tree-visualizer-selection-mode
- (progn
- (undo-tree-visualizer-select-previous)
- (setq current undo-tree-visualizer-selected-node))
- (undo-tree-visualize-undo)
- (setq current (undo-tree-current buffer-undo-tree)))
- t)
- ;; branch point
- (not (or (and (or (null x) (eq x 'branch))
- (> (undo-tree-num-branches) 1))
- ;; register
- (and (or (null x) (eq x 'register))
- (setq r (undo-tree-node-register current))
- (undo-tree-register-data-p
- (setq r (registerv-data (get-register r))))
- (eq current (undo-tree-register-data-node r)))
- ;; saved state
- (and (or (null x) (eq x 'saved))
- (undo-tree-node-unmodified-p current))
- ))))
- ;; update diff display, if any
- (when diff
- (undo-tree-visualizer-show-diff
- (when undo-tree-visualizer-selection-mode
- undo-tree-visualizer-selected-node)))))
-
-
-(defun undo-tree-visualize-redo-to-x (&optional x)
- "Redo to last branch point, register, or saved state.
-If X is the symbol `branch', redo to last branch point. If X is
-the symbol `register', redo to last register. If X is the sumbol
-`saved', redo to last saved state. If X is null, redo to first of
-these that's encountered.
-
-Interactively, a single \\[universal-argument] specifies
-`branch', a double \\[universal-argument] \\[universal-argument]
-specifies `saved', and a negative prefix argument specifies
-`register'."
- (interactive "P")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (when (and (called-interactively-p 'any) x)
- (setq x (prefix-numeric-value x)
- x (cond
- ((< x 0) 'register)
- ((<= x 4) 'branch)
- (t 'saved))))
- (let ((current (if undo-tree-visualizer-selection-mode
- undo-tree-visualizer-selected-node
- (undo-tree-current buffer-undo-tree)))
- (diff undo-tree-visualizer-diff)
- r)
- (undo-tree-visualizer-hide-diff)
- (while (and (undo-tree-node-next current)
- (or (if undo-tree-visualizer-selection-mode
- (progn
- (undo-tree-visualizer-select-next)
- (setq current undo-tree-visualizer-selected-node))
- (undo-tree-visualize-redo)
- (setq current (undo-tree-current buffer-undo-tree)))
- t)
- ;; branch point
- (not (or (and (or (null x) (eq x 'branch))
- (> (undo-tree-num-branches) 1))
- ;; register
- (and (or (null x) (eq x 'register))
- (setq r (undo-tree-node-register current))
- (undo-tree-register-data-p
- (setq r (registerv-data (get-register r))))
- (eq current (undo-tree-register-data-node r)))
- ;; saved state
- (and (or (null x) (eq x 'saved))
- (undo-tree-node-unmodified-p current))
- ))))
- ;; update diff display, if any
- (when diff
- (undo-tree-visualizer-show-diff
- (when undo-tree-visualizer-selection-mode
- undo-tree-visualizer-selected-node)))))
-
-
-(defun undo-tree-visualizer-toggle-timestamps ()
- "Toggle display of time-stamps."
- (interactive)
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (setq undo-tree-visualizer-timestamps (not undo-tree-visualizer-timestamps))
- (setq undo-tree-visualizer-spacing (undo-tree-visualizer-calculate-spacing))
- ;; redraw tree
- (let ((inhibit-read-only t)) (undo-tree-draw-tree buffer-undo-tree)))
-
-
-(defun undo-tree-visualizer-scroll-left (&optional arg)
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (scroll-left (or arg 1) t))
-
-
-(defun undo-tree-visualizer-scroll-right (&optional arg)
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (scroll-right (or arg 1) t))
-
-
-(defun undo-tree-visualizer-scroll-up (&optional arg)
- (interactive "P")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (if (or (and (numberp arg) (< arg 0)) (eq arg '-))
- (undo-tree-visualizer-scroll-down arg)
- ;; scroll up and expand newly-visible portion of tree
- (unwind-protect
- (scroll-up-command arg)
- (undo-tree-expand-down
- (nth (undo-tree-node-branch (undo-tree-current buffer-undo-tree))
- (undo-tree-node-next (undo-tree-current buffer-undo-tree)))))
- ;; signal error if at eob
- (when (and (not undo-tree-visualizer-needs-extending-down) (eobp))
- (scroll-up))))
-
-
-(defun undo-tree-visualizer-scroll-down (&optional arg)
- (interactive "P")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (if (or (and (numberp arg) (< arg 0)) (eq arg '-))
- (undo-tree-visualizer-scroll-up arg)
- ;; ensure there's enough room at top of buffer to scroll
- (let ((scroll-lines
- (or arg (- (window-height) next-screen-context-lines)))
- (window-line (1- (line-number-at-pos (window-start)))))
- (when (and undo-tree-visualizer-needs-extending-up
- (< window-line scroll-lines))
- (let ((inhibit-read-only t))
- (goto-char (point-min))
- (undo-tree-move-up (- scroll-lines window-line)))))
- ;; scroll down and expand newly-visible portion of tree
- (unwind-protect
- (scroll-down-command arg)
- (undo-tree-expand-up
- (undo-tree-node-previous (undo-tree-current buffer-undo-tree))))
- ;; signal error if at bob
- (when (and (not undo-tree-visualizer-needs-extending-down) (bobp))
- (scroll-down))))
-
-
-
-
-;;; =====================================================================
-;;; Visualizer selection mode commands
-
-(defun undo-tree-visualizer-select-previous (&optional arg)
- "Move to previous node."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((node undo-tree-visualizer-selected-node))
- (catch 'top
- (dotimes (_ (or arg 1))
- (unless (undo-tree-node-previous node) (throw 'top t))
- (setq node (undo-tree-node-previous node))))
- ;; when using lazy drawing, extend tree upwards as required
- (when undo-tree-visualizer-lazy-drawing
- (undo-tree-expand-up undo-tree-visualizer-selected-node node))
- ;; update diff display, if any
- (when (and undo-tree-visualizer-diff
- (not (eq node undo-tree-visualizer-selected-node)))
- (undo-tree-visualizer-update-diff node))
- ;; move to selected node
- (goto-char (undo-tree-node-marker node))
- (setq undo-tree-visualizer-selected-node node)))
-
-
-(defun undo-tree-visualizer-select-next (&optional arg)
- "Move to next node."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((node undo-tree-visualizer-selected-node))
- (catch 'bottom
- (dotimes (_ (or arg 1))
- (unless (nth (undo-tree-node-branch node) (undo-tree-node-next node))
- (throw 'bottom t))
- (setq node
- (nth (undo-tree-node-branch node) (undo-tree-node-next node)))))
- ;; when using lazy drawing, extend tree downwards as required
- (when undo-tree-visualizer-lazy-drawing
- (undo-tree-expand-down undo-tree-visualizer-selected-node node))
- ;; update diff display, if any
- (when (and undo-tree-visualizer-diff
- (not (eq node undo-tree-visualizer-selected-node)))
- (undo-tree-visualizer-update-diff node))
- ;; move to selected node
- (goto-char (undo-tree-node-marker node))
- (setq undo-tree-visualizer-selected-node node)))
-
-
-(defun undo-tree-visualizer-select-right (&optional arg)
- "Move right to a sibling node."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((node undo-tree-visualizer-selected-node)
- end)
- (goto-char (undo-tree-node-marker undo-tree-visualizer-selected-node))
- (setq end (line-end-position))
- (catch 'end
- (dotimes (_ arg)
- (while (or (null node) (eq node undo-tree-visualizer-selected-node))
- (forward-char)
- (setq node (get-text-property (point) 'undo-tree-node))
- (when (= (point) end) (throw 'end t)))))
- (goto-char (undo-tree-node-marker
- (or node undo-tree-visualizer-selected-node)))
- (when (and undo-tree-visualizer-diff node
- (not (eq node undo-tree-visualizer-selected-node)))
- (undo-tree-visualizer-update-diff node))
- (when node (setq undo-tree-visualizer-selected-node node))))
-
-
-(defun undo-tree-visualizer-select-left (&optional arg)
- "Move left to a sibling node."
- (interactive "p")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (let ((node (get-text-property (point) 'undo-tree-node))
- beg)
- (goto-char (undo-tree-node-marker undo-tree-visualizer-selected-node))
- (setq beg (line-beginning-position))
- (catch 'beg
- (dotimes (_ arg)
- (while (or (null node) (eq node undo-tree-visualizer-selected-node))
- (backward-char)
- (setq node (get-text-property (point) 'undo-tree-node))
- (when (= (point) beg) (throw 'beg t)))))
- (goto-char (undo-tree-node-marker
- (or node undo-tree-visualizer-selected-node)))
- (when (and undo-tree-visualizer-diff node
- (not (eq node undo-tree-visualizer-selected-node)))
- (undo-tree-visualizer-update-diff node))
- (when node (setq undo-tree-visualizer-selected-node node))))
-
-
-(defun undo-tree-visualizer-select (pos)
- (let ((node (get-text-property pos 'undo-tree-node)))
- (when node
- ;; select node at POS
- (goto-char (undo-tree-node-marker node))
- ;; when using lazy drawing, extend tree up and down as required
- (when undo-tree-visualizer-lazy-drawing
- (undo-tree-expand-up undo-tree-visualizer-selected-node node)
- (undo-tree-expand-down undo-tree-visualizer-selected-node node))
- ;; update diff display, if any
- (when (and undo-tree-visualizer-diff
- (not (eq node undo-tree-visualizer-selected-node)))
- (undo-tree-visualizer-update-diff node))
- ;; update selected node
- (setq undo-tree-visualizer-selected-node node)
- )))
-
-
-(defun undo-tree-visualizer-mouse-select (pos)
- "Select undo tree node at mouse event POS."
- (interactive "@e")
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (undo-tree-visualizer-select (event-start (nth 1 pos))))
-
-
-
-
-;;; =====================================================================
-;;; Visualizer diff display
-
-(defun undo-tree-visualizer-toggle-diff ()
- "Toggle diff display in undo-tree visualizer."
- (interactive)
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (if undo-tree-visualizer-diff
- (undo-tree-visualizer-hide-diff)
- (undo-tree-visualizer-show-diff)))
-
-
-(defun undo-tree-visualizer-selection-toggle-diff ()
- "Toggle diff display in undo-tree visualizer selection mode."
- (interactive)
- (unless (eq major-mode 'undo-tree-visualizer-mode)
- (user-error "Undo-tree mode not enabled in buffer"))
- (if undo-tree-visualizer-diff
- (undo-tree-visualizer-hide-diff)
- (let ((node (get-text-property (point) 'undo-tree-node)))
- (when node (undo-tree-visualizer-show-diff node)))))
-
-
-(defun undo-tree-visualizer-show-diff (&optional node)
- ;; show visualizer diff display
- (setq undo-tree-visualizer-diff t)
- (let ((buff (with-current-buffer undo-tree-visualizer-parent-buffer
- (undo-tree-diff node)))
- (display-buffer-mark-dedicated 'soft)
- win)
- (setq win (split-window))
- (set-window-buffer win buff)
- (shrink-window-if-larger-than-buffer win)))
-
-
-(defun undo-tree-visualizer-hide-diff ()
- ;; hide visualizer diff display
- (setq undo-tree-visualizer-diff nil)
- (let ((win (get-buffer-window undo-tree-diff-buffer-name)))
- (when win (with-selected-window win (kill-buffer-and-window)))))
-
-
-(defun undo-tree-diff (&optional node)
- ;; Create diff between NODE and current state (or previous state and current
- ;; state, if NODE is null). Returns buffer containing diff.
- (let (tmpfile buff)
- ;; generate diff
- (let ((undo-tree-inhibit-kill-visualizer t)
- (current (undo-tree-current buffer-undo-tree)))
- (undo-tree-set (or node (undo-tree-node-previous current) current)
- 'preserve-timestamps)
- (setq tmpfile (diff-file-local-copy (current-buffer)))
- (undo-tree-set current 'preserve-timestamps))
- (setq buff (diff-no-select
- tmpfile (current-buffer) nil 'noasync
- (get-buffer-create undo-tree-diff-buffer-name)))
- ;; delete process messages and useless headers from diff buffer
- (let ((inhibit-read-only t))
- (with-current-buffer buff
- (goto-char (point-min))
- (delete-region (point) (1+ (line-end-position 3)))
- (goto-char (point-max))
- (forward-line -2)
- (delete-region (point) (point-max))
- (setq cursor-type nil)
- (setq buffer-read-only t)))
- buff))
-
-
-(defun undo-tree-visualizer-update-diff (&optional node)
- ;; update visualizer diff display to show diff between current state and
- ;; NODE (or previous state, if NODE is null)
- (with-current-buffer undo-tree-visualizer-parent-buffer
- (undo-tree-diff node))
- (let ((win (get-buffer-window undo-tree-diff-buffer-name)))
- (when win
- (balance-windows)
- (shrink-window-if-larger-than-buffer win))))
-
-;;;; ChangeLog:
-
-;; 2020-01-28 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Undo-tree bug-fix release.
-;;
-;; 2020-01-26 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Undo-tree point release.
-;;
-;; 2020-01-11 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Undo-tree bug-fix release.
-;;
-;; 2020-01-09 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Bump undo-tree version number.
-;;
-;; 2020-01-09 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Undo-tree bug-fix release.
-;;
-;; 2020-01-06 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; New undo-tree package release.
-;;
-;; 2014-05-01 Barry O'Reilly <boreilly@aer.com>
-;;
-;; Fix bug that caused undo-tree to hang when undoing in region
-;; (bug#16377).
-;;
-;; 2013-12-28 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; * undo-tree: Update to version 0.6.5.
-;;
-;; 2012-12-05 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Update undo-tree to version 0.6.3
-;;
-;; * undo-tree.el: Implement lazy tree drawing to significantly speed up
-;; visualization of large trees + various more minor improvements.
-;;
-;; 2012-09-25 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Updated undo-tree package to version 0.5.5.
-;;
-;; Small bug-fix to avoid hooks triggering an error when trying to save
-;; undo history in a buffer where undo is disabled.
-;;
-;; 2012-09-11 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Updated undo-tree package to version 0.5.4
-;;
-;; Bug-fixes and improvements to persistent history storage.
-;;
-;; 2012-07-18 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; Update undo-tree to version 0.5.3
-;;
-;; * undo-tree.el: Cope gracefully with undo boundaries being deleted
-;; (cf. bug#11774). Allow customization of directory to which undo history
-;; is
-;; saved.
-;;
-;; 2012-05-24 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; updated undo-tree package to version 0.5.2
-;;
-;; * undo-tree.el: add diff view feature in undo-tree visualizer.
-;;
-;; 2012-05-02 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; undo-tree.el: Update package to version 0.4
-;;
-;; 2012-04-20 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; undo-tree.el: Update package to version 0.3.4
-;;
-;; * undo-tree.el (undo-list-pop-changeset): fix pernicious bug causing
-;; undo history to be lost.
-;; (buffer-undo-tree): set permanent-local property.
-;; (undo-tree-enable-undo-in-region): add new customization option allowing
-;; undo-in-region to be disabled.
-;;
-;; 2012-01-26 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; undo-tree.el: Fixed copyright attribution and Emacs status.
-;;
-;; 2012-01-26 Toby S. Cubitt <tsc25@cantab.net>
-;;
-;; undo-tree.el: Update package to version 0.3.3
-;;
-;; 2011-09-17 Stefan Monnier <monnier@iro.umontreal.ca>
-;;
-;; Add undo-tree.el
-;;
-
-
-
-
-(provide 'undo-tree)
-
-;;; undo-tree.el ends here
diff --git a/elpa/use-package-20200721.2156/dir b/elpa/use-package-20200721.2156/dir
deleted file mode 100644
index 651b05d..0000000
--- a/elpa/use-package-20200721.2156/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* use-package: (use-package). Declarative package configuration for Emacs.
diff --git a/elpa/use-package-20200721.2156/use-package-autoloads.el b/elpa/use-package-20200721.2156/use-package-autoloads.el
deleted file mode 100644
index d5946cd..0000000
--- a/elpa/use-package-20200721.2156/use-package-autoloads.el
+++ /dev/null
@@ -1,232 +0,0 @@
-;;; use-package-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "use-package-bind-key" "use-package-bind-key.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from use-package-bind-key.el
-
-(autoload 'use-package-autoload-keymap "use-package-bind-key" "\
-Loads PACKAGE and then binds the key sequence used to invoke
-this function to KEYMAP-SYMBOL. It then simulates pressing the
-same key sequence a again, so that the next key pressed is routed
-to the newly loaded keymap.
-
-This function supports use-package's :bind-keymap keyword. It
-works by binding the given key sequence to an invocation of this
-function for a particular keymap. The keymap is expected to be
-defined by the package. In this way, loading the package is
-deferred until the prefix key sequence is pressed.
-
-\(fn KEYMAP-SYMBOL PACKAGE OVERRIDE)" nil nil)
-
-(autoload 'use-package-normalize-binder "use-package-bind-key" "\
-
-
-\(fn NAME KEYWORD ARGS)" nil nil)
-
-(defalias 'use-package-normalize/:bind 'use-package-normalize-binder)
-
-(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder)
-
-(defalias 'use-package-autoloads/:bind 'use-package-autoloads-mode)
-
-(defalias 'use-package-autoloads/:bind* 'use-package-autoloads-mode)
-
-(autoload 'use-package-handler/:bind "use-package-bind-key" "\
-
-
-\(fn NAME KEYWORD ARGS REST STATE &optional BIND-MACRO)" nil nil)
-
-(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder)
-
-(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder)
-
-(autoload 'use-package-handler/:bind-keymap "use-package-bind-key" "\
-
-
-\(fn NAME KEYWORD ARGS REST STATE &optional OVERRIDE)" nil nil)
-
-(autoload 'use-package-handler/:bind-keymap* "use-package-bind-key" "\
-
-
-\(fn NAME KEYWORD ARG REST STATE)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-bind-key" '("use-package-handler/:bind*")))
-
-;;;***
-
-;;;### (autoloads nil "use-package-core" "use-package-core.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from use-package-core.el
-
-(autoload 'use-package "use-package-core" "\
-Declare an Emacs package by specifying a group of configuration options.
-
-For full documentation, please see the README file that came with
-this file. Usage:
-
- (use-package package-name
- [:keyword [option]]...)
-
-:init Code to run before PACKAGE-NAME has been loaded.
-:config Code to run after PACKAGE-NAME has been loaded. Note that
- if loading is deferred for any reason, this code does not
- execute until the lazy load has occurred.
-:preface Code to be run before everything except `:disabled'; this
- can be used to define functions for use in `:if', or that
- should be seen by the byte-compiler.
-
-:mode Form to be added to `auto-mode-alist'.
-:magic Form to be added to `magic-mode-alist'.
-:magic-fallback Form to be added to `magic-fallback-mode-alist'.
-:interpreter Form to be added to `interpreter-mode-alist'.
-
-:commands Define autoloads for commands that will be defined by the
- package. This is useful if the package is being lazily
- loaded, and you wish to conditionally call functions in your
- `:init' block that are defined in the package.
-:hook Specify hook(s) to attach this package to.
-
-:bind Bind keys, and define autoloads for the bound commands.
-:bind* Bind keys, and define autoloads for the bound commands,
- *overriding all minor mode bindings*.
-:bind-keymap Bind a key prefix to an auto-loaded keymap defined in the
- package. This is like `:bind', but for keymaps.
-:bind-keymap* Like `:bind-keymap', but overrides all minor mode bindings
-
-:defer Defer loading of a package -- this is implied when using
- `:commands', `:bind', `:bind*', `:mode', `:magic', `:hook',
- `:magic-fallback', or `:interpreter'. This can be an integer,
- to force loading after N seconds of idle time, if the package
- has not already been loaded.
-:after Delay the use-package declaration until after the named modules
- have loaded. Once load, it will be as though the use-package
- declaration (without `:after') had been seen at that moment.
-:demand Prevent the automatic deferred loading introduced by constructs
- such as `:bind' (see `:defer' for the complete list).
-
-:if EXPR Initialize and load only if EXPR evaluates to a non-nil value.
-:disabled The package is ignored completely if this keyword is present.
-:defines Declare certain variables to silence the byte-compiler.
-:functions Declare certain functions to silence the byte-compiler.
-:load-path Add to the `load-path' before attempting to load the package.
-:diminish Support for diminish.el (if installed).
-:delight Support for delight.el (if installed).
-:custom Call `custom-set' or `set-default' with each variable
- definition without modifying the Emacs `custom-file'.
- (compare with `custom-set-variables').
-:custom-face Call `customize-set-faces' with each face definition.
-:ensure Loads the package using package.el if necessary.
-:pin Pin the package to an archive.
-
-\(fn NAME &rest ARGS)" nil t)
-
-(function-put 'use-package 'lisp-indent-function '1)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-core" '("use-package-")))
-
-;;;***
-
-;;;### (autoloads nil "use-package-delight" "use-package-delight.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from use-package-delight.el
-
-(autoload 'use-package-normalize/:delight "use-package-delight" "\
-Normalize arguments to delight.
-
-\(fn NAME KEYWORD ARGS)" nil nil)
-
-(autoload 'use-package-handler/:delight "use-package-delight" "\
-
-
-\(fn NAME KEYWORD ARGS REST STATE)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-delight" '("use-package-normalize-delight")))
-
-;;;***
-
-;;;### (autoloads nil "use-package-diminish" "use-package-diminish.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from use-package-diminish.el
-
-(autoload 'use-package-normalize/:diminish "use-package-diminish" "\
-
-
-\(fn NAME KEYWORD ARGS)" nil nil)
-
-(autoload 'use-package-handler/:diminish "use-package-diminish" "\
-
-
-\(fn NAME KEYWORD ARG REST STATE)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-diminish" '("use-package-normalize-diminish")))
-
-;;;***
-
-;;;### (autoloads nil "use-package-ensure" "use-package-ensure.el"
-;;;;;; (0 0 0 0))
-;;; Generated autoloads from use-package-ensure.el
-
-(autoload 'use-package-normalize/:ensure "use-package-ensure" "\
-
-
-\(fn NAME KEYWORD ARGS)" nil nil)
-
-(autoload 'use-package-handler/:ensure "use-package-ensure" "\
-
-
-\(fn NAME KEYWORD ENSURE REST STATE)" nil nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-ensure" '("use-package-")))
-
-;;;***
-
-;;;### (autoloads nil "use-package-jump" "use-package-jump.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from use-package-jump.el
-
-(autoload 'use-package-jump-to-package-form "use-package-jump" "\
-Attempt to find and jump to the `use-package' form that loaded
-PACKAGE. This will only find the form if that form actually
-required PACKAGE. If PACKAGE was previously required then this
-function will jump to the file that originally required PACKAGE
-instead.
-
-\(fn PACKAGE)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-jump" '("use-package-find-require")))
-
-;;;***
-
-;;;### (autoloads nil "use-package-lint" "use-package-lint.el" (0
-;;;;;; 0 0 0))
-;;; Generated autoloads from use-package-lint.el
-
-(autoload 'use-package-lint "use-package-lint" "\
-Check for errors in use-package declarations.
-For example, if the module's `:if' condition is met, but even
-with the specified `:load-path' the module cannot be found.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-lint" '("use-package-lint-declaration")))
-
-;;;***
-
-;;;### (autoloads nil nil ("use-package-pkg.el" "use-package.el")
-;;;;;; (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; use-package-autoloads.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-bind-key.el b/elpa/use-package-20200721.2156/use-package-bind-key.el
deleted file mode 100644
index e476b06..0000000
--- a/elpa/use-package-20200721.2156/use-package-bind-key.el
+++ /dev/null
@@ -1,172 +0,0 @@
-;;; use-package-bind-key.el --- Support for the :bind/:bind-keymap keywords -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 4 Dec 2017
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (use-package "2.4") (bind-key "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Provides support for the :bind, :bind*, :bind-keymap and :bind-keymap*
-;; keywords. Note that these are currently still baked into
-;; `use-package-keywords' and `use-package-deferring-keywords', although this
-;; is harmless if they are never used.
-
-;;; Code:
-
-(require 'use-package-core)
-(require 'bind-key)
-
-;;;###autoload
-(defun use-package-autoload-keymap (keymap-symbol package override)
- "Loads PACKAGE and then binds the key sequence used to invoke
-this function to KEYMAP-SYMBOL. It then simulates pressing the
-same key sequence a again, so that the next key pressed is routed
-to the newly loaded keymap.
-
-This function supports use-package's :bind-keymap keyword. It
-works by binding the given key sequence to an invocation of this
-function for a particular keymap. The keymap is expected to be
-defined by the package. In this way, loading the package is
-deferred until the prefix key sequence is pressed."
- (if (not (require package nil t))
- (use-package-error (format "Cannot load package.el: %s" package))
- (if (and (boundp keymap-symbol)
- (keymapp (symbol-value keymap-symbol)))
- (let* ((kv (this-command-keys-vector))
- (key (key-description kv))
- (keymap (symbol-value keymap-symbol)))
- (if override
- (bind-key* key keymap)
- (bind-key key keymap))
- (setq unread-command-events
- (mapcar (lambda (ev) (cons t ev))
- (listify-key-sequence kv))))
- (use-package-error
- (format "package.el %s failed to define keymap %s"
- package keymap-symbol)))))
-
-;;;###autoload
-(defun use-package-normalize-binder (name keyword args)
- (let ((arg args)
- args*)
- (while arg
- (let ((x (car arg)))
- (cond
- ;; (KEY . COMMAND)
- ((and (consp x)
- (or (stringp (car x))
- (vectorp (car x)))
- (or (use-package-recognize-function (cdr x) t #'stringp)))
- (setq args* (nconc args* (list x)))
- (setq arg (cdr arg)))
- ;; KEYWORD
- ;; :map KEYMAP
- ;; :prefix-docstring STRING
- ;; :prefix-map SYMBOL
- ;; :prefix STRING
- ;; :filter SEXP
- ;; :menu-name STRING
- ;; :package SYMBOL
- ((or (and (eq x :map) (symbolp (cadr arg)))
- (and (eq x :prefix) (stringp (cadr arg)))
- (and (eq x :prefix-map) (symbolp (cadr arg)))
- (and (eq x :prefix-docstring) (stringp (cadr arg)))
- (eq x :filter)
- (and (eq x :menu-name) (stringp (cadr arg)))
- (and (eq x :package) (symbolp (cadr arg))))
- (setq args* (nconc args* (list x (cadr arg))))
- (setq arg (cddr arg)))
- ((listp x)
- (setq args*
- (nconc args* (use-package-normalize-binder name keyword x)))
- (setq arg (cdr arg)))
- (t
- ;; Error!
- (use-package-error
- (concat (symbol-name name)
- " wants arguments acceptable to the `bind-keys' macro,"
- " or a list of such values"))))))
- args*))
-
-;;;; :bind, :bind*
-
-;;;###autoload
-(defalias 'use-package-normalize/:bind 'use-package-normalize-binder)
-;;;###autoload
-(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder)
-
-;; jww (2017-12-07): This is too simplistic. It will fail to determine
-;; autoloads in this situation:
-;; (use-package foo
-;; :bind (:map foo-map (("C-a" . func))))
-;;;###autoload
-(defalias 'use-package-autoloads/:bind 'use-package-autoloads-mode)
-;;;###autoload
-(defalias 'use-package-autoloads/:bind* 'use-package-autoloads-mode)
-
-;;;###autoload
-(defun use-package-handler/:bind
- (name _keyword args rest state &optional bind-macro)
- (use-package-concat
- (use-package-process-keywords name rest state)
- `(,@(mapcar
- #'(lambda (xs)
- `(,(if bind-macro bind-macro 'bind-keys)
- :package ,name ,@(use-package-normalize-commands xs)))
- (use-package-split-list-at-keys :break args)))))
-
-(defun use-package-handler/:bind* (name keyword arg rest state)
- (use-package-handler/:bind name keyword arg rest state 'bind-keys*))
-
-;;;; :bind-keymap, :bind-keymap*
-
-;;;###autoload
-(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder)
-;;;###autoload
-(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder)
-
-;;;###autoload
-(defun use-package-handler/:bind-keymap
- (name _keyword args rest state &optional override)
- (use-package-concat
- (use-package-process-keywords name rest state)
- (mapcar
- #'(lambda (binding)
- `(,(if override 'bind-key* 'bind-key)
- ,(car binding)
- #'(lambda ()
- (interactive)
- (use-package-autoload-keymap
- ',(cdr binding) ',(use-package-as-symbol name)
- ,override))))
- args)))
-
-;;;###autoload
-(defun use-package-handler/:bind-keymap* (name keyword arg rest state)
- (use-package-handler/:bind-keymap name keyword arg rest state t))
-
-(provide 'use-package-bind-key)
-
-;;; use-package-bind-key.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-core.el b/elpa/use-package-20200721.2156/use-package-core.el
deleted file mode 100644
index a36f73f..0000000
--- a/elpa/use-package-20200721.2156/use-package-core.el
+++ /dev/null
@@ -1,1599 +0,0 @@
-;;; use-package-core.el --- A configuration macro for simplifying your .emacs -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 29 Nov 2017
-;; Version: 2.4
-;; Package-Requires: ((emacs "24.3"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; The `use-package' declaration macro allows you to isolate package
-;; configuration in your ".emacs" in a way that is performance-oriented and,
-;; well, just tidy. I created it because I have over 80 packages that I use
-;; in Emacs, and things were getting difficult to manage. Yet with this
-;; utility my total load time is just under 1 second, with no loss of
-;; functionality!
-;;
-;; Please see README.md from the same repository for documentation.
-
-;;; Code:
-
-(require 'bytecomp)
-(require 'cl-lib)
-(require 'tabulated-list)
-
-(if (and (eq emacs-major-version 24) (eq emacs-minor-version 3))
- (defsubst hash-table-keys (hash-table)
- "Return a list of keys in HASH-TABLE."
- (cl-loop for k being the hash-keys of hash-table collect k))
- (eval-when-compile (require 'subr-x)))
-
-(eval-when-compile
- (require 'regexp-opt))
-
-(defgroup use-package nil
- "A use-package declaration for simplifying your `.emacs'."
- :group 'startup)
-
-(defconst use-package-version "2.4"
- "This version of use-package.")
-
-(defcustom use-package-keywords
- '(:disabled
- :load-path
- :requires
- :defines
- :functions
- :preface
- :if :when :unless
- :no-require
- :catch
- :after
- :custom
- :custom-face
- :bind
- :bind*
- :bind-keymap
- :bind-keymap*
- :interpreter
- :mode
- :magic
- :magic-fallback
- :hook
- ;; Any other keyword that also declares commands to be autoloaded (such as
- ;; :bind) must appear before this keyword.
- :commands
- :init
- :defer
- :demand
- :load
- ;; This must occur almost last; the only forms which should appear after
- ;; are those that must happen directly after the config forms.
- :config)
- "The set of valid keywords, in the order they are processed in.
-The order of this list is *very important*, so it is only
-advisable to insert new keywords, never to delete or reorder
-them. Further, attention should be paid to the NEWS.md if the
-default order ever changes, as they may have subtle effects on
-the semantics of use-package declarations and may necessitate
-changing where you had inserted a new keyword earlier.
-
-Note that `:disabled' is special in this list, as it causes
-nothing at all to happen, even if the rest of the use-package
-declaration is incorrect."
- :type '(repeat symbol)
- :group 'use-package)
-
-(defcustom use-package-deferring-keywords
- '(:bind-keymap
- :bind-keymap*
- :commands)
- "Unless `:demand' is used, keywords in this list imply deferred loading.
-The reason keywords like `:hook' are not in this list is that
-they only imply deferred loading if they reference actual
-function symbols that can be autoloaded from the module; whereas
-the default keywords provided here always defer loading unless
-otherwise requested."
- :type '(repeat symbol)
- :group 'use-package)
-
-(defcustom use-package-ignore-unknown-keywords nil
- "If non-nil, issue warning instead of error when unknown
-keyword is encountered. The unknown keyword and its associated
-arguments will be ignored in the `use-package' expansion."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-verbose nil
- "Whether to report about loading and configuration details.
-If you customize this, then you should require the `use-package'
-feature in files that use `use-package', even if these files only
-contain compiled expansions of the macros. If you don't do so,
-then the expanded macros do their job silently."
- :type '(choice (const :tag "Quiet, without catching errors" errors)
- (const :tag "Quiet" nil)
- (const :tag "Verbose" t)
- (const :tag "Debug" debug))
- :group 'use-package)
-
-(defcustom use-package-check-before-init nil
- "If non-nil, check that package exists before executing its `:init' block.
-This check is performed by calling `locate-library'."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-always-defer nil
- "If non-nil, assume `:defer t' unless `:demand' is used.
-See also `use-package-defaults', which uses this value."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-always-demand nil
- "If non-nil, assume `:demand t' unless `:defer' is used.
-See also `use-package-defaults', which uses this value."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-defaults
- '(;; this '(t) has special meaning; see `use-package-handler/:config'
- (:config '(t) t)
- (:init nil t)
- (:catch t (lambda (name args)
- (not use-package-expand-minimally)))
- (:defer use-package-always-defer
- (lambda (name args)
- (and use-package-always-defer
- (not (plist-member args :defer))
- (not (plist-member args :demand)))))
- (:demand use-package-always-demand
- (lambda (name args)
- (and use-package-always-demand
- (not (plist-member args :defer))
- (not (plist-member args :demand))))))
- "Default values for specified `use-package' keywords.
-Each entry in the alist is a list of three elements:
-The first element is the `use-package' keyword.
-
-The second is a form that can be evaluated to get the default
-value. It can also be a function that will receive the name of
-the use-package declaration and the keyword plist given to
-`use-package', in normalized form. The value it returns should
-also be in normalized form (which is sometimes *not* what one
-would normally write in a `use-package' declaration, so use
-caution).
-
-The third element is a form that can be evaluated to determine
-whether or not to assign a default value; if it evaluates to nil,
-then the default value is not assigned even if the keyword is not
-present in the `use-package' form. This third element may also be
-a function, in which case it receives the name of the package (as
-a symbol) and a list of keywords (in normalized form). It should
-return nil or non-nil depending on whether defaulting should be
-attempted."
- :type `(repeat
- (list (choice :tag "Keyword"
- ,@(mapcar #'(lambda (k) (list 'const k))
- use-package-keywords))
- (choice :tag "Default value" sexp function)
- (choice :tag "Enable if non-nil" sexp function)))
- :group 'use-package)
-
-(defcustom use-package-merge-key-alist
- '((:if . (lambda (new old) `(and ,new ,old)))
- (:after . (lambda (new old) `(:all ,new ,old)))
- (:defer . (lambda (new old) old))
- (:bind . (lambda (new old) (append new (list :break) old))))
- "Alist of keys and the functions used to merge multiple values.
-For example, if the following form is provided:
-
- (use-package foo :if pred1 :if pred2)
-
-Then based on the above defaults, the merged result will be:
-
- (use-package foo :if (and pred1 pred2))
-
-This is done so that, at the stage of invoking handlers, each
-handler is called only once."
- :type `(repeat
- (cons (choice :tag "Keyword"
- ,@(mapcar #'(lambda (k) (list 'const k))
- use-package-keywords)
- (const :tag "Any" t))
- function))
- :group 'use-package)
-
-(defcustom use-package-hook-name-suffix "-hook"
- "Text append to the name of hooks mentioned by :hook.
-Set to nil if you don't want this to happen; it's only a
-convenience."
- :type '(choice string (const :tag "No suffix" nil))
- :group 'use-package)
-
-(defcustom use-package-minimum-reported-time 0.1
- "Minimal load time that will be reported.
-Note that `use-package-verbose' has to be set to a non-nil value
-for anything to be reported at all."
- :type 'number
- :group 'use-package)
-
-(defcustom use-package-inject-hooks nil
- "If non-nil, add hooks to the `:init' and `:config' sections.
-In particular, for a given package `foo', the following hooks
-become available:
-
- `use-package--foo--pre-init-hook'
- `use-package--foo--post-init-hook'
- `use-package--foo--pre-config-hook'
- `use-package--foo--post-config-hook'
-
-This way, you can add to these hooks before evaluation of a
-`use-package` declaration, and exercise some control over what
-happens.
-
-NOTE: These hooks are run even if the user does not specify an
-`:init' or `:config' block, and they will happen at the regular
-time when initialization and configuration would have been
-performed.
-
-NOTE: If the `pre-init' hook return a nil value, that block's
-user-supplied configuration is not evaluated, so be certain to
-return t if you only wish to add behavior to what the user had
-specified."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-expand-minimally nil
- "If non-nil, make the expanded code as minimal as possible.
-This disables:
-
- - Printing to the *Messages* buffer of slowly-evaluating forms
- - Capturing of load errors (normally redisplayed as warnings)
- - Conditional loading of packages (load failures become errors)
-
-The main advantage to this variable is that, if you know your
-configuration works, it will make the byte-compiled file as
-minimal as possible. It can also help with reading macro-expanded
-definitions, to understand the main intent of what's happening."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-form-regexp-eval
- `(concat ,(eval-when-compile
- (concat "^\\s-*("
- (regexp-opt '("use-package" "require") t)
- "\\s-+\\("))
- (or (bound-and-true-p lisp-mode-symbol-regexp)
- "\\(?:\\sw\\|\\s_\\|\\\\.\\)+") "\\)")
- "Sexp providing regexp for finding use-package forms in user files.
-This is used by `use-package-jump-to-package-form' and
-`use-package-enable-imenu-support'."
- :type 'sexp
- :group 'use-package)
-
-(defcustom use-package-enable-imenu-support nil
- "If non-nil, cause imenu to see `use-package' declarations.
-This is done by adjusting `lisp-imenu-generic-expression' to
-include support for finding `use-package' and `require' forms.
-
-Must be set before loading use-package."
- :type 'boolean
- :set
- #'(lambda (_sym value)
- (eval-after-load 'lisp-mode
- (if value
- `(add-to-list 'lisp-imenu-generic-expression
- (list "Packages" ,use-package-form-regexp-eval 2))
- `(setq lisp-imenu-generic-expression
- (remove (list "Packages" ,use-package-form-regexp-eval 2)
- lisp-imenu-generic-expression)))))
- :group 'use-package)
-
-(defconst use-package-font-lock-keywords
- '(("(\\(use-package\\)\\_>[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?"
- (1 font-lock-keyword-face)
- (2 font-lock-constant-face nil t))))
-
-(font-lock-add-keywords 'emacs-lisp-mode use-package-font-lock-keywords)
-
-(defcustom use-package-compute-statistics nil
- "If non-nil, compute statistics concerned use-package declarations.
-View the statistical report using `use-package-report'. Note that
-if this option is enabled, you must require `use-package' in your
-user init file at loadup time, or you will see errors concerning
-undefined variables."
- :type 'boolean
- :group 'use-package)
-
-(defvar use-package-statistics (make-hash-table))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Utility functions
-;;
-
-(defsubst use-package-error (msg)
- "Report MSG as an error, so the user knows it came from this package."
- (error "use-package: %s" msg))
-
-(defsubst use-package-concat (&rest elems)
- "Delete all empty lists from ELEMS (nil or (list nil)), and append them."
- (apply #'append (delete nil (delete (list nil) elems))))
-
-(defsubst use-package-non-nil-symbolp (sym)
- (and sym (symbolp sym)))
-
-(defsubst use-package-as-symbol (string-or-symbol)
- "If STRING-OR-SYMBOL is already a symbol, return it. Otherwise
-convert it to a symbol and return that."
- (if (symbolp string-or-symbol) string-or-symbol
- (intern string-or-symbol)))
-
-(defsubst use-package-as-string (string-or-symbol)
- "If STRING-OR-SYMBOL is already a string, return it. Otherwise
-convert it to a string and return that."
- (if (stringp string-or-symbol) string-or-symbol
- (symbol-name string-or-symbol)))
-
-(defsubst use-package-regex-p (re)
- "Return t if RE is some regexp-like thing."
- (or (and (listp re) (eq (car re) 'rx))
- (stringp re)))
-
-(defun use-package-normalize-regex (re)
- "Given some regexp-like thing in RE, resolve to a regular expression."
- (cond
- ((and (listp re) (eq (car re) 'rx)) (eval re))
- ((stringp re) re)
- (t (error "Not recognized as regular expression: %s" re))))
-
-(defsubst use-package-is-pair (x car-pred cdr-pred)
- "Return non-nil if X is a cons satisfying the given predicates.
-CAR-PRED and CDR-PRED are applied to X's `car' and `cdr',
-respectively."
- (and (consp x)
- (funcall car-pred (car x))
- (funcall cdr-pred (cdr x))))
-
-(defun use-package-as-mode (string-or-symbol)
- "If STRING-OR-SYMBOL ends in `-mode' (or its name does), return
-it as a symbol. Otherwise, return it as a symbol with `-mode'
-appended."
- (let ((string (use-package-as-string string-or-symbol)))
- (intern (if (string-match "-mode\\'" string)
- string
- (concat string "-mode")))))
-
-(defsubst use-package-load-name (name &optional noerror)
- "Return a form which will load or require NAME.
-It does the right thing no matter if NAME is a string or symbol.
-Argument NOERROR means to indicate load failures as a warning."
- (if (stringp name)
- `(load ,name ,noerror)
- `(require ',name nil ,noerror)))
-
-(defun use-package-hook-injector (name-string keyword body)
- "Wrap pre/post hook injections around the given BODY for KEYWORD.
-The BODY is a list of forms, so `((foo))' if only `foo' is being called."
- (if (not use-package-inject-hooks)
- body
- (let ((keyword-name (substring (format "%s" keyword) 1)))
- `((when (run-hook-with-args-until-failure
- ',(intern (concat "use-package--" name-string
- "--pre-" keyword-name "-hook")))
- ,@body
- (run-hooks
- ',(intern (concat "use-package--" name-string
- "--post-" keyword-name "-hook"))))))))
-
-(defun use-package-with-elapsed-timer (text body)
- "BODY is a list of forms, so `((foo))' if only `foo' is being called."
- (declare (indent 1))
- (if use-package-expand-minimally
- body
- (let ((nowvar (make-symbol "now")))
- (if (bound-and-true-p use-package-verbose)
- `((let ((,nowvar (current-time)))
- (message "%s..." ,text)
- (prog1
- ,(macroexp-progn body)
- (let ((elapsed
- (float-time (time-subtract (current-time) ,nowvar))))
- (if (> elapsed ,use-package-minimum-reported-time)
- (message "%s...done (%.3fs)" ,text elapsed)
- (message "%s...done" ,text))))))
- body))))
-
-(put 'use-package-with-elapsed-timer 'lisp-indent-function 1)
-
-(defun use-package-require (name &optional no-require body)
- (if use-package-expand-minimally
- (use-package-concat
- (unless no-require
- (list (use-package-load-name name)))
- body)
- (if no-require
- body
- (use-package-with-elapsed-timer
- (format "Loading package %s" name)
- `((if (not ,(use-package-load-name name t))
- (display-warning 'use-package
- (format "Cannot load %s" ',name)
- :error)
- ,@body))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Property lists
-;;
-
-(defun use-package-plist-delete (plist property)
- "Delete PROPERTY from PLIST.
-This is in contrast to merely setting it to 0."
- (let (p)
- (while plist
- (if (not (eq property (car plist)))
- (setq p (plist-put p (car plist) (nth 1 plist))))
- (setq plist (cddr plist)))
- p))
-
-(defun use-package-plist-delete-first (plist property)
- "Delete PROPERTY from PLIST.
-This is in contrast to merely setting it to 0."
- (let (p)
- (while plist
- (if (eq property (car plist))
- (setq p (nconc p (cddr plist))
- plist nil)
- (setq p (nconc p (list (car plist) (cadr plist)))
- plist (cddr plist))))
- p))
-
-(defsubst use-package-plist-maybe-put (plist property value)
- "Add a VALUE for PROPERTY to PLIST, if it does not already exist."
- (if (plist-member plist property)
- plist
- (plist-put plist property value)))
-
-(defsubst use-package-plist-cons (plist property value)
- "Cons VALUE onto the head of the list at PROPERTY in PLIST."
- (plist-put plist property (cons value (plist-get plist property))))
-
-(defsubst use-package-plist-append (plist property value)
- "Append VALUE onto the front of the list at PROPERTY in PLIST."
- (plist-put plist property (append value (plist-get plist property))))
-
-(defun use-package-split-list (pred xs)
- (let ((ys (list nil)) (zs (list nil)) flip)
- (cl-dolist (x xs)
- (if flip
- (nconc zs (list x))
- (if (funcall pred x)
- (progn
- (setq flip t)
- (nconc zs (list x)))
- (nconc ys (list x)))))
- (cons (cdr ys) (cdr zs))))
-
-(defun use-package-split-list-at-keys (key lst)
- (and lst
- (let ((xs (use-package-split-list (apply-partially #'eq key) lst)))
- (cons (car xs) (use-package-split-list-at-keys key (cddr xs))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Keywords
-;;
-
-(defun use-package-keyword-index (keyword)
- (cl-loop named outer
- with index = 0
- for k in use-package-keywords do
- (if (eq k keyword)
- (cl-return-from outer index))
- (cl-incf index)))
-
-(defun use-package-normalize-plist (name input &optional plist merge-function)
- "Given a pseudo-plist, normalize it to a regular plist.
-The normalized key/value pairs from input are added to PLIST,
-extending any keys already present."
- (if (null input)
- plist
- (let* ((keyword (car input))
- (xs (use-package-split-list #'keywordp (cdr input)))
- (args (car xs))
- (tail (cdr xs))
- (normalizer
- (intern-soft (concat "use-package-normalize/"
- (symbol-name keyword))))
- (arg (and (functionp normalizer)
- (funcall normalizer name keyword args)))
- (error-string (format "Unrecognized keyword: %s" keyword)))
- (if (memq keyword use-package-keywords)
- (progn
- (setq plist (use-package-normalize-plist
- name tail plist merge-function))
- (plist-put plist keyword
- (if (plist-member plist keyword)
- (funcall merge-function keyword arg
- (plist-get plist keyword))
- arg)))
- (if use-package-ignore-unknown-keywords
- (progn
- (display-warning 'use-package error-string)
- (use-package-normalize-plist
- name tail plist merge-function))
- (use-package-error error-string))))))
-
-(defun use-package-unalias-keywords (_name args)
- (setq args (cl-nsubstitute :if :when args))
- (let (temp)
- (while (setq temp (plist-get args :unless))
- (setq args (use-package-plist-delete-first args :unless)
- args (append args `(:if (not ,temp))))))
- args)
-
-(defun use-package-merge-keys (key new old)
- (let ((merger (assq key use-package-merge-key-alist)))
- (if merger
- (funcall (cdr merger) new old)
- (append new old))))
-
-(defun use-package-sort-keywords (plist)
- (let (plist-grouped)
- (while plist
- (push (cons (car plist) (cadr plist))
- plist-grouped)
- (setq plist (cddr plist)))
- (let (result)
- (cl-dolist
- (x
- (nreverse
- (sort plist-grouped
- #'(lambda (l r) (< (use-package-keyword-index (car l))
- (use-package-keyword-index (car r)))))))
- (setq result (cons (car x) (cons (cdr x) result))))
- result)))
-
-(defun use-package-normalize-keywords (name args)
- (let* ((name-symbol (if (stringp name) (intern name) name))
- (name-string (symbol-name name-symbol)))
-
- ;; The function `elisp--local-variables' inserts this unbound variable into
- ;; macro forms to determine the locally bound variables for
- ;; `elisp-completion-at-point'. It ends up throwing a lot of errors since it
- ;; can occupy the position of a keyword (or look like a second argument to a
- ;; keyword that takes one). Deleting it when it's at the top level should be
- ;; harmless since there should be no locally bound variables to discover
- ;; here anyway.
- (setq args (delq 'elisp--witness--lisp args))
-
- ;; Reduce the set of keywords down to its most fundamental expression.
- (setq args (use-package-unalias-keywords name-symbol args))
-
- ;; Normalize keyword values, coalescing multiple occurrences.
- (setq args (use-package-normalize-plist name-symbol args nil
- #'use-package-merge-keys))
-
- ;; Add default values for keywords not specified, when applicable.
- (cl-dolist (spec use-package-defaults)
- (when (let ((func (nth 2 spec)))
- (if (and func (functionp func))
- (funcall func name args)
- (eval func)))
- (setq args (use-package-plist-maybe-put
- args (nth 0 spec)
- (let ((func (nth 1 spec)))
- (if (and func (functionp func))
- (funcall func name args)
- (eval func)))))))
-
- ;; Determine any autoloads implied by the keywords used.
- (let ((iargs args)
- commands)
- (while iargs
- (when (keywordp (car iargs))
- (let ((autoloads
- (intern-soft (concat "use-package-autoloads/"
- (symbol-name (car iargs))))))
- (when (functionp autoloads)
- (setq commands
- ;; jww (2017-12-07): Right now we just ignored the type of
- ;; the autoload being requested, and assume they are all
- ;; `command'.
- (append (mapcar
- #'car
- (funcall autoloads name-symbol (car iargs)
- (cadr iargs)))
- commands)))))
- (setq iargs (cddr iargs)))
- (when commands
- (setq args
- ;; Like `use-package-plist-append', but removing duplicates.
- (plist-put args :commands
- (delete-dups
- (append commands (plist-get args :commands)))))))
-
- ;; If byte-compiling, pre-load the package so all its symbols are in
- ;; scope. This is done by prepending statements to the :preface.
- (when (bound-and-true-p byte-compile-current-file)
- (setq args
- (use-package-plist-append
- args :preface
- (use-package-concat
- (mapcar #'(lambda (var) `(defvar ,var))
- (plist-get args :defines))
- (mapcar #'(lambda (fn) `(declare-function ,fn ,name-string))
- (plist-get args :functions))
- `((eval-when-compile
- (with-demoted-errors
- ,(format "Cannot load %s: %%S" name-string)
- ,(when (eq use-package-verbose 'debug)
- `(message ,(format "Compiling package %s" name-string)))
- ,(unless (plist-get args :no-require)
- `(unless (featurep ',name-symbol)
- (load ,name-string nil t))))))))))
-
- ;; Certain keywords imply :defer, if :demand was not specified.
- (when (and (not (plist-member args :demand))
- (not (plist-member args :defer))
- (not (or (equal '(t) (plist-get args :load))
- (equal (list (use-package-as-string name))
- (mapcar #'use-package-as-string
- (plist-get args :load)))))
- (cl-some #'identity
- (mapcar (apply-partially #'plist-member args)
- use-package-deferring-keywords)))
- (setq args (append args '(:defer t))))
-
- ;; The :load keyword overrides :no-require
- (when (and (plist-member args :load)
- (plist-member args :no-require))
- (setq args (use-package-plist-delete args :no-require)))
-
- ;; If at this point no :load, :defer or :no-require has been seen, then
- ;; :load the package itself.
- (when (and (not (plist-member args :load))
- (not (plist-member args :defer))
- (not (plist-member args :no-require)))
- (setq args (append args `(:load (,name)))))
-
- ;; Sort the list of keywords based on the order of `use-package-keywords'.
- (use-package-sort-keywords args)))
-
-(defun use-package-process-keywords (name plist &optional state)
- "Process the next keyword in the free-form property list PLIST.
-The values in the PLIST have each been normalized by the function
-use-package-normalize/KEYWORD (minus the colon).
-
-STATE is a property list that the function may modify and/or
-query. This is useful if a package defines multiple keywords and
-wishes them to have some kind of stateful interaction.
-
-Unless the KEYWORD being processed intends to ignore remaining
-keywords, it must call this function recursively, passing in the
-plist with its keyword and argument removed, and passing in the
-next value for the STATE."
- (declare (indent 1))
- (unless (null plist)
- (let* ((keyword (car plist))
- (arg (cadr plist))
- (rest (cddr plist)))
- (unless (keywordp keyword)
- (use-package-error (format "%s is not a keyword" keyword)))
- (let* ((handler (concat "use-package-handler/" (symbol-name keyword)))
- (handler-sym (intern handler)))
- (if (functionp handler-sym)
- (funcall handler-sym name keyword arg rest state)
- (use-package-error
- (format "Keyword handler not defined: %s" handler)))))))
-
-(put 'use-package-process-keywords 'lisp-indent-function 'defun)
-
-(defun use-package-list-insert (elem xs &optional anchor after test)
- "Insert ELEM into the list XS.
-If ANCHOR is also a keyword, place the new KEYWORD before that
-one.
-If AFTER is non-nil, insert KEYWORD either at the end of the
-keywords list, or after the ANCHOR if one has been provided.
-If TEST is non-nil, it is the test used to compare ELEM to list
-elements. The default is `eq'.
-The modified list is returned. The original list is not modified."
- (let (result)
- (dolist (k xs)
- (if (funcall (or test #'eq) k anchor)
- (if after
- (setq result (cons k result)
- result (cons elem result))
- (setq result (cons elem result)
- result (cons k result)))
- (setq result (cons k result))))
- (if anchor
- (nreverse result)
- (if after
- (nreverse (cons elem result))
- (cons elem (nreverse result))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Argument Processing
-;;
-
-(defun use-package-only-one (label args f)
- "Call F on the first member of ARGS if it has exactly one element."
- (declare (indent 1))
- (cond
- ((and (listp args) (listp (cdr args))
- (= (length args) 1))
- (funcall f label (car args)))
- (t
- (use-package-error
- (concat label " wants exactly one argument")))))
-
-(put 'use-package-only-one 'lisp-indent-function 'defun)
-
-(defun use-package-as-one (label args f &optional allow-empty)
- "Call F on the first element of ARGS if it has one element, or all of ARGS.
-If ALLOW-EMPTY is non-nil, it's OK for ARGS to be an empty list."
- (declare (indent 1))
- (if (if args
- (and (listp args) (listp (cdr args)))
- allow-empty)
- (if (= (length args) 1)
- (funcall f label (car args))
- (funcall f label args))
- (use-package-error
- (concat label " wants a non-empty list"))))
-
-(put 'use-package-as-one 'lisp-indent-function 'defun)
-
-(defun use-package-memoize (f arg)
- "Ensure the macro-expansion of F applied to ARG evaluates ARG
-no more than once."
- (let ((loaded (cl-gentemp "use-package--loaded"))
- (result (cl-gentemp "use-package--result"))
- (next (cl-gentemp "use-package--next")))
- `((defvar ,loaded nil)
- (defvar ,result nil)
- (defvar ,next #'(lambda () (if ,loaded ,result
- (setq ,loaded t ,result ,arg))))
- ,@(funcall f `((funcall ,next))))))
-
-(defsubst use-package-normalize-value (_label arg)
- "Normalize the Lisp value given by ARG.
-The argument LABEL is ignored."
- (cond ((null arg) nil)
- ((eq t arg) t)
- ((use-package-non-nil-symbolp arg)
- `(symbol-value ',arg))
- ((functionp arg)
- `(funcall #',arg))
- (t arg)))
-
-(defun use-package-normalize-symbols (label arg &optional recursed)
- "Normalize a list of symbols."
- (cond
- ((use-package-non-nil-symbolp arg)
- (list arg))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x) (car (use-package-normalize-symbols label x t))) arg))
- (t
- (use-package-error
- (concat label " wants a symbol, or list of symbols")))))
-
-(defun use-package-normalize-symlist (_name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'use-package-normalize-symbols))
-
-(defun use-package-normalize-recursive-symbols (label arg)
- "Normalize a list of symbols."
- (cond
- ((use-package-non-nil-symbolp arg)
- arg)
- ((and (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x) (use-package-normalize-recursive-symbols label x))
- arg))
- (t
- (use-package-error
- (concat label " wants a symbol, or nested list of symbols")))))
-
-(defun use-package-normalize-recursive-symlist (_name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'use-package-normalize-recursive-symbols))
-
-(defun use-package-normalize-paths (label arg &optional recursed)
- "Normalize a list of filesystem paths."
- (cond
- ((and arg (or (use-package-non-nil-symbolp arg) (functionp arg)))
- (let ((value (use-package-normalize-value label arg)))
- (use-package-normalize-paths label (eval value))))
- ((stringp arg)
- (let ((path (if (file-name-absolute-p arg)
- arg
- (expand-file-name arg user-emacs-directory))))
- (list path)))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x)
- (car (use-package-normalize-paths label x t))) arg))
- (t
- (use-package-error
- (concat label " wants a directory path, or list of paths")))))
-
-(defun use-package-normalize-predicate (_name keyword args)
- (if (null args)
- t
- (use-package-only-one (symbol-name keyword) args
- #'use-package-normalize-value)))
-
-(defun use-package-normalize-form (label args)
- "Given a list of forms, return it wrapped in `progn'."
- (unless (listp (car args))
- (use-package-error (concat label " wants a sexp or list of sexps")))
- (mapcar #'(lambda (form)
- (if (and (consp form)
- (memq (car form)
- '(use-package bind-key bind-key*
- unbind-key bind-keys bind-keys*)))
- (macroexpand form)
- form)) args))
-
-(defun use-package-normalize-forms (_name keyword args)
- (use-package-normalize-form (symbol-name keyword) args))
-
-(defun use-package-normalize-pairs
- (key-pred val-pred name label arg &optional recursed)
- "Normalize a list of pairs.
-KEY-PRED and VAL-PRED are predicates recognizing valid keys and
-values, respectively.
-If RECURSED is non-nil, recurse into sublists."
- (cond
- ((funcall key-pred arg)
- (list (cons arg (use-package-as-symbol name))))
- ((use-package-is-pair arg key-pred val-pred)
- (list arg))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (let (last-item)
- (mapcar
- #'(lambda (x)
- (prog1
- (let ((ret (use-package-normalize-pairs
- key-pred val-pred name label x t)))
- (if (and (listp ret)
- (not (keywordp last-item)))
- (car ret)
- ret))
- (setq last-item x))) arg)))
- (t arg)))
-
-(defun use-package-recognize-function (v &optional binding additional-pred)
- "A predicate that recognizes functional constructions:
- nil
- sym
- 'sym
- (quote sym)
- #'sym
- (function sym)
- (lambda () ...)
- '(lambda () ...)
- (quote (lambda () ...))
- #'(lambda () ...)
- (function (lambda () ...))"
- (or (if binding
- (symbolp v)
- (use-package-non-nil-symbolp v))
- (and (listp v)
- (memq (car v) '(quote function))
- (use-package-non-nil-symbolp (cadr v)))
- (if binding (commandp v) (functionp v))
- (and additional-pred
- (funcall additional-pred v))))
-
-(defun use-package-normalize-function (v)
- "Reduce functional constructions to one of two normal forms:
- sym
- #'(lambda () ...)"
- (cond ((symbolp v) v)
- ((and (listp v)
- (memq (car v) '(quote function))
- (use-package-non-nil-symbolp (cadr v)))
- (cadr v))
- ((and (consp v)
- (eq 'lambda (car v)))
- v)
- ((and (listp v)
- (memq (car v) '(quote function))
- (eq 'lambda (car (cadr v))))
- (cadr v))
- (t v)))
-
-(defun use-package-normalize-commands (args)
- "Map over ARGS of the form ((_ . F) ...), normalizing functional F's."
- (mapcar #'(lambda (x)
- (if (consp x)
- (cons (car x) (use-package-normalize-function (cdr x)))
- x))
- args))
-
-(defun use-package-normalize-mode (name keyword args)
- "Normalize arguments for keywords which add regexp/mode pairs to an alist."
- (use-package-as-one (symbol-name keyword) args
- (apply-partially #'use-package-normalize-pairs
- #'use-package-regex-p
- #'use-package-recognize-function
- name)))
-
-(defun use-package-autoloads-mode (_name _keyword args)
- (mapcar
- #'(lambda (x) (cons (cdr x) 'command))
- (cl-remove-if-not #'(lambda (x)
- (and (consp x)
- (use-package-non-nil-symbolp (cdr x))))
- args)))
-
-(defun use-package-handle-mode (name alist args rest state)
- "Handle keywords which add regexp/mode pairs to an alist."
- (use-package-concat
- (use-package-process-keywords name rest state)
- (mapcar
- #'(lambda (thing)
- `(add-to-list
- ',alist
- ',(cons (use-package-normalize-regex (car thing))
- (cdr thing))))
- (use-package-normalize-commands args))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Statistics
-;;
-
-(defun use-package-reset-statistics ()
- (interactive)
- (setq use-package-statistics (make-hash-table)))
-
-(defun use-package-statistics-status (package)
- "Return loading configuration status of PACKAGE statistics."
- (cond ((gethash :config package) "Configured")
- ((gethash :init package) "Initialized")
- ((gethash :preface package) "Prefaced")
- ((gethash :use-package package) "Declared")))
-
-(defun use-package-statistics-last-event (package)
- "Return the date when PACKAGE's status last changed.
-The date is returned as a string."
- (format-time-string "%Y-%m-%d %a %H:%M"
- (or (gethash :config package)
- (gethash :init package)
- (gethash :preface package)
- (gethash :use-package package))))
-
-(defun use-package-statistics-time (package)
- "Return the time is took for PACKAGE to load."
- (+ (float-time (gethash :config-secs package '(0 0 0 0)))
- (float-time (gethash :init-secs package '(0 0 0 0)))
- (float-time (gethash :preface-secs package '(0 0 0 0)))
- (float-time (gethash :use-package-secs package '(0 0 0 0)))))
-
-(defun use-package-statistics-convert (package)
- "Return information about PACKAGE.
-
-The information is formatted in a way suitable for
-`use-package-statistics-mode'."
- (let ((statistics (gethash package use-package-statistics)))
- (list
- package
- (vector
- (symbol-name package)
- (use-package-statistics-status statistics)
- (use-package-statistics-last-event statistics)
- (format "%.2f" (use-package-statistics-time statistics))))))
-
-(defun use-package-report ()
- "Show current statistics gathered about use-package declarations.
-In the table that's generated, the status field has the following
-meaning:
- Configured :config has been processed (the package is loaded!)
- Initialized :init has been processed (load status unknown)
- Prefaced :preface has been processed
- Declared the use-package declaration was seen"
- (interactive)
- (with-current-buffer (get-buffer-create "*use-package statistics*")
- (setq tabulated-list-entries
- (mapcar #'use-package-statistics-convert
- (hash-table-keys use-package-statistics)))
- (use-package-statistics-mode)
- (tabulated-list-print)
- (display-buffer (current-buffer))))
-
-(define-derived-mode use-package-statistics-mode tabulated-list-mode
- "use-package statistics"
- "Show current statistics gathered about use-package declarations."
- (setq tabulated-list-format
- ;; The sum of column width is 80 characters:
- [("Package" 25 t)
- ("Status" 13 t)
- ("Last Event" 23 t)
- ("Time" 10 t)])
- (tabulated-list-init-header))
-
-(defun use-package-statistics-gather (keyword name after)
- (let* ((hash (gethash name use-package-statistics
- (make-hash-table)))
- (before (and after (gethash keyword hash (current-time)))))
- (puthash keyword (current-time) hash)
- (when after
- (puthash (intern (concat (symbol-name keyword) "-secs"))
- (time-subtract (current-time) before) hash))
- (puthash name hash use-package-statistics)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Handlers
-;;
-
-;;;; :disabled
-
-;; Don't alias this to `ignore', as that will cause the resulting
-;; function to be interactive.
-(defun use-package-normalize/:disabled (_name _keyword _arg)
- "Do nothing, return nil.")
-
-(defun use-package-handler/:disabled (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :if, :when and :unless
-
-(defun use-package-normalize-test (_name keyword args)
- (use-package-only-one (symbol-name keyword) args
- #'use-package-normalize-value))
-
-(defalias 'use-package-normalize/:if 'use-package-normalize-test)
-
-(defun use-package-handler/:if (name _keyword pred rest state)
- (let ((body (use-package-process-keywords name rest state)))
- `((when ,pred ,@body))))
-
-(defalias 'use-package-normalize/:when 'use-package-normalize-test)
-
-(defalias 'use-package-handler/:when 'use-package-handler/:if)
-
-(defalias 'use-package-normalize/:unless 'use-package-normalize-test)
-
-(defun use-package-handler/:unless (name _keyword pred rest state)
- (let ((body (use-package-process-keywords name rest state)))
- `((unless ,pred ,@body))))
-
-;;;; :requires
-
-(defalias 'use-package-normalize/:requires 'use-package-normalize-symlist)
-
-(defun use-package-handler/:requires (name _keyword requires rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (if (null requires)
- body
- `((when ,(if (> (length requires) 1)
- `(not (member nil (mapcar #'featurep ',requires)))
- `(featurep ',(car requires)))
- ,@body)))))
-
-;;;; :load-path
-
-(defun use-package-normalize/:load-path (_name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'use-package-normalize-paths))
-
-(defun use-package-handler/:load-path (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (mapcar #'(lambda (path)
- `(eval-and-compile (add-to-list 'load-path ,path)))
- arg)
- body)))
-
-;;;; :no-require
-
-(defalias 'use-package-normalize/:no-require 'use-package-normalize-predicate)
-
-(defun use-package-handler/:no-require (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :defines
-
-(defalias 'use-package-normalize/:defines 'use-package-normalize-symlist)
-
-(defun use-package-handler/:defines (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :functions
-
-(defalias 'use-package-normalize/:functions 'use-package-normalize-symlist)
-
-(defun use-package-handler/:functions (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :preface
-
-(defalias 'use-package-normalize/:preface 'use-package-normalize-forms)
-
-(defun use-package-handler/:preface (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :preface ',name nil)))
- (when arg
- `((eval-and-compile ,@arg)))
- body
- (when use-package-compute-statistics
- `((use-package-statistics-gather :preface ',name t))))))
-
-;;;; :catch
-
-(defvar use-package--form)
-(defvar use-package--hush-function #'(lambda (_keyword body) body))
-
-(defsubst use-package-hush (context keyword body)
- `((condition-case-unless-debug err
- ,(macroexp-progn body)
- (error (funcall ,context ,keyword err)))))
-
-(defun use-package-normalize/:catch (_name keyword args)
- (if (null args)
- t
- (use-package-only-one (symbol-name keyword) args
- use-package--hush-function)))
-
-(defun use-package-handler/:catch (name keyword arg rest state)
- (let* ((context (cl-gentemp "use-package--warning")))
- (cond
- ((not arg)
- (use-package-process-keywords name rest state))
- ((eq arg t)
- `((defvar ,context
- #'(lambda (keyword err)
- (let ((msg (format "%s/%s: %s" ',name keyword
- (error-message-string err))))
- ,@(when (eq use-package-verbose 'debug)
- `((with-current-buffer
- (get-buffer-create "*use-package*")
- (goto-char (point-max))
- (insert "-----\n" msg ,use-package--form)
- (emacs-lisp-mode))
- (setq msg
- (concat msg
- " (see the *use-package* buffer)"))))
- (display-warning 'use-package msg :error))))
- ,@(let ((use-package--hush-function
- (apply-partially #'use-package-hush context)))
- (funcall use-package--hush-function keyword
- (use-package-process-keywords name rest state)))))
- ((functionp arg)
- `((defvar ,context ,arg)
- ,@(let ((use-package--hush-function
- (apply-partially #'use-package-hush context)))
- (funcall use-package--hush-function keyword
- (use-package-process-keywords name rest state)))))
- (t
- (use-package-error "The :catch keyword expects 't' or a function")))))
-
-;;;; :interpreter
-
-(defalias 'use-package-normalize/:interpreter 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:interpreter 'use-package-autoloads-mode)
-
-(defun use-package-handler/:interpreter (name _keyword arg rest state)
- (use-package-handle-mode name 'interpreter-mode-alist arg rest state))
-
-;;;; :mode
-
-(defalias 'use-package-normalize/:mode 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:mode 'use-package-autoloads-mode)
-
-(defun use-package-handler/:mode (name _keyword arg rest state)
- (use-package-handle-mode name 'auto-mode-alist arg rest state))
-
-;;;; :magic
-
-(defalias 'use-package-normalize/:magic 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:magic 'use-package-autoloads-mode)
-
-(defun use-package-handler/:magic (name _keyword arg rest state)
- (use-package-handle-mode name 'magic-mode-alist arg rest state))
-
-;;;; :magic-fallback
-
-(defalias 'use-package-normalize/:magic-fallback 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:magic-fallback 'use-package-autoloads-mode)
-
-(defun use-package-handler/:magic-fallback (name _keyword arg rest state)
- (use-package-handle-mode name 'magic-fallback-mode-alist arg rest state))
-
-;;;; :hook
-
-(defun use-package-normalize/:hook (name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'(lambda (label arg)
- (unless (or (use-package-non-nil-symbolp arg) (consp arg))
- (use-package-error
- (concat label " a <symbol> or (<symbol or list of symbols> . <symbol or function>)"
- " or list of these")))
- (use-package-normalize-pairs
- #'(lambda (k)
- (or (use-package-non-nil-symbolp k)
- (and k (let ((every t))
- (while (and every k)
- (if (and (consp k)
- (use-package-non-nil-symbolp (car k)))
- (setq k (cdr k))
- (setq every nil)))
- every))))
- #'use-package-recognize-function
- name label arg))))
-
-(defalias 'use-package-autoloads/:hook 'use-package-autoloads-mode)
-
-(defun use-package-handler/:hook (name _keyword args rest state)
- "Generate use-package custom keyword code."
- (use-package-concat
- (use-package-process-keywords name rest state)
- (cl-mapcan
- #'(lambda (def)
- (let ((syms (car def))
- (fun (cdr def)))
- (when fun
- (mapcar
- #'(lambda (sym)
- `(add-hook
- (quote ,(intern
- (concat (symbol-name sym)
- use-package-hook-name-suffix)))
- (function ,fun)))
- (if (use-package-non-nil-symbolp syms) (list syms) syms)))))
- (use-package-normalize-commands args))))
-
-;;;; :commands
-
-(defalias 'use-package-normalize/:commands 'use-package-normalize-symlist)
-
-(defun use-package-handler/:commands (name _keyword arg rest state)
- (use-package-concat
- ;; Since we deferring load, establish any necessary autoloads, and also
- ;; keep the byte-compiler happy.
- (let ((name-string (use-package-as-string name)))
- (cl-mapcan
- #'(lambda (command)
- (when (symbolp command)
- (append
- (unless (plist-get state :demand)
- `((unless (fboundp ',command)
- (autoload #',command ,name-string nil t))))
- (when (bound-and-true-p byte-compile-current-file)
- `((eval-when-compile
- (declare-function ,command ,name-string)))))))
- (delete-dups arg)))
- (use-package-process-keywords name rest state)))
-
-;;;; :defer
-
-(defalias 'use-package-normalize/:defer 'use-package-normalize-predicate)
-
-(defun use-package-handler/:defer (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- ;; Load the package after a set amount of idle time, if the argument to
- ;; `:defer' was a number.
- (when (numberp arg)
- `((run-with-idle-timer ,arg nil #'require
- ',(use-package-as-symbol name) nil t)))
- (if (or (not arg) (null body))
- body
- `((eval-after-load ',name ',(macroexp-progn body)))))))
-
-;;;; :after
-
-(defun use-package-normalize/:after (name keyword args)
- (setq args (use-package-normalize-recursive-symlist name keyword args))
- (if (consp args)
- args
- (list args)))
-
-(defun use-package-after-count-uses (features*)
- "Count the number of time the body would appear in the result."
- (cond ((use-package-non-nil-symbolp features*)
- 1)
- ((and (consp features*)
- (memq (car features*) '(:or :any)))
- (let ((num 0))
- (cl-dolist (next (cdr features*))
- (setq num (+ num (use-package-after-count-uses next))))
- num))
- ((and (consp features*)
- (memq (car features*) '(:and :all)))
- (apply #'max (mapcar #'use-package-after-count-uses
- (cdr features*))))
- ((listp features*)
- (use-package-after-count-uses (cons :all features*)))))
-
-(defun use-package-require-after-load (features* body)
- "Generate `eval-after-load' statements to represents FEATURES*.
-FEATURES* is a list containing keywords `:and' and `:all', where
-no keyword implies `:all'."
- (cond
- ((use-package-non-nil-symbolp features*)
- `((eval-after-load ',features* ',(macroexp-progn body))))
- ((and (consp features*)
- (memq (car features*) '(:or :any)))
- (cl-mapcan #'(lambda (x) (use-package-require-after-load x body))
- (cdr features*)))
- ((and (consp features*)
- (memq (car features*) '(:and :all)))
- (cl-dolist (next (cdr features*))
- (setq body (use-package-require-after-load next body)))
- body)
- ((listp features*)
- (use-package-require-after-load (cons :all features*) body))))
-
-(defun use-package-handler/:after (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state))
- (uses (use-package-after-count-uses arg)))
- (if (or (null uses) (null body))
- body
- (if (<= uses 1)
- (use-package-require-after-load arg body)
- (use-package-memoize
- (apply-partially #'use-package-require-after-load arg)
- (macroexp-progn body))))))
-
-;;;; :demand
-
-(defalias 'use-package-normalize/:demand 'use-package-normalize-predicate)
-
-(defun use-package-handler/:demand (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :custom
-
-(defun use-package-normalize/:custom (_name keyword args)
- "Normalize use-package custom keyword."
- (use-package-as-one (symbol-name keyword) args
- #'(lambda (label arg)
- (unless (listp arg)
- (use-package-error
- (concat label " a (<symbol> <value> [comment])"
- " or list of these")))
- (if (use-package-non-nil-symbolp (car arg))
- (list arg)
- arg))))
-
-(defun use-package-handler/:custom (name _keyword args rest state)
- "Generate use-package custom keyword code."
- (use-package-concat
- (mapcar
- #'(lambda (def)
- (let ((variable (nth 0 def))
- (value (nth 1 def))
- (comment (nth 2 def)))
- (unless (and comment (stringp comment))
- (setq comment (format "Customized with use-package %s" name)))
- `(funcall (or (get (quote ,variable) 'custom-set) #'set-default)
- (quote ,variable)
- ,value)))
- args)
- (use-package-process-keywords name rest state)))
-
-;;;; :custom-face
-
-(defun use-package-normalize/:custom-face (name-symbol _keyword arg)
- "Normalize use-package custom-face keyword."
- (let ((error-msg
- (format "%s wants a (<symbol> <face-spec>) or list of these"
- name-symbol)))
- (unless (listp arg)
- (use-package-error error-msg))
- (cl-dolist (def arg arg)
- (unless (listp def)
- (use-package-error error-msg))
- (let ((face (nth 0 def))
- (spec (nth 1 def)))
- (when (or (not face)
- (not spec)
- (> (length def) 2))
- (use-package-error error-msg))))))
-
-(defun use-package-handler/:custom-face (name _keyword args rest state)
- "Generate use-package custom-face keyword code."
- (use-package-concat
- (mapcar #'(lambda (def) `(custom-set-faces (backquote ,def))) args)
- (use-package-process-keywords name rest state)))
-
-;;;; :init
-
-(defalias 'use-package-normalize/:init 'use-package-normalize-forms)
-
-(defun use-package-handler/:init (name _keyword arg rest state)
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :init ',name nil)))
- (let ((init-body
- (use-package-hook-injector (use-package-as-string name)
- :init arg)))
- (when init-body
- (funcall use-package--hush-function :init
- (if use-package-check-before-init
- `((when (locate-library ,(use-package-as-string name))
- ,@init-body))
- init-body))))
- (use-package-process-keywords name rest state)
- (when use-package-compute-statistics
- `((use-package-statistics-gather :init ',name t)))))
-
-;;;; :load
-
-(defun use-package-normalize/:load (name keyword args)
- (setq args (use-package-normalize-recursive-symlist name keyword args))
- (if (consp args)
- args
- (list args)))
-
-(defun use-package-handler/:load (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (cl-dolist (pkg arg)
- (setq body (use-package-require (if (eq t pkg) name pkg) nil body)))
- body))
-
-;;;; :config
-
-(defalias 'use-package-normalize/:config 'use-package-normalize-forms)
-
-(defun use-package-handler/:config (name _keyword arg rest state)
- (let* ((body (use-package-process-keywords name rest state))
- (name-symbol (use-package-as-symbol name)))
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :config ',name nil)))
- (if (and (or (null arg) (equal arg '(t))) (not use-package-inject-hooks))
- body
- (use-package-with-elapsed-timer
- (format "Configuring package %s" name-symbol)
- (funcall use-package--hush-function :config
- (use-package-concat
- (use-package-hook-injector
- (symbol-name name-symbol) :config arg)
- body
- (list t)))))
- (when use-package-compute-statistics
- `((use-package-statistics-gather :config ',name t))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; The main macro
-;;
-
-(defmacro use-package-core (name args)
- `(let* ((args* (use-package-normalize-keywords ,name ,args))
- (use-package--form
- (if (eq use-package-verbose 'debug)
- (concat "\n\n"
- (pp-to-string `(use-package ,name ,@,args))
- "\n -->\n\n"
- (pp-to-string `(use-package ,name ,@args*))
- "\n ==>\n\n"
- (pp-to-string
- (macroexp-progn
- (let ((use-package-verbose 'errors)
- (use-package-expand-minimally t))
- (use-package-process-keywords name args*
- (and (plist-get args* :demand)
- (list :demand t)))))))
- "")))
- (use-package-process-keywords name args*
- (and (plist-get args* :demand)
- (list :demand t)))))
-
-;;;###autoload
-(defmacro use-package (name &rest args)
- "Declare an Emacs package by specifying a group of configuration options.
-
-For full documentation, please see the README file that came with
-this file. Usage:
-
- (use-package package-name
- [:keyword [option]]...)
-
-:init Code to run before PACKAGE-NAME has been loaded.
-:config Code to run after PACKAGE-NAME has been loaded. Note that
- if loading is deferred for any reason, this code does not
- execute until the lazy load has occurred.
-:preface Code to be run before everything except `:disabled'; this
- can be used to define functions for use in `:if', or that
- should be seen by the byte-compiler.
-
-:mode Form to be added to `auto-mode-alist'.
-:magic Form to be added to `magic-mode-alist'.
-:magic-fallback Form to be added to `magic-fallback-mode-alist'.
-:interpreter Form to be added to `interpreter-mode-alist'.
-
-:commands Define autoloads for commands that will be defined by the
- package. This is useful if the package is being lazily
- loaded, and you wish to conditionally call functions in your
- `:init' block that are defined in the package.
-:hook Specify hook(s) to attach this package to.
-
-:bind Bind keys, and define autoloads for the bound commands.
-:bind* Bind keys, and define autoloads for the bound commands,
- *overriding all minor mode bindings*.
-:bind-keymap Bind a key prefix to an auto-loaded keymap defined in the
- package. This is like `:bind', but for keymaps.
-:bind-keymap* Like `:bind-keymap', but overrides all minor mode bindings
-
-:defer Defer loading of a package -- this is implied when using
- `:commands', `:bind', `:bind*', `:mode', `:magic', `:hook',
- `:magic-fallback', or `:interpreter'. This can be an integer,
- to force loading after N seconds of idle time, if the package
- has not already been loaded.
-:after Delay the use-package declaration until after the named modules
- have loaded. Once load, it will be as though the use-package
- declaration (without `:after') had been seen at that moment.
-:demand Prevent the automatic deferred loading introduced by constructs
- such as `:bind' (see `:defer' for the complete list).
-
-:if EXPR Initialize and load only if EXPR evaluates to a non-nil value.
-:disabled The package is ignored completely if this keyword is present.
-:defines Declare certain variables to silence the byte-compiler.
-:functions Declare certain functions to silence the byte-compiler.
-:load-path Add to the `load-path' before attempting to load the package.
-:diminish Support for diminish.el (if installed).
-:delight Support for delight.el (if installed).
-:custom Call `custom-set' or `set-default' with each variable
- definition without modifying the Emacs `custom-file'.
- (compare with `custom-set-variables').
-:custom-face Call `customize-set-faces' with each face definition.
-:ensure Loads the package using package.el if necessary.
-:pin Pin the package to an archive."
- (declare (indent 1))
- (unless (memq :disabled args)
- (macroexp-progn
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :use-package ',name nil)))
- (if (eq use-package-verbose 'errors)
- (use-package-core name args)
- (condition-case-unless-debug err
- (use-package-core name args)
- (error
- (ignore
- (display-warning
- 'use-package
- (format "Failed to parse package %s: %s"
- name (error-message-string err)) :error)))))
- (when use-package-compute-statistics
- `((use-package-statistics-gather :use-package ',name t)))))))
-
-(put 'use-package 'lisp-indent-function 'defun)
-
-(provide 'use-package-core)
-
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-
-;;; use-package-core.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-delight.el b/elpa/use-package-20200721.2156/use-package-delight.el
deleted file mode 100644
index 85d5c7c..0000000
--- a/elpa/use-package-20200721.2156/use-package-delight.el
+++ /dev/null
@@ -1,91 +0,0 @@
-;;; use-package-delight.el --- Support for the :delight keyword -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 3 Dec 2017
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Provides support for the :delight keyword, which is made available by
-;; default by requiring `use-package'.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(defun use-package-normalize-delight (name args)
- "Normalize ARGS for a single call to `delight'."
- (when (eq :eval (car args))
- ;; Handle likely common mistake.
- (use-package-error ":delight mode line constructs must be quoted"))
- (cond ((and (= (length args) 1)
- (use-package-non-nil-symbolp (car args)))
- `(,(nth 0 args) nil ,name))
- ((= (length args) 2)
- `(,(nth 0 args) ,(nth 1 args) ,name))
- ((= (length args) 3)
- args)
- (t
- (use-package-error
- ":delight expects `delight' arguments or a list of them"))))
-
-;;;###autoload
-(defun use-package-normalize/:delight (name _keyword args)
- "Normalize arguments to delight."
- (cond ((null args)
- `((,(use-package-as-mode name) nil ,name)))
- ((and (= (length args) 1)
- (use-package-non-nil-symbolp (car args)))
- `((,(car args) nil ,name)))
- ((and (= (length args) 1)
- (stringp (car args)))
- `((,(use-package-as-mode name) ,(car args) ,name)))
- ((and (= (length args) 1)
- (listp (car args))
- (eq 'quote (caar args)))
- `((,(use-package-as-mode name) ,@(cdar args) ,name)))
- ((and (= (length args) 2)
- (listp (nth 1 args))
- (eq 'quote (car (nth 1 args))))
- `((,(car args) ,@(cdr (nth 1 args)) ,name)))
- (t (mapcar
- (apply-partially #'use-package-normalize-delight name)
- (if (use-package-non-nil-symbolp (car args))
- (list args)
- args)))))
-
-;;;###autoload
-(defun use-package-handler/:delight (name _keyword args rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- body
- `((if (fboundp 'delight)
- (delight '(,@args)))))))
-
-(add-to-list 'use-package-keywords :delight t)
-
-(provide 'use-package-delight)
-
-;;; use-package-delight.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-diminish.el b/elpa/use-package-20200721.2156/use-package-diminish.el
deleted file mode 100644
index 1f3895f..0000000
--- a/elpa/use-package-20200721.2156/use-package-diminish.el
+++ /dev/null
@@ -1,80 +0,0 @@
-;;; use-package-diminish.el --- Support for the :diminish keyword -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 3 Dec 2017
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Provides support for the :diminish keyword, which is made available by
-;; default by requiring `use-package'.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(defun use-package-normalize-diminish (name label arg &optional recursed)
- "Normalize the arguments to diminish down to a list of one of two forms:
- SYMBOL
- (SYMBOL . STRING)"
- (cond
- ((not arg)
- (list (use-package-as-mode name)))
- ((use-package-non-nil-symbolp arg)
- (list arg))
- ((stringp arg)
- (list (cons (use-package-as-mode name) arg)))
- ((and (consp arg) (stringp (cdr arg)))
- (list arg))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x) (car (use-package-normalize-diminish
- name label x t))) arg))
- (t
- (use-package-error
- (concat label " wants a string, symbol, "
- "(symbol . string) or list of these")))))
-
-;;;###autoload
-(defun use-package-normalize/:diminish (name keyword args)
- (use-package-as-one (symbol-name keyword) args
- (apply-partially #'use-package-normalize-diminish name) t))
-
-;;;###autoload
-(defun use-package-handler/:diminish (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (mapcar #'(lambda (var)
- `(if (fboundp 'diminish)
- ,(if (consp var)
- `(diminish ',(car var) ,(cdr var))
- `(diminish ',var))))
- arg)
- body)))
-
-(add-to-list 'use-package-keywords :diminish t)
-
-(provide 'use-package-diminish)
-
-;;; use-package-diminish.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-ensure.el b/elpa/use-package-20200721.2156/use-package-ensure.el
deleted file mode 100644
index 50005a9..0000000
--- a/elpa/use-package-20200721.2156/use-package-ensure.el
+++ /dev/null
@@ -1,214 +0,0 @@
-;;; use-package-ensure.el --- Support for the :ensure and :pin keywords -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 3 Dec 2017
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Provides support for the :ensure and :pin keywords, which is made available
-;; by default by requiring `use-package'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'use-package-core)
-
-(defgroup use-package-ensure nil
- "Support for :ensure and :pin keywords in use-package declarations."
- :group 'use-package)
-
-(eval-when-compile
- (declare-function package-installed-p "package")
- (declare-function package-read-all-archive-contents "package" ()))
-
-(defcustom use-package-always-ensure nil
- "Treat every package as though it had specified using `:ensure SEXP'.
-See also `use-package-defaults', which uses this value."
- :type 'sexp
- :group 'use-package-ensure)
-
-(defcustom use-package-always-pin nil
- "Treat every package as though it had specified using `:pin SYM'.
-See also `use-package-defaults', which uses this value."
- :type 'symbol
- :group 'use-package-ensure)
-
-(defcustom use-package-ensure-function 'use-package-ensure-elpa
- "Function that ensures a package is installed.
-This function is called with three arguments: the name of the
-package declared in the `use-package' form; the arguments passed
-to all `:ensure' keywords (always a list, even if only one); and
-the current `state' plist created by previous handlers.
-
-Note that this function is called whenever `:ensure' is provided,
-even if it is nil. It is up to the function to decide on the
-semantics of the various values for `:ensure'.
-
-This function should return non-nil if the package is installed.
-
-The default value uses package.el to install the package."
- :type '(choice (const :tag "package.el" use-package-ensure-elpa)
- (function :tag "Custom"))
- :group 'use-package-ensure)
-
-;;;; :pin
-
-(defun use-package-normalize/:pin (_name keyword args)
- (use-package-only-one (symbol-name keyword) args
- #'(lambda (_label arg)
- (cond
- ((stringp arg) arg)
- ((use-package-non-nil-symbolp arg) (symbol-name arg))
- (t
- (use-package-error
- ":pin wants an archive name (a string)"))))))
-
-(eval-when-compile
- (defvar package-pinned-packages)
- (defvar package-archives))
-
-(defun use-package-archive-exists-p (archive)
- "Check if a given ARCHIVE is enabled.
-
-ARCHIVE can be a string or a symbol or 'manual to indicate a
-manually updated package."
- (if (member archive '(manual "manual"))
- 't
- (let ((valid nil))
- (dolist (pa package-archives)
- (when (member archive (list (car pa) (intern (car pa))))
- (setq valid 't)))
- valid)))
-
-(defun use-package-pin-package (package archive)
- "Pin PACKAGE to ARCHIVE."
- (unless (boundp 'package-pinned-packages)
- (setq package-pinned-packages ()))
- (let ((archive-symbol (if (symbolp archive) archive (intern archive)))
- (archive-name (if (stringp archive) archive (symbol-name archive))))
- (if (use-package-archive-exists-p archive-symbol)
- (add-to-list 'package-pinned-packages (cons package archive-name))
- (error "Archive '%s' requested for package '%s' is not available."
- archive-name package))
- (unless (bound-and-true-p package--initialized)
- (package-initialize t))))
-
-(defun use-package-handler/:pin (name _keyword archive-name rest state)
- (let ((body (use-package-process-keywords name rest state))
- (pin-form (if archive-name
- `(use-package-pin-package ',(use-package-as-symbol name)
- ,archive-name))))
- ;; Pinning should occur just before ensuring
- ;; See `use-package-handler/:ensure'.
- (if (bound-and-true-p byte-compile-current-file)
- (eval pin-form) ; Eval when byte-compiling,
- (push pin-form body)) ; or else wait until runtime.
- body))
-
-;;;; :ensure
-
-(defvar package-archive-contents)
-
-;;;###autoload
-(defun use-package-normalize/:ensure (_name keyword args)
- (if (null args)
- (list t)
- (use-package-only-one (symbol-name keyword) args
- #'(lambda (_label arg)
- (cond
- ((symbolp arg)
- (list arg))
- ((and (listp arg) (= 3 (length arg))
- (symbolp (nth 0 arg))
- (eq :pin (nth 1 arg))
- (or (stringp (nth 2 arg))
- (symbolp (nth 2 arg))))
- (list (cons (nth 0 arg) (nth 2 arg))))
- (t
- (use-package-error
- (concat ":ensure wants an optional package name "
- "(an unquoted symbol name), or (<symbol> :pin <string>)"))))))))
-
-(defun use-package-ensure-elpa (name args _state &optional _no-refresh)
- (dolist (ensure args)
- (let ((package
- (or (and (eq ensure t) (use-package-as-symbol name))
- ensure)))
- (when package
- (require 'package)
- (when (consp package)
- (use-package-pin-package (car package) (cdr package))
- (setq package (car package)))
- (unless (package-installed-p package)
- (condition-case-unless-debug err
- (progn
- (when (assoc package (bound-and-true-p
- package-pinned-packages))
- (package-read-all-archive-contents))
- (if (assoc package package-archive-contents)
- (package-install package)
- (package-refresh-contents)
- (when (assoc package (bound-and-true-p
- package-pinned-packages))
- (package-read-all-archive-contents))
- (package-install package))
- t)
- (error
- (display-warning 'use-package
- (format "Failed to install %s: %s"
- name (error-message-string err))
- :error))))))))
-
-;;;###autoload
-(defun use-package-handler/:ensure (name _keyword ensure rest state)
- (let* ((body (use-package-process-keywords name rest state)))
- ;; We want to avoid installing packages when the `use-package' macro is
- ;; being macro-expanded by elisp completion (see `lisp--local-variables'),
- ;; but still install packages when byte-compiling, to avoid requiring
- ;; `package' at runtime.
- (if (bound-and-true-p byte-compile-current-file)
- ;; Eval when byte-compiling,
- (funcall use-package-ensure-function name ensure state)
- ;; or else wait until runtime.
- (push `(,use-package-ensure-function ',name ',ensure ',state)
- body))
- body))
-
-(add-to-list 'use-package-defaults
- '(:ensure (list use-package-always-ensure)
- (lambda (name args)
- (and use-package-always-ensure
- (not (plist-member args :load-path))))) t)
-
-(add-to-list 'use-package-defaults
- '(:pin use-package-always-pin use-package-always-pin) t)
-
-(add-to-list 'use-package-keywords :ensure)
-(add-to-list 'use-package-keywords :pin)
-
-(provide 'use-package-ensure)
-
-;;; use-package-ensure.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-jump.el b/elpa/use-package-20200721.2156/use-package-jump.el
deleted file mode 100644
index 4044ad1..0000000
--- a/elpa/use-package-20200721.2156/use-package-jump.el
+++ /dev/null
@@ -1,79 +0,0 @@
-;;; use-package-jump.el --- Attempt to jump to a use-package declaration -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 3 Dec 2017
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Provides the command `M-x use-package-jump-to-package-form', however it
-;; only works if the package being jumped to was required during
-;; initialization. If it was delay-loaded, it will not work. Improvements are
-;; needed.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(defun use-package-find-require (package)
- "Find file that required PACKAGE by searching `load-history'.
-Returns an absolute file path or nil if none is found."
- (catch 'suspect
- (dolist (filespec load-history)
- (dolist (entry (cdr filespec))
- (when (equal entry (cons 'require package))
- (throw 'suspect (car filespec)))))))
-
-;;;###autoload
-(defun use-package-jump-to-package-form (package)
- "Attempt to find and jump to the `use-package' form that loaded
-PACKAGE. This will only find the form if that form actually
-required PACKAGE. If PACKAGE was previously required then this
-function will jump to the file that originally required PACKAGE
-instead."
- (interactive (list (completing-read "Package: " features)))
- (let* ((package (if (stringp package) (intern package) package))
- (requiring-file (use-package-find-require package))
- file location)
- (if (null requiring-file)
- (user-error "Can't find file requiring file; may have been autoloaded")
- (setq file (if (string= (file-name-extension requiring-file) "elc")
- (concat (file-name-sans-extension requiring-file) ".el")
- requiring-file))
- (when (file-exists-p file)
- (find-file-other-window file)
- (save-excursion
- (goto-char (point-min))
- (setq location
- (re-search-forward
- (format (eval use-package-form-regexp-eval) package) nil t)))
- (if (null location)
- (message "No use-package form found.")
- (goto-char location)
- (beginning-of-line))))))
-
-(provide 'use-package-jump)
-
-;;; use-package-jump.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-lint.el b/elpa/use-package-20200721.2156/use-package-lint.el
deleted file mode 100644
index c6e7c3c..0000000
--- a/elpa/use-package-20200721.2156/use-package-lint.el
+++ /dev/null
@@ -1,84 +0,0 @@
-;;; use-package-lint.el --- Attempt to find errors in use-package declarations -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 3 Dec 2017
-;; Version: 1.0
-;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Provides the command `M-x use-package-lint'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'use-package-core)
-
-(defun use-package-lint-declaration (name plist)
- (dolist (path (plist-get plist :load-path))
- (unless (file-exists-p path)
- (display-warning
- 'use-package
- (format "%s :load-path does not exist: %s"
- name path) :error)))
-
- (unless (or (plist-member plist :disabled)
- (plist-get plist :no-require)
- (locate-library (use-package-as-string name) nil
- (plist-get plist :load-path)))
- (display-warning
- 'use-package
- (format "%s module cannot be located" name) :error))
-
- ;; (dolist (command (plist-get plist :commands))
- ;; (unless (string= (find-lisp-object-file-name command nil)
- ;; (locate-library (use-package-as-string name) nil
- ;; (plist-get plist :load-path)))
- ;; (display-warning
- ;; 'use-package
- ;; (format "%s :command is from different path: %s"
- ;; name (symbol-name command)) :error)))
- )
-
-;;;###autoload
-(defun use-package-lint ()
- "Check for errors in use-package declarations.
-For example, if the module's `:if' condition is met, but even
-with the specified `:load-path' the module cannot be found."
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((re (eval use-package-form-regexp-eval)))
- (while (re-search-forward re nil t)
- (goto-char (match-beginning 0))
- (let ((decl (read (current-buffer))))
- (when (eq (car decl) 'use-package)
- (use-package-lint-declaration
- (use-package-as-string (cadr decl))
- (use-package-normalize-keywords
- (cadr decl) (cddr decl)))))))))
-
-(provide 'use-package-lint)
-
-;;; use-package-lint.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package-pkg.el b/elpa/use-package-20200721.2156/use-package-pkg.el
deleted file mode 100644
index 8c0fe57..0000000
--- a/elpa/use-package-20200721.2156/use-package-pkg.el
+++ /dev/null
@@ -1,13 +0,0 @@
-(define-package "use-package" "20200721.2156" "A configuration macro for simplifying your .emacs"
- '((emacs "24.3")
- (bind-key "2.4"))
- :commit "7d925367ef0857d513d62eab4cb57b7436b9ffe9" :keywords
- '("dotemacs" "startup" "speed" "config" "package")
- :authors
- '(("John Wiegley" . "johnw@newartisans.com"))
- :maintainer
- '("John Wiegley" . "johnw@newartisans.com")
- :url "https://github.com/jwiegley/use-package")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/use-package-20200721.2156/use-package.el b/elpa/use-package-20200721.2156/use-package.el
deleted file mode 100644
index 1a8fff8..0000000
--- a/elpa/use-package-20200721.2156/use-package.el
+++ /dev/null
@@ -1,54 +0,0 @@
-;;; use-package.el --- A configuration macro for simplifying your .emacs -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2017 John Wiegley
-
-;; Author: John Wiegley <johnw@newartisans.com>
-;; Maintainer: John Wiegley <johnw@newartisans.com>
-;; Created: 17 Jun 2012
-;; Modified: 29 Nov 2017
-;; Version: 2.4
-;; Package-Requires: ((emacs "24.3") (bind-key "2.4"))
-;; Keywords: dotemacs startup speed config package
-;; URL: https://github.com/jwiegley/use-package
-
-;; 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, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; The `use-package' declaration macro allows you to isolate package
-;; configuration in your ".emacs" in a way that is performance-oriented and,
-;; well, just tidy. I created it because I have over 80 packages that I use
-;; in Emacs, and things were getting difficult to manage. Yet with this
-;; utility my total load time is just under 1 second, with no loss of
-;; functionality!
-;;
-;; Please see README.md from the same repository for documentation.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(require 'use-package-bind-key)
-(require 'use-package-diminish)
-(require 'use-package-delight)
-(require 'use-package-ensure)
-
-(declare-function use-package-jump-to-package-form "use-package-jump")
-(autoload #'use-package-jump-to-package-form "use-package-jump" nil t)
-
-(provide 'use-package)
-
-;;; use-package.el ends here
diff --git a/elpa/use-package-20200721.2156/use-package.info b/elpa/use-package-20200721.2156/use-package.info
deleted file mode 100644
index 9e6a1d8..0000000
--- a/elpa/use-package-20200721.2156/use-package.info
+++ /dev/null
@@ -1,1048 +0,0 @@
-This is use-package.info, produced by makeinfo version 6.5 from
-use-package.texi.
-
- Copyright (C) 2012-2017 John Wiegley <johnw@newartisans.com>
-
- You can redistribute this document 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 document 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.
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* use-package: (use-package). Declarative package configuration for Emacs.
-END-INFO-DIR-ENTRY
-
-
-File: use-package.info, Node: Top, Next: Introduction, Up: (dir)
-
-use-package User Manual
-***********************
-
-use-package is...
-
- Copyright (C) 2012-2017 John Wiegley <johnw@newartisans.com>
-
- You can redistribute this document 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 document 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.
-
-* Menu:
-
-* Introduction::
-* Installation::
-* Getting Started::
-* Keywords::
-* FAQ::
-* Debugging Tools::
-* Command Index::
-* Function Index::
-* Variable Index::
-
-— The Detailed Node Listing —
-
-
-Installation
-
-* Installing from an Elpa Archive::
-* Installing from the Git Repository::
-* Post-Installation Tasks::
-
-
-
-
-Keywords
-
-* ‘:after’: after.
-* ‘:bind-keymap’, ‘:bind-keymap*’: bind-keymap bind-keymap*.
-* ‘:bind’, ‘:bind*’: bind bind*.
-* ‘:commands’: commands.
-* ‘:preface’, ‘:init’, ‘:config’: preface init config.
-* ‘:custom’: custom.
-* ‘:custom-face’: custom-face.
-* ‘:defer’, ‘:demand’: defer demand.
-* ‘:defines’, ‘:functions’: defines functions.
-* ‘:diminish’, ‘:delight’: diminish delight.
-* ‘:disabled’: disabled.
-* ‘:ensure’, ‘:pin’: ensure pin.
-* ‘:hook’: hook.
-* ‘:if’, ‘:when’, ‘:unless’: if when unless.
-* ‘:load-path’: load-path.
-* ‘:mode’, ‘:interpreter’: mode interpreter.
-* ‘:magic’, ‘:magic-fallback’: magic magic-fallback.
-* ‘:no-require’: no-require.
-* ‘:requires’: requires.
-
-
-
-‘:bind’, ‘:bind*’
-
-* Binding to local keymaps::
-
-FAQ
-
-* FAQ - How to ...?::
-* FAQ - Issues and Errors::
-
-FAQ - How to ...?
-
-* This is a question::
-
-
-FAQ - Issues and Errors
-
-* This is an issues::
-
-
-File: use-package.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-The ‘use-package’ macro allows you to isolate package configuration in
-your ‘.emacs’ file in a way that is both performance-oriented and, well,
-tidy. I created it because I have over 400 packages that I use in
-Emacs, and things were getting difficult to manage. Yet with this
-utility my total load time is around 2 seconds, with no loss of
-functionality!
-
-
-File: use-package.info, Node: Installation, Next: Getting Started, Prev: Introduction, Up: Top
-
-2 Installation
-**************
-
-use-package can be installed using Emacs’ package manager or manually
-from its development repository.
-
-* Menu:
-
-* Installing from an Elpa Archive::
-* Installing from the Git Repository::
-* Post-Installation Tasks::
-
-
-File: use-package.info, Node: Installing from an Elpa Archive, Next: Installing from the Git Repository, Up: Installation
-
-2.1 Installing from an Elpa Archive
-===================================
-
-use-package is available from Melpa and Melpa-Stable. If you haven’t
-used Emacs’ package manager before, then it is high time you familiarize
-yourself with it by reading the documentation in the Emacs manual, see
-*note (emacs)Packages::. Then add one of the archives to
-‘package-archives’:
-
- • To use Melpa:
-
- (require 'package)
- (add-to-list 'package-archives
- '("melpa" . "https://melpa.org/packages/") t)
-
- • To use Melpa-Stable:
-
- (require 'package)
- (add-to-list 'package-archives
- '("melpa-stable" . "https://stable.melpa.org/packages/") t)
-
- Once you have added your preferred archive, you need to update the
-local package list using:
-
- M-x package-refresh-contents RET
-
- Once you have done that, you can install use-package and its
-dependencies using:
-
- M-x package-install RET use-package RET
-
- Now see *note Post-Installation Tasks::.
-
-
-File: use-package.info, Node: Installing from the Git Repository, Next: Post-Installation Tasks, Prev: Installing from an Elpa Archive, Up: Installation
-
-2.2 Installing from the Git Repository
-======================================
-
-First, use Git to clone the use-package repository:
-
- $ git clone https://github.com/jwiegley/use-package.git ~/.emacs.d/site-lisp/use-package
- $ cd ~/.emacs.d/site-lisp/use-package
-
- Then compile the libraries and generate the info manuals:
-
- $ make
-
- You may need to create ‘/path/to/use-package/config.mk’ with the
-following content before running ‘make’:
-
- LOAD_PATH = -L /path/to/use-package
-
- Finally add this to your init file:
-
- (add-to-list 'load-path "~/.emacs.d/site-lisp/use-package")
- (require 'use-package)
-
- (with-eval-after-load 'info
- (info-initialize)
- (add-to-list 'Info-directory-list
- "~/.emacs.d/site-lisp/use-package/"))
-
- Note that elements of ‘load-path’ should not end with a slash, while
-those of ‘Info-directory-list’ should.
-
- Instead of running use-package directly from the repository by adding
-it to the ‘load-path’, you might want to instead install it in some
-other directory using ‘sudo make install’ and setting ‘load-path’
-accordingly.
-
- To update use-package use:
-
- $ git pull
- $ make
-
- At times it might be necessary to run ‘make clean all’ instead.
-
- To view all available targets use ‘make help’.
-
- Now see *note Post-Installation Tasks::.
-
-
-File: use-package.info, Node: Post-Installation Tasks, Prev: Installing from the Git Repository, Up: Installation
-
-2.3 Post-Installation Tasks
-===========================
-
-After installing use-package you should verify that you are indeed using
-the use-package release you think you are using. It’s best to restart
-Emacs before doing so, to make sure you are not using an outdated value
-for ‘load-path’.
-
- C-h v use-package-version RET
-
- should display something like
-
- use-package-version’s value is "2.4"
-
- If you are completely new to use-package then see *note Getting
-Started::.
-
- If you run into problems, then please see the *note FAQ::. Also see
-the *note Debugging Tools::.
-
-
-File: use-package.info, Node: Getting Started, Next: Keywords, Prev: Installation, Up: Top
-
-3 Getting Started
-*****************
-
-TODO. For now, see ‘README.md’.
-
-
-File: use-package.info, Node: Keywords, Next: FAQ, Prev: Getting Started, Up: Top
-
-4 Keywords
-**********
-
-* Menu:
-
-* ‘:after’: after.
-* ‘:bind-keymap’, ‘:bind-keymap*’: bind-keymap bind-keymap*.
-* ‘:bind’, ‘:bind*’: bind bind*.
-* ‘:commands’: commands.
-* ‘:preface’, ‘:init’, ‘:config’: preface init config.
-* ‘:custom’: custom.
-* ‘:custom-face’: custom-face.
-* ‘:defer’, ‘:demand’: defer demand.
-* ‘:defines’, ‘:functions’: defines functions.
-* ‘:diminish’, ‘:delight’: diminish delight.
-* ‘:disabled’: disabled.
-* ‘:ensure’, ‘:pin’: ensure pin.
-* ‘:hook’: hook.
-* ‘:if’, ‘:when’, ‘:unless’: if when unless.
-* ‘:load-path’: load-path.
-* ‘:mode’, ‘:interpreter’: mode interpreter.
-* ‘:magic’, ‘:magic-fallback’: magic magic-fallback.
-* ‘:no-require’: no-require.
-* ‘:requires’: requires.
-
-
-File: use-package.info, Node: after, Next: bind-keymap bind-keymap*, Up: Keywords
-
-4.1 ‘:after’
-============
-
-Sometimes it only makes sense to configure a package after another has
-been loaded, because certain variables or functions are not in scope
-until that time. This can achieved using an ‘:after’ keyword that
-allows a fairly rich description of the exact conditions when loading
-should occur. Here is an example:
-
- (use-package hydra
- :load-path "site-lisp/hydra")
-
- (use-package ivy
- :load-path "site-lisp/swiper")
-
- (use-package ivy-hydra
- :after (ivy hydra))
-
- In this case, because all of these packages are demand-loaded in the
-order they occur, the use of ‘:after’ is not strictly necessary. By
-using it, however, the above code becomes order-independent, without an
-implicit depedence on the nature of your init file.
-
- By default, ‘:after (foo bar)’ is the same as ‘:after (:all foo
-bar)’, meaning that loading of the given package will not happen until
-both ‘foo’ and ‘bar’ have been loaded. Here are some of the other
-possibilities:
-
- :after (foo bar)
- :after (:all foo bar)
- :after (:any foo bar)
- :after (:all (:any foo bar) (:any baz quux))
- :after (:any (:all foo bar) (:all baz quux))
-
- When you nest selectors, such as ‘(:any (:all foo bar) (:all baz
-quux))’, it means that the package will be loaded when either both ‘foo’
-and ‘bar’ have been loaded, or both ‘baz’ and ‘quux’ have been loaded.
-
-
-File: use-package.info, Node: bind-keymap bind-keymap*, Next: bind bind*, Prev: after, Up: Keywords
-
-4.2 ‘:bind-keymap’, ‘:bind-keymap*’
-===================================
-
-Normally ‘:bind’ expects that commands are functions that will be
-autoloaded from the given package. However, this does not work if one
-of those commands is actually a keymap, since keymaps are not functions,
-and cannot be autoloaded using Emacs’ ‘autoload’ mechanism.
-
- To handle this case, ‘use-package’ offers a special, limited variant
-of ‘:bind’ called ‘:bind-keymap’. The only difference is that the
-"commands" bound to by ‘:bind-keymap’ must be keymaps defined in the
-package, rather than command functions. This is handled behind the
-scenes by generating custom code that loads the package containing the
-keymap, and then re-executes your keypress after the first load, to
-reinterpret that keypress as a prefix key.
-
- For example:
-
- (use-package projectile
- :bind-keymap
- ("C-c p" . projectile-command-map)
-
-
-File: use-package.info, Node: bind bind*, Next: commands, Prev: bind-keymap bind-keymap*, Up: Keywords
-
-4.3 ‘:bind’, ‘:bind*’
-=====================
-
-Another common thing to do when loading a module is to bind a key to
-primary commands within that module:
-
- (use-package ace-jump-mode
- :bind ("C-." . ace-jump-mode))
-
- This does two things: first, it creates an autoload for the
-‘ace-jump-mode’ command and defers loading of ‘ace-jump-mode’ until you
-actually use it. Second, it binds the key ‘C-.’ to that command. After
-loading, you can use ‘M-x describe-personal-keybindings’ to see all such
-keybindings you’ve set throughout your ‘.emacs’ file.
-
- A more literal way to do the exact same thing is:
-
- (use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (bind-key "C-." 'ace-jump-mode))
-
- When you use the ‘:commands’ keyword, it creates autoloads for those
-commands and defers loading of the module until they are used. Since
-the ‘:init’ form is always run—even if ‘ace-jump-mode’ might not be on
-your system—remember to restrict ‘:init’ code to only what would succeed
-either way.
-
- The ‘:bind’ keyword takes either a cons or a list of conses:
-
- (use-package hi-lock
- :bind (("M-o l" . highlight-lines-matching-regexp)
- ("M-o r" . highlight-regexp)
- ("M-o w" . highlight-phrase)))
-
- The ‘:commands’ keyword likewise takes either a symbol or a list of
-symbols.
-
- NOTE: Special keys like ‘tab’ or ‘F1’-‘Fn’ can be written in square
-brackets, i.e. ‘[tab]’ instead of ‘"tab"’. The syntax for the
-keybindings is similar to the "kbd" syntax: see the Emacs Manual
-(https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-Rebinding.html)
-for more information.
-
- Examples:
-
- (use-package helm
- :bind (("M-x" . helm-M-x)
- ("M-<f5>" . helm-find-files)
- ([f10] . helm-buffers-list)
- ([S-f10] . helm-recentf)))
-
-* Menu:
-
-* Binding to local keymaps::
-
-
-File: use-package.info, Node: Binding to local keymaps, Up: bind bind*
-
-4.3.1 Binding to local keymaps
-------------------------------
-
-Slightly different from binding a key to a keymap, is binding a key
-*within* a local keymap that only exists after the package is loaded.
-‘use-package’ supports this with a ‘:map’ modifier, taking the local
-keymap to bind to:
-
- (use-package helm
- :bind (:map helm-command-map
- ("C-c h" . helm-execute-persistent-action)))
-
- The effect of this statement is to wait until ‘helm’ has loaded, and
-then to bind the key ‘C-c h’ to ‘helm-execute-persistent-action’ within
-Helm’s local keymap, ‘helm-mode-map’.
-
- Multiple uses of ‘:map’ may be specified. Any binding occurring
-before the first use of ‘:map’ are applied to the global keymap:
-
- (use-package term
- :bind (("C-c t" . term)
- :map term-mode-map
- ("M-p" . term-send-up)
- ("M-n" . term-send-down)
- :map term-raw-map
- ("M-o" . other-window)
- ("M-p" . term-send-up)
- ("M-n" . term-send-down)))
-
-
-File: use-package.info, Node: commands, Next: preface init config, Prev: bind bind*, Up: Keywords
-
-4.4 ‘:commands’
-===============
-
-
-File: use-package.info, Node: preface init config, Next: custom, Prev: commands, Up: Keywords
-
-4.5 ‘:preface’, ‘:init’, ‘:config’
-==================================
-
-Here is the simplest ‘use-package’ declaration:
-
- ;; This is only needed once, near the top of the file
- (eval-when-compile
- ;; Following line is not needed if use-package.el is in ~/.emacs.d
- (add-to-list 'load-path "<path where use-package is installed>")
- (require 'use-package))
-
- (use-package foo)
-
- This loads in the package ‘foo’, but only if ‘foo’ is available on
-your system. If not, a warning is logged to the ‘*Messages*’ buffer.
-If it succeeds, a message about ‘"Loading foo"’ is logged, along with
-the time it took to load, if it took over 0.1 seconds.
-
- Use the ‘:init’ keyword to execute code before a package is loaded.
-It accepts one or more forms, up until the next keyword:
-
- (use-package foo
- :init
- (setq foo-variable t))
-
- Similarly, ‘:config’ can be used to execute code after a package is
-loaded. In cases where loading is done lazily (see more about
-autoloading below), this execution is deferred until after the autoload
-occurs:
-
- (use-package foo
- :init
- (setq foo-variable t)
- :config
- (foo-mode 1))
-
- As you might expect, you can use ‘:init’ and ‘:config’ together:
-
- (use-package color-moccur
- :commands (isearch-moccur isearch-all)
- :bind (("M-s O" . moccur)
- :map isearch-mode-map
- ("M-o" . isearch-moccur)
- ("M-O" . isearch-moccur-all))
- :init
- (setq isearch-lazy-highlight t)
- :config
- (use-package moccur-edit))
-
- In this case, I want to autoload the commands ‘isearch-moccur’ and
-‘isearch-all’ from ‘color-moccur.el’, and bind keys both at the global
-level and within the ‘isearch-mode-map’ (see next section). When the
-package is actually loaded (by using one of these commands),
-‘moccur-edit’ is also loaded, to allow editing of the ‘moccur’ buffer.
-
-
-File: use-package.info, Node: custom, Next: custom-face, Prev: preface init config, Up: Keywords
-
-4.6 ‘:custom’
-=============
-
-The ‘:custom’ keyword allows customization of package custom variables.
-
- (use-package comint
- :custom
- (comint-buffer-maximum-size 20000 "Increase comint buffer size.")
- (comint-prompt-read-only t "Make the prompt read only."))
-
- The documentation string is not mandatory.
-
-
-File: use-package.info, Node: custom-face, Next: defer demand, Prev: custom, Up: Keywords
-
-4.7 ‘:custom-face’
-==================
-
-The ‘:custom-face’ keyword allows customization of package custom faces.
-
- (use-package eruby-mode
- :custom-face
- (eruby-standard-face ((t (:slant italic)))))
-
-
-File: use-package.info, Node: defer demand, Next: defines functions, Prev: custom-face, Up: Keywords
-
-4.8 ‘:defer’, ‘:demand’
-=======================
-
-In almost all cases you don’t need to manually specify ‘:defer t’. This
-is implied whenever ‘:bind’ or ‘:mode’ or ‘:interpreter’ is used.
-Typically, you only need to specify ‘:defer’ if you know for a fact that
-some other package will do something to cause your package to load at
-the appropriate time, and thus you would like to defer loading even
-though use-package isn’t creating any autoloads for you.
-
- You can override package deferral with the ‘:demand’ keyword. Thus,
-even if you use ‘:bind’, using ‘:demand’ will force loading to occur
-immediately and not establish an autoload for the bound key.
-
-
-File: use-package.info, Node: defines functions, Next: diminish delight, Prev: defer demand, Up: Keywords
-
-4.9 ‘:defines’, ‘:functions’
-============================
-
-Another feature of ‘use-package’ is that it always loads every file that
-it can when ‘.emacs’ is being byte-compiled. This helps to silence
-spurious warnings about unknown variables and functions.
-
- However, there are times when this is just not enough. For those
-times, use the ‘:defines’ and ‘:functions’ keywords to introduce dummy
-variable and function declarations solely for the sake of the
-byte-compiler:
-
- (use-package texinfo
- :defines texinfo-section-list
- :commands texinfo-mode
- :init
- (add-to-list 'auto-mode-alist '("\\.texi$" . texinfo-mode)))
-
- If you need to silence a missing function warning, you can use
-‘:functions’:
-
- (use-package ruby-mode
- :mode "\\.rb\\'"
- :interpreter "ruby"
- :functions inf-ruby-keys
- :config
- (defun my-ruby-mode-hook ()
- (require 'inf-ruby)
- (inf-ruby-keys))
-
- (add-hook 'ruby-mode-hook 'my-ruby-mode-hook))
-
-
-File: use-package.info, Node: diminish delight, Next: disabled, Prev: defines functions, Up: Keywords
-
-4.10 ‘:diminish’, ‘:delight’
-============================
-
-‘use-package’ also provides built-in support for the diminish and
-delight utilities—if you have them installed. Their purpose is to
-remove or change minor mode strings in your mode-line.
-
- diminish (https://github.com/myrjola/diminish.el) is invoked with the
-‘:diminish’ keyword, which is passed either a minor mode symbol, a cons
-of the symbol and its replacement string, or just a replacement string,
-in which case the minor mode symbol is guessed to be the package name
-with "-mode" appended at the end:
-
- (use-package abbrev
- :diminish abbrev-mode
- :config
- (if (file-exists-p abbrev-file-name)
- (quietly-read-abbrev-file)))
-
- delight (https://elpa.gnu.org/packages/delight.html) is invoked with
-the ‘:delight’ keyword, which is passed a minor mode symbol, a
-replacement string or quoted mode-line data
-(https://www.gnu.org/software/emacs/manual/html_node/elisp/Mode-Line-Data.html)
-(in which case the minor mode symbol is guessed to be the package name
-with "-mode" appended at the end), both of these, or several lists of
-both. If no arguments are provided, the default mode name is hidden
-completely.
-
- ;; Don't show anything for rainbow-mode.
- (use-package rainbow-mode
- :delight)
-
- ;; Don't show anything for auto-revert-mode, which doesn't match
- ;; its package name.
- (use-package autorevert
- :delight auto-revert-mode)
-
- ;; Remove the mode name for projectile-mode, but show the project name.
- (use-package projectile
- :delight '(:eval (concat " " (projectile-project-name))))
-
- ;; Completely hide visual-line-mode and change auto-fill-mode to " AF".
- (use-package emacs
- :delight
- (auto-fill-function " AF")
- (visual-line-mode))
-
-
-File: use-package.info, Node: disabled, Next: ensure pin, Prev: diminish delight, Up: Keywords
-
-4.11 ‘:disabled’
-================
-
-The ‘:disabled’ keyword can turn off a module you’re having difficulties
-with, or stop loading something you’re not using at the present time:
-
- (use-package ess-site
- :disabled
- :commands R)
-
- When byte-compiling your ‘.emacs’ file, disabled declarations are
-omitted from the output entirely, to accelerate startup times.
-
-
-File: use-package.info, Node: ensure pin, Next: hook, Prev: disabled, Up: Keywords
-
-4.12 ‘:ensure’, ‘:pin’
-======================
-
-You can use ‘use-package’ to load packages from ELPA with ‘package.el’.
-This is particularly useful if you share your ‘.emacs’ among several
-machines; the relevant packages are downloaded automatically once
-declared in your ‘.emacs’. The ‘:ensure’ keyword causes the package(s)
-to be installed automatically if not already present on your system (set
-‘(setq use-package-always-ensure t)’ if you wish this behavior to be
-global for all packages):
-
- (use-package magit
- :ensure t)
-
- If you need to install a different package from the one named by
-‘use-package’, you can specify it like this:
-
- (use-package tex
- :ensure auctex)
-
- Lastly, when running on Emacs 24.4 or later, use-package can pin a
-package to a specific archive, allowing you to mix and match packages
-from different archives. The primary use-case for this is preferring
-packages from the ‘melpa-stable’ and ‘gnu’ archives, but using specific
-packages from ‘melpa’ when you need to track newer versions than what is
-available in the ‘stable’ archives is also a valid use-case.
-
- By default ‘package.el’ prefers ‘melpa’ over ‘melpa-stable’ due to
-the versioning ‘(> evil-20141208.623 evil-1.0.9)’, so even if you are
-tracking only a single package from ‘melpa’, you will need to tag all
-the non-‘melpa’ packages with the appropriate archive. If this really
-annoys you, then you can set ‘use-package-always-pin’ to set a default.
-
- If you want to manually keep a package updated and ignore upstream
-updates, you can pin it to ‘manual’, which as long as there is no
-repository by that name, will Just Work(tm).
-
- ‘use-package’ throws an error if you try to pin a package to an
-archive that has not been configured using ‘package-archives’ (apart
-from the magic ‘manual’ archive mentioned above):
-
- Archive 'foo' requested for package 'bar' is not available.
-
- Example:
-
- (use-package company
- :ensure t
- :pin melpa-stable)
-
- (use-package evil
- :ensure t)
- ;; no :pin needed, as package.el will choose the version in melpa
-
- (use-package adaptive-wrap
- :ensure t
- ;; as this package is available only in the gnu archive, this is
- ;; technically not needed, but it helps to highlight where it
- ;; comes from
- :pin gnu)
-
- (use-package org
- :ensure t
- ;; ignore org-mode from upstream and use a manually installed version
- :pin manual)
-
- *NOTE*: the ‘:pin’ argument has no effect on emacs versions < 24.4.
-
-
-File: use-package.info, Node: hook, Next: if when unless, Prev: ensure pin, Up: Keywords
-
-4.13 ‘:hook’
-============
-
-The ‘:hook’ keyword allows adding functions onto hooks, here only the
-basename of the hook is required. Thus, all of the following are
-equivalent:
-
- (use-package ace-jump-mode
- :hook prog-mode)
-
- (use-package ace-jump-mode
- :hook (prog-mode . ace-jump-mode))
-
- (use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (add-hook 'prog-mode-hook #'ace-jump-mode))
-
- And likewise, when multiple hooks should be applied, the following
-are also equivalent:
-
- (use-package ace-jump-mode
- :hook (prog-mode text-mode))
-
- (use-package ace-jump-mode
- :hook ((prog-mode text-mode) . ace-jump-mode))
-
- (use-package ace-jump-mode
- :hook ((prog-mode . ace-jump-mode)
- (text-mode . ace-jump-mode)))
-
- (use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (add-hook 'prog-mode-hook #'ace-jump-mode)
- (add-hook 'text-mode-hook #'ace-jump-mode))
-
- The use of ‘:hook’, as with ‘:bind’, ‘:mode’, ‘:interpreter’, etc.,
-causes the functions being hooked to implicitly be read as ‘:commands’
-(meaning they will establish interactive ‘autoload’ definitions for that
-module, if not already defined as functions), and so ‘:defer t’ is also
-implied by ‘:hook’.
-
-
-File: use-package.info, Node: if when unless, Next: load-path, Prev: hook, Up: Keywords
-
-4.14 ‘:if’, ‘:when’, ‘:unless’
-==============================
-
-You can use the ‘:if’ keyword to predicate the loading and
-initialization of modules.
-
- For example, I only want ‘edit-server’ running for my main, graphical
-Emacs, not for other Emacsen I may start at the command line:
-
- (use-package edit-server
- :if window-system
- :init
- (add-hook 'after-init-hook 'server-start t)
- (add-hook 'after-init-hook 'edit-server-start t))
-
- In another example, we can load things conditional on the operating
-system:
-
- (use-package exec-path-from-shell
- :if (memq window-system '(mac ns))
- :ensure t
- :config
- (exec-path-from-shell-initialize))
-
- Note that ‘:when’ is provided as an alias for ‘:if’, and ‘:unless
-foo’ means the same thing as ‘:if (not foo)’.
-
-
-File: use-package.info, Node: load-path, Next: mode interpreter, Prev: if when unless, Up: Keywords
-
-4.15 ‘:load-path’
-=================
-
-If your package needs a directory added to the ‘load-path’ in order to
-load, use ‘:load-path’. This takes a symbol, a function, a string or a
-list of strings. If the path is relative, it is expanded within
-‘user-emacs-directory’:
-
- (use-package ess-site
- :load-path "site-lisp/ess/lisp/"
- :commands R)
-
- Note that when using a symbol or a function to provide a dynamically
-generated list of paths, you must inform the byte-compiler of this
-definition so the value is available at byte-compilation time. This is
-done by using the special form ‘eval-and-compile’ (as opposed to
-‘eval-when-compile’). Further, this value is fixed at whatever was
-determined during compilation, to avoid looking up the same information
-again on each startup:
-
- (eval-and-compile
- (defun ess-site-load-path ()
- (shell-command "find ~ -path ess/lisp")))
-
- (use-package ess-site
- :load-path (lambda () (list (ess-site-load-path)))
- :commands R)
-
-
-File: use-package.info, Node: mode interpreter, Next: magic magic-fallback, Prev: load-path, Up: Keywords
-
-4.16 ‘:mode’, ‘:interpreter’
-============================
-
-Similar to ‘:bind’, you can use ‘:mode’ and ‘:interpreter’ to establish
-a deferred binding within the ‘auto-mode-alist’ and
-‘interpreter-mode-alist’ variables. The specifier to either keyword can
-be a cons cell, a list of cons cells, or a string or regexp:
-
- (use-package ruby-mode
- :mode "\\.rb\\'"
- :interpreter "ruby")
-
- ;; The package is "python" but the mode is "python-mode":
- (use-package python
- :mode ("\\.py\\'" . python-mode)
- :interpreter ("python" . python-mode))
-
- If you aren’t using ‘:commands’, ‘:bind’, ‘:bind*’, ‘:bind-keymap’,
-‘:bind-keymap*’, ‘:mode’, or ‘:interpreter’ (all of which imply
-‘:defer’; see the docstring for ‘use-package’ for a brief description of
-each), you can still defer loading with the ‘:defer’ keyword:
-
- (use-package ace-jump-mode
- :defer t
- :init
- (autoload 'ace-jump-mode "ace-jump-mode" nil t)
- (bind-key "C-." 'ace-jump-mode))
-
- This does exactly the same thing as the following:
-
- (use-package ace-jump-mode
- :bind ("C-." . ace-jump-mode))
-
-
-File: use-package.info, Node: magic magic-fallback, Next: no-require, Prev: mode interpreter, Up: Keywords
-
-4.17 ‘:magic’, ‘:magic-fallback’
-================================
-
-Similar to ‘:mode‘ and ‘:interpreter‘, you can also use ‘:magic‘ and
-‘:magic-fallback‘ to cause certain function to be run if the beginning
-of a file matches a given regular expression. The difference between
-the two is that ‘:magic-fallback‘ has a lower priority than ‘:mode‘.
-For example:
-
- “‘ elisp (use-package pdf-tools :load-path "site-lisp/pdf-tools/lisp"
-:magic ("%PDF" . pdf-view-mode) :config (pdf-tools-install)) “‘
-
- This registers an autoloaded command for ‘pdf-view-mode‘, defers
-loading of ‘pdf-tools‘, and runs ‘pdf-view-mode‘ if the beginning of a
-buffer matches the string ‘"%PDF"‘.
-
-
-File: use-package.info, Node: no-require, Next: requires, Prev: magic magic-fallback, Up: Keywords
-
-4.18 ‘:no-require’
-==================
-
-Normally, ‘use-package’ will load each package at compile time before
-compiling the configuration, to ensure that any necessary symbols are in
-scope to satisfy the byte-compiler. At times this can cause problems,
-since a package may have special loading requirements, and all that you
-want to use ‘use-package’ for is to add a configuration to the
-‘eval-after-load’ hook. In such cases, use the ‘:no-require’ keyword:
-
- (use-package foo
- :no-require t
- :config
- (message "This is evaluated when `foo' is loaded"))
-
-
-File: use-package.info, Node: requires, Prev: no-require, Up: Keywords
-
-4.19 ‘:requires’
-================
-
-While the ‘:after’ keyword delays loading until the dependencies are
-loaded, the somewhat simpler ‘:requires’ keyword simply never loads the
-package if the dependencies are not available at the time the
-‘use-package’ declaration is encountered. By "available" in this
-context it means that ‘foo’ is available of ‘(featurep 'foo)’ evaluates
-to a non-nil value. For example:
-
- (use-package abbrev
- :requires foo)
-
- This is the same as:
-
- (use-package abbrev
- :if (featurep 'foo))
-
- As a convenience, a list of such packages may be specified:
-
- (use-package abbrev
- :requires (foo bar baz))
-
- For more complex logic, such as that supported by ‘:after’, simply
-use ‘:if’ and the appropriate Lisp expression.
-
-
-File: use-package.info, Node: FAQ, Next: Debugging Tools, Prev: Keywords, Up: Top
-
-Appendix A FAQ
-**************
-
-The next two nodes lists frequently asked questions.
-
- Please also use the *note Debugging Tools::.
-
-* Menu:
-
-* FAQ - How to ...?::
-* FAQ - Issues and Errors::
-
-
-File: use-package.info, Node: FAQ - How to ...?, Next: FAQ - Issues and Errors, Up: FAQ
-
-A.1 FAQ - How to ...?
-=====================
-
-* Menu:
-
-* This is a question::
-
-
-File: use-package.info, Node: This is a question, Up: FAQ - How to ...?
-
-A.1.1 This is a question
-------------------------
-
-This is an answer.
-
-
-File: use-package.info, Node: FAQ - Issues and Errors, Prev: FAQ - How to ...?, Up: FAQ
-
-A.2 FAQ - Issues and Errors
-===========================
-
-* Menu:
-
-* This is an issues::
-
-
-File: use-package.info, Node: This is an issues, Up: FAQ - Issues and Errors
-
-A.2.1 This is an issues
------------------------
-
-This is a description.
-
-
-File: use-package.info, Node: Debugging Tools, Next: Command Index, Prev: FAQ, Up: Top
-
-B Debugging Tools
-*****************
-
-TODO
-
- Please also see the *note FAQ::.
-
-
-File: use-package.info, Node: Command Index, Next: Function Index, Prev: Debugging Tools, Up: Top
-
-Appendix C Command Index
-************************
-
-
-File: use-package.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top
-
-Appendix D Function Index
-*************************
-
-
-File: use-package.info, Node: Variable Index, Prev: Function Index, Up: Top
-
-Appendix E Variable Index
-*************************
-
-
-
-Tag Table:
-Node: Top784
-Node: Introduction2819
-Node: Installation3306
-Node: Installing from an Elpa Archive3658
-Node: Installing from the Git Repository4773
-Node: Post-Installation Tasks6309
-Node: Getting Started7022
-Node: Keywords7194
-Node: after8113
-Node: bind-keymap bind-keymap*9645
-Node: bind bind*10698
-Node: Binding to local keymaps12738
-Node: commands13829
-Node: preface init config13971
-Node: custom16049
-Node: custom-face16489
-Node: defer demand16809
-Node: defines functions17621
-Node: diminish delight18766
-Node: disabled20709
-Node: ensure pin21204
-Node: hook23934
-Node: if when unless25352
-Node: load-path26298
-Node: mode interpreter27444
-Node: magic magic-fallback28755
-Node: no-require29600
-Node: requires30304
-Node: FAQ31191
-Node: FAQ - How to ...?31474
-Node: This is a question31646
-Node: FAQ - Issues and Errors31794
-Node: This is an issues31977
-Node: Debugging Tools32132
-Node: Command Index32306
-Node: Function Index32462
-Node: Variable Index32619
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/elpa/which-key-20200721.1927/which-key-autoloads.el b/elpa/which-key-20200721.1927/which-key-autoloads.el
deleted file mode 100644
index d6e3009..0000000
--- a/elpa/which-key-20200721.1927/which-key-autoloads.el
+++ /dev/null
@@ -1,202 +0,0 @@
-;;; which-key-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "which-key" "which-key.el" (0 0 0 0))
-;;; Generated autoloads from which-key.el
-
-(defvar which-key-mode nil "\
-Non-nil if Which-Key mode is enabled.
-See the `which-key-mode' command
-for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `which-key-mode'.")
-
-(custom-autoload 'which-key-mode "which-key" nil)
-
-(autoload 'which-key-mode "which-key" "\
-Toggle which-key-mode.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'which-key-setup-side-window-right "which-key" "\
-Apply suggested settings for side-window that opens on right.
-
-\(fn)" t nil)
-
-(autoload 'which-key-setup-side-window-right-bottom "which-key" "\
-Apply suggested settings for side-window that opens on right
-if there is space and the bottom otherwise.
-
-\(fn)" t nil)
-
-(autoload 'which-key-setup-side-window-bottom "which-key" "\
-Apply suggested settings for side-window that opens on
-bottom.
-
-\(fn)" t nil)
-
-(autoload 'which-key-setup-minibuffer "which-key" "\
-Apply suggested settings for minibuffer.
-Do not use this setup if you use the paging commands. Instead use
-`which-key-setup-side-window-bottom', which is nearly identical
-but more functional.
-
-\(fn)" t nil)
-
-(autoload 'which-key-add-key-based-replacements "which-key" "\
-Replace the description of KEY-SEQUENCE with REPLACEMENT.
-KEY-SEQUENCE is a string suitable for use in `kbd'. REPLACEMENT
-may either be a string, as in
-
-\(which-key-add-key-based-replacements \"C-x 1\" \"maximize\")
-
-a cons of two strings as in
-
-\(which-key-add-key-based-replacements \"C-x 8\"
- '(\"unicode\" . \"Unicode keys\"))
-
-or a function that takes a (KEY . BINDING) cons and returns a
-replacement.
-
-In the second case, the second string is used to provide a longer
-name for the keys under a prefix.
-
-MORE allows you to specifcy additional KEY REPLACEMENT pairs. All
-replacements are added to
-`which-key-key-based-description-replacement-alist'.
-
-\(fn KEY-SEQUENCE REPLACEMENT &rest MORE)" nil nil)
-
-(autoload 'which-key-add-major-mode-key-based-replacements "which-key" "\
-Functions like `which-key-add-key-based-replacements'.
-The difference is that MODE specifies the `major-mode' that must
-be active for KEY-SEQUENCE and REPLACEMENT (MORE contains
-addition KEY-SEQUENCE REPLACEMENT pairs) to apply.
-
-\(fn MODE KEY-SEQUENCE REPLACEMENT &rest MORE)" nil nil)
-
-(autoload 'which-key-reload-key-sequence "which-key" "\
-Simulate entering the key sequence KEY-SEQ.
-KEY-SEQ should be a list of events as produced by
-`listify-key-sequence'. If nil, KEY-SEQ defaults to
-`which-key--current-key-list'. Any prefix arguments that were
-used are reapplied to the new key sequence.
-
-\(fn &optional KEY-SEQ)" nil nil)
-
-(autoload 'which-key-show-standard-help "which-key" "\
-Call the command in `which-key--prefix-help-cmd-backup'.
-Usually this is `describe-prefix-bindings'.
-
-\(fn &optional _)" t nil)
-
-(autoload 'which-key-show-next-page-no-cycle "which-key" "\
-Show next page of keys unless on the last page, in which case
-call `which-key-show-standard-help'.
-
-\(fn)" t nil)
-
-(autoload 'which-key-show-previous-page-no-cycle "which-key" "\
-Show previous page of keys unless on the first page, in which
-case do nothing.
-
-\(fn)" t nil)
-
-(autoload 'which-key-show-next-page-cycle "which-key" "\
-Show the next page of keys, cycling from end to beginning
-after last page.
-
-\(fn &optional _)" t nil)
-
-(autoload 'which-key-show-previous-page-cycle "which-key" "\
-Show the previous page of keys, cycling from beginning to end
-after first page.
-
-\(fn &optional _)" t nil)
-
-(autoload 'which-key-show-top-level "which-key" "\
-Show top-level bindings.
-
-\(fn &optional _)" t nil)
-
-(autoload 'which-key-show-major-mode "which-key" "\
-Show top-level bindings in the map of the current major mode.
-
-This function will also detect evil bindings made using
-`evil-define-key' in this map. These bindings will depend on the
-current evil state.
-
-\(fn &optional ALL)" t nil)
-
-(autoload 'which-key-show-full-major-mode "which-key" "\
-Show all bindings in the map of the current major mode.
-
-This function will also detect evil bindings made using
-`evil-define-key' in this map. These bindings will depend on the
-current evil state.
-
-\(fn)" t nil)
-
-(autoload 'which-key-dump-bindings "which-key" "\
-Dump bindings from PREFIX into buffer named BUFFER-NAME.
-
-PREFIX should be a string suitable for `kbd'.
-
-\(fn PREFIX BUFFER-NAME)" t nil)
-
-(autoload 'which-key-undo-key "which-key" "\
-Undo last keypress and force which-key update.
-
-\(fn &optional _)" t nil)
-
-(autoload 'which-key-C-h-dispatch "which-key" "\
-Dispatch C-h commands by looking up key in
-`which-key-C-h-map'. This command is always accessible (from any
-prefix) if `which-key-use-C-h-commands' is non nil.
-
-\(fn)" t nil)
-
-(autoload 'which-key-show-keymap "which-key" "\
-Show the top-level bindings in KEYMAP using which-key. KEYMAP
-is selected interactively from all available keymaps.
-
-If NO-PAGING is non-nil, which-key will not intercept subsequent
-keypresses for the paging functionality.
-
-\(fn KEYMAP &optional NO-PAGING)" t nil)
-
-(autoload 'which-key-show-full-keymap "which-key" "\
-Show all bindings in KEYMAP using which-key. KEYMAP is
-selected interactively from all available keymaps.
-
-\(fn KEYMAP)" t nil)
-
-(autoload 'which-key-show-minor-mode-keymap "which-key" "\
-Show the top-level bindings in KEYMAP using which-key. KEYMAP
-is selected interactively by mode in `minor-mode-map-alist'.
-
-\(fn &optional ALL)" t nil)
-
-(autoload 'which-key-show-full-minor-mode-keymap "which-key" "\
-Show all bindings in KEYMAP using which-key. KEYMAP
-is selected interactively by mode in `minor-mode-map-alist'.
-
-\(fn)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "which-key" '("which-key-")))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; which-key-autoloads.el ends here
diff --git a/elpa/which-key-20200721.1927/which-key-pkg.el b/elpa/which-key-20200721.1927/which-key-pkg.el
deleted file mode 100644
index bd1310e..0000000
--- a/elpa/which-key-20200721.1927/which-key-pkg.el
+++ /dev/null
@@ -1,2 +0,0 @@
-;;; -*- no-byte-compile: t -*-
-(define-package "which-key" "20200721.1927" "Display available keybindings in popup" '((emacs "24.4")) :commit "3642c11d5ef9be3c6fb9edb8fd5ec3c370abd889" :authors '(("Justin Burkett" . "justin@burkett.cc")) :maintainer '("Justin Burkett" . "justin@burkett.cc") :url "https://github.com/justbur/emacs-which-key")
diff --git a/elpa/which-key-20200721.1927/which-key.el b/elpa/which-key-20200721.1927/which-key.el
deleted file mode 100644
index 1a93fd0..0000000
--- a/elpa/which-key-20200721.1927/which-key.el
+++ /dev/null
@@ -1,2773 +0,0 @@
-;;; which-key.el --- Display available keybindings in popup -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2017 Free Software Foundation, Inc.
-
-;; Author: Justin Burkett <justin@burkett.cc>
-;; Maintainer: Justin Burkett <justin@burkett.cc>
-;; URL: https://github.com/justbur/emacs-which-key
-;; Package-Version: 20200721.1927
-;; Package-Commit: 3642c11d5ef9be3c6fb9edb8fd5ec3c370abd889
-;; Version: 3.3.2
-;; Keywords:
-;; Package-Requires: ((emacs "24.4"))
-
-;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; which-key provides the minor mode which-key-mode for Emacs. The mode displays
-;; the key bindings following your currently entered incomplete command (a
-;; prefix) in a popup. For example, after enabling the minor mode if you enter
-;; C-x and wait for the default of 1 second the minibuffer will expand with all
-;; of the available key bindings that follow C-x (or as many as space allows
-;; given your settings). This includes prefixes like C-x 8 which are shown in a
-;; different face. Screenshots of what the popup will look like along with
-;; information about additional features can be found at
-;; https://github.com/justbur/emacs-which-key.
-;;
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'button)
-(require 'regexp-opt)
-
-;; For compiler
-(defvar evil-operator-shortcut-map)
-(defvar evil-operator-state-map)
-(defvar evil-motion-state-map)
-(defvar golden-ratio-mode)
-(declare-function evil-get-command-property "ext:evil-common.el")
-
-;;; Options
-
-(defgroup which-key nil
- "Customization options for which-key-mode"
- :group 'help
- :prefix "which-key-")
-
-(defcustom which-key-idle-delay 1.0
- "Delay (in seconds) for which-key buffer to popup. This
- variable should be set before activating `which-key-mode'.
-
-A value of zero might lead to issues, so a non-zero value is
-recommended
-(see https://github.com/justbur/emacs-which-key/issues/134)."
- :group 'which-key
- :type 'float)
-
-(defcustom which-key-idle-secondary-delay nil
- "Once the which-key buffer shows once for a key sequence reduce
-the idle time to this amount (in seconds). This makes it possible
-to shorten the delay for subsequent popups in the same key
-sequence. The default is for this value to be nil, which disables
-this behavior."
- :group 'which-key
- :type '(choice float (const :tag "Disabled" nil)))
-
-(defcustom which-key-echo-keystrokes (if (and echo-keystrokes
- (> (+ echo-keystrokes 0.01)
- which-key-idle-delay))
- (/ (float which-key-idle-delay) 4)
- echo-keystrokes)
- "Value to use for `echo-keystrokes'.
-This only applies if `which-key-popup-type' is minibuffer or
-`which-key-show-prefix' is echo. It needs to be less than
-`which-key-idle-delay' or else the keystroke echo will erase the
-which-key popup."
- :group 'which-key
- :type 'float)
-
-(defcustom which-key-max-description-length 27
- "Truncate the description of keys to this length.
-Also adds \"..\". If nil, disable any truncation."
- :group 'which-key
- :type '(choice integer (const :tag "Disable truncation" nil)))
-
-(defcustom which-key-add-column-padding 0
- "Additional padding (number of spaces) to add to the left of
-each key column."
- :group 'which-key
- :type 'integer)
-
-(defcustom which-key-unicode-correction 3
- "Correction for wide unicode characters.
-Since we measure width in terms of the number of characters,
-Unicode characters that are wider than ASCII characters throw off
-the calculation for available width in the which-key buffer. This
-variable allows you to adjust for the wide unicode characters by
-artificially reducing the available width in the buffer.
-
-The default of 3 means allow for the total extra width
-contributed by any wide unicode characters to be up to one
-additional ASCII character in the which-key buffer. Increase this
-number if you are seeing characters get cutoff on the right side
-of the which-key popup."
- :group 'which-key
- :type 'integer)
-
-(defcustom which-key-dont-use-unicode nil
- "If non-nil, don't use any unicode characters in default setup."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-separator
- (if which-key-dont-use-unicode " : " " → ")
- "Separator to use between key and description. Default is \" →
-\", unless `which-key-dont-use-unicode' is non nil, in which case
-the default is \" : \"."
- :group 'which-key
- :type 'string)
-
-(defcustom which-key-prefix-prefix "+"
- "String to insert in front of prefix commands (i.e., commands
-that represent a sub-map). Default is \"+\"."
- :group 'which-key
- :type 'string)
-
-(defcustom which-key-compute-remaps nil
- "If non-nil, show remapped command if a command has been
-remapped given the currently active keymaps."
- :group 'which-key
- :type 'boolean)
-
-(defvar which-key-key-replacement-alist nil)
-(make-obsolete-variable 'which-key-key-replacement-alist
- 'which-key-replacement-alist "2016-11-21")
-(defvar which-key-description-replacement-alist nil)
-(make-obsolete-variable 'which-key-description-replacement-alist
- 'which-key-replacement-alist "2016-11-21")
-(defvar which-key-key-based-description-replacement-alist nil)
-(make-obsolete-variable 'which-key-key-based-description-replacement-alist
- 'which-key-replacement-alist "2016-11-21")
-
-(defcustom which-key-replacement-alist
- (delq nil
- `(((nil . "Prefix Command") . (nil . "prefix"))
- ((nil . "\\`\\?\\?\\'") . (nil . "lambda"))
- ((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg"))
- ,@(unless which-key-dont-use-unicode
- '((("<left>") . ("←"))
- (("<right>") . ("→"))))
- (("<\\([[:alnum:]-]+\\)>") . ("\\1"))))
- "Association list to determine how to manipulate descriptions
-of key bindings in the which-key popup. Each element of the list
-is a nested cons cell with the format
-
-\(MATCH CONS . REPLACEMENT\).
-
-The MATCH CONS determines when a replacement should occur and
-REPLACEMENT determines how the replacement should occur. Each may
-have the format \(KEY REGEXP . BINDING REGEXP\). For the
-replacement to apply the key binding must match both the KEY
-REGEXP and the BINDING REGEXP. A value of nil in either position
-can be used to match every possibility. The replacement is
-performed by using `replace-regexp-in-string' on the KEY REGEXP
-from the MATCH CONS and REPLACEMENT when it is a cons cell, and
-then similarly for the BINDING REGEXP. A nil value in the BINDING
-REGEXP position cancels the replacement. For example, the entry
-
-\(\(nil . \"Prefix Command\"\) . \(nil . \"prefix\"\)\)
-
-matches any binding with the descriptions \"Prefix Command\" and
-replaces the description with \"prefix\", ignoring the
-corresponding key.
-
-REPLACEMENT may also be a function taking a cons cell
-\(KEY . BINDING\) and producing a new corresponding cons cell.
-
-If REPLACEMENT is anything other than a cons cell \(and non nil\)
-the key binding is ignored by which-key.
-
-Finally, you can multiple replacements to occur for a given key
-binding by setting `which-key-allow-multiple-replacements' to a
-non-nil value."
- :group 'which-key
- :type '(alist :key-type (cons (choice regexp (const nil))
- (choice regexp (const nil)))
- :value-type (cons (choice string (const nil))
- (choice string (const nil)))))
-
-(when (bound-and-true-p which-key-key-replacement-alist)
- (mapc
- (lambda (repl)
- (push (cons (cons (car repl) nil) (cons (cdr repl) nil))
- which-key-replacement-alist))
- which-key-key-replacement-alist))
-(when (bound-and-true-p which-key-description-replacement-alist)
- (mapc
- (lambda (repl)
- (push (cons (cons nil (car repl)) (cons nil (cdr repl)))
- which-key-replacement-alist))
- which-key-description-replacement-alist))
-
-(defcustom which-key-allow-multiple-replacements nil
- "Allow a key binding to match and be modified by multiple
-elements in `which-key-replacement-alist' if non-nil. When nil,
-only the first match is used to perform replacements from
-`which-key-replacement-alist'."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-show-docstrings nil
- "If non-nil, show each command's docstring next to the command
-in the which-key buffer. This will only display the docstring up
-to the first line break. If you set this variable to the symbol
-docstring-only, then the command's name with be omitted. You
-probably also want to adjust `which-key-max-description-length'
-at the same time if you use this feature."
- :group 'which-key
- :type '(radio
- (const :tag "Do not show docstrings" nil)
- (const :tag "Add docstring to command names" t)
- (const :tag "Replace command name with docstring" docstring-only)))
-
-(defcustom which-key-highlighted-command-list '()
- "A list of strings and/or cons cells used to highlight certain
-commands. If the element is a string, assume it is a regexp
-pattern for matching command names and use
-`which-key-highlighted-command-face' for any matching names. If
-the element is a cons cell, it should take the form (regexp .
-face to apply)."
- :group 'which-key
- :type '(repeat (choice string (cons regexp face))))
-
-(defcustom which-key-special-keys '()
- "These keys will automatically be truncated to one character
-and have `which-key-special-key-face' applied to them. This is
-disabled by default. Try this to see the effect.
-
-\(setq which-key-special-keys '(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)"
- :group 'which-key
- :type '(repeat string))
-
-(defcustom which-key-buffer-name " *which-key*"
- "Name of which-key buffer."
- :group 'which-key
- :type 'string)
-
-(defcustom which-key-show-prefix 'echo
- "Whether to and where to display the current prefix sequence.
-Possible choices are echo for echo area (the default), left, top
-and nil. Nil turns the feature off."
- :group 'which-key
- :type '(radio (const :tag "Left of the keys" left)
- (const :tag "In the first line" top)
- (const :tag "In the last line" bottom)
- (const :tag "In the echo area" echo)
- (const :tag "In the mode-line" mode-line)
- (const :tag "Hide" nil)))
-
-(defcustom which-key-popup-type 'side-window
- "Supported types are minibuffer, side-window, frame, and custom."
- :group 'which-key
- :type '(radio (const :tag "Show in minibuffer" minibuffer)
- (const :tag "Show in side window" side-window)
- (const :tag "Show in popup frame" frame)
- (const :tag "Use your custom display functions" custom)))
-
-(defcustom which-key-min-display-lines 1
- "The minimum number of horizontal lines to display in the
- which-key buffer."
- :group 'which-key
- :type 'integer)
-
-(defcustom which-key-max-display-columns nil
- "The maximum number of columns to display in the which-key
-buffer. nil means don't impose a maximum."
- :group 'which-key
- :type '(choice integer (const :tag "Unbounded" nil)))
-
-(defcustom which-key-side-window-location 'bottom
- "Location of which-key popup when `which-key-popup-type' is side-window.
-Should be one of top, bottom, left or right. You can also specify
-a list of two locations, like (right bottom). In this case, the
-first location is tried. If there is not enough room, the second
-location is tried."
- :group 'which-key
- :type '(radio (const right)
- (const bottom)
- (const left)
- (const top)
- (const (right bottom))
- (const (bottom right))))
-
-(defcustom which-key-side-window-slot 0
- "The `slot' to use for `display-buffer-in-side-window' when
-`which-key-popup-type' is 'side-window. Quoting from the
-docstring of `display-buffer-in-side-window',
-
-‘slot’ if non-nil, specifies the window slot where to display
- BUFFER. A value of zero or nil means use the middle slot on
- the specified side. A negative value means use a slot
- preceding (that is, above or on the left of) the middle slot.
- A positive value means use a slot following (that is, below or
- on the right of) the middle slot. The default is zero."
- :group 'which-key
- :type 'integer)
-
-(defcustom which-key-side-window-max-width 0.333
- "Maximum width of which-key popup when type is side-window and
-location is left or right.
-This variable can also be a number between 0 and 1. In that case, it denotes
-a percentage out of the frame's width."
- :group 'which-key
- :type 'float)
-
-(defcustom which-key-side-window-max-height 0.25
- "Maximum height of which-key popup when type is side-window and
-location is top or bottom.
-This variable can also be a number between 0 and 1. In that case, it denotes
-a percentage out of the frame's height."
- :group 'which-key
- :type 'float)
-
-(defcustom which-key-frame-max-width 60
- "Maximum width of which-key popup when type is frame."
- :group 'which-key
- :type 'integer)
-
-(defcustom which-key-frame-max-height 20
- "Maximum height of which-key popup when type is frame."
- :group 'which-key
- :type 'integer)
-
-(defcustom which-key-allow-imprecise-window-fit (not (display-graphic-p))
- "If non-nil allow which-key to use a less intensive method of
-fitting the popup window to the buffer. If you are noticing lag
-when the which-key popup displays turning this on may help.
-
-See https://github.com/justbur/emacs-which-key/issues/130
-and https://github.com/justbur/emacs-which-key/issues/225."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-show-remaining-keys nil
- "Show remaining keys in last slot, when keys are hidden."
- :group 'which-key
- :type '(radio (const :tag "Yes" t)
- (const :tag "No" nil)))
-
-(defcustom which-key-sort-order 'which-key-key-order
- "If nil, do not resort the output from
-`describe-buffer-bindings' which groups by mode. Ordering options
-are
-
-1. `which-key-key-order': by key (default)
-2. `which-key-key-order-alpha': by key using alphabetical order
-3. `which-key-description-order': by description
-4. `which-key-prefix-then-key-order': prefix (no prefix first) then key
-5. `which-key-local-then-key-order': local binding then key
-
-See the README and the docstrings for those functions for more
-information."
- :group 'which-key
- :type '(choice (function-item which-key-key-order)
- (function-item which-key-key-order-alpha)
- (function-item which-key-description-order)
- (function-item which-key-prefix-then-key-order)
- (function-item which-key-local-then-key-order)))
-
-(defcustom which-key-sort-uppercase-first t
- "If non-nil, uppercase comes before lowercase in sorting
-function chosen in `which-key-sort-order'. Otherwise, the order
-is reversed."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-paging-prefixes '()
- "Enable paging for these prefixes."
- :group 'which-key
- :type '(repeat string))
-
-(defcustom which-key-paging-key "<f5>"
- "Key to use for changing pages. Bound after each of the
-prefixes in `which-key-paging-prefixes'"
- :group 'which-key
- :type 'string)
-
-;; (defcustom which-key-undo-key nil
-;; "Key (string) to use for undoing keypresses. Bound recursively
-;; in each of the maps in `which-key-undo-keymaps'."
-;; :group 'which-key
-;; :type 'string)
-
-;; (defcustom which-key-undo-keymaps '()
-;; "Keymaps in which to bind `which-key-undo-key'"
-;; :group 'which-key
-;; :type '(repeat symbol))
-
-(defcustom which-key-use-C-h-commands t
- "Use C-h (or whatever `help-char' is set to) for paging if
-non-nil. Normally C-h after a prefix calls
-`describe-prefix-bindings'. This changes that command to a
-which-key paging command when which-key-mode is active."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-show-early-on-C-h nil
- "Show the which-key buffer before if C-h (or whatever
-`help-char' is set to) is pressed in the middle of a prefix
-before the which-key buffer would normally be triggered through
-the idle delay. If combined with the following settings,
-which-key will effectively only show when triggered \"manually\"
-using C-h.
-
-\(setq `which-key-idle-delay' 10000)
-\(setq `which-key-idle-secondary-delay' 0.05)
-
-Note that `which-key-idle-delay' should be set before turning on
-`which-key-mode'. "
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-is-verbose nil
- "Whether to warn about potential mistakes in configuration."
- :group 'which-key
- :type 'boolean)
-
-(defvar which-key-C-h-map
- (let ((map (make-sparse-keymap)))
- (dolist (bind `(("\C-a" . which-key-abort)
- ("a" . which-key-abort)
- ("\C-d" . which-key-toggle-docstrings)
- ("d" . which-key-toggle-docstrings)
- (,(vector help-char) . which-key-show-standard-help)
- ("h" . which-key-show-standard-help)
- ("\C-n" . which-key-show-next-page-cycle)
- ("n" . which-key-show-next-page-cycle)
- ("\C-p" . which-key-show-previous-page-cycle)
- ("p" . which-key-show-previous-page-cycle)
- ("\C-u" . which-key-undo-key)
- ("u" . which-key-undo-key)
- ("1" . which-key-digit-argument)
- ("2" . which-key-digit-argument)
- ("3" . which-key-digit-argument)
- ("4" . which-key-digit-argument)
- ("5" . which-key-digit-argument)
- ("6" . which-key-digit-argument)
- ("7" . which-key-digit-argument)
- ("8" . which-key-digit-argument)
- ("9" . which-key-digit-argument)))
- (define-key map (car bind) (cdr bind)))
- map)
- "Keymap for C-h commands.")
-
-(defvar which-key--paging-functions '(which-key-C-h-dispatch
- which-key-manual-update
- which-key-turn-page
- which-key-show-next-page-cycle
- which-key-show-next-page-no-cycle
- which-key-show-previous-page-cycle
- which-key-show-previous-page-no-cycle
- which-key-undo-key
- which-key-undo))
-
-(defvar which-key-persistent-popup nil
- "Whether or not to disable `which-key--hide-popup'.")
-
-(defcustom which-key-hide-alt-key-translations t
- "Hide key translations using Alt key if non nil.
-These translations are not relevant most of the times since a lot
-of terminals issue META modifier for the Alt key.
-
-See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html"
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-delay-functions nil
- "A list of functions that may decide whether to delay the
-which-key popup based on the current incomplete key
-sequence. Each function in the list is run with two arguments,
-the current key sequence as produced by `key-description' and the
-length of the key sequence. If the popup should be delayed based
-on that key sequence, the function should return the delay time
-in seconds. Returning nil means no delay. The first function in
-this list to return a value is the value that is used.
-
-The delay time is effectively added to the normal
-`which-key-idle-delay'."
- :group 'which-key
- :type '(repeat function))
-
-(defcustom which-key-allow-regexps nil
- "A list of regexp strings to use to filter key sequences. When
-non-nil, for a key sequence to trigger the which-key popup it
-must match one of the regexps in this list. The format of the key
-sequences is what is produced by `key-description'."
- :group 'which-key
- :type '(repeat regexp))
-
-(defcustom which-key-inhibit-regexps nil
- "Similar to `which-key-allow-regexps', a list of regexp strings
-to use to filter key sequences. When non-nil, for a key sequence
-to trigger the which-key popup it cannot match one of the regexps
-in this list. The format of the key sequences is what is produced
-by `key-description'."
- :group 'which-key
- :type '(repeat regexp))
-
-(defcustom which-key-show-transient-maps nil
- "Show keymaps created by `set-transient-map' when applicable.
-
-More specifically, detect when `overriding-terminal-local-map' is
-set (this is the keymap used by `set-transient-map') and display
-it."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-enable-extended-define-key nil
- "Advise `define-key' to make which-key aware of definitions of the form
-
- \(define-key KEYMAP KEY '(\"DESCRIPTION\" . DEF))
-
-With the advice, this definition will have the side effect of
-creating a replacement in `which-key-replacement-alist' that
-replaces DEF with DESCRIPTION when the key sequence ends in
-KEY. Using a cons cell like this is a valid definition for
-`define-key'. All this does is to make which-key aware of it.
-
-Since many higher level keybinding functions use `define-key'
-internally, this will affect most if not all of those as well.
-
-This variable must be set before loading which-key."
- :group 'which-key
- :type 'boolean)
-
-;; Hooks
-(defcustom which-key-init-buffer-hook '()
- "Hook run when which-key buffer is initialized."
- :group 'which-key
- :type 'hook)
-
-;;;; Faces
-
-(defgroup which-key-faces nil
- "Faces for which-key-mode"
- :group 'which-key
- :prefix "which-key-")
-
-(defface which-key-key-face
- '((t . (:inherit font-lock-constant-face)))
- "Face for which-key keys"
- :group 'which-key-faces)
-
-(defface which-key-separator-face
- '((t . (:inherit font-lock-comment-face)))
- "Face for the separator (default separator is an arrow)"
- :group 'which-key-faces)
-
-(defface which-key-note-face
- '((t . (:inherit which-key-separator-face)))
- "Face for notes or hints occasionally provided"
- :group 'which-key-faces)
-
-(defface which-key-command-description-face
- '((t . (:inherit font-lock-function-name-face)))
- "Face for the key description when it is a command"
- :group 'which-key-faces)
-
-(defface which-key-local-map-description-face
- '((t . (:inherit which-key-command-description-face)))
- "Face for the key description when it is found in `current-local-map'"
- :group 'which-key-faces)
-
-(defface which-key-highlighted-command-face
- '((t . (:inherit which-key-command-description-face :underline t)))
- "Default face for the command description when it is a command
-and it matches a string in `which-key-highlighted-command-list'."
- :group 'which-key-faces)
-
-(defface which-key-group-description-face
- '((t . (:inherit font-lock-keyword-face)))
- "Face for the key description when it is a group or prefix"
- :group 'which-key-faces)
-
-(defface which-key-special-key-face
- '((t . (:inherit which-key-key-face :inverse-video t :weight bold)))
- "Face for special keys (SPC, TAB, RET)"
- :group 'which-key-faces)
-
-(defface which-key-docstring-face
- '((t . (:inherit which-key-note-face)))
- "Face for docstrings"
- :group 'which-key-faces)
-
-;;;; Custom popup
-
-(defcustom which-key-custom-popup-max-dimensions-function nil
- "Variable to hold a custom max-dimensions function.
-Will be passed the width of the active window and is expected to
-return the maximum height in lines and width in characters of the
-which-key popup in the form a cons cell (height . width)."
- :group 'which-key
- :type '(choice function (const nil)))
-
-(defcustom which-key-custom-hide-popup-function nil
- "Variable to hold a custom hide-popup function.
-It takes no arguments and the return value is ignored."
- :group 'which-key
- :type '(choice function (const nil)))
-
-(defcustom which-key-custom-show-popup-function nil
- "Variable to hold a custom show-popup function.
-Will be passed the required dimensions in the form (height .
-width) in lines and characters respectively. The return value is
-ignored."
- :group 'which-key
- :type '(choice function (const nil)))
-
-(defcustom which-key-lighter " WK"
- "Minor mode lighter to use in the mode-line."
- :group 'which-key
- :type 'string)
-
-(defvar which-key-inhibit nil
- "Prevent which-key from popping up momentarily by setting this
-to a non-nil value for the execution of a command. Like this
-
-\(let \(\(which-key-inhibit t\)\)
-...\)")
-
-(defvar which-key-keymap-history nil
- "History of keymap selections in functions like
-`which-key-show-keymap'.")
-
-;;; Internal Vars
-
-(defvar which-key--buffer nil
- "Internal: Holds reference to which-key buffer.")
-(defvar which-key--timer nil
- "Internal: Holds reference to open window timer.")
-(defvar which-key--secondary-timer-active nil
- "Internal: Non-nil if the secondary timer is active.")
-(defvar which-key--paging-timer nil
- "Internal: Holds reference to timer for paging.")
-(defvar which-key--frame nil
- "Internal: Holds reference to which-key frame.
-Used when `which-key-popup-type' is frame.")
-(defvar which-key--echo-keystrokes-backup nil
- "Internal: Backup the initial value of `echo-keystrokes'.")
-(defvar which-key--prefix-help-cmd-backup nil
- "Internal: Backup the value of `prefix-help-command'.")
-(defvar which-key--last-try-2-loc nil
- "Internal: Last location of side-window when two locations
-used.")
-(defvar which-key--automatic-display nil
- "Internal: Non-nil if popup was triggered with automatic
-update.")
-(defvar which-key--debug-buffer-name nil
- "If non-nil, use this buffer for debug messages.")
-(defvar which-key--multiple-locations nil)
-(defvar which-key--inhibit-next-operator-popup nil)
-(defvar which-key--prior-show-keymap-args nil)
-(defvar which-key--previous-frame-size nil)
-(defvar which-key--prefix-title-alist nil)
-(defvar which-key--evil-keys-regexp (eval-when-compile
- (regexp-opt '("-state"))))
-(defvar which-key--ignore-non-evil-keys-regexp
- (eval-when-compile
- (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar"
- "select-window" "switch-frame" "which-key-"))))
-(defvar which-key--ignore-keys-regexp
- (eval-when-compile
- (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar"
- "select-window" "switch-frame" "-state"
- "which-key-"))))
-
-(make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05")
-(make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05")
-
-(defvar which-key--pages-obj nil)
-(cl-defstruct which-key--pages
- pages
- height
- widths
- keys/page
- page-nums
- num-pages
- total-keys
- prefix
- prefix-title)
-
-(defun which-key--rotate (list n)
- (let* ((len (length list))
- (n (if (< n 0) (+ len n) n))
- (n (mod n len)))
- (append (last list (- len n)) (butlast list (- len n)))))
-
-(defun which-key--pages-set-current-page (pages-obj n)
- (setf (which-key--pages-pages pages-obj)
- (which-key--rotate (which-key--pages-pages pages-obj) n))
- (setf (which-key--pages-widths pages-obj)
- (which-key--rotate (which-key--pages-widths pages-obj) n))
- (setf (which-key--pages-keys/page pages-obj)
- (which-key--rotate (which-key--pages-keys/page pages-obj) n))
- (setf (which-key--pages-page-nums pages-obj)
- (which-key--rotate (which-key--pages-page-nums pages-obj) n))
- pages-obj)
-
-(defsubst which-key--on-first-page ()
- (= (which-key--pages-page-nums which-key--pages-obj) 1))
-
-(defsubst which-key--on-last-page ()
- (= (which-key--pages-page-nums which-key--pages-obj)
- (which-key--pages-num-pages which-key--pages-obj)))
-
-(defsubst which-key--current-prefix ()
- (when which-key--pages-obj
- (which-key--pages-prefix which-key--pages-obj)))
-
-(defmacro which-key--debug-message (&rest msg)
- `(when which-key--debug-buffer-name
- (let ((buf (get-buffer-create which-key--debug-buffer-name))
- (fmt-msg (format ,@msg)))
- (with-current-buffer buf
- (goto-char (point-max))
- (insert "\n" fmt-msg "\n")))))
-
-;;; Third-party library support
-;;;; Evil
-
-(defcustom which-key-allow-evil-operators (boundp 'evil-this-operator)
- "Allow popup to show for evil operators. The popup is normally
- inhibited in the middle of commands, but setting this to
- non-nil will override this behavior for evil operators."
- :group 'which-key
- :type 'boolean)
-
-(defcustom which-key-show-operator-state-maps nil
- "Experimental: Try to show the right keys following an evil
-command that reads a motion, such as \"y\", \"d\" and \"c\" from
-normal state. This is experimental, because there might be some
-valid keys missing and it might be showing some invalid keys."
- :group 'which-key
- :type 'boolean)
-
-;;;;; God-mode
-
-(defvar which-key--god-mode-support-enabled nil
- "Support god-mode if non-nil. This is experimental,
-so you need to explicitly opt-in for now. Please report any
-problems at github.")
-
-(defvar which-key--god-mode-key-string nil
- "Holds key string to use for god-mode support.")
-
-(defadvice god-mode-lookup-command
- (around which-key--god-mode-lookup-command-advice disable)
- (setq which-key--god-mode-key-string (ad-get-arg 0))
- (unwind-protect
- ad-do-it
- (when (bound-and-true-p which-key-mode)
- (which-key--hide-popup))))
-
-(defun which-key-enable-god-mode-support (&optional disable)
- "Enable support for god-mode if non-nil. This is experimental,
-so you need to explicitly opt-in for now. Please report any
-problems at github. If DISABLE is non-nil disable support."
- (interactive "P")
- (setq which-key--god-mode-support-enabled (null disable))
- (if disable
- (ad-disable-advice
- 'god-mode-lookup-command
- 'around 'which-key--god-mode-lookup-command-advice)
- (ad-enable-advice
- 'god-mode-lookup-command
- 'around 'which-key--god-mode-lookup-command-advice))
- (ad-activate 'god-mode-lookup-command))
-
-;;; Mode
-
-;;;###autoload
-(define-minor-mode which-key-mode
- "Toggle which-key-mode."
- :global t
- :lighter which-key-lighter
- :keymap (let ((map (make-sparse-keymap)))
- (mapc
- (lambda (prefix)
- (define-key map
- (kbd (concat prefix " " which-key-paging-key))
- #'which-key-C-h-dispatch))
- which-key-paging-prefixes)
- map)
- (if which-key-mode
- (progn
- (setq which-key--echo-keystrokes-backup echo-keystrokes)
- (when (or (eq which-key-show-prefix 'echo)
- (eq which-key-popup-type 'minibuffer))
- (which-key--setup-echo-keystrokes))
- (unless (member prefix-help-command which-key--paging-functions)
- (setq which-key--prefix-help-cmd-backup prefix-help-command))
- (when (or which-key-use-C-h-commands
- which-key-show-early-on-C-h)
- (setq prefix-help-command #'which-key-C-h-dispatch))
- (when which-key-show-remaining-keys
- (add-hook 'pre-command-hook #'which-key--lighter-restore))
- (add-hook 'pre-command-hook #'which-key--hide-popup)
- (add-hook 'focus-out-hook #'which-key--stop-timer)
- (add-hook 'focus-in-hook #'which-key--start-timer)
- (add-hook 'window-size-change-functions
- 'which-key--hide-popup-on-frame-size-change)
- (which-key--start-timer))
- (setq echo-keystrokes which-key--echo-keystrokes-backup)
- (when which-key--prefix-help-cmd-backup
- (setq prefix-help-command which-key--prefix-help-cmd-backup))
- (when which-key-show-remaining-keys
- (remove-hook 'pre-command-hook #'which-key--lighter-restore))
- (remove-hook 'pre-command-hook #'which-key--hide-popup)
- (remove-hook 'focus-out-hook #'which-key--stop-timer)
- (remove-hook 'focus-in-hook #'which-key--start-timer)
- (remove-hook 'window-size-change-functions
- 'which-key--hide-popup-on-frame-size-change)
- (which-key--stop-timer)))
-
-(defun which-key--init-buffer ()
- "Initialize which-key buffer"
- (unless (buffer-live-p which-key--buffer)
- (setq which-key--buffer (get-buffer-create which-key-buffer-name))
- (with-current-buffer which-key--buffer
- ;; suppress confusing minibuffer message
- (let (message-log-max)
- (toggle-truncate-lines 1)
- (message ""))
- (setq-local cursor-type nil)
- (setq-local cursor-in-non-selected-windows nil)
- (setq-local mode-line-format nil)
- (setq-local word-wrap nil)
- (setq-local show-trailing-whitespace nil)
- (run-hooks 'which-key-init-buffer-hook))))
-
-(defun which-key--setup-echo-keystrokes ()
- "Reduce `echo-keystrokes' if necessary (it will interfere if
-it's set too high)."
- (when (and echo-keystrokes
- (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001))
- (if (> which-key-idle-delay which-key-echo-keystrokes)
- (setq echo-keystrokes which-key-echo-keystrokes)
- (setq which-key-echo-keystrokes (/ (float which-key-idle-delay) 4)
- echo-keystrokes which-key-echo-keystrokes))))
-
-(defun which-key-remove-default-unicode-chars ()
- "Use of `which-key-dont-use-unicode' is preferred to this
-function, but it's included here in case someone cannot set that
-variable early enough in their configuration, if they are using a
-starter kit for example."
- (when (string-equal which-key-separator " → ")
- (setq which-key-separator " : "))
- (setq which-key-key-replacement-alist
- (delete '("left" . "←") which-key-key-replacement-alist))
- (setq which-key-key-replacement-alist
- (delete '("right" . "→") which-key-key-replacement-alist)))
-
-;;; Default configuration functions for use by users.
-
-;;;###autoload
-(defun which-key-setup-side-window-right ()
- "Apply suggested settings for side-window that opens on right."
- (interactive)
- (setq which-key-popup-type 'side-window
- which-key-side-window-location 'right
- which-key-show-prefix 'top))
-
-;;;###autoload
-(defun which-key-setup-side-window-right-bottom ()
- "Apply suggested settings for side-window that opens on right
-if there is space and the bottom otherwise."
- (interactive)
- (setq which-key-popup-type 'side-window
- which-key-side-window-location '(right bottom)
- which-key-show-prefix 'top))
-
-;;;###autoload
-(defun which-key-setup-side-window-bottom ()
- "Apply suggested settings for side-window that opens on
-bottom."
- (interactive)
- (which-key--setup-echo-keystrokes)
- (setq which-key-popup-type 'side-window
- which-key-side-window-location 'bottom
- which-key-show-prefix 'echo))
-
-;;;###autoload
-(defun which-key-setup-minibuffer ()
- "Apply suggested settings for minibuffer.
-Do not use this setup if you use the paging commands. Instead use
-`which-key-setup-side-window-bottom', which is nearly identical
-but more functional."
- (interactive)
- (which-key--setup-echo-keystrokes)
- (setq which-key-popup-type 'minibuffer
- which-key-show-prefix 'left))
-
-;;; Helper functions to modify replacement lists.
-
-;;;###autoload
-(defun which-key-add-key-based-replacements
- (key-sequence replacement &rest more)
- "Replace the description of KEY-SEQUENCE with REPLACEMENT.
-KEY-SEQUENCE is a string suitable for use in `kbd'. REPLACEMENT
-may either be a string, as in
-
-\(which-key-add-key-based-replacements \"C-x 1\" \"maximize\"\)
-
-a cons of two strings as in
-
-\(which-key-add-key-based-replacements \"C-x 8\"
- '(\"unicode\" . \"Unicode keys\")\)
-
-or a function that takes a \(KEY . BINDING\) cons and returns a
-replacement.
-
-In the second case, the second string is used to provide a longer
-name for the keys under a prefix.
-
-MORE allows you to specifcy additional KEY REPLACEMENT pairs. All
-replacements are added to
-`which-key-key-based-description-replacement-alist'."
- ;; TODO: Make interactive
- (while key-sequence
- ;; normalize key sequences before adding
- (let ((key-seq (key-description (kbd key-sequence)))
- (replace (or (and (functionp replacement) replacement)
- (car-safe replacement)
- replacement)))
- (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil)
- (if (functionp replace) replace (cons nil replace)))
- which-key-replacement-alist)
- (when (and (not (functionp replacement)) (consp replacement))
- (push (cons key-seq (cdr-safe replacement))
- which-key--prefix-title-alist)))
- (setq key-sequence (pop more) replacement (pop more))))
-(put 'which-key-add-key-based-replacements 'lisp-indent-function 'defun)
-
-;;;###autoload
-(defun which-key-add-major-mode-key-based-replacements
- (mode key-sequence replacement &rest more)
- "Functions like `which-key-add-key-based-replacements'.
-The difference is that MODE specifies the `major-mode' that must
-be active for KEY-SEQUENCE and REPLACEMENT (MORE contains
-addition KEY-SEQUENCE REPLACEMENT pairs) to apply."
- ;; TODO: Make interactive
- (when (not (symbolp mode))
- (error "MODE should be a symbol corresponding to a value of major-mode"))
- (let ((mode-alist
- (or (cdr-safe (assq mode which-key-replacement-alist)) (list)))
- (title-mode-alist
- (or (cdr-safe (assq mode which-key--prefix-title-alist)) (list))))
- (while key-sequence
- ;; normalize key sequences before adding
- (let ((key-seq (key-description (kbd key-sequence)))
- (replace (or (and (functionp replacement) replacement)
- (car-safe replacement)
- replacement)))
- (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil)
- (if (functionp replace) replace (cons nil replace)))
- mode-alist)
- (when (and (not (functionp replacement)) (consp replacement))
- (push (cons key-seq (cdr-safe replacement))
- title-mode-alist)))
- (setq key-sequence (pop more) replacement (pop more)))
- (if (assq mode which-key-replacement-alist)
- (setcdr (assq mode which-key-replacement-alist) mode-alist)
- (push (cons mode mode-alist) which-key-replacement-alist))
- (if (assq mode which-key--prefix-title-alist)
- (setcdr (assq mode which-key--prefix-title-alist) title-mode-alist)
- (push (cons mode title-mode-alist) which-key--prefix-title-alist))))
-(put 'which-key-add-major-mode-key-based-replacements
- 'lisp-indent-function 'defun)
-
-(defalias 'which-key-add-prefix-title 'which-key-add-key-based-replacements)
-(make-obsolete 'which-key-add-prefix-title
- 'which-key-add-key-based-replacements
- "2016-10-05")
-
-(defalias 'which-key-declare-prefixes 'which-key-add-key-based-replacements)
-(make-obsolete 'which-key-declare-prefixes
- 'which-key-add-key-based-replacements
- "2016-10-05")
-
-(defalias 'which-key-declare-prefixes-for-mode
- 'which-key-add-major-mode-key-based-replacements)
-(make-obsolete 'which-key-declare-prefixes-for-mode
- 'which-key-add-major-mode-key-based-replacements
- "2016-10-05")
-
-(defun which-key-define-key-recursively (map key def &optional at-root)
- "Recursively bind KEY in MAP to DEF on every level of MAP except the first.
-If AT-ROOT is non-nil the binding is also placed at the root of MAP."
- (when at-root (define-key map key def))
- (map-keymap
- (lambda (_ev df)
- (when (keymapp df)
- (which-key-define-key-recursively df key def t)))
- map))
-
-(defun which-key--process-define-key-args (keymap key def)
- "When DEF takes the form (\"DESCRIPTION\". DEF), make sure
-which-key uses \"DESCRIPTION\" for this binding. This function is
-meant to be used as :before advice for `define-key'."
- (with-demoted-errors "Which-key extended define-key error: %s"
- (when (and (consp def)
- (stringp (car def))
- (symbolp (cdr def)))
- (define-key keymap (which-key--pseudo-key key) `(which-key ,def)))))
-
-(when which-key-enable-extended-define-key
- (advice-add #'define-key :before #'which-key--process-define-key-args))
-
-;;; Functions for computing window sizes
-
-(defun which-key--text-width-to-total (text-width)
- "Convert window text-width to window total-width.
-TEXT-WIDTH is the desired text width of the window. The function
-calculates what total width is required for a window in the
-selected to have a text-width of TEXT-WIDTH columns. The
-calculation considers possible fringes and scroll bars. This
-function assumes that the desired window has the same character
-width as the frame."
- (let ((char-width (frame-char-width)))
- (+ text-width
- (/ (frame-fringe-width) char-width)
- (/ (frame-scroll-bar-width) char-width)
- (if (which-key--char-enlarged-p) 1 0)
- ;; add padding to account for possible wide (unicode) characters
- 3)))
-
-(defun which-key--total-width-to-text (total-width)
- "Convert window total-width to window text-width.
-TOTAL-WIDTH is the desired total width of the window. The function calculates
-what text width fits such a window. The calculation considers possible fringes
-and scroll bars. This function assumes that the desired window has the same
-character width as the frame."
- (let ((char-width (frame-char-width)))
- (- total-width
- (/ (frame-fringe-width) char-width)
- (/ (frame-scroll-bar-width) char-width)
- (if (which-key--char-enlarged-p) 1 0)
- ;; add padding to account for possible wide (unicode) characters
- 3)))
-
-(defun which-key--char-enlarged-p (&optional _frame)
- (> (frame-char-width)
- (/ (float (frame-pixel-width)) (window-total-width (frame-root-window)))))
-
-(defun which-key--char-reduced-p (&optional _frame)
- (< (frame-char-width)
- (/ (float (frame-pixel-width)) (window-total-width (frame-root-window)))))
-
-(defun which-key--char-exact-p (&optional _frame)
- (= (frame-char-width)
- (/ (float (frame-pixel-width)) (window-total-width (frame-root-window)))))
-
-(defun which-key--width-or-percentage-to-width (width-or-percentage)
- "Return window total width.
-If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it
-should be a percentage (a number between 0 and 1) out of the frame's width.
-More precisely, it should be a percentage out of the frame's root window's
-total width."
- (if (wholenump width-or-percentage)
- width-or-percentage
- (round (* width-or-percentage (window-total-width (frame-root-window))))))
-
-(defun which-key--height-or-percentage-to-height (height-or-percentage)
- "Return window total height.
-If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it
-should be a percentage (a number between 0 and 1) out of the frame's height.
-More precisely, it should be a percentage out of the frame's root window's
-total height."
- (if (wholenump height-or-percentage)
- height-or-percentage
- (round (* height-or-percentage (window-total-height (frame-root-window))))))
-
-(defun which-key--frame-size-changed-p ()
- "Non-nil if a change in frame size is detected."
- (let ((new-size (cons (frame-width) (frame-height))))
- (cond ((null which-key--previous-frame-size)
- (setq which-key--previous-frame-size new-size)
- nil)
- ((not (equal which-key--previous-frame-size new-size))
- (setq which-key--previous-frame-size new-size)))))
-
-;;; Show/hide which-key buffer
-
-(defun which-key--hide-popup ()
- "This function is called to hide the which-key buffer."
- (unless (or which-key-persistent-popup
- (member real-this-command which-key--paging-functions))
- (setq which-key--last-try-2-loc nil)
- (setq which-key--pages-obj nil)
- (setq which-key--automatic-display nil)
- (setq which-key--prior-show-keymap-args nil)
- (when (and which-key-idle-secondary-delay which-key--secondary-timer-active)
- (which-key--start-timer))
- (which-key--lighter-restore)
- (cl-case which-key-popup-type
- ;; Not necessary to hide minibuffer
- ;; (minibuffer (which-key--hide-buffer-minibuffer))
- (side-window (which-key--hide-buffer-side-window))
- (frame (which-key--hide-buffer-frame))
- (custom (funcall which-key-custom-hide-popup-function)))))
-
-(defun which-key--hide-popup-ignore-command ()
- "Version of `which-key--hide-popup' without the check of
-`real-this-command'."
- (cl-case which-key-popup-type
- (side-window (which-key--hide-buffer-side-window))
- (frame (which-key--hide-buffer-frame))
- (custom (funcall which-key-custom-hide-popup-function))))
-
-(defun which-key--hide-popup-on-frame-size-change (&optional _)
- "Hide which-key popup if the frame is resized (to trigger a new
-popup)."
- (when (which-key--frame-size-changed-p)
- (which-key--hide-popup)))
-
-(defun which-key--hide-buffer-side-window ()
- "Hide which-key buffer when side-window popup is used."
- (when (buffer-live-p which-key--buffer)
- ;; in case which-key buffer was shown in an existing window, `quit-window'
- ;; will re-show the previous buffer, instead of closing the window
- (quit-windows-on which-key--buffer)))
-
-(defun which-key--hide-buffer-frame ()
- "Hide which-key buffer when frame popup is used."
- (when (frame-live-p which-key--frame)
- (delete-frame which-key--frame)))
-
-(defun which-key--popup-showing-p ()
- (and (bufferp which-key--buffer)
- (window-live-p (get-buffer-window which-key--buffer))))
-
-(defun which-key--show-popup (act-popup-dim)
- "Show the which-key buffer.
-ACT-POPUP-DIM includes the dimensions, (height . width) of the
-buffer text to be displayed in the popup. Return nil if no window
-is shown, or if there is no need to start the closing timer."
- (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0))
- (cl-case which-key-popup-type
- ;; Not called for minibuffer
- ;; (minibuffer (which-key--show-buffer-minibuffer act-popup-dim))
- (side-window (which-key--show-buffer-side-window act-popup-dim))
- (frame (which-key--show-buffer-frame act-popup-dim))
- (custom (funcall which-key-custom-show-popup-function act-popup-dim)))))
-
-(defun which-key--fit-buffer-to-window-horizontally
- (&optional window &rest params)
- "Slightly modified version of `fit-buffer-to-window'.
-Use &rest params because `fit-buffer-to-window' has a different
-call signature in different emacs versions"
- (let ((fit-window-to-buffer-horizontally t)
- (window-min-height 1))
- (apply #'fit-window-to-buffer window params)))
-
-(defun which-key--show-buffer-side-window (act-popup-dim)
- "Show which-key buffer when popup type is side-window."
- (let* ((height (car act-popup-dim))
- (width (cdr act-popup-dim))
- (alist
- (if which-key-allow-imprecise-window-fit
- `((window-width . ,(which-key--text-width-to-total width))
- (window-height . ,height)
- (side . ,which-key-side-window-location)
- (slot . ,which-key-side-window-slot))
- `((window-width . which-key--fit-buffer-to-window-horizontally)
- (window-height . (lambda (w) (fit-window-to-buffer w nil 1)))
- (side . ,which-key-side-window-location)
- (slot . ,which-key-side-window-slot)))))
- ;; Previously used `display-buffer-in-major-side-window' here, but
- ;; apparently that is meant to be an internal function. See emacs bug #24828
- ;; and advice given there.
- (cond
- ((eq which-key--multiple-locations t)
- ;; possibly want to switch sides in this case so we can't reuse the window
- (delete-windows-on which-key--buffer)
- (display-buffer-in-side-window which-key--buffer alist))
- ((get-buffer-window which-key--buffer)
- (display-buffer-reuse-window which-key--buffer alist))
- (t
- (display-buffer-in-side-window which-key--buffer alist)))))
-
-(defun which-key--show-buffer-frame (act-popup-dim)
- "Show which-key buffer when popup type is frame."
- (let* (;(orig-window (selected-window))
- (frame-height (+ (car act-popup-dim)
- (if (with-current-buffer which-key--buffer
- mode-line-format)
- 1
- 0)))
- ;; without adding 2, frame sometimes isn't wide enough for the buffer.
- ;; this is probably because of the fringes. however, setting fringes
- ;; sizes to 0 (instead of adding 2) didn't always make the frame wide
- ;; enough. don't know why it is so.
- (frame-width (+ (cdr act-popup-dim) 2))
- (new-window (if (and (frame-live-p which-key--frame)
- (eq which-key--buffer
- (window-buffer
- (frame-root-window which-key--frame))))
- (which-key--show-buffer-reuse-frame
- frame-height frame-width)
- (which-key--show-buffer-new-frame
- frame-height frame-width))))
- (when new-window
- ;; display successful
- (setq which-key--frame (window-frame new-window))
- new-window)))
-
-(defun which-key--show-buffer-new-frame (frame-height frame-width)
- "Helper for `which-key--show-buffer-frame'."
- (let* ((frame-params `((height . ,frame-height)
- (width . ,frame-width)
- ;; tell the window manager to respect the given sizes
- (user-size . t)
- ;; which-key frame doesn't need a minibuffer
- (minibuffer . nil)
- (name . "which-key")
- ;; no need for scroll bars in which-key frame
- (vertical-scroll-bars . nil)
- ;; (left-fringe . 0)
- ;; (right-fringe . 0)
- ;; (right-divider-width . 0)
- ;; make sure frame is visible
- (visibility . t)))
- (alist `((pop-up-frame-parameters . ,frame-params)))
- (orig-frame (selected-frame))
- (new-window (display-buffer-pop-up-frame which-key--buffer alist)))
- (when new-window
- ;; display successful
- (redirect-frame-focus (window-frame new-window) orig-frame)
- new-window)))
-
-(defun which-key--show-buffer-reuse-frame (frame-height frame-width)
- "Helper for `which-key--show-buffer-frame'."
- (let ((window
- (display-buffer-reuse-window
- which-key--buffer `((reusable-frames . ,which-key--frame)))))
- (when window
- ;; display successful
- (set-frame-size (window-frame window) frame-width frame-height)
- window)))
-
-;;; Max dimension of available window functions
-
-(defun which-key--popup-max-dimensions ()
- "Dimesion functions should return the maximum possible (height
-. width) of the intended popup. SELECTED-WINDOW-WIDTH is the
-width of currently active window, not the which-key buffer
-window."
- (cl-case which-key-popup-type
- (minibuffer (which-key--minibuffer-max-dimensions))
- (side-window (which-key--side-window-max-dimensions))
- (frame (which-key--frame-max-dimensions))
- (custom (funcall which-key-custom-popup-max-dimensions-function
- (window-width)))))
-
-(defun which-key--minibuffer-max-dimensions ()
- "Return max-dimensions of minibuffer (height . width).
-Measured in lines and characters respectively."
- (cons
- ;; height
- (if (floatp max-mini-window-height)
- (floor (* (frame-text-lines)
- max-mini-window-height))
- max-mini-window-height)
- ;; width
- (max 0 (- (frame-text-cols) which-key-unicode-correction))))
-
-(defun which-key--side-window-max-dimensions ()
- "Return max-dimensions of the side-window popup (height .
-width) in lines and characters respectively."
- (cons
- ;; height
- (if (member which-key-side-window-location '(left right))
- ;; 1 is a kludge to make sure there is no overlap
- (- (frame-height) (window-text-height (minibuffer-window)) 1)
- ;; (window-mode-line-height which-key--window))
- ;; FIXME: change to something like
- ;; (min which-*-height (calculate-max-height))
- (which-key--height-or-percentage-to-height
- which-key-side-window-max-height))
- ;; width
- (max 0
- (- (if (member which-key-side-window-location '(left right))
- (which-key--total-width-to-text
- (which-key--width-or-percentage-to-width
- which-key-side-window-max-width))
- (which-key--total-width-to-text
- (which-key--width-or-percentage-to-width
- 1.0)))
- which-key-unicode-correction))))
-
-(defun which-key--frame-max-dimensions ()
- "Return max-dimensions of the frame popup (height .
-width) in lines and characters respectively."
- (cons which-key-frame-max-height which-key-frame-max-width))
-
-;;; Sorting functions
-
-(defun which-key--string< (a b &optional alpha)
- (let ((da (downcase a))
- (db (downcase b)))
- (cond
- ((and alpha (not which-key-sort-uppercase-first))
- (if (string-equal da db)
- (not (string-lessp a b))
- (string-lessp da db)))
- ((and alpha which-key-sort-uppercase-first)
- (if (string-equal da db)
- (string-lessp a b)
- (string-lessp da db)))
- ((not which-key-sort-uppercase-first)
- (let ((aup (not (string-equal da a)))
- (bup (not (string-equal db b))))
- (if (eq aup bup)
- (string-lessp a b)
- bup)))
- (t (string-lessp a b)))))
-
-(defun which-key--key-description< (a b &optional alpha)
- "Sorting function used for `which-key-key-order' and
-`which-key-key-order-alpha'."
- (save-match-data
- (let* ((rngrgxp "^\\([^ ]+\\) \\.\\. [^ ]+")
- (a (if (string-match rngrgxp a) (match-string 1 a) a))
- (b (if (string-match rngrgxp b) (match-string 1 b) b))
- (aem? (string-equal a ""))
- (bem? (string-equal b ""))
- (a1? (= 1 (length a)))
- (b1? (= 1 (length b)))
- (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)")
- (asp? (string-match-p srgxp a))
- (bsp? (string-match-p srgxp b))
- (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-")
- (apr? (string-match-p prrgxp a))
- (bpr? (string-match-p prrgxp b))
- (afn? (string-match-p "<f[0-9]+>" a))
- (bfn? (string-match-p "<f[0-9]+>" b)))
- (cond ((or aem? bem?) (and aem? (not bem?)))
- ((and asp? bsp?)
- (if (string-equal (substring a 0 3) (substring b 0 3))
- (which-key--key-description<
- (substring a 3) (substring b 3) alpha)
- (which-key--string< a b alpha)))
- ((or asp? bsp?) asp?)
- ((and a1? b1?) (which-key--string< a b alpha))
- ((or a1? b1?) a1?)
- ((and afn? bfn?)
- (< (string-to-number
- (replace-regexp-in-string "<f\\([0-9]+\\)>" "\\1" a))
- (string-to-number
- (replace-regexp-in-string "<f\\([0-9]+\\)>" "\\1" b))))
- ((or afn? bfn?) afn?)
- ((and apr? bpr?)
- (if (string-equal (substring a 0 2) (substring b 0 2))
- (which-key--key-description<
- (substring a 2) (substring b 2) alpha)
- (which-key--string< a b alpha)))
- ((or apr? bpr?) apr?)
- (t (which-key--string< a b alpha))))))
-
-(defsubst which-key-key-order-alpha (acons bcons)
- "Order key descriptions A and B.
-Order is lexicographic within a \"class\", where the classes and
-the ordering of classes are listed below.
-
-special (SPC,TAB,...) < single char < mod (C-,M-,...) < other.
-Sorts single characters alphabetically with lowercase coming
-before upper."
- (which-key--key-description< (car acons) (car bcons) t))
-
-(defsubst which-key-key-order (acons bcons)
- "Order key descriptions A and B.
-Order is lexicographic within a \"class\", where the classes and
-the ordering of classes are listed below.
-
-special (SPC,TAB,...) < single char < mod (C-,M-,...) < other."
- (which-key--key-description< (car acons) (car bcons)))
-
-(defsubst which-key-description-order (acons bcons)
- "Order descriptions of A and B.
-Uses `string-lessp' after applying lowercase."
- (string-lessp (downcase (cdr acons)) (downcase (cdr bcons))))
-
-(defsubst which-key--group-p (description)
- (or (string-match-p "^\\(group:\\|Prefix\\)" description)
- (keymapp (intern description))))
-
-(defun which-key-prefix-then-key-order (acons bcons)
- "Order first by whether A and/or B is a prefix with no prefix
-coming before a prefix. Within these categories order using
-`which-key-key-order'."
- (let ((apref? (which-key--group-p (cdr acons)))
- (bpref? (which-key--group-p (cdr bcons))))
- (if (not (eq apref? bpref?))
- (and (not apref?) bpref?)
- (which-key-key-order acons bcons))))
-
-(defun which-key-prefix-then-key-order-reverse (acons bcons)
- "Order first by whether A and/or B is a prefix with prefix
-coming before a prefix. Within these categories order using
-`which-key-key-order'."
- (let ((apref? (which-key--group-p (cdr acons)))
- (bpref? (which-key--group-p (cdr bcons))))
- (if (not (eq apref? bpref?))
- (and apref? (not bpref?))
- (which-key-key-order acons bcons))))
-
-(defun which-key-local-then-key-order (acons bcons)
- "Order first by whether A and/or B is a local binding with
-local bindings coming first. Within these categories order using
-`which-key-key-order'."
- (let ((aloc? (which-key--local-binding-p acons))
- (bloc? (which-key--local-binding-p bcons)))
- (if (not (eq aloc? bloc?))
- (and aloc? (not bloc?))
- (which-key-key-order acons bcons))))
-
-;;; Functions for retrieving and formatting keys
-
-(defsubst which-key--string-width (maybe-string)
- "If MAYBE-STRING is a string use `which-key--string-width' o/w return 0."
- (if (stringp maybe-string) (string-width maybe-string) 0))
-
-(defsubst which-key--safe-lookup-key (keymap key)
- "Version of `lookup-key' that allows KEYMAP to be nil. KEY is not checked."
- (when (keymapp keymap) (lookup-key keymap key)))
-
-(defsubst which-key--butlast-string (str)
- (mapconcat #'identity (butlast (split-string str)) " "))
-
-(defun which-key--match-replacement (key-binding replacement)
- ;; these are mode specific ones to ignore. The mode specific case is
- ;; handled in the selection of alist
- (when (and (consp key-binding) (not (symbolp (car replacement))))
- (let ((key-regexp (caar replacement))
- (binding-regexp (cdar replacement))
- case-fold-search)
- (and (or (null key-regexp)
- (string-match-p key-regexp
- (car key-binding)))
- (or (null binding-regexp)
- (string-match-p binding-regexp
- (cdr key-binding)))))))
-
-(defun which-key--get-pseudo-binding (key-binding &optional prefix)
- (let* ((pseudo-binding
- (key-binding (which-key--pseudo-key (kbd (car key-binding)) prefix)))
- (pseudo-binding (when pseudo-binding (cadr pseudo-binding)))
- (pseudo-desc (when pseudo-binding (car pseudo-binding)))
- (pseudo-def (when pseudo-binding (cdr pseudo-binding)))
- (real-def (key-binding (kbd (car key-binding))))
- ;; treat keymaps as if they're nil bindings. This creates the
- ;; possibility that we rename the wrong binding but this seems
- ;; unlikely.
- (real-def (unless (keymapp real-def) real-def)))
- (when (and pseudo-binding
- (eq pseudo-def real-def))
- (cons (car key-binding) pseudo-desc))))
-
-(defsubst which-key--replace-in-binding (key-binding repl)
- (cond ((or (not (consp repl)) (null (cdr repl)))
- key-binding)
- ((functionp (cdr repl))
- (funcall (cdr repl) key-binding))
- ((consp (cdr repl))
- (cons
- (cond ((and (caar repl) (cadr repl))
- (replace-regexp-in-string
- (caar repl) (cadr repl) (car key-binding) t))
- ((cadr repl) (cadr repl))
- (t (car key-binding)))
- (cond ((and (cdar repl) (cddr repl))
- (replace-regexp-in-string
- (cdar repl) (cddr repl) (cdr key-binding) t))
- ((cddr repl) (cddr repl))
- (t (cdr key-binding)))))))
-
-(defun which-key--replace-in-repl-list-once (key-binding repls)
- (cl-dolist (repl repls)
- (when (which-key--match-replacement key-binding repl)
- (cl-return (which-key--replace-in-binding key-binding repl)))))
-
-(defun which-key--replace-in-repl-list-many (key-binding repls)
- (dolist (repl repls key-binding)
- (when (which-key--match-replacement key-binding repl)
- (setq key-binding (which-key--replace-in-binding key-binding repl)))))
-
-(defun which-key--maybe-replace (key-binding &optional prefix)
- "Use `which-key--replacement-alist' to maybe replace KEY-BINDING.
-KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of
-which are strings. KEY is of the form produced by `key-binding'."
- (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix))
- replaced-key-binding)
- (if pseudo-binding
- pseudo-binding
- (let* ((replacer (if which-key-allow-multiple-replacements
- #'which-key--replace-in-repl-list-many
- #'which-key--replace-in-repl-list-once)))
- (setq replaced-key-binding
- (apply replacer
- (list key-binding
- (cdr-safe (assq major-mode which-key-replacement-alist)))))
- ;; terminate early if we're only looking for one replacement and we found it
- (if (and replaced-key-binding (not which-key-allow-multiple-replacements))
- replaced-key-binding
- (setq key-binding (or replaced-key-binding key-binding))
- (or (apply replacer (list key-binding which-key-replacement-alist)) key-binding))))))
-
-(defsubst which-key--current-key-list (&optional key-str)
- (append (listify-key-sequence (which-key--current-prefix))
- (when key-str
- (listify-key-sequence (kbd key-str)))))
-
-(defsubst which-key--current-key-string (&optional key-str)
- (key-description (which-key--current-key-list key-str)))
-
-(defun which-key--local-binding-p (keydesc)
- (eq (which-key--safe-lookup-key
- (current-local-map) (kbd (which-key--current-key-string (car keydesc))))
- (intern (cdr keydesc))))
-
-(defun which-key--map-binding-p (map keydesc)
- "Does MAP contain KEYDESC = (key . binding)?"
- (or
- (when (bound-and-true-p evil-state)
- (let ((lookup
- (which-key--safe-lookup-key
- map
- (kbd (which-key--current-key-string
- (format "<%s-state> %s" evil-state (car keydesc)))))))
- (or (eq lookup (intern (cdr keydesc)))
- (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command")))))
- (let ((lookup
- (which-key--safe-lookup-key
- map (kbd (which-key--current-key-string (car keydesc))))))
- (or (eq lookup (intern (cdr keydesc)))
- (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command"))))))
-
-(defun which-key--pseudo-key (key &optional prefix)
- "Replace the last key in the sequence KEY by a special symbol
-in order for which-key to allow looking up a description for the key."
- (let* ((seq (listify-key-sequence key))
- (final (intern (format "which-key-%s" (key-description (last seq))))))
- (if prefix
- (vconcat prefix (list final))
- (vconcat (butlast seq) (list final)))))
-
-(defun which-key--maybe-get-prefix-title (keys)
- "KEYS is a string produced by `key-description'.
-A title is possibly returned using
-`which-key--prefix-title-alist'. An empty string is returned if
-no title exists."
- (cond
- ((not (string-equal keys ""))
- (let* ((title-res
- (cdr-safe (assoc-string keys which-key--prefix-title-alist)))
- (repl-res
- (cdr-safe (which-key--maybe-replace (cons keys ""))))
- (binding (key-binding (kbd keys)))
- (alternate (when (and binding (symbolp binding))
- (symbol-name binding))))
- (cond (title-res title-res)
- ((not (string-equal repl-res "")) repl-res)
- ((and (eq which-key-show-prefix 'echo) alternate)
- alternate)
- ((and (member which-key-show-prefix '(bottom top mode-line))
- (eq which-key-side-window-location 'bottom)
- echo-keystrokes)
- (if alternate alternate
- (concat "Following " keys)))
- (t ""))))
- (t "")))
-
-(defun which-key--propertize (string &rest properties)
- "Version of `propertize' that checks type of STRING."
- (when (stringp string)
- (apply #'propertize string properties)))
-
-(defun which-key--propertize-key (key)
- "Add a face to KEY.
-If KEY contains any \"special keys\" defined in
-`which-key-special-keys' then truncate and add the corresponding
-`which-key-special-key-face'."
- (let ((key-w-face (which-key--propertize key 'face 'which-key-key-face))
- (regexp (concat "\\("
- (mapconcat 'identity which-key-special-keys
- "\\|") "\\)"))
- case-fold-search)
- (save-match-data
- (if (and which-key-special-keys
- (string-match regexp key))
- (let ((beg (match-beginning 0)) (end (match-end 0)))
- (concat (substring key-w-face 0 beg)
- (which-key--propertize (substring key-w-face beg (1+ beg))
- 'face 'which-key-special-key-face)
- (substring key-w-face end
- (which-key--string-width key-w-face))))
- key-w-face))))
-
-(defsubst which-key--truncate-description (desc)
- "Truncate DESC description to `which-key-max-description-length'."
- (let* ((last-face (get-text-property (1- (length desc)) 'face desc))
- (dots (which-key--propertize ".." 'face last-face)))
- (if (and which-key-max-description-length
- (> (length desc) which-key-max-description-length))
- (concat (substring desc 0 which-key-max-description-length) dots)
- desc)))
-
-(defun which-key--highlight-face (description)
- "Return the highlight face for DESCRIPTION if it has one."
- (let (face)
- (dolist (el which-key-highlighted-command-list)
- (unless face
- (cond ((consp el)
- (when (string-match-p (car el) description)
- (setq face (cdr el))))
- ((stringp el)
- (when (string-match-p el description)
- (setq face 'which-key-highlighted-command-face)))
- (t
- (message "which-key: warning: element %s of \
-which-key-highlighted-command-list is not a string or a cons
-cell" el)))))
- face))
-
-(defun which-key--propertize-description
- (description group local hl-face &optional original-description)
- "Add face to DESCRIPTION where the face chosen depends on
-whether the description represents a group or a command. Also
-make some minor adjustments to the description string, like
-removing a \"group:\" prefix.
-
-ORIGINAL-DESCRIPTION is the description given by
-`describe-buffer-bindings'."
- (when description
- (let* ((desc description)
- (desc (if (string-match-p "^group:" desc)
- (substring desc 6) desc))
- (desc (if group (concat which-key-prefix-prefix desc) desc)))
- (make-text-button
- desc nil
- 'face (cond (hl-face hl-face)
- (group 'which-key-group-description-face)
- (local 'which-key-local-map-description-face)
- (t 'which-key-command-description-face))
- 'help-echo (cond
- ((and original-description
- (fboundp (intern original-description))
- (documentation (intern original-description))
- ;; tooltip-mode doesn't exist in emacs-nox
- (boundp 'tooltip-mode) tooltip-mode)
- (documentation (intern original-description)))
- ((and original-description
- (fboundp (intern original-description))
- (documentation (intern original-description))
- (let* ((doc (documentation
- (intern original-description)))
- (str (replace-regexp-in-string "\n" " " doc))
- (max (floor (* (frame-width) 0.8))))
- (if (> (length str) max)
- (concat (substring str 0 max) "...")
- str)))))))))
-
-(defun which-key--extract-key (key-str)
- "Pull the last key (or key range) out of KEY-STR."
- (save-match-data
- (let ((key-range-regexp "\\`.*\\([^ \t]+ \\.\\. [^ \t]+\\)\\'"))
- (if (string-match key-range-regexp key-str)
- (match-string 1 key-str)
- (car (last (split-string key-str " ")))))))
-
-(defun which-key--maybe-add-docstring (current original)
- "Maybe concat a docstring to CURRENT and return result.
-Specifically, do this if ORIGINAL is a command with a docstring
-and `which-key-show-docstrings' is non-nil. If
-`which-key-show-docstrings' is the symbol docstring-only, just
-return the docstring."
- (let* ((orig-sym (intern original))
- (doc (when (commandp orig-sym)
- (documentation orig-sym)))
- (doc (when doc
- (replace-regexp-in-string
- (concat "^\\(?::"
- (regexp-opt '("around" "override"
- "after" "after-until" "after-while"
- "before" "before-until" "before-while"
- "filter-args" "filter-return"))
- " advice: [^\n]+\n"
- "\\)+\n")
- "" doc)))
- (docstring (when doc
- (which-key--propertize (car (split-string doc "\n"))
- 'face 'which-key-docstring-face))))
- (cond ((not (and which-key-show-docstrings docstring))
- current)
- ((eq which-key-show-docstrings 'docstring-only)
- docstring)
- (t
- (format "%s %s" current docstring)))))
-
-(defun which-key--format-and-replace (unformatted &optional prefix preserve-full-key)
- "Take a list of (key . desc) cons cells in UNFORMATTED, add
-faces and perform replacements according to the three replacement
-alists. Returns a list (key separator description)."
- (let ((sep-w-face
- (which-key--propertize which-key-separator
- 'face 'which-key-separator-face))
- (local-map (current-local-map))
- new-list)
- (dolist (key-binding unformatted)
- (let* ((key (car key-binding))
- (orig-desc (cdr key-binding))
- (group (which-key--group-p orig-desc))
- ;; At top-level prefix is nil
- (keys (if prefix
- (concat (key-description prefix) " " key)
- key))
- (local (eq (which-key--safe-lookup-key local-map (kbd keys))
- (intern orig-desc)))
- (hl-face (which-key--highlight-face orig-desc))
- (key-binding (which-key--maybe-replace (cons keys orig-desc) prefix))
- (final-desc (which-key--propertize-description
- (cdr key-binding) group local hl-face orig-desc)))
- (when final-desc
- (setq final-desc
- (which-key--truncate-description
- (which-key--maybe-add-docstring final-desc orig-desc))))
- (when (consp key-binding)
- (push
- (list (which-key--propertize-key
- (if preserve-full-key
- (car key-binding)
- (which-key--extract-key (car key-binding))))
- sep-w-face
- final-desc)
- new-list))))
- (nreverse new-list)))
-
-(defun which-key--get-keymap-bindings (keymap &optional all prefix)
- "Retrieve top-level bindings from KEYMAP.
-If ALL is non-nil, get all bindings, not just the top-level
-ones. PREFIX is for internal use and should not be used."
- (let (bindings)
- (map-keymap
- (lambda (ev def)
- (let* ((key (append prefix (list ev)))
- (key-desc (key-description key)))
- (cond ((or (string-match-p
- which-key--ignore-non-evil-keys-regexp key-desc)
- (eq ev 'menu-bar)))
- ;; extract evil keys corresponding to current state
- ((and (keymapp def)
- (boundp 'evil-state)
- (bound-and-true-p evil-local-mode)
- (string-match-p (format "<%s-state>$" evil-state) key-desc))
- (setq bindings
- ;; this function keeps the latter of the two duplicates
- ;; which will be the evil binding
- (cl-remove-duplicates
- (append bindings
- (which-key--get-keymap-bindings def all prefix))
- :test (lambda (a b) (string= (car a) (car b))))))
- ((and (keymapp def)
- (string-match-p which-key--evil-keys-regexp key-desc)))
- ((and (keymapp def)
- (or all
- ;; event 27 is escape, so this will pick up meta
- ;; bindings and hopefully not too much more
- (and (numberp ev) (= ev 27))))
- (setq bindings
- (append bindings
- (which-key--get-keymap-bindings def t key))))
- (t
- (when def
- (cl-pushnew
- (cons key-desc
- (cond
- ((keymapp def) "Prefix Command")
- ((symbolp def) (copy-sequence (symbol-name def)))
- ((eq 'lambda (car-safe def)) "lambda")
- ((eq 'menu-item (car-safe def)) "menu-item")
- ((stringp def) def)
- ((vectorp def) (key-description def))
- (t "unknown")))
- bindings :test (lambda (a b) (string= (car a) (car b)))))))))
- keymap)
- bindings))
-
-(defun which-key--compute-binding (binding)
- "Replace BINDING with remapped binding if it exists.
-
-Requires `which-key-compute-remaps' to be non-nil"
- (let (remap)
- (if (and which-key-compute-remaps
- (setq remap (command-remapping (intern binding))))
- (copy-sequence (symbol-name remap))
- binding)))
-
-(defun which-key--get-current-bindings (&optional prefix)
- "Generate a list of current active bindings."
- (let ((key-str-qt (regexp-quote (key-description prefix)))
- (buffer (current-buffer))
- (ignore-bindings '("self-insert-command" "ignore"
- "ignore-event" "company-ignore"))
- (ignore-sections-regexp
- (eval-when-compile
- (regexp-opt '("Key translations" "Function key map translations"
- "Input decoding map translations")))))
- (with-temp-buffer
- (setq-local indent-tabs-mode t)
- (setq-local tab-width 8)
- (describe-buffer-bindings buffer prefix)
- (goto-char (point-min))
- (let ((header-p (not (= (char-after) ?\f)))
- bindings header)
- (while (not (eobp))
- (cond
- (header-p
- (setq header (buffer-substring-no-properties
- (point)
- (line-end-position)))
- (setq header-p nil)
- (forward-line 3))
- ((= (char-after) ?\f)
- (setq header-p t))
- ((looking-at "^[ \t]*$"))
- ((or (not (string-match-p ignore-sections-regexp header)) prefix)
- (let ((binding-start (save-excursion
- (and (re-search-forward "\t+" nil t)
- (match-end 0))))
- key binding)
- (when binding-start
- (setq key (buffer-substring-no-properties
- (point) binding-start))
- (setq binding (buffer-substring-no-properties
- binding-start
- (line-end-position)))
- (save-match-data
- (cond
- ((member binding ignore-bindings))
- ((string-match-p which-key--ignore-keys-regexp key))
- ((and prefix
- (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$"
- key-str-qt) key))
- (unless (assoc-string (match-string 1 key) bindings)
- (push (cons (match-string 1 key)
- (which-key--compute-binding binding))
- bindings)))
- ((and prefix
- (string-match
- (format
- "^%s[ \t]\\([^ \t]+\\) \\.\\. %s[ \t]\\([^ \t]+\\)[ \t]+$"
- key-str-qt key-str-qt) key))
- (let ((stripped-key (concat (match-string 1 key)
- " \.\. "
- (match-string 2 key))))
- (unless (assoc-string stripped-key bindings)
- (push (cons stripped-key
- (which-key--compute-binding binding))
- bindings))))
- ((string-match
- "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key)
- (unless (assoc-string (match-string 1 key) bindings)
- (push (cons (match-string 1 key)
- (which-key--compute-binding binding))
- bindings)))))))))
- (forward-line))
- (nreverse bindings)))))
-
-(defun which-key--get-bindings (&optional prefix keymap filter recursive)
- "Collect key bindings.
-If KEYMAP is nil, collect from current buffer using the current
-key sequence as a prefix. Otherwise, collect from KEYMAP. FILTER
-is a function to use to filter the bindings. If RECURSIVE is
-non-nil, then bindings are collected recursively for all prefixes."
- (let* ((unformatted
- (cond ((keymapp keymap)
- (which-key--get-keymap-bindings keymap recursive))
- (keymap
- (error "%s is not a keymap" keymap))
- (t
- (which-key--get-current-bindings prefix)))))
- (when filter
- (setq unformatted (cl-remove-if-not filter unformatted)))
- (when which-key-sort-order
- (setq unformatted
- (sort unformatted which-key-sort-order)))
- (which-key--format-and-replace unformatted prefix recursive)))
-
-;;; Functions for laying out which-key buffer pages
-
-(defun which-key--normalize-columns (columns)
- "Pad COLUMNS to the same length using empty strings."
- (let ((max-len (cl-reduce (lambda (a x) (max a (length x))) columns
- :initial-value 0)))
- (mapcar
- (lambda (c)
- (if (< (length c) max-len)
- (append c (make-list (- max-len (length c)) ""))
- c))
- columns)))
-
-(defsubst which-key--join-columns (columns)
- "Transpose columns into rows, concat rows into lines and rows into page."
- (let* ((padded (which-key--normalize-columns (nreverse columns)))
- (rows (apply #'cl-mapcar #'list padded)))
- (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n")))
-
-(defsubst which-key--max-len (keys index)
- "Internal function for finding the max length of the INDEX
-element in each list element of KEYS."
- (cl-reduce
- (lambda (x y) (max x (which-key--string-width (nth index y))))
- keys :initial-value 0))
-
-(defun which-key--pad-column (col-keys)
- "Take a column of (key separator description) COL-KEYS,
-calculate the max width in the column and pad all cells out to
-that width."
- (let* ((col-key-width (+ which-key-add-column-padding
- (which-key--max-len col-keys 0)))
- (col-sep-width (which-key--max-len col-keys 1))
- (col-desc-width (which-key--max-len col-keys 2))
- (col-width (+ 1 col-key-width col-sep-width col-desc-width)))
- (cons col-width
- (mapcar (lambda (k)
- (format (concat "%" (int-to-string col-key-width)
- "s%s%-" (int-to-string col-desc-width) "s")
- (nth 0 k) (nth 1 k) (nth 2 k)))
- col-keys))))
-
-(defun which-key--partition-list (n list)
- "Partition LIST into N-sized sublists."
- (let (res)
- (while list
- (setq res (cons (cl-subseq list 0 (min n (length list))) res)
- list (nthcdr n list)))
- (nreverse res)))
-
-(defun which-key--list-to-pages (keys avl-lines avl-width)
- "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH.
-Returns a `which-key--pages' object that holds the page strings,
-as well as metadata."
- (let ((cols-w-widths (mapcar #'which-key--pad-column
- (which-key--partition-list avl-lines keys)))
- (page-width 0) (n-pages 0) (n-keys 0) (n-columns 0)
- page-cols pages page-widths keys/page col)
- (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width)
- ;; give up if no columns fit
- nil
- (while cols-w-widths
- ;; start new page
- (cl-incf n-pages)
- (setq col (pop cols-w-widths))
- (setq page-cols (list (cdr col)))
- (setq page-width (car col))
- (setq n-keys (length (cdr col)))
- (setq n-columns 1)
- ;; add additional columns as long as they fit
- (while (and cols-w-widths
- (or (null which-key-max-display-columns)
- (< n-columns which-key-max-display-columns))
- (<= (+ (caar cols-w-widths) page-width) avl-width))
- (setq col (pop cols-w-widths))
- (push (cdr col) page-cols)
- (cl-incf page-width (car col))
- (cl-incf n-keys (length (cdr col)))
- (cl-incf n-columns))
- (push (which-key--join-columns page-cols) pages)
- (push n-keys keys/page)
- (push page-width page-widths))
- (make-which-key--pages
- :pages (nreverse pages)
- :height (if (> n-pages 1) avl-lines (min avl-lines n-keys))
- :widths (nreverse page-widths)
- :keys/page (reverse keys/page)
- :page-nums (number-sequence 1 n-pages)
- :num-pages n-pages
- :total-keys (apply #'+ keys/page)))))
-
-(defun which-key--create-pages-1
- (keys available-lines available-width &optional min-lines vertical)
- "Create page strings using `which-key--list-to-pages'.
-Will try to find the best number of rows and columns using the
-given dimensions and the length and widths of ITEMS. Use VERTICAL
-if the ITEMS are laid out vertically and the number of columns
-should be minimized."
- (let ((result (which-key--list-to-pages
- keys available-lines available-width))
- (min-lines (or min-lines 0))
- found prev-result)
- (if (or (null result)
- vertical
- (> (which-key--pages-num-pages result) 1)
- (= 1 available-lines))
- result
- ;; simple search for a fitting page
- (while (and (> available-lines min-lines)
- (not found))
- (setq available-lines (- available-lines 1)
- prev-result result
- result (which-key--list-to-pages
- keys available-lines available-width)
- found (> (which-key--pages-num-pages result) 1)))
- (if found prev-result result))))
-
-(defun which-key--create-pages (keys &optional prefix-keys prefix-title)
- "Create page strings using `which-key--list-to-pages'.
-Will try to find the best number of rows and columns using the
-given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH
-is the width of the live window."
- (let* ((max-dims (which-key--popup-max-dimensions))
- (max-lines (car max-dims))
- (max-width (cdr max-dims))
- (prefix-desc (key-description prefix-keys))
- (full-prefix (which-key--full-prefix prefix-desc))
- (prefix (when (eq which-key-show-prefix 'left)
- (+ 2 (which-key--string-width full-prefix))))
- (prefix-top-bottom (member which-key-show-prefix '(bottom top)))
- (avl-lines (if prefix-top-bottom (- max-lines 1) max-lines))
- (min-lines (min avl-lines which-key-min-display-lines))
- (avl-width (if prefix (- max-width prefix) max-width))
- (vertical (and (eq which-key-popup-type 'side-window)
- (member which-key-side-window-location '(left right))))
- result)
- (setq result
- (which-key--create-pages-1
- keys avl-lines avl-width min-lines vertical))
- (when (and result
- (> (which-key--pages-num-pages result) 0))
- (setf (which-key--pages-prefix result) prefix-keys)
- (setf (which-key--pages-prefix-title result)
- (or prefix-title
- (which-key--maybe-get-prefix-title
- (key-description prefix-keys))))
- (which-key--debug-message "Frame height: %s
-Minibuffer height: %s
-Max dimensions: (%s,%s)
-Available for bindings: (%s,%s)
-Actual lines: %s" (frame-height) (window-text-height (minibuffer-window))
-max-lines max-width avl-lines avl-width (which-key--pages-height result))
- result)))
-
-(defun which-key--lighter-status ()
- "Possibly show number of keys and total in the mode line."
- (when which-key-show-remaining-keys
- (let ((n-shown (car (which-key--pages-keys/page which-key--pages-obj)))
- (n-tot (which-key--pages-total-keys which-key--pages-obj)))
- (setcar (cdr (assq 'which-key-mode minor-mode-alist))
- (format " WK: %s/%s keys" n-shown n-tot)))))
-
-(defun which-key--lighter-restore ()
- "Restore the lighter for which-key."
- (when which-key-show-remaining-keys
- (setcar (cdr (assq 'which-key-mode minor-mode-alist))
- which-key-lighter)))
-
-(defun which-key--echo (text)
- "Echo TEXT to minibuffer without logging."
- (let (message-log-max)
- (message "%s" text)))
-
-(defun which-key--next-page-hint (prefix-keys)
- "Return string for next page hint."
- (let* ((paging-key (concat prefix-keys " " which-key-paging-key))
- (paging-key-bound (eq 'which-key-C-h-dispatch
- (key-binding (kbd paging-key))))
- (key (key-description (vector help-char)))
- (key (if paging-key-bound
- (concat key " or " which-key-paging-key)
- key)))
- (when which-key-use-C-h-commands
- (which-key--propertize (format "[%s paging/help]" key)
- 'face 'which-key-note-face))))
-
-(eval-and-compile
- (if (fboundp 'universal-argument--description)
- (defalias 'which-key--universal-argument--description
- 'universal-argument--description)
- (defun which-key--universal-argument--description ()
- ;; Backport of the definition of universal-argument--description in
- ;; emacs25 on 2015-12-04
- (when prefix-arg
- (concat "C-u"
- (pcase prefix-arg
- (`(-) " -")
- (`(,(and (pred integerp) n))
- (let ((str ""))
- (while (and (> n 4) (= (mod n 4) 0))
- (setq str (concat str " C-u"))
- (setq n (/ n 4)))
- (if (= n 4) str (format " %s" prefix-arg))))
- (_ (format " %s" prefix-arg))))))))
-
-(defun which-key--full-prefix (prefix-keys &optional -prefix-arg dont-prop-keys)
- "Return a description of the full key sequence up to now,
-including prefix arguments."
- (let* ((left (eq which-key-show-prefix 'left))
- (prefix-arg (if -prefix-arg -prefix-arg prefix-arg))
- (str (concat
- (which-key--universal-argument--description)
- (when prefix-arg " ")
- prefix-keys))
- (dash (if (and (not (string= prefix-keys ""))
- (null left)) "-" "")))
- (if (or (eq which-key-show-prefix 'echo) dont-prop-keys)
- (concat str dash)
- (concat (which-key--propertize-key str)
- (which-key--propertize dash 'face 'which-key-key-face)))))
-
-(defun which-key--get-popup-map ()
- "Generate transient-map for use in the top level binding display."
- (unless which-key--automatic-display
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch)
- (when which-key-use-C-h-commands
- ;; Show next page even when C-h is pressed
- (define-key map (vector help-char) #'which-key-C-h-dispatch))
- map)))
-
-(defun which-key--process-page (pages-obj)
- "Add information to the basic list of key bindings, including
-if applicable the current prefix, the name of the current prefix,
-and a page count."
- (let* ((page (car (which-key--pages-pages pages-obj)))
- (height (which-key--pages-height pages-obj))
- (n-pages (which-key--pages-num-pages pages-obj))
- (page-n (car (which-key--pages-page-nums pages-obj)))
- (prefix-desc (key-description (which-key--pages-prefix pages-obj)))
- (prefix-title (which-key--pages-prefix-title pages-obj))
- (full-prefix (which-key--full-prefix prefix-desc))
- (nxt-pg-hint (which-key--next-page-hint prefix-desc))
- ;; not used in left case
- (status-line
- (concat (which-key--propertize prefix-title 'face 'which-key-note-face)
- (when (< 1 n-pages)
- (which-key--propertize (format " (%s of %s)" page-n n-pages)
- 'face 'which-key-note-face)))))
- (pcase which-key-show-prefix
- (`left
- (let* ((page-cnt (which-key--propertize (format "%s/%s" page-n n-pages)
- 'face 'which-key-separator-face))
- (first-col-width (+ 2 (max (which-key--string-width full-prefix)
- (which-key--string-width page-cnt))))
- (prefix (format (concat "%-" (int-to-string first-col-width) "s")
- full-prefix))
- (page-cnt (if (> n-pages 1)
- (format
- (concat "%-" (int-to-string first-col-width) "s")
- page-cnt)
- (make-string first-col-width 32)))
- lines first-line new-end)
- (if (= 1 height)
- (cons (concat prefix page) nil)
- (setq lines (split-string page "\n")
- first-line (concat prefix (car lines) "\n" page-cnt)
- new-end (concat "\n" (make-string first-col-width 32)))
- (cons
- (concat first-line (mapconcat #'identity (cdr lines) new-end))
- nil))))
- (`top
- (cons
- (concat (when (or (= 0 echo-keystrokes)
- (not (eq which-key-side-window-location 'bottom)))
- (concat full-prefix " "))
- status-line " " nxt-pg-hint "\n" page)
- nil))
- (`bottom
- (cons
- (concat page "\n"
- (when (or (= 0 echo-keystrokes)
- (not (eq which-key-side-window-location 'bottom)))
- (concat full-prefix " "))
- status-line " " nxt-pg-hint)
- nil))
- (`echo
- (cons page
- (lambda ()
- (which-key--echo
- (concat full-prefix (when prefix-desc " ")
- status-line (when status-line " ")
- nxt-pg-hint)))))
- (`mode-line
- (cons page
- (lambda ()
- (with-current-buffer which-key--buffer
- (setq-local mode-line-format
- (concat " " full-prefix
- " " status-line
- " " nxt-pg-hint))))))
- (_ (cons page nil)))))
-
-(defun which-key--show-page (&optional n)
- "Show current page. N changes the current page to the Nth page
-relative to the current one."
- (which-key--init-buffer) ;; in case it was killed
- (let ((prefix-keys (which-key--current-key-string))
- golden-ratio-mode)
- (if (null which-key--pages-obj)
- (message "%s- which-key can't show keys: There is not \
-enough space based on your settings and frame size." prefix-keys)
- (when n
- (setq which-key--pages-obj
- (which-key--pages-set-current-page which-key--pages-obj n)))
- (let ((page-echo (which-key--process-page which-key--pages-obj))
- (height (which-key--pages-height which-key--pages-obj))
- (width (car (which-key--pages-widths which-key--pages-obj))))
- (which-key--lighter-status)
- (if (eq which-key-popup-type 'minibuffer)
- (which-key--echo (car page-echo))
- (with-current-buffer which-key--buffer
- (erase-buffer)
- (insert (car page-echo))
- (goto-char (point-min)))
- (when (cdr page-echo) (funcall (cdr page-echo)))
- (which-key--show-popup (cons height width)))))
- ;; used for paging at top-level
- (if (fboundp 'set-transient-map)
- (set-transient-map (which-key--get-popup-map))
- (with-no-warnings
- (set-temporary-overlay-map (which-key--get-popup-map))))))
-
-;;; Paging functions
-
-;;;###autoload
-(defun which-key-reload-key-sequence (&optional key-seq)
- "Simulate entering the key sequence KEY-SEQ.
-KEY-SEQ should be a list of events as produced by
-`listify-key-sequence'. If nil, KEY-SEQ defaults to
-`which-key--current-key-list'. Any prefix arguments that were
-used are reapplied to the new key sequence."
- (let* ((key-seq (or key-seq (which-key--current-key-list)))
- (next-event (mapcar (lambda (ev) (cons t ev)) key-seq)))
- (setq prefix-arg current-prefix-arg
- unread-command-events next-event)))
-
-(defun which-key-turn-page (delta)
- "Show the next page of keys."
- (which-key-reload-key-sequence)
- (if which-key--last-try-2-loc
- (let ((which-key-side-window-location which-key--last-try-2-loc)
- (which-key--multiple-locations t))
- (which-key--show-page delta))
- (which-key--show-page delta))
- (which-key--start-paging-timer))
-
-;;;###autoload
-(defun which-key-show-standard-help (&optional _)
- "Call the command in `which-key--prefix-help-cmd-backup'.
-Usually this is `describe-prefix-bindings'."
- (interactive)
- (let ((which-key-inhibit t)
- (popup-showing (which-key--popup-showing-p)))
- (which-key--hide-popup-ignore-command)
- (cond ((and (eq which-key--prefix-help-cmd-backup
- 'describe-prefix-bindings)
- ;; If the popup is not showing, we call
- ;; `describe-prefix-bindings' directly.
- popup-showing)
- ;; This is essentially what `describe-prefix-bindings' does. We can't
- ;; use this function directly, because the prefix will not be correct
- ;; when we enter using `which-key-C-h-dispatch'.
- (describe-bindings (kbd (which-key--current-key-string))))
- ((functionp which-key--prefix-help-cmd-backup)
- (funcall which-key--prefix-help-cmd-backup)))))
-
-;;;###autoload
-(defun which-key-show-next-page-no-cycle ()
- "Show next page of keys unless on the last page, in which case
-call `which-key-show-standard-help'."
- (interactive)
- (let ((which-key-inhibit t))
- (if (which-key--on-last-page)
- (which-key-show-standard-help)
- (which-key-turn-page 1))))
-
-;;;###autoload
-(defun which-key-show-previous-page-no-cycle ()
- "Show previous page of keys unless on the first page, in which
-case do nothing."
- (interactive)
- (let ((which-key-inhibit t))
- (unless (which-key--on-first-page)
- (which-key-turn-page -1))))
-
-;;;###autoload
-(defun which-key-show-next-page-cycle (&optional _)
- "Show the next page of keys, cycling from end to beginning
-after last page."
- (interactive)
- (let ((which-key-inhibit t))
- (which-key-turn-page 1)))
-
-;;;###autoload
-(defun which-key-show-previous-page-cycle (&optional _)
- "Show the previous page of keys, cycling from beginning to end
-after first page."
- (interactive)
- (let ((which-key-inhibit t))
- (which-key-turn-page -1)))
-
-;;;###autoload
-(defun which-key-show-top-level (&optional _)
- "Show top-level bindings."
- (interactive)
- (which-key--create-buffer-and-show nil nil nil "Top-level bindings"))
-
-;;;###autoload
-(defun which-key-show-major-mode (&optional all)
- "Show top-level bindings in the map of the current major mode.
-
-This function will also detect evil bindings made using
-`evil-define-key' in this map. These bindings will depend on the
-current evil state. "
- (interactive "P")
- (let ((map-sym (intern (format "%s-map" major-mode))))
- (if (and (boundp map-sym) (keymapp (symbol-value map-sym)))
- (which-key--show-keymap
- "Major-mode bindings"
- (symbol-value map-sym)
- (apply-partially #'which-key--map-binding-p (symbol-value map-sym))
- all)
- (message "which-key: No map named %s" map-sym))))
-
-;;;###autoload
-(defun which-key-show-full-major-mode ()
- "Show all bindings in the map of the current major mode.
-
-This function will also detect evil bindings made using
-`evil-define-key' in this map. These bindings will depend on the
-current evil state. "
- (interactive)
- (which-key-show-major-mode t))
-
-;;;###autoload
-(defun which-key-dump-bindings (prefix buffer-name)
- "Dump bindings from PREFIX into buffer named BUFFER-NAME.
-
-PREFIX should be a string suitable for `kbd'."
- (interactive "sPrefix: \nB")
- (let* ((buffer (get-buffer-create buffer-name))
- (keys (which-key--get-bindings (kbd prefix))))
- (with-current-buffer buffer
- (point-max)
- (save-excursion
- (dolist (key keys)
- (insert (apply #'format "%s%s%s\n" key)))))
- (switch-to-buffer-other-window buffer)))
-
-;;;###autoload
-(defun which-key-undo-key (&optional _)
- "Undo last keypress and force which-key update."
- (interactive)
- (let* ((key-lst (butlast (which-key--current-key-list)))
- (which-key-inhibit t))
- (cond (which-key--prior-show-keymap-args
- (if (keymapp (cdr (car-safe which-key--prior-show-keymap-args)))
- (let ((args (pop which-key--prior-show-keymap-args)))
- (which-key--show-keymap (car args) (cdr args)))
- (which-key--hide-popup)))
- (key-lst
- (which-key-reload-key-sequence key-lst)
- (which-key--create-buffer-and-show (apply #'vector key-lst)))
- (t (setq which-key--automatic-display nil)
- (which-key-show-top-level)))))
-(defalias 'which-key-undo 'which-key-undo-key)
-
-(defun which-key-abort (&optional _)
- "Abort key sequence."
- (interactive)
- (let ((which-key-inhibit t))
- (which-key--hide-popup-ignore-command)
- (keyboard-quit)))
-
-(defun which-key-digit-argument (key)
- "Version of `digit-argument' for use in `which-key-C-h-map'."
- (interactive)
- (let ((last-command-event (string-to-char key)))
- (digit-argument key))
- (let ((current-prefix-arg prefix-arg))
- (which-key-reload-key-sequence)))
-
-(defun which-key-toggle-docstrings (&optional _)
- "Toggle the display of docstrings."
- (interactive)
- (unless (eq which-key-show-docstrings 'docstring-only)
- (setq which-key-show-docstrings (null which-key-show-docstrings)))
- (which-key-reload-key-sequence)
- (which-key--create-buffer-and-show (which-key--current-prefix)))
-
-;;;###autoload
-(defun which-key-C-h-dispatch ()
- "Dispatch C-h commands by looking up key in
-`which-key-C-h-map'. This command is always accessible (from any
-prefix) if `which-key-use-C-h-commands' is non nil."
- (interactive)
- (cond ((and (not (which-key--popup-showing-p))
- which-key-show-early-on-C-h)
- (let* ((current-prefix
- (butlast
- (listify-key-sequence (which-key--this-command-keys)))))
- (which-key-reload-key-sequence current-prefix)
- (if which-key-idle-secondary-delay
- (which-key--start-timer which-key-idle-secondary-delay t)
- (which-key--start-timer 0.05 t))))
- ((not (which-key--popup-showing-p))
- (which-key-show-standard-help))
- (t
- (if (not (which-key--popup-showing-p))
- (which-key-show-standard-help)
- (let* ((prefix-keys (which-key--current-key-string))
- (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t))
- (prompt (concat (when (string-equal prefix-keys "")
- (which-key--propertize
- (concat " "
- (which-key--pages-prefix-title
- which-key--pages-obj))
- 'face 'which-key-note-face))
- full-prefix
- (which-key--propertize
- (substitute-command-keys
- (concat
- " \\<which-key-C-h-map>"
- " \\[which-key-show-next-page-cycle]"
- which-key-separator "next-page,"
- " \\[which-key-show-previous-page-cycle]"
- which-key-separator "previous-page,"
- " \\[which-key-undo-key]"
- which-key-separator "undo-key,"
- " \\[which-key-toggle-docstrings]"
- which-key-separator "toggle-docstrings,"
- " \\[which-key-show-standard-help]"
- which-key-separator "help,"
- " \\[which-key-abort]"
- which-key-separator "abort"
- " 1..9"
- which-key-separator "digit-arg"))
- 'face 'which-key-note-face)))
- (key (string (read-key prompt)))
- (cmd (lookup-key which-key-C-h-map key))
- (which-key-inhibit t))
- (if cmd (funcall cmd key) (which-key-turn-page 0)))))))
-
-;;; Update
-
-(defun which-key--any-match-p (regexps string)
- "Non-nil if any of REGEXPS match STRING."
- (catch 'match
- (dolist (regexp regexps)
- (when (string-match-p regexp string)
- (throw 'match t)))))
-
-(defun which-key--try-2-side-windows
- (bindings prefix-keys prefix-title loc1 loc2 &rest _ignore)
- "Try to show BINDINGS (PAGE-N) in LOC1 first.
-
-Only if no bindings fit fallback to LOC2."
- (let (pages1)
- (let ((which-key-side-window-location loc1)
- (which-key--multiple-locations t))
- (setq pages1 (which-key--create-pages
- bindings prefix-keys prefix-title)))
- (if pages1
- (progn
- (setq which-key--pages-obj pages1)
- (let ((which-key-side-window-location loc1)
- (which-key--multiple-locations t))
- (which-key--show-page))
- loc1)
- (let ((which-key-side-window-location loc2)
- (which-key--multiple-locations t))
- (setq which-key--pages-obj
- (which-key--create-pages bindings prefix-keys prefix-title))
- (which-key--show-page)
- loc2))))
-
-(defun which-key--read-keymap ()
- "Read keymap symbol from minibuffer."
- (intern
- (completing-read "Keymap: " obarray
- (lambda (m)
- (and (boundp m)
- (keymapp (symbol-value m))
- (not (equal (symbol-value m)
- (make-sparse-keymap)))))
- t
- (let ((sym (symbol-at-point)))
- (and (boundp sym)
- (keymapp (symbol-value sym))
- (symbol-name sym)))
- 'which-key-keymap-history)))
-
-;;;###autoload
-(defun which-key-show-keymap (keymap &optional no-paging)
- "Show the top-level bindings in KEYMAP using which-key. KEYMAP
-is selected interactively from all available keymaps.
-
-If NO-PAGING is non-nil, which-key will not intercept subsequent
-keypresses for the paging functionality."
- (interactive (list (which-key--read-keymap)))
- (which-key--show-keymap (symbol-name keymap)
- (symbol-value keymap)
- nil nil no-paging))
-
-;;;###autoload
-(defun which-key-show-full-keymap (keymap)
- "Show all bindings in KEYMAP using which-key. KEYMAP is
-selected interactively from all available keymaps."
- (interactive (list (which-key--read-keymap)))
- (which-key--show-keymap (symbol-name keymap)
- (symbol-value keymap)
- nil t))
-
-;;;###autoload
-(defun which-key-show-minor-mode-keymap (&optional all)
- "Show the top-level bindings in KEYMAP using which-key. KEYMAP
-is selected interactively by mode in `minor-mode-map-alist'."
- (interactive)
- (let ((mode-sym
- (intern
- (completing-read
- "Minor Mode: "
- (mapcar 'car
- (cl-remove-if-not
- (lambda (entry)
- (and (symbol-value (car entry))
- (not (equal (cdr entry) (make-sparse-keymap)))))
- minor-mode-map-alist))
- nil t nil 'which-key-keymap-history))))
- (which-key--show-keymap (symbol-name mode-sym)
- (cdr (assq mode-sym minor-mode-map-alist))
- all)))
-;;;###autoload
-(defun which-key-show-full-minor-mode-keymap ()
- "Show all bindings in KEYMAP using which-key. KEYMAP
-is selected interactively by mode in `minor-mode-map-alist'."
- (interactive)
- (which-key-show-minor-mode-keymap t))
-
-(defun which-key--show-keymap
- (keymap-name keymap &optional prior-args all no-paging filter)
- (when prior-args (push prior-args which-key--prior-show-keymap-args))
- (let ((bindings (which-key--get-bindings nil keymap filter all)))
- (if (= (length bindings) 0)
- (message "which-key: No bindings found in %s" keymap-name)
- (cond ((listp which-key-side-window-location)
- (setq which-key--last-try-2-loc
- (apply #'which-key--try-2-side-windows
- bindings nil keymap-name
- which-key-side-window-location)))
- (t (setq which-key--pages-obj
- (which-key--create-pages bindings nil keymap-name))
- (which-key--show-page)))
- (unless no-paging
- (let* ((key (read-key))
- (key-desc (key-description (list key)))
- (next-def (lookup-key keymap (vector key))))
- (cond ((and which-key-use-C-h-commands
- (numberp key) (= key help-char))
- (which-key-C-h-dispatch))
- ((keymapp next-def)
- (which-key--hide-popup-ignore-command)
- (which-key--show-keymap
- (concat keymap-name " " key-desc)
- next-def
- (cons keymap-name keymap)))
- (t (which-key--hide-popup))))))))
-
-(defun which-key--evil-operator-filter (binding)
- (let ((def (intern (cdr binding))))
- (and (functionp def)
- (not (evil-get-command-property def :suppress-operator)))))
-
-(defun which-key--show-evil-operator-keymap ()
- (if which-key--inhibit-next-operator-popup
- (setq which-key--inhibit-next-operator-popup nil)
- (let ((keymap
- (make-composed-keymap (list evil-operator-shortcut-map
- evil-operator-state-map
- evil-motion-state-map))))
- (when (keymapp keymap)
- (let ((formatted-keys
- (which-key--get-bindings
- nil keymap #'which-key--evil-operator-filter)))
- (cond ((= (length formatted-keys) 0)
- (message "which-key: Keymap empty"))
- ((listp which-key-side-window-location)
- (setq which-key--last-try-2-loc
- (apply #'which-key--try-2-side-windows
- formatted-keys nil "evil operator/motion keys"
- which-key-side-window-location)))
- (t (setq which-key--pages-obj
- (which-key--create-pages
- formatted-keys
- nil "evil operator/motion keys"))
- (which-key--show-page)))))
- (let* ((key (read-key)))
- (when (member key '(?f ?F ?t ?T ?`))
- ;; these keys trigger commands that read the next char manually
- (setq which-key--inhibit-next-operator-popup t))
- (cond ((and which-key-use-C-h-commands (numberp key) (= key help-char))
- (which-key-C-h-dispatch))
- ((and (numberp key) (= key ?\C-\[))
- (which-key--hide-popup)
- (keyboard-quit))
- (t
- (which-key--hide-popup)
- (setq unread-command-events (vector key))))))))
-
-(defun which-key--create-buffer-and-show
- (&optional prefix-keys from-keymap filter prefix-title)
- "Fill `which-key--buffer' with key descriptions and reformat.
-Finally, show the buffer."
- (let ((start-time (current-time))
- (formatted-keys (which-key--get-bindings
- prefix-keys from-keymap filter))
- (prefix-desc (key-description prefix-keys)))
- (cond ((= (length formatted-keys) 0)
- (message "%s- which-key: There are no keys to show" prefix-desc))
- ((listp which-key-side-window-location)
- (setq which-key--last-try-2-loc
- (apply #'which-key--try-2-side-windows
- formatted-keys prefix-keys prefix-title
- which-key-side-window-location)))
- (t (setq which-key--pages-obj
- (which-key--create-pages
- formatted-keys prefix-keys prefix-title))
- (which-key--show-page)))
- (which-key--debug-message
- "On prefix \"%s\" which-key took %.0f ms." prefix-desc
- (* 1000 (float-time (time-since start-time))))))
-
-(defun which-key--this-command-keys ()
- "Version of `this-single-command-keys' corrected for key-chords and god-mode."
- (let ((this-command-keys (this-single-command-keys)))
- (when (and (equal this-command-keys [key-chord])
- (bound-and-true-p key-chord-mode))
- (setq this-command-keys
- (condition-case nil
- (let ((rkeys (recent-keys)))
- (vector 'key-chord
- ;; Take the two preceding the last one, because the
- ;; read-event call in key-chord seems to add a
- ;; spurious key press to this list. Note this is
- ;; different from guide-key's method which didn't work
- ;; for me.
- (aref rkeys (- (length rkeys) 3))
- (aref rkeys (- (length rkeys) 2))))
- (error (progn
- (message "which-key error in key-chord handling")
- [key-chord])))))
- (when (and which-key--god-mode-support-enabled
- (bound-and-true-p god-local-mode)
- (eq this-command 'god-mode-self-insert))
- (setq this-command-keys (when which-key--god-mode-key-string
- (kbd which-key--god-mode-key-string))))
- this-command-keys))
-
-(defun which-key--update ()
- "Function run by timer to possibly trigger
-`which-key--create-buffer-and-show'."
- (let ((prefix-keys (which-key--this-command-keys))
- delay-time)
- (cond ((and (> (length prefix-keys) 0)
- (or (keymapp (key-binding prefix-keys))
- ;; Some keymaps are stored here like iso-transl-ctl-x-8-map
- (keymapp (which-key--safe-lookup-key
- key-translation-map prefix-keys))
- ;; just in case someone uses one of these
- (keymapp (which-key--safe-lookup-key
- function-key-map prefix-keys)))
- (not which-key-inhibit)
- (or (null which-key-allow-regexps)
- (which-key--any-match-p
- which-key-allow-regexps (key-description prefix-keys)))
- (or (null which-key-inhibit-regexps)
- (not
- (which-key--any-match-p
- which-key-inhibit-regexps (key-description prefix-keys))))
- ;; Do not display the popup if a command is currently being
- ;; executed
- (or (and which-key-allow-evil-operators
- (bound-and-true-p evil-this-operator))
- (and which-key--god-mode-support-enabled
- (bound-and-true-p god-local-mode)
- (eq this-command 'god-mode-self-insert))
- (null this-command)))
- (when (and (not (equal prefix-keys (which-key--current-prefix)))
- (or (null which-key-delay-functions)
- (null (setq delay-time
- (run-hook-with-args-until-success
- 'which-key-delay-functions
- (key-description prefix-keys)
- (length prefix-keys))))
- (sit-for delay-time)))
- (setq which-key--automatic-display t)
- (which-key--create-buffer-and-show prefix-keys)
- (when (and which-key-idle-secondary-delay
- (not which-key--secondary-timer-active))
- (which-key--start-timer which-key-idle-secondary-delay t))))
- ((and which-key-show-transient-maps
- (keymapp overriding-terminal-local-map)
- ;; basic test for it being a hydra
- (not (eq (lookup-key overriding-terminal-local-map "\C-u")
- 'hydra--universal-argument)))
- (which-key--create-buffer-and-show
- nil overriding-terminal-local-map))
- ((and which-key-show-operator-state-maps
- (bound-and-true-p evil-state)
- (eq evil-state 'operator)
- (not (which-key--popup-showing-p)))
- (which-key--show-evil-operator-keymap))
- (which-key--automatic-display
- (which-key--hide-popup)))))
-
-;;; Timers
-
-(defun which-key--start-timer (&optional delay secondary)
- "Activate idle timer to trigger `which-key--update'."
- (which-key--stop-timer)
- (setq which-key--secondary-timer-active secondary)
- (setq which-key--timer
- (run-with-idle-timer
- (if delay
- delay
- which-key-idle-delay) t #'which-key--update)))
-
-(defun which-key--stop-timer ()
- "Deactivate idle timer for `which-key--update'."
- (when which-key--timer (cancel-timer which-key--timer)))
-
-(defun which-key--start-paging-timer ()
- "Activate timer to restart which-key after paging."
- (when which-key--paging-timer (cancel-timer which-key--paging-timer))
- (which-key--stop-timer)
- (setq which-key--paging-timer
- (run-with-idle-timer
- 0.2 t (lambda ()
- (when (or (not (member real-last-command
- which-key--paging-functions))
- (and (< 0 (length (this-single-command-keys)))
- (not (equal (which-key--current-prefix)
- (which-key--this-command-keys)))))
- (cancel-timer which-key--paging-timer)
- (if which-key-idle-secondary-delay
- ;; we haven't executed a command yet so the secandary
- ;; timer is more relevant here
- (which-key--start-timer which-key-idle-secondary-delay t)
- (which-key--start-timer)))))))
-
-(provide 'which-key)
-;;; which-key.el ends here
diff --git a/elpa/with-editor-20200720.2014/dir b/elpa/with-editor-20200720.2014/dir
deleted file mode 100644
index c5810e0..0000000
--- a/elpa/with-editor-20200720.2014/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir, Node: Top This is the top of the INFO tree
-
- This (the Directory node) gives a menu of major topics.
- Typing "q" exits, "H" lists all Info commands, "d" returns here,
- "h" gives a primer for first-timers,
- "mEmacs<Return>" visits the Emacs manual, etc.
-
- In Emacs, you can click mouse button 2 on a menu item or cross reference
- to select it.
-
-* Menu:
-
-Emacs
-* With-Editor: (with-editor). Using the Emacsclient as $EDITOR.
diff --git a/elpa/with-editor-20200720.2014/with-editor-autoloads.el b/elpa/with-editor-20200720.2014/with-editor-autoloads.el
deleted file mode 100644
index cdfafa8..0000000
--- a/elpa/with-editor-20200720.2014/with-editor-autoloads.el
+++ /dev/null
@@ -1,99 +0,0 @@
-;;; with-editor-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))
-
-
-;;;### (autoloads nil "with-editor" "with-editor.el" (0 0 0 0))
-;;; Generated autoloads from with-editor.el
-
-(autoload 'with-editor-export-editor "with-editor" "\
-Teach subsequent commands to use current Emacs instance as editor.
-
-Set and export the environment variable ENVVAR, by default
-\"EDITOR\". The value is automatically generated to teach
-commands to use the current Emacs instance as \"the editor\".
-
-This works in `shell-mode', `term-mode' and `eshell-mode'.
-
-\(fn &optional (ENVVAR \"EDITOR\"))" t nil)
-
-(autoload 'with-editor-export-git-editor "with-editor" "\
-Like `with-editor-export-editor' but always set `$GIT_EDITOR'.
-
-\(fn)" t nil)
-
-(autoload 'with-editor-export-hg-editor "with-editor" "\
-Like `with-editor-export-editor' but always set `$HG_EDITOR'.
-
-\(fn)" t nil)
-
-(defvar shell-command-with-editor-mode nil "\
-Non-nil if Shell-Command-With-Editor mode is enabled.
-See the `shell-command-with-editor-mode' command
-for a description of this minor mode.")
-
-(custom-autoload 'shell-command-with-editor-mode "with-editor" nil)
-
-(autoload 'shell-command-with-editor-mode "with-editor" "\
-Teach `shell-command' to use current Emacs instance as editor.
-
-Teach `shell-command', and all commands that ultimately call that
-command, to use the current Emacs instance as editor by executing
-\"EDITOR=CLIENT COMMAND&\" instead of just \"COMMAND&\".
-
-CLIENT is automatically generated; EDITOR=CLIENT instructs
-COMMAND to use to the current Emacs instance as \"the editor\",
-assuming no other variable overrides the effect of \"$EDITOR\".
-CLIENT may be the path to an appropriate emacsclient executable
-with arguments, or a script which also works over Tramp.
-
-Alternatively you can use the `with-editor-async-shell-command',
-which also allows the use of another variable instead of
-\"EDITOR\".
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'with-editor-async-shell-command "with-editor" "\
-Like `async-shell-command' but with `$EDITOR' set.
-
-Execute string \"ENVVAR=CLIENT COMMAND\" in an inferior shell;
-display output, if any. With a prefix argument prompt for an
-environment variable, otherwise the default \"EDITOR\" variable
-is used. With a negative prefix argument additionally insert
-the COMMAND's output at point.
-
-CLIENT is automatically generated; ENVVAR=CLIENT instructs
-COMMAND to use to the current Emacs instance as \"the editor\",
-assuming it respects ENVVAR as an \"EDITOR\"-like variable.
-CLIENT may be the path to an appropriate emacsclient executable
-with arguments, or a script which also works over Tramp.
-
-Also see `async-shell-command' and `shell-command'.
-
-\(fn COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER ENVVAR)" t nil)
-
-(autoload 'with-editor-shell-command "with-editor" "\
-Like `shell-command' or `with-editor-async-shell-command'.
-If COMMAND ends with \"&\" behave like the latter,
-else like the former.
-
-\(fn COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER ENVVAR)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "with-editor" '("with-editor" "start-file-process--with-editor-process-filter" "server-" "shell-command--shell-command-with-editor-mode")))
-
-;;;***
-
-;;;### (autoloads nil nil ("with-editor-pkg.el") (0 0 0 0))
-
-;;;***
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; with-editor-autoloads.el ends here
diff --git a/elpa/with-editor-20200720.2014/with-editor-pkg.el b/elpa/with-editor-20200720.2014/with-editor-pkg.el
deleted file mode 100644
index 42866de..0000000
--- a/elpa/with-editor-20200720.2014/with-editor-pkg.el
+++ /dev/null
@@ -1,13 +0,0 @@
-(define-package "with-editor" "20200720.2014" "Use the Emacsclient as $EDITOR"
- '((emacs "24.4")
- (async "1.9"))
- :commit "efafd482c21b90decbb0b682ed3159c86014d4f3" :keywords
- '("tools")
- :authors
- '(("Jonas Bernoulli" . "jonas@bernoul.li"))
- :maintainer
- '("Jonas Bernoulli" . "jonas@bernoul.li")
- :url "https://github.com/magit/with-editor")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/with-editor-20200720.2014/with-editor.el b/elpa/with-editor-20200720.2014/with-editor.el
deleted file mode 100644
index 1c74eef..0000000
--- a/elpa/with-editor-20200720.2014/with-editor.el
+++ /dev/null
@@ -1,916 +0,0 @@
-;;; with-editor.el --- Use the Emacsclient as $EDITOR -*- lexical-binding: t -*-
-
-;; Copyright (C) 2014-2020 The Magit Project Contributors
-;;
-;; You should have received a copy of the AUTHORS.md file. If not,
-;; see https://github.com/magit/with-editor/blob/master/AUTHORS.md.
-
-;; Author: Jonas Bernoulli <jonas@bernoul.li>
-;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
-;; Package-Requires: ((emacs "24.4") (async "1.9"))
-;; Keywords: tools
-;; Homepage: https://github.com/magit/with-editor
-
-;; This file is not part of GNU Emacs.
-
-;; This file 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, or (at your option)
-;; any later version.
-
-;; This file 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 Magit. If not, see http://www.gnu.org/licenses.
-
-;;; Commentary:
-
-;; This library makes it possible to reliably use the Emacsclient as
-;; the `$EDITOR' of child processes. It makes sure that they know how
-;; to call home. For remote processes a substitute is provided, which
-;; communicates with Emacs on standard output/input instead of using a
-;; socket as the Emacsclient does.
-
-;; It provides the commands `with-editor-async-shell-command' and
-;; `with-editor-shell-command', which are intended as replacements
-;; for `async-shell-command' and `shell-command'. They automatically
-;; export `$EDITOR' making sure the executed command uses the current
-;; Emacs instance as "the editor". With a prefix argument these
-;; commands prompt for an alternative environment variable such as
-;; `$GIT_EDITOR'. To always use these variants add this to your init
-;; file:
-;;
-;; (define-key (current-global-map)
-;; [remap async-shell-command] 'with-editor-async-shell-command)
-;; (define-key (current-global-map)
-;; [remap shell-command] 'with-editor-shell-command)
-
-;; Alternatively use the global `shell-command-with-editor-mode',
-;; which always sets `$EDITOR' for all Emacs commands which ultimately
-;; use `shell-command' to asynchronously run some shell command.
-
-;; The command `with-editor-export-editor' exports `$EDITOR' or
-;; another such environment variable in `shell-mode', `term-mode' and
-;; `eshell-mode' buffers. Use this Emacs command before executing a
-;; shell command which needs the editor set, or always arrange for the
-;; current Emacs instance to be used as editor by adding it to the
-;; appropriate mode hooks:
-;;
-;; (add-hook 'shell-mode-hook 'with-editor-export-editor)
-;; (add-hook 'term-exec-hook 'with-editor-export-editor)
-;; (add-hook 'eshell-mode-hook 'with-editor-export-editor)
-
-;; Some variants of this function exist, these two forms are
-;; equivalent:
-;;
-;; (add-hook 'shell-mode-hook
-;; (apply-partially 'with-editor-export-editor "GIT_EDITOR"))
-;; (add-hook 'shell-mode-hook 'with-editor-export-git-editor)
-
-;; This library can also be used by other packages which need to use
-;; the current Emacs instance as editor. In fact this library was
-;; written for Magit and its `git-commit-mode' and `git-rebase-mode'.
-;; Consult `git-rebase.el' and the related code in `magit-sequence.el'
-;; for a simple example.
-
-;;; Code:
-
-(require 'cl-lib)
-;; `pcase-dolist' is not autoloaded on Emacs 24.
-(eval-when-compile (require 'pcase))
-(require 'server)
-(require 'shell)
-
-(and (require 'async-bytecomp nil t)
- (let ((pkgs (bound-and-true-p async-bytecomp-allowed-packages)))
- (if (consp pkgs)
- (cl-intersection '(all magit) pkgs)
- (memq pkgs '(all t))))
- (fboundp 'async-bytecomp-package-mode)
- (async-bytecomp-package-mode 1))
-
-(eval-when-compile
- (progn (require 'dired nil t)
- (require 'eshell nil t)
- (require 'term nil t)
- (require 'warnings nil t)))
-(declare-function dired-get-filename 'dired)
-(declare-function term-emulate-terminal 'term)
-(defvar eshell-preoutput-filter-functions)
-(defvar git-commit-post-finish-hook)
-
-;;; Options
-
-(defgroup with-editor nil
- "Use the Emacsclient as $EDITOR."
- :group 'external
- :group 'server)
-
-(defun with-editor-locate-emacsclient ()
- "Search for a suitable Emacsclient executable."
- (or (with-editor-locate-emacsclient-1
- (with-editor-emacsclient-path)
- (length (split-string emacs-version "\\.")))
- (prog1 nil (display-warning 'with-editor "\
-Cannot determine a suitable Emacsclient
-
-Determining an Emacsclient executable suitable for the
-current Emacs instance failed. For more information
-please see https://github.com/magit/magit/wiki/Emacsclient."))))
-
-(defun with-editor-locate-emacsclient-1 (path depth)
- (let* ((version-lst (cl-subseq (split-string emacs-version "\\.") 0 depth))
- (version-reg (concat "^" (mapconcat #'identity version-lst "\\."))))
- (or (locate-file-internal
- (if (equal (downcase invocation-name) "remacs")
- "remacsclient"
- "emacsclient")
- path
- (cl-mapcan
- (lambda (v) (cl-mapcar (lambda (e) (concat v e)) exec-suffixes))
- (nconc (and (boundp 'debian-emacs-flavor)
- (list (format ".%s" debian-emacs-flavor)))
- (cl-mapcon (lambda (v)
- (setq v (mapconcat #'identity (reverse v) "."))
- (list v (concat "-" v) (concat ".emacs" v)))
- (reverse version-lst))
- (list "" "-snapshot" ".emacs-snapshot")))
- (lambda (exec)
- (ignore-errors
- (string-match-p version-reg
- (with-editor-emacsclient-version exec)))))
- (and (> depth 1)
- (with-editor-locate-emacsclient-1 path (1- depth))))))
-
-(defun with-editor-emacsclient-version (exec)
- (let ((default-directory (file-name-directory exec)))
- (ignore-errors
- (cadr (split-string (car (process-lines exec "--version")))))))
-
-(defun with-editor-emacsclient-path ()
- (let ((path exec-path))
- (when invocation-directory
- (push (directory-file-name invocation-directory) path)
- (let* ((linkname (expand-file-name invocation-name invocation-directory))
- (truename (file-chase-links linkname)))
- (unless (equal truename linkname)
- (push (directory-file-name (file-name-directory truename)) path)))
- (when (eq system-type 'darwin)
- (let ((dir (expand-file-name "bin" invocation-directory)))
- (when (file-directory-p dir)
- (push dir path)))
- (when (string-match-p "Cellar" invocation-directory)
- (let ((dir (expand-file-name "../../../bin" invocation-directory)))
- (when (file-directory-p dir)
- (push dir path))))))
- (cl-remove-duplicates path :test 'equal)))
-
-(defcustom with-editor-emacsclient-executable (with-editor-locate-emacsclient)
- "The Emacsclient executable used by the `with-editor' macro."
- :group 'with-editor
- :type '(choice (string :tag "Executable")
- (const :tag "Don't use Emacsclient" nil)))
-
-(defcustom with-editor-sleeping-editor "\
-sh -c '\
-printf \"WITH-EDITOR: $$ OPEN $0\\037 IN $(pwd)\\n\"; \
-sleep 604800 & sleep=$!; \
-trap \"kill $sleep; exit 0\" USR1; \
-trap \"kill $sleep; exit 1\" USR2; \
-wait $sleep'"
- "The sleeping editor, used when the Emacsclient cannot be used.
-
-This fallback is used for asynchronous processes started inside
-the macro `with-editor', when the process runs on a remote machine
-or for local processes when `with-editor-emacsclient-executable'
-is nil (i.e. when no suitable Emacsclient was found, or the user
-decided not to use it).
-
-Where the latter uses a socket to communicate with Emacs' server,
-this substitute prints edit requests to its standard output on
-which a process filter listens for such requests. As such it is
-not a complete substitute for a proper Emacsclient, it can only
-be used as $EDITOR of child process of the current Emacs instance.
-
-Some shells do not execute traps immediately when waiting for a
-child process, but by default we do use such a blocking child
-process.
-
-If you use such a shell (e.g. `csh' on FreeBSD, but not Debian),
-then you have to edit this option. You can either replace \"sh\"
-with \"bash\" (and install that), or you can use the older, less
-performant implementation:
-
- \"sh -c '\\
- echo \\\"WITH-EDITOR: $$ OPEN $0 IN $(pwd)\\\"; \\
- trap \\\"exit 0\\\" USR1; \\
- trap \\\"exit 1\" USR2; \\
- while true; do sleep 1; done'\"
-
-Note that the unit separator character () right after the file
-name ($0) is required.
-
-Also note that using this alternative implementation leads to a
-delay of up to a second. The delay can be shortened by replacing
-\"sleep 1\" with \"sleep 0.01\", or if your implementation does
-not support floats, then by using \"nanosleep\" instead."
- :package-version '(with-editor . "2.8.0")
- :group 'with-editor
- :type 'string)
-
-(defcustom with-editor-finish-query-functions nil
- "List of functions called to query before finishing session.
-
-The buffer in question is current while the functions are called.
-If any of them returns nil, then the session is not finished and
-the buffer is not killed. The user should then fix the issue and
-try again. The functions are called with one argument. If it is
-non-nil then that indicates that the user used a prefix argument
-to force finishing the session despite issues. Functions should
-usually honor that and return non-nil."
- :group 'with-editor
- :type 'hook)
-(put 'with-editor-finish-query-functions 'permanent-local t)
-
-(defcustom with-editor-cancel-query-functions nil
- "List of functions called to query before canceling session.
-
-The buffer in question is current while the functions are called.
-If any of them returns nil, then the session is not canceled and
-the buffer is not killed. The user should then fix the issue and
-try again. The functions are called with one argument. If it is
-non-nil then that indicates that the user used a prefix argument
-to force canceling the session despite issues. Functions should
-usually honor that and return non-nil."
- :group 'with-editor
- :type 'hook)
-(put 'with-editor-cancel-query-functions 'permanent-local t)
-
-(defcustom with-editor-mode-lighter " WE"
- "The mode-line lighter of the With-Editor mode."
- :group 'with-editor
- :type '(choice (const :tag "No lighter" "") string))
-
-(defvar with-editor-server-window-alist nil
- "Alist of filename patterns vs corresponding `server-window'.
-
-Each element looks like (REGEXP . FUNCTION). Files matching
-REGEXP are selected using FUNCTION instead of the default in
-`server-window'.
-
-Note that when a package adds an entry here then it probably
-has a reason to disrespect `server-window' and it likely is
-not a good idea to change such entries.")
-
-(defvar with-editor-file-name-history-exclude nil
- "List of regexps for filenames `server-visit' should not remember.
-When a filename matches any of the regexps, then `server-visit'
-does not add it to the variable `file-name-history', which is
-used when reading a filename in the minibuffer.")
-
-(defcustom with-editor-shell-command-use-emacsclient t
- "Whether to use the emacsclient when running shell commands.
-
-This affects `with-editor-shell-command-async' and, if the input
-ends with \"&\" `with-editor-shell-command' .
-
-If `shell-command-with-editor-mode' is enabled, then it also
-affects `shell-command-async' and, if the input ends with \"&\"
-`shell-command'.
-
-This is a temporary kludge that lets you choose between two
-possible defects, the ones described in the issues #23 and #40.
-
-When t, then use the emacsclient. This has the disadvantage that
-`with-editor-mode' won't be enabled because we don't know whether
-this package was involved at all in the call to the emacsclient,
-and when it is not, then we really should. The problem is that
-the emacsclient doesn't pass a long any environment variables to
-the server. This will hopefully be fixed in Emacs eventually.
-
-When nil, then use the sleeping editor. Because in this case we
-know that this package is involved, we can enable the mode. But
-this makes it necessary that you invoke $EDITOR in shell scripts
-like so:
-
- eval \"$EDITOR\" file
-
-And some tools that do not handle $EDITOR properly also break."
- :package-version '(with-editor . "2.7.1")
- :group 'with-editor
- :type 'boolean)
-
-;;; Mode Commands
-
-(defvar with-editor-pre-finish-hook nil)
-(defvar with-editor-pre-cancel-hook nil)
-(defvar with-editor-post-finish-hook nil)
-(defvar with-editor-post-finish-hook-1 nil)
-(defvar with-editor-post-cancel-hook nil)
-(defvar with-editor-post-cancel-hook-1 nil)
-(defvar with-editor-cancel-alist nil)
-(put 'with-editor-pre-finish-hook 'permanent-local t)
-(put 'with-editor-pre-cancel-hook 'permanent-local t)
-(put 'with-editor-post-finish-hook 'permanent-local t)
-(put 'with-editor-post-cancel-hook 'permanent-local t)
-
-(defvar with-editor-show-usage t)
-(defvar with-editor-cancel-message nil)
-(defvar with-editor-previous-winconf nil)
-(make-variable-buffer-local 'with-editor-show-usage)
-(make-variable-buffer-local 'with-editor-cancel-message)
-(make-variable-buffer-local 'with-editor-previous-winconf)
-(put 'with-editor-cancel-message 'permanent-local t)
-(put 'with-editor-previous-winconf 'permanent-local t)
-
-(defvar-local with-editor--pid nil "For internal use.")
-(put 'with-editor--pid 'permanent-local t)
-
-(defun with-editor-finish (force)
- "Finish the current edit session."
- (interactive "P")
- (when (run-hook-with-args-until-failure
- 'with-editor-finish-query-functions force)
- (let ((post-finish-hook with-editor-post-finish-hook)
- (post-commit-hook (bound-and-true-p git-commit-post-finish-hook))
- (dir default-directory))
- (run-hooks 'with-editor-pre-finish-hook)
- (with-editor-return nil)
- (accept-process-output nil 0.1)
- (with-temp-buffer
- (setq default-directory dir)
- (setq-local with-editor-post-finish-hook post-finish-hook)
- (when post-commit-hook
- (setq-local git-commit-post-finish-hook post-commit-hook))
- (run-hooks 'with-editor-post-finish-hook)))))
-
-(defun with-editor-cancel (force)
- "Cancel the current edit session."
- (interactive "P")
- (when (run-hook-with-args-until-failure
- 'with-editor-cancel-query-functions force)
- (let ((message with-editor-cancel-message))
- (when (functionp message)
- (setq message (funcall message)))
- (let ((post-cancel-hook with-editor-post-cancel-hook)
- (with-editor-cancel-alist nil)
- (dir default-directory))
- (run-hooks 'with-editor-pre-cancel-hook)
- (with-editor-return t)
- (accept-process-output nil 0.1)
- (with-temp-buffer
- (setq default-directory dir)
- (setq-local with-editor-post-cancel-hook post-cancel-hook)
- (run-hooks 'with-editor-post-cancel-hook)))
- (message (or message "Canceled by user")))))
-
-(defun with-editor-return (cancel)
- (let ((winconf with-editor-previous-winconf)
- (clients server-buffer-clients)
- (dir default-directory)
- (pid with-editor--pid))
- (remove-hook 'kill-buffer-query-functions
- 'with-editor-kill-buffer-noop t)
- (cond (cancel
- (save-buffer)
- (if clients
- (dolist (client clients)
- (ignore-errors
- (server-send-string client "-error Canceled by user"))
- (delete-process client))
- ;; Fallback for when emacs was used as $EDITOR
- ;; instead of emacsclient or the sleeping editor.
- ;; See https://github.com/magit/magit/issues/2258.
- (ignore-errors (delete-file buffer-file-name))
- (kill-buffer)))
- (t
- (save-buffer)
- (if clients
- ;; Don't use `server-edit' because we do not want to
- ;; show another buffer belonging to another client.
- ;; See https://github.com/magit/magit/issues/2197.
- (server-done)
- (kill-buffer))))
- (when pid
- (let ((default-directory dir))
- (process-file "kill" nil nil nil
- "-s" (if cancel "USR2" "USR1") pid)))
- (when (and winconf (eq (window-configuration-frame winconf)
- (selected-frame)))
- (set-window-configuration winconf))))
-
-;;; Mode
-
-(defvar with-editor-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "\C-c\C-c" 'with-editor-finish)
- (define-key map [remap server-edit] 'with-editor-finish)
- (define-key map [remap evil-save-and-close] 'with-editor-finish)
- (define-key map [remap evil-save-modified-and-close] 'with-editor-finish)
- (define-key map "\C-c\C-k" 'with-editor-cancel)
- (define-key map [remap kill-buffer] 'with-editor-cancel)
- (define-key map [remap ido-kill-buffer] 'with-editor-cancel)
- (define-key map [remap iswitchb-kill-buffer] 'with-editor-cancel)
- (define-key map [remap evil-quit] 'with-editor-cancel)
- map))
-
-(define-minor-mode with-editor-mode
- "Edit a file as the $EDITOR of an external process."
- :lighter with-editor-mode-lighter
- ;; Protect the user from killing the buffer without using
- ;; either `with-editor-finish' or `with-editor-cancel',
- ;; and from removing the key bindings for these commands.
- (unless with-editor-mode
- (user-error "With-Editor mode cannot be turned off"))
- (add-hook 'kill-buffer-query-functions
- 'with-editor-kill-buffer-noop nil t)
- ;; `server-execute' displays a message which is not
- ;; correct when using this mode.
- (when with-editor-show-usage
- (with-editor-usage-message)))
-
-(put 'with-editor-mode 'permanent-local t)
-
-(defun with-editor-kill-buffer-noop ()
- ;; We started doing this in response to #64, but it is not safe
- ;; to do so, because the client has already been killed, causing
- ;; `with-editor-return' (called by `with-editor-cancel') to delete
- ;; the file, see #66. The reason we delete the file in the first
- ;; place are https://github.com/magit/magit/issues/2258 and
- ;; https://github.com/magit/magit/issues/2248.
- ;; (if (memq this-command '(save-buffers-kill-terminal
- ;; save-buffers-kill-emacs))
- ;; (let ((with-editor-cancel-query-functions nil))
- ;; (with-editor-cancel nil)
- ;; t)
- ;; ...)
- ;; So go back to always doing this instead:
- (user-error (substitute-command-keys (format "\
-Don't kill this buffer %S. Instead cancel using \\[with-editor-cancel]"
- (current-buffer)))))
-
-(defvar-local with-editor-usage-message "\
-Type \\[with-editor-finish] to finish, \
-or \\[with-editor-cancel] to cancel")
-
-(defun with-editor-usage-message ()
- ;; Run after `server-execute', which is run using
- ;; a timer which starts immediately.
- (let ((buffer (current-buffer)))
- (run-with-timer
- 0.05 nil
- (lambda ()
- (with-current-buffer buffer
- (message (substitute-command-keys with-editor-usage-message)))))))
-
-;;; Wrappers
-
-(defvar with-editor--envvar nil "For internal use.")
-
-(defmacro with-editor (&rest body)
- "Use the Emacsclient as $EDITOR while evaluating BODY.
-Modify the `process-environment' for processes started in BODY,
-instructing them to use the Emacsclient as $EDITOR. If optional
-ENVVAR is a literal string then bind that environment variable
-instead.
-\n(fn [ENVVAR] BODY...)"
- (declare (indent defun) (debug (body)))
- `(let ((with-editor--envvar ,(if (stringp (car body))
- (pop body)
- '(or with-editor--envvar "EDITOR")))
- (process-environment process-environment))
- (with-editor--setup)
- ,@body))
-
-(defmacro with-editor* (envvar &rest body)
- "Use the Emacsclient as the editor while evaluating BODY.
-Modify the `process-environment' for processes started in BODY,
-instructing them to use the Emacsclient as editor. ENVVAR is the
-environment variable that is exported to do so, it is evaluated
-at run-time.
-\n(fn [ENVVAR] BODY...)"
- (declare (indent defun) (debug (sexp body)))
- `(let ((with-editor--envvar ,envvar)
- (process-environment process-environment))
- (with-editor--setup)
- ,@body))
-
-(defun with-editor--setup ()
- (if (or (not with-editor-emacsclient-executable)
- (file-remote-p default-directory))
- (push (concat with-editor--envvar "=" with-editor-sleeping-editor)
- process-environment)
- ;; Make sure server-use-tcp's value is valid.
- (unless (featurep 'make-network-process '(:family local))
- (setq server-use-tcp t))
- ;; Make sure the server is running.
- (unless (process-live-p server-process)
- (when (server-running-p server-name)
- (setq server-name (format "server%s" (emacs-pid)))
- (when (server-running-p server-name)
- (server-force-delete server-name)))
- (server-start))
- ;; Tell $EDITOR to use the Emacsclient.
- (push (concat with-editor--envvar "="
- (shell-quote-argument with-editor-emacsclient-executable)
- ;; Tell the process where the server file is.
- (and (not server-use-tcp)
- (concat " --socket-name="
- (shell-quote-argument
- (expand-file-name server-name
- server-socket-dir)))))
- process-environment)
- (when server-use-tcp
- (push (concat "EMACS_SERVER_FILE="
- (expand-file-name server-name server-auth-dir))
- process-environment))
- ;; As last resort fallback to the sleeping editor.
- (push (concat "ALTERNATE_EDITOR=" with-editor-sleeping-editor)
- process-environment)))
-
-(defun with-editor-server-window ()
- (or (and buffer-file-name
- (cdr (cl-find-if (lambda (cons)
- (string-match-p (car cons) buffer-file-name))
- with-editor-server-window-alist)))
- server-window))
-
-(defun server-switch-buffer--with-editor-server-window-alist
- (fn &optional next-buffer killed-one filepos)
- "Honor `with-editor-server-window-alist' (which see)."
- (let ((server-window (with-current-buffer
- (or next-buffer (current-buffer))
- (when with-editor-mode
- (setq with-editor-previous-winconf
- (current-window-configuration)))
- (with-editor-server-window))))
- (funcall fn next-buffer killed-one filepos)))
-
-(advice-add 'server-switch-buffer :around
- 'server-switch-buffer--with-editor-server-window-alist)
-
-(defun start-file-process--with-editor-process-filter
- (fn name buffer program &rest program-args)
- "When called inside a `with-editor' form and the Emacsclient
-cannot be used, then give the process the filter function
-`with-editor-process-filter'. To avoid overriding the filter
-being added here you should use `with-editor-set-process-filter'
-instead of `set-process-filter' inside `with-editor' forms.
-
-When the `default-directory' is located on a remote machine,
-then also manipulate PROGRAM and PROGRAM-ARGS in order to set
-the appropriate editor environment variable."
- (if (not with-editor--envvar)
- (apply fn name buffer program program-args)
- (when (file-remote-p default-directory)
- (unless (equal program "env")
- (push program program-args)
- (setq program "env"))
- (push (concat with-editor--envvar "=" with-editor-sleeping-editor)
- program-args))
- (let ((process (apply fn name buffer program program-args)))
- (set-process-filter process 'with-editor-process-filter)
- (process-put process 'default-dir default-directory)
- process)))
-
-(advice-add 'start-file-process :around
- 'start-file-process--with-editor-process-filter)
-
-(cl-defun make-process--with-editor-process-filter
- (fn &rest keys &key name buffer command coding noquery stop
- connection-type filter sentinel stderr file-handler
- &allow-other-keys)
- "When called inside a `with-editor' form and the Emacsclient
-cannot be used, then give the process the filter function
-`with-editor-process-filter'. To avoid overriding the filter
-being added here you should use `with-editor-set-process-filter'
-instead of `set-process-filter' inside `with-editor' forms.
-
-When the `default-directory' is located on a remote machine and
-FILE-HANDLER is non-nil, then also manipulate COMMAND in order
-to set the appropriate editor environment variable."
- (if (or (not file-handler) (not with-editor--envvar))
- (apply fn keys)
- (when (file-remote-p default-directory)
- (unless (equal (car command) "env")
- (push "env" command))
- (push (concat with-editor--envvar "=" with-editor-sleeping-editor)
- (cdr command)))
- (let* ((filter (if filter
- (lambda (process output)
- (funcall filter process output)
- (with-editor-process-filter process output t))
- #'with-editor-process-filter))
- (process (funcall fn
- :name name
- :buffer buffer
- :command command
- :coding coding
- :noquery noquery
- :stop stop
- :connection-type connection-type
- :filter filter
- :sentinel sentinel
- :stderr stderr
- :file-handler file-handler)))
- (process-put process 'default-dir default-directory)
- process)))
-
-(advice-add #'make-process :around #'make-process--with-editor-process-filter)
-
-(defun with-editor-set-process-filter (process filter)
- "Like `set-process-filter' but keep `with-editor-process-filter'.
-Give PROCESS the new FILTER but keep `with-editor-process-filter'
-if that was added earlier by the advised `start-file-process'.
-
-Do so by wrapping the two filter functions using a lambda, which
-becomes the actual filter. It calls `with-editor-process-filter'
-first, passing t as NO-STANDARD-FILTER. Then it calls FILTER,
-which may or may not insert the text into the PROCESS's buffer."
- (set-process-filter
- process
- (if (eq (process-filter process) 'with-editor-process-filter)
- `(lambda (proc str)
- (,filter proc str)
- (with-editor-process-filter proc str t))
- filter)))
-
-(defvar with-editor-filter-visit-hook nil)
-
-(defun with-editor-output-filter (string)
- (save-match-data
- (if (string-match "^WITH-EDITOR: \
-\\([0-9]+\\) OPEN \\([^]+?\\)\
-\\(?: IN \\([^\r]+?\\)\\)?\r?$" string)
- (let ((pid (match-string 1 string))
- (file (match-string 2 string))
- (dir (match-string 3 string)))
- (unless (file-name-absolute-p file)
- (setq file (expand-file-name file dir)))
- (when default-directory
- (setq file (concat (file-remote-p default-directory) file)))
- (with-current-buffer (find-file-noselect file)
- (with-editor-mode 1)
- (setq with-editor--pid pid)
- (run-hooks 'with-editor-filter-visit-hook)
- (funcall (or (with-editor-server-window) 'switch-to-buffer)
- (current-buffer))
- (kill-local-variable 'server-window))
- nil)
- string)))
-
-(defun with-editor-process-filter
- (process string &optional no-default-filter)
- "Listen for edit requests by child processes."
- (let ((default-directory (process-get process 'default-dir)))
- (with-editor-output-filter string))
- (unless no-default-filter
- (internal-default-process-filter process string)))
-
-(advice-add 'server-visit-files :after
- 'server-visit-files--with-editor-file-name-history-exclude)
-
-(defun server-visit-files--with-editor-file-name-history-exclude
- (files _proc &optional _nowait)
- (pcase-dolist (`(,file . ,_) files)
- (when (cl-find-if (lambda (regexp)
- (string-match-p regexp file))
- with-editor-file-name-history-exclude)
- (setq file-name-history (delete file file-name-history)))))
-
-;;; Augmentations
-
-;;;###autoload
-(cl-defun with-editor-export-editor (&optional (envvar "EDITOR"))
- "Teach subsequent commands to use current Emacs instance as editor.
-
-Set and export the environment variable ENVVAR, by default
-\"EDITOR\". The value is automatically generated to teach
-commands to use the current Emacs instance as \"the editor\".
-
-This works in `shell-mode', `term-mode' and `eshell-mode'."
- (interactive (list (with-editor-read-envvar)))
- (cond
- ((derived-mode-p 'comint-mode 'term-mode)
- (let ((process (get-buffer-process (current-buffer))))
- (goto-char (process-mark process))
- (process-send-string
- process (format " export %s=%s\n" envvar
- (shell-quote-argument with-editor-sleeping-editor)))
- (while (accept-process-output process 0.1))
- (if (derived-mode-p 'term-mode)
- (with-editor-set-process-filter process 'with-editor-emulate-terminal)
- (add-hook 'comint-output-filter-functions 'with-editor-output-filter
- nil t))))
- ((derived-mode-p 'eshell-mode)
- (add-to-list 'eshell-preoutput-filter-functions
- 'with-editor-output-filter)
- (setenv envvar with-editor-sleeping-editor))
- (t
- (error "Cannot export environment variables in this buffer")))
- (message "Successfully exported %s" envvar))
-
-;;;###autoload
-(defun with-editor-export-git-editor ()
- "Like `with-editor-export-editor' but always set `$GIT_EDITOR'."
- (interactive)
- (with-editor-export-editor "GIT_EDITOR"))
-
-;;;###autoload
-(defun with-editor-export-hg-editor ()
- "Like `with-editor-export-editor' but always set `$HG_EDITOR'."
- (interactive)
- (with-editor-export-editor "HG_EDITOR"))
-
-(defun with-editor-emulate-terminal (process string)
- "Like `term-emulate-terminal' but also handle edit requests."
- (when (with-editor-output-filter string)
- (term-emulate-terminal process string)))
-
-(defvar with-editor-envvars '("EDITOR" "GIT_EDITOR" "HG_EDITOR"))
-
-(cl-defun with-editor-read-envvar
- (&optional (prompt "Set environment variable")
- (default "EDITOR"))
- (let ((reply (completing-read (if default
- (format "%s (%s): " prompt default)
- (concat prompt ": "))
- with-editor-envvars nil nil nil nil default)))
- (if (string= reply "") (user-error "Nothing selected") reply)))
-
-;;;###autoload
-(define-minor-mode shell-command-with-editor-mode
- "Teach `shell-command' to use current Emacs instance as editor.
-
-Teach `shell-command', and all commands that ultimately call that
-command, to use the current Emacs instance as editor by executing
-\"EDITOR=CLIENT COMMAND&\" instead of just \"COMMAND&\".
-
-CLIENT is automatically generated; EDITOR=CLIENT instructs
-COMMAND to use to the current Emacs instance as \"the editor\",
-assuming no other variable overrides the effect of \"$EDITOR\".
-CLIENT may be the path to an appropriate emacsclient executable
-with arguments, or a script which also works over Tramp.
-
-Alternatively you can use the `with-editor-async-shell-command',
-which also allows the use of another variable instead of
-\"EDITOR\"."
- :global t)
-
-;;;###autoload
-(defun with-editor-async-shell-command
- (command &optional output-buffer error-buffer envvar)
- "Like `async-shell-command' but with `$EDITOR' set.
-
-Execute string \"ENVVAR=CLIENT COMMAND\" in an inferior shell;
-display output, if any. With a prefix argument prompt for an
-environment variable, otherwise the default \"EDITOR\" variable
-is used. With a negative prefix argument additionally insert
-the COMMAND's output at point.
-
-CLIENT is automatically generated; ENVVAR=CLIENT instructs
-COMMAND to use to the current Emacs instance as \"the editor\",
-assuming it respects ENVVAR as an \"EDITOR\"-like variable.
-CLIENT may be the path to an appropriate emacsclient executable
-with arguments, or a script which also works over Tramp.
-
-Also see `async-shell-command' and `shell-command'."
- (interactive (with-editor-shell-command-read-args "Async shell command: " t))
- (let ((with-editor--envvar envvar))
- (with-editor
- (async-shell-command command output-buffer error-buffer))))
-
-;;;###autoload
-(defun with-editor-shell-command
- (command &optional output-buffer error-buffer envvar)
- "Like `shell-command' or `with-editor-async-shell-command'.
-If COMMAND ends with \"&\" behave like the latter,
-else like the former."
- (interactive (with-editor-shell-command-read-args "Shell command: "))
- (if (string-match "&[ \t]*\\'" command)
- (with-editor-async-shell-command
- command output-buffer error-buffer envvar)
- (shell-command command output-buffer error-buffer)))
-
-(defun with-editor-shell-command-read-args (prompt &optional async)
- (let ((command (read-shell-command
- prompt nil nil
- (let ((filename (or buffer-file-name
- (and (eq major-mode 'dired-mode)
- (dired-get-filename nil t)))))
- (and filename (file-relative-name filename))))))
- (list command
- (if (or async (setq async (string-match-p "&[ \t]*\\'" command)))
- (< (prefix-numeric-value current-prefix-arg) 0)
- current-prefix-arg)
- shell-command-default-error-buffer
- (and async current-prefix-arg (with-editor-read-envvar)))))
-
-(defun shell-command--shell-command-with-editor-mode
- (fn command &optional output-buffer error-buffer)
- ;; `shell-mode' and its hook are intended for buffers in which an
- ;; interactive shell is running, but `shell-command' also turns on
- ;; that mode, even though it only runs the shell to run a single
- ;; command. The `with-editor-export-editor' hook function is only
- ;; intended to be used in buffers in which an interactive shell is
- ;; running, so it has to be remove here.
- (let ((shell-mode-hook (remove 'with-editor-export-editor shell-mode-hook)))
- (cond ((or (not (or with-editor--envvar shell-command-with-editor-mode))
- (not (string-match-p "&\\'" command)))
- (funcall fn command output-buffer error-buffer))
- ((and with-editor-shell-command-use-emacsclient
- with-editor-emacsclient-executable
- (not (file-remote-p default-directory)))
- (with-editor (funcall fn command output-buffer error-buffer)))
- (t
- (apply fn (format "%s=%s %s"
- (or with-editor--envvar "EDITOR")
- (shell-quote-argument with-editor-sleeping-editor)
- command)
- output-buffer error-buffer)
- (ignore-errors
- (let ((process (get-buffer-process
- (or output-buffer
- (get-buffer "*Async Shell Command*")))))
- (set-process-filter
- process (lambda (proc str)
- (comint-output-filter proc str)
- (with-editor-process-filter proc str t)))
- process))))))
-
-(advice-add 'shell-command :around
- 'shell-command--shell-command-with-editor-mode)
-
-;;; _
-
-(defun with-editor-debug ()
- "Debug configuration issues.
-See info node `(with-editor)Debugging' for instructions."
- (interactive)
- (with-current-buffer (get-buffer-create "*with-editor-debug*")
- (pop-to-buffer (current-buffer))
- (erase-buffer)
- (ignore-errors (with-editor))
- (insert
- (format "with-editor: %s\n" (locate-library "with-editor.el"))
- (format "emacs: %s (%s)\n"
- (expand-file-name invocation-name invocation-directory)
- emacs-version)
- "system:\n"
- (format " system-type: %s\n" system-type)
- (format " system-configuration: %s\n" system-configuration)
- (format " system-configuration-options: %s\n" system-configuration-options)
- "server:\n"
- (format " server-running-p: %s\n" (server-running-p))
- (format " server-process: %S\n" server-process)
- (format " server-use-tcp: %s\n" server-use-tcp)
- (format " server-name: %s\n" server-name)
- (format " server-socket-dir: %s\n" server-socket-dir))
- (if (and server-socket-dir (file-accessible-directory-p server-socket-dir))
- (dolist (file (directory-files server-socket-dir nil "^[^.]"))
- (insert (format " %s\n" file)))
- (insert (format " %s: not an accessible directory\n"
- (if server-use-tcp "WARNING" "ERROR"))))
- (insert (format " server-auth-dir: %s\n" server-auth-dir))
- (if (file-accessible-directory-p server-auth-dir)
- (dolist (file (directory-files server-auth-dir nil "^[^.]"))
- (insert (format " %s\n" file)))
- (insert (format " %s: not an accessible directory\n"
- (if server-use-tcp "ERROR" "WARNING"))))
- (let ((val with-editor-emacsclient-executable)
- (def (default-value 'with-editor-emacsclient-executable))
- (fun (let ((warning-minimum-level :error)
- (warning-minimum-log-level :error))
- (with-editor-locate-emacsclient))))
- (insert "with-editor-emacsclient-executable:\n"
- (format " value: %s (%s)\n" val
- (and val (with-editor-emacsclient-version val)))
- (format " default: %s (%s)\n" def
- (and def (with-editor-emacsclient-version def)))
- (format " funcall: %s (%s)\n" fun
- (and fun (with-editor-emacsclient-version fun)))))
- (insert "path:\n"
- (format " $PATH: %S\n" (getenv "PATH"))
- (format " exec-path: %s\n" exec-path))
- (insert (format " with-editor-emacsclient-path:\n"))
- (dolist (dir (with-editor-emacsclient-path))
- (insert (format " %s (%s)\n" dir (car (file-attributes dir))))
- (when (file-directory-p dir)
- ;; Don't match emacsclientw.exe, it makes popup windows.
- (dolist (exec (directory-files dir t "emacsclient\\(?:[^w]\\|\\'\\)"))
- (insert (format " %s (%s)\n" exec
- (with-editor-emacsclient-version exec))))))))
-
-(defconst with-editor-font-lock-keywords
- '(("(\\(with-\\(?:git-\\)?editor\\)\\_>" (1 'font-lock-keyword-face))))
-(font-lock-add-keywords 'emacs-lisp-mode with-editor-font-lock-keywords)
-
-(provide 'with-editor)
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-;;; with-editor.el ends here
diff --git a/elpa/with-editor-20200720.2014/with-editor.info b/elpa/with-editor-20200720.2014/with-editor.info
deleted file mode 100644
index 4855835..0000000
--- a/elpa/with-editor-20200720.2014/with-editor.info
+++ /dev/null
@@ -1,413 +0,0 @@
-This is with-editor.info, produced by makeinfo version 6.5 from
-with-editor.texi.
-
- Copyright (C) 2015-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* With-Editor: (with-editor). Using the Emacsclient as $EDITOR.
-END-INFO-DIR-ENTRY
-
-
-File: with-editor.info, Node: Top, Next: Using the With-Editor package, Up: (dir)
-
-With-Editor User Manual
-***********************
-
-The library ‘with-editor’ makes it easy to use the Emacsclient as the
-‘$EDITOR’ of child processes, making sure they know how to call home.
-For remote processes a substitute is provided, which communicates with
-Emacs on standard output instead of using a socket as the Emacsclient
-does.
-
- This library was written because Magit has to be able to do the above
-to allow the user to edit commit messages gracefully and to edit rebase
-sequences, which wouldn’t be possible at all otherwise.
-
- Because other packages can benefit from such functionality, this
-library is made available as a separate package. It also defines some
-additional functionality which makes it useful even for end-users, who
-don’t use Magit or another package which uses it internally.
-
-This manual is for With-Editor version 2.9.4.
-
- Copyright (C) 2015-2020 Jonas Bernoulli <jonas@bernoul.li>
-
- You can redistribute this document 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 document 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.
-
-* Menu:
-
-* Using the With-Editor package::
-* Using With-Editor as a library::
-* Debugging::
-* Command Index::
-* Function Index::
-* Variable Index::
-
-— The Detailed Node Listing —
-
-Using the With-Editor package
-
-* Configuring With-Editor::
-* Using With-Editor commands::
-
-
-
-File: with-editor.info, Node: Using the With-Editor package, Next: Using With-Editor as a library, Prev: Top, Up: Top
-
-1 Using the With-Editor package
-*******************************
-
-The ‘With-Editor’ package is used internally by Magit when editing
-commit messages and rebase sequences. It also provides some commands
-and features which are useful by themselves, even if you don’t use
-Magit.
-
- For information about using this library in you own package, see
-*note Using With-Editor as a library::.
-
-* Menu:
-
-* Configuring With-Editor::
-* Using With-Editor commands::
-
-
-File: with-editor.info, Node: Configuring With-Editor, Next: Using With-Editor commands, Up: Using the With-Editor package
-
-1.1 Configuring With-Editor
-===========================
-
-With-Editor tries very hard to locate a suitable ‘emacsclient’
-executable, so ideally you should never have to customize the option
-‘with-editor-emacsclient-executable’. When it fails to do so, then the
-most likely reason is that someone found yet another way to package
-Emacs (most likely on macOS) without putting the executable on ‘$PATH’,
-and we have to add another kludge to find it anyway.
-
- -- User Option: with-editor-emacsclient-executable
-
- The ‘emacsclient’ executable used as the editor by child process of
- this Emacs instance. By using this executable, child processes can
- call home to their parent process.
-
- This option is automatically set at startup by looking in
- ‘exec-path’, and other places where the executable could be
- installed, to find the ‘emacsclient’ executable most suitable for
- the current Emacs instance.
-
- You should *not* customize this option permanently. If you have to
- do it, then you should consider that a temporary kludge and inform
- the Magit maintainer as described in *note Debugging::.
-
- If With-Editor fails to find a suitable ‘emacsclient’ on you
- system, then this should be fixed for all users at once, by
- teaching ‘with-editor-locate-emacsclient’ how to do so on your
- system and system like yours. Doing it this way has the advantage,
- that you won’t have do it again every time you update Emacs, and
- that other users who have installed Emacs the same way as you have,
- won’t have to go through the same trouble.
-
- Note that there also is a nuclear option; setting this variable to
- ‘nil’ causes the "sleeping editor" described below to be used even
- for local child processes. Obviously we don’t recommend that you
- use this except in "emergencies", i.e. before we had a change to
- add a kludge appropriate for you setup.
-
- -- Function: with-editor-locate-emacsclient
-
- The function used to set the initial value of the option
- ‘with-editor-emacsclient-executable’. There’s a lot of voodoo
- here.
-
- The ‘emacsclient’ cannot be used when using Tramp to run a process on
-a remote machine. (Theoretically it could, but that would be hard to
-setup, very fragile, and rather insecure).
-
- With-Editor provides an alternative "editor" which can be used by
-remote processes in much the same way as local processes use an
-‘emacsclient’ executable. This alternative is known as the "sleeping
-editor" because it is implemented as a shell script which sleeps until
-it receives a signal.
-
- -- User Option: with-editor-sleeping-editor
-
- The sleeping editor is a shell script used as the editor of child
- processes when the ‘emacsclient’ executable cannot be used.
-
- This fallback is used for asynchronous process started inside the
- macro ‘with-editor’, when the process runs on a remote machine or
- for local processes when ‘with-editor-emacsclient-executable’ is
- ‘nil’.
-
- Where the latter uses a socket to communicate with Emacs’ server,
- this substitute prints edit requests to its standard output on
- which a process filter listens for such requests. As such it is
- not a complete substitute for a proper ‘emacsclient’, it can only
- be used as ‘$EDITOR’ of child process of the current Emacs
- instance.
-
- Some shells do not execute traps immediately when waiting for a
- child process, but by default we do use such a blocking child
- process.
-
- If you use such a shell (e.g. ‘csh’ on FreeBSD, but not Debian),
- then you have to edit this option. You can either replace ‘sh’
- with ‘bash’ (and install that), or you can use the older, less
- performant implementation:
-
- "sh -c '\
- echo \"WITH-EDITOR: $$ OPEN $0 IN $(pwd)\"; \
- trap \"exit 0\" USR1; \
- trap \"exit 1\" USR2; \
- while true; do sleep 1; done'"
-
- Note that the unit separator character () right after the file name
- ($0) is required.
-
- Also note that using this alternative implementation leads to a
- delay of up to a second. The delay can be shortened by replacing
- ‘sleep 1’ with ‘sleep 0.01’, or if your implementation does not
- support floats, then by using ‘nanosleep’ instead.
-
-
-File: with-editor.info, Node: Using With-Editor commands, Prev: Configuring With-Editor, Up: Using the With-Editor package
-
-1.2 Using With-Editor commands
-==============================
-
-This section describes how to use the ‘with-editor’ library _outside_ of
-Magit. You don’t need to know any of this just to create commits using
-Magit.
-
- The commands ‘with-editor-async-shell-command’ and
-‘with-editor-shell-command’ are intended as drop in replacements for
-‘async-shell-command’ and ‘shell-command’. They automatically export
-‘$EDITOR’ making sure the executed command uses the current Emacs
-instance as "the editor". With a prefix argument these commands prompt
-for an alternative environment variable such as ‘$GIT_EDITOR’.
-
- -- Command: with-editor-async-shell-command
-
- This command is like ‘async-shell-command’, but it runs the shell
- command with the current Emacs instance exported as ‘$EDITOR’.
-
- -- Command: with-editor-shell-command
-
- This command is like ‘shell-command’, but if the shell command ends
- with ‘&’ and is therefore run asynchronously, then the current
- Emacs instance is exported as ‘$EDITOR’.
-
- To always use these variants add this to you init file:
-
- (define-key (current-global-map)
- [remap async-shell-command] 'with-editor-async-shell-command)
- (define-key (current-global-map)
- [remap shell-command] 'with-editor-shell-command)
-
- Alternatively use the global ‘shell-command-with-editor-mode’.
-
- -- Variable: shell-command-with-editor-mode
-
- When this mode is active, then ‘$EDITOR’ is exported whenever
- ultimately ‘shell-command’ is called to asynchronously run some
- shell command. This affects most variants of that command, whether
- they are defined in Emacs or in some third-party package.
-
- The command ‘with-editor-export-editor’ exports ‘$EDITOR’ or another
-such environment variable in ‘shell-mode’, ‘term-mode’ and ‘eshell-mode’
-buffers. Use this Emacs command before executing a shell command which
-needs the editor set, or always arrange for the current Emacs instance
-to be used as editor by adding it to the appropriate mode hooks:
-
- (add-hook 'shell-mode-hook 'with-editor-export-editor)
- (add-hook 'term-exec-hook 'with-editor-export-editor)
- (add-hook 'eshell-mode-hook 'with-editor-export-editor)
-
- Some variants of this function exist; these two forms are equivalent:
-
- (add-hook 'shell-mode-hook
- (apply-partially 'with-editor-export-editor "GIT_EDITOR"))
- (add-hook 'shell-mode-hook 'with-editor-export-git-editor)
-
- -- Command: with-editor-export-editor
-
- When invoked in a ‘shell-mode’, ‘term-mode’, or ‘eshell-mode’
- buffer, this command teaches shell commands to use the current
- Emacs instance as the editor, by exporting ‘$EDITOR’.
-
- -- Command: with-editor-export-git-editor
-
- This command is like ‘with-editor-export-editor’ but exports
- ‘$GIT_EDITOR’.
-
- -- Command: with-editor-export-hg-editor
-
- This command is like ‘with-editor-export-editor’ but exports
- ‘$HG_EDITOR’.
-
-
-File: with-editor.info, Node: Using With-Editor as a library, Next: Debugging, Prev: Using the With-Editor package, Up: Top
-
-2 Using With-Editor as a library
-********************************
-
-This section describes how to use the ‘with-editor’ library _outside_ of
-Magit to teach another package how to have its child processes call
-home, just like Magit does. You don’t need to know any of this just to
-create commits using Magit. You can also ignore this if you use
-‘with-editor’ outside of Magit, but only as an end-user.
-
- For information about interactive use and options that affect both
-interactive and non-interactive use, see *note Using the With-Editor
-package::.
-
- -- Macro: with-editor &rest body
-
- This macro arranges for the ‘emacsclient’ or the sleeping editor to
- be used as the editor of child processes, effectively teaching them
- to call home to the current Emacs instance when they require that
- the user edits a file.
-
- This is done by establishing a local binding for
- ‘process-environment’ and changing the value of the ‘EDITOR’
- environment variable in that scope. This affects all
- (asynchronous) processes started by forms (dynamically) inside
- BODY.
-
- If BODY begins with a literal string, then that variable is set
- instead of ‘EDITOR’.
-
- -- Macro: with-editor envvar &rest body
-
- This macro is like ‘with-editor’ instead that the ENVVAR argument
- is required and that it is evaluated at run-time.
-
- -- Function: with-editor-set-process-filter process filter
-
- This function is like ‘set-process-filter’ but ensures that adding
- the new FILTER does not remove the ‘with-editor-process-filter’.
- This is done by wrapping the two filter functions using a lambda,
- which becomes the actual filter. It calls
- ‘with-editor-process-filter’ first, passing ‘t’ as
- NO-STANDARD-FILTER. Then it calls FILTER.
-
-
-File: with-editor.info, Node: Debugging, Next: Command Index, Prev: Using With-Editor as a library, Up: Top
-
-3 Debugging
-***********
-
-With-Editor tries very hard to locate a suitable ‘emacsclient’
-executable, and then sets option ‘with-editor-emacsclient-executable’
-accordingly. In very rare cases this fails. When it does fail, then
-the most likely reason is that someone found yet another way to package
-Emacs (most likely on macOS) without putting the executable on ‘$PATH’,
-and we have to add another kludge to find it anyway.
-
- If you are having problems using ‘with-editor’, e.g. you cannot
-commit in Magit, then please open a new issue at
-<https://github.com/magit/with-editor/issues> and provide information
-about your Emacs installation. Most importantly how did you install
-Emacs and what is the output of ‘M-x with-editor-debug RET’.
-
-
-File: with-editor.info, Node: Command Index, Next: Function Index, Prev: Debugging, Up: Top
-
-Appendix A Command Index
-************************
-
-
-* Menu:
-
-* with-editor-async-shell-command: Using With-Editor commands.
- (line 17)
-* with-editor-export-editor: Using With-Editor commands.
- (line 60)
-* with-editor-export-git-editor: Using With-Editor commands.
- (line 66)
-* with-editor-export-hg-editor: Using With-Editor commands.
- (line 71)
-* with-editor-shell-command: Using With-Editor commands.
- (line 22)
-
-
-File: with-editor.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top
-
-Appendix B Function Index
-*************************
-
-
-* Menu:
-
-* with-editor: Using With-Editor as a library.
- (line 16)
-* with-editor <1>: Using With-Editor as a library.
- (line 32)
-* with-editor-async-shell-command: Using With-Editor commands.
- (line 17)
-* with-editor-export-editor: Using With-Editor commands.
- (line 60)
-* with-editor-export-git-editor: Using With-Editor commands.
- (line 66)
-* with-editor-export-hg-editor: Using With-Editor commands.
- (line 71)
-* with-editor-locate-emacsclient: Configuring With-Editor.
- (line 42)
-* with-editor-set-process-filter: Using With-Editor as a library.
- (line 37)
-* with-editor-shell-command: Using With-Editor commands.
- (line 22)
-
-
-File: with-editor.info, Node: Variable Index, Prev: Function Index, Up: Top
-
-Appendix C Variable Index
-*************************
-
-
-* Menu:
-
-* shell-command-with-editor-mode: Using With-Editor commands.
- (line 37)
-* with-editor-emacsclient-executable: Configuring With-Editor.
- (line 13)
-* with-editor-sleeping-editor: Configuring With-Editor.
- (line 58)
-
-
-
-Tag Table:
-Node: Top773
-Node: Using the With-Editor package2569
-Node: Configuring With-Editor3155
-Node: Using With-Editor commands7704
-Node: Using With-Editor as a library10899
-Node: Debugging12862
-Node: Command Index13741
-Node: Function Index14623
-Node: Variable Index16089
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
Copyright 2019--2024 Marius PETER